diff options
-rw-r--r-- | src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp | 26 | ||||
-rw-r--r-- | src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h | 1 |
2 files changed, 19 insertions, 8 deletions
diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp index 630b03606f0..17e842b817c 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp @@ -25,7 +25,7 @@ #include "Random.h" template<class T> -RandomMovementGenerator<T>::RandomMovementGenerator(float distance) : _timer(0), _reference(), _wanderDistance(distance) +RandomMovementGenerator<T>::RandomMovementGenerator(float distance) : _timer(0), _reference(), _wanderDistance(distance), _wanderSteps(0) { this->Mode = MOTION_MODE_DEFAULT; this->Priority = MOTION_PRIORITY_NORMAL; @@ -83,9 +83,12 @@ void RandomMovementGenerator<Creature>::DoInitialize(Creature* owner) _reference = owner->GetPosition(); owner->StopMoving(); - if (!_wanderDistance) + if (_wanderDistance == 0.f) _wanderDistance = owner->GetRespawnRadius(); + // Retail seems to let a creature walk 2 up to 10 splines before triggering a pause + _wanderSteps = urand(2, 10); + _timer.Reset(0); _path = nullptr; } @@ -119,8 +122,8 @@ void RandomMovementGenerator<Creature>::SetRandomLocation(Creature* owner) } Position position(_reference); - float distance = frand(0.f, 1.f) * _wanderDistance; - float angle = frand(0.f, 1.f) * float(M_PI) * 2.f; + float distance = frand(0.f, _wanderDistance); + float angle = frand(0.f, float(M_PI * 2)); owner->MovePositionToFirstCollision(position, distance, angle); // Check if the destination is in LOS @@ -131,8 +134,6 @@ void RandomMovementGenerator<Creature>::SetRandomLocation(Creature* owner) return; } - uint32 resetTimer = roll_chance_i(50) ? urand(5000, 10000) : urand(1000, 2000); - if (!_path) { _path = std::make_unique<PathGenerator>(owner); @@ -168,8 +169,17 @@ void RandomMovementGenerator<Creature>::SetRandomLocation(Creature* owner) Movement::MoveSplineInit init(owner); init.MovebyPath(_path->GetPath()); init.SetWalk(walk); - time_t traveltime = init.Launch(); - _timer.Reset(traveltime + resetTimer); + int32 splineDuration = init.Launch(); + + --_wanderSteps; + if (_wanderSteps) // Creature has yet to do steps before pausing + _timer.Reset(splineDuration); + else + { + // Creature has made all its steps, time for a little break + _timer.Reset(splineDuration + urand(4, 10) * IN_MILLISECONDS); // Retails seems to use rounded numbers so we do as well + _wanderSteps = urand(2, 10); + } // Call for creature group update owner->SignalFormationMovement(position); diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h index 4ed83b19075..812297fa212 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h @@ -50,6 +50,7 @@ class RandomMovementGenerator : public MovementGeneratorMedium<T, RandomMovement TimeTracker _timer; Position _reference; float _wanderDistance; + uint8 _wanderSteps; }; #endif |