diff --git a/src/main/java/refinedstorage/api/network/INetworkMaster.java b/src/main/java/refinedstorage/api/network/INetworkMaster.java index 944d379b5..d69993930 100755 --- a/src/main/java/refinedstorage/api/network/INetworkMaster.java +++ b/src/main/java/refinedstorage/api/network/INetworkMaster.java @@ -11,7 +11,6 @@ import refinedstorage.api.autocrafting.ICraftingTask; import refinedstorage.api.storage.CompareFlags; import javax.annotation.Nullable; -import java.util.Iterator; import java.util.List; public interface INetworkMaster { @@ -54,9 +53,9 @@ public interface INetworkMaster { void update(); /** - * @return A iterator with all network slaves + * @return A list with all network slaves, do NOT modify */ - Iterator getSlaves(); + List getSlaves(); /** * @param slave The slave to add diff --git a/src/main/java/refinedstorage/api/network/INetworkSlave.java b/src/main/java/refinedstorage/api/network/INetworkSlave.java index 0ff509bab..f3fbfc74e 100755 --- a/src/main/java/refinedstorage/api/network/INetworkSlave.java +++ b/src/main/java/refinedstorage/api/network/INetworkSlave.java @@ -32,7 +32,7 @@ public interface INetworkSlave { * * @param world The world */ - void onNeighborChanged(World world); + void refreshConnection(World world); /** * Called when a connection is found to the network diff --git a/src/main/java/refinedstorage/apiimpl/network/NetworkMaster.java b/src/main/java/refinedstorage/apiimpl/network/NetworkMaster.java index c0e54aa53..1011143c5 100755 --- a/src/main/java/refinedstorage/apiimpl/network/NetworkMaster.java +++ b/src/main/java/refinedstorage/apiimpl/network/NetworkMaster.java @@ -6,6 +6,7 @@ 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; @@ -58,6 +59,7 @@ public class NetworkMaster implements INetworkMaster { private List storages = new ArrayList(); private List slaves = new ArrayList(); + private List actualSlaves = new ArrayList(); private Map slaveConnectivity = new HashMap(); private List slavesToAdd = new ArrayList(); private List slavesToLoad = new ArrayList(); @@ -150,11 +152,14 @@ public class NetworkMaster implements INetworkMaster { @Override public void update() { + boolean forceUpdate = !slavesToAdd.isEmpty() || !slavesToRemove.isEmpty(); + for (BlockPos slave : slavesToAdd) { if (!slaves.contains(slave)) { slaves.add(slave); } } + slavesToAdd.clear(); slaves.removeAll(slavesToRemove); @@ -163,14 +168,11 @@ public class NetworkMaster implements INetworkMaster { int lastEnergy = energy.getEnergyStored(); if (canRun()) { - if (ticks % 20 == 0) { + if (ticks % 20 == 0 || forceUpdate) { updateSlaves(); } - Iterator slaves = getSlaves(); - while (slaves.hasNext()) { - INetworkSlave slave = slaves.next(); - + for (INetworkSlave slave : getSlaves()) { if (slave.canUpdate()) { slave.updateSlave(); } @@ -196,11 +198,13 @@ public class NetworkMaster implements INetworkMaster { for (ICraftingTask task : craftingTasksToAdd) { craftingTasks.push(task); } + craftingTasksToAdd.clear(); for (ICraftingTask task : craftingTasksToAddAsLast) { craftingTasks.add(0, task); } + craftingTasksToAddAsLast.clear(); if (!craftingTasks.empty()) { @@ -249,25 +253,8 @@ public class NetworkMaster implements INetworkMaster { } @Override - 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 List getSlaves() { + return actualSlaves; } @Override @@ -295,13 +282,11 @@ public class NetworkMaster implements INetworkMaster { } public void disconnectAll() { - Iterator slaves = getSlaves(); - - while (slaves.hasNext()) { - slaves.next().disconnect(world); + for (INetworkSlave slave : getSlaves()) { + slave.disconnect(world); } - this.slaves.clear(); + slaves.clear(); } @Override @@ -402,14 +387,24 @@ public class NetworkMaster implements INetworkMaster { private void updateSlaves() { this.energyUsage = 0; + this.actualSlaves.clear(); this.storages.clear(); this.patterns.clear(); int range = 0; - Iterator slaves = getSlaves(); - while (slaves.hasNext()) { - INetworkSlave slave = slaves.next(); + for (BlockPos slavePos : slaves) { + TileEntity tile = world.getTileEntity(slavePos); + + if (tile == null || !tile.hasCapability(RefinedStorageCapabilities.NETWORK_SLAVE_CAPABILITY, null)) { + removeSlave(slavePos); + + continue; + } + + INetworkSlave slave = tile.getCapability(RefinedStorageCapabilities.NETWORK_SLAVE_CAPABILITY, null); + + actualSlaves.add(slave); if (!slave.canUpdate()) { continue; diff --git a/src/main/java/refinedstorage/block/BlockSlave.java b/src/main/java/refinedstorage/block/BlockSlave.java index 810a3f87d..5a2a27693 100755 --- a/src/main/java/refinedstorage/block/BlockSlave.java +++ b/src/main/java/refinedstorage/block/BlockSlave.java @@ -43,7 +43,7 @@ public abstract class BlockSlave extends BlockBase { super.onBlockPlacedBy(world, pos, state, player, stack); if (!world.isRemote) { - ((TileSlave) world.getTileEntity(pos)).onNeighborChanged(world); + ((TileSlave) world.getTileEntity(pos)).refreshConnection(world); } } @@ -65,7 +65,7 @@ public abstract class BlockSlave extends BlockBase { super.neighborChanged(state, world, pos, block); if (!world.isRemote) { - ((TileSlave) world.getTileEntity(pos)).onNeighborChanged(world); + ((TileSlave) world.getTileEntity(pos)).refreshConnection(world); } } } diff --git a/src/main/java/refinedstorage/tile/TileSlave.java b/src/main/java/refinedstorage/tile/TileSlave.java index 45e76006a..cdaaf5f9e 100755 --- a/src/main/java/refinedstorage/tile/TileSlave.java +++ b/src/main/java/refinedstorage/tile/TileSlave.java @@ -82,7 +82,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync } @Override - public void onNeighborChanged(World world) { + public void refreshConnection(World world) { TileController controller = searchController(world, pos, new HashSet()); if (network == null) { diff --git a/src/main/java/refinedstorage/tile/controller/TileController.java b/src/main/java/refinedstorage/tile/controller/TileController.java index fdc4218c3..4a3c8328d 100755 --- a/src/main/java/refinedstorage/tile/controller/TileController.java +++ b/src/main/java/refinedstorage/tile/controller/TileController.java @@ -22,7 +22,6 @@ 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 { @@ -151,10 +150,7 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr if (getNetwork() != null) { 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()); @@ -164,10 +160,11 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr clientSlave.amount = 1; clientSlave.stack = new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state)); - if (clientSlaves.contains(clientSlave)) { + if (clientSlave.stack.getItem() != null && clientSlaves.contains(clientSlave)) { for (ClientSlave other : clientSlaves) { if (other.equals(clientSlave)) { other.amount++; + break; } }