View Full Version: Remplacer un item par un autre

RunUO.FR Support > Probleme de script > Remplacer un item par un autre


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




* Hosted for free by InvisionFree