ModernUO/Projects/UOContent/Items/Shields/BaseShield.cs
2020-08-25 18:00:51 -07:00

179 lines
No EOL
4 KiB
C#
Raw Blame History

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) <20> 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 (Utility.Random(100) < 25) // 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;
}
}
}