From bd99687040e95021d03346e01f2c50bf36a07a63 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sun, 1 Mar 2026 11:46:32 -0600 Subject: [PATCH] fix(Core/Scripts): Fix Judgement and Judgements of the Just seal interactions (#24953) Co-authored-by: blinkysc --- src/server/scripts/Spells/spell_paladin.cpp | 96 ++++++++++++++++----- 1 file changed, 73 insertions(+), 23 deletions(-) diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 44b210542..7fc079c7b 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -96,12 +96,15 @@ enum PaladinSpells SPELL_PALADIN_HOLY_VENGEANCE = 31803, SPELL_PALADIN_BLOOD_CORRUPTION = 53742, SPELL_PALADIN_SEAL_OF_VENGEANCE_EFFECT = 42463, - SPELL_PALADIN_SEAL_OF_CORRUPTION_EFFECT = 53739 + SPELL_PALADIN_SEAL_OF_CORRUPTION_EFFECT = 53739, + + SPELL_PALADIN_SEAL_OF_COMMAND = 20375 }; enum PaladinSpellIcons { PALADIN_ICON_ID_RETRIBUTION_AURA = 555, + PALADIN_ICON_JUDGEMENTS_OF_THE_JUST = 3015, PALADIN_ICON_JUDGEMENTS_OF_THE_WISE = 3017, PALADIN_ICON_HAMMER_OF_THE_RIGHTEOUS = 3023, PALADIN_ICON_RIGHTEOUS_VENGEANCE = 3025, @@ -148,6 +151,20 @@ enum PaladinProcSpells SPELL_PALADIN_T8_HOLY_4P_BONUS = 64895 }; +static bool IsJudgementDamageSpell(SpellInfo const* spellInfo) +{ + return spellInfo && + spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && + (spellInfo->SpellFamilyFlags[0] & 0x800000); +} + +static bool HasJudgementsOfTheJust(Unit const* caster) +{ + return caster && caster->GetAuraEffect( + SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_PALADIN, + PALADIN_ICON_JUDGEMENTS_OF_THE_JUST, 0) != nullptr; +} + class spell_pal_seal_of_command_aura : public AuraScript { PrepareAuraScript(spell_pal_seal_of_command_aura); @@ -959,27 +976,26 @@ public: GetCaster()->CastSpell(GetCaster(), SPELL_IMPROVED_JUDGEMENT_ENERGIZE, true); } - // Judgement of the Just - if (GetCaster()->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_PALADIN, 3015, 0)) + // Judgements of the Just + if (HasJudgementsOfTheJust(GetCaster())) { - if (GetCaster()->CastSpell(GetHitUnit(), SPELL_JUDGEMENTS_OF_THE_JUST, true) && (spellId2 == SPELL_JUDGEMENT_OF_VENGEANCE_EFFECT || spellId2 == SPELL_JUDGEMENT_OF_CORRUPTION_EFFECT)) - { - //hidden effect only cast when spellcast of judgements of the just is succesful - GetCaster()->CastSpell(GetHitUnit(), SealApplication(spellId2), true); //add hidden seal apply effect for vengeance and corruption - } - } - } + GetCaster()->CastSpell(GetHitUnit(), SPELL_JUDGEMENTS_OF_THE_JUST, true); - uint32 SealApplication(uint32 correspondingSpellId) - { - switch (correspondingSpellId) - { - case SPELL_JUDGEMENT_OF_VENGEANCE_EFFECT: - return SPELL_HOLY_VENGEANCE; - case SPELL_JUDGEMENT_OF_CORRUPTION_EFFECT: - return SPELL_BLOOD_CORRUPTION; - default: - return 0; + // JotJ makes Judgements trigger Seal of Command's + // cleave effect + if (AuraEffect const* socEff = + GetCaster()->GetAuraEffect( + SPELL_PALADIN_SEAL_OF_COMMAND, EFFECT_0)) + { + if (GetHitUnit()->IsAlive()) + { + GetCaster()->CastCustomSpell( + socEff->GetSpellInfo()->Effects[EFFECT_0] + .TriggerSpell, + SPELLVALUE_MAX_TARGETS, 3, + GetHitUnit(), true, nullptr, socEff); + } + } } } @@ -1164,11 +1180,14 @@ class spell_pal_seal_of_righteousness : public AuraScript DamageInfo* damageInfo = eventInfo.GetDamageInfo(); if (!damageInfo || !damageInfo->GetDamage()) - { return false; - } - return target->IsAlive() && !eventInfo.GetTriggerAuraSpell() && (damageInfo->GetDamage() || (eventInfo.GetHitMask() & PROC_EX_ABSORB)); + if (IsJudgementDamageSpell(eventInfo.GetSpellInfo())) + return target->IsAlive(); + + return target->IsAlive() && !eventInfo.GetTriggerAuraSpell() && + (damageInfo->GetDamage() || + (eventInfo.GetHitMask() & PROC_EX_ABSORB)); } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) @@ -1187,6 +1206,17 @@ class spell_pal_seal_of_righteousness : public AuraScript int32 bp = std::max(0, int32((ap * 0.022f + 0.044f * holy) * GetTarget()->GetAttackTime(BASE_ATTACK) / 1000)); GetTarget()->CastCustomSpell(SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS, SPELLVALUE_BASE_POINT0, bp, eventInfo.GetProcTarget(), true, nullptr, aurEff); + + // Judgements of the Just: Seal of Righteousness procs + // twice from Judgements + if (IsJudgementDamageSpell(eventInfo.GetSpellInfo()) && + HasJudgementsOfTheJust(GetTarget())) + { + GetTarget()->CastCustomSpell( + SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS, + SPELLVALUE_BASE_POINT0, bp, + eventInfo.GetProcTarget(), true, nullptr, aurEff); + } } void Register() override @@ -1884,6 +1914,25 @@ class spell_pal_seal_of_vengeance_aura : public AuraScript return true; } + bool CheckProc(ProcEventInfo& eventInfo) + { + SpellInfo const* procSpell = eventInfo.GetSpellInfo(); + if (procSpell && + procSpell->SpellFamilyName == SPELLFAMILY_PALADIN) + { + // Block re-proc from seal damage effects + if ((procSpell->SpellFamilyFlags[1] & 0x800) && + !(procSpell->SpellFamilyFlags[0] & 0x800000)) + return false; + + // Judgements only trigger seal procs with JotJ + if (procSpell->SpellFamilyFlags[0] & 0x800000) + return HasJudgementsOfTheJust(eventInfo.GetActor()); + } + + return true; + } + void HandleApplyDoT(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); @@ -1925,6 +1974,7 @@ class spell_pal_seal_of_vengeance_aura : public AuraScript void Register() override { + DoCheckProc += AuraCheckProcFn(spell_pal_seal_of_vengeance_aura::CheckProc); OnEffectProc += AuraEffectProcFn(spell_pal_seal_of_vengeance_aura::HandleApplyDoT, EFFECT_0, SPELL_AURA_DUMMY); OnEffectProc += AuraEffectProcFn(spell_pal_seal_of_vengeance_aura::HandleSeal, EFFECT_0, SPELL_AURA_DUMMY); }