mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-02-05 16:39:08 +01:00
Core/Movement: handle Resume/Pause on RandomMovementGenerator
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user