diff --git a/common/ic2/api/energy/tile/IEnergySink.java b/common/ic2/api/energy/tile/IEnergySink.java index 36ca03ea6..9826d54e0 100644 --- a/common/ic2/api/energy/tile/IEnergySink.java +++ b/common/ic2/api/energy/tile/IEnergySink.java @@ -21,6 +21,9 @@ public interface IEnergySink extends IEnergyAcceptor { /** * Transfer energy to the sink. + * + * It's highly recommended to accept all energy by letting the internal buffer overflow to + * increase the performance and accuracy of the distribution simulation. * * @param directionFrom direction from which the energy comes from * @param amount energy to be transferred diff --git a/common/ic2/api/energy/tile/IEnergySource.java b/common/ic2/api/energy/tile/IEnergySource.java index e7f8f0010..1a8bc0a5f 100644 --- a/common/ic2/api/energy/tile/IEnergySource.java +++ b/common/ic2/api/energy/tile/IEnergySource.java @@ -19,7 +19,7 @@ public interface IEnergySource extends IEnergyEmitter { * * If the source doesn't have a buffer, this is a no-op. * - * @param amount amount of EU to draw + * @param amount amount of EU to draw, may be negative */ void drawEnergy(double amount); } diff --git a/common/ic2/api/recipe/IMachineRecipeManager.java b/common/ic2/api/recipe/IMachineRecipeManager.java index e7438110a..77afaea75 100644 --- a/common/ic2/api/recipe/IMachineRecipeManager.java +++ b/common/ic2/api/recipe/IMachineRecipeManager.java @@ -18,7 +18,7 @@ public interface IMachineRecipeManager { * @param metadata meta data for additional recipe properties, may be null * @param outputs Recipe outputs, zero or more depending on the machine */ - public void addRecipe(ItemStack input, NBTTagCompound metadata, ItemStack... outputs); + public void addRecipe(IRecipeInput input, NBTTagCompound metadata, ItemStack... outputs); /** * Gets the recipe output for the given input. @@ -35,5 +35,5 @@ public interface IMachineRecipeManager { * * @return List of recipes */ - public Map getRecipes(); + public Map getRecipes(); } diff --git a/common/ic2/api/recipe/IPatternStorage.java b/common/ic2/api/recipe/IPatternStorage.java index 0fb094c9c..f51f0de7d 100644 --- a/common/ic2/api/recipe/IPatternStorage.java +++ b/common/ic2/api/recipe/IPatternStorage.java @@ -4,6 +4,12 @@ import net.minecraft.item.ItemStack; public interface IPatternStorage { - boolean transferPattern(ItemStack itemstack, short amountUU , int amountEU); + boolean transferPattern(ItemStack itemstack, int amountUU , int amountEU); + + int[] getPatternvalus(ItemStack itemstack); + + short getPatternCount(); + + ItemStack getPatternItemstack(int index); } diff --git a/common/ic2/api/recipe/IRecipeInput.java b/common/ic2/api/recipe/IRecipeInput.java new file mode 100644 index 000000000..0c842d639 --- /dev/null +++ b/common/ic2/api/recipe/IRecipeInput.java @@ -0,0 +1,31 @@ +package ic2.api.recipe; + +import java.util.List; + +import net.minecraft.item.ItemStack; + +public interface IRecipeInput { + /** + * Check if subject matches this recipe input, ignoring the amount. + * + * @param subject ItemStack to check + * @return true if it matches the requirement + */ + boolean matches(ItemStack subject); + + /** + * Determine the minimum input stack size. + * + * @return input amount required + */ + int getAmount(); + + /** + * List all possible inputs (best effort). + * + * The stack size is undefined, use getAmount to get the correct one. + * + * @return list of inputs, may be incomplete + */ + List getInputs(); +} diff --git a/common/ic2/api/recipe/RecipeInputItemStack.java b/common/ic2/api/recipe/RecipeInputItemStack.java new file mode 100644 index 000000000..a2a9195d7 --- /dev/null +++ b/common/ic2/api/recipe/RecipeInputItemStack.java @@ -0,0 +1,38 @@ +package ic2.api.recipe; + +import java.util.Arrays; +import java.util.List; + +import net.minecraft.item.ItemStack; + +import net.minecraftforge.oredict.OreDictionary; + +public class RecipeInputItemStack implements IRecipeInput { + public RecipeInputItemStack(ItemStack input) { + this(input, input.stackSize); + } + + public RecipeInputItemStack(ItemStack input, int amount) { + this.input = input; + this.amount = amount; + } + + @Override + public boolean matches(ItemStack subject) { + return subject.itemID == input.itemID && + (subject.getItemDamage() == input.getItemDamage() || input.getItemDamage() == OreDictionary.WILDCARD_VALUE); + } + + @Override + public int getAmount() { + return amount; + } + + @Override + public List getInputs() { + return Arrays.asList(input); + } + + public final ItemStack input; + public final int amount; +} diff --git a/common/ic2/api/recipe/RecipeInputOreDict.java b/common/ic2/api/recipe/RecipeInputOreDict.java new file mode 100644 index 000000000..eb804b2aa --- /dev/null +++ b/common/ic2/api/recipe/RecipeInputOreDict.java @@ -0,0 +1,45 @@ +package ic2.api.recipe; + +import java.util.List; + +import net.minecraft.item.ItemStack; + +import net.minecraftforge.oredict.OreDictionary; + +public class RecipeInputOreDict implements IRecipeInput { + public RecipeInputOreDict(String input) { + this(input, 1); + } + + public RecipeInputOreDict(String input, int amount) { + this.input = input; + this.amount = amount; + } + + @Override + public boolean matches(ItemStack subject) { + List inputs = OreDictionary.getOres(input); + + for (ItemStack input : inputs) { + if (subject.itemID == input.itemID && + (subject.getItemDamage() == input.getItemDamage() || input.getItemDamage() == OreDictionary.WILDCARD_VALUE)) { + return true; + } + } + + return false; + } + + @Override + public int getAmount() { + return amount; + } + + @Override + public List getInputs() { + return OreDictionary.getOres(input); + } + + public final String input; + public final int amount; +} diff --git a/common/ic2/api/recipe/Recipes.java b/common/ic2/api/recipe/Recipes.java index 608d38b67..56ae19a85 100644 --- a/common/ic2/api/recipe/Recipes.java +++ b/common/ic2/api/recipe/Recipes.java @@ -16,7 +16,7 @@ public class Recipes { public static IMachineRecipeManager metalformerExtruding; public static IMachineRecipeManager metalformerCutting; public static IMachineRecipeManager metalformerRolling; - public static IMachineRecipeManager orewasching; + public static IMachineRecipeManager oreWashing; public static IMachineRecipeManager Scanner; /** diff --git a/common/mekanism/common/Mekanism.java b/common/mekanism/common/Mekanism.java index 88b51f398..a2ae05312 100644 --- a/common/mekanism/common/Mekanism.java +++ b/common/mekanism/common/Mekanism.java @@ -1,5 +1,6 @@ package mekanism.common; +import ic2.api.recipe.RecipeInputItemStack; import ic2.api.recipe.Recipes; import java.io.File; @@ -9,13 +10,13 @@ import java.util.List; import java.util.Map; import java.util.logging.Logger; +import mekanism.api.Object3D; import mekanism.api.gas.GasNetwork.GasTransferEvent; import mekanism.api.infuse.InfuseObject; import mekanism.api.infuse.InfuseRegistry; import mekanism.api.infuse.InfuseType; import mekanism.api.infuse.InfusionInput; import mekanism.api.transmitters.TransmitterNetworkRegistry; -import mekanism.api.Object3D; import mekanism.client.sound.SoundHandler; import mekanism.common.EnergyNetwork.EnergyTransferEvent; import mekanism.common.FluidNetwork.FluidTransferEvent; @@ -944,7 +945,7 @@ public class Mekanism if(hooks.IC2Loaded) { - Recipes.macerator.addRecipe(new ItemStack(Ingot, 1, 2), null, MekanismUtils.size(OreDictionary.getOres("dustBronze").get(0), 1)); + Recipes.macerator.addRecipe(new RecipeInputItemStack(new ItemStack(Ingot, 1, 2), 1), null, MekanismUtils.size(OreDictionary.getOres("dustBronze").get(0), 1)); } if(hooks.TELoaded) { diff --git a/common/mekanism/common/MekanismHooks.java b/common/mekanism/common/MekanismHooks.java index aad07d34a..36b76079b 100644 --- a/common/mekanism/common/MekanismHooks.java +++ b/common/mekanism/common/MekanismHooks.java @@ -1,5 +1,7 @@ package mekanism.common; +import ic2.api.recipe.IRecipeInput; +import ic2.api.recipe.RecipeInputItemStack; import ic2.api.recipe.RecipeOutput; import ic2.api.recipe.Recipes; @@ -52,34 +54,34 @@ public final class MekanismHooks if(IC2Loaded) { - Recipes.macerator.addRecipe(new ItemStack(Mekanism.OreBlock, 1, 0), null, new ItemStack(Mekanism.Dust, 2, 2)); + Recipes.macerator.addRecipe(new RecipeInputItemStack(new ItemStack(Mekanism.OreBlock, 1, 0), 1), null, new ItemStack(Mekanism.Dust, 2, 2)); - Recipes.macerator.addRecipe(new ItemStack(Mekanism.Ingot, 1, 1), null, new ItemStack(Mekanism.Dust, 1, 2)); - Recipes.macerator.addRecipe(new ItemStack(Mekanism.Ingot, 1, 0), null, new ItemStack(Mekanism.Dust, 1, 3)); - Recipes.macerator.addRecipe(new ItemStack(Mekanism.Ingot, 1, 3), null, new ItemStack(Item.glowstone)); - Recipes.macerator.addRecipe(new ItemStack(Mekanism.Ingot, 1, 4), null, new ItemStack(Mekanism.Dust, 1, 5)); + Recipes.macerator.addRecipe(new RecipeInputItemStack(new ItemStack(Mekanism.Ingot, 1, 1), 1), null, new ItemStack(Mekanism.Dust, 1, 2)); + Recipes.macerator.addRecipe(new RecipeInputItemStack(new ItemStack(Mekanism.Ingot, 1, 0), 1), null, new ItemStack(Mekanism.Dust, 1, 3)); + Recipes.macerator.addRecipe(new RecipeInputItemStack(new ItemStack(Mekanism.Ingot, 1, 3), 1), null, new ItemStack(Item.glowstone)); + Recipes.macerator.addRecipe(new RecipeInputItemStack(new ItemStack(Mekanism.Ingot, 1, 4), 1), null, new ItemStack(Mekanism.Dust, 1, 5)); - Recipes.macerator.addRecipe(new ItemStack(Mekanism.Clump, 1, 0), null, new ItemStack(Mekanism.DirtyDust, 1, 0)); - Recipes.macerator.addRecipe(new ItemStack(Mekanism.Clump, 1, 1), null, new ItemStack(Mekanism.DirtyDust, 1, 1)); - Recipes.macerator.addRecipe(new ItemStack(Mekanism.Clump, 1, 2), null, new ItemStack(Mekanism.DirtyDust, 1, 2)); - Recipes.macerator.addRecipe(new ItemStack(Mekanism.Clump, 1, 3), null, new ItemStack(Mekanism.DirtyDust, 1, 3)); - Recipes.macerator.addRecipe(new ItemStack(Mekanism.Clump, 1, 4), null, new ItemStack(Mekanism.DirtyDust, 1, 4)); - Recipes.macerator.addRecipe(new ItemStack(Mekanism.Clump, 1, 5), null, new ItemStack(Mekanism.DirtyDust, 1, 5)); + Recipes.macerator.addRecipe(new RecipeInputItemStack(new ItemStack(Mekanism.Clump, 1, 0), 1), null, new ItemStack(Mekanism.DirtyDust, 1, 0)); + Recipes.macerator.addRecipe(new RecipeInputItemStack(new ItemStack(Mekanism.Clump, 1, 1), 1), null, new ItemStack(Mekanism.DirtyDust, 1, 1)); + Recipes.macerator.addRecipe(new RecipeInputItemStack(new ItemStack(Mekanism.Clump, 1, 2), 1), null, new ItemStack(Mekanism.DirtyDust, 1, 2)); + Recipes.macerator.addRecipe(new RecipeInputItemStack(new ItemStack(Mekanism.Clump, 1, 3), 1), null, new ItemStack(Mekanism.DirtyDust, 1, 3)); + Recipes.macerator.addRecipe(new RecipeInputItemStack(new ItemStack(Mekanism.Clump, 1, 4), 1), null, new ItemStack(Mekanism.DirtyDust, 1, 4)); + Recipes.macerator.addRecipe(new RecipeInputItemStack(new ItemStack(Mekanism.Clump, 1, 5), 1), null, new ItemStack(Mekanism.DirtyDust, 1, 5)); - for(Map.Entry entry : Recipes.macerator.getRecipes().entrySet()) + for(Map.Entry entry : Recipes.macerator.getRecipes().entrySet()) { - if(MekanismUtils.getName(entry.getKey()).startsWith("ore")) + if(MekanismUtils.getName(entry.getKey().getInputs().get(0)).startsWith("ore")) { - if(!Recipe.ENRICHMENT_CHAMBER.containsRecipe(entry.getKey())) + if(!Recipe.ENRICHMENT_CHAMBER.containsRecipe(entry.getKey().getInputs().get(0))) { - RecipeHandler.addEnrichmentChamberRecipe(entry.getKey(), entry.getValue().items.get(0)); + RecipeHandler.addEnrichmentChamberRecipe(entry.getKey().getInputs().get(0), entry.getValue().items.get(0)); } } - else if(MekanismUtils.getName(entry.getKey()).startsWith("ingot")) + else if(MekanismUtils.getName(entry.getKey().getInputs().get(0)).startsWith("ingot")) { - if(!Recipe.CRUSHER.containsRecipe(entry.getKey())) + if(!Recipe.CRUSHER.containsRecipe(entry.getKey().getInputs().get(0))) { - RecipeHandler.addCrusherRecipe(entry.getKey(), entry.getValue().items.get(0)); + RecipeHandler.addCrusherRecipe(entry.getKey().getInputs().get(0), entry.getValue().items.get(0)); } } } @@ -87,7 +89,7 @@ public final class MekanismHooks NBTTagCompound tag = new NBTTagCompound(); tag.setInteger("amplification", 50000); - Recipes.matterAmplifier.addRecipe(new ItemStack(Mekanism.EnrichedAlloy), tag); + Recipes.matterAmplifier.addRecipe(new RecipeInputItemStack(new ItemStack(Mekanism.EnrichedAlloy), 1), tag); System.out.println("[Mekanism] Hooked into IC2 successfully."); }