Core/PacketIO: Implement building SMSG_UPDATE_OBJECT only for selected fields and use that to fix quest objects not glowing after accepting quests
Port From (https://github.com/TrinityCore/TrinityCore/commit/bbfbb7d4bfa869755e702b40b53dbd295f8c964d)
This commit is contained in:
@@ -760,7 +760,7 @@ namespace Game
|
||||
|
||||
SQLTransaction trans = new SQLTransaction();
|
||||
|
||||
foreach (var auction in _itemsByAuctionId.Values)
|
||||
foreach (var auction in _itemsByAuctionId.Values.ToList())
|
||||
{
|
||||
///- filter auctions expired on next update
|
||||
if (auction.EndTime > curTime.AddMinutes(1))
|
||||
|
||||
@@ -867,6 +867,33 @@ namespace Game.Entities
|
||||
data.WriteBytes(buffer);
|
||||
}
|
||||
|
||||
void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedAreaTriggerMask, Player target)
|
||||
{
|
||||
UpdateMask valuesMask = new UpdateMask((int)TypeId.Max);
|
||||
if (requestedObjectMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Object);
|
||||
|
||||
if (requestedAreaTriggerMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.AreaTrigger);
|
||||
|
||||
WorldPacket buffer = new WorldPacket();
|
||||
buffer.WriteUInt32(valuesMask.GetBlock(0));
|
||||
|
||||
if (valuesMask[(int)TypeId.Object])
|
||||
m_objectData.WriteUpdate(buffer, requestedObjectMask, true, this, target);
|
||||
|
||||
if (valuesMask[(int)TypeId.AreaTrigger])
|
||||
m_areaTriggerData.WriteUpdate(buffer, requestedAreaTriggerMask, true, this, target);
|
||||
|
||||
WorldPacket buffer1 = new WorldPacket();
|
||||
buffer1.WriteUInt8((byte)UpdateType.Values);
|
||||
buffer1.WritePackedGuid(GetGUID());
|
||||
buffer1.WriteUInt32(buffer.GetSize());
|
||||
buffer1.WriteBytes(buffer.GetData());
|
||||
|
||||
data.AddUpdateBlock(buffer1);
|
||||
}
|
||||
|
||||
public override void ClearUpdateMask(bool remove)
|
||||
{
|
||||
m_values.ClearChangesMask(m_areaTriggerData);
|
||||
|
||||
@@ -233,6 +233,33 @@ namespace Game.Entities
|
||||
data.WriteBytes(buffer);
|
||||
}
|
||||
|
||||
void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedConversationMask, Player target)
|
||||
{
|
||||
UpdateMask valuesMask = new UpdateMask((int)TypeId.Max);
|
||||
if (requestedObjectMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Object);
|
||||
|
||||
if (requestedConversationMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Conversation);
|
||||
|
||||
WorldPacket buffer = new WorldPacket();
|
||||
buffer.WriteUInt32(valuesMask.GetBlock(0));
|
||||
|
||||
if (valuesMask[(int)TypeId.Object])
|
||||
m_objectData.WriteUpdate(buffer, requestedObjectMask, true, this, target);
|
||||
|
||||
if (valuesMask[(int)TypeId.Conversation])
|
||||
m_conversationData.WriteUpdate(buffer, requestedConversationMask, true, this, target);
|
||||
|
||||
WorldPacket buffer1 = new WorldPacket();
|
||||
buffer1.WriteUInt8((byte)UpdateType.Values);
|
||||
buffer1.WritePackedGuid(GetGUID());
|
||||
buffer1.WriteUInt32(buffer.GetSize());
|
||||
buffer1.WriteBytes(buffer.GetData());
|
||||
|
||||
data.AddUpdateBlock(buffer1);
|
||||
}
|
||||
|
||||
public override void ClearUpdateMask(bool remove)
|
||||
{
|
||||
m_values.ClearChangesMask(m_conversationData);
|
||||
|
||||
@@ -244,6 +244,33 @@ namespace Game.Entities
|
||||
data.WriteBytes(buffer);
|
||||
}
|
||||
|
||||
void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedCorpseMask, Player target)
|
||||
{
|
||||
UpdateMask valuesMask = new UpdateMask((int)TypeId.Max);
|
||||
if (requestedObjectMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Object);
|
||||
|
||||
if (requestedCorpseMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Corpse);
|
||||
|
||||
WorldPacket buffer = new WorldPacket();
|
||||
buffer.WriteUInt32(valuesMask.GetBlock(0));
|
||||
|
||||
if (valuesMask[(int)TypeId.Object])
|
||||
m_objectData.WriteUpdate(buffer, requestedObjectMask, true, this, target);
|
||||
|
||||
if (valuesMask[(int)TypeId.Corpse])
|
||||
m_corpseData.WriteUpdate(buffer, requestedCorpseMask, true, this, target);
|
||||
|
||||
WorldPacket buffer1 = new WorldPacket();
|
||||
buffer1.WriteUInt8((byte)UpdateType.Values);
|
||||
buffer1.WritePackedGuid(GetGUID());
|
||||
buffer1.WriteUInt32(buffer.GetSize());
|
||||
buffer1.WriteBytes(buffer.GetData());
|
||||
|
||||
data.AddUpdateBlock(buffer1);
|
||||
}
|
||||
|
||||
public override void ClearUpdateMask(bool remove)
|
||||
{
|
||||
m_values.ClearChangesMask(m_corpseData);
|
||||
|
||||
@@ -271,6 +271,33 @@ namespace Game.Entities
|
||||
data.WriteBytes(buffer);
|
||||
}
|
||||
|
||||
void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedDynamicObjectMask, Player target)
|
||||
{
|
||||
UpdateMask valuesMask = new UpdateMask((int)TypeId.Max);
|
||||
if (requestedObjectMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Object);
|
||||
|
||||
if (requestedDynamicObjectMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.DynamicObject);
|
||||
|
||||
WorldPacket buffer = new WorldPacket();
|
||||
buffer.WriteUInt32(valuesMask.GetBlock(0));
|
||||
|
||||
if (valuesMask[(int)TypeId.Object])
|
||||
m_objectData.WriteUpdate(buffer, requestedObjectMask, true, this, target);
|
||||
|
||||
if (valuesMask[(int)TypeId.DynamicObject])
|
||||
m_dynamicObjectData.WriteUpdate(buffer, requestedDynamicObjectMask, true, this, target);
|
||||
|
||||
WorldPacket buffer1 = new WorldPacket();
|
||||
buffer1.WriteUInt8((byte)UpdateType.Values);
|
||||
buffer1.WritePackedGuid(GetGUID());
|
||||
buffer1.WriteUInt32(buffer.GetSize());
|
||||
buffer1.WriteBytes(buffer.GetData());
|
||||
|
||||
data.AddUpdateBlock(buffer1);
|
||||
}
|
||||
|
||||
public override void ClearUpdateMask(bool remove)
|
||||
{
|
||||
m_values.ClearChangesMask(m_dynamicObjectData);
|
||||
|
||||
@@ -2514,6 +2514,33 @@ namespace Game.Entities
|
||||
data.WriteBytes(buffer);
|
||||
}
|
||||
|
||||
public void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedGameObjectMask, Player target)
|
||||
{
|
||||
UpdateMask valuesMask = new UpdateMask((int)TypeId.Max);
|
||||
if (requestedObjectMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Object);
|
||||
|
||||
if (requestedGameObjectMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.GameObject);
|
||||
|
||||
WorldPacket buffer = new WorldPacket();
|
||||
buffer.WriteUInt32(valuesMask.GetBlock(0));
|
||||
|
||||
if (valuesMask[(int)TypeId.Object])
|
||||
m_objectData.WriteUpdate(buffer, requestedObjectMask, true, this, target);
|
||||
|
||||
if (valuesMask[(int)TypeId.GameObject])
|
||||
m_gameObjectData.WriteUpdate(buffer, requestedGameObjectMask, true, this, target);
|
||||
|
||||
WorldPacket buffer1 = new WorldPacket();
|
||||
buffer1.WriteUInt8((byte)UpdateType.Values);
|
||||
buffer1.WritePackedGuid(GetGUID());
|
||||
buffer1.WriteUInt32(buffer.GetSize());
|
||||
buffer1.WriteBytes(buffer.GetData());
|
||||
|
||||
data.AddUpdateBlock(buffer1);
|
||||
}
|
||||
|
||||
public override void ClearUpdateMask(bool remove)
|
||||
{
|
||||
m_values.ClearChangesMask(m_gameObjectData);
|
||||
|
||||
@@ -195,6 +195,41 @@ namespace Game.Entities
|
||||
data.WriteBytes(buffer);
|
||||
}
|
||||
|
||||
void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedItemMask, UpdateMask requestedAzeriteEmpoweredItemMask, Player target)
|
||||
{
|
||||
UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
|
||||
UpdateMask valuesMask = new UpdateMask((int)TypeId.Max);
|
||||
if (requestedObjectMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Object);
|
||||
|
||||
m_itemData.FilterDisallowedFieldsMaskForFlag(requestedItemMask, flags);
|
||||
if (requestedItemMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Item);
|
||||
|
||||
if (requestedAzeriteEmpoweredItemMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.AzeriteEmpoweredItem);
|
||||
|
||||
WorldPacket buffer = new WorldPacket();
|
||||
buffer.WriteUInt32(valuesMask.GetBlock(0));
|
||||
|
||||
if (valuesMask[(int)TypeId.Object])
|
||||
m_objectData.WriteUpdate(buffer, requestedObjectMask, true, this, target);
|
||||
|
||||
if (valuesMask[(int)TypeId.Item])
|
||||
m_itemData.WriteUpdate(buffer, requestedItemMask, true, this, target);
|
||||
|
||||
if (valuesMask[(int)TypeId.AzeriteEmpoweredItem])
|
||||
m_azeriteEmpoweredItemData.WriteUpdate(buffer, requestedAzeriteEmpoweredItemMask, true, this, target);
|
||||
|
||||
WorldPacket buffer1 = new WorldPacket();
|
||||
buffer1.WriteUInt8((byte)UpdateType.Values);
|
||||
buffer1.WritePackedGuid(GetGUID());
|
||||
buffer1.WriteUInt32(buffer.GetSize());
|
||||
buffer1.WriteBytes(buffer.GetData());
|
||||
|
||||
data.AddUpdateBlock(buffer1);
|
||||
}
|
||||
|
||||
public override void ClearUpdateMask(bool remove)
|
||||
{
|
||||
m_values.ClearChangesMask(m_azeriteEmpoweredItemData);
|
||||
|
||||
@@ -467,16 +467,52 @@ namespace Game.Entities
|
||||
|
||||
UpdateMask mask = new UpdateMask(40);
|
||||
m_itemData.AppendAllowedFieldsMaskForFlag(mask, flags);
|
||||
m_itemData.WriteUpdate(buffer, mask, flags, this, target);
|
||||
m_itemData.WriteUpdate(buffer, mask, true, this, target);
|
||||
|
||||
UpdateMask mask2 = new UpdateMask(9);
|
||||
m_azeriteItemData.AppendAllowedFieldsMaskForFlag(mask2, flags);
|
||||
m_azeriteItemData.WriteUpdate(buffer, mask2, flags, this, target);
|
||||
m_azeriteItemData.WriteUpdate(buffer, mask2, true, this, target);
|
||||
|
||||
data.WriteUInt32(buffer.GetSize());
|
||||
data.WriteBytes(buffer);
|
||||
}
|
||||
|
||||
void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedItemMask, UpdateMask requestedAzeriteItemMask, Player target)
|
||||
{
|
||||
UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
|
||||
UpdateMask valuesMask = new UpdateMask((int)TypeId.Max);
|
||||
if (requestedObjectMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Object);
|
||||
|
||||
m_itemData.FilterDisallowedFieldsMaskForFlag(requestedItemMask, flags);
|
||||
if (requestedItemMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Item);
|
||||
|
||||
m_azeriteItemData.FilterDisallowedFieldsMaskForFlag(requestedAzeriteItemMask, flags);
|
||||
if (requestedAzeriteItemMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.AzeriteItem);
|
||||
|
||||
WorldPacket buffer = new WorldPacket();
|
||||
buffer.WriteUInt32(valuesMask.GetBlock(0));
|
||||
|
||||
if (valuesMask[(int)TypeId.Object])
|
||||
m_objectData.WriteUpdate(buffer, requestedObjectMask, true, this, target);
|
||||
|
||||
if (valuesMask[(int)TypeId.Item])
|
||||
m_itemData.WriteUpdate(buffer, requestedItemMask, true, this, target);
|
||||
|
||||
if (valuesMask[(int)TypeId.AzeriteItem])
|
||||
m_azeriteItemData.WriteUpdate(buffer, requestedAzeriteItemMask, true, this, target);
|
||||
|
||||
WorldPacket buffer1 = new WorldPacket();
|
||||
buffer1.WriteUInt8((byte)UpdateType.Values);
|
||||
buffer1.WritePackedGuid(GetGUID());
|
||||
buffer1.WriteUInt32(buffer.GetSize());
|
||||
buffer1.WriteBytes(buffer.GetData());
|
||||
|
||||
data.AddUpdateBlock(buffer1);
|
||||
}
|
||||
|
||||
public override void ClearUpdateMask(bool remove)
|
||||
{
|
||||
m_values.ClearChangesMask(m_azeriteItemData);
|
||||
|
||||
@@ -205,6 +205,41 @@ namespace Game.Entities
|
||||
data.WriteBytes(buffer);
|
||||
}
|
||||
|
||||
void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedItemMask, UpdateMask requestedContainerMask, Player target)
|
||||
{
|
||||
UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
|
||||
UpdateMask valuesMask = new UpdateMask((int)TypeId.Max);
|
||||
if (requestedObjectMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Object);
|
||||
|
||||
m_itemData.FilterDisallowedFieldsMaskForFlag(requestedItemMask, flags);
|
||||
if (requestedItemMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Item);
|
||||
|
||||
if (requestedContainerMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Container);
|
||||
|
||||
WorldPacket buffer = new WorldPacket();
|
||||
buffer.WriteUInt32(valuesMask.GetBlock(0));
|
||||
|
||||
if (valuesMask[(int)TypeId.Object])
|
||||
m_objectData.WriteUpdate(buffer, requestedObjectMask, true, this, target);
|
||||
|
||||
if (valuesMask[(int)TypeId.Item])
|
||||
m_itemData.WriteUpdate(buffer, requestedItemMask, true, this, target);
|
||||
|
||||
if (valuesMask[(int)TypeId.Container])
|
||||
m_containerData.WriteUpdate(buffer, requestedContainerMask, true, this, target);
|
||||
|
||||
WorldPacket buffer1 = new WorldPacket();
|
||||
buffer1.WriteUInt8((byte)UpdateType.Values);
|
||||
buffer1.WritePackedGuid(GetGUID());
|
||||
buffer1.WriteUInt32(buffer.GetSize());
|
||||
buffer1.WriteBytes(buffer.GetData());
|
||||
|
||||
data.AddUpdateBlock(buffer1);
|
||||
}
|
||||
|
||||
public override void ClearUpdateMask(bool remove)
|
||||
{
|
||||
m_values.ClearChangesMask(m_containerData);
|
||||
|
||||
@@ -1251,12 +1251,41 @@ namespace Game.Entities
|
||||
|
||||
buffer.WriteUInt32(valuesMask.GetBlock(0));
|
||||
m_itemData.AppendAllowedFieldsMaskForFlag(mask, flags);
|
||||
m_itemData.WriteUpdate(buffer, mask, flags, this, target);
|
||||
m_itemData.WriteUpdate(buffer, mask, true, this, target);
|
||||
|
||||
data.WriteUInt32(buffer.GetSize());
|
||||
data.WriteBytes(buffer);
|
||||
}
|
||||
|
||||
void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedItemMask, Player target)
|
||||
{
|
||||
UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
|
||||
UpdateMask valuesMask = new UpdateMask((int)TypeId.Max);
|
||||
if (requestedObjectMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Object);
|
||||
|
||||
m_itemData.FilterDisallowedFieldsMaskForFlag(requestedItemMask, flags);
|
||||
if (requestedItemMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Item);
|
||||
|
||||
WorldPacket buffer = new WorldPacket();
|
||||
buffer.WriteUInt32(valuesMask.GetBlock(0));
|
||||
|
||||
if (valuesMask[(int)TypeId.Object])
|
||||
m_objectData.WriteUpdate(buffer, requestedObjectMask, true, this, target);
|
||||
|
||||
if (valuesMask[(int)TypeId.Item])
|
||||
m_itemData.WriteUpdate(buffer, requestedItemMask, true, this, target);
|
||||
|
||||
WorldPacket buffer1 = new WorldPacket();
|
||||
buffer1.WriteUInt8((byte)UpdateType.Values);
|
||||
buffer1.WritePackedGuid(GetGUID());
|
||||
buffer1.WriteUInt32(buffer.GetSize());
|
||||
buffer1.WriteBytes(buffer.GetData());
|
||||
|
||||
data.AddUpdateBlock(buffer1);
|
||||
}
|
||||
|
||||
public override void ClearUpdateMask(bool remove)
|
||||
{
|
||||
m_values.ClearChangesMask(m_itemData);
|
||||
|
||||
@@ -329,11 +329,6 @@ namespace Game.Entities
|
||||
_changesMask = new UpdateMask(changeMask);
|
||||
}
|
||||
|
||||
public virtual void WriteCreate(WorldPacket data, T owner, Player receiver) { }
|
||||
public virtual void WriteUpdate(WorldPacket data, T owner, Player receiver) { }
|
||||
public virtual void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, T owner, Player receiver) { }
|
||||
public virtual void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, T owner, Player receiver) { }
|
||||
|
||||
public abstract void ClearChangesMask();
|
||||
|
||||
public UpdateMask GetUpdateMask()
|
||||
@@ -410,15 +405,13 @@ namespace Game.Entities
|
||||
|
||||
public UpdateField<U> ModifyValue<U>(UpdateField<U> updateField) where U : new()
|
||||
{
|
||||
_changesMask.Set(updateField.BlockBit);
|
||||
_changesMask.Set(updateField.Bit);
|
||||
MarkChanged(updateField);
|
||||
return updateField;
|
||||
}
|
||||
|
||||
public ref U ModifyValue<U>(UpdateFieldArray<U> updateField, int index) where U : new()
|
||||
{
|
||||
_changesMask.Set(updateField.Bit);
|
||||
_changesMask.Set(updateField.FirstElementBit + index);
|
||||
MarkChanged(updateField, index);
|
||||
return ref updateField._values[index];
|
||||
}
|
||||
|
||||
@@ -444,6 +437,40 @@ namespace Game.Entities
|
||||
|
||||
return new DynamicUpdateFieldSetter<U>(updateField, index);
|
||||
}
|
||||
|
||||
public void MarkChanged<U>(UpdateField<U> updateField) where U : new()
|
||||
{
|
||||
_changesMask.Set(updateField.BlockBit);
|
||||
_changesMask.Set(updateField.Bit);
|
||||
}
|
||||
|
||||
public void MarkChanged<U>(UpdateFieldArray<U> updateField, int index) where U : new()
|
||||
{
|
||||
_changesMask.Set(updateField.Bit);
|
||||
_changesMask.Set(updateField.FirstElementBit + index);
|
||||
}
|
||||
|
||||
public void WriteCompleteDynamicFieldUpdateMask(int size, WorldPacket data)
|
||||
{
|
||||
data.WriteBits(size, 32);
|
||||
if (size > 32)
|
||||
{
|
||||
if (data.HasUnfinishedBitPack())
|
||||
for (int block = 0; block < size / 32; ++block)
|
||||
data.WriteBits(0xFFFFFFFFu, 32);
|
||||
else
|
||||
for (int block = 0; block < size / 32; ++block)
|
||||
data.WriteUInt32(0xFFFFFFFFu);
|
||||
}
|
||||
else if (size == 32)
|
||||
{
|
||||
data.WriteBits(0xFFFFFFFFu, 32);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((size % 32) != 0)
|
||||
data.WriteBits(0xFFFFFFFFu, size % 32);
|
||||
}
|
||||
}
|
||||
|
||||
public class DynamicUpdateFieldSetter<T> : IUpdateField<T> where T : new()
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -16,6 +16,7 @@
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Linq;
|
||||
|
||||
namespace Game.Entities
|
||||
{
|
||||
@@ -64,6 +65,8 @@ namespace Game.Entities
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsAnySet() { return _blocksMask.Any(blockMask => blockMask != 0); }
|
||||
|
||||
public void Reset(int index)
|
||||
{
|
||||
int blockIndex = GetBlockIndex(index);
|
||||
|
||||
@@ -203,7 +203,6 @@ namespace Game.Entities
|
||||
public void BuildValuesUpdateBlockForPlayer(UpdateData data, Player target)
|
||||
{
|
||||
WorldPacket buffer = new WorldPacket();
|
||||
|
||||
buffer.WriteUInt8((byte)UpdateType.Values);
|
||||
buffer.WritePackedGuid(GetGUID());
|
||||
|
||||
@@ -215,7 +214,6 @@ namespace Game.Entities
|
||||
public void BuildValuesUpdateBlockForPlayerWithFlag(UpdateData data, UpdateFieldFlag flags, Player target)
|
||||
{
|
||||
WorldPacket buffer = new WorldPacket();
|
||||
|
||||
buffer.WriteUInt8((byte)UpdateType.Values);
|
||||
buffer.WritePackedGuid(GetGUID());
|
||||
|
||||
|
||||
@@ -2974,7 +2974,25 @@ namespace Game.Entities
|
||||
{
|
||||
GameObject obj = ObjectAccessor.GetGameObject(this, guid);
|
||||
if (obj != null)
|
||||
obj.BuildValuesUpdateBlockForPlayer(udata, this);
|
||||
{
|
||||
switch (obj.GetGoType())
|
||||
{
|
||||
case GameObjectTypes.QuestGiver:
|
||||
case GameObjectTypes.Chest:
|
||||
case GameObjectTypes.Goober:
|
||||
case GameObjectTypes.Generic:
|
||||
if (Global.ObjectMgr.IsGameObjectForQuests(obj.GetEntry()))
|
||||
{
|
||||
ObjectFieldData objMask = new ObjectFieldData();
|
||||
GameObjectFieldData goMask = new GameObjectFieldData();
|
||||
objMask.MarkChanged(obj.m_objectData.DynamicFlags);
|
||||
obj.BuildValuesUpdateForPlayerWithMask(udata, objMask._changesMask, goMask._changesMask, this);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (guid.IsCreatureOrVehicle())
|
||||
{
|
||||
@@ -3001,7 +3019,10 @@ namespace Game.Entities
|
||||
|
||||
if (buildUpdateBlock)
|
||||
{
|
||||
obj.BuildValuesUpdateBlockForPlayer(udata, this);
|
||||
ObjectFieldData objMask = new ObjectFieldData();
|
||||
UnitData unitMask = new UnitData();
|
||||
unitMask.MarkChanged(obj.m_unitData.NpcFlags, 0); // NpcFlags[0] has UNIT_NPC_FLAG_SPELLCLICK
|
||||
obj.BuildValuesUpdateForPlayerWithMask(udata, objMask._changesMask, unitMask._changesMask, this);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7558,17 +7558,58 @@ namespace Game.Entities
|
||||
|
||||
UpdateMask mask = new UpdateMask(191);
|
||||
m_unitData.AppendAllowedFieldsMaskForFlag(mask, flags);
|
||||
m_unitData.WriteUpdate(buffer, mask, flags, this, target);
|
||||
m_unitData.WriteUpdate(buffer, mask, true, this, target);
|
||||
|
||||
UpdateMask mask2 = new UpdateMask(161);
|
||||
m_playerData.AppendAllowedFieldsMaskForFlag(mask2, flags);
|
||||
m_playerData.WriteUpdate(buffer, mask2, flags, this, target);
|
||||
m_playerData.WriteUpdate(buffer, mask2, true, this, target);
|
||||
|
||||
data.WriteUInt32(buffer.GetSize());
|
||||
data.WriteUInt32(valuesMask.GetBlock(0));
|
||||
data.WriteBytes(buffer);
|
||||
}
|
||||
|
||||
void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedUnitMask, UpdateMask requestedPlayerMask, UpdateMask requestedActivePlayerMask, Player target)
|
||||
{
|
||||
UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
|
||||
UpdateMask valuesMask = new UpdateMask((int)TypeId.Max);
|
||||
if (requestedObjectMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Object);
|
||||
|
||||
m_unitData.FilterDisallowedFieldsMaskForFlag(requestedUnitMask, flags);
|
||||
if (requestedUnitMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Unit);
|
||||
|
||||
if (requestedPlayerMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Player);
|
||||
|
||||
if (target == this && requestedActivePlayerMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.ActivePlayer);
|
||||
|
||||
WorldPacket buffer = new WorldPacket();
|
||||
buffer.WriteUInt32(valuesMask.GetBlock(0));
|
||||
|
||||
if (valuesMask[(int)TypeId.Object])
|
||||
m_objectData.WriteUpdate(buffer, requestedObjectMask, true, this, target);
|
||||
|
||||
if (valuesMask[(int)TypeId.Unit])
|
||||
m_unitData.WriteUpdate(buffer, requestedUnitMask, true, this, target);
|
||||
|
||||
if (valuesMask[(int)TypeId.Player])
|
||||
m_playerData.WriteUpdate(buffer, requestedPlayerMask, true, this, target);
|
||||
|
||||
if (valuesMask[(int)TypeId.ActivePlayer])
|
||||
m_activePlayerData.WriteUpdate(buffer, requestedActivePlayerMask, true, this, target);
|
||||
|
||||
WorldPacket buffer1 = new WorldPacket();
|
||||
buffer1.WriteUInt8((byte)UpdateType.Values);
|
||||
buffer1.WritePackedGuid(GetGUID());
|
||||
buffer1.WriteUInt32(buffer.GetSize());
|
||||
buffer1.WriteBytes(buffer.GetData());
|
||||
|
||||
data.AddUpdateBlock(buffer1);
|
||||
}
|
||||
|
||||
public override void ClearUpdateMask(bool remove)
|
||||
{
|
||||
m_values.ClearChangesMask(m_playerData);
|
||||
|
||||
@@ -2735,13 +2735,42 @@ namespace Game.Entities
|
||||
|
||||
UpdateMask mask = new UpdateMask(191);
|
||||
m_unitData.AppendAllowedFieldsMaskForFlag(mask, flags);
|
||||
m_unitData.WriteUpdate(buffer, mask, flags, this, target);
|
||||
m_unitData.WriteUpdate(buffer, mask, true, this, target);
|
||||
|
||||
data.WriteUInt32(buffer.GetSize());
|
||||
data.WriteUInt32(valuesMask.GetBlock(0));
|
||||
data.WriteBytes(buffer);
|
||||
}
|
||||
|
||||
public void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedUnitMask, Player target)
|
||||
{
|
||||
UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
|
||||
UpdateMask valuesMask = new UpdateMask((int)TypeId.Max);
|
||||
if (requestedObjectMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Object);
|
||||
|
||||
m_unitData.FilterDisallowedFieldsMaskForFlag(requestedUnitMask, flags);
|
||||
if (requestedUnitMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Unit);
|
||||
|
||||
WorldPacket buffer = new WorldPacket();
|
||||
buffer.WriteUInt32(valuesMask.GetBlock(0));
|
||||
|
||||
if (valuesMask[(int)TypeId.Object])
|
||||
m_objectData.WriteUpdate(buffer, requestedObjectMask, true, this, target);
|
||||
|
||||
if (valuesMask[(int)TypeId.Unit])
|
||||
m_unitData.WriteUpdate(buffer, requestedUnitMask, true, this, target);
|
||||
|
||||
WorldPacket buffer1 = new WorldPacket();
|
||||
buffer1.WriteUInt8((byte)UpdateType.Values);
|
||||
buffer1.WritePackedGuid(GetGUID());
|
||||
buffer1.WriteUInt32(buffer.GetSize());
|
||||
buffer1.WriteBytes(buffer.GetData());
|
||||
|
||||
data.AddUpdateBlock(buffer1);
|
||||
}
|
||||
|
||||
public override void ClearUpdateMask(bool remove)
|
||||
{
|
||||
m_values.ClearChangesMask(m_unitData);
|
||||
|
||||
Reference in New Issue
Block a user