aboutsummaryrefslogtreecommitdiff
path: root/api/src
diff options
context:
space:
mode:
Diffstat (limited to 'api/src')
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/registry/display/DisplayRegistry.java45
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/registry/display/reason/DisplayAdditionReason.java21
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/registry/display/reason/DisplayAdditionReasons.java68
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/common/plugins/REIPlugin.java7
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;
+ }
}