From 96fd9b7a573f7f420441701dd177ecd618171220 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Sun, 9 Feb 2020 17:10:01 -0500 Subject: [PATCH] Core/PacketIO: Properly destroy objects clientside when removing from world Port From (https://github.com/TrinityCore/TrinityCore/commit/38cc011af04ebc7edff74f1ed4edfde9d1d77e0b) --- .../Game/Entities/Object/Update/UpdateData.cs | 21 ++++++++++++++----- Source/Game/Entities/Object/WorldObject.cs | 7 ++++++- Source/Game/Entities/Player/Player.cs | 16 +++++++------- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/Source/Game/Entities/Object/Update/UpdateData.cs b/Source/Game/Entities/Object/Update/UpdateData.cs index f134bda2b..331aff1f8 100644 --- a/Source/Game/Entities/Object/Update/UpdateData.cs +++ b/Source/Game/Entities/Object/Update/UpdateData.cs @@ -26,6 +26,7 @@ namespace Game.Entities { uint MapId; uint BlockCount; + List destroyGUIDs = new List(); List outOfRangeGUIDs = new List(); ByteBuffer data = new ByteBuffer(); @@ -34,6 +35,11 @@ namespace Game.Entities MapId = mapId; } + public void AddDestroyObject(ObjectGuid guid) + { + destroyGUIDs.Add(guid); + } + public void AddOutOfRangeGUID(List guids) { outOfRangeGUIDs.AddRange(guids); @@ -58,14 +64,18 @@ namespace Game.Entities packet.MapID = (ushort)MapId; WorldPacket buffer = new WorldPacket(); - if (buffer.WriteBit(!outOfRangeGUIDs.Empty())) + if (buffer.WriteBit(!outOfRangeGUIDs.Empty() || !destroyGUIDs.Empty())) { - buffer.WriteUInt16(0); // object limit to instantly destroy - objects before this index on m_outOfRangeGUIDs list get "smoothly phased out" - buffer.WriteInt32(outOfRangeGUIDs.Count); + buffer.WriteUInt16((ushort)destroyGUIDs.Count); + buffer.WriteInt32(destroyGUIDs.Count + outOfRangeGUIDs.Count); - foreach (var guid in outOfRangeGUIDs) - buffer.WritePackedGuid(guid); + foreach (var destroyGuid in destroyGUIDs) + buffer.WritePackedGuid(destroyGuid); + + foreach (var outOfRangeGuid in outOfRangeGUIDs) + buffer.WritePackedGuid(outOfRangeGuid); } + var bytes = data.GetData(); buffer.WriteInt32(bytes.Length); buffer.WriteBytes(bytes); @@ -77,6 +87,7 @@ namespace Game.Entities public void Clear() { data.Clear(); + destroyGUIDs.Clear(); outOfRangeGUIDs.Clear(); BlockCount = 0; MapId = 0; diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index f081348cc..1493108a0 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -224,6 +224,11 @@ namespace Game.Entities data.AddUpdateBlock(buffer); } + void BuildDestroyUpdateBlock(UpdateData data) + { + data.AddDestroyObject(GetGUID()); + } + public void BuildOutOfRangeUpdateBlock(UpdateData data) { data.AddOutOfRangeGUID(GetGUID()); @@ -232,7 +237,7 @@ namespace Game.Entities public virtual void DestroyForPlayer(Player target) { UpdateData updateData = new UpdateData(target.GetMapId()); - BuildOutOfRangeUpdateBlock(updateData); + BuildDestroyUpdateBlock(updateData); UpdateObject packet; updateData.BuildPacket(out packet); target.SendPacket(packet); diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index 04edf0a9b..42f65c4a2 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -786,16 +786,16 @@ namespace Game.Entities { base.DestroyForPlayer(target); - for (byte i = 0; i < EquipmentSlot.End; ++i) - { - if (m_items[i] == null) - continue; - - m_items[i].DestroyForPlayer(target); - } - if (target == this) { + for (byte i = 0; i < EquipmentSlot.End; ++i) + { + if (m_items[i] == null) + continue; + + m_items[i].DestroyForPlayer(target); + } + for (byte i = InventorySlots.BagStart; i < InventorySlots.BagEnd; ++i) { if (m_items[i] == null)