RunUO-FR
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
RunUO-FR

Forum de support pour RunUO en français.
 
AccueilAccueil  Dernières imagesDernières images  RechercherRechercher  S'enregistrerS'enregistrer  Connexion  
Le Deal du moment : -39%
Pack Home Cinéma Magnat Monitor : Ampli DENON ...
Voir le deal
1190 €

 

 [Réglé]Item Lié à un autre- Pommier

Aller en bas 
3 participants
AuteurMessage
Pantoute

Pantoute


Messages : 44
Date d'inscription : 05/09/2008
Localisation : Québec

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedMar 9 Sep - 3:36

LE SCRIPT COMPLET EST AU DERNIER POST



Bon voilà, comme promis, c'est le temps de vous exploiter. tongue

J'essaie de faire un simple pommier dont on peut récolter des pommes en double-cliquant, et une se rajoute à chaque heure, mais avec un maximum de 50. Bref, tout ça marche très bien, ce n'est pas le problème.

Le problème, c'est qu'il n'y a que le gump des feuilles dans l'objet. Il manque le tronc. Ce que j'essaie de faire, c'est faire en sorte que lorsque mon item "pommier" se créé, un tronc se créé au même endroit. Après ça, si je décide de bouger le pommier par le tronc (ou les feuilles selon ce que j'ai sélectionné), que l'autre partie suit l'autre et soit sur la même case aussi.

J'ai déjà essayer de le faire en Addon, mais je peux pas changer un ItemID dans un Addon on dirait (car je change d'ItemId selon que l'arbre est plein ou vide), mais ça n'a pas marcher... là je sais plus trop quoi faire. Surtout que j'Ai une erreur bidon quand j'essaie simplement de bouger l'arbre. C'est ça qui fait crasher. À part le reste marche bien (le changement d'Id, les pommes, etc)

Voilà les scripts!

Code:
    public class TroncPomme : Item
    {
        private Item i;

        [Constructable]
        public TroncPomme(Item I): base(0xd94)
        {
            Weight = 1.0;
            Movable = false;
            Name = "Tronc de pommier";
            i = I;
        }

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

        public override void OnLocationChange(Point3D oldLocation)
        {
            if (i == null || (i.Location == Location && i.Map == Map))
                return;

            i.MoveToWorld(Location, Map);
        }

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

            writer.Write((int)0);
        }

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

            int version = reader.ReadInt();
        }
    }

Code:
    public class Pommier : Item
    {
        private int m_Apples;
        private Item item;

        [Constructable]
        public Pommier(): base(0xD95)
        {
            Weight = 10.0;
            Name = "Pommier";
            Movable = false;

            Timer.DelayCall(TimeSpan.FromSeconds(0.0), new TimerCallback(Tronc));

            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback( AddApple ));
        }

        public Pommier(Serial serial)
            : base(serial)
        {
        }
        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
            writer.Write((int)0); // version
            writer.Write(m_Apples);
            writer.Write(item);

        }
        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();
            m_Apples = reader.ReadInt();
            item = reader.ReadItem();
            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback(AddApple));
        }

        public override void OnDoubleClick(Mobile from)       
        {
            if ( from.InRange( this, 2 ) && from.CanSee( this ) )
            {
                if (m_Apples > 0)
                {
                    from.SendMessage("Vous ceuillez des pommes et les mettez dans votre sac");
                    from.AddToBackpack(new Apple(m_Apples));
                    m_Apples = 0;
                    this.ItemID = 0xD95;
                }

                else
                {
                    from.SendMessage("Il n'y a aucune pomme à ceuillir pour le moment");
                }
       
            }
            else
                from.SendMessage("Vous êtes trop loin de l'arbre");
        }

        public override void OnLocationChange(Point3D oldLocation)
        {
            if (item == null || (item.Location == Location && item.Map == Map))
                return;

            item.MoveToWorld(Location, Map);
        }

        private void AddApple()
        {
            this.ItemID = 0xD96;
            if (m_Apples < 50)
            m_Apples += 1;
            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback( AddApple ));
        }
        private void Tronc()
        {
            Item I;
            I = this;

            item = new TroncPomme(I);
            item.MoveToWorld(this.Location, this.Map);
        }
    }

et voilà l'erreur que j'ai quand je bouge mon arbre. Tout le reste va bien

[Réglé]Item Lié à un autre- Pommier Setuperrorgv9

Merci beaucoup à vous d'avance!


Dernière édition par Pantoute le Sam 13 Sep - 20:10, édité 2 fois
Revenir en haut Aller en bas
http://au-crepuscule.com/?page=accueil
Plume




Messages : 37
Date d'inscription : 05/09/2008

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedMar 9 Sep - 3:48

EDIT: Vient de trouver un modèle préfait, et donc inutile d'expliquer...

Je te conseille de t'inspirer du fichier HolidayTree.cs qui fait à peu près ce genre d'affaire.

*/Scripts/Items/Special/Holiday/Christmas/HolidayTree.cs


