[8291] Now allow auto-casting pet spells out of combat by PetAI, related code cleanups.

This commit is contained in:
VladimirMangos 2009-08-01 23:18:55 +04:00
parent f27a29faef
commit f10653833f
3 changed files with 20 additions and 29 deletions

View file

@ -194,9 +194,12 @@ void PetAI::UpdateAI(const uint32 diff)
} }
} }
if (m_creature->GetGlobalCooldown() == 0 && !m_creature->IsNonMeleeSpellCasted(false)) //Autocast (casted only in combat)
if (inCombat && m_creature->GetGlobalCooldown() == 0 && !m_creature->IsNonMeleeSpellCasted(false))
{ {
//Autocast typedef std::vector<std::pair<Unit*, Spell*> > TargetSpellList;
TargetSpellList targetSpellStore;
for (uint8 i = 0; i < m_creature->GetPetAutoSpellSize(); ++i) for (uint8 i = 0; i < m_creature->GetPetAutoSpellSize(); ++i)
{ {
uint32 spellID = m_creature->GetPetAutoSpellOnPos(i); uint32 spellID = m_creature->GetPetAutoSpellOnPos(i);
@ -208,22 +211,14 @@ void PetAI::UpdateAI(const uint32 diff)
continue; continue;
// ignore some combinations of combat state and combat/noncombat spells // ignore some combinations of combat state and combat/noncombat spells
if (!inCombat) if (IsNonCombatSpell(spellInfo))
{ continue;
if (!IsPositiveSpell(spellInfo->Id))
continue;
}
else
{
if (IsNonCombatSpell(spellInfo))
continue;
}
Spell *spell = new Spell(m_creature, spellInfo, false, 0); Spell *spell = new Spell(m_creature, spellInfo, false, 0);
if (inCombat && !m_creature->hasUnitState(UNIT_STAT_FOLLOW) && spell->CanAutoCast(m_creature->getVictim())) if (!m_creature->hasUnitState(UNIT_STAT_FOLLOW) && spell->CanAutoCast(m_creature->getVictim()))
{ {
m_targetSpellStore.push_back(std::make_pair<Unit*, Spell*>(m_creature->getVictim(), spell)); targetSpellStore.push_back(std::make_pair<Unit*, Spell*>(m_creature->getVictim(), spell));
continue; continue;
} }
else else
@ -239,7 +234,7 @@ void PetAI::UpdateAI(const uint32 diff)
if(spell->CanAutoCast(Target)) if(spell->CanAutoCast(Target))
{ {
m_targetSpellStore.push_back(std::make_pair<Unit*, Spell*>(Target, spell)); targetSpellStore.push_back(std::make_pair<Unit*, Spell*>(Target, spell));
spellUsed = true; spellUsed = true;
break; break;
} }
@ -250,14 +245,14 @@ void PetAI::UpdateAI(const uint32 diff)
} }
//found units to cast on to //found units to cast on to
if (!m_targetSpellStore.empty()) if (!targetSpellStore.empty())
{ {
uint32 index = urand(0, m_targetSpellStore.size() - 1); uint32 index = urand(0, targetSpellStore.size() - 1);
Spell* spell = m_targetSpellStore[index].second; Spell* spell = targetSpellStore[index].second;
Unit* target = m_targetSpellStore[index].first; Unit* target = targetSpellStore[index].first;
m_targetSpellStore.erase(m_targetSpellStore.begin() + index); targetSpellStore.erase(targetSpellStore.begin() + index);
SpellCastTargets targets; SpellCastTargets targets;
targets.setUnitTarget( target ); targets.setUnitTarget( target );
@ -276,11 +271,10 @@ void PetAI::UpdateAI(const uint32 diff)
spell->prepare(&targets); spell->prepare(&targets);
} }
while (!m_targetSpellStore.empty())
{ // deleted cached Spell objects
delete m_targetSpellStore.begin()->second; for(TargetSpellList::const_iterator itr = targetSpellStore.begin(); itr != targetSpellStore.end(); ++itr)
m_targetSpellStore.erase(m_targetSpellStore.begin()); delete itr->second;
}
} }
} }

View file

@ -52,8 +52,5 @@ class MANGOS_DLL_DECL PetAI : public CreatureAI
bool inCombat; bool inCombat;
std::set<uint64> m_AllySet; std::set<uint64> m_AllySet;
uint32 m_updateAlliesTimer; uint32 m_updateAlliesTimer;
typedef std::pair<Unit*, Spell*> TargetSpellPair;
std::vector<TargetSpellPair> m_targetSpellStore;
}; };
#endif #endif

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "8290" #define REVISION_NR "8291"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__