From 92778560fb4e9b0f37446bb4858b0dcad23bdde6 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sun, 21 Nov 2021 17:21:28 +0800 Subject: Add wildcard matching --- .../shedaniel/rei/impl/client/view/ViewsImpl.java | 29 ++++++++++++++-------- .../rei/impl/common/entry/AbstractEntryStack.java | 5 ++++ .../entry/type/types/BuiltinEntryDefinition.java | 5 ++++ .../plugin/client/entry/FluidEntryDefinition.java | 11 +++++--- .../plugin/client/entry/ItemEntryDefinition.java | 5 ++++ 5 files changed, 41 insertions(+), 14 deletions(-) (limited to 'runtime/src/main/java') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java index a76cce52f..e56c68fc5 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java @@ -58,6 +58,7 @@ import org.jetbrains.annotations.ApiStatus; import java.util.*; import java.util.function.Consumer; import java.util.stream.Collectors; +import java.util.stream.Stream; @ApiStatus.Internal public class ViewsImpl implements Views { @@ -69,8 +70,14 @@ public class ViewsImpl implements Views { Stopwatch stopwatch = Stopwatch.createStarted(); Set> categories = builder.getCategories(); - List> recipesFor = builder.getRecipesFor(); - List> usagesFor = builder.getUsagesFor(); + List> recipesForStacks = builder.getRecipesFor(); + List> usagesForStacks = builder.getUsagesFor(); + recipesForStacks = Stream.concat(recipesForStacks.stream(), recipesForStacks.stream().map(EntryStack::wildcard)) + .distinct() + .collect(Collectors.toList()); + usagesForStacks = Stream.concat(usagesForStacks.stream(), usagesForStacks.stream().map(EntryStack::wildcard)) + .distinct() + .collect(Collectors.toList()); DisplayRegistry displayRegistry = DisplayRegistry.getInstance(); Map, List> result = Maps.newLinkedHashMap(); @@ -94,12 +101,12 @@ public class ViewsImpl implements Views { } for (Display display : allRecipesFromCategory) { if (!displayRegistry.isDisplayVisible(display)) continue; - if (!recipesFor.isEmpty()) { + if (!recipesForStacks.isEmpty()) { back: for (List> results : display.getOutputEntries()) { for (EntryStack otherEntry : results) { - for (EntryStack stack : recipesFor) { - if (EntryStacks.equalsFuzzy(otherEntry, stack)) { + for (EntryStack recipesFor : recipesForStacks) { + if (EntryStacks.equalsFuzzy(otherEntry, recipesFor)) { set.add(display); break back; } @@ -107,12 +114,12 @@ public class ViewsImpl implements Views { } } } - if (!usagesFor.isEmpty()) { + if (!usagesForStacks.isEmpty()) { back: for (List> input : display.getInputEntries()) { for (EntryStack otherEntry : input) { - for (EntryStack stack : usagesFor) { - if (EntryStacks.equalsFuzzy(otherEntry, stack)) { + for (EntryStack usagesFor : usagesForStacks) { + if (EntryStacks.equalsFuzzy(otherEntry, usagesFor)) { set.add(display); break back; } @@ -121,8 +128,8 @@ public class ViewsImpl implements Views { } } } - for (EntryStack stack : usagesFor) { - if (isStackWorkStationOfCategory(categoryConfiguration, stack)) { + for (EntryStack usagesFor : usagesForStacks) { + if (isStackWorkStationOfCategory(categoryConfiguration, usagesFor)) { set.addAll(CollectionUtils.filterToSet(allRecipesFromCategory, displayRegistry::isDisplayVisible)); break; } @@ -229,7 +236,7 @@ public class ViewsImpl implements Views { } String message = String.format("Built Recipe View in %s for %d categories, %d recipes for, %d usages for and %d live recipe generators.", - stopwatch.stop(), categories.size(), recipesFor.size(), usagesFor.size(), generatorsCount); + stopwatch.stop(), categories.size(), recipesForStacks.size(), usagesForStacks.size(), generatorsCount); if (ConfigObject.getInstance().doDebugSearchTimeRequired()) { RoughlyEnoughItemsCore.LOGGER.info(message); } else { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java index 3e304f41e..1d3486971 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java @@ -146,6 +146,11 @@ public abstract class AbstractEntryStack implements EntryStack, Renderer { return wrap(getDefinition().normalize(this, getValue()), false); } + @Override + public EntryStack wildcard() { + return wrap(getDefinition().wildcard(this, getValue()), false); + } + protected EntryStack wrap(A value, boolean copySettings) { TypedEntryStack stack = new TypedEntryStack<>(getDefinition(), value); if (copySettings) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java index 582590f3b..0cfb65533 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java @@ -100,6 +100,11 @@ public class BuiltinEntryDefinition implements EntryDefinition, EntrySeria return value; } + @Override + public T wildcard(EntryStack entry, T value) { + return value; + } + @Override public long hash(EntryStack entry, T value, ComparisonContext context) { return empty ? 0 : Objects.hash(value.getClass().getName(), value); diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java index 6ddaba0ba..afb0f3613 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java @@ -130,9 +130,14 @@ public class FluidEntryDefinition implements EntryDefinition, EntryS public FluidStack normalize(EntryStack entry, FluidStack value) { Fluid fluid = value.getFluid(); if (fluid instanceof FlowingFluid flowingFluid) fluid = flowingFluid.getSource(); - FluidStack copy = FluidStack.create(fluid, value.getAmount(), value.getTag()); - copy.setAmount(FluidStack.bucketAmount()); - return copy; + return FluidStack.create(fluid, FluidStack.bucketAmount(), value.getTag()); + } + + @Override + public FluidStack wildcard(EntryStack entry, FluidStack value) { + Fluid fluid = value.getFluid(); + if (fluid instanceof FlowingFluid) fluid = ((FlowingFluid) fluid).getSource(); + return FluidStack.create(fluid, FluidStack.bucketAmount()); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java index 647d2c7dc..9b34f65d8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java @@ -128,6 +128,11 @@ public class ItemEntryDefinition implements EntryDefinition, EntrySer return copy; } + @Override + public ItemStack wildcard(EntryStack entry, ItemStack value) { + return new ItemStack(value.getItem(), 1); + } + @Override public long hash(EntryStack entry, ItemStack value, ComparisonContext context) { int code = 1; -- cgit