Всем привет, столкнулся с проблемой сервер одним словом засрали дез робами и т.д. вообщем клоз вещами они перестали ценится решил добавить в BaseClothing.cs durability. Все это хорошо все работает на вещах появилась дурабилити, но второй задачей стала как реализовать absorb durability? Аналогичным способом мы делали для бижутерии добавили метод onhit в BaseJewel и добавили проверку в BaseWeapon, на бижутерии дурабилити отнимается как надо но вот не выходит этим способом реализовать на всех вещах сделаных из Cloting.
Еще что хочу заметить что на всех Hats durability отнимается но не на робах и плащах.
Вот кусок кода онhit BaseCloth:
Код
public virtual int OnHit( BaseWeapon weapon, int damageTaken )
{
int Absorbed = Utility.RandomMinMax( 1, 4 );
//double HalfAr = ClothingRating / 2.0;
//int Absorbed = (int)(HalfAr + HalfAr*Utility.RandomDouble());
damageTaken -= Absorbed;
if ( damageTaken < 0 )
damageTaken = 0;
if ( Absorbed < 2 )
Absorbed = 2;
if ( 25 > Utility.Random( 100 ) ) // 25% chance to lower durability
{
if ( Core.AOS && m_AosClothingAttributes.SelfRepair > Utility.Random( 10 ) )
{
HitPoints += 2;
}
else
{
int wear;
if ( weapon.Type == WeaponType.Bashing )
wear = Absorbed / 1;
else
wear = Utility.Random( 1 );
if ( wear > 0 && m_MaxHitPoints > 0 )
{
if ( m_HitPoints >= wear )
{
HitPoints -= wear;
wear = 0;
}
else
{
wear -= HitPoints;
HitPoints = 0;
}
if ( wear > 0 )
{
if ( m_MaxHitPoints > wear )
{
MaxHitPoints -= wear;
if ( Parent is Mobile )
((Mobile)Parent).LocalOverheadMessage( MessageType.Regular, 0x3B2, 1061121 ); // Your equipment is severely damaged.
}
else
{
Delete();
}
}
}
}
}
return damageTaken;
}
И кусок с BaseWeapon.cs:
Код
public virtual int AbsorbDamageAOS( Mobile attacker, Mobile defender, int damage )
{
bool blocked = false;
if ( defender.Player || defender.Body.IsHuman )
{
blocked = CheckParry( defender );
if ( blocked )
{
defender.FixedEffect( 0x37B9, 10, 16 );
damage = 0;
// Successful block removes the Honorable Execution penalty.
HonorableExecution.RemovePenalty( defender );
if ( CounterAttack.IsCountering( defender ) )
{
BaseWeapon weapon = defender.Weapon as BaseWeapon;
if ( weapon != null )
{
defender.FixedParticles(0x3779, 1, 15, 0x158B, 0x0, 0x3, EffectLayer.Waist);
weapon.OnSwing( defender, attacker );
}
CounterAttack.StopCountering( defender );
}
if ( Confidence.IsConfident( defender ) )
{
defender.SendLocalizedMessage( 1063117 ); // Your confidence reassures you as you successfully block your opponent's blow.
double bushido = defender.Skills.Bushido.Value;
defender.Hits += Utility.RandomMinMax( 1, (int)(bushido / 12) );
defender.Stam += Utility.RandomMinMax( 1, (int)(bushido / 5) );
}
BaseShield shield = defender.FindItemOnLayer( Layer.TwoHanded ) as BaseShield;
if ( shield != null )
{
shield.OnHit( this, damage );
}
}
}
if ( !blocked )
{
double positionChance = Utility.RandomDouble();
Item armorItem;
if( positionChance < 0.07 )
armorItem = defender.NeckArmor;
else if( positionChance < 0.14 )
armorItem = defender.HandArmor;
else if( positionChance < 0.28 )
armorItem = defender.ArmsArmor;
else if( positionChance < 0.43 )
armorItem = defender.HeadArmor;
else if( positionChance < 0.65 )
armorItem = defender.LegsArmor;
else
armorItem = defender.ChestArmor;
IWearableDurability armor = armorItem as IWearableDurability;
if ( armor != null )
armor.OnHit( this, damage ); // call OnHit to lose durability
/* BaseJewel call OnHit to lose durability */
BaseJewel jewelRing = defender.FindItemOnLayer( Layer.Ring ) as BaseJewel;
BaseJewel jewelNecklace = defender.FindItemOnLayer( Layer.Neck ) as BaseJewel;
BaseJewel jewelEarrings = defender.FindItemOnLayer( Layer.Earrings ) as BaseJewel;
BaseJewel jewelBracelet = defender.FindItemOnLayer( Layer.Bracelet ) as BaseJewel;
//BaseClothing clothRobe = defender.FindItemOnLayer( Layer.Robe ) as BaseClothing;
if ( jewelRing != null )
{
jewelRing.OnHit( this, damage );
}
if ( jewelNecklace != null )
{
jewelNecklace.OnHit( this, damage );
}
if ( jewelEarrings != null )
{
jewelEarrings.OnHit( this, damage );
}
if ( jewelBracelet != null )
{
jewelBracelet.OnHit( this, damage );
}
//if ( clothRobe != null )
//{
// clothRobe.OnHit( this, damage );
//}
}
return damage;
}