| | [Réglé]Item Lié à un autre- Pommier | |
| | Auteur | Message |
---|
Pantoute
Messages : 44 Date d'inscription : 05/09/2008 Localisation : Québec
| Sujet: [Réglé]Item Lié à un autre- Pommier Mar 9 Sep - 3:36 | |
| LE SCRIPT COMPLET EST AU DERNIER POST
Bon voilà, comme promis, c'est le temps de vous exploiter. 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 Merci beaucoup à vous d'avance!
Dernière édition par Pantoute le Sam 13 Sep - 20:10, édité 2 fois | |
| | | Plume
Messages : 37 Date d'inscription : 05/09/2008
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Mar 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 | |
| | | Pantoute
Messages : 44 Date d'inscription : 05/09/2008 Localisation : Québec
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Mar 9 Sep - 4:04 | |
| Merci, j'ignorais qu'une chose comme ça existait 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 | |
| | | Plume
Messages : 37 Date d'inscription : 05/09/2008
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Mar 9 Sep - 4:26 | |
| N'oublie pas de refaire une méthode AddItem spécifique à ton problème! | |
| | | Gargouille
Messages : 97 Date d'inscription : 02/09/2008
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Mar 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) | |
| | | Gargouille
Messages : 97 Date d'inscription : 02/09/2008
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Mar 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. | |
| | | Gargouille
Messages : 97 Date d'inscription : 02/09/2008
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Mar 9 Sep - 23:12 | |
| Coriace ton affaire 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 ? - 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(); } } }
| |
| | | Plume
Messages : 37 Date d'inscription : 05/09/2008
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Mer 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. | |
| | | Gargouille
Messages : 97 Date d'inscription : 02/09/2008
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Mer 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 :
- En différé du constructeur
- Sans foliage
- 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(); } } }
| |
| | | Pantoute
Messages : 44 Date d'inscription : 05/09/2008 Localisation : Québec
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Jeu 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 | |
| | | Plume
Messages : 37 Date d'inscription : 05/09/2008
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Jeu 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. | |
| | | Gargouille
Messages : 97 Date d'inscription : 02/09/2008
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Jeu 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. | |
| | | Pantoute
Messages : 44 Date d'inscription : 05/09/2008 Localisation : Québec
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Jeu 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); } } | |
| | | Gargouille
Messages : 97 Date d'inscription : 02/09/2008
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Jeu 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... | |
| | | Pantoute
Messages : 44 Date d'inscription : 05/09/2008 Localisation : Québec
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Ven 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! | |
| | | Plume
Messages : 37 Date d'inscription : 05/09/2008
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Ven 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. | |
| | | Gargouille
Messages : 97 Date d'inscription : 02/09/2008
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Ven 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); | |
| | | Pantoute
Messages : 44 Date d'inscription : 05/09/2008 Localisation : Québec
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Ven 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(); } | |
| | | Gargouille
Messages : 97 Date d'inscription : 02/09/2008
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Ven 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. | |
| | | Pantoute
Messages : 44 Date d'inscription : 05/09/2008 Localisation : Québec
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Ven 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? | |
| | | Pantoute
Messages : 44 Date d'inscription : 05/09/2008 Localisation : Québec
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier Sam 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); } } }
| |
| | | Contenu sponsorisé
| Sujet: Re: [Réglé]Item Lié à un autre- Pommier | |
| |
| | | | [Réglé]Item Lié à un autre- Pommier | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |