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 :/)

    :::

    package com.xtrem.outilleur.forge;
    
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.player.InventoryPlayer;
    import net.minecraft.inventory.Container;
    import net.minecraft.inventory.ICrafting;
    import net.minecraft.inventory.IInventory;
    import net.minecraft.inventory.Slot;
    import net.minecraft.item.ItemStack;
    import net.minecraftforge.fml.relauncher.Side;
    import net.minecraftforge.fml.relauncher.SideOnly;
    
    public class ContainerFonderie extends Container {
    
    private final IInventory tileFonderie;
       private int field_178152_f;
       private int field_178153_g;
       private int field_178154_h;
       private int field_178155_i;
    
       public ContainerFonderie(InventoryPlayer playerInventory, IInventory fonderieInventory)
       {
           this.tileFonderie = fonderieInventory;
           //Slots Fonderie
           this.addSlotToContainer(new Slot(fonderieInventory, 0, 56, 17));
           this.addSlotToContainer(new Slot(fonderieInventory, 1, 56, 53));
           this.addSlotToContainer(new SlotFonderieOutput(playerInventory.player, fonderieInventory, 2, 116, 35));
    
           //Slots Joueurs
    
           for (int i = 0; i < 3; ++i)
           {
               for (int j = 0; j < 9; ++j)
               {
                   this.addSlotToContainer(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
               }
           }
    
           for (int k = 0; k < 9; ++k)
           {
               this.addSlotToContainer(new Slot(playerInventory, k, 8 + k * 18, 142));
           }
       }
    
       public void onCraftGuiOpened(ICrafting listener)
       {
           super.onCraftGuiOpened(listener);
           listener.sendAllWindowProperties(this, this.tileFonderie);
       }
    
       public boolean canInteractWith(EntityPlayer playerIn)
       {
           return this.tileFonderie.isUseableByPlayer(playerIn);
       }
    
       /**
        * Take a stack from the specified inventory slot.
        */
       public ItemStack transferStackInSlot(EntityPlayer playerIn, int index)
       {
           ItemStack itemstack = null;
           Slot slot = (Slot)this.inventorySlots.get(index);
    
           if (slot != null && slot.getHasStack())
           {
               ItemStack itemstack1 = slot.getStack();
               itemstack = itemstack1.copy();
    
               if (index == 2)
               {
                   if (!this.mergeItemStack(itemstack1, 3, 39, true))
                   {
                       return null;
                   }
    
                   slot.onSlotChange(itemstack1, itemstack);
               }
               else if (index != 1 && index != 0)
               {
                   if (FonderieRecipes.instance().getSmeltingResult(itemstack1) != null)
                   {
                       if (!this.mergeItemStack(itemstack1, 0, 1, false))
                       {
                           return null;
                       }
                   }
                   else if (TileEntityFonderie.isItemFuel(itemstack1))
                   {
                       if (!this.mergeItemStack(itemstack1, 1, 2, false))
                       {
                           return null;
                       }
                   }
                   else if (index >= 3 && index < 30)
                   {
                       if (!this.mergeItemStack(itemstack1, 30, 39, false))
                       {
                           return null;
                       }
                   }
                   else if (index >= 30 && index < 39 && !this.mergeItemStack(itemstack1, 3, 30, false))
                   {
                       return null;
                   }
               }
               else if (!this.mergeItemStack(itemstack1, 3, 39, false))
               {
                   return null;
               }
    
               if (itemstack1.stackSize == 0)
               {
                   slot.putStack((ItemStack)null);
               }
               else
               {
                   slot.onSlotChanged();
               }
    
               if (itemstack1.stackSize == itemstack.stackSize)
               {
                   return null;
               }
    
               slot.onPickupFromSlot(playerIn, itemstack1);
           }
    
           return itemstack;
       }
    
       /**
        * Looks for changes made in the container, sends them to every listener.
        */
       public void detectAndSendChanges()
       {
           super.detectAndSendChanges();
    
           for (int i = 0; i < this.crafters.size(); ++i)
           {
               ICrafting icrafting = (ICrafting)this.crafters.get(i);
    
               if (this.field_178152_f != this.tileFonderie.getField(2))
               {
                   icrafting.sendProgressBarUpdate(this, 2, this.tileFonderie.getField(2));
               }
    
               if (this.field_178154_h != this.tileFonderie.getField(0))
               {
                   icrafting.sendProgressBarUpdate(this, 0, this.tileFonderie.getField(0));
               }
    
               if (this.field_178155_i != this.tileFonderie.getField(1))
               {
                   icrafting.sendProgressBarUpdate(this, 1, this.tileFonderie.getField(1));
               }
    
               if (this.field_178153_g != this.tileFonderie.getField(3))
               {
                   icrafting.sendProgressBarUpdate(this, 3, this.tileFonderie.getField(3));
               }
           }
    
           this.field_178152_f = this.tileFonderie.getField(2);
           this.field_178154_h = this.tileFonderie.getField(0);
           this.field_178155_i = this.tileFonderie.getField(1);
           this.field_178153_g = this.tileFonderie.getField(3);
       }
    
       @SideOnly(Side.CLIENT)
       public void updateProgressBar(int id, int data)
       {
           this.tileFonderie.setField(id, data);
       }
    
    }
    
    

    :::

    :::

    
    package com.xtrem.outilleur.forge;
    
    import java.util.Random;
    
    import com.xtrem.init.XtremBlocksRegistry;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.BlockContainer;
    import net.minecraft.block.material.Material;
    import net.minecraft.block.properties.IProperty;
    import net.minecraft.block.properties.PropertyDirection;
    import net.minecraft.block.state.BlockState;
    import net.minecraft.block.state.IBlockState;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.inventory.Container;
    import net.minecraft.inventory.InventoryHelper;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.stats.StatList;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.BlockPos;
    import net.minecraft.util.EnumFacing;
    import net.minecraft.util.EnumParticleTypes;
    import net.minecraft.world.World;
    import net.minecraftforge.fml.relauncher.Side;
    import net.minecraftforge.fml.relauncher.SideOnly;
    
    public class BlockFonderie extends BlockContainer{
    
    public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL);
       private final boolean isBurning;
       private static boolean keepInventory;
    
       public BlockFonderie(boolean isBurning)
       {
           super(Material.rock);
           this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH));
           this.isBurning = isBurning;
       }
    
       /**
        * Get the Item that this Block should drop when harvested.
        */
       public Item getItemDropped(IBlockState state, Random rand, int fortune)
       {
           return Item.getItemFromBlock(XtremBlocksRegistry.blockFonderie);
       }
    
       public void onBlockAdded(World worldIn, BlockPos pos, IBlockState state)
       {
           this.setDefaultFacing(worldIn, pos, state);
       }
    
       private void setDefaultFacing(World worldIn, BlockPos pos, IBlockState state)
       {
           if (!worldIn.isRemote)
           {
               Block block = worldIn.getBlockState(pos.north()).getBlock();
               Block block1 = worldIn.getBlockState(pos.south()).getBlock();
               Block block2 = worldIn.getBlockState(pos.west()).getBlock();
               Block block3 = worldIn.getBlockState(pos.east()).getBlock();
               EnumFacing enumfacing = (EnumFacing)state.getValue(FACING);
    
               if (enumfacing == EnumFacing.NORTH && block.isFullBlock() && !block1.isFullBlock())
               {
                   enumfacing = EnumFacing.SOUTH;
               }
               else if (enumfacing == EnumFacing.SOUTH && block1.isFullBlock() && !block.isFullBlock())
               {
                   enumfacing = EnumFacing.NORTH;
               }
               else if (enumfacing == EnumFacing.WEST && block2.isFullBlock() && !block3.isFullBlock())
               {
                   enumfacing = EnumFacing.EAST;
               }
               else if (enumfacing == EnumFacing.EAST && block3.isFullBlock() && !block2.isFullBlock())
               {
                   enumfacing = EnumFacing.WEST;
               }
    
               worldIn.setBlockState(pos, state.withProperty(FACING, enumfacing), 2);
           }
       }
    
       @SideOnly(Side.CLIENT)
       @SuppressWarnings("incomplete-switch")
       public void randomDisplayTick(World worldIn, BlockPos pos, IBlockState state, Random rand)
       {
           if (this.isBurning)
           {
               EnumFacing enumfacing = (EnumFacing)state.getValue(FACING);
               double d0 = (double)pos.getX() + 0.5D;
               double d1 = (double)pos.getY() + rand.nextDouble() * 6.0D / 16.0D;
               double d2 = (double)pos.getZ() + 0.5D;
               double d3 = 0.52D;
               double d4 = rand.nextDouble() * 0.6D - 0.3D;
    
               switch (enumfacing)
               {
                   case WEST:
                       worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 - d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D, new int[0]);
                       worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 - d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D, new int[0]);
                       break;
                   case EAST:
                       worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D, new int[0]);
                       worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D, new int[0]);
                       break;
                   case NORTH:
                       worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 - d3, 0.0D, 0.0D, 0.0D, new int[0]);
                       worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 - d3, 0.0D, 0.0D, 0.0D, new int[0]);
                       break;
                   case SOUTH:
                       worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 + d3, 0.0D, 0.0D, 0.0D, new int[0]);
                       worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 + d3, 0.0D, 0.0D, 0.0D, new int[0]);
               }
           }
       }
    
       public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ)
       {
           if (worldIn.isRemote)
           {
               return true;
           }
           else if (!playerIn.isSneaking())
           {
               TileEntity tileentityfonderie = worldIn.getTileEntity(pos);
    
               if (tileentityfonderie instanceof TileEntityFonderie)
               {
                   playerIn.displayGUIChest((TileEntityFonderie)tileentityfonderie);
                   playerIn.triggerAchievement(StatList.field_181741_Y);
               }
    
               return true;
           }
           else
           {
            return false;
           }
       }
    
       public static void setState(boolean active, World worldIn, BlockPos pos)
       {
           IBlockState iblockstate = worldIn.getBlockState(pos);
           TileEntity tileentityfonderie = worldIn.getTileEntity(pos);
           keepInventory = true;
    
           if (active)
           {
               worldIn.setBlockState(pos, XtremBlocksRegistry.blockFonderie_lit.getDefaultState().withProperty(FACING, iblockstate.getValue(FACING)), 3);
               worldIn.setBlockState(pos, XtremBlocksRegistry.blockFonderie_lit.getDefaultState().withProperty(FACING, iblockstate.getValue(FACING)), 3);
           }
           else
           {
               worldIn.setBlockState(pos, XtremBlocksRegistry.blockFonderie.getDefaultState().withProperty(FACING, iblockstate.getValue(FACING)), 3);
               worldIn.setBlockState(pos, XtremBlocksRegistry.blockFonderie.getDefaultState().withProperty(FACING, iblockstate.getValue(FACING)), 3);
           }
    
           keepInventory = false;
    
           if (tileentityfonderie != null)
           {
               tileentityfonderie.validate();
               worldIn.setTileEntity(pos, tileentityfonderie);
           }
       }
    
       /**
        * Returns a new instance of a block's tile entity class. Called on placing the block.
        */
       public TileEntity createNewTileEntity(World worldIn, int meta)
       {
           return new TileEntityFonderie();
       }
    
       /**
        * Called by ItemBlocks just before a block is actually set in the world, to allow for adjustments to the
        * IBlockstate
        */
       public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
       {
           return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite());
       }
    
       /**
        * Called by ItemBlocks after a block is set in the world, to allow post-place logic
        */
       public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack)
       {
           worldIn.setBlockState(pos, state.withProperty(FACING, placer.getHorizontalFacing().getOpposite()), 2);
    
           if (stack.hasDisplayName())
           {
               TileEntity tileentityfonderie = worldIn.getTileEntity(pos);
    
               if (tileentityfonderie instanceof TileEntityFonderie)
               {
                   ((TileEntityFonderie)tileentityfonderie).setCustomInventoryName(stack.getDisplayName());
               }
           }
       }
    
       public void breakBlock(World worldIn, BlockPos pos, IBlockState state)
       {
           if (!keepInventory)
           {
               TileEntity tileentityfonderie = worldIn.getTileEntity(pos);
    
               if (tileentityfonderie instanceof TileEntityFonderie)
               {
                   InventoryHelper.dropInventoryItems(worldIn, pos, (TileEntityFonderie)tileentityfonderie);
                   worldIn.updateComparatorOutputLevel(pos, this);
               }
           }
    
           super.breakBlock(worldIn, pos, state);
       }
    
       public boolean hasComparatorInputOverride()
       {
           return true;
       }
    
       public int getComparatorInputOverride(World worldIn, BlockPos pos)
       {
           return Container.calcRedstone(worldIn.getTileEntity(pos));
       }
    
       @SideOnly(Side.CLIENT)
       public Item getItem(World worldIn, BlockPos pos)
       {
           return Item.getItemFromBlock(XtremBlocksRegistry.blockFonderie);
       }
    
       /**
        * The type of render function called. 3 for standard block models, 2 for TESR's, 1 for liquids, -1 is no render
        */
       public int getRenderType()
       {
           return 3;
       }
    
       /**
        * Possibly modify the given BlockState before rendering it on an Entity (Minecarts, Endermen, …)
        */
       @SideOnly(Side.CLIENT)
       public IBlockState getStateForEntityRender(IBlockState state)
       {
           return this.getDefaultState().withProperty(FACING, EnumFacing.SOUTH);
       }
    
       /**
        * Convert the given metadata into a BlockState for this Block
        */
       public IBlockState getStateFromMeta(int meta)
       {
           EnumFacing enumfacing = EnumFacing.getFront(meta);
    
           if (enumfacing.getAxis() == EnumFacing.Axis.Y)
           {
               enumfacing = EnumFacing.NORTH;
           }
    
           return this.getDefaultState().withProperty(FACING, enumfacing);
       }
    
       /**
        * Convert the BlockState into the correct metadata value
        */
       public int getMetaFromState(IBlockState state)
       {
           return ((EnumFacing)state.getValue(FACING)).getIndex();
       }
    
       protected BlockState createBlockState()
       {
           return new BlockState(this, new IProperty[] {FACING});
       }
    
    }
    
    

    :::


  • 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.


Log in to reply