From cdeb752941104137c98e40e8feb8143b8dc7f076 Mon Sep 17 00:00:00 2001 From: Ovah Date: Wed, 22 Jan 2020 22:19:42 +0100 Subject: Core/Movement: improved RandomMovementGenerator wait handling to get closer to retail behaivior (#24093) * according to observations Blizzard is letting creatures do 2 up to 10 spline movements right after each other before waiting for a couple seconds (cherry picked from commit 78c1216bcf60b9e376d9afd9484ff478bda641b1) --- .../MovementGenerators/RandomMovementGenerator.cpp | 26 +++++++++++++++------- .../MovementGenerators/RandomMovementGenerator.h | 1 + 2 files changed, 19 insertions(+), 8 deletions(-) (limited to 'src') 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 -RandomMovementGenerator::RandomMovementGenerator(float distance) : _timer(0), _reference(), _wanderDistance(distance) +RandomMovementGenerator::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::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::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::SetRandomLocation(Creature* owner) return; } - uint32 resetTimer = roll_chance_i(50) ? urand(5000, 10000) : urand(1000, 2000); - if (!_path) { _path = std::make_unique(owner); @@ -168,8 +169,17 @@ void RandomMovementGenerator::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