OnMessage : récupérer une tileEntity



  • Bonjour,
    Je travaille en ce moment sur la synchronisation client/server a[color=#333333vec les packets]%(#333333)[. À la réception d'un packet, quand je veux récupérer une tileEntity je procède de cette façon :

    public static class Handler implements IMessageHandler <packetclienttoserver, imessage="">{
    ]
            @Override
            public IMessage onMessage (PacketClientToServer message, MessageContext ctx){
    
                // args est un tableau de String dans PacketClientToServer
                // je l'utilise pour faire transiter des données par les packets
    
                int x = Integer.valueOf (message.args [0]);
                int y = Integer.valueOf (message.args [1]);
                int z = Integer.valueOf (message.args [2]);
    
                TileEntity tileEntity = ctx.getServerHandler().playerEntity.worldObj.getTileEntity (new BlockPos (x, y, z));
                return null;
            }
    [color=#333333    }
    

    ]
    Malheureusement je peux utiliser cette technique uniquement côté server : ctx.getServerHandler()
    car côté client on ne peux pas faire ça :

    [color=#333333```java
    public static class Handler implements IMessageHandler <packetservertoclient, imessage="">{
    ]
            @Override
            public IMessage onMessage ([color=#333333PacketServerToClient] message, MessageContext ctx){

    int x = Integer.valueOf (message.args [0]);
                int y = Integer.valueOf (message.args [1]);
                int z = Integer.valueOf (message.args [2]);

    TileEntity tileEntity = ctx.getClientHandler().playerEntity.worldObj.getTileEntity (new BlockPos (x, y, z));
                // ctx.getClientHandler().playerEntity -> impossible

    return null;

    }
    [color=#333333    }

    
    Ma question est donc : Comment récupérer une TileEntity en connaissant ses coordonnées à la réception d'un packet côté client ?
    Merci de l'aide que vous pourrez m'apporter.</packetservertoclient,></packetclienttoserver,>

  • Administrateurs

    Salut,
    Utilises Minecraft.getMinecraft().theWorld pour avoir le monde côté client 😉
    Attention par contre, il faudra ajouter un @SideOnly(Side.CLIENT) au dessus de la fonction onMessage pour éviter un crash lors du chargement du mod sur un serveur.



  • Super !
    Ça fonctionne parfaitement. Et merci de la réactivité ! 😄



  • Juste je vois que tu utilises un tableau pour les cordonnées mais tu peux directement utiliser un BlockPos, car le PacketBuffer permet décrire et lire les BlockPos pour envoyer/recevoir le packet.



  • @'AymericRed':

    Juste je vois que tu utilises un tableau pour les cordonnées mais tu peux directement utiliser un BlockPos, car le PacketBuffer permet décrire et lire les BlockPos pour envoyer/recevoir le packet.

    Non, un tableau de String est l'idéal car j'utilise cette classe pour une dizaines de packets différents (oui mon mod est galère à synchroniser  :s   (ça fait 2 mois que je bosse la synchronisation)). Donc un tableau de String est exactement ce qu'il faut : pour chaque packet différent je remplis mon tableau avec les données que je veux. Quand je reçois mon packet, je fais un switch pour savoir quelle type de packet c'est, et ensuite pour chaque cas, je fais ce que j'ai à faire avec les données stockées dans le tableau.

    Sinon, je me demandais :
    Si j'envoie un certain nombre de packets à la suite, est ce que je suis assuré qu'il vont arriver dans le même ordre ?



  • Ah d'accord ^^ Tu me diras cest vrai que j'aime pas avoir 36 000 paquets non plus.
    Je dirais que si Mc est bien fait oui mais en fait je sais pas ^^