From 2620e02b7de846477dccda9a445cc2f7fae59cab Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Sun, 31 Mar 2019 11:12:24 +0200 Subject: [PATCH] Core/Spells: initial work on Soulburn Mechanics * todo: finish Soulburn: Seed of Corruption mechanic --- .../custom/custom_2019_03_32_05_world.sql | 14 +++ src/server/game/Spells/SpellMgr.cpp | 7 ++ src/server/scripts/Spells/spell_warlock.cpp | 114 +++++++++++++++--- 3 files changed, 120 insertions(+), 15 deletions(-) create mode 100644 sql/updates/world/custom/custom_2019_03_32_05_world.sql diff --git a/sql/updates/world/custom/custom_2019_03_32_05_world.sql b/sql/updates/world/custom/custom_2019_03_32_05_world.sql new file mode 100644 index 00000000000..6c30e95100d --- /dev/null +++ b/sql/updates/world/custom/custom_2019_03_32_05_world.sql @@ -0,0 +1,14 @@ +SET @FAMILY_MASK_0 := 0 | 0x00000100 | 0x20000000 | 0x00000008 | 0x00010000; +SET @FAMILY_MASK_1 := 0 | 0x00000080 | 0x00000010; +SET @FAMILY_MASK_2 := 0 | 0x00008000; +SET @PROC_FLAGS := 0 | 0x00010000 | 0x00004000 | 0x00000400; + +DELETE FROM `spell_proc` WHERE `SpellId`= 74434; +INSERT INTO `spell_proc` (`SpellId`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `Cooldown`, `Charges`, `Chance`) VALUES +(74434, 5, @FAMILY_MASK_0, @FAMILY_MASK_1, @FAMILY_MASK_2, @PROC_FLAGS, 7, 1, 0, 0, 0, 1, 100); + +DELETE FROM `spell_script_names` WHERE `ScriptName`= 'spell_warl_soulburn'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(74434, 'spell_warl_soulburn'); + +UPDATE `spell_proc` SET `AttributesMask`= 16 | 32 WHERE `SpellId`= 27243; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 6e212a87cda..6f41011cde1 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -5188,6 +5188,13 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); }); + // Soulburn: Seed of Corruption + ApplySpellFix({ 86664 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].Effect = SPELL_EFFECT_APPLY_AURA; + spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_DUMMY; + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 2939b3efcfe..c75d40795d5 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -38,6 +38,7 @@ enum WarlockSpells SPELL_WARLOCK_AFTERMATH_STUN = 85387, SPELL_WARLOCK_BANE_OF_DOOM_EFFECT = 18662, SPELL_WARLOCK_CREATE_HEALTHSTONE = 34130, + SPELL_WARLOCK_CORRUPTION_TRIGGERED = 87389, SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT = 18662, SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST = 62388, SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON = 48018, @@ -55,7 +56,6 @@ enum WarlockSpells SPELL_WARLOCK_DRAIN_LIFE = 689, SPELL_WARLOCK_DRAIN_LIFE_HEAL = 89653, SPELL_WARLOCK_DRAIN_LIFE_SOULBURN = 89420, - SPELL_WARLOCK_SOULBURN_DRAIN_LIFE = 74434, SPELL_WARLOCK_FEL_ARMOR_HEAL = 96379, SPELL_WARLOCK_FEL_SYNERGY_HEAL = 54181, SPELL_WARLOCK_GLYPH_OF_SHADOWFLAME = 63311, @@ -64,6 +64,7 @@ enum WarlockSpells SPELL_WARLOCK_GLYPH_OF_SUCCUBUS = 56250, SPELL_WARLOCK_HAUNT = 48181, SPELL_WARLOCK_HAUNT_HEAL = 48210, + SPELL_WARLOCK_HEALTHSTONE = 6262, SPELL_WARLOCK_IMMOLATE = 348, SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1 = 60955, SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2 = 60956, @@ -77,9 +78,16 @@ enum WarlockSpells SPELL_WARLOCK_NETHER_TALENT = 91713, SPELL_WARLOCK_RAIN_OF_FIRE = 42223, SPELL_WARLOCK_SHADOW_TRANCE = 17941, - SPELL_WARLOCK_SEED_OF_CORRUPTION_TRIGGERED = 27285, + SPELL_WARLOCK_SEARING_PAIN = 5676, + SPELL_WARLOCK_SEED_OF_CORRUPTION = 27243, + SPELL_WARLOCK_SEED_OF_CORRUPTION_TRIGGERED = 87385, + SPELL_WARLOCK_SEED_OF_CORRUPTION_VISUAL = 37826, SPELL_WARLOCK_SIPHON_LIFE_HEAL = 63106, SPELL_WARLOCK_SHADOW_WARD = 6229, + SPELL_WARLOCK_SOULBURN_HEALTHSTONE = 79437, + SPELL_WARLOCK_SOULBURN_DEMONIC_CIRCLE = 79438, + SPELL_WARLOCK_SOULBURN_SEARING_PAIN = 79440, + SPELL_WARLOCK_SOULBURN_DUMMY_SEED_OF_CORRUPTION = 93313, SPELL_WARLOCK_SOUL_HARVEST_ENERGIZE = 101977, SPELL_WARLOCK_SOUL_SHARD = 87388, SPELL_WARLOCK_SOUL_SHARD_ENERGIZE = 95810, @@ -98,6 +106,7 @@ enum WarlockSpellIcons WARLOCK_ICON_ID_MANA_FEED = 1982, WARLOCK_ICON_ID_DEATHS_EMBRACE = 3223, WARLOCK_ICON_ID_SOUL_SIPHON = 5001, + WARLOCK_ICON_ID_SOULBURN_SEED_OF_CORRUPTION = 1932 }; enum WarlockSkillIds @@ -1028,14 +1037,30 @@ class spell_warl_seed_of_corruption : public AuraScript bool Validate(SpellInfo const* /*spellInfo*/) override { - return ValidateSpellInfo({ SPELL_WARLOCK_SEED_OF_CORRUPTION_TRIGGERED }); + return ValidateSpellInfo( + { + SPELL_WARLOCK_SEED_OF_CORRUPTION_TRIGGERED, + SPELL_WARLOCK_SEED_OF_CORRUPTION_VISUAL, + SPELL_WARLOCK_SOUL_SHARD + }); } void OnAuraRemoveHandler(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { + Unit* caster = GetCaster(); + if (!caster) + return; + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH) - if (Unit* caster = GetCaster()) - caster->CastSpell(GetTarget(), SPELL_WARLOCK_SEED_OF_CORRUPTION_TRIGGERED, true, nullptr, aurEff); + { + caster->CastSpell(GetTarget(), SPELL_WARLOCK_SEED_OF_CORRUPTION_TRIGGERED, true, nullptr, aurEff); + caster->CastSpell(GetTarget(), SPELL_WARLOCK_SEED_OF_CORRUPTION_VISUAL, true, nullptr, aurEff); + + //if (AuraEffect* dummy = caster->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_SOULBURN_SEED_OF_CORRUPTION, EFFECT_0)) + // caster->CastSpell(caster, SPELL_WARLOCK_SOUL_SHARD, true, nullptr, aurEff); + } + // else if (AuraEffect* dummy = caster->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_SOULBURN_SEED_OF_CORRUPTION, EFFECT_0)) + //caster->CastSpell(target, SPELL_WARLOCK_CORRUPTION_TRIGGERED, true, nullptr, aurEff); } void Register() override @@ -1446,18 +1471,10 @@ class spell_warl_drain_life : public SpellScriptLoader return ValidateSpellInfo( { SPELL_WARLOCK_DRAIN_LIFE_HEAL, - SPELL_WARLOCK_DRAIN_LIFE_SOULBURN, - SPELL_WARLOCK_SOULBURN_DRAIN_LIFE + SPELL_WARLOCK_DRAIN_LIFE_SOULBURN }); } - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetSpellInfo()->Id == SPELL_WARLOCK_DRAIN_LIFE_SOULBURN) - if (Unit* caster = GetCaster()) - caster->RemoveAurasDueToSpell(SPELL_WARLOCK_SOULBURN_DRAIN_LIFE); - } - void HandlePeriodic(AuraEffect const* aurEff) { if (Unit* caster = GetCaster()) @@ -1477,7 +1494,6 @@ class spell_warl_drain_life : public SpellScriptLoader void Register() { - OnEffectApply += AuraEffectApplyFn(spell_warl_drain_life_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_drain_life_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); } }; @@ -1644,6 +1660,73 @@ class spell_warl_soul_harvest : public AuraScript } }; +// 74434 - Soulburn +class spell_warl_soulburn : public AuraScript +{ + PrepareAuraScript(spell_warl_soulburn); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_WARLOCK_SOULBURN_HEALTHSTONE, + SPELL_WARLOCK_SOULBURN_SEARING_PAIN, + SPELL_WARLOCK_SOULBURN_DEMONIC_CIRCLE, + SPELL_WARLOCK_SOULBURN_DUMMY_SEED_OF_CORRUPTION, + SPELL_WARLOCK_HEALTHSTONE, + SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT, + SPELL_WARLOCK_SEARING_PAIN, + SPELL_WARLOCK_SEED_OF_CORRUPTION + }); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + Unit* target = GetTarget(); + target->RemoveAurasDueToSpell(SPELL_WARLOCK_SOULBURN_DUMMY_SEED_OF_CORRUPTION); + + SpellInfo const* spell = eventInfo.GetSpellInfo(); + if (!spell) + return; + + switch (spell->Id) + { + case SPELL_WARLOCK_HEALTHSTONE: + target->CastSpell(target, SPELL_WARLOCK_SOULBURN_HEALTHSTONE, true, nullptr, aurEff); + break; + case SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT: + target->CastSpell(target, SPELL_WARLOCK_SOULBURN_DEMONIC_CIRCLE, true, nullptr, aurEff); + break; + case SPELL_WARLOCK_SEARING_PAIN: + target->CastSpell(target, SPELL_WARLOCK_SOULBURN_SEARING_PAIN, true, nullptr, aurEff); + break; + case SPELL_WARLOCK_SEED_OF_CORRUPTION: + // todo: handle me + break; + default: + break; + } + } + + void HandleSeedOfCorruptionDummyApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (AuraEffect* dummy = GetTarget()->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_SOULBURN_SEED_OF_CORRUPTION, EFFECT_0)) + GetTarget()->CastSpell(GetTarget(), SPELL_WARLOCK_SOULBURN_DUMMY_SEED_OF_CORRUPTION); + } + + void HandleSeedOfCorruptionDummyRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_WARLOCK_SOULBURN_DUMMY_SEED_OF_CORRUPTION); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_warl_soulburn::HandleProc, EFFECT_0, SPELL_AURA_ADD_PCT_MODIFIER); + AfterEffectApply += AuraEffectApplyFn(spell_warl_soulburn::HandleSeedOfCorruptionDummyApply, EFFECT_0, SPELL_AURA_ADD_PCT_MODIFIER, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_warl_soulburn::HandleSeedOfCorruptionDummyRemove, EFFECT_0, SPELL_AURA_ADD_PCT_MODIFIER, AURA_EFFECT_HANDLE_REAL); + } +}; + void AddSC_warlock_spell_scripts() { new spell_warl_aftermath(); @@ -1673,6 +1756,7 @@ void AddSC_warlock_spell_scripts() RegisterAuraScript(spell_warl_seed_of_corruption); new spell_warl_shadow_trance_proc(); new spell_warl_shadow_ward(); + RegisterAuraScript(spell_warl_soulburn); RegisterAuraScript(spell_warl_soul_harvest); new spell_warl_soul_leech(); new spell_warl_soul_swap();