1.12.2 [ 1.12.2 ] Le conteneur ne peut pas être ouvert sur le serveur.



  • Bonjour, j'essaie d'envoyer des packages au serveur pour ouvrir l'inventaire. le problème est que l'inventaire s'ouvre en singleplay, mais pas sur le serveur. Aidez moi.

    Handler:

    @Override
    public IMessage onMessage(PacketOpenInventory message, MessageContext ctx) {
        EntityPlayerMP player = ctx.getServerHandler().player;
        player.openGui(Sareah.instnace, GuiHandler.INVENTORY_GUI_ID, player.world, (int)player.posX, (int)player.posY, (int)player.posZ);
        return null;
    }
    

    register:

    networkWrapper.registerMessage(PacketOpenInventory.Handler.class, PacketOpenInventory.class, 0, Side.SERVER);
    

    send:

    NetworkHandler.networkWrapper.sendToServer(new PacketOpenInventory());
    


  • Bonsoir, déjà ici : Sareah.instnace faute de frappe ou dans ton code tu as la même erreur ? Sareah.instance
    Pour quel raison as-tu besoin d'un packet pour ouvrir ton GUI ?



  • Le slot ne fonctionnera que s'il est ouvert en tant que paquet.



  • Je me doute bien 😄 mais cela n'indique en rien la raison du pourquoi tu as spécialement besoin d'un paquet.
    Peut-tu fournir le reste de ton code également ? Notamment PacketOpenInventory.
    Par expérience je dirais sans avoir le code sous les yeux que le souci peux provenir de 2 choses : les proxy ou encore une vérification du type !world.isRemote qui n'est pas faite ( c'est pas forcément ça le souci bien évidement, mais dans mon cas c'est souvent de là que viens le problème ).



  • public class PacketOpenInventory implements IMessage {
    
        public PacketOpenInventory() {}
    
        @Override
        public void fromBytes(ByteBuf buf) {
        }
    
        @Override
        public void toBytes(ByteBuf buf) {
        }
    
        public static class Handler implements IMessageHandler<PacketOpenInventory, IMessage> {
    
            @Override
            public IMessage onMessage(PacketOpenInventory message, MessageContext ctx) {
                EntityPlayerMP player = ctx.getServerHandler().player;
                player.openGui(Sareah.getInstance(), GuiHandler.INVENTORY_GUI_ID, player.world, (int)player.posX, (int)player.posY, (int)player.posZ);
                return null;
            }
        }
    }
    
    public class NetworkHandler {
    
        public static SimpleNetworkWrapper networkWrapper;
    
        public static void init() {
            networkWrapper = NetworkRegistry.INSTANCE.newSimpleChannel(Sareah.MODID);
    
            networkWrapper.registerMessage(PacketOpenInventory.Handler.class, PacketOpenInventory.class, 0, Side.SERVER);
        }
    }
    
    @SubscribeEvent
    public void guiOpen(GuiOpenEvent event) {
        if(event.getGui() != null && event.getGui().getClass() == GuiInventory.class) {
            EntityPlayer player = mc.player;
            if(!player.isCreative()) {
                event.setCanceled(true);
                NetworkHandler.networkWrapper.sendToServer(new PacketOpenInventory());
            }
        }
    }
    


  • Wow, je t'avoue que ta méthode me laisse ... dubitatif !
    Tu ouvres un inventaire pour l'annuler puis envoie un paquet qui renvoie l'information au joueur d'ouvrir un autre inventaire ?
    N'est-il pas possible pour toi d'ouvrir immédiatement l'inventaire souhaiter sans passer par cette étape ?
    Et tu n'as toujours pas répondu concernant le pourquoi il te faut utiliser un paquet ?
    Dans quel but, est-ce absolument nécessaire pour ton code ?

    Il me faudrait faire des tests avec ton code pour pouvoir mieux t'aider, aurais tu des logs également ?
    Voir mieux des System.out.println() sur le paquet lorsque tu lances sur un serveur ! Histoire de voir si en serveur ton paquet != null ?



  • Pour donner l'explication précise, j'ai créé un inventaire de joueur personnalisé: il n'a pas besoin d'ajouter de nouveaux slot, il n'a besoin que des slot d'inventaire existants (armure, barre chaude, inventaire). Ainsi, après avoir annulé l'événement d'inventaire existant, j'essaie d'ouvrir l'inventaire personnalisé; mais si j'utilise également player.openGui, slot d'inventaire ne fonctionne pas.player.openGui Avec un package qui envoie au serveur, il fonctionne très bien en singleplay, mais il ne fonctionne pas sur le serveur. Je dois créer un mod côté client qui peut fonctionner sur le serveur.

    Si vous n'avez pas utilisé le package:
    https://imgur.com/a/YX721H4


Log in to reply