From 68bf3e78f5035d633a874a1077c92e0d104b0fb3 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Wed, 30 May 2018 00:12:23 +0200 Subject: [PATCH] Fix more bugs with regular recipes. --- .../autocrafting/task/CraftingInserter.java | 4 +- .../autocrafting/task/CraftingTask.java | 91 +++++++++++-------- .../apiimpl/util/StackListFluid.java | 4 + 3 files changed, 59 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingInserter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingInserter.java index 5d1d08797..49eff36df 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingInserter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingInserter.java @@ -16,13 +16,13 @@ public class CraftingInserter { } public void insert(ItemStack stack) { - items.push(new CraftingInserterItem(stack, CraftingInserterItemStatus.WAITING)); + items.addLast(new CraftingInserterItem(stack, CraftingInserterItemStatus.WAITING)); network.getCraftingManager().sendCraftingMonitorUpdate(); } public void insertSingle() { - CraftingInserterItem item = items.peek(); + CraftingInserterItem item = items.peekFirst(); if (item != null) { if (network.insertItem(item.getStack(), item.getStack().getCount(), true) == null) { 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 a13960b6d..1ea2cf99a 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 @@ -73,48 +73,63 @@ public class CraftingTask implements ICraftingTask { took.add(possibleInput); - int toExtract = possibleInput.getCount(); - ItemStack fromSelf = results.get(possibleInput); - if (fromSelf != null) { - int toExtractFromSelf = Math.min(possibleInput.getCount(), fromSelf.getCount()); + ItemStack fromNetwork = mutatedStorage.get(possibleInput); - results.remove(possibleInput, toExtractFromSelf); + int available = (fromNetwork == null ? 0 : fromNetwork.getCount()) + (fromSelf == null ? 0 : fromSelf.getCount()); - toExtract -= toExtractFromSelf; - } + if (available < possibleInput.getCount()) { + ICraftingPattern subPattern = network.getCraftingManager().getPattern(possibleInput, IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT); - if (toExtract > 0) { - ItemStack fromNetwork = mutatedStorage.get(possibleInput); + int needed = possibleInput.getCount() - available; - int fromNetworkCount = fromNetwork == null ? 0 : Math.min(toExtract, fromNetwork.getCount()); + if (subPattern != null) { + while ((fromSelf == null ? 0 : fromSelf.getCount()) < needed) { + this.steps.add(calculateInternal(mutatedStorage, results, subPattern)); - itemsToExtract.add(possibleInput, toExtract); - - if (fromNetworkCount > 0) { - this.toTake.add(possibleInput, fromNetworkCount); - - mutatedStorage.remove(possibleInput, fromNetworkCount); - } - - if (fromNetworkCount < toExtract) { - int missing = toExtract - fromNetworkCount; - - ICraftingPattern subPattern = network.getCraftingManager().getPattern(possibleInput, IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT); - - if (subPattern == null) { - this.missing.add(possibleInput, missing); - } else { - this.toCraft.add(possibleInput, missing); - - while (missing > 0) { - this.steps.add(calculateInternal(mutatedStorage, results, subPattern)); // TODO: eating from itself? - - missing -= getQuantityPerCraft(subPattern, possibleInput); + fromSelf = results.get(possibleInput); + if (fromSelf == null) { + throw new IllegalStateException("Recursive calculation didn't yield anything"); } } } } + + fromNetwork = mutatedStorage.get(possibleInput); + + int remaining = possibleInput.getCount(); + + while (remaining > 0) { + if (fromSelf != null) { + int toTake = Math.min(remaining, fromSelf.getCount()); + + this.toCraft.add(possibleInput, toTake); + + itemsToExtract.add(possibleInput, toTake); + + results.remove(possibleInput, toTake); + + remaining -= toTake; + + fromSelf = results.get(possibleInput); + } else if (fromNetwork != null) { + int toTake = Math.min(remaining, fromNetwork.getCount()); + + this.toTake.add(possibleInput, toTake); + + itemsToExtract.add(possibleInput, toTake); + + mutatedStorage.remove(possibleInput, toTake); + + remaining -= toTake; + + fromNetwork = mutatedStorage.get(possibleInput); + } else { + this.missing.add(possibleInput, remaining); + + remaining = 0; + } + } } if (pattern.isProcessing()) { @@ -197,7 +212,7 @@ public class CraftingTask implements ICraftingTask { elements.directAdd(new CraftingMonitorElementItemRender( network.getCraftingManager().getTasks().indexOf(this), - requested != null ? requested : pattern.getOutputs().get(0), + requested, quantity, 0 )); @@ -337,16 +352,16 @@ public class CraftingTask implements ICraftingTask { private int getTickInterval(int speedUpgrades) { switch (speedUpgrades) { case 1: - return 8; + return 10; case 2: - return 6; + return 8; case 3: - return 4; + return 6; case 4: - return 2; + return 4; case 0: default: - return 10; + return 20; } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListFluid.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListFluid.java index 463306d39..f5d8e4f23 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListFluid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListFluid.java @@ -15,6 +15,10 @@ public class StackListFluid implements IStackList { @Override public void add(@Nonnull FluidStack stack, int size) { + if (stack == null || size < 0) { + throw new IllegalArgumentException("Cannot accept empty stack"); + } + for (FluidStack otherStack : stacks.get(stack.getFluid())) { if (stack.isFluidEqual(otherStack)) { otherStack.amount += size;