Sur RunUO 2.0 bien sûr. Mais les modifications devraient fonctionner sur 1.0
Revenir en haut Aller en bas
Pantoute

Pantoute


Messages : 44
Date d'inscription : 05/09/2008
Localisation : Québec

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedMar 9 Sep - 4:04

Merci, j'ignorais qu'une chose comme ça existait Razz

mais ça ne semble pas marcher, le compilateur dis que ça prend pas d'argument 4.

Code:
        [Constructable]
        public Pommier(): base(0xD95)
        {
            Weight = 10.0;
            Name = "Pommier";
            Movable = false;

            Item TroncPomme_;
            TroncPomme_ = new TroncPomme();

            AddItem(0, 0, 0, TroncPomme_);
            http://Timer.DelayCall(TimeSpan.FromSeconds(0.0), new TimerCallback(Tronc));

            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback( AddApple ));
        }

EDIT: D'Accord, merci je regarderai Holyday tree. J'en ai un aussi sur 1.0.

Je ferai ça demain, parce que là j'ai plus le temps Sad
Revenir en haut Aller en bas
http://au-crepuscule.com/?page=accueil
Plume




Messages : 37
Date d'inscription : 05/09/2008

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedMar 9 Sep - 4:26

N'oublie pas de refaire une méthode AddItem spécifique à ton problème!
Revenir en haut Aller en bas
Gargouille




Messages : 97
Date d'inscription : 02/09/2008

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedMar 9 Sep - 13:58

Salut ;o)

Voici pour ton code quelques pistes:


  • Pourquoi veux tu déplacer un arbre ? D'un côté tu le mets en movable false, d'un autre tu crées des méthodes pour le déplacer.

  • Enlève tes Timer.DelayCall du constructeur du pommier. Mettre des choses externes dans un constructeur, c'est toujours casse-gueule.

  • Met les dans la méthode OnLocationChange. Sachant qu'elle est appelée à la première initialisation de Location. donc elle suit le constructeur de près.

  • A partir de là, garde ton Timer.DelayCall pour les pommes, mais pour le tronc, un if(item==null) suffira.

  • A ce propos, pour plus de lisibilité dans ton code, pourquoi déclarer un private Item item; plutôt que carrément un private TroncPomme tronc; ... ? Même si tu dois dans les méthodes de sérialisation faire des casts writer.Write((Item)tronc); et tronc = (TroncPomme)reader.ReadItem();

  • Et à l'inverse, dans TroncPomme, remplacer Item par Pommier...

  • A ce propos, i n'est pas sérialisé dans TroncPomme, donc après un reboot, tu risque de crasher si tu déplaces le tronc, puisqu'il n'y a pas de référence à un Pommier...


Bonne suite ;o)
Revenir en haut Aller en bas
Gargouille




Messages : 97
Date d'inscription : 02/09/2008

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedMar 9 Sep - 16:35

Après quelques tests, il s'avère que je n'arrive pas non plus à faire apparaitre le second objet, mais ce n'est qu'un problème d'affichage, mes tests prouvent que je passe bien dans le constructeur du tronc...

C'est pas bien clair, je regarderais plus tard.

Mais, regarde bien que tu n'ai pas juste un souci d'itemID, par exemple, les feuilles des arbres ne s'affichent pas si ton serveur est en hiver...

A toutes.
Revenir en haut Aller en bas
Gargouille




Messages : 97
Date d'inscription : 02/09/2008

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedMar 9 Sep - 23:12

Coriace ton affaire Evil or Very Mad

J'ai fais des test, et refait le code autrement, pour voir, mais c'est toujours la même chose.

Tu avais les feuilles mais pas le tronc, moi je n'avais rien. Du coup j'ai essayé à l'envers, plutôt qu'un code dans les feuilles qui appelle un tronc, j'ai fait l'inverse.

Du coup, j'avais bien le tronc. Pourquoi la différence ? Je suis allé dans le TileData enlever le foliage de l'art de feuille. Il y a bien des choses qui se joeunt là.

Je te laisse ici le code sur lequel je suis resté.

Dans le doubleclick, j'ai effacé les feuilles pour en remettre, mais à 5 tiles. Donc j'en conclue que c'est bien la superposition des deux images qui foire.

Soit c'est dans le code, et c'est tordu, soit la solution est dans le tiledata.

Par exemple, j'avais déjà fais un code d'arbre, ou des feuille devaient être par dessus le tronc, il fallait alors impérativement que le height, dans le tiledata, soit supérieur pour les feuilles. Mais ça corrigeais le fait qu'autrement les feuilles apparaissaient derrière le tronc. Ici elles n'apparaissent pas du tout...

Truc de ouf... T'as pas une idée Plume, toi qui manges du tiledata au petit déjeuner ? Crying or Very sad

Code:
using System;

namespace Server.Items
{
   public class Pommier : Item
    {
        private int m_Apples;
       
        private Feuillage feuillage;

        [Constructable]
        public Pommier(): base(0xd94)
        {
            //Weight = 10.0;
            Name = "Pommier";
            Movable = false;
            //IsLockedDown=true;
        }
 
