Core/PacketIO: Properly destroy objects clientside when removing from world

Port From (https://github.com/TrinityCore/TrinityCore/commit/38cc011af04ebc7edff74f1ed4edfde9d1d77e0b)
This commit is contained in:
hondacrx
2020-02-09 17:10:01 -05:00
parent a4096ebd0c
commit 96fd9b7a57
3 changed files with 30 additions and 14 deletions
@@ -26,6 +26,7 @@ namespace Game.Entities
{ {
uint MapId; uint MapId;
uint BlockCount; uint BlockCount;
List<ObjectGuid> destroyGUIDs = new List<ObjectGuid>();
List<ObjectGuid> outOfRangeGUIDs = new List<ObjectGuid>(); List<ObjectGuid> outOfRangeGUIDs = new List<ObjectGuid>();
ByteBuffer data = new ByteBuffer(); ByteBuffer data = new ByteBuffer();
@@ -34,6 +35,11 @@ namespace Game.Entities
MapId = mapId; MapId = mapId;
} }
public void AddDestroyObject(ObjectGuid guid)
{
destroyGUIDs.Add(guid);
}
public void AddOutOfRangeGUID(List<ObjectGuid> guids) public void AddOutOfRangeGUID(List<ObjectGuid> guids)
{ {
outOfRangeGUIDs.AddRange(guids); outOfRangeGUIDs.AddRange(guids);
@@ -58,14 +64,18 @@ namespace Game.Entities
packet.MapID = (ushort)MapId; packet.MapID = (ushort)MapId;
WorldPacket buffer = new WorldPacket(); 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.WriteUInt16((ushort)destroyGUIDs.Count);
buffer.WriteInt32(outOfRangeGUIDs.Count); buffer.WriteInt32(destroyGUIDs.Count + outOfRangeGUIDs.Count);
foreach (var guid in outOfRangeGUIDs) foreach (var destroyGuid in destroyGUIDs)
buffer.WritePackedGuid(guid); buffer.WritePackedGuid(destroyGuid);
foreach (var outOfRangeGuid in outOfRangeGUIDs)
buffer.WritePackedGuid(outOfRangeGuid);
} }
var bytes = data.GetData(); var bytes = data.GetData();
buffer.WriteInt32(bytes.Length); buffer.WriteInt32(bytes.Length);
buffer.WriteBytes(bytes); buffer.WriteBytes(bytes);
@@ -77,6 +87,7 @@ namespace Game.Entities
public void Clear() public void Clear()
{ {
data.Clear(); data.Clear();
destroyGUIDs.Clear();
outOfRangeGUIDs.Clear(); outOfRangeGUIDs.Clear();
BlockCount = 0; BlockCount = 0;
MapId = 0; MapId = 0;
+6 -1
View File
@@ -224,6 +224,11 @@ namespace Game.Entities
data.AddUpdateBlock(buffer); data.AddUpdateBlock(buffer);
} }
void BuildDestroyUpdateBlock(UpdateData data)
{
data.AddDestroyObject(GetGUID());
}
public void BuildOutOfRangeUpdateBlock(UpdateData data) public void BuildOutOfRangeUpdateBlock(UpdateData data)
{ {
data.AddOutOfRangeGUID(GetGUID()); data.AddOutOfRangeGUID(GetGUID());
@@ -232,7 +237,7 @@ namespace Game.Entities
public virtual void DestroyForPlayer(Player target) public virtual void DestroyForPlayer(Player target)
{ {
UpdateData updateData = new UpdateData(target.GetMapId()); UpdateData updateData = new UpdateData(target.GetMapId());
BuildOutOfRangeUpdateBlock(updateData); BuildDestroyUpdateBlock(updateData);
UpdateObject packet; UpdateObject packet;
updateData.BuildPacket(out packet); updateData.BuildPacket(out packet);
target.SendPacket(packet); target.SendPacket(packet);
+8 -8
View File
@@ -786,16 +786,16 @@ namespace Game.Entities
{ {
base.DestroyForPlayer(target); 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) 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) for (byte i = InventorySlots.BagStart; i < InventorySlots.BagEnd; ++i)
{ {
if (m_items[i] == null) if (m_items[i] == null)