Posted February 18, 20169 yr I can add armor to the inventory fine and stays while the world is loaded but after closing and reopening the items are lost. Can someone take a look at my readFrom/writeToNBT methods and point out what I am doing wrong. Github Link line 73 for read and line 108 for write the inventory portions are at 90 and 123 Forewarning: I am probably trying to throw a lot more into the save than is necessary. Current Project: Armerger Planned mods: Light Drafter | Ore Swords Looking for help getting a mod off the ground? Coding | Textures
February 18, 20169 yr you will need a taglist to save an inventory. otherwise the last item saved will overwrite all others @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); NBTTagList list = compound.getTagList("items", 10); for(int i=0; i<list.tagCount(); i++) { NBTTagCompound nbt = list.getCompoundTagAt(i); byte slot = nbt.getByte("slot"); ItemStack stack = ItemStack.loadItemStackFromNBT(nbt); inventory.setInventorySlotContents(slot, stack); } } @Override public void writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); NBTTagList list = new NBTTagList(); for(int i=0; i<inventory.getSizeInventory(); i++) { ItemStack stack = inventory.getStackInSlot(i); if(stack==null) continue; NBTTagCompound nbt = new NBTTagCompound(); nbt.setByte("slot", (byte) i); stack.writeToNBT(nbt); list.appendTag(nbt); } compound.setTag("items", list); }
February 18, 20169 yr Author So you can only have one NBTTagCompound or NBTTagList per nest level? I switched up my read and write to make use of NBTTagList but it still doesn't save the inventory. But it still doesn't seem to be saving. I took a look at the region file in NBTExplorer and it doesn't list any tile entities at that block location. Is there something I need to do to outside of my TileEntity file to make writeToNBT get called during save? Current Project: Armerger Planned mods: Light Drafter | Ore Swords Looking for help getting a mod off the ground? Coding | Textures
February 19, 20169 yr [quote name="UberAffe" post="193884" timestamp="1455814549"] So you can only have one NBTTagCompound or NBTTagList per nest level? [/quote] Incorrect. NBTTagCompound is a dictionary. You can only have one object [i]with a given name[/i]. Both of these are using the same name: [code nbt.setTag(RefStrings.TAGLIST, list); nbt.setInteger(RefStrings.TAGLIST, count); I'm sure the others are, too. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
February 19, 20169 yr Is there something I need to do to outside of my TileEntity file to make writeToNBT get called during save? I've seen vanilla code that marks tile entities as dirty so that they get saved. Hunt down an example and either imitate it or make sure that your TE calls a method that does it for you. I've also run into default TE cleanup that deletes existing TE's and instantiates fresh replacements for trivial blockstate changes. Check to see if that's happening to you, and if it is, change the class member controlling that level of cleanup aggression. You might need to step through your TE code in a debugger to see what's really happening. The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.
February 19, 20169 yr Author @jeffryfisher: I though markDirty was just to update the client with changes on the server? @Draco18s: If it is just a dictionary then I am confused as to why my original bit of code wouldn't work. //RefString values are formatted as "{modid}_{variableName}" public void writeToNBT(NBTTagCompound nbt) { NBTTagCompound temp; for(int i = 0; i < inventory.length(); i++) { temp = new NBTTagCompound(); inventory[i].writeToNBT(temp); nbt.setTag(RefStrings.Inventory + i, temp); } When I had everything set up like that it still wouldn't save, even looking at the region file it doesn't show any tile entity in that location. Even if entries are getting overwritten something should still show up shouldn't it? Current Project: Armerger Planned mods: Light Drafter | Ore Swords Looking for help getting a mod off the ground? Coding | Textures
February 19, 20169 yr https://github.com/Draco18s/Artifacts/blob/master/main/java/com/draco18s/artifacts/entity/TileEntityDisplayPedestal.java#L205-L243 Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
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.