[1.12.2] IOException sur touche personnalisée en multi mais pas en solo



  • Bonjour,
    Je vous explique mon problème : je suis néophyte sur forge, je suis encore ne train d'apprendre, et j'ai suivi les différents tutos pour pouvoir bidouiller.

    J'ai créé des touches personnalisées en suivant ce tuto : https://www.minecraftforgefrance.fr/topic/521/ajouter-des-touches-personalisées

    J'ai ajouté 12 touches qui ont la même nomenclature pour l'instant :

    public class ClientProxy extends CommonProxy{
    
     private static KeyBinding rat;
    
    public ClientProxy()
    	{
     FMLCommonHandler.instance().bus().register(this);
     rat = new KeyBinding("Mudra.Rat", Keyboard.KEY_U, "key.categories.misc");
     ClientRegistry.registerKeyBinding(rat);
            }
    
     public void onEvent(KeyInputEvent event)
    	 {
    		
    		 if(rat.isPressed()) {
    			 timer();
    			 ratPressed();
    		 }
     }
    
     private void timer() {
    		 if(!timer.enCours || timer == null){ //NullPointerException ici en multijoueur mais pas en solo
    			 liste.clear();
    		 }
    		 if(liste.isEmpty()) {
    			 timer = new Chrono(100, true);
    		 }
     }
    }
    
    public class CommonProxy {
    	
    	protected static List<String> liste;
    	
    	protected Chrono timer;
    	
    	@SubscribeEvent @EventHandler
    	public void onQuit(PlayerLoggedOutEvent event) {
    		liste = null;
    		timer = null;
    	}
    	
    	@SubscribeEvent @EventHandler
    	public void onJoin(PlayerLoggedInEvent event) {
    		liste = new ArrayList<String>();
    		timer = new Chrono(0, false);
    	}
    	
        public void preInit(File configFile)
        {
            System.out.println("pre init côté commun");
        }
    
        public void init()
        { 
        }
    
    public class Chrono {
    
    	private int time; // en tick minecraft 20 ticks = 1 seconde
    	public boolean enCours = false;
    	
    	public Chrono(int temps, boolean lancer) {
    		
    		this.time = temps;
    		if(lancer)
    			this.lancer();
    	}
    	
    	public void lancer() {
    		FMLCommonHandler.instance().bus().register(this);
    		enCours = true;
    		
    	}
    	
    	@SubscribeEvent @EventHandler
    	public boolean onEvent(ServerTickEvent event) {
    		if(enCours) {
    			time--;
    			convert();
    		}
    		if(time == 0)
    			enCours = false;
    		
    		return enCours;
    	}
    	
    	private void convert() {
    		String seconde = String.valueOf(time / 20);
    		if(time % 20 == 0) {
    			seconde = String.valueOf(time / 20);
    			Minecraft.getMinecraft().player.sendChatMessage("/commandPerso " + seconde); //note ma commande perso fonctionne
    		}
    	}
    	
    }
    

    Et quand je suis en solo tout fonctionne bien, mais que je suis en multi, quand j'appuie sur la touche le client crash, j'imagine parce que l'input n'est pas géré par le serveur, j'ai donc essayé de suivre ce tuto qui à moins de 3 mois : https://www.minecraftforgefrance.fr/topic/5343/communiquer-entre-le-client-et-le-serveur-le-réseau-et-les-paquets

    Ce tuto ne marche pas, ou du moins je n'y arrive pas ^.^' : SimpleChannel n'existe pas, ChannelBuilder non plus....

    Je ne vois pas trop comment faire...

    À noter que le crash est dû à un NullPointerException sur la ligne annotée dans le code.

    Côté serveur :

    [11:53:16] [Netty Server IO #2/ERROR] [FML]: NetworkDispatcher exception
    java.io.IOException: Une connexion existante a dû être fermée par l’hôte distant
    	at sun.nio.ch.SocketDispatcher.read0(Native Method) ~[?:1.8.0_181]
    	at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43) ~[?:1.8.0_181]
    	at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) ~[?:1.8.0_181]
    	at sun.nio.ch.IOUtil.read(IOUtil.java:192) ~[?:1.8.0_181]
    	at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380) ~[?:1.8.0_181]
    	at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:288) ~[PooledUnsafeDirectByteBuf.class:4.1.9.Final]
    	at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1100) ~[AbstractByteBuf.class:4.1.9.Final]
    	at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:372) ~[NioSocketChannel.class:4.1.9.Final]
    	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:123) [AbstractNioByteChannel$NioByteUnsafe.class:4.1.9.Final]
    	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:624) [NioEventLoop.class:4.1.9.Final]
    	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:559) [NioEventLoop.class:4.1.9.Final]
    	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:476) [NioEventLoop.class:4.1.9.Final]
    	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:438) [NioEventLoop.class:4.1.9.Final]
    	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) [SingleThreadEventExecutor$5.class:4.1.9.Final]
    	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
    [11:53:16] [Server thread/INFO] [minecraft/NetHandlerPlayServer]: Player284 lost connection: Internal Exception: java.io.IOException: Une connexion existante a dû être fermée par l’hôte distant
    

    Côté Client :

    [11:53:14] [main/ERROR] [FML]: Exception caught during firing event net.minecraftforge.fml.common.gameevent.InputEvent$KeyInputEvent@237c65fc:
    java.lang.NullPointerException: null
    	at sirvechs.mudra.client.ClientProxy.timer(ClientProxy.java:89) ~[ClientProxy.class:?]
    	at sirvechs.mudra.client.ClientProxy.onEvent(ClientProxy.java:103) ~[ClientProxy.class:?]
    	at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_4_ClientProxy_onEvent_KeyInputEvent.invoke(.dynamic) ~[?:?]
    	at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90) ~[ASMEventHandler.class:?]
    	at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:182) [EventBus.class:?]
    	at net.minecraftforge.fml.common.FMLCommonHandler.fireKeyInput(FMLCommonHandler.java:565) [FMLCommonHandler.class:?]
    	at net.minecraft.client.Minecraft.runTickKeyboard(Minecraft.java:2143) [Minecraft.class:?]
    	at net.minecraft.client.Minecraft.runTick(Minecraft.java:1934) [Minecraft.class:?]
    	at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1187) [Minecraft.class:?]
    	at net.minecraft.client.Minecraft.run(Minecraft.java:441) [Minecraft.class:?]
    	at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?]
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_181]
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_181]
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_181]
    	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_181]
    	at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
    	at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_181]
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_181]
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_181]
    	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_181]
    	at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
    	at GradleStart.main(GradleStart.java:25) [start/:?]
    

    Merci beaucoup d'avoir pris le temps de lire.



  • Tu utilise la variable Minecraft.getMinecraft().player qui est null pour un serveur, c'est pour ça que tu crash


  • Administrateurs

    Salut,
    Le tutoriel sur les paquets que tu as voulu suivre est pour la 1.13, suis plutôt ce tutoriel : https://www.minecraftforgefrance.fr/topic/1000/1-7-2-le-network



  • Merci beaucoup ! je vais regarder ça 😄


Log in to reply