From 0c55679f9f0bb2a9bee6d37dedce347e194e4237 Mon Sep 17 00:00:00 2001 From: Ovalord <1Don7H4v3@m41L.com> Date: Mon, 8 Jan 2018 16:10:00 +0100 Subject: [PATCH] Core/Spells: fixed Dark Transformation and Ghoul spells --- .../4.3.4/custom_2018_01_08_01_world.sql | 18 +++ src/server/scripts/Pet/pet_dk.cpp | 93 ++++++++++++ src/server/scripts/Spells/spell_dk.cpp | 133 ++++++++++++++++++ 3 files changed, 244 insertions(+) create mode 100644 sql/updates/world/4.3.4/custom_2018_01_08_01_world.sql diff --git a/sql/updates/world/4.3.4/custom_2018_01_08_01_world.sql b/sql/updates/world/4.3.4/custom_2018_01_08_01_world.sql new file mode 100644 index 00000000000..5c8c8661c32 --- /dev/null +++ b/sql/updates/world/4.3.4/custom_2018_01_08_01_world.sql @@ -0,0 +1,18 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_pet_ghoul_dummy_ability', +'spell_dk_shadow_infusion', +'spell_dk_dark_transformation', +'spell_dk_dark_transformation_aura'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(47481, 'spell_pet_ghoul_dummy_ability'), +(47482, 'spell_pet_ghoul_dummy_ability'), +(47468, 'spell_pet_ghoul_dummy_ability'), +(47484, 'spell_pet_ghoul_dummy_ability'), +(-48965, 'spell_dk_shadow_infusion'), +(63560, 'spell_dk_dark_transformation'), +(93426, 'spell_dk_dark_transformation_aura'); + +DELETE FROM `spell_proc` WHERE `SpellId`= -48965; +INSERT INTO `spell_proc` (`SpellID`, `SchoolMask`, `SpellFamilyName`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`) VALUES +(-48965, 32, 15, 0x00010000 | 0x00004000, 7, 1, 12287); diff --git a/src/server/scripts/Pet/pet_dk.cpp b/src/server/scripts/Pet/pet_dk.cpp index dacca30c514..d94a005540a 100644 --- a/src/server/scripts/Pet/pet_dk.cpp +++ b/src/server/scripts/Pet/pet_dk.cpp @@ -137,8 +137,101 @@ class npc_pet_dk_guardian : public CreatureScript } }; +enum GhoulSpells +{ + // Dark Transformation + SPELL_PET_DARK_TRANSFORMATION = 63560, + + // Gnaw + SPELL_PET_GNAW_DUMMY = 47481, + SPELL_PET_GNAW_DAMAGE = 91800, + SPELL_PET_MONSTROUS_BLOW = 91797, + + // Leap + SPELL_PET_LEAP_DUMMY = 47482, + SPELL_PET_LEAP_EFFECT = 91809, + SPELL_PET_SHAMBLING_RUSH = 91802, + + // Claw + SPELL_PET_CLAW_DUMMY = 47468, + SPELL_PET_CLAW_DAMAGE = 91776, + SPELL_PET_SWEEPING_CLAWS = 91778, + + // Huddle + SPELL_PET_HUDDLE_DUMMY = 47484, + SPELL_PET_HUDDLE_EFFECT = 91838, + SPELL_PET_PUTRID_BULWARK = 91837, +}; + +class spell_pet_ghoul_dummy_ability : public SpellScriptLoader +{ +public: + spell_pet_ghoul_dummy_ability() : SpellScriptLoader("spell_pet_ghoul_dummy_ability") { } + + class spell_pet_ghoul_dummy_ability_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pet_ghoul_dummy_ability_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_PET_DARK_TRANSFORMATION, + SPELL_PET_GNAW_DUMMY, + SPELL_PET_GNAW_DAMAGE, + SPELL_PET_MONSTROUS_BLOW, + SPELL_PET_LEAP_DUMMY, + SPELL_PET_LEAP_EFFECT, + SPELL_PET_SHAMBLING_RUSH, + SPELL_PET_CLAW_DUMMY, + SPELL_PET_CLAW_DAMAGE, + SPELL_PET_SWEEPING_CLAWS, + SPELL_PET_HUDDLE_DUMMY, + SPELL_PET_HUDDLE_EFFECT, + SPELL_PET_PUTRID_BULWARK + }); + } + + void HandleHit(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + { + bool isTransformed = caster->HasAura(SPELL_PET_DARK_TRANSFORMATION); + switch (GetSpellInfo()->Id) + { + case SPELL_PET_GNAW_DUMMY: + caster->CastSpell(GetHitUnit(), isTransformed ? SPELL_PET_MONSTROUS_BLOW : SPELL_PET_GNAW_DAMAGE, true); + break; + case SPELL_PET_LEAP_DUMMY: + caster->CastSpell(GetHitUnit(), isTransformed ? SPELL_PET_SHAMBLING_RUSH : SPELL_PET_LEAP_EFFECT, true); + break; + case SPELL_PET_CLAW_DUMMY: + caster->CastSpell(GetHitUnit(), isTransformed ? SPELL_PET_SWEEPING_CLAWS : SPELL_PET_CLAW_DAMAGE, true); + break; + case SPELL_PET_HUDDLE_DUMMY: + caster->CastSpell(GetHitUnit(), isTransformed ? SPELL_PET_PUTRID_BULWARK : SPELL_PET_HUDDLE_EFFECT, true); + break; + default: + break; + } + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_pet_ghoul_dummy_ability_SpellScript::HandleHit, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_pet_ghoul_dummy_ability_SpellScript(); + } +}; + void AddSC_deathknight_pet_scripts() { new npc_pet_dk_ebon_gargoyle(); new npc_pet_dk_guardian(); + new spell_pet_ghoul_dummy_ability(); } diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index e00681f3e91..0b65b009ce6 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -22,6 +22,7 @@ */ #include "Player.h" +#include "Pet.h" #include "ScriptMgr.h" #include "SpellScript.h" #include "SpellAuraEffects.h" @@ -41,7 +42,9 @@ enum DeathKnightSpells SPELL_DK_BLOOD_SHIELD_ABSORB = 77535, SPELL_DK_BUTCHERY = 50163, SPELL_DK_CORPSE_EXPLOSION_TRIGGERED = 43999, + SPELL_DK_DARK_TRANSFORMATION_DUMMY = 93426, SPELL_DK_DEATH_AND_DECAY_DAMAGE = 52212, + SPELL_DK_DEATH_COIL = 47541, SPELL_DK_DEATH_COIL_DAMAGE = 47632, SPELL_DK_DEATH_COIL_HEAL = 47633, SPELL_DK_DEATH_GRIP = 49560, @@ -64,6 +67,7 @@ enum DeathKnightSpells SPELL_DK_RUNE_TAP = 48982, SPELL_DK_SCENT_OF_BLOOD = 50422, SPELL_DK_SCOURGE_STRIKE_TRIGGERED = 70890, + SPELL_DK_SHADOW_INFUSION = 91342, SPELL_DK_UNHOLY_PRESENCE = 48265, SPELL_DK_PESTILENCE_REDUCED_DOTS = 76243, SPELL_DK_PESTILENCE_VISUAL = 91939, @@ -1521,6 +1525,132 @@ public: } }; +// -48965 - Shadow Infusion +class spell_dk_shadow_infusion : public SpellScriptLoader +{ + public: + spell_dk_shadow_infusion() : SpellScriptLoader("spell_dk_shadow_infusion") { } + + class spell_dk_shadow_infusion_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_shadow_infusion_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_DK_SHADOW_INFUSION, + SPELL_DK_DARK_TRANSFORMATION_DUMMY, + SPELL_DK_DEATH_COIL + }); + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetProcSpell()->GetSpellInfo()->Id == SPELL_DK_DEATH_COIL; + } + + void HandleEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + if (Unit* caster = GetCaster()) + if (Player* petOwner = caster->ToPlayer()) + if (Pet* pet = petOwner->GetPet()) + if (Aura* aura = pet->GetAura(SPELL_DK_SHADOW_INFUSION)) + if (aura->GetStackAmount() == 4) + caster->CastSpell(caster, SPELL_DK_DARK_TRANSFORMATION_DUMMY, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_dk_shadow_infusion_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dk_shadow_infusion_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_shadow_infusion_AuraScript(); + } +}; + +// 63560 - Dark Transformation +class spell_dk_dark_transformation : public SpellScriptLoader +{ + public: + spell_dk_dark_transformation() : SpellScriptLoader("spell_dk_dark_transformation") { } + + class spell_dk_dark_transformation_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_dark_transformation_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_DK_SHADOW_INFUSION, + SPELL_DK_DARK_TRANSFORMATION_DUMMY, + }); + } + + void HandleLaunch(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + { + caster->RemoveAurasDueToSpell(SPELL_DK_DARK_TRANSFORMATION_DUMMY); + if (Player* petOwner = caster->ToPlayer()) + if (Pet* pet = petOwner->GetPet()) + pet->RemoveAurasDueToSpell(SPELL_DK_SHADOW_INFUSION); + } + } + + void Register() override + { + OnEffectLaunchTarget += SpellEffectFn(spell_dk_dark_transformation_SpellScript::HandleLaunch, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_dk_dark_transformation_SpellScript(); + } +}; + +// 93426 - Dark Transformation +class spell_dk_dark_transformation_aura : public SpellScriptLoader +{ + public: + spell_dk_dark_transformation_aura() : SpellScriptLoader("spell_dk_dark_transformation_aura") { } + + class spell_dk_dark_transformation_aura_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_dark_transformation_aura_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DK_SHADOW_INFUSION }); + } + + void HandlePeriodic(AuraEffect const* aurEff) + { + if (Unit* caster = GetCaster()) + if (Player* player = caster->ToPlayer()) + if (Pet* pet = player->GetPet()) + if (!pet->HasAura(SPELL_DK_SHADOW_INFUSION)) + aurEff->GetBase()->Remove(); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dk_dark_transformation_aura_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_dark_transformation_aura_AuraScript(); + } +}; + void AddSC_deathknight_spell_scripts() { new spell_dk_anti_magic_shell_raid(); @@ -1529,6 +1659,8 @@ void AddSC_deathknight_spell_scripts() new spell_dk_blood_boil(); new spell_dk_blood_gorged(); new spell_dk_butchery(); + new spell_dk_dark_transformation(); + new spell_dk_dark_transformation_aura(); new spell_dk_death_and_decay(); new spell_dk_death_coil(); new spell_dk_death_gate(); @@ -1547,6 +1679,7 @@ void AddSC_deathknight_spell_scripts() new spell_dk_raise_dead(); new spell_dk_rune_tap_party(); new spell_dk_scent_of_blood(); + new spell_dk_shadow_infusion(); new spell_dk_scourge_strike(); new spell_dk_vampiric_blood(); new spell_dk_will_of_the_necropolis();