        public Pommier(Serial serial): base(serial)
        {
        }
       
        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
            writer.Write((int)0); // version
            writer.Write((int)m_Apples);
            writer.Write((Item)feuillage);

        }
       
        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();
            m_Apples = reader.ReadInt();
            feuillage = (Feuillage)reader.ReadItem();
            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback(AddApple));
        }

        public override void OnDoubleClick(Mobile from)     
        {
           feuillage.Delete();
           feuillage = new Feuillage();
           Point3D newpoint = this.Location;
           newpoint.X +=5;
           feuillage.MoveToWorld( newpoint, this.Map );
           
           if ( from.InRange( this, 2 ) && from.CanSee( this ) )
            {
                if (m_Apples > 0)
                {
                    from.SendMessage("Vous cueuillez des pommes et les mettez dans votre sac");
                    from.AddToBackpack(new Apple(m_Apples));
                    m_Apples = 0;
                    if(feuillage!=null)
                       feuillage.ItemID = 0xD95;
                     
                }
                else
                {
                    from.SendMessage("Il n'y a aucune pomme à cueuillir pour le moment");
                }
            }
            else
                from.SendMessage("Vous êtes trop loin de l'arbre");
        }

      public override void OnLocationChange(Point3D oldLocation)
        {
           if (feuillage == null)
           {
              Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback( AddApple ));
              
              feuillage = new Feuillage();
              feuillage.MoveToWorld( this.Location, this.Map );
              return;
           }
           else if(feuillage.Location == Location && feuillage.Map == Map)
              return;
             
            feuillage.MoveToWorld(Location, Map);
        }

        private void AddApple()
        {
            if (feuillage != null)
            {
               feuillage.ItemID = 0xD96;
               
               if (m_Apples < 50)
                  m_Apples += 1;
               
                Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback( AddApple ));
            }
        }
       
    }
   public class Feuillage : Item
    {
      public Feuillage(): base(0xd95)
        {     
           Movable = false;
            //IsLockedDown=true;
        }

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

        public override void OnLocationChange(Point3D oldLocation)
        {
         
        }

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

            writer.Write((int)0);
        }

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

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

Revenir en haut Aller en bas
Plume




Messages : 37
Date d'inscription : 05/09/2008

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedMer 10 Sep - 4:06

Bien vu, Gargouille!

Le flag "Foliage" fait en sorte que le feuillage disparait en hiver, suivant donc le système de saison. Ensuite, pour ce qui a trait au height, celui-ci n'est pas une incrémentation du Z qui est celui du sol, mais est plutôt la hauteur à laquelle s'élève l'objet de manière à ce que si on en crée un par-dessus, il soit à Z + height.

Ainsi donc, il est préférable de créer le tronc avant le feuillage.

L'idéal serait donc de créer 2 scripts.

Le premier, le feuillage qui comprend la méthode pour créer les pommes.
Le second, le tronc qui comprend un ajout d'item à sa création qui serait le feuillage.

Cette façon de faire fonctionne avec des deeds, mais a quelques difficultés, semble-t-il, avec les items directement appelés par le .add. Sans doute est-ce la faute du constructeur.
Revenir en haut Aller en bas
Gargouille




Messages : 97
Date d'inscription : 02/09/2008

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedMer 10 Sep - 17:44

Je te livre ici un code qui donne des pistes ^^

Il crée d'abord le tronc, puis les feuilles. Celle ci ne s'afichent pas depuis la première OnLocationChange, mais j'ai inclu un autre affichage dans OnDoubleClick, qui fonctionne (a condition que le tildeata-tag foliage soit désactivé)...

Donc ici l'affichage fonctionne :

  1. En différé du constructeur
  2. Sans foliage
  3. Avec Z+1


Code:
using System;

namespace Server.Items
{
   public class Pommier : Item
    {
        private int m_Apples;
       
        private Feuillage feuillage;

        [Constructable]
        public Pommier(): base(0xd94)
        {
            Name = "Pommier";
            Movable = false;
            IsLockedDown=true;
        }
 
