diff options
Diffstat (limited to 'patches/server/0957-Fix-issues-with-Recipe-API.patch')
-rw-r--r-- | patches/server/0957-Fix-issues-with-Recipe-API.patch | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/patches/server/0957-Fix-issues-with-Recipe-API.patch b/patches/server/0957-Fix-issues-with-Recipe-API.patch new file mode 100644 index 0000000000..63c059ad01 --- /dev/null +++ b/patches/server/0957-Fix-issues-with-Recipe-API.patch @@ -0,0 +1,102 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jake Potrebic <[email protected]> +Date: Sun, 12 May 2024 15:49:36 -0700 +Subject: [PATCH] Fix issues with Recipe API + + +diff --git a/src/main/java/net/minecraft/world/item/crafting/ShapedRecipe.java b/src/main/java/net/minecraft/world/item/crafting/ShapedRecipe.java +index dd02af6574dd97404bc9c02c9ead84e1dd537efe..980fea65899ef5f37808506b822fd3de5830d2c7 100644 +--- a/src/main/java/net/minecraft/world/item/crafting/ShapedRecipe.java ++++ b/src/main/java/net/minecraft/world/item/crafting/ShapedRecipe.java +@@ -98,7 +98,7 @@ public class ShapedRecipe implements CraftingRecipe { + char c = 'a'; + for (Optional<Ingredient> list : this.pattern.ingredients()) { + RecipeChoice choice = CraftRecipe.toBukkit(list); +- if (choice != null) { ++ if (choice != RecipeChoice.empty()) { // Paper + recipe.setIngredient(c, choice); + } + +diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java +index a30950287646524c4906574d193ec7ce94b4eb34..e89fecf25555195314998e5317baa3a49be61aa3 100644 +--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java ++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java +@@ -38,6 +38,10 @@ public interface CraftRecipe extends Recipe { + stack = Ingredient.of(((RecipeChoice.MaterialChoice) bukkit).getChoices().stream().map((mat) -> CraftItemType.bukkitToMinecraft(mat))); + } else if (bukkit instanceof RecipeChoice.ExactChoice) { + stack = Ingredient.ofStacks(((RecipeChoice.ExactChoice) bukkit).getChoices().stream().map((mat) -> CraftItemStack.asNMSCopy(mat)).toList()); ++ // Paper start - support "empty" choices ++ } else if (bukkit == RecipeChoice.empty()) { ++ stack = Ingredient.of(); ++ // Paper end + } else { + throw new IllegalArgumentException("Unknown recipe stack instance " + bukkit); + } +@@ -51,14 +55,14 @@ public interface CraftRecipe extends Recipe { + } + + public static RecipeChoice toBukkit(Optional<Ingredient> list) { +- return list.map(CraftRecipe::toBukkit).orElse(null); ++ return list.map(CraftRecipe::toBukkit).orElse(RecipeChoice.empty()); // Paper - fix issue with recipe API + } + + public static RecipeChoice toBukkit(Ingredient list) { + List<Holder<Item>> items = list.items(); + + if (items.isEmpty()) { +- return null; ++ return RecipeChoice.empty(); // Paper - null breaks API contracts + } + + if (list.isExact()) { +diff --git a/src/test/java/io/papermc/paper/inventory/recipe/TestRecipeChoice.java b/src/test/java/io/papermc/paper/inventory/recipe/TestRecipeChoice.java +new file mode 100644 +index 0000000000000000000000000000000000000000..45ab2b6d32b29cb663df848534e1aa68293dd613 +--- /dev/null ++++ b/src/test/java/io/papermc/paper/inventory/recipe/TestRecipeChoice.java +@@ -0,0 +1,25 @@ ++package io.papermc.paper.inventory.recipe; ++ ++import java.util.Iterator; ++import org.bukkit.Bukkit; ++import org.bukkit.inventory.Recipe; ++import org.bukkit.support.environment.AllFeatures; ++import org.junit.jupiter.api.Test; ++ ++import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; ++import static org.junit.jupiter.api.Assertions.assertTrue; ++ ++@AllFeatures ++class TestRecipeChoice { ++ ++ @Test ++ void testRecipeChoices() { ++ final Iterator<Recipe> iter = Bukkit.recipeIterator(); ++ boolean foundRecipes = false; ++ while (iter.hasNext()) { ++ foundRecipes = true; ++ assertDoesNotThrow(iter::next, "Failed to convert a recipe to Bukkit recipe!"); ++ } ++ assertTrue(foundRecipes, "No recipes found!"); ++ } ++} +diff --git a/src/test/java/org/bukkit/support/DummyServerHelper.java b/src/test/java/org/bukkit/support/DummyServerHelper.java +index 55c05c16a80c489cdda2fd03c943921d38d978e9..309d371247adcddf0a1b370cc5faff3e6e01cb0f 100644 +--- a/src/test/java/org/bukkit/support/DummyServerHelper.java ++++ b/src/test/java/org/bukkit/support/DummyServerHelper.java +@@ -92,6 +92,15 @@ public final class DummyServerHelper { + // Paper end - testing additions + + io.papermc.paper.configuration.GlobalConfigTestingBase.setupGlobalConfigForTest(); // Paper - configuration files - setup global configuration test base ++ ++ // Paper start - add test for recipe conversion ++ when(instance.recipeIterator()).thenAnswer(ignored -> ++ com.google.common.collect.Iterators.transform( ++ RegistryHelper.getDataPack().getRecipeManager().recipes.byType.entries().iterator(), ++ input -> input.getValue().toBukkitRecipe() ++ ) ++ ); ++ // Paper end - add test for recipe conversion + return instance; + } + } |