Merge pull request #6438 from MrSmite/PetAI_autocast_fix

Fix pet autocast spells such as Furious Howl and Leap
This commit is contained in:
Kaelima
2012-05-24 07:16:33 -07:00
+39 -19
View File
@@ -153,40 +153,60 @@ void PetAI::UpdateAI(const uint32 diff)
if (spellInfo->IsPositive()) if (spellInfo->IsPositive())
{ {
// non combat spells allowed
// only pet spells have IsNonCombatSpell and not fit this reqs:
// Consume Shadows, Lesser Invisibility, so ignore checks for its
if (spellInfo->CanBeUsedInCombat()) if (spellInfo->CanBeUsedInCombat())
{ {
// allow only spell without spell cost or with spell cost but not duration limit // check spell cooldown
int32 duration = spellInfo->GetDuration(); if (me->HasSpellCooldown(spellInfo->Id))
if ((spellInfo->ManaCost || spellInfo->ManaCostPercentage || spellInfo->ManaPerSecond) && duration > 0)
continue; continue;
// allow only spell without cooldown > duration // Check if we're in combat or commanded to attack
int32 cooldown = spellInfo->GetRecoveryTime(); if (!me->isInCombat() && !me->GetCharmInfo()->IsCommandAttack())
if (cooldown >= 0 && duration >= 0 && cooldown > duration)
continue; continue;
} }
Spell* spell = new Spell(me, spellInfo, TRIGGERED_NONE, 0); Spell* spell = new Spell(me, spellInfo, TRIGGERED_NONE, 0);
bool spellUsed = false; bool spellUsed = false;
for (std::set<uint64>::const_iterator tar = m_AllySet.begin(); tar != m_AllySet.end(); ++tar)
// Some spells can target enemy or friendly (DK Ghoul's Leap)
// Check for enemy first (pet then owner)
if (Unit* target = me->getAttackerForHelper())
{ {
Unit* target = ObjectAccessor::GetUnit(*me, *tar); if (CanAttack(target) && spell->CanAutoCast(target))
//only buff targets that are in combat, unless the spell can only be cast while out of combat
if (!target)
continue;
if (spell->CanAutoCast(target))
{ {
targetSpellStore.push_back(std::make_pair(target, spell)); targetSpellStore.push_back(std::make_pair(target, spell));
spellUsed = true; spellUsed = true;
break;
} }
} }
else if (Unit* target = me->GetCharmerOrOwner()->getAttackerForHelper())
{
if (CanAttack(target) && spell->CanAutoCast(target))
{
targetSpellStore.push_back(std::make_pair(target, spell));
spellUsed = true;
}
}
// No enemy, check friendly
if (!spellUsed)
{
for (std::set<uint64>::const_iterator tar = m_AllySet.begin(); tar != m_AllySet.end(); ++tar)
{
Unit* target = ObjectAccessor::GetUnit(*me, *tar);
//only buff targets that are in combat, unless the spell can only be cast while out of combat
if (!target)
continue;
if (spell->CanAutoCast(target))
{
targetSpellStore.push_back(std::make_pair(target, spell));
spellUsed = true;
break;
}
}
}
// No valid targets at all
if (!spellUsed) if (!spellUsed)
delete spell; delete spell;
} }