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 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);