diff options
-rw-r--r-- | sql/updates/world/master/2021_03_04_00_world_paladin_spells.sql | 49 | ||||
-rw-r--r-- | src/server/game/Spells/SpellScript.h | 2 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_paladin.cpp | 320 |
3 files changed, 268 insertions, 103 deletions
diff --git a/sql/updates/world/master/2021_03_04_00_world_paladin_spells.sql b/sql/updates/world/master/2021_03_04_00_world_paladin_spells.sql new file mode 100644 index 00000000000..1a423ce6c88 --- /dev/null +++ b/sql/updates/world/master/2021_03_04_00_world_paladin_spells.sql @@ -0,0 +1,49 @@ +-- Spell Scripts +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_pal_judgement', + 'spell_pal_zeal', + 'spell_pal_selfless_healer', + 'spell_pal_crusader_might', + 'spell_pal_righteous_protector', + 'spell_pal_moment_of_glory'); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(20271, 'spell_pal_judgement'), -- Judgement Ret (20271) +(275779, 'spell_pal_judgement'), -- Judgement Prot (275779) +(269569, 'spell_pal_zeal'), -- Zeal (269569) +(85804, 'spell_pal_selfless_healer'), -- Selfless Healer (85804) +(196926, 'spell_pal_crusader_might'), -- Cruader's Might (196926) +(204074, 'spell_pal_righteous_protector'), -- Righteous Protector (204074) +(327193, 'spell_pal_moment_of_glory'), -- Moment of Glory (327193) +(267610, 'spell_pal_righteous_verdict'); -- Righteous Verdict (267610) + +-- Spell Procs -- +DELETE FROM `spell_proc` WHERE `SpellId` IN +(269569, -- Zeal (269569) + 269571, -- Zeal (269571) + 326732, -- Empyrean Power (326732) + 326733, -- Empyrean Power (326733) + 85804, -- Selfless Healer (85804) + 114250, -- Selfless Healer (114250) + 280373, -- Redoubt (280373) + 327193, -- Moment of Glory (327193) + 183778, -- Judgment of Light (183778) + 196926, -- Cruader's Might (196926) + 267610 -- Righteous Verdict (267610) +); +INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES +(269569,0,10,0x00800000,0x0,0x0,0x0,0x10,1,2,0x403,0,0,0,0,0,0), -- Zeal (269569), Proc on judgement trigger zeal effect +(269571,1,0,0x0,0x0,0x0,0x0,0x4,1,1,0x403,0x10,14,0,0,0,0), -- Zeal (269571), Proc on auto attack to consume zeal effect +(326732,0,10,0x0,0x00008000,0x0,0x0,0x10,1,2,0x403,0,0,0,15,0,0), -- Empyrean Power (326732), Proc to trigger only on crusader strike +(326733,0,10,0x0,0x00020000,0x0,0x0,0x10,1,2,0x403,0x8,0,0,0,0,0), -- Empyrean Power (326733), Proc to consume Empryean Power (Divine Storm 53385) +(85804,0,10,0x0,0x0,0x0,0x0,0x15510,7,1,0x403,0x4,0,0,0,0,0), -- Selfless Healer (85804), Proc on power spending abilitis +(114250,0,10,0x40000000,0x0,0x0,0x0,0x4000,2,2,0x403,0,0,0,0,0,1), -- Selfless Healer (114250), Proc to consume on Flash of Light (19750) +(280373,0,10,0x0,0x00100000,0x0,0x0,0x10,1,1,0,0,0,0,0,0,0), -- Redoubt (280373), proc to trigge from Shield of the Righteous (53600) +(327193,0,10,0x00004000,0x0,0x0,0x0,0x10000,1,1,0x403,0,0,0,0,0,0), -- Moment of Glory (327193), proc to consume on Avenger's Shield (31935) +(183778,0,10,0x00800000,0x0,0x0,0x0,0x10,1,2,0x403,0,0,0,0,0,0), -- Judgment of Light (183778), proc to trigger from Judgement +(196926,0,10,0x0,0x00008000,0x0,0x0,0x10,1,2,0x403,0,0,0,0,0,0), -- Cruader's Might (196926), proc to trigger from Crusader Strike +(267610,0,10,0x0,0x00001000,0x0,0x0,0x10,1,2,0x403,0,0,0,0,0,0); -- Righteous Verdict (267610), proc to trigger from Templar's Verdict (224266) + +-- Spell Areatriggers -- +DELETE FROM `spell_areatrigger` WHERE (`AreaTriggerId`=9228); +INSERT INTO `spell_areatrigger` (`SpellMiscId`, `AreaTriggerId`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `TimeToTarget`, `TimeToTargetScale`, `VerifiedBuild`) VALUES +(4488, 9228, 0, 0, 0, 0, 0, 0, 0, 0, 12000, 37474); -- for Consecration (26573) diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h index 1c0e5d3aba7..f7afc2b8ec8 100644 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -852,7 +852,7 @@ class TC_GAME_API AuraScript : public _SpellScript // executed when aura effect procs // example: OnEffectProc += AuraEffectProcFn(class::function, EffectIndexSpecifier, EffectAuraNameSpecifier); - // where function is: void function (AuraEffect const* aurEff, ProcEventInfo& procInfo); + // where function is: void function (AuraEffect* aurEff, ProcEventInfo& procInfo); HookList<EffectProcHandler> OnEffectProc; // executed after aura effect proced // example: AfterEffectProc += AuraEffectProcFn(class::function, EffectIndexSpecifier, EffectAuraNameSpecifier); diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index c5c0e01a84a..4cf7d5e5a2c 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -22,9 +22,11 @@ */ #include "ScriptMgr.h" +#include "DB2Stores.h" #include "Group.h" #include "Player.h" #include "Random.h" +#include "Spell.h" #include "SpellAuraEffects.h" #include "SpellHistory.h" #include "SpellMgr.h" @@ -33,7 +35,7 @@ enum PaladinSpells { SPELL_PALADIN_AVENGERS_SHIELD = 31935, - SPELL_PALADIN_AURA_MASTERY_IMMUNE = 64364, + SPELL_PALADIN_AVENGING_WRATH = 31884, SPELL_PALADIN_BEACON_OF_LIGHT = 53563, SPELL_PALADIN_BEACON_OF_LIGHT_HEAL = 53652, SPELL_PALADIN_BLESSING_OF_LOWER_CITY_DRUID = 37878, @@ -55,6 +57,8 @@ enum PaladinSpells SPELL_PALADIN_FINAL_STAND = 204077, SPELL_PALADIN_FINAL_STAND_EFFECT = 204079, SPELL_PALADIN_FORBEARANCE = 25771, + SPELL_PALADIN_GUARDIAN_OF_ANCIENT_KINGS = 86659, + SPELL_PALADIN_HAMMER_OF_JUSTICE = 853, SPELL_PALADIN_HAND_OF_SACRIFICE = 6940, SPELL_PALADIN_HOLY_MENDING = 64891, SPELL_PALADIN_HOLY_POWER_ARMOR = 28790, @@ -66,11 +70,13 @@ enum PaladinSpells SPELL_PALADIN_HOLY_SHOCK_R1_HEALING = 25914, SPELL_PALADIN_IMMUNE_SHIELD_MARKER = 61988, SPELL_PALADIN_ITEM_HEALING_TRANCE = 37706, - SPELL_PALADIN_JUDGEMENT_DAMAGE = 54158, + SPELL_PALADIN_JUDGEMENT_GAIN_HOLY_POWER = 220637, + SPELL_PALADIN_JUDGEMENT_PROT_RET_R3 = 315867, SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT = 31790, - SPELL_PALADIN_SANCTIFIED_WRATH = 57318, - SPELL_PALADIN_SANCTIFIED_WRATH_TALENT_R1 = 53375, - SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS = 25742 + SPELL_PALADIN_RIGHTEOUS_VERDICT_AURA = 267611, + SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS = 25742, + SPELL_PALADIN_TEMPLAR_VERDICT_DAMAGE = 224266, + SPELL_PALADIN_ZEAL_AURA = 269571, }; enum PaladinSpellVisualKit @@ -272,6 +278,27 @@ class spell_pal_blinding_light : public SpellScript } }; +// 196926 - Crusader Might +class spell_pal_crusader_might : public AuraScript +{ + PrepareAuraScript(spell_pal_crusader_might); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_PALADIN_HOLY_SHOCK_R1 }); + } + + void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/) + { + GetTarget()->GetSpellHistory()->ModifyCooldown(SPELL_PALADIN_HOLY_SHOCK_R1, aurEff->GetAmount()); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_crusader_might::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); + } +}; + // 642 - Divine Shield class spell_pal_divine_shield : public SpellScript { @@ -374,33 +401,53 @@ class spell_pal_divine_storm : public SpellScript bool Validate(SpellInfo const* /*spellInfo*/) override { - return ValidateSpellInfo({ SPELL_PALADIN_DIVINE_STORM_DAMAGE }); + return sSpellVisualKitStore.HasRecord(PALADIN_VISUAL_KIT_DIVINE_STORM); } void HandleOnCast() { - Unit* caster = GetCaster(); - caster->SendPlaySpellVisualKit(PALADIN_VISUAL_KIT_DIVINE_STORM, 0, 0); + GetCaster()->SendPlaySpellVisualKit(PALADIN_VISUAL_KIT_DIVINE_STORM, 0, 0); } - void HandleDummy(SpellEffIndex /* effIndex */) + void Register() override { - Unit* caster = GetCaster(); - Unit* target = GetHitUnit(); - if (!target) - return; + OnCast += SpellCastFn(spell_pal_divine_storm::HandleOnCast); + } +}; - caster->CastSpell(target, SPELL_PALADIN_DIVINE_STORM_DAMAGE, true); +// 234299 - Fist of Justice +class spell_pal_fist_of_justice : public AuraScript +{ + PrepareAuraScript(spell_pal_fist_of_justice); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_PALADIN_HAMMER_OF_JUSTICE }); + } + + bool CheckEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + if (Spell const* procSpell = eventInfo.GetProcSpell()) + return procSpell->HasPowerTypeCost(POWER_HOLY_POWER); + + return false; + } + + void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& /*procInfo*/) + { + int32 value = aurEff->GetAmount() / 10; + + GetTarget()->GetSpellHistory()->ModifyCooldown(SPELL_PALADIN_HAMMER_OF_JUSTICE, -value); } void Register() override { - OnCast += SpellCastFn(spell_pal_divine_storm::HandleOnCast); - OnEffectHitTarget += SpellEffectFn(spell_pal_divine_storm::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + DoCheckEffectProc += AuraCheckEffectProcFn(spell_pal_fist_of_justice::CheckEffectProc, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectProc += AuraEffectProcFn(spell_pal_fist_of_justice::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); } }; -// -75806 - Grand Crusader +// -85043 - Grand Crusader class spell_pal_grand_crusader : public SpellScriptLoader { public: @@ -511,6 +558,50 @@ class spell_pal_hand_of_sacrifice : public SpellScriptLoader } }; +// 327193 - Moment of Glory +class spell_pal_moment_of_glory : public SpellScript +{ + PrepareSpellScript(spell_pal_moment_of_glory); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_PALADIN_AVENGERS_SHIELD }); + } + + void HandleOnHit() + { + GetCaster()->GetSpellHistory()->ResetCooldown(SPELL_PALADIN_AVENGERS_SHIELD); + } + + void Register() override + { + OnHit += SpellHitFn(spell_pal_moment_of_glory::HandleOnHit); + } +}; + +// 20271/275779 - Judgement Ret/Prot +class spell_pal_judgement : public SpellScript +{ + PrepareSpellScript(spell_pal_judgement); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_PALADIN_JUDGEMENT_PROT_RET_R3, SPELL_PALADIN_JUDGEMENT_GAIN_HOLY_POWER }); + } + + void HandleOnHit() + { + Unit* caster = GetCaster(); + if (caster->HasSpell(SPELL_PALADIN_JUDGEMENT_PROT_RET_R3)) + caster->CastSpell(caster, SPELL_PALADIN_JUDGEMENT_GAIN_HOLY_POWER, TRIGGERED_FULL_MASK); + } + + void Register() override + { + OnHit += SpellHitFn(spell_pal_judgement::HandleOnHit); + } +}; + // 20473 - Holy Shock class spell_pal_holy_shock : public SpellScript { @@ -643,56 +734,6 @@ class spell_pal_item_t6_trinket : public AuraScript } }; -// 20271 - Judgement -/// Updated 4.3.4 -class spell_pal_judgement : public SpellScriptLoader -{ - public: - spell_pal_judgement() : SpellScriptLoader("spell_pal_judgement") { } - - class spell_pal_judgement_SpellScript : public SpellScript - { - PrepareSpellScript(spell_pal_judgement_SpellScript); - - private: - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_PALADIN_JUDGEMENT_DAMAGE }); - } - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - uint32 spellId = SPELL_PALADIN_JUDGEMENT_DAMAGE; - - // some seals have SPELL_AURA_DUMMY in EFFECT_2 - Unit::AuraEffectList const& auras = GetCaster()->GetAuraEffectsByType(SPELL_AURA_DUMMY); - for (Unit::AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i) - { - if ((*i)->GetSpellInfo()->GetSpellSpecific() == SPELL_SPECIFIC_SEAL && (*i)->GetEffIndex() == EFFECT_2) - { - if (sSpellMgr->GetSpellInfo((*i)->GetAmount(), GetCastDifficulty())) - { - spellId = (*i)->GetAmount(); - break; - } - } - } - - GetCaster()->CastSpell(GetHitUnit(), spellId, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_pal_judgement_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_pal_judgement_SpellScript(); - } -}; - // 633 - Lay on Hands class spell_pal_lay_on_hands : public SpellScript { @@ -794,57 +835,101 @@ class spell_pal_light_s_beacon : public SpellScriptLoader } }; -// 85256 - Templar's Verdict -/// Updated 4.3.4 -class spell_pal_templar_s_verdict : public SpellScript +// 204074 - Righteous Protector +class spell_pal_righteous_protector : public AuraScript { - PrepareSpellScript(spell_pal_templar_s_verdict); + PrepareAuraScript(spell_pal_righteous_protector); - bool Validate (SpellInfo const* /*spellEntry*/) override + bool Validate(SpellInfo const* /*spellInfo*/) override { - return ValidateSpellInfo({ SPELL_PALADIN_DIVINE_PURPOSE_PROC }); + return ValidateSpellInfo({ SPELL_PALADIN_AVENGING_WRATH, SPELL_PALADIN_GUARDIAN_OF_ANCIENT_KINGS }); } - bool Load() override + bool CheckEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { - if (GetCaster()->GetTypeId() != TYPEID_PLAYER) - return false; + if (SpellInfo const* procSpell = eventInfo.GetSpellInfo()) + _baseHolyPowerCost = procSpell->CalcPowerCost(POWER_HOLY_POWER, false, eventInfo.GetActor(), eventInfo.GetSchoolMask()); + else + _baseHolyPowerCost.reset(); - if (GetCaster()->ToPlayer()->getClass() != CLASS_PALADIN) - return false; + return _baseHolyPowerCost.is_initialized(); + } - return true; + void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/) + { + int32 value = aurEff->GetAmount() * 100 * _baseHolyPowerCost->Amount; + + GetTarget()->GetSpellHistory()->ModifyCooldown(SPELL_PALADIN_AVENGING_WRATH, -value); + GetTarget()->GetSpellHistory()->ModifyCooldown(SPELL_PALADIN_GUARDIAN_OF_ANCIENT_KINGS, -value); } - void ChangeDamage(SpellEffIndex /*effIndex*/) + void Register() override { - Unit* caster = GetCaster(); - int32 damage = GetHitDamage(); + DoCheckEffectProc += AuraCheckEffectProcFn(spell_pal_righteous_protector::CheckEffectProc, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectProc += AuraEffectProcFn(spell_pal_righteous_protector::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); + } - if (caster->HasAura(SPELL_PALADIN_DIVINE_PURPOSE_PROC)) - damage *= 7.5; // 7.5*30% = 225% - else - { - switch (caster->GetPower(POWER_HOLY_POWER)) - { - case 0: // 1 Holy Power - // same damage - break; - case 1: // 2 Holy Power - damage *= 3; // 3*30 = 90% - break; - case 2: // 3 Holy Power - damage *= 7.5; // 7.5*30% = 225% - break; - } - } + Optional<SpellPowerCost> _baseHolyPowerCost; +}; + +// 267610 - Righteous Verdict +class spell_pal_righteous_verdict : public AuraScript +{ + PrepareAuraScript(spell_pal_righteous_verdict); + + bool Validate(SpellInfo const* /*spellEntry*/) override + { + return ValidateSpellInfo({ SPELL_PALADIN_RIGHTEOUS_VERDICT_AURA }); + } - SetHitDamage(damage); + void HandleEffectProc(AuraEffect* /*aurEff*/, ProcEventInfo& procInfo) + { + procInfo.GetActor()->CastSpell(procInfo.GetActor(), SPELL_PALADIN_RIGHTEOUS_VERDICT_AURA, true); } void Register() override { - OnEffectHitTarget += SpellEffectFn(spell_pal_templar_s_verdict::ChangeDamage, EFFECT_0, SPELL_EFFECT_WEAPON_PERCENT_DAMAGE); + OnEffectProc += AuraEffectProcFn(spell_pal_righteous_verdict::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); + } +}; + +// 85804 - Selfless Healer +class spell_pal_selfless_healer : public AuraScript +{ + PrepareAuraScript(spell_pal_selfless_healer); + + bool CheckEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + if (Spell const* procSpell = eventInfo.GetProcSpell()) + return procSpell->HasPowerTypeCost(POWER_HOLY_POWER); + + return false; + } + + void Register() override + { + DoCheckEffectProc += AuraCheckEffectProcFn(spell_pal_selfless_healer::CheckEffectProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } +}; + +// 85256 - Templar's Verdict +class spell_pal_templar_s_verdict : public SpellScript +{ + PrepareSpellScript(spell_pal_templar_s_verdict); + + bool Validate(SpellInfo const* /*spellEntry*/) override + { + return ValidateSpellInfo({ SPELL_PALADIN_TEMPLAR_VERDICT_DAMAGE }); + } + + void HandleHitTarget(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetHitUnit(), SPELL_PALADIN_TEMPLAR_VERDICT_DAMAGE, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_pal_templar_s_verdict::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY); } }; @@ -962,25 +1047,56 @@ class spell_pal_t8_2p_bonus : public SpellScriptLoader } }; +// 269569 - Zeal +class spell_pal_zeal : public AuraScript +{ + PrepareAuraScript(spell_pal_zeal); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_PALADIN_ZEAL_AURA }); + } + + void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& /*procInfo*/) + { + Unit* target = GetTarget(); + target->CastCustomSpell(SPELL_PALADIN_ZEAL_AURA, SPELLVALUE_AURA_STACK, aurEff->GetAmount(), target, true); + + PreventDefaultAction(); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_zeal::HandleEffectProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } +}; + void AddSC_paladin_spell_scripts() { //new spell_pal_ardent_defender(); RegisterSpellScript(spell_pal_blessing_of_faith); RegisterSpellScript(spell_pal_blessing_of_protection); RegisterSpellScript(spell_pal_blinding_light); + RegisterAuraScript(spell_pal_crusader_might); RegisterSpellScript(spell_pal_divine_shield); RegisterSpellScript(spell_pal_divine_steed); RegisterSpellScript(spell_pal_divine_storm); + RegisterAuraScript(spell_pal_fist_of_justice); RegisterSpellScript(spell_pal_glyph_of_holy_light); new spell_pal_grand_crusader(); new spell_pal_hand_of_sacrifice(); + RegisterSpellScript(spell_pal_moment_of_glory); + RegisterSpellScript(spell_pal_judgement); RegisterSpellScript(spell_pal_holy_shock); RegisterAuraScript(spell_pal_item_healing_discount); RegisterAuraScript(spell_pal_item_t6_trinket); - new spell_pal_judgement(); RegisterSpellScript(spell_pal_lay_on_hands); new spell_pal_light_s_beacon(); + RegisterAuraScript(spell_pal_righteous_protector); + RegisterAuraScript(spell_pal_righteous_verdict); + RegisterAuraScript(spell_pal_selfless_healer); RegisterSpellScript(spell_pal_templar_s_verdict); new spell_pal_t3_6p_bonus(); new spell_pal_t8_2p_bonus(); + RegisterAuraScript(spell_pal_zeal); } |