From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Tue, 28 Jan 2014 19:13:57 -0500
Subject: [PATCH] Add ItemStack Recipe API helper methods

Allows using ExactChoice Recipes with easier methods

Redirects some of upstream's APIs to these new methods to avoid
usage of magic values and the deprecated RecipeChoice#getItemStack

diff --git a/src/main/java/org/bukkit/inventory/ShapedRecipe.java b/src/main/java/org/bukkit/inventory/ShapedRecipe.java
index 7be830ea0a3b24c5cdfb8e6ab62cb2ee506a4026..baba8485587baab945add8bc91e91a1bfa27c84b 100644
--- a/src/main/java/org/bukkit/inventory/ShapedRecipe.java
+++ b/src/main/java/org/bukkit/inventory/ShapedRecipe.java
@@ -146,6 +146,13 @@ public class ShapedRecipe implements Recipe, Keyed {
         return this;
     }
 
+    // Paper start
+    @NotNull
+    public ShapedRecipe setIngredient(char key, @NotNull ItemStack item) {
+        return setIngredient(key, new RecipeChoice.ExactChoice(item));
+    }
+    // Paper end
+
     /**
      * Get a copy of the ingredients map.
      *
diff --git a/src/main/java/org/bukkit/inventory/ShapelessRecipe.java b/src/main/java/org/bukkit/inventory/ShapelessRecipe.java
index 62675962d1b7882b953d2618aed1f363c046e97d..61b3a1b1d03fe6cdacb82b07e6c7197f56b4a1b3 100644
--- a/src/main/java/org/bukkit/inventory/ShapelessRecipe.java
+++ b/src/main/java/org/bukkit/inventory/ShapelessRecipe.java
@@ -144,6 +144,40 @@ public class ShapelessRecipe implements Recipe, Keyed {
         return this;
     }
 
+    // Paper start
+    @NotNull
+    public ShapelessRecipe addIngredient(@NotNull ItemStack item) {
+        return addIngredient(item.getAmount(), item);
+    }
+
+    @NotNull
+    public ShapelessRecipe addIngredient(int count, @NotNull ItemStack item) {
+        Preconditions.checkArgument(ingredients.size() + count <= 9, "Shapeless recipes cannot have more than 9 ingredients");
+        while (count-- > 0) {
+            ingredients.add(new RecipeChoice.ExactChoice(item));
+        }
+        return this;
+    }
+
+    @NotNull
+    public ShapelessRecipe removeIngredient(@NotNull ItemStack item) {
+        return removeIngredient(1, item);
+    }
+
+    @NotNull
+    public ShapelessRecipe removeIngredient(int count, @NotNull ItemStack item) {
+        Iterator<RecipeChoice> iterator = ingredients.iterator();
+        while (count > 0 && iterator.hasNext()) {
+            RecipeChoice choice = iterator.next();
+            if (choice.test(item)) {
+                iterator.remove();
+                count--;
+            }
+        }
+        return this;
+    }
+    // Paper end
+
     /**
      * Removes an ingredient from the list.
      *
@@ -167,7 +201,7 @@ public class ShapelessRecipe implements Recipe, Keyed {
      */
     @NotNull
     public ShapelessRecipe removeIngredient(@NotNull Material ingredient) {
-        return removeIngredient(ingredient, 0);
+        return removeIngredient(new ItemStack(ingredient)); // Paper - avoid using deprecated methods (magic values; RecipeChoice#getItemStack)
     }
 
     /**
@@ -194,7 +228,7 @@ public class ShapelessRecipe implements Recipe, Keyed {
      */
     @NotNull
     public ShapelessRecipe removeIngredient(int count, @NotNull Material ingredient) {
-        return removeIngredient(count, ingredient, 0);
+        return removeIngredient(count, new ItemStack(ingredient)); // Paper - avoid using deprecated methods (magic values; RecipeChoice#getItemStack)
     }
 
     /**
