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.MeltingRecipeWrapper;
import teamroots.embers.recipe.*;
import java.util.*;
import java.util.Map.Entry;
import static com.blamejared.mtlib.helpers.InputHelper.*;
@ZenClass("mods.embers.Melter")
public class Melter {
public static String name = "Embers Melter";
@ZenMethod
public static void addRecipe(IItemStack input, ILiquidStack outputOne, boolean matchMeta, boolean matchNBT) {
MineTweakerAPI.apply(new Add(toStack(input), new ItemMeltingRecipe(toStack(input), toFluid(outputOne), matchMeta, matchNBT)));
}
@ZenMethod
public static void addOreRecipe(IOreDictEntry key, ILiquidStack outputOne, boolean matchMeta, boolean matchNBT) {
MineTweakerAPI.apply(new AddOre(key.getName(), new ItemMeltingOreRecipe(key.getName(), toFluid(outputOne))));
}
@ZenMethod
public static void remove(ILiquidStack fluid) {
List<ItemStack> recipes = new ArrayList<>();
List<String> oreRecipes = new ArrayList<>();
if(fluid == null) {
LogHelper.logError(String.format("Required parameters missing for %s Recipe.", name));
return;
}
for(int i = 0; i < RecipeRegistry.meltingRecipes.size(); i++) {
if(((ItemMeltingRecipe) RecipeRegistry.meltingRecipes.values().toArray()[i]).getFluid().getFluid().getName().equals(toFluid(fluid).getFluid().getName())) {
recipes.add(((ItemStack) RecipeRegistry.meltingRecipes.keySet().toArray()[i]));
}
}
for(int i = 0; i < RecipeRegistry.meltingOreRecipes.size(); i++) {
if(((ItemMeltingOreRecipe) RecipeRegistry.meltingOreRecipes.values().toArray()[i]).getFluid().getFluid().getName().equals(toFluid(fluid).getFluid().getName())) {
oreRecipes.add(((String) RecipeRegistry.meltingOreRecipes.keySet().toArray()[i]));
}
}
if(!recipes.isEmpty()) {
Map<ItemStack, ItemMeltingRecipe> map = new HashMap<ItemStack, ItemMeltingRecipe>();
for(int i = 0; i < recipes.size(); i++) {
map.put(recipes.get(i), RecipeRegistry.meltingRecipes.get(recipes.get(i)));
}
MineTweakerAPI.apply(new Remove(map));
} else if(!oreRecipes.isEmpty()) {
Map<String, ItemMeltingOreRecipe> map = new HashMap<String, ItemMeltingOreRecipe>();
for(int i = 0; i < oreRecipes.size(); i++) {
map.put(oreRecipes.get(i), RecipeRegistry.meltingOreRecipes.get(oreRecipes.get(i)));
}
MineTweakerAPI.apply(new RemoveOre(map));
} else {
LogHelper.logWarning(String.format("No %s Recipe found for output %s. Command ignored!", Melter.name, fluid.toString()));
}
}
private static class AddOre extends BaseMapAddition<String, ItemMeltingOreRecipe> {
public AddOre(String stack, ItemMeltingOreRecipe recipe) {
super(Melter.name, RecipeRegistry.meltingOreRecipes);
this.recipes.put(stack, recipe);
}
@Override
public void apply() {
super.apply();
successful.forEach((stack, recipe) -> {
MineTweakerAPI.getIjeiRecipeRegistry().addRecipe(new MeltingRecipeWrapper(recipe));
});
}
@Override
public void undo() {
super.undo();
successful.forEach((stack, recipe) -> {
MineTweakerAPI.getIjeiRecipeRegistry().removeRecipe(new MeltingRecipeWrapper(recipe));
});
}
@Override
protected String getRecipeInfo(Entry<String, ItemMeltingOreRecipe> arg0) {
return arg0.getValue().getOreName();
}
}
private static class Add extends BaseMapAddition<ItemStack, ItemMeltingRecipe> {
public Add(ItemStack stack, ItemMeltingRecipe recipe) {
super(Melter.name, RecipeRegistry.meltingRecipes);
this.recipes.put(stack, recipe);
}
@Override
public void apply() {
super.apply();
successful.forEach((stack, recipe) -> {
MineTweakerAPI.getIjeiRecipeRegistry().addRecipe(new MeltingRecipeWrapper(recipe));
});
}
@Override
public void undo() {
super.undo();
successful.forEach((stack, recipe) -> {
MineTweakerAPI.getIjeiRecipeRegistry().removeRecipe(new MeltingRecipeWrapper(recipe));
});
}
@Override
protected String getRecipeInfo(Entry<ItemStack, ItemMeltingRecipe> arg0) {
return LogHelper.getStackDescription(arg0.getValue().getStack());
}
}
private static class Remove extends BaseMapRemoval<ItemStack, ItemMeltingRecipe> {
public Remove(Map<ItemStack, ItemMeltingRecipe> recipes) {
super(Melter.name, RecipeRegistry.meltingRecipes, recipes);
}
@Override
public void apply() {
super.apply();
successful.forEach((stack, recipe) -> {
MineTweakerAPI.getIjeiRecipeRegistry().removeRecipe(new MeltingRecipeWrapper(recipe));
});
}
@Override
public void undo() {
super.undo();
successful.forEach((stack, recipe) -> {
MineTweakerAPI.getIjeiRecipeRegistry().addRecipe(new MeltingRecipeWrapper(recipe));
});
}
@Override
protected String getRecipeInfo(Entry<ItemStack, ItemMeltingRecipe> arg0) {
return LogHelper.getStackDescription(arg0.getValue().getStack());
}
}
private static class RemoveOre extends BaseMapRemoval<String, ItemMeltingOreRecipe> {
public RemoveOre(Map<String, ItemMeltingOreRecipe> recipes) {
super(Melter.name, RecipeRegistry.meltingOreRecipes, recipes);
}
@Override
public void apply() {
super.apply();
successful.forEach((stack, recipe) -> {
MineTweakerAPI.getIjeiRecipeRegistry().removeRecipe(new MeltingRecipeWrapper(recipe));
});
}
@Override
public void undo() {
super.undo();
successful.forEach((stack, recipe) -> {
MineTweakerAPI.getIjeiRecipeRegistry().addRecipe(new MeltingRecipeWrapper(recipe));
});
}
@Override
protected String getRecipeInfo(Entry<String, ItemMeltingOreRecipe> arg0) {
return arg0.getValue().getOreName();
}
}
}