
Grand maitre
     
Group: Members
Posts: 339
Member No.: 48
Joined: 15-October 03

|
| 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; } } } } |
Voila, réaliser pour aider un scripteur.
C'est sur qu'il faut modifier quelques trucs car il est pas parfait (les objets vont sur les murs), mais a la base sa fonctionne
|