From 8ce003700cc787ef99d162d5f60b3cc4f3505397 Mon Sep 17 00:00:00 2001 From: MrSmite Date: Sun, 23 Dec 2012 00:13:05 -0500 Subject: [PATCH 1/4] Fix pets lagging behind and despawning by slightly adjusting speed if too far from owner. Closes #8740 --- src/server/game/AI/CoreAI/PetAI.cpp | 6 ++++++ src/server/game/Entities/Unit/Unit.cpp | 17 ++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index 78c22e74f4..c68bf4e6d2 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -252,6 +252,12 @@ void PetAI::UpdateAI(const uint32 diff) for (TargetSpellList::const_iterator itr = targetSpellStore.begin(); itr != targetSpellStore.end(); ++itr) delete itr->second; } + + // Update speed as needed to prevent dropping too far behind and despawning + me->UpdateSpeed(MOVE_RUN, true); + me->UpdateSpeed(MOVE_WALK, true); + me->UpdateSpeed(MOVE_FLIGHT, true); + } void PetAI::UpdateAllies() diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d4b276fd2d..026b2d4135 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12690,7 +12690,22 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) { // Set creature speed rate from CreatureInfo if (GetTypeId() == TYPEID_UNIT) - speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached + if (isPet() && !isInCombat()) + { + // For every yard over 5, increase speed by 0.01 + // to help prevent pet from lagging behind and despawning + float dist = GetDistance(GetCharmerOrOwner()); + float base_rate = 1.00f; // base speed is 100% of owner speed + + if (dist < 5) + dist = 5; + + float mult = base_rate + ((dist - 5) * 0.01f); + + speed *= GetCharmerOrOwner()->GetSpeedRate(mtype) * mult; // pets default to owner's speed when not in combat + } + else + speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need // TODO: possible affect only on MOVE_RUN From a06006abb0b1cc100afebd09bf9c294533d647b7 Mon Sep 17 00:00:00 2001 From: MrSmite Date: Mon, 24 Dec 2012 03:35:13 -0500 Subject: [PATCH 2/4] Update src/server/game/Entities/Unit/Unit.cpp Fix crash on "tame pet" --- src/server/game/Entities/Unit/Unit.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 026b2d4135..3c34d522fe 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12688,13 +12688,16 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) case MOVE_SWIM: case MOVE_FLIGHT: { - // Set creature speed rate from CreatureInfo + // Set creature speed rate if (GetTypeId() == TYPEID_UNIT) - if (isPet() && !isInCombat()) + { + Unit* pOwner = GetCharmerOrOwner(); // Must check for owner or crash on "Tame Pet" + + if (isPet() && !isInCombat() && pOwner) { // For every yard over 5, increase speed by 0.01 // to help prevent pet from lagging behind and despawning - float dist = GetDistance(GetCharmerOrOwner()); + float dist = GetDistance(pOwner); float base_rate = 1.00f; // base speed is 100% of owner speed if (dist < 5) @@ -12702,10 +12705,11 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) float mult = base_rate + ((dist - 5) * 0.01f); - speed *= GetCharmerOrOwner()->GetSpeedRate(mtype) * mult; // pets default to owner's speed when not in combat + speed *= pOwner->GetSpeedRate(mtype) * mult; // pets default to owner's speed when not in combat } else speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached + } // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need // TODO: possible affect only on MOVE_RUN From a4733863ecbb9465afb752323628e34bda2847e4 Mon Sep 17 00:00:00 2001 From: MrSmite Date: Mon, 24 Dec 2012 23:47:42 -0500 Subject: [PATCH 3/4] Update src/server/game/Entities/Unit/Unit.cpp Code style cleanup --- src/server/game/Entities/Unit/Unit.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 3c34d522fe..46876c04a3 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12691,13 +12691,11 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) // Set creature speed rate if (GetTypeId() == TYPEID_UNIT) { - Unit* pOwner = GetCharmerOrOwner(); // Must check for owner or crash on "Tame Pet" - - if (isPet() && !isInCombat() && pOwner) + if (isPet() && !isInCombat() && GetCharmerOrOwner()) // Must check for owner or crash on "Tame Beast" { // For every yard over 5, increase speed by 0.01 // to help prevent pet from lagging behind and despawning - float dist = GetDistance(pOwner); + float dist = GetDistance(GetCharmerOrOwner()); float base_rate = 1.00f; // base speed is 100% of owner speed if (dist < 5) @@ -12705,7 +12703,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) float mult = base_rate + ((dist - 5) * 0.01f); - speed *= pOwner->GetSpeedRate(mtype) * mult; // pets default to owner's speed when not in combat + speed *= GetCharmerOrOwner()->GetSpeedRate(mtype) * mult; // pets derive speed from owner when not in combat } else speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached From f7904b1d4d3ea6d49877c4d95fa24f52cec225e9 Mon Sep 17 00:00:00 2001 From: MrSmite Date: Tue, 25 Dec 2012 22:25:18 -0500 Subject: [PATCH 4/4] Update src/server/game/Entities/Unit/Unit.cpp Revert codestyle changes to cut down on calls to GetCharmerOrOwner() --- src/server/game/Entities/Unit/Unit.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 46876c04a3..09f6748586 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12691,11 +12691,12 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) // Set creature speed rate if (GetTypeId() == TYPEID_UNIT) { - if (isPet() && !isInCombat() && GetCharmerOrOwner()) // Must check for owner or crash on "Tame Beast" + Unit* pOwner = GetCharmerOrOwner(); + if (isPet() && !isInCombat() && pOwner) // Must check for owner or crash on "Tame Beast" { // For every yard over 5, increase speed by 0.01 // to help prevent pet from lagging behind and despawning - float dist = GetDistance(GetCharmerOrOwner()); + float dist = GetDistance(pOwner); float base_rate = 1.00f; // base speed is 100% of owner speed if (dist < 5) @@ -12703,7 +12704,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) float mult = base_rate + ((dist - 5) * 0.01f); - speed *= GetCharmerOrOwner()->GetSpeedRate(mtype) * mult; // pets derive speed from owner when not in combat + speed *= pOwner->GetSpeedRate(mtype) * mult; // pets derive speed from owner when not in combat } else speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached