summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/bukkit/inventory/ShapelessRecipe.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/bukkit/inventory/ShapelessRecipe.java')
-rw-r--r--src/main/java/org/bukkit/inventory/ShapelessRecipe.java119
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;
}
}