View Full Version: Un Gump avec un compteur

RunUO.FR Support > Probleme de script > Un Gump avec un compteur


Title: Un Gump avec un compteur


Shariz - June 25, 2003 10:27 AM (GMT)
J'ai fait un gump test, et je voudrais que le joueur ne peut pas clicker sur le bouton avant un certain temps (6 heures) je voudrais aussi mettre un compteur, qui retiendrait le nombres de fois que le joueur à clicker.
Ce serait bien aussi que le joueur voie combien de fois il a clicker, et dans combien de temps, il pourra réutiliser le bouton.
CODE



using System;
using System.Text;
using Server.Gumps;
using Server.Network;

namespace Server.Misc  //* .TestCenter
{
public class TestGump : Gump
{

public static void Initialize()

{
 // Register our speech handler
 EventSink.Speech += new SpeechEventHandler( EventSink_Speech );
}

private static void EventSink_Speech( SpeechEventArgs args )
{
 if ( !args.Handled && Insensitive.Equals( args.Speech, "Test" ) )     //* Quand un joueur dit Test ...
 {
  args.Mobile.SendGump( new TestGump() );  //* ...ça ouvre le gump TestGump

  args.Handled = true;
 }
}

public TestGump() : base( 40, 40 ) //* Gump TestGump
{
 AddPage( 0 );
 ///* AddBackground( 0, 0, 160, 120, 5054);

 AddButton( 10, 10, 0xFB7, 0xFB9, 1, GumpButtonType.Reply, 0 );
 AddLabel( 45, 10, 0x34, "Bouton Test" );  //* Nom du bouton

}


public override void OnResponse ( NetState state, RelayInfo info )  ///* ( NetState Sender ) ??? Quel est la différence?
{
  Mobile from = state.Mobile;
 switch ( info.ButtonID )
 {
  case 1: // Test
  {
   state.Mobile.SendMessage( " Réussi! Nbr de click" );   //* Marque le message Réussi + le nombre de click
     state.Mobile.Location = new Point3D(1500,1628,10);   //* Teleporte le joueur à l'endroit.
   state.Mobile.Map = Map.Felucca;
    break;
  }
 }
}  
}
}



J'ai essayer avec DateTime pour calculer le temps, mais je n'ais pas réussi.

Signé : Shariz l'ami des plus petits.

crystal - June 25, 2003 12:19 PM (GMT)
je vais regarder , le systeme de plante doit avoir un timer' pour attendre que sa aie pousser , sa doit etre du meme style .

Trinity - June 25, 2003 07:56 PM (GMT)
je sais pas si ca peut aider mais j'ai utiliser ca pour eviter des abus d'effet visuel.

public static DateTime LastEffectTime = DateTime.Now;
public override bool OnEquip( Mobile from )
{
if ( DateTime.Now >= LastEffectTime + new TimeSpan( 0, 0, nsec ) )
{

code
}
LastEffectTime = DateTime.Now;
}


Shariz - June 26, 2003 11:38 AM (GMT)
Voilà, ça marche mais pas vraiment comme je voulais.
Ici le gump a le même compteur pour tous le monde. Si quelqu'un click, personne ne peut plus clicker avant un certain click. Ca peut être interressant, mais je voulais que chaque personne est son propre compteur.
Vous pouvez me dire comment faire. J'ais essayé plusieurs solutions, mais j'ai pas trouver.

CODE

using System;
using System.Text;
using Server.Gumps;
using Server.Network;

namespace Server.Misc  //* .TestCenter
{
public class TestGump : Gump
{
public static DateTime LastEffectTime; //* = DateTime.Now;
public static int NbrClick; //* = 0;
 public static void Initialize()
 {
  // Register our speech handler
  EventSink.Speech += new SpeechEventHandler( EventSink_Speech );
 }

 private static void EventSink_Speech( SpeechEventArgs args )
 {
  if ( !args.Handled && Insensitive.Equals( args.Speech, "Test" ) )     //* Quand un joueur dit Test ...
  {
   args.Mobile.SendGump( new TestGump() );  //* ...ça ouvre le gump TestGump

   args.Handled = true;
  }
 }

 public TestGump() : base( 40, 40 ) //* Gump TestGump
 {
  AddPage( 0 );
  ///* AddBackground( 0, 0, 160, 120, 5054);

  AddButton( 10, 10, 0xFB7, 0xFB9, 1, GumpButtonType.Reply, 0 );
  AddLabel( 45, 10, 0x34, "Bouton Test" );  //* Nom du bouton

 }


