aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2023_08_13_00_world.sql9
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp120
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp23
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);