diff --git a/data/sql/updates/pending_db_world/rev_1633019621598195500.sql b/data/sql/updates/pending_db_world/rev_1633019621598195500.sql new file mode 100644 index 000000000..ae41482a5 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1633019621598195500.sql @@ -0,0 +1,5 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1633019621598195500'); + +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_hun_lock_and_load' AND `spell_id` = -56342; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(-56342, 'spell_hun_lock_and_load'); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index e0ef3abb2..f086fe0c1 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -7037,15 +7037,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere } break; } - case 3579: // Lock and Load - { - // Proc only from periodic (from trap activation proc another aura of this spell) - if (!(procFlag & PROC_FLAG_DONE_PERIODIC) || !roll_chance_i(triggerAmount)) - return false; - triggered_spell_id = 56453; - target = this; - break; - } } switch (dummySpell->Id) @@ -9108,16 +9099,6 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg return false; break; } - // Lock and Load - case 56453: - { - // Proc only from Frost/Freezing trap activation or from Freezing Arrow (the periodic dmg proc handled elsewhere) - if (!(procFlags & PROC_FLAG_DONE_TRAP_ACTIVATION) || !procSpell || !roll_chance_i(triggerAmount)) - return false; - if (procSpell->Id != 63487 /*frost trap*/ && !(procSpell->SchoolMask & SPELL_SCHOOL_MASK_FROST)) - return false; - break; - } // Glyph of Death's Embrace case 58679: { diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 7bc06c198..b437a3a51 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -26,6 +26,7 @@ #include "GridNotifiers.h" #include "Pet.h" #include "ScriptMgr.h" +#include "SpellAuras.h" #include "SpellAuraEffects.h" #include "SpellScript.h" @@ -64,7 +65,9 @@ enum HunterSpells SPELL_HUNTER_VICIOUS_VIPER = 61609, SPELL_HUNTER_VIPER_ATTACK_SPEED = 60144, SPELL_DRAENEI_GIFT_OF_THE_NAARU = 59543, - SPELL_HUNTER_GLYPH_OF_ARCANE_SHOT = 61389 + SPELL_HUNTER_GLYPH_OF_ARCANE_SHOT = 61389, + SPELL_LOCK_AND_LOAD_TRIGGER = 56453, + SPELL_LOCK_AND_LOAD_MARKER = 67544 }; // Ours @@ -1367,6 +1370,76 @@ public: } }; +// -56342 - Lock and Load +class spell_hun_lock_and_load : public SpellScriptLoader +{ + public: + spell_hun_lock_and_load() : SpellScriptLoader("spell_hun_lock_and_load") { } + + class spell_hun_lock_and_load_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_lock_and_load_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_LOCK_AND_LOAD_TRIGGER, SPELL_LOCK_AND_LOAD_MARKER }); + } + + 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)) + { + return false; + } + + return !eventInfo.GetActor()->HasAura(SPELL_LOCK_AND_LOAD_MARKER); + } + + template + void HandleProcs(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + if (!(eventInfo.GetTypeMask() & mask)) + { + return; + } + + if (!roll_chance_i(aurEff->GetAmount())) + { + return; + } + + Unit* caster = eventInfo.GetActor(); + caster->CastSpell(caster, SPELL_LOCK_AND_LOAD_TRIGGER, true); + } + + void ApplyMarker(ProcEventInfo& eventInfo) + { + Unit* caster = eventInfo.GetActor(); + caster->CastSpell(caster, SPELL_LOCK_AND_LOAD_MARKER, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_hun_lock_and_load_AuraScript::CheckTrapProc); + + OnEffectProc += AuraEffectProcFn(spell_hun_lock_and_load_AuraScript::HandleProcs, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + OnEffectProc += AuraEffectProcFn(spell_hun_lock_and_load_AuraScript::HandleProcs, EFFECT_1, SPELL_AURA_DUMMY); + + AfterProc += AuraProcFn(spell_hun_lock_and_load_AuraScript::ApplyMarker); + } + + }; + + AuraScript* GetAuraScript() const override + { + return new spell_hun_lock_and_load_AuraScript(); + } +}; + void AddSC_hunter_spell_scripts() { // Ours @@ -1397,4 +1470,5 @@ void AddSC_hunter_spell_scripts() new spell_hun_tame_beast(); new spell_hun_viper_attack_speed(); new spell_hun_volley_trigger(); + new spell_hun_lock_and_load(); }