        public Pommier(Serial serial): base(serial)
        {
        }
       
        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
            writer.Write((int)0); // version
            writer.Write((int)m_Apples);
            writer.Write((Item)feuillage);

        }
       
        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();
            m_Apples = reader.ReadInt();
            feuillage = (Feuillage)reader.ReadItem();
            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback(AddApple));
        }

        public override void OnDoubleClick(Mobile from)     
        {
           AddFeuillage();
           
           if ( from.InRange( this, 2 ) && from.CanSee( this ) )
            {
                if (m_Apples > 0)
                {
                    from.SendMessage("Vous cueuillez des pommes et les mettez dans votre sac");
                    from.AddToBackpack(new Apple(m_Apples));
                    m_Apples = 0;
                    if(feuillage!=null)
                       feuillage.ItemID = 0xD95;
                     
                }
                else
                {
                    from.SendMessage("Il n'y a aucune pomme à cueuillir pour le moment");
                }
            }
            else
                from.SendMessage("Vous êtes trop loin de l'arbre");
        }

      public override void OnLocationChange(Point3D oldLocation)
        {
           if (feuillage == null)
           {
              Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback( AddApple ));
              AddFeuillage();
              return;
           }
           else if(feuillage.X == this.X && feuillage.Y == this.Y && feuillage.Map == Map)
              return;
           
            AddFeuillage();
        }

      private void AddFeuillage()
      {
            feuillage = new Feuillage();
           Point3D newpoint = this.Location;
           newpoint.Z += 1;
           feuillage.MoveToWorld( newpoint, this.Map );
      }
     
        private void AddApple()
        {
            if (feuillage != null)
            {
               feuillage.ItemID = 0xD96;
               
               if (m_Apples < 50)
                  m_Apples += 1;
               
                Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback( AddApple ));
            }
        }
       
    }
   public class Feuillage : Item
    {
      public Feuillage(): base(0xd95)
        {     
           Movable = false;
            IsLockedDown = true;
        }

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

        public override void OnLocationChange(Point3D oldLocation)
        {
         
        }

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

            writer.Write((int)0);
        }

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

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

Revenir en haut Aller en bas
Pantoute

Pantoute


Messages : 44
Date d'inscription : 05/09/2008
Localisation : Québec

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedJeu 11 Sep - 4:57

Merci pour vos réponses. Je tenterai de l'esseyai très bientôt. Mais j'ai vraiment pas de temps à cause du Cégep et du travail en ce moment. Je vais essayer Vendredi matin... sinon... samedi ou dimanche
Revenir en haut Aller en bas
http://au-crepuscule.com/?page=accueil
Plume




Messages : 37
Date d'inscription : 05/09/2008

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedJeu 11 Sep - 5:11

Petite note à Gargouille.

Je ne comprends pas le pourquoi du refus de la limitation du foliage. Après tout, cette limitation a un sens en ce qui a trait aux scripts: quand il neige, les arbres ne fleurissent pas. Ainsi, il me semble logique que l'hiver il n'y ait pas de pommes. C'est donc pourquoi, au lieu d'enlever le tag Foliage je mettrais une condition du genre if (server.season != winter) [à titre d'exemple] pour que la ressource ne soit plus disponible l'hiver.

Selon moi ça rend la chose plus réaliste et raréfie la ressource, ce qui n'est pas mauvais dans un jeu assez économique.
Revenir en haut Aller en bas
Gargouille




Messages : 97
Date d'inscription : 02/09/2008

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedJeu 11 Sep - 10:39

Donc Pantoute, au final :

Oublie le Z+1, c'est une erreur de ma part.

Pour le foliage, il faudrait tester en été, et effectivement ça peut être une bonne chose de ne pas avoir de pommes en hiver.

Et pour l'affichage des feuilles dans mon exemple, ou du tronc dans ton premier code, il y a bien un petit délai de "mise en route" :
- si dans OnLocationChange(pour la première fois) ou dans le constructeur, j'appelle AddFeuillage (new feuillage + MoveToWorld) ça ne s'affiche pas.
- en revanche en appelant AddFeuillage avec un Timer, ça joue, seulement dans ton premier code, ton Timer étai à 0sec, trop rapide. Avec un TimeSpan.FromMillisecondes(500.0), ça le fait.
Revenir en haut Aller en bas
Pantoute

Pantoute


Messages : 44
Date d'inscription : 05/09/2008
Localisation : Québec

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedJeu 11 Sep - 14:11

Bon... J'ai essayé ça. Avec les timers ça mieux là, mais pour une raison bizarre, avec ce code lorsque le tronc apparait les feuilles disparaissent! Je me retrouve avec un arbre pas de feuille...

C'est bien quelque chose du genre que tu voulais dire dans ton dernier post?

Code:
    public class TroncPomme : Item
    {
        private bool Attend = false;
        private Item i;

        [Constructable]
        public TroncPomme(Item I, Point3D x, Map y): base(0xd94)
        {
            Weight = 1.0;
            Movable = false;
            Name = "Tronc de pommier";
            i = I;
            Timer.DelayCall(TimeSpan.FromMilliseconds(500.0), new TimerCallback(AttendUnPeu));

            this.Location = x;
            this.Map = y;
        }

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

        public override void OnLocationChange(Point3D oldLocation)
        {
            if (i == null || (i.Location == this.Location && i.Map == this.Map))
                return;

            if (Attend = false)
                return;

            else
            i.MoveToWorld(Location, Map);
        }

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

            writer.Write((int)0);
        }

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

            int version = reader.ReadInt();
        }

        public void AttendUnPeu()
        {
            bool Attend = true;
        }
    }
