From 7a40f7f0a72036899a236a34447d41150ab3d00a Mon Sep 17 00:00:00 2001 From: Crome696 Date: Fri, 10 Jul 2026 16:53:59 +0200 Subject: [PATCH] fix: tighten Arcane Empowerment damage hooks --- .../ArcaneEmpowermentSpellTests.cs | 23 ++++++++++ Projects/UOContent/Mobiles/BaseCreature.cs | 2 +- Projects/UOContent/Spells/Base/SpellHelper.cs | 46 +++++++++++++------ .../UOContent/Spells/Chivalry/CloseWounds.cs | 2 +- .../Spells/Chivalry/NobleSacrifice.cs | 2 +- Projects/UOContent/Spells/First/Heal.cs | 2 +- Projects/UOContent/Spells/First/MagicArrow.cs | 2 +- .../UOContent/Spells/Fourth/GreaterHeal.cs | 2 +- Projects/UOContent/Spells/Fourth/Lightning.cs | 2 +- .../Spells/Mysticism/BombardSpell.cs | 4 +- .../Spells/Mysticism/CleansingWindsSpell.cs | 2 +- .../Spells/Mysticism/EagleStrikeSpell.cs | 2 +- .../Spells/Mysticism/HailStormSpell.cs | 2 +- .../Spells/Mysticism/NetherBoltSpell.cs | 4 +- .../Spells/Mysticism/NetherCycloneSpell.cs | 2 +- .../Spells/Mysticism/SpellPlagueSpell.cs | 2 +- Projects/UOContent/Spells/Second/Harm.cs | 2 +- .../Spells/Seventh/ChainLightning.cs | 2 +- .../UOContent/Spells/Seventh/FlameStrike.cs | 2 +- .../UOContent/Spells/Seventh/MeteorSwarm.cs | 2 +- Projects/UOContent/Spells/Sixth/EnergyBolt.cs | 2 +- Projects/UOContent/Spells/Sixth/Explosion.cs | 2 +- .../Spells/Spellweaving/ArcaneEmpowerment.cs | 12 ++--- .../Spells/Spellweaving/GiftOfRenewal.cs | 2 +- Projects/UOContent/Spells/Third/Fireball.cs | 2 +- 25 files changed, 87 insertions(+), 42 deletions(-) diff --git a/Projects/UOContent.Tests/Tests/Spells/Spellweaving/ArcaneEmpowermentSpellTests.cs b/Projects/UOContent.Tests/Tests/Spells/Spellweaving/ArcaneEmpowermentSpellTests.cs index 705087dd4..114ccd723 100644 --- a/Projects/UOContent.Tests/Tests/Spells/Spellweaving/ArcaneEmpowermentSpellTests.cs +++ b/Projects/UOContent.Tests/Tests/Spells/Spellweaving/ArcaneEmpowermentSpellTests.cs @@ -130,6 +130,7 @@ public class ArcaneEmpowermentSpellTests { var caster = NewCaster(); var target = NewTarget(); + var playerTarget = NewPlayerCaster(); var follower = new TestSummon { HitsMaxSeed = 100, @@ -148,6 +149,10 @@ public class ArcaneEmpowermentSpellTests follower.AlterMeleeDamageTo(target, ref damage); Assert.Equal(120, damage); + damage = 100; + follower.AlterMeleeDamageTo(playerTarget, ref damage); + Assert.Equal(112, damage); + var spellDamage = 100; ArcaneEmpowermentSpell.ApplySpellDamage(caster, target, ref spellDamage); Assert.Equal(120, spellDamage); @@ -156,6 +161,16 @@ public class ArcaneEmpowermentSpellTests ArcaneEmpowermentSpell.ApplyHealing(caster, ref healing); Assert.Equal(120, healing); + var centralDamageTarget = NewTarget(); + centralDamageTarget.Hits = centralDamageTarget.HitsMax; + var centralDamageBefore = centralDamageTarget.Hits; + SpellHelper.Damage(new ArcaneEmpowermentSpell(caster), centralDamageTarget, 10); + Assert.Equal(12, centralDamageBefore - centralDamageTarget.Hits); + + var sharedHealTarget = NewTarget(); + SpellHelper.Heal(10, sharedHealTarget, caster); + Assert.Equal(11, sharedHealTarget.Hits); + Assert.Equal(70.0, ArcaneEmpowermentSpell.GetDispelDifficulty(follower)); ArcaneEmpowermentSpell.ApplyEffectForTests(caster, 1200, 0); @@ -173,6 +188,9 @@ public class ArcaneEmpowermentSpellTests caster.Delete(); target.Delete(); + playerTarget.Delete(); + centralDamageTarget.Delete(); + sharedHealTarget.Delete(); follower.Delete(); } @@ -215,6 +233,11 @@ public class ArcaneEmpowermentSpellTests var damage = 100; ArcaneEmpowermentSpell.ApplySpellDamage(caster, target, ref damage); + Assert.Equal(115, damage); + + damage = 100; + ArcaneEmpowermentSpell.ApplySpellDamage(caster, target, ref damage, sdiAlreadyApplied: true); + Assert.Equal(100, damage); ArcaneEmpowermentSpell.StopEffect(caster); diff --git a/Projects/UOContent/Mobiles/BaseCreature.cs b/Projects/UOContent/Mobiles/BaseCreature.cs index db35b3bcb..2d425ff88 100644 --- a/Projects/UOContent/Mobiles/BaseCreature.cs +++ b/Projects/UOContent/Mobiles/BaseCreature.cs @@ -4191,7 +4191,7 @@ namespace Server.Mobiles public virtual void AlterMeleeDamageTo(Mobile to, ref int damage) { TriggerAbilityAlterDamage(MonsterAbilityTrigger.GiveMeleeDamage, to, ref damage); - ArcaneEmpowermentSpell.AlterFollowerMeleeDamageTo(this, ref damage); + ArcaneEmpowermentSpell.AlterFollowerMeleeDamageTo(this, to, ref damage); } public virtual bool CheckFoodPreference(Item f) => diff --git a/Projects/UOContent/Spells/Base/SpellHelper.cs b/Projects/UOContent/Spells/Base/SpellHelper.cs index 2873118dd..61c907fbf 100644 --- a/Projects/UOContent/Spells/Base/SpellHelper.cs +++ b/Projects/UOContent/Spells/Base/SpellHelper.cs @@ -930,11 +930,11 @@ namespace Server.Spells return reflect; } - public static void Damage(Spell spell, Mobile target, double damage) + public static void Damage(Spell spell, Mobile target, double damage, bool sdiAlreadyApplied = false) { var ts = GetDamageDelayForSpell(spell); - Damage(spell, ts, target, spell.Caster, damage); + Damage(spell, ts, target, spell.Caster, damage, sdiAlreadyApplied); } public static void Damage(TimeSpan delay, Mobile target, double damage) @@ -947,7 +947,9 @@ namespace Server.Spells Damage(null, delay, target, from, damage); } - public static void Damage(Spell spell, TimeSpan delay, Mobile target, Mobile from, double damage) + public static void Damage( + Spell spell, TimeSpan delay, Mobile target, Mobile from, double damage, bool sdiAlreadyApplied = false + ) { var damageGiven = (int)damage; @@ -964,7 +966,7 @@ namespace Server.Spells damageGiven = AOS.Scale(damageGiven, 100 + spellFocusingOffset); } - ArcaneEmpowermentSpell.ApplySpellDamage(from, target, ref damageGiven); + ArcaneEmpowermentSpell.ApplySpellDamage(from, target, ref damageGiven, sdiAlreadyApplied); target.Damage(damageGiven, from); @@ -978,13 +980,13 @@ namespace Server.Spells } else { - new SpellDamageTimer(spell, target, from, damageGiven, delay).Start(); + new SpellDamageTimer(spell, target, from, damageGiven, delay, sdiAlreadyApplied).Start(); } } public static void Damage( Spell spell, Mobile target, double damage, int phys, int fire, int cold, int pois, - int nrgy, int chaos = 0, DFAlgorithm dfa = DFAlgorithm.Standard + int nrgy, int chaos = 0, DFAlgorithm dfa = DFAlgorithm.Standard, bool sdiAlreadyApplied = false ) { Damage( @@ -999,7 +1001,8 @@ namespace Server.Spells pois, nrgy, chaos, - dfa + dfa, + sdiAlreadyApplied ); } @@ -1021,7 +1024,8 @@ namespace Server.Spells public static void Damage( Spell spell, TimeSpan delay, Mobile target, Mobile from, double damage, int phys, int fire, - int cold, int pois, int nrgy, int chaos = 0, DFAlgorithm dfa = DFAlgorithm.Standard + int cold, int pois, int nrgy, int chaos = 0, DFAlgorithm dfa = DFAlgorithm.Standard, + bool sdiAlreadyApplied = false ) { var dmg = (int)damage; @@ -1039,7 +1043,7 @@ namespace Server.Spells dmg = AOS.Scale(dmg, 100 + spellFocusingOffset); } - ArcaneEmpowermentSpell.ApplySpellDamage(from, target, ref dmg); + ArcaneEmpowermentSpell.ApplySpellDamage(from, target, ref dmg, sdiAlreadyApplied); if (Feint.GetDamageReduction(from, target, out var feintReduction)) { @@ -1064,7 +1068,9 @@ namespace Server.Spells } else { - new SpellDamageTimerAOS(spell, delay, target, from, dmg, phys, fire, cold, pois, nrgy, chaos, dfa).Start(); + new SpellDamageTimerAOS( + spell, delay, target, from, dmg, phys, fire, cold, pois, nrgy, chaos, dfa, sdiAlreadyApplied + ).Start(); } } @@ -1093,6 +1099,11 @@ namespace Server.Spells } } public static void Heal(int amount, Mobile target, Mobile from, bool message = true) + { + target.Heal(amount, from, message); + } + + public static void HealSpell(int amount, Mobile target, Mobile from, bool message = true) { ArcaneEmpowermentSpell.ApplyHealing(from, ref amount); target.Heal(amount, from, message); @@ -1105,13 +1116,17 @@ namespace Server.Spells private readonly Mobile m_From; private readonly Spell m_Spell; private readonly Mobile m_Target; + private readonly bool m_SdiAlreadyApplied; private int m_Damage; - public SpellDamageTimer(Spell s, Mobile target, Mobile from, int damage, TimeSpan delay) : base(delay) + public SpellDamageTimer( + Spell s, Mobile target, Mobile from, int damage, TimeSpan delay, bool sdiAlreadyApplied + ) : base(delay) { m_Target = target; m_From = from; m_Damage = damage; + m_SdiAlreadyApplied = sdiAlreadyApplied; m_Spell = s; if (m_Spell?.DelayedDamage == true) @@ -1130,7 +1145,7 @@ namespace Server.Spells m_Damage = AOS.Scale(m_Damage, 100 + spellFocusingOffset); } - ArcaneEmpowermentSpell.ApplySpellDamage(m_From, m_Target, ref m_Damage); + ArcaneEmpowermentSpell.ApplySpellDamage(m_From, m_Target, ref m_Damage, m_SdiAlreadyApplied); m_Target.Damage(m_Damage); m_Spell?.RemoveDelayedDamageContext(m_Target); @@ -1147,13 +1162,14 @@ namespace Server.Spells private readonly int m_Nrgy; private readonly int m_Phys; private readonly int m_Pois; + private readonly bool m_SdiAlreadyApplied; private readonly Spell m_Spell; private readonly Mobile m_Target; private int m_Damage; public SpellDamageTimerAOS( Spell s, TimeSpan delay, Mobile target, Mobile from, int damage, int phys, int fire, int cold, - int pois, int nrgy, int chaos, DFAlgorithm dfa + int pois, int nrgy, int chaos, DFAlgorithm dfa, bool sdiAlreadyApplied ) : base(delay) { m_Target = target; @@ -1166,6 +1182,7 @@ namespace Server.Spells m_Nrgy = nrgy; m_Chaos = chaos; m_DFA = dfa; + m_SdiAlreadyApplied = sdiAlreadyApplied; m_Spell = s; if (m_Spell?.DelayedDamage == true) @@ -1193,7 +1210,8 @@ namespace Server.Spells m_Pois, m_Nrgy, m_Chaos, - m_DFA + m_DFA, + m_SdiAlreadyApplied ); m_Spell?.RemoveDelayedDamageContext(m_Target); diff --git a/Projects/UOContent/Spells/Chivalry/CloseWounds.cs b/Projects/UOContent/Spells/Chivalry/CloseWounds.cs index 0c1e8c8b7..105b7e1e7 100644 --- a/Projects/UOContent/Spells/Chivalry/CloseWounds.cs +++ b/Projects/UOContent/Spells/Chivalry/CloseWounds.cs @@ -69,7 +69,7 @@ namespace Server.Spells.Chivalry toHeal = m.HitsMax - m.Hits; } - SpellHelper.Heal(toHeal, m, Caster, false); + SpellHelper.HealSpell(toHeal, m, Caster, false); // You have had ~1_HEALED_AMOUNT~ hit points of damage healed. m.SendLocalizedMessage(1060203, toHeal.ToString()); diff --git a/Projects/UOContent/Spells/Chivalry/NobleSacrifice.cs b/Projects/UOContent/Spells/Chivalry/NobleSacrifice.cs index 1a77746ca..88790f3db 100644 --- a/Projects/UOContent/Spells/Chivalry/NobleSacrifice.cs +++ b/Projects/UOContent/Spells/Chivalry/NobleSacrifice.cs @@ -102,7 +102,7 @@ namespace Server.Spells.Chivalry var toHeal = Math.Clamp(ComputePowerValue(10) + Utility.RandomMinMax(0, 2), 8, 24); Caster.DoBeneficial(m); - SpellHelper.Heal(toHeal, m, Caster); + SpellHelper.HealSpell(toHeal, m, Caster); sendEffect = true; } diff --git a/Projects/UOContent/Spells/First/Heal.cs b/Projects/UOContent/Spells/First/Heal.cs index e9cb8eb4e..714720188 100644 --- a/Projects/UOContent/Spells/First/Heal.cs +++ b/Projects/UOContent/Spells/First/Heal.cs @@ -64,7 +64,7 @@ namespace Server.Spells.First } // m.Heal( toHeal, Caster ); - SpellHelper.Heal((int)toHeal, m, Caster); + SpellHelper.HealSpell((int)toHeal, m, Caster); m.FixedParticles(0x376A, 9, 32, 5005, EffectLayer.Waist); m.PlaySound(0x1F2); diff --git a/Projects/UOContent/Spells/First/MagicArrow.cs b/Projects/UOContent/Spells/First/MagicArrow.cs index 1f98a8c11..b4c661a3f 100644 --- a/Projects/UOContent/Spells/First/MagicArrow.cs +++ b/Projects/UOContent/Spells/First/MagicArrow.cs @@ -67,7 +67,7 @@ namespace Server.Spells.First source.MovingParticles(m, 0x36E4, 5, 0, false, false, 0, 0, 3006, 0, 0, EffectLayer.RightHand, 0); source.PlaySound(0x1E5); - SpellHelper.Damage(this, m, damage, 0, 100, 0, 0, 0); + SpellHelper.Damage(this, m, damage, 0, 100, 0, 0, 0, sdiAlreadyApplied: true); } } diff --git a/Projects/UOContent/Spells/Fourth/GreaterHeal.cs b/Projects/UOContent/Spells/Fourth/GreaterHeal.cs index 995473974..91dd4fee3 100644 --- a/Projects/UOContent/Spells/Fourth/GreaterHeal.cs +++ b/Projects/UOContent/Spells/Fourth/GreaterHeal.cs @@ -52,7 +52,7 @@ namespace Server.Spells.Fourth toHeal += Utility.Random(1, 10); // m.Heal( toHeal, Caster ); - SpellHelper.Heal(toHeal, m, Caster); + SpellHelper.HealSpell(toHeal, m, Caster); m.FixedParticles(0x376A, 9, 32, 5030, EffectLayer.Waist); m.PlaySound(0x202); diff --git a/Projects/UOContent/Spells/Fourth/Lightning.cs b/Projects/UOContent/Spells/Fourth/Lightning.cs index 4daf13e53..a2679faea 100644 --- a/Projects/UOContent/Spells/Fourth/Lightning.cs +++ b/Projects/UOContent/Spells/Fourth/Lightning.cs @@ -53,7 +53,7 @@ namespace Server.Spells.Fourth m.BoltEffect(0); - SpellHelper.Damage(this, m, damage, 0, 0, 0, 0, 100); + SpellHelper.Damage(this, m, damage, 0, 0, 0, 0, 100, sdiAlreadyApplied: true); } } diff --git a/Projects/UOContent/Spells/Mysticism/BombardSpell.cs b/Projects/UOContent/Spells/Mysticism/BombardSpell.cs index cfa2d64b9..0b602faf5 100644 --- a/Projects/UOContent/Spells/Mysticism/BombardSpell.cs +++ b/Projects/UOContent/Spells/Mysticism/BombardSpell.cs @@ -56,7 +56,9 @@ public class BombardSpell : MysticSpell, ITargetingSpell Caster.MovingEffect(m, 0x1363, 12, 1, false, true, 0, 0); Caster.PlaySound(0x64B); - SpellHelper.Damage(this, m, GetNewAosDamage(40, 1, 5, m), 100, 0, 0, 0, 0); + SpellHelper.Damage( + this, m, GetNewAosDamage(40, 1, 5, m), 100, 0, 0, 0, 0, sdiAlreadyApplied: true + ); Timer.StartTimer(TimeSpan.FromSeconds(1.2), () => { diff --git a/Projects/UOContent/Spells/Mysticism/CleansingWindsSpell.cs b/Projects/UOContent/Spells/Mysticism/CleansingWindsSpell.cs index 744dce453..fbb3f15d5 100644 --- a/Projects/UOContent/Spells/Mysticism/CleansingWindsSpell.cs +++ b/Projects/UOContent/Spells/Mysticism/CleansingWindsSpell.cs @@ -127,7 +127,7 @@ public class CleansingWindsSpell : MysticSpell, ITargetingSpell if (toHealMod > 0) { - SpellHelper.Heal(toHealMod, target, Caster); + SpellHelper.HealSpell(toHealMod, target, Caster); } } } diff --git a/Projects/UOContent/Spells/Mysticism/EagleStrikeSpell.cs b/Projects/UOContent/Spells/Mysticism/EagleStrikeSpell.cs index 81ee12f68..aa137e3fc 100644 --- a/Projects/UOContent/Spells/Mysticism/EagleStrikeSpell.cs +++ b/Projects/UOContent/Spells/Mysticism/EagleStrikeSpell.cs @@ -68,7 +68,7 @@ public class EagleStrikeSpell : MysticSpell, ITargetingSpell double damage = GetNewAosDamage(19, 1, 5, to); - SpellHelper.Damage(this, to, damage, 0, 0, 0, 0, 100); + SpellHelper.Damage(this, to, damage, 0, 0, 0, 0, 100, sdiAlreadyApplied: true); to.PlaySound(0x64D); } diff --git a/Projects/UOContent/Spells/Mysticism/HailStormSpell.cs b/Projects/UOContent/Spells/Mysticism/HailStormSpell.cs index cf21bd750..116cd7797 100644 --- a/Projects/UOContent/Spells/Mysticism/HailStormSpell.cs +++ b/Projects/UOContent/Spells/Mysticism/HailStormSpell.cs @@ -65,7 +65,7 @@ public class HailStormSpell : MysticSpell, ITargetingSpell { var m = pool.Dequeue(); Caster.DoHarmful(m); - SpellHelper.Damage(this, m, damage, 0, 0, 100, 0, 0); + SpellHelper.Damage(this, m, damage, 0, 0, 100, 0, 0, sdiAlreadyApplied: true); } } } diff --git a/Projects/UOContent/Spells/Mysticism/NetherBoltSpell.cs b/Projects/UOContent/Spells/Mysticism/NetherBoltSpell.cs index f7a57dde7..c370b9e38 100644 --- a/Projects/UOContent/Spells/Mysticism/NetherBoltSpell.cs +++ b/Projects/UOContent/Spells/Mysticism/NetherBoltSpell.cs @@ -61,7 +61,9 @@ public class NetherBoltSpell : MysticSpell, ITargetingSpell ); source.PlaySound(0x211); - SpellHelper.Damage(this, m, GetNewAosDamage(10, 1, 4, m), 0, 0, 0, 0, 0, 100); + SpellHelper.Damage( + this, m, GetNewAosDamage(10, 1, 4, m), 0, 0, 0, 0, 0, 100, sdiAlreadyApplied: true + ); } } diff --git a/Projects/UOContent/Spells/Mysticism/NetherCycloneSpell.cs b/Projects/UOContent/Spells/Mysticism/NetherCycloneSpell.cs index 04e7a316a..17fccb78b 100644 --- a/Projects/UOContent/Spells/Mysticism/NetherCycloneSpell.cs +++ b/Projects/UOContent/Spells/Mysticism/NetherCycloneSpell.cs @@ -76,7 +76,7 @@ public class NetherCycloneSpell : MysticSpell, ITargetingSpell { var m = pool.Dequeue(); Caster.DoHarmful(m); - SpellHelper.Damage(this, m, damage, 0, 0, 0, 0, 0, 100); + SpellHelper.Damage(this, m, damage, 0, 0, 0, 0, 0, 100, sdiAlreadyApplied: true); var resistedReduction = reduction - m.Skills.MagicResist.Value / 800.0; diff --git a/Projects/UOContent/Spells/Mysticism/SpellPlagueSpell.cs b/Projects/UOContent/Spells/Mysticism/SpellPlagueSpell.cs index 266b2f6cc..c03142ea9 100644 --- a/Projects/UOContent/Spells/Mysticism/SpellPlagueSpell.cs +++ b/Projects/UOContent/Spells/Mysticism/SpellPlagueSpell.cs @@ -55,7 +55,7 @@ public class SpellPlagueSpell : MysticSpell, ITargetingSpell // Before Time of Legends, SDI was not applied to initial damage. var damage = GetNewAosDamage(33, 1, 5, Core.TOL, m); - SpellHelper.Damage(this, m, damage, 0, 0, 0, 0, 0); + SpellHelper.Damage(this, m, damage, 0, 0, 0, 0, 0, sdiAlreadyApplied: Core.TOL); var timer = new SpellPlagueTimer(this, m); diff --git a/Projects/UOContent/Spells/Second/Harm.cs b/Projects/UOContent/Spells/Second/Harm.cs index c7f5b7ec0..fc4d92f0e 100644 --- a/Projects/UOContent/Spells/Second/Harm.cs +++ b/Projects/UOContent/Spells/Second/Harm.cs @@ -74,7 +74,7 @@ namespace Server.Spells.Second m.PlaySound(0x1F1); } - SpellHelper.Damage(this, m, damage, 0, 0, 100, 0, 0); + SpellHelper.Damage(this, m, damage, 0, 0, 100, 0, 0, sdiAlreadyApplied: true); } } diff --git a/Projects/UOContent/Spells/Seventh/ChainLightning.cs b/Projects/UOContent/Spells/Seventh/ChainLightning.cs index cb8fe203e..ada952352 100644 --- a/Projects/UOContent/Spells/Seventh/ChainLightning.cs +++ b/Projects/UOContent/Spells/Seventh/ChainLightning.cs @@ -84,7 +84,7 @@ namespace Server.Spells.Seventh toDeal *= GetDamageScalar(m); Caster.DoHarmful(m); - SpellHelper.Damage(this, m, toDeal, 0, 0, 0, 0, 100); + SpellHelper.Damage(this, m, toDeal, 0, 0, 0, 0, 100, sdiAlreadyApplied: true); m.BoltEffect(0); } diff --git a/Projects/UOContent/Spells/Seventh/FlameStrike.cs b/Projects/UOContent/Spells/Seventh/FlameStrike.cs index ab871120a..f8d486553 100644 --- a/Projects/UOContent/Spells/Seventh/FlameStrike.cs +++ b/Projects/UOContent/Spells/Seventh/FlameStrike.cs @@ -54,7 +54,7 @@ namespace Server.Spells.Seventh m.FixedParticles(0x3709, 10, 30, 5052, EffectLayer.LeftFoot); m.PlaySound(0x208); - SpellHelper.Damage(this, m, damage, 0, 100, 0, 0, 0); + SpellHelper.Damage(this, m, damage, 0, 100, 0, 0, 0, sdiAlreadyApplied: true); } } diff --git a/Projects/UOContent/Spells/Seventh/MeteorSwarm.cs b/Projects/UOContent/Spells/Seventh/MeteorSwarm.cs index f73fb3111..73220eb1b 100644 --- a/Projects/UOContent/Spells/Seventh/MeteorSwarm.cs +++ b/Projects/UOContent/Spells/Seventh/MeteorSwarm.cs @@ -93,7 +93,7 @@ namespace Server.Spells.Seventh toDeal *= GetDamageScalar(m); Caster.DoHarmful(m); - SpellHelper.Damage(this, m, toDeal, 0, 100, 0, 0, 0); + SpellHelper.Damage(this, m, toDeal, 0, 100, 0, 0, 0, sdiAlreadyApplied: true); Caster.MovingParticles(m, 0x36D4, 7, 0, false, true, 9501, 1, 0, 0x100); } diff --git a/Projects/UOContent/Spells/Sixth/EnergyBolt.cs b/Projects/UOContent/Spells/Sixth/EnergyBolt.cs index 5bca8d5c7..9b59574ab 100644 --- a/Projects/UOContent/Spells/Sixth/EnergyBolt.cs +++ b/Projects/UOContent/Spells/Sixth/EnergyBolt.cs @@ -57,7 +57,7 @@ namespace Server.Spells.Sixth source.MovingParticles(m, 0x379F, 7, 0, false, true, 0, 0, 3043, 4043, 0x211, EffectLayer.RightHand, 0); source.PlaySound(0x20A); - SpellHelper.Damage(this, m, damage, 0, 0, 0, 0, 100); + SpellHelper.Damage(this, m, damage, 0, 0, 0, 0, 100, sdiAlreadyApplied: true); } } diff --git a/Projects/UOContent/Spells/Sixth/Explosion.cs b/Projects/UOContent/Spells/Sixth/Explosion.cs index b58bbdc51..aaec63b74 100644 --- a/Projects/UOContent/Spells/Sixth/Explosion.cs +++ b/Projects/UOContent/Spells/Sixth/Explosion.cs @@ -100,7 +100,7 @@ namespace Server.Spells.Sixth _target.FixedParticles(0x36BD, 20, 10, 5044, EffectLayer.Head); _target.PlaySound(0x307); - SpellHelper.Damage(_spell, _target, damage, 0, 100, 0, 0, 0); + SpellHelper.Damage(_spell, _target, damage, 0, 100, 0, 0, 0, sdiAlreadyApplied: true); } _spell?.RemoveDelayedDamageContext(_attacker); diff --git a/Projects/UOContent/Spells/Spellweaving/ArcaneEmpowerment.cs b/Projects/UOContent/Spells/Spellweaving/ArcaneEmpowerment.cs index 48f838e51..8fb9f6c36 100644 --- a/Projects/UOContent/Spells/Spellweaving/ArcaneEmpowerment.cs +++ b/Projects/UOContent/Spells/Spellweaving/ArcaneEmpowerment.cs @@ -82,7 +82,7 @@ namespace Server.Spells.Spellweaving } } - internal static void ApplySpellDamage(Mobile caster, Mobile target, ref int damage) + internal static void ApplySpellDamage(Mobile caster, Mobile target, ref int damage, bool sdiAlreadyApplied = false) { if (damage <= 0 || caster?.Alive != true || target?.Deleted != false || !_table.TryGetValue(caster, out var context)) @@ -95,9 +95,9 @@ namespace Server.Spells.Spellweaving if (playerTarget) { - // GetNewAosDamage already includes item SDI and caps it at 15% in PvP. Arcane - // Empowerment may use only the remaining room so the combined value stays capped. - var itemSdi = AosAttributes.GetValue(caster, AosAttribute.SpellDamage); + // When the generated damage already includes item SDI, Arcane Empowerment may use + // only the remaining room so the combined PvP value stays capped. + var itemSdi = sdiAlreadyApplied ? AosAttributes.GetValue(caster, AosAttribute.SpellDamage) : 0; bonus = Math.Min(bonus, Math.Max(0, PvPSdiCap - itemSdi)); } @@ -129,9 +129,9 @@ namespace Server.Spells.Spellweaving return AOS.Scale(baseHitsMax, SummonHealthBonus); } - internal static void AlterFollowerMeleeDamageTo(BaseCreature follower, ref int damage) + internal static void AlterFollowerMeleeDamageTo(BaseCreature follower, Mobile target, ref int damage) { - AlterFollowerDamageTo(follower, null, ref damage); + AlterFollowerDamageTo(follower, target, ref damage); } internal static void AlterFollowerSpellDamageTo(BaseCreature follower, Mobile target, ref int damage) diff --git a/Projects/UOContent/Spells/Spellweaving/GiftOfRenewal.cs b/Projects/UOContent/Spells/Spellweaving/GiftOfRenewal.cs index 11f21993c..4ab64b21b 100644 --- a/Projects/UOContent/Spells/Spellweaving/GiftOfRenewal.cs +++ b/Projects/UOContent/Spells/Spellweaving/GiftOfRenewal.cs @@ -138,7 +138,7 @@ namespace Server.Spells.Spellweaving var toHeal = _hitsPerRound; - SpellHelper.Heal(toHeal, _mobile, _caster); + SpellHelper.HealSpell(toHeal, _mobile, _caster); _mobile.FixedParticles(0x376A, 9, 32, 5005, EffectLayer.Waist); } } diff --git a/Projects/UOContent/Spells/Third/Fireball.cs b/Projects/UOContent/Spells/Third/Fireball.cs index 2c17cf98d..3ac14790a 100644 --- a/Projects/UOContent/Spells/Third/Fireball.cs +++ b/Projects/UOContent/Spells/Third/Fireball.cs @@ -55,7 +55,7 @@ namespace Server.Spells.Third source.MovingParticles(m, 0x36D4, 7, 0, false, true, 0, 0, 9502, 4019, 0x160, EffectLayer.RightHand, 0); source.PlaySound(Core.AOS ? 0x15E : 0x44B); - SpellHelper.Damage(this, m, damage, 0, 100, 0, 0, 0); + SpellHelper.Damage(this, m, damage, 0, 100, 0, 0, 0, sdiAlreadyApplied: true); } }