Fixes broken autocast spells such as Furious Howl and Leap to cast when on autocast and "attack" is clicked.
Fixes wrong check for spell cooldown and removes check for duration (some spells with duration such as poison are stackable)
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user