diff options
-rw-r--r-- | sql/updates/world/master/2023_08_06_00_world.sql | 7 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_priest.cpp | 54 |
2 files changed, 61 insertions, 0 deletions
diff --git a/sql/updates/world/master/2023_08_06_00_world.sql b/sql/updates/world/master/2023_08_06_00_world.sql new file mode 100644 index 00000000000..88b98e218de --- /dev/null +++ b/sql/updates/world/master/2023_08_06_00_world.sql @@ -0,0 +1,7 @@ +DELETE FROM `spell_proc` WHERE `SpellId` IN (391387); +INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`ProcFlags2`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES +(391387,0x00,6,0x00000000,0x00000000,0x00000000,0x00200000,0x0,0x0,0x2,0x2,0x403,0x0,0x0,0,0,0,0); -- Answered Prayers + +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_pri_answered_prayers'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(391387, 'spell_pri_answered_prayers'); diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 36b6584076c..2eb0317f804 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -41,6 +41,8 @@ enum PriestSpells { SPELL_PRIEST_ANGELIC_FEATHER_AREATRIGGER = 158624, SPELL_PRIEST_ANGELIC_FEATHER_AURA = 121557, + SPELL_PRIEST_ANSWERED_PRAYERS = 394289, + SPELL_PRIEST_APOTHEOSIS = 200183, SPELL_PRIEST_ARMOR_OF_FAITH = 28810, SPELL_PRIEST_ATONEMENT = 81749, SPELL_PRIEST_ATONEMENT_HEAL = 81751, @@ -216,6 +218,57 @@ struct areatrigger_pri_angelic_feather : AreaTriggerAI } }; +// 391387 - Answered Prayers +class spell_pri_answered_prayers : public AuraScript +{ + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo({ SPELL_PRIEST_ANSWERED_PRAYERS, SPELL_PRIEST_APOTHEOSIS }) + && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } }); + } + + void HandleOnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) const + { + Milliseconds extraDuration = 0ms; + if (AuraEffect const* durationEffect = GetEffect(EFFECT_1)) + extraDuration = Seconds(durationEffect->GetAmount()); + + Unit* target = eventInfo.GetActor(); + + Aura* answeredPrayers = target->GetAura(SPELL_PRIEST_ANSWERED_PRAYERS); + + // Note: if caster has no aura, we must cast it first. + if (!answeredPrayers) + target->CastSpell(target, SPELL_PRIEST_ANSWERED_PRAYERS, TRIGGERED_IGNORE_CAST_IN_PROGRESS); + else + { + // Note: there's no BaseValue dummy that we can use as reference, so we hardcode the increasing stack value. + answeredPrayers->ModStackAmount(1); + + // Note: if current stacks match max. stacks, trigger Apotheosis. + if (answeredPrayers->GetStackAmount() != aurEff->GetAmount()) + return; + + answeredPrayers->Remove(); + + if (Aura* apotheosis = GetTarget()->GetAura(SPELL_PRIEST_APOTHEOSIS)) + { + apotheosis->SetDuration(apotheosis->GetDuration() + extraDuration.count()); + apotheosis->SetMaxDuration(apotheosis->GetMaxDuration() + extraDuration.count()); + } + else + target->CastSpell(target, SPELL_PRIEST_APOTHEOSIS, + CastSpellExtraArgs(TRIGGERED_FULL_MASK & ~TRIGGERED_CAST_DIRECTLY) + .AddSpellMod(SPELLVALUE_DURATION, extraDuration.count())); + } + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pri_answered_prayers::HandleOnProc, EFFECT_0, SPELL_AURA_ADD_FLAT_MODIFIER_BY_SPELL_LABEL); + } +}; + // 26169 - Oracle Healing Bonus class spell_pri_aq_3p_bonus : public AuraScript { @@ -1979,6 +2032,7 @@ void AddSC_priest_spell_scripts() { RegisterSpellScript(spell_pri_angelic_feather_trigger); RegisterAreaTriggerAI(areatrigger_pri_angelic_feather); + RegisterSpellScript(spell_pri_answered_prayers); RegisterSpellScript(spell_pri_aq_3p_bonus); RegisterSpellScript(spell_pri_atonement); RegisterSpellScript(spell_pri_atonement_triggered); |