diff --git a/src/main/java/resonantinduction/electrical/battery/BatteryNetwork.java b/src/main/java/resonantinduction/electrical/battery/BatteryNetwork.java index fe7027a9..122a0d73 100644 --- a/src/main/java/resonantinduction/electrical/battery/BatteryNetwork.java +++ b/src/main/java/resonantinduction/electrical/battery/BatteryNetwork.java @@ -9,35 +9,34 @@ public class BatteryNetwork extends Network public void redistribute(TileBattery... exclusion) { long totalEnergy = 0; + long totalCapacity = 0; for (TileBattery battery : this.getConnectors()) { totalEnergy += battery.energy.getEnergy(); + totalCapacity += battery.energy.getEnergyCapacity(); } int amountOfNodes = this.getConnectors().size() - exclusion.length; if (totalEnergy > 0 && amountOfNodes > 0) { - long totalPerBattery = totalEnergy / amountOfNodes; - long totalPerBatteryRemainder = totalPerBattery + totalEnergy % amountOfNodes; + long remainingEnergy = totalEnergy; TileBattery firstNode = this.getFirstConnector(); for (TileBattery battery : this.getConnectors()) { - if (!Arrays.asList(exclusion).contains(battery)) + if (battery != firstNode && !Arrays.asList(exclusion).contains(battery)) { - if (battery == firstNode) - { - battery.energy.setEnergy(totalPerBatteryRemainder); - } - else - { - battery.energy.setEnergy(totalPerBattery); - } + double percentage = ((double) battery.energy.getEnergyCapacity() / (double) totalCapacity); + long energyForBattery = (long) Math.round(totalEnergy * percentage); + battery.energy.setEnergy(energyForBattery); + remainingEnergy -= energyForBattery; } } + + firstNode.energy.setEnergy(remainingEnergy); } } diff --git a/src/main/java/resonantinduction/electrical/battery/BlockBattery.java b/src/main/java/resonantinduction/electrical/battery/BlockBattery.java index 846d3bf3..03d37777 100644 --- a/src/main/java/resonantinduction/electrical/battery/BlockBattery.java +++ b/src/main/java/resonantinduction/electrical/battery/BlockBattery.java @@ -3,8 +3,11 @@ */ package resonantinduction.electrical.battery; +import java.util.ArrayList; + import net.minecraft.block.ITileEntityProvider; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -14,7 +17,6 @@ import resonantinduction.core.Reference; import resonantinduction.core.Settings; import resonantinduction.core.prefab.block.BlockIOBase; import resonantinduction.core.render.RIBlockRenderingHandler; -import resonantinduction.electrical.Electrical; import universalelectricity.api.CompatibilityModule; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -44,15 +46,16 @@ public class BlockBattery extends BlockIOBase implements ITileEntityProvider } @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entityliving, ItemStack itemstack) + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entityliving, ItemStack itemStack) { - if (!world.isRemote && itemstack.getItem() instanceof ItemBlockBattery) + if (!world.isRemote && itemStack.getItem() instanceof ItemBlockBattery) { - ItemBlockBattery itemBlock = (ItemBlockBattery) itemstack.getItem(); + ItemBlockBattery itemBlock = (ItemBlockBattery) itemStack.getItem(); TileBattery battery = (TileBattery) world.getBlockTileEntity(x, y, z); - battery.energy.setCapacity(TileBattery.getEnergyForTier(itemBlock.getTier(itemstack))); - battery.energy.setEnergy(itemBlock.getEnergy(itemstack)); + battery.energy.setCapacity(TileBattery.getEnergyForTier(itemBlock.getTier(itemStack))); + battery.energy.setEnergy(itemBlock.getEnergy(itemStack)); battery.updateStructure(); + world.setBlockMetadataWithNotify(x, y, z, itemBlock.getTier(itemStack), 3); } } @@ -69,6 +72,39 @@ public class BlockBattery extends BlockIOBase implements ITileEntityProvider } } + @Override + public boolean onSneakUseWrench(World world, int x, int y, int z, EntityPlayer entityPlayer, int side, float hitX, float hitY, float hitZ) + { + if (!world.isRemote) + { + TileEntity tileEntity = world.getBlockTileEntity(x, y, z); + dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0); + world.setBlock(x, y, z, 0); + } + + return true; + } + + @Override + public ArrayList getBlockDropped(World world, int x, int y, int z, int metadata, int fortune) + { + ArrayList ret = new ArrayList(); + + ItemStack itemStack = new ItemStack(this, 1); + + if (world.getBlockTileEntity(x, y, z) instanceof TileBattery) + { + TileBattery battery = (TileBattery) world.getBlockTileEntity(x, y, z); + ItemBlockBattery itemBlock = (ItemBlockBattery) itemStack.getItem(); + itemBlock.setTier(itemStack, (byte) metadata); + itemBlock.setEnergy(itemStack, battery.energy.getEnergy()); + } + + ret.add(itemStack); + + return ret; + } + @Override public boolean renderAsNormalBlock() { diff --git a/src/main/java/resonantinduction/electrical/battery/TileBattery.java b/src/main/java/resonantinduction/electrical/battery/TileBattery.java index ffe17f1d..7cefcde6 100644 --- a/src/main/java/resonantinduction/electrical/battery/TileBattery.java +++ b/src/main/java/resonantinduction/electrical/battery/TileBattery.java @@ -36,7 +36,8 @@ public class TileBattery extends TileElectrical implements IConnector 0) + if ((markDistributionUpdate || this.produce() > 0) && ticks % 5 == 0) { this.getNetwork().redistribute(); + markDistributionUpdate = false; } - if (markUpdate && ticks % 5 == 0) + if (markClientUpdate && ticks % 5 == 0) { worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); } @@ -103,9 +105,8 @@ public class TileBattery extends TileElectrical implements IConnector