From 4e70e604279174048ace535bf93a38b59a899c19 Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Sun, 12 Dec 2021 15:43:22 +0100 Subject: [PATCH] fix(Core/Spells): Properly handle pet spell auras with infinity cooldown. (#9576) Fixes #9339 --- src/server/game/Handlers/PetHandler.cpp | 5 +++- src/server/game/Handlers/SpellHandler.cpp | 10 ------- src/server/game/Spells/Auras/SpellAuras.cpp | 32 +++++++++++++++++++-- 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index c31dc68e5..a148d015d 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -750,7 +750,10 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe if (result == SPELL_CAST_OK) { - pet->ToCreature()->AddSpellCooldown(spellid, 0, spellInfo->IsCooldownStartedOnEvent() ? infinityCooldownDelay : 0); + if (!spellInfo->IsCooldownStartedOnEvent()) + { + pet->ToCreature()->AddSpellCooldown(spellid, 0, 0); + } unit_target = spell->m_targets.GetUnitTarget(); diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index cd3ed0014..3508f8ec9 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -553,16 +553,6 @@ void WorldSession::HandlePetCancelAuraOpcode(WorldPacket& recvPacket) } pet->RemoveOwnedAura(spellId, ObjectGuid::Empty, 0, AURA_REMOVE_BY_CANCEL); - - if (spellInfo->IsCooldownStartedOnEvent()) - { - pet->AddSpellCooldown(spellId, 0, 0); - - WorldPacket data(SMSG_COOLDOWN_EVENT, 4 + 8); - data << uint32(spellInfo->Id); - data << pet->GetGUID(); - _player->SendDirectMessage(&data); - } } void WorldSession::HandleCancelGrowthAuraOpcode(WorldPacket& /*recvPacket*/) diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 026538e7c..9763f7011 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -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)