Code:

    public class Pommier : Item
    {
        private int m_Apples;
        private Item item;

        [Constructable]
        public Pommier(): base(0xD95)
        {
            Weight = 10.0;
            Name = "Pommier";
            Movable = false;

            Timer.DelayCall(TimeSpan.FromMilliseconds(500.0), new TimerCallback(Tronc));

            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback( AddApple ));
        }

        public Pommier(Serial serial)
            : base(serial)
        {
        }
        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
            writer.Write((int)0); // version
            writer.Write(m_Apples);
            writer.Write(item);

        }
        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();
            m_Apples = reader.ReadInt();
            item = reader.ReadItem();
            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback(AddApple));
        }

        public override void OnDoubleClick(Mobile from)      
      {
         if ( from.InRange( this, 2 ) && from.CanSee( this ) )
         {
                if (m_Apples > 0)
                {
                    from.SendMessage("Vous ceuillez des pommes et les mettez dans votre sac");
                    from.AddToBackpack(new Apple(m_Apples));
                    m_Apples = 0;
                    this.ItemID = 0xD95;
                }

                else
             {
                    from.SendMessage("Il n'y a aucune pomme à ceuillir pour le moment");
                }
      
            }
            else
                from.SendMessage("Vous êtes trop loin de l'arbre");
       }

        public override void OnLocationChange(Point3D oldLocation)
        {
            if (item == null || (item.Location == Location && item.Map == Map))
                return;

            item.MoveToWorld(Location, Map);
        }

        private void AddApple()
        {
            this.ItemID = 0xD96;
            if (m_Apples < 50)
           m_Apples += 1;
           Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback( AddApple ));
        }
        private void Tronc()
        {
            Item I;
            I = this;

            Point3D x;
            x = this.Location;

            Map y;
            y = this.Map;

            item = new TroncPomme(I, x, y);
            http://item.MoveToWorld(this.Location, this.Map);
        }
    }
Revenir en haut Aller en bas
http://au-crepuscule.com/?page=accueil
Gargouille




Messages : 97
Date d'inscription : 02/09/2008

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedJeu 11 Sep - 15:45

Ton code fonctionne très bien... sans le tag foliage.
[et après avoir corrigé : if(Attend = true) => il faut un double =
et dans AttendsunPeu, ne pas déclarer le type de Attend, c'est déjà fait]


Donc un choix à faire, soit enlever le tag, et tu auras tes feuilles en toute saison, mais quand un joueur passera derrière, elle ne deviendront pas transparentes. Soit garder l'attribut, les feuilles n'apparaissant pas en hiver...
Revenir en haut Aller en bas
Pantoute

Pantoute


Messages : 44
Date d'inscription : 05/09/2008
Localisation : Québec

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedVen 12 Sep - 1:22

YES! Ça marche! Merci!

mais c'était le if(Attend == false)

Citation :
Donc un choix à faire, soit enlever le tag, et tu auras tes feuilles en toute saison, mais quand un joueur passera derrière, elle ne deviendront pas transparentes. Soit garder l'attribut, les feuilles n'apparaissant pas en hiver...

Je suis pas sur de comprendre...

Le foliage est déjà dans mon script? Si oui, où? Et comment interrompre le nombre de pommes produites quand c'est l'hiver? Et comment le remettre après?

Est- ce qu'il y a autre chose que je devrais mettre dans serialize et deserialize pour les 2 scripts? Merci! de votre aide!
Revenir en haut Aller en bas
http://au-crepuscule.com/?page=accueil
Plume




Messages : 37
Date d'inscription : 05/09/2008

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedVen 12 Sep - 1:24

Foliage est un tag du tiledata, il apparaîtra dans un de mes prochains tutoriaux.

Sinon, pour ta culture générale, le tiledata est un fichier client.
Revenir en haut Aller en bas
Gargouille




Messages : 97
Date d'inscription : 02/09/2008

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedVen 12 Sep - 7:00

Et donc, ça n'a rien à voir avec ton script. Le tag foliage est présent pour tout les "art" (dessin) de feuillages, il permet l'effet de disparition lorsqu'un pj passe derrière. C'est le client qui gère ça, pas le serveur. Donc pas modifiable par script, mais par modification des fichiers client, ici le tiledata. Si tu le modifies, il faut alors le ditribuer aux joueurs.

Et donc à priori, chose que je ne savais pas, l'attribut foliage fait aussi que le lcient n'affiche pas les feuilles l'hiver.

Citation :
comment interrompre le nombre de pommes produites quand c'est l'hiver? Et comment le remettre après?
Je dirais, inutile. Puisque tu définis le doubleclick de récolte dans les feuilles, alors, lorsque le art n'est pas affiché par le client, on ne risque pas de cliquer dessus.
Sinon il faudrait un test sur la saison, je ne sais pas encore comment ça se gère...

Et pour les sérialize, peut être remplacer :
Code:
writer.Write(m_Apples);
            writer.Write(item);
par :
Code:
writer.Write( (int) m_Apples);
            writer.Write( (Item) item);
Revenir en haut Aller en bas
Pantoute

Pantoute


Messages : 44
Date d'inscription : 05/09/2008
Localisation : Québec

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedVen 12 Sep - 15:46

J'ai ajouter ça au serialize et deserialize de TroncPomme. Est-ce inutile?

Code:
        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
            writer.Write((int)0);
            writer.Write((Item)I);
            writer.Write((Item)i);
            writer.Write((Point3D)x);
            writer.Write((Map)y);
            writer.Write((bool)Attend);
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();
            I = reader.ReadItem();
            i = reader.ReadItem();
            x = reader.ReadPoint3D();
            y = reader.ReadMap();
            Attend = reader.ReadBool();
        }
