From 476d085aa42d4636911ed45947d77378b957a033 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Thu, 14 Oct 2021 14:49:15 -0300 Subject: [PATCH] fix(Scripts/Spells): Fix Lock and Load proc from Frost Trap (#8441) --- src/server/scripts/Spells/spell_hunter.cpp | 68 +++++++++++++++++++--- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index a685cbe7d..32318361d 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -1370,6 +1370,11 @@ public: } }; +enum LocknLoadSpells +{ + SPELL_FROST_TRAP_SLOW = 67035 +}; + // -56342 - Lock and Load class spell_hun_lock_and_load : public SpellScriptLoader { @@ -1382,19 +1387,54 @@ class spell_hun_lock_and_load : public SpellScriptLoader bool Validate(SpellInfo const* /*spellInfo*/) override { - return ValidateSpellInfo({ SPELL_LOCK_AND_LOAD_TRIGGER, SPELL_LOCK_AND_LOAD_MARKER }); + return ValidateSpellInfo({ SPELL_LOCK_AND_LOAD_TRIGGER, SPELL_LOCK_AND_LOAD_MARKER, SPELL_FROST_TRAP_SLOW }); } bool CheckTrapProc(ProcEventInfo& eventInfo) { - // Do not proc on traps for immolation/explosive trap. SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); - if (!spellInfo || !(spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_FROST)) + if (!spellInfo) { return false; } - return !eventInfo.GetActor()->HasAura(SPELL_LOCK_AND_LOAD_MARKER); + // Black Arrow and Fire traps may trigger on periodic tick only. + if (((spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_FIRE) || (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_SHADOW)) + && (spellInfo->Effects[0].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE || spellInfo->Effects[1].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE)) + { + return true; + } + + return IsTargetValid(spellInfo, eventInfo.GetProcTarget()) && !eventInfo.GetActor()->HasAura(SPELL_LOCK_AND_LOAD_MARKER); + } + + bool IsTargetValid(SpellInfo const* spellInfo, Unit* target) + { + if (!spellInfo || !target) + { + return false; + } + + // Don't check it for fire traps and black arrow, they proc on periodic only and not spell hit. + // So it's wrong to check for immunity, it was already checked when the spell was applied. + if ((spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_FIRE) || (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_SHADOW)) + { + return false; + } + + // HitMask for Frost Trap can't be checked correctly as it is. + // That's because the talent is triggered by the spell that fires the trap (63487)... + // ...and not the actual spell that applies the slow effect (67035). + // So the IMMUNE result is never sent by the spell that triggers this. + if (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_NATURE) + { + if (SpellInfo const* triggerSpell = sSpellMgr->GetSpellInfo(SPELL_FROST_TRAP_SLOW)) + { + return !target->IsImmunedToSpell(triggerSpell); + } + } + + return true; } template @@ -1402,7 +1442,18 @@ class spell_hun_lock_and_load : public SpellScriptLoader { PreventDefaultAction(); - if (!(eventInfo.GetTypeMask() & mask)) + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + + if (!(eventInfo.GetTypeMask() & mask) || !spellInfo) + { + return; + } + + // Also check if the proc from the fire traps and black arrow actually comes from the periodic ticks here. + // Normally this wouldn't be required, but we are circumventing the current proc system limitations. + if (((spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_FIRE) || (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_SHADOW)) + && (spellInfo->Effects[0].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE || spellInfo->Effects[1].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE) + && !(mask & PROC_FLAG_DONE_PERIODIC)) { return; } @@ -1418,8 +1469,11 @@ class spell_hun_lock_and_load : public SpellScriptLoader void ApplyMarker(ProcEventInfo& eventInfo) { - Unit* caster = eventInfo.GetActor(); - caster->CastSpell(caster, SPELL_LOCK_AND_LOAD_MARKER, true); + if (IsTargetValid(eventInfo.GetSpellInfo(), eventInfo.GetProcTarget())) + { + Unit* caster = eventInfo.GetActor(); + caster->CastSpell(caster, SPELL_LOCK_AND_LOAD_MARKER, true); + } } void Register() override