Interior Décorator Multifonction
Didi
Posted: Jul 2 2004, 08:12 PM


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
Top
« Next Oldest | Items | Next Newest »


Topic Options Quick Reply




Hosted for free by InvisionFree (Terms of Use: Updated 7/7/05) | Powered by Invision Power Board v1.3 Final © 2003 IPS, Inc.
Archive