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 BlockCount;
List<ObjectGuid> destroyGUIDs = new List<ObjectGuid>();
List<ObjectGuid> outOfRangeGUIDs = new List<ObjectGuid>();
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<ObjectGuid> 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;
+6 -1
View File
@@ -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);
+8 -8
View File
@@ -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)