diff --git a/README.md b/README.md index e75ceb8..f56e7e3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -ModTweaker +ModTweaker2 ========== ModTweaker is an addon for MineTweaker 3. Minetweaker lets you adjust recipes, remove them entirely, or add new recipes. While it has decent mod support, there are many mods that use custom crafting handlers that are not supported natively. ModTweaker plans to provide additional support for as many of these mods over time as possible. @@ -6,3 +6,25 @@ ModTweaker is an addon for MineTweaker 3. Minetweaker lets you adjust recipes, r Curse ========== http://minecraft.curseforge.com/mc-mods/220954-modtweaker + + +Supported Mods +========== +- Applied Energistics 2 +- Auracascade +- Botania +- Chisel +- ExNihilo +- ExtendedWorkbench +- Factorization (0.8.95+) +- Forestry +- Flaxbeard's Steam Power +- Mariculture +- Mekanism 8 +- Metallurgy +- PneumaticCraft +- Railcraft +- Tinkers Construct +- Terrafirmacraft +- Thaumcraft +- Thermal Expansion diff --git a/libs/Botania r1.3-154 custom build-deobf.jar b/libs/Botania r1.3-154 custom build-deobf.jar deleted file mode 100644 index 7f8a04a..0000000 Binary files a/libs/Botania r1.3-154 custom build-deobf.jar and /dev/null differ diff --git a/libs/Botania r1.7-201-deobf.jar b/libs/Botania r1.7-201-deobf.jar new file mode 100644 index 0000000..7a69f86 Binary files /dev/null and b/libs/Botania r1.7-201-deobf.jar differ diff --git a/src/main/java/modtweaker2/helpers/LogHelper.java b/src/main/java/modtweaker2/helpers/LogHelper.java index d87b5b4..63fc336 100644 --- a/src/main/java/modtweaker2/helpers/LogHelper.java +++ b/src/main/java/modtweaker2/helpers/LogHelper.java @@ -9,6 +9,7 @@ import minetweaker.MineTweakerImplementationAPI; import minetweaker.api.player.IPlayer; import minetweaker.mc1710.data.NBTConverter; import modtweaker2.utils.TweakerPlugin; +import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; @@ -61,6 +62,8 @@ public class LogHelper { return getStackDescription((ItemStack)object); } else if (object instanceof FluidStack) { return getStackDescription((FluidStack)object); + } else if (object instanceof Block) { + return getStackDescription(new ItemStack((Block)object, 1, 0)); } else if (TweakerPlugin.isLoaded("Mekanism") && object instanceof GasStack) { return getStackDescription((GasStack)object); } else if (object instanceof String) { diff --git a/src/main/java/modtweaker2/helpers/StringHelper.java b/src/main/java/modtweaker2/helpers/StringHelper.java index 9953281..945689e 100644 --- a/src/main/java/modtweaker2/helpers/StringHelper.java +++ b/src/main/java/modtweaker2/helpers/StringHelper.java @@ -31,4 +31,44 @@ public class StringHelper { return sb.toString(); } + + public static String wildcardToRegex(String expression) { + if(expression == null) return null; + + StringBuilder sb = new StringBuilder(); + sb.append('^'); + + for(int i = 0; i < expression.length(); i ++) { + char c = expression.charAt(i); + + switch(c) { + case '*': + sb.append(".*"); + break; + case '?': + sb.append('.'); + break; + + case '(': + case ')': + case '[': + case ']': + case '$': + case '^': + case '.': + case '{': + case '}': + case '|': + case '\\': + sb.append('\\').append(c); + break; + default: + sb.append(c); + break; + } + } + + sb.append('$'); + return sb.toString(); + } } diff --git a/src/main/java/modtweaker2/mods/botania/Botania.java b/src/main/java/modtweaker2/mods/botania/Botania.java index 83eea65..0797b23 100644 --- a/src/main/java/modtweaker2/mods/botania/Botania.java +++ b/src/main/java/modtweaker2/mods/botania/Botania.java @@ -2,10 +2,12 @@ package modtweaker2.mods.botania; import minetweaker.MineTweakerAPI; import modtweaker2.mods.botania.handlers.Apothecary; +import modtweaker2.mods.botania.handlers.Brew; import modtweaker2.mods.botania.handlers.ElvenTrade; import modtweaker2.mods.botania.handlers.Lexicon; import modtweaker2.mods.botania.handlers.ManaInfusion; import modtweaker2.mods.botania.handlers.Orechid; +import modtweaker2.mods.botania.handlers.PureDaisy; import modtweaker2.mods.botania.handlers.RuneAltar; import net.minecraft.item.ItemStack; import vazkii.botania.common.item.block.ItemBlockSpecialFlower; @@ -13,9 +15,11 @@ import vazkii.botania.common.item.block.ItemBlockSpecialFlower; public class Botania { public Botania() { MineTweakerAPI.registerClass(Apothecary.class); + MineTweakerAPI.registerClass(Brew.class); MineTweakerAPI.registerClass(ElvenTrade.class); MineTweakerAPI.registerClass(ManaInfusion.class); MineTweakerAPI.registerClass(Orechid.class); + MineTweakerAPI.registerClass(PureDaisy.class); MineTweakerAPI.registerClass(RuneAltar.class); MineTweakerAPI.registerClass(Lexicon.class); } diff --git a/src/main/java/modtweaker2/mods/botania/commands/BotaniaLogger.java b/src/main/java/modtweaker2/mods/botania/commands/BotaniaLogger.java index 95e2d9c..a1a6636 100644 --- a/src/main/java/modtweaker2/mods/botania/commands/BotaniaLogger.java +++ b/src/main/java/modtweaker2/mods/botania/commands/BotaniaLogger.java @@ -10,10 +10,13 @@ import minetweaker.api.player.IPlayer; import minetweaker.api.server.ICommandFunction; import modtweaker2.helpers.LogHelper; import modtweaker2.helpers.StringHelper; +import net.minecraft.item.ItemStack; import vazkii.botania.api.BotaniaAPI; +import vazkii.botania.api.recipe.RecipeBrew; import vazkii.botania.api.recipe.RecipeElvenTrade; import vazkii.botania.api.recipe.RecipeManaInfusion; import vazkii.botania.api.recipe.RecipePetals; +import vazkii.botania.api.recipe.RecipePureDaisy; import vazkii.botania.api.recipe.RecipeRuneAltar; public class BotaniaLogger implements ICommandFunction { @@ -22,8 +25,10 @@ public class BotaniaLogger implements ICommandFunction { static { validArguments.add("apothecary"); + validArguments.add("brew"); validArguments.add("elventrade"); validArguments.add("manainfusion"); + validArguments.add("puredaisy"); validArguments.add("runealtar"); } @@ -45,6 +50,14 @@ public class BotaniaLogger implements ICommandFunction { } } + if(args.isEmpty() || args.contains("brew")) { + for(RecipeBrew recipe : BotaniaAPI.brewRecipes) { + MineTweakerAPI.logCommand(String.format("mods.botania.Brew.addRecipe(%s, \"%s\");", + LogHelper.getListDescription(recipe.getInputs()), + recipe.getBrew().getKey())); + } + } + if(args.isEmpty() || args.contains("elventrade")) { for(RecipeElvenTrade recipe : BotaniaAPI.elvenTradeRecipes) { MineTweakerAPI.logCommand(String.format("mods.botania.ElvenTrade.addRecipe(%s, %s);", @@ -65,6 +78,14 @@ public class BotaniaLogger implements ICommandFunction { } } + if(args.isEmpty() || args.contains("puredaisy")) { + for(RecipePureDaisy recipe : BotaniaAPI.pureDaisyRecipes) { + MineTweakerAPI.logCommand(String.format("mods.botania.PureDaisy.addRecipe(%s, %s);", + LogHelper.getStackDescription(recipe.getInput()), + LogHelper.getStackDescription(new ItemStack(recipe.getOutput(), 1, recipe.getOutputMeta())))); + } + } + if(args.isEmpty() || args.contains("runealtar")) { for(RecipeRuneAltar recipe : BotaniaAPI.runeAltarRecipes) { MineTweakerAPI.logCommand(String.format("mods.botania.RuneAltar.addRecipe(%s, %s, %d);", diff --git a/src/main/java/modtweaker2/mods/botania/handlers/Brew.java b/src/main/java/modtweaker2/mods/botania/handlers/Brew.java new file mode 100644 index 0000000..e325dda --- /dev/null +++ b/src/main/java/modtweaker2/mods/botania/handlers/Brew.java @@ -0,0 +1,88 @@ +package modtweaker2.mods.botania.handlers; + +import java.util.LinkedList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import minetweaker.MineTweakerAPI; +import minetweaker.api.item.IIngredient; +import modtweaker2.helpers.InputHelper; +import modtweaker2.helpers.LogHelper; +import modtweaker2.helpers.StringHelper; +import modtweaker2.utils.BaseListAddition; +import modtweaker2.utils.BaseListRemoval; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenMethod; +import vazkii.botania.api.BotaniaAPI; +import vazkii.botania.api.recipe.RecipeBrew; + +@ZenClass("mods.botania.Brew") +public class Brew { + + public static final String name = "Botania Brew"; + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + @ZenMethod + public static void addRecipe(IIngredient[] inputItems, String brewName) { + if(inputItems == null || inputItems.length == 0 || brewName == null || brewName.length() == 0) { + LogHelper.logError(String.format("Required parameters missing for %s Recipe.", name)); + return; + } + + if(!BotaniaAPI.brewMap.containsKey(brewName)) { + LogHelper.logError(String.format("Unknown brew name \"%s\" for %s recipe.", brewName, name)); + } + + RecipeBrew recipe = new RecipeBrew(BotaniaAPI.brewMap.get(brewName), InputHelper.toObjects(inputItems)); + + MineTweakerAPI.apply(new Add(recipe)); + } + + private static class Add extends BaseListAddition { + + protected Add(RecipeBrew recipe) { + super(Brew.name, BotaniaAPI.brewRecipes); + recipes.add(recipe); + } + + @Override + protected String getRecipeInfo(RecipeBrew recipe) { + return recipe.getBrew().getKey(); + } + } + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + @ZenMethod + public static void removeRecipe(String brewName) { + List recipes = new LinkedList(); + Matcher matcher = Pattern.compile(StringHelper.wildcardToRegex(brewName)).matcher(""); + + for(RecipeBrew recipe : BotaniaAPI.brewRecipes) { + matcher.reset(recipe.getBrew().getKey()); + if(matcher.matches()) { + recipes.add(recipe); + } + } + + if(!recipes.isEmpty()) { + MineTweakerAPI.apply(new Remove(recipes)); + } else { + LogHelper.logWarning(String.format("No %s recipe found for %s. Command ignored!", name, brewName)); + } + } + + public static class Remove extends BaseListRemoval { + + protected Remove(List recipes) { + super(Brew.name, BotaniaAPI.brewRecipes, recipes); + } + + @Override + protected String getRecipeInfo(RecipeBrew recipe) { + return recipe.getBrew().getKey(); + } + } +} diff --git a/src/main/java/modtweaker2/mods/botania/handlers/PureDaisy.java b/src/main/java/modtweaker2/mods/botania/handlers/PureDaisy.java new file mode 100644 index 0000000..2c4fdd6 --- /dev/null +++ b/src/main/java/modtweaker2/mods/botania/handlers/PureDaisy.java @@ -0,0 +1,93 @@ +package modtweaker2.mods.botania.handlers; + +import java.util.LinkedList; +import java.util.List; + +import minetweaker.MineTweakerAPI; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import modtweaker2.helpers.InputHelper; +import modtweaker2.helpers.LogHelper; +import modtweaker2.helpers.StackHelper; +import modtweaker2.utils.BaseListAddition; +import modtweaker2.utils.BaseListRemoval; +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenMethod; +import vazkii.botania.api.BotaniaAPI; +import vazkii.botania.api.recipe.RecipePureDaisy; + +@ZenClass("mods.botania.PureDaisy") +public class PureDaisy { + + public static final String name = "Botania PureDaisy"; + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + @ZenMethod + public static void addRecipe(IIngredient blockInput, IItemStack blockOutput) { + if(blockInput == null || blockOutput == null) { + LogHelper.logError(String.format("Required parameters missing for %s Recipe.", name)); + return; + } + + Object input = InputHelper.toObject(blockInput); + + if(input == null || (input instanceof ItemStack && !InputHelper.isABlock((ItemStack)input))) { + LogHelper.logError(String.format("Input must be a block or an oredict entry.")); + return; + } + + if(input instanceof ItemStack) input = Block.getBlockFromItem(((ItemStack)input).getItem()); + ItemStack output = InputHelper.toStack(blockOutput); + + RecipePureDaisy recipe = new RecipePureDaisy(input, Block.getBlockFromItem(output.getItem()), output.getItemDamage()); + + MineTweakerAPI.apply(new Add(recipe)); + } + + private static class Add extends BaseListAddition { + public Add(RecipePureDaisy recipe) { + super(PureDaisy.name, BotaniaAPI.pureDaisyRecipes); + recipes.add(recipe); + } + + @Override + protected String getRecipeInfo(RecipePureDaisy recipe) { + return LogHelper.getStackDescription(new ItemStack(recipe.getOutput(), 1, recipe.getOutputMeta())); + } + } + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + @ZenMethod + public static void removeRecipe(IIngredient output) { + List recipes = new LinkedList(); + + for(RecipePureDaisy recipe : BotaniaAPI.pureDaisyRecipes) { + IItemStack out = InputHelper.toIItemStack(new ItemStack(recipe.getOutput(), 1, recipe.getOutputMeta())); + + if(StackHelper.matches(output, out)) { + recipes.add(recipe); + } + } + + if(!recipes.isEmpty()) { + MineTweakerAPI.apply(new Remove(recipes)); + } else { + + } + } + + private static class Remove extends BaseListRemoval { + public Remove(List recipes) { + super(PureDaisy.name, BotaniaAPI.pureDaisyRecipes, recipes); + } + + @Override + protected String getRecipeInfo(RecipePureDaisy recipe) { + return LogHelper.getStackDescription(new ItemStack(recipe.getOutput(), 1, recipe.getOutputMeta())); + } + } +}