aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2024_09_08_01_world.sql9
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp84
2 files changed, 93 insertions, 0 deletions
diff --git a/sql/updates/world/master/2024_09_08_01_world.sql b/sql/updates/world/master/2024_09_08_01_world.sql
new file mode 100644
index 00000000000..c25ee8e25a1
--- /dev/null
+++ b/sql/updates/world/master/2024_09_08_01_world.sql
@@ -0,0 +1,9 @@
+DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_warl_deaths_embrace';
+DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_warl_deaths_embrace_dots';
+DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_warl_deaths_embrace_drain_life';
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(324540, 'spell_warl_deaths_embrace'),
+(980, 'spell_warl_deaths_embrace_dots'),
+(146739, 'spell_warl_deaths_embrace_dots'),
+(316099, 'spell_warl_deaths_embrace_dots'),
+(234153, 'spell_warl_deaths_embrace_drain_life');
diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp
index 3c7fdd54339..8728b622e4b 100644
--- a/src/server/scripts/Spells/spell_warlock.cpp
+++ b/src/server/scripts/Spells/spell_warlock.cpp
@@ -44,6 +44,7 @@ enum WarlockSpells
SPELL_WARLOCK_CORRUPTION_DAMAGE = 146739,
SPELL_WARLOCK_CREATE_HEALTHSTONE = 23517,
SPELL_WARLOCK_CURSE_OF_EXHAUSTION = 334275,
+ SPELL_WARLOCK_DEATHS_EMBRACE = 453189,
SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST = 62388,
SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON = 48018,
SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT = 48020,
@@ -297,6 +298,86 @@ class spell_warl_dark_pact : public AuraScript
}
};
+struct spell_warl_deaths_embrace_impl
+{
+ static void HandleDamageOrHealingCalculation(Unit const* caster, Unit const* target, float& pctMod, SpellEffIndex inreaseEffect, SpellEffIndex healthLimitEffect)
+ {
+ Aura const* deathsEmbrace = caster->GetAura(SPELL_WARLOCK_DEATHS_EMBRACE, ObjectGuid::Empty, ObjectGuid::Empty, 1 << inreaseEffect | 1 << healthLimitEffect);
+ if (!deathsEmbrace)
+ return;
+
+ if (!target->HealthBelowPct(deathsEmbrace->GetEffect(healthLimitEffect)->GetAmount()))
+ return;
+
+ AddPct(pctMod, deathsEmbrace->GetEffect(inreaseEffect)->GetAmount());
+ }
+};
+
+// Called by 324540 - Malefic Rapture
+class spell_warl_deaths_embrace : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellEffect({ { SPELL_WARLOCK_DEATHS_EMBRACE, EFFECT_3 } });
+ }
+
+ void HandleDamageCalculation(Unit const* victim, int32 const& /*damage*/, int32 const& /*flatMod*/, float& pctMod) const
+ {
+ spell_warl_deaths_embrace_impl::HandleDamageOrHealingCalculation(GetCaster(), victim, pctMod, EFFECT_2, EFFECT_3);
+ }
+
+ void Register() override
+ {
+ CalcDamage += SpellCalcDamageFn(spell_warl_deaths_embrace::HandleDamageCalculation);
+ }
+};
+
+// Called by 980 - Agony, 146739 - Corruption and 316099 - Unstable Affliction
+class spell_warl_deaths_embrace_dots : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellEffect({ { SPELL_WARLOCK_DEATHS_EMBRACE, EFFECT_3 } });
+ }
+
+ void CalculateDamage(AuraEffect const* /*aurEff*/, Unit const* victim, int32& /*damage*/, int32& /*flatMod*/, float& pctMod) const
+ {
+ if (Unit const* caster = GetCaster())
+ spell_warl_deaths_embrace_impl::HandleDamageOrHealingCalculation(caster, victim, pctMod, EFFECT_2, EFFECT_3);
+ }
+
+ void Register() override
+ {
+ DoEffectCalcDamageAndHealing += AuraEffectCalcDamageFn(spell_warl_deaths_embrace_dots::CalculateDamage, EFFECT_ALL, SPELL_AURA_PERIODIC_DAMAGE);
+ }
+};
+
+// 234153 - Drain Life
+class spell_warl_deaths_embrace_drain_life : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellEffect({ { SPELL_WARLOCK_DEATHS_EMBRACE, EFFECT_1 } });
+ }
+
+ void CalculateHeal(AuraEffect const* /*aurEff*/, Unit const* victim, int32& /*damage*/, int32& /*flatMod*/, float& pctMod) const
+ {
+ Unit const* caster = GetCaster();
+ if (!caster)
+ return;
+
+ if (caster != victim) // check who is being targeted, this hook is called for both damage and healing of PERIODIC_LEECH
+ return;
+
+ spell_warl_deaths_embrace_impl::HandleDamageOrHealingCalculation(caster, caster, pctMod, EFFECT_0, EFFECT_1);
+ }
+
+ void Register() override
+ {
+ DoEffectCalcDamageAndHealing += AuraEffectCalcHealingFn(spell_warl_deaths_embrace_drain_life::CalculateHeal, EFFECT_0, SPELL_AURA_PERIODIC_LEECH);
+ }
+};
+
// 48018 - Demonic Circle: Summon
class spell_warl_demonic_circle_summon : public AuraScript
{
@@ -1267,6 +1348,9 @@ void AddSC_warlock_spell_scripts()
RegisterSpellScript(spell_warl_absolute_corruption);
RegisterSpellScript(spell_warl_create_healthstone);
RegisterSpellScript(spell_warl_dark_pact);
+ RegisterSpellScript(spell_warl_deaths_embrace);
+ RegisterSpellScript(spell_warl_deaths_embrace_dots);
+ RegisterSpellScript(spell_warl_deaths_embrace_drain_life);
RegisterSpellScript(spell_warl_demonic_circle_summon);
RegisterSpellScript(spell_warl_demonic_circle_teleport);
RegisterSpellScript(spell_warl_devour_magic);