diff options
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 130a9dc5e8f..9b6aa4fe1a7 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp @@ -41,6 +41,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> @@ -49,7 +74,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()) @@ -113,6 +138,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; @@ -131,7 +158,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 @@ -150,6 +177,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); @@ -162,10 +192,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 cdb523e5d20..4ed83b19075 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h @@ -32,6 +32,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); |