diff options
-rw-r--r-- | sql/updates/world/master/2024_02_10_04_world.sql | 7 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_priest.cpp | 70 |
2 files changed, 71 insertions, 6 deletions
diff --git a/sql/updates/world/master/2024_02_10_04_world.sql b/sql/updates/world/master/2024_02_10_04_world.sql new file mode 100644 index 00000000000..d333cd61cbd --- /dev/null +++ b/sql/updates/world/master/2024_02_10_04_world.sql @@ -0,0 +1,7 @@ +DELETE FROM `spell_proc` WHERE `SpellId` IN (47515); +INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`ProcFlags2`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES +(47515,0x00,6,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x2,0x2,0x402,0x0,0x0,0,0,0,0); -- Divine Aegis + +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_pri_divine_aegis'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(47515,'spell_pri_divine_aegis'); diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 45395883e79..39082e021ee 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -67,6 +67,8 @@ enum PriestSpells SPELL_PRIEST_DARK_REPRIMAND_DAMAGE = 373130, SPELL_PRIEST_DARK_REPRIMAND_HEALING = 400187, SPELL_PRIEST_DAZZLING_LIGHT = 196810, + SPELL_PRIEST_DIVINE_AEGIS = 47515, + SPELL_PRIEST_DIVINE_AEGIS_ABSORB = 47753, SPELL_PRIEST_DIVINE_BLESSING = 40440, SPELL_PRIEST_DIVINE_HYMN_HEAL = 64844, SPELL_PRIEST_DIVINE_IMAGE_SUMMON = 392990, @@ -1995,11 +1997,12 @@ class spell_pri_power_word_shield : public AuraScript }) && ValidateSpellEffect({ { SPELL_PRIEST_MASTERY_GRACE, EFFECT_0 }, { SPELL_PRIEST_RAPTURE, EFFECT_1 }, - { SPELL_PRIEST_BENEVOLENCE, EFFECT_0 } + { SPELL_PRIEST_BENEVOLENCE, EFFECT_0 }, + { SPELL_PRIEST_DIVINE_AEGIS, EFFECT_1 } }); } - void CalculateAmount(AuraEffect const* /*auraEffect*/, int32& amount, bool& canBeRecalculated) const + void CalculateAmount(AuraEffect const* auraEffect, int32& amount, bool& canBeRecalculated) const { canBeRecalculated = false; @@ -2016,14 +2019,33 @@ class spell_pri_power_word_shield : public AuraScript if (GetUnitOwner()->HasAura(SPELL_PRIEST_ATONEMENT_EFFECT) || GetUnitOwner()->HasAura(SPELL_PRIEST_TRINITY_EFFECT)) AddPct(modifiedAmount, masteryGraceEffect->GetAmount()); - if (player->GetPrimarySpecialization() != ChrSpecialization::PriestHoly) + switch (player->GetPrimarySpecialization()) { - modifiedAmount *= 1.25f; - if (caster->HasAura(SPELL_PVP_RULES_ENABLED_HARDCODED)) - modifiedAmount *= 0.8f; + case ChrSpecialization::PriestDiscipline: + modifiedAmount *= 1.37f; + break; + case ChrSpecialization::PriestShadow: + modifiedAmount *= 1.25f; + if (caster->HasAura(SPELL_PVP_RULES_ENABLED_HARDCODED)) + modifiedAmount *= 0.8f; + break; + default: + break; } } + float critChanceDone = caster->SpellCritChanceDone(nullptr, auraEffect, GetSpellInfo()->GetSchoolMask(), GetSpellInfo()->GetAttackType()); + float critChanceTaken = GetUnitOwner()->SpellCritChanceTaken(caster, nullptr, auraEffect, GetSpellInfo()->GetSchoolMask(), critChanceDone, GetSpellInfo()->GetAttackType()); + + if (roll_chance_f(critChanceTaken)) + { + modifiedAmount *= 2; + + // Divine Aegis + if (AuraEffect const* divineEff = caster->GetAuraEffect(SPELL_PRIEST_DIVINE_AEGIS, EFFECT_1)) + AddPct(modifiedAmount, divineEff->GetAmount()); + } + // Rapture talent (TBD: move into DoEffectCalcDamageAndHealing hook). if (AuraEffect const* raptureEffect = caster->GetAuraEffect(SPELL_PRIEST_RAPTURE, EFFECT_1)) AddPct(modifiedAmount, raptureEffect->GetAmount()); @@ -2065,6 +2087,41 @@ class spell_pri_power_word_shield : public AuraScript } }; +// 47515 - Divine Aegis +class spell_pri_divine_aegis : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellEffect({ { SPELL_PRIEST_DIVINE_AEGIS_ABSORB, EFFECT_0 } }); + } + + bool CheckProc(ProcEventInfo const& eventInfo) const + { + return eventInfo.GetHealInfo() != nullptr; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const + { + Unit* caster = eventInfo.GetActor(); + if (!caster) + return; + + int32 aegisAmount = CalculatePct(eventInfo.GetHealInfo()->GetHeal(), aurEff->GetAmount()); + if (AuraEffect const* existingAegis = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_PRIEST_DIVINE_AEGIS_ABSORB, EFFECT_0, caster->GetGUID())) + aegisAmount += existingAegis->GetAmount(); + + CastSpellExtraArgs args(aurEff); + args.SetTriggerFlags(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + args.AddSpellMod(SPELLVALUE_BASE_POINT0, aegisAmount); + caster->CastSpell(eventInfo.GetProcTarget(), SPELL_PRIEST_DIVINE_AEGIS_ABSORB, args); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pri_divine_aegis::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } +}; + // 129250 - Power Word: Solace class spell_pri_power_word_solace : public SpellScript { @@ -3008,6 +3065,7 @@ void AddSC_priest_spell_scripts() RegisterSpellScript(spell_pri_blaze_of_light); RegisterSpellScript(spell_pri_circle_of_healing); RegisterSpellScript(spell_pri_dark_indulgence); + RegisterSpellScript(spell_pri_divine_aegis); RegisterSpellScript(spell_pri_divine_image); RegisterSpellScript(spell_pri_divine_image_spell_triggered); RegisterSpellScript(spell_pri_divine_image_stack_timer); |