aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp37
-rw-r--r--src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h3
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);