Scripts/Spells: Implement priest talent Divine Words (#31462)

This commit is contained in:
Cristian Vintila
2026-01-06 23:18:26 +02:00
committed by GitHub
parent 1db1a0e57f
commit eafa223270
2 changed files with 125 additions and 8 deletions

View File

@@ -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);