From 39ea8e04d3d46c6d2ddf2208ec68496f48e2a750 Mon Sep 17 00:00:00 2001 From: killerwife Date: Fri, 17 Nov 2023 16:33:36 +0100 Subject: [PATCH] Spell: Fix passing of wrong proc flag to PROC_EX_CAST_END event and minor logic simplification --- src/game/Spells/Spell.cpp | 13 ++++++++++--- src/game/Spells/SpellAuras.cpp | 4 +++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/game/Spells/Spell.cpp b/src/game/Spells/Spell.cpp index b6cc63a370..9f76ae8d94 100644 --- a/src/game/Spells/Spell.cpp +++ b/src/game/Spells/Spell.cpp @@ -3221,16 +3221,23 @@ SpellCastResult Spell::cast(bool skipCheck) } } + uint32 procAttacker; + uint32 procVictim; + uint32 procEx = PROC_EX_NONE; + PrepareMasksForProcSystem(EFFECT_MASK_ALL, procAttacker, procVictim, m_trueCaster, nullptr); // on spell cast end proc, // critical hit related part is currently done on hit so proc there, // 0 damage since any damage based procs should be on hit // 0 victim proc since there is no victim proc dependent on successfull cast for caster - Unit::ProcDamageAndSpell(ProcSystemArguments(m_caster, procTarget, PROC_EX_NORMAL_HIT, 0, PROC_EX_CAST_END, 0, 0, m_attackType, m_spellInfo)); + Unit::ProcDamageAndSpell(ProcSystemArguments(m_caster, procTarget, procAttacker, 0, PROC_EX_CAST_END, 0, 0, m_attackType, m_spellInfo)); } else // Immediate spell, no big deal { - - Unit::ProcDamageAndSpell(ProcSystemArguments(m_caster, procTarget, PROC_EX_NORMAL_HIT, 0, PROC_EX_CAST_END, 0, 0, m_attackType, m_spellInfo)); + uint32 procAttacker; + uint32 procVictim; + uint32 procEx = PROC_EX_NONE; + PrepareMasksForProcSystem(EFFECT_MASK_ALL, procAttacker, procVictim, m_trueCaster, nullptr); + Unit::ProcDamageAndSpell(ProcSystemArguments(m_caster, procTarget, procAttacker, 0, PROC_EX_CAST_END, 0, 0, m_attackType, m_spellInfo)); handle_immediate(); } diff --git a/src/game/Spells/SpellAuras.cpp b/src/game/Spells/SpellAuras.cpp index a2843c7fbb..935550e7c0 100644 --- a/src/game/Spells/SpellAuras.cpp +++ b/src/game/Spells/SpellAuras.cpp @@ -755,11 +755,13 @@ bool Aura::CanProcFrom(SpellEntry const* spell, uint32 EventProcEx, uint32 procE // Check for extra req (if none) and hit/crit if (EventProcEx == PROC_EX_NONE) { + if ((procEx & PROC_EX_CAST_END) != 0) // cast end does not care about damage/healing + return true; if ((procEx & PROC_EX_ABSORB) && absorbing) // trigger ex absorb procs even if no damage is dealt return true; // No extra req, so can trigger only for active (damage/healing present) and hit/crit - return ((procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) && damaging) || (procEx & PROC_EX_CAST_END) != 0; + return ((procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) && damaging); } // Passive spells hits here only if resist/reflect/immune/evade // Passive spells can`t trigger if need hit (exclude cases when procExtra include non-active flags)