package blusunrize.immersiveengineering.common.util.compat.crafttweaker; import blusunrize.immersiveengineering.api.crafting.MixerRecipe; import minetweaker.IUndoableAction; import minetweaker.MineTweakerAPI; import minetweaker.api.item.IIngredient; import minetweaker.api.liquid.ILiquidStack; import net.minecraftforge.fluids.FluidStack; import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenMethod; import java.util.ArrayList; import java.util.Iterator; @ZenClass("mods.immersiveengineering.Mixer") public class Mixer { @ZenMethod public static void addRecipe(ILiquidStack output, ILiquidStack fluidInput, IIngredient[] itemInputs, int energy) { Object[] adds = null; if(itemInputs != null) { adds = new Object[itemInputs.length]; for(int i = 0; i < itemInputs.length; i++) adds[i] = CraftTweakerHelper.toObject(itemInputs[i]); } MixerRecipe r = new MixerRecipe(CraftTweakerHelper.toFluidStack(output), CraftTweakerHelper.toFluidStack(fluidInput), adds, energy); MineTweakerAPI.apply(new Add(r)); } private static class Add implements IUndoableAction { private final MixerRecipe recipe; public Add(MixerRecipe recipe) { this.recipe = recipe; } @Override public void apply() { MixerRecipe.recipeList.add(recipe); MineTweakerAPI.getIjeiRecipeRegistry().addRecipe(recipe); } @Override public boolean canUndo() { return true; } @Override public void undo() { MixerRecipe.recipeList.remove(recipe); MineTweakerAPI.getIjeiRecipeRegistry().removeRecipe(recipe); } @Override public String describe() { return "Adding Fermenter Recipe for Fluid " + recipe.fluidOutput.getLocalizedName(); } @Override public String describeUndo() { return "Removing Fermenter Recipe for Fluid " + recipe.fluidOutput.getLocalizedName(); } @Override public Object getOverrideKey() { return null; } } @ZenMethod public static void removeRecipe(ILiquidStack output) { if(CraftTweakerHelper.toFluidStack(output) != null) MineTweakerAPI.apply(new RemoveFluid(CraftTweakerHelper.toFluidStack(output))); } private static class RemoveFluid implements IUndoableAction { private final FluidStack output; ArrayList<MixerRecipe> removedRecipes = new ArrayList<MixerRecipe>(); public RemoveFluid(FluidStack output) { this.output = output; } @Override public void apply() { Iterator<MixerRecipe> it = MixerRecipe.recipeList.iterator(); while(it.hasNext()) { MixerRecipe r = it.next(); if(r != null && r.fluidOutput != null && r.fluidOutput.isFluidEqual(output)) { removedRecipes.add(r); MineTweakerAPI.getIjeiRecipeRegistry().removeRecipe(r); it.remove(); } } } @Override public void undo() { if(removedRecipes != null) for(MixerRecipe recipe : removedRecipes) if(recipe != null) { MixerRecipe.recipeList.add(recipe); MineTweakerAPI.getIjeiRecipeRegistry().addRecipe(recipe); } } @Override public String describe() { return "Removing Mixer Recipes for Fluid " + output.getLocalizedName(); } @Override public String describeUndo() { return "Re-Adding Mixer Recipes for Fluid " + output.getLocalizedName(); } @Override public Object getOverrideKey() { return null; } @Override public boolean canUndo() { return true; } } }