Revenir en haut Aller en bas
http://au-crepuscule.com/?page=accueil
Gargouille




Messages : 97
Date d'inscription : 02/09/2008

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedVen 12 Sep - 16:34

Inutile de sérialiser i et I ... Ne sérialise que la référence à l'objet Pommier.

Inutile de serialser Location et Map, si tu a la référence à I, du aura I.Location et I.Map

inutile aussi de sérialiser ton bool.
Revenir en haut Aller en bas
Pantoute

Pantoute


Messages : 44
Date d'inscription : 05/09/2008
Localisation : Québec

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedVen 12 Sep - 17:46

Non, j'ai remauqé que j'ai absolument besoin de ça, sinon quand je load mon serveur test et que j'essaie de bouger l'arbre par le tronc, les feuilles ne suivent pas. Comme ça oui maintenant:

Code:
    public class TroncPomme : Item
    {
        private bool Attend = false;
        private Item i;
        private Point3D X;
        private Map Y;

        [Constructable]
        public TroncPomme(Item I, Point3D x, Map y): base(0xd94)
        {
            Weight = 1.0;
            Movable = false;
            Name = "Tronc de pommier";
            i = I;
            Timer.DelayCall(TimeSpan.FromMilliseconds(500.0), new TimerCallback(AttendUnPeu));

            this.Location = x;
            this.Map = y;
        }

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

        public override void OnLocationChange(Point3D oldLocation)
        {
            if (i == null || (i.Location == this.Location && i.Map == this.Map))
                return;

            if (Attend == false)
                return;

            else
            i.MoveToWorld(Location, Map);
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
            writer.Write((int)0);
            writer.Write((Item)i);
            writer.Write((Point3D)X);
            writer.Write((Map)Y);
            writer.Write((bool)Attend);
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();
            i = reader.ReadItem();
            X = reader.ReadPoint3D();
            Y = reader.ReadMap();
            Attend = reader.ReadBool();
        }

        public void AttendUnPeu()
        {
            Attend = true;
        }
    }

Code:
    public class Pommier : Item
    {
        private int m_Apples;
        private Item item;

        [Constructable]
        public Pommier(): base(0xD95)
        {
            Weight = 10.0;
            Name = "Pommier";
            Movable = false;

            Timer.DelayCall(TimeSpan.FromMilliseconds(500.0), new TimerCallback(Tronc));

            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback( AddApple ));
        }

        public Pommier(Serial serial)
            : base(serial)
        {
        }
        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
            writer.Write((int)0); // version
            writer.Write((int)m_Apples);
            writer.Write((Item)item);

        }
        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();
            m_Apples = reader.ReadInt();
            item = reader.ReadItem();
            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback(AddApple));
        }

        public override void OnDoubleClick(Mobile from)      
      {
         if ( from.InRange( this, 2 ) && from.CanSee( this ) )
         {
                if (m_Apples > 0)
                {
                    from.SendMessage("Vous ceuillez des pommes et les mettez dans votre sac");
                    from.AddToBackpack(new Apple(m_Apples));
                    m_Apples = 0;
                    this.ItemID = 0xD95;
                }

                else
             {
                    from.SendMessage("Il n'y a aucune pomme à ceuillir pour le moment");
                }
      
            }
            else
                from.SendMessage("Vous êtes trop loin de l'arbre");
       }

        public override void OnLocationChange(Point3D oldLocation)
        {
            if (item == null || (item.Location == Location && item.Map == Map))
                return;

            item.MoveToWorld(Location, Map);
        }

        private void AddApple()
        {
            this.ItemID = 0xD96;
            if (m_Apples < 50)
           m_Apples += 1;
           Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback( AddApple ));
        }
        private void Tronc()
        {
            Item I;
            I = this;

            Point3D x;
            x = this.Location;

            Map y;
            y = this.Map;

            item = new TroncPomme(I, x, y);
            http://item.MoveToWorld(this.Location, this.Map);
        }
    }

Au fait, mon script est complet selon vous ou il manquerait encore quelque chose et tout est correcte et sans bug?
Revenir en haut Aller en bas
http://au-crepuscule.com/?page=accueil
Pantoute

Pantoute


Messages : 44
Date d'inscription : 05/09/2008
Localisation : Québec

