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 79ebd9879..b4a5a83b1 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 @@ -59,7 +59,7 @@ public class CraftingStepProcess extends CraftingStep { items.undo(); fluids.undo(); - return insertSimulation(inventory, toInsert); + return insert(inventory, toInsert, true); } return false; } @@ -67,17 +67,17 @@ public class CraftingStepProcess extends CraftingStep { @Override public boolean canStartProcessing() { IItemHandler inventory = getPattern().getContainer().getFacingInventory(); - return inventory != null && insertSimulation(inventory, new LinkedList<>(getToInsert())); + return inventory != null && insert(inventory, new LinkedList<>(getToInsert()), true); } @Override public void execute(Deque toInsertItems, Deque toInsertFluids) { - List actualInputs = new LinkedList<>(); + LinkedList actualInputs = new LinkedList<>(); int compare = CraftingTask.DEFAULT_COMPARE | (getPattern().isOredict() ? IComparer.COMPARE_OREDICT : 0); if (extractItems(actualInputs, compare, toInsertItems)) { IItemHandler inventory = getPattern().getContainer().getFacingInventory(); - if (insertSimulation(inventory, new ArrayDeque<>(actualInputs))) { - actualInputs.forEach(stack -> ItemHandlerHelper.insertItem(inventory, stack, false)); + if (insert(inventory, new ArrayDeque<>(actualInputs), true)) { + insert(inventory, actualInputs, false); } } } @@ -90,25 +90,26 @@ public class CraftingStepProcess extends CraftingStep { } /** - * Checks whether all stacks can be inserted or not + * Insert or simulate insertion of {@link ItemStack}s into an {@link IItemHandler} * * @param dest target {@link IItemHandler} * @param stacks a {@link Deque} of {@link ItemStack}s + * @param simulate simulate or actually insert the {@link ItemStack}s * @return true when all can be inserted, false otherwise */ - private static boolean insertSimulation(IItemHandler dest, Deque stacks) { + private static boolean insert(IItemHandler dest, Deque stacks, boolean simulate) { 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.getCount() != remainder.getCount()) { + remainder = dest.insertItem(slot, current, simulate); + if (remainder.isEmpty() || current.getCount() != remainder.getCount()) { availableSlots.remove(slot); break; } } - if (remainder == null || remainder.getCount() <= 0) { + if (remainder == null || remainder.isEmpty()) { current = stacks.poll(); } else if (current.getCount() == remainder.getCount()) { break; // Can't be inserted diff --git a/src/main/java/com/raoulvdberge/refinedstorage/integration/jei/RecipeTransferHandlerPattern.java b/src/main/java/com/raoulvdberge/refinedstorage/integration/jei/RecipeTransferHandlerPattern.java index 6323db35d..e4b76262d 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/integration/jei/RecipeTransferHandlerPattern.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/integration/jei/RecipeTransferHandlerPattern.java @@ -1,7 +1,6 @@ package com.raoulvdberge.refinedstorage.integration.jei; import com.raoulvdberge.refinedstorage.RS; -import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.container.ContainerProcessingPatternEncoder; import com.raoulvdberge.refinedstorage.network.MessageProcessingPatternEncoderTransfer; import mezz.jei.api.gui.IGuiIngredient; @@ -12,8 +11,8 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import javax.annotation.Nullable; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.LinkedList; +import java.util.List; public class RecipeTransferHandlerPattern implements IRecipeTransferHandler { @Override @@ -25,32 +24,21 @@ public class RecipeTransferHandlerPattern implements IRecipeTransferHandler inputs = new LinkedHashMap<>(); - Map outputs = new LinkedHashMap<>(); + List inputs = new LinkedList<>(); + List outputs = new LinkedList<>(); for (IGuiIngredient guiIngredient : recipeLayout.getItemStacks().getGuiIngredients().values()) { if (guiIngredient != null && guiIngredient.getDisplayedIngredient() != null) { ItemStack ingredient = guiIngredient.getDisplayedIngredient().copy(); - - int hash = API.instance().getItemStackHashCode(ingredient); - if (guiIngredient.isInput()) { - if (inputs.containsKey(hash)) { - inputs.get(hash).grow(1); - } else { - inputs.put(hash, ingredient); - } + inputs.add(ingredient); } else { - if (outputs.containsKey(hash)) { - outputs.get(hash).grow(1); - } else { - outputs.put(hash, ingredient); - } + outputs.add(ingredient); } } } - RS.INSTANCE.network.sendToServer(new MessageProcessingPatternEncoderTransfer(inputs.values(), outputs.values())); + RS.INSTANCE.network.sendToServer(new MessageProcessingPatternEncoderTransfer(inputs, outputs)); } return null; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java index 1c8ed949b..62a39f453 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java @@ -366,7 +366,7 @@ public class TileDiskManipulator extends TileNode implements IComparable, IFilte FluidStack extracted = null; int i = 0; - do { + while (extracted == null && storage.getStacks().size() > i) { FluidStack stack = storage.getStacks().get(i); while (stack == null && storage.getStacks().size() > i) { @@ -376,7 +376,7 @@ public class TileDiskManipulator extends TileNode implements IComparable, IFilte if (stack != null) { extracted = storage.extract(stack, upgrades.getItemInteractCount(), compare, false); } - } while (extracted == null && storage.getStacks().size() > i); + } if (extracted == null) { moveDriveToOutput(slot);