From 11f9219c8ecb4bf879ab380e4ad870a4f73eec32 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Wed, 22 Jan 2020 01:53:01 +0100 Subject: [PATCH] Core/Movement: improved random movement to come closer to retail behaivior --- .../RandomMovementGenerator.cpp | 24 +++++++++++++------ .../RandomMovementGenerator.h | 3 ++- 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 eac5264f466..660257aed9e 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp @@ -66,9 +66,12 @@ void RandomMovementGenerator::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); } @@ -111,12 +114,10 @@ void RandomMovementGenerator::SetRandomLocation(Creature* owner) owner->AddUnitState(UNIT_STATE_ROAMING_MOVE); 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); - uint32 resetTimer = roll_chance_i(50) ? urand(5000, 10000) : urand(1000, 2000); - if (!_path) _path = new PathGenerator(owner); @@ -131,8 +132,17 @@ void RandomMovementGenerator::SetRandomLocation(Creature* owner) Movement::MoveSplineInit init(owner); init.MovebyPath(_path->GetPath()); init.SetWalk(true); - int32 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 round 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 91eaad889f3..a1bac2c89e8 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h @@ -26,7 +26,7 @@ template class RandomMovementGenerator : public MovementGeneratorMedium< T, RandomMovementGenerator > { public: - explicit RandomMovementGenerator(float distance = 0.0f) : _path(nullptr), _timer(0), _reference(), _wanderDistance(distance), _interrupt(false), _stalled(false){ } + explicit RandomMovementGenerator(float distance = 0.0f) : _path(nullptr), _timer(0), _reference(), _wanderDistance(distance), _wanderSteps(0), _interrupt(false), _stalled(false) { } ~RandomMovementGenerator(); MovementGeneratorType GetMovementGeneratorType() const override { return RANDOM_MOTION_TYPE; } @@ -46,6 +46,7 @@ class RandomMovementGenerator : public MovementGeneratorMedium< T, RandomMovemen TimeTracker _timer; Position _reference; float _wanderDistance; + uint8 _wanderSteps; bool _interrupt; bool _stalled; };