diff options
author | maximius <none@none> | 2009-10-17 15:51:44 -0700 |
---|---|---|
committer | maximius <none@none> | 2009-10-17 15:51:44 -0700 |
commit | e585187b248f48b3c6e9247b49fa07c6565d65e5 (patch) | |
tree | 637c5b7ddacf41040bef4ea4f75a97da64c6a9bc /src/game/TotemAI.cpp | |
parent | 26b5e033ffde3d161382fc9addbfa99738379641 (diff) |
*Backed out changeset 3be01fb200a5
--HG--
branch : trunk
Diffstat (limited to 'src/game/TotemAI.cpp')
-rw-r--r-- | src/game/TotemAI.cpp | 17 |
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 *) { |