diff --git a/paper-api/src/main/java/org/bukkit/Bukkit.java b/paper-api/src/main/java/org/bukkit/Bukkit.java index de21023e1e0e..930891edfc74 100644 --- a/paper-api/src/main/java/org/bukkit/Bukkit.java +++ b/paper-api/src/main/java/org/bukkit/Bukkit.java @@ -1135,6 +1135,19 @@ public static boolean addRecipe(@Nullable Recipe recipe, boolean resendRecipes) return server.addRecipe(recipe, resendRecipes); } + /** + * Adds multiple recipes to the crafting manager at once, resending recipes only once + * after all have been added. + * + * @apiNote This method differs from {@link #addRecipe} in that it will only resend the recipe book once instead of once per every recipe added + * @param recipes the recipes to add + * @return true if any recipe was added, false if none were for some reason + * @see #addRecipe + */ + public static boolean addRecipes(@NotNull Iterable recipes) { + return server.addRecipes(recipes); + } + /** * Get a list of all recipes for a given item. The stack size is ignored * in comparisons. If the durability is -1, it will match any data value. @@ -1312,6 +1325,16 @@ public static void resetRecipes() { server.resetRecipes(); } + /** + * Checks if the server has a recipe + * + * @param key NamespacedKey of recipe to check for + * @return True if there is a recipe with a matching key + */ + public static boolean hasRecipe(@NotNull NamespacedKey key) { + return server.hasRecipe(key); + } + /** * Remove a recipe from the server. * @@ -1344,6 +1367,18 @@ public static boolean removeRecipe(@NotNull NamespacedKey key, boolean resendRec } // Paper end - method to resend recipes + /** + * Remove multiple recipes from the server. + * + * @apiNote This method differs from {@link #removeRecipe} in that it will only resend the recipe book once instead of once per every recipe removed + * @param keys the NamespacedKeys of the recipes to remove + * @return true if any recipe was removed, false if none were for some reason + * @see #removeRecipe + */ + public static boolean removeRecipes(@NotNull Iterable keys) { + return server.removeRecipes(keys); + } + /** * Gets a list of command aliases defined in the server properties. * diff --git a/paper-api/src/main/java/org/bukkit/Server.java b/paper-api/src/main/java/org/bukkit/Server.java index dd8ad5976eb4..2dc364575e08 100644 --- a/paper-api/src/main/java/org/bukkit/Server.java +++ b/paper-api/src/main/java/org/bukkit/Server.java @@ -1045,6 +1045,17 @@ default boolean addRecipe(@Nullable Recipe recipe) { boolean addRecipe(@Nullable Recipe recipe, boolean resendRecipes); // Paper end - method to send recipes immediately + /** + * Adds multiple recipes to the crafting manager at once, resending recipes only once + * after all have been added. + * + * @apiNote This method differs from {@link #addRecipe} in that it will only resend the recipe book once instead of once per every recipe added + * @param recipes the recipes to add + * @return true if any recipe was added, false if none were for some reason + * @see #addRecipe + */ + boolean addRecipes(@NotNull Iterable recipes); + /** * Get a list of all recipes for a given item. The stack size is ignored * in comparisons. If the durability is -1, it will match any data value. @@ -1205,6 +1216,14 @@ default ItemStack craftItem(@NotNull ItemStack @NotNull [] craftingMatrix, @NotN */ public void resetRecipes(); + /** + * Checks if the server has a recipe + * + * @param key NamespacedKey of recipe to check for + * @return True if there is a recipe with a matching key + */ + boolean hasRecipe(@NotNull NamespacedKey key); + /** * Remove a recipe from the server. * @@ -1235,6 +1254,16 @@ default boolean removeRecipe(@NotNull NamespacedKey key) { boolean removeRecipe(@NotNull NamespacedKey key, boolean resendRecipes); // Paper end - method to resend recipes + /** + * Remove multiple recipes from the server. + * + * @apiNote This method differs from {@link #removeRecipe} in that it will only resend the recipe book once instead of once per every recipe removed + * @param keys the NamespacedKeys of the recipes to remove + * @return true if any recipe was removed, false if none were for some reason + * @see #removeRecipe + */ + boolean removeRecipes(@NotNull Iterable keys); + /** * Gets a list of command aliases defined in the server properties. * diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftServer.java index ab2224ecebc5..729d376ff5e1 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -93,6 +93,7 @@ import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.RepairItemRecipe; import net.minecraft.world.level.CustomSpawner; @@ -161,21 +162,11 @@ import org.bukkit.craftbukkit.generator.CraftWorldInfo; import org.bukkit.craftbukkit.generator.OldCraftChunkData; import org.bukkit.craftbukkit.help.SimpleHelpMap; -import org.bukkit.craftbukkit.inventory.CraftBlastingRecipe; -import org.bukkit.craftbukkit.inventory.CraftCampfireRecipe; -import org.bukkit.craftbukkit.inventory.CraftFurnaceRecipe; import org.bukkit.craftbukkit.inventory.CraftItemCraftResult; import org.bukkit.craftbukkit.inventory.CraftItemFactory; import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.craftbukkit.inventory.CraftMerchantCustom; import org.bukkit.craftbukkit.inventory.CraftRecipe; -import org.bukkit.craftbukkit.inventory.CraftShapedRecipe; -import org.bukkit.craftbukkit.inventory.CraftShapelessRecipe; -import org.bukkit.craftbukkit.inventory.CraftSmithingTransformRecipe; -import org.bukkit.craftbukkit.inventory.CraftSmithingTrimRecipe; -import org.bukkit.craftbukkit.inventory.CraftSmokingRecipe; -import org.bukkit.craftbukkit.inventory.CraftStonecuttingRecipe; -import org.bukkit.craftbukkit.inventory.CraftTransmuteRecipe; import org.bukkit.craftbukkit.inventory.RecipeIterator; import org.bukkit.craftbukkit.inventory.util.CraftInventoryCreator; import org.bukkit.craftbukkit.map.CraftMapColorCache; @@ -216,10 +207,6 @@ import org.bukkit.generator.ChunkGenerator; import org.bukkit.generator.WorldInfo; import org.bukkit.help.HelpMap; -import org.bukkit.inventory.BlastingRecipe; -import org.bukkit.inventory.CampfireRecipe; -import org.bukkit.inventory.ComplexRecipe; -import org.bukkit.inventory.FurnaceRecipe; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryView; @@ -227,13 +214,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Merchant; import org.bukkit.inventory.Recipe; -import org.bukkit.inventory.ShapedRecipe; -import org.bukkit.inventory.ShapelessRecipe; -import org.bukkit.inventory.SmithingTransformRecipe; -import org.bukkit.inventory.SmithingTrimRecipe; -import org.bukkit.inventory.SmokingRecipe; -import org.bukkit.inventory.StonecuttingRecipe; -import org.bukkit.inventory.TransmuteRecipe; import org.bukkit.loot.LootTable; import org.bukkit.map.MapPalette; import org.bukkit.map.MapView; @@ -1440,43 +1420,32 @@ public void savePlayers() { @Override public boolean addRecipe(Recipe recipe, boolean resendRecipes) { - CraftRecipe toAdd; - if (recipe instanceof CraftRecipe) { - toAdd = (CraftRecipe) recipe; - } else { - if (recipe instanceof ShapedRecipe) { - toAdd = CraftShapedRecipe.fromBukkitRecipe((ShapedRecipe) recipe); - } else if (recipe instanceof ShapelessRecipe) { - toAdd = CraftShapelessRecipe.fromBukkitRecipe((ShapelessRecipe) recipe); - } else if (recipe instanceof FurnaceRecipe) { - toAdd = CraftFurnaceRecipe.fromBukkitRecipe((FurnaceRecipe) recipe); - } else if (recipe instanceof BlastingRecipe) { - toAdd = CraftBlastingRecipe.fromBukkitRecipe((BlastingRecipe) recipe); - } else if (recipe instanceof CampfireRecipe) { - toAdd = CraftCampfireRecipe.fromBukkitRecipe((CampfireRecipe) recipe); - } else if (recipe instanceof SmokingRecipe) { - toAdd = CraftSmokingRecipe.fromBukkitRecipe((SmokingRecipe) recipe); - } else if (recipe instanceof StonecuttingRecipe) { - toAdd = CraftStonecuttingRecipe.fromBukkitRecipe((StonecuttingRecipe) recipe); - } else if (recipe instanceof SmithingTransformRecipe) { - toAdd = CraftSmithingTransformRecipe.fromBukkitRecipe((SmithingTransformRecipe) recipe); - } else if (recipe instanceof SmithingTrimRecipe) { - toAdd = CraftSmithingTrimRecipe.fromBukkitRecipe((SmithingTrimRecipe) recipe); - } else if (recipe instanceof TransmuteRecipe) { - toAdd = CraftTransmuteRecipe.fromBukkitRecipe((TransmuteRecipe) recipe); - } else if (recipe instanceof ComplexRecipe) { - throw new UnsupportedOperationException("Cannot add custom complex recipe"); - } else { - return false; + CraftRecipe craftRecipe = CraftRecipe.fromBukkitRecipe(recipe); + if (craftRecipe == null) { + return false; + } + + craftRecipe.addToRecipeManager(); + return true; + } + + @Override + public boolean addRecipes(Iterable recipes) { + Preconditions.checkArgument(recipes != null, "recipes == null"); + boolean anyAdded = false; + RecipeManager recipeManager = this.getServer().getRecipeManager(); + for (Recipe recipe : recipes) { + CraftRecipe craftRecipe = CraftRecipe.fromBukkitRecipe(recipe); + if (craftRecipe != null) { + recipeManager.recipes.addRecipe(craftRecipe.toMinecraftRecipe()); + anyAdded = true; } } - toAdd.addToRecipeManager(); - // Paper start - API for updating recipes on clients - if (true || resendRecipes) { // Always needs to be resent now... TODO - this.playerList.reloadRecipes(); + + if (anyAdded) { + recipeManager.finalizeRecipeLoading(); } - // Paper end - API for updating recipes on clients - return true; + return anyAdded; } @Override @@ -1648,17 +1617,34 @@ public void resetRecipes() { } @Override - public boolean removeRecipe(NamespacedKey recipeKey, boolean resendRecipes) { + public boolean hasRecipe(NamespacedKey recipeKey) { Preconditions.checkArgument(recipeKey != null, "recipeKey == null"); + final ResourceKey> id = CraftNamespacedKey.toResourceKey(Registries.RECIPE, recipeKey); + return getServer().getRecipeManager().byKey(id).isPresent(); + } - // Paper start - resend recipes on successful removal + @Override + public boolean removeRecipe(NamespacedKey recipeKey, boolean resendRecipes) { + Preconditions.checkArgument(recipeKey != null, "recipeKey == null"); final ResourceKey> id = CraftNamespacedKey.toResourceKey(Registries.RECIPE, recipeKey); - final boolean removed = this.getServer().getRecipeManager().removeRecipe(id); - if (removed/* && resendRecipes*/) { // TODO Always need to resend them rn - deprecate this method? - this.playerList.reloadRecipes(); + return this.getServer().getRecipeManager().removeRecipe(id); + } + + @Override + public boolean removeRecipes(Iterable recipeKeys) { + Preconditions.checkArgument(recipeKeys != null, "recipeKeys == null"); + boolean anyRemoved = false; + RecipeManager recipeManager = this.getServer().getRecipeManager(); + for (NamespacedKey recipeKey : recipeKeys) { + final ResourceKey> id = CraftNamespacedKey.toResourceKey(Registries.RECIPE, recipeKey); + if (recipeManager.recipes.removeRecipe(id)) { + anyRemoved = true; + } + } + if (anyRemoved) { + recipeManager.finalizeRecipeLoading(); } - return removed; - // Paper end - resend recipes on successful removal + return anyRemoved; } @Override diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftBlastingRecipe.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftBlastingRecipe.java index 3e39a5172c06..6e02a9bca6c3 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftBlastingRecipe.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftBlastingRecipe.java @@ -25,15 +25,19 @@ public static CraftBlastingRecipe fromBukkitRecipe(BlastingRecipe recipe) { } @Override - public void addToRecipeManager() { - net.minecraft.world.item.crafting.BlastingRecipe recipe = new net.minecraft.world.item.crafting.BlastingRecipe( + public RecipeHolder toMinecraftRecipe() { + return new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), new net.minecraft.world.item.crafting.BlastingRecipe( new net.minecraft.world.item.crafting.Recipe.CommonInfo(true), new net.minecraft.world.item.crafting.AbstractCookingRecipe.CookingBookInfo(CraftRecipe.getCategory(this.getCategory()), this.getGroup()), CraftRecipe.toIngredient(this.getInputChoice(), true), CraftItemStack.asTemplate(this.getResult()), this.getExperience(), this.getCookingTime() - ); - MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), recipe)); + )); + } + + @Override + public void addToRecipeManager() { + MinecraftServer.getServer().getRecipeManager().addRecipe(toMinecraftRecipe()); } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftCampfireRecipe.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftCampfireRecipe.java index 00a65754b649..c4f8f1ad5a82 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftCampfireRecipe.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftCampfireRecipe.java @@ -2,7 +2,6 @@ import net.minecraft.core.registries.Registries; import net.minecraft.server.MinecraftServer; -import net.minecraft.world.item.crafting.CampfireCookingRecipe; import net.minecraft.world.item.crafting.RecipeHolder; import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.util.CraftNamespacedKey; @@ -26,15 +25,19 @@ public static CraftCampfireRecipe fromBukkitRecipe(CampfireRecipe recipe) { } @Override - public void addToRecipeManager() { - CampfireCookingRecipe recipe = new net.minecraft.world.item.crafting.CampfireCookingRecipe( + public RecipeHolder toMinecraftRecipe() { + return new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), new net.minecraft.world.item.crafting.CampfireCookingRecipe( new net.minecraft.world.item.crafting.Recipe.CommonInfo(true), new net.minecraft.world.item.crafting.AbstractCookingRecipe.CookingBookInfo(CraftRecipe.getCategory(this.getCategory()), this.getGroup()), CraftRecipe.toIngredient(this.getInputChoice(), true), CraftItemStack.asTemplate(this.getResult()), this.getExperience(), this.getCookingTime() - ); - MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), recipe)); + )); + } + + @Override + public void addToRecipeManager() { + MinecraftServer.getServer().getRecipeManager().addRecipe(toMinecraftRecipe()); } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftComplexRecipe.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftComplexRecipe.java index 0040ae7cd63c..5dc39f891503 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftComplexRecipe.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftComplexRecipe.java @@ -18,8 +18,13 @@ public CraftComplexRecipe(NamespacedKey key, ItemStack result, net.minecraft.wor this.recipe = recipe; } + @Override + public RecipeHolder toMinecraftRecipe() { + return new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), recipe); + } + @Override public void addToRecipeManager() { - MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), this.recipe)); + MinecraftServer.getServer().getRecipeManager().addRecipe(toMinecraftRecipe()); } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftFurnaceRecipe.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftFurnaceRecipe.java index 658af5f3aeaa..893d550acf67 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftFurnaceRecipe.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftFurnaceRecipe.java @@ -3,7 +3,6 @@ import net.minecraft.core.registries.Registries; import net.minecraft.server.MinecraftServer; import net.minecraft.world.item.crafting.RecipeHolder; -import net.minecraft.world.item.crafting.SmeltingRecipe; import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.inventory.FurnaceRecipe; @@ -26,15 +25,19 @@ public static CraftFurnaceRecipe fromBukkitRecipe(FurnaceRecipe recipe) { } @Override - public void addToRecipeManager() { - SmeltingRecipe recipe = new net.minecraft.world.item.crafting.SmeltingRecipe( + public RecipeHolder toMinecraftRecipe() { + return new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), new net.minecraft.world.item.crafting.SmeltingRecipe( new net.minecraft.world.item.crafting.Recipe.CommonInfo(true), new net.minecraft.world.item.crafting.AbstractCookingRecipe.CookingBookInfo(CraftRecipe.getCategory(this.getCategory()), this.getGroup()), CraftRecipe.toIngredient(this.getInputChoice(), true), CraftItemStack.asTemplate(this.getResult()), this.getExperience(), this.getCookingTime() - ); - MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), recipe)); + )); + } + + @Override + public void addToRecipeManager() { + MinecraftServer.getServer().getRecipeManager().addRecipe(toMinecraftRecipe()); } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java index 5e2439283dd1..680f5ba839a2 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java @@ -10,15 +10,28 @@ import java.util.Optional; import net.minecraft.core.registries.Registries; import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeHolder; +import org.bukkit.inventory.BlastingRecipe; +import org.bukkit.inventory.CampfireRecipe; +import org.bukkit.inventory.ComplexRecipe; +import org.bukkit.inventory.FurnaceRecipe; import org.bukkit.inventory.ItemType; import org.bukkit.inventory.Recipe; import org.bukkit.inventory.RecipeChoice; +import org.bukkit.inventory.ShapedRecipe; +import org.bukkit.inventory.ShapelessRecipe; +import org.bukkit.inventory.SmithingTransformRecipe; +import org.bukkit.inventory.SmithingTrimRecipe; +import org.bukkit.inventory.SmokingRecipe; +import org.bukkit.inventory.StonecuttingRecipe; +import org.bukkit.inventory.TransmuteRecipe; import org.bukkit.inventory.recipe.CookingBookCategory; import org.bukkit.inventory.recipe.CraftingBookCategory; import org.jspecify.annotations.Nullable; public interface CraftRecipe extends Recipe { + RecipeHolder toMinecraftRecipe(); void addToRecipeManager(); static Optional toPossibleIngredient(@Nullable RecipeChoice bukkit, boolean requireNotEmpty) { @@ -91,4 +104,22 @@ static net.minecraft.world.item.crafting.CookingBookCategory getCategory(Cooking static CookingBookCategory getCategory(net.minecraft.world.item.crafting.CookingBookCategory internal) { return CookingBookCategory.valueOf(internal.name()); } + + static CraftRecipe fromBukkitRecipe(Recipe recipe) { + return switch (recipe) { + case CraftRecipe craftRecipe -> craftRecipe; + case ShapedRecipe shapedRecipe -> CraftShapedRecipe.fromBukkitRecipe(shapedRecipe); + case ShapelessRecipe shapelessRecipe -> CraftShapelessRecipe.fromBukkitRecipe(shapelessRecipe); + case FurnaceRecipe furnaceRecipe -> CraftFurnaceRecipe.fromBukkitRecipe(furnaceRecipe); + case BlastingRecipe blastingRecipe -> CraftBlastingRecipe.fromBukkitRecipe(blastingRecipe); + case CampfireRecipe campfireRecipe -> CraftCampfireRecipe.fromBukkitRecipe(campfireRecipe); + case SmokingRecipe smokingRecipe -> CraftSmokingRecipe.fromBukkitRecipe(smokingRecipe); + case StonecuttingRecipe stonecuttingRecipe -> CraftStonecuttingRecipe.fromBukkitRecipe(stonecuttingRecipe); + case SmithingTransformRecipe smithingTransformRecipe -> CraftSmithingTransformRecipe.fromBukkitRecipe(smithingTransformRecipe); + case SmithingTrimRecipe smithingTrimRecipe -> CraftSmithingTrimRecipe.fromBukkitRecipe(smithingTrimRecipe); + case TransmuteRecipe transmuteRecipe -> CraftTransmuteRecipe.fromBukkitRecipe(transmuteRecipe); + case ComplexRecipe ignored -> throw new UnsupportedOperationException("Cannot convert custom complex recipe"); + default -> null; + }; + } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapedRecipe.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapedRecipe.java index bc509ebe9fdc..9a1068358268 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapedRecipe.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapedRecipe.java @@ -47,20 +47,24 @@ public static CraftShapedRecipe fromBukkitRecipe(ShapedRecipe recipe) { } @Override - public void addToRecipeManager() { + public RecipeHolder toMinecraftRecipe() { Map choices = this.getChoiceMap(); String[] shape = CraftShapedRecipe.replaceUndefinedIngredientsWithEmpty(this.getShape(), choices); choices.values().removeIf(Objects::isNull); Map ingredients = Maps.transformValues(choices, (bukkit) -> CraftRecipe.toIngredient(bukkit, false)); ShapedRecipePattern pattern = ShapedRecipePattern.of(ingredients, shape); - net.minecraft.world.item.crafting.ShapedRecipe recipe = new net.minecraft.world.item.crafting.ShapedRecipe( + return new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), new net.minecraft.world.item.crafting.ShapedRecipe( new net.minecraft.world.item.crafting.Recipe.CommonInfo(true), new net.minecraft.world.item.crafting.CraftingRecipe.CraftingBookInfo(CraftRecipe.getCategory(this.getCategory()), this.getGroup()), pattern, CraftItemStack.asTemplate(this.getResult()) - ); - MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), recipe)); + )); + } + + @Override + public void addToRecipeManager() { + MinecraftServer.getServer().getRecipeManager().addRecipe(toMinecraftRecipe()); } private static String[] replaceUndefinedIngredientsWithEmpty(String[] shape, Map ingredients) { diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java index 6a7bb225f044..37435d2edc02 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java @@ -39,19 +39,23 @@ public static CraftShapelessRecipe fromBukkitRecipe(ShapelessRecipe recipe) { } @Override - public void addToRecipeManager() { + public RecipeHolder toMinecraftRecipe() { List choices = this.getChoiceList(); List ingredients = new ArrayList<>(choices.size()); for (org.bukkit.inventory.RecipeChoice choice : choices) { ingredients.add(CraftRecipe.toIngredient(choice, true)); } - net.minecraft.world.item.crafting.ShapelessRecipe recipe = new net.minecraft.world.item.crafting.ShapelessRecipe( + return new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), new net.minecraft.world.item.crafting.ShapelessRecipe( new net.minecraft.world.item.crafting.Recipe.CommonInfo(true), new net.minecraft.world.item.crafting.CraftingRecipe.CraftingBookInfo(CraftRecipe.getCategory(this.getCategory()), this.getGroup()), CraftItemStack.asTemplate(this.getResult()), ingredients - ); - MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), recipe)); + )); + } + + @Override + public void addToRecipeManager() { + MinecraftServer.getServer().getRecipeManager().addRecipe(toMinecraftRecipe()); } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingTransformRecipe.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingTransformRecipe.java index c85e357efed6..fac16d5237f6 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingTransformRecipe.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingTransformRecipe.java @@ -27,15 +27,19 @@ public static CraftSmithingTransformRecipe fromBukkitRecipe(SmithingTransformRec } @Override - public void addToRecipeManager() { - final net.minecraft.world.item.crafting.SmithingTransformRecipe recipe = new net.minecraft.world.item.crafting.SmithingTransformRecipe( + public RecipeHolder toMinecraftRecipe() { + return new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), new net.minecraft.world.item.crafting.SmithingTransformRecipe( new net.minecraft.world.item.crafting.Recipe.CommonInfo(true), CraftRecipe.toPossibleIngredient(this.getTemplate(), false), CraftRecipe.toIngredient(this.getBase(), false), CraftRecipe.toPossibleIngredient(this.getAddition(), false), CraftItemStack.asTemplate(this.getResult()), this.willCopyDataComponents() - ); - MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), recipe)); // Paper - Option to prevent data components copy + )); + } + + @Override + public void addToRecipeManager() { + MinecraftServer.getServer().getRecipeManager().addRecipe(toMinecraftRecipe()); // Paper - Option to prevent data components copy } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingTrimRecipe.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingTrimRecipe.java index 53f74584425e..8b629d151266 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingTrimRecipe.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingTrimRecipe.java @@ -29,15 +29,19 @@ public static CraftSmithingTrimRecipe fromBukkitRecipe(SmithingTrimRecipe recipe } @Override - public void addToRecipeManager() { - final net.minecraft.world.item.crafting.SmithingTrimRecipe recipe = new net.minecraft.world.item.crafting.SmithingTrimRecipe( + public RecipeHolder toMinecraftRecipe() { + return new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), new net.minecraft.world.item.crafting.SmithingTrimRecipe( new net.minecraft.world.item.crafting.Recipe.CommonInfo(true), CraftRecipe.toIngredient(this.getTemplate(), false), CraftRecipe.toIngredient(this.getBase(), false), CraftRecipe.toIngredient(this.getAddition(), false), CraftTrimPattern.bukkitToMinecraftHolder(this.getTrimPattern()), this.willCopyDataComponents() - ); - MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), recipe)); + )); + } + + @Override + public void addToRecipeManager() { + MinecraftServer.getServer().getRecipeManager().addRecipe(toMinecraftRecipe()); } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmokingRecipe.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmokingRecipe.java index 25b5c019e63d..c3bc208caeff 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmokingRecipe.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmokingRecipe.java @@ -25,15 +25,19 @@ public static CraftSmokingRecipe fromBukkitRecipe(SmokingRecipe recipe) { } @Override - public void addToRecipeManager() { - net.minecraft.world.item.crafting.SmokingRecipe recipe = new net.minecraft.world.item.crafting.SmokingRecipe( + public RecipeHolder toMinecraftRecipe() { + return new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), new net.minecraft.world.item.crafting.SmokingRecipe( new net.minecraft.world.item.crafting.Recipe.CommonInfo(true), new net.minecraft.world.item.crafting.AbstractCookingRecipe.CookingBookInfo(CraftRecipe.getCategory(this.getCategory()), this.getGroup()), CraftRecipe.toIngredient(this.getInputChoice(), true), CraftItemStack.asTemplate(this.getResult()), this.getExperience(), this.getCookingTime() - ); - MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), recipe)); + )); + } + + @Override + public void addToRecipeManager() { + MinecraftServer.getServer().getRecipeManager().addRecipe(toMinecraftRecipe()); } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftStonecuttingRecipe.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftStonecuttingRecipe.java index 4edce3a4dc6f..ac51683aafae 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftStonecuttingRecipe.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftStonecuttingRecipe.java @@ -23,12 +23,16 @@ public static CraftStonecuttingRecipe fromBukkitRecipe(StonecuttingRecipe recipe } @Override - public void addToRecipeManager() { - StonecutterRecipe recipe = new net.minecraft.world.item.crafting.StonecutterRecipe( + public RecipeHolder toMinecraftRecipe() { + return new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), new net.minecraft.world.item.crafting.StonecutterRecipe( new net.minecraft.world.item.crafting.Recipe.CommonInfo(true), CraftRecipe.toIngredient(this.getInputChoice(), true), CraftItemStack.asTemplate(this.getResult()) - ); - MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), recipe)); + )); + } + + @Override + public void addToRecipeManager() { + MinecraftServer.getServer().getRecipeManager().addRecipe(toMinecraftRecipe()); } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftTransmuteRecipe.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftTransmuteRecipe.java index 38c2061ab4d1..1c87296f0572 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftTransmuteRecipe.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftTransmuteRecipe.java @@ -26,8 +26,8 @@ public static CraftTransmuteRecipe fromBukkitRecipe(TransmuteRecipe recipe) { } @Override - public void addToRecipeManager() { - net.minecraft.world.item.crafting.TransmuteRecipe recipe = new net.minecraft.world.item.crafting.TransmuteRecipe( + public RecipeHolder toMinecraftRecipe() { + return new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), new net.minecraft.world.item.crafting.TransmuteRecipe( new net.minecraft.world.item.crafting.Recipe.CommonInfo(true), new net.minecraft.world.item.crafting.CraftingRecipe.CraftingBookInfo(CraftRecipe.getCategory(this.getCategory()), this.getGroup()), CraftRecipe.toIngredient(this.getInput(), true), @@ -35,7 +35,11 @@ public void addToRecipeManager() { net.minecraft.world.item.crafting.TransmuteRecipe.DEFAULT_MATERIAL_COUNT, CraftItemStack.asTemplate(this.getResult()), false - ); - MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toResourceKey(Registries.RECIPE, this.getKey()), recipe)); + )); + } + + @Override + public void addToRecipeManager() { + MinecraftServer.getServer().getRecipeManager().addRecipe(toMinecraftRecipe()); } }