using System; using Server.Items; using Server.Targeting; namespace Server.Items { public class Wool : Item, IDyable { [Constructable] public Wool() : this( 1 ) { } [Constructable] public Wool( int amount ) : base( 0xDF8 ) { Stackable = true; Weight = 4.0; Amount = amount; } public Wool( Serial serial ) : base( serial ) { } 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(); } public bool Dye( Mobile from, DyeTub sender ) { if ( Deleted ) return false; Hue = sender.DyedHue; return true; } public override void OnDoubleClick( Mobile from ) { if ( IsChildOf( from.Backpack ) ) { from.SendLocalizedMessage( 502655 ); // What spinning wheel do you wish to spin this on? from.Target = new PickWheelTarget( this ); } else { from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it. } } public static void OnSpun( ISpinningWheel wheel, Mobile from, int hue ) { Item item = new DarkYarn( 3 ); item.Hue = hue; from.AddToBackpack( item ); from.SendLocalizedMessage( 1010576 ); // You put the balls of yarn in your backpack. } private class PickWheelTarget : Target { private Wool m_Wool; public PickWheelTarget( Wool wool ) : base( 3, false, TargetFlags.None ) { m_Wool = wool; } protected override void OnTarget( Mobile from, object targeted ) { if ( m_Wool.Deleted ) return; ISpinningWheel wheel = targeted as ISpinningWheel; if ( wheel == null && targeted is AddonComponent ) wheel = ((AddonComponent)targeted).Addon as ISpinningWheel; if ( wheel is Item ) { Item item = (Item)wheel; if ( !m_Wool.IsChildOf( from.Backpack ) ) { from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it. } else if ( wheel.Spinning ) { from.SendLocalizedMessage( 502656 ); // That spinning wheel is being used. } else { // 1. Capture the total stack amount and its hue int amount = m_Wool.Amount; int hue = m_Wool.Hue; // 2. Destroy the entire pile of wool at once m_Wool.Delete(); // 3. Start the spin cycle and use a lambda for the multiplied yield wheel.BeginSpin( ( w, m, h ) => { // 1 wool = 3 balls of yarn. Calculate total yield. int totalYarn = 3 * amount; // 4. Safely loop the creation to prevent going over the 60,000 item limit while ( totalYarn > 0 ) { int yarnToGive = Math.Min( totalYarn, 60000 ); // In RunUO, "DarkYarn" is the core class used for all balls of yarn Item yarn = new DarkYarn( yarnToGive ); yarn.Hue = h; m.AddToBackpack( yarn ); totalYarn -= yarnToGive; } m.SendLocalizedMessage( 1010576 ); // You put the balls of yarn in your backpack. }, from, hue ); } } else { from.SendLocalizedMessage( 502658 ); // Use that on a spinning wheel. } } } } public class TaintedWool : Wool { [Constructable] public TaintedWool() : this( 1 ) { } [Constructable] public TaintedWool( int amount ) : base( 0x101F ) { Stackable = true; Weight = 4.0; Amount = amount; } public TaintedWool( Serial serial ) : base( serial ) { } 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(); } new public static void OnSpun( ISpinningWheel wheel, Mobile from, int hue ) { Item item = new DarkYarn( 1 ); item.Hue = hue; from.AddToBackpack( item ); from.SendLocalizedMessage( 1010574 ); // You put a ball of yarn in your backpack. } } }