From 30f15ae18053cdc2fec89d9cb40822174b42cb3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=97=E3=82=8D=E3=81=97=E3=82=85=E3=82=93?= <39247022+Siroshun09@users.noreply.github.com> Date: Thu, 29 Oct 2026 17:52:49 +0900 Subject: [PATCH 1/2] fix(craft): skip empty shaped recipe slots --- .../okocraft/box/feature/craft/loader/Processor.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/features/craft/src/main/java/net/okocraft/box/feature/craft/loader/Processor.java b/features/craft/src/main/java/net/okocraft/box/feature/craft/loader/Processor.java index f72a667b60..c2ece503c5 100644 --- a/features/craft/src/main/java/net/okocraft/box/feature/craft/loader/Processor.java +++ b/features/craft/src/main/java/net/okocraft/box/feature/craft/loader/Processor.java @@ -123,7 +123,12 @@ private void processShapedRecipe(@NotNull ShapedRecipe recipe, @NotNull BoxItem continue; } - IngredientHolder ingredient = this.convertChoice(row * 3 + column, choices.get(symbol)); + RecipeChoice choice = choices.get(symbol); + if (choice == null || choice == RecipeChoice.empty()) { + continue; + } + + IngredientHolder ingredient = this.convertChoice(row * 3 + column, choice); if (ingredient == null || ingredient.patterns().isEmpty()) { return; } @@ -167,8 +172,8 @@ private void processCustomRecipe(@Nullable BoxItem @NotNull [] ingredients, @Not } private @Nullable IngredientHolder convertChoice(int slot, @Nullable RecipeChoice choice) { - if (choice instanceof RecipeChoice.MaterialChoice materialChoice) { - return IngredientHolder.fromMaterialChoice(slot, materialChoice); + if (choice instanceof RecipeChoice.ItemTypeChoice itemTypeChoice) { + return IngredientHolder.fromItemTypeChoice(slot, itemTypeChoice); } if (choice instanceof RecipeChoice.ExactChoice exactChoice) { return IngredientHolder.fromExactChoice(slot, exactChoice); From b69157d22b4aa7d70d3529cbeb183dc4ad41ec8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=97=E3=82=8D=E3=81=97=E3=82=85=E3=82=93?= <39247022+Siroshun09@users.noreply.github.com> Date: Thu, 29 Oct 2026 17:52:51 +0900 Subject: [PATCH 2/2] refactor(craft): use ItemTypeChoice for recipe ingredients --- .../feature/craft/model/IngredientHolder.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/features/craft/src/main/java/net/okocraft/box/feature/craft/model/IngredientHolder.java b/features/craft/src/main/java/net/okocraft/box/feature/craft/model/IngredientHolder.java index 52adafddae..72b0f9c8b2 100644 --- a/features/craft/src/main/java/net/okocraft/box/feature/craft/model/IngredientHolder.java +++ b/features/craft/src/main/java/net/okocraft/box/feature/craft/model/IngredientHolder.java @@ -1,11 +1,16 @@ package net.okocraft.box.feature.craft.model; +import io.papermc.paper.registry.TypedKey; + +import org.bukkit.Registry; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.ItemType; import org.bukkit.inventory.RecipeChoice; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Unmodifiable; +import java.util.ArrayList; import java.util.List; /** @@ -37,14 +42,18 @@ public static void disableCache() { } /** - * Creates a {@link IngredientHolder} from {@link org.bukkit.inventory.RecipeChoice.MaterialChoice}. + * Creates a {@link IngredientHolder} from {@link RecipeChoice.ItemTypeChoice}. * * @param slot the position in the crafting table (0-8) - * @param choice the {@link org.bukkit.inventory.RecipeChoice.MaterialChoice} instance to create {@link IngredientHolder} + * @param choice the {@link RecipeChoice.ItemTypeChoice} instance to create {@link IngredientHolder} * @return a {@link IngredientHolder} */ - public static @NotNull IngredientHolder fromMaterialChoice(int slot, @NotNull RecipeChoice.MaterialChoice choice) { - return ModelCache.getIngredientHolder(slot, choice.getChoices().stream().map(ItemStack::new).toList()); + public static @NotNull IngredientHolder fromItemTypeChoice(int slot, @NotNull RecipeChoice.ItemTypeChoice choice) { + List itemStacks = new ArrayList<>(); + for (TypedKey type : choice.itemTypes()) { + itemStacks.add(Registry.ITEM.getOrThrow(type).createItemStack()); + } + return ModelCache.getIngredientHolder(slot, itemStacks); } /**