From b8c0aeaf14dfabc9940203aec21ef29111e755cc Mon Sep 17 00:00:00 2001 From: ccrs Date: Sun, 7 Jul 2019 18:07:58 +0200 Subject: Core/Movement: handle Resume/Pause on RandomMovementGenerator --- .../MovementGenerators/RandomMovementGenerator.cpp | 37 +++++++++++++++++++--- .../MovementGenerators/RandomMovementGenerator.h | 3 ++ 2 files changed, 35 insertions(+), 5 deletions(-) (limited to 'src') 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::GetMovementGeneratorType() con return RANDOM_MOTION_TYPE; } +template +void RandomMovementGenerator::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 +void RandomMovementGenerator::Resume(uint32 overrideTimer /*= 0*/) +{ + if (overrideTimer) + _timer.Reset(overrideTimer); + + RemoveFlag(MOVEMENTGENERATOR_FLAG_PAUSED); +} + template MovementGeneratorType RandomMovementGenerator::GetMovementGeneratorType() const; template @@ -50,7 +75,7 @@ void RandomMovementGenerator::DoInitialize(T*) { } template<> void RandomMovementGenerator::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::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::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::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::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