ModernUO/Projects/UOContent/Items/Shields/BaseShield.cs

113 lines
2.5 KiB
C#

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();
}
}
}