From c126234f2c90168ef3dfcf678d1503ee724be2e7 Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Sat, 1 Oct 2016 13:38:26 +0200 Subject: [PATCH] Anoter go at fixing #389, Part 2 --- .../api/autocrafting/task/CraftingTask.java | 15 ++++ .../api/autocrafting/task/ICraftingTask.java | 7 +- .../autocrafting/task/CraftingTaskNormal.java | 10 +-- .../task/CraftingTaskProcessing.java | 25 +++--- .../refinedstorage/tile/TileController.java | 79 ++++++++++++------- 5 files changed, 82 insertions(+), 54 deletions(-) diff --git a/src/main/java/refinedstorage/api/autocrafting/task/CraftingTask.java b/src/main/java/refinedstorage/api/autocrafting/task/CraftingTask.java index c00acb8cb..b6943cf2d 100755 --- a/src/main/java/refinedstorage/api/autocrafting/task/CraftingTask.java +++ b/src/main/java/refinedstorage/api/autocrafting/task/CraftingTask.java @@ -78,6 +78,16 @@ public abstract class CraftingTask implements ICraftingTask { this.satisfied = satisfied; } + protected boolean hasReceivedInputs() { + for (boolean item : satisfied) { + if (!item) { + return false; + } + } + + return true; + } + public boolean[] getChecked() { return checked; } @@ -98,6 +108,11 @@ public abstract class CraftingTask implements ICraftingTask { } } + @Override + public boolean isFinished() { + return hasReceivedInputs(); + } + @Override @Nullable public ICraftingTask getChild() { diff --git a/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java b/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java index 775103a24..a40847357 100755 --- a/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java +++ b/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java @@ -32,7 +32,12 @@ public interface ICraftingTask { * @param network the network * @return true if the crafting task is done, false otherwise */ - boolean update(World world, INetworkMaster network); + void update(World world, INetworkMaster network); + + /** + * @return whether this crafting task is finished + */ + boolean isFinished(); /** * Gets called when the crafting task is cancelled. diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java index a674b07a0..e32801263 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java @@ -13,7 +13,7 @@ public class CraftingTaskNormal extends CraftingTask { } @Override - public boolean update(World world, INetworkMaster network) { + public void update(World world, INetworkMaster network) { for (int i = 0; i < pattern.getInputs().size(); ++i) { checked[i] = true; @@ -34,10 +34,8 @@ public class CraftingTaskNormal extends CraftingTask { } } - for (boolean item : satisfied) { - if (!item) { - return false; - } + if (!hasReceivedInputs()) { + return; } for (ItemStack output : pattern.getOutputs()) { @@ -49,8 +47,6 @@ public class CraftingTaskNormal extends CraftingTask { // @TODO: Handle remainder network.insertItem(byproduct, byproduct.stackSize, false); } - - return true; } @Override diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskProcessing.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskProcessing.java index 1fb4e6229..85413a0e6 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskProcessing.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskProcessing.java @@ -35,7 +35,7 @@ public class CraftingTaskProcessing extends CraftingTask { } @Override - public boolean update(World world, INetworkMaster network) { + public void update(World world, INetworkMaster network) { for (int i = 0; i < pattern.getInputs().size(); ++i) { checked[i] = true; @@ -56,8 +56,8 @@ public class CraftingTaskProcessing extends CraftingTask { } } - if (!hasTakenInputs()) { - return false; + if (!hasReceivedInputs()) { + return; } ICraftingPatternContainer container = pattern.getContainer(); @@ -77,8 +77,11 @@ public class CraftingTaskProcessing extends CraftingTask { } else { tileInUse = null; } + } - return hasReceivedOutputs(); + @Override + public boolean isFinished() { + return super.isFinished() && hasReceivedOutputs(); } private boolean hasReceivedOutputs() { @@ -91,16 +94,6 @@ public class CraftingTaskProcessing extends CraftingTask { return true; } - private boolean hasTakenInputs() { - for (boolean item : satisfied) { - if (!item) { - return false; - } - } - - return true; - } - private boolean isTileInUse(INetworkMaster network) { for (ICraftingTask task : network.getCraftingTasks()) { if (isTileInUse(task)) { @@ -132,7 +125,7 @@ public class CraftingTaskProcessing extends CraftingTask { } public boolean onInserted(ItemStack stack) { - if (!hasReceivedOutputs() && hasTakenInputs()) { + if (!hasReceivedOutputs() && hasReceivedInputs()) { for (int i = 0; i < pattern.getOutputs().size(); ++i) { ItemStack output = pattern.getOutputs().get(i); @@ -198,7 +191,7 @@ public class CraftingTaskProcessing extends CraftingTask { } } - if (hasTakenInputs()) { + if (hasReceivedInputs()) { builder.append("I=gui.refinedstorage:crafting_monitor.items_processing\n"); for (int i = 0; i < pattern.getInputs().size(); ++i) { diff --git a/src/main/java/refinedstorage/tile/TileController.java b/src/main/java/refinedstorage/tile/TileController.java index c2276797d..a8b52f0ed 100755 --- a/src/main/java/refinedstorage/tile/TileController.java +++ b/src/main/java/refinedstorage/tile/TileController.java @@ -106,9 +106,9 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR IBlockState state = tile.worldObj.getBlockState(node.getPosition()); ClientNode clientNode = new ClientNode( - new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state)), - 1, - node.getEnergyUsage() + new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state)), + 1, + node.getEnergyUsage() ); if (clientNode.getStack().getItem() != null) { @@ -275,22 +275,12 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR craftingTasksToAdd.clear(); - Iterator craftingTaskIterator = craftingTasks.iterator(); - - while (craftingTaskIterator.hasNext()) { - ICraftingTask task = craftingTaskIterator.next(); - - if (updateCraftingTask(task)) { - craftingTaskIterator.remove(); - - craftingTasksChanged = true; - } - } + updateCraftingTasks(CraftingTaskUpdateType.NORMAL); if (!craftingTasks.isEmpty() || craftingTasksChanged) { markDirty(); - updateCraftingTasks(); + updateCraftingMonitors(); } } @@ -324,9 +314,26 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR super.update(); } - private boolean updateCraftingTask(ICraftingTask task) { + enum CraftingTaskUpdateType { + NORMAL, + DELETION + } + + private void updateCraftingTasks(CraftingTaskUpdateType type) { + Iterator craftingTaskIterator = craftingTasks.iterator(); + + while (craftingTaskIterator.hasNext()) { + ICraftingTask task = craftingTaskIterator.next(); + + if (updateCraftingTask(task, type)) { + craftingTaskIterator.remove(); + } + } + } + + private boolean updateCraftingTask(ICraftingTask task, CraftingTaskUpdateType type) { if (task.getChild() != null) { - if (updateCraftingTask(task.getChild())) { + if (updateCraftingTask(task.getChild(), type)) { task.setChild(null); } @@ -335,10 +342,18 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR ICraftingPatternContainer container = task.getPattern().getContainer(); - return container != null && ticks % container.getSpeed() == 0 && task.update(worldObj, this); + if (container != null && (ticks % container.getSpeed() == 0 || type == CraftingTaskUpdateType.DELETION)) { + if (type == CraftingTaskUpdateType.NORMAL) { + task.update(worldObj, this); + } + + return task.isFinished(); + } + + return false; } - public void updateCraftingTasks() { + private void updateCraftingMonitors() { for (INetworkNode node : nodeGraph.all()) { if (node instanceof TileCraftingMonitor) { ((TileCraftingMonitor) node).dataManager.sendParameterToWatchers(TileCraftingMonitor.TASKS); @@ -474,8 +489,8 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR @Override public void sendItemStorageToClient() { worldObj.getMinecraftServer().getPlayerList().getPlayerList().stream() - .filter(player -> isWatchingGrid(player, EnumGridType.NORMAL, EnumGridType.CRAFTING, EnumGridType.PATTERN)) - .forEach(this::sendItemStorageToClient); + .filter(player -> isWatchingGrid(player, EnumGridType.NORMAL, EnumGridType.CRAFTING, EnumGridType.PATTERN)) + .forEach(this::sendItemStorageToClient); } @Override @@ -486,15 +501,15 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR @Override public void sendItemStorageDeltaToClient(ItemStack stack, int delta) { worldObj.getMinecraftServer().getPlayerList().getPlayerList().stream() - .filter(player -> isWatchingGrid(player, EnumGridType.NORMAL, EnumGridType.CRAFTING, EnumGridType.PATTERN)) - .forEach(player -> RefinedStorage.INSTANCE.network.sendTo(new MessageGridItemDelta(this, stack, delta), player)); + .filter(player -> isWatchingGrid(player, EnumGridType.NORMAL, EnumGridType.CRAFTING, EnumGridType.PATTERN)) + .forEach(player -> RefinedStorage.INSTANCE.network.sendTo(new MessageGridItemDelta(this, stack, delta), player)); } @Override public void sendFluidStorageToClient() { worldObj.getMinecraftServer().getPlayerList().getPlayerList().stream() - .filter(player -> isWatchingGrid(player, EnumGridType.FLUID)) - .forEach(this::sendFluidStorageToClient); + .filter(player -> isWatchingGrid(player, EnumGridType.FLUID)) + .forEach(this::sendFluidStorageToClient); } @Override @@ -505,8 +520,8 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR @Override public void sendFluidStorageDeltaToClient(FluidStack stack, int delta) { worldObj.getMinecraftServer().getPlayerList().getPlayerList().stream() - .filter(player -> isWatchingGrid(player, EnumGridType.FLUID)) - .forEach(player -> RefinedStorage.INSTANCE.network.sendTo(new MessageGridFluidDelta(stack, delta), player)); + .filter(player -> isWatchingGrid(player, EnumGridType.FLUID)) + .forEach(player -> RefinedStorage.INSTANCE.network.sendTo(new MessageGridFluidDelta(stack, delta), player)); } private boolean isWatchingGrid(EntityPlayer player, EnumGridType... types) { @@ -551,13 +566,17 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR itemStorage.add(ItemHandlerHelper.copyStackWithSize(stack, inserted), false); for (int i = 0; i < inserted; ++i) { - for (ICraftingTask task : craftingTasks) { + for (int j = 0; j < craftingTasks.size(); ++j) { + ICraftingTask task = craftingTasks.get(j); + if (inserted == 0) { break; } if (onInserted(stack, task)) { inserted--; + + updateCraftingTasks(CraftingTaskUpdateType.DELETION); } } } @@ -837,7 +856,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR @Override public boolean hasCapability(Capability capability, EnumFacing facing) { return capability == CapabilityEnergy.ENERGY - || (energyTesla != null && (capability == TeslaCapabilities.CAPABILITY_HOLDER || capability == TeslaCapabilities.CAPABILITY_CONSUMER)) - || super.hasCapability(capability, facing); + || (energyTesla != null && (capability == TeslaCapabilities.CAPABILITY_HOLDER || capability == TeslaCapabilities.CAPABILITY_CONSUMER)) + || super.hasCapability(capability, facing); } }