From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Aikar 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/RecipeChoice.java b/src/main/java/org/bukkit/inventory/RecipeChoice.java index 9ef4221742eea7e091f240e2721d5260d153c7c1..653837b5f3a5fb9e5aa806f8ef8ae56fb53cce02 100644 --- a/src/main/java/org/bukkit/inventory/RecipeChoice.java +++ b/src/main/java/org/bukkit/inventory/RecipeChoice.java @@ -157,8 +157,6 @@ public interface RecipeChoice extends Predicate, Cloneable { /** * Represents a choice that will be valid only if one of the stacks is * exactly matched (aside from stack size). - *
- * Only valid for shaped recipes */ public static class ExactChoice implements RecipeChoice { diff --git a/src/main/java/org/bukkit/inventory/ShapedRecipe.java b/src/main/java/org/bukkit/inventory/ShapedRecipe.java index 55f4a6efa7dfb64f131f735f92356d01e7cc775a..90b58219ca99dfd4368119183bb414e51c0f0dd1 100644 --- a/src/main/java/org/bukkit/inventory/ShapedRecipe.java +++ b/src/main/java/org/bukkit/inventory/ShapedRecipe.java @@ -180,6 +180,13 @@ public class ShapedRecipe extends CraftingRecipe { 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 a9d1f9fc129f757353b879fc5946c4b9299833ea..d4a9572a0fedee8993d32ca006a28a242d148e36 100644 --- a/src/main/java/org/bukkit/inventory/ShapelessRecipe.java +++ b/src/main/java/org/bukkit/inventory/ShapelessRecipe.java @@ -132,6 +132,40 @@ public class ShapelessRecipe extends CraftingRecipe { 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 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. * @@ -155,7 +189,7 @@ public class ShapelessRecipe extends CraftingRecipe { */ @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) } /** @@ -182,7 +216,7 @@ public class ShapelessRecipe extends CraftingRecipe { */ @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) } /**