diff --git a/Projects/UOContent/Migrations/Server.Mobiles.Clone.v0.json b/Projects/UOContent/Migrations/Server.Mobiles.Clone.v0.json new file mode 100644 index 000000000..a523e3d5c --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Mobiles.Clone.v0.json @@ -0,0 +1,11 @@ +{ + "version": 0, + "type": "Server.Mobiles.Clone", + "properties": [ + { + "name": "Caster", + "type": "Server.Mobile", + "rule": "SerializableInterfaceMigrationRule" + } + ] +} \ No newline at end of file diff --git a/Projects/UOContent/Misc/AOS.cs b/Projects/UOContent/Misc/AOS.cs index 009bc3fee..f9a61da7b 100644 --- a/Projects/UOContent/Misc/AOS.cs +++ b/Projects/UOContent/Misc/AOS.cs @@ -209,6 +209,11 @@ namespace Server } } + if (totalDamage <= 0) + { + return 0; + } + m.Damage(totalDamage, from); return totalDamage; } diff --git a/Projects/UOContent/Spells/Base/MagerySpell.cs b/Projects/UOContent/Spells/Base/MagerySpell.cs index 0648ac6c1..f900de32d 100644 --- a/Projects/UOContent/Spells/Base/MagerySpell.cs +++ b/Projects/UOContent/Spells/Base/MagerySpell.cs @@ -7,7 +7,7 @@ namespace Server.Spells { private static readonly int[] _manaTable = { 4, 6, 9, 11, 14, 20, 40, 50 }; - /* + /* * Starts at Circle -2 to account for scrolls * Mana requirements formula: (14 * (circle - 1)) + 2 = 50% probability * Add or subtract 20 for max or min limits diff --git a/Projects/UOContent/Spells/Gargoyle/SpellDefinitions/FlySpell.cs b/Projects/UOContent/Spells/Gargoyle/SpellDefinitions/FlySpell.cs index d6769c25f..6339be747 100644 --- a/Projects/UOContent/Spells/Gargoyle/SpellDefinitions/FlySpell.cs +++ b/Projects/UOContent/Spells/Gargoyle/SpellDefinitions/FlySpell.cs @@ -7,8 +7,7 @@ namespace Server.Spells private static readonly SpellInfo _info = new("Gargoyle Flight", null, -1, 9002); private bool m_Stop; - public FlySpell(Mobile caster) - : base(caster, null, _info) + public FlySpell(Mobile caster) : base(caster, null, _info) { } diff --git a/Projects/UOContent/Spells/Mysticism/AnimatedWeaponSpell.cs b/Projects/UOContent/Spells/Mysticism/AnimatedWeaponSpell.cs index 740ee09c8..f5e7cd101 100644 --- a/Projects/UOContent/Spells/Mysticism/AnimatedWeaponSpell.cs +++ b/Projects/UOContent/Spells/Mysticism/AnimatedWeaponSpell.cs @@ -16,8 +16,7 @@ namespace Server.Spells.Mysticism Reagent.Nightshade ); - public AnimatedWeaponSpell(Mobile caster, Item scroll = null) - : base(caster, scroll, _info) + public AnimatedWeaponSpell(Mobile caster, Item scroll = null) : base(caster, scroll, _info) { } diff --git a/Projects/UOContent/Spells/Mysticism/EagleStrikeSpell.cs b/Projects/UOContent/Spells/Mysticism/EagleStrikeSpell.cs index 30e263db6..542d911b8 100644 --- a/Projects/UOContent/Spells/Mysticism/EagleStrikeSpell.cs +++ b/Projects/UOContent/Spells/Mysticism/EagleStrikeSpell.cs @@ -16,8 +16,7 @@ namespace Server.Spells.Mysticism Reagent.MandrakeRoot ); - public EagleStrikeSpell(Mobile caster, Item scroll = null) - : base(caster, scroll, _info) + public EagleStrikeSpell(Mobile caster, Item scroll = null) : base(caster, scroll, _info) { } diff --git a/Projects/UOContent/Spells/Mysticism/HailStormSpell.cs b/Projects/UOContent/Spells/Mysticism/HailStormSpell.cs index 586833388..f30fe994e 100644 --- a/Projects/UOContent/Spells/Mysticism/HailStormSpell.cs +++ b/Projects/UOContent/Spells/Mysticism/HailStormSpell.cs @@ -16,8 +16,7 @@ namespace Server.Spells.Mysticism Reagent.MandrakeRoot ); - public HailStormSpell(Mobile caster, Item scroll = null) - : base(caster, scroll, _info) + public HailStormSpell(Mobile caster, Item scroll = null) : base(caster, scroll, _info) { } diff --git a/Projects/UOContent/Spells/Mysticism/NetherCycloneSpell.cs b/Projects/UOContent/Spells/Mysticism/NetherCycloneSpell.cs index 15a79e752..aaf18cf2d 100644 --- a/Projects/UOContent/Spells/Mysticism/NetherCycloneSpell.cs +++ b/Projects/UOContent/Spells/Mysticism/NetherCycloneSpell.cs @@ -16,8 +16,7 @@ namespace Server.Spells.Mysticism Reagent.Bloodmoss ); - public NetherCycloneSpell(Mobile caster, Item scroll = null) - : base(caster, scroll, _info) + public NetherCycloneSpell(Mobile caster, Item scroll = null) : base(caster, scroll, _info) { } diff --git a/Projects/UOContent/Spells/Mysticism/SpellPlagueSpell.cs b/Projects/UOContent/Spells/Mysticism/SpellPlagueSpell.cs index eb6f708ea..e2040d65b 100644 --- a/Projects/UOContent/Spells/Mysticism/SpellPlagueSpell.cs +++ b/Projects/UOContent/Spells/Mysticism/SpellPlagueSpell.cs @@ -19,8 +19,7 @@ namespace Server.Spells.Mysticism private static readonly Dictionary _table = new(); - public SpellPlagueSpell(Mobile caster, Item scroll = null) - : base(caster, scroll, _info) + public SpellPlagueSpell(Mobile caster, Item scroll = null) : base(caster, scroll, _info) { } diff --git a/Projects/UOContent/Spells/Mysticism/StoneFormSpell.cs b/Projects/UOContent/Spells/Mysticism/StoneFormSpell.cs index fa2e83169..3106e3c54 100644 --- a/Projects/UOContent/Spells/Mysticism/StoneFormSpell.cs +++ b/Projects/UOContent/Spells/Mysticism/StoneFormSpell.cs @@ -21,8 +21,7 @@ namespace Server.Spells.Mysticism private static readonly Dictionary _table = new(); - public StoneFormSpell(Mobile caster, Item scroll = null) - : base(caster, scroll, _info) + public StoneFormSpell(Mobile caster, Item scroll = null) : base(caster, scroll, _info) { } diff --git a/Projects/UOContent/Spells/Necromancy/EvilOmen.cs b/Projects/UOContent/Spells/Necromancy/EvilOmen.cs index 21bde9249..bc90da8e6 100644 --- a/Projects/UOContent/Spells/Necromancy/EvilOmen.cs +++ b/Projects/UOContent/Spells/Necromancy/EvilOmen.cs @@ -18,8 +18,7 @@ namespace Server.Spells.Necromancy private static readonly Dictionary _table = new(); - public EvilOmenSpell(Mobile caster, Item scroll = null) - : base(caster, scroll, _info) + public EvilOmenSpell(Mobile caster, Item scroll = null) : base(caster, scroll, _info) { } @@ -83,14 +82,13 @@ namespace Server.Spells.Necromancy public static bool EndEffect(Mobile m) { - if (!_table.Remove(m, out var mod)) + if (_table.Remove(m, out var mod)) { - return false; + mod.Remove(); + return true; } - mod?.Remove(); - - return true; + return false; } } } diff --git a/Projects/UOContent/Spells/Necromancy/Wither.cs b/Projects/UOContent/Spells/Necromancy/Wither.cs index 2acc4cb94..bba496417 100644 --- a/Projects/UOContent/Spells/Necromancy/Wither.cs +++ b/Projects/UOContent/Spells/Necromancy/Wither.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using Server.Collections; using Server.Items; using Server.Mobiles; @@ -18,8 +17,7 @@ namespace Server.Spells.Necromancy Reagent.PigIron ); - public WitherSpell(Mobile caster, Item scroll = null) - : base(caster, scroll, _info) + public WitherSpell(Mobile caster, Item scroll = null) : base(caster, scroll, _info) { } diff --git a/Projects/UOContent/Spells/Ninjitsu/DeathStrike.cs b/Projects/UOContent/Spells/Ninjitsu/DeathStrike.cs index 94c71ab19..12b9f5523 100644 --- a/Projects/UOContent/Spells/Ninjitsu/DeathStrike.cs +++ b/Projects/UOContent/Spells/Ninjitsu/DeathStrike.cs @@ -133,6 +133,8 @@ namespace Server.Spells.Ninjitsu { damage /= 2; } + + _target.Damage(damage, _attacker); // Damage is direct. } else { @@ -141,14 +143,7 @@ namespace Server.Spells.Ninjitsu var maxDamage = Steps >= 5 ? 62 : 22; damage = Math.Clamp((int)(baseDamage + stalkingBonus), 0, maxDamage) + _damageBonus; - } - if (Core.ML) - { - _target.Damage(damage, _attacker); // Damage is direct. - } - else - { // Damage is physical. AOS.Damage( _target, diff --git a/Projects/UOContent/Spells/Ninjitsu/KiAttack.cs b/Projects/UOContent/Spells/Ninjitsu/KiAttack.cs index 7d76386cf..9bfc24587 100644 --- a/Projects/UOContent/Spells/Ninjitsu/KiAttack.cs +++ b/Projects/UOContent/Spells/Ninjitsu/KiAttack.cs @@ -53,7 +53,6 @@ namespace Server.Spells.Ninjitsu /* * Pub40 changed pvp damage max to 55% */ - return 1.0 + GetBonus(attacker) / (Core.ML && attacker.Player && defender.Player ? 40 : 10); } diff --git a/Projects/UOContent/Spells/Ninjitsu/MirrorImage.cs b/Projects/UOContent/Spells/Ninjitsu/MirrorImage.cs index ebfe0d702..3096708c0 100644 --- a/Projects/UOContent/Spells/Ninjitsu/MirrorImage.cs +++ b/Projects/UOContent/Spells/Ninjitsu/MirrorImage.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using ModernUO.Serialization; using Server.Items; using Server.Mobiles; using Server.Spells; @@ -34,29 +35,21 @@ namespace Server.Spells.Ninjitsu public static void AddClone(Mobile m) { - if (m == null) + if (m != null) { - return; + _cloneCount[m] = 1 + (_cloneCount.TryGetValue(m, out var count) ? count : 0); } - - _cloneCount[m] = 1 + (_cloneCount.TryGetValue(m, out var count) ? count : 0); } public static void RemoveClone(Mobile m) { - if (m == null || !_cloneCount.TryGetValue(m, out var count)) + _cloneCount.Remove(m, out var count); + if (m == null || count <= 0) { return; } - if (count <= 1) - { - _cloneCount.Remove(m); - } - else - { - _cloneCount[m]--; - } + _cloneCount[m] = count - 1; } public override bool CheckCast() @@ -122,13 +115,15 @@ namespace Server.Spells.Ninjitsu namespace Server.Mobiles { - public class Clone : BaseCreature + [SerializationGenerator(0)] + public partial class Clone : BaseCreature { - private Mobile m_Caster; + [SerializableField(0)] + private Mobile _caster; public Clone(Mobile caster) : base(AIType.AI_Melee, FightMode.None) { - m_Caster = caster; + _caster = caster; Body = caster.Body; @@ -171,11 +166,7 @@ namespace Server.Mobiles new UnsummonTimer(this, duration).Start(); SummonEnd = Core.Now + duration; - MirrorImage.AddClone(m_Caster); - } - - public Clone(Serial serial) : base(serial) - { + MirrorImage.AddClone(_caster); } protected override BaseAI ForcedAI => new CloneAI(this); @@ -216,28 +207,14 @@ namespace Server.Mobiles public override void OnAfterDelete() { - MirrorImage.RemoveClone(m_Caster); + MirrorImage.RemoveClone(_caster); base.OnAfterDelete(); } - public override void Serialize(IGenericWriter writer) + [AfterDeserialization] + private void AfterDeserialization() { - base.Serialize(writer); - - writer.WriteEncodedInt(0); // version - - writer.Write(m_Caster); - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadEncodedInt(); - - m_Caster = reader.ReadEntity(); - - MirrorImage.AddClone(m_Caster); + MirrorImage.AddClone(_caster); } } }