diff options
Diffstat (limited to 'src/Entities')
-rw-r--r-- | src/Entities/Minecart.cpp | 48 | ||||
-rw-r--r-- | src/Entities/Minecart.h | 9 |
2 files changed, 52 insertions, 5 deletions
diff --git a/src/Entities/Minecart.cpp b/src/Entities/Minecart.cpp index 50be91e4e..d8dbc10c1 100644 --- a/src/Entities/Minecart.cpp +++ b/src/Entities/Minecart.cpp @@ -6,6 +6,8 @@ // Indiana Jones! #include "Globals.h" +#include "ChunkDef.h" +#include "Defines.h" #include "Minecart.h" #include "../BlockInfo.h" #include "../ClientHandle.h" @@ -223,7 +225,7 @@ void cMinecart::HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) switch (InsideType) { case E_BLOCK_RAIL: HandleRailPhysics(InsideMeta, a_Dt); break; - case E_BLOCK_ACTIVATOR_RAIL: break; + case E_BLOCK_ACTIVATOR_RAIL: HandleActivatorRailPhysics(InsideMeta, a_Dt); break; case E_BLOCK_POWERED_RAIL: HandlePoweredRailPhysics(InsideMeta); break; case E_BLOCK_DETECTOR_RAIL: { @@ -678,6 +680,7 @@ void cMinecart::HandleDetectorRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::mi void cMinecart::HandleActivatorRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt) { HandleRailPhysics(a_RailMeta & 0x07, a_Dt); + // TODO - shake minecart, throw entities out } @@ -1516,7 +1519,22 @@ cMinecartWithTNT::cMinecartWithTNT(Vector3d a_Pos): { } -// TODO: Make it activate when passing over activator rail + + + + +void cMinecartWithTNT::HandleActivatorRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt) +{ + Super::HandleActivatorRailPhysics(a_RailMeta, a_Dt); + + if ((a_RailMeta & 0x08) && !m_isTNTFused) + { + m_isTNTFused = true; + m_TNTFuseTicksLeft = 80; + m_World->BroadcastSoundEffect("entity.tnt.primed", GetPosition(), 1.0f, 1.0f); + m_World->BroadcastEntityAnimation(*this, EntityAnimation::MinecartTNTIgnites); + } +} @@ -1531,6 +1549,32 @@ void cMinecartWithTNT::GetDrops(cItems & a_Drops, cEntity * a_Killer) +void cMinecartWithTNT::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) +{ + Super::Tick(a_Dt, a_Chunk); + if (!IsTicking()) + { + return; + } + + if (m_isTNTFused) + { + if (m_TNTFuseTicksLeft > 0) + { + --m_TNTFuseTicksLeft; + } + else + { + Destroy(); + m_World->DoExplosionAt(4.0, GetPosX(), GetPosY() + GetHeight() / 2, GetPosZ(), true, esTNTMinecart, this); + } + } +} + + + + + //////////////////////////////////////////////////////////////////////////////// // cMinecartWithHopper: diff --git a/src/Entities/Minecart.h b/src/Entities/Minecart.h index 0d62d98f1..0e6336330 100644 --- a/src/Entities/Minecart.h +++ b/src/Entities/Minecart.h @@ -72,8 +72,8 @@ protected: */ void HandleDetectorRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt); - /** Handles activator rails - placeholder for future implementation */ - void HandleActivatorRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt); + /** Handles activator rails */ + virtual void HandleActivatorRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt); /** Snaps a mincecart to a rail's axis, resetting its speed For curved rails, it changes the cart's direction as well as snapping it to axis */ @@ -89,7 +89,6 @@ protected: /** Tests if this mincecart's bounding box is intersecting another entity's bounding box (collision) and pushes mincecart away if necessary */ bool TestEntityCollision(NIBBLETYPE a_RailMeta); - } ; @@ -222,10 +221,14 @@ public: CLASS_PROTODEF(cMinecartWithTNT) cMinecartWithTNT(Vector3d a_Pos); + void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override; private: + int m_TNTFuseTicksLeft; + bool m_isTNTFused = false; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override; + void HandleActivatorRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt) override; } ; |