Core/Movement: handle Resume/Pause on RandomMovementGenerator

Port From (https://github.com/TrinityCore/TrinityCore/commit/f21599dc5dab71cc0775d6ed5d2b2f6f2f4c6780)
This commit is contained in:
hondacrx
2021-12-27 15:45:44 -05:00
parent dfcdade81a
commit 5321cc2090
@@ -37,7 +37,7 @@ namespace Game.Movement
public override void DoInitialize(Creature owner) public override void DoInitialize(Creature owner)
{ {
RemoveFlag(MovementGeneratorFlags.InitializationPending | MovementGeneratorFlags.Transitory | MovementGeneratorFlags.Deactivated); RemoveFlag(MovementGeneratorFlags.InitializationPending | MovementGeneratorFlags.Transitory | MovementGeneratorFlags.Deactivated | MovementGeneratorFlags.Paused);
AddFlag(MovementGeneratorFlags.Initialized); AddFlag(MovementGeneratorFlags.Initialized);
if (owner == null || !owner.IsAlive()) if (owner == null || !owner.IsAlive())
@@ -64,6 +64,9 @@ namespace Game.Movement
if (!owner || !owner.IsAlive()) if (!owner || !owner.IsAlive())
return true; return true;
if (HasFlag(MovementGeneratorFlags.Finalized | MovementGeneratorFlags.Paused))
return true;
if (owner.HasUnitState(UnitState.NotMove) || owner.IsMovementPreventedByCasting()) if (owner.HasUnitState(UnitState.NotMove) || owner.IsMovementPreventedByCasting())
{ {
AddFlag(MovementGeneratorFlags.Interrupted); AddFlag(MovementGeneratorFlags.Interrupted);
@@ -76,10 +79,7 @@ namespace Game.Movement
_timer.Update(diff); _timer.Update(diff);
if ((HasFlag(MovementGeneratorFlags.SpeedUpdatePending) && !owner.MoveSpline.Finalized()) || (_timer.Passed() && owner.MoveSpline.Finalized())) if ((HasFlag(MovementGeneratorFlags.SpeedUpdatePending) && !owner.MoveSpline.Finalized()) || (_timer.Passed() && owner.MoveSpline.Finalized()))
{
RemoveFlag(MovementGeneratorFlags.Transitory);
SetRandomLocation(owner); SetRandomLocation(owner);
}
return true; return true;
} }
@@ -103,6 +103,29 @@ namespace Game.Movement
} }
} }
public override void Pause(uint timer = 0)
{
if (timer != 0)
{
AddFlag(MovementGeneratorFlags.TimedPaused);
_timer.Reset(timer);
RemoveFlag(MovementGeneratorFlags.Paused);
}
else
{
AddFlag(MovementGeneratorFlags.Paused);
RemoveFlag(MovementGeneratorFlags.TimedPaused);
}
}
public override void Resume(uint overrideTimer = 0)
{
if (overrideTimer != 0)
_timer.Reset(overrideTimer);
RemoveFlag(MovementGeneratorFlags.Paused);
}
void SetRandomLocation(Creature owner) void SetRandomLocation(Creature owner)
{ {
if (owner == null) if (owner == null)
@@ -136,6 +159,8 @@ namespace Game.Movement
return; return;
} }
RemoveFlag(MovementGeneratorFlags.Transitory | MovementGeneratorFlags.TimedPaused);
owner.AddUnitState(UnitState.RoamingMove); owner.AddUnitState(UnitState.RoamingMove);
bool walk = true; bool walk = true;