From ac5b19c55e0327e4400d995e7f59a4c58de845c1 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Wed, 27 Feb 2019 21:06:04 -0500
Subject: [PATCH] Fix Custom Shapeless Custom Crafting Recipes

Mojang implemented Shapeless different than Shaped

This made the Bukkit RecipeChoice API not work for Shapeless.

This reimplements vanilla logic using the same test logic as Shaped
---
 ...om-Shapeless-Custom-Crafting-Recipes.patch | 58 +++++++++++++++++++
 1 file changed, 58 insertions(+)
 create mode 100644 Spigot-Server-Patches/0418-Fix-Custom-Shapeless-Custom-Crafting-Recipes.patch

diff --git a/Spigot-Server-Patches/0418-Fix-Custom-Shapeless-Custom-Crafting-Recipes.patch b/Spigot-Server-Patches/0418-Fix-Custom-Shapeless-Custom-Crafting-Recipes.patch
new file mode 100644
index 0000000000..6ce8ec26af
--- /dev/null
+++ b/Spigot-Server-Patches/0418-Fix-Custom-Shapeless-Custom-Crafting-Recipes.patch
@@ -0,0 +1,58 @@
+From 270c7bb8936f603c5f8700598807bb20482ed4d8 Mon Sep 17 00:00:00 2001
+From: Aikar <aikar@aikar.co>
+Date: Fri, 18 Jan 2019 00:08:15 -0500
+Subject: [PATCH] Fix Custom Shapeless Custom Crafting Recipes
+
+Mojang implemented Shapeless different than Shaped
+
+This made the Bukkit RecipeChoice API not work for Shapeless.
+
+This reimplements vanilla logic using the same test logic as Shaped
+
+diff --git a/src/main/java/net/minecraft/server/ShapelessRecipes.java b/src/main/java/net/minecraft/server/ShapelessRecipes.java
+index 819b4ac2da..1dc9a1c93c 100644
+--- a/src/main/java/net/minecraft/server/ShapelessRecipes.java
++++ b/src/main/java/net/minecraft/server/ShapelessRecipes.java
+@@ -59,21 +59,32 @@ public class ShapelessRecipes implements IRecipe {
+         if (!(iinventory instanceof InventoryCrafting)) {
+             return false;
+         } else {
+-            AutoRecipeStackManager autorecipestackmanager = new AutoRecipeStackManager();
+-            int i = 0;
+-
++            // Paper start - use RecipeItemStack.test
++            java.util.List<ItemStack> providedItems = new java.util.ArrayList<>();
+             for (int j = 0; j < iinventory.n(); ++j) {
+                 for (int k = 0; k < iinventory.U_(); ++k) {
+                     ItemStack itemstack = iinventory.getItem(k + j * iinventory.U_());
+ 
+                     if (!itemstack.isEmpty()) {
+-                        ++i;
+-                        autorecipestackmanager.b(new ItemStack(itemstack.getItem()));
++                        providedItems.add(itemstack.cloneItemStack());
+                     }
+                 }
+             }
+-
+-            return i == this.ingredients.size() && autorecipestackmanager.a(this, (IntList) null);
++            java.util.List<RecipeItemStack> ingredients = new java.util.ArrayList<>(this.ingredients);
++
++            PROVIDED:
++            for (ItemStack provided : providedItems) {
++                for (Iterator<RecipeItemStack> itIngredient = ingredients.iterator(); itIngredient.hasNext(); ) {
++                    RecipeItemStack ingredient = itIngredient.next();
++                    if (ingredient.test(provided)) {
++                        itIngredient.remove();
++                        continue PROVIDED;
++                    }
++                }
++                return false;
++            }
++            return ingredients.isEmpty();
++            // Paper end
+         }
+     }
+ 
+-- 
+2.20.1
+