[+/- Résolu] Transfert du contenu d'une variable serveur vers client



  • Salut !

    J'aimerais qu'à la connexion au serveur, le serveur envoie le contenue d'une variable vers le client. Cependant, je n'ai aucune idée de comment gérer les paquets de cette manière avec Forge.

    Pouvez-vous m'éclairer ? Merci d'avance.



  • Tu peux utiliser l'event  [size=smallEntityJoinWorldEvent
    ]
    Après, il suffit d'envoyer un packet



  • Oui, c'était la question du Packet qui me posait problème, mais je n'avais pas vu qu'il y avait ce tuto dans tutoriels des membres.

    Merci quand même ^^



  • En fait c'est pas du tout résolu.

    Je souhaite transférer une liste d'objets.
    J'ai pour cela procédé ainsi :

    package pingo.una.common;
    
    import io.netty.buffer.ByteBuf;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.List;
    
    import net.minecraft.client.Minecraft;
    import cpw.mods.fml.common.network.ByteBufUtils;
    import cpw.mods.fml.common.network.simpleimpl.IMessage;
    import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
    import cpw.mods.fml.common.network.simpleimpl.MessageContext;
    
    public class TransferSatellites implements IMessage {
    
    public List <satellite>satellites;
    
        public TransferSatellites() { }
    
        public TransferSatellites(List <satellite>sat) {
            this.satellites = sat;
        }
    
    @SuppressWarnings("unchecked")
    @Override
    public void fromBytes(ByteBuf buf) {
    String serialized = ByteBufUtils.readUTF8String(buf);
    try {
        byte b[] = serialized.getBytes(); 
        ByteArrayInputStream bi = new ByteArrayInputStream(b);
        ObjectInputStream si = new ObjectInputStream(bi);
        this.satellites = (List<satellite>) si.readObject();
    } catch (Exception e) {
    System.out.println(e);
    }
    }
    
    @Override
    public void toBytes(ByteBuf buf) {
    String serialized = "";
    try {
       ByteArrayOutputStream bo = new ByteArrayOutputStream();
       ObjectOutputStream so = new ObjectOutputStream(bo);
       so.writeObject(this.satellites);
       so.flush();
       serialized = bo.toString();
    } catch (Exception e) {
    
    } 
    ByteBufUtils.writeUTF8String(buf, serialized);
    }
    
    public static class Handler implements IMessageHandler <transfersatellites, imessage="">{
    
    @Override
    public IMessage onMessage(TransferSatellites message, MessageContext ctx) {
    System.out.println("Received satellites " + Minecraft.getMinecraft().theWorld.isRemote);
    UberNetworkingAntennas.satellites = message.satellites;
    System.out.println(UberNetworkingAntennas.satellites == null);
    return null;
    }
    
        }
    
    }
    
    

    Cependant, à l'envoi les données partent, elles arrivent, mais il n'arrive pas à dé-sérialiser l'objet :

    java.io.InvalidClassException: java.util.ArrayList; local class incompatible: stream classdesc serialVersionUID = 8664875232659988799, local class serialVersionUID = 8683452581122892189
    
    

    Savez-vous pourquoi ?

    Merci d'avance !</transfersatellites,></satellite></satellite></satellite>


  • Modérateurs

    Va falloir que tu écrives la liste élément par élément. La sérialisation ne passera pas.

    Par exemple, écrit un int avec le nombre d'éléments puis écrit chacun des éléments à la suite.


  • Administrateurs



  • Ma classe Satellite contient d'autres classes contenant d'autres classes. Donc impossible.

    Mais de toute façon, j'ai trouvé une solution plus légère et qui ne passe pas par les packets.

    Merci quand même ^^



  • Et quelle est-elle, je ne m'y connais pas beaucoup (et je ne dois pas être le seul) et je sens que ce genre de problème peu arriver ^^



  • Ça n'a rien à voir, j'ai complètement revu la gestion de stockage des satellites. Rien d'utile pour quelqu'un d'autre.

    Envoyé de mon iPhone en utilisant Tapatalk



  • Coucou, encore une fois je vais rediriger vers mon github ^^

    - Le repo: 
    https://github.com/toss-dev/Magic_Crusade_Mod

    Bon alors, l'envoie de données client / server c'est compliqué, mais chez forge (desfois, très rarement), ils sont gentils. Ils ont filé des fonctions / objets proposé pour faciliter l'utilisation des packets

    fr.toss.common.packet balades toi ici pour la création et l'enregistrement des packets

    Balades toi un peu n'importe où ou pour voir leur utilisation concrète,  genre dans fr.toss.client.gui j'envoie pas mal de données au serveur

    (Si tu piges pas un truc dis le moi, je t'ai rien vraiment expliqué là en faite :p)