From 93adbdce9a769b42baeb70f9ead5c7c6a35834b5 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Sat, 12 Sep 2020 19:57:44 +0100 Subject: Use tracing for explosions (#4845) * TNT: Implement tracing algorithm + Add intensity tracing * Fix iterating over all players to SendExplosion, even those not in range * Implemented TNT entity interaction * Fixed misaligned destruction tracing * Finalise TNT algorithm - Remove BlockArea and just use chunks Using SetBlock makes it so that we can update everything properly, and does appear to be faster. * BlockInfo learns about explosion attentuation * Rename Explodinator parameters * TNT: pull block destruction into common function Co-authored-by: Alexander Harkness --- src/Protocol/Protocol.h | 2 +- src/Protocol/Protocol_1_8.cpp | 24 +++++++++--------------- src/Protocol/Protocol_1_8.h | 2 +- 3 files changed, 11 insertions(+), 17 deletions(-) (limited to 'src/Protocol') diff --git a/src/Protocol/Protocol.h b/src/Protocol/Protocol.h index 2456ac976..222e6031e 100644 --- a/src/Protocol/Protocol.h +++ b/src/Protocol/Protocol.h @@ -374,7 +374,7 @@ public: virtual void SendEntityProperties (const cEntity & a_Entity) = 0; virtual void SendEntityStatus (const cEntity & a_Entity, char a_Status) = 0; virtual void SendEntityVelocity (const cEntity & a_Entity) = 0; - virtual void SendExplosion (double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, const cVector3iArray & a_BlocksAffected, const Vector3d & a_PlayerMotion) = 0; + virtual void SendExplosion (Vector3f a_Position, float a_Power) = 0; virtual void SendGameMode (eGameMode a_GameMode) = 0; virtual void SendHealth (void) = 0; virtual void SendHeldItemChange (int a_ItemIndex) = 0; diff --git a/src/Protocol/Protocol_1_8.cpp b/src/Protocol/Protocol_1_8.cpp index 39c20b6cf..e5ba82111 100644 --- a/src/Protocol/Protocol_1_8.cpp +++ b/src/Protocol/Protocol_1_8.cpp @@ -620,25 +620,19 @@ void cProtocol_1_8_0::SendExperienceOrb(const cExpOrb & a_ExpOrb) -void cProtocol_1_8_0::SendExplosion(double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, const cVector3iArray & a_BlocksAffected, const Vector3d & a_PlayerMotion) +void cProtocol_1_8_0::SendExplosion(const Vector3f a_Position, const float a_Power) { ASSERT(m_State == 3); // In game mode? cPacketizer Pkt(*this, pktExplosion); - Pkt.WriteBEFloat(static_cast(a_BlockX)); - Pkt.WriteBEFloat(static_cast(a_BlockY)); - Pkt.WriteBEFloat(static_cast(a_BlockZ)); - Pkt.WriteBEFloat(static_cast(a_Radius)); - Pkt.WriteBEUInt32(static_cast(a_BlocksAffected.size())); - for (cVector3iArray::const_iterator itr = a_BlocksAffected.begin(), end = a_BlocksAffected.end(); itr != end; ++itr) - { - Pkt.WriteBEInt8(static_cast(itr->x)); - Pkt.WriteBEInt8(static_cast(itr->y)); - Pkt.WriteBEInt8(static_cast(itr->z)); - } // for itr - a_BlockAffected[] - Pkt.WriteBEFloat(static_cast(a_PlayerMotion.x)); - Pkt.WriteBEFloat(static_cast(a_PlayerMotion.y)); - Pkt.WriteBEFloat(static_cast(a_PlayerMotion.z)); + Pkt.WriteBEFloat(a_Position.x); + Pkt.WriteBEFloat(a_Position.y); + Pkt.WriteBEFloat(a_Position.z); + Pkt.WriteBEFloat(a_Power); + Pkt.WriteBEUInt32(0); + Pkt.WriteBEFloat(0); + Pkt.WriteBEFloat(0); + Pkt.WriteBEFloat(0); } diff --git a/src/Protocol/Protocol_1_8.h b/src/Protocol/Protocol_1_8.h index f48ed4f9c..120676dd8 100644 --- a/src/Protocol/Protocol_1_8.h +++ b/src/Protocol/Protocol_1_8.h @@ -64,7 +64,7 @@ public: virtual void SendEntityVelocity (const cEntity & a_Entity) override; virtual void SendExperience (void) override; virtual void SendExperienceOrb (const cExpOrb & a_ExpOrb) override; - virtual void SendExplosion (double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, const cVector3iArray & a_BlocksAffected, const Vector3d & a_PlayerMotion) override; + virtual void SendExplosion (Vector3f a_Position, float a_Power) override; virtual void SendGameMode (eGameMode a_GameMode) override; virtual void SendHealth (void) override; virtual void SendHeldItemChange (int a_ItemIndex) override; -- cgit v1.2.3