summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorworktycho <work.tycho@gmail.com>2015-11-07 14:26:11 +0100
committerworktycho <work.tycho@gmail.com>2015-11-07 14:26:11 +0100
commit4a01e486e3e36fc2b9136b0bc13090a9e01d84b6 (patch)
tree2d5bf2c5a28ef912aaf5968f6bd7e457b9673532
parentMerge pull request #2611 from Gargaj/chickenfall (diff)
parentcode style (diff)
downloadcuberite-4a01e486e3e36fc2b9136b0bc13090a9e01d84b6.tar
cuberite-4a01e486e3e36fc2b9136b0bc13090a9e01d84b6.tar.gz
cuberite-4a01e486e3e36fc2b9136b0bc13090a9e01d84b6.tar.bz2
cuberite-4a01e486e3e36fc2b9136b0bc13090a9e01d84b6.tar.lz
cuberite-4a01e486e3e36fc2b9136b0bc13090a9e01d84b6.tar.xz
cuberite-4a01e486e3e36fc2b9136b0bc13090a9e01d84b6.tar.zst
cuberite-4a01e486e3e36fc2b9136b0bc13090a9e01d84b6.zip
-rw-r--r--src/Entities/Pawn.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/Entities/Pawn.cpp b/src/Entities/Pawn.cpp
index 126947d3e..5ca0c6126 100644
--- a/src/Entities/Pawn.cpp
+++ b/src/Entities/Pawn.cpp
@@ -4,6 +4,7 @@
#include "Pawn.h"
#include "../World.h"
#include "../Bindings/PluginManager.h"
+#include "BoundingBox.h"
@@ -43,6 +44,41 @@ void cPawn::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
// TODO: Check for discrepancies between client and server effect values
}
+
+ class Pusher : public cEntityCallback
+ {
+ public:
+ cEntity * m_Pusher;
+
+ Pusher(cEntity * a_Pusher) :
+ m_Pusher(a_Pusher)
+ {
+ }
+
+ virtual bool Item(cEntity * a_Entity) override
+ {
+ if (a_Entity->GetUniqueID() == m_Pusher->GetUniqueID())
+ {
+ return false;
+ }
+
+ // we only push other mobs, boats and minecarts
+ if ((a_Entity->GetEntityType() != etMonster) && (a_Entity->GetEntityType() != etMinecart) && (a_Entity->GetEntityType() != etBoat))
+ {
+ return false;
+ }
+
+ Vector3d v3Delta = a_Entity->GetPosition() - m_Pusher->GetPosition();
+ v3Delta.y = 0.0; // we only push sideways
+ v3Delta *= 1.0 / v3Delta.Length(); // we push harder if we're close
+ // QUESTION: is there an additional multiplier for this? current shoving seems a bit weak
+
+ a_Entity->AddSpeed(v3Delta);
+ return false;
+ }
+ } Callback(this);
+
+ m_World->ForEachEntityInBox(cBoundingBox(GetPosition(), GetWidth(), GetHeight()), Callback);
super::Tick(a_Dt, a_Chunk);
}