diff options
-rw-r--r-- | sql/updates/world/master/2025_05_11_02_world.sql | 9 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 35 |
2 files changed, 44 insertions, 0 deletions
diff --git a/sql/updates/world/master/2025_05_11_02_world.sql b/sql/updates/world/master/2025_05_11_02_world.sql new file mode 100644 index 00000000000..7232e651295 --- /dev/null +++ b/sql/updates/world/master/2025_05_11_02_world.sql @@ -0,0 +1,9 @@ +-- Scriptname +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_gen_no_npc_damage_below_override_70'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(155893, 'spell_gen_no_npc_damage_below_override_70'); + +-- Template Addon +DELETE FROM `creature_template_addon` WHERE `entry` IN (128703 /*128703 (Vengeful Bones) - No NPC Damage Below Override Points%*/); +INSERT INTO `creature_template_addon` (`entry`, `PathId`, `mount`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvpFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES +(128703, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '155893'); -- 128703 (Vengeful Bones) - No NPC Damage Below Override Points% diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index f2186a1d072..8831ab23a0c 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -5575,6 +5575,40 @@ class spell_gen_force_phase_update : public AuraScript } }; +class spell_gen_no_npc_damage_below_override : public AuraScript +{ +public: + spell_gen_no_npc_damage_below_override(float healthPct) : _healthPct(healthPct) {} + + static void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + amount = -1; + } + + void HandleAbsorb(AuraEffect const* /*aurEff*/, DamageInfo const& dmgInfo, uint32& absorbAmount) + { + if (!dmgInfo.GetAttacker() || !dmgInfo.GetAttacker()->IsCreature()) + { + PreventDefaultAction(); + return; + } + + if (GetTarget()->GetHealthPct() <= _healthPct) + absorbAmount = dmgInfo.GetDamage(); + else + PreventDefaultAction(); + } + + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_no_npc_damage_below_override::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_gen_no_npc_damage_below_override::HandleAbsorb, EFFECT_0); + } + +private: + float _healthPct; +}; + void AddSC_generic_spell_scripts() { RegisterSpellScript(spell_gen_absorb0_hitlimit1); @@ -5761,4 +5795,5 @@ void AddSC_generic_spell_scripts() RegisterSpellScript(spell_gen_spatial_rift); RegisterAreaTriggerAI(at_gen_spatial_rift); RegisterSpellScript(spell_gen_force_phase_update); + RegisterSpellScriptWithArgs(spell_gen_no_npc_damage_below_override, "spell_gen_no_npc_damage_below_override_70", 70.0f); } |