Aide pour faire un four



  • Yo tout le monde,

    Après deux ans et demi sans avoir ouvert eclipse (et donc sans avoir fait une seule ligne de java), j'ai décidé de reprendre Minecraft tranquillement et de voir ce que je pouvais faire pour passer le temps et voir si je peux aller plus loin, mods, serveurs etc… Bon, tout ce qui concerne blocs, items etc... truc simples en gros, j'ai vite repris, ça a pas tellement changer hormis ce truc de jason qui prend la masse de temps, donc c'est cool. J'ai par contre décidé de me faire un petit four histoire de pouvoir après me dire " okay j'ai compris comment ça marche je vais tenter de rajouter un input ou deux " mais... bah mon four tout basique marche pas.

    Pour info, j'ai copié collé exactement le code du four vanilla pour pouvoir checker au fur et à mesure à quoi ça sert et ce que ça fait. Dans l'ensemble, je pense avoir compris comment je ferai pour modifier les inputs, outputs etc... (je met un point d'honneur à vouloir comprendre ce que je fais) mais la bah... je sais pas ce qu'il se passe. En gros, quand je veux ouvrir le gui, ça me dit une connerie du genre

    [02:34:19] [Client thread/FATAL]: Error executing task
    java.util.concurrent.ExecutionException: java.lang.IndexOutOfBoundsException: Index: 36, Size: 36
    

    Par contre, il y a bien une ouverture de gui. Je vois mon inventaire (j'ai regardé pas mal d'autres sources, tuto etc… mais c'est le seul qui me donne un résultat).
    Alors bon... je suis pas un génie de l'informatique mais si je prends le même truc que pour le four, pourquoi est-ce que ça met dit ça??

    Bref, je met que le Container.java et le Block.java en dessous vu que je pense que ça vient de ça. Le reste c'est que du copié collé des autres classes du four en remplaçant furnace par fonderie et Furnace par Fonderie. Si il faut je mettrai les autres, mais je pense pas que ça soit necessaire. Si quelqu'un sait de quoi le soucis peut venir bah, je lui paie une bière (faut par contre venir sur Boston, pas sur que ça soit worth it, surtout que la bière est dégueu ici :/)


  • Administrateurs

    Salut,
    Il me faudrait le message d'erreur complet.



  • Je ne sais pas si ça résoudra le problème, mais c'est mieux de mettre la fonction de forge pour ouvrir le gui dans ta fonction onBlockActivated() :
    remplace "playerIn.displayGUIChest((TileEntityFonderie)tileentityfonderie);" par "playerIn.openGui(id, mod, x, y, z)" (j'ai pas été exact dans les paramètres).



  • @'robin4002':

    Salut,
    Il me faudrait le message d'erreur complet.

    Alors je sais pas si c'est exactement ce que tu demandes mais quand j'ouvre le gui sur le bloc en question, j'ai ça dans la console :

    [05:58:03] [Client thread/FATAL]: Error executing task
    java.util.concurrent.ExecutionException: java.lang.IndexOutOfBoundsException: Index: 36, Size: 36
    at java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[?:1.7.0_79]
    at java.util.concurrent.FutureTask.get(FutureTask.java:188) ~[?:1.7.0_79]
    at net.minecraft.util.Util.runTask(Util.java:23) [Util.class:?]
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1070) [Minecraft.class:?]
    at net.minecraft.client.Minecraft.run(Minecraft.java:380) [Minecraft.class:?]
    at net.minecraft.client.main.Main.main(Main.java:116) [Main.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_79]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_79]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_79]
    at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_79]
    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.7.0_79]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_79]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_79]
    at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_79]
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
    at GradleStart.main(GradleStart.java:26) [start/:?]
    Caused by: java.lang.IndexOutOfBoundsException: Index: 36, Size: 36
    at java.util.ArrayList.rangeCheck(ArrayList.java:635) ~[?:1.7.0_79]
    at java.util.ArrayList.get(ArrayList.java:411) ~[?:1.7.0_79]
    at net.minecraft.inventory.Container.getSlot(Container.java:125) ~[Container.class:?]
    at net.minecraft.inventory.Container.putStacksInSlots(Container.java:551) ~[Container.class:?]
    at net.minecraft.client.network.NetHandlerPlayClient.handleWindowItems(NetHandlerPlayClient.java:1209) ~[NetHandlerPlayClient.class:?]
    at net.minecraft.network.play.server.S30PacketWindowItems.processPacket(S30PacketWindowItems.java:67) ~[S30PacketWindowItems.class:?]
    at net.minecraft.network.play.server.S30PacketWindowItems.processPacket(S30PacketWindowItems.java:12) ~[S30PacketWindowItems.class:?]
    at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:15) ~[PacketThreadUtil$1.class:?]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) ~[?:1.7.0_79]
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) ~[?:1.7.0_79]
    at net.minecraft.util.Util.runTask(Util.java:22) ~[Util.class:?]
    … 15 more
    [05:58:10] [Client thread/FATAL]: Error executing task
    java.util.concurrent.ExecutionException: java.lang.IndexOutOfBoundsException: Index: 36, Size: 36
    at java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[?:1.7.0_79]
    at java.util.concurrent.FutureTask.get(FutureTask.java:188) ~[?:1.7.0_79]
    at net.minecraft.util.Util.runTask(Util.java:23) [Util.class:?]
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1070) [Minecraft.class:?]
    at net.minecraft.client.Minecraft.run(Minecraft.java:380) [Minecraft.class:?]
    at net.minecraft.client.main.Main.main(Main.java:116) [Main.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_79]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_79]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_79]
    at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_79]
    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.7.0_79]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_79]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_79]
    at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_79]
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
    at GradleStart.main(GradleStart.java:26) [start/:?]
    Caused by: java.lang.IndexOutOfBoundsException: Index: 36, Size: 36
    at java.util.ArrayList.rangeCheck(ArrayList.java:635) ~[?:1.7.0_79]
    at java.util.ArrayList.get(ArrayList.java:411) ~[?:1.7.0_79]
    at net.minecraft.inventory.Container.getSlot(Container.java:125) ~[Container.class:?]
    at net.minecraft.inventory.Container.putStacksInSlots(Container.java:551) ~[Container.class:?]
    at net.minecraft.client.network.NetHandlerPlayClient.handleWindowItems(NetHandlerPlayClient.java:1209) ~[NetHandlerPlayClient.class:?]
    at net.minecraft.network.play.server.S30PacketWindowItems.processPacket(S30PacketWindowItems.java:67) ~[S30PacketWindowItems.class:?]
    at net.minecraft.network.play.server.S30PacketWindowItems.processPacket(S30PacketWindowItems.java:12) ~[S30PacketWindowItems.class:?]
    at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:15) ~[PacketThreadUtil$1.class:?]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) ~[?:1.7.0_79]
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) ~[?:1.7.0_79]
    at net.minecraft.util.Util.runTask(Util.java:22) ~[Util.class:?]
    … 15 more
    [05:58:34] [Client thread/INFO]: Stopping!
    [05:58:34] [Client thread/INFO]: SoundSystem shutting down…
    
    


  • Administrateurs

    Oui donc AymericRed a raison, le problème vient du fait que tu utilises la méthode de mc, donc il tente d'ouvrir le mauvais container. Faut passer par openGUI + un gui handler.



  • Alors, je pense que ma façon de faire doit pas être la bonne, pourtant je n'arrive pas à trouver de différence entre ce que j'ai sur mes classes et celles de mods existants qui fonctionnent.
    J'ai donc bel et bien mis ça à la place :

    player.openGui(Xtrem.instance, 0, world, (int)player.posX, (int)player.posY, (int)player.posZ);
    
    

    Le gui ne s'ouvre plus du tout, mais je n'ai aucun message d'erreur donc je sais pas quoi faire 😕
    J'ai mis toutes les classes de mon bloc dans une archive.

    Mon guiHandler est fait de cette façon

    package com.xtrem.util;
    
    import com.xtrem.outilleur.forge.ContainerFonderie;
    import com.xtrem.outilleur.forge.GuiFonderie;
    import com.xtrem.outilleur.forge.TileEntityFonderie;
    
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.BlockPos;
    import net.minecraft.world.World;
    import net.minecraftforge.fml.common.network.IGuiHandler;
    
    public class GuiHandler implements IGuiHandler{
    
    @Override
    public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
    
    TileEntity tile_entity = world.getTileEntity(new BlockPos(x, y, z));
    if (tile_entity instanceof TileEntityFonderie)
    {
    System.out.println("Get ClientGuiElem");
    
    return new ContainerFonderie(player.inventory, (TileEntityFonderie) tile_entity);
    }
    return null;
    }
    
    @Override
    public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
    
    TileEntity tile_entity = world.getTileEntity(new BlockPos(x, y, z));
    if (tile_entity instanceof TileEntityFonderie)
    {
    System.out.println("Get ClientGuiElem");
    return new GuiFonderie(player.inventory, (TileEntityFonderie) tile_entity);
    }
    return null;
    }
    }
    
    

    et je register ça dans mon mod class comme ça

    @EventHandler
    public void init(FMLInitializationEvent event)
    {
    /** Render Registering */
    proxy.registerRenders();
    /** GUI Handler Registering */
    
    NetworkRegistry.INSTANCE.registerGuiHandler(this, new GuiHandler());
    
    /** TileEntity Registering */
    XtremTileEntities.register();
    }
    

    J'ai essayé pas mal de choses, alors après c'était la nuit donc j'imagine que j'étais pas au top, mais la j'avoue que je suis aux limites de ma compréhension du java (j'imagine que c'est un truc tout con en plus)



  • La convention. tile_entity -> tileEntity.
    Est-ce que le message est affiché dans la console ?



  • @'Snowy_1803':

    La convention. tile_entity -> tileEntity.
    Est-ce que le message est affiché dans la console ?

    Je ne suis pas sur de comprendre ce que tu me demandes 😕

    Haa, si c'est bon j'ai compris. Non, le message ne s'affiche pas. Il n'y a que celui que j'ai rajouté dans la classe du block sur onActivatedBlock



  • Tu n'as pas le message "Get ClientGuiElem" qui s'affiche ?
    Pourtant ton GuiHandler est bien enregistré, le prob vient sûrement de ta condition, essaie de print les 2 méthodes getClientGuiElement et getServerGuiElement.



  • Le seul message que j'ai dans la console c'est "Le Gui est la" que je print depuis le onActivatedBlock. Rien d'autre en fait 😕



  • Normalement les méthodes sont appelées c'est byzarre, mais même si elles sont appelées, ça marchera pas, faut pos.getX() au lieu de player.posX



  • tu parles de ça?

    player.openGui(Xtrem.instance, 0, world, pos.getX(), pos.getY(), pos.getZ());



  • Oui je parlait de ça 🙂



  • Je viens de tester mais ça ne change rien du tout en fait xD J'imagine que j'ai tout cassé la lol

    Je me suis aussi rendu compte que j'avais pas filé les bons fichiers au cas ou



  • Dans ton container :

        @Override
        public boolean canInteractWith(EntityPlayer player) {
        // TODO Auto-generated method stub
            return false;
        }
    

    Doit retourner true pour que ça marche.

    PS: l'éditeur est complètement buggé, les flèches directionneles fonctionnent de manière anarchique tout comme la touche entrée, et impossible d'effacer un retour à la ligne (je précise que ce n'est pas toujours, des fois ça le fait des fois pas) 😢



  • J'avais lu quelque part que ça devait être mis sur false. Quoiqu'il en soit, aucune différence apparemment 😕



  • Si false, ça ne pourra jamais être ouvert par un joueur.
    Et essaye de changer ta ligne de registry de l'Handler par ça : NetworkRegistry.INSTANCE.registerGuiHandler(this.instance, new GuiHandler());
    (J'ai rajouté le .instance)



  • Okay… j'ai été con je crois. J'aurai passé le mod class, vous auriez trouvé de suite je pense... Je viens de renommer mon instance avec le même nom que le modid et la ça marche

    Merci quand même ^^' J'aurai quand même appris qqchose 😛



  • Et ben c'est bien 🙂
    De rien.


  • Administrateurs

    N'oulies pas la balise résolu si c'est résolu.