From aa1777d5dc3ee0a374a3822b1117386bef64bce5 Mon Sep 17 00:00:00 2001 From: Darkere Date: Fri, 31 Dec 2021 16:55:31 +0100 Subject: [PATCH] Processing patterns now use the order of items/fluids specified in the pattern. Cherry picked from bb44bf1633f4986a9400a7eaa55e5d0e96e9989d --- CHANGELOG.md | 2 ++ .../ICraftingPatternContainer.java | 21 ++++++-------- .../apiimpl/autocrafting/task/v6/IoUtil.java | 25 ++++++++--------- .../task/v6/node/NodeRequirements.java | 28 +++++++++---------- .../task/v6/node/ProcessingNode.java | 20 +++++++------ .../apiimpl/util/FluidStackList.java | 9 ++++++ .../apiimpl/util/ItemStackList.java | 9 ++++++ 7 files changed, 67 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b805f3d7..8007d0fae 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Fixed - Fixed multiple bugs related to transferring recipes into the Crafting Grid. +- Processing patterns now use the order of items/fluids specified in the pattern + by [@necauqua](https://github.com/necauqua) and [@Darkere](https://github.com/Darkere). ## [v1.10.0-beta.4] - 2021-12-28 diff --git a/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/ICraftingPatternContainer.java b/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/ICraftingPatternContainer.java index e0eef8703..c1cc8e56c 100644 --- a/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/ICraftingPatternContainer.java +++ b/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/ICraftingPatternContainer.java @@ -1,7 +1,6 @@ package com.refinedmods.refinedstorage.api.autocrafting; import com.refinedmods.refinedstorage.api.util.Action; -import com.refinedmods.refinedstorage.api.util.StackListEntry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; @@ -152,7 +151,7 @@ public interface ICraftingPatternContainer { * @param action action to perform * @return whether insertion was successful */ - default boolean insertItemsIntoInventory(Collection> toInsert, Action action) { + default boolean insertItemsIntoInventory(Collection toInsert, Action action) { IItemHandler dest = getConnectedInventory(); @@ -164,11 +163,10 @@ public interface ICraftingPatternContainer { return false; } - Deque> stacks = new ArrayDeque<>(toInsert); + Deque stacks = new ArrayDeque<>(toInsert); - StackListEntry currentEntry = stacks.poll(); - ItemStack current = currentEntry != null ? currentEntry.getStack() : null; + ItemStack current = stacks.poll(); List availableSlots = IntStream.range(0, dest.getSlots()).boxed().collect(Collectors.toList()); @@ -189,9 +187,8 @@ public interface ICraftingPatternContainer { } if (remainder.isEmpty()) { // If we inserted successfully, get a next stack. - currentEntry = stacks.poll(); + current = stacks.poll(); - current = currentEntry != null ? currentEntry.getStack() : null; } else if (current.getCount() == remainder.getCount()) { // If we didn't insert anything over ALL these slots, stop here. break; } else { // If we didn't insert all, continue with other slots and use our remainder. @@ -215,7 +212,7 @@ public interface ICraftingPatternContainer { * @param action action to perform * @return whether insertion was successful */ - default boolean insertFluidsIntoInventory(Collection> toInsert, Action action) { + default boolean insertFluidsIntoInventory(Collection toInsert, Action action) { IFluidHandler dest = getConnectedFluidInventory(); if (toInsert.isEmpty()) { @@ -226,12 +223,12 @@ public interface ICraftingPatternContainer { return false; } - for (StackListEntry entry : toInsert) { - int filled = dest.fill(entry.getStack(), action == Action.SIMULATE ? IFluidHandler.FluidAction.SIMULATE : IFluidHandler.FluidAction.EXECUTE); + for (FluidStack stack : toInsert) { + int filled = dest.fill(stack, action == Action.SIMULATE ? IFluidHandler.FluidAction.SIMULATE : IFluidHandler.FluidAction.EXECUTE); - if (filled != entry.getStack().getAmount()) { + if (filled != stack.getAmount()) { if (action == Action.PERFORM) { - LogManager.getLogger().warn("Inventory unexpectedly didn't accept all of {}, the remainder has been voided!", entry.getStack().getTranslationKey()); + LogManager.getLogger().warn("Inventory unexpectedly didn't accept all of {}, the remainder has been voided!", stack.getTranslationKey()); } return false; diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/task/v6/IoUtil.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/task/v6/IoUtil.java index c25b424f9..4a6ef9aa9 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/task/v6/IoUtil.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/task/v6/IoUtil.java @@ -6,7 +6,6 @@ import com.refinedmods.refinedstorage.api.util.Action; import com.refinedmods.refinedstorage.api.util.IComparer; import com.refinedmods.refinedstorage.api.util.IStackList; import com.refinedmods.refinedstorage.api.util.StackListEntry; -import com.refinedmods.refinedstorage.apiimpl.API; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; @@ -19,15 +18,15 @@ public final class IoUtil { private IoUtil() { } - public static IStackList extractFromInternalItemStorage(IStackList list, IStorageDisk storage, Action action) { - IStackList extracted = API.instance().createItemStackList(); + public static List extractFromInternalItemStorage(List list, IStorageDisk storage, Action action) { + List extracted = new ArrayList<>(); - for (StackListEntry entry : list.getStacks()) { - ItemStack result = storage.extract(entry.getStack(), entry.getStack().getCount(), DEFAULT_EXTRACT_FLAGS, action); + for (ItemStack stack : list) { + ItemStack result = storage.extract(stack, stack.getCount(), DEFAULT_EXTRACT_FLAGS, action); - if (result.isEmpty() || result.getCount() != entry.getStack().getCount()) { + if (result.isEmpty() || result.getCount() != stack.getCount()) { if (action == Action.PERFORM) { - throw new IllegalStateException("The internal crafting inventory reported that " + entry.getStack() + " was available but we got " + result); + throw new IllegalStateException("The internal crafting inventory reported that " + stack + " was available but we got " + result); } return null; @@ -39,15 +38,15 @@ public final class IoUtil { return extracted; } - public static IStackList extractFromInternalFluidStorage(IStackList list, IStorageDisk storage, Action action) { - IStackList extracted = API.instance().createFluidStackList(); + public static List extractFromInternalFluidStorage(List list, IStorageDisk storage, Action action) { + List extracted = new ArrayList<>(); - for (StackListEntry entry : list.getStacks()) { - FluidStack result = storage.extract(entry.getStack(), entry.getStack().getAmount(), DEFAULT_EXTRACT_FLAGS, action); + for (FluidStack stack : list) { + FluidStack result = storage.extract(stack, stack.getAmount(), DEFAULT_EXTRACT_FLAGS, action); - if (result.isEmpty() || result.getAmount() != entry.getStack().getAmount()) { + if (result.isEmpty() || result.getAmount() != stack.getAmount()) { if (action == Action.PERFORM) { - throw new IllegalStateException("The internal crafting inventory reported that " + entry.getStack() + " was available but we got " + result); + throw new IllegalStateException("The internal crafting inventory reported that " + stack + " was available but we got " + result); } return null; diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/task/v6/node/NodeRequirements.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/task/v6/node/NodeRequirements.java index fe2e3559f..67f9b9acf 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/task/v6/node/NodeRequirements.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/task/v6/node/NodeRequirements.java @@ -11,12 +11,10 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.items.ItemHandlerHelper; import javax.annotation.Nullable; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class NodeRequirements { private static final String NBT_ITEMS_TO_USE = "ItemsToUse"; @@ -32,9 +30,9 @@ public class NodeRequirements { private final Map fluidsNeededPerCraft = new LinkedHashMap<>(); @Nullable - private IStackList cachedSimulatedItemRequirementSet = null; + private List cachedSimulatedItemRequirementSet = null; @Nullable - private IStackList cachedSimulatedFluidRequirementSet = null; + private List cachedSimulatedFluidRequirementSet = null; public void addItemRequirement(int ingredientNumber, ItemStack stack, int size, int perCraft) { if (!itemsNeededPerCraft.containsKey(ingredientNumber)) { @@ -56,13 +54,13 @@ public class NodeRequirements { cachedSimulatedFluidRequirementSet = null; } - public IStackList getSingleItemRequirementSet(boolean simulate) { - IStackList cached = cachedSimulatedItemRequirementSet; + public List getSingleItemRequirementSet(boolean simulate) { + List cached = cachedSimulatedItemRequirementSet; if (simulate && cached != null) { return cached; } - IStackList toReturn = API.instance().createItemStackList(); + List toReturn = new ArrayList<>(); for (int i = 0; i < itemRequirements.size(); i++) { int needed = itemsNeededPerCraft.get(i); @@ -78,7 +76,7 @@ public class NodeRequirements { itemRequirements.get(i).remove(toUse, needed); } - toReturn.add(toUse, needed); + toReturn.add(ItemHandlerHelper.copyStackWithSize(toUse, needed)); needed = 0; } else { @@ -101,13 +99,13 @@ public class NodeRequirements { return toReturn; } - public IStackList getSingleFluidRequirementSet(boolean simulate) { - IStackList cached = cachedSimulatedFluidRequirementSet; + public List getSingleFluidRequirementSet(boolean simulate) { + List cached = cachedSimulatedFluidRequirementSet; if (simulate && cached != null) { return cached; } - IStackList toReturn = API.instance().createFluidStackList(); + List toReturn = new ArrayList<>(); for (int i = 0; i < fluidRequirements.size(); i++) { int needed = fluidsNeededPerCraft.get(i); @@ -123,7 +121,9 @@ public class NodeRequirements { fluidRequirements.get(i).remove(toUse, needed); } - toReturn.add(toUse, needed); + FluidStack stack = toUse.copy(); + stack.setAmount(needed); + toReturn.add(stack); needed = 0; } else { diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/task/v6/node/ProcessingNode.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/task/v6/node/ProcessingNode.java index b24bc6e44..b5a0b18c8 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/task/v6/node/ProcessingNode.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/task/v6/node/ProcessingNode.java @@ -11,11 +11,15 @@ import com.refinedmods.refinedstorage.api.util.StackListEntry; import com.refinedmods.refinedstorage.apiimpl.API; import com.refinedmods.refinedstorage.apiimpl.autocrafting.task.v6.IoUtil; import com.refinedmods.refinedstorage.apiimpl.autocrafting.task.v6.SerializationUtil; +import com.refinedmods.refinedstorage.apiimpl.util.FluidStackList; +import com.refinedmods.refinedstorage.apiimpl.util.ItemStackList; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; +import java.util.List; + public class ProcessingNode extends Node { private static final String NBT_ITEMS_RECEIVED = "ItemsReceived"; private static final String NBT_FLUIDS_RECEIVED = "FluidsReceived"; @@ -117,8 +121,8 @@ public class ProcessingNode extends Node { boolean hasAllRequirements = false; - IStackList extractedItems = IoUtil.extractFromInternalItemStorage(requirements.getSingleItemRequirementSet(true), internalStorage, Action.SIMULATE); - IStackList extractedFluids = null; + List extractedItems = IoUtil.extractFromInternalItemStorage(requirements.getSingleItemRequirementSet(true), internalStorage, Action.SIMULATE); + List extractedFluids = null; if (extractedItems != null) { extractedFluids = IoUtil.extractFromInternalFluidStorage(requirements.getSingleFluidRequirementSet(true), internalFluidStorage, Action.SIMULATE); if (extractedFluids != null) { @@ -128,9 +132,9 @@ public class ProcessingNode extends Node { boolean canInsertFullAmount = false; if (hasAllRequirements) { - canInsertFullAmount = container.insertItemsIntoInventory(extractedItems.getStacks(), Action.SIMULATE); + canInsertFullAmount = container.insertItemsIntoInventory(extractedItems, Action.SIMULATE); if (canInsertFullAmount) { - canInsertFullAmount = container.insertFluidsIntoInventory(extractedFluids.getStacks(), Action.SIMULATE); + canInsertFullAmount = container.insertFluidsIntoInventory(extractedFluids, Action.SIMULATE); } } else { break; @@ -151,8 +155,8 @@ public class ProcessingNode extends Node { extractedItems = IoUtil.extractFromInternalItemStorage(requirements.getSingleItemRequirementSet(false), internalStorage, Action.PERFORM); extractedFluids = IoUtil.extractFromInternalFluidStorage(requirements.getSingleFluidRequirementSet(false), internalFluidStorage, Action.PERFORM); - container.insertItemsIntoInventory(extractedItems.getStacks(), Action.PERFORM); - container.insertFluidsIntoInventory(extractedFluids.getStacks(), Action.PERFORM); + container.insertItemsIntoInventory(extractedItems, Action.PERFORM); + container.insertFluidsIntoInventory(extractedFluids, Action.PERFORM); next(); @@ -249,8 +253,8 @@ public class ProcessingNode extends Node { public void onCalculationFinished() { super.onCalculationFinished(); - this.singleItemSetToRequire = requirements.getSingleItemRequirementSet(true); - this.singleFluidSetToRequire = requirements.getSingleFluidRequirementSet(true); + this.singleItemSetToRequire = new ItemStackList(requirements.getSingleItemRequirementSet(true)); + this.singleFluidSetToRequire = new FluidStackList(requirements.getSingleFluidRequirementSet(true)); } @Override diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/util/FluidStackList.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/util/FluidStackList.java index cc9f32d6b..448665bbf 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/util/FluidStackList.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/util/FluidStackList.java @@ -19,6 +19,15 @@ public class FluidStackList implements IStackList { private final ArrayListMultimap> stacks = ArrayListMultimap.create(); private final Map index = new HashMap<>(); + public FluidStackList() { + } + + public FluidStackList(Iterable stacks) { + for (FluidStack stack : stacks) { + add(stack); + } + } + @Override public StackListResult add(@Nonnull FluidStack stack, int size) { if (stack.isEmpty() || size <= 0) { diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/util/ItemStackList.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/util/ItemStackList.java index 0843a20c6..e4b0f0cfd 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/util/ItemStackList.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/util/ItemStackList.java @@ -20,6 +20,15 @@ public class ItemStackList implements IStackList { private final ArrayListMultimap> stacks = ArrayListMultimap.create(); private final Map index = new HashMap<>(); + public ItemStackList() { + } + + public ItemStackList(Iterable stacks) { + for (ItemStack stack : stacks) { + add(stack); + } + } + @Override public StackListResult add(@Nonnull ItemStack stack, int size) { if (stack.isEmpty() || size <= 0) {