From 86dca48ed91838e025a28f35954f8d1c29a7062b Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Tue, 26 Jun 2018 18:24:52 +0200 Subject: [PATCH] Core/Spells: fixed Shadow Orbs and Shadow Orb Power mastery --- .../world/4.3.4/2018_06_26_00_world.sql | 15 +++ src/server/scripts/Spells/spell_priest.cpp | 110 ++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 sql/updates/world/4.3.4/2018_06_26_00_world.sql diff --git a/sql/updates/world/4.3.4/2018_06_26_00_world.sql b/sql/updates/world/4.3.4/2018_06_26_00_world.sql new file mode 100644 index 0000000000..ee92d17d6d --- /dev/null +++ b/sql/updates/world/4.3.4/2018_06_26_00_world.sql @@ -0,0 +1,15 @@ +DELETE FROM `spell_proc` WHERE `SpellId` IN (77486, 95740, 77487); +INSERT INTO `spell_proc` (`SpellId`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `ProcsPerMinute`, `Chance`, `Cooldown`, `Charges`) VALUES +(95740, 0, 6, 0x00008000, 0x0, 0x00000440, 0x00050000, 1, 2, 0, 0, 0, 10, 0, 0), +(77486, 0, 6, 0x00008000, 0x0, 0x00000440, 0x00050000, 1, 2, 0, 32, 0, 10, 0, 0), +(77487, 0, 6, 0x00002000, 0x0, 0x00010000, 0x00010000, 1, 1, 0, 0, 0, 100, 0, 0); + +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ( +'spell_pri_shadow_orbs', +'spell_pri_shadow_orb_power', +'spell_pri_shadow_orb'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(95740,'spell_pri_shadow_orbs'), +(77486,'spell_pri_shadow_orb_power'), +(77487,'spell_pri_shadow_orb'); diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index f80f5e438a..d3ac36ad89 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -39,6 +39,7 @@ enum PriestSpells SPELL_PRIEST_DIVINE_AEGIS = 47753, SPELL_PRIEST_DIVINE_TOUCH = 63544, SPELL_PRIEST_ECHO_OF_LIGHT = 77489, + SPELL_PRIEST_EMPOWERED_SHADOW = 95799, SPELL_PRIEST_GLYPH_OF_CIRCLE_OF_HEALING = 55675, SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC = 55677, SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC_HEAL = 56131, @@ -57,6 +58,8 @@ enum PriestSpells SPELL_PRIEST_PENANCE_R1_HEAL = 47757, SPELL_PRIEST_REFLECTIVE_SHIELD_R1 = 33201, SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED = 33619, + SPELL_PRIEST_SHADOW_ORB_MARKER = 93683, + SPELL_PRIEST_SHADOW_ORB_POWER = 77486, SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH = 107903, SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH = 107904, SPELL_PRIEST_SHADOW_WORD_DEATH = 32409, @@ -1224,6 +1227,113 @@ class spell_pri_echo_of_light : public SpellScriptLoader } }; +// 95740 - Shadow Orbs (Passive) +class spell_pri_shadow_orbs : public AuraScript +{ + PrepareAuraScript(spell_pri_shadow_orbs); + + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo( + { + SPELL_PRIEST_SHADOW_ORB_POWER, + spellInfo->Effects[EFFECT_0].TriggerSpell + }); + } + + bool CheckProc(ProcEventInfo& /*eventInfo*/) + { + // Do not proc when the target has Shadow Orb Power mastery active + if (GetTarget()->HasAura(SPELL_PRIEST_SHADOW_ORB_POWER)) + return false; + + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->CastSpell(GetTarget(), GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_pri_shadow_orbs::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_pri_shadow_orbs::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } +}; + +// 77486 - Shadow Orb Power (Passive) +class spell_pri_shadow_orb_power : public AuraScript +{ + PrepareAuraScript(spell_pri_shadow_orb_power); + + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo({ spellInfo->Effects[EFFECT_0].TriggerSpell }); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + int32 amount = GetEffect(EFFECT_0)->GetAmount(); + + if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(GetSpellInfo()->Effects[EFFECT_0].TriggerSpell)) + amount += spell->Effects[EFFECT_0].BasePoints; + + GetTarget()->CastCustomSpell(GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, SPELLVALUE_BASE_POINT0, amount, GetTarget(), true, nullptr, aurEff); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pri_shadow_orb_power::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } +}; + +// 77487 - Shadow Orb +class spell_pri_shadow_orb : public AuraScript +{ + PrepareAuraScript(spell_pri_shadow_orb); + + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo( + { + SPELL_PRIEST_SHADOW_ORB_MARKER, + SPELL_PRIEST_EMPOWERED_SHADOW + }); + } + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetStackAmount() == GetSpellInfo()->StackAmount) + GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_SHADOW_ORB_MARKER, true); + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_PRIEST_SHADOW_ORB_MARKER); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + + Unit* target = GetTarget(); + int32 bp = aurEff->GetAmount(); + target->CastCustomSpell(target, SPELL_PRIEST_EMPOWERED_SHADOW, &bp, &bp, 0, true, nullptr, aurEff); + target->RemoveAurasDueToSpell(SPELL_PRIEST_SHADOW_ORB_MARKER); + Remove(); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_pri_shadow_orb::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + AfterEffectRemove += AuraEffectRemoveFn(spell_pri_shadow_orb::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectProc += AuraEffectProcFn(spell_pri_shadow_orb::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } +}; + void AddSC_priest_spell_scripts() { new spell_pri_body_and_soul();