From 6d9b89c976d888a22a4ec6a13629a1eaf84d997b Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sun, 8 Mar 2026 12:33:32 -0500 Subject: [PATCH] fix(Core/Movement): Teleport pet when pathfinding returns PATHFIND_NOT_USING_PATH (#23494) Co-authored-by: blinkysc Co-authored-by: Ryan Turner <16946913+TheSCREWEDSoftware@users.noreply.github.com> --- src/server/game/AI/CoreAI/PetAI.cpp | 9 +++++++++ .../MovementGenerators/TargetedMovementGenerator.cpp | 10 +++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index c251edc5b..bc57e4d2a 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -158,6 +158,15 @@ void PetAI::UpdateAI(uint32 diff) else m_updateAlliesTimer -= diff; + if (owner && owner->IsPlayer() && !me->GetVictim() && me->CanNotReachTarget()) + { + if (me->GetDistance(owner) > 40.0f) + { + me->NearTeleportTo(owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ(), me->GetOrientation()); + me->SetCannotReachTarget(); // Clear flag after teleport + } + } + if (me->GetVictim() && me->GetVictim()->IsAlive()) { // is only necessary to stop casting, the pet must not exit combat diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 7c979f98e..625770177 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -648,8 +648,16 @@ bool FollowMovementGenerator::DoUpdate(T* owner, uint32 time_diff) owner->UpdateAllowedPositionZ(x, y, z); bool success = i_path->CalculatePath(x, y, z, forceDest); - if (!success || (i_path->GetPathType() & PATHFIND_NOPATH && !followingMaster)) + + bool cannotReachTarget = !success || (i_path->GetPathType() & PATHFIND_NOPATH && !followingMaster); + if (oPet && followingMaster && !owner->CanFly() && (i_path->GetPathType() & PATHFIND_NOT_USING_PATH)) + cannotReachTarget = true; + + if (cannotReachTarget) { + if (oPet && followingMaster) + cOwner->SetCannotReachTarget(target->GetGUID()); + if (!owner->IsStopped()) owner->StopMoving();