aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/registry/display/DisplayRegistry.java62
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java18
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/brewing/DefaultBrewingDisplay.java7
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java7
4 files changed, 79 insertions, 15 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 1c9ac5d0c..be9c107ef 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
@@ -33,11 +33,9 @@ import me.shedaniel.rei.api.common.registry.RecipeManagerContext;
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 java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.function.Function;
import java.util.function.Predicate;
@@ -80,13 +78,20 @@ public interface DisplayRegistry extends RecipeManagerContext<REIClientPlugin> {
int displaySize();
/**
- * Registers a recipe display
+ * Registers a display.
*
- * @param display the recipe display
+ * @param display the display
*/
void add(Display display);
/**
+ * Registers a display by the object provided, to be filled during {@link #tryFillDisplay(Object)}.
+ *
+ * @param object the object to be filled
+ */
+ void add(Object object);
+
+ /**
* Returns an unmodifiable map of displays visible to the player
*
* @return an unmodifiable map of displays
@@ -183,6 +188,51 @@ public interface DisplayRegistry extends RecipeManagerContext<REIClientPlugin> {
* @param <T> the type of object
* @param <D> the type of display
*/
+ default <T extends Recipe<?>, D extends Display> void registerRecipeFiller(Class<T> typeClass, RecipeType<? super T> recipeType, Function<? extends T, D> filler) {
+ registerRecipeFiller(typeClass, type -> Objects.equals(recipeType, type), 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 typeClass the type of {@code T}
+ * @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
+ */
+ default <T extends Recipe<?>, D extends Display> void registerRecipeFiller(Class<T> typeClass, Predicate<RecipeType<? super T>> recipeType, Function<? extends T, D> filler) {
+ registerRecipeFiller(typeClass, recipeType, Predicates.alwaysTrue(), 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 typeClass the type of {@code T}
+ * @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
+ */
+ default <T extends Recipe<?>, D extends Display> void registerRecipeFiller(Class<T> typeClass, Predicate<RecipeType<? super T>> recipeType, Predicate<? extends T> predicate, Function<? extends T, D> filler) {
+ registerFiller(typeClass, recipe -> recipeType.test((RecipeType<? super T>) recipe.getType()) && ((Predicate<T>) predicate).test(recipe), 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 typeClass the type of {@code T}
+ * @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
+ */
default <T, D extends Display> void registerFiller(Class<T> typeClass, Function<? extends T, D> filler) {
registerFiller(typeClass, Predicates.alwaysTrue(), filler);
}
diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java
index 4a229a3c2..cfbfa0da2 100644
--- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java
+++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java
@@ -112,7 +112,7 @@ public class DefaultClientPlugin implements REIClientPlugin, BuiltinClientPlugin
@Override
public void registerBrewingRecipe(Ingredient input, Ingredient ingredient, ItemStack output) {
- DisplayRegistry.getInstance().add(new DefaultBrewingDisplay(new BrewingRecipe(input, ingredient, output)));
+ DisplayRegistry.getInstance().add(new BrewingRecipe(input, ingredient, output));
}
@Override
@@ -214,14 +214,14 @@ public class DefaultClientPlugin implements REIClientPlugin, BuiltinClientPlugin
@Override
public void registerDisplays(DisplayRegistry registry) {
- registry.registerFiller(ShapelessRecipe.class, DefaultShapelessDisplay::new);
- registry.registerFiller(ShapedRecipe.class, DefaultShapedDisplay::new);
- registry.registerFiller(SmeltingRecipe.class, DefaultSmeltingDisplay::new);
- registry.registerFiller(SmokingRecipe.class, DefaultSmokingDisplay::new);
- registry.registerFiller(BlastingRecipe.class, DefaultBlastingDisplay::new);
- registry.registerFiller(CampfireCookingRecipe.class, DefaultCampfireDisplay::new);
- registry.registerFiller(StonecutterRecipe.class, DefaultStoneCuttingDisplay::new);
- registry.registerFiller(UpgradeRecipe.class, DefaultSmithingDisplay::new);
+ registry.registerRecipeFiller(ShapelessRecipe.class, RecipeType.CRAFTING, DefaultShapelessDisplay::new);
+ registry.registerRecipeFiller(ShapedRecipe.class, RecipeType.CRAFTING, DefaultShapedDisplay::new);
+ registry.registerRecipeFiller(SmeltingRecipe.class, RecipeType.SMELTING, DefaultSmeltingDisplay::new);
+ registry.registerRecipeFiller(SmokingRecipe.class, RecipeType.SMOKING, DefaultSmokingDisplay::new);
+ registry.registerRecipeFiller(BlastingRecipe.class, RecipeType.BLASTING, DefaultBlastingDisplay::new);
+ registry.registerRecipeFiller(CampfireCookingRecipe.class, RecipeType.CAMPFIRE_COOKING, DefaultCampfireDisplay::new);
+ registry.registerRecipeFiller(StonecutterRecipe.class, RecipeType.STONECUTTING, DefaultStoneCuttingDisplay::new);
+ registry.registerRecipeFiller(UpgradeRecipe.class, RecipeType.SMITHING, DefaultSmithingDisplay::new);
registry.registerFiller(BrewingRecipe.class, DefaultBrewingDisplay::new);
for (Map.Entry<Item, Integer> entry : AbstractFurnaceBlockEntity.getFuel().entrySet()) {
registry.add(new DefaultFuelDisplay(Collections.singletonList(EntryIngredients.of(entry.getKey())), Collections.emptyList(), entry.getValue()));
diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/brewing/DefaultBrewingDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/brewing/DefaultBrewingDisplay.java
index 08bd8ca1d..2da4f7d21 100644
--- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/brewing/DefaultBrewingDisplay.java
+++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/brewing/DefaultBrewingDisplay.java
@@ -38,11 +38,18 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Ingredient;
+import org.jetbrains.annotations.ApiStatus;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+/**
+ * The default display for brewing recipes.
+ *
+ * @see BrewingRecipe
+ */
+@ApiStatus.Internal
public class DefaultBrewingDisplay implements Display {
private EntryStack<?> output;
private EntryIngredient reactant, input;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java
index 98d03acb2..5d5c70789 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java
@@ -71,6 +71,13 @@ public class DisplayRegistryImpl extends RecipeManagerContextImpl<REIClientPlugi
displayCount.increment();
}
+ @Override
+ public void add(Object object) {
+ for (Display display : tryFillDisplay(object)) {
+ add(display);
+ }
+ }
+
public void registerDisplay(int index, Display display) {
displays.computeIfAbsent(display.getCategoryIdentifier(), location -> new ArrayList<>())
.add(index, display);