 public override void OnResponse ( NetState state, RelayInfo info )  ///* ( NetState Sender ) ??? Quel est la différence?
 {
   Mobile from = state.Mobile;
  switch ( info.ButtonID )
  {
   case 1: // Test
   {
if ( DateTime.Now >= LastEffectTime + new TimeSpan( 0, 0, 50 ) )
{

    state.Mobile.SendMessage( " Réussi!" );   //* Marque le message Réussi
      state.Mobile.Location = new Point3D(1500,1628,10);   //* Teleporte le joueur à l'endroit.
    state.Mobile.Map = Map.Felucca;
NbrClick++;
LastEffectTime = DateTime.Now;
}
else
{
state.Mobile.SendMessage( " Vous ne pouvez plus clicker !" );
}

state.Mobile.SendMessage( " Fin du test. Nbr de Click : {0}. Date du dernier Click : {1} .", Convert.ToString(NbrClick), Convert.ToString(LastEffectTime) );
    break;
   }
  }
 }
}
}


Quelqu'un peut me dire comment faire pour que toutes le personnes qui click sur le bouton ayent un compteur individuel.

Signé : Shariz l'ami des plus petits.

crystal - June 26, 2003 06:26 PM (GMT)
ben je dirais place le compteur sur le PJ plutot que sur l'item .

en gros la procedure pour compter les 6H sur le player mobile , puis tu transfert sa vers l'object pour que quand il clic sa lui dise toi t'a pas depuis 6H

Shariz - June 26, 2003 06:52 PM (GMT)
Donc, si je comprend, je dois créer un autre objet timer independant du premier script. et modifier les valeur du compteur grâce au gump.
ça vas pas être facile, mais je vais essayer.

il y a moyen de placer les variables sur les perso directement en modifiant ou déplaçant ces deux lignes?
CODE

public static DateTime LastEffectTime; //* = DateTime.Now;
public static int NbrClick; //* = 0;


et de les changer grâce à ça?
CODE

NbrClick++;
LastEffectTime = DateTime.Now;


Bon, je vais chercher.

Signé : Shariz l'ami des plus petits.

crystal - June 26, 2003 08:16 PM (GMT)
non sur les PJ dans le serialize ( voir tuto plus haut ) tu crée une variable
exemples :lastpjclic

et dedans tu sauve la derniere fois ou il a cliquer sur le bouton ,

dans le gump ,dans le code du bouton tu fait un get sur cette variable et un set pour mettre a jour .

enfin en théorie je le voit ainsi mais je suis pas top en C#

Shariz - June 27, 2003 12:00 AM (GMT)
La variable "lastpjclic" je dois la creer dans un fichier existant (ex : PlayerMobile.cs) ou je peus la creer a partir du Gump.

J'ai essayer ça, mais rien ne marche.


CODE

using System;
using System.Text;
using Server.Gumps;
using Server.Network;

namespace Server.Misc  //* .TestCenter
{
public class TestGump : Gump
{
public static DateTime LastEffectTime; //* = DateTime.Now;
public static int NbrClick; //* = 0;

private static int Count;
private static DateTime DateTest;

 public static void Initialize()
 {
  // Register our speech handler
  EventSink.Speech += new SpeechEventHandler( EventSink_Speech );  
 }

 private static void EventSink_Speech( SpeechEventArgs args )
 {
  if ( !args.Handled && Insensitive.Equals( args.Speech, "Test" ) )     //* Quand un joueur dit Test ...
  {
   args.Mobile.SendGump( new TestGump() );  //* ...ça ouvre le gump TestGump

   args.Handled = true;
  }
 }

 public TestGump() : base( 40, 40 ) //* Gump TestGump
 {
  AddPage( 0 );
  ///* AddBackground( 0, 0, 160, 120, 5054);

  AddButton( 10, 10, 0xFB7, 0xFB9, 1, GumpButtonType.Reply, 0 );
  AddLabel( 45, 10, 0x34, "Bouton Test" );  //* Nom du bouton
 }


