View Full Version: Boite aux lettres

RunUO.FR Support > Items > Boite aux lettres


Title: Boite aux lettres


Enola - September 21, 2003 11:53 AM (GMT)
Hop voila un petit systeme de boite aux lettres

Comme le systeme est fait, il permet juste l'envoi de papier a lettre

Si vous utilisez ce systeme, merci de laisser ma signature sur le gump :P


CODE

using System;
using Server;
using Server.Gumps;
using Server.Targeting;
using Server.Mobiles;

namespace Server.Items
{
///////////////////////////////////////
// Component de la Boite aux lettres //
///////////////////////////////////////
public class BoiteAuLettreComponent : AddonComponent
{
 bool owned = false;
 public Mobile owner;
 public Mobile[] perso = new Mobile[]
 {
  null,
  null,
  null
 };
 int m_dir;
 
 [CommandProperty( AccessLevel.GameMaster )]
 public Mobile Proprio
 {
  get { return owner; }
  set { owner = value; InvalidateProperties(); }
 }
 
 // dir : 0 North  1 West
 public BoiteAuLettreComponent(int dir) : base(0x1ED4)
 {
  switch(dir)
  {
   case 0 :
    {
     ItemID = 0x1ED4;
     break;
    }
   case 1 :
    {
     ItemID = 0x1ED7;
     break;
    }
   
  }
  Name = "Boite aux lettres";
  m_dir = dir;
 }
 
 public BoiteAuLettreComponent( Serial serial ) : base( serial )
 {
 }

 public override void Serialize( GenericWriter writer )
 {
  base.Serialize( writer );

  writer.Write( (int) 0 ); // version
  writer.Write( (Mobile) owner );
  writer.Write( (bool) owned );
  for(int i=0;i<perso.Length;i++)
  {
   writer.Write( (Mobile) perso[i]);
  }
  writer.Write( (int) m_dir );
 }

 public override void Deserialize( GenericReader reader )
 {
  base.Deserialize( reader );

  int version = reader.ReadInt();
  owner = reader.ReadMobile();
  owned = reader.ReadBool();
  for(int i=0;i<perso.Length;i++)
  {
   perso[i] = reader.ReadMobile();
  }
  m_dir = reader.ReadInt();
 }
 
 public override void OnDoubleClick(Mobile from)
 {
  if( owned == false )
  {
   owner = from;
   owned = true;
  }
  from.SendGump( new InternalGump( from,this ) );
 }
 
 public void AddPerso(Mobile target,Mobile from)
 {
  int i;
 
  for(i=0; i<perso.Length; i++)
  {
   if(perso[i] == null)
   {
    perso[i] = (Mobile)target;
    from.SendMessage(perso[i].Name+" Ajouté");
    return;
   }
  }
 }
 
 public Mobile GetPerso( int i )
 {
  return perso[i];
 }
 
 public void RemovePerso( int i)
 {
  perso[i] = null;
 }
 
 public void Redeed(Mobile from)
 {
  this.Delete();
  switch(m_dir)
  {
   case 0: from.AddToBackpack( new BoiteAuLettreSudDeed() ); break;
   case 1: from.AddToBackpack( new BoiteAuLettreEstDeed() ); break;
  }
 }
}

////////////////////////////
// Gump Boite aux lettres //  
////////////////////////////
public class InternalGump : Gump
{
 Mobile m_from;
 BoiteAuLettreComponent m_item;
 
 
 public void AddButtonLabeled( int x, int y, int buttonID, string text )
 {
  AddButton( x, y - 1, 4005, 4007, buttonID, GumpButtonType.Reply, 0 );
  AddHtml( x + 35, y, 240, 20,""+text+"",false, false );
 }
 public void AddButtonLabeledDel( int x, int y, int buttonID, string text )
 {
  AddButton( x, y - 1, 4017, 4019, buttonID, GumpButtonType.Reply, 0 );
  AddHtml( x + 35, y, 240, 20,""+text+"",false, false );
 }
 
