Posted April 30, 201312 yr I am having a problem where some of the lots of the inventory aren't registering correctly and the ones that do copy the entire stack and when the Gui is closed it doesn't save the inventory. I have been trying to figure this out for a while with no avail. Item Code: package mods.betterFarming.items; import mods.betterFarming.betterFarming; import mods.betterFarming.inventory.inventorySeedPouch; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class itemSeedPouch extends Item { //Big thanks to Eydamos for his backpack mod open source public itemSeedPouch(int id) { super(id); setMaxStackSize(1); this.setCreativeTab(CreativeTabs.tabMisc); } public void updateIcons(IconRegister iconreg){ iconIndex = iconreg.registerIcon("betterFarming:seedPouch"); } @Override public ItemStack onItemRightClick(ItemStack is, World world, EntityPlayer player) { // if world.isRemote than we are on the client side if(world.isRemote) { player.openGui(betterFarming.instance, 1, player.worldObj, 0, 0, 0); return is; } return is; } @Override public String getItemDisplayName(ItemStack itemstack) { return "Seed Pouch"; } public static IInventory getSeedPouchInv(EntityPlayer player) { IInventory InventorySeedPouch = null; ItemStack seedPouch = player.getCurrentEquippedItem(); if(seedPouch != null && seedPouch.getItem() instanceof itemSeedPouch) { InventorySeedPouch = new inventorySeedPouch(player, seedPouch); } return InventorySeedPouch; } } Container Code: package mods.betterFarming.inventory; import mods.betterFarming.items.itemSeedPouch; import mods.betterFarming.misc.NBTUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; public class containerSeedPouch extends Container { //Big thanks to Eydamos for his backpack mod open source private int numRows; private IInventory lowerChestInventory; public containerSeedPouch(IInventory playerInventory, IInventory seedPouchInventory, ItemStack seedPouch) { this.numRows = seedPouchInventory.getSizeInventory() / 9; seedPouchInventory.openChest(); int i = (this.numRows - 4) * 18; int j; int k; for (j = 0; j < this.numRows; ++j) { for (k = 0; k < 9; ++k) { this.addSlotToContainer(new Slot(seedPouchInventory, k + j * 9, 8 + k * 18, 18 + j * 18)); } } for (j = 0; j < 3; ++j) { for (k = 0; k < 9; ++k) { this.addSlotToContainer(new Slot(playerInventory, k + j * 9 + 9, 8 + k * 18, 103 + j * 18 + i)); } } for (j = 0; j < 9; ++j) { this.addSlotToContainer(new Slot(playerInventory, j, 8 + j * 18, 161 + i)); } } /** * True is the current equipped item is the opened item otherwise false. */ @Override public boolean canInteractWith(EntityPlayer player) { return this.lowerChestInventory.isUseableByPlayer(player); } /** * Called when a player shift-clicks on a slot. */ @Override public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int slotPos) { ItemStack returnStack = null; Slot slot = (Slot) inventorySlots.get(slotPos); if(slot != null && slot.getHasStack()) { ItemStack itemStack = slot.getStack(); if(itemStack.getItem() instanceof itemSeedPouch) { return returnStack; } returnStack = itemStack.copy(); if(slotPos < numRows * 9) { if(!mergeItemStack(itemStack, numRows * 9, inventorySlots.size(), true)) { return null; } } else if(!mergeItemStack(itemStack, 0, numRows * 9, false)) { return null; } if(itemStack.stackSize == 0) { slot.putStack((ItemStack) null); } else { slot.onSlotChanged(); } } return returnStack; } @Override public void onCraftGuiClosed(EntityPlayer player) { super.onCraftGuiClosed(player); this.lowerChestInventory.closeChest(); } public IInventory getLowerChestInventory() { return this.lowerChestInventory; } } Slot Code: package mods.betterFarming.inventory; import mods.betterFarming.items.itemSeedPouch; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; public class slotSeedPouch extends Slot { //Big thanks to Eydamos for his backpack mod open source public slotSeedPouch(IInventory inventory, int slotIndex, int xPos, int yPos) { super(inventory, slotIndex, xPos, yPos); } /** * Check if the stack is a valid item for this slot. Always true beside for * backpacks. */ @Override public boolean isItemValid(ItemStack is) { return is != null && is.getItem() instanceof itemSeedPouch ? false : true; } } Gui Code: package mods.betterFarming.gui; import mods.betterFarming.inventory.containerSeedPouch; import mods.betterFarming.misc.NBTUtil; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; import org.lwjgl.opengl.GL11; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class GUISeedPouch extends GuiContainer { //Big thanks to Eydamos for his backpack mod open source private IInventory upperInventory; private IInventory lowerInventory; private int inventoryRows; public GUISeedPouch(IInventory inventoryPlayer, IInventory inventorySeedPouch) { super(new containerSeedPouch(inventoryPlayer, inventorySeedPouch, null)); upperInventory = inventorySeedPouch; lowerInventory = inventoryPlayer; short short1 = 222; int i = short1 - 108; inventoryRows = inventorySeedPouch.getSizeInventory() / 9; ySize = i + inventoryRows * 18; } /** * Draw the foreground layer for the GuiContainer (everything in front of * the items) */ @Override protected void drawGuiContainerForegroundLayer(int par1, int par2) { fontRenderer.drawString(StatCollector.translateToLocal(upperInventory.getInvName()), 8, 6, 4210752); fontRenderer.drawString(StatCollector.translateToLocal(lowerInventory.getInvName()), 8, ySize - 96 + 2, 4210752); } /** * Draw the background layer for the GuiContainer (everything behind the * items) */ @Override protected void drawGuiContainerBackgroundLayer(float var1, int var2, int var3) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); mc.renderEngine.bindTexture("/gui/container.png"); int var5 = (width - xSize) / 2; int var6 = (height - ySize) / 2; drawTexturedModalRect(var5, var6, 0, 0, xSize, inventoryRows * 18 + 17); drawTexturedModalRect(var5, var6 + inventoryRows * 18 + 17, 0, 126, xSize, 96); } @Override public void onGuiClosed() { super.onGuiClosed(); if(mc.thePlayer != null) { EntityPlayer player = mc.thePlayer; ItemStack itemStack = player.getCurrentEquippedItem(); if(itemStack != null) { if(NBTUtil.hasTag(itemStack, "seedPouch")) { NBTUtil.removeTag(itemStack, "seePouch"); } } } } } Gui Handler Code: package mods.betterFarming.gui; import mods.betterFarming.inventory.containerSeedPouch; import mods.betterFarming.items.itemSeedPouch; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import cpw.mods.fml.common.network.IGuiHandler; public class guiHandler implements IGuiHandler { //returns an instance of the Container you made earlier @Override public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { return new containerSeedPouch(player.inventory, itemSeedPouch.getSeedPouchInv(player), player.getCurrentEquippedItem()); } //returns an instance of the Gui you made earlier @Override public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { return new GUISeedPouch(player.inventory, itemSeedPouch.getSeedPouchInv(player)); } } inventory code: package mods.betterFarming.inventory; import mods.betterFarming.items.itemSeedPouch; import mods.betterFarming.misc.NBTUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.InventoryBasic; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; public class inventorySeedPouch extends InventoryBasic { //Big thanks to Eydamos for his backpack mod open source // the title of the SeedPouch private String inventoryTitle; // an instance of the player to get the inventory private EntityPlayer playerEntity; // the original ItemStack to compare with the player inventory private ItemStack originalIS; // if class is reading from NBT tag private boolean reading = false; /** * Takes a player and an ItemStack. * * @param player * The player which has the SeedPouch. * @param is * The ItemStack which holds the SeedPouch. */ public inventorySeedPouch(EntityPlayer player, ItemStack is) { super("", false, getInventorySize(is)); playerEntity = player; originalIS = is; // check if inventory exists if not create one if(!hasInventory()) { createInventory(); } loadInventory(); } /** * Is called whenever something is changed in the inventory. */ @Override public void onInventoryChanged() { super.onInventoryChanged(); // if reading from NBT don't write if(!reading) { saveInventory(); } } /** * This method is called when the chest opens the inventory. It loads the * content of the inventory and its title. */ @Override public void openChest() { loadInventory(); } /** * This method is called when the chest closes the inventory. It then throws * out every SeedPouch which is inside the SeedPouch and saves the inventory. */ @Override public void closeChest() { saveInventory(); } /** * Returns the name of the inventory. */ @Override public String getInvName() { return inventoryTitle; } // ***** custom methods which are not in IInventory ***** /** * Returns the size of the inventory based on the ItemStack. * * @param is * The ItemStack to check for the size. * @return The number of slots the inventory has. */ protected static int getInventorySize(ItemStack is) { return 9 * 3; } /** * Returns if an Inventory is saved in the NBT. * * @return True when the NBT is not null and the NBT has key "Inventory" * otherwise false. */ private boolean hasInventory() { return NBTUtil.hasTag(originalIS, "Inventory"); } /** * Creates the Inventory Tag in the NBT with an empty inventory. */ private void createInventory() { setInvName(originalIS.getDisplayName()); writeToNBT(); } /** * Sets the name of the inventory. * * @param name * The new name. */ public void setInvName(String name) { inventoryTitle = name; } /** * Searches the SeedPouch in players inventory and saves NBT data in it. */ private void setNBT() { if(!NBTUtil.getBoolean(originalIS, "seedPouchOpen")) { for(ItemStack itemStack : playerEntity.inventory.mainInventory) { if(itemStack != null && itemStack.getItem() instanceof itemSeedPouch) { if(itemStack.isItemEqual(originalIS)) { itemStack.setTagCompound(originalIS.getTagCompound()); } } } } } /** * If there is no inventory create one. Then load the content and title of * the inventory from the NBT */ public void loadInventory() { readFromNBT(); } /** * Saves the actual content of the inventory to the NBT. */ public void saveInventory() { writeToNBT(); setNBT(); } /** * Writes a NBT Node with inventory. * * @param outerTag * The NBT Node to write to. * @return The written NBT Node. */ private void writeToNBT() { // save name in display->Name NBTTagCompound name = new NBTTagCompound(); name.setString("Name", getInvName()); NBTUtil.setCompoundTag(originalIS, "display", name); NBTTagList itemList = new NBTTagList(); for(int i = 0; i < getSizeInventory(); i++) { if(getStackInSlot(i) != null) { NBTTagCompound slotEntry = new NBTTagCompound(); slotEntry.setByte("Slot", (byte) i); getStackInSlot(i).writeToNBT(slotEntry); itemList.appendTag(slotEntry); } } // save content in Inventory->Items NBTTagCompound inventory = new NBTTagCompound(); inventory.setTag("Items", itemList); NBTUtil.setCompoundTag(originalIS, "Inventory", inventory); // return outerTag; } /** * Reads the inventory from a NBT Node. * * @param outerTag * The NBT Node to read from. */ private void readFromNBT() { reading = true; // TODO for backwards compatibility if(NBTUtil.getCompoundTag(originalIS, "Inventory").hasKey("title")) { setInvName(NBTUtil.getCompoundTag(originalIS, "Inventory").getString("title")); } else { setInvName(NBTUtil.getCompoundTag(originalIS, "display").getString("Name")); } NBTTagList itemList = NBTUtil.getCompoundTag(originalIS, "Inventory").getTagList("Items"); for(int i = 0; i < itemList.tagCount(); i++) { NBTTagCompound slotEntry = (NBTTagCompound) itemList.tagAt(i); int j = slotEntry.getByte("Slot") & 0xff; if(j >= 0 && j < getSizeInventory()) { setInventorySlotContents(j, ItemStack.loadItemStackFromNBT(slotEntry)); } } reading = false; } } crash report: ---- Minecraft Crash Report ---- // On the bright side, I bought you a teddy bear! Time: 4/25/13 4:17 PM Description: Ticking memory connection java.lang.IndexOutOfBoundsException: Index: 54, Size: 45 at java.util.ArrayList.rangeCheck(Unknown Source) at java.util.ArrayList.get(Unknown Source) at net.minecraft.inventory.Container.slotClick(Container.java:277) at net.minecraft.network.NetServerHandler.handleWindowClick(NetServerHandler.java:897) at net.minecraft.network.packet.Packet102WindowClick.processPacket(Packet102WindowClick.java:46) at net.minecraft.network.MemoryConnection.processReadPackets(MemoryConnection.java:89) at net.minecraft.network.NetServerHandler.networkTick(NetServerHandler.java:134) at net.minecraft.network.NetworkListenThread.networkTick(NetworkListenThread.java:53) at net.minecraft.server.integrated.IntegratedServerListenThread.networkTick(IntegratedServerListenThread.java:109) at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:674) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:570) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:127) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:468) at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:16) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- System Details -- Details: Minecraft Version: 1.5.1 Operating System: Windows 7 (amd64) version 6.1 Java Version: 1.7.0_07, Oracle Corporation Java VM Version: Java HotSpot 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 883360600 bytes (842 MB) / 1038876672 bytes (990 MB) up to 1038876672 bytes (990 MB) JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M AABB Pool Size: 2407 (134792 bytes; 0 MB) allocated, 2252 (126112 bytes; 0 MB) used Suspicious classes: FML and Forge are installed IntCache: cache: 0, tcache: 0, allocated: 1, tallocated: 63 FML: MCP v7.44 FML v5.1.8.611 Minecraft Forge 7.7.1.611 4 mods loaded, 4 mods active mcp [Minecraft Coder Pack] (minecraft.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available FML [Forge Mod Loader] (coremods) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available Forge [Minecraft Forge] (coremods) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available betterFarming [better Farming] (bin) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available Profiler Position: N/A (disabled) Vec3 Pool Size: 1061 (59416 bytes; 0 MB) allocated, 1030 (57680 bytes; 0 MB) used Player Count: 1 / 8; [EntityPlayerMP['Player768'/217, l='New World', x=37.30, y=23.00, z=25.72]] Type: Integrated Server (map_client.txt) Is Modded: Definitely; Client brand changed to 'forge,fml'
April 30, 201312 yr Author Opening on server crashes the client. I knew it would as soon as i read your post, but i tested it anyway. Besides that shouldnt be causing the IndexOutOfBoundsException
April 30, 201312 yr Author When you open the Gui server side only the client doesnt know about the gui so when its called to draw it by the server the client is unable to and crashes.
April 30, 201312 yr Author what you were saying is the server has to open the gui and the client has to carry the container.
April 30, 201312 yr Your crash actually looks like it's coming from trying to call a Slot that is out of bounds for how big your inventory is.
April 30, 201312 yr Author I knew that, what I don't know is how to fix it, from what I understand the issue is in the container or inventory code, but I'm not sure.
May 3, 201312 yr Author Its become evedent that no one seems to know how to fix this since only one person has made a suggestion but no one else has. Its sad that i cant even go to a community of modders to get an answer for this. Dies, thanks for at least trying.
May 4, 201312 yr Author Other than date the crash report did not change, i said that. Originally i was and the exact same error still showed. Plus i dont recall saying that.
May 5, 201312 yr Author the code i looked at that does almost exactly the same thing had it. i assumed that it was an important variable.
June 16, 201312 yr Author No progress has been made on this issue. Code is still the same as whats already posted
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.