using System; using System.Collections.Generic; using Server; using Server.Multis; using Server.Targeting; using Server.ContextMenus; using Server.Gumps; namespace Server.Items { public interface IDyable { bool Dye( Mobile from, DyeTub sender ); } public class DyeTub : Item, ISecurable { private bool m_Redyable; private int m_DyedHue; private SecureLevel m_SecureLevel; public virtual bool AllowFurniture { get{ return false; } } public virtual bool AllowLeather { get{ return false; } } public virtual bool AllowMetal { get{ return false; } } public virtual bool AllowWood { get{ return false; } } public virtual bool AllowDyables { get{ return true; } } public override void Serialize( GenericWriter writer ) { base.Serialize( writer ); writer.Write( (int) 1 ); // version writer.Write( (int)m_SecureLevel ); writer.Write( (bool) m_Redyable ); writer.Write( (int) m_DyedHue ); } public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadInt(); switch ( version ) { case 1: { m_SecureLevel = (SecureLevel)reader.ReadInt(); goto case 0; } case 0: { m_Redyable = reader.ReadBool(); m_DyedHue = reader.ReadInt(); break; } } } [CommandProperty( AccessLevel.GameMaster )] public bool Redyable { get { return m_Redyable; } set { m_Redyable = value; } } [CommandProperty( AccessLevel.GameMaster )] public int DyedHue { get { return m_DyedHue; } set { if ( m_Redyable ) { m_DyedHue = value; Hue = value; } } } [CommandProperty( AccessLevel.GameMaster )] public SecureLevel Level { get { return m_SecureLevel; } set { m_SecureLevel = value; } } [Constructable] public DyeTub() : base( 0xFAB ) { Weight = 10.0; m_Redyable = true; } public override void GetContextMenuEntries( Mobile from, List list ) { base.GetContextMenuEntries( from, list ); SetSecureLevelEntry.AddTo( from, this, list ); } public DyeTub( Serial serial ) : base( serial ) { } // Select the clothing to dye. public virtual int TargetMessage{ get{ return 500859; } } // You can not dye that. public virtual int FailMessage{ get{ return 1042083; } } public override void OnDoubleClick( Mobile from ) { if ( from.InRange( this.GetWorldLocation(), 1 ) ) { from.SendLocalizedMessage( TargetMessage ); from.Target = new InternalTarget( this ); } else { from.SendLocalizedMessage( 500446 ); // That is too far away. } } public static bool alsoDyable( Item item ) { if ( item is Lexicon || item is Grimoire || item is Journal || item is Diary || item is CandleShort || item is CandleMedium || item is CandleLong || item is DyeTub ) return true; return false; } private class InternalTarget : Target { private DyeTub m_Tub; public InternalTarget( DyeTub tub ) : base( 1, false, TargetFlags.None ) { m_Tub = tub; } protected override void OnTarget( Mobile from, object targeted ) { if ( targeted is Item ) { Item item = (Item)targeted; if ( ( alsoDyable( item ) || item is IDyable ) && m_Tub.AllowDyables ) { if ( !from.InRange( m_Tub.GetWorldLocation(), 1 ) || !from.InRange( item.GetWorldLocation(), 1 ) ) from.SendLocalizedMessage( 500446 ); // That is too far away. else if ( item.Parent is Mobile ) from.SendLocalizedMessage( 500861 ); // Can't Dye clothing that is being worn. else if ( alsoDyable( item ) ) { item.Hue = m_Tub.DyedHue; if ( item is DyeTub ){ ((DyeTub)item).DyedHue = item.Hue; } from.PlaySound( 0x23E ); } else if ( ((IDyable)item).Dye( from, m_Tub ) ) from.PlaySound( 0x23E ); } else if ( (FurnitureAttribute.Check( item ) || (item is PotionKeg)) && m_Tub.AllowFurniture ) { if ( !from.InRange( m_Tub.GetWorldLocation(), 1 ) || !from.InRange( item.GetWorldLocation(), 1 ) ) { from.SendLocalizedMessage( 500446 ); // That is too far away. } else { bool okay = ( item.IsChildOf( from.Backpack ) ); if ( !okay ) { if ( item.Parent == null ) { BaseHouse house = BaseHouse.FindHouseAt( item ); if ( house == null || ( !house.IsLockedDown( item ) && !house.IsSecure( item ) ) ) from.SendLocalizedMessage( 501022 ); // Furniture must be locked down to paint it. else if ( !house.IsCoOwner( from ) ) from.SendLocalizedMessage( 501023 ); // You must be the owner to use this item. else okay = true; } else { from.SendLocalizedMessage( 1048135 ); // The furniture must be in your backpack to be painted. } } if ( okay ) { item.Hue = m_Tub.DyedHue; from.PlaySound( 0x23E ); } } } else if ( ( item is MyTentEastAddonDeed ) || ( item is MyTentSouthAddonDeed ) ) { if ( !from.InRange( m_Tub.GetWorldLocation(), 1 ) || !from.InRange( item.GetWorldLocation(), 1 ) ) { from.SendLocalizedMessage( 500446 ); // That is too far away. } else if ( !item.Movable ) { from.SendLocalizedMessage( 1042083 ); // You cannot dye that. } else { item.Hue = m_Tub.DyedHue; if ( item is MyTentEastAddonDeed ) { MyTentEastAddonDeed tent = (MyTentEastAddonDeed)item; tent.TentColor = m_Tub.DyedHue; } else { MyTentSouthAddonDeed tent = (MyTentSouthAddonDeed)item; tent.TentColor = m_Tub.DyedHue; } from.PlaySound( 0x23E ); } } else if ( item is BaseArmor && ( (((BaseArmor)item).Resource == CraftResource.Leathered && m_Tub.AllowLeather ) || (((BaseArmor)item).Resource == CraftResource.Iron && m_Tub.AllowMetal ) || (((BaseArmor)item).Resource == CraftResource.Wooden && m_Tub.AllowWood ) ) ) { if ( !from.InRange( m_Tub.GetWorldLocation(), 1 ) || !from.InRange( item.GetWorldLocation(), 1 ) ) { from.SendLocalizedMessage( 500446 ); // That is too far away. } else if ( !item.Movable ) { from.SendLocalizedMessage( 1010093 ); // You may not dye items which are locked down. } else if ( item.Parent is Mobile ) { from.SendLocalizedMessage( 1070753 ); // You cannot dye equipped items. } else { item.Hue = m_Tub.DyedHue; from.PlaySound( 0x23E ); } } else { from.SendLocalizedMessage( m_Tub.FailMessage ); } } else { from.SendLocalizedMessage( m_Tub.FailMessage ); } } } } }