Posted August 17, 201312 yr Okay Im trying to save the items in container item based gui. This is what ive got so far but I cant seem to get it to work: ItemBagpackInventory(Ive written some comments on some bits which I think is the problem package simplecamping; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; public class ItemBagpackInventory implements IInventory { private ItemStack[] inv; private ItemStack bagpack; public ItemBagpackInventory(ItemStack itemstack) { inv = new ItemStack[27]; bagpack = itemstack; } @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 String getInvName() { return "Bagpack"; } @Override public boolean isInvNameLocalized() { return false; } @Override public int getInventoryStackLimit() { return 64; } @Override public void onInventoryChanged() {} @Override public boolean isUseableByPlayer(EntityPlayer entityplayer) { return true; } public NBTTagCompound writeToNBT(NBTTagCompound tagCompound) { NBTTagList itemList = new NBTTagList(); for(int i = 0; i < inv.length; i++) { ItemStack stack = inv[i]; if(stack != null) { NBTTagCompound tag = new NBTTagCompound(); tag.setByte("Slot", (byte) i); stack.writeToNBT(tag); itemList.appendTag(tag); } } tagCompound.setTag("Inventory", itemList); return tagCompound; } public void readFromNBT(NBTTagCompound tagCompound) { NBTTagList tagList = tagCompound.getTagList("Inventory"); for(int i = 0; i < tagList.tagCount(); i++) { NBTTagCompound tag = (NBTTagCompound) tagList.tagAt(i); byte slot = tag.getByte("Slot"); System.out.println(i); if(slot >= 0 && slot < inv.length) { inv[slot] = ItemStack.loadItemStackFromNBT(tag); System.out.println("slot"); } } } @Override public boolean isItemValidForSlot(int i, ItemStack itemstack) { return true; } @Override public void openChest() { if(bagpack.hasTagCompound()) { System.out.println("hastag");//never gets printed readFromNBT(bagpack.getTagCompound()); } } @Override public void closeChest() { if(! bagpack.hasTagCompound()) { System.out.println("writing without tag compound"); //Prints all the time, even after its set and it should be false bagpack.setTagCompound(new NBTTagCompound()); } NBTTagCompound tag = bagpack.getTagCompound(); writeToNBT(tag); } } Container Bagpack: package simplecamping; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; public class ContainerBagpack extends Container { private ItemBagpackInventory bginv; public ContainerBagpack(InventoryPlayer inventoryPlayer, ItemBagpackInventory bagpack) { bginv = bagpack; bagpack.openChest(); for(int i = 0; i < 3; i++) { for(int j = 0; j < 9; j++) { addSlotToContainer(new Slot(bginv, j + i * 3, 8 + j * 18, 17 + i * 18)); } } bindPlayerInventory(inventoryPlayer); } @Override public boolean canInteractWith(EntityPlayer player) { return bginv.isUseableByPlayer(player); } protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) { for(int i = 0; i < 3; i++) { for(int j = 0; j < 9; j++) { addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); } } for(int i = 0; i < 9; i++) { addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 142)); } } public void onContainerClosed(EntityPlayer par1EntityPlayer) { super.onContainerClosed(par1EntityPlayer); this.bginv.closeChest(); } } GuBagpack: package simplecamping; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; import cpw.mods.fml.client.FMLClientHandler; public class GuiBagpack extends GuiContainer { public ItemBagpackInventory bagpack; public GuiBagpack(InventoryPlayer par1InventoryPlayer, ItemBagpackInventory bgInv) { super(new ContainerBagpack(par1InventoryPlayer, bgInv)); this.bagpack = bgInv; } /** * Draw the foreground layer for the GuiContainer (everything in front of the items) */ protected void drawGuiContainerForegroundLayer(int par1, int par2) { String s = this.bagpack.isInvNameLocalized() ? this.bagpack.getInvName() : I18n.func_135053_a(this.bagpack.getInvName()); this.fontRenderer.drawString(s, 8, 6, 4210752); this.fontRenderer.drawString(I18n.func_135053_a("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } /** * Draw the background layer for the GuiContainer (everything behind the items) */ protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); FMLClientHandler.instance().getClient().renderEngine.func_110577_a(new ResourceLocation(Strings.MOD_ID, "/textures/gui/bagpack.png")); int k = this.guiLeft; int l = this.guiTop; this.drawTexturedModalRect(k, l, 0, 0, 256, 256); } } GuiHandler: package simplecamping; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import cpw.mods.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.getBlockTileEntity(x, y, z); ItemBagpackInventory bp = new ItemBagpackInventory(player.inventory.getCurrentItem()); switch(id) { case 0: return new ContainerCampfire(player.inventory, (TileEntityCampfire) tile_entity); case 1: return new ContainerBagpack(player.inventory, (ItemBagpackInventory) bp); } return true; } @Override public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { TileEntity tile_entity = world.getBlockTileEntity(x, y, z); ItemBagpackInventory bp = new ItemBagpackInventory(player.inventory.getCurrentItem());//is not 100% the backpack switch(id) { case 0: return new GuiCampfire(player.inventory, (TileEntityCampfire) tile_entity); case 1: return new GuiBagpack(player.inventory, (ItemBagpackInventory) bp); } return true; } }
August 18, 201312 yr You can't use an item like you would a tile entity (which is what you're doing as you've implemented IInventory) since items are static. Everything will need to be written to the ItemStack's NBTTagCompound.
August 18, 201312 yr @Guff It doesn't matter where you implement IInventory. TileEntity is only one of the possible implementation. @Lua You only need to call writeToNBT(stack.getTagCompound());//To save readFromNBT(stack.getTagCompound());//To load
August 18, 201312 yr Author In the open and close chest methods? (They get called when opening and closing the container btw)
August 18, 201312 yr Author @GotoLink Okay this is what i tried and it didnt work: @Override public void openChest() { NBTTagCompound compound = new NBTTagCompound(); ItemStack stack = ItemStack.loadItemStackFromNBT(compound); if(bagpack.hasTagCompound()) { System.out.println("hastag");//never gets printed //readFromNBT(bagpack.getTagCompound()); readFromNBT(stack.getTagCompound()); } } @Override public void closeChest() { NBTTagCompound compound = new NBTTagCompound(); ItemStack stack = ItemStack.loadItemStackFromNBT(compound); System.out.println("writing without tag compound"); //Prints all the time, even after its set and it should be false //bagpack.setTagCompound(new NBTTagCompound()); if(stack != null) { writeToNBT(stack.getTagCompound()); } }
August 18, 201312 yr No, those methods don't give you the ItemStack as a variable. Use your code inside a method which gives you the player or item in your container class or item. If necessary, send packets from your gui.
August 18, 201312 yr Author I have no idea, I know most people dont work like this, but can some one just give me the code? Ive tried to do myself but no avail
August 18, 201312 yr I stand corrected, I didn't read all of your code. This should work : @Override public void openChest() { if(bagpack.hasTagCompound()) { readFromNBT(bagpack.getTagCompound());//Bag pack has some info for the inventory } else { bagpack.setTagCompound(writeToNBT(new NBTTagCompound()));//this is a "new" bagpack } } @Override public void closeChest() { if(! bagpack.hasTagCompound()) { //Should never be reached, since done when opening the first time bagpack.setTagCompound(writeToNBT(new NBTTagCompound())); } else {//We made changes to the inventory, save them bagpack.setTagCompound(writeToNBT(bagpack.getTagCompound())); } }
August 19, 201312 yr daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamn how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
August 19, 201312 yr I give up. this, its someting simple but you "give up" ... oh well one less mod on the market... how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
August 19, 201312 yr Author I give up. this, its someting simple but you "give up" ... oh well one less mod on the market... I couldnt figure out what was wrong w/ my saving code and neither could anyone else it seemed
August 19, 201312 yr well what you are trying to do is obviously possible, did you even debug at all?? try to check where it was saving/not saving System.out.println("text"); System.out.println("the value of derp is: "+derp); or even try{ throw new Exception("weird thing happenning here !"); }catch(Exception e{ e.printStackTrace(); } if you really need ? i dont knwo just by looking at it whats wrong, but i know what you are trying to do is not impossible how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
August 19, 201312 yr Author Yes I have @Override public void openChest() { if(bagpack.hasTagCompound()) { System.out.println("hastag");//never gets printed readFromNBT(bagpack.getTagCompound()); } } @Override public void closeChest() { if(! bagpack.hasTagCompound()) { System.out.println("writing without tag compound"); //Prints all the time, even after its set and it should be false bagpack.setTagCompound(new NBTTagCompound()); } NBTTagCompound tag = bagpack.getTagCompound(); writeToNBT(tag); } It seems that the tag never gets properly because it always seems to get set everytime and always goes through the if statement. But the hasCompound never gets printed
August 19, 201312 yr public void openChest() { if(bagpack.hasTagCompound()) { System.out.println("hastag");//never gets printed readFromNBT(bagpack.getTagCompound()); } } well this code alone will not make bagpack magicly have a tagCompount you should have a else then set a new tag compound like gotolink said in his post public void openChest() { if(bagpack.hasTagCompound()) { System.out.println("hastag");//never gets printed readFromNBT(bagpack.getTagCompound()); }else{ bagpack.stackTagCompound = new NBTTagCompound();//im assuming that bagpack is an instance of ItemStack .. ?? ? } } how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
August 19, 201312 yr Author Okay, after some more testing, it seems that it writes to nbt when opened to according to the console. And its trying to read the nbt but it looks like nothing is there. Also yeah bagpack is an instance of itemstack
August 19, 201312 yr after setting the new nbt, did you write anythign to it? because if not thats kindof normal public class vec3{ public float x = 0, y = 0, z = 0; } in program: vec3 = new vec3(); println(vec3.x); "oh its 0 :\" "yeah thats normal" or are you legitimatelly writing to it and its not apparing how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
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.