From 867f528ac01edb230437c5826ec58e4f9a07668a Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 10 May 2022 14:35:41 -0400 Subject: [PATCH] Core/Objects: Added helper structures to allow using customized updatefield sending packet functions with Trinity::MessageDistDeliverer Port From (https://github.com/TrinityCore/TrinityCore/commit/ee835671b4f572f92f79c9b302764ee591c6de11) --- .../Game/Entities/AreaTrigger/AreaTrigger.cs | 44 ++++++++++++++----- Source/Game/Entities/Conversation.cs | 23 ++++++++++ Source/Game/Entities/Corpse.cs | 29 ++++++++++-- Source/Game/Entities/DynamicObject.cs | 28 +++++++++++- Source/Game/Entities/GameObject/GameObject.cs | 22 ++++++++++ .../Entities/Item/AzeriteEmpoweredItem.cs | 29 +++++++++++- Source/Game/Entities/Item/AzeriteItem.cs | 23 ++++++++++ Source/Game/Entities/Item/Bag.cs | 25 +++++++++++ Source/Game/Entities/Item/Item.cs | 22 ++++++++++ Source/Game/Entities/Player/Player.Fields.cs | 26 ++++++++++- Source/Game/Entities/SceneObject.cs | 29 +++++++++++- Source/Game/Entities/Unit/Unit.Fields.cs | 22 ++++++++++ 12 files changed, 302 insertions(+), 20 deletions(-) diff --git a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs index 556af2c2b..a8ec26753 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs @@ -281,7 +281,7 @@ namespace Game.Entities return true; } - + public override void Update(uint diff) { base.Update(diff); @@ -322,7 +322,7 @@ namespace Game.Entities public void Remove() { - if (IsInWorld) + if (IsInWorld) AddObjectToRemoveList(); } @@ -554,7 +554,7 @@ namespace Game.Entities return 0; } - + void UpdatePolygonOrientation() { float newOrientation = GetOrientation(); @@ -660,15 +660,15 @@ namespace Game.Entities switch (action.TargetType) { case AreaTriggerActionUserTypes.Friend: - return caster.IsValidAssistTarget(unit, Global.SpellMgr.GetSpellInfo(action.Param, caster.GetMap().GetDifficultyID())); + return caster.IsValidAssistTarget(unit, Global.SpellMgr.GetSpellInfo(action.Param, caster.GetMap().GetDifficultyID())); case AreaTriggerActionUserTypes.Enemy: - return caster.IsValidAttackTarget(unit, Global.SpellMgr.GetSpellInfo(action.Param, caster.GetMap().GetDifficultyID())); + return caster.IsValidAttackTarget(unit, Global.SpellMgr.GetSpellInfo(action.Param, caster.GetMap().GetDifficultyID())); case AreaTriggerActionUserTypes.Raid: - return caster.IsInRaidWith(unit); + return caster.IsInRaidWith(unit); case AreaTriggerActionUserTypes.Party: - return caster.IsInPartyWith(unit); + return caster.IsInPartyWith(unit); case AreaTriggerActionUserTypes.Caster: - return unit.GetGUID() == caster.GetGUID(); + return unit.GetGUID() == caster.GetGUID(); case AreaTriggerActionUserTypes.Any: default: break; @@ -996,7 +996,7 @@ namespace Game.Entities data.WriteBytes(buffer); } - void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedAreaTriggerMask, Player target) + public void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedAreaTriggerMask, Player target) { UpdateMask valuesMask = new((int)TypeId.Max); if (requestedObjectMask.IsAnySet()) @@ -1022,7 +1022,7 @@ namespace Game.Entities data.AddUpdateBlock(buffer1); } - + public override void ClearUpdateMask(bool remove) { m_values.ClearChangesMask(m_areaTriggerData); @@ -1037,7 +1037,7 @@ namespace Game.Entities { return base.IsNeverVisibleFor(seer) || IsServerSide(); } - + [System.Diagnostics.Conditional("DEBUG")] void DebugVisualizePosition() { @@ -1112,5 +1112,27 @@ namespace Game.Entities List _insideUnits = new(); AreaTriggerAI _ai; + + class ValuesUpdateForPlayerWithMaskSender : IDoWork + { + AreaTrigger Owner; + ObjectFieldData ObjectMask = new(); + AreaTriggerFieldData AreaTriggerMask = new(); + + public ValuesUpdateForPlayerWithMaskSender(AreaTrigger owner) + { + Owner = owner; + } + + public void Invoke(Player player) + { + UpdateData udata = new(Owner.GetMapId()); + + Owner.BuildValuesUpdateForPlayerWithMask(udata, ObjectMask.GetUpdateMask(), AreaTriggerMask.GetUpdateMask(), player); + + udata.BuildPacket(out UpdateObject updateObject); + player.SendPacket(updateObject); + } + } } } diff --git a/Source/Game/Entities/Conversation.cs b/Source/Game/Entities/Conversation.cs index 9667da1b8..078dedd04 100644 --- a/Source/Game/Entities/Conversation.cs +++ b/Source/Game/Entities/Conversation.cs @@ -19,6 +19,7 @@ using Framework.Constants; using Game.DataStorage; using Game.Maps; using Game.Networking; +using Game.Networking.Packets; using Game.Spells; using System; using System.Collections.Generic; @@ -326,5 +327,27 @@ namespace Game.Entities Dictionary<(Locale locale, uint lineId), TimeSpan> _lineStartTimes = new(); TimeSpan[] _lastLineEndTimes = new TimeSpan[(int)Locale.Total]; + + class ValuesUpdateForPlayerWithMaskSender : IDoWork + { + Conversation Owner; + ObjectFieldData ObjectMask = new(); + ConversationData ConversationMask = new(); + + public ValuesUpdateForPlayerWithMaskSender(Conversation owner) + { + Owner = owner; + } + + public void Invoke(Player player) + { + UpdateData udata = new(Owner.GetMapId()); + + Owner.BuildValuesUpdateForPlayerWithMask(udata, ObjectMask.GetUpdateMask(), ConversationMask.GetUpdateMask(), player); + + udata.BuildPacket(out UpdateObject packet); + player.SendPacket(packet); + } + } } } diff --git a/Source/Game/Entities/Corpse.cs b/Source/Game/Entities/Corpse.cs index f52023e62..08c089910 100644 --- a/Source/Game/Entities/Corpse.cs +++ b/Source/Game/Entities/Corpse.cs @@ -15,15 +15,16 @@ * along with this program. If not, see . */ +using Framework.Collections; using Framework.Constants; using Framework.Database; using Game.DataStorage; using Game.Loots; using Game.Maps; +using Game.Networking; +using Game.Networking.Packets; using System.Collections.Generic; using System.Text; -using Framework.Collections; -using Game.Networking; namespace Game.Entities { @@ -168,7 +169,7 @@ namespace Game.Entities // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, race, class, gender, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ? - float posX = field.Read(0); + float posX = field.Read(0); float posY = field.Read(1); float posZ = field.Read(2); float o = field.Read(3); @@ -328,5 +329,27 @@ namespace Game.Entities CorpseType m_type; long m_time; CellCoord _cellCoord; // gride for corpse position for fast search + + class ValuesUpdateForPlayerWithMaskSender : IDoWork + { + Corpse Owner; + ObjectFieldData ObjectMask = new(); + CorpseData CorpseMask = new(); + + public ValuesUpdateForPlayerWithMaskSender(Corpse owner) + { + Owner = owner; + } + + public void Invoke(Player player) + { + UpdateData udata = new(Owner.GetMapId()); + + Owner.BuildValuesUpdateForPlayerWithMask(udata, ObjectMask.GetUpdateMask(), CorpseMask.GetUpdateMask(), player); + + udata.BuildPacket(out UpdateObject packet); + player.SendPacket(packet); + } + } } } diff --git a/Source/Game/Entities/DynamicObject.cs b/Source/Game/Entities/DynamicObject.cs index 06e0d5498..06b2e8e74 100644 --- a/Source/Game/Entities/DynamicObject.cs +++ b/Source/Game/Entities/DynamicObject.cs @@ -16,8 +16,10 @@ */ using Framework.Constants; -using Game.Spells; using Game.Networking; +using Game.Networking.Packets; +using Game.Spells; +using System.Collections.Generic; namespace Game.Entities { @@ -227,7 +229,7 @@ namespace Game.Entities Cypher.Assert(_caster != null); return _caster.GetFaction(); } - + void BindToCaster() { Cypher.Assert(_caster == null); @@ -323,6 +325,28 @@ namespace Game.Entities Unit _caster; int _duration; // for non-aura dynobjects bool _isViewpoint; + + class ValuesUpdateForPlayerWithMaskSender : IDoWork + { + DynamicObject Owner; + ObjectFieldData ObjectMask = new(); + DynamicObjectData DynamicObjectMask = new(); + + public ValuesUpdateForPlayerWithMaskSender(DynamicObject owner) + { + Owner = owner; + } + + public void Invoke(Player player) + { + UpdateData udata = new(Owner.GetMapId()); + + Owner.BuildValuesUpdateForPlayerWithMask(udata, ObjectMask.GetUpdateMask(), DynamicObjectMask.GetUpdateMask(), player); + + udata.BuildPacket(out UpdateObject packet); + player.SendPacket(packet); + } + } } public enum DynamicObjectType diff --git a/Source/Game/Entities/GameObject/GameObject.cs b/Source/Game/Entities/GameObject/GameObject.cs index 80a70370a..669b03c47 100644 --- a/Source/Game/Entities/GameObject/GameObject.cs +++ b/Source/Game/Entities/GameObject/GameObject.cs @@ -3110,6 +3110,28 @@ namespace Game.Entities ObjectGuid m_linkedTrap; #endregion + + class ValuesUpdateForPlayerWithMaskSender : IDoWork + { + GameObject Owner; + ObjectFieldData ObjectMask = new(); + GameObjectFieldData GameObjectMask = new(); + + public ValuesUpdateForPlayerWithMaskSender(GameObject owner) + { + Owner = owner; + } + + public void Invoke(Player player) + { + UpdateData udata = new(Owner.GetMapId()); + + Owner.BuildValuesUpdateForPlayerWithMask(udata, ObjectMask.GetUpdateMask(), GameObjectMask.GetUpdateMask(), player); + + udata.BuildPacket(out UpdateObject packet); + player.SendPacket(packet); + } + } } class GameObjectModelOwnerImpl : GameObjectModelOwnerBase diff --git a/Source/Game/Entities/Item/AzeriteEmpoweredItem.cs b/Source/Game/Entities/Item/AzeriteEmpoweredItem.cs index 442b3aa38..fa14b9b10 100644 --- a/Source/Game/Entities/Item/AzeriteEmpoweredItem.cs +++ b/Source/Game/Entities/Item/AzeriteEmpoweredItem.cs @@ -15,11 +15,12 @@ * along with this program. If not, see . */ -using System.Collections.Generic; -using Game.Networking; using Framework.Constants; using Framework.Database; using Game.DataStorage; +using Game.Networking; +using Game.Networking.Packets; +using System.Collections.Generic; using System.Linq; namespace Game.Entities @@ -241,9 +242,33 @@ namespace Game.Entities } public int GetMaxAzeritePowerTier() { return m_maxTier; } + public uint GetSelectedAzeritePower(int tier) { return (uint)m_azeriteEmpoweredItemData.Selections[tier]; } + + class ValuesUpdateForPlayerWithMaskSender : IDoWork + { + AzeriteEmpoweredItem Owner; + ObjectFieldData ObjectMask = new(); + ItemData ItemMask = new(); + AzeriteEmpoweredItemData AzeriteEmpoweredItemMask = new(); + + public ValuesUpdateForPlayerWithMaskSender(AzeriteEmpoweredItem owner) + { + Owner = owner; + } + + public void Invoke(Player player) + { + UpdateData udata = new(Owner.GetMapId()); + + Owner.BuildValuesUpdateForPlayerWithMask(udata, ObjectMask.GetUpdateMask(), ItemMask.GetUpdateMask(), AzeriteEmpoweredItemMask.GetUpdateMask(), player); + + udata.BuildPacket(out UpdateObject packet); + player.SendPacket(packet); + } + } } } diff --git a/Source/Game/Entities/Item/AzeriteItem.cs b/Source/Game/Entities/Item/AzeriteItem.cs index bc0c90491..dfc46fb62 100644 --- a/Source/Game/Entities/Item/AzeriteItem.cs +++ b/Source/Game/Entities/Item/AzeriteItem.cs @@ -541,6 +541,29 @@ namespace Game.Entities hasPreviousMilestone = false; } } + + class ValuesUpdateForPlayerWithMaskSender : IDoWork + { + AzeriteItem Owner; + ObjectFieldData ObjectMask = new(); + ItemData ItemMask = new(); + AzeriteItemData AzeriteItemMask = new(); + + public ValuesUpdateForPlayerWithMaskSender(AzeriteItem owner) + { + Owner = owner; + } + + public void Invoke(Player player) + { + UpdateData udata = new(Owner.GetMapId()); + + Owner.BuildValuesUpdateForPlayerWithMask(udata, ObjectMask.GetUpdateMask(), ItemMask.GetUpdateMask(), AzeriteItemMask.GetUpdateMask(), player); + + udata.BuildPacket(out UpdateObject packet); + player.SendPacket(packet); + } + } } public class AzeriteItemSelectedEssencesData diff --git a/Source/Game/Entities/Item/Bag.cs b/Source/Game/Entities/Item/Bag.cs index b36195552..1a66f7753 100644 --- a/Source/Game/Entities/Item/Bag.cs +++ b/Source/Game/Entities/Item/Bag.cs @@ -18,6 +18,8 @@ using Framework.Constants; using Framework.Database; using Game.Networking; +using Game.Networking.Packets; +using System.Collections.Generic; namespace Game.Entities { @@ -280,5 +282,28 @@ namespace Game.Entities ContainerData m_containerData; Item[] m_bagslot = new Item[36]; + + class ValuesUpdateForPlayerWithMaskSender : IDoWork + { + Bag Owner; + ObjectFieldData ObjectMask = new(); + ItemData ItemMask = new(); + ContainerData ContainerMask = new(); + + public ValuesUpdateForPlayerWithMaskSender(Bag owner) + { + Owner = owner; + } + + public void Invoke(Player player) + { + UpdateData udata = new(Owner.GetMapId()); + + Owner.BuildValuesUpdateForPlayerWithMask(udata, ObjectMask.GetUpdateMask(), ItemMask.GetUpdateMask(), ContainerMask.GetUpdateMask(), player); + + udata.BuildPacket(out UpdateObject packet); + player.SendPacket(packet); + } + } } } diff --git a/Source/Game/Entities/Item/Item.cs b/Source/Game/Entities/Item/Item.cs index 12f1dd996..87eb38d83 100644 --- a/Source/Game/Entities/Item/Item.cs +++ b/Source/Game/Entities/Item/Item.cs @@ -2737,6 +2737,28 @@ namespace Game.Entities Dictionary m_artifactPowerIdToIndex = new(); Array m_gemScalingLevels = new(ItemConst.MaxGemSockets); #endregion + + class ValuesUpdateForPlayerWithMaskSender : IDoWork + { + Item Owner; + ObjectFieldData ObjectMask = new(); + ItemData ItemMask = new(); + + public ValuesUpdateForPlayerWithMaskSender(Item owner) + { + Owner = owner; + } + + public void Invoke(Player player) + { + UpdateData udata = new(Owner.GetMapId()); + + Owner.BuildValuesUpdateForPlayerWithMask(udata, ObjectMask.GetUpdateMask(), ItemMask.GetUpdateMask(), player); + + udata.BuildPacket(out UpdateObject packet); + player.SendPacket(packet); + } + } } public class ItemPosCount diff --git a/Source/Game/Entities/Player/Player.Fields.cs b/Source/Game/Entities/Player/Player.Fields.cs index cfeb52d0f..0e84f1ff2 100644 --- a/Source/Game/Entities/Player/Player.Fields.cs +++ b/Source/Game/Entities/Player/Player.Fields.cs @@ -16,7 +16,6 @@ */ using Framework.Constants; -using Framework.Dynamic; using Game.Achievements; using Game.BattleGrounds; using Game.Chat; @@ -26,6 +25,7 @@ using Game.Groups; using Game.Mails; using Game.Maps; using Game.Misc; +using Game.Networking.Packets; using Game.Spells; using System.Collections; using System.Collections.Generic; @@ -259,6 +259,30 @@ namespace Game.Entities uint m_ingametime; PlayerCommandStates _activeCheats; + + class ValuesUpdateForPlayerWithMaskSender : IDoWork + { + Player Owner; + ObjectFieldData ObjectMask = new(); + UnitData UnitMask = new(); + PlayerData PlayerMask = new(); + ActivePlayerData ActivePlayerMask = new(); + + public ValuesUpdateForPlayerWithMaskSender(Player owner) + { + Owner = owner; + } + + public void Invoke(Player player) + { + UpdateData udata = new(Owner.GetMapId()); + + Owner.BuildValuesUpdateForPlayerWithMask(udata, ObjectMask.GetUpdateMask(), UnitMask.GetUpdateMask(), PlayerMask.GetUpdateMask(), ActivePlayerMask.GetUpdateMask(), player); + + udata.BuildPacket(out UpdateObject packet); + player.SendPacket(packet); + } + } } public class PlayerInfo diff --git a/Source/Game/Entities/SceneObject.cs b/Source/Game/Entities/SceneObject.cs index c580f04e0..ba09d1c99 100644 --- a/Source/Game/Entities/SceneObject.cs +++ b/Source/Game/Entities/SceneObject.cs @@ -18,7 +18,9 @@ using Framework.Constants; using Game.Maps; using Game.Networking; +using Game.Networking.Packets; using Game.Spells; +using System.Collections.Generic; namespace Game.Entities { @@ -26,7 +28,7 @@ namespace Game.Entities { SceneObjectData m_sceneObjectData; - Position _stationaryPosition; + Position _stationaryPosition = new(); ObjectGuid _createdBySpellCast; public SceneObject() : base(false) @@ -36,6 +38,9 @@ namespace Game.Entities m_updateFlag.Stationary = true; m_updateFlag.SceneObject = true; + + m_sceneObjectData = new(); + _stationaryPosition = new(); } public override void AddToWorld() @@ -204,5 +209,27 @@ namespace Game.Entities void RelocateStationaryPosition(Position pos) { _stationaryPosition.Relocate(pos); } public void SetCreatedBySpellCast(ObjectGuid castId) { _createdBySpellCast = castId; } + + class ValuesUpdateForPlayerWithMaskSender : IDoWork + { + SceneObject Owner; + ObjectFieldData ObjectMask = new(); + SceneObjectData SceneObjectMask = new(); + + public ValuesUpdateForPlayerWithMaskSender(SceneObject owner) + { + Owner = owner; + } + + public void Invoke(Player player) + { + UpdateData udata = new(Owner.GetMapId()); + + Owner.BuildValuesUpdateForPlayerWithMask(udata, ObjectMask.GetUpdateMask(), SceneObjectMask.GetUpdateMask(), player); + + udata.BuildPacket(out UpdateObject packet); + player.SendPacket(packet); + } + } } } diff --git a/Source/Game/Entities/Unit/Unit.Fields.cs b/Source/Game/Entities/Unit/Unit.Fields.cs index 43ca652ce..6e53a65d5 100644 --- a/Source/Game/Entities/Unit/Unit.Fields.cs +++ b/Source/Game/Entities/Unit/Unit.Fields.cs @@ -137,6 +137,28 @@ 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