Posted February 28, 20187 yr I created a capability which is supposed to store ItemStacks the player has dropped. I do this by having an ArrayList in my capability class. I can add and get the items correctly via the getLostItems getter, but whenever I rejoin the list is empty, indicating that the list isn't saved. I tried to match the saveAllItems and loadAllItems in the ItemStackHelper class, but I am not sure where I went wrong. Storage class: @Nullable @Override public NBTBase writeNBT(Capability<ILostItemsCapability> capability, ILostItemsCapability instance, EnumFacing side) { return ItemNBTHelper.saveItemList(new NBTTagCompound(), instance.getLostItems()); } @Override public void readNBT(Capability<ILostItemsCapability> capability, ILostItemsCapability instance, EnumFacing side, NBTBase nbt) { ItemNBTHelper.loadItemList((NBTTagCompound) nbt, instance.getLostItems()); } ItemNBTHelper: public static NBTTagCompound saveItemList(NBTTagCompound tag, List<ItemStack> itemStacks) { NBTTagList tagList = new NBTTagList(); for(int i = 0; i < itemStacks.size(); ++i) { ItemStack itemStack = itemStacks.get(i); if(!itemStack.isEmpty()) { NBTTagCompound compound = new NBTTagCompound(); compound.setByte("Slot", (byte)i); itemStack.writeToNBT(compound); tagList.appendTag(compound); } } if(!tagList.hasNoTags()) { tag.setTag("Items", tagList); } return tag; } public static void loadItemList(NBTTagCompound tag, List<ItemStack> itemStacks) { NBTTagList tagList = tag.getTagList("Items", 10); for(int i = 0; i < tagList.tagCount(); ++i) { NBTTagCompound compound = tagList.getCompoundTagAt(i); int slot = compound.getByte("Slot") & 255; if(slot >= 0 && slot < itemStacks.size()) { itemStacks.set(slot, new ItemStack(compound)); } } } Edited March 1, 20187 yr by That_Martin_Guy
March 1, 20187 yr Author ItemStackHandler uses a NonNullList. I do not want there to be a limit on how many items there are in the list, and any of the other features that class provides is useless for me.
March 1, 20187 yr Author I was following the original code too closely, apparently. Doing what you said seems to have fixed it! New saving and loading code: public static NBTTagCompound saveItemList(NBTTagCompound tag, List<ItemStack> itemStacks) { NBTTagList tagList = new NBTTagList(); for(int i = 0; i < itemStacks.size(); ++i) { ItemStack itemStack = itemStacks.get(i); if(!itemStack.isEmpty()) { NBTTagCompound compound = itemStack.writeToNBT(new NBTTagCompound()); tagList.appendTag(compound); } } if(!tagList.hasNoTags()) { tag.setTag("Items", tagList); } return tag; } public static void loadItemList(NBTTagCompound tag, List<ItemStack> itemStacks) { NBTTagList tagList = tag.getTagList("Items", 10); for(int i = 0; i < tagList.tagCount(); ++i) { NBTTagCompound compound = tagList.getCompoundTagAt(i); itemStacks.add(new ItemStack(compound)); } }
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.