From 322743f5f7682e9f083aa33a2cd8ad091a364b1d Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Mon, 12 Jun 2023 17:11:18 +0200 Subject: [PATCH] Core/Spells: * moved Shadowflame to spellscript * fixed Bane of Havoc * Backdraft will now fire on cast instead of on hit --- .../world/4.3.4/2023_06_12_00_world.sql | 20 +++ src/server/scripts/Spells/spell_warlock.cpp | 115 ++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 sql/updates/world/4.3.4/2023_06_12_00_world.sql diff --git a/sql/updates/world/4.3.4/2023_06_12_00_world.sql b/sql/updates/world/4.3.4/2023_06_12_00_world.sql new file mode 100644 index 0000000000..703ff3c96a --- /dev/null +++ b/sql/updates/world/4.3.4/2023_06_12_00_world.sql @@ -0,0 +1,20 @@ +-- Shadowflame +DELETE FROM `spell_linked_spell` WHERE `spell_trigger`= 47897; +DELETE FROM `spell_script_names` WHERE `ScriptName`= 'spell_warl_shadowflame'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(47897, 'spell_warl_shadowflame'); + +-- Backdraft +UPDATE `spell_proc` SET `SpellPhaseMask`= 0x1, `SpellTypeMask`= 0x1 WHERE `SpellId`= -47258; + +-- Bane of Havoc +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_warl_bane_of_havoc', +'spell_warl_bane_of_havoc_tracking_aura'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(80240, 'spell_warl_bane_of_havoc'), +(85466, 'spell_warl_bane_of_havoc_tracking_aura'); + +DELETE FROM `spell_proc` WHERE `SpellId`= 85466; +INSERT INTO `spell_proc` (`SpellId`, `SpellTypeMask`, `SpellPhaseMask`) VALUES +(85466, 0x1, 0x2); diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 575ac00bec..5adede06da 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -37,6 +37,9 @@ enum WarlockSpells { SPELL_WARLOCK_AFTERMATH_STUN = 85387, SPELL_WARLOCK_BANE_OF_DOOM_EFFECT = 18662, + SPELL_WARLOCK_BANE_OF_HAVOC = 80240, + SPELL_WARLOCK_BANE_OF_HAVOC_TRACKING_AURA = 85466, + SPELL_WARLOCK_BANE_OF_HAVOC_DAMAGE = 85455, SPELL_WARLOCK_BURNING_EMBERS_DAMAGE = 85421, SPELL_WARLOCK_CREATE_HEALTHSTONE = 34130, SPELL_WARLOCK_CORRUPTION_TRIGGERED = 87389, @@ -93,6 +96,7 @@ enum WarlockSpells SPELL_WARLOCK_SEED_OF_CORRUPTION_VISUAL = 37826, SPELL_WARLOCK_SIPHON_LIFE_HEAL = 63106, SPELL_WARLOCK_SHADOW_WARD = 6229, + SPELL_WARLOCK_SHADOWFLAME_PERIODIC = 47960, SPELL_WARLOCK_SOULBURN_HEALTHSTONE = 79437, SPELL_WARLOCK_SOULBURN_DEMONIC_CIRCLE = 79438, SPELL_WARLOCK_SOULBURN_SEARING_PAIN = 79440, @@ -1696,9 +1700,119 @@ class spell_warl_glyph_of_fear : public AuraScript } }; +// 47897 - Shadowflame +class spell_warl_shadowflame : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WARLOCK_SHADOWFLAME_PERIODIC }); + } + + void HandlePeriodicDamageEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + caster->CastSpell(GetHitUnit(), SPELL_WARLOCK_SHADOWFLAME_PERIODIC, true); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_warl_shadowflame::HandlePeriodicDamageEffect, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } +}; + +// 80240 - Bane of Havoc +class spell_warl_bane_of_havoc : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WARLOCK_BANE_OF_HAVOC_TRACKING_AURA }); + } + + void ApplyTrackingAura(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + caster->CastSpell(nullptr, SPELL_WARLOCK_BANE_OF_HAVOC_TRACKING_AURA, CastSpellExtraArgs(TRIGGERED_FULL_MASK)); + } + + void Register() override + { + AfterEffectApply.Register(&spell_warl_bane_of_havoc::ApplyTrackingAura, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 85466 - Bane of Havoc +class spell_warl_bane_of_havoc_tracking_aura : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WARLOCK_BANE_OF_HAVOC_DAMAGE, SPELL_WARLOCK_BANE_OF_HAVOC }); + } + + void StoreTrackingAuraTargetGuid(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + for (Aura const* aura : GetTarget()->GetSingleCastAuras()) + if (aura->GetId() == SPELL_WARLOCK_BANE_OF_HAVOC && aura->GetCasterGUID() == GetTarget()->GetGUID()) + if (Unit const* owner = aura->GetUnitOwner()) + _trackedTargetGUID = owner->GetGUID(); + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + // Nothing to track + if (_trackedTargetGUID.IsEmpty() || !eventInfo.GetProcTarget() || eventInfo.GetProcTarget()->GetGUID() == _trackedTargetGUID) + return false; + + // No damage to share + if (!eventInfo.GetDamageInfo() || eventInfo.GetDamageInfo()->GetDamage() == 0) + return false; + + if (!PrepareProc(eventInfo)) + { + _trackedTargetGUID = ObjectGuid::Empty; + _trackedTarget = nullptr; + _trackedDamage = 0; + return false; + } + + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + GetTarget()->CastSpell(_trackedTarget, SPELL_WARLOCK_BANE_OF_HAVOC_DAMAGE, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellBP0(_trackedDamage)); + } + + void Register() override + { + AfterEffectApply.Register(&spell_warl_bane_of_havoc_tracking_aura::StoreTrackingAuraTargetGuid, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + DoCheckProc.Register(&spell_warl_bane_of_havoc_tracking_aura::CheckProc); + OnEffectProc.Register(&spell_warl_bane_of_havoc_tracking_aura::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } +private: + ObjectGuid _trackedTargetGUID; + Unit* _trackedTarget = nullptr; + int32 _trackedDamage = 0; + + bool PrepareProc(ProcEventInfo const& eventInfo) + { + _trackedTarget = ObjectAccessor::GetUnit(*GetTarget(), _trackedTargetGUID); + if (!_trackedTarget) + return false; + + AuraEffect const* baneEffect = _trackedTarget->GetAuraEffect(SPELL_WARLOCK_BANE_OF_HAVOC, EFFECT_0, GetCasterGUID()); + if (!baneEffect) + return false; + + _trackedDamage = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), baneEffect->GetAmount()); + return true; + } +}; + void AddSC_warlock_spell_scripts() { RegisterSpellScript(spell_warl_aftermath); + RegisterSpellScript(spell_warl_bane_of_havoc); + RegisterSpellScript(spell_warl_bane_of_havoc_tracking_aura); RegisterSpellScript(spell_warl_bane_of_doom); RegisterSpellScript(spell_warl_banish); RegisterSpellScript(spell_warl_burning_embers); @@ -1735,6 +1849,7 @@ void AddSC_warlock_spell_scripts() RegisterSpellScript(spell_warl_seed_of_corruption_aoe); RegisterSpellScript(spell_warl_shadow_trance_proc); RegisterSpellScript(spell_warl_shadow_ward); + RegisterSpellScript(spell_warl_shadowflame); RegisterSpellScript(spell_warl_soulburn); RegisterSpellScript(spell_warl_soul_harvest); RegisterSpellScript(spell_warl_soul_leech);