diff --git a/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java new file mode 100644 index 00000000..4d642317 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/recipe/AlchemyTableRecipe.java @@ -0,0 +1,147 @@ +package WayofTime.bloodmagic.api.recipe; + +import lombok.Getter; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public class AlchemyTableRecipe +{ + protected ItemStack output = null; + protected ArrayList input = new ArrayList(); + @Getter + protected int lpDrained; + @Getter + protected int ticksRequired; + @Getter + protected int tierRequired; + + public AlchemyTableRecipe(Block result, int lpDrained, int ticksRequired, int tierRequired, Object... recipe) + { + this(new ItemStack(result), lpDrained, ticksRequired, tierRequired, recipe); + } + + public AlchemyTableRecipe(Item result, int lpDrained, int ticksRequired, int tierRequired, Object... recipe) + { + this(new ItemStack(result), lpDrained, ticksRequired, tierRequired, recipe); + } + + public AlchemyTableRecipe(ItemStack result, int lpDrained, int ticksRequired, int tierRequired, Object... recipe) + { + output = result.copy(); + this.lpDrained = lpDrained; + this.ticksRequired = ticksRequired; + this.tierRequired = tierRequired; + for (Object in : recipe) + { + if (in instanceof ItemStack) + { + input.add(((ItemStack) in).copy()); + } else if (in instanceof Item) + { + input.add(new ItemStack((Item) in)); + } else if (in instanceof Block) + { + input.add(new ItemStack((Block) in)); + } else if (in instanceof String) + { + input.add(OreDictionary.getOres((String) in)); + } else + { + String ret = "Invalid alchemy recipe: "; + for (Object tmp : recipe) + { + ret += tmp + ", "; + } + ret += output; + throw new RuntimeException(ret); + } + } + } + + /** + * Returns the size of the recipe area + */ + public int getRecipeSize() + { + return input.size(); + } + + public ItemStack getRecipeOutput() + { + return output.copy(); + } + + /** + * Used to check if a recipe matches current crafting inventory. World and + * BlockPos are for future-proofing + */ + @SuppressWarnings("unchecked") + public boolean matches(List checkedList, World world, BlockPos pos) + { + ArrayList required = new ArrayList(input); + + for (int x = 0; x < checkedList.size(); x++) + { + ItemStack slot = checkedList.get(x); + + if (slot != null) + { + boolean inRecipe = false; + Iterator req = required.iterator(); + + while (req.hasNext()) + { + boolean match = false; + + Object next = req.next(); + + if (next instanceof ItemStack) + { + match = OreDictionary.itemMatches((ItemStack) next, slot, false); + } else if (next instanceof List) + { + Iterator itr = ((List) next).iterator(); + while (itr.hasNext() && !match) + { + match = OreDictionary.itemMatches(itr.next(), slot, false); + } + } + + if (match) + { + inRecipe = true; + required.remove(next); + break; + } + } + + if (!inRecipe) + { + return false; + } + } + } + + return required.isEmpty(); + } + + /** + * Returns the input for this recipe, any mod accessing this value should + * never manipulate the values in this array as it will effect the recipe + * itself. + * + * @return The recipes input vales. + */ + public ArrayList getInput() + { + return this.input; + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyTableRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyTableRecipeRegistry.java new file mode 100644 index 00000000..f97025ad --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyTableRecipeRegistry.java @@ -0,0 +1,42 @@ +package WayofTime.bloodmagic.api.registry; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import WayofTime.bloodmagic.api.recipe.AlchemyTableRecipe; + +public class AlchemyTableRecipeRegistry +{ + private static List recipeList = new ArrayList(); + + public static void registerRecipe(AlchemyTableRecipe recipe) + { + recipeList.add(recipe); + } + + public static void registerRecipe(ItemStack outputStack, int lpDrained, int ticksRequired, int tierRequired, Object... objects) + { + registerRecipe(new AlchemyTableRecipe(outputStack, lpDrained, ticksRequired, tierRequired, objects)); + } + + public static AlchemyTableRecipe getMatchingRecipe(List itemList, World world, BlockPos pos) + { + for (AlchemyTableRecipe recipe : recipeList) + { + if (recipe.matches(itemList, world, pos)) + { + return recipe; + } + } + + return null; + } + + public static List getRecipeList() + { + return new ArrayList(recipeList); + } +} \ No newline at end of file