aboutsummaryrefslogtreecommitdiff
path: root/src/game/TotemAI.cpp
diff options
context:
space:
mode:
authormaximius <none@none>2009-10-17 15:51:44 -0700
committermaximius <none@none>2009-10-17 15:51:44 -0700
commite585187b248f48b3c6e9247b49fa07c6565d65e5 (patch)
tree637c5b7ddacf41040bef4ea4f75a97da64c6a9bc /src/game/TotemAI.cpp
parent26b5e033ffde3d161382fc9addbfa99738379641 (diff)
*Backed out changeset 3be01fb200a5
--HG-- branch : trunk
Diffstat (limited to 'src/game/TotemAI.cpp')
-rw-r--r--src/game/TotemAI.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/game/TotemAI.cpp b/src/game/TotemAI.cpp
index 5dfbcf6bfdd..08c70308d1c 100644
--- a/src/game/TotemAI.cpp
+++ b/src/game/TotemAI.cpp
@@ -17,51 +17,65 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+
#include "TotemAI.h"
#include "Totem.h"
#include "Creature.h"
#include "DBCStores.h"
#include "ObjectAccessor.h"
#include "SpellMgr.h"
+
#include "GridNotifiers.h"
#include "GridNotifiersImpl.h"
#include "CellImpl.h"
+
int
TotemAI::Permissible(const Creature *creature)
{
if( creature->isTotem() )
return PERMIT_BASE_PROACTIVE;
+
return PERMIT_BASE_NO;
}
+
TotemAI::TotemAI(Creature *c) : CreatureAI(c), i_victimGuid(0)
{
assert(c->isTotem());
}
+
void
TotemAI::MoveInLineOfSight(Unit *)
{
}
+
void TotemAI::EnterEvadeMode()
{
m_creature->CombatStop(true);
}
+
void
TotemAI::UpdateAI(const uint32 /*diff*/)
{
if (((Totem*)m_creature)->GetTotemType() != TOTEM_ACTIVE)
return;
+
if (!m_creature->isAlive() || m_creature->IsNonMeleeSpellCasted(false))
return;
+
// Search spell
SpellEntry const *spellInfo = sSpellStore.LookupEntry(((Totem*)m_creature)->GetSpell());
if (!spellInfo)
return;
+
// Get spell range
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(spellInfo->rangeIndex);
float max_range = GetSpellMaxRangeForHostile(srange);
+
// SPELLMOD_RANGE not applied in this place just because not existence range mods for attacking totems
+
// pointer to appropriate target if found any
Unit* victim = i_victimGuid ? ObjectAccessor::GetUnit(*m_creature, i_victimGuid) : NULL;
+
// Search victim if no, not attackable, or out of range, or friendly (possible in case duel end)
if( !victim ||
!victim->isTargetableForAttack() || !m_creature->IsWithinDistInMap(victim, max_range) ||
@@ -72,11 +86,13 @@ TotemAI::UpdateAI(const uint32 /*diff*/)
Trinity::UnitLastSearcher<Trinity::NearestAttackableUnitInObjectRangeCheck> checker(m_creature, victim, u_check);
m_creature->VisitNearbyObject(max_range, checker);
}
+
// If have target
if (victim)
{
// remember
i_victimGuid = victim->GetGUID();
+
// attack
m_creature->SetInFront(victim); // client change orientation by self
m_creature->CastSpell(victim, ((Totem*)m_creature)->GetSpell(), false);
@@ -84,6 +100,7 @@ TotemAI::UpdateAI(const uint32 /*diff*/)
else
i_victimGuid = 0;
}
+
void
TotemAI::AttackStart(Unit *)
{