From 7f03b0ac4dbfb065ca4495181228fc32f84c0642 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 16 Oct 2021 00:37:19 +0800 Subject: Fix JEI recipes duplicating and going to the wrong category, Fix JER's insane resource reload during plugin application, Add DisplayAdditionReason, Safeguard DisplayCategory#setupDisplay --- .../client/registry/display/DisplayRegistry.java | 45 +++++++++++++- .../display/reason/DisplayAdditionReason.java | 21 +++++++ .../display/reason/DisplayAdditionReasons.java | 68 ++++++++++++++++++++++ .../rei/api/common/plugins/REIPlugin.java | 7 +++ 4 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 api/src/main/java/me/shedaniel/rei/api/client/registry/display/reason/DisplayAdditionReason.java create mode 100644 api/src/main/java/me/shedaniel/rei/api/client/registry/display/reason/DisplayAdditionReasons.java (limited to 'api/src/main/java') diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/display/DisplayRegistry.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/display/DisplayRegistry.java index 2ecb40967..ad3a2aa18 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/registry/display/DisplayRegistry.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/display/DisplayRegistry.java @@ -25,6 +25,8 @@ package me.shedaniel.rei.api.client.registry.display; import com.google.common.base.Predicates; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; +import me.shedaniel.rei.api.client.registry.display.reason.DisplayAdditionReason; +import me.shedaniel.rei.api.client.registry.display.reason.DisplayAdditionReasons; import me.shedaniel.rei.api.client.registry.display.visibility.DisplayVisibilityPredicate; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; @@ -34,9 +36,11 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeType; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.function.BiPredicate; import java.util.function.Function; import java.util.function.Predicate; @@ -100,10 +104,20 @@ public interface DisplayRegistry extends RecipeManagerContext { * @param object the object to be filled */ default void add(Object object) { + addWithReason(object, DisplayAdditionReason.NONE); + } + + /** + * Registers a display by the object provided, to be filled during {@link #tryFillDisplay(Object)}. + * + * @param object the object to be filled + */ + @ApiStatus.Experimental + default void addWithReason(Object object, DisplayAdditionReason... reasons) { if (object instanceof Display) { add((Display) object, null); } else { - for (Display display : tryFillDisplay(object)) { + for (Display display : tryFillDisplay(object, reasons)) { add(display, object); } } @@ -269,6 +283,21 @@ public interface DisplayRegistry extends RecipeManagerContext { */ void registerFiller(Class typeClass, Predicate predicate, Function filler); + /** + * Registers a display filler, to be filled during {@link #tryFillDisplay(Object)}. + *

+ * Vanilla {@link Recipe} are by default filled, display filters + * can be used to automatically generate displaies for vanilla {@link Recipe}. + * + * @param typeClass the type of {@code T} + * @param predicate the predicate of {@code T} and reason + * @param filler the filler, taking a {@code T} and returning a {@code D} + * @param the type of object + * @param the type of display + */ + @ApiStatus.Experimental + void registerFiller(Class typeClass, BiPredicate predicate, Function filler); + /** * Registers a display filler, to be filled during {@link #tryFillDisplay(Object)}. *

@@ -288,7 +317,19 @@ public interface DisplayRegistry extends RecipeManagerContext { * @param the type of object * @return the collection of displays */ - Collection tryFillDisplay(T value); + default Collection tryFillDisplay(T value) { + return tryFillDisplay(value, DisplayAdditionReason.NONE); + } + + /** + * Tries to fill displays from {@code T}. + * + * @param value the object + * @param the type of object + * @return the collection of displays + */ + @ApiStatus.Experimental + Collection tryFillDisplay(T value, DisplayAdditionReason... reasons); @Nullable Object getDisplayOrigin(Display display); diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/display/reason/DisplayAdditionReason.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/display/reason/DisplayAdditionReason.java new file mode 100644 index 000000000..aae5244f2 --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/display/reason/DisplayAdditionReason.java @@ -0,0 +1,21 @@ +package me.shedaniel.rei.api.client.registry.display.reason; + +import org.jetbrains.annotations.ApiStatus; + +/** + * Reason for adding a display, used for {@link me.shedaniel.rei.api.client.registry.display.DisplayRegistry#tryFillDisplay(Object, DisplayAdditionReason...)} + * Plugins may filter their filler with reasons, this class can be implemented to provide additional context to fillers. + */ +@ApiStatus.Experimental +public interface DisplayAdditionReason { + DisplayAdditionReason[] NONE = new DisplayAdditionReason[0]; + /** + * Denotes that the display is added automatically by REI's RecipeManager, + * fillers which do not wish to be added with this should filter with this. + */ + DisplayAdditionReason RECIPE_MANAGER = simple(); + + static DisplayAdditionReason simple() { + return new DisplayAdditionReason() {}; + } +} diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/display/reason/DisplayAdditionReasons.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/display/reason/DisplayAdditionReasons.java new file mode 100644 index 000000000..ed3e43126 --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/display/reason/DisplayAdditionReasons.java @@ -0,0 +1,68 @@ +package me.shedaniel.rei.api.client.registry.display.reason; + +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +@ApiStatus.Experimental +public interface DisplayAdditionReasons { + @Nullable T get(Class c); + + @Nullable T get(T c); + + boolean has(Class c); + + boolean has(T c); + + @ApiStatus.Internal + class Impl implements DisplayAdditionReasons { + public static final Impl EMPTY = new Impl(DisplayAdditionReason.NONE); + private final DisplayAdditionReason[] reasons; + + public Impl(DisplayAdditionReason[] reasons) { + this.reasons = reasons; + } + + @Override + @Nullable + public T get(Class c) { + for (DisplayAdditionReason reason : reasons) { + if (Objects.equals(reason.getClass(), c)) { + return (T) reason; + } + } + return null; + } + + @Override + public @Nullable T get(T c) { + for (DisplayAdditionReason reason : reasons) { + if (Objects.equals(reason, c)) { + return (T) reason; + } + } + return null; + } + + @Override + public boolean has(Class c) { + for (DisplayAdditionReason reason : reasons) { + if (Objects.equals(reason.getClass(), c)) { + return true; + } + } + return false; + } + + @Override + public boolean has(T c) { + for (DisplayAdditionReason reason : reasons) { + if (Objects.equals(reason, c)) { + return true; + } + } + return false; + } + } +} diff --git a/api/src/main/java/me/shedaniel/rei/api/common/plugins/REIPlugin.java b/api/src/main/java/me/shedaniel/rei/api/common/plugins/REIPlugin.java index 35394feab..2d3bcf5fc 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/plugins/REIPlugin.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/plugins/REIPlugin.java @@ -29,6 +29,7 @@ import me.shedaniel.rei.api.common.entry.comparison.FluidComparatorRegistry; import me.shedaniel.rei.api.common.entry.comparison.ItemComparatorRegistry; import me.shedaniel.rei.api.common.entry.type.EntryTypeRegistry; import me.shedaniel.rei.api.common.fluid.FluidSupportProvider; +import me.shedaniel.rei.api.common.registry.Reloadable; import org.jetbrains.annotations.ApiStatus; import java.util.Collection; @@ -107,4 +108,10 @@ public interface REIPlugin

> extends Comparable provide() { return Collections.singletonList((P) this); } + + @ApiStatus.Internal + @ApiStatus.Experimental + default boolean shouldBeForcefullyDoneOnMainThread(Reloadable reloadable) { + return false; + } } -- cgit