package modtweaker.mods.embers.handlers;
import com.blamejared.mtlib.helpers.LogHelper;
import com.blamejared.mtlib.utils.*;
import minetweaker.MineTweakerAPI;
import minetweaker.api.item.IItemStack;
import minetweaker.api.liquid.ILiquidStack;
import minetweaker.api.oredict.IOreDictEntry;
import net.minecraft.item.ItemStack;
import stanhebben.zenscript.annotations.*;
import teamroots.embers.compat.jei.StampingRecipeWrapper;
import teamroots.embers.item.EnumStampType;
import teamroots.embers.recipe.*;
import java.util.*;
import static com.blamejared.mtlib.helpers.InputHelper.*;
@ZenClass("mods.embers.Stamper")
public class Stamper {
public static String name = "Embers Stamper";
@ZenMethod
public static void addRecipe(IItemStack itemInput, ILiquidStack fluidInput, String stampType, IItemStack result, boolean matchMeta, boolean matchNBT) {
MineTweakerAPI.apply(new Add(new ItemStampingRecipe(toStack(itemInput), toFluid(fluidInput), getStampFromString(stampType), toStack(result), matchMeta, matchNBT)));
}
@ZenMethod
public static void addRecipe(IOreDictEntry key, ILiquidStack fluidInput, String stampType, IItemStack result) {
MineTweakerAPI.apply(new AddOre(new ItemStampingOreRecipe(key.getName(), toFluid(fluidInput), getStampFromString(stampType), toStack(result), false, false)));
}
@ZenMethod
public static void remove(IItemStack item) {
List<ItemStampingRecipe> recipes = new ArrayList<ItemStampingRecipe>();
List<ItemStampingOreRecipe> oreRecipes = new ArrayList<ItemStampingOreRecipe>();
if(item == null) {
LogHelper.logError(String.format("Required parameters missing for %s Recipe.", name));
return;
}
for(int i = 0; i < RecipeRegistry.stampingRecipes.size(); i++) {
if(ItemStack.areItemsEqual(RecipeRegistry.stampingRecipes.get(i).result, toStack(item))) {
recipes.add(RecipeRegistry.stampingRecipes.get(i));
}
}
for(int i = 0; i < RecipeRegistry.stampingOreRecipes.size(); i++) {
if(ItemStack.areItemsEqual(RecipeRegistry.stampingOreRecipes.get(i).result, toStack(item))) {
oreRecipes.add(RecipeRegistry.stampingOreRecipes.get(i));
}
}
if(!recipes.isEmpty()) {
MineTweakerAPI.apply(new Remove(recipes));
} else if(!oreRecipes.isEmpty()) {
MineTweakerAPI.apply(new RemoveOre(oreRecipes));
} else {
LogHelper.logWarning(String.format("No %s Recipe found for output %s. Command ignored!", Stamper.name, item.toString()));
}
}
private static class AddOre extends BaseListAddition<ItemStampingOreRecipe> {
public AddOre(ItemStampingOreRecipe recipe) {
super(Stamper.name, RecipeRegistry.stampingOreRecipes);
this.recipes.add(recipe);
}
@Override
public void apply() {
super.apply();
successful.forEach(rec -> {
MineTweakerAPI.getIjeiRecipeRegistry().addRecipe(new StampingRecipeWrapper(rec));
});
}
@Override
public void undo() {
super.undo();
successful.forEach(rec -> {
MineTweakerAPI.getIjeiRecipeRegistry().removeRecipe(new StampingRecipeWrapper(rec));
});
}
@Override
protected String getRecipeInfo(ItemStampingOreRecipe arg0) {
return arg0.getOre();
}
}
private static class Add extends BaseListAddition<ItemStampingRecipe> {
public Add(ItemStampingRecipe recipe) {
super(Stamper.name, RecipeRegistry.stampingRecipes);
this.recipes.add(recipe);
}
@Override
public void apply() {
super.apply();
successful.forEach(rec -> {
MineTweakerAPI.getIjeiRecipeRegistry().addRecipe(new StampingRecipeWrapper(rec));
});
}
@Override
public void undo() {
super.undo();
successful.forEach(rec -> {
MineTweakerAPI.getIjeiRecipeRegistry().removeRecipe(new StampingRecipeWrapper(rec));
});
}
@Override
protected String getRecipeInfo(ItemStampingRecipe arg0) {
return LogHelper.getStackDescription(arg0.getStack());
}
}
private static class Remove extends BaseListRemoval<ItemStampingRecipe> {
public Remove(List<ItemStampingRecipe> recipes) {
super(Stamper.name, RecipeRegistry.stampingRecipes, recipes);
}
@Override
public void apply() {
super.apply();
successful.forEach(rec -> {
MineTweakerAPI.getIjeiRecipeRegistry().removeRecipe(new StampingRecipeWrapper(rec));
});
}
@Override
public void undo() {
super.undo();
successful.forEach(rec -> {
MineTweakerAPI.getIjeiRecipeRegistry().addRecipe(new StampingRecipeWrapper(rec));
});
}
@Override
protected String getRecipeInfo(ItemStampingRecipe arg0) {
return LogHelper.getStackDescription(arg0.getStack());
}
}
private static class RemoveOre extends BaseListRemoval<ItemStampingOreRecipe> {
public RemoveOre(List<ItemStampingOreRecipe> recipes) {
super(Stamper.name, RecipeRegistry.stampingOreRecipes, recipes);
}
@Override
public void apply() {
super.apply();
successful.forEach(rec -> {
MineTweakerAPI.getIjeiRecipeRegistry().removeRecipe(new StampingRecipeWrapper(rec));
});
}
@Override
public void undo() {
super.undo();
successful.forEach(rec -> {
MineTweakerAPI.getIjeiRecipeRegistry().addRecipe(new StampingRecipeWrapper(rec));
});
}
@Override
protected String getRecipeInfo(ItemStampingOreRecipe arg0) {
return arg0.getOre();
}
}
public static EnumStampType getStampFromString(String string) {
switch(string) {
default:
return EnumStampType.TYPE_NULL;
case "flat":
return EnumStampType.TYPE_FLAT;
case "bar":
return EnumStampType.TYPE_BAR;
case "plate":
return EnumStampType.TYPE_PLATE;
case "null":
return EnumStampType.TYPE_NULL;
}
}
}