diff --git a/src/main/java/refinedstorage/api/storagenet/StorageNetwork.java b/src/main/java/refinedstorage/api/storagenet/StorageNetwork.java index 5df7087d2..9fc6365a5 100755 --- a/src/main/java/refinedstorage/api/storagenet/StorageNetwork.java +++ b/src/main/java/refinedstorage/api/storagenet/StorageNetwork.java @@ -66,6 +66,8 @@ public class StorageNetwork { private boolean couldRun; private long lastEnergyUpdate; + private int ticks; + private EnumControllerType type; private World world; @@ -91,6 +93,10 @@ public class StorageNetwork { return energy; } + public int getEnergyUsage() { + return energyUsage; + } + public BlockPos getPos() { return pos; } @@ -103,7 +109,7 @@ public class StorageNetwork { return energy.getEnergyStored() > 0 && energy.getEnergyStored() >= energyUsage && redstoneMode.isEnabled(world, pos); } - public void update(int ticks) { + public void update() { for (TileMachine machine : machinesToAdd) { if (!machines.contains(machine)) { machines.add(machine); @@ -149,8 +155,6 @@ public class StorageNetwork { } } } else if (!machines.isEmpty()) { - // Machine list should NOT be empty to trigger a disconnect - // We need to sync machines again to reset energy usage etc disconnectAll(); syncMachines(); } @@ -182,6 +186,8 @@ public class StorageNetwork { RefinedStorageUtils.updateBlock(world, pos); } } + + ticks++; } public List getMachines() { diff --git a/src/main/java/refinedstorage/api/storagenet/StorageNetworkTickHandler.java b/src/main/java/refinedstorage/api/storagenet/StorageNetworkTickHandler.java new file mode 100755 index 000000000..8c7becf35 --- /dev/null +++ b/src/main/java/refinedstorage/api/storagenet/StorageNetworkTickHandler.java @@ -0,0 +1,13 @@ +package refinedstorage.api.storagenet; + +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; + +public class StorageNetworkTickHandler { + @SubscribeEvent + public void onServerTick(TickEvent.ServerTickEvent e) { + for (StorageNetwork network : StorageNetworkRegistry.NETWORKS.values()) { + network.update(); + } + } +} diff --git a/src/main/java/refinedstorage/block/BlockController.java b/src/main/java/refinedstorage/block/BlockController.java index 60efcbf3b..b3f43cd77 100755 --- a/src/main/java/refinedstorage/block/BlockController.java +++ b/src/main/java/refinedstorage/block/BlockController.java @@ -64,8 +64,10 @@ public class BlockController extends BlockBase { @Override public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { + TileController controller = (TileController) world.getTileEntity(pos); + return super.getActualState(state, world, pos) - .withProperty(ENERGY, ((TileController) world.getTileEntity(pos)).getEnergyScaled(8)); + .withProperty(ENERGY, (int) Math.ceil((float) controller.getEnergy() / (float) StorageNetwork.ENERGY_CAPACITY * 8f)); } @Override @@ -89,8 +91,6 @@ public class BlockController extends BlockBase { @Override public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack itemStack) { - super.onBlockPlacedBy(world, pos, state, player, itemStack); - if (!world.isRemote) { StorageNetwork network = new StorageNetwork(world, pos, (EnumControllerType) state.getValue(TYPE)); @@ -104,6 +104,8 @@ public class BlockController extends BlockBase { ((TileController) world.getTileEntity(pos)).setNetwork(network); } + + super.onBlockPlacedBy(world, pos, state, player, itemStack); } @Override diff --git a/src/main/java/refinedstorage/block/BlockMachine.java b/src/main/java/refinedstorage/block/BlockMachine.java index f8c3caf2f..10e92847d 100755 --- a/src/main/java/refinedstorage/block/BlockMachine.java +++ b/src/main/java/refinedstorage/block/BlockMachine.java @@ -5,10 +5,16 @@ import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import refinedstorage.tile.TileMachine; +import refinedstorage.tile.controller.ControllerSearcher; +import refinedstorage.tile.controller.TileController; + +import java.util.HashSet; public abstract class BlockMachine extends BlockBase { public static final PropertyBool CONNECTED = PropertyBool.create("connected"); @@ -36,6 +42,19 @@ public abstract class BlockMachine extends BlockBase { .withProperty(CONNECTED, ((TileMachine) world.getTileEntity(pos)).isConnected()); } + @Override + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack stack) { + super.onBlockPlacedBy(world, pos, state, player, stack); + + if (!world.isRemote) { + TileController controller = ControllerSearcher.search(world, pos, new HashSet()); + + if (controller != null) { + ((TileMachine) world.getTileEntity(pos)).onConnected(world, controller); + } + } + } + @Override public void breakBlock(World world, BlockPos pos, IBlockState state) { if (!world.isRemote) { diff --git a/src/main/java/refinedstorage/gui/GuiController.java b/src/main/java/refinedstorage/gui/GuiController.java index 9522f3842..b5d00ceb5 100755 --- a/src/main/java/refinedstorage/gui/GuiController.java +++ b/src/main/java/refinedstorage/gui/GuiController.java @@ -3,6 +3,7 @@ package refinedstorage.gui; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderHelper; import refinedstorage.RefinedStorageUtils; +import refinedstorage.api.storagenet.StorageNetwork; import refinedstorage.container.ContainerController; import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; import refinedstorage.tile.controller.ClientMachine; @@ -45,7 +46,7 @@ public class GuiController extends GuiBase { drawTexture(x, y, 0, 0, width, height); - int barHeightNew = (int) ((float) controller.getEnergyStored(null) / (float) controller.getMaxEnergyStored(null) * (float) barHeight); + int barHeightNew = (int) ((float) controller.getEnergy() / (float) StorageNetwork.ENERGY_CAPACITY * (float) barHeight); drawTexture(x + barX, y + barY + barHeight - barHeightNew, 178, barHeight - barHeightNew, barWidth, barHeightNew); } @@ -102,7 +103,7 @@ public class GuiController extends GuiBase { } if (inBounds(barX, barY, barWidth, barHeight, mouseX, mouseY)) { - drawTooltip(mouseX, mouseY, t("misc.refinedstorage:energy_usage", controller.getEnergyUsage()) + "\n" + t("misc.refinedstorage:energy_stored", controller.getEnergyStored(null), controller.getMaxEnergyStored(null))); + drawTooltip(mouseX, mouseY, t("misc.refinedstorage:energy_usage", controller.getEnergyUsage()) + "\n" + t("misc.refinedstorage:energy_stored", controller.getEnergy(), StorageNetwork.ENERGY_CAPACITY)); } } diff --git a/src/main/java/refinedstorage/proxy/CommonProxy.java b/src/main/java/refinedstorage/proxy/CommonProxy.java index 432c96d53..e39ab0e33 100755 --- a/src/main/java/refinedstorage/proxy/CommonProxy.java +++ b/src/main/java/refinedstorage/proxy/CommonProxy.java @@ -5,6 +5,7 @@ import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; @@ -19,6 +20,7 @@ import refinedstorage.RefinedStorageItems; import refinedstorage.api.solderer.SoldererRecipeBasic; import refinedstorage.api.solderer.SoldererRegistry; import refinedstorage.api.storage.NBTStorage; +import refinedstorage.api.storagenet.StorageNetworkTickHandler; import refinedstorage.block.BlockBase; import refinedstorage.block.EnumControllerType; import refinedstorage.block.EnumGridType; @@ -483,6 +485,7 @@ public class CommonProxy { } public void init(FMLInitializationEvent e) { + MinecraftForge.EVENT_BUS.register(new StorageNetworkTickHandler()); } public void postInit(FMLPostInitializationEvent e) { diff --git a/src/main/java/refinedstorage/tile/TileMachine.java b/src/main/java/refinedstorage/tile/TileMachine.java index d47855951..dff80cd83 100755 --- a/src/main/java/refinedstorage/tile/TileMachine.java +++ b/src/main/java/refinedstorage/tile/TileMachine.java @@ -48,8 +48,6 @@ public abstract class TileMachine extends TileBase implements ISynchronizedConta if (!worldObj.isRemote) { if (ticks == 0) { block = worldObj.getBlockState(pos).getBlock(); - - searchController(worldObj); } if (wasConnected != isActive() && canSendConnectivityData()) { diff --git a/src/main/java/refinedstorage/tile/controller/TileController.java b/src/main/java/refinedstorage/tile/controller/TileController.java index 20159448b..3a206ddc7 100755 --- a/src/main/java/refinedstorage/tile/controller/TileController.java +++ b/src/main/java/refinedstorage/tile/controller/TileController.java @@ -63,7 +63,10 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr } public int getEnergyScaled(int i) { - return (int) ((float) network.getEnergy().getEnergyStored() / (float) network.getEnergy().getMaxEnergyStored() * (float) i); + float stored = worldObj.isRemote ? energy : network.getEnergy().getEnergyStored(); + float max = StorageNetwork.ENERGY_CAPACITY; + + return (int) (stored / max * (float) i); } @Override @@ -78,7 +81,7 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr @Override public RedstoneMode getRedstoneMode() { - return network.getRedstoneMode(); + return worldObj.isRemote ? redstoneMode : network.getRedstoneMode(); } @Override @@ -110,7 +113,6 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr public void readContainerData(ByteBuf buf) { this.energy = buf.readInt(); this.energyUsage = buf.readInt(); - this.redstoneMode = RedstoneMode.getById(buf.readInt()); List machines = new ArrayList(); @@ -131,10 +133,10 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr @Override public void writeContainerData(ByteBuf buf) { - buf.writeInt(getEnergyStored(null)); - buf.writeInt(energyUsage); + buf.writeInt(network.getEnergy().getEnergyStored()); + buf.writeInt(network.getEnergyUsage()); - buf.writeInt(redstoneMode.id); + buf.writeInt(network.getRedstoneMode().id); List m = new ArrayList();