 public InternalGump(Mobile from,BoiteAuLettreComponent item) : base(100,100)
 {
  m_from = from;
  m_item = item;
 
  AddBackground( 55, 60, 280, 200, 5054 );
  AddLabel( 140, 70, 0x26, "Boite aux Lettres" );
  AddLabel( 240,240, 0,"Enola  v 0.1");
  // emplacement 1
  AddImageTiled( 80, 100, 182, 23, 0x52 );
  AddImageTiled( 81, 101, 180, 21, 0xBBC );
  if(m_item.perso[0] != null)
   AddLabelCropped( 91, 101, 180, 21, 0, m_item.perso[0].Name);
  AddButtonLabeled(270,100,1,"");

  // emplacement 2
  AddImageTiled( 80, 120, 182, 23, 0x52 );
  AddImageTiled( 81, 121, 180, 21, 0xBBC );
  if(m_item.perso[1] != null)
   AddLabelCropped( 91, 121, 180, 21, 0, m_item.perso[1].Name);
  AddButtonLabeled(270,120,2,"");

  // emplacement 3
  AddImageTiled( 80, 140, 182, 23, 0x52 );
  AddImageTiled( 81, 141, 180, 21, 0xBBC );
  if(m_item.perso[2] != null)
   AddLabelCropped( 91, 141, 180, 21, 0, m_item.perso[2].Name);
  AddButtonLabeled(270,140,3,"");
 
  // Boutton owner
  if(m_from == m_item.owner)
  {
   AddButtonLabeled(100,200,4,"Ajouter une personne");
   AddButtonLabeled(100,220,8,"Redeed");
   AddButtonLabeledDel(300,100,5,"");    
   AddButtonLabeledDel(300,120,6,"");    
   AddButtonLabeledDel(300,140,7,"");
  }
 }
 public override void OnResponse( Server.Network.NetState sender, RelayInfo info )
 {
  int val = info.ButtonID;
 
  switch(val)
  {
   case 0: break;
   case 1:
    {
     m_from.Target = new SendTarget(m_item,0);
     m_from.SendMessage("Que desirez vous envoyer?");
     break;
    }
   case 2:
    {
     m_from.Target = new SendTarget(m_item,1);
     m_from.SendMessage("Que desirez vous envoyer?");
     break;
    }
   case 3:
    {
     m_from.Target = new SendTarget(m_item,2);
     m_from.SendMessage("Que desirez vous envoyer?");
     break;
    }
   case 4:
    {
     m_from.Target = new AddTarget(m_item);
     m_from.SendMessage("Qui desirez vous ajouter?");
     break;
    }
   case 5:
    {
     m_item.RemovePerso(0);
     break;
    }
   case 6:
    {
     m_item.RemovePerso(1);
     break;
    }
   case 7:
    {
     m_item.RemovePerso(2);
     break;
    }
   case 8:
    {
     m_item.Redeed(m_from);
     m_from.SendMessage("Vous Redeedez la boite aux lettres");
     break;
    }
   
   default: break;
  }
 }
}

///////////////////////////
// Target Ajout Personne //
///////////////////////////  
public class AddTarget : Target
{
 BoiteAuLettreComponent m_item;
 
 public AddTarget(BoiteAuLettreComponent item) : base(3,false,TargetFlags.None)
 {
  m_item = item;
 }
 
 protected override void OnTarget(Mobile from, object targ)
 {
  if(targ is PlayerMobile)
  {
   Mobile target = (Mobile) targ;
   m_item.AddPerso(target,from);
  }
 }
}
//////////////////  
// Target Envoi //
//////////////////
public class SendTarget : Target
{
 int pos;
 BoiteAuLettreComponent m_item;

 public SendTarget(BoiteAuLettreComponent item, int val) : base(0,false,TargetFlags.None)
 {
  pos = val;
  m_item = item;
 }
   
