From 43ae584e12c7ed0755301eb34223f644a717183e Mon Sep 17 00:00:00 2001 From: shedaniel Date: Thu, 18 Mar 2021 02:16:22 +0800 Subject: Add EntryStack normalization Signed-off-by: shedaniel --- .../me/shedaniel/rei/api/ingredient/EntryStack.java | 7 ++----- .../rei/api/ingredient/entry/EntryDefinition.java | 2 ++ .../rei/api/ingredient/entry/EntryTypeRegistry.java | 13 +++++++++++++ .../shedaniel/rei/api/ingredient/util/EntryStacks.java | 17 ++++++++++------- .../me/shedaniel/rei/api/registry/display/Display.java | 1 - 5 files changed, 27 insertions(+), 13 deletions(-) (limited to 'api/src/main') 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 extends TextRepresentable, Renderer { return null; } - @NotNull EntryDefinition getDefinition(); - @NotNull default EntryType getType() { return getDefinition().getType(); } - @NotNull default Class getValueType() { return getDefinition().getValueType(); } - @NotNull default EntryRenderer getRenderer() { return getDefinition().getRenderer(); } @@ -128,6 +123,8 @@ public interface EntryStack extends TextRepresentable, Renderer { return copy(); } + EntryStack 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 copy(EntryStack entry, T value); + T normalize(EntryStack entry, T value); + int hash(EntryStack 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> values(); + /** + * Register a bridge between two entry types, for example, item to fluid, this is used, to + * approximately match two entry stacks,. + *

+ * 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 the type of the original entry type + * @param the type of the destination entry type + */ void registerBridge(EntryType original, EntryType destination, EntryTypeBridge bridge); Iterable> getBridgesFor(EntryType original, EntryType 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 leftType = left.getType(); EntryType rightType = right.getType(); - if (leftType == rightType) + if (leftType == rightType) { return left.equals((EntryStack) right, context); + } + if (context == ComparisonContext.EXACT) return false; for (EntryTypeBridge bridge : EntryTypeRegistry.getInstance().getBridgesFor(leftType, rightType)) { InteractionResultHolder>> holder = bridge.bridge(left); - if (holder.getResult().shouldSwing()) { + if (holder.getResult() == InteractionResult.SUCCESS) { Iterator> iterator = holder.getObject().iterator(); while (iterator.hasNext()) { - EntryStack bridged = iterator.next(); - if (bridged.equals(right, context)) + if (iterator.next().equals(right, context)) { return true; + } } } } for (EntryTypeBridge bridge : EntryTypeRegistry.getInstance().getBridgesFor(rightType, leftType)) { InteractionResultHolder>> holder = bridge.bridge(right); - if (holder.getResult().shouldSwing()) { + if (holder.getResult() == InteractionResult.SUCCESS) { Iterator> iterator = holder.getObject().iterator(); while (iterator.hasNext()) { - EntryStack 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 */ -- cgit