diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/CraftingManager.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/CraftingManager.java index 8c68cdb8c..a9f9460f3 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/CraftingManager.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/CraftingManager.java @@ -15,7 +15,9 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.material.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.items.IItemHandlerModifiable; import org.apache.logging.log4j.LogManager; @@ -40,6 +42,8 @@ public class CraftingManager implements ICraftingManager { private final Map> patternToContainer = new HashMap<>(); private final List patterns = new ArrayList<>(); + private final Map fluidPatternsByOutput = new HashMap<>(); + private final Map itemPatternsByOutput = new HashMap<>(); private final Map tasks = new LinkedHashMap<>(); private final List tasksToAdd = new ArrayList<>(); @@ -48,6 +52,52 @@ public class CraftingManager implements ICraftingManager { private final Set listeners = new HashSet<>(); private ListTag tasksToRead; + private static class FluidStackKey { + private final Fluid fluid; + private final CompoundTag tag; + + public FluidStackKey(FluidStack fluidStack) { + this.fluid = fluidStack.getFluid(); + this.tag = fluidStack.getTag(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + FluidStackKey that = (FluidStackKey) o; + return fluid.equals(that.fluid) && Objects.equals(tag, that.tag); + } + + @Override + public int hashCode() { + return Objects.hash(fluid, tag); + } + } + + private static class ItemStackKey { + private final Item item; + private final CompoundTag tag; + + public ItemStackKey(ItemStack itemStack) { + this.item = itemStack.getItem(); + this.tag = itemStack.getTag(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ItemStackKey that = (ItemStackKey) o; + return item.equals(that.item) && Objects.equals(tag, that.tag); + } + + @Override + public int hashCode() { + return Objects.hash(item, tag); + } + } + public CraftingManager(INetwork network) { this.network = network; } @@ -357,6 +407,8 @@ public class CraftingManager implements ICraftingManager { this.network.getFluidStorageCache().getCraftablesList().clear(); this.patterns.clear(); + this.fluidPatternsByOutput.clear(); + this.itemPatternsByOutput.clear(); this.containerInventories.clear(); this.patternToContainer.clear(); @@ -368,10 +420,12 @@ public class CraftingManager implements ICraftingManager { for (ItemStack output : pattern.getOutputs()) { network.getItemStorageCache().getCraftablesList().add(output); + this.itemPatternsByOutput.put(new ItemStackKey(output), pattern); } for (FluidStack output : pattern.getFluidOutputs()) { network.getFluidStorageCache().getCraftablesList().add(output); + this.fluidPatternsByOutput.put(new FluidStackKey(output), pattern); } Set containersForPattern = this.patternToContainer.computeIfAbsent(pattern, key -> new LinkedHashSet<>()); @@ -410,28 +464,12 @@ public class CraftingManager implements ICraftingManager { @Nullable @Override public ICraftingPattern getPattern(ItemStack pattern) { - for (ICraftingPattern patternInList : patterns) { - for (ItemStack output : patternInList.getOutputs()) { - if (API.instance().getComparer().isEqualNoQuantity(output, pattern)) { - return patternInList; - } - } - } - - return null; + return itemPatternsByOutput.get(new ItemStackKey(pattern)); } @Nullable @Override public ICraftingPattern getPattern(FluidStack pattern) { - for (ICraftingPattern patternInList : patterns) { - for (FluidStack output : patternInList.getFluidOutputs()) { - if (API.instance().getComparer().isEqual(output, pattern, IComparer.COMPARE_NBT)) { - return patternInList; - } - } - } - - return null; + return fluidPatternsByOutput.get(new FluidStackKey(pattern)); } }