From c94d7184ebaf7e8540f717c70c1e03ae62e5a7bd Mon Sep 17 00:00:00 2001 From: peterbell10 Date: Tue, 24 Jul 2018 22:30:49 +0100 Subject: Broadcast refactor (#4264) * Move Broadcast functions from cChunkMap to cBroadcaster - Remove cBroadcastInterface in favour of cBroadcaster. - cChunk: Remove broadcast functions. * resurect broadcast interface * Absorb cBroadcaster into cWorld. Removes the need for forwarding the function calls. * Improve const-correctness * Use Int8 instead of char + Comment `ForClients` functions * Improve comments * Broadcaster: Rename ForClients functions --- src/Entities/Entity.cpp | 21 +++++---------------- src/Entities/Entity.h | 3 ++- src/Entities/EntityEffect.cpp | 6 +++--- src/Entities/Floater.cpp | 5 ++--- src/Entities/Pickup.cpp | 6 ++---- 5 files changed, 14 insertions(+), 27 deletions(-) (limited to 'src/Entities') diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index 4ecc5c4da..a71c68708 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -214,15 +214,6 @@ void cEntity::SetParentChunk(cChunk * a_Chunk) -cChunk * cEntity::GetParentChunk() -{ - return m_ParentChunk; -} - - - - - void cEntity::Destroy(bool a_ShouldBroadcast) { SetIsTicking(false); @@ -1923,23 +1914,21 @@ void cEntity::BroadcastMovementUpdate(const cClientHandle * a_Exclude) if (!m_bHasSentNoSpeed || IsPlayer()) { // TODO: Pickups move disgracefully if relative move packets are sent as opposed to just velocity. Have a system to send relmove only when SetPosXXX() is called with a large difference in position - int DiffX = FloorC(GetPosX() * 32.0) - FloorC(m_LastSentPosition.x * 32.0); - int DiffY = FloorC(GetPosY() * 32.0) - FloorC(m_LastSentPosition.y * 32.0); - int DiffZ = FloorC(GetPosZ() * 32.0) - FloorC(m_LastSentPosition.z * 32.0); + Vector3i Diff = (GetPosition() * 32.0).Floor() - (m_LastSentPosition * 32.0).Floor(); - if ((DiffX != 0) || (DiffY != 0) || (DiffZ != 0)) // Have we moved? + if (Diff.HasNonZeroLength()) // Have we moved? { - if ((abs(DiffX) <= 127) && (abs(DiffY) <= 127) && (abs(DiffZ) <= 127)) // Limitations of a Byte + if ((abs(Diff.x) <= 127) && (abs(Diff.y) <= 127) && (abs(Diff.z) <= 127)) // Limitations of a Byte { // Difference within Byte limitations, use a relative move packet if (m_bDirtyOrientation) { - m_World->BroadcastEntityRelMoveLook(*this, static_cast(DiffX), static_cast(DiffY), static_cast(DiffZ), a_Exclude); + m_World->BroadcastEntityRelMoveLook(*this, Vector3(Diff), a_Exclude); m_bDirtyOrientation = false; } else { - m_World->BroadcastEntityRelMove(*this, static_cast(DiffX), static_cast(DiffY), static_cast(DiffZ), a_Exclude); + m_World->BroadcastEntityRelMove(*this, Vector3(Diff), a_Exclude); } // Clients seem to store two positions, one for the velocity packet and one for the teleport / relmove packet // The latter is only changed with a relmove / teleport, and m_LastSentPosition stores this position diff --git a/src/Entities/Entity.h b/src/Entities/Entity.h index 91ad524c7..bb6efcbbd 100644 --- a/src/Entities/Entity.h +++ b/src/Entities/Entity.h @@ -535,7 +535,8 @@ public: void SetParentChunk(cChunk * a_Chunk); /** Returns the chunk responsible for ticking this entity. */ - cChunk * GetParentChunk(); + cChunk * GetParentChunk() { return m_ParentChunk; } + const cChunk * GetParentChunk() const { return m_ParentChunk; } /** Set the entity's status to either ticking or not ticking. */ void SetIsTicking(bool a_IsTicking); diff --git a/src/Entities/EntityEffect.cpp b/src/Entities/EntityEffect.cpp index 45a98c0d2..040513a26 100644 --- a/src/Entities/EntityEffect.cpp +++ b/src/Entities/EntityEffect.cpp @@ -410,10 +410,10 @@ void cEntityEffectHunger::OnTick(cPawn & a_Target) void cEntityEffectInvisibility::BroadcastMetadata(cPawn & a_Target) { - auto ParentChunk = a_Target.GetParentChunk(); - if (ParentChunk != nullptr) + auto World = a_Target.GetWorld(); + if (World != nullptr) { - ParentChunk->BroadcastEntityMetadata(a_Target); + World->BroadcastEntityMetadata(a_Target); } } diff --git a/src/Entities/Floater.cpp b/src/Entities/Floater.cpp index 82213c668..d70cb4345 100644 --- a/src/Entities/Floater.cpp +++ b/src/Entities/Floater.cpp @@ -6,7 +6,6 @@ #include "Floater.h" #include "Player.h" #include "../ClientHandle.h" -#include "Broadcaster.h" @@ -123,12 +122,12 @@ void cFloater::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) { LOGD("Started producing particles for floater %i", GetUniqueID()); m_ParticlePos.Set(GetPosX() + Random.RandInt(-4, 4), GetPosY(), GetPosZ() + Random.RandInt(-4, 4)); - m_World->GetBroadcaster().BroadcastParticleEffect("splash", static_cast(m_ParticlePos), Vector3f{}, 0, 15); + m_World->BroadcastParticleEffect("splash", static_cast(m_ParticlePos), Vector3f{}, 0, 15); } else if (m_CountDownTime < 20) { m_ParticlePos = (m_ParticlePos + (GetPosition() - m_ParticlePos) / 6); - m_World->GetBroadcaster().BroadcastParticleEffect("splash", static_cast(m_ParticlePos), Vector3f{}, 0, 15); + m_World->BroadcastParticleEffect("splash", static_cast(m_ParticlePos), Vector3f{}, 0, 15); } m_CountDownTime--; diff --git a/src/Entities/Pickup.cpp b/src/Entities/Pickup.cpp index 629f5d189..4b983588c 100644 --- a/src/Entities/Pickup.cpp +++ b/src/Entities/Pickup.cpp @@ -60,10 +60,8 @@ public: if (Item.m_ItemCount <= 0) { /* Experimental: show animation pickups getting together */ - int DiffX = FloorC(m_Pickup->GetPosX() * 32.0) - FloorC(EntityPos.x * 32.0); - int DiffY = FloorC(m_Pickup->GetPosY() * 32.0) - FloorC(EntityPos.y * 32.0); - int DiffZ = FloorC(m_Pickup->GetPosZ() * 32.0) - FloorC(EntityPos.z * 32.0); - a_Entity.GetWorld()->BroadcastEntityRelMove(a_Entity, static_cast(DiffX), static_cast(DiffY), static_cast(DiffZ)); + auto Diff = (m_Pickup->GetPosition() * 32.0).Floor() - (EntityPos * 32.0).Floor(); + a_Entity.GetWorld()->BroadcastEntityRelMove(a_Entity, Vector3(Diff)); /* End of experimental animation */ a_Entity.Destroy(); -- cgit v1.2.3