using System;
using Server.Items;
using Server.Network;
using Server.Spells;
using Server.Mobiles;
using Server.Targeting;
using System.Collections;
using Server.Enums;
using Server.ACC.CM;
namespace Server.Items
{
public abstract class BaseRanged : BaseMeleeWeapon
{
internal Mobile m_Mobile;
private static BaseRanged m_This;
public static readonly TimeSpan PlayerFreezeDuration = TimeSpan.FromSeconds( 3.0 );
public static readonly TimeSpan NPCFreezeDuration = TimeSpan.FromSeconds( 6.0 );
public abstract int EffectID{ get; }
public abstract Type AmmoType{ get; }
public abstract Item Ammo{ get; }
public override int DefHitSound{ get{ return 0x234; } }
public override int DefMissSound{ get{ return 0x238; } }
public override SkillName DefSkill{ get{ return SkillName.Archery; } }
public override WeaponType DefType{ get{ return WeaponType.Ranged; } }
public override WeaponAnimation DefAnimation{ get{ return WeaponAnimation.ShootXBow; } }
public override SkillName AccuracySkill{ get{ return SkillName.Archery; } }
public BaseRanged( int itemID ) : base( itemID )
{
m_This = this;
}
public BaseRanged( Serial serial ) : base( serial )
{
m_This = this;
}
public override bool OnEquip( Mobile from )
{
m_Mobile = from;
return true;
}
public override TimeSpan OnSwing( Mobile attacker, Mobile defender )
{
WeaponAbility a = WeaponAbility.GetCurrentAbility( attacker );
// Make sure we've been standing still for .25/.5/1 second depending on Era
if ( DateTime.Now > ( attacker.LastMoveTime + TimeSpan.FromSeconds( Core.SE ? 0.25 : (Core.AOS ? 0.5 : 1.0) )) || (Core.AOS && WeaponAbility.GetCurrentAbility( attacker ) is MovingShot) )
{
bool canSwing = true;
if ( Core.AOS )
{
canSwing = ( !attacker.Paralyzed && !attacker.Frozen );
if ( canSwing )
{
Spell sp = attacker.Spell as Spell;
canSwing = ( sp == null || !sp.IsCasting || !sp.BlocksMovement );
}
}
if ( canSwing && attacker.HarmfulCheck( defender ) )
{
attacker.DisruptiveAction();
attacker.Send( new Swing( 0, attacker, defender ) );
if ( OnFired( attacker, defender ) )
{
if ( CheckHit( attacker, defender ) )
OnHit( attacker, defender );
else
OnMiss( attacker, defender );
}
}
attacker.RevealingAction();
return GetDelay( attacker );
}
else
{
attacker.RevealingAction();
return TimeSpan.FromSeconds( 0.25 );
}
}
private static bool ModuleCheck( Mobile from )
{
BaseRangedModule module = ( BaseRangedModule )CentralMemory.GetModule( m_This.Serial, typeof( BaseRangedModule ) );
if ( module == null )
{
CentralMemory.AppendModule( m_This.Serial, new BaseRangedModule( m_This.Serial ), true );
return true;
}
return true;
}
public override void OnHit( Mobile attacker, Mobile defender )
{
if ( attacker == null || defender == null )
return;
BaseRangedModule module = ( BaseRangedModule )CentralMemory.GetModule( m_This.Serial, typeof( BaseRangedModule ) );
if ( module == null ) { ModuleCheck( attacker ); }
if ( CheckString( attacker, defender ) == false )
return;
if ( AmmoType == typeof( PoisonArrow ) )
{
switch ( Utility.Random( 4 ) )
{
case 0: defender.ApplyPoison( defender, Poison.Deadly );
defender.FixedParticles( 0x3728, 200, 25, 69, EffectLayer.Waist ); break;
case 1: defender.ApplyPoison( defender, Poison.Greater );
defender.FixedParticles( 0x3728, 200, 25, 69, EffectLayer.Waist ); break;
case 2: defender.ApplyPoison( defender, Poison.Regular );
defender.FixedParticles( 0x3728, 200, 25, 69, EffectLayer.Waist ); break;
case 3: defender.ApplyPoison( defender, Poison.Lesser );
defender.FixedParticles( 0x3728, 200, 25, 69, EffectLayer.Waist ); break;
}
}
else if ( AmmoType == typeof( PoisonBolt ) )
{
switch ( Utility.Random( 4 ) )
{
case 0: defender.ApplyPoison( defender, Poison.Deadly );
defender.FixedParticles( 0x3728, 200, 25, 69, EffectLayer.Waist ); break;
case 1: defender.ApplyPoison( defender, Poison.Greater );
defender.FixedParticles( 0x3728, 200, 25, 69, EffectLayer.Waist ); break;
case 2: defender.ApplyPoison( defender, Poison.Regular );
defender.FixedParticles( 0x3728, 200, 25, 69, EffectLayer.Waist ); break;
case 3: defender.ApplyPoison(defender, Poison.Lesser );
defender.FixedParticles( 0x3728, 200, 25, 69, EffectLayer.Waist ); break;
}
}
else if ( AmmoType == typeof( ExplosiveArrow ) )
{
switch ( Utility.Random( 3 ) )
{
case 0: defender.FixedParticles( 0x36BD, 20, 10, 5044, EffectLayer.Waist );
defender.PlaySound( 0x307 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 10, 50 ), 0, 100, 0, 0, 0 ); break;
case 1: defender.FixedParticles( 0x36BD, 20, 10, 5044, EffectLayer.Waist );
defender.PlaySound( 0x307 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 30, 70 ), 0, 100, 0, 0, 0 ); break;
case 2: defender.FixedParticles(0x36BD, 20, 10, 5044, EffectLayer.Waist );
defender.PlaySound( 0x307 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 50, 100 ), 0, 100, 0, 0, 0 ); break;
}
}
else if ( AmmoType == typeof( ExplosiveBolt ) )
{
switch ( Utility.Random( 3 ) )
{
case 0: defender.FixedParticles( 0x36BD, 20, 10, 5044, EffectLayer.Waist );
defender.PlaySound( 0x307 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 10, 50 ), 0, 100, 0, 0, 0 ); break;
case 1: defender.FixedParticles( 0x36BD, 20, 10, 5044, EffectLayer.Waist );
defender.PlaySound( 0x307 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 30, 70 ), 0, 100, 0, 0, 0 ); break;
case 2: defender.FixedParticles( 0x36BD, 20, 10, 5044, EffectLayer.Waist );
defender.PlaySound( 0x307 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 50, 100 ), 0, 100, 0, 0, 0 ); break;
}
}
else if ( AmmoType == typeof( ArmorPiercingArrow ) )
{
switch ( Utility.Random( 3 ) )
{
case 0: defender.PlaySound( 0x56 );
defender.FixedParticles( 0x3728, 200, 25, 9942, EffectLayer.Waist );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 10, 50 ), 100, 0, 0, 0, 0 ); break;
case 1: defender.PlaySound(0x56);
defender.FixedParticles( 0x3728, 200, 25, 9942, EffectLayer.Waist );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 30, 70 ), 100, 0, 0, 0, 0 ); break;
case 2: defender.PlaySound( 0x56 );
defender.FixedParticles( 0x3728, 200, 25, 9942, EffectLayer.Waist );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 50, 100 ), 100, 0, 0, 0, 0 ); break;
}
}
else if ( AmmoType == typeof( ArmorPiercingBolt ) )
{
switch ( Utility.Random( 3 ) )
{
case 0: defender.PlaySound( 0x56 );
defender.FixedParticles( 0x3728, 200, 25, 9942, EffectLayer.Waist );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 10, 50 ), 100, 0, 0, 0, 0 ); break;
case 1: defender.PlaySound( 0x56 );
defender.FixedParticles( 0x3728, 200, 25, 9942, EffectLayer.Waist );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 30, 70 ), 100, 0, 0, 0, 0 ); break;
case 2: defender.PlaySound( 0x56 );
defender.FixedParticles( 0x3728, 200, 25, 9942, EffectLayer.Waist );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 50, 100 ), 100, 0, 0, 0, 0 ); break;
}
}
else if ( AmmoType == typeof( FreezeArrow ) )
{
switch ( Utility.Random( 3 ) )
{
case 0: defender.PlaySound( 0x204 );
defender.Freeze( defender.Player ? PlayerFreezeDuration : NPCFreezeDuration );
defender.FixedEffect( 0x376A, 9, 32 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 10, 50 ), 0, 0, 100, 0, 0 ); break;
case 1: defender.PlaySound( 0x204 );
defender.Freeze( defender.Player ? PlayerFreezeDuration : NPCFreezeDuration );
defender.FixedEffect( 0x376A, 9, 32 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 30, 70 ), 0, 0, 100, 0, 0 ); break;
case 2: defender.PlaySound( 0x204 );
defender.Freeze( defender.Player ? PlayerFreezeDuration : NPCFreezeDuration );
defender.FixedEffect( 0x376A, 9, 32 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 50, 100 ), 0, 0, 100, 0, 0 ); break;
}
}
else if ( AmmoType == typeof( FreezeBolt ) )
{
switch ( Utility.Random( 3 ) )
{
case 0: defender.PlaySound( 0x204 );
defender.Freeze( defender.Player ? PlayerFreezeDuration : NPCFreezeDuration );
defender.FixedEffect( 0x376A, 9, 32 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 10, 50 ), 0, 0, 100, 0, 0 ); break;
case 1: defender.PlaySound( 0x204 );
defender.Freeze( defender.Player ? PlayerFreezeDuration : NPCFreezeDuration );
defender.FixedEffect( 0x376A, 9, 32 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 30, 70 ), 0, 0, 100, 0, 0 ); break;
case 2: defender.PlaySound( 0x204 );
defender.Freeze( defender.Player ? PlayerFreezeDuration : NPCFreezeDuration );
defender.FixedEffect( 0x376A, 9, 32 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 50, 100 ), 0, 0, 100, 0, 0 ); break;
}
}
else if ( AmmoType == typeof( LightningArrow ) )
{
switch ( Utility.Random( 3 ) )
{
case 0: defender.PlaySound( 1471 );
defender.BoltEffect( 0 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 10, 50 ), 100, 0, 0, 0, 0 ); break;
case 1: defender.PlaySound( 1471 );
defender.BoltEffect( 0 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 30, 70 ), 100, 0, 0, 0, 0 ); break;
case 2: defender.PlaySound( 1471 );
defender.BoltEffect( 0 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 50, 100 ), 100, 0, 0, 0, 0 ); break;
}
}
else if ( AmmoType == typeof( LightningBolt ) )
{
switch ( Utility.Random( 3 ) )
{
case 0: defender.PlaySound( 1471 );
defender.BoltEffect( 0 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 10, 50 ), 100, 0, 0, 0, 0 ); break;
case 1: defender.PlaySound( 1471 );
defender.BoltEffect( 0 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 30, 70 ), 100, 0, 0, 0, 0 ); break;
case 2: defender.PlaySound( 1471 );
defender.BoltEffect( 0 );
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 50, 100 ), 100, 0, 0, 0, 0 ); break;
}
}
else if ( Ammo == null )
attacker.SendMessage( "You are out of arrows, or may have to choose a different type of arrow by double clicking the bow." );
if ( attacker.Player && !defender.Player && ( defender.Body.IsAnimal || defender.Body.IsMonster ) && 0.4 >= Utility.RandomDouble() )
defender.AddToBackpack( Ammo );
base.OnHit( attacker, defender );
}
public override void OnMiss( Mobile attacker, Mobile defender )
{
if ( attacker.Player && 0.4 >= Utility.RandomDouble() )
Ammo.MoveToWorld( new Point3D( defender.X + Utility.RandomMinMax( -1, 1 ), defender.Y + Utility.RandomMinMax( -1, 1 ), defender.Z ), defender.Map );
base.OnMiss( attacker, defender );
}
public virtual bool OnFired( Mobile attacker, Mobile defender )
{
Container pack = attacker.Backpack;
BaseQuiver quiver = attacker.FindItemOnLayer( Layer.MiddleTorso ) as BaseQuiver;
if( attacker.Player && quiver != null && quiver.LowerAmmoCost > Utility.Random( 100 ) )
{
attacker.MovingEffect( defender, EffectID, 18, 1, false, false );
return true;
}
if( attacker.Player &&
( quiver == null || !quiver.ConsumeTotal( AmmoType, 1 ) ) &&
( pack == null || !pack.ConsumeTotal( AmmoType, 1 ) ) )
return false;
attacker.MovingEffect( defender, EffectID, 18, 1, false, false );
return true;
}
public override void OnDoubleClick( Mobile from )
{
if ( from == null )
return;
if ( IsChildOf( from.Backpack ) || Parent == from )
{
if ( from != null && this is Bow || this is CompositeBow || this is ElvenCompositeLongbow ||
this is MagicalShortbow || this is Yumi )
{
from.SendMessage( "Please choose which type of arrows you wish to use." );
from.Target = new BowInternalTarget( this );
}
if ( from != null && this is Crossbow || this is HeavyCrossbow || this is RepeatingCrossbow )
{
from.SendMessage( "Please choose which type of bolts you wish to use." );
from.Target = new CrossbowInternalTarget( this );
}
}
else
return;
}
/* public override void OnDelete()
{
BaseRangedModule module = ( BaseRangedModule )CentralMemory.GetModule( m_This.Serial, typeof( BaseRangedModule ) );
if ( module != null )
{
module.Delete();
}
base.OnDelete();
}*/
public virtual bool CheckString( Mobile attacker, Mobile defender )
{
BaseRangedModule module = ( BaseRangedModule )CentralMemory.GetModule( m_This.Serial, typeof( BaseRangedModule ) );
if ( module == null ) { ModuleCheck( attacker ); return false; }
if ( module.m_HasBowString )
{
if ( module.StringStrengthSelection == StringStrength.VeryWeak )
{
if ( .05 > Utility.Random( 100 ) )
{
BonusDamage( attacker, defender );
return true;
}
if ( .10 > Utility.Random( 1000 ) ) //1 in a 100 chances of breaking.
{
module.HasBowString = false;
module.StringStrengthSelection = StringStrength.NoString;
attacker.SendMessage( "Your string just broke." );
}
return true;
}
else if ( module.StringStrengthSelection == StringStrength.Weak )
{
if ( .10 > Utility.Random( 100 ) )
{
BonusDamage( attacker, defender );
return true;
}
if ( .09 > Utility.Random( 1000 ) ) //1 in a 110 chances of breaking.
{
module.HasBowString = false;
module.StringStrengthSelection = StringStrength.NoString;
attacker.SendMessage( "Your string just broke." );
}
return true;
}
else if ( module.StringStrengthSelection == StringStrength.Sturdy )
{
if ( .15 > Utility.Random( 100 ) )
{
BonusDamage( attacker, defender );
return true;
}
if ( .08 > Utility.Random( 1000 ) ) //1 in a 125 chances of breaking.
{
module.HasBowString = false;
module.StringStrengthSelection = StringStrength.NoString;
attacker.SendMessage( "Your string just broke." );
}
return true;
}
else if ( module.StringStrengthSelection == StringStrength.Strong )
{
if ( .20 > Utility.Random( 100 ) )
{
BonusDamage( attacker, defender );
return true;
}
if ( .05 > Utility.Random( 1000 ) ) //1 in a 200 chances of breaking.
{
module.HasBowString = false;
module.StringStrengthSelection = StringStrength.NoString;
attacker.SendMessage( "Your string just broke." );
}
}
else if ( module.StringStrengthSelection == StringStrength.Dependable )
{
if ( .25 > Utility.Random( 100 ) )
{
BonusDamage( attacker, defender );
return true;
}
if ( .03 > Utility.Random( 1000 ) ) //1 in a 333 chances of breaking.
{
module.HasBowString = false;
module.StringStrengthSelection = StringStrength.NoString;
attacker.SendMessage( "Your string just broke." );
}
return true;
}
else if ( module.StringStrengthSelection == StringStrength.Indestructable )
{
if ( .33 > Utility.Random( 100 ) )
{
BonusDamage( attacker, defender );
return true;
}
//No chance of breaking.
return true;
}
else
{
return false;
}
}
else
{
attacker.SendMessage( "You cannot shoot a bow without a string." );
return false;
}
return false;
}
public virtual bool BonusDamage( Mobile attacker, Mobile defender )
{
BaseRangedModule module = ( BaseRangedModule )CentralMemory.GetModule( m_This.Serial, typeof( BaseRangedModule ) );
if ( module == null ) { ModuleCheck( attacker ); }
attacker.SendMessage( "" );
attacker.SendMessage( 0x35, "** Bonus Hit **" );
attacker.SendMessage( "" );
attacker.SendMessage( 0x35, "The strength of your bow and your immpecable skill have given you a perfect hit." );
attacker.SendMessage( "" );
defender.Say( "* Ouch, that hurt! *" );
defender.PlaySound( 315 );
if ( module.HasBowString )
{
if ( module.m_PullWeight == PoundsPerPull.Fourty )
{
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 2, 5 ), 100, 0, 0, 0, 0 );
return true;
}
else if ( module.m_PullWeight == PoundsPerPull.Sixty )
{
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 6, 10 ), 100, 0, 0, 0, 0 );
return true;
}
else if ( module.m_PullWeight == PoundsPerPull.Eighty )
{
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 11, 15 ), 100, 0, 0, 0, 0 );
return true;
}
else if ( module.m_PullWeight == PoundsPerPull.Hundred )
{
attacker.DoHarmful( defender );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 16, 20 ), 100, 0, 0, 0, 0 );
return true;
}
else
{
return false;
}
}
else
return true;
}
public virtual bool OnModification( Mobile from, BaseRangedModule module )
{
if ( from.Skills[SkillName.Fletching].Base < 100.0 )
{
from.SendMessage( "Only a grandmaster bowcrafter can modify this weapon." );
return false;
}
else
{
if ( from.Skills[SkillName.Fletching].Base >= 105.0 )
{
module.PullWeightSelection = PoundsPerPull.Sixty;
m_This.InvalidateProperties();
return true;
}
else if ( from.Skills[SkillName.Fletching].Base >= 112.0 )
{
module.PullWeightSelection = PoundsPerPull.Eighty;
m_This.InvalidateProperties();
return true;
}
else if ( from.Skills[SkillName.Fletching].Base >= 119.9 )
{
module.PullWeightSelection = PoundsPerPull.Hundred;
m_This.InvalidateProperties();
return true;
}
else
{
module.PullWeightSelection = PoundsPerPull.Fourty;
m_This.InvalidateProperties();
return true;
}
}
return false;
}
public virtual Item AmmoArrowSelected()
{
BaseRangedModule module = ( BaseRangedModule )CentralMemory.GetModule( m_This.Serial, typeof( BaseRangedModule ) );
if ( module == null ) { ModuleCheck( m_Mobile ); }
switch ( module.m_ArrowType )
{
case ArrowType.Normal:
return new Arrow();
case ArrowType.Poison:
return new PoisonArrow();
case ArrowType.Explosive:
return new ExplosiveArrow();
case ArrowType.ArmorPiercing:
return new ArmorPiercingArrow();
case ArrowType.Freeze:
return new FreezeArrow();
case ArrowType.Lightning:
return new LightningArrow();
default:
return new Arrow();
}
}
public virtual Type GetArrowSelected()
{
BaseRangedModule module = ( BaseRangedModule )CentralMemory.GetModule( m_This.Serial, typeof( BaseRangedModule ) );
if ( module == null ) { ModuleCheck( m_Mobile ); }
switch ( module.m_ArrowType )
{
case ArrowType.Normal:
return typeof( Arrow );
case ArrowType.Poison:
return typeof( PoisonArrow );
case ArrowType.Explosive:
return typeof( ExplosiveArrow );
case ArrowType.ArmorPiercing:
return typeof( ArmorPiercingArrow );
case ArrowType.Freeze:
return typeof( FreezeArrow );
case ArrowType.Lightning:
return typeof( LightningArrow );
default:
return typeof(Arrow);
}
}
public virtual Item AmmoBoltSelected()
{
BaseRangedModule module = ( BaseRangedModule )CentralMemory.GetModule( m_This.Serial, typeof( BaseRangedModule ) );
if ( module == null ) { ModuleCheck( m_Mobile ); }
switch ( module.m_BoltType )
{
case BoltType.Normal:
return new Bolt();
case BoltType.Poison:
return new PoisonBolt();
case BoltType.Explosive:
return new ExplosiveBolt();
case BoltType.ArmorPiercing:
return new ArmorPiercingBolt();
case BoltType.Freeze:
return new FreezeBolt();
case BoltType.Lightning:
return new LightningBolt();
default:
return new Bolt();
}
}
public virtual Type GetBoltSelected()
{
BaseRangedModule module = ( BaseRangedModule )CentralMemory.GetModule( m_This.Serial, typeof( BaseRangedModule ) );
if ( module == null ) { ModuleCheck( m_Mobile ); }
switch ( module.m_BoltType )
{
case BoltType.Normal:
return typeof( Bolt );
case BoltType.Poison:
return typeof( PoisonBolt );
case BoltType.Explosive:
return typeof( ExplosiveBolt );
case BoltType.ArmorPiercing:
return typeof( ArmorPiercingBolt );
case BoltType.Freeze:
return typeof( FreezeBolt );
case BoltType.Lightning:
return typeof( LightningBolt );
default:
return typeof( Bolt );
}
}
private class BowInternalTarget : Target
{
private BaseRanged it_Ranged;
public BowInternalTarget( BaseRanged ranged ) : base(1, false, TargetFlags.None)
{
it_Ranged = ranged;
}
protected override void OnTarget( Mobile from, object targeted )
{
BaseRangedModule module = ( BaseRangedModule )CentralMemory.GetModule( it_Ranged.Serial, typeof( BaseRangedModule ) );
if ( module == null )
{
CentralMemory.AppendModule( it_Ranged.Serial, new BaseRangedModule( it_Ranged.Serial ), true );
from.SendMessage( "A module has been created for you. Please try again." );
}
else
{
if ( targeted is Item && targeted is Arrow )
{
Item item = ( Item )targeted;
if ( item.GetType() == typeof( Arrow ) )
{
module.ArrowSelection = ArrowType.Normal;
it_Ranged.InvalidateProperties();
}
else if ( item.GetType() == typeof( PoisonArrow ) )
{
module.ArrowSelection = ArrowType.Poison;
it_Ranged.InvalidateProperties();
}
else if ( item.GetType() == typeof( ExplosiveArrow ) )
{
module.ArrowSelection = ArrowType.Explosive;
it_Ranged.InvalidateProperties();
}
else if ( item.GetType() == typeof( ArmorPiercingArrow ) )
{
module.ArrowSelection = ArrowType.ArmorPiercing;
it_Ranged.InvalidateProperties();
}
else if ( item.GetType() == typeof( FreezeArrow ) )
{
module.ArrowSelection = ArrowType.Freeze;
it_Ranged.InvalidateProperties();
}
else if ( item.GetType() == typeof( LightningArrow ) )
{
module.ArrowSelection = ArrowType.Lightning;
it_Ranged.InvalidateProperties();
}
else
from.SendMessage( "You must select a arrow." );
}
else if ( targeted is Item && targeted is BaseStringer )
{
Item item = ( Item )targeted;
if ( it_Ranged.OnModification( from, module ) == false )
return;
if ( module.HasBowString )
{
from.SendMessage( "This item is already strung." );
}
/*else if ( !IsChildOf( from.Backpack ) )
{
from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
}*/
else
{
if ( item.GetType() == typeof( LinenThreadStringer ) )
{
module.m_Strength = StringStrength.VeryWeak;
module.m_HasBowString = true;
it_Ranged.InvalidateProperties();
item.Delete();
}
else if ( item.GetType() == typeof( CottonStringer ) )
{
module.m_Strength = StringStrength.Weak;
module.m_HasBowString = true;
it_Ranged.InvalidateProperties();
item.Delete();
}
else if ( item.GetType() == typeof( SilkStringer ) )
{
module.m_Strength = StringStrength.Sturdy;
module.m_HasBowString = true;
it_Ranged.InvalidateProperties();
item.Delete();
}
else if ( item.GetType() == typeof( HorseHairStringer ) )
{
module.m_Strength = StringStrength.Strong;
module.m_HasBowString = true;
it_Ranged.InvalidateProperties();
item.Delete();
}
else if ( item.GetType() == typeof( HempStringer ) )
{
module.m_Strength = StringStrength.Dependable;
module.m_HasBowString = true;
it_Ranged.InvalidateProperties();
item.Delete();
}
else if ( item.GetType() == typeof( AngelHairStringer ) )
{
module.m_Strength = StringStrength.Indestructable;
module.m_HasBowString = true;
it_Ranged.InvalidateProperties();
item.Delete();
}
else
from.SendMessage( "Can Only Target Stringer Items!" );
}
}
else
from.SendMessage( "You can only target a bolt or bow stringer." );
}
}
}
private class CrossbowInternalTarget : Target
{
private BaseRanged it_Ranged;
public CrossbowInternalTarget( BaseRanged ranged ) : base(1, false, TargetFlags.None)
{
it_Ranged = ranged;
}
protected override void OnTarget( Mobile from, object targeted )
{
BaseRangedModule module = ( BaseRangedModule )CentralMemory.GetModule( it_Ranged.Serial, typeof( BaseRangedModule ) );
if ( module == null )
{
CentralMemory.AppendModule( it_Ranged.Serial, new BaseRangedModule( it_Ranged.Serial ), true );
from.SendMessage( "A module has been created for you. Please try again." );
}
else
{
if ( targeted is Item && targeted is Bolt )
{
Item item = ( Item )targeted;
if ( item.GetType() == typeof( Bolt ) )
{
module.BoltSelection = BoltType.Normal;
it_Ranged.InvalidateProperties();
}
else if ( item.GetType() == typeof( PoisonBolt ) )
{
module.BoltSelection = BoltType.Poison;
it_Ranged.InvalidateProperties();
}
else if ( item.GetType() == typeof( ExplosiveBolt ) )
{
module.BoltSelection = BoltType.Explosive;
it_Ranged.InvalidateProperties();
}
else if ( item.GetType() == typeof( ArmorPiercingBolt ) )
{
module.BoltSelection = BoltType.ArmorPiercing;
it_Ranged.InvalidateProperties();
}
else if ( item.GetType() == typeof( FreezeBolt ) )
{
module.BoltSelection = BoltType.Freeze;
it_Ranged.InvalidateProperties();
}
else if ( item.GetType() == typeof( LightningBolt ) )
{
module.BoltSelection = BoltType.Lightning;
it_Ranged.InvalidateProperties();
}
else
from.SendMessage( "You must select a bolt." );
}
else if ( targeted is Item && targeted is BaseStringer )
{
Item item = ( Item )targeted;
if ( it_Ranged.OnModification( from, module ) == false )
return;
if ( module.HasBowString )
{
from.SendMessage( "This item is already strung." );
}
/*else if ( !IsChildOf( from.Backpack ) )
{
from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
}*/
else
{
if ( item.GetType() == typeof( LinenThreadStringer ) )
{
module.m_Strength = StringStrength.VeryWeak;
module.m_HasBowString = true;
it_Ranged.InvalidateProperties();
item.Delete();
}
else if ( item.GetType() == typeof( CottonStringer ) )
{
module.m_Strength = StringStrength.Weak;
module.m_HasBowString = true;
it_Ranged.InvalidateProperties();
item.Delete();
}
else if ( item.GetType() == typeof( SilkStringer ) )
{
module.m_Strength = StringStrength.Sturdy;
module.m_HasBowString = true;
it_Ranged.InvalidateProperties();
item.Delete();
}
else if ( item.GetType() == typeof( HorseHairStringer ) )
{
module.m_Strength = StringStrength.Strong;
module.m_HasBowString = true;
it_Ranged.InvalidateProperties();
item.Delete();
}
else if ( item.GetType() == typeof( HempStringer ) )
{
module.m_Strength = StringStrength.Dependable;
module.m_HasBowString = true;
it_Ranged.InvalidateProperties();
item.Delete();
}
else if ( item.GetType() == typeof( AngelHairStringer ) )
{
module.m_Strength = StringStrength.Indestructable;
module.m_HasBowString = true;
it_Ranged.InvalidateProperties();
item.Delete();
}
else
from.SendMessage( "Can Only Target Stringer Items!" );
}
}
else
from.SendMessage( "You can only target a bolt or bow stringer." );
}
}
}
public override void GetProperties( ObjectPropertyList list )
{
base.GetProperties(list);
ArrayList strings = new ArrayList();
BaseRangedModule module = ( BaseRangedModule )CentralMemory.GetModule( m_This.Serial, typeof( BaseRangedModule ) );
if ( module != null )
{
strings.Add( ( "---------------" ) );
if ( this is Bow || this is CompositeBow || this is ElvenCompositeLongbow ||
this is MagicalShortbow || this is Yumi )
strings.Add( ( "Quiver Using: " + module.m_ArrowType ) );
if ( this is Crossbow || this is HeavyCrossbow || this is RepeatingCrossbow )
strings.Add( ( "Quiver Using: " + module.m_BoltType ) );
strings.Add( ( "lbs per Pull: " + module.m_PullWeight ) );
strings.Add( ( "String Str: " + module.m_Strength ) );
string toAdd = "";
int amount = strings.Count;
int current = 1;
foreach ( string str in strings )
{
toAdd += str;
if ( current != amount )
toAdd += "\n";
++current;
}
if ( toAdd != "" )
list.Add( 1070722, toAdd );
}
else
{
ModuleCheck( m_Mobile );
}
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 2 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch ( version )
{
case 2:
case 1:
{
break;
}
case 0:
{
/*m_EffectID =*/ reader.ReadInt();
break;
}
}
if ( version < 2 )
{
WeaponAttributes.MageWeapon = 0;
WeaponAttributes.UseBestSkill = 0;
}
}
}
}