diff options
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateData.cpp | 21 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateData.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 14 |
5 files changed, 31 insertions, 14 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 1868d0bc77d..042e17f3ed8 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -259,6 +259,11 @@ void Object::BuildValuesUpdateBlockForPlayerWithFlag(UpdateData* data, UF::Updat data->AddUpdateBlock(buf); } +void Object::BuildDestroyUpdateBlock(UpdateData* data) const +{ + data->AddDestroyObject(GetGUID()); +} + void Object::BuildOutOfRangeUpdateBlock(UpdateData* data) const { data->AddOutOfRangeGUID(GetGUID()); @@ -269,7 +274,7 @@ void Object::DestroyForPlayer(Player* target) const ASSERT(target); UpdateData updateData(target->GetMapId()); - BuildOutOfRangeUpdateBlock(&updateData); + BuildDestroyUpdateBlock(&updateData); WorldPacket packet; updateData.BuildPacket(&packet); target->SendDirectMessage(&packet); diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 39f53b52c37..987118d9bb2 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -153,6 +153,7 @@ class TC_GAME_API Object void BuildValuesUpdateBlockForPlayer(UpdateData* data, Player const* target) const; void BuildValuesUpdateBlockForPlayerWithFlag(UpdateData* data, UF::UpdateFieldFlag flags, Player const* target) const; + void BuildDestroyUpdateBlock(UpdateData* data) const; void BuildOutOfRangeUpdateBlock(UpdateData* data) const; virtual void DestroyForPlayer(Player* target) const; diff --git a/src/server/game/Entities/Object/Updates/UpdateData.cpp b/src/server/game/Entities/Object/Updates/UpdateData.cpp index a5f5b0ba065..6ef8253c0d7 100644 --- a/src/server/game/Entities/Object/Updates/UpdateData.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateData.cpp @@ -22,6 +22,11 @@ UpdateData::UpdateData(uint32 map) : m_map(map), m_blockCount(0) { } +void UpdateData::AddDestroyObject(ObjectGuid guid) +{ + m_destroyGUIDs.insert(guid); +} + void UpdateData::AddOutOfRangeGUID(GuidSet& guids) { m_outOfRangeGUIDs.insert(guids.begin(), guids.end()); @@ -41,18 +46,21 @@ void UpdateData::AddUpdateBlock(const ByteBuffer &block) bool UpdateData::BuildPacket(WorldPacket* packet) { ASSERT(packet->empty()); // shouldn't happen - packet->Initialize(SMSG_UPDATE_OBJECT, 2 + 4 + (m_outOfRangeGUIDs.empty() ? 0 : 1 + 4 + 9 * m_outOfRangeGUIDs.size()) + m_data.wpos()); + packet->Initialize(SMSG_UPDATE_OBJECT, 4 + 2 + 1 + (2 + 4 + 17 * (m_destroyGUIDs.size() + m_outOfRangeGUIDs.size())) + m_data.wpos()); *packet << uint32(m_blockCount); *packet << uint16(m_map); - if (packet->WriteBit(!m_outOfRangeGUIDs.empty())) + if (packet->WriteBit(!m_outOfRangeGUIDs.empty() || !m_destroyGUIDs.empty())) { - *packet << uint16(0); // object limit to instantly destroy - objects before this index on m_outOfRangeGUIDs list get "smoothly phased out" - *packet << uint32(m_outOfRangeGUIDs.size()); + *packet << uint16(m_destroyGUIDs.size()); + *packet << uint32(m_destroyGUIDs.size() + m_outOfRangeGUIDs.size()); + + for (ObjectGuid const& destroyGuid : m_destroyGUIDs) + *packet << destroyGuid; - for (GuidSet::const_iterator i = m_outOfRangeGUIDs.begin(); i != m_outOfRangeGUIDs.end(); ++i) - *packet << *i; + for (ObjectGuid const& outOfRangeGuid : m_outOfRangeGUIDs) + *packet << outOfRangeGuid; } *packet << uint32(m_data.size()); @@ -63,6 +71,7 @@ bool UpdateData::BuildPacket(WorldPacket* packet) void UpdateData::Clear() { m_data.clear(); + m_destroyGUIDs.clear(); m_outOfRangeGUIDs.clear(); m_blockCount = 0; m_map = 0; diff --git a/src/server/game/Entities/Object/Updates/UpdateData.h b/src/server/game/Entities/Object/Updates/UpdateData.h index 91be7ddf1da..fdc4bb42d7a 100644 --- a/src/server/game/Entities/Object/Updates/UpdateData.h +++ b/src/server/game/Entities/Object/Updates/UpdateData.h @@ -43,6 +43,7 @@ class UpdateData { } + void AddDestroyObject(ObjectGuid guid); void AddOutOfRangeGUID(GuidSet& guids); void AddOutOfRangeGUID(ObjectGuid guid); void AddUpdateBlock(const ByteBuffer &block); @@ -55,6 +56,7 @@ class UpdateData protected: uint32 m_map; uint32 m_blockCount; + GuidSet m_destroyGUIDs; GuidSet m_outOfRangeGUIDs; ByteBuffer m_data; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index aa3c1b96ffa..0a908360941 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -3689,16 +3689,16 @@ void Player::DestroyForPlayer(Player* target) const { Unit::DestroyForPlayer(target); - for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) + if (target == this) { - if (m_items[i] == nullptr) - continue; + for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) + { + if (m_items[i] == nullptr) + continue; - m_items[i]->DestroyForPlayer(target); - } + m_items[i]->DestroyForPlayer(target); + } - if (target == this) - { for (uint8 i = INVENTORY_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i) { if (m_items[i] == nullptr) |