diff options
-rw-r--r-- | sql/updates/world/master/2023_08_13_00_world.sql | 9 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 120 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_priest.cpp | 23 |
3 files changed, 128 insertions, 24 deletions
diff --git a/sql/updates/world/master/2023_08_13_00_world.sql b/sql/updates/world/master/2023_08_13_00_world.sql new file mode 100644 index 00000000000..c6cb690ca8d --- /dev/null +++ b/sql/updates/world/master/2023_08_13_00_world.sql @@ -0,0 +1,9 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_pri_divine_hymn','spell_gen_major_healing_cooldown_modifier','spell_gen_major_healing_cooldown_modifier_aura'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(157982, 'spell_gen_major_healing_cooldown_modifier'), -- Tranquility (Direct heal + periodic) +(64844, 'spell_gen_major_healing_cooldown_modifier'), -- Divine Hymn (Direct heal) +(114942, 'spell_gen_major_healing_cooldown_modifier'), -- Healing Tide Totem (Direct heal) +(115310, 'spell_gen_major_healing_cooldown_modifier'), -- Revival (Direct heal) +(157982, 'spell_gen_major_healing_cooldown_modifier_aura'), -- Tranquility (Direct heal + periodic) +(271466, 'spell_gen_major_healing_cooldown_modifier_aura'), -- Luminous Barrier (Absorb) +(363534, 'spell_gen_major_healing_cooldown_modifier_aura'); -- Rewind (Periodic) diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index af5668fd93f..131fd6bc8b5 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -31,7 +31,6 @@ #include "DB2Stores.h" #include "GameTime.h" #include "GridNotifiersImpl.h" -#include "Group.h" #include "InstanceScript.h" #include "Item.h" #include "Log.h" @@ -5241,6 +5240,123 @@ class spell_gen_waiting_to_resurrect : public AuraScript } }; +enum MajorHealingCooldownSpell +{ + SPELL_DRUID_TRANQUILITY = 740, + SPELL_DRUID_TRANQUILITY_HEAL = 157982, + SPELL_PRIEST_DIVINE_HYMN = 64843, + SPELL_PRIEST_DIVINE_HYMN_HEAL = 64844, + SPELL_PRIEST_LUMINOUS_BARRIER = 271466, + SPELL_SHAMAN_HEALING_TIDE_TOTEM = 108280, + SPELL_SHAMAN_HEALING_TIDE_TOTEM_HEAL = 114942, + SPELL_MONK_REVIVAL = 115310, + SPELL_EVOKER_REWIND = 363534 +}; + +namespace MajorPlayerHealingCooldownHelpers +{ +float GetBonusMultiplier(Unit const* unit, uint32 spellId) +{ + // Note: if caster is not in a raid setting, is in PvP or while in arena combat with 5 or less allied players. + if (!unit->GetMap()->IsRaid() || !unit->GetMap()->IsBattleground()) + { + uint32 bonusSpellId = 0; + SpellEffIndex effIndex = EFFECT_0; + switch (spellId) + { + case SPELL_DRUID_TRANQUILITY_HEAL: + bonusSpellId = SPELL_DRUID_TRANQUILITY; + effIndex = EFFECT_2; + break; + case SPELL_PRIEST_DIVINE_HYMN_HEAL: + bonusSpellId = SPELL_PRIEST_DIVINE_HYMN; + effIndex = EFFECT_1; + break; + case SPELL_PRIEST_LUMINOUS_BARRIER: + bonusSpellId = spellId; + effIndex = EFFECT_1; + break; + case SPELL_SHAMAN_HEALING_TIDE_TOTEM_HEAL: + bonusSpellId = SPELL_SHAMAN_HEALING_TIDE_TOTEM; + effIndex = EFFECT_2; + break; + case SPELL_MONK_REVIVAL: + bonusSpellId = spellId; + effIndex = EFFECT_4; + break; + case SPELL_EVOKER_REWIND: + bonusSpellId = spellId; + effIndex = EFFECT_3; + break; + default: + return 0.0f; + } + + if (AuraEffect* const healingIncreaseEffect = unit->GetAuraEffect(bonusSpellId, effIndex)) + return healingIncreaseEffect->GetAmount(); + + return sSpellMgr->AssertSpellInfo(bonusSpellId, DIFFICULTY_NONE)->GetEffect(effIndex).CalcValue(unit); + } + + return 0.0f; +} +} + +// 157982 - Tranquility (Heal) +// 64844 - Divine Hymn (Heal) +// 114942 - Healing Tide (Heal) +// 115310 - Revival (Heal) +class spell_gen_major_healing_cooldown_modifier : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellEffect + ({ + { SPELL_DRUID_TRANQUILITY, EFFECT_2 }, + { SPELL_PRIEST_DIVINE_HYMN, EFFECT_1 }, + { SPELL_SHAMAN_HEALING_TIDE_TOTEM, EFFECT_2 }, + { SPELL_MONK_REVIVAL, EFFECT_4 } + }); + } + + void CalculateHealingBonus(Unit* /*victim*/, int32& /*healing*/, int32& /*flatMod*/, float& pctMod) const + { + AddPct(pctMod, MajorPlayerHealingCooldownHelpers::GetBonusMultiplier(GetCaster(), GetSpellInfo()->Id)); + } + + void Register() override + { + CalcHealing += SpellCalcHealingFn(spell_gen_major_healing_cooldown_modifier::CalculateHealingBonus); + } +}; + +// 157982 - Tranquility (Heal) +// 271466 - Luminous Barrier (Absorb) +// 363534 - Rewind (Heal) +class spell_gen_major_healing_cooldown_modifier_aura : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellEffect + ({ + { SPELL_DRUID_TRANQUILITY, EFFECT_2 }, + { SPELL_PRIEST_LUMINOUS_BARRIER, EFFECT_1 }, + { SPELL_EVOKER_REWIND, EFFECT_3 } + }); + } + + void CalculateHealingBonus(AuraEffect const* /*aurEff*/, Unit* /*victim*/, int32& /*damageOrHealing*/, int32& /*flatMod*/, float& pctMod) const + { + if (Unit const* caster = GetCaster()) + AddPct(pctMod, MajorPlayerHealingCooldownHelpers::GetBonusMultiplier(caster, GetSpellInfo()->Id)); + } + + void Register() override + { + DoEffectCalcDamageAndHealing += AuraEffectCalcHealingFn(spell_gen_major_healing_cooldown_modifier_aura::CalculateHealingBonus, EFFECT_ALL, SPELL_AURA_ANY); + } +}; + void AddSC_generic_spell_scripts() { RegisterSpellScript(spell_gen_absorb0_hitlimit1); @@ -5415,4 +5531,6 @@ void AddSC_generic_spell_scripts() RegisterSpellScript(spell_gen_spirit_heal_personal); RegisterSpellScript(spell_gen_spirit_heal_channel); RegisterSpellScript(spell_gen_waiting_to_resurrect); + RegisterSpellScript(spell_gen_major_healing_cooldown_modifier); + RegisterSpellScript(spell_gen_major_healing_cooldown_modifier_aura); } diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 88dfd50e2e3..3e0d5b8a580 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -535,28 +535,6 @@ class spell_pri_circle_of_healing : public SpellScript } }; -// 64844 - Divine Hymn -class spell_pri_divine_hymn : public SpellScript -{ - void FilterTargets(std::list<WorldObject*>& targets) - { - targets.remove_if(RaidCheck(GetCaster())); - - uint32 const maxTargets = 3; - - if (targets.size() > maxTargets) - { - targets.sort(Trinity::HealthPctOrderPred()); - targets.resize(maxTargets); - } - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_divine_hymn::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ALLY); - } -}; - namespace DivineImageHelpers { Unit* GetSummon(Unit const* owner) @@ -2562,7 +2540,6 @@ void AddSC_priest_spell_scripts() RegisterSpellScript(spell_pri_atonement_triggered); RegisterSpellScript(spell_pri_benediction); RegisterSpellScript(spell_pri_circle_of_healing); - RegisterSpellScript(spell_pri_divine_hymn); RegisterSpellScript(spell_pri_divine_image); RegisterSpellScript(spell_pri_divine_image_spell_triggered); RegisterSpellScript(spell_pri_divine_image_stack_timer); |