diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 997d399f6..edf7d6950 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -42,6 +42,7 @@ #include "SpellAuras.h" #include "SpellInfo.h" #include "SpellMgr.h" +#include "TargetedMovementGenerator.h" #include "TemporarySummon.h" #include "Totem.h" #include "TotemAI.h" @@ -13583,19 +13584,24 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) { if (GetTypeId() == TYPEID_UNIT) { - Unit* pOwner = GetCharmerOrOwner(); - if (pOwner && !IsInCombat() && !IsVehicle() && !HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_POSSESSED) && (IsPet() || IsGuardian() || GetGUID() == pOwner->GetCritterGUID() || GetCharmerGUID() == pOwner->GetGUID())) + Unit* followed = nullptr; + if (GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE) { - if (pOwner->GetTypeId() != TYPEID_PLAYER) + followed = static_castconst*>(GetMotionMaster()->top())->GetTarget(); + } + + if (followed && !IsInCombat() && !IsVehicle() && !HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_POSSESSED) && (IsPet() || IsGuardian() || GetGUID() == followed->GetCritterGUID() || GetCharmerOrOwnerGUID() == followed->GetGUID())) + { + if (followed->GetTypeId() != TYPEID_PLAYER) { - if (speed < pOwner->GetSpeedRate(mtype) + 0.1f) - speed = pOwner->GetSpeedRate(mtype) + 0.1f; // pets derive speed from owner when not in combat + if (speed < followed->GetSpeedRate(mtype) + 0.1f) + speed = followed->GetSpeedRate(mtype) + 0.1f; // pets derive speed from owner when not in combat } else { // special treatment for player pets in order to avoid stuttering - float ownerSpeed = pOwner->GetSpeedRate(mtype); - float distOwner = GetDistance(pOwner); + float ownerSpeed = followed->GetSpeedRate(mtype); + float distOwner = GetDistance(followed); float minDist = 2.5f; if (ToCreature()->GetCreatureType() == CREATURE_TYPE_NON_COMBAT_PET)