From a3ade6667e3204f556bb6fc4e2d2634e74107f3d Mon Sep 17 00:00:00 2001 From: Tom Erik Date: Tue, 5 Apr 2016 15:26:15 +0200 Subject: [PATCH] Store Energy in item when ccontrolelr is broken modified: src/main/java/refinedstorage/block/BlockController.java modified: src/main/java/refinedstorage/tile/TileController.java --- .../refinedstorage/block/BlockController.java | 76 ++++++++++++++++++- .../refinedstorage/tile/TileController.java | 20 +++++ 2 files changed, 95 insertions(+), 1 deletion(-) diff --git a/src/main/java/refinedstorage/block/BlockController.java b/src/main/java/refinedstorage/block/BlockController.java index 2f8e9d75e..d7cf352fe 100755 --- a/src/main/java/refinedstorage/block/BlockController.java +++ b/src/main/java/refinedstorage/block/BlockController.java @@ -1,18 +1,27 @@ package refinedstorage.block; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.properties.PropertyInteger; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Enchantments; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.stats.StatList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import refinedstorage.RefinedStorage; @@ -20,7 +29,9 @@ import refinedstorage.RefinedStorageGui; import refinedstorage.item.ItemBlockBase; import refinedstorage.tile.TileController; +import java.util.ArrayList; import java.util.List; +import java.util.Random; public class BlockController extends BlockBase { public static final PropertyEnum TYPE = PropertyEnum.create("type", EnumControllerType.class); @@ -85,7 +96,68 @@ public class BlockController extends BlockBase { public void breakBlock(World world, BlockPos pos, IBlockState state) { ((TileController) world.getTileEntity(pos)).onDestroyed(); - super.breakBlock(world, pos, state); + super.breakBlock(world,pos,state); + } + + //Unless making a ItemBlock this seems to be the only solution to store NBT on the dropped stack + // any function called after this like get drops will not be able to get the tile + public void harvestBlock(World worldIn, EntityPlayer player, BlockPos pos, IBlockState state, TileEntity te, ItemStack stack) + { + player.addStat(StatList.func_188055_a(this)); + player.addExhaustion(0.025F); + + if (this.canSilkHarvest(worldIn, pos, state, player) && EnchantmentHelper.getEnchantmentLevel(Enchantments.silkTouch, stack) > 0) + { + java.util.List items = new java.util.ArrayList(); + ItemStack itemstack = this.createStackedBlock(state); + + if (itemstack != null) + { + items.add(itemstack); + } + + net.minecraftforge.event.ForgeEventFactory.fireBlockHarvesting(items, worldIn, pos, state, 0, 1.0f, true, player); + for (ItemStack item : items) + { + spawnAsEntity(worldIn, pos, item); + } + } + else + { + harvesters.set(player); + int i = EnchantmentHelper.getEnchantmentLevel(Enchantments.fortune, stack); + if ((te instanceof TileController)) { + List ls = new ArrayList(); + + TileController controller = (TileController) te; + ItemStack item = new ItemStack(getItemDropped(state, null, 0), 1, damageDropped(state)); + NBTTagCompound tag = new NBTTagCompound(); + controller.writeItemToNBT(tag); + item.setTagCompound(tag); + if (!worldIn.isRemote && !worldIn.restoringBlockSnapshots) + { + spawnAsEntity(worldIn, pos, item); + } + } + //this.dropBlockAsItem(worldIn, pos, state, i); + harvesters.set(null); + } + } + + @Override + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack itemStack) { + super.onBlockPlacedBy(world, pos, state, player, itemStack); + + NBTTagCompound tag = itemStack.getTagCompound(); + if(tag != null) + { + TileEntity tile = world.getTileEntity(pos); + if(tile instanceof TileController) + { + TileController controller = (TileController)tile; + controller.readItemFromNBT(tag); + } + } } @Override @@ -102,4 +174,6 @@ public class BlockController extends BlockBase { public Item createItemForBlock() { return new ItemBlockBase(this, true); } + + } diff --git a/src/main/java/refinedstorage/tile/TileController.java b/src/main/java/refinedstorage/tile/TileController.java index ebb1a3c89..d8fc88cba 100755 --- a/src/main/java/refinedstorage/tile/TileController.java +++ b/src/main/java/refinedstorage/tile/TileController.java @@ -36,6 +36,7 @@ import refinedstorage.util.InventoryUtils; import java.util.*; public class TileController extends TileBase implements IEnergyReceiver, INetworkTile, IRedstoneModeConfig { + public class ClientSideMachine { public ItemStack stack; public int energyUsage; @@ -379,6 +380,20 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor nbt.setInteger(RedstoneMode.NBT, redstoneMode.id); } + public void readItemFromNBT(NBTTagCompound nbt) { + energy.readFromNBT(nbt); + + if (nbt.hasKey(RedstoneMode.NBT)) { + redstoneMode = RedstoneMode.getById(nbt.getInteger(RedstoneMode.NBT)); + } + } + + public void writeItemToNBT(NBTTagCompound nbt) { + energy.writeToNBT(nbt); + + nbt.setInteger(RedstoneMode.NBT, redstoneMode.id); + } + @Override public int receiveEnergy(EnumFacing from, int maxReceive, boolean simulate) { return energy.receiveEnergy(maxReceive, simulate); @@ -580,4 +595,9 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor drainEnergyFromWirelessGrid(player, ItemWirelessGrid.USAGE_PUSH); } } + + public void setEnergyStored(int energyStored) { + if (energyStored > 0) this.energy.setEnergyStored(energyStored); + } + }