Jump to content

Storing Energy in ItemStack


Terrails

Recommended Posts

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 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/

Link to comment
Share on other sites

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.

dfb8eb3e7c285f835fdb2219e9eb91fa.png

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);
    }

 

 

Link to comment
Share on other sites

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;
        }


    }

 

 

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.