From b6413c68adb50a17e4f8ca40ecb5d711817b3ec0 Mon Sep 17 00:00:00 2001 From: way2muchnoise Date: Thu, 27 Oct 2016 19:10:13 +0200 Subject: [PATCH] fixes #530 now it checks if all stacks can be inserted together and not just inserted --- .../task/CraftingStepProcess.java | 43 +++++++++++++++++-- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStepProcess.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStepProcess.java index 8849d7378..8eefa697f 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStepProcess.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStepProcess.java @@ -12,6 +12,10 @@ import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; import java.util.Deque; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; public class CraftingStepProcess extends CraftingStep { public static final String ID = "process"; @@ -28,17 +32,18 @@ public class CraftingStepProcess extends CraftingStep { public boolean canStartProcessing(IItemStackList items, IFluidStackList fluids) { IItemHandler inventory = getPattern().getContainer().getFacingInventory(); if (inventory != null) { + Deque toInsert = new LinkedList<>(); for (ItemStack stack : getToInsert()) { ItemStack actualStack = items.get(stack, IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT | (pattern.isOredict() ? IComparer.COMPARE_OREDICT : 0)); - - boolean canInsert = ItemHandlerHelper.insertItem(inventory, ItemHandlerHelper.copyStackWithSize(actualStack, stack.stackSize), true) == null; - if (actualStack == null || actualStack.stackSize == 0 || !items.trackedRemove(actualStack, stack.stackSize, true) || !canInsert) { + ItemStack removeStack = ItemHandlerHelper.copyStackWithSize(actualStack, stack.stackSize); + if (actualStack == null || actualStack.stackSize == 0 || !items.trackedRemove(removeStack, true) ) { items.undo(); return false; } + toInsert.add(removeStack.copy()); } items.undo(); - return true; + return insertSimulation(inventory, toInsert); } return false; } @@ -71,4 +76,34 @@ public class CraftingStepProcess extends CraftingStep { return super.writeToNBT(tag); } + + /** + * Checks whether all stacks can be inserted or not + * + * @param dest target {@link IItemHandler} + * @param stacks a {@link Deque} of {@link ItemStack}s + * @return true when all can be inserted, false otherwise + */ + private static boolean insertSimulation(IItemHandler dest, Deque stacks) { + ItemStack current = stacks.poll(); + List availableSlots = IntStream.range(0, dest.getSlots()).boxed().collect(Collectors.toList()); + while (current != null && !availableSlots.isEmpty()) { + ItemStack remainder = null; + for (Integer slot : availableSlots) { + remainder = dest.insertItem(slot, current, true); + if (remainder == null || current.stackSize != remainder.stackSize) { + availableSlots.remove(slot); + break; + } + } + if (remainder == null || remainder.stackSize <= 0) { + current = stacks.poll(); + } else if (current.stackSize == remainder.stackSize) { + break; // Can't be inserted + } else { + current = remainder; + } + } + return current == null && stacks.isEmpty(); + } }