diff --git a/src/main/java/vazkii/botania/api/BotaniaAPI.java b/src/main/java/vazkii/botania/api/BotaniaAPI.java index 233afc07d..5d4807b76 100644 --- a/src/main/java/vazkii/botania/api/BotaniaAPI.java +++ b/src/main/java/vazkii/botania/api/BotaniaAPI.java @@ -41,6 +41,7 @@ import vazkii.botania.api.recipe.RecipeBrew; import vazkii.botania.api.recipe.RecipeElvenTrade; import vazkii.botania.api.recipe.RecipeManaInfusion; import vazkii.botania.api.recipe.RecipePetals; +import vazkii.botania.api.recipe.RecipePureDaisy; import vazkii.botania.api.recipe.RecipeRuneAltar; import vazkii.botania.api.subtile.SubTileEntity; import vazkii.botania.api.subtile.signature.BasicSignature; @@ -62,8 +63,9 @@ public final class BotaniaAPI { public static Map brewMap = new LinkedHashMap(); public static List petalRecipes = new ArrayList(); - public static List runeAltarRecipes = new ArrayList(); + public static List pureDaisyRecipes = new ArrayList(); public static List manaInfusionRecipes = new ArrayList(); + public static List runeAltarRecipes = new ArrayList(); public static List elvenTradeRecipes = new ArrayList(); public static List brewRecipes = new ArrayList(); @@ -237,6 +239,12 @@ public final class BotaniaAPI { petalRecipes.add(recipe); return recipe; } + + public static RecipePureDaisy registerPureDaisyRecipe(Object input, Block output, int outputMeta) { + RecipePureDaisy recipe = new RecipePureDaisy(input, output, outputMeta); + pureDaisyRecipes.add(recipe); + return recipe; + } /** * Registers a Rune Altar diff --git a/src/main/java/vazkii/botania/api/recipe/RecipePureDaisy.java b/src/main/java/vazkii/botania/api/recipe/RecipePureDaisy.java new file mode 100644 index 000000000..26c6c5b55 --- /dev/null +++ b/src/main/java/vazkii/botania/api/recipe/RecipePureDaisy.java @@ -0,0 +1,81 @@ +/** + * 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 the + * Botania License: http://botaniamod.net/license.php + * + * File Created @ [Apr 17, 2015, 5:07:25 PM (GMT)] + */ +package vazkii.botania.api.recipe; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; +import vazkii.botania.api.subtile.SubTileEntity; + +public class RecipePureDaisy { + + Object input; + Block output; + int outputMeta; + + public RecipePureDaisy(Object input, Block output, int outputMeta) { + this.input = input; + this.output = output; + this.outputMeta = outputMeta; + + if(input != null && !(input instanceof String || input instanceof Block)) + throw new IllegalArgumentException("input must be an oredict String or a Block."); + } + + public boolean matches(World world, int x, int y, int z, SubTileEntity pureDaisy) { + Block block = world.getBlock(x, y, z); + int meta = world.getBlockMetadata(x, y, z); + if(input instanceof Block && block == input) + return true; + + ItemStack stack = new ItemStack(block, 1, world.getBlockMetadata(x, y, z)); + String oredict = (String) input; + return isOreDict(stack, oredict); + } + + private boolean isOreDict(ItemStack stack, String entry) { + for(ItemStack ostack : OreDictionary.getOres(entry)) { + ItemStack cstack = ostack.copy(); + if(cstack.getItemDamage() == Short.MAX_VALUE) + cstack.setItemDamage(stack.getItemDamage()); + + if(stack.isItemEqual(cstack)) + return true; + } + + return false; + } + + /** + * Returns true if the block was placed (and if the Pure Daisy should do particles and stuffs). + * Should only place the block if world.isRemote, but should return true if it would've placed + * it otherwise. You may return false to cancel the normal particles and do your own. + */ + public boolean set(World world, int x, int y, int z, SubTileEntity pureDaisy) { + if(world.isRemote) + world.setBlock(x, y, z, output, outputMeta, 1 | 2); + return true; + } + + public Object getInput() { + return input; + } + + public Block getOutput() { + return output; + } + + public int getOutputMeta() { + return outputMeta; + } + +} diff --git a/src/main/java/vazkii/botania/common/block/subtile/SubTilePureDaisy.java b/src/main/java/vazkii/botania/common/block/subtile/SubTilePureDaisy.java index 70cb0c991..bcf13a568 100644 --- a/src/main/java/vazkii/botania/common/block/subtile/SubTilePureDaisy.java +++ b/src/main/java/vazkii/botania/common/block/subtile/SubTilePureDaisy.java @@ -12,16 +12,15 @@ package vazkii.botania.common.block.subtile; import net.minecraft.block.Block; import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ChunkCoordinates; -import net.minecraftforge.oredict.OreDictionary; +import net.minecraft.world.World; +import vazkii.botania.api.BotaniaAPI; import vazkii.botania.api.lexicon.LexiconEntry; +import vazkii.botania.api.recipe.RecipePureDaisy; import vazkii.botania.api.subtile.RadiusDescriptor; import vazkii.botania.api.subtile.SubTileEntity; import vazkii.botania.common.Botania; -import vazkii.botania.common.block.ModBlocks; import vazkii.botania.common.core.handler.ConfigHandler; import vazkii.botania.common.lexicon.LexiconData; @@ -54,22 +53,25 @@ public class SubTilePureDaisy extends SubTileEntity { int[] acoords = POSITIONS[positionAt]; ChunkCoordinates coords = new ChunkCoordinates(supertile.xCoord + acoords[0], supertile.yCoord + acoords[1], supertile.zCoord + acoords[2]); - Block block = supertile.getWorldObj().getBlock(coords.posX, coords.posY, coords.posZ); - if(block != Blocks.air) { - Item item = Item.getItemFromBlock(block); - if(item != null) { - ItemStack stack = new ItemStack(item, 1, supertile.getWorldObj().getBlockMetadata(coords.posX, coords.posY, coords.posZ)); - Block output = isOreDict(stack, "stone") ? ModBlocks.livingrock : isOreDict(stack, "logWood") ? ModBlocks.livingwood : null; - if(output != null) { - ticksRemaining[positionAt] = ticksRemaining[positionAt] - 1; + World world = supertile.getWorldObj(); + if(!world.isAirBlock(coords.posX, coords.posY, coords.posZ)) { + RecipePureDaisy recipe = null; + for(RecipePureDaisy recipe_ : BotaniaAPI.pureDaisyRecipes) + if(recipe_.matches(world, coords.posX, coords.posY, coords.posZ, this)) { + recipe = recipe_; + break; + } - Botania.proxy.sparkleFX(supertile.getWorldObj(), coords.posX + Math.random(), coords.posY + Math.random(), coords.posZ + Math.random(), 1F, 1F, 1F, (float) Math.random(), 5); - if(ticksRemaining[positionAt] <= 0) { - if(!supertile.getWorldObj().isRemote) - supertile.getWorldObj().setBlock(coords.posX, coords.posY, coords.posZ, output); - ticksRemaining[positionAt] = 200; + if(recipe != null) { + ticksRemaining[positionAt] = ticksRemaining[positionAt] - 1; + Botania.proxy.sparkleFX(supertile.getWorldObj(), coords.posX + Math.random(), coords.posY + Math.random(), coords.posZ + Math.random(), 1F, 1F, 1F, (float) Math.random(), 5); + + if(ticksRemaining[positionAt] <= 0) { + ticksRemaining[positionAt] = 200; + + if(recipe.set(world,coords.posX, coords.posY, coords.posZ, this)) { for(int i = 0; i < 25; i++) { double x = coords.posX + Math.random(); double y = coords.posY + Math.random() + 0.5; @@ -78,26 +80,13 @@ public class SubTilePureDaisy extends SubTileEntity { Botania.proxy.wispFX(supertile.getWorldObj(), x, y, z, 1F, 1F, 1F, (float) Math.random() / 2F); } if(ConfigHandler.blockBreakParticles) - supertile.getWorldObj().playAuxSFX(2001, coords.posX, coords.posY, coords.posZ, Block.getIdFromBlock(block) + (supertile.getWorldObj().getBlockMetadata(coords.posX, coords.posY, coords.posZ) << 12)); + supertile.getWorldObj().playAuxSFX(2001, coords.posX, coords.posY, coords.posZ, Block.getIdFromBlock(recipe.getOutput()) + (recipe.getOutputMeta() << 12)); } - } else ticksRemaining[positionAt] = 200; - } + } + } else ticksRemaining[positionAt] = 200; } } - private boolean isOreDict(ItemStack stack, String entry) { - for(ItemStack ostack : OreDictionary.getOres(entry)) { - ItemStack cstack = ostack.copy(); - if(cstack.getItemDamage() == Short.MAX_VALUE) - cstack.setItemDamage(stack.getItemDamage()); - - if(stack.isItemEqual(cstack)) - return true; - } - - return false; - } - @Override public RadiusDescriptor getRadius() { return new RadiusDescriptor.Square(toChunkCoordinates(), 1); diff --git a/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java b/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java index b542e4c7f..015e3a6bd 100644 --- a/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java +++ b/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java @@ -54,6 +54,7 @@ import vazkii.botania.common.crafting.ModManaAlchemyRecipes; import vazkii.botania.common.crafting.ModManaConjurationRecipes; import vazkii.botania.common.crafting.ModManaInfusionRecipes; import vazkii.botania.common.crafting.ModPetalRecipes; +import vazkii.botania.common.crafting.ModPureDaisyRecipes; import vazkii.botania.common.crafting.ModRuneRecipes; import vazkii.botania.common.entity.EntityManaBurst; import vazkii.botania.common.entity.ModEntities; @@ -85,6 +86,7 @@ public class CommonProxy { ModCraftingRecipes.init(); ModPetalRecipes.init(); + ModPureDaisyRecipes.init(); ModRuneRecipes.init(); ModManaAlchemyRecipes.init(); ModManaConjurationRecipes.init(); diff --git a/src/main/java/vazkii/botania/common/crafting/ModPureDaisyRecipes.java b/src/main/java/vazkii/botania/common/crafting/ModPureDaisyRecipes.java new file mode 100644 index 000000000..82bf633dc --- /dev/null +++ b/src/main/java/vazkii/botania/common/crafting/ModPureDaisyRecipes.java @@ -0,0 +1,24 @@ +/** + * 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 the + * Botania License: http://botaniamod.net/license.php + * + * File Created @ [Apr 17, 2015, 5:18:06 PM (GMT)] + */ +package vazkii.botania.common.crafting; + +import vazkii.botania.common.block.ModBlocks; + +import vazkii.botania.api.BotaniaAPI; + +public final class ModPureDaisyRecipes { + + public static void init() { + BotaniaAPI.registerPureDaisyRecipe("stone", ModBlocks.livingrock, 0); + BotaniaAPI.registerPureDaisyRecipe("logWood", ModBlocks.livingwood, 0); + } + +}