From a3edaf4df65685a1ae2c5a1f9f4333ceb05d2349 Mon Sep 17 00:00:00 2001 From: Hondacrx Date: Mon, 11 Nov 2024 12:24:22 -0500 Subject: [PATCH] Core/PacketIO: Move writing data sizes in SMSG_UPDATE_OBJECT to shared functions instead of spreading it in all overrides Port From (https://github.com/TrinityCore/TrinityCore/commit/067fa31d152ecb10e5bea0419f84f7b79b96abf5) --- .../Game/Entities/AreaTrigger/AreaTrigger.cs | 20 ++-- Source/Game/Entities/Conversation.cs | 18 +--- Source/Game/Entities/Corpse.cs | 18 +--- Source/Game/Entities/Creature/Creature.cs | 98 +++++++++++++++++++ Source/Game/Entities/DynamicObject.cs | 20 ++-- Source/Game/Entities/GameObject/GameObject.cs | 20 ++-- .../Entities/Item/AzeriteEmpoweredItem.cs | 24 ++--- Source/Game/Entities/Item/AzeriteItem.cs | 34 +++---- Source/Game/Entities/Item/Bag.cs | 24 ++--- Source/Game/Entities/Item/Item.cs | 27 ++--- Source/Game/Entities/Object/WorldObject.cs | 22 ++++- Source/Game/Entities/Player/Player.cs | 38 +++---- Source/Game/Entities/SceneObject.cs | 20 +--- Source/Game/Entities/Unit/Unit.Fields.cs | 22 ----- Source/Game/Entities/Unit/Unit.cs | 87 ---------------- 15 files changed, 195 insertions(+), 297 deletions(-) diff --git a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs index 29e89bd27..594c6b9c0 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs @@ -1333,30 +1333,22 @@ namespace Game.Entities public override void BuildValuesCreate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - buffer.WriteUInt8((byte)flags); - m_objectData.WriteCreate(buffer, flags, this, target); - m_areaTriggerData.WriteCreate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); + data.WriteUInt8((byte)flags); + m_objectData.WriteCreate(data, flags, this, target); + m_areaTriggerData.WriteCreate(data, flags, this, target); } public override void BuildValuesUpdate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - buffer.WriteUInt32(m_values.GetChangedObjectTypeMask()); + data.WriteUInt32(m_values.GetChangedObjectTypeMask()); if (m_values.HasChanged(TypeId.Object)) - m_objectData.WriteUpdate(buffer, flags, this, target); + m_objectData.WriteUpdate(data, flags, this, target); if (m_values.HasChanged(TypeId.AreaTrigger)) - m_areaTriggerData.WriteUpdate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); + m_areaTriggerData.WriteUpdate(data, flags, this, target); } public void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedAreaTriggerMask, Player target) diff --git a/Source/Game/Entities/Conversation.cs b/Source/Game/Entities/Conversation.cs index cd821076d..4f20ccfe2 100644 --- a/Source/Game/Entities/Conversation.cs +++ b/Source/Game/Entities/Conversation.cs @@ -290,30 +290,22 @@ namespace Game.Entities public override void BuildValuesCreate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - m_objectData.WriteCreate(buffer, flags, this, target); - m_conversationData.WriteCreate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); data.WriteUInt8((byte)flags); - data.WriteBytes(buffer); + m_objectData.WriteCreate(data, flags, this, target); + m_conversationData.WriteCreate(data, flags, this, target); } public override void BuildValuesUpdate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - buffer.WriteUInt32(m_values.GetChangedObjectTypeMask()); + data.WriteUInt32(m_values.GetChangedObjectTypeMask()); if (m_values.HasChanged(TypeId.Object)) - m_objectData.WriteUpdate(buffer, flags, this, target); + m_objectData.WriteUpdate(data, flags, this, target); if (m_values.HasChanged(TypeId.Conversation)) - m_conversationData.WriteUpdate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); + m_conversationData.WriteUpdate(data, flags, this, target); } void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedConversationMask, Player target) diff --git a/Source/Game/Entities/Corpse.cs b/Source/Game/Entities/Corpse.cs index 98ba7ebf6..d29771284 100644 --- a/Source/Game/Entities/Corpse.cs +++ b/Source/Game/Entities/Corpse.cs @@ -220,30 +220,22 @@ namespace Game.Entities public override void BuildValuesCreate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - m_objectData.WriteCreate(buffer, flags, this, target); - m_corpseData.WriteCreate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize() + 1); data.WriteUInt8((byte)flags); - data.WriteBytes(buffer); + m_objectData.WriteCreate(data, flags, this, target); + m_corpseData.WriteCreate(data, flags, this, target); } public override void BuildValuesUpdate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - buffer.WriteUInt32(m_values.GetChangedObjectTypeMask()); + data.WriteUInt32(m_values.GetChangedObjectTypeMask()); if (m_values.HasChanged(TypeId.Object)) - m_objectData.WriteUpdate(buffer, flags, this, target); + m_objectData.WriteUpdate(data, flags, this, target); if (m_values.HasChanged(TypeId.Corpse)) - m_corpseData.WriteUpdate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); + m_corpseData.WriteUpdate(data, flags, this, target); } void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedCorpseMask, Player target) diff --git a/Source/Game/Entities/Creature/Creature.cs b/Source/Game/Entities/Creature/Creature.cs index b13ef743e..e2918ca1a 100644 --- a/Source/Game/Entities/Creature/Creature.cs +++ b/Source/Game/Entities/Creature/Creature.cs @@ -9,6 +9,7 @@ using Game.DataStorage; using Game.Groups; using Game.Loots; using Game.Maps; +using Game.Networking; using Game.Networking.Packets; using Game.Spells; using System; @@ -3689,6 +3690,103 @@ namespace Game.Entities // There's many places not ready for dynamic spawns. This allows them to live on for now. void SetRespawnCompatibilityMode(bool mode = true) { m_respawnCompatibilityMode = mode; } public bool GetRespawnCompatibilityMode() { return m_respawnCompatibilityMode; } + + public override UpdateFieldFlag GetUpdateFieldFlagsFor(Player target) + { + UpdateFieldFlag flags = UpdateFieldFlag.None; + if (GetOwnerGUID() == target.GetGUID()) + flags |= UpdateFieldFlag.Owner; + + if (HasDynamicFlag(UnitDynFlags.SpecialInfo)) + if (HasAuraTypeWithCaster(AuraType.Empathy, target.GetGUID())) + flags |= UpdateFieldFlag.Empath; + + return flags; + } + + public override void BuildValuesCreate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + data.WriteUInt8((byte)flags); + m_objectData.WriteCreate(data, flags, this, target); + m_unitData.WriteCreate(data, flags, this, target); + } + + public override void BuildValuesUpdate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + data.WriteUInt32(m_values.GetChangedObjectTypeMask()); + + if (m_values.HasChanged(TypeId.Object)) + m_objectData.WriteUpdate(data, flags, this, target); + + if (m_values.HasChanged(TypeId.Unit)) + m_unitData.WriteUpdate(data, flags, this, target); + } + + public override void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target) + { + UpdateMask valuesMask = new((int)TypeId.Max); + valuesMask.Set((int)TypeId.Unit); + + data.WriteUInt32(valuesMask.GetBlock(0)); + + UpdateMask mask = m_unitData.GetStaticUpdateMask(); + m_unitData.AppendAllowedFieldsMaskForFlag(mask, flags); + m_unitData.WriteUpdate(data, mask, true, this, target); + } + + public void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedUnitMask, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + UpdateMask valuesMask = new((int)TypeId.Max); + if (requestedObjectMask.IsAnySet()) + valuesMask.Set((int)TypeId.Object); + + UpdateMask unitMask = requestedUnitMask; + m_unitData.FilterDisallowedFieldsMaskForFlag(unitMask, flags); + if (unitMask.IsAnySet()) + valuesMask.Set((int)TypeId.Unit); + + WorldPacket buffer = new(); + 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(); + buffer1.WriteUInt8((byte)UpdateType.Values); + buffer1.WritePackedGuid(GetGUID()); + buffer1.WriteUInt32(buffer.GetSize()); + buffer1.WriteBytes(buffer.GetData()); + + data.AddUpdateBlock(buffer1); + } + + class ValuesUpdateForPlayerWithMaskSender : IDoWork + { + Creature Owner; + ObjectFieldData ObjectMask = new(); + UnitData UnitMask = new(); + + public ValuesUpdateForPlayerWithMaskSender(Creature owner) + { + Owner = owner; + } + + public void Invoke(Player player) + { + UpdateData udata = new(Owner.GetMapId()); + + Owner.BuildValuesUpdateForPlayerWithMask(udata, ObjectMask.GetUpdateMask(), UnitMask.GetUpdateMask(), player); + + udata.BuildPacket(out UpdateObject packet); + player.SendPacket(packet); + } + } } public class VendorItemCount diff --git a/Source/Game/Entities/DynamicObject.cs b/Source/Game/Entities/DynamicObject.cs index 135172cb1..20a554e36 100644 --- a/Source/Game/Entities/DynamicObject.cs +++ b/Source/Game/Entities/DynamicObject.cs @@ -243,30 +243,22 @@ namespace Game.Entities public override void BuildValuesCreate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - buffer.WriteUInt8((byte)flags); - m_objectData.WriteCreate(buffer, flags, this, target); - m_dynamicObjectData.WriteCreate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); + data.WriteUInt8((byte)flags); + m_objectData.WriteCreate(data, flags, this, target); + m_dynamicObjectData.WriteCreate(data, flags, this, target); } public override void BuildValuesUpdate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - buffer.WriteUInt32(m_values.GetChangedObjectTypeMask()); + data.WriteUInt32(m_values.GetChangedObjectTypeMask()); if (m_values.HasChanged(TypeId.Object)) - m_objectData.WriteUpdate(buffer, flags, this, target); + m_objectData.WriteUpdate(data, flags, this, target); if (m_values.HasChanged(TypeId.DynamicObject)) - m_dynamicObjectData.WriteUpdate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); + m_dynamicObjectData.WriteUpdate(data, flags, this, target); } void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedDynamicObjectMask, Player target) diff --git a/Source/Game/Entities/GameObject/GameObject.cs b/Source/Game/Entities/GameObject/GameObject.cs index 748be36bc..443f8905e 100644 --- a/Source/Game/Entities/GameObject/GameObject.cs +++ b/Source/Game/Entities/GameObject/GameObject.cs @@ -3274,30 +3274,22 @@ namespace Game.Entities public override void BuildValuesCreate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - buffer.WriteUInt8((byte)flags); - m_objectData.WriteCreate(buffer, flags, this, target); - m_gameObjectData.WriteCreate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); + data.WriteUInt8((byte)flags); + m_objectData.WriteCreate(data, flags, this, target); + m_gameObjectData.WriteCreate(data, flags, this, target); } public override void BuildValuesUpdate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - buffer.WriteUInt32(m_values.GetChangedObjectTypeMask()); + data.WriteUInt32(m_values.GetChangedObjectTypeMask()); if (m_values.HasChanged(TypeId.Object)) - m_objectData.WriteUpdate(buffer, flags, this, target); + m_objectData.WriteUpdate(data, flags, this, target); if (m_values.HasChanged(TypeId.GameObject)) - m_gameObjectData.WriteUpdate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); + m_gameObjectData.WriteUpdate(data, flags, this, target); } public void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedGameObjectMask, Player target) diff --git a/Source/Game/Entities/Item/AzeriteEmpoweredItem.cs b/Source/Game/Entities/Item/AzeriteEmpoweredItem.cs index 57234b113..7cca7e5f3 100644 --- a/Source/Game/Entities/Item/AzeriteEmpoweredItem.cs +++ b/Source/Game/Entities/Item/AzeriteEmpoweredItem.cs @@ -149,34 +149,26 @@ namespace Game.Entities public override void BuildValuesCreate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - buffer.WriteUInt8((byte)flags); - m_objectData.WriteCreate(buffer, flags, this, target); - m_itemData.WriteCreate(buffer, flags, this, target); - m_azeriteEmpoweredItemData.WriteCreate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); + data.WriteUInt8((byte)flags); + m_objectData.WriteCreate(data, flags, this, target); + m_itemData.WriteCreate(data, flags, this, target); + m_azeriteEmpoweredItemData.WriteCreate(data, flags, this, target); } public override void BuildValuesUpdate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); + data.WriteUInt32(m_values.GetChangedObjectTypeMask()); if (m_values.HasChanged(TypeId.Object)) - m_objectData.WriteUpdate(buffer, flags, this, target); + m_objectData.WriteUpdate(data, flags, this, target); if (m_values.HasChanged(TypeId.Item)) - m_itemData.WriteUpdate(buffer, flags, this, target); + m_itemData.WriteUpdate(data, flags, this, target); if (m_values.HasChanged(TypeId.AzeriteEmpoweredItem)) - m_azeriteEmpoweredItemData.WriteUpdate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteUInt32(m_values.GetChangedObjectTypeMask()); - data.WriteBytes(buffer); + m_azeriteEmpoweredItemData.WriteUpdate(data, flags, this, target); } void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedItemMask, UpdateMask requestedAzeriteEmpoweredItemMask, Player target) diff --git a/Source/Game/Entities/Item/AzeriteItem.cs b/Source/Game/Entities/Item/AzeriteItem.cs index 8327cf9cc..0c1a0a0a6 100644 --- a/Source/Game/Entities/Item/AzeriteItem.cs +++ b/Source/Game/Entities/Item/AzeriteItem.cs @@ -407,34 +407,26 @@ namespace Game.Entities public override void BuildValuesCreate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - buffer.WriteUInt8((byte)flags); - m_objectData.WriteCreate(buffer, flags, this, target); - m_itemData.WriteCreate(buffer, flags, this, target); - m_azeriteItemData.WriteCreate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); + data.WriteUInt8((byte)flags); + m_objectData.WriteCreate(data, flags, this, target); + m_itemData.WriteCreate(data, flags, this, target); + m_azeriteItemData.WriteCreate(data, flags, this, target); } public override void BuildValuesUpdate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); + data.WriteUInt32(m_values.GetChangedObjectTypeMask()); if (m_values.HasChanged(TypeId.Object)) - m_objectData.WriteUpdate(buffer, flags, this, target); + m_objectData.WriteUpdate(data, flags, this, target); if (m_values.HasChanged(TypeId.Item)) - m_itemData.WriteUpdate(buffer, flags, this, target); + m_itemData.WriteUpdate(data, flags, this, target); if (m_values.HasChanged(TypeId.AzeriteItem)) - m_azeriteItemData.WriteUpdate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteUInt32(m_values.GetChangedObjectTypeMask()); - data.WriteBytes(buffer); + m_azeriteItemData.WriteUpdate(data, flags, this, target); } public override void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target) @@ -443,19 +435,15 @@ namespace Game.Entities valuesMask.Set((int)TypeId.Item); valuesMask.Set((int)TypeId.AzeriteItem); - WorldPacket buffer = new(); - buffer.WriteUInt32(valuesMask.GetBlock(0)); + data.WriteUInt32(valuesMask.GetBlock(0)); UpdateMask mask = m_itemData.GetStaticUpdateMask(); m_itemData.AppendAllowedFieldsMaskForFlag(mask, flags); - m_itemData.WriteUpdate(buffer, mask, true, this, target); + m_itemData.WriteUpdate(data, mask, true, this, target); UpdateMask mask2 = m_azeriteItemData.GetStaticUpdateMask(); m_azeriteItemData.AppendAllowedFieldsMaskForFlag(mask2, flags); - m_azeriteItemData.WriteUpdate(buffer, mask2, true, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); + m_azeriteItemData.WriteUpdate(data, mask2, true, this, target); } void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedItemMask, UpdateMask requestedAzeriteItemMask, Player target) diff --git a/Source/Game/Entities/Item/Bag.cs b/Source/Game/Entities/Item/Bag.cs index 2addc13b3..8ed7909f8 100644 --- a/Source/Game/Entities/Item/Bag.cs +++ b/Source/Game/Entities/Item/Bag.cs @@ -163,34 +163,26 @@ namespace Game.Entities public override void BuildValuesCreate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - buffer.WriteUInt8((byte)flags); - m_objectData.WriteCreate(buffer, flags, this, target); - m_itemData.WriteCreate(buffer, flags, this, target); - m_containerData.WriteCreate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); + data.WriteUInt8((byte)flags); + m_objectData.WriteCreate(data, flags, this, target); + m_itemData.WriteCreate(data, flags, this, target); + m_containerData.WriteCreate(data, flags, this, target); } public override void BuildValuesUpdate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - buffer.WriteUInt32(m_values.GetChangedObjectTypeMask()); + data.WriteUInt32(m_values.GetChangedObjectTypeMask()); if (m_values.HasChanged(TypeId.Object)) - m_objectData.WriteUpdate(buffer, flags, this, target); + m_objectData.WriteUpdate(data, flags, this, target); if (m_values.HasChanged(TypeId.Item)) - m_itemData.WriteUpdate(buffer, flags, this, target); + m_itemData.WriteUpdate(data, flags, this, target); if (m_values.HasChanged(TypeId.Container)) - m_containerData.WriteUpdate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); + m_containerData.WriteUpdate(data, flags, this, target); } void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedItemMask, UpdateMask requestedContainerMask, Player target) diff --git a/Source/Game/Entities/Item/Item.cs b/Source/Game/Entities/Item/Item.cs index 770acc118..94f639156 100644 --- a/Source/Game/Entities/Item/Item.cs +++ b/Source/Game/Entities/Item/Item.cs @@ -1273,31 +1273,22 @@ namespace Game.Entities public override void BuildValuesCreate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - m_objectData.WriteCreate(buffer, flags, this, target); - m_itemData.WriteCreate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize() + 1); data.WriteUInt8((byte)flags); - data.WriteBytes(buffer); + m_objectData.WriteCreate(data, flags, this, target); + m_itemData.WriteCreate(data, flags, this, target); } public override void BuildValuesUpdate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); + data.WriteUInt32(m_values.GetChangedObjectTypeMask()); if (m_values.HasChanged(TypeId.Object)) - m_objectData.WriteUpdate(buffer, flags, this, target); + m_objectData.WriteUpdate(data, flags, this, target); if (m_values.HasChanged(TypeId.Item)) - m_itemData.WriteUpdate(buffer, flags, this, target); - - - data.WriteUInt32(buffer.GetSize()); - data.WriteUInt32(m_values.GetChangedObjectTypeMask()); - data.WriteBytes(buffer); + m_itemData.WriteUpdate(data, flags, this, target); } public override void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target) @@ -1305,15 +1296,11 @@ namespace Game.Entities UpdateMask valuesMask = new((int)TypeId.Max); valuesMask.Set((int)TypeId.Item); - WorldPacket buffer = new(); UpdateMask mask = m_itemData.GetStaticUpdateMask(); - buffer.WriteUInt32(valuesMask.GetBlock(0)); + data.WriteUInt32(valuesMask.GetBlock(0)); m_itemData.AppendAllowedFieldsMaskForFlag(mask, flags); - m_itemData.WriteUpdate(buffer, mask, true, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); + m_itemData.WriteUpdate(data, mask, true, this, target); } void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedItemMask, Player target) diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index 74ccbbb34..73a5d5bc6 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -3,6 +3,7 @@ using Framework.Constants; using Framework.Dynamic; +using Framework.IO; using Game.AI; using Game.BattleFields; using Game.DataStorage; @@ -165,7 +166,12 @@ namespace Game.Entities buffer.WriteUInt8((byte)tempObjectType); BuildMovementUpdate(buffer, flags, target); - BuildValuesCreate(buffer, target); + + WorldPacket tempBuffer = new(); + BuildValuesCreate(tempBuffer, target); + buffer.WriteUInt32(tempBuffer.GetSize()); + buffer.WriteBytes(tempBuffer); + data.AddUpdateBlock(buffer); } @@ -190,7 +196,10 @@ namespace Game.Entities buffer.WriteUInt8((byte)UpdateType.Values); buffer.WritePackedGuid(GetGUID()); - BuildValuesUpdate(buffer, target); + WorldPacket tempBuffer = new(); + BuildValuesUpdate(tempBuffer, target); + buffer.WriteUInt32(tempBuffer.GetSize()); + buffer.WriteBytes(tempBuffer); data.AddUpdateBlock(buffer); } @@ -201,7 +210,10 @@ namespace Game.Entities buffer.WriteUInt8((byte)UpdateType.Values); buffer.WritePackedGuid(GetGUID()); - BuildValuesUpdateWithFlag(buffer, flags, target); + WorldPacket tempBuffer = new(); + BuildValuesUpdateWithFlag(tempBuffer, flags, target); + buffer.WriteUInt32(tempBuffer.GetSize()); + buffer.WriteBytes(tempBuffer); data.AddUpdateBlock(buffer); } @@ -821,8 +833,8 @@ namespace Game.Entities public virtual Loot GetLootForPlayer(Player player) { return null; } - public abstract void BuildValuesCreate(WorldPacket data, Player target); - public abstract void BuildValuesUpdate(WorldPacket data, Player target); + public virtual void BuildValuesCreate(WorldPacket data, Player target) { } + public virtual void BuildValuesUpdate(WorldPacket data, Player target) { } public void SetUpdateFieldValue(IUpdateField updateField, T newValue) { diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index bf19a0302..41dc35428 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -7918,39 +7918,31 @@ namespace Game.Entities public override void BuildValuesCreate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - buffer.WriteUInt8((byte)flags); - m_objectData.WriteCreate(buffer, flags, this, target); - m_unitData.WriteCreate(buffer, flags, this, target); - m_playerData.WriteCreate(buffer, flags, this, target); + data.WriteUInt8((byte)flags); + m_objectData.WriteCreate(data, flags, this, target); + m_unitData.WriteCreate(data, flags, this, target); + m_playerData.WriteCreate(data, flags, this, target); if (target == this) - m_activePlayerData.WriteCreate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); + m_activePlayerData.WriteCreate(data, flags, this, target); } public override void BuildValuesUpdate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - buffer.WriteUInt32((uint)(m_values.GetChangedObjectTypeMask() & ~((target != this ? 1 : 0) << (int)TypeId.ActivePlayer))); + data.WriteUInt32((uint)(m_values.GetChangedObjectTypeMask() & ~((target != this ? 1 : 0) << (int)TypeId.ActivePlayer))); if (m_values.HasChanged(TypeId.Object)) - m_objectData.WriteUpdate(buffer, flags, this, target); + m_objectData.WriteUpdate(data, flags, this, target); if (m_values.HasChanged(TypeId.Unit)) - m_unitData.WriteUpdate(buffer, flags, this, target); + m_unitData.WriteUpdate(data, flags, this, target); if (m_values.HasChanged(TypeId.Player)) - m_playerData.WriteUpdate(buffer, flags, this, target); + m_playerData.WriteUpdate(data, flags, this, target); if (target == this && m_values.HasChanged(TypeId.ActivePlayer)) - m_activePlayerData.WriteUpdate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); + m_activePlayerData.WriteUpdate(data, flags, this, target); } public override void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target) @@ -7959,19 +7951,15 @@ namespace Game.Entities valuesMask.Set((int)TypeId.Unit); valuesMask.Set((int)TypeId.Player); - WorldPacket buffer = new(); + data.WriteUInt32(valuesMask.GetBlock(0)); UpdateMask mask = m_unitData.GetStaticUpdateMask(); m_unitData.AppendAllowedFieldsMaskForFlag(mask, flags); - m_unitData.WriteUpdate(buffer, mask, true, this, target); + m_unitData.WriteUpdate(data, mask, true, this, target); UpdateMask mask2 = m_playerData.GetStaticUpdateMask(); m_playerData.AppendAllowedFieldsMaskForFlag(mask2, flags); - m_playerData.WriteUpdate(buffer, mask2, true, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteUInt32(valuesMask.GetBlock(0)); - data.WriteBytes(buffer); + m_playerData.WriteUpdate(data, mask2, true, this, target); } void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedUnitMask, UpdateMask requestedPlayerMask, UpdateMask requestedActivePlayerMask, Player target) diff --git a/Source/Game/Entities/SceneObject.cs b/Source/Game/Entities/SceneObject.cs index 4acbb5105..5b466c335 100644 --- a/Source/Game/Entities/SceneObject.cs +++ b/Source/Game/Entities/SceneObject.cs @@ -124,32 +124,22 @@ namespace Game.Entities public override void BuildValuesCreate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - m_objectData.WriteCreate(buffer, flags, this, target); - m_sceneObjectData.WriteCreate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); data.WriteUInt8((byte)flags); - data.WriteBytes(buffer); - - + m_objectData.WriteCreate(data, flags, this, target); + m_sceneObjectData.WriteCreate(data, flags, this, target); } public override void BuildValuesUpdate(WorldPacket data, Player target) { UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - buffer.WriteUInt32(m_values.GetChangedObjectTypeMask()); + data.WriteUInt32(m_values.GetChangedObjectTypeMask()); if (m_values.HasChanged(TypeId.Object)) - m_objectData.WriteUpdate(buffer, flags, this, target); + m_objectData.WriteUpdate(data, flags, this, target); if (m_values.HasChanged(TypeId.SceneObject)) - m_sceneObjectData.WriteUpdate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); + m_sceneObjectData.WriteUpdate(data, flags, this, target); } void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedSceneObjectMask, Player target) diff --git a/Source/Game/Entities/Unit/Unit.Fields.cs b/Source/Game/Entities/Unit/Unit.Fields.cs index 7d2a69101..c5b0835d5 100644 --- a/Source/Game/Entities/Unit/Unit.Fields.cs +++ b/Source/Game/Entities/Unit/Unit.Fields.cs @@ -126,28 +126,6 @@ namespace Game.Entities ushort _aiAnimKitId; ushort _movementAnimKitId; ushort _meleeAnimKitId; - - class ValuesUpdateForPlayerWithMaskSender : IDoWork - { - Unit Owner; - ObjectFieldData ObjectMask = new(); - UnitData UnitMask = new(); - - public ValuesUpdateForPlayerWithMaskSender(Unit owner) - { - Owner = owner; - } - - public void Invoke(Player player) - { - UpdateData udata = new(Owner.GetMapId()); - - Owner.BuildValuesUpdateForPlayerWithMask(udata, ObjectMask.GetUpdateMask(), UnitMask.GetUpdateMask(), player); - - udata.BuildPacket(out UpdateObject packet); - player.SendPacket(packet); - } - } } public struct DiminishingReturn diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index 023decb44..d798b2ff9 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -2454,93 +2454,6 @@ namespace Game.Entities return spellInfo == null || !spellInfo.HasAttribute(SpellCustomAttributes.IgnoreArmor); } - public override UpdateFieldFlag GetUpdateFieldFlagsFor(Player target) - { - UpdateFieldFlag flags = UpdateFieldFlag.None; - if (target == this || GetOwnerGUID() == target.GetGUID()) - flags |= UpdateFieldFlag.Owner; - - if (HasDynamicFlag(UnitDynFlags.SpecialInfo)) - if (HasAuraTypeWithCaster(AuraType.Empathy, target.GetGUID())) - flags |= UpdateFieldFlag.Empath; - - return flags; - } - - public override void BuildValuesCreate(WorldPacket data, Player target) - { - UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - - buffer.WriteUInt8((byte)flags); - m_objectData.WriteCreate(buffer, flags, this, target); - m_unitData.WriteCreate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); - } - - public override void BuildValuesUpdate(WorldPacket data, Player target) - { - UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - WorldPacket buffer = new(); - - buffer.WriteUInt32(m_values.GetChangedObjectTypeMask()); - if (m_values.HasChanged(TypeId.Object)) - m_objectData.WriteUpdate(buffer, flags, this, target); - - if (m_values.HasChanged(TypeId.Unit)) - m_unitData.WriteUpdate(buffer, flags, this, target); - - data.WriteUInt32(buffer.GetSize()); - data.WriteBytes(buffer); - } - - public override void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target) - { - UpdateMask valuesMask = new((int)TypeId.Max); - valuesMask.Set((int)TypeId.Unit); - - WorldPacket buffer = new(); - - UpdateMask mask = m_unitData.GetStaticUpdateMask(); - m_unitData.AppendAllowedFieldsMaskForFlag(mask, flags); - 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((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(); - 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(); - 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);