diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-03-18 02:16:22 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2021-03-18 02:16:22 +0800 |
| commit | 43ae584e12c7ed0755301eb34223f644a717183e (patch) | |
| tree | 5d5eebf04f074fcb84062e1de3a67dcef36c9600 | |
| parent | 4e26c83691cf4ce0a19dc2244e31bd73e551865e (diff) | |
| download | RoughlyEnoughItems-43ae584e12c7ed0755301eb34223f644a717183e.tar.gz RoughlyEnoughItems-43ae584e12c7ed0755301eb34223f644a717183e.tar.bz2 RoughlyEnoughItems-43ae584e12c7ed0755301eb34223f644a717183e.zip | |
Add EntryStack normalization
Signed-off-by: shedaniel <daniel@shedaniel.me>
19 files changed, 72 insertions, 31 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/ingredient/EntryStack.java b/api/src/main/java/me/shedaniel/rei/api/ingredient/EntryStack.java index eb8adb020..d39bd4dde 100644 --- a/api/src/main/java/me/shedaniel/rei/api/ingredient/EntryStack.java +++ b/api/src/main/java/me/shedaniel/rei/api/ingredient/EntryStack.java @@ -43,7 +43,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.GsonHelper; import net.minecraft.util.Unit; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -99,20 +98,16 @@ public interface EntryStack<T> extends TextRepresentable, Renderer { return null; } - @NotNull EntryDefinition<T> getDefinition(); - @NotNull default EntryType<T> getType() { return getDefinition().getType(); } - @NotNull default Class<T> getValueType() { return getDefinition().getValueType(); } - @NotNull default EntryRenderer<T> getRenderer() { return getDefinition().getRenderer(); } @@ -128,6 +123,8 @@ public interface EntryStack<T> extends TextRepresentable, Renderer { return copy(); } + EntryStack<T> normalize(); + @Deprecated int hashCode(); diff --git a/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryDefinition.java b/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryDefinition.java index a7d893b42..faa35334a 100644 --- a/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryDefinition.java +++ b/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryDefinition.java @@ -45,6 +45,8 @@ public interface EntryDefinition<T> { T copy(EntryStack<T> entry, T value); + T normalize(EntryStack<T> entry, T value); + int hash(EntryStack<T> entry, T value, ComparisonContext context); boolean equals(T o1, T o2, ComparisonContext context); diff --git a/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryTypeRegistry.java b/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryTypeRegistry.java index 2397b46a5..eb11722dc 100644 --- a/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryTypeRegistry.java +++ b/api/src/main/java/me/shedaniel/rei/api/ingredient/entry/EntryTypeRegistry.java @@ -79,6 +79,19 @@ public interface EntryTypeRegistry extends Reloadable { Set<EntryDefinition<?>> values(); + /** + * Register a bridge between two entry types, for example, item to fluid, this is used, to + * approximately match two entry stacks,. + * <p> + * For bridging two entry types, only 1 one way bridge is required, two way bridges are discouraged + * for performance issues. + * + * @param original the original entry type + * @param destination the destination entry type + * @param bridge the bridge to bridge between the original and the destination types + * @param <A> the type of the original entry type + * @param <B> the type of the destination entry type + */ <A, B> void registerBridge(EntryType<A> original, EntryType<B> destination, EntryTypeBridge<A, B> bridge); <A, B> Iterable<EntryTypeBridge<A, B>> getBridgesFor(EntryType<A> original, EntryType<B> destination); diff --git a/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryStacks.java b/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryStacks.java index 51618ecc8..cf6eb454d 100644 --- a/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryStacks.java +++ b/api/src/main/java/me/shedaniel/rei/api/ingredient/util/EntryStacks.java @@ -29,6 +29,7 @@ import me.shedaniel.architectury.utils.Fraction; import me.shedaniel.rei.api.gui.Renderer; import me.shedaniel.rei.api.ingredient.EntryStack; import me.shedaniel.rei.api.ingredient.entry.*; +import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; @@ -138,27 +139,29 @@ public final class EntryStacks { if (left == right) return true; EntryType<A> leftType = left.getType(); EntryType<B> rightType = right.getType(); - if (leftType == rightType) + if (leftType == rightType) { return left.equals((EntryStack<A>) right, context); + } + if (context == ComparisonContext.EXACT) return false; for (EntryTypeBridge<A, B> bridge : EntryTypeRegistry.getInstance().getBridgesFor(leftType, rightType)) { InteractionResultHolder<Stream<EntryStack<B>>> holder = bridge.bridge(left); - if (holder.getResult().shouldSwing()) { + if (holder.getResult() == InteractionResult.SUCCESS) { Iterator<EntryStack<B>> iterator = holder.getObject().iterator(); while (iterator.hasNext()) { - EntryStack<B> bridged = iterator.next(); - if (bridged.equals(right, context)) + if (iterator.next().equals(right, context)) { return true; + } } } } for (EntryTypeBridge<B, A> bridge : EntryTypeRegistry.getInstance().getBridgesFor(rightType, leftType)) { InteractionResultHolder<Stream<EntryStack<A>>> holder = bridge.bridge(right); - if (holder.getResult().shouldSwing()) { + if (holder.getResult() == InteractionResult.SUCCESS) { Iterator<EntryStack<A>> iterator = holder.getObject().iterator(); while (iterator.hasNext()) { - EntryStack<A> bridged = iterator.next(); - if (bridged.equals(left, context)) + if (iterator.next().equals(left, context)) { return true; + } } } } diff --git a/api/src/main/java/me/shedaniel/rei/api/registry/display/Display.java b/api/src/main/java/me/shedaniel/rei/api/registry/display/Display.java index 8f131ca3f..8eb95728c 100644 --- a/api/src/main/java/me/shedaniel/rei/api/registry/display/Display.java +++ b/api/src/main/java/me/shedaniel/rei/api/registry/display/Display.java @@ -30,7 +30,6 @@ import java.util.List; import java.util.Optional; public interface Display { - /** * @return a list of inputs */ diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/modules/entries/EntryStackSubsetsMenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/gui/modules/entries/EntryStackSubsetsMenuEntry.java index 89cea637c..43fe57510 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/modules/entries/EntryStackSubsetsMenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/modules/entries/EntryStackSubsetsMenuEntry.java @@ -100,7 +100,7 @@ public class EntryStackSubsetsMenuEntry extends MenuEntry { if (isFiltered()) { filteredStacks.removeIf(next -> EntryStacks.equalsIgnoreCount(next, stack)); } else { - filteredStacks.add(stack.copy()); + filteredStacks.add(stack.normalize()); } Menu menu = ((ContainerScreenOverlay) REIHelper.getInstance().getOverlay().get()).getOverlayMenu(); if (menu != null) diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/modules/entries/SubSubsetsMenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/gui/modules/entries/SubSubsetsMenuEntry.java index 095e0320f..7efe4f886 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/modules/entries/SubSubsetsMenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/modules/entries/SubSubsetsMenuEntry.java @@ -175,7 +175,7 @@ public class SubSubsetsMenuEntry extends MenuEntry { if (!filtered) { filteredStacks.removeIf(next -> EntryStacks.equalsIgnoreCount(next, ((EntryStackSubsetsMenuEntry) entry).stack)); } else { - filteredStacks.add(((EntryStackSubsetsMenuEntry) entry).stack.copy()); + filteredStacks.add(((EntryStackSubsetsMenuEntry) entry).stack.normalize()); } } if (subsetsMenu != null) diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/plugin/DefaultRuntimePlugin.java b/runtime/src/main/java/me/shedaniel/rei/gui/plugin/DefaultRuntimePlugin.java index b0f2a7ebf..f12b169fd 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/plugin/DefaultRuntimePlugin.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/plugin/DefaultRuntimePlugin.java @@ -193,12 +193,12 @@ public class DefaultRuntimePlugin implements REIPlugin { private final int hashIgnoreAmount; public EntryStackFavoriteEntry(EntryStack<?> stack) { - this.stack = stack.copy(); + this.stack = stack.normalize(); if (this.stack.getType() == VanillaEntryTypes.ITEM) this.stack.setting(EntryStack.Settings.RENDER_COUNTS, EntryStack.Settings.FALSE); else if (this.stack.getType() == VanillaEntryTypes.FLUID) this.stack.setting(EntryStack.Settings.Fluid.AMOUNT_TOOLTIP, CANCEL_FLUID_AMOUNT); - this.hashIgnoreAmount = stack.hash(ComparisonContext.IGNORE_COUNT); + this.hashIgnoreAmount = EntryStacks.hashIgnoreCount(this.stack); } @Override @@ -237,7 +237,7 @@ public class DefaultRuntimePlugin implements REIPlugin { @Override public FavoriteEntry copy() { - return new EntryStackFavoriteEntry(stack.copy()); + return new EntryStackFavoriteEntry(stack.normalize()); } @Override @@ -249,7 +249,7 @@ public class DefaultRuntimePlugin implements REIPlugin { public boolean isSame(FavoriteEntry other) { if (!(other instanceof EntryStackFavoriteEntry)) return false; EntryStackFavoriteEntry that = (EntryStackFavoriteEntry) other; - return EntryStacks.equals(stack, that.stack, ComparisonContext.IGNORE_COUNT); + return EntryStacks.equalsIgnoreCount(stack, that.stack); } } } diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/FluidEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/FluidEntryDefinition.java index 0db3e1705..2123001c6 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/FluidEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/FluidEntryDefinition.java @@ -86,11 +86,18 @@ public class FluidEntryDefinition implements EntryDefinition<FluidStack>, EntryS } @Override - public @NotNull FluidStack copy(EntryStack<FluidStack> entry, FluidStack value) { + public FluidStack copy(EntryStack<FluidStack> entry, FluidStack value) { return value.copy(); } @Override + public FluidStack normalize(EntryStack<FluidStack> entry, FluidStack value) { + FluidStack copy = value.copy(); + copy.setAmount(FluidStack.bucketAmount()); + return copy; + } + + @Override public int hash(EntryStack<FluidStack> entry, FluidStack value, ComparisonContext context) { int code = 1; code = 31 * code + value.getFluid().hashCode(); diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/ItemEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/ItemEntryDefinition.java index 66d460784..4bd13e725 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/ItemEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/ItemEntryDefinition.java @@ -92,11 +92,18 @@ public class ItemEntryDefinition implements EntryDefinition<ItemStack>, EntrySer } @Override - public @NotNull ItemStack copy(EntryStack<ItemStack> entry, ItemStack value) { + public ItemStack copy(EntryStack<ItemStack> entry, ItemStack value) { return value.copy(); } @Override + public ItemStack normalize(EntryStack<ItemStack> entry, ItemStack value) { + ItemStack copy = value.copy(); + copy.setCount(127); + return copy; + } + + @Override public int hash(EntryStack<ItemStack> entry, ItemStack value, ComparisonContext context) { int code = 1; code = 31 * code + System.identityHashCode(value.getItem()); diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListEntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListEntryWidget.java index c3f41bcb2..d2e1e822e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListEntryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListEntryWidget.java @@ -107,7 +107,7 @@ public abstract class EntryListEntryWidget extends EntryWidget { entry = EntryStacks.of(bucketItem); } } - return EntryStacks.equals(entry, stack, ComparisonContext.IGNORE_COUNT); + return EntryStacks.equalsIgnoreCount(entry, stack); } } return super.cancelDeleteItems(stack); diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java index 9ae643bd1..e95cfec59 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java @@ -535,7 +535,7 @@ public class EntryListWidget extends WidgetWithBounds { List<EntryStack<?>> filtered = Lists.newArrayList(); for (EntryStack<?> stack : partitionStacks) { if (canLastSearchTermsBeAppliedTo(stack)) { - if (workingItems != null && !workingItems.contains(stack.hash(ComparisonContext.IGNORE_COUNT))) + if (workingItems != null && !workingItems.contains(EntryStacks.hashIgnoreCount(stack))) continue; filtered.add(stack.rewrap().setting(EntryStack.Settings.RENDER_COUNTS, EntryStack.Settings.FALSE)); } @@ -556,7 +556,7 @@ public class EntryListWidget extends WidgetWithBounds { } else { for (EntryStack<?> stack : stacks) { if (canLastSearchTermsBeAppliedTo(stack)) { - if (workingItems != null && !workingItems.contains(stack.hash(ComparisonContext.IGNORE_COUNT))) + if (workingItems != null && !workingItems.contains(EntryStacks.hashIgnoreCount(stack))) continue; list.add(stack.rewrap().setting(EntryStack.Settings.RENDER_COUNTS, EntryStack.Settings.FALSE)); } diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java index 586a894f6..68c783982 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java @@ -406,7 +406,7 @@ public class EntryWidget extends Slot implements DraggableStackProvider { @ApiStatus.Internal protected FavoriteEntry asFavoriteEntry() { - return FavoriteEntry.fromEntryStack(getCurrentEntry().copy()); + return FavoriteEntry.fromEntryStack(getCurrentEntry().normalize()); } @ApiStatus.Internal diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/AmountIgnoredEntryStackWrapper.java b/runtime/src/main/java/me/shedaniel/rei/impl/AmountIgnoredEntryStackWrapper.java index 829026318..344173e15 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/AmountIgnoredEntryStackWrapper.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/AmountIgnoredEntryStackWrapper.java @@ -24,7 +24,7 @@ package me.shedaniel.rei.impl; import me.shedaniel.rei.api.ingredient.EntryStack; -import me.shedaniel.rei.api.ingredient.entry.ComparisonContext; +import me.shedaniel.rei.api.ingredient.util.EntryStacks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import org.jetbrains.annotations.ApiStatus; @@ -39,7 +39,7 @@ public class AmountIgnoredEntryStackWrapper { public AmountIgnoredEntryStackWrapper(EntryStack<?> stack) { this.stack = Objects.requireNonNull(stack); - this.hash = stack.hash(ComparisonContext.IGNORE_COUNT); + this.hash = EntryStacks.hashIgnoreCount(stack); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/TypedEntryStack.java b/runtime/src/main/java/me/shedaniel/rei/impl/TypedEntryStack.java index 6c6da8652..f5c53c4a4 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/TypedEntryStack.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/TypedEntryStack.java @@ -94,6 +94,15 @@ public class TypedEntryStack<T> extends AbstractEntryStack<T> { } @Override + public EntryStack<T> normalize() { + TypedEntryStack<T> stack = new TypedEntryStack<>(definition, getDefinition().normalize(this, value)); + for (Short2ObjectMap.Entry<Object> entry : getSettings().short2ObjectEntrySet()) { + stack.setting(EntryStack.Settings.getById(entry.getShortKey()), entry.getValue()); + } + return stack; + } + + @Override public boolean equals(EntryStack<T> other, ComparisonContext context) { return this.getDefinition().equals(value, other.getValue(), context); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/entry/EmptyEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/impl/entry/EmptyEntryDefinition.java index 59fa733ad..81614a3fb 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/entry/EmptyEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/entry/EmptyEntryDefinition.java @@ -97,6 +97,11 @@ public enum EmptyEntryDefinition implements EntryDefinition<Object>, EntrySerial } @Override + public Object normalize(EntryStack<Object> entry, Object value) { + return value; + } + + @Override public int hash(EntryStack<Object> entry, Object value, ComparisonContext context) { return ordinal(); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/ManualFilteringRule.java b/runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/ManualFilteringRule.java index 89477641b..466ce6e36 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/ManualFilteringRule.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/ManualFilteringRule.java @@ -62,7 +62,7 @@ public class ManualFilteringRule extends AbstractFilteringRule<ManualFilteringRu private void processList(Collection<EntryStack<?>> stacks, FilteringResult result) { IntSet filteredStacks = CollectionUtils.mapParallel(ConfigObject.getInstance().getFilteredStacks(), EntryStacks::hashIgnoreCount, IntOpenHashSet::new); - result.hide(stacks.parallelStream().filter(stack -> filteredStacks.contains(stack.hash(ComparisonContext.IGNORE_COUNT))).collect(Collectors.toList())); + result.hide(stacks.parallelStream().filter(stack -> filteredStacks.contains(EntryStacks.hashIgnoreCount(stack))).collect(Collectors.toList())); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/registry/CategoryRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/registry/CategoryRegistryImpl.java index 6283451b9..1d49bc6e3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/registry/CategoryRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/registry/CategoryRegistryImpl.java @@ -132,6 +132,5 @@ public class CategoryRegistryImpl implements CategoryRegistry, Reloadable { public ResourceLocation getIdentifier() { return this.category.getIdentifier(); } - } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/subsets/SubsetsRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/subsets/SubsetsRegistryImpl.java index 5652efaab..816f28113 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/subsets/SubsetsRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/subsets/SubsetsRegistryImpl.java @@ -68,14 +68,14 @@ public class SubsetsRegistryImpl implements SubsetsRegistry { @Override public void registerPathEntry(@NotNull String path, @NotNull EntryStack<?> stack) { - getOrCreatePathEntries(path).add(stack.copy().setting(EntryStack.Settings.CHECK_AMOUNT, EntryStack.Settings.FALSE).setting(EntryStack.Settings.RENDER_COUNTS, EntryStack.Settings.FALSE).setting(EntryStack.Settings.CHECK_TAGS, EntryStack.Settings.TRUE)); + getOrCreatePathEntries(path).add(stack.normalize().setting(EntryStack.Settings.CHECK_AMOUNT, EntryStack.Settings.FALSE).setting(EntryStack.Settings.RENDER_COUNTS, EntryStack.Settings.FALSE).setting(EntryStack.Settings.CHECK_TAGS, EntryStack.Settings.TRUE)); } @Override public void registerPathEntries(@NotNull String path, @NotNull Collection<? extends EntryStack<?>> stacks) { Set<EntryStack<?>> entries = getOrCreatePathEntries(path); for (EntryStack<?> stack : stacks) { - entries.add(stack.copy().setting(EntryStack.Settings.CHECK_AMOUNT, EntryStack.Settings.FALSE).setting(EntryStack.Settings.RENDER_COUNTS, EntryStack.Settings.FALSE).setting(EntryStack.Settings.CHECK_TAGS, EntryStack.Settings.TRUE)); + entries.add(stack.normalize().setting(EntryStack.Settings.CHECK_AMOUNT, EntryStack.Settings.FALSE).setting(EntryStack.Settings.RENDER_COUNTS, EntryStack.Settings.FALSE).setting(EntryStack.Settings.CHECK_TAGS, EntryStack.Settings.TRUE)); } } |
