aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Object/Object.cpp7
-rw-r--r--src/server/game/Entities/Object/Object.h1
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateData.cpp21
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateData.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp14
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)