Core/PacketIO: Properly destroy objects clientside when removing from world
Port From (https://github.com/TrinityCore/TrinityCore/commit/38cc011af04ebc7edff74f1ed4edfde9d1d77e0b)
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user