Title: Remplacer un item par un autre
CoolDev - July 10, 2003 03:31 PM (GMT)
Voilà mon problème, j'aimerais remplacer tout les items d'un certains type par un autre, tout en concervant certaines des propriétés de l'item à rempalcer.
Voici le code principal
| CODE |
public static void Convertion_OnCommand( CommandEventArgs e ) { e.Mobile.SendMessage( "Conversion en cours..." ); ArrayList items = new ArrayList( World.Items.Values ); int count = 0; bool ok = false; foreach ( Item m in items ) { if ( m is Log ) { count++; ok = false; Log pmr = (Log)m; LogTmp pm = new LogTmp( m.Serial ); pm.Stackable = pmr.Stackable; pm.Amount = pmr.Amount; pm.Weight = pmr.Weight; pm.Location = pmr.Location; pm.Map = pmr.Map; //pm.MoveToWorld( pmr.Location, pmr.Map );
World.Items[m.Serial] = pm; Console.WriteLine( "{0} {2} log {1} converti", m.Serial, pmr.Name, pm.Amount);
ok = true; } } } |
Là où ca cloche, c'est lors de l'enregistrement de la propriété Map. Elle provoque un crash server. Et voici l'exception qui en ressort.
| CODE |
Exception: System.Exception: Items array is null--are you calling the serialization constructor? Type=Server.Items.LogTmp at Server.Item.set_Map(Map value) at Server.Scripts.Commands.ConvBois.ConvBois_OnCommand(CommandEventArgs e) at Server.Commands.Handle(Mobile from, String text) at Server.Mobile.DoSpeech(String text, Int32[] keywords, MessageType type, Int32 hue) at Server.Network.PacketHandlers.UnicodeSpeech(NetState state, PacketReader pvSrc) at Server.Network.MessagePump.HandleReceive(NetState ns) at Server.Network.MessagePump.Slice() at Server.Core.Main(String[] args) |
Dans mon objet LogTmp j'ai pourtant une méthode constructeur avec le serial. Pourtant j'ai besoins de ce paramètre pour que les objets restent à la même place.
Voilà, si quelqu'un a une idée sur la question, qu'il n'hésite pas :)
crystal - July 10, 2003 03:53 PM (GMT)
euh je voit pas , ta essayer comme sa ?
j'enregistre tous les log dans un fichier temp avec leur loc X,Y,Z , amount
je les supprime
Je spawn mon nouveau log en me basant sur mon fichier Temp
(en fait j'ai peur que pour les objet locké dans les maisons etc etc sa fasse des degats)
Sna - July 11, 2003 06:57 AM (GMT)
a mon avis c pas la map c plutot ca qui cloche
| CODE |
| LogTmp pm = new LogTmp( m.Serial ); |
pourquoi utilises tu m.Serial puisque tu recupere les donnees que tu veux lui rendre de l'ancien
moi j'essayerais simplement
| CODE |
| LogTmp pm = new LogTmp(); |
ou encore mieux
| CODE |
| LogTmp pm = new LogTmp( pmr.Amount ); |
avec ca ca ne peux que fonctionner :)
CoolDev - July 11, 2003 10:19 AM (GMT)
C'est ce que j'ai fait ensuite, mais les objets dans les banques ou dans un coffre ne sont pas recréés. J'ai même recopié la propriété Parent, mais ca n'a rien changé.
Sna - July 11, 2003 04:49 PM (GMT)
ben tu peux essayer un petit test de parent comme ceci
| CODE |
if (m.Parent != null) { if (m.Parent == BankBox) { BankBox bank = m.Parent; bank.DropItem(pm); } else if (m.Parent == Container) { Container cont = m.Parent; cont.DropItem(pm); } } |
ca devrait ramener l'item dans le sac, evidemment tu n'aura plus besoin d'un MoveToWorld dans ce cas la :)
bonne chance