Core/PacketIO: Fix suppressing building SMSG_UPDATE_OBJECT packets

Port From (https://github.com/TrinityCore/TrinityCore/commit/36496c717203fab56eadff8c55f3b1e136fbe363)
This commit is contained in:
hondacrx
2021-03-04 16:12:22 -05:00
parent 655051c3f9
commit 971f155537
3 changed files with 31 additions and 8 deletions
@@ -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);
@@ -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;
+5 -2
View File
@@ -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()