diff options
-rw-r--r-- | sql/updates/world/master/2024_07_19_01_world.sql | 3 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_priest.cpp | 46 |
2 files changed, 49 insertions, 0 deletions
diff --git a/sql/updates/world/master/2024_07_19_01_world.sql b/sql/updates/world/master/2024_07_19_01_world.sql new file mode 100644 index 00000000000..a35e1a6857c --- /dev/null +++ b/sql/updates/world/master/2024_07_19_01_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_pri_shadow_word_death'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(32379, 'spell_pri_shadow_word_death'); diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index e5e117d78b0..b8dbcf13aed 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -174,6 +174,7 @@ enum PriestSpells SPELL_PRIEST_SEARING_LIGHT = 196811, SPELL_PRIEST_SHADOW_MEND_DAMAGE = 186439, SPELL_PRIEST_SHADOW_WORD_DEATH = 32379, + SPELL_PRIEST_SHADOW_WORD_DEATH_DAMAGE = 32409, SPELL_PRIEST_SHADOW_MEND_PERIODIC_DUMMY = 187464, SPELL_PRIEST_SHADOW_WORD_PAIN = 589, SPELL_PRIEST_SHIELD_DISCIPLINE = 197045, @@ -3079,6 +3080,50 @@ class spell_pri_shadow_mend_periodic_damage : public AuraScript } }; +// 32379 - Shadow Word: Death +class spell_pri_shadow_word_death : public SpellScript +{ + static constexpr Seconds BACKLASH_DELAY = 1s; + + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo({ SPELL_PRIEST_SHADOW_WORD_DEATH_DAMAGE }) + && ValidateSpellEffect({ { spellInfo->Id, EFFECT_4 } }); + } + + void HandleDamageCalculation(Unit const* victim, int32 const& /*damage*/, int32 const& /*flatMod*/, float& pctMod) const + { + if (victim->HealthBelowPct(GetEffectInfo(EFFECT_1).CalcValue(GetCaster()))) + AddPct(pctMod, GetEffectInfo(EFFECT_2).CalcValue(GetCaster())); + } + + void DetermineKillStatus(DamageInfo const& damageInfo, uint32& /*resistAmount*/, int32& /*absorbAmount*/) const + { + bool killed = damageInfo.GetDamage() >= damageInfo.GetVictim()->GetHealth(); + if (!killed) + { + Unit* caster = GetCaster(); + int32 backlashDamage = caster->CountPctFromMaxHealth(GetEffectInfo(EFFECT_4).CalcValue(caster)); + caster->m_Events.AddEventAtOffset([caster, originalCastId = GetSpell()->m_castId, backlashDamage] + { + caster->CastSpell(caster, SPELL_PRIEST_SHADOW_WORD_DEATH_DAMAGE, CastSpellExtraArgs() + .SetTriggerFlags(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR) + .SetOriginalCastId(originalCastId) + .AddSpellMod(SPELLVALUE_BASE_POINT0, backlashDamage)); + + }, BACKLASH_DELAY); + } + } + + void Register() override + { + CalcDamage += SpellCalcDamageFn(spell_pri_shadow_word_death::HandleDamageCalculation); + + // abuse OnCalculateResistAbsorb to determine if this spell will kill target or not (its still not perfect - happens before absorbs are applied) + OnCalculateResistAbsorb += SpellOnResistAbsorbCalculateFn(spell_pri_shadow_word_death::DetermineKillStatus); + } +}; + // 109186 - Surge of Light class spell_pri_surge_of_light : public AuraScript { @@ -3599,6 +3644,7 @@ void AddSC_priest_spell_scripts() RegisterSpellScript(spell_pri_shadow_covenant); RegisterSpellScript(spell_pri_shadow_mend); RegisterSpellScript(spell_pri_shadow_mend_periodic_damage); + RegisterSpellScript(spell_pri_shadow_word_death); RegisterSpellScript(spell_pri_surge_of_light); RegisterSpellScript(spell_pri_trail_of_light); RegisterSpellScript(spell_pri_train_of_thought); |