diff options
Diffstat (limited to 'src/game/CombatAI.cpp')
-rw-r--r-- | src/game/CombatAI.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/game/CombatAI.cpp b/src/game/CombatAI.cpp index 00d06b9ec33..b18e6dd7532 100644 --- a/src/game/CombatAI.cpp +++ b/src/game/CombatAI.cpp @@ -17,51 +17,64 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #include "CombatAI.h" #include "SpellMgr.h" + int AggressorAI::Permissible(const Creature *creature) { // have some hostile factions, it will be selected by IsHostileTo check at MoveInLineOfSight if( !creature->isCivilian() && !creature->IsNeutralToAll() ) return PERMIT_BASE_PROACTIVE; + return PERMIT_BASE_NO; } + void AggressorAI::UpdateAI(const uint32 /*diff*/) { if(!UpdateVictim()) return; + DoMeleeAttackIfReady(); } + // some day we will delete these useless things int CombatAI::Permissible(const Creature *creature) { return PERMIT_BASE_NO; } + int ArchorAI::Permissible(const Creature *creature) { return PERMIT_BASE_NO; } + int TurretAI::Permissible(const Creature *creature) { return PERMIT_BASE_NO; } + void CombatAI::InitializeAI() { for(uint32 i = 0; i < CREATURE_MAX_SPELLS; ++i) if(me->m_spells[i] && GetSpellStore()->LookupEntry(me->m_spells[i])) spells.push_back(me->m_spells[i]); + CreatureAI::InitializeAI(); } + void CombatAI::Reset() { events.Reset(); } + void CombatAI::JustDied(Unit *killer) { for(SpellVct::iterator i = spells.begin(); i != spells.end(); ++i) if(AISpellInfo[*i].condition == AICOND_DIE) me->CastSpell(killer, *i, true); } + void CombatAI::EnterCombat(Unit *who) { for(SpellVct::iterator i = spells.begin(); i != spells.end(); ++i) @@ -72,13 +85,17 @@ void CombatAI::EnterCombat(Unit *who) events.ScheduleEvent(*i, AISpellInfo[*i].cooldown + rand()%AISpellInfo[*i].cooldown); } } + void CombatAI::UpdateAI(const uint32 diff) { if(!UpdateVictim()) return; + events.Update(diff); + if(me->hasUnitState(UNIT_STAT_CASTING)) return; + if(uint32 spellId = events.ExecuteEvent()) { DoCast(spellId); @@ -88,12 +105,15 @@ void CombatAI::UpdateAI(const uint32 diff) DoMeleeAttackIfReady(); } + ///////////////// //CasterAI ///////////////// + void CasterAI::InitializeAI() { CombatAI::InitializeAI(); + float m_attackDist = 30.0f; for(SpellVct::iterator itr = spells.begin(); itr != spells.end(); ++itr) if (AISpellInfo[*itr].condition == AICOND_COMBAT && m_attackDist > GetAISpellInfo(*itr)->maxRange) @@ -101,10 +121,12 @@ void CasterAI::InitializeAI() if (m_attackDist == 30.0f) m_attackDist = MELEE_RANGE; } + void CasterAI::EnterCombat(Unit *who) { if (spells.empty()) return; + uint32 spell = rand()%spells.size(); uint32 count = 0; for(SpellVct::iterator itr = spells.begin(); itr != spells.end(); ++itr, ++count) @@ -123,13 +145,17 @@ void CasterAI::EnterCombat(Unit *who) } } } + void CasterAI::UpdateAI(const uint32 diff) { if(!UpdateVictim()) return; + events.Update(diff); + if(me->hasUnitState(UNIT_STAT_CASTING)) return; + if(uint32 spellId = events.ExecuteEvent()) { DoCast(spellId); @@ -138,9 +164,11 @@ void CasterAI::UpdateAI(const uint32 diff) } } + ////////////// //ArchorAI ////////////// + ArchorAI::ArchorAI(Creature *c) : CreatureAI(c) { ASSERT(me->m_spells[0]); @@ -150,10 +178,12 @@ ArchorAI::ArchorAI(Creature *c) : CreatureAI(c) me->m_CombatDistance = GetSpellMaxRange(me->m_spells[0], false); me->m_SightDistance = me->m_CombatDistance; } + void ArchorAI::AttackStart(Unit *who) { if(!who) return; + if(me->IsWithinCombatRange(who, m_minRange)) { if(me->Attack(who, true) && !who->IsFlying()) @@ -164,22 +194,27 @@ void ArchorAI::AttackStart(Unit *who) if(me->Attack(who, false) && !who->IsFlying()) me->GetMotionMaster()->MoveChase(who, me->m_CombatDistance); } + if(who->IsFlying()) me->GetMotionMaster()->MoveIdle(); } + void ArchorAI::UpdateAI(const uint32 diff) { if(!UpdateVictim()) return; + if(!me->IsWithinCombatRange(me->getVictim(), m_minRange)) DoSpellAttackIfReady(me->m_spells[0]); else DoMeleeAttackIfReady(); } + ////////////// //TurretAI ////////////// + TurretAI::TurretAI(Creature *c) : CreatureAI(c) { ASSERT(me->m_spells[0]); @@ -187,6 +222,7 @@ TurretAI::TurretAI(Creature *c) : CreatureAI(c) me->m_CombatDistance = GetSpellMaxRange(me->m_spells[0], false); me->m_SightDistance = me->m_CombatDistance; } + bool TurretAI::CanAIAttack(const Unit *who) const { // TODO: use one function to replace it @@ -195,16 +231,20 @@ bool TurretAI::CanAIAttack(const Unit *who) const return false; return true; } + void TurretAI::AttackStart(Unit *who) { if(who) me->Attack(who, false); } + void TurretAI::UpdateAI(const uint32 diff) { if(!UpdateVictim()) return; + DoSpellAttackIfReady(me->m_spells[0]); + //if(!DoSpellAttackIfReady(me->m_spells[0])) //if(HostilReference *ref = me->getThreatManager().getCurrentVictim()) //ref->removeReference(); |