View Full Version: Timer sans limites

RunUO.FR Support > comment on fait ... > Timer sans limites


Title: Timer sans limites


Didi - November 17, 2003 02:28 AM (GMT)
Bon je suis les 2 pied dans l'elevage de poule mainnant, et je voudrais savoir, comment peut-on faire un timer qui s'enregistre a chauqe save, et qui continu au redémarraghe du server. Ou indépendemment ...

Je m'explique, j'ai un poussin qui doit, un jour, devenir une poule adulte.
Disons qu'apres 5 jours *pouf* .remove poussin, et .add poule.

Un timer comme je le faire presentement le fait tres bien, mais seulement a condition que le server ne s'arrete pas. comment le contrer ?

Sinon, y a t-il un moyen de le parametre avec l'IRL ? C'est a dire nous somme le JJ/MM/AAAA à HH:MM:SS et si JJ >= JJ de départ + 5, poussin devient poule ....

Merci de m'éclairer :P

Didi

Usul - November 17, 2003 02:54 AM (GMT)
Voila quelques lignes a remettre dans l'ordre et sa marche ;o]

CODE

private Timer m_DecayTimer;
private DateTime m_DecayTime = TimeSpan.FromMinutes( 60.0 );
//ici timer = 60 minutes

public override void Serialize( GenericWriter writer )
{
  base.Serialize( writer );
  writer.Write( (int) 0 ); // version
  writer.WriteDeltaTime( m_DecayTime );
}

public override void Deserialize( GenericReader reader )
{
  base.Deserialize( reader );
  int version = reader.ReadInt();
  switch ( version )
  {
       case 0:
                  m_DecayTime = ( reader.ReadDeltaTime() - DateTime.Now );
                  m_DecayTimer = new InternalTimer( m_DecayTime );
                  m_DecayTimer.Start();
                  break;
  }
}


private class InternalTimer : Timer
{
  public InternalTimer( TimeSpan delay ) : base( delay )
  {
       Priority = TimerPriority.FiveSeconds;
  }
  protected override void OnTick()
  {
   //event
  }
}


il est posible que j'ai oublier des trucs mais normalement la dedans tu as tt pour faire ton timer.
Si tu veux un exemple regarde a "DecayedCorpse.cs"

Didi - November 17, 2003 01:47 PM (GMT)
En gros au moment du deserialise il continu le timer ....

Donc logiquement si je met sa sur mon poussin, que je met le timespan a 1440 minutes et que je ontick un poussin.jours++, je devrais etre capable de l'arreter lorsque jours ==5

Sa cé le coté compréhension, mainnat faut jessai dle faire fonctionner :P

Mici usul

Didi - November 17, 2003 02:20 PM (GMT)
CODE
Scripts: Compiling C# scripts...failed (5 errors, 0 warnings)
- Error: Scripts\Mobiles\Animals\Birds\poussin.cs: CS0029: (line 54, column 32)
Cannot implicitly convert type 'System.TimeSpan' to 'System.DateTime'
- Error: Scripts\Mobiles\Animals\Birds\poussin.cs: CS0029: (line 54, column 32)
Cannot implicitly convert type 'System.TimeSpan' to 'System.DateTime'
- Error: Scripts\Mobiles\Animals\Birds\poussin.cs: CS0029: (line 74, column 36)
Cannot implicitly convert type 'System.TimeSpan' to 'System.DateTime'
- Error: Scripts\Mobiles\Animals\Birds\poussin.cs: CS1502: (line 75, column 35)
The best overloaded method match for 'Server.Mobiles.Poussin.InternalTimer.Inte
rnalTimer(System.TimeSpan)' has some invalid arguments
- Error: Scripts\Mobiles\Animals\Birds\poussin.cs: CS1503: (line 75, column 54)
Argument '1': cannot convert from 'System.DateTime' to 'System.TimeSpan'


Cela fait référence au deserialise et a la déclaration du timer au dessus.
Normal ?

