diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-10-16 00:37:19 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2021-10-16 00:50:42 +0800 |
| commit | 6e7a641926d8b0ea2d0a1caddbf348fe24b669ce (patch) | |
| tree | 58820c892f893b7a53eeb33448f5936a70469433 /api | |
| parent | 3a84bfa28bb233b3a6f0a14f2e90956a98512453 (diff) | |
| download | RoughlyEnoughItems-6e7a641926d8b0ea2d0a1caddbf348fe24b669ce.tar.gz RoughlyEnoughItems-6e7a641926d8b0ea2d0a1caddbf348fe24b669ce.tar.bz2 RoughlyEnoughItems-6e7a641926d8b0ea2d0a1caddbf348fe24b669ce.zip | |
Fix JEI recipes duplicating and going to the wrong category, Fix JER's insane resource reload during plugin application, Add DisplayAdditionReason, Safeguard DisplayCategory#setupDisplay
Diffstat (limited to 'api')
4 files changed, 139 insertions, 2 deletions
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<REIClientPlugin> { * @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); } } @@ -275,6 +289,21 @@ public interface DisplayRegistry extends RecipeManagerContext<REIClientPlugin> { * 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 <T> the type of object + * @param <D> the type of display + */ + @ApiStatus.Experimental + <T, D extends Display> void registerFiller(Class<T> typeClass, BiPredicate<? extends T, DisplayAdditionReasons> predicate, Function<? extends T, D> filler); + + /** + * Registers a display filler, to be filled during {@link #tryFillDisplay(Object)}. + * <p> + * Vanilla {@link Recipe} are by default filled, display filters + * can be used to automatically generate displaies for vanilla {@link Recipe}. + * * @param predicate the predicate of the object * @param filler the filler, taking an object and returning a {@code D} * @param <D> the type of display @@ -288,7 +317,19 @@ public interface DisplayRegistry extends RecipeManagerContext<REIClientPlugin> { * @param <T> the type of object * @return the collection of displays */ - <T> Collection<Display> tryFillDisplay(T value); + default <T> Collection<Display> tryFillDisplay(T value) { + return tryFillDisplay(value, DisplayAdditionReason.NONE); + } + + /** + * Tries to fill displays from {@code T}. + * + * @param value the object + * @param <T> the type of object + * @return the collection of displays + */ + @ApiStatus.Experimental + <T> Collection<Display> 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 extends DisplayAdditionReason> T get(Class<? extends T> c); + + @Nullable <T extends DisplayAdditionReason> T get(T c); + + <T extends DisplayAdditionReason> boolean has(Class<? extends T> c); + + <T extends DisplayAdditionReason> 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 extends DisplayAdditionReason> T get(Class<? extends T> c) { + for (DisplayAdditionReason reason : reasons) { + if (Objects.equals(reason.getClass(), c)) { + return (T) reason; + } + } + return null; + } + + @Override + public <T extends DisplayAdditionReason> @Nullable T get(T c) { + for (DisplayAdditionReason reason : reasons) { + if (Objects.equals(reason, c)) { + return (T) reason; + } + } + return null; + } + + @Override + public <T extends DisplayAdditionReason> boolean has(Class<? extends T> c) { + for (DisplayAdditionReason reason : reasons) { + if (Objects.equals(reason.getClass(), c)) { + return true; + } + } + return false; + } + + @Override + public <T extends DisplayAdditionReason> 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 724dc0fed..2599281e8 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<P extends REIPlugin<?>> extends Comparable<REIPlugin< default Collection<P> provide() { return Collections.singletonList((P) this); } + + @ApiStatus.Internal + @ApiStatus.Experimental + default boolean shouldBeForcefullyDoneOnMainThread(Reloadable<?> reloadable) { + return false; + } } |
