From b90136d80d852a5fba845e7db630484efb670d78 Mon Sep 17 00:00:00 2001 From: Anton Popovichenko Date: Wed, 24 Apr 2024 21:25:37 +0200 Subject: [PATCH] fix(Core/Pet): Fix pets chasing when pet and target spins uncontrollable (#18798) --- .../TargetedMovementGenerator.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 568079503..8289d06c1 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -91,14 +91,23 @@ bool ChaseMovementGenerator::DoUpdate(T* owner, uint32 time_diff) Unit* target = i_target.getTarget(); - bool const mutualChase = IsMutualChase(owner, target); + bool mutualChase = IsMutualChase(owner, target); + bool const mutualTarget = target->GetVictim() == owner; float const chaseRange = GetChaseRange(owner, target); + float const meleeRange = owner->GetMeleeRange(target); float const minTarget = (_range ? _range->MinTolerance : 0.0f) + chaseRange; - float const maxRange = _range ? _range->MaxRange + chaseRange : owner->GetMeleeRange(target); // melee range already includes hitboxes + float const maxRange = _range ? _range->MaxRange + chaseRange : meleeRange; // melee range already includes hitboxes float const maxTarget = _range ? _range->MaxTolerance + chaseRange : CONTACT_DISTANCE + chaseRange; Optional angle = mutualChase ? Optional() : _angle; + // Prevent almost infinite spinning of mutual targets. + if (angle && !mutualChase && _mutualChase && mutualTarget && chaseRange < meleeRange) + { + angle = Optional(); + mutualChase = true; + } + // periodically check if we're already in the expected range... i_recheckDistance.Update(time_diff); if (i_recheckDistance.Passed())