Posted February 10, 20178 yr I have an battery which holds Forge Energy and I generate it with solar panels, now I want to save the energy of the battery when its broken, so when I place it again it has the value before I broke it. How should I do this? Edited February 10, 20178 yr by Terrails
February 10, 20178 yr Author BlockBasicBattery https://gist.github.com/Terrails/cf9282a47e5949162c62ac347f9507bf BaseEnergyContainer https://gist.github.com/Terrails/f3be7032f7a3c097d0fadde5abd0d7b0 TileEntityBasicBattery https://gist.github.com/Terrails/344147dc45a24a35217dab20f0d2312b
February 10, 20178 yr Override Block#getDrops to return a List<ItemStack> containing an ItemStack with the NBT properties of the TileEntity. Be sure to delay the breaking of the Block by overriding Block#removedByPlayer to return true if willHarvest is true, and else return the result of the super method. Look at BlockFlowerPot for an example. Then in Block#onBlockPlacedBy set the NBT of the TIleEntity to the NBT of the ItemStack. Edited February 10, 20178 yr by larsgerrits Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support. 1.12 -> 1.13 primer by williewillus. 1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support. http://www.howoldisminecraft1710.today/
February 11, 20178 yr Author For now I made the block save its stored power into NBT when I break it. But I'm not sure how to use the NBT in onBlockPlacedBy method. I'm using Actually Addition in my workspace so I can see the NBT. What I added to the Block class: Spoiler @Override public ArrayList<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) { ArrayList<ItemStack> drop = new ArrayList<ItemStack>(); Random rand = world instanceof World ? ((World) world).rand : RANDOM; Item item = this.getItemDropped(state, rand, fortune); ItemStack stack = null; if (item != null) { stack = new ItemStack(item, 1, this.damageDropped(state)); drop.add(stack); } TileEntity te = world.getTileEntity(pos); if (te instanceof TileEntityBasicBattery && stack != null) { if (((TileEntityBasicBattery) te).containsEnergy()) { NBTTagCompound tag = new NBTTagCompound(); ((TileEntityBasicBattery) te).writeToNBT(tag); stack.setTagCompound(tag); } } return drop; } @Override public boolean removedByPlayer(IBlockState state, World world, BlockPos pos, EntityPlayer player, boolean willHarvest) { if (willHarvest) return true; //If it will harvest, delay deletion of the block until after getDrops return super.removedByPlayer(state, world, pos, player, willHarvest); } @Override public void harvestBlock(World world, EntityPlayer player, BlockPos pos, IBlockState state, TileEntity te, ItemStack tool) { super.harvestBlock(world, player, pos, state, te, tool); world.setBlockToAir(pos); } @Override public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase entity, ItemStack stack){ world.setBlockState(pos, state.withProperty(FACING, entity.getHorizontalFacing().getOpposite()), 2); if(stack.hasTagCompound()){ TileEntity tile = world.getTileEntity(pos); if(tile instanceof TileEntityBasicBattery){ TileEntityBasicBattery base = (TileEntityBasicBattery)tile; // NBTTagCompound compound = stack.getTagCompound().getCompoundTag("stored"); NBTTagCompound tag = new NBTTagCompound(); stack.getTagCompound().getCompoundTag("stored"); } } } TileEntity Spoiler int input = 2500; int output = 2500; int maxEnergy = 1000000; int storedEnergy; private Item battery; public TileEntityBasicBattery() { setMaxEnergyStored(maxEnergy); setMaxInput(input); setMaxOutput(output); this.battery = battery; this.markDirty(); } @Override public void readFromNBT(NBTTagCompound compound) { storedEnergy = compound.getInteger("stored"); super.readFromNBT(compound); } @Override public NBTTagCompound writeToNBT(NBTTagCompound compound) { compound.setInteger("stored", storedEnergy); return super.writeToNBT(compound); }
February 11, 20178 yr Author I can't figure it out... It just doesn't want to apply. I even tried looking at BlockBanner Edited February 11, 20178 yr by Terrails
February 11, 20178 yr Author I did this in my Block and I didn't change my Tile https://gist.github.com/Terrails/304ce5c367c6f1a16bdd2a6954d81fab
February 11, 20178 yr Author I used the getTileDataItemStack because of banners had it but I removed it now. What should I do in onBlockPlacedBy than?
February 11, 20178 yr Author Oh ok than where do I store the NBT back to the block when I put it on the ground?
February 11, 20178 yr Author So I added an ItemBlock subclass into my Block class and it still doesn't want to work. The registry name's have to be the same I know that, but looks like the ItemBlock isn't getting called, I tested it with breakpoints ItemBlock which I added, how am I supposed to call the ItemBlock? this is the subclass. Spoiler public class ItemBlockBasicBattery extends ItemBlock { public ItemBlockBasicBattery(Block block) { super(block); this.setHasSubtypes(true); this.setRegistryName("basic_battery"); } @Override public String getUnlocalizedName(ItemStack stack) { return this.getUnlocalizedName(); } @Override public int getMetadata(int damage) { return damage; } }
February 11, 20178 yr Author Here you go this is the folder where my Battery is: https://github.com/Terrails/MineDustry/tree/master/src/main/java/terrails/minedustry/common/blocks/machine/battery I'm doing some random stuff so don't mind the mess! Edited February 11, 20178 yr by Terrails
February 12, 20178 yr Author I fixed 1, 3, 4 and 5 (I updated the github with it) But my battery still won't save its content when I place it. I'll fix the 2 and 6 little bit later.
February 12, 20178 yr Author I removed the comment from the super call and I tried 2 different way to fix the readFromNBT but nothing.
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.