[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_minipostedSam 13 Sep - 20:03

Voilà le script complet sans bug (à ce que je sache! Avisez-moi le si vous en trouvez) pour les intéressé:

Un pommier un poirier et un pêcher.

Et je tiens à remercier grandement ceux qui m'ont aider à faire marche ce script! Merci!

Code:
using System;
using Server;
using Server.Items;

namespace Server.Items
{
    public class TroncPomme : Item
    {
        private bool Attend = false;
        private Item i;
        new private Point3D X;
        new private Map Y;

        [Constructable]
        public TroncPomme(Item I, Point3D x, Map y): base(0xd94)
        {
            Weight = 1.0;
            Movable = false;
            Name = "Tronc de pommier";
            i = I;
            X = x;
            Y = y;
            Timer.DelayCall(TimeSpan.FromMilliseconds(500.0), new TimerCallback(AttendUnPeu));

            this.Location = X;
            this.Map = y;
        }

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

        public override void OnLocationChange(Point3D oldLocation)
        {
            if (i == null || (i.Location == this.Location && i.Map == this.Map))
                return;

            if (Attend == false)
                return;

            else
            i.MoveToWorld(Location, Map);
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
            writer.Write((int)0);
            writer.Write((Item)i);
            writer.Write((Point3D)X);
            writer.Write((Map)Y);
            writer.Write((bool)Attend);
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();
            i = reader.ReadItem();
            X = reader.ReadPoint3D();
            Y = reader.ReadMap();
            Attend = reader.ReadBool();
        }

        public void AttendUnPeu()
        {
            Attend = true;
        }
    }

    public class TroncPêche : Item
    {
        private bool Attend = false;
        private Item i;
        new private Point3D X;
        new private Map Y;

        [Constructable]
        public TroncPêche(Item I, Point3D x, Map y)
            : base(0xd9c)
        {
            Weight = 1.0;
            Movable = false;
            Name = "Tronc de pêcher";
            i = I;
            X = x;
            Y = y;
            Timer.DelayCall(TimeSpan.FromMilliseconds(500.0), new TimerCallback(AttendUnPeu));

            this.Location = X;
            this.Map = y;
        }

        public TroncPêche(Serial serial)
            : base(serial)
        {
        }

        public override void OnLocationChange(Point3D oldLocation)
        {
            if (i == null || (i.Location == this.Location && i.Map == this.Map))
                return;

            if (Attend == false)
                return;

            else
                i.MoveToWorld(Location, Map);
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
            writer.Write((int)0);
            writer.Write((Item)i);
            writer.Write((Point3D)X);
            writer.Write((Map)Y);
            writer.Write((bool)Attend);
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();
            i = reader.ReadItem();
            X = reader.ReadPoint3D();
            Y = reader.ReadMap();
            Attend = reader.ReadBool();
        }

        public void AttendUnPeu()
        {
            Attend = true;
        }
    }

    public class TroncPoire : Item
    {
        private bool Attend = false;
        private Item i;
        new private Point3D X;
        new private Map Y;

        [Constructable]
        public TroncPoire(Item I, Point3D x, Map y)
            : base(0xda4)
        {
            Weight = 1.0;
            Movable = false;
            Name = "Tronc de poirier";
            i = I;
            X = x;
            Y = y;
            Timer.DelayCall(TimeSpan.FromMilliseconds(500.0), new TimerCallback(AttendUnPeu));

            this.Location = X;
            this.Map = y;
        }

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

        public override void OnLocationChange(Point3D oldLocation)
        {
            if (i == null || (i.Location == this.Location && i.Map == this.Map))
                return;

            if (Attend == false)
                return;

            else
                i.MoveToWorld(Location, Map);
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
            writer.Write((int)0);
            writer.Write((Item)i);
            writer.Write((Point3D)X);
            writer.Write((Map)Y);
            writer.Write((bool)Attend);
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();
            i = reader.ReadItem();
            X = reader.ReadPoint3D();
            Y = reader.ReadMap();
            Attend = reader.ReadBool();
        }

        public void AttendUnPeu()
        {
            Attend = true;
        }
    }


    public class Pommier : Item
    {
        private int m_Apples;
        private Item item;

        [Constructable]
        public Pommier(): base(0xD95)
        {
            Weight = 10.0;
            Name = "Pommier";
            Movable = false;

            Timer.DelayCall(TimeSpan.FromMilliseconds(500.0), new TimerCallback(Tronc));

            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback( AddApple ));
        }

        public Pommier(Serial serial)
            : base(serial)
        {
        }
        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
            writer.Write((int)0); // version
            writer.Write((int)m_Apples);
            writer.Write((Item)item);

        }
        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();
            m_Apples = reader.ReadInt();
            item = reader.ReadItem();
            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback(AddApple));
        }

        public override void OnDoubleClick(Mobile from)      
      {
         if ( from.InRange( this, 2 ) && from.CanSee( this ) )
         {
                if (m_Apples > 0)
                {
                    from.SendMessage("Vous ceuillez des pommes et les mettez dans votre sac");
                    from.AddToBackpack(new Apple(m_Apples));
                    m_Apples = 0;
                    this.ItemID = 0xD95;
                }

                else
             {
                    from.SendMessage("Il n'y a aucune pomme à ceuillir pour le moment");
                }
      
            }
            else
                from.SendMessage("Vous êtes trop loin de l'arbre");
       }

        public override void OnLocationChange(Point3D oldLocation)
        {
            if (item == null || (item.Location == Location && item.Map == Map))
                return;

            item.MoveToWorld(Location, Map);
        }

        private void AddApple()
        {
            this.ItemID = 0xD96;
            if (m_Apples < 50)
           m_Apples += 1;
           Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback( AddApple ));
        }
        private void Tronc()
        {
            Item I;
            I = this;

            Point3D x;
            x = this.Location;

            Map y;
            y = this.Map;

            item = new TroncPomme(I, x, y);
            http://item.MoveToWorld(this.Location, this.Map);
        }
    }
    public class Pêcher : Item
    {
        private int m_Apples;
        private Item item;

        [Constructable]
        public Pêcher()
            : base(0xD9d)
        {
            Weight = 10.0;
            Name = "Pêcher";
            Movable = false;

            Timer.DelayCall(TimeSpan.FromMilliseconds(500.0), new TimerCallback(Tronc));

            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback(AddApple));
        }

        public Pêcher(Serial serial)
            : base(serial)
        {
        }
        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
            writer.Write((int)0); // version
            writer.Write((int)m_Apples);
            writer.Write((Item)item);

        }
        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();
            m_Apples = reader.ReadInt();
            item = reader.ReadItem();
            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback(AddApple));
        }

        public override void OnDoubleClick(Mobile from)
        {
            if (from.InRange(this, 2) && from.CanSee(this))
            {
                if (m_Apples > 0)
                {
                    from.SendMessage("Vous ceuillez des pêches et les mettez dans votre sac");
                    from.AddToBackpack(new Peach(m_Apples));
                    m_Apples = 0;
                    this.ItemID = 0xD9d;
                }

                else
                {
                    from.SendMessage("Il n'y a aucune pêche à ceuillir pour le moment");
                }

            }
            else
                from.SendMessage("Vous êtes trop loin de l'arbre");
        }

        public override void OnLocationChange(Point3D oldLocation)
        {
            if (item == null || (item.Location == Location && item.Map == Map))
                return;

            item.MoveToWorld(Location, Map);
        }

        private void AddApple()
        {
            this.ItemID = 0xD9e;
            if (m_Apples < 50)
                m_Apples += 1;
            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback(AddApple));
        }
        private void Tronc()
        {
            Item I;
            I = this;

            Point3D x;
            x = this.Location;

            Map y;
            y = this.Map;

            item = new TroncPêche(I, x, y);
            http://item.MoveToWorld(this.Location, this.Map);
        }
    }
    public class Poirier : Item
    {
        private int m_Apples;
        private Item item;

        [Constructable]
        public Poirier()
            : base(0xDa5)
        {
            Weight = 10.0;
            Name = "Poirier";
            Movable = false;

            Timer.DelayCall(TimeSpan.FromMilliseconds(500.0), new TimerCallback(Tronc));

            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback(AddApple));
        }

        public Poirier(Serial serial)
            : base(serial)
        {
        }
        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
            writer.Write((int)0); // version
            writer.Write((int)m_Apples);
            writer.Write((Item)item);

        }
        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();
            m_Apples = reader.ReadInt();
            item = reader.ReadItem();
            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback(AddApple));
        }

        public override void OnDoubleClick(Mobile from)
        {
            if (from.InRange(this, 2) && from.CanSee(this))
            {
                if (m_Apples > 0)
                {
                    from.SendMessage("Vous ceuillez des poires et les mettez dans votre sac");
                    from.AddToBackpack(new Pear(m_Apples));
                    m_Apples = 0;
                    this.ItemID = 0xDa5;
                }

                else
                {
                    from.SendMessage("Il n'y a aucune poire à ceuillir pour le moment");
                }

            }
            else
                from.SendMessage("Vous êtes trop loin de l'arbre");
        }

        public override void OnLocationChange(Point3D oldLocation)
        {
            if (item == null || (item.Location == Location && item.Map == Map))
                return;

            item.MoveToWorld(Location, Map);
        }

        private void AddApple()
        {
            this.ItemID = 0xDa6;
            if (m_Apples < 50)
                m_Apples += 1;
            Timer.DelayCall(TimeSpan.FromMinutes(60.0), new TimerCallback(AddApple));
        }
        private void Tronc()
        {
            Item I;
            I = this;

            Point3D x;
            x = this.Location;

            Map y;
            y = this.Map;

            item = new TroncPoire(I, x, y);
            http://item.MoveToWorld(this.Location, this.Map);
        }
    }
}
   
Revenir en haut Aller en bas
http://au-crepuscule.com/?page=accueil
Contenu sponsorisé





[Réglé]Item Lié à un autre- Pommier Empty
MessageSujet: Re: [Réglé]Item Lié à un autre- Pommier   [Réglé]Item Lié à un autre- Pommier Icon_miniposted

Revenir en haut Aller en bas
 
[Réglé]Item Lié à un autre- Pommier
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» [Réglé]Ajouter une description sous le nom d'un item
» [Réglé]Sérialiser
» [Réglé]Mettre du texte en jeu en String
» un autre nouveau !
» Rep: Autre Forum

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
RunUO-FR :: Problèmes et questions :: Comment faire ?-
Sauter vers: