diff --git a/src/main/java/refinedstorage/api/util/IItemStackList.java b/src/main/java/refinedstorage/api/util/IItemStackList.java index d33bb3687..5f8c7e08b 100755 --- a/src/main/java/refinedstorage/api/util/IItemStackList.java +++ b/src/main/java/refinedstorage/api/util/IItemStackList.java @@ -21,10 +21,22 @@ public interface IItemStackList { * Decrements the count of that stack in the list. * * @param stack the stack + * @param size the size to remove * @param removeIfReachedZero true to remove the stack if the count reaches 0, false otherwise * @return whether the remove was successful */ - boolean remove(@Nonnull ItemStack stack, boolean removeIfReachedZero); + boolean remove(@Nonnull ItemStack stack, int size, boolean removeIfReachedZero); + + /** + * Decrements the count of that stack in the list. + * + * @param stack the stack + * @param removeIfReachedZero true to remove the stack if the count reaches 0, false otherwise + * @return whether the remove was successful + */ + default boolean remove(@Nonnull ItemStack stack, boolean removeIfReachedZero) { + return remove(stack, stack.stackSize, removeIfReachedZero); + } /** * Returns a stack. diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java index e9ca55be6..f1b12601e 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java @@ -13,18 +13,17 @@ import refinedstorage.api.util.IItemStackList; import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementRoot; import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementToTake; -import java.util.ArrayDeque; import java.util.ArrayList; -import java.util.Deque; import java.util.List; +import java.util.stream.Collectors; public class CraftingTaskNormal implements ICraftingTask { private INetworkMaster network; private ItemStack requested; private ICraftingPattern pattern; private int quantity; - private Deque toTake = new ArrayDeque<>(); private List toProcess = new ArrayList<>(); + private IItemStackList toTake = RSAPI.instance().createItemStackList(); private IItemStackList toCraft = RSAPI.instance().createItemStackList(); private IItemStackList missing = RSAPI.instance().createItemStackList(); private IItemStackList extras = RSAPI.instance().createItemStackList(); @@ -74,7 +73,7 @@ public class CraftingTaskNormal implements ICraftingTask { } } else { if (!pattern.isProcessing()) { - toTake.push(input); + toTake.add(input); } list.remove(input, true); @@ -113,12 +112,14 @@ public class CraftingTaskNormal implements ICraftingTask { } } - if (!toTake.isEmpty()) { - ItemStack took = network.extractItem(toTake.peek(), 1); + for (ItemStack toTakeStack : toTake.getStacks()) { + ItemStack took = network.extractItem(toTakeStack, 1); if (took != null) { - toTake.pop(); + toTake.remove(toTakeStack, 1, true); } + + break; } if (toTake.isEmpty() && missing.isEmpty() && toProcess.stream().allMatch(IProcessable::hasReceivedOutputs)) { @@ -158,17 +159,10 @@ public class CraftingTaskNormal implements ICraftingTask { quantity )); - if (!toTake.isEmpty()) { - IItemStackList toTake = RSAPI.instance().createItemStackList(); - - for (ItemStack stack : new ArrayList<>(this.toTake)) { - toTake.add(stack); - } - - for (ItemStack stack : toTake.getStacks()) { - elements.add(new CraftingMonitorElementToTake(stack, stack.stackSize)); - } - } + elements.addAll(toTake.getStacks().stream() + .map(stack -> new CraftingMonitorElementToTake(stack, stack.stackSize)) + .collect(Collectors.toList()) + ); return elements; } diff --git a/src/main/java/refinedstorage/apiimpl/util/ItemStackList.java b/src/main/java/refinedstorage/apiimpl/util/ItemStackList.java index c54c37e78..e33525d2b 100755 --- a/src/main/java/refinedstorage/apiimpl/util/ItemStackList.java +++ b/src/main/java/refinedstorage/apiimpl/util/ItemStackList.java @@ -1,7 +1,6 @@ package refinedstorage.apiimpl.util; import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Multimap; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import refinedstorage.api.RSAPI; @@ -12,8 +11,9 @@ import javax.annotation.Nullable; import java.util.Collection; public class ItemStackList implements IItemStackList { - private Multimap stacks = ArrayListMultimap.create(); + private ArrayListMultimap stacks = ArrayListMultimap.create(); + @Override public void add(ItemStack stack) { for (ItemStack otherStack : stacks.get(stack.getItem())) { if (RSAPI.instance().getComparer().isEqualNoQuantity(otherStack, stack)) { @@ -26,12 +26,13 @@ public class ItemStackList implements IItemStackList { stacks.put(stack.getItem(), stack.copy()); } - public boolean remove(@Nonnull ItemStack stack, boolean removeIfReachedZero) { + @Override + public boolean remove(@Nonnull ItemStack stack, int size, boolean removeIfReachedZero) { for (ItemStack otherStack : stacks.get(stack.getItem())) { if (RSAPI.instance().getComparer().isEqualNoQuantity(otherStack, stack)) { - otherStack.stackSize -= stack.stackSize; + otherStack.stackSize -= size; - if (otherStack.stackSize == 0 && removeIfReachedZero) { + if (otherStack.stackSize <= 0 && removeIfReachedZero) { stacks.remove(otherStack.getItem(), otherStack); } @@ -42,6 +43,7 @@ public class ItemStackList implements IItemStackList { return false; } + @Override @Nullable public ItemStack get(@Nonnull ItemStack stack, int flags) { for (ItemStack otherStack : stacks.get(stack.getItem())) { @@ -53,6 +55,7 @@ public class ItemStackList implements IItemStackList { return null; } + @Override @Nullable public ItemStack get(int hash) { for (ItemStack stack : this.stacks.values()) {