aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorCristian Vintila <127750549+cristianvnt@users.noreply.github.com>2026-01-06 23:18:26 +0200
committerGitHub <noreply@github.com>2026-01-06 22:18:26 +0100
commiteafa223270fcf776bd17f1f9dc31a1c594d0119c (patch)
tree614c33d4e5af5c78a7f1efc1e97b445060b06753 /src/server
parent1db1a0e57f2cec54dd59e339f731695d16261f3e (diff)
Scripts/Spells: Implement priest talent Divine Words (#31462)
Diffstat (limited to 'src/server')
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp116
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);