From 7ea20314b2c9f0eeb68bc11f5300c7853c34fb96 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Mon, 2 Jul 2018 13:53:01 +0200 Subject: [PATCH] Fixed crafting tasks stealing from each other and causing stalls. --- .../autocrafting/task/CraftingTask.java | 57 ++++++++++++------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java index 89354ec2f..55fde94ad 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java @@ -52,6 +52,9 @@ public class CraftingTask implements ICraftingTask { private static final String NBT_MISSING = "Missing"; private static final String NBT_EXECUTION_STARTED = "ExecutionStarted"; + private static final String NBT_PATTERN_STACK = "Stack"; + private static final String NBT_PATTERN_CONTAINER_POS = "ContainerPos"; + private INetwork network; private ItemStack requested; private int quantity; @@ -60,7 +63,7 @@ public class CraftingTask implements ICraftingTask { private CraftingInserter inserter; private Set patternsUsed = new HashSet<>(); private int ticks = 0; - private long calculationStarted; + private long calculationStarted = -1; private long executionStarted = -1; private UUID id = UUID.randomUUID(); @@ -116,6 +119,14 @@ public class CraftingTask implements ICraftingTask { @Override @Nullable public ICraftingTaskError calculate() { + if (calculationStarted != -1) { + throw new IllegalStateException("Task already calculated!"); + } + + if (executionStarted != -1) { + throw new IllegalStateException("Task already started!"); + } + this.calculationStarted = System.currentTimeMillis(); int qty = this.quantity; @@ -125,6 +136,27 @@ public class CraftingTask implements ICraftingTask { IStackList results = API.instance().createItemStackList(); IStackList storage = network.getItemStorageCache().getList().copy(); + // Items that are being handled in other tasks aren't available to us. + for (ICraftingTask task : network.getCraftingManager().getTasks()) { + if (task instanceof CraftingTask) { + for (CraftingStep step : ((CraftingTask) task).steps) { + CraftingExtractor extractor = null; + + if (step instanceof CraftingStepCraft) { + extractor = ((CraftingStepCraft) step).getExtractor(); + } else if (step instanceof CraftingStepProcess) { + extractor = ((CraftingStepProcess) step).getExtractor(); + } + + if (extractor != null) { + for (ItemStack inUse : extractor.getItems()) { + storage.remove(inUse); + } + } + } + } + } + ICraftingPatternChainList patternChainList = network.getCraftingManager().createPatternChainList(); ICraftingPatternChain patternChain = patternChainList.getChain(pattern); @@ -371,7 +403,7 @@ public class CraftingTask implements ICraftingTask { elements.directAdd(new CraftingMonitorElementText("gui.refinedstorage:crafting_monitor.items_missing", 5)); for (ItemStack missing : this.missing.getStacks()) { - elements.add(new CraftingMonitorElementColor(new CraftingMonitorElementItemRender(missing, missing.getCount(), 16), "", CraftingMonitorElementColor.COLOR_ERROR)); + elements.add(new CraftingMonitorElementColor(new CraftingMonitorElementItemRender(missing, missing.getCount(), 0), "", CraftingMonitorElementColor.COLOR_ERROR)); } elements.commit(); @@ -381,11 +413,7 @@ public class CraftingTask implements ICraftingTask { elements.directAdd(new CraftingMonitorElementText("gui.refinedstorage:crafting_monitor.items_inserting", 5)); for (CraftingInserterItem item : inserter.getItems()) { - ICraftingMonitorElement element = new CraftingMonitorElementItemRender( - item.getStack(), - item.getStack().getCount(), - 16 - ); + ICraftingMonitorElement element = new CraftingMonitorElementItemRender(item.getStack(), item.getStack().getCount(), 0); if (item.getStatus() == CraftingInserterItemStatus.FULL) { element = new CraftingMonitorElementColor(element, "gui.refinedstorage:crafting_monitor.network_full", CraftingMonitorElementColor.COLOR_ERROR); @@ -408,11 +436,7 @@ public class CraftingTask implements ICraftingTask { ItemStack item = extractor.getItems().get(i); CraftingExtractorItemStatus status = extractor.getStatus().get(i); - ICraftingMonitorElement element = new CraftingMonitorElementItemRender( - item, - item.getCount(), - 16 - ); + ICraftingMonitorElement element = new CraftingMonitorElementItemRender(item, item.getCount(), 0); if (status == CraftingExtractorItemStatus.MISSING) { element = new CraftingMonitorElementColor(element, "gui.refinedstorage:crafting_monitor.waiting_for_items", CraftingMonitorElementColor.COLOR_INFO); @@ -437,11 +461,7 @@ public class CraftingTask implements ICraftingTask { ItemStack item = extractor.getItems().get(i); CraftingExtractorItemStatus status = extractor.getStatus().get(i); - ICraftingMonitorElement element = new CraftingMonitorElementItemRender( - item, - item.getCount(), - 16 - ); + ICraftingMonitorElement element = new CraftingMonitorElementItemRender(item, item.getCount(), 0); if (status == CraftingExtractorItemStatus.MISSING) { element = new CraftingMonitorElementColor(element, "gui.refinedstorage:crafting_monitor.waiting_for_items", CraftingMonitorElementColor.COLOR_INFO); @@ -582,9 +602,6 @@ public class CraftingTask implements ICraftingTask { } } - private static final String NBT_PATTERN_STACK = "Stack"; - private static final String NBT_PATTERN_CONTAINER_POS = "ContainerPos"; - public static NBTTagCompound writePatternToNbt(ICraftingPattern pattern) { NBTTagCompound tag = new NBTTagCompound();