diff --git a/src/main/java/refinedstorage/api/storagenet/StorageNetwork.java b/src/main/java/refinedstorage/api/storagenet/StorageNetwork.java index 5ba23bb57..ef7d7ae5b 100755 --- a/src/main/java/refinedstorage/api/storagenet/StorageNetwork.java +++ b/src/main/java/refinedstorage/api/storagenet/StorageNetwork.java @@ -31,7 +31,6 @@ import refinedstorage.tile.TileMachine; import refinedstorage.tile.TileWirelessTransmitter; import refinedstorage.tile.config.RedstoneMode; import refinedstorage.tile.controller.StorageHandler; -import refinedstorage.tile.controller.TileController; import refinedstorage.tile.controller.WirelessGridHandler; import java.util.*; @@ -82,7 +81,7 @@ public class StorageNetwork { public StorageNetwork(BlockPos pos, World world) { this.pos = pos; - setWorld(world); + onAdded(world); } public StorageNetwork(BlockPos pos) { @@ -111,23 +110,6 @@ public class StorageNetwork { return pos; } - public void setWorld(World world) { - this.world = world; - this.type = (EnumControllerType) world.getBlockState(pos).getValue(BlockController.TYPE); - - for (BlockPos machine : machinesToLoad) { - TileEntity tile = world.getTileEntity(machine); - - if (tile instanceof TileMachine) { - ((TileMachine) tile).forceConnect(this); - - machines.add((TileMachine) tile); - } - } - - ((TileController) world.getTileEntity(pos)).setNetwork(this); - } - public World getWorld() { return world; } @@ -155,6 +137,9 @@ public class StorageNetwork { syncMachines(); } + // @todo: If the chunk unloads, and we come back to the chunk + // the machine tile will be reset to a new tile instance and nothing will work + for (ICraftingTask taskToCancel : craftingTasksToCancel) { taskToCancel.onCancelled(this); } @@ -245,7 +230,7 @@ public class StorageNetwork { return wirelessGridRange; } - private void disconnectAll() { + public void disconnectAll() { for (TileMachine machine : machines) { machine.onDisconnected(world); } @@ -253,6 +238,25 @@ public class StorageNetwork { machines.clear(); } + public void onRemoved() { + markDirty(); + } + + public void onAdded(World world) { + this.world = world; + this.type = (EnumControllerType) world.getBlockState(pos).getValue(BlockController.TYPE); + + for (BlockPos machine : machinesToLoad) { + TileEntity tile = world.getTileEntity(machine); + + if (tile instanceof TileMachine) { + ((TileMachine) tile).forceConnect(this); + + machines.add((TileMachine) tile); + } + } + } + public List getItems() { return items; } diff --git a/src/main/java/refinedstorage/api/storagenet/StorageNetworkEventHandler.java b/src/main/java/refinedstorage/api/storagenet/StorageNetworkEventHandler.java index f6fb2a216..b512cd0f8 100755 --- a/src/main/java/refinedstorage/api/storagenet/StorageNetworkEventHandler.java +++ b/src/main/java/refinedstorage/api/storagenet/StorageNetworkEventHandler.java @@ -15,7 +15,7 @@ public class StorageNetworkEventHandler { if (networks != null) { for (StorageNetwork network : networks.values()) { if (network.getWorld() == null) { - network.setWorld(e.world); + network.onAdded(e.world); } network.update(); diff --git a/src/main/java/refinedstorage/api/storagenet/StorageNetworkRegistry.java b/src/main/java/refinedstorage/api/storagenet/StorageNetworkRegistry.java index 0849dfaf8..0d9627cd5 100755 --- a/src/main/java/refinedstorage/api/storagenet/StorageNetworkRegistry.java +++ b/src/main/java/refinedstorage/api/storagenet/StorageNetworkRegistry.java @@ -16,6 +16,13 @@ public class StorageNetworkRegistry { NETWORKS.get(dimension).put(network.getPos(), network); } + public static void remove(BlockPos pos, int dimension) { + if (get(dimension) != null) { + get(dimension).get(pos).onRemoved(); + get(dimension).remove(pos); + } + } + public static StorageNetwork get(BlockPos pos, int dimension) { return get(dimension) == null ? null : get(dimension).get(pos); } diff --git a/src/main/java/refinedstorage/block/BlockController.java b/src/main/java/refinedstorage/block/BlockController.java index a0df41f57..2c8f48e89 100755 --- a/src/main/java/refinedstorage/block/BlockController.java +++ b/src/main/java/refinedstorage/block/BlockController.java @@ -90,22 +90,29 @@ public class BlockController extends BlockBase { } @Override - public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack itemStack) { + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack stack) { if (!world.isRemote) { StorageNetwork network = new StorageNetwork(pos, world); - NBTTagCompound tag = itemStack.getTagCompound(); + NBTTagCompound tag = stack.getTagCompound(); if (tag != null && tag.hasKey(StorageNetwork.NBT_ENERGY)) { network.getEnergy().receiveEnergy(tag.getInteger(StorageNetwork.NBT_ENERGY), false); } StorageNetworkRegistry.add(network, world.provider.getDimension()); - - ((TileController) world.getTileEntity(pos)).setNetwork(network); } - super.onBlockPlacedBy(world, pos, state, player, itemStack); + super.onBlockPlacedBy(world, pos, state, player, stack); + } + + @Override + public void breakBlock(World world, BlockPos pos, IBlockState state) { + if (!world.isRemote) { + StorageNetworkRegistry.remove(pos, world.provider.getDimension()); + } + + super.breakBlock(world, pos, state); } @Override diff --git a/src/main/java/refinedstorage/tile/controller/TileController.java b/src/main/java/refinedstorage/tile/controller/TileController.java index d49db5adb..9ea889859 100755 --- a/src/main/java/refinedstorage/tile/controller/TileController.java +++ b/src/main/java/refinedstorage/tile/controller/TileController.java @@ -10,6 +10,7 @@ import net.minecraft.util.EnumFacing; import net.minecraftforge.fml.common.network.ByteBufUtils; import refinedstorage.RefinedStorageBlocks; import refinedstorage.api.storagenet.StorageNetwork; +import refinedstorage.api.storagenet.StorageNetworkRegistry; import refinedstorage.block.BlockController; import refinedstorage.block.EnumControllerType; import refinedstorage.container.ContainerController; @@ -32,15 +33,19 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr private EnumControllerType type; private RedstoneMode redstoneMode; - public void setNetwork(StorageNetwork network) { - this.network = network; + public StorageNetwork getNetwork() { + if (network == null) { + network = StorageNetworkRegistry.get(pos, worldObj.provider.getDimension()); + } + + return network; } @Override public NBTTagCompound writeUpdate(NBTTagCompound tag) { super.writeUpdate(tag); - tag.setInteger(StorageNetwork.NBT_ENERGY, network != null ? network.getEnergy().getEnergyStored() : 0); + tag.setInteger(StorageNetwork.NBT_ENERGY, getNetwork() != null ? getNetwork().getEnergy().getEnergyStored() : 0); return tag; } @@ -54,16 +59,16 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr @Override public int receiveEnergy(EnumFacing from, int maxReceive, boolean simulate) { - return network.getEnergy().receiveEnergy(maxReceive, simulate); + return getNetwork().getEnergy().receiveEnergy(maxReceive, simulate); } @Override public int getEnergyStored(EnumFacing from) { - return network.getEnergy().getEnergyStored(); + return getNetwork().getEnergy().getEnergyStored(); } public int getEnergyScaled(int i) { - float stored = worldObj.isRemote ? energy : network.getEnergy().getEnergyStored(); + float stored = worldObj.isRemote ? energy : getNetwork().getEnergy().getEnergyStored(); float max = StorageNetwork.ENERGY_CAPACITY; return (int) (stored / max * (float) i); @@ -71,7 +76,7 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr @Override public int getMaxEnergyStored(EnumFacing from) { - return network.getEnergy().getMaxEnergyStored(); + return getNetwork().getEnergy().getMaxEnergyStored(); } @Override @@ -81,12 +86,12 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr @Override public RedstoneMode getRedstoneMode() { - return worldObj.isRemote ? redstoneMode : network.getRedstoneMode(); + return worldObj.isRemote ? redstoneMode : getNetwork().getRedstoneMode(); } @Override public void setRedstoneMode(RedstoneMode mode) { - network.setRedstoneMode(mode); + getNetwork().setRedstoneMode(mode); } public List getClientMachines() { @@ -133,14 +138,14 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr @Override public void writeContainerData(ByteBuf buf) { - buf.writeInt(network.getEnergy().getEnergyStored()); - buf.writeInt(network.getEnergyUsage()); + buf.writeInt(getNetwork().getEnergy().getEnergyStored()); + buf.writeInt(getNetwork().getEnergyUsage()); - buf.writeInt(network.getRedstoneMode().id); + buf.writeInt(getNetwork().getRedstoneMode().id); List m = new ArrayList(); - for (TileMachine machine : network.getMachines()) { + for (TileMachine machine : getNetwork().getMachines()) { if (machine.canUpdate()) { IBlockState state = worldObj.getBlockState(machine.getPos());