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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user