diff options
| author | Draknyte1 <Draknyte1@hotmail.com> | 2016-05-15 11:33:32 +1000 |
|---|---|---|
| committer | Draknyte1 <Draknyte1@hotmail.com> | 2016-05-15 11:33:32 +1000 |
| commit | 6d4c465858fe1a199628de86edff1152f97faa52 (patch) | |
| tree | 3b6b27cbff7c245308306910f9e7b9be22eb24f4 /src/Java | |
| parent | 1d5ca1b761e2fba9e1ba63655da738c7a4cb8137 (diff) | |
| download | GT5-Unofficial-6d4c465858fe1a199628de86edff1152f97faa52.tar.gz GT5-Unofficial-6d4c465858fe1a199628de86edff1152f97faa52.tar.bz2 GT5-Unofficial-6d4c465858fe1a199628de86edff1152f97faa52.zip | |
First steps towards the Industrial Coking Oven, plus some other misc fixes.
SteamCondenser doesn't show it's tickTime in GUI anymore.
Added compat for some IC2 cables and TC/FB shards.
Added compat for CompactWindmills.
Implemented compat handler for OreDicting/Recipe handling
Diffstat (limited to 'src/Java')
13 files changed, 1147 insertions, 110 deletions
diff --git a/src/Java/miscutil/MiscUtils.java b/src/Java/miscutil/MiscUtils.java index e6ccf74fc2..2478f8fbb9 100644 --- a/src/Java/miscutil/MiscUtils.java +++ b/src/Java/miscutil/MiscUtils.java @@ -5,6 +5,7 @@ import java.awt.event.ActionListener; import miscutil.core.commands.CommandMath; import miscutil.core.common.CommonProxy; +import miscutil.core.common.compat.COMPAT_HANDLER; import miscutil.core.creative.AddToCreativeTab; import miscutil.core.handler.events.PickaxeBlockBreakEventHandler; import miscutil.core.lib.CORE; @@ -60,7 +61,6 @@ implements ActionListener public void init(FMLInitializationEvent event) { proxy.init(event); - proxy.registerOreDict(); MinecraftForge.EVENT_BUS.register(this); MinecraftForge.EVENT_BUS.register(new PickaxeBlockBreakEventHandler()); if (CORE.DEBUG){ @@ -84,6 +84,7 @@ implements ActionListener { event.registerServerCommand(new CommandMath()); Uptime.serverStarting(); //Integration of Uptime. + COMPAT_HANDLER.ServerStartedEvent(); } diff --git a/src/Java/miscutil/core/common/CommonProxy.java b/src/Java/miscutil/core/common/CommonProxy.java index e0af693445..54a0e18d9b 100644 --- a/src/Java/miscutil/core/common/CommonProxy.java +++ b/src/Java/miscutil/core/common/CommonProxy.java @@ -4,19 +4,11 @@ import static miscutil.core.lib.CORE.DEBUG; import static miscutil.core.lib.LoadedMods.Gregtech; import gregtech.api.util.GT_OreDictUnificator; import miscutil.core.block.ModBlocks; -import miscutil.core.common.compat.COMPAT_BigReactors; -import miscutil.core.common.compat.COMPAT_EnderIO; -import miscutil.core.common.compat.COMPAT_ExtraUtils; -import miscutil.core.common.compat.COMPAT_MorePlanets; -import miscutil.core.common.compat.COMPAT_PneumaticCraft; -import miscutil.core.common.compat.COMPAT_RFTools; -import miscutil.core.common.compat.COMPAT_SimplyJetpacks; -import miscutil.core.common.compat.COMPAT_Thaumcraft; +import miscutil.core.common.compat.COMPAT_HANDLER; import miscutil.core.gui.ModGUI; import miscutil.core.handler.registration.RegistrationHandler; import miscutil.core.item.ModItems; import miscutil.core.lib.CORE; -import miscutil.core.lib.LoadedMods; import miscutil.core.tileentities.ModTileEntities; import miscutil.core.util.Utils; import miscutil.core.util.UtilsItems; @@ -80,9 +72,7 @@ public class CommonProxy { } public void postInit(FMLPostInitializationEvent e) { - - - + registerOreDict(); } public void registerNetworkStuff(){ @@ -104,9 +94,9 @@ public class CommonProxy { } @SuppressWarnings("static-method") - public void registerOreDict(){ + private void registerOreDict(){ - Utils.LOG_INFO("Registering Ingots & Plates with OreDict."); + Utils.LOG_INFO("Registering Materials with OreDict."); //In-house //tools @@ -127,94 +117,13 @@ public class CommonProxy { GT_OreDictUnificator.registerOre("bufferCore_"+CORE.VOLTAGES[i-1], new ItemStack(UtilsItems.getItem("miscutils:item.itemBufferCore"+i))); } - - //InterMod - if (LoadedMods.Big_Reactors){ - COMPAT_BigReactors.OreDict(); - } - if (LoadedMods.EnderIO){ - COMPAT_EnderIO.OreDict(); - } - if (LoadedMods.MorePlanets){ - COMPAT_MorePlanets.OreDict(); - } - if (LoadedMods.Simply_Jetpacks){ - COMPAT_SimplyJetpacks.OreDict(); - } - if (LoadedMods.RFTools){ - COMPAT_RFTools.OreDict(); - } - if (LoadedMods.Thaumcraft){ - COMPAT_Thaumcraft.OreDict(); - } - if (LoadedMods.Extra_Utils){ - COMPAT_ExtraUtils.OreDict(); - } - if (LoadedMods.PneumaticCraft){ - COMPAT_PneumaticCraft.OreDict(); - } + //Do Inter-Mod Compatibility + COMPAT_HANDLER.run(); } - - - - - - - - - - - @SuppressWarnings("static-method") public int addArmor(String armor) { return 0; } } - - -/* - * - * try{ - Item em = null; - //Item em1 = GameRegistry.findItem("ThaumCraft", "ItemResource:16"); - //Item em2 = GameRegistry.findItem("ThaumCraft", "<ItemResource:16>"); - - Item em1 = Utils.getItem("Thaumcraft:ItemResource:16"); - Utils.LOG_WARNING("Found: "+em1.toString()); - if (!em1.equals(null)){ - em = em1; - } - else { - em = null; - } - if (!em.equals(null)){ - ItemStack voidIngot = new ItemStack(em,1,16); - //GT_OreDictUnificator.registerOre("ingotVoidMetal", new ItemStack(em)); - //GameRegistry.registerCustomItemStack("ingotVoidMetal", voidIngot); - GT_OreDictUnificator.registerOre("ingotVoidMetal", voidIngot); - } - else { - Utils.LOG_WARNING("Void Metal Ingot not found."); - } - } catch (NullPointerException e) { - Utils.LOG_ERROR("Void Metal Ingot not found. [NULL]"); - } - - try { -Item em = null; -Item em1 = Utils.getItem("ExtraUtilities:bedrockiumIngot"); -Utils.LOG_WARNING("Found: "+em1.toString()); -if (!em1.equals(null)){ - em = em1; -} -if (!em.equals(null)){ - GT_OreDictUnificator.registerOre("ingotBedrockium", new ItemStack(em)); -} -else { - Utils.LOG_WARNING("Bedrockium Ingot not found."); -} -} catch (NullPointerException e) { - Utils.LOG_ERROR("Bedrockium Ingot not found. [NULL]"); -}*/ diff --git a/src/Java/miscutil/core/common/compat/COMPAT_CompactWindmills.java b/src/Java/miscutil/core/common/compat/COMPAT_CompactWindmills.java new file mode 100644 index 0000000000..98988f25c0 --- /dev/null +++ b/src/Java/miscutil/core/common/compat/COMPAT_CompactWindmills.java @@ -0,0 +1,20 @@ +package miscutil.core.common.compat; + +import static miscutil.core.common.compat.COMPAT_HANDLER.RemoveRecipeQueue; + + + +public class COMPAT_CompactWindmills { + + public static void OreDict(){ + run(); + } + + private static final void run(){ + RemoveRecipeQueue.add("CompactWindmills:WOOL"); + RemoveRecipeQueue.add("CompactWindmills:WOOD"); + RemoveRecipeQueue.add("CompactWindmills:ALLOY"); + RemoveRecipeQueue.add("CompactWindmills:CARBON"); + RemoveRecipeQueue.add("CompactWindmills:IRIDIUM"); + } +} diff --git a/src/Java/miscutil/core/common/compat/COMPAT_HANDLER.java b/src/Java/miscutil/core/common/compat/COMPAT_HANDLER.java new file mode 100644 index 0000000000..7c39859a1a --- /dev/null +++ b/src/Java/miscutil/core/common/compat/COMPAT_HANDLER.java @@ -0,0 +1,63 @@ +package miscutil.core.common.compat; + +import static miscutil.core.util.UtilsItems.removeCraftingRecipe; + +import java.util.LinkedList; +import java.util.Queue; + +import miscutil.core.lib.LoadedMods; + +public class COMPAT_HANDLER { + + public static Queue<Object> RemoveRecipeQueue = new LinkedList<Object>(); + public static Queue<Object> AddRecipeQueue = new LinkedList<Object>(); + + //InterMod + public static void run(){ + + if (LoadedMods.Big_Reactors){ + COMPAT_BigReactors.OreDict(); + } + if (LoadedMods.EnderIO){ + COMPAT_EnderIO.OreDict(); + } + if (LoadedMods.MorePlanets){ + COMPAT_MorePlanets.OreDict(); + } + if (LoadedMods.Simply_Jetpacks){ + COMPAT_SimplyJetpacks.OreDict(); + } + if (LoadedMods.RFTools){ + COMPAT_RFTools.OreDict(); + } + if (LoadedMods.Thaumcraft){ + COMPAT_Thaumcraft.OreDict(); + } + if (LoadedMods.Extra_Utils){ + COMPAT_ExtraUtils.OreDict(); + } + if (LoadedMods.PneumaticCraft){ + COMPAT_PneumaticCraft.OreDict(); + } + if (LoadedMods.CompactWindmills){ + COMPAT_CompactWindmills.OreDict(); + } + if (LoadedMods.IndustrialCraft2){ + COMPAT_IC2.OreDict(); + } + } + + public static void ServerStartedEvent(){ + //Removal of Recipes + for(Object item : RemoveRecipeQueue){ + removeCraftingRecipe(item); + } + } + + public static void ServerStartedEvent_RECIPES(){ + //Remoal Recipes + for(Object item : AddRecipeQueue){ + removeCraftingRecipe(item); + } + } +} diff --git a/src/Java/miscutil/core/common/compat/COMPAT_IC2.java b/src/Java/miscutil/core/common/compat/COMPAT_IC2.java new file mode 100644 index 0000000000..50daca16ce --- /dev/null +++ b/src/Java/miscutil/core/common/compat/COMPAT_IC2.java @@ -0,0 +1,48 @@ +package miscutil.core.common.compat; + +import static miscutil.core.common.compat.COMPAT_HANDLER.RemoveRecipeQueue; +import miscutil.core.util.UtilsItems; +import net.minecraft.item.ItemStack; + + +public class COMPAT_IC2 { + + private static ItemStack temp_1; + private static ItemStack temp_2; + private static ItemStack temp_3; + private static ItemStack temp_4; + private static ItemStack temp_5; + + + + public static void OreDict(){ + //Get ItemStacks for results + temp_1 = UtilsItems.getItemStack("IC2:itemCropnalyzer", 1); + temp_2 = UtilsItems.getItemStack("IC2:itemSolarHelmet", 1); + run(); + } + + private static final void run(){ + //Fuck these right off. + RemoveRecipeQueue.add("IC2:itemCable"); + RemoveRecipeQueue.add("IC2:itemCable:1"); + RemoveRecipeQueue.add("IC2:itemCable:2"); + RemoveRecipeQueue.add("IC2:itemCable:3"); + RemoveRecipeQueue.add("IC2:itemCable:5"); + RemoveRecipeQueue.add("IC2:itemCable:6"); + RemoveRecipeQueue.add("IC2:itemCable:10"); + RemoveRecipeQueue.add("IC2:itemCable:13"); + + RemoveRecipeQueue.add(temp_1); + UtilsItems.recipeBuilder("ore:craftingWireCopper", "ore:craftingWireCopper", null, + "minecraft:redstone", "minecraft:glass", "minecraft:redstone", + "minecraft:redstone", "ore:circuitBasic", "minecraft:redstone", + temp_1); + RemoveRecipeQueue.add(temp_2); + UtilsItems.recipeBuilder("ore:plateIron", "ore:plateIron", "ore:plateIron", + "ore:plateIron", "gregtech:gt.metaitem.01:32750", "ore:plateIron", + "ore:craftingWireCopper", "ore:craftingWireCopper", "ore:craftingWireCopper", + temp_2); + } + +} diff --git a/src/Java/miscutil/core/lib/CORE.java b/src/Java/miscutil/core/lib/CORE.java index c5be731885..afec1ef301 100644 --- a/src/Java/miscutil/core/lib/CORE.java +++ b/src/Java/miscutil/core/lib/CORE.java @@ -13,7 +13,7 @@ public class CORE { public static final String name = "Misc. Utils"; public static final String MODID = "miscutils"; - public static final String VERSION = "1.0.3"; + public static final String VERSION = "1.0.4"; public static final boolean DEBUG = false; public static final boolean LOAD_ALL_CONTENT = false; public static final int GREG_FIRST_ID = 760; diff --git a/src/Java/miscutil/core/lib/LoadedMods.java b/src/Java/miscutil/core/lib/LoadedMods.java index cb6c206c1b..394f96a6fc 100644 --- a/src/Java/miscutil/core/lib/LoadedMods.java +++ b/src/Java/miscutil/core/lib/LoadedMods.java @@ -17,6 +17,7 @@ public class LoadedMods { public static boolean PneumaticCraft = false; public static boolean MorePlanets = false; public static boolean ForbiddenMagic = false; + public static boolean CompactWindmills = false; private static int totalMods; @@ -66,6 +67,10 @@ public class LoadedMods { ForbiddenMagic = true; totalMods++; } + if (Loader.isModLoaded("CompactWindmills") == true){ + CompactWindmills = true; + totalMods++; + } Utils.LOG_INFO("Content found for "+totalMods+" mods"); diff --git a/src/Java/miscutil/core/util/UtilsItems.java b/src/Java/miscutil/core/util/UtilsItems.java index bb10fa4f06..4323420959 100644 --- a/src/Java/miscutil/core/util/UtilsItems.java +++ b/src/Java/miscutil/core/util/UtilsItems.java @@ -3,11 +3,15 @@ package miscutil.core.util; import gregtech.api.util.GT_OreDictUnificator; import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; import miscutil.core.handler.registration.RegistrationHandler; import net.minecraft.client.Minecraft; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; import net.minecraftforge.oredict.ShapedOreRecipe; import cpw.mods.fml.common.registry.GameRegistry; @@ -40,7 +44,7 @@ public class UtilsItems { } return null; } - + public static void getItemForOreDict(String FQRN, String oreDictName, String itemName, int meta){ try { Item em = null; @@ -50,16 +54,16 @@ public class UtilsItems { em = em1; } if (em != null){ - + ItemStack metaStack = new ItemStack(em,1,meta); GT_OreDictUnificator.registerOre(oreDictName, metaStack); - + /*ItemStack itemStackWithMeta = new ItemStack(em,1,meta); GT_OreDictUnificator.registerOre(oreDictName, new ItemStack(itemStackWithMeta.getItem()));*/ } - } catch (NullPointerException e) { - Utils.LOG_ERROR(itemName+" not found. [NULL]"); - } + } catch (NullPointerException e) { + Utils.LOG_ERROR(itemName+" not found. [NULL]"); + } } public static void recipeBuilder(Object slot_1, Object slot_2, Object slot_3, Object slot_4, Object slot_5, Object slot_6, Object slot_7, Object slot_8, Object slot_9, ItemStack resultItem){ @@ -145,7 +149,7 @@ public class UtilsItems { { Utils.LOG_ERROR(""+validSlotsArray[j]); }*/ - + GameRegistry.addRecipe(new ShapedOreRecipe(resultItem.copy(), (Object[]) validSlots.toArray())); Utils.LOG_INFO("Success! Added a recipe for "+resultItem.toString()); RegistrationHandler.recipesSuccess++; @@ -199,15 +203,85 @@ public class UtilsItems { public static Item getItemInPlayersHand(){ Minecraft mc = Minecraft.getMinecraft(); Item heldItem = null; - + try{heldItem = mc.thePlayer.getHeldItem().getItem(); }catch(NullPointerException e){return null;} - + if (heldItem != null){ return heldItem; } - + return null; } + public static boolean removeCraftingRecipe(Object x){ + if (null == x){return false;} + if (x instanceof String){ + Item R = getItem((String) x); + if (R != null){ + x = R; + } + else { + return false; + } + } + if (x instanceof Item || x instanceof ItemStack){ + if (x instanceof Item){ + ItemStack r = new ItemStack((Item) x); + Utils.LOG_INFO("Removing Recipe for "+r.getUnlocalizedName()); + } + else { + Utils.LOG_INFO("Removing Recipe for "+((ItemStack) x).getUnlocalizedName()); + } + if (x instanceof ItemStack){ + Item r = ((ItemStack) x).getItem(); + if (null != r){ + x = r; + } + else { + Utils.LOG_INFO("Recipe removal failed - Tell Alkalus."); + return false; + } + } + if (attemptRecipeRemoval((Item) x)){ + Utils.LOG_INFO("Recipe removal successful"); + return true; + } + Utils.LOG_INFO("Recipe removal failed - Tell Alkalus."); + return false; + } + return false; + } + + private static boolean attemptRecipeRemoval(Item I){ + Utils.LOG_WARNING("Create list of recipes."); + List<IRecipe> recipes = CraftingManager.getInstance().getRecipeList(); + Iterator<IRecipe> items = recipes.iterator(); + Utils.LOG_WARNING("Begin list iteration."); + while (items.hasNext()) { + ItemStack is = items.next().getRecipeOutput(); + if (is != null && is.getItem() == I){ + items.remove(); + Utils.LOG_INFO("Remove a recipe with "+I.getUnlocalizedName()+" as output."); + continue; + } + } + Utils.LOG_WARNING("All recipes should be gone?"); + if (!items.hasNext()){ + Utils.LOG_WARNING("We iterated once, let's try again to double check."); + Iterator<IRecipe> items2 = recipes.iterator(); + while (items2.hasNext()) { + ItemStack is = items2.next().getRecipeOutput(); + if (is != null && is.getItem() == I){ + items.remove(); + Utils.LOG_WARNING("REMOVING MISSED RECIPE - RECHECK CONSTRUCTORS"); + return true; + } + } + Utils.LOG_WARNING("Should be all gone now after double checking, so return true."); + return true; + } + Utils.LOG_INFO("Return false, because something went wrong."); + return false; + } } diff --git a/src/Java/miscutil/gregtech/api/gui/GUI_SteamCondenser.java b/src/Java/miscutil/gregtech/api/gui/GUI_SteamCondenser.java index 6a6e01c243..2227302bb5 100644 --- a/src/Java/miscutil/gregtech/api/gui/GUI_SteamCondenser.java +++ b/src/Java/miscutil/gregtech/api/gui/GUI_SteamCondenser.java @@ -18,7 +18,7 @@ public class GUI_SteamCondenser extends GT_GUIContainerMetaTile_Machine protected void drawGuiContainerForegroundLayer(int par1, int par2) { this.fontRendererObj.drawString("Condenser", 8, 4, 4210752); - if (!CORE.DEBUG){ + if (CORE.DEBUG){ tickTime = ((CONTAINER_SteamCondenser)this.mContainer).mTickingTime; this.fontRendererObj.drawString("Tick Time: "+tickTime, 8, 12, 4210752); } diff --git a/src/Java/miscutil/gregtech/api/interfaces/internal/IGregtech_RecipeAdder.java b/src/Java/miscutil/gregtech/api/interfaces/internal/IGregtech_RecipeAdder.java new file mode 100644 index 0000000000..049611149e --- /dev/null +++ b/src/Java/miscutil/gregtech/api/interfaces/internal/IGregtech_RecipeAdder.java @@ -0,0 +1,22 @@ +package miscutil.gregtech.api.interfaces.internal; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +public interface IGregtech_RecipeAdder { + /** + * Adds a FusionreactorRecipe + * + * @param aOptimize = EU needed for heating up (must be >= 0) + * @param aInput1 = first Input (can be null, and respects StackSize) + * @param aOutput1 = Output of the Creosote (not null, and respects StackSize) + * @param bInput1 = first solid Input (not null, and respects StackSize) + * @param bOutput1 = Output of the Coal/coke (can be null, and respects StackSize) + * @param aDuration = Duration (must be >= 0) + * @param aEUt = EU needed for heating up (must be >= 0) + * @param aSpecialValue = EU needed for heating up (must be >= 0) + * @return true if the Recipe got added, otherwise false. + */ + public boolean addCokeOvenRecipe(boolean aOptimize, ItemStack[] aInputs, ItemStack[] aOutputs, Object aSpecial, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue); + +} diff --git a/src/Java/miscutil/gregtech/api/util/GregtechRecipe.java b/src/Java/miscutil/gregtech/api/util/GregtechRecipe.java new file mode 100644 index 0000000000..4fe870a830 --- /dev/null +++ b/src/Java/miscutil/gregtech/api/util/GregtechRecipe.java @@ -0,0 +1,682 @@ +package miscutil.gregtech.api.util; + +import static gregtech.api.enums.GT_Values.D1; +import static gregtech.api.enums.GT_Values.E; +import static gregtech.api.enums.GT_Values.RES_PATH_GUI; +import static gregtech.api.enums.GT_Values.W; +import gregtech.api.GregTech_API; +import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords; +import gregtech.api.objects.GT_FluidStack; +import gregtech.api.objects.GT_ItemStack; +import gregtech.api.util.GT_LanguageManager; +import gregtech.api.util.GT_Log; +import gregtech.api.util.GT_ModHandler; +import gregtech.api.util.GT_OreDictUnificator; +import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GT_Recipe.GT_Recipe_Map; +import gregtech.api.util.GT_Utility; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +/** + * NEVER INCLUDE THIS FILE IN YOUR MOD!!! + * <p/> + * This File contains the functions used for Recipes. Please do not include this File AT ALL in your Moddownload as it ruins compatibility + * This is just the Core of my Recipe System, if you just want to GET the Recipes I add, then you can access this File. + * Do NOT add Recipes using the Constructors inside this Class, The GregTech_API File calls the correct Functions for these Constructors. + * <p/> + * I know this File causes some Errors, because of missing Main Functions, but if you just need to compile Stuff, then remove said erroreous Functions. + */ +public class GregtechRecipe { + public static volatile int VERSION = 508; + /** + * If you want to change the Output, feel free to modify or even replace the whole ItemStack Array, for Inputs, please add a new Recipe, because of the HashMaps. + */ + public ItemStack[] mInputs, mOutputs; + /** + * If you want to change the Output, feel free to modify or even replace the whole ItemStack Array, for Inputs, please add a new Recipe, because of the HashMaps. + */ + public FluidStack[] mFluidInputs, mFluidOutputs; + /** + * If you changed the amount of Array-Items inside the Output Array then the length of this Array must be larger or equal to the Output Array. A chance of 10000 equals 100% + */ + public int[] mChances; + /** + * An Item that needs to be inside the Special Slot, like for example the Copy Slot inside the Printer. This is only useful for Fake Recipes in NEI, since findRecipe() and containsInput() don't give a shit about this Field. Lists are also possible. + */ + public Object mSpecialItems; + public int mDuration, mEUt, mSpecialValue; + /** + * Use this to just disable a specific Recipe, but the Configuration enables that already for every single Recipe. + */ + public boolean mEnabled = true; + /** + * If this Recipe is hidden from NEI + */ + public boolean mHidden = false; + /** + * If this Recipe is Fake and therefore doesn't get found by the findRecipe Function (It is still in the HashMaps, so that containsInput does return T on those fake Inputs) + */ + public boolean mFakeRecipe = false; + /** + * If this Recipe can be stored inside a Machine in order to make Recipe searching more Efficient by trying the previously used Recipe first. In case you have a Recipe Map overriding things and returning one time use Recipes, you have to set this to F. + */ + public boolean mCanBeBuffered = true; + /** + * If this Recipe needs the Output Slots to be completely empty. Needed in case you have randomised Outputs + */ + public boolean mNeedsEmptyOutput = false; + private GregtechRecipe(GregtechRecipe aRecipe) { + mInputs = GT_Utility.copyStackArray((Object[]) aRecipe.mInputs); + mOutputs = GT_Utility.copyStackArray((Object[]) aRecipe.mOutputs); + mSpecialItems = aRecipe.mSpecialItems; + mChances = aRecipe.mChances; + mFluidInputs = GT_Utility.copyFluidArray(aRecipe.mFluidInputs); + mFluidOutputs = GT_Utility.copyFluidArray(aRecipe.mFluidOutputs); + mDuration = aRecipe.mDuration; + mSpecialValue = aRecipe.mSpecialValue; + mEUt = aRecipe.mEUt; + mNeedsEmptyOutput = aRecipe.mNeedsEmptyOutput; + mCanBeBuffered = aRecipe.mCanBeBuffered; + mFakeRecipe = aRecipe.mFakeRecipe; + mEnabled = aRecipe.mEnabled; + mHidden = aRecipe.mHidden; + } + protected GregtechRecipe(boolean aOptimize, ItemStack[] aInputs, ItemStack[] aOutputs, Object aSpecialItems, int[] aChances, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue) { + if (aInputs == null) aInputs = new ItemStack[0]; + if (aOutputs == null) aOutputs = new ItemStack[0]; + if (aFluidInputs == null) aFluidInputs = new FluidStack[0]; + if (aFluidOutputs == null) aFluidOutputs = new FluidStack[0]; + if (aChances == null) aChances = new int[aOutputs.length]; + if (aChances.length < aOutputs.length) aChances = Arrays.copyOf(aChances, aOutputs.length); + + aInputs = GT_Utility.getArrayListWithoutTrailingNulls(aInputs).toArray(new ItemStack[0]); + aOutputs = GT_Utility.getArrayListWithoutTrailingNulls(aOutputs).toArray(new ItemStack[0]); + aFluidInputs = GT_Utility.getArrayListWithoutNulls(aFluidInputs).toArray(new FluidStack[0]); + aFluidOutputs = GT_Utility.getArrayListWithoutNulls(aFluidOutputs).toArray(new FluidStack[0]); + + GT_OreDictUnificator.setStackArray(true, aInputs); + GT_OreDictUnificator.setStackArray(true, aOutputs); + + for (ItemStack tStack : aOutputs) GT_Utility.updateItemStack(tStack); + + for (int i = 0; i < aChances.length; i++) if (aChances[i] <= 0) aChances[i] = 10000; + for (int i = 0; i < aFluidInputs.length; i++) aFluidInputs[i] = new GT_FluidStack(aFluidInputs[i]); + for (int i = 0; i < aFluidOutputs.length; i++) aFluidOutputs[i] = new GT_FluidStack(aFluidOutputs[i]); + + for (int i = 0; i < aInputs.length; i++) + if (aInputs[i] != null && Items.feather.getDamage(aInputs[i]) != W) + for (int j = 0; j < aOutputs.length; j++) { + if (GT_Utility.areStacksEqual(aInputs[i], aOutputs[j])) { + if (aInputs[i].stackSize >= aOutputs[j].stackSize) { + aInputs[i].stackSize -= aOutputs[j].stackSize; + aOutputs[j] = null; + } else { + aOutputs[j].stackSize -= aInputs[i].stackSize; + } + } + } + + if (aOptimize && aDuration >= 32) { + ArrayList<ItemStack> tList = new ArrayList<ItemStack>(); + tList.addAll(Arrays.asList(aInputs)); + tList.addAll(Arrays.asList(aOutputs)); + for (int i = 0; i < tList.size(); i++) if (tList.get(i) == null) tList.remove(i--); + + for (byte i = (byte) Math.min(64, aDuration / 16); i > 1; i--) + if (aDuration / i >= 16) { + boolean temp = true; + for (int j = 0, k = tList.size(); temp && j < k; j++) + if (tList.get(j).stackSize % i != 0) temp = false; + for (int j = 0; temp && j < aFluidInputs.length; j++) + if (aFluidInputs[j].amount % i != 0) temp = false; + for (int j = 0; temp && j < aFluidOutputs.length; j++) + if (aFluidOutputs[j].amount % i != 0) temp = false; + if (temp) { + for (int j = 0, k = tList.size(); j < k; j++) tList.get(j).stackSize /= i; + for (int j = 0; j < aFluidInputs.length; j++) aFluidInputs[j].amount /= i; + for (int j = 0; j < aFluidOutputs.length; j++) aFluidOutputs[j].amount /= i; + aDuration /= i; + } + } + } + + mInputs = aInputs; + mOutputs = aOutputs; + mSpecialItems = aSpecialItems; + mChances = aChances; + mFluidInputs = aFluidInputs; + mFluidOutputs = aFluidOutputs; + mDuration = aDuration; + mSpecialValue = aSpecialValue; + mEUt = aEUt; + + // checkCellBalance(); + } + + /*public GregtechRecipe(FluidStack aInput1, FluidStack aInput2, FluidStack aOutput1, int aDuration, int aEUt, int aSpecialValue) { + this(true, null, null, null, null, new FluidStack[]{aInput1, aInput2}, new FluidStack[]{aOutput1}, Math.max(aDuration, 1), aEUt, Math.max(Math.min(aSpecialValue, 160000000), 0)); + if (mInputs.length > 1) { + Gregtech_Recipe_Map.sFusionRecipes.addRecipe(this); + } + } + + + public GregtechRecipe(boolean aOptimize, ItemStack[] aInputs, ItemStack[] aOutputs, Object aSpecial, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue) { + + + this(true, new ItemStack[]{aInputs}, new ItemStack[]{aOutputs}, null, new FluidStack[]{aFluidInputs}, new FluidStack[]{}, Math.max(aDuration, 1), Math.max(aEUt, 1), 0); + + + //aOptimize, aInput1, aOutput1, bInput1,bOutput1, aDuration, aEUt + //boolean aOptimize, ItemStack[] aInputs, ItemStack[] aOutputs, Object aSpecial, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue + //this(true, new FluidStack(aInput1, 300), new FluidStack(aOutput1, 300), bInput1 == null ? new ItemStack[]{bInput1} : new ItemStack[]{bInput1}, new ItemStack[]{bOutput1}, Math.max(aDuration, 1), Math.max(aEUt, 1), 0); + // this(true, new FluidStack(aInput1, 300), new FluidStack(aOutput1, 300), new ItemStack(bInput1), new ItemStack(bOutput1), Math.max(aDuration, 1), aEUt, Math.max(Math.min(aSpecialValue, 160000000), 0)); + if (mInputs.length > 1) { + Gregtech_Recipe_Map.sCokeOvenRecipes.addRecipe(this); + } + }*/ + public static void reInit() { + GT_Log.out.println("GT_Mod: Re-Unificating Recipes."); + for (Gregtech_Recipe_Map tMapEntry : Gregtech_Recipe_Map.sMappings) tMapEntry.reInit(); + } + + public GregtechRecipe copy() { + return new GregtechRecipe(this); + } + + public boolean isRecipeInputEqual(boolean aDecreaseStacksizeBySuccess, FluidStack[] aFluidInputs, ItemStack... aInputs) { + return isRecipeInputEqual(aDecreaseStacksizeBySuccess, false, aFluidInputs, aInputs); + } + + public boolean isRecipeInputEqual(boolean aDecreaseStacksizeBySuccess, boolean aDontCheckStackSizes, FluidStack[] aFluidInputs, ItemStack... aInputs) { + if (mFluidInputs.length > 0 && aFluidInputs == null) return false; + for (FluidStack tFluid : mFluidInputs) + if (tFluid != null) { + boolean temp = true; + for (FluidStack aFluid : aFluidInputs) + if (aFluid != null && aFluid.isFluidEqual(tFluid) && (aDontCheckStackSizes || aFluid.amount >= tFluid.amount)) { + temp = false; + break; + } + if (temp) return false; + } + + if (mInputs.length > 0 && aInputs == null) return false; + + for (ItemStack tStack : mInputs) + if (tStack != null) { + boolean temp = true; + for (ItemStack aStack : aInputs) + if ((GT_Utility.areUnificationsEqual(aStack, tStack, true) || GT_Utility.areUnificationsEqual(GT_OreDictUnificator.get(false, aStack), tStack, true)) && (aDontCheckStackSizes || aStack.stackSize >= tStack.stackSize)) { + temp = false; + break; + } + if (temp) return false; + } + + if (aDecreaseStacksizeBySuccess) { + if (aFluidInputs != null) { + for (FluidStack tFluid : mFluidInputs) + if (tFluid != null) { + for (FluidStack aFluid : aFluidInputs) + if (aFluid != null && aFluid.isFluidEqual(tFluid) && (aDontCheckStackSizes || aFluid.amount >= tFluid.amount)) { + aFluid.amount -= tFluid.amount; + break; + } + } + } + + if (aInputs != null) { + for (ItemStack tStack : mInputs) + if (tStack != null) { + for (ItemStack aStack : aInputs) + if ((GT_Utility.areUnificationsEqual(aStack, tStack, true) || GT_Utility.areUnificationsEqual(GT_OreDictUnificator.get(false, aStack), tStack, true)) && (aDontCheckStackSizes || aStack.stackSize >= tStack.stackSize)) { + aStack.stackSize -= tStack.stackSize; + break; + } + } + } + } + + return true; + } + + public static class Gregtech_Recipe_Map { + /** + * Contains all Recipe Maps + */ + public static final Collection<Gregtech_Recipe_Map> sMappings = new ArrayList<Gregtech_Recipe_Map>(); + //public static final GT_Recipe_Map sChemicalBathRecipes = new GT_Recipe_Map(new HashSet<GT_Recipe>(200), "gt.recipe.chemicalbath", "Chemical Bath", null, RES_PATH_GUI + "basicmachines/ChemicalBath", 1, 3, 1, 1, 1, E, 1, E, true, true); + public static final GT_Recipe_Map sCokeOvenRecipes = new GT_Recipe_Map(new HashSet<GT_Recipe>(200), "mu.recipe.cokeoven", "Coke Oven", null, RES_PATH_GUI + "basicmachines/ChemicalBath", 1, 3, 1, 1, 1, E, 1, E, true, true); + //public static final Gregtech_Recipe_Map sCokeOvenRecipes = new Gregtech_Recipe_Map(new HashSet<GregtechRecipe>(200), "mu.recipe.cokeoven", "Coke Oven", null, RES_PATH_GUI + "basicmachines/E_Furnace", 1, 1, 1, 1, 1, E, 1, E, true, true); + + + /** + * HashMap of Recipes based on their Items + */ + public final Map<GT_ItemStack, Collection<GregtechRecipe>> mRecipeItemMap = new HashMap<GT_ItemStack, Collection<GregtechRecipe>>(); + /** + * HashMap of Recipes based on their Fluids + */ + public final Map<Fluid, Collection<GregtechRecipe>> mRecipeFluidMap = new HashMap<Fluid, Collection<GregtechRecipe>>(); + /** + * The List of all Recipes + */ + public final Collection<GregtechRecipe> mRecipeList; + /** + * String used as an unlocalised Name. + */ + public final String mUnlocalizedName; + /** + * String used in NEI for the Recipe Lists. If null it will use the unlocalised Name instead + */ + public final String mNEIName; + /** + * GUI used for NEI Display. Usually the GUI of the Machine itself + */ + public final String mNEIGUIPath; + public final String mNEISpecialValuePre, mNEISpecialValuePost; + public final int mUsualInputCount, mUsualOutputCount, mNEISpecialValueMultiplier, mMinimalInputItems, mMinimalInputFluids, mAmperage; + public final boolean mNEIAllowed, mShowVoltageAmperageInNEI; |
