Core/Movement: improved random movement to come closer to retail behaivior

This commit is contained in:
Ovahlord
2020-01-22 01:53:01 +01:00
parent 266e2f1895
commit 11f9219c8e
2 changed files with 19 additions and 8 deletions

View File

@@ -66,9 +66,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);
}
@@ -111,12 +114,10 @@ void RandomMovementGenerator<Creature>::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<Creature>::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);

View File

@@ -26,7 +26,7 @@ template<class T>
class RandomMovementGenerator : public MovementGeneratorMedium< T, RandomMovementGenerator<T> >
{
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;
};