198 lines
5.7 KiB
C#
198 lines
5.7 KiB
C#
using System;
|
||
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
|
||
{
|
||
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 void Serialize(IGenericWriter writer)
|
||
{
|
||
base.Serialize(writer);
|
||
|
||
writer.Write(1); // version
|
||
}
|
||
|
||
public override void Deserialize(IGenericReader reader)
|
||
{
|
||
base.Deserialize(reader);
|
||
|
||
var 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
|
||
{
|
||
var halfArmor = ArmorRating / 2.0;
|
||
var 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;
|
||
}
|
||
|
||
var ar = ArmorRating;
|
||
var 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))
|
||
{
|
||
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
|
||
{
|
||
var 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;
|
||
}
|
||
}
|
||
}
|