diff options
author | ccrs <ccrs@users.noreply.github.com> | 2019-07-07 18:07:58 +0200 |
---|---|---|
committer | ccrs <ccrs@users.noreply.github.com> | 2019-07-07 18:07:58 +0200 |
commit | b8c0aeaf14dfabc9940203aec21ef29111e755cc (patch) | |
tree | bc199776241dfa8dc16d09fd18470b209e5e17ce /src | |
parent | 4fa3c04b7263c0038b96e50c29f8ba52a4802995 (diff) |
Core/Movement: handle Resume/Pause on RandomMovementGenerator
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp | 37 | ||||
-rw-r--r-- | src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h | 3 |
2 files changed, 35 insertions, 5 deletions
diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp index c97c7b389ca..03f56d35d90 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp @@ -42,6 +42,31 @@ MovementGeneratorType RandomMovementGenerator<T>::GetMovementGeneratorType() con return RANDOM_MOTION_TYPE; } +template<class T> +void RandomMovementGenerator<T>::Pause(uint32 timer /*= 0*/) +{ + if (timer) + { + AddFlag(MOVEMENTGENERATOR_FLAG_TIMED_PAUSED); + _timer.Reset(timer); + RemoveFlag(MOVEMENTGENERATOR_FLAG_PAUSED); + } + else + { + AddFlag(MOVEMENTGENERATOR_FLAG_PAUSED); + RemoveFlag(MOVEMENTGENERATOR_FLAG_TIMED_PAUSED); + } +} + +template<class T> +void RandomMovementGenerator<T>::Resume(uint32 overrideTimer /*= 0*/) +{ + if (overrideTimer) + _timer.Reset(overrideTimer); + + RemoveFlag(MOVEMENTGENERATOR_FLAG_PAUSED); +} + template MovementGeneratorType RandomMovementGenerator<Creature>::GetMovementGeneratorType() const; template<class T> @@ -50,7 +75,7 @@ void RandomMovementGenerator<T>::DoInitialize(T*) { } template<> void RandomMovementGenerator<Creature>::DoInitialize(Creature* owner) { - RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED); + RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED | MOVEMENTGENERATOR_FLAG_TIMED_PAUSED); AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED); if (!owner || !owner->IsAlive()) @@ -114,6 +139,8 @@ void RandomMovementGenerator<Creature>::SetRandomLocation(Creature* owner) return; } + RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_TIMED_PAUSED); + owner->AddUnitState(UNIT_STATE_ROAMING_MOVE); bool walk = true; @@ -132,7 +159,7 @@ void RandomMovementGenerator<Creature>::SetRandomLocation(Creature* owner) Movement::MoveSplineInit init(owner); init.MovebyPath(_path->GetPath()); init.SetWalk(walk); - int32 traveltime = init.Launch(); + time_t traveltime = init.Launch(); _timer.Reset(traveltime + resetTimer); // Call for creature group update @@ -151,6 +178,9 @@ bool RandomMovementGenerator<Creature>::DoUpdate(Creature* owner, uint32 diff) if (!owner || !owner->IsAlive()) return true; + if (HasFlag(MOVEMENTGENERATOR_FLAG_FINALIZED | MOVEMENTGENERATOR_FLAG_PAUSED)) + return true; + if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting()) { AddFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED); @@ -163,10 +193,7 @@ bool RandomMovementGenerator<Creature>::DoUpdate(Creature* owner, uint32 diff) _timer.Update(diff); if ((HasFlag(MOVEMENTGENERATOR_FLAG_SPEED_UPDATE_PENDING) && !owner->movespline->Finalized()) || (_timer.Passed() && owner->movespline->Finalized())) - { - RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY); SetRandomLocation(owner); - } return true; } diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h index a1bd8fc2137..8f3742c50f2 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h @@ -33,6 +33,9 @@ class RandomMovementGenerator : public MovementGeneratorMedium<T, RandomMovement MovementGeneratorType GetMovementGeneratorType() const override; + void Pause(uint32 timer = 0) override; + void Resume(uint32 overrideTimer = 0) override; + void DoInitialize(T*); void DoReset(T*); bool DoUpdate(T*, uint32); |