using System; using ModernUO.Serialization; namespace Server.Items; [SerializationGenerator(0, false)] public partial class BaseShield : BaseArmor { public BaseShield(int itemID) : base(itemID) { } public override ArmorMaterialType MaterialType => ArmorMaterialType.Plate; public override double ArmorRating { get { var m = Parent as Mobile; var ar = base.ArmorRating; if (m != null) { return m.Skills.Parry.Value * ar / 200.0 + 1.0; } return ar; } } public override int OnHit(BaseWeapon weapon, int damage) { if (Core.AOS) { if (ArmorAttributes.SelfRepair > Utility.Random(10)) { HitPoints += 2; } else { var halfArmor = ArmorRating / 2.0; var absorbed = Math.Max(2, (int)(halfArmor + halfArmor * Utility.RandomDouble())); TryLowerDurability(weapon.Type == WeaponType.Bashing ? absorbed / 2 : Utility.Random(2)); } return 0; } if (Parent is not Mobile owner) { return damage; } var ar = ArmorRating; var chance = (owner.Skills.Parry.Value - ar * 2.0) / 100.0; if (chance < 0.01) { chance = 0.01; } if (owner.CheckSkill(SkillName.Parry, chance)) { damage -= Math.Min(damage, weapon.Skill == SkillName.Archery ? (int)ar : (int)(ar / 2.0)); owner.FixedEffect(0x37B9, 10, 16); if (Utility.Random(100) < 25) // 25% chance to lower durability { TryLowerDurability(Utility.Random(2)); } } return damage; } private void TryLowerDurability(int wear) { if (wear <= 0 || MaxHitPoints <= 0) { return; } if (HitPoints >= wear) { HitPoints -= wear; wear = 0; } else { wear -= HitPoints; HitPoints = 0; } if (wear <= 0) { return; } if (MaxHitPoints > wear) { MaxHitPoints -= wear; // Your equipment is severely damaged. (Parent as Mobile)?.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1061121); } else { Delete(); } } }