diff options
| author | Cristian Vintila <127750549+cristianvnt@users.noreply.github.com> | 2026-01-06 23:18:26 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-01-06 22:18:26 +0100 |
| commit | eafa223270fcf776bd17f1f9dc31a1c594d0119c (patch) | |
| tree | 614c33d4e5af5c78a7f1efc1e97b445060b06753 /src/server | |
| parent | 1db1a0e57f2cec54dd59e339f731695d16261f3e (diff) | |
Scripts/Spells: Implement priest talent Divine Words (#31462)
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/scripts/Spells/spell_priest.cpp | 116 |
1 files changed, 108 insertions, 8 deletions
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index ff4ce39edbd..63e0d8f2137 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -81,6 +81,8 @@ enum PriestSpells SPELL_PRIEST_DIVINE_AEGIS = 47515, SPELL_PRIEST_DIVINE_AEGIS_ABSORB = 47753, SPELL_PRIEST_DIVINE_BLESSING = 40440, + SPELL_PRIEST_DIVINE_FAVOR_CHASTISE = 372761, + SPELL_PRIEST_DIVINE_FAVOR_SERENITY = 372791, SPELL_PRIEST_DIVINE_HYMN_HEAL = 64844, SPELL_PRIEST_DIVINE_IMAGE_SUMMON = 392990, SPELL_PRIEST_DIVINE_IMAGE_EMPOWER = 409387, @@ -92,6 +94,8 @@ enum PriestSpells SPELL_PRIEST_DIVINE_STAR_HOLY_HEAL = 110745, SPELL_PRIEST_DIVINE_STAR_SHADOW_DAMAGE = 390845, SPELL_PRIEST_DIVINE_STAR_SHADOW_HEAL = 390981, + SPELL_PRIEST_DIVINE_WORD_SANCTUARY_AREATRIGGER = 372784, + SPELL_PRIEST_DIVINE_WORD_SANCTUARY_HEAL = 372787, SPELL_PRIEST_DIVINE_WRATH = 40441, SPELL_PRIEST_DIVINITY = 1215241, SPELL_PRIEST_DIVINITY_AURA = 1216314, @@ -1339,6 +1343,107 @@ private: std::vector<ObjectGuid> _affectedUnits; }; +struct spell_pri_holy_words_base +{ + static void ModifyCooldown(Unit* priest, SpellInfo const* spellInfo, Milliseconds cooldownMod) + { + priest->GetSpellHistory()->ModifyCooldown(spellInfo, cooldownMod, true); + } +}; + +// 372760 - Divine Word +class spell_pri_divine_word : public AuraScript +{ + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo + ({ + SPELL_PRIEST_HOLY_WORD_CHASTISE, + SPELL_PRIEST_HOLY_WORD_SANCTIFY, + SPELL_PRIEST_HOLY_WORD_SERENITY, + SPELL_PRIEST_DIVINE_FAVOR_CHASTISE, + SPELL_PRIEST_DIVINE_WORD_SANCTUARY_AREATRIGGER, + SPELL_PRIEST_DIVINE_FAVOR_SERENITY + }) && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } }); + } + + void HandleProc(ProcEventInfo const& procInfo) const + { + Unit* caster = GetTarget(); + switch (procInfo.GetSpellInfo()->Id) + { + case SPELL_PRIEST_HOLY_WORD_CHASTISE: + caster->CastSpell(caster, SPELL_PRIEST_DIVINE_FAVOR_CHASTISE, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .TriggeringSpell = procInfo.GetProcSpell() + }); + spell_pri_holy_words_base::ModifyCooldown(caster, procInfo.GetSpellInfo(), + Seconds(-GetSpellInfo()->GetEffect(EFFECT_1).CalcValue(caster))); + break; + case SPELL_PRIEST_HOLY_WORD_SANCTIFY: + GetCaster()->CastSpell(*procInfo.GetProcSpell()->m_targets.GetDst(), SPELL_PRIEST_DIVINE_WORD_SANCTUARY_AREATRIGGER, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_IGNORE_CAST_TIME, + .TriggeringSpell = procInfo.GetProcSpell() + }); + break; + case SPELL_PRIEST_HOLY_WORD_SERENITY: + caster->CastSpell(caster, SPELL_PRIEST_DIVINE_FAVOR_SERENITY, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .TriggeringSpell = procInfo.GetProcSpell() + }); + break; + default: + break; + } + } + + void Register() override + { + OnProc += AuraProcFn(spell_pri_divine_word::HandleProc); + } +}; + +// 372784 - Divine Word: Sanctuary +class spell_pri_divine_word_sanctuary : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_PRIEST_DIVINE_WORD_SANCTUARY_HEAL }); + } + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) const + { + Unit* caster = GetTarget(); + for (AreaTrigger* at : caster->GetAreaTriggers(GetSpellInfo()->Id)) + caster->CastSpell(at->GetPosition(), SPELL_PRIEST_DIVINE_WORD_SANCTUARY_HEAL); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_pri_divine_word_sanctuary::HandleEffectPeriodic, EFFECT_2, SPELL_AURA_PERIODIC_DUMMY); + } +}; + +// 372787 - Divine Word: Sanctuary +class spell_pri_divine_word_sanctuary_heal : public SpellScript +{ + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } }); + } + + void FilterTargets(std::list<WorldObject*>& targets) const + { + int32 maxTargets = GetEffectInfo(EFFECT_1).CalcValue(GetCaster()); + Trinity::SelectRandomInjuredTargets(targets, maxTargets, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_divine_word_sanctuary_heal::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); + } +}; + // 1215241 - Divinity class spell_pri_divinity : public AuraScript { @@ -1372,14 +1477,6 @@ class spell_pri_divinity : public AuraScript } }; -struct spell_pri_holy_words_base -{ - static void ModifyCooldown(Unit* priest, SpellInfo const* spellInfo, Milliseconds cooldownMod) - { - priest->GetSpellHistory()->ModifyCooldown(spellInfo, cooldownMod, true); - } -}; - // 391339 - Empowered Renew class spell_pri_empowered_renew : public AuraScript { @@ -4579,6 +4676,9 @@ void AddSC_priest_spell_scripts() RegisterSpellScript(spell_pri_divine_service); RegisterSpellScript(spell_pri_divine_star_shadow); RegisterAreaTriggerAI(areatrigger_pri_divine_star); + RegisterSpellScript(spell_pri_divine_word); + RegisterSpellScript(spell_pri_divine_word_sanctuary); + RegisterSpellScript(spell_pri_divine_word_sanctuary_heal); RegisterSpellScript(spell_pri_divinity); RegisterSpellScript(spell_pri_divine_procession); RegisterSpellScript(spell_pri_empowered_renew); |
