diff --git a/Source/Game/Movement/Generators/RandomMovement.cs b/Source/Game/Movement/Generators/RandomMovement.cs index d52820649..6202fb451 100644 --- a/Source/Game/Movement/Generators/RandomMovement.cs +++ b/Source/Game/Movement/Generators/RandomMovement.cs @@ -37,7 +37,7 @@ namespace Game.Movement 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); if (owner == null || !owner.IsAlive()) @@ -64,6 +64,9 @@ namespace Game.Movement if (!owner || !owner.IsAlive()) return true; + if (HasFlag(MovementGeneratorFlags.Finalized | MovementGeneratorFlags.Paused)) + return true; + if (owner.HasUnitState(UnitState.NotMove) || owner.IsMovementPreventedByCasting()) { AddFlag(MovementGeneratorFlags.Interrupted); @@ -76,10 +79,7 @@ namespace Game.Movement _timer.Update(diff); if ((HasFlag(MovementGeneratorFlags.SpeedUpdatePending) && !owner.MoveSpline.Finalized()) || (_timer.Passed() && owner.MoveSpline.Finalized())) - { - RemoveFlag(MovementGeneratorFlags.Transitory); SetRandomLocation(owner); - } 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) { if (owner == null) @@ -136,6 +159,8 @@ namespace Game.Movement return; } + RemoveFlag(MovementGeneratorFlags.Transitory | MovementGeneratorFlags.TimedPaused); + owner.AddUnitState(UnitState.RoamingMove); bool walk = true;