fix(Core/Spells): Properly handle pet spell auras with infinity cooldown. (#9576)

Fixes #9339
This commit is contained in:
UltraNix
2021-12-12 15:43:22 +01:00
committed by GitHub
parent b1303e0e96
commit 4e70e60427
3 changed files with 34 additions and 13 deletions

View File

@@ -494,12 +494,16 @@ void Aura::_ApplyForTarget(Unit* target, Unit* caster, AuraApplication* auraApp)
m_applications[target->GetGUID()] = auraApp;
// set infinity cooldown state for spells
if (caster && caster->GetTypeId() == TYPEID_PLAYER)
if (m_spellInfo->IsCooldownStartedOnEvent() && !m_castItemGuid && caster)
{
if (m_spellInfo->IsCooldownStartedOnEvent() && !m_castItemGuid)
if (caster->IsPlayer())
{
caster->ToPlayer()->AddSpellAndCategoryCooldowns(m_spellInfo, 0, nullptr, true);
}
else
{
caster->ToCreature()->AddSpellCooldown(m_spellInfo->Id, 0, infinityCooldownDelay);
}
}
}
@@ -526,6 +530,30 @@ void Aura::_UnapplyForTarget(Unit* target, Unit* caster, AuraApplication* auraAp
m_removedApplications.push_back(auraApp);
// reset cooldown state for spells
if (m_spellInfo->IsCooldownStartedOnEvent() && !m_castItemGuid && caster)
{
if (caster->IsPlayer())
{
// note: item based cooldowns and cooldown spell mods with charges ignored (unknown existed cases)
caster->ToPlayer()->SendCooldownEvent(GetSpellInfo());
}
else
{
caster->ToCreature()->AddSpellCooldown(m_spellInfo->Id, 0, 0);
if (Unit* owner = caster->GetCharmerOrOwner())
{
if (Player* playerOwner = owner->ToPlayer())
{
WorldPacket data(SMSG_COOLDOWN_EVENT, 4 + 8);
data << uint32(m_spellInfo->Id);
data << caster->GetGUID();
playerOwner->SendDirectMessage(&data);
}
}
}
}
if (caster && caster->GetTypeId() == TYPEID_PLAYER)
{
if (GetSpellInfo()->IsCooldownStartedOnEvent() && !m_castItemGuid)