From 288b4957015f6c0894ea9554954a8eb10545b151 Mon Sep 17 00:00:00 2001 From: killerwife Date: Mon, 3 Nov 2025 07:44:29 +0100 Subject: [PATCH] fix(Core/Movement): Fixup root distancing mobs being stuck in a loop (#23514) --- .../TargetedMovementGenerator.cpp | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index b8ee76d29..b6adb3010 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -113,7 +113,7 @@ bool ChaseMovementGenerator::DispatchSplineToPosition(T* owner, float x, floa } owner->StopMoving(); - return true; + return false; } if (cutPath) @@ -134,7 +134,7 @@ bool ChaseMovementGenerator::DispatchSplineToPosition(T* owner, float x, floa init.SetWalk(walk); init.Launch(); - return false; + return true; } template @@ -219,18 +219,21 @@ bool ChaseMovementGenerator::DoUpdate(T* owner, uint32 time_diff) { i_recheckDistance.Reset(400); // Sniffed value - if (i_recalculateTravel && PositionOkay(owner, target, _movingTowards ? maxTarget : Optional(), angle)) + if (m_currentMode != CHASE_MODE_DISTANCING) { - if ((owner->HasUnitState(UNIT_STATE_CHASE_MOVE) && !target->isMoving() && !mutualChase) || _range) + if (i_recalculateTravel && PositionOkay(owner, target, _movingTowards ? maxTarget : Optional(), angle)) { - i_recalculateTravel = false; - i_path = nullptr; - if (cOwner) - cOwner->SetCannotReachTarget(); - owner->StopMoving(); - owner->SetInFront(target); - MovementInform(owner); - return true; + if ((owner->HasUnitState(UNIT_STATE_CHASE_MOVE) && !target->isMoving() && !mutualChase) || _range) + { + i_recalculateTravel = false; + i_path = nullptr; + if (cOwner) + cOwner->SetCannotReachTarget(); + owner->StopMoving(); + owner->SetInFront(target); + MovementInform(owner); + return true; + } } } } @@ -262,6 +265,9 @@ bool ChaseMovementGenerator::DoUpdate(T* owner, uint32 time_diff) i_leashExtensionTimer.Reset(cOwner->GetAttackTime(BASE_ATTACK)); } + if (m_currentMode == CHASE_MODE_DISTANCING) + return true; + // if the target moved, we have to consider whether to adjust if (!_lastTargetPosition || target->GetPosition() != _lastTargetPosition.value() || mutualChase != _mutualChase || !owner->IsWithinLOSInMap(target)) {