281 lines
No EOL
7.8 KiB
C#
281 lines
No EOL
7.8 KiB
C#
using System;
|
|
using Server.Items;
|
|
using Server.Network;
|
|
|
|
namespace Server.Items
|
|
{
|
|
public class Fists : BaseMeleeWeapon
|
|
{
|
|
public static void Initialize()
|
|
{
|
|
Mobile.DefaultWeapon = new Fists();
|
|
|
|
EventSink.DisarmRequest += new DisarmRequestEventHandler( EventSink_DisarmRequest );
|
|
EventSink.StunRequest += new StunRequestEventHandler( EventSink_StunRequest );
|
|
}
|
|
|
|
public override int UOStrengthReq{ get{ return 0; } }
|
|
public override int UOMinDamage{ get{ return 1; } }
|
|
public override int UOMaxDamage{ get{ return 8; } }
|
|
public override int UOSpeed{ get{ return 30; } }
|
|
|
|
public override int DefHitSound{ get{ return -1; } }
|
|
public override int DefMissSound{ get{ return -1; } }
|
|
|
|
public override SkillName DefSkill{ get{ return SkillName.HandToHand; } }
|
|
public override WeaponType DefType{ get{ return WeaponType.Fists; } }
|
|
public override WeaponAnimation DefAnimation{ get{ return WeaponAnimation.Wrestle; } }
|
|
|
|
public Fists() : base( 0 )
|
|
{
|
|
Visible = false;
|
|
Movable = false;
|
|
Quality = WeaponQuality.Regular;
|
|
}
|
|
|
|
public Fists( Serial serial ) : base( serial )
|
|
{
|
|
}
|
|
|
|
public override double GetDefendSkillValue( Mobile attacker, Mobile defender )
|
|
{
|
|
double wresValue = defender.Skills[SkillName.HandToHand].Value;
|
|
double anatValue = defender.Skills[SkillName.Tactics].Value;
|
|
double evalValue = defender.Skills[SkillName.Concentration].Value;
|
|
double incrValue = (anatValue + evalValue + 20.0) * 0.5;
|
|
|
|
if ( incrValue > 120.0 )
|
|
incrValue = 120.0;
|
|
|
|
if ( wresValue > incrValue )
|
|
return wresValue;
|
|
else
|
|
return incrValue;
|
|
}
|
|
|
|
public override TimeSpan OnSwing( Mobile attacker, Mobile defender )
|
|
{
|
|
if ( attacker.StunReady )
|
|
{
|
|
if ( attacker.CanBeginAction( typeof( Fists ) ) )
|
|
{
|
|
if ( attacker.Skills[SkillName.Tactics].Value >= 80.0 && attacker.Skills[SkillName.HandToHand].Value >= 80.0 )
|
|
{
|
|
if ( attacker.Stam >= 15 )
|
|
{
|
|
attacker.Stam -= 15;
|
|
|
|
if ( CheckMove( attacker, SkillName.Tactics ) )
|
|
{
|
|
StartMoveDelay( attacker );
|
|
|
|
attacker.StunReady = false;
|
|
|
|
attacker.SendLocalizedMessage( 1004013 ); // You successfully stun your opponent!
|
|
defender.SendLocalizedMessage( 1004014 ); // You have been stunned!
|
|
|
|
defender.Freeze( TimeSpan.FromSeconds( 4.0 ) );
|
|
}
|
|
else
|
|
{
|
|
attacker.SendLocalizedMessage( 1004010 ); // You failed in your attempt to stun.
|
|
defender.SendLocalizedMessage( 1004011 ); // Your opponent tried to stun you and failed.
|
|
}
|
|
}
|
|
else
|
|
{
|
|
attacker.SendLocalizedMessage( 1004009 ); // You are too fatigued to attempt anything.
|
|
}
|
|
}
|
|
else
|
|
{
|
|
attacker.SendLocalizedMessage( 1004008 ); // You are not skilled enough to stun your opponent.
|
|
attacker.StunReady = false;
|
|
}
|
|
}
|
|
}
|
|
else if ( attacker.DisarmReady )
|
|
{
|
|
if ( attacker.CanBeginAction( typeof( Fists ) ) )
|
|
{
|
|
if ( defender.Player || defender.Body.IsHuman )
|
|
{
|
|
if ( attacker.Skills[SkillName.Tactics].Value >= 80.0 && attacker.Skills[SkillName.HandToHand].Value >= 80.0 )
|
|
{
|
|
if ( attacker.Stam >= 15 )
|
|
{
|
|
Item toDisarm = defender.FindItemOnLayer( Layer.OneHanded );
|
|
|
|
if ( toDisarm == null || !toDisarm.Movable )
|
|
toDisarm = defender.FindItemOnLayer( Layer.TwoHanded );
|
|
|
|
Container pack = defender.Backpack;
|
|
|
|
if ( pack == null || toDisarm == null || !toDisarm.Movable )
|
|
{
|
|
attacker.SendLocalizedMessage( 1004001 ); // You cannot disarm your opponent.
|
|
}
|
|
else if ( CheckMove( attacker, SkillName.Tactics ) )
|
|
{
|
|
StartMoveDelay( attacker );
|
|
|
|
attacker.Stam -= 15;
|
|
attacker.DisarmReady = false;
|
|
|
|
attacker.SendLocalizedMessage( 1004006 ); // You successfully disarm your opponent!
|
|
defender.SendLocalizedMessage( 1004007 ); // You have been disarmed!
|
|
|
|
pack.DropItem( toDisarm );
|
|
}
|
|
else
|
|
{
|
|
attacker.Stam -= 15;
|
|
|
|
attacker.SendLocalizedMessage( 1004004 ); // You failed in your attempt to disarm.
|
|
defender.SendLocalizedMessage( 1004005 ); // Your opponent tried to disarm you but failed.
|
|
}
|
|
}
|
|
else
|
|
{
|
|
attacker.SendLocalizedMessage( 1004003 ); // You are too fatigued to attempt anything.
|
|
}
|
|
}
|
|
else
|
|
{
|
|
attacker.SendLocalizedMessage( 1004002 ); // You are not skilled enough to disarm your opponent.
|
|
attacker.DisarmReady = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
attacker.SendLocalizedMessage( 1004001 ); // You cannot disarm your opponent.
|
|
}
|
|
}
|
|
}
|
|
|
|
return base.OnSwing( attacker, defender );
|
|
}
|
|
|
|
/*public override void OnMiss( Mobile attacker, Mobile defender )
|
|
{
|
|
base.PlaySwingAnimation( attacker );
|
|
}*/
|
|
|
|
public override void Serialize( GenericWriter writer )
|
|
{
|
|
base.Serialize( writer );
|
|
|
|
writer.Write( (int) 0 ); // version
|
|
}
|
|
|
|
public override void Deserialize( GenericReader reader )
|
|
{
|
|
base.Deserialize( reader );
|
|
|
|
int version = reader.ReadInt();
|
|
|
|
Delete();
|
|
}
|
|
|
|
/* Wrestling moves */
|
|
|
|
private static bool CheckMove( Mobile m, SkillName other )
|
|
{
|
|
double wresValue = m.Skills[SkillName.HandToHand].Value;
|
|
double scndValue = m.Skills[other].Value;
|
|
|
|
/* 40% chance at 80, 80
|
|
* 50% chance at 100, 100
|
|
* 60% chance at 120, 120
|
|
*/
|
|
|
|
double chance = (wresValue + scndValue) / 400.0;
|
|
|
|
return ( chance >= Utility.RandomDouble() );
|
|
}
|
|
|
|
private static bool HasFreeHands( Mobile m )
|
|
{
|
|
Item item = m.FindItemOnLayer( Layer.OneHanded );
|
|
|
|
if ( item != null && !(item is Spellbook) )
|
|
return false;
|
|
|
|
return m.FindItemOnLayer( Layer.TwoHanded ) == null;
|
|
}
|
|
|
|
private static void EventSink_DisarmRequest( DisarmRequestEventArgs e )
|
|
{
|
|
Mobile m = e.Mobile;
|
|
|
|
double armsValue = m.Skills[SkillName.Tactics].Value;
|
|
double wresValue = m.Skills[SkillName.HandToHand].Value;
|
|
|
|
if ( !HasFreeHands( m ) )
|
|
{
|
|
m.SendLocalizedMessage( 1004029 ); // You must have your hands free to attempt to disarm your opponent.
|
|
m.DisarmReady = false;
|
|
}
|
|
else if ( armsValue >= 80.0 && wresValue >= 80.0 )
|
|
{
|
|
m.DisruptiveAction();
|
|
m.DisarmReady = !m.DisarmReady;
|
|
m.SendLocalizedMessage( m.DisarmReady ? 1019013 : 1019014 );
|
|
}
|
|
else
|
|
{
|
|
m.SendLocalizedMessage( 1004002 ); // You are not skilled enough to disarm your opponent.
|
|
m.DisarmReady = false;
|
|
}
|
|
}
|
|
|
|
private static void EventSink_StunRequest( StunRequestEventArgs e )
|
|
{
|
|
Mobile m = e.Mobile;
|
|
|
|
double anatValue = m.Skills[SkillName.Tactics].Value;
|
|
double wresValue = m.Skills[SkillName.HandToHand].Value;
|
|
|
|
if ( !HasFreeHands( m ) )
|
|
{
|
|
m.SendLocalizedMessage( 1004031 ); // You must have your hands free to attempt to stun your opponent.
|
|
m.StunReady = false;
|
|
}
|
|
else if ( anatValue >= 80.0 && wresValue >= 80.0 )
|
|
{
|
|
m.DisruptiveAction();
|
|
m.StunReady = !m.StunReady;
|
|
m.SendLocalizedMessage( m.StunReady ? 1019011 : 1019012 );
|
|
}
|
|
else
|
|
{
|
|
m.SendLocalizedMessage( 1004008 ); // You are not skilled enough to stun your opponent.
|
|
m.StunReady = false;
|
|
}
|
|
}
|
|
|
|
private class MoveDelayTimer : Timer
|
|
{
|
|
private Mobile m_Mobile;
|
|
|
|
public MoveDelayTimer( Mobile m ) : base( TimeSpan.FromSeconds( 10.0 ) )
|
|
{
|
|
m_Mobile = m;
|
|
|
|
Priority = TimerPriority.TwoFiftyMS;
|
|
|
|
m_Mobile.BeginAction( typeof( Fists ) );
|
|
}
|
|
|
|
protected override void OnTick()
|
|
{
|
|
m_Mobile.EndAction( typeof( Fists ) );
|
|
}
|
|
}
|
|
|
|
private static void StartMoveDelay( Mobile m )
|
|
{
|
|
new MoveDelayTimer( m ).Start();
|
|
}
|
|
}
|
|
} |