diff --git a/MODSRC/vazkii/botania/api/BotaniaAPI.java b/MODSRC/vazkii/botania/api/BotaniaAPI.java index 5cc3881bc..5c3965e9f 100644 --- a/MODSRC/vazkii/botania/api/BotaniaAPI.java +++ b/MODSRC/vazkii/botania/api/BotaniaAPI.java @@ -35,6 +35,7 @@ import vazkii.botania.api.internal.IInternalMethodHandler; import vazkii.botania.api.lexicon.KnowledgeType; import vazkii.botania.api.lexicon.LexiconCategory; import vazkii.botania.api.lexicon.LexiconEntry; +import vazkii.botania.api.recipe.RecipeElvenTrade; import vazkii.botania.api.recipe.RecipeManaInfusion; import vazkii.botania.api.recipe.RecipePetals; import vazkii.botania.api.recipe.RecipeRuneAltar; @@ -53,6 +54,7 @@ public final class BotaniaAPI { public static List petalRecipes = new ArrayList(); public static List runeAltarRecipes = new ArrayList(); public static List manaInfusionRecipes = new ArrayList(); + public static List elvenTradeRecipes = new ArrayList(); private static BiMap> subTiles = HashBiMap.> create(); public static Set subtilesForCreativeMenu = new LinkedHashSet(); @@ -194,6 +196,18 @@ public final class BotaniaAPI { recipe.setAlchemy(true); return recipe; } + + /** + * Registers a Elven Trade recipe (throw an item in an Alfheim Portal). + * @param output The ItemStack to return. + * @param inputs The items required, can be ItemStack or ore dictionary entry string. + * @return The recipe created. + */ + public static RecipeElvenTrade registerElvenTradeRecipe(ItemStack output, Object... inputs) { + RecipeElvenTrade recipe = new RecipeElvenTrade(output, inputs); + elvenTradeRecipes.add(recipe); + return recipe; + } /** * Registers a SubTileEntity, a new special flower. Look in the subtile package of the API. diff --git a/MODSRC/vazkii/botania/api/recipe/RecipeElvenTrade.java b/MODSRC/vazkii/botania/api/recipe/RecipeElvenTrade.java new file mode 100644 index 000000000..dd3ca022a --- /dev/null +++ b/MODSRC/vazkii/botania/api/recipe/RecipeElvenTrade.java @@ -0,0 +1,96 @@ +package vazkii.botania.api.recipe; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +public class RecipeElvenTrade { + + ItemStack output; + List inputs; + + public RecipeElvenTrade(ItemStack output, Object... inputs) { + this.output = output; + + List inputsToSet = new ArrayList(); + for(Object obj : inputs) { + if(obj instanceof String || obj instanceof ItemStack) + inputsToSet.add(obj); + else throw new IllegalArgumentException("Invalid input"); + } + + this.inputs = inputsToSet; + } + + public boolean matches(List stacks, boolean remove) { + List inputsMissing = new ArrayList(inputs); + List indexesToRemove = new ArrayList(); + + int i = 0; + for(ItemStack stack : stacks) { + if(stack == null) { + i++; + continue; + } + if(inputsMissing.isEmpty()) + break; + + int stackIndex = -1, oredictIndex = -1; + + for(int j = 0; j < inputsMissing.size(); j++) { + Object input = inputsMissing.get(j); + if(input instanceof String) { + List validStacks = OreDictionary.getOres((String) input); + boolean found = false; + for(ItemStack ostack : validStacks) { + ItemStack cstack = ostack.copy(); + if(cstack.getItemDamage() == Short.MAX_VALUE) + cstack.setItemDamage(stack.getItemDamage()); + + if(stack.isItemEqual(cstack)) { + if(!indexesToRemove.contains(i)) + indexesToRemove.add(i); + oredictIndex = j; + found = true; + break; + } + } + + if(found) + break; + } else if(input instanceof ItemStack && simpleAreStacksEqual((ItemStack) input, stack)) { + stackIndex = j; + break; + } + } + + if(stackIndex != -1) + inputsMissing.remove(stackIndex); + else if(oredictIndex != -1) + inputsMissing.remove(oredictIndex); + i++; + } + + if(remove) + for(int r : indexesToRemove) + stacks.remove(r); + + return inputsMissing.isEmpty(); + } + + boolean simpleAreStacksEqual(ItemStack stack, ItemStack stack2) { + return stack.getItem() == stack2.getItem() && stack.getItemDamage() == stack2.getItemDamage(); + } + + public List getInputs() { + return new ArrayList(inputs); + } + + public ItemStack getOutput() { + return output; + } + +} diff --git a/MODSRC/vazkii/botania/common/block/BlockDreamwood.java b/MODSRC/vazkii/botania/common/block/BlockDreamwood.java index 3883ed176..f415ec79b 100644 --- a/MODSRC/vazkii/botania/common/block/BlockDreamwood.java +++ b/MODSRC/vazkii/botania/common/block/BlockDreamwood.java @@ -1,5 +1,9 @@ package vazkii.botania.common.block; +import net.minecraft.block.Block; +import cpw.mods.fml.common.registry.GameRegistry; +import vazkii.botania.common.item.block.ItemBlockDreamwood; +import vazkii.botania.common.item.block.ItemBlockPool; import vazkii.botania.common.lib.LibBlockNames; public class BlockDreamwood extends BlockLivingwood { @@ -7,5 +11,9 @@ public class BlockDreamwood extends BlockLivingwood { public BlockDreamwood() { super(LibBlockNames.DREAM_WOOD); } - + + @Override + void register(String name) { + GameRegistry.registerBlock(this, ItemBlockDreamwood.class, name); + } } diff --git a/MODSRC/vazkii/botania/common/block/BlockLivingwood.java b/MODSRC/vazkii/botania/common/block/BlockLivingwood.java index 71d7e23ec..53d2104d1 100644 --- a/MODSRC/vazkii/botania/common/block/BlockLivingwood.java +++ b/MODSRC/vazkii/botania/common/block/BlockLivingwood.java @@ -52,7 +52,7 @@ public class BlockLivingwood extends BlockMod implements ILexiconable { protected boolean shouldRegisterInNameSet() { return false; } - + @Override public int damageDropped(int par1) { return par1; @@ -60,10 +60,14 @@ public class BlockLivingwood extends BlockMod implements ILexiconable { @Override public Block setBlockName(String par1Str) { - GameRegistry.registerBlock(this, ItemBlockWithMetadataAndName.class, par1Str); + register(par1Str); return super.setBlockName(par1Str); } - + + void register(String name) { + GameRegistry.registerBlock(this, ItemBlockWithMetadataAndName.class, name); + } + @Override public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) { for(int i = 0; i < TYPES; i++) diff --git a/MODSRC/vazkii/botania/common/block/tile/TileAlfPortal.java b/MODSRC/vazkii/botania/common/block/tile/TileAlfPortal.java index 8e99a7a48..abfe2788c 100644 --- a/MODSRC/vazkii/botania/common/block/tile/TileAlfPortal.java +++ b/MODSRC/vazkii/botania/common/block/tile/TileAlfPortal.java @@ -24,6 +24,7 @@ import net.minecraft.util.AxisAlignedBB; import vazkii.botania.api.BotaniaAPI; import vazkii.botania.api.lexicon.ILexicon; import vazkii.botania.api.recipe.IElvenItem; +import vazkii.botania.api.recipe.RecipeElvenTrade; import vazkii.botania.common.Botania; import vazkii.botania.common.block.ModBlocks; import vazkii.botania.common.block.tile.mana.TilePool; @@ -116,8 +117,6 @@ public class TileAlfPortal extends TileMod { if(ticksSinceLastItem >= 20) { if(!worldObj.isRemote) resolveRecipes(); - - ticksSinceLastItem = 0; } } @@ -155,11 +154,6 @@ public class TileAlfPortal extends TileMod { worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, newMeta, 1 | 2); return true; } - } else { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 1 | 2); - for(int i = 0; i < 36; i++) - blockParticle(meta); - return true; } return false; @@ -192,13 +186,19 @@ public class TileAlfPortal extends TileMod { i++; } - - // Handle recipe registry here + for(RecipeElvenTrade recipe : BotaniaAPI.elvenTradeRecipes) { + if(recipe.matches(stacksIn, false)) { + recipe.matches(stacksIn, true); + spawnItem(recipe.getOutput().copy()); + break; + } + } } void spawnItem(ItemStack stack) { EntityItem item = new EntityItem(worldObj, xCoord + 0.5, yCoord + 1.5, zCoord + 0.5, stack); worldObj.spawnEntityInWorld(item); + ticksSinceLastItem = 0; } @Override diff --git a/MODSRC/vazkii/botania/common/core/proxy/CommonProxy.java b/MODSRC/vazkii/botania/common/core/proxy/CommonProxy.java index 7fcea5c3a..f391e7ba2 100644 --- a/MODSRC/vazkii/botania/common/core/proxy/CommonProxy.java +++ b/MODSRC/vazkii/botania/common/core/proxy/CommonProxy.java @@ -30,6 +30,7 @@ import vazkii.botania.common.core.handler.ManaNetworkHandler; import vazkii.botania.common.core.helper.Vector3; import vazkii.botania.common.core.version.CommandDownloadLatest; import vazkii.botania.common.crafting.ModCrafingRecipes; +import vazkii.botania.common.crafting.ModElvenTradeRecipes; import vazkii.botania.common.crafting.ModManaAlchemyRecipes; import vazkii.botania.common.crafting.ModManaInfusionRecipes; import vazkii.botania.common.crafting.ModPetalRecipes; @@ -62,6 +63,7 @@ public class CommonProxy { ModRuneRecipes.init(); ModManaInfusionRecipes.init(); ModManaAlchemyRecipes.init(); + ModElvenTradeRecipes.init(); LexiconData.init(); } diff --git a/MODSRC/vazkii/botania/common/crafting/ModElvenTradeRecipes.java b/MODSRC/vazkii/botania/common/crafting/ModElvenTradeRecipes.java new file mode 100644 index 000000000..4f9d236ec --- /dev/null +++ b/MODSRC/vazkii/botania/common/crafting/ModElvenTradeRecipes.java @@ -0,0 +1,24 @@ +package vazkii.botania.common.crafting; + +import net.minecraft.item.ItemStack; +import vazkii.botania.api.BotaniaAPI; +import vazkii.botania.api.recipe.RecipeElvenTrade; +import vazkii.botania.common.block.ModBlocks; +import vazkii.botania.common.item.ModItems; +import vazkii.botania.common.lib.LibOreDict; + +public class ModElvenTradeRecipes { + + public static RecipeElvenTrade dreamwoodRecipe; + public static RecipeElvenTrade elementiumRecipe; + public static RecipeElvenTrade pixieDustRecipe; + public static RecipeElvenTrade dragonstoneRecipe; + + public static void init() { + dreamwoodRecipe = BotaniaAPI.registerElvenTradeRecipe(new ItemStack(ModBlocks.dreamwood), LibOreDict.LIVING_WOOD); + elementiumRecipe = BotaniaAPI.registerElvenTradeRecipe(new ItemStack(ModItems.manaResource, 1, 7), LibOreDict.MANA_STEEL, LibOreDict.MANA_STEEL); + pixieDustRecipe = BotaniaAPI.registerElvenTradeRecipe(new ItemStack(ModItems.manaResource, 1, 8), LibOreDict.MANA_PEARL); + dragonstoneRecipe = BotaniaAPI.registerElvenTradeRecipe(new ItemStack(ModItems.manaResource, 1, 9), LibOreDict.MANA_DIAMOND); + } + +} diff --git a/MODSRC/vazkii/botania/common/item/block/ItemBlockDreamwood.java b/MODSRC/vazkii/botania/common/item/block/ItemBlockDreamwood.java new file mode 100644 index 000000000..eec1ada5e --- /dev/null +++ b/MODSRC/vazkii/botania/common/item/block/ItemBlockDreamwood.java @@ -0,0 +1,18 @@ +package vazkii.botania.common.item.block; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import vazkii.botania.api.recipe.IElvenItem; + +public class ItemBlockDreamwood extends ItemBlockWithMetadataAndName implements IElvenItem { + + public ItemBlockDreamwood(Block block) { + super(block); + } + + @Override + public boolean isElvenItem(ItemStack stack) { + return true; + } + +}