 public override void OnResponse ( NetState state, RelayInfo info )
 {
    Mobile from = state.Mobile;
  switch ( info.ButtonID )
  {
   case 1: // Test
   {    

    if ( DateTime.Now >= LastEffectTime + new TimeSpan( 0, 0, 50 ) )
     {
      state.Mobile.SendMessage( " Réussi!" );   //* Marque le message Réussi
        state.Mobile.Location = new Point3D(1500,1628,10);  //* Teleporte le joueur à l'endroit.
      state.Mobile.Map = Map.Felucca;
      get { return NbrClick; }
              set { NbrClick = NbrClick++; }
      //NbrClick++;
     
      LastEffectTime = DateTime.Now;
      get { return Count; }
              set { Count = Count++; }
     
      //Count++;
      DateTest = DateTime.Now;
     }
     
    else
     {
      state.Mobile.SendMessage( " Vous ne pouvez plus clicker !" );
     }

     state.Mobile.SendMessage( " Fin du test. Nbr de Click : {0}. Date du dernier Click : {1} .", Convert.ToString(NbrClick), Convert.ToString(LastEffectTime) );
     state.Mobile.SendMessage( " Fin du test2. Nbr de Click : {0}. Date du dernier Click : {1} .", Convert.ToString(Count), Convert.ToString(DateTest) );
     break;
   }
  }
 }

 public TestGump( Serial serial ) : base( serial )
 {
 }

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

   writer.Write( (int) 0 ); // version
   writer.write(LastEffectTime);
   writer.write(NbrClick);
   writer.write(Count);
   writer.write(DateTest);
 }

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

   int version = reader.ReadInt();
   LastEffectTime = reader.ReadTimeSpan();
   NbrClick = reader.ReadInt();
   Count = reader.ReadInt();
   DateTest = reader.ReadTimeSpan();
 }      
}
}


Vu le nombre d'erreur qu'il y a dans ce script, je retourne dans mes cours.

Signé : Shariz l'ami des plus petits.

Shariz - June 27, 2003 03:59 PM (GMT)
je suis encore avec mon gump. :P
Je me demandais, si il y avait pas moyen de creer une liste de nom pour le gump et de sauvegarder un nombre pour chaques noms. ( le nom serait egal au nom du joueur et le nombre aux nombres de click. )

ça m'ennuierais de modifier le playerMobile, même si je crois savoir comment faire.

