summaryrefslogtreecommitdiffstats
path: root/src/Entities/Minecart.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Entities/Minecart.cpp')
-rw-r--r--src/Entities/Minecart.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/Entities/Minecart.cpp b/src/Entities/Minecart.cpp
index 1f454c857..123965916 100644
--- a/src/Entities/Minecart.cpp
+++ b/src/Entities/Minecart.cpp
@@ -21,6 +21,35 @@
+class cMinecartAttachCallback
+{
+public:
+ cMinecartAttachCallback(cMinecart * a_Minecart, cEntity * a_Attachee) :
+ m_Minecart(a_Minecart), m_Attachee(a_Attachee)
+ {
+ }
+
+ bool operator () (cEntity & a_Entity)
+ {
+ // Check if minecart is empty and if given entity is a mob
+ if ((m_Attachee == nullptr) && (a_Entity.IsMob()))
+ {
+ // if so, attach to minecart and return true
+ a_Entity.AttachTo(m_Minecart);
+ return true;
+ }
+ return false;
+ }
+
+protected:
+ cMinecart * m_Minecart;
+ cEntity * m_Attachee;
+};
+
+
+
+
+
class cMinecartCollisionCallback
{
public:
@@ -1054,6 +1083,12 @@ bool cMinecart::TestEntityCollision(NIBBLETYPE a_RailMeta)
return false;
}
+ // Collision was true, create bounding box for minecart, call attach callback for all entities within that box
+ cMinecartAttachCallback MinecartAttachCallback(this, m_Attachee);
+ Vector3d MinecartPosition = GetPosition();
+ cBoundingBox bbMinecart(Vector3d(MinecartPosition.x, floor(MinecartPosition.y), MinecartPosition.z), GetWidth() / 2, GetHeight());
+ m_World->ForEachEntityInBox(bbMinecart, MinecartAttachCallback);
+
switch (a_RailMeta)
{
case E_META_RAIL_ZM_ZP: