Posted June 16, 201312 yr Hello I made this new gui and when I try to shift click items out of it the game crashes Code Block package mods.gamersmods.fuelresourceful.block; import mods.gamersmods.fuelresourceful.FuelResourceful; import mods.gamersmods.fuelresourceful.common.ModConfig; import mods.gamersmods.fuelresourceful.tileentity.TileEntityBlockBreaker; import mods.gamersmods.fuelresourceful.tileentity.TileEntityBlockBreaker; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class BlockBlockBreaker extends BlockContainer { protected BlockBlockBreaker(int par1, Material par2Material) { super(par1, par2Material); } @Override public TileEntity createNewTileEntity(World world) { return new TileEntityBlockBreaker(); } public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { if (par1World.isRemote) { return true; } else { TileEntityBlockBreaker TileEntityBlockBreaker = (TileEntityBlockBreaker)par1World.getBlockTileEntity(par2, par3, par4); if (TileEntityBlockBreaker != null) { par5EntityPlayer.openGui(FuelResourceful.instance, ModConfig.GUIIDs.BlockBreakerGui, par1World, par2, par3, par4); } return true; } } } TileEntity package mods.gamersmods.fuelresourceful.tileentity; import mods.gamersmods.fuelresourceful.item.ItemCompressedCoalCapsule; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.Packet132TileEntityData; import net.minecraft.tileentity.TileEntity; public class TileEntityBlockBreaker extends TileEntity implements ISidedInventory { private ItemStack[] inv; private byte fuelLevel; public TileEntityBlockBreaker() { inv = new ItemStack[1]; fuelLevel = 0; } public void updateEntity() { if(fuelLevel == 0) { ItemStack stack = getStackInSlot(0); if(stack != null && isStackValidForSlot(0, stack)) { fuelLevel = 32; stack.stackSize--; if(stack.stackSize == 0) { stack = null; } setInventorySlotContents(0, stack); } } } public byte getFuelLevel() { return fuelLevel; } public void readFromNBT(NBTTagCompound par1NBTTagCompound) { super.readFromNBT(par1NBTTagCompound); NBTTagList nbttaglist = par1NBTTagCompound.getTagList("Items"); this.inv = new ItemStack[this.getSizeInventory()]; for (int i = 0; i < nbttaglist.tagCount(); ++i) { NBTTagCompound nbttagcompound1 = (NBTTagCompound)nbttaglist.tagAt(i); byte b0 = nbttagcompound1.getByte("Slot"); if (b0 >= 0 && b0 < this.inv.length) { this.inv[b0] = ItemStack.loadItemStackFromNBT(nbttagcompound1); } } this.fuelLevel = par1NBTTagCompound.getByte("fuel"); } /** * Writes a tile entity to NBT. */ public void writeToNBT(NBTTagCompound par1NBTTagCompound) { super.writeToNBT(par1NBTTagCompound); par1NBTTagCompound.setByte("fuel", this.fuelLevel); NBTTagList nbttaglist = new NBTTagList(); for (int i = 0; i < this.inv.length; ++i) { if (this.inv != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte)i); this.inv.writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); } } par1NBTTagCompound.setTag("Items", nbttaglist); } @Override public int getSizeInventory() { return inv.length; } @Override public ItemStack getStackInSlot(int slot) { return inv[slot]; } @Override public ItemStack decrStackSize(int slot, int amt) { ItemStack stack = getStackInSlot(slot); if (stack != null) { if (stack.stackSize <= amt) { setInventorySlotContents(slot, null); } else { stack = stack.splitStack(amt); if (stack.stackSize == 0) { setInventorySlotContents(slot, null); } } } return stack; } @Override public ItemStack getStackInSlotOnClosing(int slot) { ItemStack stack = getStackInSlot(slot); if (stack != null) { setInventorySlotContents(slot, null); } return stack; } @Override public void setInventorySlotContents(int slot, ItemStack stack) { inv[slot] = stack; if (stack != null && stack.stackSize > getInventoryStackLimit()) { stack.stackSize = getInventoryStackLimit(); } } @Override public Packet getDescriptionPacket() { NBTTagCompound tag = new NBTTagCompound(); this.writeToNBT(tag); return new Packet132TileEntityData(xCoord, yCoord, zCoord, 0, tag); } @Override public void onDataPacket(INetworkManager net, Packet132TileEntityData pkt) { NBTTagCompound tag = pkt.customParam1; this.readFromNBT(tag); } @Override public String getInvName() { return "BlockBreaker"; } @Override public boolean isInvNameLocalized() { return false; } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isUseableByPlayer(EntityPlayer player) { return worldObj.getBlockTileEntity(xCoord, yCoord, zCoord) == this && player.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64; } @Override public void openChest() { } @Override public void closeChest() { } @Override public boolean isStackValidForSlot(int slot, ItemStack stack) { return stack != null && stack.getItem().equals(Item.coal); } @Override public int[] getAccessibleSlotsFromSide(int side) { int[] temp = {0}; return temp; } @Override public boolean canInsertItem(int slot, ItemStack stack, int side) { int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); int[] topBottom = {0, 1}; int[] leftRight = {2, 3}; int[] frontBack = {4, 5}; for(int i = 0; i < 2; i++) { if(meta == topBottom) { if(side == 0 || side == 1) { return false; } } if(meta == leftRight) { if(side == 2 || side == 3) { return false; } } if(meta == frontBack) { if(side == 4 || side == 5) { return false; } } } return true; } @Override public boolean canExtractItem(int slot, ItemStack stack, int side) { int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); if(meta == 0 && side == 1) { return true; } else if(meta == 1 && side == 0) { return true; } else if(meta == 2 && side == 3) { return true; } else if(meta == 3 && side == 2) { return true; } else if(meta == 4 && side == 5) { return true; } else if(meta == 5 && side == 4) { return true; } return false; } } Container package mods.gamersmods.fuelresourceful.tileentity; 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.Slot; import net.minecraft.inventory.SlotFurnace; import net.minecraft.item.ItemStack; public class ContainerBlockBreaker extends Container { private TileEntityBlockBreaker tileEntity; public ContainerBlockBreaker(InventoryPlayer playerInventory, TileEntityBlockBreaker tileEntity) { this.tileEntity = tileEntity; // fuel addSlotToContainer(new Slot(tileEntity, 0, 133, 33)); bindPlayerInventory(playerInventory); } @Override public boolean canInteractWith(EntityPlayer entityPlayer) { return tileEntity.isUseableByPlayer(entityPlayer); } private void bindPlayerInventory(InventoryPlayer playerInventory) { // Inventory for(int y = 0; y < 3; y++) for(int x = 0; x < 9; x++) addSlotToContainer(new Slot(playerInventory, x + y * 9 + 9, 8 + x * 18, 84 + y * 18)); // Action Bar for(int x = 0; x < 9; x++) addSlotToContainer(new Slot(playerInventory, x, 8 + x * 18, 142)); } @Override public ItemStack transferStackInSlot(EntityPlayer player, int slot) { ItemStack stack = null; Slot slotObject = (Slot)inventorySlots.get(slot); if(slotObject != null && slotObject.getHasStack()) { ItemStack stackInSlot = slotObject.getStack(); stack = stackInSlot.copy(); // Merges the item into the player inventory if(slot < 1) { if(!this.mergeItemStack(stackInSlot, 3, 39, true)) return null; } else if(!this.mergeItemStack(stackInSlot, 0, 3, false)) return null; if(stackInSlot.stackSize == 0) slotObject.putStack(null); else slotObject.onSlotChanged(); if(stackInSlot.stackSize == stack.stackSize) return null; slotObject.onPickupFromSlot(player, stackInSlot); } return stack; } } Gui package mods.gamersmods.fuelresourceful.client.gui; import mods.gamersmods.fuelresourceful.tileentity.ContainerBlockBreaker; import mods.gamersmods.fuelresourceful.tileentity.TileEntityBlockBreaker; import mods.gamersmods.fuelresourceful.tileentity.TileEntityBrickFurnace; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.StatCollector; import org.lwjgl.opengl.GL11; public class GuiBlockBreaker extends GuiContainer { private TileEntityBlockBreaker tileEntity; public GuiBlockBreaker(InventoryPlayer playerInventory, TileEntityBlockBreaker tileEntity) { super(new ContainerBlockBreaker(playerInventory, tileEntity)); this.tileEntity = tileEntity; } @Override protected void drawGuiContainerForegroundLayer(int par1, int par2) { final String invTitle = "\u00A71Block Breaker"; fontRenderer.drawString(invTitle, (xSize / 2 - fontRenderer.getStringWidth(invTitle) / 2) + 12, 6, 4210752); fontRenderer.drawString("\u00A76Fuel: " + tileEntity.getFuelLevel(), 6, 6, 4210752); if(tileEntity.getFuelLevel() <= 0) { fontRenderer.drawString("\u00A74No Fuel!", 6, 36, 4210752); } fontRenderer.drawString(StatCollector.translateToLocal("container.inventory"), 8, ySize - 96 + 2, 4210752); } @Override protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { GL11.glColor4f(1f, 1f, 1f, 1f); mc.renderEngine.bindTexture("/mods/gamersmods/fuelresourceful/textures/gui/BlockBreakerGui.png"); int x = (width - xSize) / 2; int y = (height - ySize) / 2; drawTexturedModalRect(x, y, 0, 0, xSize, ySize); } } Error Log 2013-06-16 14:05:07 [iNFO] [sTDERR] net.minecraft.util.ReportedException: Updating screen events 2013-06-16 14:05:07 [iNFO] [sTDERR] at net.minecraft.client.Minecraft.runTick(Minecraft.java:1506) 2013-06-16 14:05:07 [iNFO] [sTDERR] at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:834) 2013-06-16 14:05:07 [iNFO] [sTDERR] at net.minecraft.client.Minecraft.run(Minecraft.java:759) 2013-06-16 14:05:07 [iNFO] [sTDERR] at java.lang.Thread.run(Unknown Source) 2013-06-16 14:05:07 [iNFO] [sTDERR] Caused by: java.lang.IndexOutOfBoundsException: Index: 38, Size: 37 2013-06-16 14:05:07 [iNFO] [sTDERR] at java.util.ArrayList.rangeCheck(Unknown Source) 2013-06-16 14:05:07 [iNFO] [sTDERR] at java.util.ArrayList.get(Unknown Source) 2013-06-16 14:05:07 [iNFO] [sTDERR] at net.minecraft.inventory.Container.mergeItemStack(Container.java:621) 2013-06-16 14:05:07 [iNFO] [sTDERR] at mods.gamersmods.fuelresourceful.tileentity.ContainerBlockBreaker.transferStackInSlot(ContainerBlockBreaker.java:57) 2013-06-16 14:05:07 [iNFO] [sTDERR] at net.minecraft.inventory.Container.slotClick(Container.java:281) 2013-06-16 14:05:07 [iNFO] [sTDERR] at net.minecraft.client.multiplayer.PlayerControllerMP.windowClick(PlayerControllerMP.java:468) 2013-06-16 14:05:07 [iNFO] [sTDERR] at net.minecraft.client.gui.inventory.GuiContainer.handleMouseClick(GuiContainer.java:798) 2013-06-16 14:05:07 [iNFO] [sTDERR] at net.minecraft.client.gui.inventory.GuiContainer.mouseClicked(GuiContainer.java:541) 2013-06-16 14:05:07 [iNFO] [sTDERR] at net.minecraft.client.gui.GuiScreen.handleMouseInput(GuiScreen.java:203) 2013-06-16 14:05:07 [iNFO] [sTDERR] at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:177) 2013-06-16 14:05:07 [iNFO] [sTDERR] at net.minecraft.client.Minecraft.runTick(Minecraft.java:1499) Any help will be helpful!
June 16, 201312 yr mods.gamersmods.fuelresourceful.tileentity.ContainerBlockBreaker.transferStackInSlot(ContainerBlockBreaker.java:57) Line 57 of ContainerBlockBreaker is causing an index out of bounds exception.
June 16, 201312 yr And what do I do to fix this? It looks like the size of your inventory is 37, but you're calling transferStackInSlot() with a len of 39. Change it to 38, or, better yet, use inventorySlots.size(). BEWARE OF GOD --- Co-author of Pentachoron Labs' SBFP Tech.
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.