Core/Movement: delay movement update in MotionMaster until its owner signals AddToWorld

Port From (https://github.com/TrinityCore/TrinityCore/commit/dfb2221552048512b4fda0c7e0c97ecf808106f9)
This commit is contained in:
hondacrx
2022-01-05 17:26:33 -05:00
parent 95c3782ccb
commit efb7142aef
3 changed files with 36 additions and 14 deletions
+31 -13
View File
@@ -106,7 +106,7 @@ namespace Game.Movement
public void Initialize()
{
if (HasFlag(MotionMasterFlags.Update))
if (HasFlag(MotionMasterFlags.Delayed))
{
_delayedActions.Enqueue(new DelayedAction(() => Initialize(), MotionMasterDelayedActionType.Initialize));
return;
@@ -120,6 +120,16 @@ namespace Game.Movement
Add(AI.AISelector.SelectMovementGenerator(_owner), MovementSlot.Default);
}
public void AddToWorld()
{
if (!HasFlag(MotionMasterFlags.InitializationPending))
return;
ResolveDelayedActions();
RemoveFlag(MotionMasterFlags.InitializationPending);
}
public bool Empty()
{
return _defaultGenerator == null && _generators.Empty();
@@ -287,6 +297,9 @@ namespace Game.Movement
if (!_owner)
return;
if (HasFlag(MotionMasterFlags.InitializationPending))
return;
Cypher.Assert(!Empty(), $"MotionMaster:Update: update called without Initializing! ({_owner.GetGUID()})");
AddFlag(MotionMasterFlags.Update);
@@ -315,11 +328,7 @@ namespace Game.Movement
RemoveFlag(MotionMasterFlags.Update);
while (_delayedActions.Count != 0)
{
_delayedActions.Peek().Resolve();
_delayedActions.Dequeue();
}
ResolveDelayedActions();
}
void Add(MovementGenerator movement, MovementSlot slot = MovementSlot.Active)
@@ -330,7 +339,7 @@ namespace Game.Movement
if (IsInvalidMovementSlot(slot))
return;
if (HasFlag(MotionMasterFlags.Update))
if (HasFlag(MotionMasterFlags.Delayed))
_delayedActions.Enqueue(new DelayedAction(() => Add(movement, slot), MotionMasterDelayedActionType.Add));
else
DirectAdd(movement, slot);
@@ -341,7 +350,7 @@ namespace Game.Movement
if (movement == null || IsInvalidMovementSlot(slot))
return;
if (HasFlag(MotionMasterFlags.Update))
if (HasFlag(MotionMasterFlags.Delayed))
{
_delayedActions.Enqueue(new DelayedAction(() => Remove(movement, slot), MotionMasterDelayedActionType.Remove));
return;
@@ -373,7 +382,7 @@ namespace Game.Movement
if (IsInvalidMovementGeneratorType(type) || IsInvalidMovementSlot(slot))
return;
if (HasFlag(MotionMasterFlags.Update))
if (HasFlag(MotionMasterFlags.Delayed))
{
_delayedActions.Enqueue(new DelayedAction(() => Remove(type, slot), MotionMasterDelayedActionType.RemoveType));
return;
@@ -403,7 +412,7 @@ namespace Game.Movement
public void Clear()
{
if (HasFlag(MotionMasterFlags.Update))
if (HasFlag(MotionMasterFlags.Delayed))
{
_delayedActions.Enqueue(new DelayedAction(() => Clear(), MotionMasterDelayedActionType.Clear));
return;
@@ -418,7 +427,7 @@ namespace Game.Movement
if (IsInvalidMovementSlot(slot))
return;
if (HasFlag(MotionMasterFlags.Update))
if (HasFlag(MotionMasterFlags.Delayed))
{
_delayedActions.Enqueue(new DelayedAction(() => Clear(slot), MotionMasterDelayedActionType.ClearSlot));
return;
@@ -442,7 +451,7 @@ namespace Game.Movement
public void Clear(MovementGeneratorMode mode)
{
if (HasFlag(MotionMasterFlags.Update))
if (HasFlag(MotionMasterFlags.Delayed))
{
_delayedActions.Enqueue(new DelayedAction(() => Clear(mode), MotionMasterDelayedActionType.ClearMode));
return;
@@ -457,7 +466,7 @@ namespace Game.Movement
public void Clear(MovementGeneratorPriority priority)
{
if (HasFlag(MotionMasterFlags.Update))
if (HasFlag(MotionMasterFlags.Delayed))
{
_delayedActions.Enqueue(new DelayedAction(() => Clear(priority), MotionMasterDelayedActionType.ClearPriority));
return;
@@ -990,6 +999,15 @@ namespace Game.Movement
Add(movement);
}
void ResolveDelayedActions()
{
while (_delayedActions.Count != 0)
{
_delayedActions.Peek().Resolve();
_delayedActions.Dequeue();
}
}
void Remove(MovementGenerator movement, bool active, bool movementInform)
{
_generators.Remove(movement);