diff options
-rw-r--r-- | src/server/game/AI/PlayerAI/PlayerAI.cpp | 25 | ||||
-rw-r--r-- | src/server/game/AI/PlayerAI/PlayerAI.h | 2 |
2 files changed, 22 insertions, 5 deletions
diff --git a/src/server/game/AI/PlayerAI/PlayerAI.cpp b/src/server/game/AI/PlayerAI/PlayerAI.cpp index 1809f02f4fe..1b99d0956f2 100644 --- a/src/server/game/AI/PlayerAI/PlayerAI.cpp +++ b/src/server/game/AI/PlayerAI/PlayerAI.cpp @@ -150,9 +150,23 @@ void PlayerAI::DoAutoAttackIfReady() DoMeleeAttackIfReady(); } +struct UncontrolledTargetSelectPredicate : public std::unary_function<Unit*, bool> +{ + bool operator()(Unit const* target) const + { + return !target->HasBreakableByDamageCrowdControlAura(); + } +}; +Unit* SimpleCharmedPlayerAI::SelectAttackTarget() const +{ + if (Unit* charmer = me->GetCharmer()) + return charmer->IsAIEnabled ? charmer->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, UncontrolledTargetSelectPredicate()) : charmer->GetVictim(); + return nullptr; +} + void SimpleCharmedPlayerAI::UpdateAI(const uint32 /*diff*/) { - Creature* charmer = me->GetCharmer()->ToCreature(); + Creature* charmer = me->GetCharmer() ? me->GetCharmer()->ToCreature() : nullptr; //kill self if charm aura has infinite duration if (charmer->IsInEvadeMode()) @@ -169,9 +183,9 @@ void SimpleCharmedPlayerAI::UpdateAI(const uint32 /*diff*/) if (charmer->IsInCombat()) { Unit* target = me->GetVictim(); - if (!target || !charmer->IsValidAttackTarget(target)) + if (!target || !charmer->IsValidAttackTarget(target) || target->HasBreakableByDamageCrowdControlAura()) { - target = charmer->SelectNearestTarget(); + target = SelectAttackTarget(); if (!target) return; @@ -180,15 +194,16 @@ void SimpleCharmedPlayerAI::UpdateAI(const uint32 /*diff*/) else AttackStart(target); } + DoAutoAttackIfReady(); } else { me->AttackStop(); me->CastStop(); + me->StopMoving(); + me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveFollow(charmer, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); } - - DoAutoAttackIfReady(); } void SimpleCharmedPlayerAI::OnCharmed(bool apply) diff --git a/src/server/game/AI/PlayerAI/PlayerAI.h b/src/server/game/AI/PlayerAI/PlayerAI.h index dcc35bce934..0ecc51ef894 100644 --- a/src/server/game/AI/PlayerAI/PlayerAI.h +++ b/src/server/game/AI/PlayerAI/PlayerAI.h @@ -39,6 +39,7 @@ class PlayerAI : public UnitAI Player* const me; void SetIsRangedAttacker(bool state) { _isSelfRangedAttacker = state; } // this allows overriding of the default ranged attacker detection + virtual Unit* SelectAttackTarget() const { return me->GetCharmer() ? me->GetCharmer()->GetVictim() : nullptr; } void DoRangedAttackIfReady(); void DoAutoAttackIfReady(); @@ -53,6 +54,7 @@ class SimpleCharmedPlayerAI : public PlayerAI SimpleCharmedPlayerAI(Player* player) : PlayerAI(player) { } void UpdateAI(uint32 diff) override; void OnCharmed(bool apply) override; + Unit* SelectAttackTarget() const; }; #endif |