package buildcraftAdditions.compat.minetweaker.script;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.item.ItemStack;
import buildcraftAdditions.api.recipe.BCARecipeManager;
import buildcraftAdditions.api.recipe.duster.IDusterRecipe;
import minetweaker.IUndoableAction;
import minetweaker.MineTweakerAPI;
import minetweaker.annotations.ModOnly;
import minetweaker.api.item.IItemStack;
import minetweaker.api.minecraft.MineTweakerMC;
import minetweaker.api.oredict.IOreDictEntry;
import stanhebben.zenscript.annotations.ZenClass;
import stanhebben.zenscript.annotations.ZenMethod;
/**
* Copyright (c) 2014-2015, AEnterprise
* http://buildcraftadditions.wordpress.com/
* Buildcraft Additions is distributed under the terms of GNU GPL v3.0
* Please check the contents of the license located in
* http://buildcraftadditions.wordpress.com/wiki/licensing-stuff/
*/
@ZenClass("mods.bcadditions.dusters")
@ModOnly("bcadditions")
public class Dusters {
public static void register() {
MineTweakerAPI.registerClass(Dusters.class);
}
@ZenMethod
public static void addDusting(IItemStack input, IItemStack output) {
MineTweakerAPI.apply(new AddRecipeAction(input, output));
}
@ZenMethod
public static void addDusting(IOreDictEntry input, IItemStack output) {
MineTweakerAPI.apply(new AddRecipeOreDictAction(input, output));
}
@ZenMethod
public static void removeDusting(IItemStack input) {
MineTweakerAPI.apply(new RemoveRecipeAction(input));
}
@ZenMethod
public static void removeDusting(IOreDictEntry input) {
MineTweakerAPI.apply(new RemoveRecipeOreDictAction(input));
}
private static class AddRecipeAction implements IUndoableAction {
public final IItemStack input, output;
public AddRecipeAction(IItemStack input, IItemStack output) {
this.input = input;
this.output = output;
}
@Override
public void apply() {
BCARecipeManager.duster.addRecipe(MineTweakerMC.getItemStack(input), MineTweakerMC.getItemStack(output));
}
@Override
public boolean canUndo() {
return true;
}
@Override
public void undo() {
BCARecipeManager.duster.removeRecipe(MineTweakerMC.getItemStack(input));
}
@Override
public String describe() {
return String.format("Adding BCA Duster recipe for %s -> %s", input, output);
}
@Override
public String describeUndo() {
return String.format("Undoing \"Adding BCA Duster recipe\": Removing BCA Duster recipe for %s -> %s", input, output);
}
@Override
public Object getOverrideKey() {
return null;
}
}
private static class RemoveRecipeAction implements IUndoableAction {
public final IItemStack input;
public IDusterRecipe dusterRecipe;
public RemoveRecipeAction(IItemStack input) {
this.input = input;
}
@Override
public void apply() {
ItemStack inputStack = MineTweakerMC.getItemStack(input);
IDusterRecipe recipe = BCARecipeManager.duster.getRecipe(inputStack);
if (recipe != null) {
dusterRecipe = recipe;
BCARecipeManager.duster.removeRecipe(inputStack);
}
}
@Override
public boolean canUndo() {
return dusterRecipe != null;
}
@Override
public void undo() {
BCARecipeManager.duster.addRecipe(dusterRecipe);
}
@Override
public String describe() {
ItemStack inputStack = MineTweakerMC.getItemStack(input);
IDusterRecipe recipe = BCARecipeManager.duster.getRecipe(inputStack);
return String.format("Removing BCA Duster recipe for %s -> %s", input, recipe != null ? recipe.getOutput(inputStack) : "?");
}
@Override
public String describeUndo() {
return String.format("Undoing \"Removing BCA Duster recipe\": Adding BCA Duster recipe for %s (%s)", input, dusterRecipe);
}
@Override
public Object getOverrideKey() {
return null;
}
}
private static class AddRecipeOreDictAction implements IUndoableAction {
public final IOreDictEntry input;
public final IItemStack output;
public AddRecipeOreDictAction(IOreDictEntry input, IItemStack output) {
this.input = input;
this.output = output;
}
@Override
public void apply() {
BCARecipeManager.duster.addRecipe(input.getName(), MineTweakerMC.getItemStack(output));
}
@Override
public boolean canUndo() {
return true;
}
@Override
public void undo() {
for (IItemStack inputStack : input.getItems())
BCARecipeManager.duster.removeRecipe(MineTweakerMC.getItemStack(inputStack));
}
@Override
public String describe() {
return String.format("Adding BCA Duster recipe for %s -> %s", input, output);
}
@Override
public String describeUndo() {
return String.format("Undoing \"Adding BCA Duster recipe\": Removing BCA Duster recipe for %s -> %s", input, output);
}
@Override
public Object getOverrideKey() {
return null;
}
}
private static class RemoveRecipeOreDictAction implements IUndoableAction {
public final IOreDictEntry input;
public final List<IDusterRecipe> recipes;
public RemoveRecipeOreDictAction(IOreDictEntry input) {
this.input = input;
recipes = new ArrayList<IDusterRecipe>();
}
@Override
public void apply() {
for (IItemStack inputStack : input.getItems()) {
ItemStack inputItemStack = MineTweakerMC.getItemStack(inputStack);
IDusterRecipe recipe = BCARecipeManager.duster.getRecipe(inputItemStack);
if (recipe != null) {
recipes.add(recipe);
BCARecipeManager.duster.removeRecipe(inputItemStack);
}
}
}
@Override
public boolean canUndo() {
return !recipes.isEmpty();
}
@Override
public void undo() {
for (IDusterRecipe recipe : recipes)
BCARecipeManager.duster.addRecipe(recipe);
}
@Override
public String describe() {
ItemStack inputStack = MineTweakerMC.getItemStack(input);
IDusterRecipe recipe = BCARecipeManager.duster.getRecipe(inputStack);
return String.format("Removing BCA Duster recipe for %s -> %s", input, recipe != null ? recipe.getOutput(inputStack) : "?");
}
@Override
public String describeUndo() {
return String.format("Undoing \"Removing BCA Duster recipe\": Adding BCA Duster recipe for %s (%s)", input, recipes);
}
@Override
public Object getOverrideKey() {
return null;
}
}
}