diff options
author | Gargaj <gargaj@conspiracy.hu> | 2015-11-07 13:29:18 +0100 |
---|---|---|
committer | Gargaj <gargaj@conspiracy.hu> | 2015-11-07 13:29:18 +0100 |
commit | 2f28c2f4ffd1fc2b94489bd53f7470310246fd5f (patch) | |
tree | acf26564f8258209a0831b578a1e2d4427bd0fb5 /src | |
parent | Merge pull request #2611 from Gargaj/chickenfall (diff) | |
download | cuberite-2f28c2f4ffd1fc2b94489bd53f7470310246fd5f.tar cuberite-2f28c2f4ffd1fc2b94489bd53f7470310246fd5f.tar.gz cuberite-2f28c2f4ffd1fc2b94489bd53f7470310246fd5f.tar.bz2 cuberite-2f28c2f4ffd1fc2b94489bd53f7470310246fd5f.tar.lz cuberite-2f28c2f4ffd1fc2b94489bd53f7470310246fd5f.tar.xz cuberite-2f28c2f4ffd1fc2b94489bd53f7470310246fd5f.tar.zst cuberite-2f28c2f4ffd1fc2b94489bd53f7470310246fd5f.zip |
Diffstat (limited to 'src')
-rw-r--r-- | src/Entities/Pawn.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/Entities/Pawn.cpp b/src/Entities/Pawn.cpp index 126947d3e..eb503caa6 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); } |