 protected override void OnTarget(Mobile from, object targ)
 {
  try
  {
   if( targ is PapierALettre)
   {
    PapierALettre target = (PapierALettre) targ;
    if(target.IsChildOf(from.Backpack))
    {
     Mobile to = m_item.GetPerso(pos);
     to.AddToBackpack(target);
     from.SendMessage("Objet envoyé a: "+to.Name);
     to.SendMessage(0x22,"Vous venez de recevoir une lettre");
     target.Auteur = from;
    }
    else
     from.SendMessage("L'objet doit etre dans votre sac!");
   }
   else
    from.SendMessage("Vous ne pouvez pas envoyer cela!");
  }
  catch(NullReferenceException)
  {
   from.SendMessage("Personne Invalide!");
  }

 }
}
/////////////////////////////
// Addon Boite aux Lettres //
/////////////////////////////
public class BoiteAuLettreAddon : BaseAddon
{
 public int m_dir;
 
 [Constructable]
 public BoiteAuLettreAddon(int dir)
 {
  AddComponent( new BoiteAuLettreComponent(dir), 0, 0, 0 );
  Name = "Boite au lettre";
 }

 public BoiteAuLettreAddon( 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();
 }
}
////////////////////////////
// Deed Boite aux lettres //
////////////////////////////
public class BoiteAuLettreSudDeed : BaseAddonDeed
{
   
 public override BaseAddon Addon{ get{ return new BoiteAuLettreAddon(0); } }
// public override int LabelNumber{ get{ return 1044329; } } // abbatoir

 [Constructable]
 public BoiteAuLettreSudDeed()
 {
    Name = "Boite aux lettres Sud";
 }

 public BoiteAuLettreSudDeed( 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 class BoiteAuLettreEstDeed : BaseAddonDeed
{
   
 public override BaseAddon Addon{ get{ return new BoiteAuLettreAddon(1); } }
// public override int LabelNumber{ get{ return 1044329; } } // abbatoir

 [Constructable]
 public BoiteAuLettreEstDeed()
 {
    Name = "Boite aux lettres Est";
 }

 public BoiteAuLettreEstDeed( 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 class PapierALettre : BaseBook
{
 Mobile sender;
 
 [CommandProperty( AccessLevel.GameMaster )]
 public Mobile Auteur
 {
  get { return sender; }
  set { sender = value; InvalidateProperties(); }
 }
 
 [Constructable]
 public PapierALettre() : base(0x14ED)
 {
  Name = "Papier a lettre";
 }
 
 public PapierALettre( Serial serial ) : base( serial )
 {
 }

 public override void Deserialize( GenericReader reader )
 {
  base.Deserialize( reader );

  int version = reader.ReadInt();
  sender = reader.ReadMobile();
 }

 public override void Serialize( GenericWriter writer )
 {
  base.Serialize( writer );

  writer.Write( (int)0 ); // version
  writer.Write( (Mobile) sender);
 }
}
}


Corrigé:
- Crash serveur lorsqu'on envoyai un courrier a Null
- Envoi d'un message a la personne recevant le courrier

Kaervek - September 21, 2003 07:22 PM (GMT)
Ptit bug ^^
Si on met aps de destinataire mais qu'on appuie sur la fleche, le resultat est un crash du server...

Jxc - September 21, 2003 10:43 PM (GMT)
et avec un try/catch, ca peut pas dévier le crash ? :)

Enola - September 23, 2003 05:26 PM (GMT)
merci de l'avoir signalé, j'avais pas remarqué ce bug.

post edité et corrigé.

Ludovic - December 30, 2003 01:55 AM (GMT)
*applaudit le script*

Kaervek - January 17, 2004 06:25 AM (GMT)
*Connait les Try Catch maintenant*

C'est vrai que l'ancienne version de la boite aux lettres était mieux alors, en utilisant les méthodes try-catch.

Car ici, il faut que l'autre soit à proximité pour l'ajouter.
Tandis qu'autrement, on peut le faire pour n'importe qui...




Hosted for free by InvisionFree