Si vous avez une idée où je pourrais trouver ce genre de script, je suis preneur. (C# gères le XML, mais RunUO?)

bon je retourne à mes cours.

Signé : Shariz l'ami des plus petits.

Satch - June 27, 2003 05:42 PM (GMT)
RunUO aussi le gere.

Sinon pour les listes tu as les ArrayList dans la class System.Collections

Shariz - June 29, 2003 02:29 PM (GMT)
J'ai créer 2 variable sur le playerMobile

CODE

public int m_NbrClick;
public DateTime m_DernierClick;


et j'y mis aussi le machin set et get.
CODE

[CommandProperty( AccessLevel.GameMaster )]
 public int NbrClick
 {
  get { return m_NbrClick; }
  set { m_NbrClick = value; }
 }



[CommandProperty( AccessLevel.GameMaster )]
 public DateTime DernierClick
 {
  get { return m_DernierClick; }
  set { m_DernierClick = DateTime.Now; }
 }



Mais sur mon gump, comment je fait pour acceder à ces variables?


Signé : Shariz l'ami des plus petits.

crystal - June 30, 2003 03:50 PM (GMT)
le set que tu a mis c'est pour que le game master puisse changer sa en jeu avec la commande [props

simplement dans ton gump tu doi avoir la valeur (Mobile PJ)

dans le code tu met au clic
CODE
pj.m_DernierClick = DateTime.Now;

Shariz - June 30, 2003 09:22 PM (GMT)
J'ai essayer comme tu as dis, mais il me mets plein d'erreur. J'ais essayer plein d'autres test et j'ai été voir dans les script de base, mais je n'ais toujours pas réussi à changer ce que je voulais. :(

Je mets le code de base de mon gump.

CODE


using System;
using System.Text;
using Server.Gumps;
using Server.Network;
using Server.Mobiles;


namespace Server.Misc
{
public class CompteurGump : Gump
{

  public static void Initialize()
  {
   EventSink.Speech += new SpeechEventHandler( Test_Speech );
  }
 
  public static void Test_Speech( SpeechEventArgs args )
  {
   if ( !args.Handled && Insensitive.Equals( args.Speech, "Test" ) )
   {
    args.Mobile.SendGump( new CompteurGump() );
    args.Handled = true;
   }
  }
 

 public CompteurGump() : base( 40, 40 )
 {
  AddPage( 0 );
  AddButton( 10, 10, 0xFB7, 0xFB9, 1, GumpButtonType.Reply, 0 );
  AddLabel( 45, 10, 0x34, "Bouton Test" );
 }
 
 public override void OnResponse ( NetState state, RelayInfo info )
 {
  Mobile from = state.Mobile;
   switch ( info.ButtonID )
   {
    case 1:
    {
    ///* ici j'aimerais bien mettre +1 à m_NbrClick et la date actuel(DateTime.Now) à m_DernierClick qui se trouve sur le pj. (Dans le fichier PlayerMobile.)
    break;
    }
   }
 }
}  
}





Signé : Shariz l'ami des plus petits.

crystal - July 1, 2003 12:17 AM (GMT)
Test sa pour voir

CODE
// ce n'est que le gump parce que j'ai pas compris pourquoi tu le mettais dans le namespace "Misc"
// tu peux l'appellez de n'importe quoi (dclic , une commande ou un speech)
using System;
using Server.Gumps;
using Server.Network;
using Server.Mobiles;

namespace Server.Gumps
{
 public class CompteurGump : Gump
 {
  private Mobile m_from;
   public CompteurGump(Mobile from) : base( 40, 40 )
   {
   m_from = from;
   
   AddPage( 0 );
   AddButton( 10, 10, 0xFB7, 0xFB9, 1, GumpButtonType.Reply, 0 );
   AddLabel( 45, 10, 0x34, "Bouton Test" );
   }
 
 
  public override void OnResponse( NetState state, RelayInfo info )
  {
   Mobile from = state.Mobile;
   
   switch ( info.ButtonID )
   {
    case 0:
     if ((m_from.m_DernierClick - DateTime.Now) > 21600 ) // on verifie si il y a bien 6H qu'il a clicquer
      {
      m_from.m_NbrClick =+1; // on ajoute 1 au clic
      m_from.m_DernierClick = DateTime.Now; // on remet le compteur de temps a l'heure
      }
     else
      {
      m_from.SendMessage( "vous devez attendre 6H " );
      }
     break;

   
   }
  }
 
 }
}

// si il y a des erreurs c'est que les variables sont pas bonne ou qu'il en manque, et j'ai encore bcp de mal avec sa


si sa fait des erreur console fait un copy/paste dans ton prochain reply :)

Shariz - July 1, 2003 10:30 PM (GMT)
J'ai essayer comme tu m'as dis, mais il me mets que Mobile ne contient pas de m_NbrClick et m_DernierClick.
J'ai fait ce script, mais il y a encore un problème. RunUO se lance normalement, et il ne mets aucunes erreur au lancement, quand je dis "Test" il ouvre un gump avc un petit bouton, mais quand je click sur le bouton du gump (dans le jeu), il ouvre une petite fenêtre grise avec écrit ça :
CODE

Application has generated an exception that could not be handled.  Process id=0xf90(3984), Thread id=0xa50(2640).

et dans un fichier Crash ... .log
CODE

Exception:
System.NullReferenceException: La référence d'objet n'est pas définie à  une instance d'un objet.
  at Server.Misc.CompteurGump.OnResponse(NetState state, RelayInfo info)
  at Server.Network.PacketHandlers.DisplayGumpResponse(NetState state, PacketReader pvSrc)
  at Server.Network.MessagePump.HandleReceive(NetState ns)
  at Server.Network.MessagePump.Slice()
  at Server.Core.Main(String[] args)



Je mets le script qui pose problème.
CODE


// ce n'est que le gump parce que j'ai pas compris pourquoi tu le mettais dans le namespace "Misc"
// tu peux l'appellez de n'importe quoi (dclic , une commande ou un speech)
using System;
using Server.Gumps;
using Server.Network;
using Server.Mobiles;

using System.Text;


namespace Server.Gumps
{
public class CompteurGump : Gump
{

public static void Initialize()
 {
  // Register our speech handler
  EventSink.Speech += new SpeechEventHandler( EventSink_Speech );
 }

 private static void EventSink_Speech( SpeechEventArgs args )
 {
  if ( !args.Handled && Insensitive.Equals( args.Speech, "test" ) )
  {
   args.Mobile.SendGump( new CompteurGump(args.Mobile) );

   args.Handled = true;
  }
 }

 private Mobile m_from;
 private PlayerMobile someperso;
 
 public CompteurGump(Mobile from) : base( 40, 40 )
  {
  Mobile m_from = from;
  PlayerMobile someperso = m_from as PlayerMobile;
 
 
  AddPage( 0 );
  AddButton( 10, 10, 0xFB7, 0xFB9, 1, GumpButtonType.Reply, 0 );
  AddLabel( 45, 10, 0x34, "Bouton Test" );
  }
 
 
 public override void OnResponse( NetState state, RelayInfo info )
 {
  Mobile from = state.Mobile;
  PlayerMobile someperso = m_from as PlayerMobile;
 
 
  switch ( info.ButtonID )
  {
   case 1:
    ///* if ((m_from.m_DernierClick - DateTime.Now) > 21600 ) // on verifie si il y a bien 6H qu'il a clicquer
     {
     
     
     state.Mobile.SendMessage( " vous devez attendre 6H " );
     
///* if ( someperso != null )
///* {
     
    someperso.m_NbrClick = 21; // on ajoute 1 au clic
    someperso.m_DernierClick = DateTime.Now; // on remet le compteur de temps a l'heure
     ///* }
    ///* else
     ///* {

///* }

///* else
///* {
state.Mobile.SendMessage( " RATER! " );
///* }



     }
    break;

   
  }
 }
 
}
}




Signé : Shariz l'ami des plus petits.

crystal - July 2, 2003 12:47 AM (GMT)
je suis pomé la , je suis que la page 71 de C# pour les nuls :P

j'ai le meme probs que toi mais sur un autre script .

en général les gens me corrige mon script mais aucun n'a eu le temp d m'expliquer mes erreurs , donc je suis toujours au stade "try and forget"

Shariz - July 2, 2003 01:01 AM (GMT)
J'ai réussi!
Je sais pas comment (un peus de script par ci, un bout de script par là :P ), mais en tout cas ça marche.

Le code :
CODE



using System;
using Server.Gumps;
using Server.Network;
using Server.Mobiles;

using System.Text;


namespace Server.Gumps
{

public class CompteurGump : Gump
{


 public static void Initialize()
{
 // Register our speech handler
 EventSink.Speech += new SpeechEventHandler( EventSink_Speech );
}

private static void EventSink_Speech( SpeechEventArgs args )
{
 if ( !args.Handled && Insensitive.Equals( args.Speech, "test" ) )
 {
  args.Mobile.SendGump( new CompteurGump(args.Mobile) );
  args.Handled = true;
 }
}


private Mobile m_Player1;
private TimeSpan m_Delay = TimeSpan.FromHours( 6.0 );  ///* Pour avoir des minutes : FromMinutes( 45.0 ); (en minutes)
 
public CompteurGump(Mobile from) : base( 40, 40 )
   {

   m_Player1 = from;
 
   AddPage( 0 );
   AddButton( 10, 10, 0xFB7, 0xFB9, 1, GumpButtonType.Reply, 0 );
   AddLabel( 45, 10, 0x34, "Bouton Test" );
   }
 
 
  public override void OnResponse( NetState state, RelayInfo info )
  {
   Mobile from = state.Mobile;

    switch ( info.ButtonID )
    {
      case 1:
        {
       
             if( from is PlayerMobile )
        {
          PlayerMobile m = ( PlayerMobile ) from;

    if ((m.m_DernierClick + m_Delay) < DateTime.Now )
    {

           state.Mobile.SendMessage( " Vous gagnez un point, vous devez attendre 6H! " );
     m.m_NbrClick++;    ///* on ajoute 1 a m.m_NbrClick
          m.m_DernierClick = DateTime.Now;  ///* on remet le compteur de temps a l'heure actuelle
    }
    else
    {
     state.Mobile.SendMessage( " RATER! " );
     state.Mobile.SendMessage( " Vous devez attendre : {0}, avant de pouvoir cliquer à nouveau.", Convert.ToString((m.m_DernierClick + m_Delay) - DateTime.Now) );
    }

    state.Mobile.SendMessage( " Fin du test. Nbr de Click : {0}. Date du dernier Click : {1} .", Convert.ToString(m.m_NbrClick), Convert.ToString(m.m_DernierClick) );
   }
        }
      break;    
    }
  }
}
}



Signé : Shariz l'ami des plus petits.

crystal - July 3, 2003 01:16 AM (GMT)
Grattz :)




* Hosted for free by InvisionFree