diff options
Diffstat (limited to 'src/game/CreatureAI.cpp')
-rw-r--r-- | src/game/CreatureAI.cpp | 202 |
1 files changed, 10 insertions, 192 deletions
diff --git a/src/game/CreatureAI.cpp b/src/game/CreatureAI.cpp index 230c1d446fc..465d67ded20 100644 --- a/src/game/CreatureAI.cpp +++ b/src/game/CreatureAI.cpp @@ -32,7 +32,7 @@ void CreatureAI::OnCharmed(bool apply) me->IsAIEnabled = false; } -AISpellInfoType * CreatureAI::AISpellInfo; +AISpellInfoType * UnitAI::AISpellInfo; TRINITY_DLL_SPEC AISpellInfoType * GetAISpellInfo(uint32 i) { return &CreatureAI::AISpellInfo[i]; } void CreatureAI::DoZoneInCombat(Creature* creature) @@ -98,6 +98,15 @@ void CreatureAI::MoveInLineOfSight(Unit *who) AttackStart(who->getVictim()); } +void CreatureAI::SelectNearestTarget(Unit *who) +{ + if(me->getVictim() && me->GetDistanceOrder(who, me->getVictim()) && me->canAttack(who)) + { + me->getThreatManager().modifyThreatPercent(me->getVictim(), -100); + me->AddThreat(who, 1000000.0f); + } +} + void CreatureAI::SetGazeOn(Unit *target) { if(me->canAttack(target)) @@ -182,197 +191,6 @@ void CreatureAI::EnterEvadeMode() Reset(); } -inline bool SelectTargetHelper(const Unit * me, const Unit * target, const bool &playerOnly, const float &dist, const int32 &aura) -{ - if(playerOnly && target->GetTypeId() != TYPEID_PLAYER) - return false; - - if(dist && !me->IsWithinCombatRange(target, dist)) - return false; - - if(aura) - { - if(aura > 0) - { - if(!target->HasAura(aura)) - return false; - } - else - { - if(target->HasAura(aura)) - return false; - } - } - - return true; -} - -struct TargetDistanceOrder : public std::binary_function<const Unit *, const Unit *, bool> -{ - const Unit * me; - TargetDistanceOrder(const Unit* Target) : me(Target) {}; - // functor for operator ">" - bool operator()(const Unit * _Left, const Unit * _Right) const - { - return (me->GetDistanceSq(_Left) < me->GetDistanceSq(_Right)); - } -}; - -Unit* CreatureAI::SelectTarget(SelectAggroTarget targetType, uint32 position, float dist, bool playerOnly, int32 aura) -{ - if(targetType == SELECT_TARGET_NEAREST || targetType == SELECT_TARGET_FARTHEST) - { - std::list<HostilReference*> &m_threatlist = me->getThreatManager().getThreatList(); - if(position >= m_threatlist.size()) - return NULL; - - std::list<Unit*> targetList; - for(std::list<HostilReference*>::iterator itr = m_threatlist.begin(); itr!= m_threatlist.end(); ++itr) - if(SelectTargetHelper(me, (*itr)->getTarget(), playerOnly, dist, aura)) - targetList.push_back((*itr)->getTarget()); - - if(position >= targetList.size()) - return NULL; - - targetList.sort(TargetDistanceOrder(m_creature)); - - if(targetType == SELECT_TARGET_NEAREST) - { - std::list<Unit*>::iterator i = targetList.begin(); - advance(i, position); - return *i; - } - else - { - std::list<Unit*>::reverse_iterator i = targetList.rbegin(); - advance(i, position); - return *i; - } - } - else - { - std::list<HostilReference*> m_threatlist = me->getThreatManager().getThreatList(); - std::list<HostilReference*>::iterator i; - while(position < m_threatlist.size()) - { - if(targetType == SELECT_TARGET_BOTTOMAGGRO) - { - i = m_threatlist.end(); - advance(i, - (int32)position - 1); - } - else - { - i = m_threatlist.begin(); - if(targetType == SELECT_TARGET_TOPAGGRO) - advance(i, position); - else // random - advance(i, position + rand()%(m_threatlist.size() - position)); - } - - if(SelectTargetHelper(me, (*i)->getTarget(), playerOnly, dist, aura)) - return (*i)->getTarget(); - else - m_threatlist.erase(i); - } - } - - return NULL; -} - -void CreatureAI::SelectTargetList(std::list<Unit*> &targetList, uint32 num, SelectAggroTarget targetType, float dist, bool playerOnly, int32 aura) -{ - if(targetType == SELECT_TARGET_NEAREST || targetType == SELECT_TARGET_FARTHEST) - { - std::list<HostilReference*> &m_threatlist = m_creature->getThreatManager().getThreatList(); - if(m_threatlist.empty()) - return; - - for(std::list<HostilReference*>::iterator itr = m_threatlist.begin(); itr!= m_threatlist.end(); ++itr) - if(SelectTargetHelper(me, (*itr)->getTarget(), playerOnly, dist, aura)) - targetList.push_back((*itr)->getTarget()); - - targetList.sort(TargetDistanceOrder(me)); - targetList.resize(num); - if(targetType == SELECT_TARGET_FARTHEST) - targetList.reverse(); - } - else - { - std::list<HostilReference*> m_threatlist = me->getThreatManager().getThreatList(); - std::list<HostilReference*>::iterator i; - while(!m_threatlist.empty() && num) - { - if(targetType == SELECT_TARGET_BOTTOMAGGRO) - { - i = m_threatlist.end(); - --i; - } - else - { - i = m_threatlist.begin(); - if(targetType == SELECT_TARGET_RANDOM) - advance(i, rand()%m_threatlist.size()); - } - - if(SelectTargetHelper(me, (*i)->getTarget(), playerOnly, dist, aura)) - { - targetList.push_back((*i)->getTarget()); - --num; - } - m_threatlist.erase(i); - } - } -} - -void CreatureAI::FillAISpellInfo() -{ - AISpellInfo = new AISpellInfoType[GetSpellStore()->GetNumRows()]; - - AISpellInfoType *AIInfo = AISpellInfo; - const SpellEntry * spellInfo; - - for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i, ++AIInfo) - { - spellInfo = GetSpellStore()->LookupEntry(i); - if(!spellInfo) - continue; - - if(spellInfo->Attributes & SPELL_ATTR_CASTABLE_WHILE_DEAD) - AIInfo->condition = AICOND_DIE; - else if(IsPassiveSpell(i) || GetSpellDuration(spellInfo) == -1) - AIInfo->condition = AICOND_AGGRO; - else - AIInfo->condition = AICOND_COMBAT; - - if(AIInfo->cooldown < spellInfo->RecoveryTime) - AIInfo->cooldown = spellInfo->RecoveryTime; - - for(uint32 j = 0; j < 3; ++j) - { - if(spellInfo->EffectImplicitTargetA[j] == TARGET_UNIT_TARGET_ENEMY - || spellInfo->EffectImplicitTargetA[j] == TARGET_DST_TARGET_ENEMY) - { - if(AIInfo->target < AITARGET_VICTIM) - AIInfo->target = AITARGET_VICTIM; - } - - if(spellInfo->Effect[j] == SPELL_EFFECT_APPLY_AURA) - { - if(spellInfo->EffectImplicitTargetA[j] == TARGET_UNIT_TARGET_ENEMY) - { - if(AIInfo->target < AITARGET_DEBUFF) - AIInfo->target = AITARGET_DEBUFF; - } - else if(IsPositiveSpell(i)) - { - if(AIInfo->target < AITARGET_BUFF) - AIInfo->target = AITARGET_BUFF; - } - } - } - } -} - /*void CreatureAI::AttackedBy( Unit* attacker ) { if(!m_creature->getVictim()) |