From 596341c0cc259116367ec49bc8c35a970880d2f9 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Mon, 9 Jul 2018 22:12:10 +0200 Subject: [PATCH] Core/Spells: fixed Chakra spells --- .../custom/custom_2018_07_09_03_world.sql | 18 +++ src/server/scripts/Spells/spell_priest.cpp | 108 ++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 sql/updates/world/custom/custom_2018_07_09_03_world.sql diff --git a/sql/updates/world/custom/custom_2018_07_09_03_world.sql b/sql/updates/world/custom/custom_2018_07_09_03_world.sql new file mode 100644 index 00000000000..8cfbe9b6644 --- /dev/null +++ b/sql/updates/world/custom/custom_2018_07_09_03_world.sql @@ -0,0 +1,18 @@ + +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_pri_charkra', +'spell_pri_charkra_sanctuary', +'spell_pri_chakra_serenity'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(14751, 'spell_pri_charkra'), +(81206, 'spell_pri_charkra_sanctuary'), +(81585, 'spell_pri_chakra_serenity'); + +SET @FAMILYMASK0 := 0x00000400 | 0x00000800 | 0x00001000 | 0x00000200 | 0x00000080; +SET @FAMILYMASK1 := 0x00000004 | 0x00000020; +SET @FAMILYMASK2 := 0x00010000 | 0x00000000; + +DELETE FROM `spell_proc` WHERE `SpellId`= 14751; +INSERT INTO `spell_proc` (`SpellId`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `Cooldown`, `Charges`, `Chance`) VALUES +(14751, 6, @FAMILYMASK0, @FAMILYMASK1, @FAMILYMASK2, 0, 2, 1, 0, 0, 0, 1, 100); diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index ea0a212e9ff..84333dbfb22 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -33,6 +33,10 @@ enum PriestSpells SPELL_PRIEST_ABSOLUTION = 33167, SPELL_PRIEST_BODY_AND_SOUL_DISPEL = 64136, SPELL_PRIEST_BODY_AND_SOUL_SPEED = 65081, + SPELL_PRIEST_CHAKRA_SERENITY = 81208, + SPELL_PRIEST_CHAKRA_SANCTUARY = 81206, + SPELL_PRIEST_CHAKRA_SANCTUARY_LINKED = 81207, + SPELL_PRIEST_CHAKRA_CHASTISE = 81209, SPELL_PRIEST_CURE_DISEASE = 528, SPELL_PRIEST_DISPEL_MAGIC_FRIENDLY = 97690, SPELL_PRIEST_DISPEL_MAGIC_HOSTILE = 97691, @@ -58,6 +62,7 @@ enum PriestSpells SPELL_PRIEST_PENANCE_R1_HEAL = 47757, SPELL_PRIEST_REFLECTIVE_SHIELD_R1 = 33201, SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED = 33619, + SPELL_PRIEST_RENEW = 139, SPELL_PRIEST_SHADOW_ORB_MARKER = 93683, SPELL_PRIEST_SHADOW_ORB_POWER = 77486, SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH = 107903, @@ -1334,9 +1339,112 @@ class spell_pri_shadow_orb : public AuraScript } }; +// 14751 - Chakra +class spell_pri_charkra : public AuraScript +{ + PrepareAuraScript(spell_pri_charkra); + + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo( + { + SPELL_PRIEST_CHAKRA_SERENITY, + SPELL_PRIEST_CHAKRA_SANCTUARY, + SPELL_PRIEST_CHAKRA_SANCTUARY_LINKED, + SPELL_PRIEST_CHAKRA_CHASTISE + }); + } + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* target = GetTarget()) + { + target->RemoveAurasDueToSpell(SPELL_PRIEST_CHAKRA_SERENITY); + target->RemoveAurasDueToSpell(SPELL_PRIEST_CHAKRA_SANCTUARY); + target->RemoveAurasDueToSpell(SPELL_PRIEST_CHAKRA_CHASTISE); + } + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + + uint32 spellId = 0; + if (SpellInfo const* spell = eventInfo.GetSpellInfo()) + { + // Chakra: Serenity + if (spell->SpellFamilyFlags.HasFlag(0x00000400) || spell->SpellFamilyFlags.HasFlag(0x00001000) + || spell->SpellFamilyFlags.HasFlag(0x00000800) || spell->SpellFamilyFlags.HasFlag(0, 0x00000004)) + caster->CastSpell(caster, SPELL_PRIEST_CHAKRA_SERENITY, true, nullptr, aurEff); + + // Chakra: Sanctuary + if (spell->SpellFamilyFlags.HasFlag(0x00000200) || spell->SpellFamilyFlags.HasFlag(0, 0x00000020)) + { + caster->CastSpell(caster, SPELL_PRIEST_CHAKRA_SANCTUARY, true, nullptr, aurEff); + caster->CastSpell(caster, SPELL_PRIEST_CHAKRA_SANCTUARY_LINKED, true, nullptr, aurEff); + } + + // Chakra: Chastise + if (spell->SpellFamilyFlags.HasFlag(0x00000080) || spell->SpellFamilyFlags.HasFlag(0, 0x00010000)) + caster->CastSpell(caster, SPELL_PRIEST_CHAKRA_CHASTISE, true, nullptr, aurEff); + } + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_pri_charkra::HandleEffectApply, EFFECT_0, SPELL_AURA_ADD_FLAT_MODIFIER, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectProc += AuraEffectProcFn(spell_pri_charkra::HandleProc, EFFECT_0, SPELL_AURA_ADD_FLAT_MODIFIER); + } +}; + +class spell_pri_charkra_sanctuary : public AuraScript +{ + PrepareAuraScript(spell_pri_charkra_sanctuary); + + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo({ SPELL_PRIEST_CHAKRA_SANCTUARY_LINKED }); + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_PRIEST_CHAKRA_SANCTUARY_LINKED); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_pri_charkra_sanctuary::HandleEffectRemove, EFFECT_0, SPELL_AURA_ADD_PCT_MODIFIER, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } +}; + +class spell_pri_chakra_serenity : public SpellScript +{ + PrepareSpellScript(spell_pri_chakra_serenity); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_PRIEST_RENEW }); + } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Aura* aura = GetHitUnit()->GetAura(SPELL_PRIEST_RENEW)) + aura->RefreshDuration(); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_pri_chakra_serenity::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_priest_spell_scripts() { new spell_pri_body_and_soul(); + RegisterAuraScript(spell_pri_charkra); + RegisterAuraScript(spell_pri_charkra_sanctuary); + RegisterSpellScript(spell_pri_chakra_serenity); new spell_pri_circle_of_healing(); new spell_pri_dispel_magic(); new spell_pri_divine_aegis();