From 971f1555371be0eb6d97c5ebedf2aa1d2fdc384d Mon Sep 17 00:00:00 2001 From: hondacrx Date: Thu, 4 Mar 2021 16:12:22 -0500 Subject: [PATCH] Core/PacketIO: Fix suppressing building SMSG_UPDATE_OBJECT packets Port From (https://github.com/TrinityCore/TrinityCore/commit/36496c717203fab56eadff8c55f3b1e136fbe363) --- .../Game/Entities/AreaTrigger/AreaTrigger.cs | 21 +++++++++++++------ Source/Game/Entities/Object/WorldObject.cs | 11 ++++++++++ Source/Game/Entities/Player/Player.cs | 7 +++++-- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs index 7b922f2b7..ca8f0b0de 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs @@ -313,8 +313,11 @@ namespace Game.Entities _duration = newDuration; // should be sent in object create packets only - SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.Duration), (uint)_duration); - m_areaTriggerData.ClearChanged(m_areaTriggerData.Duration); + DoWithSuppressingObjectUpdates(() => + { + SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.Duration), (uint)_duration); + m_areaTriggerData.ClearChanged(m_areaTriggerData.Duration); + }); } float GetProgress() @@ -702,8 +705,11 @@ namespace Game.Entities _spline.InitLengths(); // should be sent in object create packets only - SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTarget), timeToTarget); - m_areaTriggerData.ClearChanged(m_areaTriggerData.TimeToTarget); + DoWithSuppressingObjectUpdates(() => + { + SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTarget), timeToTarget); + m_areaTriggerData.ClearChanged(m_areaTriggerData.TimeToTarget); + }); if (IsInWorld) { @@ -732,8 +738,11 @@ namespace Game.Entities Cypher.Assert(cmi.Center.HasValue || cmi.PathTarget.HasValue); // should be sent in object create packets only - SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTarget), timeToTarget); - m_areaTriggerData.ClearChanged(m_areaTriggerData.TimeToTarget); + DoWithSuppressingObjectUpdates(() => + { + SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTarget), timeToTarget); + m_areaTriggerData.ClearChanged(m_areaTriggerData.TimeToTarget); + }); _orbitInfo.Set(cmi); diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index d437d9371..6d3d4ccb7 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -751,6 +751,17 @@ namespace Game.Entities } } + public void DoWithSuppressingObjectUpdates(Action action) + { + bool wasUpdatedBeforeAction = m_objectUpdated; + action(); + if (m_objectUpdated && !wasUpdatedBeforeAction) + { + RemoveFromObjectUpdate(); + m_objectUpdated = false; + } + } + public virtual UpdateFieldFlag GetUpdateFieldFlagsFor(Player target) { return UpdateFieldFlag.None; diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index 44a1d1efd..7fdced130 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -3815,8 +3815,11 @@ namespace Game.Entities else { // throttle packet sending - SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Power, (int)powerIndex), curValue); - m_unitData.ClearChanged(m_unitData.Power, (int)powerIndex); + DoWithSuppressingObjectUpdates(() => + { + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Power, (int)powerIndex), curValue); + m_unitData.ClearChanged(m_unitData.Power, (int)powerIndex); + }); } } void RegenerateHealth()