aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2025_05_11_02_world.sql9
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp35
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);
}