Skip to content

Commit

Permalink
Core/PlayerAI: Some more helper methods added. Also, charmed players …
Browse files Browse the repository at this point in the history
…no longer break crowd control.
  • Loading branch information
Treeston committed Feb 24, 2016
1 parent 5a3a21c commit a8f760b
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 5 deletions.
25 changes: 20 additions & 5 deletions src/server/game/AI/PlayerAI/PlayerAI.cpp
Expand Up @@ -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())
Expand All @@ -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;

Expand All @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions src/server/game/AI/PlayerAI/PlayerAI.h
Expand Up @@ -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();

Expand All @@ -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

0 comments on commit a8f760b

Please sign in to comment.