diff --git a/src/main/java/vazkii/botania/common/block/BlockOpenCrate.java b/src/main/java/vazkii/botania/common/block/BlockOpenCrate.java index 9cbb8167c..831d5806e 100644 --- a/src/main/java/vazkii/botania/common/block/BlockOpenCrate.java +++ b/src/main/java/vazkii/botania/common/block/BlockOpenCrate.java @@ -24,6 +24,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import vazkii.botania.api.lexicon.ILexiconable; import vazkii.botania.api.lexicon.LexiconEntry; @@ -44,6 +45,8 @@ public class BlockOpenCrate extends BlockModContainer implements ILexiconable, I IIcon iconSideCraft; IIcon iconBottomCraft; + IIcon[] sidePatternIcons; + Random random; private static final int SUBTYPES = 2; @@ -135,6 +138,10 @@ public class BlockOpenCrate extends BlockModContainer implements ILexiconable, I iconBottom = IconHelper.forBlock(par1IconRegister, this, 1); iconSideCraft = IconHelper.forBlock(par1IconRegister, this, 2); iconBottomCraft = IconHelper.forBlock(par1IconRegister, this, 3); + + sidePatternIcons = new IIcon[TileCraftCrate.PATTERNS.length]; + for(int i = 0; i < sidePatternIcons.length; i++) + sidePatternIcons[i] = IconHelper.forName(par1IconRegister, "ocPattern" + i); } @Override @@ -142,6 +149,15 @@ public class BlockOpenCrate extends BlockModContainer implements ILexiconable, I return meta == 0 ? side == 0 ? iconBottom : iconSide : side == 0 ? iconBottomCraft : iconSideCraft; } + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tile = world.getTileEntity(x, y, z); + if(tile != null && tile instanceof TileCraftCrate && ((TileCraftCrate) tile).pattern != -1 && side != 0) + return sidePatternIcons[((TileCraftCrate) tile).pattern]; + + return super.getIcon(world, x, y, z, side); + } + @Override public TileEntity createNewTileEntity(World world, int meta) { return meta == 0 ? new TileOpenCrate() : new TileCraftCrate(); diff --git a/src/main/java/vazkii/botania/common/block/tile/TileCraftCrate.java b/src/main/java/vazkii/botania/common/block/tile/TileCraftCrate.java index d15d8d2a9..ffef045a6 100644 --- a/src/main/java/vazkii/botania/common/block/tile/TileCraftCrate.java +++ b/src/main/java/vazkii/botania/common/block/tile/TileCraftCrate.java @@ -18,10 +18,56 @@ import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import vazkii.botania.common.item.ModItems; public class TileCraftCrate extends TileOpenCrate { + public static final boolean[][] PATTERNS = new boolean[][] { + { + true, false, false, + false, false, false, + false, false, false + }, { + true, true, false, + true, true, false, + false, false, false + }, { + true, false, false, + true, false, false, + false, false, false + }, { + true, true, false, + false, false, false, + false, false, false + }, { + true, false, false, + true, false, false, + true, false, false + }, { + true, true, true, + false, false, false, + false, false, false + }, { + true, true, false, + true, true, false, + true, true, false + }, { + true, true, true, + true, true, true, + false, false, false + }, { + true, true, true, + true, false, true, + true, true, true + } + }; + + private static final String TAG_PATTERN = "pattern"; + + public int pattern = -1; int signal = 0; @Override @@ -36,9 +82,13 @@ public class TileCraftCrate extends TileOpenCrate { @Override public boolean isItemValidForSlot(int i, ItemStack itemstack) { - return i != 9; + return i != 9 && !isLocked(i); } + public boolean isLocked(int slot) { + return pattern != -1 && !PATTERNS[pattern][slot]; + } + @Override public void updateEntity() { if(!worldObj.isRemote && craft(true) && canEject()) @@ -46,7 +96,7 @@ public class TileCraftCrate extends TileOpenCrate { int newSignal = 0; for(; newSignal < 9; newSignal++) // dis for loop be derpy - if(getStackInSlot(newSignal) == null) + if(!isLocked(newSignal) && getStackInSlot(newSignal) == null) break; if(newSignal != signal) { @@ -68,7 +118,7 @@ public class TileCraftCrate extends TileOpenCrate { for(int i = 0; i < 9; i++) { ItemStack stack = getStackInSlot(i); - if(stack == null || stack.getItem() == ModItems.manaResource && stack.getItemDamage() == 11) + if(stack == null || isLocked(i) || stack.getItem() == ModItems.manaResource && stack.getItemDamage() == 11) continue; craft.setInventorySlotContents(i, stack.copy()); @@ -95,7 +145,7 @@ public class TileCraftCrate extends TileOpenCrate { boolean isFull() { for(int i = 0; i < 9; i++) - if(getStackInSlot(i) == null) + if(!isLocked(i) && getStackInSlot(i) == null) return false; return true; @@ -109,7 +159,19 @@ public class TileCraftCrate extends TileOpenCrate { setInventorySlotContents(i, null); } } - + + @Override + public void writeCustomNBT(NBTTagCompound par1nbtTagCompound) { + super.writeCustomNBT(par1nbtTagCompound); + par1nbtTagCompound.setInteger(TAG_PATTERN, pattern); + } + + @Override + public void readCustomNBT(NBTTagCompound par1nbtTagCompound) { + super.readCustomNBT(par1nbtTagCompound); + pattern = par1nbtTagCompound.getInteger(TAG_PATTERN); + } + @Override public boolean onWanded(EntityPlayer player, ItemStack stack) { craft(false); @@ -121,4 +183,12 @@ public class TileCraftCrate extends TileOpenCrate { public int getSignal() { return signal; } + @Override + public void onDataPacket(NetworkManager manager, S35PacketUpdateTileEntity packet) { + int lastPattern = pattern; + super.onDataPacket(manager, packet); + if(pattern != lastPattern) + worldObj.markBlockRangeForRenderUpdate(xCoord,yCoord,zCoord,xCoord,yCoord,zCoord); + } + } diff --git a/src/main/java/vazkii/botania/common/core/BotaniaCreativeTab.java b/src/main/java/vazkii/botania/common/core/BotaniaCreativeTab.java index f68dd1ed9..84f8d517a 100644 --- a/src/main/java/vazkii/botania/common/core/BotaniaCreativeTab.java +++ b/src/main/java/vazkii/botania/common/core/BotaniaCreativeTab.java @@ -106,6 +106,7 @@ public final class BotaniaCreativeTab extends CreativeTabs { addBlock(ModBlocks.livingrock); addBlock(ModBlocks.livingwood); addBlock(ModBlocks.openCrate); + addItem(ModItems.craftPattern); addBlock(ModBlocks.platform); addBlock(ModBlocks.alfPortal); addBlock(ModBlocks.altar); diff --git a/src/main/java/vazkii/botania/common/crafting/ModCraftingRecipes.java b/src/main/java/vazkii/botania/common/crafting/ModCraftingRecipes.java index ac0eb34d0..59732e0fd 100644 --- a/src/main/java/vazkii/botania/common/crafting/ModCraftingRecipes.java +++ b/src/main/java/vazkii/botania/common/crafting/ModCraftingRecipes.java @@ -10,6 +10,8 @@ */ package vazkii.botania.common.crafting; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import net.minecraft.block.Block; @@ -25,6 +27,7 @@ import vazkii.botania.api.BotaniaAPI; import vazkii.botania.common.Botania; import vazkii.botania.common.block.ModBlocks; import vazkii.botania.common.block.ModFluffBlocks; +import vazkii.botania.common.block.tile.TileCraftCrate; import vazkii.botania.common.core.handler.ConfigHandler; import vazkii.botania.common.item.ItemSignalFlare; import vazkii.botania.common.item.ItemTwigWand; @@ -221,6 +224,7 @@ public final class ModCraftingRecipes { public static IRecipe recipeSpellCloth; public static IRecipe recipeThornChakram; public static IRecipe recipeDirtPathSlab; + public static List recipesPatterns; public static void init() { // Lexicon Recipe @@ -1393,13 +1397,13 @@ public final class ModCraftingRecipes { // Trodden Dirt Recipe GameRegistry.addShapelessRecipe(new ItemStack(ModBlocks.dirtPath, 4), new ItemStack(Blocks.dirt, 1, 1), new ItemStack(Blocks.dirt, 1, 1), new ItemStack(Blocks.dirt, 1, 1), new ItemStack(Blocks.sand)); recipeDirtPath = BotaniaAPI.getLatestAddedRecipe(); - + // Dreamwood Twig Recipe addOreDictRecipe(new ItemStack(ModItems.manaResource, 1, 13), "W", "W", 'W', LibOreDict.DREAM_WOOD); recipeDreamwoodTwig = BotaniaAPI.getLatestAddedRecipe(); - + // Manaseer Monocle Recipe addOreDictRecipe(new ItemStack(ModItems.monocle), "GN", "IN", " N", @@ -1407,13 +1411,13 @@ public final class ModCraftingRecipes { 'I', LibOreDict.MANA_STEEL, 'N', new ItemStack(Items.gold_nugget)); recipeMonocle = BotaniaAPI.getLatestAddedRecipe(); - + // Lens Clip Recipe addOreDictRecipe(new ItemStack(ModItems.clip), " D ", "D D", "DD ", 'D', LibOreDict.DREAM_WOOD); recipeClip = BotaniaAPI.getLatestAddedRecipe(); - + // Rod of the Depths Recipe addOreDictRecipe(new ItemStack(ModItems.cobbleRod), " FC", " TW", "T ", @@ -1422,7 +1426,7 @@ public final class ModCraftingRecipes { 'T', LibOreDict.LIVINGWOOD_TWIG, 'C', new ItemStack(Blocks.cobblestone)); recipeCobbleRod = BotaniaAPI.getLatestAddedRecipe(); - + // Rod of the Molten Core Recipe addOreDictRecipe(new ItemStack(ModItems.smeltRod), " BF", " TB", "T ", @@ -1430,7 +1434,7 @@ public final class ModCraftingRecipes { 'F', LibOreDict.RUNE[1], 'T', LibOreDict.LIVINGWOOD_TWIG); recipeSmeltRod = BotaniaAPI.getLatestAddedRecipe(); - + // World Seed Recipe addOreDictRecipe(new ItemStack(ModItems.worldSeed, 4), "G", "S", "D", @@ -1438,27 +1442,51 @@ public final class ModCraftingRecipes { 'S', new ItemStack(Items.wheat_seeds), 'D', LibOreDict.DRAGONSTONE); recipeWorldSeed = BotaniaAPI.getLatestAddedRecipe(); - + // Spellbinding Cloth Recipe addOreDictRecipe(new ItemStack(ModItems.spellCloth), "WWW", "WPW", "WWW", 'W', new ItemStack(Blocks.wool, 1, -1), 'P', LibOreDict.MANA_PEARL); recipeSpellCloth = BotaniaAPI.getLatestAddedRecipe(); - + // Thorn Chakram Recipe addOreDictRecipe(new ItemStack(ModItems.thornChakram), "VVV", "VTV", "VVV", 'V', new ItemStack(Blocks.vine), 'T', LibOreDict.TERRA_STEEL); recipeThornChakram = BotaniaAPI.getLatestAddedRecipe(); - + // Trodden Dirt Slab GameRegistry.addRecipe(new ItemStack(ModFluffBlocks.dirtPathSlab, 6), "DDD", 'D', new ItemStack(ModBlocks.dirtPath)); recipeDirtPathSlab = BotaniaAPI.getLatestAddedRecipe(); - + + // Pattern Recipes + { + int count = TileCraftCrate.PATTERNS.length; + List recipeObjects = Arrays.asList( + 'R', new ItemStack(Items.redstone), + 'P', LibOreDict.PLACEHOLDER + ); + + for(int i = 0; i < count; i++) { + List recipe = new ArrayList(); + for(int j = 0; j < 3; j++) { + String s = ""; + for(int k = 0; k < 3; k++) + s += TileCraftCrate.PATTERNS[i][j * 3 + k] ? "R" : "P"; + recipe.add(s); + } + recipe.addAll(recipeObjects); + + addOreDictRecipe(new ItemStack(ModItems.craftPattern, 1, i), recipe.toArray(new Object[recipe.size()])); + } + + recipesPatterns = BotaniaAPI.getLatestAddedRecipes(count); + } + // Storage Block Recipes addOreDictRecipe(new ItemStack(ModBlocks.storage, 1, 0), "III", "III", "III", @@ -1480,7 +1508,7 @@ public final class ModCraftingRecipes { GameRegistry.addShapelessRecipe(new ItemStack(ModItems.manaResource, 9, 7), new ItemStack(ModBlocks.storage, 1, 2)); GameRegistry.addShapelessRecipe(new ItemStack(ModItems.manaResource, 9, 2), new ItemStack(ModBlocks.storage, 1, 3)); GameRegistry.addShapelessRecipe(new ItemStack(ModItems.manaResource, 9, 9), new ItemStack(ModBlocks.storage, 1, 4)); - + // Revealing Helmet Recipes if(Botania.thaumcraftLoaded) { Item goggles = (Item) Item.itemRegistry.getObject("Thaumcraft:ItemGoggles"); diff --git a/src/main/java/vazkii/botania/common/item/ItemCraftPattern.java b/src/main/java/vazkii/botania/common/item/ItemCraftPattern.java new file mode 100644 index 000000000..aefc22fd9 --- /dev/null +++ b/src/main/java/vazkii/botania/common/item/ItemCraftPattern.java @@ -0,0 +1,72 @@ +/** + * This class was created by . It's distributed as + * part of the Botania Mod. Get the Source Code in github: + * https://github.com/Vazkii/Botania + * + * Botania is Open Source and distributed under a + * Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License + * (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB) + * + * File Created @ [Jan 28, 2015, 2:59:06 PM (GMT)] + */ +package vazkii.botania.common.item; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import vazkii.botania.client.core.helper.IconHelper; +import vazkii.botania.common.block.tile.TileCraftCrate; +import vazkii.botania.common.lib.LibItemNames; + +public class ItemCraftPattern extends ItemMod { + + IIcon[] icons; + + public ItemCraftPattern() { + setHasSubtypes(true); + setUnlocalizedName(LibItemNames.CRAFT_PATTERN); + setMaxStackSize(1); + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer p, World world, int x, int y, int z, int s, float xs, float ys, float zs) { + TileEntity tile = world.getTileEntity(x, y, z); + if(tile != null && tile instanceof TileCraftCrate && !world.isRemote) { + TileCraftCrate crate = (TileCraftCrate) tile; + crate.pattern = stack.getItemDamage(); + world.markBlockForUpdate(x, y, z); + } + return false; + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + for(int i = 0; i < TileCraftCrate.PATTERNS.length; i++) + list.add(new ItemStack(item, 1, i)); + } + + @Override + public void registerIcons(IIconRegister par1IconRegister) { + icons = new IIcon[TileCraftCrate.PATTERNS.length]; + for(int i = 0; i < icons.length; i++) + icons[i] = IconHelper.forItem(par1IconRegister, this, i); + } + + @Override + public IIcon getIconFromDamage(int dmg) { + return icons[Math.min(icons.length - 1, dmg)]; + } + + @Override + public String getUnlocalizedName(ItemStack par1ItemStack) { + return super.getUnlocalizedName(par1ItemStack) + par1ItemStack.getItemDamage(); + } + +} diff --git a/src/main/java/vazkii/botania/common/item/ModItems.java b/src/main/java/vazkii/botania/common/item/ModItems.java index dfe86da91..88e085391 100644 --- a/src/main/java/vazkii/botania/common/item/ModItems.java +++ b/src/main/java/vazkii/botania/common/item/ModItems.java @@ -199,6 +199,7 @@ public final class ModItems { public static Item spellCloth; public static Item thornChakram; public static Item overgrowthSeed; + public static Item craftPattern; public static void init() { lexicon = new ItemLexicon(); @@ -306,6 +307,7 @@ public final class ModItems { spellCloth = new ItemSpellCloth(); thornChakram = new ItemThornChakram(); overgrowthSeed = new ItemOvergrowthSeed(); + craftPattern = new ItemCraftPattern(); OreDictionary.registerOre(LibOreDict.LEXICON, lexicon); for(int i = 0; i < 16; i++) { diff --git a/src/main/java/vazkii/botania/common/lexicon/LexiconData.java b/src/main/java/vazkii/botania/common/lexicon/LexiconData.java index d753ed587..0ac6413c2 100644 --- a/src/main/java/vazkii/botania/common/lexicon/LexiconData.java +++ b/src/main/java/vazkii/botania/common/lexicon/LexiconData.java @@ -483,7 +483,7 @@ public final class LexiconData { spawnerClaw.setLexiconPages(new PageText("0"), new PageText("1"), new PageCraftingRecipe("2", ModCraftingRecipes.recipeSpawnerClaw)); craftCrate = new ALexiconEntry(LibLexicon.DEVICE_CRAFT_CRATE, categoryDevices); - craftCrate.setLexiconPages(new PageText("0"), new PageText("1"), new PageCraftingRecipe("2", ModCraftingRecipes.recipePlaceholder), new PageText("3"), new PageText("4"), new PageText("7"), new PageImage("5", LibResources.ENTRY_CRAFT_CRATE), new PageCraftingRecipe("6", ModCraftingRecipes.recipeCraftCrate)); + craftCrate.setLexiconPages(new PageText("0"), new PageText("1"), new PageCraftingRecipe("2", ModCraftingRecipes.recipePlaceholder), new PageText("3"), new PageText("4"), new PageText("7"), new PageImage("5", LibResources.ENTRY_CRAFT_CRATE), new PageCraftingRecipe("6", ModCraftingRecipes.recipeCraftCrate), new PageText("7"), new PageCraftingRecipe("8", ModCraftingRecipes.recipesPatterns)); enderEyeBlock = new BLexiconEntry(LibLexicon.DEVICE_ENDER_EYE_BLOCK, categoryDevices); enderEyeBlock.setLexiconPages(new PageText("0"), new PageCraftingRecipe("1", ModCraftingRecipes.recipeEnderEyeBlock)); diff --git a/src/main/java/vazkii/botania/common/lib/LibItemNames.java b/src/main/java/vazkii/botania/common/lib/LibItemNames.java index 4d23b2b80..aa6bbba74 100644 --- a/src/main/java/vazkii/botania/common/lib/LibItemNames.java +++ b/src/main/java/vazkii/botania/common/lib/LibItemNames.java @@ -118,6 +118,7 @@ public final class LibItemNames { public static final String SPELL_CLOTH = "spellCloth"; public static final String THORN_CHAKRAM = "thornChakram"; public static final String OVERGROWTH_SEED = "overgrowthSeed"; + public static final String CRAFT_PATTERN = "craftPattern"; public static final String[] LENS_NAMES = new String[] { "lensNormal", diff --git a/src/main/resources/assets/botania/lang/en_US.lang b/src/main/resources/assets/botania/lang/en_US.lang index f8e13ace0..a5002e2c6 100644 --- a/src/main/resources/assets/botania/lang/en_US.lang +++ b/src/main/resources/assets/botania/lang/en_US.lang @@ -816,6 +816,15 @@ item.botania:worldSeed.name=World Seed item.botania:spellCloth.name=Spellbinding Cloth item.botania:thornChakram.name=Thorn Chakram item.botania:overgrowthSeed.name=Overgrowth Seed +item.botania:craftPattern0.name=Crafting Pattern #1: 1x1 +item.botania:craftPattern1.name=Crafting Pattern #2: 2x2 +item.botania:craftPattern2.name=Crafting Pattern #3: 1x2 +item.botania:craftPattern3.name=Crafting Pattern #4: 2x1 +item.botania:craftPattern4.name=Crafting Pattern #5: 1x3 +item.botania:craftPattern5.name=Crafting Pattern #6: 3x1 +item.botania:craftPattern6.name=Crafting Pattern #7: 2x3 +item.botania:craftPattern7.name=Crafting Pattern #8: 3x2 +item.botania:craftPattern8.name=Crafting Pattern #9: Donut # BREW NAMES botania.brew.fallback=Fallback @@ -1466,6 +1475,8 @@ botania.page.craftCrate4=Right clicking the crate with a &1Wand of the Forest&0 botania.page.craftCrate7=Attaching a &1Comparator&0 to the crate will have it emit a signal equal to the amount of items inside the crate, which can be an extremely valuable asset in creating mechanisms with it. botania.page.craftCrate5=An example of crafting a &1Diamond Pickaxe&0 botania.page.craftCrate6=Made in Portugal +botania.page.craftCrate7=The &1Crafty Crate&0 can also be augmented with patterns. A pattern locks specific slots in the recipe, disallowing items from going into those slots and making them count as if there were placeholders there.
There's only a few basic patterns, which can be applied by right clicking on the crate (this doesn't consume them). +botania.page.craftCrate8=9 different patterns # -- ENDER OVERSEER botania.entry.enderEyeBlock=Ender Overseer diff --git a/src/main/resources/assets/botania/textures/blocks/ocPattern0.png b/src/main/resources/assets/botania/textures/blocks/ocPattern0.png new file mode 100644 index 000000000..ea9f73163 Binary files /dev/null and b/src/main/resources/assets/botania/textures/blocks/ocPattern0.png differ diff --git a/src/main/resources/assets/botania/textures/blocks/ocPattern1.png b/src/main/resources/assets/botania/textures/blocks/ocPattern1.png new file mode 100644 index 000000000..f8a29e528 Binary files /dev/null and b/src/main/resources/assets/botania/textures/blocks/ocPattern1.png differ diff --git a/src/main/resources/assets/botania/textures/blocks/ocPattern2.png b/src/main/resources/assets/botania/textures/blocks/ocPattern2.png new file mode 100644 index 000000000..3d59fadce Binary files /dev/null and b/src/main/resources/assets/botania/textures/blocks/ocPattern2.png differ diff --git a/src/main/resources/assets/botania/textures/blocks/ocPattern3.png b/src/main/resources/assets/botania/textures/blocks/ocPattern3.png new file mode 100644 index 000000000..7f13f7740 Binary files /dev/null and b/src/main/resources/assets/botania/textures/blocks/ocPattern3.png differ diff --git a/src/main/resources/assets/botania/textures/blocks/ocPattern4.png b/src/main/resources/assets/botania/textures/blocks/ocPattern4.png new file mode 100644 index 000000000..ed5433e5c Binary files /dev/null and b/src/main/resources/assets/botania/textures/blocks/ocPattern4.png differ diff --git a/src/main/resources/assets/botania/textures/blocks/ocPattern5.png b/src/main/resources/assets/botania/textures/blocks/ocPattern5.png new file mode 100644 index 000000000..994d21591 Binary files /dev/null and b/src/main/resources/assets/botania/textures/blocks/ocPattern5.png differ diff --git a/src/main/resources/assets/botania/textures/blocks/ocPattern6.png b/src/main/resources/assets/botania/textures/blocks/ocPattern6.png new file mode 100644 index 000000000..17c05ef35 Binary files /dev/null and b/src/main/resources/assets/botania/textures/blocks/ocPattern6.png differ diff --git a/src/main/resources/assets/botania/textures/blocks/ocPattern7.png b/src/main/resources/assets/botania/textures/blocks/ocPattern7.png new file mode 100644 index 000000000..00ac25460 Binary files /dev/null and b/src/main/resources/assets/botania/textures/blocks/ocPattern7.png differ diff --git a/src/main/resources/assets/botania/textures/blocks/ocPattern8.png b/src/main/resources/assets/botania/textures/blocks/ocPattern8.png new file mode 100644 index 000000000..a6bc0c5f5 Binary files /dev/null and b/src/main/resources/assets/botania/textures/blocks/ocPattern8.png differ diff --git a/src/main/resources/assets/botania/textures/items/craftPattern0.png b/src/main/resources/assets/botania/textures/items/craftPattern0.png new file mode 100644 index 000000000..8156b1dee Binary files /dev/null and b/src/main/resources/assets/botania/textures/items/craftPattern0.png differ diff --git a/src/main/resources/assets/botania/textures/items/craftPattern1.png b/src/main/resources/assets/botania/textures/items/craftPattern1.png new file mode 100644 index 000000000..981b294d2 Binary files /dev/null and b/src/main/resources/assets/botania/textures/items/craftPattern1.png differ diff --git a/src/main/resources/assets/botania/textures/items/craftPattern2.png b/src/main/resources/assets/botania/textures/items/craftPattern2.png new file mode 100644 index 000000000..24ffc1c57 Binary files /dev/null and b/src/main/resources/assets/botania/textures/items/craftPattern2.png differ diff --git a/src/main/resources/assets/botania/textures/items/craftPattern3.png b/src/main/resources/assets/botania/textures/items/craftPattern3.png new file mode 100644 index 000000000..cfcb94f81 Binary files /dev/null and b/src/main/resources/assets/botania/textures/items/craftPattern3.png differ diff --git a/src/main/resources/assets/botania/textures/items/craftPattern4.png b/src/main/resources/assets/botania/textures/items/craftPattern4.png new file mode 100644 index 000000000..4bcf84275 Binary files /dev/null and b/src/main/resources/assets/botania/textures/items/craftPattern4.png differ diff --git a/src/main/resources/assets/botania/textures/items/craftPattern5.png b/src/main/resources/assets/botania/textures/items/craftPattern5.png new file mode 100644 index 000000000..315dc0cc1 Binary files /dev/null and b/src/main/resources/assets/botania/textures/items/craftPattern5.png differ diff --git a/src/main/resources/assets/botania/textures/items/craftPattern6.png b/src/main/resources/assets/botania/textures/items/craftPattern6.png new file mode 100644 index 000000000..ee9c7d02c Binary files /dev/null and b/src/main/resources/assets/botania/textures/items/craftPattern6.png differ diff --git a/src/main/resources/assets/botania/textures/items/craftPattern7.png b/src/main/resources/assets/botania/textures/items/craftPattern7.png new file mode 100644 index 000000000..23af9e877 Binary files /dev/null and b/src/main/resources/assets/botania/textures/items/craftPattern7.png differ diff --git a/src/main/resources/assets/botania/textures/items/craftPattern8.png b/src/main/resources/assets/botania/textures/items/craftPattern8.png new file mode 100644 index 000000000..c70f49562 Binary files /dev/null and b/src/main/resources/assets/botania/textures/items/craftPattern8.png differ