From 0abd9cf7798a181ede859e7d48314aaf08073f4c Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Sat, 2 Jul 2016 20:35:25 +0200 Subject: [PATCH] 4: Move constant storage rebuilding out --- .../api/network/INetworkMaster.java | 6 - .../api/storage/IGroupedStorage.java | 6 + .../apiimpl/storage/GroupedStorage.java | 20 +++- .../tile/IConnectionHandler.java | 9 ++ .../java/refinedstorage/tile/TileCrafter.java | 13 ++- .../refinedstorage/tile/TileDiskDrive.java | 17 ++- .../java/refinedstorage/tile/TileSlave.java | 18 ++- .../java/refinedstorage/tile/TileStorage.java | 13 ++- .../tile/controller/TileController.java | 109 ++++++------------ .../externalstorage/TileExternalStorage.java | 14 ++- 10 files changed, 141 insertions(+), 84 deletions(-) create mode 100755 src/main/java/refinedstorage/tile/IConnectionHandler.java diff --git a/src/main/java/refinedstorage/api/network/INetworkMaster.java b/src/main/java/refinedstorage/api/network/INetworkMaster.java index a06e1f306..c3e7ad226 100755 --- a/src/main/java/refinedstorage/api/network/INetworkMaster.java +++ b/src/main/java/refinedstorage/api/network/INetworkMaster.java @@ -8,7 +8,6 @@ import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.ICraftingTask; import refinedstorage.api.storage.CompareFlags; import refinedstorage.api.storage.IGroupedStorage; -import refinedstorage.api.storage.IStorage; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -65,11 +64,6 @@ public interface INetworkMaster { */ IGroupedStorage getStorage(); - /** - * @return The storages connected to this network - */ - List getStorages(); - /** * @return The crafting tasks in this network, do NOT modify this list */ diff --git a/src/main/java/refinedstorage/api/storage/IGroupedStorage.java b/src/main/java/refinedstorage/api/storage/IGroupedStorage.java index 024dfe1fd..2eec3c3de 100755 --- a/src/main/java/refinedstorage/api/storage/IGroupedStorage.java +++ b/src/main/java/refinedstorage/api/storage/IGroupedStorage.java @@ -4,6 +4,7 @@ import net.minecraft.item.ItemStack; import refinedstorage.api.network.INetworkMaster; import java.util.Collection; +import java.util.List; /** * This holds all items from all the connected storages from a {@link INetworkMaster}. @@ -47,4 +48,9 @@ public interface IGroupedStorage { * @return All stacks in this storage network */ Collection getStacks(); + + /** + * @return The storages connected to this network + */ + List getStorages(); } diff --git a/src/main/java/refinedstorage/apiimpl/storage/GroupedStorage.java b/src/main/java/refinedstorage/apiimpl/storage/GroupedStorage.java index 5a5ccacb5..ee69e74d4 100755 --- a/src/main/java/refinedstorage/apiimpl/storage/GroupedStorage.java +++ b/src/main/java/refinedstorage/apiimpl/storage/GroupedStorage.java @@ -7,13 +7,18 @@ import net.minecraft.item.ItemStack; import refinedstorage.RefinedStorageUtils; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.network.INetworkSlave; import refinedstorage.api.storage.IGroupedStorage; import refinedstorage.api.storage.IStorage; +import refinedstorage.api.storage.IStorageProvider; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; public class GroupedStorage implements IGroupedStorage { private INetworkMaster network; + private List storages = new ArrayList(); private Multimap stacks = ArrayListMultimap.create(); private boolean rebuilding; @@ -25,9 +30,17 @@ public class GroupedStorage implements IGroupedStorage { public void rebuild() { this.rebuilding = true; + storages.clear(); + + for (INetworkSlave slave : network.getSlaves()) { + if (slave.canUpdate() && slave instanceof IStorageProvider) { + ((IStorageProvider) slave).addStorages(storages); + } + } + stacks.clear(); - for (IStorage storage : network.getStorages()) { + for (IStorage storage : storages) { for (ItemStack stack : storage.getItems()) { add(stack); } @@ -102,4 +115,9 @@ public class GroupedStorage implements IGroupedStorage { public Collection getStacks() { return stacks.values(); } + + @Override + public List getStorages() { + return storages; + } } diff --git a/src/main/java/refinedstorage/tile/IConnectionHandler.java b/src/main/java/refinedstorage/tile/IConnectionHandler.java new file mode 100755 index 000000000..ef4e359f2 --- /dev/null +++ b/src/main/java/refinedstorage/tile/IConnectionHandler.java @@ -0,0 +1,9 @@ +package refinedstorage.tile; + +import refinedstorage.api.network.INetworkMaster; + +public interface IConnectionHandler { + void onConnected(INetworkMaster network); + + void onDisconnected(INetworkMaster network); +} diff --git a/src/main/java/refinedstorage/tile/TileCrafter.java b/src/main/java/refinedstorage/tile/TileCrafter.java index 45847deb7..26ccf65b1 100755 --- a/src/main/java/refinedstorage/tile/TileCrafter.java +++ b/src/main/java/refinedstorage/tile/TileCrafter.java @@ -14,6 +14,7 @@ import refinedstorage.RefinedStorageItems; import refinedstorage.RefinedStorageUtils; import refinedstorage.api.autocrafting.ICraftingPatternContainer; import refinedstorage.api.autocrafting.ICraftingTask; +import refinedstorage.api.network.INetworkMaster; import refinedstorage.container.ContainerCrafter; import refinedstorage.inventory.BasicItemHandler; import refinedstorage.inventory.BasicItemValidator; @@ -21,7 +22,7 @@ import refinedstorage.inventory.IItemValidator; import refinedstorage.item.ItemPattern; import refinedstorage.item.ItemUpgrade; -public class TileCrafter extends TileSlave implements ICraftingPatternContainer { +public class TileCrafter extends TileSlave implements ICraftingPatternContainer, IConnectionHandler { private BasicItemHandler patterns = new BasicItemHandler(9, this, new IItemValidator() { @Override public boolean valid(ItemStack stack) { @@ -127,4 +128,14 @@ public class TileCrafter extends TileSlave implements ICraftingPatternContainer public boolean hasCapability(Capability capability, EnumFacing facing) { return (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY && facing != getDirection()) || super.hasCapability(capability, facing); } + + @Override + public void onConnected(INetworkMaster network) { + network.rebuildPatterns(); + } + + @Override + public void onDisconnected(INetworkMaster network) { + network.rebuildPatterns(); + } } diff --git a/src/main/java/refinedstorage/tile/TileDiskDrive.java b/src/main/java/refinedstorage/tile/TileDiskDrive.java index 35aabeb4f..24030a784 100755 --- a/src/main/java/refinedstorage/tile/TileDiskDrive.java +++ b/src/main/java/refinedstorage/tile/TileDiskDrive.java @@ -13,6 +13,7 @@ import net.minecraftforge.items.ItemHandlerHelper; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageItems; import refinedstorage.RefinedStorageUtils; +import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.storage.IStorage; import refinedstorage.api.storage.IStorageProvider; import refinedstorage.apiimpl.storage.NBTStorage; @@ -25,7 +26,7 @@ import refinedstorage.tile.config.*; import java.util.List; -public class TileDiskDrive extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig { +public class TileDiskDrive extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig, IConnectionHandler { public class Storage extends NBTStorage { public Storage(ItemStack disk) { super(disk.getTagCompound(), EnumStorageType.getById(disk.getItemDamage()).getCapacity(), TileDiskDrive.this); @@ -62,6 +63,10 @@ public class TileDiskDrive extends TileSlave implements IStorageProvider, IStora } else { storages[slot] = new Storage(disk); } + + if (network != null) { + network.getStorage().rebuild(); + } } @Override @@ -304,4 +309,14 @@ public class TileDiskDrive extends TileSlave implements IStorageProvider, IStora public boolean hasCapability(Capability capability, EnumFacing facing) { return capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || super.hasCapability(capability, facing); } + + @Override + public void onConnected(INetworkMaster network) { + network.getStorage().rebuild(); + } + + @Override + public void onDisconnected(INetworkMaster network) { + network.getStorage().rebuild(); + } } diff --git a/src/main/java/refinedstorage/tile/TileSlave.java b/src/main/java/refinedstorage/tile/TileSlave.java index 37ae190c6..09bc644b7 100755 --- a/src/main/java/refinedstorage/tile/TileSlave.java +++ b/src/main/java/refinedstorage/tile/TileSlave.java @@ -23,6 +23,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync private RedstoneMode redstoneMode = RedstoneMode.IGNORE; private boolean active; + private boolean update; protected boolean connected; protected INetworkMaster network; @@ -46,6 +47,19 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync if (!worldObj.isRemote) { if (ticks == 0) { refreshConnection(worldObj); + } else { + // @TODO: Fix updating twice on block placement + if (update != canUpdate()) { + if (network != null && this instanceof IConnectionHandler) { + if (canUpdate()) { + ((IConnectionHandler) this).onConnected(network); + } else { + ((IConnectionHandler) this).onDisconnected(network); + } + } + + update = canUpdate(); + } } if (isActive()) { @@ -165,9 +179,9 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync @Override public void setRedstoneMode(RedstoneMode mode) { - markDirty(); - this.redstoneMode = mode; + + markDirty(); } @Override diff --git a/src/main/java/refinedstorage/tile/TileStorage.java b/src/main/java/refinedstorage/tile/TileStorage.java index 3925676b6..1534b9cb9 100755 --- a/src/main/java/refinedstorage/tile/TileStorage.java +++ b/src/main/java/refinedstorage/tile/TileStorage.java @@ -10,6 +10,7 @@ import net.minecraftforge.items.ItemHandlerHelper; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageBlocks; import refinedstorage.RefinedStorageUtils; +import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.storage.IStorage; import refinedstorage.api.storage.IStorageProvider; import refinedstorage.apiimpl.storage.NBTStorage; @@ -22,7 +23,7 @@ import refinedstorage.tile.config.*; import java.util.List; -public class TileStorage extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig { +public class TileStorage extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig, IConnectionHandler { class Storage extends NBTStorage { public Storage() { super(TileStorage.this.getStorageTag(), TileStorage.this.getCapacity(), TileStorage.this); @@ -256,4 +257,14 @@ public class TileStorage extends TileSlave implements IStorageProvider, IStorage public int getCapacity() { return getType().getCapacity(); } + + @Override + public void onConnected(INetworkMaster network) { + network.getStorage().rebuild(); + } + + @Override + public void onDisconnected(INetworkMaster network) { + network.getStorage().rebuild(); + } } diff --git a/src/main/java/refinedstorage/tile/controller/TileController.java b/src/main/java/refinedstorage/tile/controller/TileController.java index e55668b05..8acc78e76 100755 --- a/src/main/java/refinedstorage/tile/controller/TileController.java +++ b/src/main/java/refinedstorage/tile/controller/TileController.java @@ -27,7 +27,6 @@ import refinedstorage.api.network.IWirelessGridHandler; import refinedstorage.api.storage.CompareFlags; import refinedstorage.api.storage.IGroupedStorage; import refinedstorage.api.storage.IStorage; -import refinedstorage.api.storage.IStorageProvider; import refinedstorage.apiimpl.autocrafting.BasicCraftingTask; import refinedstorage.apiimpl.autocrafting.CraftingPattern; import refinedstorage.apiimpl.autocrafting.ProcessingCraftingTask; @@ -40,6 +39,7 @@ import refinedstorage.container.ContainerController; import refinedstorage.container.ContainerGrid; import refinedstorage.item.ItemPattern; import refinedstorage.network.MessageGridItems; +import refinedstorage.tile.IConnectionHandler; import refinedstorage.tile.ISynchronizedContainer; import refinedstorage.tile.TileBase; import refinedstorage.tile.TileCrafter; @@ -102,36 +102,52 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR @Override public void update() { if (!worldObj.isRemote) { - boolean forceUpdate = !slavesToAdd.isEmpty() || !slavesToRemove.isEmpty(); + for (INetworkSlave slave : slavesToAdd) { + slaves.add(slave); - for (INetworkSlave newSlave : slavesToAdd) { - boolean found = false; - - for (int i = 0; i < slaves.size(); ++i) { - INetworkSlave slave = slaves.get(i); - - if (slave.getPosition().equals(newSlave.getPosition())) { - slaves.set(i, newSlave); - - found = true; - - break; - } - } - - if (!found) { - slaves.add(newSlave); + if (slave instanceof IConnectionHandler) { + ((IConnectionHandler) slave).onConnected(this); } } slavesToAdd.clear(); - slaves.removeAll(slavesToRemove); + for (INetworkSlave slave : slavesToRemove) { + slaves.remove(slave); + + if (slave instanceof IConnectionHandler) { + ((IConnectionHandler) slave).onDisconnected(this); + } + } + slavesToRemove.clear(); if (canRun()) { - if (ticks % 20 == 0 || forceUpdate) { - updateSlaves(); + if (ticks % 20 == 0) { + Collections.sort(storages, new Comparator() { + @Override + public int compare(IStorage left, IStorage right) { + int leftStored = left.getStored(); + int rightStored = right.getStored(); + + if (leftStored == rightStored) { + return 0; + } + + return (leftStored > rightStored) ? -1 : 1; + } + }); + + Collections.sort(storages, new Comparator() { + @Override + public int compare(IStorage left, IStorage right) { + if (left.getPriority() == right.getPriority()) { + return 0; + } + + return (left.getPriority() > right.getPriority()) ? -1 : 1; + } + }); } for (ICraftingTask taskToCancel : craftingTasksToCancel) { @@ -180,8 +196,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR if (!canRun() && !slaves.isEmpty()) { disconnectSlaves(); - - updateSlaves(); } if (couldRun != canRun()) { @@ -252,11 +266,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR return storage; } - @Override - public List getStorages() { - return storages; - } - @Override public List getCraftingTasks() { return craftingTasks; @@ -369,48 +378,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR } } - private void updateSlaves() { - this.storages.clear(); - this.patterns.clear(); - - for (INetworkSlave slave : slaves) { - if (!slave.canUpdate()) { - continue; - } - - if (slave instanceof IStorageProvider) { - ((IStorageProvider) slave).addStorages(storages); - } - } - - Collections.sort(storages, new Comparator() { - @Override - public int compare(IStorage left, IStorage right) { - int leftStored = left.getStored(); - int rightStored = right.getStored(); - - if (leftStored == rightStored) { - return 0; - } - - return (leftStored > rightStored) ? -1 : 1; - } - }); - - Collections.sort(storages, new Comparator() { - @Override - public int compare(IStorage left, IStorage right) { - if (left.getPriority() == right.getPriority()) { - return 0; - } - - return (left.getPriority() > right.getPriority()) ? -1 : 1; - } - }); - - storage.rebuild(); - } - @Override public void sendStorageToClient() { if (!storage.isRebuilding()) { diff --git a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java index 972372794..2ce6453e8 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java @@ -10,11 +10,13 @@ import net.minecraftforge.items.IItemHandler; import powercrystals.minefactoryreloaded.api.IDeepStorageUnit; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageUtils; +import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.storage.IStorage; import refinedstorage.api.storage.IStorageProvider; import refinedstorage.container.ContainerStorage; import refinedstorage.inventory.BasicItemHandler; import refinedstorage.network.MessagePriorityUpdate; +import refinedstorage.tile.IConnectionHandler; import refinedstorage.tile.IStorageGui; import refinedstorage.tile.TileSlave; import refinedstorage.tile.config.ICompareConfig; @@ -25,7 +27,7 @@ import refinedstorage.tile.config.ModeConstants; import java.util.ArrayList; import java.util.List; -public class TileExternalStorage extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig { +public class TileExternalStorage extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig, IConnectionHandler { public static final String NBT_PRIORITY = "Priority"; public static final String NBT_COMPARE = "Compare"; public static final String NBT_MODE = "Mode"; @@ -247,4 +249,14 @@ public class TileExternalStorage extends TileSlave implements IStorageProvider, public IItemHandler getFilters() { return filters; } + + @Override + public void onConnected(INetworkMaster network) { + network.getStorage().rebuild(); + } + + @Override + public void onDisconnected(INetworkMaster network) { + network.getStorage().rebuild(); + } }