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();