diff options
Diffstat (limited to 'src/main/java/org/bukkit/inventory/ShapelessRecipe.java')
-rw-r--r-- | src/main/java/org/bukkit/inventory/ShapelessRecipe.java | 119 |
1 files changed, 99 insertions, 20 deletions
diff --git a/src/main/java/org/bukkit/inventory/ShapelessRecipe.java b/src/main/java/org/bukkit/inventory/ShapelessRecipe.java index 1ed559e8..2263043f 100644 --- a/src/main/java/org/bukkit/inventory/ShapelessRecipe.java +++ b/src/main/java/org/bukkit/inventory/ShapelessRecipe.java @@ -1,6 +1,10 @@ package org.bukkit.inventory; import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.apache.commons.lang.Validate; import org.bukkit.Material; import org.bukkit.material.MaterialData; @@ -11,7 +15,7 @@ import org.bukkit.material.MaterialData; */ public class ShapelessRecipe implements Recipe { private ItemStack output; - private ArrayList<MaterialData> ingredients = new ArrayList<MaterialData>(); + private List<ItemStack> ingredients = new ArrayList<ItemStack>(); /** * Create a shapeless recipe to craft the specified ItemStack. The constructor merely determines the @@ -20,9 +24,13 @@ public class ShapelessRecipe implements Recipe { * @param result The item you want the recipe to create. * @see ShapelessRecipe#addIngredient(Material) * @see ShapelessRecipe#addIngredient(MaterialData) + * @see ShapelessRecipe#addIngredient(Material,int) + * @see ShapelessRecipe#addIngredient(int,Material) + * @see ShapelessRecipe#addIngredient(int,MaterialData) + * @see ShapelessRecipe#addIngredient(int,Material,int) */ public ShapelessRecipe(ItemStack result) { - this.output = result; + this.output = new ItemStack(result); } /** @@ -49,7 +57,7 @@ public class ShapelessRecipe implements Recipe { * Adds the specified ingredient. * * @param ingredient The ingredient to add. - * @param rawdata The data value. + * @param rawdata The data value, or -1 to allow any data value. * @return The changed recipe, so you can chain calls. */ public ShapelessRecipe addIngredient(Material ingredient, int rawdata) { @@ -64,13 +72,7 @@ public class ShapelessRecipe implements Recipe { * @return The changed recipe, so you can chain calls. */ public ShapelessRecipe addIngredient(int count, MaterialData ingredient) { - if (ingredients.size() + count > 9) { - throw new IllegalArgumentException("Shapeless recipes cannot have more than 9 ingredients"); - } - while (count-- > 0) { - ingredients.add(ingredient); - } - return this; + return addIngredient(count, ingredient.getItemType(), ingredient.getData()); } /** @@ -89,27 +91,100 @@ public class ShapelessRecipe implements Recipe { * * @param count How many to add (can't be more than 9!) * @param ingredient The ingredient to add. - * @param rawdata The data value. + * @param rawdata The data value, or -1 to allow any data value. * @return The changed recipe, so you can chain calls. */ public ShapelessRecipe addIngredient(int count, Material ingredient, int rawdata) { - MaterialData data = ingredient.getNewData((byte) rawdata); + Validate.isTrue(ingredients.size() + count <= 9, "Shapeless recipes cannot have more than 9 ingredients"); - if (data == null) { - data = new MaterialData(ingredient, (byte) rawdata); + while (count-- > 0) { + ingredients.add(new ItemStack(ingredient, 1, (short) rawdata)); } - return addIngredient(count, data); + return this; + } + + /** + * Removes an ingredient from the list. If the ingredient occurs multiple times, + * only one instance of it is removed. Only removes exact matches, with a data value + * of 0. + * + * @param ingredient The ingredient to remove + * @return The changed recipe. + */ + public ShapelessRecipe removeIngredient(Material ingredient) { + return removeIngredient(ingredient, 0); } /** * Removes an ingredient from the list. If the ingredient occurs multiple times, - * only one instance of it is removed. + * only one instance of it is removed. If the data value is -1, only ingredients + * with a -1 data value will be removed. * * @param ingredient The ingredient to remove * @return The changed recipe. */ public ShapelessRecipe removeIngredient(MaterialData ingredient) { - this.ingredients.remove(ingredient); + return removeIngredient(ingredient.getItemType(), ingredient.getData()); + } + + /** + * Removes multiple instances of an ingredient from the list. If there are less instances + * then specified, all will be removed. Only removes exact matches, with a data value + * of 0. + * + * @param count The number of copies to remove. + * @param ingredient The ingredient to remove + * @return The changed recipe. + */ + public ShapelessRecipe removeIngredient(int count, Material ingredient) { + return removeIngredient(count, ingredient, 0); + } + + /** + * Removes multiple instances of an ingredient from the list. If there are less instances + * then specified, all will be removed. If the data value is -1, only ingredients + * with a -1 data value will be removed. + * + * @param count The number of copies to remove. + * @param ingredient The ingredient to remove. + * @return The changed recipe. + */ + public ShapelessRecipe removeIngredient(int count, MaterialData ingredient) { + return removeIngredient(count, ingredient.getItemType(), ingredient.getData()); + } + + /** + * Removes an ingredient from the list. If the ingredient occurs multiple times, + * only one instance of it is removed. If the data value is -1, only ingredients + * with a -1 data value will be removed. + * + * @param ingredient The ingredient to remove + * @param rawdata The data value; + * @return The changed recipe. + */ + public ShapelessRecipe removeIngredient(Material ingredient, int rawdata) { + return removeIngredient(1, ingredient, rawdata); + } + + /** + * Removes multiple instances of an ingredient from the list. If there are less instances + * then specified, all will be removed. If the data value is -1, only ingredients + * with a -1 data value will be removed. + * + * @param count The number of copies to remove. + * @param ingredient The ingredient to remove. + * @param rawdata The data value. + * @return The changed recipe. + */ + public ShapelessRecipe removeIngredient(int count, Material ingredient, int rawdata) { + Iterator<ItemStack> iterator = ingredients.iterator(); + while (count > 0 && iterator.hasNext()) { + ItemStack stack = iterator.next(); + if (stack.getType() == ingredient && stack.getDurability() == rawdata) { + iterator.remove(); + count--; + } + } return this; } @@ -119,7 +194,7 @@ public class ShapelessRecipe implements Recipe { * @return The result stack. */ public ItemStack getResult() { - return output; + return output.clone(); } /** @@ -127,7 +202,11 @@ public class ShapelessRecipe implements Recipe { * * @return The input list */ - public ArrayList<MaterialData> getIngredientList() { - return ingredients; + public List<ItemStack> getIngredientList() { + ArrayList<ItemStack> result = new ArrayList<ItemStack>(ingredients.size()); + for (ItemStack ingredient : ingredients) { + result.add(ingredient.clone()); + } + return result; } } |