diff options
Diffstat (limited to 'src/game/TotemAI.cpp')
-rw-r--r-- | src/game/TotemAI.cpp | 67 |
1 files changed, 24 insertions, 43 deletions
diff --git a/src/game/TotemAI.cpp b/src/game/TotemAI.cpp index 3593f8396a1..08c70308d1c 100644 --- a/src/game/TotemAI.cpp +++ b/src/game/TotemAI.cpp @@ -1,7 +1,7 @@ /* - * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> * - * Copyright (C) 2008 Trinity <http://www.trinitycore.org/> + * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,9 +21,7 @@ #include "TotemAI.h" #include "Totem.h" #include "Creature.h" -#include "Player.h" -#include "Database/DBCStores.h" -#include "MapManager.h" +#include "DBCStores.h" #include "ObjectAccessor.h" #include "SpellMgr.h" @@ -40,8 +38,9 @@ TotemAI::Permissible(const Creature *creature) return PERMIT_BASE_NO; } -TotemAI::TotemAI(Creature *c) : CreatureAI(c), i_totem(static_cast<Totem&>(*c)), i_victimGuid(0) +TotemAI::TotemAI(Creature *c) : CreatureAI(c), i_victimGuid(0) { + assert(c->isTotem()); } void @@ -51,52 +50,41 @@ TotemAI::MoveInLineOfSight(Unit *) void TotemAI::EnterEvadeMode() { - i_totem.CombatStop(); + m_creature->CombatStop(true); } void TotemAI::UpdateAI(const uint32 /*diff*/) { - if (i_totem.GetTotemType() != TOTEM_ACTIVE) + if (((Totem*)m_creature)->GetTotemType() != TOTEM_ACTIVE) return; - if (!i_totem.isAlive() || i_totem.IsNonMeleeSpellCasted(false)) + if (!m_creature->isAlive() || m_creature->IsNonMeleeSpellCasted(false)) return; // Search spell - SpellEntry const *spellInfo = sSpellStore.LookupEntry(i_totem.GetSpell()); + SpellEntry const *spellInfo = sSpellStore.LookupEntry(((Totem*)m_creature)->GetSpell()); if (!spellInfo) return; - // Get spell rangy + // Get spell range SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(spellInfo->rangeIndex); - float max_range = GetSpellMaxRange(srange); + 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(i_totem, i_victimGuid) : NULL; + 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() || !i_totem.IsWithinDistInMap(victim, max_range) || - i_totem.IsFriendlyTo(victim) || !victim->isVisibleForOrDetect(&i_totem,false) ) + !victim->isTargetableForAttack() || !m_creature->IsWithinDistInMap(victim, max_range) || + m_creature->IsFriendlyTo(victim) || !victim->isVisibleForOrDetect(m_creature,false) ) { - CellPair p(Trinity::ComputeCellPair(i_totem.GetPositionX(),i_totem.GetPositionY())); - Cell cell(p); - cell.data.Part.reserved = ALL_DISTRICT; - victim = NULL; - - Trinity::NearestAttackableUnitInObjectRangeCheck u_check(&i_totem, &i_totem, max_range); - Trinity::UnitLastSearcher<Trinity::NearestAttackableUnitInObjectRangeCheck> checker(victim, u_check); - - TypeContainerVisitor<Trinity::UnitLastSearcher<Trinity::NearestAttackableUnitInObjectRangeCheck>, GridTypeMapContainer > grid_object_checker(checker); - TypeContainerVisitor<Trinity::UnitLastSearcher<Trinity::NearestAttackableUnitInObjectRangeCheck>, WorldTypeMapContainer > world_object_checker(checker); - - CellLock<GridReadGuard> cell_lock(cell, p); - cell_lock->Visit(cell_lock, grid_object_checker, *MapManager::Instance().GetMap(i_totem.GetMapId(), &i_totem)); - cell_lock->Visit(cell_lock, world_object_checker, *MapManager::Instance().GetMap(i_totem.GetMapId(), &i_totem)); + Trinity::NearestAttackableUnitInObjectRangeCheck u_check(m_creature, m_creature, max_range); + Trinity::UnitLastSearcher<Trinity::NearestAttackableUnitInObjectRangeCheck> checker(m_creature, victim, u_check); + m_creature->VisitNearbyObject(max_range, checker); } // If have target @@ -106,30 +94,23 @@ TotemAI::UpdateAI(const uint32 /*diff*/) i_victimGuid = victim->GetGUID(); // attack - i_totem.SetInFront(victim); // client change orientation by self - i_totem.CastSpell(victim, i_totem.GetSpell(), false); + m_creature->SetInFront(victim); // client change orientation by self + m_creature->CastSpell(victim, ((Totem*)m_creature)->GetSpell(), false); } else i_victimGuid = 0; } -bool -TotemAI::IsVisible(Unit *) const -{ - return false; -} - void TotemAI::AttackStart(Unit *) { // Sentry totem sends ping on attack - if (i_totem.GetEntry() == SENTRY_TOTEM_ENTRY && i_totem.GetOwner()->GetTypeId() == TYPEID_PLAYER) + if (m_creature->GetEntry() == SENTRY_TOTEM_ENTRY && m_creature->GetOwner()->GetTypeId() == TYPEID_PLAYER) { WorldPacket data(MSG_MINIMAP_PING, (8+4+4)); - data << i_totem.GetGUID(); - data << i_totem.GetPositionX(); - data << i_totem.GetPositionY(); - ((Player*)i_totem.GetOwner())->GetSession()->SendPacket(&data); + data << m_creature->GetGUID(); + data << m_creature->GetPositionX(); + data << m_creature->GetPositionY(); + ((Player*)m_creature->GetOwner())->GetSession()->SendPacket(&data); } } - |