@@ -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 @@
*/
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 ShapelessRecipe addIngredient(Material ingredient) {
* 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 ShapelessRecipe addIngredient(Material ingredient, int rawdata) {
* @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 ShapelessRecipe addIngredient(int count, Material ingredient) {
*
* @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,15 +194,19 @@ public ShapelessRecipe removeIngredient(MaterialData ingredient) {
* @return The result stack.
*/
public ItemStack getResult () {
return output ;
return output . clone () ;
}
/**
* Get the list of ingredients used for this 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 ;
}
}