package com.bergerkiller.bukkit.common.utils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.minecraft.server.CraftingManager;
import net.minecraft.server.RecipesFurnace;
import net.minecraft.server.TileEntityFurnace;
import org.bukkit.Material;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import com.bergerkiller.bukkit.common.conversion.Conversion;
import com.bergerkiller.bukkit.common.conversion.ConversionPairs;
import com.bergerkiller.bukkit.common.conversion.util.ConvertingSet;
import com.bergerkiller.bukkit.common.internal.CommonNMS;
import com.bergerkiller.bukkit.common.inventory.CraftRecipe;
import com.bergerkiller.bukkit.common.inventory.ItemParser;
import com.bergerkiller.bukkit.common.reflection.classes.RecipeRef;
public class RecipeUtil {
private static final Map<Integer, Integer> fuelTimes = new HashMap<Integer, Integer>();
static {
ItemStack item;
for (Material material : Material.values()) {
item = new ItemStack(material, 1);
if (CommonNMS.getNative(item).getItem() == null) {
continue;
}
int fuel = TileEntityFurnace.fuelTime(CommonNMS.getNative(item));
if (fuel > 0) {
fuelTimes.put(MaterialUtil.getTypeId(material), fuel);
}
}
}
@Deprecated
public static Set<Integer> getFuelItems() {
return fuelTimes.keySet();
}
@Deprecated
public static Map<Integer, Integer> getFuelTimes() {
return fuelTimes;
}
@Deprecated
public static int getFuelTime(int itemid) {
return getFuelTime(new ItemStack(itemid, 1));
}
public static int getFuelTime(Material material) {
return getFuelTime(new ItemStack(material, 1));
}
public static int getFuelTime(org.bukkit.inventory.ItemStack item) {
if (item == null) {
return 0;
} else {
return item.getAmount() * TileEntityFurnace.fuelTime(CommonNMS.getNative(item));
}
}
public static boolean isFuelItem(int itemid) {
return fuelTimes.containsKey(itemid);
}
public static boolean isFuelItem(Material material) {
return isFuelItem(MaterialUtil.getTypeId(material));
}
public static boolean isFuelItem(org.bukkit.inventory.ItemStack item) {
return isFuelItem(MaterialUtil.getTypeId(item));
}
@Deprecated
public static boolean isHeatableItem(int itemid) {
return getFurnaceResult(itemid) != null;
}
public static boolean isHeatableItem(Material material) {
return getFurnaceResult(material) != null;
}
public static boolean isHeatableItem(org.bukkit.inventory.ItemStack item) {
return getFurnaceResult(item) != null;
}
@Deprecated
public static org.bukkit.inventory.ItemStack getFurnaceResult(int itemid) {
return getFurnaceResult(new ItemStack(itemid, 1));
}
public static org.bukkit.inventory.ItemStack getFurnaceResult(org.bukkit.Material cookedType) {
return getFurnaceResult(new ItemStack(cookedType, 1));
}
public static org.bukkit.inventory.ItemStack getFurnaceResult(org.bukkit.inventory.ItemStack cooked) {
return Conversion.toItemStack.convert(RecipesFurnace.getInstance().getResult(CommonNMS.getNative(cooked)));
}
public static Collection<ItemStack> getHeatableItemStacks() {
return ConversionPairs.itemStack.convertAll(RecipesFurnace.getInstance().recipes.keySet());
}
@Deprecated
public static Set<Integer> getHeatableItems() {
return new ConvertingSet<Integer>(RecipesFurnace.getInstance().recipes.keySet(),
Conversion.toItemStackHandle, Conversion.toItemId);
}
/**
* Gets all Crafting Recipes able to produce the ItemStack specified
*
* @param itemid of the item to craft
* @param data of the item to craft (-1 for any data)
* @return the Crafting Recipes that can craft the item specified
*/
public static CraftRecipe[] getCraftingRequirements(int itemid, int data) {
List<CraftRecipe> poss = new ArrayList<CraftRecipe>(2);
for (Object rec : getCraftRecipes()) {
ItemStack item = RecipeRef.getOutput(rec);
if (item != null && MaterialUtil.getTypeId(item) == itemid && (data == -1 || MaterialUtil.getRawData(item) == data)) {
CraftRecipe crec = CraftRecipe.create(rec);
if (crec != null) {
poss.add(crec);
}
}
}
return poss.toArray(new CraftRecipe[0]);
}
/**
* Crafts items specified in an Inventory
*
* @param parser that specified the item type, data and amount to craft
* @param source inventory to craft in
*/
public static void craftItems(ItemParser parser, Inventory source) {
if (parser.hasType()) {
final int limit;
if (parser.hasAmount()) {
limit = parser.getAmount();
} else {
limit = Integer.MAX_VALUE;
}
craftItems(parser.getTypeId(), parser.getData(), source, limit);
}
}
/**
* Crafts items specified in an Inventory
*
* @param itemid of the item to craft
* @param data of the item to craft (-1 for any data)
* @param source inventory to craft in
* @param limit amount of items to craft
*/
public static void craftItems(int itemid, int data, Inventory source, int limit) {
for (CraftRecipe rec : getCraftingRequirements(itemid, data)) {
limit -= rec.craftItems(source, limit);
}
}
@SuppressWarnings("unchecked")
private static List<Object> getCraftRecipes() {
return (List<Object>) CraftingManager.getInstance().getRecipes();
}
}