diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1ed8294 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.gradle/ +.idea/ +build/ +gradle/ +logs/ +eclipse/ +run/ +out/ +gradlew +gradlew.bat \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..0eaf21d --- /dev/null +++ b/build.gradle @@ -0,0 +1,71 @@ +buildscript { + repositories { + mavenCentral() + maven { + name = 'forge' + url = 'http://files.minecraftforge.net/maven' + } + maven { + name = 'sonatype' + url = 'https://oss.sonatype.org/content/repositories/snapshots/' + } + } + dependencies { + classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT' + } +} + +apply plugin: 'java' +apply plugin: 'forge' + +sourceCompatibility = '1.8' +targetCompatibility = '1.8' + +version = '1.0.0' +group = 'recipenator' + +configurations { + includeJar +} + +minecraft { + version = '1.7.10-10.13.4.1614-1.7.10' +} + +repositories { + maven { + name = "chickenbones" + url = "http://chickenbones.net/maven/" + } +} + +dependencies { + compile group: 'org.luaj', name: 'luaj-jse', version: '3.0.1' + compile 'codechicken:NotEnoughItems:1.7.10-1.0.5.120:dev' + + includeJar group: 'org.luaj', name: 'luaj-jse', version: '3.0.1' + + testCompile group: 'junit', name: 'junit', version: '4.11' +} + +jar { + from { + configurations.includeJar.collect { it.isDirectory() ? it : zipTree(it) } + } +} + +processResources { + // this will ensure that this task is redone when the versions change. + inputs.property "version", project.version + inputs.property "mcversion", project.minecraft.version + // replace stuff in mcmod.info, nothing else + from(sourceSets.main.resources.srcDirs) { + include 'mcmod.info' + // replace version and mcversion + expand 'version': project.version, 'mcversion': project.minecraft.version + } + // copy everything else, thats not the mcmod.info + from(sourceSets.main.resources.srcDirs) { + exclude 'mcmod.info' + } +} \ No newline at end of file diff --git a/src/main/java/recipenator/DefaultLuaLibGetter.java b/src/main/java/recipenator/DefaultLuaLibGetter.java new file mode 100644 index 0000000..ae5747b --- /dev/null +++ b/src/main/java/recipenator/DefaultLuaLibGetter.java @@ -0,0 +1,25 @@ +package recipenator; + +import net.minecraft.item.Item; +import recipenator.api.ILuaLibGetter; +import recipenator.lualib.BaseLuaLib; +import recipenator.lualib.item.ItemLib; +import recipenator.lualib.oredict.OreDictLib; +import recipenator.lualib.recipe.RecipeLib; +import recipenator.utils.NamesTree; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +public class DefaultLuaLibGetter implements ILuaLibGetter { + @Override + public Set getLibs() { + Set libs = new HashSet<>(); + Collection names = Item.itemRegistry.getKeys(); + libs.add(new ItemLib(NamesTree.getTreeRoot(names))); + libs.add(new OreDictLib()); + libs.add(new RecipeLib()); + return libs; + } +} diff --git a/src/main/java/recipenator/RecipenatorMod.java b/src/main/java/recipenator/RecipenatorMod.java new file mode 100644 index 0000000..19513dd --- /dev/null +++ b/src/main/java/recipenator/RecipenatorMod.java @@ -0,0 +1,95 @@ +package recipenator; + +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.event.FMLServerAboutToStartEvent; +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandHandler; +import net.minecraft.command.ICommand; +import net.minecraft.command.ICommandSender; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.management.ServerConfigurationManager; +import net.minecraft.util.ChatComponentText; +import recipenator.api.ILuaLibGetter; +import recipenator.lualib.recipe.RecipeManager; +import recipenator.utils.lua.LuaExecutor; + +import java.io.File; +import java.lang.reflect.Array; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +@Mod(modid = "", useMetadata = true) +public class RecipenatorMod { + public static final String SCRIPT_FOLDER_NAME = "recipes"; + public static final ILuaLibGetter LUA_ENVIRONMENT = new DefaultLuaLibGetter(); + + public RecipenatorMod() { } + + @EventHandler + public void beforeServerStart(FMLServerAboutToStartEvent event) { + ((CommandHandler) event.getServer().getCommandManager()).registerCommand(new ICommand() { + @Override + public int compareTo(Object o) { + return 0; + } + + @Override + public String getCommandName() { + return "recipenator"; + } + + @Override + public String getCommandUsage(ICommandSender commandSender) { + return ""; + } + + @Override + public List getCommandAliases() { + return Collections.singletonList("rn"); + } + + @Override + public void processCommand(ICommandSender commandSender, String[] arguments) { + if (arguments.length == 0) return; + + if (arguments[0].equals("reload")) { + RecipeManager.removeAll(); + ExecuteScripts(); + } + } + + @Override + public boolean canCommandSenderUseCommand(ICommandSender commandSender) { + return true; + } + + @Override + public List addTabCompletionOptions(ICommandSender commandSender, String[] arguments) { + return null; + } + + @Override + public boolean isUsernameIndex(String[] p_82358_1_, int p_82358_2_) { + return false; + } + }); + ExecuteScripts(); + } + + public static void ExecuteScripts() { + new LuaExecutor(new File(SCRIPT_FOLDER_NAME), LUA_ENVIRONMENT).execute(); + } + + public static void logChat(String msg) { + MinecraftServer server = MinecraftServer.getServer(); + assert server != null; + + ServerConfigurationManager cm = server.getConfigurationManager(); + assert cm != null; + + ChatComponentText text = new ChatComponentText(msg); + cm.sendChatMsg(text); + } +} diff --git a/src/main/java/recipenator/api/ILuaLibGetter.java b/src/main/java/recipenator/api/ILuaLibGetter.java new file mode 100644 index 0000000..e004518 --- /dev/null +++ b/src/main/java/recipenator/api/ILuaLibGetter.java @@ -0,0 +1,9 @@ +package recipenator.api; + +import recipenator.lualib.BaseLuaLib; + +import java.util.Set; + +public interface ILuaLibGetter { + Set getLibs(); +} diff --git a/src/main/java/recipenator/api/IRecipeComponent.java b/src/main/java/recipenator/api/IRecipeComponent.java new file mode 100644 index 0000000..a6ef209 --- /dev/null +++ b/src/main/java/recipenator/api/IRecipeComponent.java @@ -0,0 +1,13 @@ +package recipenator.api; + +import net.minecraft.item.ItemStack; + +public interface IRecipeComponent { + Object mulCount(int multiplier); + + Object withMeta(int meta); + + boolean equals(ItemStack component); + + T getRecipeItem(); +} diff --git a/src/main/java/recipenator/api/annotation/Metamethod.java b/src/main/java/recipenator/api/annotation/Metamethod.java new file mode 100644 index 0000000..9a7a7ec --- /dev/null +++ b/src/main/java/recipenator/api/annotation/Metamethod.java @@ -0,0 +1,12 @@ +package recipenator.api.annotation; + +import recipenator.utils.lua.MetamethodType; + +import java.lang.annotation.*; + +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface Metamethod { + MetamethodType value(); +} diff --git a/src/main/java/recipenator/compatibility/nei/NEI_RNator_Config.java b/src/main/java/recipenator/compatibility/nei/NEI_RNator_Config.java new file mode 100644 index 0000000..06133d9 --- /dev/null +++ b/src/main/java/recipenator/compatibility/nei/NEI_RNator_Config.java @@ -0,0 +1,20 @@ +package recipenator.compatibility.nei; + +import codechicken.nei.api.IConfigureNEI; + +public class NEI_RNator_Config implements IConfigureNEI { + @Override + public void loadConfig() { + RecipeHandlers.registerRecipe(); + } + + @Override + public String getName() { + return "NEI Recipenator"; + } + + @Override + public String getVersion() { + return "1.0.0"; + } +} diff --git a/src/main/java/recipenator/compatibility/nei/RecipeHandlers.java b/src/main/java/recipenator/compatibility/nei/RecipeHandlers.java new file mode 100644 index 0000000..f3a69d6 --- /dev/null +++ b/src/main/java/recipenator/compatibility/nei/RecipeHandlers.java @@ -0,0 +1,124 @@ +package recipenator.compatibility.nei; + +import codechicken.nei.NEIServerUtils; +import codechicken.nei.api.API; +import codechicken.nei.recipe.ShapedRecipeHandler; +import codechicken.nei.recipe.ShapelessRecipeHandler; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import recipenator.lualib.recipe.RecipeShaped; +import recipenator.lualib.recipe.RecipeShapeless; +import recipenator.utils.RecipeHelper; + +import java.util.List; + +public class RecipeHandlers { + public static void registerRecipe() { + API.registerRecipeHandler(new ShapedHandler()); + API.registerUsageHandler(new ShapedHandler()); + API.registerRecipeHandler(new ShapelessHandler()); + API.registerUsageHandler(new ShapelessHandler()); + } + + public static class ShapelessHandler extends ShapelessRecipeHandler { + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + if (outputId.equals("crafting") && getClass() == ShapelessHandler.class) { + List recipeList = CraftingManager.getInstance().getRecipeList(); + for (Object recipe : recipeList) { + if (!(recipe instanceof RecipeShapeless)) continue; + CachedShapelessRecipe cache = toCachedRecipe((RecipeShapeless) recipe); + arecipes.add(cache); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + List recipeList = CraftingManager.getInstance().getRecipeList(); + for (Object recipe : recipeList) { + if (!(recipe instanceof RecipeShapeless)) continue; + + RecipeShapeless recipeShapeless = (RecipeShapeless) recipe; + if (!NEIServerUtils.areStacksSameTypeCrafting(recipeShapeless.getRecipeOutput(), result)) continue; + + CachedShapelessRecipe cache = toCachedRecipe(recipeShapeless); + arecipes.add(cache); + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + List recipeList = CraftingManager.getInstance().getRecipeList(); + for (Object recipe : recipeList) { + if (!(recipe instanceof RecipeShapeless)) continue; + + CachedShapelessRecipe cache = toCachedRecipe((RecipeShapeless) recipe); + if (cache.contains(cache.ingredients, ingredient)) { + cache.setIngredientPermutation(cache.ingredients, ingredient); + this.arecipes.add(cache); + } + } + } + + private CachedShapelessRecipe toCachedRecipe(RecipeShapeless recipe) { + return new CachedShapelessRecipe(recipe.getRecipeInputs(), recipe.getRecipeOutput()); + } + } + + public static class ShapedHandler extends ShapedRecipeHandler { + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + if (outputId.equals("crafting") && getClass() == ShapedHandler.class) { + List recipeList = CraftingManager.getInstance().getRecipeList(); + for (Object irecipe : recipeList) { + if (!(irecipe instanceof RecipeShaped)) continue; + CachedShapedRecipe recipe = toCachedRecipe((RecipeShaped) irecipe); + recipe.computeVisuals(); + arecipes.add(recipe); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + List recipeList = CraftingManager.getInstance().getRecipeList(); + for (Object recipe : recipeList) { + if (!(recipe instanceof RecipeShaped)) continue; + + RecipeShaped recipeShaped = (RecipeShaped) recipe; + if (!NEIServerUtils.areStacksSameTypeCrafting(recipeShaped.getRecipeOutput(), result)) continue; + + CachedShapedRecipe cache = toCachedRecipe(recipeShaped); + cache.computeVisuals(); + arecipes.add(cache); + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + List recipeList = CraftingManager.getInstance().getRecipeList(); + for (Object recipe : recipeList) { + if (!(recipe instanceof RecipeShaped)) continue; + + CachedShapedRecipe cache = toCachedRecipe((RecipeShaped) recipe); + if (!cache.contains(cache.ingredients, ingredient.getItem())) continue; + + cache.computeVisuals(); + if (cache.contains(cache.ingredients, ingredient)) { + cache.setIngredientPermutation(cache.ingredients, ingredient); + this.arecipes.add(cache); + } + } + } + + private CachedShapedRecipe toCachedRecipe(RecipeShaped recipe) { + RecipeHelper.Size size = recipe.getSize(); + return new CachedShapedRecipe(size.width, size.height, recipe.getRecipeInputs(), recipe.getRecipeOutput()); + } + } +} diff --git a/src/main/java/recipenator/lualib/BaseLuaLib.java b/src/main/java/recipenator/lualib/BaseLuaLib.java new file mode 100644 index 0000000..8dc2db7 --- /dev/null +++ b/src/main/java/recipenator/lualib/BaseLuaLib.java @@ -0,0 +1,19 @@ +package recipenator.lualib; + +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.lib.TwoArgFunction; +import recipenator.utils.lua.MetamethodWrapper; + +public abstract class BaseLuaLib extends TwoArgFunction { + @Override + public LuaValue call(LuaValue modname, LuaValue env) { + String libName = getLibName(); + env.set(libName, MetamethodWrapper.wrap(getLib())); + env.get("package").get("loaded").set(libName, env.get(libName)); + return NIL; + } + + protected abstract String getLibName(); + + protected abstract Object getLib(); +} diff --git a/src/main/java/recipenator/lualib/item/ItemComponent.java b/src/main/java/recipenator/lualib/item/ItemComponent.java new file mode 100644 index 0000000..97d943c --- /dev/null +++ b/src/main/java/recipenator/lualib/item/ItemComponent.java @@ -0,0 +1,109 @@ +package recipenator.lualib.item; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.oredict.OreDictionary; +import recipenator.api.IRecipeComponent; +import recipenator.api.annotation.Metamethod; +import recipenator.utils.NamesTree; +import recipenator.utils.RecipeHelper; +import recipenator.utils.lua.MetamethodType; + +public class ItemComponent implements IRecipeComponent { + static int anyMeta = OreDictionary.WILDCARD_VALUE; + + private final NamesTree.NameNode node; + private final int count; + private final int meta; + private final NBTTagCompound tag; + + public ItemComponent(NamesTree.NameNode node) { + this(node, 1, 0, null); + } + + public ItemComponent(NamesTree.NameNode node, int count, int meta, NBTTagCompound tag) { + this.node = node; + this.count = count; + this.meta = meta; + this.tag = tag == null ? null : (NBTTagCompound) tag.copy(); + } + + @Override + public ItemStack getRecipeItem() { + String name = node.getName(); + if (name == null) return null; + + Item item = (Item) Item.itemRegistry.getObject(name); + if (item == null) throw new NullPointerException(name); + + ItemStack itemStack = new ItemStack(item, count, meta); + itemStack.setTagCompound(tag); + return itemStack; + } + + @Override + @Metamethod(MetamethodType.MUL) + public Object mulCount(int multiplier) { + return changeCount(this.count * multiplier); + } + + @Metamethod(MetamethodType.INDEX) + public Object index(Object id) { + if (id instanceof Integer) + return withMeta((int) id); + return index(String.valueOf(id)); + } + + public Object index(String id) { + if (id.equals("tag")) + return tag; + if (id.equals("any")) + return changeMeta(anyMeta); + if (id.charAt(0) == '_') //mymod.item.100 -> mymod.item._100 + id = id.substring(1); + return changeNode(node.index(id)); + } + + @Override + public Object withMeta(int meta) { + return changeMeta(meta < anyMeta ? meta : anyMeta); + } + + @Override + public boolean equals(ItemStack inputItem) { + return RecipeHelper.isEquals(this.getRecipeItem(), inputItem); + } + + private ItemComponent changeNode(NamesTree.NameNode node) { + if (node == null) return null; + if (this.node.equals(node)) return this; + return new ItemComponent(node, count, meta, tag); + } + + private ItemComponent changeCount(int count) { + if (this.count == count) return this; + return new ItemComponent(node, count, meta, tag); + } + + private ItemComponent changeMeta(int meta) { + if (this.meta == meta) return this; + return new ItemComponent(node, count, meta, tag); + } + + private ItemComponent changeTag(NBTTagCompound tag) { + if (this.tag.equals(tag)) return this; + return new ItemComponent(node, count, meta, tag); + } + + @Override + public String toString() { + String nl = System.lineSeparator(); + StringBuilder sb = new StringBuilder(67); + sb.append(node.toString()).append(nl) + .append("Count: ").append(count).append(nl) + .append("Metadata: ").append(meta == anyMeta ? "any" : meta).append(nl) + .append("Tag: ").append(tag); + return sb.toString(); + } +} diff --git a/src/main/java/recipenator/lualib/item/ItemLib.java b/src/main/java/recipenator/lualib/item/ItemLib.java new file mode 100644 index 0000000..ebbdab9 --- /dev/null +++ b/src/main/java/recipenator/lualib/item/ItemLib.java @@ -0,0 +1,30 @@ +package recipenator.lualib.item; + +import org.luaj.vm2.LuaValue; +import recipenator.lualib.BaseLuaLib; +import recipenator.utils.NamesTree; +import recipenator.utils.lua.MetamethodWrapper; + +public class ItemLib extends BaseLuaLib { + private final NamesTree.NameNode root; + + public ItemLib(NamesTree.NameNode root) { + this.root = root; + } + + @Override + public LuaValue call(LuaValue modname, LuaValue env) { + env.set("null", MetamethodWrapper.wrap(NullComponent.NULL)); + return super.call(modname, env); + } + + @Override + protected String getLibName() { + return "item"; + } + + @Override + protected Object getLib() { + return new ItemComponent(root); + } +} diff --git a/src/main/java/recipenator/lualib/item/NullComponent.java b/src/main/java/recipenator/lualib/item/NullComponent.java new file mode 100644 index 0000000..2db5a51 --- /dev/null +++ b/src/main/java/recipenator/lualib/item/NullComponent.java @@ -0,0 +1,37 @@ +package recipenator.lualib.item; + +import net.minecraft.item.ItemStack; +import recipenator.api.IRecipeComponent; + +public class NullComponent implements IRecipeComponent { + public static final IRecipeComponent NULL = new NullComponent(); + + @Override + public Object mulCount(int multiplier) { + return this; + } + + @Override + public Object withMeta(int meta) { + return this; + } + + @Override + public boolean equals(ItemStack component) { + return component == null; + } + + @Override + public Object getRecipeItem() { + return null; + } + + @Override + public String toString() { + return "null"; + } + + public static boolean isNull(IRecipeComponent component) { + return component == NULL; + } +} diff --git a/src/main/java/recipenator/lualib/oredict/OreComponent.java b/src/main/java/recipenator/lualib/oredict/OreComponent.java new file mode 100644 index 0000000..2c5104d --- /dev/null +++ b/src/main/java/recipenator/lualib/oredict/OreComponent.java @@ -0,0 +1,80 @@ +package recipenator.lualib.oredict; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.oredict.OreDictionary; +import recipenator.api.IRecipeComponent; +import recipenator.api.annotation.Metamethod; +import recipenator.utils.RecipeHelper; +import recipenator.utils.lua.MetamethodType; + +import java.util.List; + +public class OreComponent implements IRecipeComponent> { + static int anyMeta = OreDictionary.WILDCARD_VALUE; + + private final String id; + private final int count; + private final int meta; + private final NBTTagCompound tag; + + public OreComponent(String id) { + this(id, 1, 0, null); + } + + public OreComponent(String id, int count, int meta, NBTTagCompound tag) { + this.id = id; + this.count = count; + this.meta = meta; + this.tag = tag == null ? null : (NBTTagCompound) tag.copy(); + } + + @Override + public List getRecipeItem() { + return OreDictionary.getOres(id); + } + + @Override + @Metamethod(MetamethodType.MUL) + public Object mulCount(int multiplier) { + return changeCount(this.count * multiplier); + } + + @Metamethod(MetamethodType.INDEX) + public Object index(Object id) { + if (id instanceof Integer) + return withMeta((int) id); + return index(String.valueOf(id)); + } + + public Object index(String id) { + if (id.equals("tag")) + return tag; + if (id.equals("any")) + return changeMeta(anyMeta); + return null; + } + + @Override + public Object withMeta(int meta) { + return changeMeta(meta); + } + + @Override + public boolean equals(ItemStack inputItem) { + for (ItemStack recipeItem : this.getRecipeItem()) + if (RecipeHelper.isEquals(recipeItem, inputItem)) + return true; + return false; + } + + private OreComponent changeCount(int count) { + if (this.count == count) return this; + return new OreComponent(id, count, meta, tag); + } + + private OreComponent changeMeta(int meta) { + if (this.meta == meta) return this; + return new OreComponent(id, count, meta, tag); + } +} diff --git a/src/main/java/recipenator/lualib/oredict/OreDictIndexator.java b/src/main/java/recipenator/lualib/oredict/OreDictIndexator.java new file mode 100644 index 0000000..d9b80d5 --- /dev/null +++ b/src/main/java/recipenator/lualib/oredict/OreDictIndexator.java @@ -0,0 +1,14 @@ +package recipenator.lualib.oredict; + +import net.minecraftforge.oredict.OreDictionary; +import recipenator.api.annotation.Metamethod; +import recipenator.utils.lua.MetamethodType; + +public class OreDictIndexator { + @Metamethod(MetamethodType.INDEX) + public Object index(String id) { + if (OreDictionary.doesOreNameExist(id)) + return new OreComponent(id); + return null; + } +} diff --git a/src/main/java/recipenator/lualib/oredict/OreDictLib.java b/src/main/java/recipenator/lualib/oredict/OreDictLib.java new file mode 100644 index 0000000..47703a5 --- /dev/null +++ b/src/main/java/recipenator/lualib/oredict/OreDictLib.java @@ -0,0 +1,16 @@ +package recipenator.lualib.oredict; + +import recipenator.lualib.BaseLuaLib; + +public class OreDictLib extends BaseLuaLib { + @Override + protected String getLibName() { + return "ore"; + } + + @Override + protected Object getLib() { + return new OreDictIndexator(); + } + +} diff --git a/src/main/java/recipenator/lualib/recipe/RecipeLib.java b/src/main/java/recipenator/lualib/recipe/RecipeLib.java new file mode 100644 index 0000000..2213d75 --- /dev/null +++ b/src/main/java/recipenator/lualib/recipe/RecipeLib.java @@ -0,0 +1,15 @@ +package recipenator.lualib.recipe; + +import recipenator.lualib.BaseLuaLib; + +public class RecipeLib extends BaseLuaLib { + @Override + protected String getLibName() { + return "recipe"; + } + + @Override + protected Object getLib() { + return new RecipeManager(); + } +} diff --git a/src/main/java/recipenator/lualib/recipe/RecipeManager.java b/src/main/java/recipenator/lualib/recipe/RecipeManager.java new file mode 100644 index 0000000..1203ab5 --- /dev/null +++ b/src/main/java/recipenator/lualib/recipe/RecipeManager.java @@ -0,0 +1,65 @@ +package recipenator.lualib.recipe; + +import cpw.mods.fml.common.registry.GameRegistry; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; +import recipenator.api.IRecipeComponent; +import recipenator.api.annotation.Metamethod; +import recipenator.lualib.item.NullComponent; +import recipenator.utils.RecipeHelper; +import recipenator.utils.lua.MetamethodType; + +import java.util.ArrayList; +import java.util.List; + +public class RecipeManager { + public final static List AddedRecipes = new ArrayList<>(); + + public static void removeAll() { + List recipeList = CraftingManager.getInstance().getRecipeList(); + for (IRecipe recipe : AddedRecipes) + recipeList.remove(recipe); + AddedRecipes.clear(); + } + + public void addRecipe(IRecipe recipe) { + GameRegistry.addRecipe(recipe); + AddedRecipes.add(recipe); + } + + public void addShaped(IRecipeComponent result, IRecipeComponent[][] input) { + RecipeHelper.Size size = RecipeHelper.rectangulate(input); + IRecipeComponent[] items = new IRecipeComponent[size.width * size.height]; + int i = 0; + for (IRecipeComponent[] line : input) { + for (IRecipeComponent component : line) { + items[i++] = component == null ? NullComponent.NULL : component; + } + } + addRecipe(new RecipeShaped(size, items, result)); + } + + public void addShapeless(IRecipeComponent result, IRecipeComponent[] input) { + boolean hasNull = false; + int count = 0; + for (IRecipeComponent component : input) { + if (NullComponent.isNull(component)) hasNull = true; + else count++; + } + if (hasNull) { + IRecipeComponent[] data = new IRecipeComponent[count]; + for (IRecipeComponent component : input) { + if (NullComponent.isNull(component)) continue; + data[--count] = component; + } + input = data; + } + addRecipe(new RecipeShapeless(input, result)); + } + + @Metamethod(MetamethodType.INDEX) + public Object index(String id) { + return null; //TODO mod integration + } +} diff --git a/src/main/java/recipenator/lualib/recipe/RecipeShaped.java b/src/main/java/recipenator/lualib/recipe/RecipeShaped.java new file mode 100644 index 0000000..93cccf9 --- /dev/null +++ b/src/main/java/recipenator/lualib/recipe/RecipeShaped.java @@ -0,0 +1,72 @@ +package recipenator.lualib.recipe; + +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.world.World; +import recipenator.api.IRecipeComponent; +import recipenator.utils.RecipeHelper; + +public class RecipeShaped implements IRecipe { + private final static int MAX_WIDTH = 3; + private final static int MAX_HEIGHT = 3; + + private final RecipeHelper.Size size; + private final IRecipeComponent[] inputs; + private final IRecipeComponent result; + private final boolean mirrored; + + public RecipeShaped(RecipeHelper.Size size, IRecipeComponent[] inputs, IRecipeComponent result) { + this(size, inputs, result, false); + } + + public RecipeShaped(RecipeHelper.Size size, IRecipeComponent[] inputs, IRecipeComponent result, boolean mirrored) { + this.size = size; + this.inputs = inputs; + this.result = result; + this.mirrored = mirrored; + } + + @Override + public boolean matches(InventoryCrafting inventory, World world) { + return inventory.getSizeInventory() >= inputs.length && RecipeHelper.returnFirstTrueInDoubleCycle((x, y) -> checkMatch(inventory, x, y), MAX_WIDTH - size.width + 1, MAX_HEIGHT - size.height + 1); + } + + private boolean checkMatch(InventoryCrafting inventory, int xo, int yo) { + return RecipeHelper.returnFirstTrueInDoubleCycle((x, y) -> { + ItemStack item = inventory.getStackInRowAndColumn(x, y); + int xi = x - xo, yi = y - yo; + int i = yi * size.width + xi; + return RecipeHelper.isEquals(getComponent(i), item); + //|| mirrored && RecipeHelper.isEquals(getComponent(i + size.width - ((xi << 1) + 1)), item); + }, MAX_WIDTH, MAX_HEIGHT); + } + + private IRecipeComponent getComponent(int i) { + if (i < 0 || i >= inputs.length) return null; + return inputs[i]; + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inventory) { + return result.getRecipeItem(); + } + + @Override + public int getRecipeSize() { + return inputs.length; + } + + @Override + public ItemStack getRecipeOutput() { + return result.getRecipeItem(); + } + + public Object[] getRecipeInputs() { + return RecipeHelper.getRecipeInputs(inputs); + } + + public RecipeHelper.Size getSize() { + return size; + } +} diff --git a/src/main/java/recipenator/lualib/recipe/RecipeShapeless.java b/src/main/java/recipenator/lualib/recipe/RecipeShapeless.java new file mode 100644 index 0000000..cd77b1c --- /dev/null +++ b/src/main/java/recipenator/lualib/recipe/RecipeShapeless.java @@ -0,0 +1,60 @@ +package recipenator.lualib.recipe; + +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.world.World; +import recipenator.api.IRecipeComponent; +import recipenator.utils.RecipeHelper; + +import java.util.Set; + +public class RecipeShapeless implements IRecipe { + private final IRecipeComponent[] inputs; + private final IRecipeComponent result; + + public RecipeShapeless(IRecipeComponent[] inputs, IRecipeComponent result) { + this.inputs = inputs; + this.result = result; + } + + @Override + public boolean matches(InventoryCrafting inventory, World world) { + Set inputs = RecipeHelper.getInputSet(inventory); + +// for (ItemStack input : inputs) +// RecipenatorMod.logChat(String.format("Input: %s - %d - %d - %s", +// input.getDisplayName(), input.stackSize, input.getItemDamage(), String.valueOf(input.getTagCompound()))); + + if (inputs.size() != this.inputs.length) return false; + ItemStack itemStack; + for (IRecipeComponent component : this.inputs) { +// ItemStack comp = (ItemStack) component.getRecipeItem(); +// RecipenatorMod.logChat(String.format("Comp: %s - %d - %d - %s", +// comp.getDisplayName(), comp.stackSize, comp.getItemDamage(), String.valueOf(comp.getTagCompound()))); + + if ((itemStack = RecipeHelper.findEqualsItem(inputs, component)) == null) return false; + inputs.remove(itemStack); + } + return true; + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inventory) { + return result.getRecipeItem(); + } + + @Override + public int getRecipeSize() { + return inputs.length; + } + + @Override + public ItemStack getRecipeOutput() { + return result.getRecipeItem(); + } + + public Object[] getRecipeInputs() { + return RecipeHelper.getRecipeInputs(inputs); + } +} diff --git a/src/main/java/recipenator/utils/NamesTree.java b/src/main/java/recipenator/utils/NamesTree.java new file mode 100644 index 0000000..06c0507 --- /dev/null +++ b/src/main/java/recipenator/utils/NamesTree.java @@ -0,0 +1,85 @@ +package recipenator.utils; + +import java.util.*; +import java.util.stream.Collectors; + +public class NamesTree { + public static NameNode getTreeRoot(Collection names) { + NameNode nn = new NameNode(); + + Map> nameToNodes = names.stream() + .collect(Collectors.toMap(s -> s, NamesTree::getNameNodes)); + + for (String name : nameToNodes.keySet()) { + NameNode current = nn; + for (String id : nameToNodes.get(name)) + current = current.next(id); + current.name = name; + } + + return nn; + } + + public static List getNameNodes(String name) { + char[] data = name.toCharArray(); + int i = 0; + int l = data.length; + List result = new ArrayList<>(); + + do { + int j = i; + while (j < l && isInternalSymbol(data[j])) { //take id + data[j] = Character.toLowerCase(data[j]); + j++; + } + result.add(String.copyValueOf(data, i, j - i)); + i = j; + while (i < l && !Character.isLetterOrDigit(data[i])) i++; //skip bad chars + } while (i < l); + + return result; + } + + public static boolean isInternalSymbol(char ch) { + return Character.isLetterOrDigit(ch) || ch == '_'; + } + + public static class NameNode { + private final Map children = new HashMap<>(); + private String name = null; + + private NameNode next(String id) { + NameNode next = index(id); + if (next == null) { + children.put(id, next = new NameNode()); + } + return next; + } + + public NameNode index(String id) { + return children.get(id); + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return toStringBuilder("", "\t").toString(); + } + + private StringBuilder toStringBuilder(String inittab, String addtab) { + String nl = System.lineSeparator(); + StringBuilder sb = new StringBuilder(); + if (name != null) sb.append(inittab).append("Name: ").append(name); + if (children.isEmpty()) return sb; + if (name != null) sb.append(nl); + for (Map.Entry data : children.entrySet()) { + StringBuilder nsb = data.getValue().toStringBuilder(inittab + addtab, addtab); + sb.append(nl).append(inittab).append(data.getKey()).append(nl).append(nsb); + } + return sb; + } + } +} diff --git a/src/main/java/recipenator/utils/RecipeHelper.java b/src/main/java/recipenator/utils/RecipeHelper.java new file mode 100644 index 0000000..c672dc3 --- /dev/null +++ b/src/main/java/recipenator/utils/RecipeHelper.java @@ -0,0 +1,95 @@ +package recipenator.utils; + +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import recipenator.api.IRecipeComponent; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.function.BiFunction; + +public class RecipeHelper { + public static Set getInputSet(InventoryCrafting inventory) { + int l = inventory.getSizeInventory(); + Set input = new HashSet<>(l); + for (int i = 0; i < l; i++) { + ItemStack item = inventory.getStackInSlot(i); + if (item != null) input.add(item); + } + return input; + } + + public static ItemStack findEqualsItem(Set input, IRecipeComponent component) { + for (ItemStack item : input) + if (component.equals(item)) + return item; + return null; + } + + public static boolean isEquals(IRecipeComponent component, ItemStack item) { + if (component == null) return item == null; + return item != null && component.equals(item); + } + + public static boolean isEquals(ItemStack recipeItem, ItemStack inputItem) { + if (recipeItem == null) return inputItem == null; + return inputItem != null && recipeItem.isItemEqual(inputItem) && isEqualsTag(recipeItem, inputItem); + } + + public static boolean isEqualsTag(ItemStack recipeItem, ItemStack inputItem) { + NBTTagCompound recipeTag = recipeItem.getTagCompound(); + NBTTagCompound inputTag = inputItem.getTagCompound(); + if (recipeTag == null) return inputTag == null; + return inputTag != null && recipeTag.equals(inputTag); + } + + public static boolean returnFirstTrueInDoubleCycle(BiFunction func, int xm, int ym) { + for (int x = 0; x < xm; x++) + for (int y = 0; y < ym; y++) + if (func.apply(x, y)) return true; + return false; + } + + public static Object[] getRecipeInputs(IRecipeComponent[] source) { + Object[] result = new Object[source.length]; + for (int i = 0; i < source.length; i++) + result[i] = source[i].getRecipeItem(); + return result; + } + + public static Size rectangulate(T[][] matrix) { + if (matrix.length == 0) { + return Size.ZERO; + } else if (matrix.length == 1) { + return new Size(matrix[0].length, 1); + } + + int maxl = 0; + for (T[] line : matrix) + if (maxl < line.length) + maxl = line.length; + + for (int i = 0; i < matrix.length; i++) { + if (matrix[i].length == maxl) continue; + matrix[i] = Arrays.copyOf(matrix[i], maxl); + } + + return new Size(maxl, matrix.length); + } + + public static class Size { + public static Size ZERO = new Size(0, 0); + + public final int width; + public final int height; + + public Size(int width, int height) { + this.width = width; + this.height = height; + } + } +} diff --git a/src/main/java/recipenator/utils/lua/LuaExecutor.java b/src/main/java/recipenator/utils/lua/LuaExecutor.java new file mode 100644 index 0000000..33ccc30 --- /dev/null +++ b/src/main/java/recipenator/utils/lua/LuaExecutor.java @@ -0,0 +1,64 @@ +package recipenator.utils.lua; + +import org.luaj.vm2.Globals; +import org.luaj.vm2.lib.jse.JsePlatform; +import recipenator.api.ILuaLibGetter; + +import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; + +public class LuaExecutor { + public static final String SCRIPT_EXT = ".lua"; + + private final File directory; + private final Globals globals; + private final String relativePath; + private List names; + + public LuaExecutor(File directory, ILuaLibGetter environment) { + this(directory); + environment.getLibs().forEach(globals::load); + } + + public LuaExecutor(File directory) { + validateDirectory(directory); + this.directory = directory; + relativePath = getRelativePath(); + System.setProperty("luaj.package.path", String.format("%s?%s", relativePath, SCRIPT_EXT)); + loadScriptNames(); + globals = JsePlatform.standardGlobals(); + } + + private String getRelativePath() { + Path userDirPath = Paths.get(System.getProperty("user.dir")); + Path scriptDirPath = Paths.get(directory.getAbsolutePath()); + return userDirPath.relativize(scriptDirPath).toString() + File.separator; + } + + public void loadScriptNames() { + names = Arrays.asList(directory.list((d, n) -> n.endsWith(SCRIPT_EXT))); + } + + public void execute() { + names.forEach(this::execute); + } + + public void execute(String name) { + System.out.println("Execute: " + name); + globals.loadfile(relativePath + name).call(); + } + + public void executeFile(String name) { + execute(name + SCRIPT_EXT); + } + + private static void validateDirectory(File dir) { + if (dir == null) + throw new NullPointerException("dir"); + if (!dir.exists() && !dir.mkdirs()) + throw new AssertionError(String.format("Can't make dir '%s'", dir.getPath())); + } +} diff --git a/src/main/java/recipenator/utils/lua/MetamethodType.java b/src/main/java/recipenator/utils/lua/MetamethodType.java new file mode 100644 index 0000000..bd1fc9f --- /dev/null +++ b/src/main/java/recipenator/utils/lua/MetamethodType.java @@ -0,0 +1,13 @@ +package recipenator.utils.lua; + +import org.luaj.vm2.LuaValue; + +public enum MetamethodType { + INDEX(LuaValue.INDEX), + MUL(LuaValue.MUL); + + public final LuaValue name; + MetamethodType(LuaValue name) { + this.name = name; + } +} diff --git a/src/main/java/recipenator/utils/lua/MetamethodWrapper.java b/src/main/java/recipenator/utils/lua/MetamethodWrapper.java new file mode 100644 index 0000000..4b21480 --- /dev/null +++ b/src/main/java/recipenator/utils/lua/MetamethodWrapper.java @@ -0,0 +1,82 @@ +package recipenator.utils.lua; + +import org.luaj.vm2.LuaError; +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.Varargs; +import org.luaj.vm2.lib.VarArgFunction; +import org.luaj.vm2.lib.jse.CoerceJavaToLua; +import org.luaj.vm2.lib.jse.CoerceLuaToJava; +import recipenator.api.annotation.Metamethod; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +public class MetamethodWrapper { + private final static Map metatables = new HashMap<>(); + + private static LuaTable getMetatable(Object object) { + Class cls = object.getClass(); + LuaTable mt = metatables.get(cls); + if (mt == null) { + Metamethod mma; + mt = new LuaTable(); + for (Method method : cls.getMethods()) { + if ((mma = method.getAnnotation(Metamethod.class)) != null) { + mt.set(mma.value().name, JavaMethod.fromMethod(method)); + } + } + if (mt.keyCount() == 0) return null; + metatables.put(cls, mt); + } + return mt; + } + + public static LuaValue wrap(Object value) { + if (value instanceof LuaValue) return (LuaValue) value; + LuaValue luaValue = CoerceJavaToLua.coerce(value); + luaValue.setmetatable(getMetatable(value)); + return luaValue; + } + + private static class JavaMethod extends VarArgFunction { + private static Map methods = new HashMap<>(); + + public static JavaMethod fromMethod(Method m) { + return methods.computeIfAbsent(m, k -> new JavaMethod(m)); + } + + private final Method method; + private final Class[] types; + + private JavaMethod(Method method) { + this.method = method; + this.types = method.getParameterTypes(); + } + + @Override + public Varargs invoke(Varargs varargs) { + return invokeMethod(varargs.checkuserdata(1), varargs.subargs(2)); + } + + private LuaValue invokeMethod(Object instance, Varargs varargs) { + try { + return wrap(method.invoke(instance, convertArgs(varargs))); + } catch (InvocationTargetException e) { + throw new LuaError(e.getTargetException()); + } catch (Exception e) { + return LuaValue.error(String.format("coercion error %s\nmethod %s", e, method)); + } + } + + private Object[] convertArgs(Varargs varargs) { + Object[] args = new Object[types.length]; + for (int i = 0; i < types.length; i++) { + args[i] = CoerceLuaToJava.coerce(varargs.arg(i + 1), types[i]); + } + return args; + } + } +} diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info new file mode 100644 index 0000000..ac55d24 --- /dev/null +++ b/src/main/resources/mcmod.info @@ -0,0 +1,10 @@ +[{ + "modid": "recipinator", + "name": "Recipinator", + "description": "Make and change recipes through Lua", + "version": "1.0.0", + "mcversion": "1.7.10", + "url": "https://github.com/Techlone/Recipenator", + "updateUrl": "https://github.com/Techlone/Recipenator/releases", + "authorList": ["Techlone"] +}] \ No newline at end of file diff --git a/src/test/java/recipenator/LuaExecutor_Should.java b/src/test/java/recipenator/LuaExecutor_Should.java new file mode 100644 index 0000000..39fd7ff --- /dev/null +++ b/src/test/java/recipenator/LuaExecutor_Should.java @@ -0,0 +1,57 @@ +package recipenator; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import recipenator.utils.lua.LuaExecutor; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.PrintStream; + +public class LuaExecutor_Should { + private static final String TEST_DIR_RECIPES = "src/test/lua/recipes"; + + private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + private final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); + + private PrintStream outDefault; + private PrintStream errDefault; + private LuaExecutor executor; + + @Before + public void before() { + outDefault = System.out; + errDefault = System.err; + System.setOut(new PrintStream(outContent)); + System.setErr(new PrintStream(errContent)); + + executor = new LuaExecutor(new File(TEST_DIR_RECIPES), new TestLuaLibGetter()); + } + + @After + public void after() { + System.setOut(outDefault); + System.setErr(errDefault); + System.out.println(outContent.toString()); + System.err.println(errContent.toString()); + } + + @Test + public void ExecuteScript_GlobalTest() { + executor.executeFile("global_test"); + String output = outContent.toString(); + Assert.assertEquals("123", output.substring(output.length() - 3)); + } + + @Test + public void ExecuteScript_Items() { + executor.executeFile("items"); + } + + @Test + public void ExecuteScript_Recipe() { + executor.executeFile("recipe"); + } +} diff --git a/src/test/java/recipenator/NamesTree_Should.java b/src/test/java/recipenator/NamesTree_Should.java new file mode 100644 index 0000000..bf0e230 --- /dev/null +++ b/src/test/java/recipenator/NamesTree_Should.java @@ -0,0 +1,64 @@ +package recipenator; + +import org.junit.Test; +import recipenator.utils.NamesTree; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class NamesTree_Should { + //@Test + public void ParseNameToListNodes() { + List names; + try { + names = Files.readAllLines(Paths.get(".\\src\\test\\names.txt")); + } catch (IOException ignored) { + throw new RuntimeException("All is gone!"); + } + names.forEach(s -> s.toString()); + String name = "appliedenergistics2:item.ItemBasicStorageCell.16k"; + int TIMES = 1; + long start; + + System.out.print("My "); + start = System.currentTimeMillis(); + for (int i = 0; i < TIMES; i++) { + Set> collect = names.stream() + .map(NamesTree::getNameNodes) + .collect(Collectors.toSet()); + } + System.out.println(System.currentTimeMillis() - start); + + System.out.print("JVM "); + start = System.currentTimeMillis(); + for (int i = 0; i < TIMES; i++) { + //names.forEach(s -> s.toLowerCase().split("\\W+")); + Set collect = names.stream() + .map(s -> s.toLowerCase().split("\\W+")) + .collect(Collectors.toSet()); + name.toLowerCase().split("\\W+"); + } + System.out.println(System.currentTimeMillis() - start); + } + + @Test + public void ParseNames_FromFile() { + List names; + try { + names = Files.readAllLines(Paths.get(".\\src\\test\\names.txt")); + } catch (IOException ignored) { + throw new RuntimeException("All is gone!"); + } + + NamesTree.NameNode root = NamesTree.getTreeRoot(names); + try { + Files.write(Paths.get(".\\src\\test\\names_internal.txt"), root.toString().getBytes()); + } catch (IOException ignored) { + throw new RuntimeException("Everything is gone!"); + } + } +} \ No newline at end of file diff --git a/src/test/java/recipenator/RecipeHelper_Should.java b/src/test/java/recipenator/RecipeHelper_Should.java new file mode 100644 index 0000000..328b8a5 --- /dev/null +++ b/src/test/java/recipenator/RecipeHelper_Should.java @@ -0,0 +1,23 @@ +package recipenator; + +import org.junit.Assert; +import org.junit.Test; +import recipenator.utils.RecipeHelper; + +import java.util.Objects; + +public class RecipeHelper_Should { + @Test + public void Rectangulate() { + String[][] input = {{"11", "12"}, {"21"}, {"31", "32", "33"}}; + String[][] output = {{"11", "12", null}, {"21", null, null}, {"31", "32", "33"}}; + + RecipeHelper.Size size = RecipeHelper.rectangulate(input); + + Assert.assertEquals(3, size.width); + Assert.assertEquals(3, size.height); + for (int i = 0; i < input.length; i++) { + Assert.assertArrayEquals(output[i], input[i]); + } + } +} diff --git a/src/test/java/recipenator/Recipenator_Should.java b/src/test/java/recipenator/Recipenator_Should.java new file mode 100644 index 0000000..27a4888 --- /dev/null +++ b/src/test/java/recipenator/Recipenator_Should.java @@ -0,0 +1,17 @@ +package recipenator; + +import org.junit.Test; + +import java.nio.file.Path; +import java.nio.file.Paths; + +public class Recipenator_Should { + @Test + public void PrepareName() { + Path p1 = Paths.get("C:\\asd\\zyx\\folder"); + Path p2 = Paths.get("C:\\asd\\zyx\\mydir\\test"); + Path pr = p1.relativize(p2); + System.out.println(System.getProperty("user.dir")); + System.out.println(pr); + } +} diff --git a/src/test/java/recipenator/SubNamesData_Should.java b/src/test/java/recipenator/SubNamesData_Should.java new file mode 100644 index 0000000..d9a23d3 --- /dev/null +++ b/src/test/java/recipenator/SubNamesData_Should.java @@ -0,0 +1,11 @@ +package recipenator; + +import org.junit.Test; + +public class SubNamesData_Should { + @Test + public void Create_NewInst() { + String s = "name*asd"; + boolean b = s.contains("*"); + } +} \ No newline at end of file diff --git a/src/test/java/recipenator/TestLuaLibGetter.java b/src/test/java/recipenator/TestLuaLibGetter.java new file mode 100644 index 0000000..a5ea874 --- /dev/null +++ b/src/test/java/recipenator/TestLuaLibGetter.java @@ -0,0 +1,32 @@ +package recipenator; + +import recipenator.api.ILuaLibGetter; +import recipenator.lualib.BaseLuaLib; +import recipenator.lualib.item.ItemLib; +import recipenator.lualib.oredict.OreDictLib; +import recipenator.utils.NamesTree; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +public class TestLuaLibGetter implements ILuaLibGetter { + @Override + public Set getLibs() { + Set libs = new HashSet<>(); + Collection names; + try { + names = Files.readAllLines(Paths.get(".\\src\\test\\names.txt")); + } catch (IOException ignored) { + throw new RuntimeException("All is gone!"); + } + //noinspection unchecked + libs.add(new ItemLib(NamesTree.getTreeRoot(names))); + libs.add(new OreDictLib()); + libs.add(new TestRecipeLib()); + return libs; + } +} diff --git a/src/test/java/recipenator/TestRecipeLib.java b/src/test/java/recipenator/TestRecipeLib.java new file mode 100644 index 0000000..2cc26b6 --- /dev/null +++ b/src/test/java/recipenator/TestRecipeLib.java @@ -0,0 +1,10 @@ +package recipenator; + +import recipenator.lualib.recipe.RecipeLib; + +public class TestRecipeLib extends RecipeLib { + @Override + protected Object getLib() { + return new TestRecipeManager(); + } +} diff --git a/src/test/java/recipenator/TestRecipeManager.java b/src/test/java/recipenator/TestRecipeManager.java new file mode 100644 index 0000000..4db8d5d --- /dev/null +++ b/src/test/java/recipenator/TestRecipeManager.java @@ -0,0 +1,25 @@ +package recipenator; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import recipenator.api.IRecipeComponent; +import recipenator.lualib.recipe.RecipeManager; + +public class TestRecipeManager extends RecipeManager { + @Override + public void addRecipe(IRecipe recipe) { + AddedRecipes.add(recipe); + } + + @Override + public void addShaped(IRecipeComponent result, IRecipeComponent[][] input) { + System.out.println("Add shaped recipe for " + result); + super.addShaped(result, input); + } + + @Override + public void addShapeless(IRecipeComponent result, IRecipeComponent[] input) { + System.out.println("Add shapeless recipe for " + result); + super.addShapeless(result, input); + } +} diff --git a/src/test/lua/recipes/global.lua b/src/test/lua/recipes/global.lua new file mode 100644 index 0000000..158ef47 --- /dev/null +++ b/src/test/lua/recipes/global.lua @@ -0,0 +1,9 @@ +local function log(...) + io.write(...) +end + +local global = { + log = log +} + +return global \ No newline at end of file diff --git a/src/test/lua/recipes/global_test.lua b/src/test/lua/recipes/global_test.lua new file mode 100644 index 0000000..c5e2ff3 --- /dev/null +++ b/src/test/lua/recipes/global_test.lua @@ -0,0 +1,3 @@ +local global = require "global"; + +global.log(123); diff --git a/src/test/lua/recipes/items.lua b/src/test/lua/recipes/items.lua new file mode 100644 index 0000000..e7217e7 --- /dev/null +++ b/src/test/lua/recipes/items.lua @@ -0,0 +1,5 @@ +require 'rel.fix' +local mc = item.minecraft; +print(mc.egg * 3.4); +--print(3 * mc.egg); + diff --git a/src/test/lua/recipes/recipe.lua b/src/test/lua/recipes/recipe.lua new file mode 100644 index 0000000..40c6f62 --- /dev/null +++ b/src/test/lua/recipes/recipe.lua @@ -0,0 +1,6 @@ +local mc = item.minecraft +--recipe:addShapeless(mc.egg, {null, null, mc.cake}) +recipe:addShapeless(mc.egg, {mc.flint}) +recipe:addShaped(mc.egg, {{mc.cake}}) + + diff --git a/src/test/lua/recipes/rel/fix.lua b/src/test/lua/recipes/rel/fix.lua new file mode 100644 index 0000000..42e650d --- /dev/null +++ b/src/test/lua/recipes/rel/fix.lua @@ -0,0 +1,2 @@ +print("FIX") + diff --git a/src/test/names.txt b/src/test/names.txt new file mode 100644 index 0000000..a4e3f2a --- /dev/null +++ b/src/test/names.txt @@ -0,0 +1,756 @@ +BuildCraft|Builders:architectBlock +BuildCraft|Builders:blueprintItem +BuildCraft|Builders:builderBlock +BuildCraft|Builders:constructionMarkerBlock +BuildCraft|Builders:fillerBlock +BuildCraft|Builders:frameBlock +BuildCraft|Builders:libraryBlock +BuildCraft|Builders:machineBlock +BuildCraft|Builders:templateItem +BuildCraft|Core:buildToolBlock +BuildCraft|Core:debugger +BuildCraft|Core:diamondGearItem +BuildCraft|Core:engineBlock +BuildCraft|Core:eternalSpring +BuildCraft|Core:goldGearItem +BuildCraft|Core:ironGearItem +BuildCraft|Core:list +BuildCraft|Core:mapLocation +BuildCraft|Core:markerBlock +BuildCraft|Core:paintbrush +BuildCraft|Core:pathMarkerBlock +BuildCraft|Core:stoneGearItem +BuildCraft|Core:woodenGearItem +BuildCraft|Core:wrenchItem +BuildCraft|Energy:blockFuel +BuildCraft|Energy:blockOil +BuildCraft|Energy:blockRedPlasma +BuildCraft|Energy:bucketFuel +BuildCraft|Energy:bucketOil +BuildCraft|Factory:autoWorkbenchBlock +BuildCraft|Factory:blockHopper +BuildCraft|Factory:floodGateBlock +BuildCraft|Factory:miningWellBlock +BuildCraft|Factory:plainPipeBlock +BuildCraft|Factory:pumpBlock +BuildCraft|Factory:refineryBlock +BuildCraft|Factory:tankBlock +BuildCraft|Robotics:redstone_board +BuildCraft|Robotics:requester +BuildCraft|Robotics:robot +BuildCraft|Robotics:robotStation +BuildCraft|Robotics:zonePlan +BuildCraft|Silicon:laserBlock +BuildCraft|Silicon:laserTableBlock +BuildCraft|Silicon:package +BuildCraft|Silicon:packagerBlock +BuildCraft|Silicon:redstoneChipset +BuildCraft|Silicon:redstoneCrystal +BuildCraft|Transport:filteredBufferBlock +BuildCraft|Transport:gateCopier +BuildCraft|Transport:item.buildcraftPipe.pipefluidsclay +BuildCraft|Transport:item.buildcraftPipe.pipefluidscobblestone +BuildCraft|Transport:item.buildcraftPipe.pipefluidsdiamond +BuildCraft|Transport:item.buildcraftPipe.pipefluidsemerald +BuildCraft|Transport:item.buildcraftPipe.pipefluidsgold +BuildCraft|Transport:item.buildcraftPipe.pipefluidsiron +BuildCraft|Transport:item.buildcraftPipe.pipefluidsquartz +BuildCraft|Transport:item.buildcraftPipe.pipefluidssandstone +BuildCraft|Transport:item.buildcraftPipe.pipefluidsstone +BuildCraft|Transport:item.buildcraftPipe.pipefluidsvoid +BuildCraft|Transport:item.buildcraftPipe.pipefluidswood +BuildCraft|Transport:item.buildcraftPipe.pipeitemsclay +BuildCraft|Transport:item.buildcraftPipe.pipeitemscobblestone +BuildCraft|Transport:item.buildcraftPipe.pipeitemsdaizuli +BuildCraft|Transport:item.buildcraftPipe.pipeitemsdiamond +BuildCraft|Transport:item.buildcraftPipe.pipeitemsemerald +BuildCraft|Transport:item.buildcraftPipe.pipeitemsemzuli +BuildCraft|Transport:item.buildcraftPipe.pipeitemsgold +BuildCraft|Transport:item.buildcraftPipe.pipeitemsiron +BuildCraft|Transport:item.buildcraftPipe.pipeitemslapis +BuildCraft|Transport:item.buildcraftPipe.pipeitemsobsidian +BuildCraft|Transport:item.buildcraftPipe.pipeitemsquartz +BuildCraft|Transport:item.buildcraftPipe.pipeitemssandstone +BuildCraft|Transport:item.buildcraftPipe.pipeitemsstone +BuildCraft|Transport:item.buildcraftPipe.pipeitemsstripes +BuildCraft|Transport:item.buildcraftPipe.pipeitemsvoid +BuildCraft|Transport:item.buildcraftPipe.pipeitemswood +BuildCraft|Transport:item.buildcraftPipe.pipepowercobblestone +BuildCraft|Transport:item.buildcraftPipe.pipepowerdiamond +BuildCraft|Transport:item.buildcraftPipe.pipepoweremerald +BuildCraft|Transport:item.buildcraftPipe.pipepowergold +BuildCraft|Transport:item.buildcraftPipe.pipepoweriron +BuildCraft|Transport:item.buildcraftPipe.pipepowerquartz +BuildCraft|Transport:item.buildcraftPipe.pipepowersandstone +BuildCraft|Transport:item.buildcraftPipe.pipepowerstone +BuildCraft|Transport:item.buildcraftPipe.pipepowerwood +BuildCraft|Transport:item.buildcraftPipe.pipestructurecobblestone +BuildCraft|Transport:pipeBlock +BuildCraft|Transport:pipeFacade +BuildCraft|Transport:pipeGate +BuildCraft|Transport:pipeLens +BuildCraft|Transport:pipePlug +BuildCraft|Transport:pipePowerAdapter +BuildCraft|Transport:pipeWaterproof +BuildCraft|Transport:pipeWire +ExtraUtilities:angelBlock +ExtraUtilities:angelRing +ExtraUtilities:bedrockiumIngot +ExtraUtilities:block_bedrockium +ExtraUtilities:budoff +ExtraUtilities:builderswand +ExtraUtilities:chandelier +ExtraUtilities:chestFull +ExtraUtilities:chestMini +ExtraUtilities:cobblestone_compressed +ExtraUtilities:colorStoneBrick +ExtraUtilities:colorWoodPlanks +ExtraUtilities:color_blockCoal +ExtraUtilities:color_blockLapis +ExtraUtilities:color_blockRedstone +ExtraUtilities:color_brick +ExtraUtilities:color_hellsand +ExtraUtilities:color_lightgem +ExtraUtilities:color_obsidian +ExtraUtilities:color_quartzBlock +ExtraUtilities:color_redstoneLight +ExtraUtilities:color_stone +ExtraUtilities:color_stonebrick +ExtraUtilities:conveyor +ExtraUtilities:creativebuilderswand +ExtraUtilities:cursedearthside +ExtraUtilities:curtains +ExtraUtilities:dark_portal +ExtraUtilities:datablock +ExtraUtilities:decorativeBlock1 +ExtraUtilities:decorativeBlock2 +ExtraUtilities:defoliageAxe +ExtraUtilities:destructionpickaxe +ExtraUtilities:divisionSigil +ExtraUtilities:drum +ExtraUtilities:endConstructor +ExtraUtilities:endMarker +ExtraUtilities:enderCollector +ExtraUtilities:enderQuarry +ExtraUtilities:enderQuarryUpgrade +ExtraUtilities:enderThermicPump +ExtraUtilities:erosionShovel +ExtraUtilities:etherealglass +ExtraUtilities:ethericsword +ExtraUtilities:extractor_base +ExtraUtilities:extractor_base_remote +ExtraUtilities:filing +ExtraUtilities:generator +ExtraUtilities:generator.64 +ExtraUtilities:generator.8 +ExtraUtilities:glove +ExtraUtilities:golden_bag +ExtraUtilities:golden_lasso +ExtraUtilities:greenscreen +ExtraUtilities:heatingElement +ExtraUtilities:lawSword +ExtraUtilities:magnumTorch +ExtraUtilities:microblocks +ExtraUtilities:mini-soul +ExtraUtilities:nodeUpgrade +ExtraUtilities:paintbrush +ExtraUtilities:peaceful_table_top +ExtraUtilities:pipes +ExtraUtilities:pipes.1 +ExtraUtilities:plant/ender_lilly +ExtraUtilities:pureLove +ExtraUtilities:scanner +ExtraUtilities:shears +ExtraUtilities:sonar_goggles +ExtraUtilities:sound_muffler +ExtraUtilities:spike_base +ExtraUtilities:spike_base_diamond +ExtraUtilities:spike_base_gold +ExtraUtilities:spike_base_wood +ExtraUtilities:temporalHoe +ExtraUtilities:timer +ExtraUtilities:trading_post +ExtraUtilities:trashcan +ExtraUtilities:unstableingot +ExtraUtilities:watering_can +ForgeMicroblock:microblock +ForgeMicroblock:sawDiamond +ForgeMicroblock:sawIron +ForgeMicroblock:sawStone +ForgeMicroblock:stoneRod +ForgeRelocation:relocation.blockmovingrow +MCFrames:mcframes.frame +MCFrames:mcframes.motor +OpenBlocks:autoanvil +OpenBlocks:autoenchantmenttable +OpenBlocks:beartrap +OpenBlocks:bigbutton +OpenBlocks:blockPlacer +OpenBlocks:blockbreaker +OpenBlocks:builder_guide +OpenBlocks:cannon +OpenBlocks:canvas +OpenBlocks:canvasglass +OpenBlocks:cartographer +OpenBlocks:craneBackpack +OpenBlocks:craneControl +OpenBlocks:crayonGlasses +OpenBlocks:cursor +OpenBlocks:devnull +OpenBlocks:donationStation +OpenBlocks:drawingtable +OpenBlocks:elevator +OpenBlocks:elevator_rotating +OpenBlocks:emptyMap +OpenBlocks:epicEraser +OpenBlocks:fan +OpenBlocks:filledbucket +OpenBlocks:flag +OpenBlocks:generic +OpenBlocks:genericUnstackable +OpenBlocks:goldenEye +OpenBlocks:goldenegg +OpenBlocks:grave +OpenBlocks:guide +OpenBlocks:hangglider +OpenBlocks:heal +OpenBlocks:heightMap +OpenBlocks:imaginary +OpenBlocks:infoBook +OpenBlocks:itemDropper +OpenBlocks:ladder +OpenBlocks:luggage +OpenBlocks:paintBrush +OpenBlocks:paintcan +OpenBlocks:paintmixer +OpenBlocks:path +OpenBlocks:pedometer +OpenBlocks:pencilGlasses +OpenBlocks:projector +OpenBlocks:ropeladder +OpenBlocks:scaffolding +OpenBlocks:seriousGlasses +OpenBlocks:sky +OpenBlocks:sleepingBag +OpenBlocks:slimalyzer +OpenBlocks:sonicglasses +OpenBlocks:sponge +OpenBlocks:spongeonastick +OpenBlocks:sprinkler +OpenBlocks:squeegee +OpenBlocks:stencil +OpenBlocks:tank +OpenBlocks:target +OpenBlocks:tastyClay +OpenBlocks:technicolorGlasses +OpenBlocks:trophy +OpenBlocks:vacuumhopper +OpenBlocks:village_highlighter +OpenBlocks:wrench +OpenBlocks:xpbottler +OpenBlocks:xpdrain +OpenBlocks:xpshower +ProjRed|Core:projectred.core.datacard +ProjRed|Core:projectred.core.drawplate +ProjRed|Core:projectred.core.part +ProjRed|Core:projectred.core.screwdriver +ProjRed|Core:projectred.core.wiredebugger +ProjRed|Expansion:projectred.expansion.battery +ProjRed|Expansion:projectred.expansion.electric_screwdriver +ProjRed|Expansion:projectred.expansion.emptybattery +ProjRed|Expansion:projectred.expansion.infused_ender_pearl +ProjRed|Expansion:projectred.expansion.jetpack +ProjRed|Expansion:projectred.expansion.machine1 +ProjRed|Expansion:projectred.expansion.machine2 +ProjRed|Expansion:projectred.expansion.plan +ProjRed|Expansion:projectred.expansion.solar_panel +ProjRed|Exploration:projectred.exploration.athame +ProjRed|Exploration:projectred.exploration.axeperidot +ProjRed|Exploration:projectred.exploration.axeruby +ProjRed|Exploration:projectred.exploration.axesapphire +ProjRed|Exploration:projectred.exploration.backpack +ProjRed|Exploration:projectred.exploration.barrel +ProjRed|Exploration:projectred.exploration.hoeperidot +ProjRed|Exploration:projectred.exploration.hoeruby +ProjRed|Exploration:projectred.exploration.hoesapphire +ProjRed|Exploration:projectred.exploration.lily +ProjRed|Exploration:projectred.exploration.lilyseed +ProjRed|Exploration:projectred.exploration.ore +ProjRed|Exploration:projectred.exploration.peridotboots +ProjRed|Exploration:projectred.exploration.peridotchestplate +ProjRed|Exploration:projectred.exploration.peridothelmet +ProjRed|Exploration:projectred.exploration.peridotleggings +ProjRed|Exploration:projectred.exploration.pickaxeperidot +ProjRed|Exploration:projectred.exploration.pickaxeruby +ProjRed|Exploration:projectred.exploration.pickaxesapphire +ProjRed|Exploration:projectred.exploration.rubyboots +ProjRed|Exploration:projectred.exploration.rubychestplate +ProjRed|Exploration:projectred.exploration.rubyhelmet +ProjRed|Exploration:projectred.exploration.rubyleggings +ProjRed|Exploration:projectred.exploration.sapphireboots +ProjRed|Exploration:projectred.exploration.sapphirechestplate +ProjRed|Exploration:projectred.exploration.sapphirehelmet +ProjRed|Exploration:projectred.exploration.sapphireleggings +ProjRed|Exploration:projectred.exploration.sawgold +ProjRed|Exploration:projectred.exploration.sawperidot +ProjRed|Exploration:projectred.exploration.sawruby +ProjRed|Exploration:projectred.exploration.sawsapphire +ProjRed|Exploration:projectred.exploration.shovelperidot +ProjRed|Exploration:projectred.exploration.shovelruby +ProjRed|Exploration:projectred.exploration.shovelsapphire +ProjRed|Exploration:projectred.exploration.sicklediamond +ProjRed|Exploration:projectred.exploration.sicklegold +ProjRed|Exploration:projectred.exploration.sickleiron +ProjRed|Exploration:projectred.exploration.sickleperidot +ProjRed|Exploration:projectred.exploration.sickleruby +ProjRed|Exploration:projectred.exploration.sicklesapphire +ProjRed|Exploration:projectred.exploration.sicklestone +ProjRed|Exploration:projectred.exploration.sicklewood +ProjRed|Exploration:projectred.exploration.stone +ProjRed|Exploration:projectred.exploration.stonewalls +ProjRed|Exploration:projectred.exploration.swordperidot +ProjRed|Exploration:projectred.exploration.swordruby +ProjRed|Exploration:projectred.exploration.swordsapphire +ProjRed|Exploration:projectred.exploration.woolgin +ProjRed|Fabrication:projectred.fabrication.icblueprint +ProjRed|Fabrication:projectred.fabrication.icchip +ProjRed|Fabrication:projectred.integration.icblock +ProjRed|Illumination:projectred.illumination.airousLight +ProjRed|Illumination:projectred.illumination.cagelamp +ProjRed|Illumination:projectred.illumination.cagelamp.inv +ProjRed|Illumination:projectred.illumination.cagelamp2 +ProjRed|Illumination:projectred.illumination.cagelamp2.inv +ProjRed|Illumination:projectred.illumination.fixture +ProjRed|Illumination:projectred.illumination.fixture.inv +ProjRed|Illumination:projectred.illumination.flightbutton +ProjRed|Illumination:projectred.illumination.lamp +ProjRed|Illumination:projectred.illumination.lantern +ProjRed|Illumination:projectred.illumination.lantern.inv +ProjRed|Illumination:projectred.illumination.lightbutton +ProjRed|Integration:projectred.integration.gate +ProjRed|Transmission:projectred.transmission.framewire +ProjRed|Transmission:projectred.transmission.wire +ProjRed|Transportation:projectred.transportation.pipe +ProjRed|Transportation:projectred.transportation.routerutil +ProjRed|Transportation:projectred.transportation.routingchip +appliedenergistics2:item.ItemBasicStorageCell.16k +appliedenergistics2:item.ItemBasicStorageCell.1k +appliedenergistics2:item.ItemBasicStorageCell.4k +appliedenergistics2:item.ItemBasicStorageCell.64k +appliedenergistics2:item.ItemCreativeStorageCell +appliedenergistics2:item.ItemCrystalSeed +appliedenergistics2:item.ItemEncodedPattern +appliedenergistics2:item.ItemFacade +appliedenergistics2:item.ItemMultiMaterial +appliedenergistics2:item.ItemMultiPart +appliedenergistics2:item.ItemPaintBall +appliedenergistics2:item.ItemSpatialStorageCell.128Cubed +appliedenergistics2:item.ItemSpatialStorageCell.16Cubed +appliedenergistics2:item.ItemSpatialStorageCell.2Cubed +appliedenergistics2:item.ItemViewCell +appliedenergistics2:item.ToolBiometricCard +appliedenergistics2:item.ToolCertusQuartzAxe +appliedenergistics2:item.ToolCertusQuartzCuttingKnife +appliedenergistics2:item.ToolCertusQuartzHoe +appliedenergistics2:item.ToolCertusQuartzPickaxe +appliedenergistics2:item.ToolCertusQuartzSpade +appliedenergistics2:item.ToolCertusQuartzSword +appliedenergistics2:item.ToolCertusQuartzWrench +appliedenergistics2:item.ToolChargedStaff +appliedenergistics2:item.ToolColorApplicator +appliedenergistics2:item.ToolEntropyManipulator +appliedenergistics2:item.ToolMassCannon +appliedenergistics2:item.ToolMemoryCard +appliedenergistics2:item.ToolNetherQuartzAxe +appliedenergistics2:item.ToolNetherQuartzCuttingKnife +appliedenergistics2:item.ToolNetherQuartzHoe +appliedenergistics2:item.ToolNetherQuartzPickaxe +appliedenergistics2:item.ToolNetherQuartzSpade +appliedenergistics2:item.ToolNetherQuartzSword +appliedenergistics2:item.ToolNetherQuartzWrench +appliedenergistics2:item.ToolNetworkTool +appliedenergistics2:item.ToolPortableCell +appliedenergistics2:item.ToolWirelessTerminal +appliedenergistics2:tile.BlockCableBus +appliedenergistics2:tile.BlockCellWorkbench +appliedenergistics2:tile.BlockCharger +appliedenergistics2:tile.BlockChest +appliedenergistics2:tile.BlockCondenser +appliedenergistics2:tile.BlockController +appliedenergistics2:tile.BlockCraftingMonitor +appliedenergistics2:tile.BlockCraftingStorage +appliedenergistics2:tile.BlockCraftingUnit +appliedenergistics2:tile.BlockCrank +appliedenergistics2:tile.BlockCreativeEnergyCell +appliedenergistics2:tile.BlockDenseEnergyCell +appliedenergistics2:tile.BlockDrive +appliedenergistics2:tile.BlockEnergyAcceptor +appliedenergistics2:tile.BlockEnergyCell +appliedenergistics2:tile.BlockFluix +appliedenergistics2:tile.BlockGrinder +appliedenergistics2:tile.BlockIOPort +appliedenergistics2:tile.BlockInscriber +appliedenergistics2:tile.BlockInterface +appliedenergistics2:tile.BlockLightDetector +appliedenergistics2:tile.BlockMatrixFrame +appliedenergistics2:tile.BlockMolecularAssembler +appliedenergistics2:tile.BlockPaint +appliedenergistics2:tile.BlockQuantumLinkChamber +appliedenergistics2:tile.BlockQuantumRing +appliedenergistics2:tile.BlockQuartz +appliedenergistics2:tile.BlockQuartzChiseled +appliedenergistics2:tile.BlockQuartzGlass +appliedenergistics2:tile.BlockQuartzGrowthAccelerator +appliedenergistics2:tile.BlockQuartzLamp +appliedenergistics2:tile.BlockQuartzPillar +appliedenergistics2:tile.BlockQuartzTorch +appliedenergistics2:tile.BlockSecurity +appliedenergistics2:tile.BlockSkyChest +appliedenergistics2:tile.BlockSkyCompass +appliedenergistics2:tile.BlockSkyStone +appliedenergistics2:tile.BlockSpatialIOPort +appliedenergistics2:tile.BlockSpatialPylon +appliedenergistics2:tile.BlockTinyTNT +appliedenergistics2:tile.BlockVibrationChamber +appliedenergistics2:tile.BlockWireless +appliedenergistics2:tile.ChiseledQuartzSlabBlock +appliedenergistics2:tile.ChiseledQuartzSlabBlock.double +appliedenergistics2:tile.ChiseledQuartzStairBlock +appliedenergistics2:tile.FluixSlabBlock +appliedenergistics2:tile.FluixSlabBlock.double +appliedenergistics2:tile.FluixStairBlock +appliedenergistics2:tile.OreQuartz +appliedenergistics2:tile.OreQuartzCharged +appliedenergistics2:tile.QuartzPillarSlabBlock +appliedenergistics2:tile.QuartzPillarSlabBlock.double +appliedenergistics2:tile.QuartzPillarStairBlock +appliedenergistics2:tile.QuartzSlabBlock +appliedenergistics2:tile.QuartzSlabBlock.double +appliedenergistics2:tile.QuartzStairBlock +appliedenergistics2:tile.SkyStoneBlockSlabBlock +appliedenergistics2:tile.SkyStoneBlockSlabBlock.double +appliedenergistics2:tile.SkyStoneBlockStairBlock +appliedenergistics2:tile.SkyStoneBrickSlabBlock +appliedenergistics2:tile.SkyStoneBrickSlabBlock.double +appliedenergistics2:tile.SkyStoneBrickStairBlock +appliedenergistics2:tile.SkyStoneSlabBlock +appliedenergistics2:tile.SkyStoneSlabBlock.double +appliedenergistics2:tile.SkyStoneSmallBrickSlabBlock +appliedenergistics2:tile.SkyStoneSmallBrickSlabBlock.double +appliedenergistics2:tile.SkyStoneSmallBrickStairBlock +appliedenergistics2:tile.SkyStoneStairBlock +minecraft:acacia_stairs +minecraft:activator_rail +minecraft:anvil +minecraft:apple +minecraft:arrow +minecraft:baked_potato +minecraft:beacon +minecraft:bed +minecraft:bedrock +minecraft:beef +minecraft:birch_stairs +minecraft:blaze_powder +minecraft:blaze_rod +minecraft:boat +minecraft:bone +minecraft:book +minecraft:bookshelf +minecraft:bow +minecraft:bowl +minecraft:bread +minecraft:brewing_stand +minecraft:brick +minecraft:brick_block +minecraft:brick_stairs +minecraft:brown_mushroom +minecraft:brown_mushroom_block +minecraft:bucket +minecraft:cactus +minecraft:cake +minecraft:carpet +minecraft:carrot +minecraft:carrot_on_a_stick +minecraft:carrots +minecraft:cauldron +minecraft:chainmail_boots +minecraft:chainmail_chestplate +minecraft:chainmail_helmet +minecraft:chainmail_leggings +minecraft:chest +minecraft:chest_minecart +minecraft:chicken +minecraft:clay +minecraft:clay_ball +minecraft:clock +minecraft:coal +minecraft:coal_block +minecraft:coal_ore +minecraft:cobblestone +minecraft:cobblestone_wall +minecraft:cocoa +minecraft:command_block +minecraft:command_block_minecart +minecraft:comparator +minecraft:compass +minecraft:cooked_beef +minecraft:cooked_chicken +minecraft:cooked_fished +minecraft:cooked_porkchop +minecraft:cookie +minecraft:crafting_table +minecraft:dark_oak_stairs +minecraft:daylight_detector +minecraft:deadbush +minecraft:detector_rail +minecraft:diamond +minecraft:diamond_axe +minecraft:diamond_block +minecraft:diamond_boots +minecraft:diamond_chestplate +minecraft:diamond_helmet +minecraft:diamond_hoe +minecraft:diamond_horse_armor +minecraft:diamond_leggings +minecraft:diamond_ore +minecraft:diamond_pickaxe +minecraft:diamond_shovel +minecraft:diamond_sword +minecraft:dirt +minecraft:dispenser +minecraft:double_plant +minecraft:double_stone_slab +minecraft:double_wooden_slab +minecraft:dragon_egg +minecraft:dropper +minecraft:dye +minecraft:egg +minecraft:emerald +minecraft:emerald_block +minecraft:emerald_ore +minecraft:enchanted_book +minecraft:enchanting_table +minecraft:end_portal +minecraft:end_portal_frame +minecraft:end_stone +minecraft:ender_chest +minecraft:ender_eye +minecraft:ender_pearl +minecraft:experience_bottle +minecraft:farmland +minecraft:feather +minecraft:fence +minecraft:fence_gate +minecraft:fermented_spider_eye +minecraft:filled_map +minecraft:fire +minecraft:fire_charge +minecraft:firework_charge +minecraft:fireworks +minecraft:fish +minecraft:fishing_rod +minecraft:flint +minecraft:flint_and_steel +minecraft:flower_pot +minecraft:flowing_lava +minecraft:flowing_water +minecraft:furnace +minecraft:furnace_minecart +minecraft:ghast_tear +minecraft:glass +minecraft:glass_bottle +minecraft:glass_pane +minecraft:glowstone +minecraft:glowstone_dust +minecraft:gold_block +minecraft:gold_ingot +minecraft:gold_nugget +minecraft:gold_ore +minecraft:golden_apple +minecraft:golden_axe +minecraft:golden_boots +minecraft:golden_carrot +minecraft:golden_chestplate +minecraft:golden_helmet +minecraft:golden_hoe +minecraft:golden_horse_armor +minecraft:golden_leggings +minecraft:golden_pickaxe +minecraft:golden_rail +minecraft:golden_shovel +minecraft:golden_sword +minecraft:grass +minecraft:gravel +minecraft:gunpowder +minecraft:hardened_clay +minecraft:hay_block +minecraft:heavy_weighted_pressure_plate +minecraft:hopper +minecraft:hopper_minecart +minecraft:ice +minecraft:iron_axe +minecraft:iron_bars +minecraft:iron_block +minecraft:iron_boots +minecraft:iron_chestplate +minecraft:iron_door +minecraft:iron_helmet +minecraft:iron_hoe +minecraft:iron_horse_armor +minecraft:iron_ingot +minecraft:iron_leggings +minecraft:iron_ore +minecraft:iron_pickaxe +minecraft:iron_shovel +minecraft:iron_sword +minecraft:item_frame +minecraft:jukebox +minecraft:jungle_stairs +minecraft:ladder +minecraft:lapis_block +minecraft:lapis_ore +minecraft:lava +minecraft:lava_bucket +minecraft:lead +minecraft:leather +minecraft:leather_boots +minecraft:leather_chestplate +minecraft:leather_helmet +minecraft:leather_leggings +minecraft:leaves +minecraft:leaves2 +minecraft:lever +minecraft:light_weighted_pressure_plate +minecraft:lit_furnace +minecraft:lit_pumpkin +minecraft:log +minecraft:log2 +minecraft:magma_cream +minecraft:map +minecraft:melon +minecraft:melon_block +minecraft:melon_seeds +minecraft:milk_bucket +minecraft:minecart +minecraft:mob_spawner +minecraft:monster_egg +minecraft:mossy_cobblestone +minecraft:mushroom_stew +minecraft:mycelium +minecraft:name_tag +minecraft:nether_brick +minecraft:nether_brick_fence +minecraft:nether_brick_stairs +minecraft:nether_star +minecraft:nether_wart +minecraft:netherbrick +minecraft:netherrack +minecraft:noteblock +minecraft:oak_stairs +minecraft:obsidian +minecraft:packed_ice +minecraft:painting +minecraft:paper +minecraft:piston +minecraft:planks +minecraft:poisonous_potato +minecraft:porkchop +minecraft:portal +minecraft:potato +minecraft:potatoes +minecraft:potion +minecraft:pumpkin +minecraft:pumpkin_pie +minecraft:pumpkin_seeds +minecraft:quartz +minecraft:quartz_block +minecraft:quartz_ore +minecraft:quartz_stairs +minecraft:rail +minecraft:record_11 +minecraft:record_13 +minecraft:record_blocks +minecraft:record_cat +minecraft:record_chirp +minecraft:record_far +minecraft:record_mall +minecraft:record_mellohi +minecraft:record_stal +minecraft:record_strad +minecraft:record_wait +minecraft:record_ward +minecraft:red_flower +minecraft:red_mushroom +minecraft:red_mushroom_block +minecraft:redstone +minecraft:redstone_block +minecraft:redstone_lamp +minecraft:redstone_ore +minecraft:redstone_torch +minecraft:reeds +minecraft:repeater +minecraft:rotten_flesh +minecraft:saddle +minecraft:sand +minecraft:sandstone +minecraft:sandstone_stairs +minecraft:sapling +minecraft:shears +minecraft:sign +minecraft:skull +minecraft:slime_ball +minecraft:snow +minecraft:snow_layer +minecraft:snowball +minecraft:soul_sand +minecraft:spawn_egg +minecraft:speckled_melon +minecraft:spider_eye +minecraft:sponge +minecraft:spruce_stairs +minecraft:stained_glass +minecraft:stained_glass_pane +minecraft:stained_hardened_clay +minecraft:stick +minecraft:sticky_piston +minecraft:stone +minecraft:stone_axe +minecraft:stone_brick_stairs +minecraft:stone_button +minecraft:stone_hoe +minecraft:stone_pickaxe +minecraft:stone_pressure_plate +minecraft:stone_shovel +minecraft:stone_slab +minecraft:stone_stairs +minecraft:stone_sword +minecraft:stonebrick +minecraft:string +minecraft:sugar +minecraft:tallgrass +minecraft:tnt +minecraft:tnt_minecart +minecraft:torch +minecraft:trapdoor +minecraft:trapped_chest +minecraft:tripwire_hook +minecraft:vine +minecraft:water +minecraft:water_bucket +minecraft:waterlily +minecraft:web +minecraft:wheat +minecraft:wheat_seeds +minecraft:wooden_axe +minecraft:wooden_button +minecraft:wooden_door +minecraft:wooden_hoe +minecraft:wooden_pickaxe +minecraft:wooden_pressure_plate +minecraft:wooden_shovel +minecraft:wooden_slab +minecraft:wooden_sword +minecraft:wool +minecraft:writable_book +minecraft:written_book +minecraft:yellow_flower \ No newline at end of file diff --git a/src/test/names_internal.txt b/src/test/names_internal.txt new file mode 100644 index 0000000..658bd0f --- /dev/null +++ b/src/test/names_internal.txt @@ -0,0 +1,1629 @@ + +minecraft + + leather_boots + Name: minecraft:leather_boots + water_bucket + Name: minecraft:water_bucket + chainmail_helmet + Name: minecraft:chainmail_helmet + pumpkin_seeds + Name: minecraft:pumpkin_seeds + egg + Name: minecraft:egg + birch_stairs + Name: minecraft:birch_stairs + beef + Name: minecraft:beef + baked_potato + Name: minecraft:baked_potato + mossy_cobblestone + Name: minecraft:mossy_cobblestone + nether_brick_fence + Name: minecraft:nether_brick_fence + diamond_ore + Name: minecraft:diamond_ore + cake + Name: minecraft:cake + slime_ball + Name: minecraft:slime_ball + fire + Name: minecraft:fire + stick + Name: minecraft:stick + stained_glass_pane + Name: minecraft:stained_glass_pane + hardened_clay + Name: minecraft:hardened_clay + dragon_egg + Name: minecraft:dragon_egg + diamond_boots + Name: minecraft:diamond_boots + leaves2 + Name: minecraft:leaves2 + packed_ice + Name: minecraft:packed_ice + record_wait + Name: minecraft:record_wait + waterlily + Name: minecraft:waterlily + enchanting_table + Name: minecraft:enchanting_table + wooden_sword + Name: minecraft:wooden_sword + gunpowder + Name: minecraft:gunpowder + nether_brick + Name: minecraft:nether_brick + cocoa + Name: minecraft:cocoa + flowing_lava + Name: minecraft:flowing_lava + bucket + Name: minecraft:bucket + lapis_ore + Name: minecraft:lapis_ore + gold_block + Name: minecraft:gold_block + writable_book + Name: minecraft:writable_book + trapdoor + Name: minecraft:trapdoor + golden_helmet + Name: minecraft:golden_helmet + redstone + Name: minecraft:redstone + stone_axe + Name: minecraft:stone_axe + sponge + Name: minecraft:sponge + ender_eye + Name: minecraft:ender_eye + daylight_detector + Name: minecraft:daylight_detector + milk_bucket + Name: minecraft:milk_bucket + deadbush + Name: minecraft:deadbush + stone_sword + Name: minecraft:stone_sword + chest_minecart + Name: minecraft:chest_minecart + clay + Name: minecraft:clay + stone_brick_stairs + Name: minecraft:stone_brick_stairs + diamond_leggings + Name: minecraft:diamond_leggings + iron_boots + Name: minecraft:iron_boots + end_stone + Name: minecraft:end_stone + grass + Name: minecraft:grass + diamond_helmet + Name: minecraft:diamond_helmet + cactus + Name: minecraft:cactus + quartz_block + Name: minecraft:quartz_block + netherbrick + Name: minecraft:netherbrick + diamond_chestplate + Name: minecraft:diamond_chestplate + carrots + Name: minecraft:carrots + wheat + Name: minecraft:wheat + name_tag + Name: minecraft:name_tag + double_stone_slab + Name: minecraft:double_stone_slab + stone_pickaxe + Name: minecraft:stone_pickaxe + iron_helmet + Name: minecraft:iron_helmet + quartz_ore + Name: minecraft:quartz_ore + wooden_hoe + Name: minecraft:wooden_hoe + golden_axe + Name: minecraft:golden_axe + piston + Name: minecraft:piston + cobblestone_wall + Name: minecraft:cobblestone_wall + iron_leggings + Name: minecraft:iron_leggings + chainmail_chestplate + Name: minecraft:chainmail_chestplate + ender_chest + Name: minecraft:ender_chest + speckled_melon + Name: minecraft:speckled_melon + dye + Name: minecraft:dye + red_mushroom_block + Name: minecraft:red_mushroom_block + fish + Name: minecraft:fish + record_mellohi + Name: minecraft:record_mellohi + melon_block + Name: minecraft:melon_block + command_block_minecart + Name: minecraft:command_block_minecart + repeater + Name: minecraft:repeater + bed + Name: minecraft:bed + cooked_porkchop + Name: minecraft:cooked_porkchop + mycelium + Name: minecraft:mycelium + wool + Name: minecraft:wool + saddle + Name: minecraft:saddle + furnace + Name: minecraft:furnace + redstone_ore + Name: minecraft:redstone_ore + red_flower + Name: minecraft:red_flower + spawn_egg + Name: minecraft:spawn_egg + cooked_beef + Name: minecraft:cooked_beef + ice + Name: minecraft:ice + hay_block + Name: minecraft:hay_block + dark_oak_stairs + Name: minecraft:dark_oak_stairs + stone_slab + Name: minecraft:stone_slab + farmland + Name: minecraft:farmland + iron_axe + Name: minecraft:iron_axe + blaze_rod + Name: minecraft:blaze_rod + leaves + Name: minecraft:leaves + gold_ingot + Name: minecraft:gold_ingot + nether_wart + Name: minecraft:nether_wart + stone_button + Name: minecraft:stone_button + melon + Name: minecraft:melon + stone_pressure_plate + Name: minecraft:stone_pressure_plate + iron_bars + Name: minecraft:iron_bars + wooden_button + Name: minecraft:wooden_button + wheat_seeds + Name: minecraft:wheat_seeds + stone_shovel + Name: minecraft:stone_shovel + glass + Name: minecraft:glass + chest + Name: minecraft:chest + obsidian + Name: minecraft:obsidian + stone_stairs + Name: minecraft:stone_stairs + wooden_pressure_plate + Name: minecraft:wooden_pressure_plate + sticky_piston + Name: minecraft:sticky_piston + furnace_minecart + Name: minecraft:furnace_minecart + end_portal_frame + Name: minecraft:end_portal_frame + diamond_sword + Name: minecraft:diamond_sword + cooked_fished + Name: minecraft:cooked_fished + sand + Name: minecraft:sand + golden_hoe + Name: minecraft:golden_hoe + cooked_chicken + Name: minecraft:cooked_chicken + beacon + Name: minecraft:beacon + diamond_horse_armor + Name: minecraft:diamond_horse_armor + glowstone_dust + Name: minecraft:glowstone_dust + leather_leggings + Name: minecraft:leather_leggings + mushroom_stew + Name: minecraft:mushroom_stew + carpet + Name: minecraft:carpet + flint + Name: minecraft:flint + emerald + Name: minecraft:emerald + potatoes + Name: minecraft:potatoes + string + Name: minecraft:string + book + Name: minecraft:book + wooden_shovel + Name: minecraft:wooden_shovel + jukebox + Name: minecraft:jukebox + dispenser + Name: minecraft:dispenser + apple + Name: minecraft:apple + spider_eye + Name: minecraft:spider_eye + lava + Name: minecraft:lava + reeds + Name: minecraft:reeds + golden_boots + Name: minecraft:golden_boots + redstone_lamp + Name: minecraft:redstone_lamp + diamond_axe + Name: minecraft:diamond_axe + pumpkin_pie + Name: minecraft:pumpkin_pie + coal_block + Name: minecraft:coal_block + stained_hardened_clay + Name: minecraft:stained_hardened_clay + heavy_weighted_pressure_plate + Name: minecraft:heavy_weighted_pressure_plate + potion + Name: minecraft:potion + gold_nugget + Name: minecraft:gold_nugget + double_plant + Name: minecraft:double_plant + record_strad + Name: minecraft:record_strad + crafting_table + Name: minecraft:crafting_table + wooden_pickaxe + Name: minecraft:wooden_pickaxe + brown_mushroom_block + Name: minecraft:brown_mushroom_block + flower_pot + Name: minecraft:flower_pot + diamond_pickaxe + Name: minecraft:diamond_pickaxe + diamond_block + Name: minecraft:diamond_block + bone + Name: minecraft:bone + golden_carrot + Name: minecraft:golden_carrot + stone + Name: minecraft:stone + magma_cream + Name: minecraft:magma_cream + cauldron + Name: minecraft:cauldron + melon_seeds + Name: minecraft:melon_seeds + wooden_slab + Name: minecraft:wooden_slab + feather + Name: minecraft:feather + lit_pumpkin + Name: minecraft:lit_pumpkin + acacia_stairs + Name: minecraft:acacia_stairs + soul_sand + Name: minecraft:soul_sand + dropper + Name: minecraft:dropper + iron_chestplate + Name: minecraft:iron_chestplate + fire_charge + Name: minecraft:fire_charge + diamond_shovel + Name: minecraft:diamond_shovel + glowstone + Name: minecraft:glowstone + sandstone_stairs + Name: minecraft:sandstone_stairs + golden_horse_armor + Name: minecraft:golden_horse_armor + experience_bottle + Name: minecraft:experience_bottle + iron_sword + Name: minecraft:iron_sword + portal + Name: minecraft:portal + golden_leggings + Name: minecraft:golden_leggings + cookie + Name: minecraft:cookie + bookshelf + Name: minecraft:bookshelf + record_chirp + Name: minecraft:record_chirp + record_ward + Name: minecraft:record_ward + leather + Name: minecraft:leather + gravel + Name: minecraft:gravel + minecart + Name: minecraft:minecart + nether_brick_stairs + Name: minecraft:nether_brick_stairs + command_block + Name: minecraft:command_block + jungle_stairs + Name: minecraft:jungle_stairs + record_cat + Name: minecraft:record_cat + flint_and_steel + Name: minecraft:flint_and_steel + tnt + Name: minecraft:tnt + snowball + Name: minecraft:snowball + mob_spawner + Name: minecraft:mob_spawner + carrot_on_a_stick + Name: minecraft:carrot_on_a_stick + detector_rail + Name: minecraft:detector_rail + glass_bottle + Name: minecraft:glass_bottle + log + Name: minecraft:log + anvil + Name: minecraft:anvil + leather_chestplate + Name: minecraft:leather_chestplate + fireworks + Name: minecraft:fireworks + sandstone + Name: minecraft:sandstone + iron_ingot + Name: minecraft:iron_ingot + nether_star + Name: minecraft:nether_star + oak_stairs + Name: minecraft:oak_stairs + bedrock + Name: minecraft:bedrock + web + Name: minecraft:web + potato + Name: minecraft:potato + ender_pearl + Name: minecraft:ender_pearl + brick_block + Name: minecraft:brick_block + poisonous_potato + Name: minecraft:poisonous_potato + log2 + Name: minecraft:log2 + map + Name: minecraft:map + lava_bucket + Name: minecraft:lava_bucket + golden_apple + Name: minecraft:golden_apple + bread + Name: minecraft:bread + rotten_flesh + Name: minecraft:rotten_flesh + emerald_block + Name: minecraft:emerald_block + end_portal + Name: minecraft:end_portal + stained_glass + Name: minecraft:stained_glass + chainmail_leggings + Name: minecraft:chainmail_leggings + tnt_minecart + Name: minecraft:tnt_minecart + double_wooden_slab + Name: minecraft:double_wooden_slab + torch + Name: minecraft:torch + iron_ore + Name: minecraft:iron_ore + boat + Name: minecraft:boat + lead + Name: minecraft:lead + lapis_block + Name: minecraft:lapis_block + stone_hoe + Name: minecraft:stone_hoe + planks + Name: minecraft:planks + blaze_powder + Name: minecraft:blaze_powder + iron_shovel + Name: minecraft:iron_shovel + comparator + Name: minecraft:comparator + firework_charge + Name: minecraft:firework_charge + stonebrick + Name: minecraft:stonebrick + golden_sword + Name: minecraft:golden_sword + filled_map + Name: minecraft:filled_map + arrow + Name: minecraft:arrow + clay_ball + Name: minecraft:clay_ball + tallgrass + Name: minecraft:tallgrass + sign + Name: minecraft:sign + wooden_door + Name: minecraft:wooden_door + iron_block + Name: minecraft:iron_block + porkchop + Name: minecraft:porkchop + brown_mushroom + Name: minecraft:brown_mushroom + iron_door + Name: minecraft:iron_door + wooden_axe + Name: minecraft:wooden_axe + shears + Name: minecraft:shears + noteblock + Name: minecraft:noteblock + sapling + Name: minecraft:sapling + written_book + Name: minecraft:written_book + chainmail_boots + Name: minecraft:chainmail_boots + ghast_tear + Name: minecraft:ghast_tear + vine + Name: minecraft:vine + glass_pane + Name: minecraft:glass_pane + enchanted_book + Name: minecraft:enchanted_book + quartz_stairs + Name: minecraft:quartz_stairs + redstone_torch + Name: minecraft:redstone_torch + golden_rail + Name: minecraft:golden_rail + rail + Name: minecraft:rail + dirt + Name: minecraft:dirt + diamond_hoe + Name: minecraft:diamond_hoe + iron_horse_armor + Name: minecraft:iron_horse_armor + lever + Name: minecraft:lever + clock + Name: minecraft:clock + water + Name: minecraft:water + item_frame + Name: minecraft:item_frame + flowing_water + Name: minecraft:flowing_water + compass + Name: minecraft:compass + snow + Name: minecraft:snow + coal_ore + Name: minecraft:coal_ore + coal + Name: minecraft:coal + lit_furnace + Name: minecraft:lit_furnace + leather_helmet + Name: minecraft:leather_helmet + emerald_ore + Name: minecraft:emerald_ore + sugar + Name: minecraft:sugar + record_mall + Name: minecraft:record_mall + iron_hoe + Name: minecraft:iron_hoe + chicken + Name: minecraft:chicken + brick_stairs + Name: minecraft:brick_stairs + monster_egg + Name: minecraft:monster_egg + golden_pickaxe + Name: minecraft:golden_pickaxe + tripwire_hook + Name: minecraft:tripwire_hook + fence_gate + Name: minecraft:fence_gate + brewing_stand + Name: minecraft:brewing_stand + bow + Name: minecraft:bow + record_blocks + Name: minecraft:record_blocks + bowl + Name: minecraft:bowl + paper + Name: minecraft:paper + cobblestone + Name: minecraft:cobblestone + redstone_block + Name: minecraft:redstone_block + iron_pickaxe + Name: minecraft:iron_pickaxe + netherrack + Name: minecraft:netherrack + skull + Name: minecraft:skull + brick + Name: minecraft:brick + snow_layer + Name: minecraft:snow_layer + golden_chestplate + Name: minecraft:golden_chestplate + golden_shovel + Name: minecraft:golden_shovel + light_weighted_pressure_plate + Name: minecraft:light_weighted_pressure_plate + fishing_rod + Name: minecraft:fishing_rod + spruce_stairs + Name: minecraft:spruce_stairs + activator_rail + Name: minecraft:activator_rail + gold_ore + Name: minecraft:gold_ore + record_13 + Name: minecraft:record_13 + quartz + Name: minecraft:quartz + fermented_spider_eye + Name: minecraft:fermented_spider_eye + hopper_minecart + Name: minecraft:hopper_minecart + yellow_flower + Name: minecraft:yellow_flower + diamond + Name: minecraft:diamond + ladder + Name: minecraft:ladder + painting + Name: minecraft:painting + record_11 + Name: minecraft:record_11 + red_mushroom + Name: minecraft:red_mushroom + record_far + Name: minecraft:record_far + record_stal + Name: minecraft:record_stal + hopper + Name: minecraft:hopper + pumpkin + Name: minecraft:pumpkin + fence + Name: minecraft:fence + trapped_chest + Name: minecraft:trapped_chest + carrot + Name: minecraft:carrot +projred + + core + + projectred + + core + + datacard + Name: ProjRed|Core:projectred.core.datacard + part + Name: ProjRed|Core:projectred.core.part + drawplate + Name: ProjRed|Core:projectred.core.drawplate + screwdriver + Name: ProjRed|Core:projectred.core.screwdriver + wiredebugger + Name: ProjRed|Core:projectred.core.wiredebugger + exploration + + projectred + + exploration + + stonewalls + Name: ProjRed|Exploration:projectred.exploration.stonewalls + peridothelmet + Name: ProjRed|Exploration:projectred.exploration.peridothelmet + sapphireboots + Name: ProjRed|Exploration:projectred.exploration.sapphireboots + axeperidot + Name: ProjRed|Exploration:projectred.exploration.axeperidot + peridotboots + Name: ProjRed|Exploration:projectred.exploration.peridotboots + sapphireleggings + Name: ProjRed|Exploration:projectred.exploration.sapphireleggings + woolgin + Name: ProjRed|Exploration:projectred.exploration.woolgin + sicklediamond + Name: ProjRed|Exploration:projectred.exploration.sicklediamond + rubychestplate + Name: ProjRed|Exploration:projectred.exploration.rubychestplate + shovelperidot + Name: ProjRed|Exploration:projectred.exploration.shovelperidot + rubyleggings + Name: ProjRed|Exploration:projectred.exploration.rubyleggings + sicklewood + Name: ProjRed|Exploration:projectred.exploration.sicklewood + sickleiron + Name: ProjRed|Exploration:projectred.exploration.sickleiron + sawsapphire + Name: ProjRed|Exploration:projectred.exploration.sawsapphire + swordsapphire + Name: ProjRed|Exploration:projectred.exploration.swordsapphire + sickleperidot + Name: ProjRed|Exploration:projectred.exploration.sickleperidot + pickaxesapphire + Name: ProjRed|Exploration:projectred.exploration.pickaxesapphire + athame + Name: ProjRed|Exploration:projectred.exploration.athame + hoesapphire + Name: ProjRed|Exploration:projectred.exploration.hoesapphire + peridotleggings + Name: ProjRed|Exploration:projectred.exploration.peridotleggings + sapphirechestplate + Name: ProjRed|Exploration:projectred.exploration.sapphirechestplate + barrel + Name: ProjRed|Exploration:projectred.exploration.barrel + axesapphire + Name: ProjRed|Exploration:projectred.exploration.axesapphire + ore + Name: ProjRed|Exploration:projectred.exploration.ore + sapphirehelmet + Name: ProjRed|Exploration:projectred.exploration.sapphirehelmet + shovelsapphire + Name: ProjRed|Exploration:projectred.exploration.shovelsapphire + pickaxeperidot + Name: ProjRed|Exploration:projectred.exploration.pickaxeperidot + swordruby + Name: ProjRed|Exploration:projectred.exploration.swordruby + lilyseed + Name: ProjRed|Exploration:projectred.exploration.lilyseed + pickaxeruby + Name: ProjRed|Exploration:projectred.exploration.pickaxeruby + axeruby + Name: ProjRed|Exploration:projectred.exploration.axeruby + swordperidot + Name: ProjRed|Exploration:projectred.exploration.swordperidot + hoeruby + Name: ProjRed|Exploration:projectred.exploration.hoeruby + stone + Name: ProjRed|Exploration:projectred.exploration.stone + shovelruby + Name: ProjRed|Exploration:projectred.exploration.shovelruby + peridotchestplate + Name: ProjRed|Exploration:projectred.exploration.peridotchestplate + sawperidot + Name: ProjRed|Exploration:projectred.exploration.sawperidot + sawruby + Name: ProjRed|Exploration:projectred.exploration.sawruby + backpack + Name: ProjRed|Exploration:projectred.exploration.backpack + sicklesapphire + Name: ProjRed|Exploration:projectred.exploration.sicklesapphire + lily + Name: ProjRed|Exploration:projectred.exploration.lily + sawgold + Name: ProjRed|Exploration:projectred.exploration.sawgold + sicklestone + Name: ProjRed|Exploration:projectred.exploration.sicklestone + hoeperidot + Name: ProjRed|Exploration:projectred.exploration.hoeperidot + rubyhelmet + Name: ProjRed|Exploration:projectred.exploration.rubyhelmet + sicklegold + Name: ProjRed|Exploration:projectred.exploration.sicklegold + rubyboots + Name: ProjRed|Exploration:projectred.exploration.rubyboots + sickleruby + Name: ProjRed|Exploration:projectred.exploration.sickleruby + transmission + + projectred + + transmission + + wire + Name: ProjRed|Transmission:projectred.transmission.wire + framewire + Name: ProjRed|Transmission:projectred.transmission.framewire + illumination + + projectred + + illumination + + fixture + Name: ProjRed|Illumination:projectred.illumination.fixture + + inv + Name: ProjRed|Illumination:projectred.illumination.fixture.inv + cagelamp + Name: ProjRed|Illumination:projectred.illumination.cagelamp + + inv + Name: ProjRed|Illumination:projectred.illumination.cagelamp.inv + flightbutton + Name: ProjRed|Illumination:projectred.illumination.flightbutton + lamp + Name: ProjRed|Illumination:projectred.illumination.lamp + lightbutton + Name: ProjRed|Illumination:projectred.illumination.lightbutton + lantern + Name: ProjRed|Illumination:projectred.illumination.lantern + + inv + Name: ProjRed|Illumination:projectred.illumination.lantern.inv + cagelamp2 + Name: ProjRed|Illumination:projectred.illumination.cagelamp2 + + inv + Name: ProjRed|Illumination:projectred.illumination.cagelamp2.inv + airouslight + Name: ProjRed|Illumination:projectred.illumination.airousLight + fabrication + + projectred + + fabrication + + icchip + Name: ProjRed|Fabrication:projectred.fabrication.icchip + icblueprint + Name: ProjRed|Fabrication:projectred.fabrication.icblueprint + integration + + icblock + Name: ProjRed|Fabrication:projectred.integration.icblock + integration + + projectred + + integration + + gate + Name: ProjRed|Integration:projectred.integration.gate + expansion + + projectred + + expansion + + infused_ender_pearl + Name: ProjRed|Expansion:projectred.expansion.infused_ender_pearl + electric_screwdriver + Name: ProjRed|Expansion:projectred.expansion.electric_screwdriver + jetpack + Name: ProjRed|Expansion:projectred.expansion.jetpack + solar_panel + Name: ProjRed|Expansion:projectred.expansion.solar_panel + emptybattery + Name: ProjRed|Expansion:projectred.expansion.emptybattery + machine2 + Name: ProjRed|Expansion:projectred.expansion.machine2 + battery + Name: ProjRed|Expansion:projectred.expansion.battery + machine1 + Name: ProjRed|Expansion:projectred.expansion.machine1 + plan + Name: ProjRed|Expansion:projectred.expansion.plan + transportation + + projectred + + transportation + + routerutil + Name: ProjRed|Transportation:projectred.transportation.routerutil + pipe + Name: ProjRed|Transportation:projectred.transportation.pipe + routingchip + Name: ProjRed|Transportation:projectred.transportation.routingchip +forgemicroblock + + sawiron + Name: ForgeMicroblock:sawIron + sawstone + Name: ForgeMicroblock:sawStone + stonerod + Name: ForgeMicroblock:stoneRod + sawdiamond + Name: ForgeMicroblock:sawDiamond + microblock + Name: ForgeMicroblock:microblock +extrautilities + + conveyor + Name: ExtraUtilities:conveyor + trashcan + Name: ExtraUtilities:trashcan + budoff + Name: ExtraUtilities:budoff + color_blockredstone + Name: ExtraUtilities:color_blockRedstone + chestfull + Name: ExtraUtilities:chestFull + glove + Name: ExtraUtilities:glove + block_bedrockium + Name: ExtraUtilities:block_bedrockium + drum + Name: ExtraUtilities:drum + bedrockiumingot + Name: ExtraUtilities:bedrockiumIngot + color_hellsand + Name: ExtraUtilities:color_hellsand + shears + Name: ExtraUtilities:shears + scanner + Name: ExtraUtilities:scanner + divisionsigil + Name: ExtraUtilities:divisionSigil + golden_lasso + Name: ExtraUtilities:golden_lasso + trading_post + Name: ExtraUtilities:trading_post + spike_base_diamond + Name: ExtraUtilities:spike_base_diamond + endercollector + Name: ExtraUtilities:enderCollector + angelblock + Name: ExtraUtilities:angelBlock + color_redstonelight + Name: ExtraUtilities:color_redstoneLight + enderquarryupgrade + Name: ExtraUtilities:enderQuarryUpgrade + colorwoodplanks + Name: ExtraUtilities:colorWoodPlanks + defoliageaxe + Name: ExtraUtilities:defoliageAxe + spike_base + Name: ExtraUtilities:spike_base + spike_base_wood + Name: ExtraUtilities:spike_base_wood + creativebuilderswand + Name: ExtraUtilities:creativebuilderswand + color_blocklapis + Name: ExtraUtilities:color_blockLapis + filing + Name: ExtraUtilities:filing + colorstonebrick + Name: ExtraUtilities:colorStoneBrick + color_stonebrick + Name: ExtraUtilities:color_stonebrick + color_quartzblock + Name: ExtraUtilities:color_quartzBlock + plant + + ender_lilly + Name: ExtraUtilities:plant/ender_lilly + watering_can + Name: ExtraUtilities:watering_can + color_blockcoal + Name: ExtraUtilities:color_blockCoal + sonar_goggles + Name: ExtraUtilities:sonar_goggles + microblocks + Name: ExtraUtilities:microblocks + erosionshovel + Name: ExtraUtilities:erosionShovel + endconstructor + Name: ExtraUtilities:endConstructor + color_lightgem + Name: ExtraUtilities:color_lightgem + sound_muffler + Name: ExtraUtilities:sound_muffler + nodeupgrade + Name: ExtraUtilities:nodeUpgrade + chestmini + Name: ExtraUtilities:chestMini + lawsword + Name: ExtraUtilities:lawSword + curtains + Name: ExtraUtilities:curtains + magnumtorch + Name: ExtraUtilities:magnumTorch + generator + Name: ExtraUtilities:generator + + 8 + Name: ExtraUtilities:generator.8 + 64 + Name: ExtraUtilities:generator.64 + greenscreen + Name: ExtraUtilities:greenscreen + cursedearthside + Name: ExtraUtilities:cursedearthside + timer + Name: ExtraUtilities:timer + extractor_base + Name: ExtraUtilities:extractor_base + builderswand + Name: ExtraUtilities:builderswand + datablock + Name: ExtraUtilities:datablock + destructionpickaxe + Name: ExtraUtilities:destructionpickaxe + spike_base_gold + Name: ExtraUtilities:spike_base_gold + pipes + Name: ExtraUtilities:pipes + + 1 + Name: ExtraUtilities:pipes.1 + angelring + Name: ExtraUtilities:angelRing + ethericsword + Name: ExtraUtilities:ethericsword + cobblestone_compressed + Name: ExtraUtilities:cobblestone_compressed + unstableingot + Name: ExtraUtilities:unstableingot + color_brick + Name: ExtraUtilities:color_brick + peaceful_table_top + Name: ExtraUtilities:peaceful_table_top + chandelier + Name: ExtraUtilities:chandelier + mini + + soul + Name: ExtraUtilities:mini-soul + extractor_base_remote + Name: ExtraUtilities:extractor_base_remote + golden_bag + Name: ExtraUtilities:golden_bag + endmarker + Name: ExtraUtilities:endMarker + purelove + Name: ExtraUtilities:pureLove + color_stone + Name: ExtraUtilities:color_stone + dark_portal + Name: ExtraUtilities:dark_portal + heatingelement + Name: ExtraUtilities:heatingElement + color_obsidian + Name: ExtraUtilities:color_obsidian + enderquarry + Name: ExtraUtilities:enderQuarry + decorativeblock2 + Name: ExtraUtilities:decorativeBlock2 + decorativeblock1 + Name: ExtraUtilities:decorativeBlock1 + paintbrush + Name: ExtraUtilities:paintbrush + enderthermicpump + Name: ExtraUtilities:enderThermicPump + etherealglass + Name: ExtraUtilities:etherealglass + temporalhoe + Name: ExtraUtilities:temporalHoe +mcframes + + mcframes + + motor + Name: MCFrames:mcframes.motor + frame + Name: MCFrames:mcframes.frame +forgerelocation + + relocation + + blockmovingrow + Name: ForgeRelocation:relocation.blockmovingrow +openblocks + + paintcan + Name: OpenBlocks:paintcan + tastyclay + Name: OpenBlocks:tastyClay + cannon + Name: OpenBlocks:cannon + village_highlighter + Name: OpenBlocks:village_highlighter + drawingtable + Name: OpenBlocks:drawingtable + xpshower + Name: OpenBlocks:xpshower + heightmap + Name: OpenBlocks:heightMap + path + Name: OpenBlocks:path + fan + Name: OpenBlocks:fan + elevator + Name: OpenBlocks:elevator + projector + Name: OpenBlocks:projector + luggage + Name: OpenBlocks:luggage + paintmixer + Name: OpenBlocks:paintmixer + pedometer + Name: OpenBlocks:pedometer + stencil + Name: OpenBlocks:stencil + squeegee + Name: OpenBlocks:squeegee + ropeladder + Name: OpenBlocks:ropeladder + guide + Name: OpenBlocks:guide + sky + Name: OpenBlocks:sky + canvas + Name: OpenBlocks:canvas + scaffolding + Name: OpenBlocks:scaffolding + bigbutton + Name: OpenBlocks:bigbutton + spongeonastick + Name: OpenBlocks:spongeonastick + cartographer + Name: OpenBlocks:cartographer + autoenchantmenttable + Name: OpenBlocks:autoenchantmenttable + wrench + Name: OpenBlocks:wrench + infobook + Name: OpenBlocks:infoBook + goldeneye + Name: OpenBlocks:goldenEye + cursor + Name: OpenBlocks:cursor + technicolorglasses + Name: OpenBlocks:technicolorGlasses + xpdrain + Name: OpenBlocks:xpdrain + sponge + Name: OpenBlocks:sponge + filledbucket + Name: OpenBlocks:filledbucket + flag + Name: OpenBlocks:flag + slimalyzer + Name: OpenBlocks:slimalyzer + xpbottler + Name: OpenBlocks:xpbottler + epiceraser + Name: OpenBlocks:epicEraser + sleepingbag + Name: OpenBlocks:sleepingBag + hangglider + Name: OpenBlocks:hangglider + elevator_rotating + Name: OpenBlocks:elevator_rotating + heal + Name: OpenBlocks:heal + blockplacer + Name: OpenBlocks:blockPlacer + vacuumhopper + Name: OpenBlocks:vacuumhopper + sonicglasses + Name: OpenBlocks:sonicglasses + trophy + Name: OpenBlocks:trophy + tank + Name: OpenBlocks:tank + sprinkler + Name: OpenBlocks:sprinkler + cranecontrol + Name: OpenBlocks:craneControl + builder_guide + Name: OpenBlocks:builder_guide + pencilglasses + Name: OpenBlocks:pencilGlasses + autoanvil + Name: OpenBlocks:autoanvil + grave + Name: OpenBlocks:grave + itemdropper + Name: OpenBlocks:itemDropper + devnull + Name: OpenBlocks:devnull + crayonglasses + Name: OpenBlocks:crayonGlasses + beartrap + Name: OpenBlocks:beartrap + canvasglass + Name: OpenBlocks:canvasglass + generic + Name: OpenBlocks:generic + blockbreaker + Name: OpenBlocks:blockbreaker + target + Name: OpenBlocks:target + goldenegg + Name: OpenBlocks:goldenegg + ladder + Name: OpenBlocks:ladder + genericunstackable + Name: OpenBlocks:genericUnstackable + donationstation + Name: OpenBlocks:donationStation + imaginary + Name: OpenBlocks:imaginary + emptymap + Name: OpenBlocks:emptyMap + paintbrush + Name: OpenBlocks:paintBrush + seriousglasses + Name: OpenBlocks:seriousGlasses + cranebackpack + Name: OpenBlocks:craneBackpack +appliedenergistics2 + + item + + toolnetherquartzpickaxe + Name: appliedenergistics2:item.ToolNetherQuartzPickaxe + toolnetherquartzcuttingknife + Name: appliedenergistics2:item.ToolNetherQuartzCuttingKnife + toolmemorycard + Name: appliedenergistics2:item.ToolMemoryCard + toolnetherquartzaxe + Name: appliedenergistics2:item.ToolNetherQuartzAxe + toolentropymanipulator + Name: appliedenergistics2:item.ToolEntropyManipulator + itemmultimaterial + Name: appliedenergistics2:item.ItemMultiMaterial + itemcrystalseed + Name: appliedenergistics2:item.ItemCrystalSeed + toolbiometriccard + Name: appliedenergistics2:item.ToolBiometricCard + toolwirelessterminal + Name: appliedenergistics2:item.ToolWirelessTerminal + toolnetworktool + Name: appliedenergistics2:item.ToolNetworkTool + toolportablecell + Name: appliedenergistics2:item.ToolPortableCell + itempaintball + Name: appliedenergistics2:item.ItemPaintBall + toolnetherquartzsword + Name: appliedenergistics2:item.ToolNetherQuartzSword + toolcertusquartzspade + Name: appliedenergistics2:item.ToolCertusQuartzSpade + toolmasscannon + Name: appliedenergistics2:item.ToolMassCannon + toolcertusquartzwrench + Name: appliedenergistics2:item.ToolCertusQuartzWrench + toolcertusquartzpickaxe + Name: appliedenergistics2:item.ToolCertusQuartzPickaxe + toolcolorapplicator + Name: appliedenergistics2:item.ToolColorApplicator + itemmultipart + Name: appliedenergistics2:item.ItemMultiPart + toolcertusquartzaxe + Name: appliedenergistics2:item.ToolCertusQuartzAxe + toolcertusquartzsword + Name: appliedenergistics2:item.ToolCertusQuartzSword + toolnetherquartzwrench + Name: appliedenergistics2:item.ToolNetherQuartzWrench + itemviewcell + Name: appliedenergistics2:item.ItemViewCell + toolcertusquartzhoe + Name: appliedenergistics2:item.ToolCertusQuartzHoe + toolcertusquartzcuttingknife + Name: appliedenergistics2:item.ToolCertusQuartzCuttingKnife + itembasicstoragecell + + 16k + Name: appliedenergistics2:item.ItemBasicStorageCell.16k + 4k + Name: appliedenergistics2:item.ItemBasicStorageCell.4k + 1k + Name: appliedenergistics2:item.ItemBasicStorageCell.1k + 64k + Name: appliedenergistics2:item.ItemBasicStorageCell.64k + toolnetherquartzhoe + Name: appliedenergistics2:item.ToolNetherQuartzHoe + itemspatialstoragecell + + 2cubed + Name: appliedenergistics2:item.ItemSpatialStorageCell.2Cubed + 128cubed + Name: appliedenergistics2:item.ItemSpatialStorageCell.128Cubed + 16cubed + Name: appliedenergistics2:item.ItemSpatialStorageCell.16Cubed + itemencodedpattern + Name: appliedenergistics2:item.ItemEncodedPattern + toolchargedstaff + Name: appliedenergistics2:item.ToolChargedStaff + toolnetherquartzspade + Name: appliedenergistics2:item.ToolNetherQuartzSpade + itemcreativestoragecell + Name: appliedenergistics2:item.ItemCreativeStorageCell + itemfacade + Name: appliedenergistics2:item.ItemFacade + tile + + blockquartzglass + Name: appliedenergistics2:tile.BlockQuartzGlass + blockinterface + Name: appliedenergistics2:tile.BlockInterface + skystonestairblock + Name: appliedenergistics2:tile.SkyStoneStairBlock + blockwireless + Name: appliedenergistics2:tile.BlockWireless + blockinscriber + Name: appliedenergistics2:tile.BlockInscriber + blockcondenser + Name: appliedenergistics2:tile.BlockCondenser + fluixstairblock + Name: appliedenergistics2:tile.FluixStairBlock + blockquartzchiseled + Name: appliedenergistics2:tile.BlockQuartzChiseled + blockcraftingmonitor + Name: appliedenergistics2:tile.BlockCraftingMonitor + blockgrinder + Name: appliedenergistics2:tile.BlockGrinder + blocksecurity + Name: appliedenergistics2:tile.BlockSecurity + blockcellworkbench + Name: appliedenergistics2:tile.BlockCellWorkbench + blockquartz + Name: appliedenergistics2:tile.BlockQuartz + blockmolecularassembler + Name: appliedenergistics2:tile.BlockMolecularAssembler + blockmatrixframe + Name: appliedenergistics2:tile.BlockMatrixFrame + blockspatialpylon + Name: appliedenergistics2:tile.BlockSpatialPylon + skystoneslabblock + Name: appliedenergistics2:tile.SkyStoneSlabBlock + + double + Name: appliedenergistics2:tile.SkyStoneSlabBlock.double + orequartzcharged + Name: appliedenergistics2:tile.OreQuartzCharged + blocklightdetector + Name: appliedenergistics2:tile.BlockLightDetector + skystoneblockslabblock + Name: appliedenergistics2:tile.SkyStoneBlockSlabBlock + + double + Name: appliedenergistics2:tile.SkyStoneBlockSlabBlock.double + fluixslabblock + Name: appliedenergistics2:tile.FluixSlabBlock + + double + Name: appliedenergistics2:tile.FluixSlabBlock.double + skystonesmallbrickslabblock + Name: appliedenergistics2:tile.SkyStoneSmallBrickSlabBlock + + double + Name: appliedenergistics2:tile.SkyStoneSmallBrickSlabBlock.double + blockquartzgrowthaccelerator + Name: appliedenergistics2:tile.BlockQuartzGrowthAccelerator + blockenergycell + Name: appliedenergistics2:tile.BlockEnergyCell + quartzslabblock + Name: appliedenergistics2:tile.QuartzSlabBlock + + double + Name: appliedenergistics2:tile.QuartzSlabBlock.double + blocktinytnt + Name: appliedenergistics2:tile.BlockTinyTNT + blockcraftingunit + Name: appliedenergistics2:tile.BlockCraftingUnit + blockdenseenergycell + Name: appliedenergistics2:tile.BlockDenseEnergyCell + blockcablebus + Name: appliedenergistics2:tile.BlockCableBus + blockquartzpillar + Name: appliedenergistics2:tile.BlockQuartzPillar + skystonebrickslabblock + Name: appliedenergistics2:tile.SkyStoneBrickSlabBlock + + double + Name: appliedenergistics2:tile.SkyStoneBrickSlabBlock.double + blockcrank + Name: appliedenergistics2:tile.BlockCrank + orequartz + Name: appliedenergistics2:tile.OreQuartz + blockskychest + Name: appliedenergistics2:tile.BlockSkyChest + blockskycompass + Name: appliedenergistics2:tile.BlockSkyCompass + chiseledquartzstairblock + Name: appliedenergistics2:tile.ChiseledQuartzStairBlock + blockcontroller + Name: appliedenergistics2:tile.BlockController + blockquartzlamp + Name: appliedenergistics2:tile.BlockQuartzLamp + skystonebrickstairblock + Name: appliedenergistics2:tile.SkyStoneBrickStairBlock + quartzstairblock + Name: appliedenergistics2:tile.QuartzStairBlock + blockquartztorch + Name: appliedenergistics2:tile.BlockQuartzTorch + blockskystone + Name: appliedenergistics2:tile.BlockSkyStone + blockcreativeenergycell + Name: appliedenergistics2:tile.BlockCreativeEnergyCell + blockpaint + Name: appliedenergistics2:tile.BlockPaint + blockcharger + Name: appliedenergistics2:tile.BlockCharger + blockdrive + Name: appliedenergistics2:tile.BlockDrive + blockspatialioport + Name: appliedenergistics2:tile.BlockSpatialIOPort + blockchest + Name: appliedenergistics2:tile.BlockChest + blockioport + Name: appliedenergistics2:tile.BlockIOPort + blockcraftingstorage + Name: appliedenergistics2:tile.BlockCraftingStorage + quartzpillarstairblock + Name: appliedenergistics2:tile.QuartzPillarStairBlock + skystoneblockstairblock + Name: appliedenergistics2:tile.SkyStoneBlockStairBlock + chiseledquartzslabblock + Name: appliedenergistics2:tile.ChiseledQuartzSlabBlock + + double + Name: appliedenergistics2:tile.ChiseledQuartzSlabBlock.double + skystonesmallbrickstairblock + Name: appliedenergistics2:tile.SkyStoneSmallBrickStairBlock + blockenergyacceptor + Name: appliedenergistics2:tile.BlockEnergyAcceptor + quartzpillarslabblock + Name: appliedenergistics2:tile.QuartzPillarSlabBlock + + double + Name: appliedenergistics2:tile.QuartzPillarSlabBlock.double + blockvibrationchamber + Name: appliedenergistics2:tile.BlockVibrationChamber + blockquantumlinkchamber + Name: appliedenergistics2:tile.BlockQuantumLinkChamber + blockquantumring + Name: appliedenergistics2:tile.BlockQuantumRing + blockfluix + Name: appliedenergistics2:tile.BlockFluix +buildcraft + + core + + engineblock + Name: BuildCraft|Core:engineBlock + diamondgearitem + Name: BuildCraft|Core:diamondGearItem + goldgearitem + Name: BuildCraft|Core:goldGearItem + maplocation + Name: BuildCraft|Core:mapLocation + debugger + Name: BuildCraft|Core:debugger + wrenchitem + Name: BuildCraft|Core:wrenchItem + buildtoolblock + Name: BuildCraft|Core:buildToolBlock + woodengearitem + Name: BuildCraft|Core:woodenGearItem + irongearitem + Name: BuildCraft|Core:ironGearItem + list + Name: BuildCraft|Core:list + markerblock + Name: BuildCraft|Core:markerBlock + stonegearitem + Name: BuildCraft|Core:stoneGearItem + paintbrush + Name: BuildCraft|Core:paintbrush + pathmarkerblock + Name: BuildCraft|Core:pathMarkerBlock + eternalspring + Name: BuildCraft|Core:eternalSpring + factory + + floodgateblock + Name: BuildCraft|Factory:floodGateBlock + pumpblock + Name: BuildCraft|Factory:pumpBlock + tankblock + Name: BuildCraft|Factory:tankBlock + plainpipeblock + Name: BuildCraft|Factory:plainPipeBlock + miningwellblock + Name: BuildCraft|Factory:miningWellBlock + autoworkbenchblock + Name: BuildCraft|Factory:autoWorkbenchBlock + blockhopper + Name: BuildCraft|Factory:blockHopper + refineryblock + Name: BuildCraft|Factory:refineryBlock + builders + + templateitem + Name: BuildCraft|Builders:templateItem + architectblock + Name: BuildCraft|Builders:architectBlock + blueprintitem + Name: BuildCraft|Builders:blueprintItem + libraryblock + Name: BuildCraft|Builders:libraryBlock + builderblock + Name: BuildCraft|Builders:builderBlock + constructionmarkerblock + Name: BuildCraft|Builders:constructionMarkerBlock + frameblock + Name: BuildCraft|Builders:frameBlock + fillerblock + Name: BuildCraft|Builders:fillerBlock + machineblock + Name: BuildCraft|Builders:machineBlock + silicon + + package + Name: BuildCraft|Silicon:package + packagerblock + Name: BuildCraft|Silicon:packagerBlock + laserblock + Name: BuildCraft|Silicon:laserBlock + lasertableblock + Name: BuildCraft|Silicon:laserTableBlock + redstonechipset + Name: BuildCraft|Silicon:redstoneChipset + redstonecrystal + Name: BuildCraft|Silicon:redstoneCrystal + robotics + + requester + Name: BuildCraft|Robotics:requester + robot + Name: BuildCraft|Robotics:robot + robotstation + Name: BuildCraft|Robotics:robotStation + redstone_board + Name: BuildCraft|Robotics:redstone_board + zoneplan + Name: BuildCraft|Robotics:zonePlan + transport + + item + + buildcraftpipe + + pipefluidsemerald + Name: BuildCraft|Transport:item.buildcraftPipe.pipefluidsemerald + pipefluidsiron + Name: BuildCraft|Transport:item.buildcraftPipe.pipefluidsiron + pipepowersandstone + Name: BuildCraft|Transport:item.buildcraftPipe.pipepowersandstone + pipepoweremerald + Name: BuildCraft|Transport:item.buildcraftPipe.pipepoweremerald + pipefluidsvoid + Name: BuildCraft|Transport:item.buildcraftPipe.pipefluidsvoid + pipeitemswood + Name: BuildCraft|Transport:item.buildcraftPipe.pipeitemswood + pipestructurecobblestone + Name: BuildCraft|Transport:item.buildcraftPipe.pipestructurecobblestone + pipefluidssandstone + Name: BuildCraft|Transport:item.buildcraftPipe.pipefluidssandstone + pipeitemsstone + Name: BuildCraft|Transport:item.buildcraftPipe.pipeitemsstone + pipeitemsvoid + Name: BuildCraft|Transport:item.buildcraftPipe.pipeitemsvoid + pipeitemsstripes + Name: BuildCraft|Transport:item.buildcraftPipe.pipeitemsstripes + pipepowerquartz + Name: BuildCraft|Transport:item.buildcraftPipe.pipepowerquartz + pipepowergold + Name: BuildCraft|Transport:item.buildcraftPipe.pipepowergold + pipeitemssandstone + Name: BuildCraft|Transport:item.buildcraftPipe.pipeitemssandstone + pipeitemsclay + Name: BuildCraft|Transport:item.buildcraftPipe.pipeitemsclay + pipeitemscobblestone + Name: BuildCraft|Transport:item.buildcraftPipe.pipeitemscobblestone + pipeitemsgold + Name: BuildCraft|Transport:item.buildcraftPipe.pipeitemsgold + pipeitemsquartz + Name: BuildCraft|Transport:item.buildcraftPipe.pipeitemsquartz + pipeitemsemzuli + Name: BuildCraft|Transport:item.buildcraftPipe.pipeitemsemzuli + pipefluidsclay + Name: BuildCraft|Transport:item.buildcraftPipe.pipefluidsclay + pipepowerwood + Name: BuildCraft|Transport:item.buildcraftPipe.pipepowerwood + pipefluidscobblestone + Name: BuildCraft|Transport:item.buildcraftPipe.pipefluidscobblestone + pipefluidsdiamond + Name: BuildCraft|Transport:item.buildcraftPipe.pipefluidsdiamond + pipeitemslapis + Name: BuildCraft|Transport:item.buildcraftPipe.pipeitemslapis + pipepowerdiamond + Name: BuildCraft|Transport:item.buildcraftPipe.pipepowerdiamond + pipefluidswood + Name: BuildCraft|Transport:item.buildcraftPipe.pipefluidswood + pipefluidsgold + Name: BuildCraft|Transport:item.buildcraftPipe.pipefluidsgold + pipefluidsquartz + Name: BuildCraft|Transport:item.buildcraftPipe.pipefluidsquartz + pipeitemsdiamond + Name: BuildCraft|Transport:item.buildcraftPipe.pipeitemsdiamond + pipeitemsdaizuli + Name: BuildCraft|Transport:item.buildcraftPipe.pipeitemsdaizuli + pipepowerstone + Name: BuildCraft|Transport:item.buildcraftPipe.pipepowerstone + pipeitemsiron + Name: BuildCraft|Transport:item.buildcraftPipe.pipeitemsiron + pipeitemsemerald + Name: BuildCraft|Transport:item.buildcraftPipe.pipeitemsemerald + pipeitemsobsidian + Name: BuildCraft|Transport:item.buildcraftPipe.pipeitemsobsidian + pipepowercobblestone + Name: BuildCraft|Transport:item.buildcraftPipe.pipepowercobblestone + pipefluidsstone + Name: BuildCraft|Transport:item.buildcraftPipe.pipefluidsstone + pipepoweriron + Name: BuildCraft|Transport:item.buildcraftPipe.pipepoweriron + filteredbufferblock + Name: BuildCraft|Transport:filteredBufferBlock + pipewire + Name: BuildCraft|Transport:pipeWire + gatecopier + Name: BuildCraft|Transport:gateCopier + pipefacade + Name: BuildCraft|Transport:pipeFacade + pipeplug + Name: BuildCraft|Transport:pipePlug + pipeblock + Name: BuildCraft|Transport:pipeBlock + pipegate + Name: BuildCraft|Transport:pipeGate + pipepoweradapter + Name: BuildCraft|Transport:pipePowerAdapter + pipewaterproof + Name: BuildCraft|Transport:pipeWaterproof + pipelens + Name: BuildCraft|Transport:pipeLens + energy + + blockredplasma + Name: BuildCraft|Energy:blockRedPlasma + blockoil + Name: BuildCraft|Energy:blockOil + bucketoil + Name: BuildCraft|Energy:bucketOil + blockfuel + Name: BuildCraft|Energy:blockFuel + bucketfuel + Name: BuildCraft|Energy:bucketFuel \ No newline at end of file