Core/Movement: handle Resume/Pause on RandomMovementGenerator

This commit is contained in:
ccrs
2019-07-07 18:07:58 +02:00
parent 4fa3c04b72
commit b8c0aeaf14
2 changed files with 35 additions and 5 deletions

View File

@@ -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;
}

View File

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