using Server.Network; namespace Server.Items { public class BaseShield : BaseArmor { public BaseShield(int itemID) : base(itemID) { } public BaseShield(Serial serial) : base(serial) { } public override ArmorMaterialType MaterialType => ArmorMaterialType.Plate; public override double ArmorRating { get { Mobile m = Parent as Mobile; double ar = base.ArmorRating; if (m != null) return m.Skills.Parry.Value * ar / 200.0 + 1.0; return ar; } } public override void Serialize(IGenericWriter writer) { base.Serialize(writer); writer.Write(1); //version } public override void Deserialize(IGenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); if (version < 1) { if (this is Aegis) return; // The 15 bonus points to resistances are not applied to shields on OSI. PhysicalBonus = 0; FireBonus = 0; ColdBonus = 0; PoisonBonus = 0; EnergyBonus = 0; } } public override int OnHit(BaseWeapon weapon, int damage) { if (Core.AOS) { if (ArmorAttributes.SelfRepair > Utility.Random(10)) { HitPoints += 2; } else { double halfArmor = ArmorRating / 2.0; int absorbed = (int)(halfArmor + halfArmor * Utility.RandomDouble()); if (absorbed < 2) absorbed = 2; int wear; if (weapon.Type == WeaponType.Bashing) wear = absorbed / 2; else wear = Utility.Random(2); if (wear > 0 && MaxHitPoints > 0) { if (HitPoints >= wear) { HitPoints -= wear; wear = 0; } else { wear -= HitPoints; HitPoints = 0; } if (wear > 0) { if (MaxHitPoints > wear) { MaxHitPoints -= wear; if (Parent is Mobile mobile) mobile.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1061121); // Your equipment is severely damaged. } else { Delete(); } } } } return 0; } if (!(Parent is Mobile owner)) return damage; double ar = ArmorRating; double chance = (owner.Skills.Parry.Value - ar * 2.0) / 100.0; if (chance < 0.01) chance = 0.01; /* FORMULA: Displayed AR = ((Parrying Skill * Base AR of Shield) � 200) + 1 FORMULA: % Chance of Blocking = parry skill - (shieldAR * 2) FORMULA: Melee Damage Absorbed = (AR of Shield) / 2 | Archery Damage Absorbed = AR of Shield */ if (owner.CheckSkill(SkillName.Parry, chance)) { if (weapon.Skill == SkillName.Archery) damage -= (int)ar; else damage -= (int)(ar / 2.0); if (damage < 0) damage = 0; owner.FixedEffect(0x37B9, 10, 16); if (25 > Utility.Random(100)) // 25% chance to lower durability { int wear = Utility.Random(2); if (wear > 0 && MaxHitPoints > 0) { if (HitPoints >= wear) { HitPoints -= wear; wear = 0; } else { wear -= HitPoints; HitPoints = 0; } if (wear > 0) { if (MaxHitPoints > wear) { MaxHitPoints -= wear; ((Mobile)Parent).LocalOverheadMessage(MessageType.Regular, 0x3B2, 1061121); // Your equipment is severely damaged. } else { Delete(); } } } } } return damage; } } }