Posted July 12, 201411 yr Hello, new to modding I'm making a ComputerCraft peripheral (that's why I use 1.6), and I followed many tutorials to get a working inventory in a block. I can put items in it, the problem is that the items are destroyed when the block is unloaded. I tried to save the ItemStack to NBT tag, but I can't find where I should get the tag to save in. Here is my TileEntity (scrapped all CC peripheral stuff) package niverton.ccscanner; import net.minecraft.block.Block; 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; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; public class TileEntityScanner extends TileEntity implements IInventory { public static final String tileid = "TileEntityScanner"; private ItemStack inventory; //Constructor TileEntityScanner() { super(); } //------------------ //Inventory functions @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTTagCompound tag = nbt.getCompoundTag("Inventory"); inventory = ItemStack.loadItemStackFromNBT(tag); } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); //Writing inventory to NBT if (inventory != null) { NBTTagCompound item = new NBTTagCompound(); //Writing inventory to new NBT tag inventory.writeToNBT(item); //Saving the tag to list nbt.setTag("Inventory", item); } //Should store each ItemStack tag to a NBTTagList if has multiple slots } @Override public ItemStack decrStackSize(int slot, int count) { ItemStack itemstack = getStackInSlot(slot); if(itemstack != null) { if(itemstack.stackSize <= count) setInventorySlotContents(slot, null); else itemstack = itemstack.splitStack(count); onInventoryChanged(); } return itemstack; } @Override public ItemStack getStackInSlotOnClosing(int i) { ItemStack itemstack = getStackInSlot(i); setInventorySlotContents(i, null); return itemstack; } @Override public void setInventorySlotContents(int i, ItemStack itemstack) { inventory = itemstack; if(itemstack != null && itemstack.stackSize > getInventoryStackLimit()) itemstack.stackSize = getInventoryStackLimit(); onInventoryChanged(); } @Override public boolean isItemValidForSlot(int i, ItemStack itemstack) { return true; } @Override public int getSizeInventory() { return 1; } @Override public int getInventoryStackLimit() { return 64; } @Override public ItemStack getStackInSlot(int i) { return inventory; } @Override public String getInvName() { return "Scanner"; } @Override public boolean isInvNameLocalized() { return true; } @Override public boolean isUseableByPlayer(EntityPlayer entityplayer) { return entityplayer.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 64; } @Override public void openChest() { } @Override public void closeChest() { } } I know my TileEntity is working properly, because the CC stuff works, I just can't get it to save the inventory when the block is unloaded. Thanks !
July 12, 201411 yr There's a ComputerCraft 1.6 beta for 1.7.2. I would recommend developing a peripheral for that, instead
July 12, 201411 yr You see that nbt tag passed into the read/write nbt methods? Yeah, those. Use that nbt instance passed in. You don't have to call the read/write methods, Minecraft does that for you (only in entities, and stuff like that... Yeah... Only entities). So, you just need to write/read from that nbt tag instance passed in. We all stuff up sometimes... But I seem to be at the bottom of that pot.
July 13, 201411 yr Author There's a ComputerCraft 1.6 beta for 1.7.2. I would recommend developing a peripheral for that, instead I'd like to use my mod in Tekkit, but the modpack isn't updated to 1.7 But thanks for the heads up, didn't see this beta You see that nbt tag passed into the read/write nbt methods? Yeah, those. Use that nbt instance passed in. You don't have to call the read/write methods, Minecraft does that for you (only in entities, and stuff like that... Yeah... Only entities). So, you just need to write/read from that nbt tag instance passed in. Can you be more sarcastic and less precise please ? When are those functions called by Minecraft ? What did I do wrong implementing them ? Are you talking about entities like players and mobs or does it apply to TileEntities as well ? Also, should I override onInventoryChanged() ?
July 13, 201411 yr Can you be more sarcastic and less precise please? Of course I can. Have you gone full debug mode on your code? Sysouts in the read/write methods to see if the are actually called? And just a note, the read/wrote methods are called... Somewhere but it is all handled by TileEntity. And TileEntities are entities, therefore, only entities have NBT. As for what you did wrong... Could be all manner of things. You never know. We all stuff up sometimes... But I seem to be at the bottom of that pot.
July 13, 201411 yr Author After testing, the write function is called every 45 seconds, so I should probably override onChunkUnload() to write the inventory to NBT. The read function, however, is never called, so I have to call it manually when the TileEntity is created. The problem is to get the previous tag. They're stored in the world files, so I should be able to read it from a World object, right ? But I can't find a method that gives me the tag in that class
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.