From ffe0d18125c6bc875c352bdf597ecdaefd332e0c Mon Sep 17 00:00:00 2001 From: Kiber2009 <92222946+Kiber2009@users.noreply.github.com> Date: Wed, 24 Jun 2026 18:41:50 +0300 Subject: [PATCH 1/9] Add `RecipesManager` --- .../plugin/contentapi/ContentApiPlugin.java | 1 + .../kiber2009/plugin/contentapi/RecipesManager.java | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 src/main/java/io/github/kiber2009/plugin/contentapi/RecipesManager.java diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/ContentApiPlugin.java b/src/main/java/io/github/kiber2009/plugin/contentapi/ContentApiPlugin.java index c9276e9..9625932 100644 --- a/src/main/java/io/github/kiber2009/plugin/contentapi/ContentApiPlugin.java +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/ContentApiPlugin.java @@ -21,6 +21,7 @@ public void onEnable() { instance = this; getServer().getPluginManager().registerEvents(new ItemsManager(), this); + getServer().getPluginManager().registerEvents(new RecipesManager(), this); getLifecycleManager().registerEventHandler(LifecycleEvents.COMMANDS, commands -> commands.registrar().register(Commands.literal("contentapi") diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/RecipesManager.java b/src/main/java/io/github/kiber2009/plugin/contentapi/RecipesManager.java new file mode 100644 index 0000000..e2bc1b2 --- /dev/null +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/RecipesManager.java @@ -0,0 +1,12 @@ +package io.github.kiber2009.plugin.contentapi; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.PrepareItemCraftEvent; + +final class RecipesManager implements Listener { + @EventHandler + private static void onPrepareItemCraft(final PrepareItemCraftEvent event) { + // TODO + } +} \ No newline at end of file From 6ba4fcdb198420830c9cfef20fed1e9fd29ef24c Mon Sep 17 00:00:00 2001 From: Kiber2009 <92222946+Kiber2009@users.noreply.github.com> Date: Wed, 24 Jun 2026 18:49:04 +0300 Subject: [PATCH 2/9] Add `CustomRecipeChoice` --- .../contentapi/api/recipe/choice/CustomRecipeChoice.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/choice/CustomRecipeChoice.java diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/choice/CustomRecipeChoice.java b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/choice/CustomRecipeChoice.java new file mode 100644 index 0000000..888dffc --- /dev/null +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/choice/CustomRecipeChoice.java @@ -0,0 +1,7 @@ +package io.github.kiber2009.plugin.contentapi.api.recipe.choice; + +import org.bukkit.inventory.ItemStack; + +public interface CustomRecipeChoice { + boolean test(final ItemStack stack); +} From ad213c84af288009d484de9447e6ebfb2cdf638a Mon Sep 17 00:00:00 2001 From: Kiber2009 <92222946+Kiber2009@users.noreply.github.com> Date: Wed, 24 Jun 2026 18:59:31 +0300 Subject: [PATCH 3/9] Add `CustomRecipe` --- .../plugin/contentapi/api/recipe/CustomRecipe.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/CustomRecipe.java diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/CustomRecipe.java b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/CustomRecipe.java new file mode 100644 index 0000000..43f8fa1 --- /dev/null +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/CustomRecipe.java @@ -0,0 +1,11 @@ +package io.github.kiber2009.plugin.contentapi.api.recipe; + +import org.bukkit.inventory.ItemStack; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +public interface CustomRecipe { + @NonNull ItemStack getResult(); + + boolean match(final @Nullable ItemStack @NonNull [] matrix); +} From 67a5327429e5524ab28160463b77c870dd4f317b Mon Sep 17 00:00:00 2001 From: Kiber2009 <92222946+Kiber2009@users.noreply.github.com> Date: Wed, 24 Jun 2026 19:00:05 +0300 Subject: [PATCH 4/9] Add nullability annotations to `CustomRecipeChoice` --- .../contentapi/api/recipe/choice/CustomRecipeChoice.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/choice/CustomRecipeChoice.java b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/choice/CustomRecipeChoice.java index 888dffc..1b19f87 100644 --- a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/choice/CustomRecipeChoice.java +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/choice/CustomRecipeChoice.java @@ -1,7 +1,8 @@ package io.github.kiber2009.plugin.contentapi.api.recipe.choice; import org.bukkit.inventory.ItemStack; +import org.jspecify.annotations.Nullable; public interface CustomRecipeChoice { - boolean test(final ItemStack stack); + boolean test(final @Nullable ItemStack stack); } From 344c8e3bd4765b3831332b8d67db2024140992cf Mon Sep 17 00:00:00 2001 From: Kiber2009 <92222946+Kiber2009@users.noreply.github.com> Date: Wed, 24 Jun 2026 20:06:23 +0300 Subject: [PATCH 5/9] Remove `CustomRecipeChoice` --- .../contentapi/api/recipe/choice/CustomRecipeChoice.java | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/choice/CustomRecipeChoice.java diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/choice/CustomRecipeChoice.java b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/choice/CustomRecipeChoice.java deleted file mode 100644 index 1b19f87..0000000 --- a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/choice/CustomRecipeChoice.java +++ /dev/null @@ -1,8 +0,0 @@ -package io.github.kiber2009.plugin.contentapi.api.recipe.choice; - -import org.bukkit.inventory.ItemStack; -import org.jspecify.annotations.Nullable; - -public interface CustomRecipeChoice { - boolean test(final @Nullable ItemStack stack); -} From c8d56c47188768c4ab6d11f9052f6cbe8e8d0b82 Mon Sep 17 00:00:00 2001 From: Kiber2009 <92222946+Kiber2009@users.noreply.github.com> Date: Wed, 24 Jun 2026 21:22:50 +0300 Subject: [PATCH 6/9] Implement custom crafting recipes --- .../plugin/contentapi/RecipesManager.java | 9 ++- .../api/recipe/CustomCraftingRecipe.java | 9 +++ .../contentapi/api/recipe/CustomRecipe.java | 3 - .../crafting/CustomShapedCraftingRecipe.java | 56 +++++++++++++++++++ .../CustomShapelessCraftingRecipe.java | 55 ++++++++++++++++++ .../contentapi/registry/GlobalRegistry.java | 4 +- .../recipe/CraftingRecipeGlobalRegistry.java | 18 ++++++ .../registry/recipe/RecipeGlobalRegistry.java | 13 +++++ 8 files changed, 161 insertions(+), 6 deletions(-) create mode 100644 src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/CustomCraftingRecipe.java create mode 100644 src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/crafting/CustomShapedCraftingRecipe.java create mode 100644 src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/crafting/CustomShapelessCraftingRecipe.java create mode 100644 src/main/java/io/github/kiber2009/plugin/contentapi/registry/recipe/CraftingRecipeGlobalRegistry.java create mode 100644 src/main/java/io/github/kiber2009/plugin/contentapi/registry/recipe/RecipeGlobalRegistry.java diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/RecipesManager.java b/src/main/java/io/github/kiber2009/plugin/contentapi/RecipesManager.java index e2bc1b2..1ca2b46 100644 --- a/src/main/java/io/github/kiber2009/plugin/contentapi/RecipesManager.java +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/RecipesManager.java @@ -1,5 +1,7 @@ package io.github.kiber2009.plugin.contentapi; +import io.github.kiber2009.plugin.contentapi.api.recipe.CustomCraftingRecipe; +import io.github.kiber2009.plugin.contentapi.registry.recipe.RecipeGlobalRegistry; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.PrepareItemCraftEvent; @@ -7,6 +9,11 @@ final class RecipesManager implements Listener { @EventHandler private static void onPrepareItemCraft(final PrepareItemCraftEvent event) { - // TODO + if (event.isRepair()) + return; + + final CustomCraftingRecipe recipe = RecipeGlobalRegistry.CRAFTING.get(event.getInventory().getMatrix()); + if (recipe != null) + event.getInventory().setResult(recipe.getResult()); } } \ No newline at end of file diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/CustomCraftingRecipe.java b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/CustomCraftingRecipe.java new file mode 100644 index 0000000..fa86203 --- /dev/null +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/CustomCraftingRecipe.java @@ -0,0 +1,9 @@ +package io.github.kiber2009.plugin.contentapi.api.recipe; + +import org.bukkit.inventory.ItemStack; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +import java.util.function.Predicate; + +public interface CustomCraftingRecipe extends CustomRecipe, Predicate<@Nullable ItemStack @NonNull []> {} diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/CustomRecipe.java b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/CustomRecipe.java index 43f8fa1..36c5cff 100644 --- a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/CustomRecipe.java +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/CustomRecipe.java @@ -2,10 +2,7 @@ import org.bukkit.inventory.ItemStack; import org.jspecify.annotations.NonNull; -import org.jspecify.annotations.Nullable; public interface CustomRecipe { @NonNull ItemStack getResult(); - - boolean match(final @Nullable ItemStack @NonNull [] matrix); } diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/crafting/CustomShapedCraftingRecipe.java b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/crafting/CustomShapedCraftingRecipe.java new file mode 100644 index 0000000..7229b16 --- /dev/null +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/crafting/CustomShapedCraftingRecipe.java @@ -0,0 +1,56 @@ +package io.github.kiber2009.plugin.contentapi.api.recipe.crafting; + +import io.github.kiber2009.plugin.contentapi.api.recipe.CustomCraftingRecipe; +import org.bukkit.inventory.ItemStack; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +import java.util.function.Predicate; + +public class CustomShapedCraftingRecipe implements CustomCraftingRecipe { + private static final byte[][] OFFSETS = {{0, 0}, {0, 1}, {1, 0}, {1, 1}}; + + private final ItemStack result; + private final Predicate[] matrix; + + public CustomShapedCraftingRecipe(final @NonNull Predicate<@Nullable ItemStack> @NonNull [] matrix, + final @NonNull ItemStack result) { + if (matrix.length != 4 && matrix.length != 9) + throw new IllegalArgumentException("Invalid matrix size"); + this.matrix = matrix; + this.result = result; + } + + @Override + public @NonNull ItemStack getResult() { + return result.clone(); + } + + @Override + public boolean test(final @Nullable ItemStack @NonNull [] matrix) { + if (matrix.length == 4 && this.matrix.length == 9) + return false; + + if (matrix.length == this.matrix.length) { + for (int i = 0; i < matrix.length; i++) + if (!this.matrix[i].test(matrix[i])) + return false; + return true; + } + + for (final byte[] off : OFFSETS) { + boolean fits = true; + + for (int i = 0; i < 2 && fits; i++) + for (int j = 0; j < 2; j++) + if (!this.matrix[(off[0] + i) * 3 + off[1] + j].test(matrix[i * 2 + j])) { + fits = false; + break; + } + + if (fits) + return true; + } + return false; + } +} diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/crafting/CustomShapelessCraftingRecipe.java b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/crafting/CustomShapelessCraftingRecipe.java new file mode 100644 index 0000000..80e0bde --- /dev/null +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/crafting/CustomShapelessCraftingRecipe.java @@ -0,0 +1,55 @@ +package io.github.kiber2009.plugin.contentapi.api.recipe.crafting; + +import io.github.kiber2009.plugin.contentapi.api.recipe.CustomCraftingRecipe; +import org.bukkit.inventory.ItemStack; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +import java.util.function.Predicate; + +public class CustomShapelessCraftingRecipe implements CustomCraftingRecipe { + private final ItemStack result; + private final Predicate[] ingredients; + + @SafeVarargs + public CustomShapelessCraftingRecipe(final @NonNull ItemStack result, + final @NonNull Predicate<@NonNull ItemStack> @NonNull ... ingredients) { + if (ingredients.length > 9) + throw new IllegalArgumentException("Too many ingredients"); + this.result = result; + this.ingredients = ingredients; + } + + @Override + public @NonNull ItemStack getResult() { + return result.clone(); + } + + @Override + public boolean test(final @Nullable ItemStack @NonNull [] matrix) { + if (matrix.length < ingredients.length) + return false; + + final boolean[] used = new boolean[ingredients.length]; + int usedCount = 0; + + for (final ItemStack elem : matrix) { + if (elem == null) + continue; + + boolean found = false; + for (int i = 0; i < ingredients.length; i++) + if (!used[i] && ingredients[i].test(elem)) { + used[i] = true; + usedCount++; + found = true; + break; + } + + if (!found) + return false; + } + + return usedCount == ingredients.length; + } +} diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/registry/GlobalRegistry.java b/src/main/java/io/github/kiber2009/plugin/contentapi/registry/GlobalRegistry.java index 0207854..11371f0 100644 --- a/src/main/java/io/github/kiber2009/plugin/contentapi/registry/GlobalRegistry.java +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/registry/GlobalRegistry.java @@ -11,11 +11,11 @@ import java.util.Objects; import java.util.Set; -public sealed class GlobalRegistry permits ItemGlobalRegistry { +public class GlobalRegistry { @SuppressWarnings("StaticInitializerReferencesSubClass") public static final ItemGlobalRegistry ITEMS = new ItemGlobalRegistry(); - private final Map map = new HashMap<>(); + protected final Map map = new HashMap<>(); protected void registerItem(final @NonNull NamespacedKey key, final @NonNull T value) { if (map.containsKey(key)) diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/registry/recipe/CraftingRecipeGlobalRegistry.java b/src/main/java/io/github/kiber2009/plugin/contentapi/registry/recipe/CraftingRecipeGlobalRegistry.java new file mode 100644 index 0000000..f4f01e7 --- /dev/null +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/registry/recipe/CraftingRecipeGlobalRegistry.java @@ -0,0 +1,18 @@ +package io.github.kiber2009.plugin.contentapi.registry.recipe; + +import io.github.kiber2009.plugin.contentapi.api.recipe.CustomCraftingRecipe; +import org.bukkit.inventory.ItemStack; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +public final class CraftingRecipeGlobalRegistry extends RecipeGlobalRegistry { + CraftingRecipeGlobalRegistry() { + } + + public @Nullable CustomCraftingRecipe get(final @Nullable ItemStack @NonNull [] matrix) { + for (final CustomCraftingRecipe recipe : map.values()) + if (recipe.test(matrix)) + return recipe; + return null; + } +} diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/registry/recipe/RecipeGlobalRegistry.java b/src/main/java/io/github/kiber2009/plugin/contentapi/registry/recipe/RecipeGlobalRegistry.java new file mode 100644 index 0000000..46f58be --- /dev/null +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/registry/recipe/RecipeGlobalRegistry.java @@ -0,0 +1,13 @@ +package io.github.kiber2009.plugin.contentapi.registry.recipe; + +import io.github.kiber2009.plugin.contentapi.api.recipe.CustomRecipe; +import io.github.kiber2009.plugin.contentapi.registry.GlobalRegistry; + +public sealed class RecipeGlobalRegistry extends GlobalRegistry + permits CraftingRecipeGlobalRegistry { + @SuppressWarnings("StaticInitializerReferencesSubClass") + public static final CraftingRecipeGlobalRegistry CRAFTING = new CraftingRecipeGlobalRegistry(); + + RecipeGlobalRegistry() { + } +} From 96a4c55aac4895bd8d28135b4541729be3b3995b Mon Sep 17 00:00:00 2001 From: Kiber2009 <92222946+Kiber2009@users.noreply.github.com> Date: Wed, 24 Jun 2026 21:27:27 +0300 Subject: [PATCH 7/9] Add `CustomItemRecipeChoice` --- .../recipe/choice/CustomItemRecipeChoice.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/choice/CustomItemRecipeChoice.java diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/choice/CustomItemRecipeChoice.java b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/choice/CustomItemRecipeChoice.java new file mode 100644 index 0000000..6ee6c07 --- /dev/null +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/choice/CustomItemRecipeChoice.java @@ -0,0 +1,23 @@ +package io.github.kiber2009.plugin.contentapi.api.recipe.choice; + +import io.github.kiber2009.plugin.contentapi.api.item.CustomItem; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Contract; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +import java.util.function.Predicate; + +public class CustomItemRecipeChoice implements Predicate<@Nullable ItemStack> { + private final CustomItem item; + + public CustomItemRecipeChoice(final @NonNull CustomItem item) { + this.item = item; + } + + @Override + @Contract(value = "null -> false", pure = true) + public boolean test(final @Nullable ItemStack stack) { + return item.match(stack); + } +} From 8b7828aa3d43937bacbd47a636a325f36d2d2c97 Mon Sep 17 00:00:00 2001 From: Kiber2009 <92222946+Kiber2009@users.noreply.github.com> Date: Wed, 24 Jun 2026 21:28:56 +0300 Subject: [PATCH 8/9] Add `@Contract` annotations --- .../kiber2009/plugin/contentapi/api/recipe/CustomRecipe.java | 2 ++ .../api/recipe/crafting/CustomShapedCraftingRecipe.java | 3 +++ .../api/recipe/crafting/CustomShapelessCraftingRecipe.java | 3 +++ .../registry/recipe/CraftingRecipeGlobalRegistry.java | 2 ++ 4 files changed, 10 insertions(+) diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/CustomRecipe.java b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/CustomRecipe.java index 36c5cff..25b4299 100644 --- a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/CustomRecipe.java +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/CustomRecipe.java @@ -1,8 +1,10 @@ package io.github.kiber2009.plugin.contentapi.api.recipe; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Contract; import org.jspecify.annotations.NonNull; public interface CustomRecipe { + @Contract(pure = true) @NonNull ItemStack getResult(); } diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/crafting/CustomShapedCraftingRecipe.java b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/crafting/CustomShapedCraftingRecipe.java index 7229b16..71e4bc2 100644 --- a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/crafting/CustomShapedCraftingRecipe.java +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/crafting/CustomShapedCraftingRecipe.java @@ -2,6 +2,7 @@ import io.github.kiber2009.plugin.contentapi.api.recipe.CustomCraftingRecipe; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Contract; import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; @@ -22,11 +23,13 @@ public CustomShapedCraftingRecipe(final @NonNull Predicate<@Nullable ItemStack> } @Override + @Contract(pure = true) public @NonNull ItemStack getResult() { return result.clone(); } @Override + @Contract(pure = true) public boolean test(final @Nullable ItemStack @NonNull [] matrix) { if (matrix.length == 4 && this.matrix.length == 9) return false; diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/crafting/CustomShapelessCraftingRecipe.java b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/crafting/CustomShapelessCraftingRecipe.java index 80e0bde..24361df 100644 --- a/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/crafting/CustomShapelessCraftingRecipe.java +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/api/recipe/crafting/CustomShapelessCraftingRecipe.java @@ -2,6 +2,7 @@ import io.github.kiber2009.plugin.contentapi.api.recipe.CustomCraftingRecipe; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Contract; import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; @@ -21,11 +22,13 @@ public CustomShapelessCraftingRecipe(final @NonNull ItemStack result, } @Override + @Contract(pure = true) public @NonNull ItemStack getResult() { return result.clone(); } @Override + @Contract(pure = true) public boolean test(final @Nullable ItemStack @NonNull [] matrix) { if (matrix.length < ingredients.length) return false; diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/registry/recipe/CraftingRecipeGlobalRegistry.java b/src/main/java/io/github/kiber2009/plugin/contentapi/registry/recipe/CraftingRecipeGlobalRegistry.java index f4f01e7..f496951 100644 --- a/src/main/java/io/github/kiber2009/plugin/contentapi/registry/recipe/CraftingRecipeGlobalRegistry.java +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/registry/recipe/CraftingRecipeGlobalRegistry.java @@ -2,6 +2,7 @@ import io.github.kiber2009.plugin.contentapi.api.recipe.CustomCraftingRecipe; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Contract; import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; @@ -9,6 +10,7 @@ public final class CraftingRecipeGlobalRegistry extends RecipeGlobalRegistry Date: Wed, 24 Jun 2026 22:06:28 +0300 Subject: [PATCH 9/9] Make `GlobalRegistry` accept generic types --- .../kiber2009/plugin/contentapi/registry/GlobalRegistry.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/github/kiber2009/plugin/contentapi/registry/GlobalRegistry.java b/src/main/java/io/github/kiber2009/plugin/contentapi/registry/GlobalRegistry.java index 11371f0..55cb928 100644 --- a/src/main/java/io/github/kiber2009/plugin/contentapi/registry/GlobalRegistry.java +++ b/src/main/java/io/github/kiber2009/plugin/contentapi/registry/GlobalRegistry.java @@ -23,7 +23,7 @@ protected void registerItem(final @NonNull NamespacedKey key, final @NonNull T v map.put(key, value); } - public void register(final @NonNull LocalRegistry registry) { + public void register(final @NonNull LocalRegistry registry) { for (final NamespacedKey key : registry.keySet()) registerItem(key, Objects.requireNonNull(registry.get(key))); }