Packet et méthodes pour récupérer le clic gauche



  • Premièrement, bonsoir (ou bonjour) tout le monde ^^
    Cela doit faire depuis hier soir que je regarde le github du flan's mod (https://github.com/FlansMods/FlansMod/tree/7bd13c3ca72806c6e7ca9258015140fbabda6243) pour récupérer ses codes du clic gauche. En vain je me retrouve confronté à un problème de packet alors comme la 1ère fois j'ai fait tout ce qu'il fallait (il me semble) Mais je n'y arrive pas ça crash.
    J'ai regardé vite fait le mod portals mais il n'y a pas de github du coup je ne peux pas voir les sources.
    En fait, cela me fait une internal error dès que je clic droit sur l'item autant en solo qu'en serveur.
    Alors si une âme charitable pour me trouver une solution car  ça vient du packet, sûr pour sûr et peut-être même du decoder.
    Enfin voici les class :

    mon code dans ma main class

           public static final PacketManager packetHandler = new PacketManager("saomodders.saoserver.saomod.common.packet", MODID , "SAO");
    

    la class de mon item

    package saomodders.saoserver.saomod.common.items;
    
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.player.EntityPlayerMP;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.world.World;
    
    import org.lwjgl.input.Mouse;
    
    import saomodders.saoserver.saomod.common.SaoMod;
    import saomodders.saoserver.saomod.common.packet.SAOPacketMouse;
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    
    public class ItemLeftClick extends Item
    {
    private static boolean leftClickHeld;
    private static boolean lastLeftClickHeld;
    
    @SideOnly(Side.CLIENT)
        public void onUpdate(ItemStack itemstack, World world, Entity entity, int i, boolean flag)
        {
    
    if(world.isRemote)
    onUpdateClient(itemstack, world, entity, i, flag);
    else 
    onUpdateServer(itemstack, world, entity, i, flag);
    
    }
    
        public void onUpdateServer(ItemStack itemstack, World world, Entity entity, int i, boolean flag)
        {
    
        }
    
        @SideOnly(Side.CLIENT)
        public void onUpdateClient(ItemStack itemstack, World world, Entity entity, int i, boolean flag)
        {
        lastLeftClickHeld = leftClickHeld;
            leftClickHeld = Mouse.isButtonDown(0);
    
            //Send packet when firing a semi or starting to fire a full
            if(leftClickHeld && !lastLeftClickHeld) 
        {
            System.out.println("Clic gauche poussé et…relâché ?");
            SaoMod.packetHandler.sendToServer(new SAOPacketMouse(true, true));
        }
    
            //Full auto. Send released mouse packet
    if(!leftClickHeld && lastLeftClickHeld) 
    {
    SaoMod.packetHandler.sendToServer(new SAOPacketMouse(true, false));
    }
        }
    
        //le onupdate bug régler le bug avec le github du mod flan's mod qui se sert de 2 méthodes, 1 pour chaque sides grâce à l'envoie de packets faire ça demain : samedi
    
        }
    
    

    mon packet

    package saomodders.saoserver.saomod.common.packet;
    
    import io.netty.buffer.ByteBuf;
    
    import java.io.IOException;
    
    import saomodders.saoserver.saomod.common.SaoMod;
    import net.minecraft.entity.player.EntityPlayer;
    import fr.minecraftforgefrance.ffmtlibs.network.FFMTPacket;
    
    public class SAOPacketKeys extends FFMTPacket
    {
    private int keyState;
    
        public SAOPacketKeys()
        {
    
        }
    
        public SAOPacketKeys(int currentKeyState)
        {
            this.keyState = currentKeyState;
        }
    
        @Override
        public void writeData(ByteBuf buffer) throws IOException
        {
            buffer.writeInt(this.keyState);
        }
    
        @Override
        public void readData(ByteBuf buffer)
        {
            this.keyState = buffer.readInt();
        }
    
        @Override
        public void handleClientSide(EntityPlayer player)
        {
    
        }
    
        @Override
        public void handleServerSide(EntityPlayer player)
        {
            SaoMod.keyboard.processKeyUpdate(player, this.keyState);
        }
    }
    
    

    Je vous donne les logs en entier pour être sûr qu'il ne vous manque rien, cependant il sont beaucoup trop long et donc mff ne les accepte pas de ce fait je les mets sous mediafire ^^

    lien de téléchargement : http://www.mediafire.com/download/c0rddm346157mj7/fmf+client+packet+problème.log

    PS =  J'ai lu que les packets devaient avoir un constructeur vide, j'ai fait ainsi cela n'a rien changé au crash

    Si vous avez besoin d'autre chose, n'hésitez pas je suis là toute la soirée et +
    Merci d'avance  😄


  • Administrateurs

    io.netty.handler.codec.DecoderException: java.lang.InstantiationException: saomodders.saoserver.saomod.common.packet.SAOPacketMouse
    Pourtant au moment du crash le constructeur vide n'était pas la. Renvoie ton crash le plus récent.



  • @'robin4002':

    io.netty.handler.codec.DecoderException: java.lang.InstantiationException: saomodders.saoserver.saomod.common.packet.SAOPacketMouse
    Pourtant au moment du crash le constructeur vide n'était pas la. Renvoie ton crash le plus récent.

    c'est le crash le plus récent et ce que je veux te dire c'est que j'ai lu qu'un constructeur de packet ne devait jamais être vide or il me fait aussi une internal error si je retire les ligne de code dedans. En gros vide ou pas  c'est pareil. Tu veux quand même que je te passe les logs quand le constructeur est vide, au cas où ?


  • Administrateurs

    Il faut un constructeur vide et un avec les arguments. Oui envoie les logs avec un constructeur vide.



  • @'robin4002':

    Il faut un constructeur vide et un avec les arguments. Oui envoie les logs avec un constructeur vide.

    Ok voici les logs avec juste un constructeur vide (du coup les 2 boolean au-dessus ne sont pas initialisés)

    Lien de téléchargement : http://www.mediafire.com/download/9a4r3fjo8d66fcm/fml-client+packet+problem+constructeur+vide.log

    En ajoutant 2 constructeurs, je n'ai plus de crash en solo mais il m'affiche les 2 println (du solo et du seveur)

    quant au multi il crash toujours mais avec un autre crash-report cette fois

    here was a critical exception handling a packet on channel SAO
    java.lang.AbstractMethodError: fr.minecraftforgefrance.ffmtlibs.network.FFMTPacket.handleServerSide(Lnet/minecraft/entity/player/EntityPlayer;)V
    at fr.minecraftforgefrance.ffmtlibs.network.PacketHandler.channelRead0(PacketHandler.java:32) ~[PacketHandler.class:?]
    at fr.minecraftforgefrance.ffmtlibs.network.PacketHandler.channelRead0(PacketHandler.java:15) ~[PacketHandler.class:?]
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:98) ~[SimpleChannelInboundHandler.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[MessageToMessageDecoder.class:?]
    at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) ~[DefaultChannelPipeline.class:?]
    at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) ~[EmbeddedChannel.class:?]
    at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:86) [FMLProxyPacket.class:?]
    at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) [NetworkManager.class:?]
    at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) [NetworkSystem.class:?]
    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) [MinecraftServer.class:?]
    at net.minecraft.server.dedicated.DedicatedServer.updateTimeLightAndEntities(DedicatedServer.java:349) [DedicatedServer.class:?]
    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) [MinecraftServer.class:?]
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?]
    at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?]
    

  • Administrateurs

    Renvoie la classe de ton paquet, c'est étrange d'avoir ça.



  • @'robin4002':

    Renvoie la classe de ton paquet, c'est étrange d'avoir ça.

    package saomodders.saoserver.saomod.common.packet;
    
    import io.netty.buffer.ByteBuf;
    
    import java.io.IOException;
    
    import saomodders.saoserver.saomod.common.SaoMod;
    import saomodders.saoserver.saomod.common.items.ItemLeftClick;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemStack;
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    import fr.minecraftforgefrance.ffmtlibs.network.FFMTPacket;
    
    public class SAOPacketMouse extends FFMTPacket
    {
    
    public static boolean held;
    public static boolean left;
    
    public SAOPacketMouse()
    {
    
    }
    
    public SAOPacketMouse(boolean l, boolean h)
    {
    left = l;
    held = h;
    }
    
    @Override
    public void writeData(ByteBuf buffer) throws IOException
    {
    
    buffer.writeBoolean(held);
    buffer.writeBoolean(left);
    
    }
    
    @Override
    public void readData(ByteBuf buffer)
    {
    
    held = buffer.readBoolean();
    left = buffer.readBoolean();
    
    }
    
    @Override
    public void handleClientSide(EntityPlayer player)
    {
    
    }
    
    @Override
    @SideOnly(Side.CLIENT)
    public void handleServerSide(EntityPlayer player)
    {
    ItemStack currentItem = player.inventory.getCurrentItem();
    if(currentItem != null && currentItem.getItem() != null && currentItem.getItem() instanceof ItemLeftClick)
    {
    //((ItemLeftClick)currentItem.getItem()).onMouseHeld(currentItem, player.worldObj, player, left, held);
    
    }
    
    }
    
    }
    
    

    Mais aussi la méthode handleServerSide me parait bizarre pour Server alors qu'elle est side CLIENT ? Désolé si la question semble bête car le client envoie l'info au serveur c'est ça ?


  • Administrateurs

    C'est ça, retire le @SideOnly(Side.CLIENT) il n'a rien à faire là …



  • @'robin4002':

    C'est ça, retire le @SideOnly(Side.CLIENT) il n'a rien à faire là …

    Ok ça marche mais juste un dernière question :
    Pourquoi quand le joueur quitte le serv il y a ce message d'erreur ?

    [Netty IO #1/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.7.0_71]
    at sun.nio.ch.SocketDispatcher.read(Unknown Source) ~[?:1.7.0_71]
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source) ~[?:1.7.0_71]
    at sun.nio.ch.IOUtil.read(Unknown Source) ~[?:1.7.0_71]
    at sun.nio.ch.SocketChannelImpl.read(Unknown Source) ~[?:1.7.0_71]
    at io.netty.buffer.UnpooledUnsafeDirectByteBuf.setBytes(UnpooledUnsafeDirectByteBuf.java:436) ~[UnpooledUnsafeDirectByteBuf.class:?]
    at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:870) ~[AbstractByteBuf.class:?]
    at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:208) ~[NioSocketChannel.class:?]
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:87) [AbstractNioByteChannel$NioByteUnsafe.class:?]
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:480) [NioEventLoop.class:?]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:447) [NioEventLoop.class:?]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:341) [NioEventLoop.class:?]
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101) [SingleThreadEventExecutor$2.class:?]
    at java.lang.Thread.run(Unknown Source) [?:1.7.0_71]
    [23:58:24] [Server thread/INFO] [net.minecraft.network.NetHandlerPlayServer]: Player229 lost connection: TranslatableComponent{key='disconnect.genericReason', args=[Internal Exception: java.io.IOException: Une connexion existante a dû être fermée par l’hôte distant], siblings=[], style=Style{hasParent=false, color=null, bold=null, italic=null, underlined=null, obfuscated=null, clickEvent=null, hoverEvent=null}}
    [23:58:24] [Server thread/INFO] [net.minecraft.server.MinecraftServer]: Player229 left the game
    
    

    J'ai vaguement entendu parler des sockets c'est l'équivalent des packets ? Peux-tu m'en dire plus, stp ^^   ??


  • Administrateurs

    Heu là aucune idée, je n'ai encore jamais vu cette erreur.



  • @'robin4002':

    Heu là aucune idée, je n'ai encore jamais vu cette erreur.

    Ok Mais pas grave ça n'intervient pas et ne gêne pas le joueur. Il quitte comme si de rien n'était le serv.
    Bon bah comme d'hab je te remercie infiniment robin ^^