aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp11
-rw-r--r--src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp5
2 files changed, 11 insertions, 5 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index 270a32e2c73..5decf1e87c7 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -449,14 +449,17 @@ void SmartAI::EnterEvadeMode(EvadeReason /*why*/)
AddEscortState(SMART_ESCORT_RETURNING);
ReturnToLastOOCPos();
}
- else if (!mFollowGuid.IsEmpty())
+ else if (Unit* target = !mFollowGuid.IsEmpty() ? ObjectAccessor::GetUnit(*me, mFollowGuid) : nullptr)
{
- if (Unit* target = ObjectAccessor::GetUnit(*me, mFollowGuid))
- me->GetMotionMaster()->MoveFollow(target, mFollowDist, mFollowAngle);
-
+ me->GetMotionMaster()->MoveFollow(target, mFollowDist, mFollowAngle);
// evade is not cleared in MoveFollow, so we can't keep it
me->ClearUnitState(UNIT_STATE_EVADE);
}
+ else if (Unit* owner = me->GetCharmerOrOwner())
+ {
+ me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
+ me->ClearUnitState(UNIT_STATE_EVADE);
+ }
else
me->GetMotionMaster()->MoveTargetedHome();
diff --git a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp
index 002e247dc14..4be89f9d5ce 100644
--- a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp
@@ -44,7 +44,10 @@ void HomeMovementGenerator<Creature>::DoReset(Creature*) { }
void HomeMovementGenerator<Creature>::_setTargetLocation(Creature* owner)
{
if (owner->HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED | UNIT_STATE_DISTRACTED))
+ { // if we are ROOT/STUNNED/DISTRACTED even after aura clear, immediately finalize - otherwise we would get stuck in evade
+ arrived = true;
return;
+ }
Movement::MoveSplineInit init(owner);
float x, y, z, o;
@@ -65,6 +68,6 @@ void HomeMovementGenerator<Creature>::_setTargetLocation(Creature* owner)
bool HomeMovementGenerator<Creature>::DoUpdate(Creature* owner, const uint32 /*time_diff*/)
{
- arrived = owner->movespline->Finalized();
+ arrived = arrived || owner->movespline->Finalized();
return !arrived;
}