| CODE |
| using System; using Server; using Server.Network; using Server.Regions; using Server.Multis; using Server.Gumps; using Server.Targeting; namespace Server.Items { public enum DecorateCommand { None, Rotation, Haut, Bas, Nord, Sud, Est, Ouest } public class InteriorDecorator : Item { private DecorateCommand m_Command; private string[] FeKwa = new string[] { "None", "Rotation", "Haut", "Bas", "Nord", "Sud", "Est", "Ouest" }; [CommandProperty( AccessLevel.GameMaster )] public DecorateCommand Command{ get{ return m_Command; } set{ m_Command = value; InvalidateProperties(); } } [Constructable] public InteriorDecorator() : base( 0xFC1 ) { Weight = 1.0; LootType = LootType.Blessed; } public override int LabelNumber{ get{ return 1041280; } } // an interior decorator public InteriorDecorator( Serial serial ) : base( serial ) { } public override void GetProperties( ObjectPropertyList list ) { base.GetProperties( list ); int c = (int)m_Command; if (c > 0) list.Add(FeKwa[c]); } 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 override void OnDoubleClick( Mobile from ) { if ( !CheckUse( this, from ) ) return; if ( m_Command == DecorateCommand.None ) from.SendGump( new InternalGump( this ) ); else from.Target = new InternalTarget( this ); } public static bool InHouse( Mobile from ) { BaseHouse house = BaseHouse.FindHouseAt( from ); return ( house != null && house.IsCoOwner( from ) ); } public static bool CheckUse( InteriorDecorator tool, Mobile from ) { /*if ( tool.Deleted || !tool.IsChildOf( from.Backpack ) ) from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it. else*/ if ( !InHouse( from ) ) from.SendLocalizedMessage( 502092 ); // You must be in your house to do this. else return true; return false; } private class InternalGump : Gump { private InteriorDecorator m_Decorator; private string[] FeKwa = new string[] { "None", "Rotation", "Haut", "Bas", "Nord", "Sud", "Est", "Ouest" }; public InternalGump( InteriorDecorator decorator ) : base( 150, 50 ) { m_Decorator = decorator; AddBackground( 0, 0, 200, 260, 2600 ); for( int i = 1; i <= 7; ++i ) { AddButton( 50, (30*i)-5, 2152, 2154, i, GumpButtonType.Reply, 0 ); AddLabel( 90, 30*i, 0, m_Decorator.FeKwa[i] ); } } public override void OnResponse( NetState sender, RelayInfo info ) { DecorateCommand command = DecorateCommand.None; switch ( info.ButtonID ) { case 1: command = DecorateCommand.Rotation; break; case 2: command = DecorateCommand.Haut; break; case 3: command = DecorateCommand.Bas; break; case 4: command = DecorateCommand.Nord; break; case 5: command = DecorateCommand.Sud; break; case 6: command = DecorateCommand.Est; break; case 7: command = DecorateCommand.Ouest; break; } if ( command != DecorateCommand.None ) { m_Decorator.Command = command; sender.Mobile.Target = new InternalTarget( m_Decorator ); } } } private class InternalTarget : Target { private InteriorDecorator m_Decorator; public InternalTarget( InteriorDecorator decorator ) : base( -1, false, TargetFlags.None ) { CheckLOS = false; m_Decorator = decorator; } protected override void OnTargetNotAccessible( Mobile from, object targeted ) { OnTarget( from, targeted ); } protected override void OnTarget( Mobile from, object targeted ) { if ( targeted == m_Decorator ) { m_Decorator.Command = DecorateCommand.None; from.SendGump( new InternalGump( m_Decorator ) ); } else if ( targeted is Item && InteriorDecorator.CheckUse( m_Decorator, from ) ) { BaseHouse house = BaseHouse.FindHouseAt( from ); Item item = (Item)targeted; if ( house == null || !house.IsCoOwner( from ) ) { from.SendLocalizedMessage( 502092 ); // You must be in your house to do this. } else if ( item.Parent != null || !house.IsInside( item ) ) { from.SendLocalizedMessage( 1042270 ); // That is not in your house. } else if ( !house.IsLockedDown( item ) && !house.IsSecure( item ) ) { from.SendLocalizedMessage( 1042271 ); // That is not locked down. } else if ( item.TotalWeight + item.PileWeight > 100 ) { from.SendLocalizedMessage( 1042272 ); // That is too heavy. } else { switch ( m_Decorator.Command ) { case DecorateCommand.Haut: UpDown( item, from, true ); break; case DecorateCommand.Bas: UpDown( item, from, false ); break; case DecorateCommand.Rotation: Turn( item, from ); break; case DecorateCommand.Nord: NordSud( item, from, true ); break; case DecorateCommand.Sud: NordSud( item, from, false ); break; case DecorateCommand.Est: EstOuest( item, from, false ); break; case DecorateCommand.Ouest: EstOuest( item, from, true ); break; } } } } private static void Turn( Item item, Mobile from ) { FlipableAttribute[] attributes = (FlipableAttribute[])item.GetType().GetCustomAttributes( typeof( FlipableAttribute ), false ); if( attributes.Length > 0 ) attributes[0].Flip( item ); else from.SendLocalizedMessage( 1042273 ); // You cannot turn that. } private static void UpDown( Item item, Mobile from, bool Up ) { int floorZ = GetFloorZ( item ); if ( floorZ > int.MinValue && item.Z < (floorZ + 15) && Up ) // Confirmed : no height checks here item.Location = new Point3D( item.Location, item.Z + 1 ); else if ( floorZ > int.MinValue && item.Z > GetFloorZ( item ) && !Up ) // Confirmed : no height checks here item.Location = new Point3D( item.Location, item.Z - 1 ); else from.SendLocalizedMessage( (Up ? 1042274 : 1042275) ); // You cannot raise it up any higher. } private static void NordSud( Item item, Mobile from, bool Nord ) { Point3D newloc = new Point3D( item.X, item.Y+(Nord?-1:1), item.Z ); BaseHouse lasthouse = BaseHouse.FindHouseAt( item ); BaseHouse newhouse = BaseHouse.FindHouseAt( newloc, item.Map, 16 ); if (lasthouse != newhouse) { from.SendMessage("Action Impossible"); } else { item.Location = newloc; } } private static void EstOuest( Item item, Mobile from, bool Ouest ) { Point3D newloc = new Point3D( item.X+(Ouest?-1:1), item.Y, item.Z ); BaseHouse lasthouse = BaseHouse.FindHouseAt( item ); BaseHouse newhouse = BaseHouse.FindHouseAt( newloc, item.Map, 16 ); if (lasthouse != newhouse) { from.SendMessage("Action Impossible"); } else { item.Location = newloc; } } private static int GetFloorZ( Item item ) { Map map = item.Map; if ( map == null ) return int.MinValue; Tile[] tiles = map.Tiles.GetStaticTiles( item.X, item.Y, true ); int z = int.MinValue; for ( int i = 0; i < tiles.Length; ++i ) { Tile tile = tiles[i]; ItemData id = TileData.ItemTable[tile.ID & 0x3FFF]; int top = tile.Z; // Confirmed : no height checks here if ( id.Surface && !id.Impassable && top > z && top <= item.Z ) z = top; } return z; } } } } |