Usul - November 17, 2003 06:50 PM (GMT)
non c pas normal ;o]
Ton timer ne continue pas lors du serialise , tu va le relancer au moment ou tu relance le serveur seulement la valeur qu'on lui renvoir est
la durrer choisie(1440) + l heure du serveur ou il a ete lancer pour la premiere fois - l'heure actuel.

mais je t dis ke j'ai recopier ces lignes et que je les ai un peu changer
*n'a pas un copilateur dans la tete* donc y a des erreurs va voir le script "DecayedCorpse.cs"
c de la que je me suis inspirer.

aussi non tu as une autre posibiliter

fair un timer qui decremente une valeur , tu sauve cette valeur dans ton objet
et tu relance le timer .
je te donne un exemple de mon timer pour la prison:

CODE


using System;
using System.Collections;
using Server;
using Server.Misc;



namespace Server.Items
{
   public class PrisonClock : Item
{
  private int m_DecayTime;
  private Timer m_Timer;
  private Mobile m_from;
  private string m_name;
  private Container m_coffre;

 
 // Duree de la peine en minute
 [CommandProperty( AccessLevel.GameMaster )]
        public int GetTimeClock
 {get{return m_DecayTime;}set{m_DecayTime = value;}}
 
 public PrisonClock(Mobile from,Container coffre,int tempprisonier , string  RegionName) : base(0x1813)
 {
  Movable = false;
  m_name = from.Name + " libéré dans";
  m_DecayTime = tempprisonier;
 
   
  m_from = from;
  m_coffre = coffre;
 
  m_Timer = new InternalTimer( m_name , m_from , this);
  m_Timer.Start();
 
 }
  public PrisonClock(Serial serial) : base(serial)
 {
 }
 public override void Serialize( GenericWriter writer )
 {
  base.Serialize( writer );

  writer.Write( (int) 0 ); // version

  writer.Write( (Mobile)m_from );
  writer.Write( m_coffre );
  writer.Write( m_name );
  writer.Write( m_DecayTime );


 }

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

  int version = reader.ReadInt();

  switch ( version )
  {
   case 0:
   {
    m_from   = reader.ReadMobile();
    m_coffre =  reader.ReadItem() as PrisonCoffre;
    m_name = reader.ReadString();
    m_DecayTime = reader.ReadInt();
   
    m_Timer = new InternalTimer( m_name , m_from , this);
    m_Timer.Start();
   
    break;
   }
  }
 }
private class InternalTimer: Timer
{

 private Item m_item;
        private Mobile m_from;

        private string m_nameclock;

 public InternalTimer(string nameclock , Mobile from ,  Item item): base( TimeSpan.FromSeconds( 60.0), TimeSpan.FromSeconds( 60.0))
 {
  Priority = TimerPriority.FiftyMS;
 
  m_item = item;
  m_from= from;
  m_nameclock = nameclock;
 
 }
 
 protected override void OnTick()
 {
 
 
  if (m_from.NetState != null) //prisonnier Online
  {
      PrisonClock clock = (PrisonClock)m_item;
     
      if (m_from.Region.Name == "Prison")
      {
   
   int tmptolibre = clock.GetTimeClock;
   --tmptolibre;
   
   if ( tmptolibre <= 0)
   {
    m_item.Delete();
      }
   clock.GetTimeClock = tmptolibre;
      }
      else
       clock.Delete();
  }
 }

}

}
}


voila j espere que sa pourra t aider ( ja i enlever quelque lignes qui ne servaient pas pour l exemple) :rolleyes:

Didi - November 17, 2003 10:16 PM (GMT)
Étonnament, je comprend tout :P

Tres différent de ce que javais penser, je croit que sa va marcher parfaitement :P
Encore merci

Edit: Ton timer marche nickel et c'est exactement ce que je voulais !

Mici !

Usul - November 17, 2003 11:51 PM (GMT)
pas de prob ;)




* Hosted for free by InvisionFree