From c81774ed53dbfad921e3c332ee2f72a97c1cc8b9 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Sun, 31 Mar 2019 04:26:38 +0200 Subject: [PATCH] Core/Spells: * fixed a typo in Trap Launcher that was causing the triggered effect not getting removed * fixed Glyph of Kill Shot * fixed Camouflage closes #46 --- .../custom/custom_2019_03_31_00_world.sql | 15 ++ src/server/scripts/Spells/spell_hunter.cpp | 146 +++++++++++++++++- 2 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 sql/updates/world/custom/custom_2019_03_31_00_world.sql diff --git a/sql/updates/world/custom/custom_2019_03_31_00_world.sql b/sql/updates/world/custom/custom_2019_03_31_00_world.sql new file mode 100644 index 0000000000..e6c93cbfc7 --- /dev/null +++ b/sql/updates/world/custom/custom_2019_03_31_00_world.sql @@ -0,0 +1,15 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_hun_glyph_of_kill_shot', +'spell_hun_camouflage', +'spell_hun_camouflage_duration', +'spell_hun_camouflage_triggered'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(63067, 'spell_hun_glyph_of_kill_shot'), +(51753, 'spell_hun_camouflage'), +(51755, 'spell_hun_camouflage_duration'), +(80325, 'spell_hun_camouflage_triggered'); + +DELETE FROM `spell_proc` WHERE `SpellId`= 63067; +INSERT INTO `spell_proc` (`SpellId`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `Cooldown`, `Charges`, `Chance`) VALUES +(63067, 9, 0, 0x00800000, 0, 0x00000100, 1, 4, 0, 0, 0, 0, 100); diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index cb9fcbf748..34583f4648 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -40,6 +40,9 @@ enum HunterSpells SPELL_HUNTER_CALL_PET_3 = 83243, SPELL_HUNTER_CALL_PET_4 = 83244, SPELL_HUNTER_CALL_PET_5 = 83245, + SPELL_HUNTER_CAMOUFLAGE_DURATION = 51755, + SPELL_HUNTER_CAMOUFLAGE_PERIODIC = 80326, + SPELL_HUNTER_CAMOUFLAGE_PERIODIC_TRIGGERED = 80326, SPELL_HUNTER_CHIMERA_SHOT = 53209, SPELL_HUNTER_CHIMERA_SHOT_HEAL = 53353, SPELL_HUNTER_FIRE = 82926, @@ -50,6 +53,7 @@ enum HunterSpells SPELL_HUNTER_IMPROVED_SERPENT_STING_R2 = 82834, SPELL_HUNTER_INSANITY = 95809, SPELL_HUNTER_INVIGORATION_TRIGGERED = 53398, + SPELL_HUNTER_GLYPH_OF_KILL_SHOT_COOLDOWN = 90967, SPELL_HUNTER_LOCK_AND_LOAD = 56453, SPELL_HUNTER_MASTERS_CALL_TRIGGERED = 62305, SPELL_HUNTER_MISDIRECTION_PROC = 35079, @@ -1519,7 +1523,143 @@ class spell_hun_trap_launcher : public AuraScript void Register() override { AfterEffectApply += AuraEffectApplyFn(spell_hun_trap_launcher::AfterApply, EFFECT_0, SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS_TRIGGERED, AURA_EFFECT_HANDLE_REAL); - AfterEffectApply += AuraEffectApplyFn(spell_hun_trap_launcher::AfterRemove, EFFECT_0, SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS_TRIGGERED, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_hun_trap_launcher::AfterRemove, EFFECT_0, SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS_TRIGGERED, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 63067 - Glyph of Kill Shot +class spell_hun_glyph_of_kill_shot : public AuraScript +{ + PrepareAuraScript(spell_hun_glyph_of_kill_shot); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_HUNTER_GLYPH_OF_KILL_SHOT_COOLDOWN }); + } + + bool CheckProc(ProcEventInfo& /*eventInfo*/) + { + return (!GetTarget()->HasAura(SPELL_HUNTER_GLYPH_OF_KILL_SHOT_COOLDOWN)); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* victim = eventInfo.GetProcTarget(); + if (!victim) + return; + + uint32 spellId = 0; + if (SpellInfo const* spell = eventInfo.GetSpellInfo()) + spellId = spell->Id; + + if (!victim->isDead() && spellId) + { + GetTarget()->GetSpellHistory()->ResetCooldown(spellId, true); + GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_GLYPH_OF_KILL_SHOT_COOLDOWN, true, nullptr, aurEff); + } + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_hun_glyph_of_kill_shot::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_hun_glyph_of_kill_shot::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } +}; + +// 51753 - Camouflage +class spell_hun_camouflage : public SpellScript +{ + PrepareSpellScript(spell_hun_camouflage); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_HUNTER_CAMOUFLAGE_DURATION }); + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + { + caster->CastSpell(caster, SPELL_HUNTER_CAMOUFLAGE_DURATION, true); + + if (Player* player = caster->ToPlayer()) + if (Pet* pet = player->GetPet()) + pet->CastSpell(pet, SPELL_HUNTER_CAMOUFLAGE_DURATION, true); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_hun_camouflage::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 51755 - Camouflage +class spell_hun_camouflage_duration : public AuraScript +{ + PrepareAuraScript(spell_hun_camouflage_duration); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_HUNTER_CAMOUFLAGE_PERIODIC, + SPELL_HUNTER_CAMOUFLAGE_PERIODIC_TRIGGERED + }); + } + + void AfterApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_CAMOUFLAGE_PERIODIC, true, nullptr, aurEff); + } + + void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_HUNTER_CAMOUFLAGE_PERIODIC); + GetTarget()->RemoveAurasDueToSpell(SPELL_HUNTER_CAMOUFLAGE_PERIODIC_TRIGGERED); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_hun_camouflage_duration::AfterApply, EFFECT_0, SPELL_AURA_INTERFERE_TARGETTING, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_hun_camouflage_duration::AfterRemove, EFFECT_0, SPELL_AURA_INTERFERE_TARGETTING, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 80325 - Camouflage +class spell_hun_camouflage_triggered : public AuraScript +{ + PrepareAuraScript(spell_hun_camouflage_triggered); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_HUNTER_CAMOUFLAGE_PERIODIC, + SPELL_HUNTER_CAMOUFLAGE_DURATION + }); + } + + void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_HUNTER_CAMOUFLAGE_PERIODIC); + GetTarget()->RemoveAurasDueToSpell(SPELL_HUNTER_CAMOUFLAGE_DURATION); + + if (Player* player = GetTarget()->ToPlayer()) + { + if (Pet* pet = player->GetPet()) + { + pet->RemoveAurasDueToSpell(SPELL_HUNTER_CAMOUFLAGE_PERIODIC); + pet->RemoveAurasDueToSpell(SPELL_HUNTER_CAMOUFLAGE_DURATION); + } + } + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_hun_camouflage_triggered::AfterRemove, EFFECT_0, SPELL_AURA_MOD_STEALTH, AURA_EFFECT_HANDLE_REAL); } }; @@ -1527,10 +1667,14 @@ void AddSC_hunter_spell_scripts() { new spell_hun_ancient_hysteria(); new spell_hun_bombardment(); + RegisterSpellScript(spell_hun_camouflage); + RegisterAuraScript(spell_hun_camouflage_duration); + RegisterAuraScript(spell_hun_camouflage_triggered); new spell_hun_chimera_shot(); new spell_hun_cobra_shot(); new spell_hun_disengage(); new spell_hun_fire(); + RegisterAuraScript(spell_hun_glyph_of_kill_shot); new spell_hun_improved_mend_pet(); new spell_hun_improved_serpent_sting(); new spell_hun_invigoration();