diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f4ffb11b..0b2eeebef 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Refined Storage Changelog +### 0.7.17 +When updating to this version, you'll have to break and replace your controller. + +**Bugfixes** +- Fixed controller not working after leaving chunk +- Fixed machines not working when leaving chunk +- Rewrote storage networks: they are now saved to disk, so big systems won't lag when rejoining a chunk + ### 0.7.16 **Features** - Added support for Storage Drawers void upgrade diff --git a/src/main/java/refinedstorage/api/network/INetworkSlave.java b/src/main/java/refinedstorage/api/network/INetworkSlave.java index f8bdd53a2..fa2ccd7e4 100755 --- a/src/main/java/refinedstorage/api/network/INetworkSlave.java +++ b/src/main/java/refinedstorage/api/network/INetworkSlave.java @@ -5,9 +5,6 @@ import net.minecraft.world.World; /** * Represents a slave or machine in the storage network. - * - * Make sure you implement {@link Object#hashCode()} or the slave will not get properly removed or added by the storage master. - * Typically the hash code from {@link INetworkSlave#getPosition()} is used. */ public interface INetworkSlave { /** @@ -15,16 +12,16 @@ public interface INetworkSlave { */ void updateSlave(); + /** + * @return If the slave can send a connectivity update (for most slaves this is true, for cables it's false) + */ + boolean canSendConnectivityUpdate(); + /** * @return The energy usage of this slave */ int getEnergyUsage(); - /** - * Responsible for sending connectivity block updates - */ - void updateConnectivity(); - /** * @return The position of this slave in the world */ diff --git a/src/main/java/refinedstorage/api/network/NetworkMaster.java b/src/main/java/refinedstorage/api/network/NetworkMaster.java index ed087c1e7..30b16087f 100755 --- a/src/main/java/refinedstorage/api/network/NetworkMaster.java +++ b/src/main/java/refinedstorage/api/network/NetworkMaster.java @@ -6,7 +6,6 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; @@ -54,10 +53,10 @@ public class NetworkMaster { private List storages = new ArrayList(); - private List slaves = new ArrayList(); - private List slavesToAdd = new ArrayList(); + private List slaves = new ArrayList(); + private List slavesToAdd = new ArrayList(); private List slavesToLoad = new ArrayList(); - private List slavesToRemove = new ArrayList(); + private List slavesToRemove = new ArrayList(); private List patterns = new ArrayList(); @@ -123,7 +122,7 @@ public class NetworkMaster { } public void update() { - for (INetworkSlave slave : slavesToAdd) { + for (BlockPos slave : slavesToAdd) { if (!slaves.contains(slave)) { slaves.add(slave); } @@ -140,12 +139,13 @@ public class NetworkMaster { syncMachines(); } - for (INetworkSlave slave : slaves) { + Iterator slaves = getSlaves(); + while (slaves.hasNext()) { + INetworkSlave slave = slaves.next(); + if (slave.canUpdate()) { slave.updateSlave(); } - - slave.updateConnectivity(); } for (ICraftingTask taskToCancel : craftingTasksToCancel) { @@ -210,17 +210,34 @@ public class NetworkMaster { ticks++; } - public List getSlaves() { - return slaves; + public Iterator getSlaves() { + return new Iterator() { + private int index; + + @Override + public boolean hasNext() { + return index < slaves.size(); + } + + @Override + public INetworkSlave next() { + return world.getTileEntity(slaves.get(index++)).getCapability(RefinedStorageCapabilities.NETWORK_SLAVE_CAPABILITY, null); + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + }; } - public void addSlave(INetworkSlave slave) { + public void addSlave(BlockPos slave) { slavesToAdd.add(slave); markDirty(); } - public void removeSlave(INetworkSlave slave) { + public void removeSlave(BlockPos slave) { slavesToRemove.add(slave); markDirty(); @@ -239,11 +256,13 @@ public class NetworkMaster { } public void disconnectAll() { - for (INetworkSlave slave : slaves) { - slave.disconnect(world); + Iterator slaves = getSlaves(); + + while (slaves.hasNext()) { + slaves.next().disconnect(world); } - slaves.clear(); + this.slaves.clear(); } public void onRemoved() { @@ -255,16 +274,14 @@ public class NetworkMaster { this.type = (EnumControllerType) world.getBlockState(pos).getValue(BlockController.TYPE); for (BlockPos slavePos : slavesToLoad) { - TileEntity tile = world.getTileEntity(slavePos); + INetworkSlave slave = world.getTileEntity(slavePos).getCapability(RefinedStorageCapabilities.NETWORK_SLAVE_CAPABILITY, null); - if (tile.hasCapability(RefinedStorageCapabilities.NETWORK_SLAVE_CAPABILITY, null)) { - INetworkSlave slave = tile.getCapability(RefinedStorageCapabilities.NETWORK_SLAVE_CAPABILITY, null); + slave.forceConnect(this); - slave.forceConnect(this); - - slaves.add(slave); - } + slaves.add(slavePos); } + + this.slavesToLoad.clear(); } public List getItems() { @@ -359,7 +376,10 @@ public class NetworkMaster { this.storages.clear(); this.patterns.clear(); - for (INetworkSlave slave : slaves) { + Iterator slaves = getSlaves(); + while (slaves.hasNext()) { + INetworkSlave slave = slaves.next(); + if (!slave.canUpdate()) { continue; } @@ -621,12 +641,12 @@ public class NetworkMaster { NBTTagList slavesTag = new NBTTagList(); - for (INetworkSlave slave : slaves) { + for (BlockPos slave : slaves) { NBTTagCompound slaveTag = new NBTTagCompound(); - slaveTag.setInteger(NBT_SLAVE_X, slave.getPosition().getX()); - slaveTag.setInteger(NBT_SLAVE_Y, slave.getPosition().getY()); - slaveTag.setInteger(NBT_SLAVE_Z, slave.getPosition().getZ()); + slaveTag.setInteger(NBT_SLAVE_X, slave.getX()); + slaveTag.setInteger(NBT_SLAVE_Y, slave.getY()); + slaveTag.setInteger(NBT_SLAVE_Z, slave.getZ()); slavesTag.appendTag(slaveTag); } diff --git a/src/main/java/refinedstorage/tile/TileCable.java b/src/main/java/refinedstorage/tile/TileCable.java index 854aa0913..e1824d435 100755 --- a/src/main/java/refinedstorage/tile/TileCable.java +++ b/src/main/java/refinedstorage/tile/TileCable.java @@ -14,8 +14,8 @@ public class TileCable extends TileSlave { } @Override - public void updateConnectivity() { - // NO OP + public boolean canSendConnectivityUpdate() { + return false; } @Override diff --git a/src/main/java/refinedstorage/tile/TileSlave.java b/src/main/java/refinedstorage/tile/TileSlave.java index 3e8a46153..67c391653 100755 --- a/src/main/java/refinedstorage/tile/TileSlave.java +++ b/src/main/java/refinedstorage/tile/TileSlave.java @@ -6,7 +6,9 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.Capability; import refinedstorage.RefinedStorageUtils; +import refinedstorage.api.RefinedStorageCapabilities; import refinedstorage.api.network.INetworkSlave; import refinedstorage.api.network.NetworkMaster; import refinedstorage.api.network.NetworkMasterRegistry; @@ -37,8 +39,13 @@ public abstract class TileSlave extends TileBase implements ISynchronizedContain } @Override - public void updateConnectivity() { - if (wasActive != isActive()) { + public boolean canSendConnectivityUpdate() { + return true; + } + + @Override + public void update() { + if (canSendConnectivityUpdate() && wasActive != isActive()) { wasActive = isActive(); RefinedStorageUtils.updateBlock(worldObj, pos); @@ -51,7 +58,7 @@ public abstract class TileSlave extends TileBase implements ISynchronizedContain this.network = network; this.connected = true; - this.network.addSlave(this); + this.network.addSlave(pos); world.notifyNeighborsOfStateChange(pos, getBlockType()); } @@ -68,7 +75,7 @@ public abstract class TileSlave extends TileBase implements ISynchronizedContain this.connected = false; if (this.network != null) { - this.network.removeSlave(this); + this.network.removeSlave(pos); this.network = null; } @@ -93,11 +100,13 @@ public abstract class TileSlave extends TileBase implements ISynchronizedContain } private TileController searchController(World world, BlockPos current, Set visited) { - if (visited.contains(current.getX() + "," + current.getY() + "," + current.getZ())) { + String id = current.getX() + "," + current.getY() + "," + current.getZ(); + + if (visited.contains(id)) { return null; } - visited.add(current.getX() + "," + current.getY() + "," + current.getZ()); + visited.add(id); TileEntity tile = world.getTileEntity(current); @@ -193,20 +202,16 @@ public abstract class TileSlave extends TileBase implements ISynchronizedContain } @Override - public boolean equals(Object other) { - if (other == this) { - return true; + public T getCapability(Capability capability, EnumFacing facing) { + if (capability == RefinedStorageCapabilities.NETWORK_SLAVE_CAPABILITY) { + return (T) this; } - if (!(other instanceof TileSlave)) { - return false; - } - - return ((TileSlave) other).getPos().equals(pos); + return super.getCapability(capability, facing); } @Override - public int hashCode() { - return pos.hashCode(); + public boolean hasCapability(Capability capability, EnumFacing facing) { + return capability == RefinedStorageCapabilities.NETWORK_SLAVE_CAPABILITY || super.hasCapability(capability, facing); } } diff --git a/src/main/java/refinedstorage/tile/controller/TileController.java b/src/main/java/refinedstorage/tile/controller/TileController.java index f6331b95a..8044400d6 100755 --- a/src/main/java/refinedstorage/tile/controller/TileController.java +++ b/src/main/java/refinedstorage/tile/controller/TileController.java @@ -21,6 +21,7 @@ import refinedstorage.tile.config.IRedstoneModeConfig; import refinedstorage.tile.config.RedstoneMode; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; public class TileController extends TileBase implements IEnergyReceiver, ISynchronizedContainer, IRedstoneModeConfig { @@ -144,9 +145,12 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr buf.writeInt(getNetwork().getRedstoneMode().id); - List slaves = new ArrayList(); + List clientSlaves = new ArrayList(); + + Iterator slaves = getNetwork().getSlaves(); + while (slaves.hasNext()) { + INetworkSlave slave = slaves.next(); - for (INetworkSlave slave : getNetwork().getSlaves()) { if (slave.canUpdate()) { IBlockState state = worldObj.getBlockState(slave.getPosition()); @@ -156,22 +160,22 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr clientSlave.amount = 1; clientSlave.stack = new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state)); - if (slaves.contains(clientSlave)) { - for (ClientSlave other : slaves) { + if (clientSlaves.contains(clientSlave)) { + for (ClientSlave other : clientSlaves) { if (other.equals(clientSlave)) { other.amount++; break; } } } else { - slaves.add(clientSlave); + clientSlaves.add(clientSlave); } } } - buf.writeInt(slaves.size()); + buf.writeInt(clientSlaves.size()); - for (ClientSlave slave : slaves) { + for (ClientSlave slave : clientSlaves) { buf.writeInt(slave.energyUsage); buf.writeInt(slave.amount); ByteBufUtils.writeItemStack(buf, slave.stack);