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 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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user