package modtweaker.mods.forestry.handlers;
import com.blamejared.mtlib.helpers.LogHelper;
import forestry.api.recipes.*;
import forestry.factory.recipes.jei.squeezer.*;
import mezz.jei.api.recipe.*;
import minetweaker.MineTweakerAPI;
import minetweaker.api.item.*;
import minetweaker.api.liquid.ILiquidStack;
import minetweaker.mc1102.item.MCItemStack;
import modtweaker.mods.forestry.*;
import modtweaker.mods.forestry.recipes.SqueezerRecipe;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import stanhebben.zenscript.annotations.Optional;
import stanhebben.zenscript.annotations.*;
import java.util.*;
import static com.blamejared.mtlib.helpers.InputHelper.*;
import static com.blamejared.mtlib.helpers.StackHelper.matches;
@ZenClass("mods.forestry.Squeezer")
public class Squeezer {
public static final String name = "Forestry Squeezer";
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Adds recipe to Squeezer
*
* @param fluidOutput recipe fluid amount
* @param ingredients recipe ingredients
* @param timePerItem time per crafting operation
* * @param itemOutput recipe output (optional)
*/
@ZenMethod
public static void addRecipe(ILiquidStack fluidOutput, IItemStack[] ingredients, int timePerItem, @Optional WeightedItemStack itemOutput) {
if(itemOutput == null) {
itemOutput = new WeightedItemStack(new MCItemStack(new ItemStack(Blocks.AIR)), 0);
}
MineTweakerAPI.apply(new Add(new SqueezerRecipe(timePerItem, toStacks(ingredients), toFluid(fluidOutput), toStack(itemOutput.getStack()), itemOutput.getChance())));
}
private static class Add extends ForestryListAddition<ISqueezerRecipe> {
public Add(ISqueezerRecipe recipe) {
super(Squeezer.name, RecipeManagers.squeezerManager);
recipes.add(recipe);
MineTweakerAPI.getIjeiRecipeRegistry().addRecipe(new SqueezerRecipeWrapper(recipe));
}
@Override
public String getRecipeInfo(ISqueezerRecipe recipe) {
return LogHelper.getStackDescription(recipe.getFluidOutput());
}
@Override
public IRecipeWrapper wrapRecipe(ISqueezerRecipe recipe){
return new SqueezerRecipeWrapper(recipe);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Removes a recipe for the Centrifuge
*
* @param liquid liquid output
* * @param ingredients list of ingredients (optional)
*/
@ZenMethod
public static void removeRecipe(IIngredient liquid, @Optional IIngredient[] ingredients) {
List<ISqueezerRecipe> recipes = new LinkedList<ISqueezerRecipe>();
for(ISqueezerRecipe r : RecipeManagers.squeezerManager.recipes()) {
if(r != null && r.getFluidOutput() != null && matches(liquid, toILiquidStack(r.getFluidOutput()))) {
// optional check for ingredients
if(ingredients != null) {
boolean matched = false;
for(int i = 0; i < ingredients.length; i++) {
if(matches(ingredients[i], toIItemStack(r.getResources()[i])))
matched = true;
else {
matched = false;
// if one ingredients doesn't match abort all further checks
break;
}
}
// if some ingredient doesn't match, the last one is false
if(matched)
recipes.add(r);
} else {
recipes.add(r);
}
}
}
if(!recipes.isEmpty()) {
MineTweakerAPI.apply(new Remove(recipes));
} else {
LogHelper.logWarning(String.format("No %s Recipe found for %s. Command ignored!", Squeezer.name, LogHelper.getStackDescription(liquid)));
}
}
private static class Remove extends ForestryListRemoval<ISqueezerRecipe, ISqueezerManager> {
public Remove(List<ISqueezerRecipe> recipes) {
super(Squeezer.name, RecipeManagers.squeezerManager, recipes);
}
@Override
public String getRecipeInfo(ISqueezerRecipe recipe) {
return LogHelper.getStackDescription(recipe.getFluidOutput());
}
@Override
public IRecipeWrapper wrapRecipe(ISqueezerRecipe recipe){
return new SqueezerRecipeWrapper(recipe);
}
}
}