aboutsummaryrefslogtreecommitdiff
path: root/src/game/CombatAI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/CombatAI.cpp')
-rw-r--r--src/game/CombatAI.cpp40
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();