aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp26
-rw-r--r--src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h1
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