diff --git a/sql/updates/world/master/2026_01_06_00_world.sql b/sql/updates/world/master/2026_01_06_00_world.sql new file mode 100644 index 00000000000..803ed99e1f4 --- /dev/null +++ b/sql/updates/world/master/2026_01_06_00_world.sql @@ -0,0 +1,17 @@ +DELETE FROM `areatrigger_template` WHERE `Id`=29620 AND `IsCustom`=0; +INSERT INTO `areatrigger_template` (`Id`,`IsCustom`,`Flags`,`ActionSetId`,`ActionSetFlags`,`VerifiedBuild`) VALUES +(29620,0,0,0,0,64978); + +DELETE FROM `areatrigger_create_properties` WHERE `Id`=25138 AND `IsCustom`=0; +INSERT INTO`areatrigger_create_properties` (`Id`,`IsCustom`,`AreaTriggerId`,`IsAreatriggerCustom`,`Flags`,`MoveCurveId`,`ScaleCurveId`,`MorphCurveId`,`FacingCurveId`,`AnimId`,`AnimKitId`,`DecalPropertiesId`,`SpellForVisuals`,`TimeToTargetScale`,`Speed`,`SpeedIsTime`,`Shape`,`ShapeData0`,`ShapeData1`,`ShapeData2`,`ShapeData3`,`ShapeData4`,`ShapeData5`,`ShapeData6`,`ShapeData7`,`ScriptName`,`VerifiedBuild`) VALUES +(25138,0,29620,0,0,0,0,0,0,-1,0,0,372784,15000,0,0,4,10,10,4,4,0.3,0.3,0,0,'',64978); + +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_pri_divine_word','spell_pri_divine_word_sanctuary','spell_pri_divine_word_sanctuary_heal'); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(372760,'spell_pri_divine_word'), +(372784,'spell_pri_divine_word_sanctuary'), +(372787,'spell_pri_divine_word_sanctuary_heal'); + +DELETE FROM `spell_proc` WHERE `SpellId` IN (372760); +INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`ProcFlags2`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES +(372760,0x00,6,0x10000400,0x00000000,0x00000020,0x00000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,1); -- Divine Word 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 _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& 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);