package gregtech.api.util;
import static gregtech.GTMod.GT_FML_LOGGER;
import static gregtech.api.enums.GTValues.B;
import static gregtech.api.enums.GTValues.D1;
import static gregtech.api.enums.GTValues.DW;
import static gregtech.api.enums.GTValues.E;
import static gregtech.api.enums.GTValues.M;
import static gregtech.api.enums.GTValues.RA;
import static gregtech.api.enums.GTValues.V;
import static gregtech.api.enums.GTValues.VN;
import static gregtech.api.enums.GTValues.W;
import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes;
import static gregtech.api.recipe.RecipeMaps.oreWasherRecipes;
import static gregtech.api.util.GTRecipeBuilder.SECONDS;
import static gregtech.api.util.GTRecipeBuilder.TICKS;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
import net.minecraft.block.Block;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.ShapedRecipes;
import net.minecraft.item.crafting.ShapelessRecipes;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntityFurnace;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.oredict.ShapedOreRecipe;
import net.minecraftforge.oredict.ShapelessOreRecipe;
import cpw.mods.fml.common.registry.GameRegistry;
import gregtech.api.GregTechAPI;
import gregtech.api.enums.GTValues;
import gregtech.api.enums.ItemList;
import gregtech.api.enums.Materials;
import gregtech.api.enums.OreDictNames;
import gregtech.api.enums.OrePrefixes;
import gregtech.api.enums.Tier;
import gregtech.api.enums.ToolDictNames;
import gregtech.api.interfaces.IDamagableItem;
import gregtech.api.interfaces.IItemContainer;
import gregtech.api.interfaces.internal.IGTCraftingRecipe;
import gregtech.api.items.MetaBaseItem;
import gregtech.api.metatileentity.implementations.MTEBasicMachineWithRecipe;
import gregtech.api.objects.GTHashSet;
import gregtech.api.objects.GTItemStack;
import gregtech.api.objects.ItemData;
import gregtech.api.recipe.RecipeCategories;
import gregtech.api.recipe.RecipeMap;
import ic2.api.item.IBoxable;
import ic2.api.item.IC2Items;
import ic2.api.item.IElectricItem;
import ic2.api.reactor.IReactorComponent;
import ic2.api.recipe.IRecipeInput;
import ic2.api.recipe.RecipeInputItemStack;
import ic2.api.recipe.RecipeOutput;
import ic2.api.recipe.Recipes;
import ic2.core.IC2;
import ic2.core.item.ItemToolbox;
/**
* NEVER INCLUDE THIS FILE IN YOUR MOD!!!
*
* This is the Interface I use for interacting with other Mods.
*
* Due to the many imports, this File can cause compile Problems if not all the APIs are installed
*/
public class GTModHandler {
public static final List sSingleNonBlockDamagableRecipeList = new ArrayList<>(1000);
private static final Map sIC2ItemMap = new HashMap<>();
// public for bartworks
public static final List sAllRecipeList = new ArrayList<>(5000), sBufferRecipeList = new ArrayList<>(1000);
private static final List delayedRemovalByOutput = new ArrayList<>();
private static final List delayedRemovalByRecipe = new ArrayList<>();
public static Collection sNativeRecipeClasses = new HashSet<>(), sSpecialRecipeClasses = new HashSet<>();
public static GTHashSet sNonReplaceableItems = new GTHashSet<>();
public static Object sBoxableWrapper = new GTIBoxableWrapper();
public static Collection sBoxableItems = new ArrayList<>();
private static final Map emptyRecipeMap = new HashMap<>();
private static Set recyclerWhitelist;
private static Set recyclerBlacklist;
private static boolean sBufferCraftingRecipes = true;
public static List sSingleNonBlockDamagableRecipeList_list = new ArrayList<>(100);
private static final boolean sSingleNonBlockDamagableRecipeList_create = true;
private static final ItemStack sMt1 = new ItemStack(Blocks.dirt, 1, 0), sMt2 = new ItemStack(Blocks.dirt, 1, 0);
private static final String s_H = "h", s_F = "f", s_I = "I", s_P = "P", s_R = "R";
private static final ItemStack[][] sShapes1 = new ItemStack[][] {
{ sMt1, null, sMt1, sMt1, sMt1, sMt1, null, sMt1, null },
{ sMt1, null, sMt1, sMt1, null, sMt1, sMt1, sMt1, sMt1 },
{ null, sMt1, null, sMt1, sMt1, sMt1, sMt1, null, sMt1 },
{ sMt1, sMt1, sMt1, sMt1, null, sMt1, null, null, null },
{ sMt1, null, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1 },
{ sMt1, sMt1, sMt1, sMt1, null, sMt1, sMt1, null, sMt1 },
{ null, null, null, sMt1, null, sMt1, sMt1, null, sMt1 },
{ null, sMt1, null, null, sMt1, null, null, sMt2, null },
{ sMt1, sMt1, sMt1, null, sMt2, null, null, sMt2, null },
{ null, sMt1, null, null, sMt2, null, null, sMt2, null },
{ sMt1, sMt1, null, sMt1, sMt2, null, null, sMt2, null },
{ null, sMt1, sMt1, null, sMt2, sMt1, null, sMt2, null },
{ sMt1, sMt1, null, null, sMt2, null, null, sMt2, null },
{ null, sMt1, sMt1, null, sMt2, null, null, sMt2, null },
{ null, sMt1, null, sMt1, null, null, null, sMt1, sMt2 },
{ null, sMt1, null, null, null, sMt1, sMt2, sMt1, null },
{ null, sMt1, null, sMt1, null, sMt1, null, null, sMt2 },
{ null, sMt1, null, sMt1, null, sMt1, sMt2, null, null },
{ null, sMt2, null, null, sMt1, null, null, sMt1, null },
{ null, sMt2, null, null, sMt2, null, sMt1, sMt1, sMt1 },
{ null, sMt2, null, null, sMt2, null, null, sMt1, null },
{ null, sMt2, null, sMt1, sMt2, null, sMt1, sMt1, null },
{ null, sMt2, null, null, sMt2, sMt1, null, sMt1, sMt1 },
{ null, sMt2, null, null, sMt2, null, sMt1, sMt1, null },
{ sMt1, null, null, null, sMt2, null, null, null, sMt2 },
{ null, null, sMt1, null, sMt2, null, sMt2, null, null },
{ sMt1, null, null, null, sMt2, null, null, null, null },
{ null, null, sMt1, null, sMt2, null, null, null, null },
{ sMt1, sMt2, null, null, null, null, null, null, null },
{ sMt2, sMt1, null, null, null, null, null, null, null },
{ sMt1, null, null, sMt2, null, null, null, null, null },
{ sMt2, null, null, sMt1, null, null, null, null, null },
{ sMt1, sMt1, sMt1, sMt1, sMt1, sMt1, null, sMt2, null },
{ sMt1, sMt1, null, sMt1, sMt1, sMt2, sMt1, sMt1, null },
{ null, sMt1, sMt1, sMt2, sMt1, sMt1, null, sMt1, sMt1 },
{ null, sMt2, null, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1 },
{ sMt1, sMt1, sMt1, sMt1, sMt2, sMt1, null, sMt2, null },
{ sMt1, sMt1, null, sMt1, sMt2, sMt2, sMt1, sMt1, null },
{ null, sMt1, sMt1, sMt2, sMt2, sMt1, null, sMt1, sMt1 },
{ null, sMt2, null, sMt1, sMt2, sMt1, sMt1, sMt1, sMt1 },
{ sMt1, null, null, null, sMt1, null, null, null, null },
{ null, sMt1, null, sMt1, null, null, null, null, null },
{ sMt1, sMt1, null, sMt2, null, sMt1, sMt2, null, null },
{ null, sMt1, sMt1, sMt1, null, sMt2, null, null, sMt2 } };
public static List sSingleNonBlockDamagableRecipeList_validsShapes1 = new ArrayList<>(44);
public static boolean sSingleNonBlockDamagableRecipeList_validsShapes1_update = false;
public static List sSingleNonBlockDamagableRecipeList_warntOutput = new ArrayList<>(50);
public static List sVanillaRecipeList_warntOutput = new ArrayList<>(50);
public static final List sSingleNonBlockDamagableRecipeList_verified = new ArrayList<>(1000);
public static List sAnySteamFluidIDs = new ArrayList<>();
public static List sSuperHeatedSteamFluidIDs = new ArrayList<>();
static {
sNativeRecipeClasses.add(ShapedRecipes.class.getName());
sNativeRecipeClasses.add(ShapedOreRecipe.class.getName());
sNativeRecipeClasses.add(GTShapedRecipe.class.getName());
sNativeRecipeClasses.add(ShapelessRecipes.class.getName());
sNativeRecipeClasses.add(ShapelessOreRecipe.class.getName());
sNativeRecipeClasses.add(GTShapelessRecipe.class.getName());
sNativeRecipeClasses.add(ic2.core.AdvRecipe.class.getName());
sNativeRecipeClasses.add(ic2.core.AdvShapelessRecipe.class.getName());
sNativeRecipeClasses.add("appeng.recipes.game.ShapedRecipe");
sNativeRecipeClasses.add("appeng.recipes.game.ShapelessRecipe");
sNativeRecipeClasses.add("forestry.core.utils.ShapedRecipeCustom");
// Recipe Classes, which should never be removed.
sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipeFireworks.class.getName());
sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipesArmorDyes.class.getName());
sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipeBookCloning.class.getName());
sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipesMapCloning.class.getName());
sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipesMapExtending.class.getName());
sSpecialRecipeClasses.add("jds.bibliocraft.BiblioSpecialRecipes");
sSpecialRecipeClasses.add("dan200.qcraft.shared.EntangledQBlockRecipe");
sSpecialRecipeClasses.add("dan200.qcraft.shared.EntangledQuantumComputerRecipe");
sSpecialRecipeClasses.add("dan200.qcraft.shared.QBlockRecipe");
sSpecialRecipeClasses.add("appeng.recipes.game.FacadeRecipe");
sSpecialRecipeClasses.add("appeng.recipes.game.DisassembleRecipe");
sSpecialRecipeClasses.add("mods.railcraft.common.carts.LocomotivePaintingRecipe");
sSpecialRecipeClasses.add("mods.railcraft.common.util.crafting.RotorRepairRecipe");
sSpecialRecipeClasses.add("mods.railcraft.common.util.crafting.RoutingTableCopyRecipe");
sSpecialRecipeClasses.add("mods.railcraft.common.util.crafting.RoutingTicketCopyRecipe");
sSpecialRecipeClasses.add("mods.railcraft.common.util.crafting.TankCartFilterRecipe");
sSpecialRecipeClasses.add("mods.railcraft.common.emblems.LocomotiveEmblemRecipe");
sSpecialRecipeClasses.add("mods.railcraft.common.emblems.EmblemPostColorRecipe");
sSpecialRecipeClasses.add("mods.railcraft.common.emblems.EmblemPostEmblemRecipe");
sSpecialRecipeClasses.add("mods.immibis.redlogic.interaction.RecipeDyeLumarButton");
sSpecialRecipeClasses.add("thaumcraft.common.items.armor.RecipesRobeArmorDyes");
sSpecialRecipeClasses.add("thaumcraft.common.items.armor.RecipesVoidRobeArmorDyes");
sSpecialRecipeClasses.add("thaumcraft.common.lib.crafting.ShapelessNBTOreRecipe");
sSpecialRecipeClasses.add("twilightforest.item.TFMapCloningRecipe");
sSpecialRecipeClasses.add("forestry.lepidopterology.MatingRecipe");
sSpecialRecipeClasses.add("micdoodle8.mods.galacticraft.planets.asteroids.recipe.CanisterRecipes");
sSpecialRecipeClasses.add("shedar.mods.ic2.nuclearcontrol.StorageArrayRecipe");
}
/**
* Returns if that Liquid is Water or Distilled Water
*/
public static boolean isWater(FluidStack aFluid) {
if (aFluid == null) return false;
return aFluid.isFluidEqual(getWater(1)) || aFluid.isFluidEqual(getDistilledWater(1));
}
/**
* Returns a Liquid Stack with given amount of Water.
*/
public static FluidStack getWater(long aAmount) {
return FluidRegistry.getFluidStack("water", (int) aAmount);
}
/**
* Returns a Liquid Stack with given amount of distilled Water.
*/
public static FluidStack getDistilledWater(long aAmount) {
FluidStack tFluid = FluidRegistry.getFluidStack("ic2distilledwater", (int) aAmount);
if (tFluid == null) tFluid = getWater(aAmount);
return tFluid;
}
/**
* Returns if that Liquid is Lava
*/
public static boolean isLava(FluidStack aFluid) {
if (aFluid == null) return false;
return aFluid.isFluidEqual(getLava(1));
}
/**
* Returns a Liquid Stack with given amount of Lava.
*/
public static FluidStack getLava(long aAmount) {
return FluidRegistry.getFluidStack("lava", (int) aAmount);
}
/**
* Returns if that Liquid is Steam
*/
public static boolean isSteam(FluidStack aFluid) {
if (aFluid == null) return false;
return aFluid.isFluidEqual(getSteam(1));
}
/**
* Returns if that Liquid is Any Steam (including other mods)
*/
public static boolean isAnySteam(FluidStack aFluid) {
return (aFluid != null && (isSteam(aFluid) || sAnySteamFluidIDs.contains(aFluid.getFluidID())));
}
/**
* Returns if that Liquid is Super Heated Steam (including other mods)
*/
public static boolean isSuperHeatedSteam(FluidStack aFluid) {
return (aFluid != null && sSuperHeatedSteamFluidIDs.contains(aFluid.getFluidID()));
}
/**
* Returns a Liquid Stack with given amount of Steam.
*/
public static FluidStack getSteam(long aAmount) {
return FluidRegistry.getFluidStack("steam", (int) aAmount);
}
/**
* Returns if that Liquid is Milk
*/
public static boolean isMilk(FluidStack aFluid) {
if (aFluid == null) return false;
return aFluid.isFluidEqual(getMilk(1));
}
/**
* Returns a Liquid Stack with given amount of Milk.
*/
public static FluidStack getMilk(long aAmount) {
return FluidRegistry.getFluidStack("milk", (int) aAmount);
}
public static ItemStack getEmptyCell(long aAmount) {
return ItemList.Cell_Empty.get(aAmount);
}
public static ItemStack getAirCell(long aAmount) {
return ItemList.Cell_Air.get(aAmount);
}
public static ItemStack getWaterCell(long aAmount) {
return ItemList.Cell_Water.get(aAmount);
}
public static ItemStack getLavaCell(long aAmount) {
return ItemList.Cell_Lava.get(aAmount);
}
/**
* @param aValue the Value of this Stack, when burning inside a Furnace (200 = 1 Burn Process = 500 EU, max = 32767
* (that is 81917.5 EU)), limited to Short because the vanilla Furnace otherwise can't handle it
* properly, stupid Mojang...
*/
public static ItemStack setFuelValue(ItemStack aStack, short aValue) {
aStack.setTagCompound(GTUtility.getNBTContainingShort(aStack.getTagCompound(), "GT.ItemFuelValue", aValue));
return aStack;
}
/**
* @return the Value of this Stack, when burning inside a Furnace (200 = 1 Burn Process = 500 EU, max = 32767 (that
* is 81917.5 EU)), limited to Short because the vanilla Furnace otherwise can't handle it properly, stupid
* Mojang...
*/
public static int getFuelValue(ItemStack aStack) {
return TileEntityFurnace.getItemBurnTime(aStack);
}
/**
* Gets an Item from IndustrialCraft, and returns a Replacement Item if not possible
*/
public static ItemStack getIC2Item(String aItem, long aAmount, ItemStack aReplacement) {
if (GTUtility.isStringInvalid(aItem) || !GregTechAPI.sPreloadStarted) return null;
// if (D1) GTLog.out.println("Requested the Item '" + aItem + "' from the IC2-API");
if (!sIC2ItemMap.containsKey(aItem)) try {
ItemStack tStack = IC2Items.getItem(aItem);
sIC2ItemMap.put(aItem, tStack);
if (tStack == null && D1) GTLog.err.println(aItem + " is not found in the IC2 Items!");
} catch (Throwable e) {
/* Do nothing */
}
return GTUtility.copyAmount(aAmount, sIC2ItemMap.get(aItem), aReplacement);
}
/**
* Gets an Item from IndustrialCraft, but the Damage Value can be specified, and returns a Replacement Item with the
* same Damage if not possible
*/
public static ItemStack getIC2Item(String aItem, long aAmount, int aMeta, ItemStack aReplacement) {
ItemStack rStack = getIC2Item(aItem, aAmount, aReplacement);
if (rStack == null) return null;
Items.feather.setDamage(rStack, aMeta);
return rStack;
}
/**
* Gets an Item from IndustrialCraft, but the Damage Value can be specified
*/
public static ItemStack getIC2Item(String aItem, long aAmount, int aMeta) {
return getIC2Item(aItem, aAmount, aMeta, null);
}
/**
* Gets an Item from IndustrialCraft
*/
public static ItemStack getIC2Item(String aItem, long aAmount) {
return getIC2Item(aItem, aAmount, null);
}
/**
* Gets an Item from the specified mod
*/
public static ItemStack getModItem(String aModID, String aItem, long aAmount) {
return getModItem(aModID, aItem, aAmount, null);
}
/**
* Gets an Item from the specified mod, and returns a Replacement Item if not possible
*/
public static ItemStack getModItem(String aModID, String aItem, long aAmount, ItemStack aReplacement) {
ItemStack result;
if (GTUtility.isStringInvalid(aItem) || !GregTechAPI.sPreloadStarted) {
result = null;
} else {
result = GTUtility
.copyAmount(aAmount, GameRegistry.findItemStack(aModID, aItem, (int) aAmount), aReplacement);
}
if (result == null) {
String reason;
if (GTUtility.isStringInvalid(aItem)) {
reason = "the name of the item is an invalid string";
} else if (!GregTechAPI.sPreloadStarted) {
reason = "the GT5U preloading phase has not yet started";
} else {
reason = "the item was not found in the game registry";
}
String log_message = "getModItem call: object \"" + aItem
+ "\" with mod id \""
+ aModID
+ "\" has returned null because "
+ reason;
GTLog.out.println(log_message);
new Exception().printStackTrace(GTLog.out);
}
return result;
}
/**
* Gets an Item from the specified mod, but the Damage Value can be specified
*/
public static ItemStack getModItem(String aModID, String aItem, long aAmount, int aMeta) {
ItemStack rStack = getModItem(aModID, aItem, aAmount);
if (rStack == null) return null;
Items.feather.setDamage(rStack, aMeta);
return rStack;
}
/**
* Gets an Item from the specified mod, but the Damage Value can be specified, and returns a Replacement Item with
* the same Damage if not possible
*/
public static ItemStack getModItem(String aModID, String aItem, long aAmount, int aMeta, ItemStack aReplacement) {
ItemStack rStack = getModItem(aModID, aItem, aAmount, aReplacement);
if (rStack == null) return null;
Items.feather.setDamage(rStack, aMeta);
return rStack;
}
/**
* OUT OF ORDER
*/
@Deprecated
public static boolean getModeKeyDown(EntityPlayer aPlayer) {
return false;
}
/**
* OUT OF ORDER
*/
@Deprecated
public static boolean getBoostKeyDown(EntityPlayer aPlayer) {
return false;
}
/**
* OUT OF ORDER
*/
@Deprecated
public static boolean getJumpKeyDown(EntityPlayer aPlayer) {
return false;
}
/**
* Adds a Valuable Ore to the Miner
*/
public static boolean addValuableOre(Block aBlock, int aMeta, int aValue) {
if (aValue <= 0) return false;
try {
IC2.addValuableOre(new RecipeInputItemStack(new ItemStack(aBlock, 1, aMeta)), aValue);
} catch (Exception e) {
// TODO remove try catch
// TODO fix : why is bartworks registering items stacks with .getItem() == null
GTLog.err.println("Caught exception when calling IC2.addValuableOre");
}
return true;
}
/**
* Adds a Scrapbox Drop. Fails at April first for the "suddenly Hoes"-Feature of IC2
*/
public static boolean addScrapboxDrop(float aChance, ItemStack aOutput) {
aOutput = GTOreDictUnificator.get(true, aOutput);
if (aOutput == null || aChance <= 0) return false;
aOutput.stackSize = 1;
if (GTConfig.troll && !GTUtility.areStacksEqual(aOutput, new ItemStack(Items.wooden_hoe, 1, 0))) return false;
Recipes.scrapboxDrops.addDrop(GTUtility.copyOrNull(aOutput), aChance);
return true;
}
// temporary buffer list to fix NPE if you try to access the recyclerBlacklist too early
private static List tempRecyclerBlackList = new ArrayList<>();
/**
* Adds an Item to the Recycler Blacklist
*/
public static boolean addToRecyclerBlackList(ItemStack aRecycledStack) {
if (aRecycledStack == null) return false;
final RecipeInputItemStack iRecipeInput = new RecipeInputItemStack(aRecycledStack);
if (Recipes.recyclerBlacklist == null) {
tempRecyclerBlackList.add(iRecipeInput);
return true;
}
if (tempRecyclerBlackList != null) {
for (RecipeInputItemStack recipe : tempRecyclerBlackList) {
Recipes.recyclerBlacklist.add(recipe);
}
tempRecyclerBlackList = null;
}
Recipes.recyclerBlacklist.add(iRecipeInput);
return true;
}
/**
* Just simple Furnace smelting. Unbelievable how Minecraft fails at making a simple ItemStack->ItemStack mapping...
*/
public static boolean addSmeltingRecipe(ItemStack aInput, ItemStack aOutput) {
aOutput = GTOreDictUnificator.get(true, aOutput);
if (aInput == null || aOutput == null) return false;
FurnaceRecipes.smelting()
.func_151394_a(aInput, GTUtility.copyOrNull(aOutput), 0.0F);
return true;
}
/**
* Adds to Furnace AND Alloy Smelter
*/
public static boolean addSmeltingAndAlloySmeltingRecipe(ItemStack aInput, ItemStack aOutput, boolean hidden) {
if (aInput == null || aOutput == null) {
return false;
}
boolean temp = aInput.stackSize == 1 && addSmeltingRecipe(aInput, aOutput);
ItemStack input2 = OrePrefixes.ingot.contains(aOutput) ? ItemList.Shape_Mold_Ingot.get(0)
: OrePrefixes.block.contains(aOutput) ? ItemList.Shape_Mold_Block.get(0)
: OrePrefixes.nugget.contains(aOutput) ? ItemList.Shape_Mold_Nugget.get(0) : null;
if (Materials.Graphite.contains(aInput)) {
return false;
}
if ((input2 == null) && ((OrePrefixes.ingot.contains(aInput)) || (OrePrefixes.dust.contains(aInput))
|| (OrePrefixes.gem.contains(aInput)))) {
return false;
}
GTRecipeBuilder recipeBuilder = GTValues.RA.stdBuilder();
if (input2 == null) {
recipeBuilder.itemInputs(aInput);
} else {
recipeBuilder.itemInputs(aInput, input2);
}
recipeBuilder.itemOutputs(aOutput)
.duration(6 * SECONDS + 10 * TICKS)
.eut(3)
.recipeCategory(RecipeCategories.alloySmelterRecycling);
if (hidden) {
recipeBuilder.hidden();
}
recipeBuilder.addTo(alloySmelterRecipes);
return true;
}
/**
* Removes IC2 recipes.
*/
public static void removeAllIC2Recipes() {
getMaceratorRecipeList().entrySet()
.clear();
getCompressorRecipeList().entrySet()
.clear();
getExtractorRecipeList().entrySet()
.clear();
getOreWashingRecipeList().entrySet()
.clear();
getThermalCentrifugeRecipeList().entrySet()
.clear();
}
/**
* Adds GT versions of the IC2 recipes from the supplied IC2RecipeList. Deprecated because all IC2 recipes
* have been manually added to GT.
*/
@Deprecated
public static void addIC2RecipesToGT(Map aIC2RecipeList, RecipeMap> aGTRecipeMap,
boolean aAddGTRecipe, boolean aRemoveIC2Recipe, boolean aExcludeGTIC2Items) {
Map aRecipesToRemove = new HashMap<>();
for (Entry iRecipeInputRecipeOutputEntry : aIC2RecipeList.entrySet()) {
if (iRecipeInputRecipeOutputEntry.getValue().items.isEmpty()) {
continue;
}
for (ItemStack tStack : (iRecipeInputRecipeOutputEntry.getKey()).getInputs()) {
if (!GTUtility.isStackValid(tStack)) {
continue;
}
if (aAddGTRecipe) {
try {
if (aExcludeGTIC2Items && ((tStack.getUnlocalizedName()
.contains("gt.metaitem.01")
|| tStack.getUnlocalizedName()
.contains("gt.blockores")
|| tStack.getUnlocalizedName()
.contains("ic2.itemCrushed")
|| tStack.getUnlocalizedName()
.contains("ic2.itemPurifiedCrushed"))))
continue;
switch (aGTRecipeMap.unlocalizedName) {
case "gt.recipe.macerator", "gt.recipe.extractor", "gt.recipe.compressor" -> GTValues.RA
.stdBuilder()
.itemInputs(
GTUtility.copyAmount(
iRecipeInputRecipeOutputEntry.getKey()
.getAmount(),
tStack))
.itemOutputs(iRecipeInputRecipeOutputEntry.getValue().items.toArray(new ItemStack[0]))
.duration(15 * SECONDS)
.eut(2)
.addTo(aGTRecipeMap);
case "gt.recipe.thermalcentrifuge" -> GTValues.RA.stdBuilder()
.itemInputs(
GTUtility.copyAmount(
iRecipeInputRecipeOutputEntry.getKey()
.getAmount(),
tStack))
.itemOutputs(iRecipeInputRecipeOutputEntry.getValue().items.toArray(new ItemStack[0]))
.duration(25 * SECONDS)
.eut(48)
.addTo(aGTRecipeMap);
}
} catch (Exception e) {
e.printStackTrace(GTLog.err);
}
}
if (aRemoveIC2Recipe) {
aRecipesToRemove.put(tStack, iRecipeInputRecipeOutputEntry.getValue().items.get(0));
}
}
}
GTUtility.bulkRemoveSimpleIC2MachineRecipe(aRecipesToRemove, aIC2RecipeList);
}
public static Map getExtractorRecipeList() {
return Recipes.extractor.getRecipes();
}
public static Map getCompressorRecipeList() {
return Recipes.compressor.getRecipes();
}
public static Map getMaceratorRecipeList() {
return Recipes.macerator.getRecipes();
}
public static Map getThermalCentrifugeRecipeList() {
return Recipes.centrifuge.getRecipes();
}
public static Map getOreWashingRecipeList() {
return Recipes.oreWashing.getRecipes();
}
/**
* IC2-OreWasher Recipe. Overloads old Recipes automatically
*/
@Deprecated
public static boolean addOreWasherRecipe(ItemStack aInput, int[] aChances, int aWaterAmount, Object... aOutput) {
if (aInput == null || aOutput == null || aOutput.length == 0 || aOutput[0] == null) return false;
RA.stdBuilder()
.itemInputs(aInput)
.itemOutputs((ItemStack) aOutput[0], (ItemStack) aOutput[1], (ItemStack) aOutput[2])
.outputChances(aChances)
.fluidInputs(GTModHandler.getWater(aWaterAmount))
.duration(25 * SECONDS)
.eut(16)
.addTo(oreWasherRecipes);
RA.stdBuilder()
.itemInputs(aInput)
.itemOutputs((ItemStack) aOutput[0], (ItemStack) aOutput[1], (ItemStack) aOutput[2])
.outputChances(aChances)
.fluidInputs(GTModHandler.getDistilledWater(aWaterAmount / 5))
.duration(15 * SECONDS)
.eut(16)
.addTo(oreWasherRecipes);
return true;
}
public static void stopBufferingCraftingRecipes() {
sBufferCraftingRecipes = false;
bulkRemoveRecipeByOutput(delayedRemovalByOutput);
bulkRemoveByRecipe(delayedRemovalByRecipe);
sBufferRecipeList.forEach(GameRegistry::addRecipe);
delayedRemovalByOutput.clear();
delayedRemovalByRecipe.clear();
sBufferRecipeList.clear();
}
/**
* Shapeless Crafting Recipes. Deletes conflicting Recipes too.
*/
public static boolean addCraftingRecipe(ItemStack aResult, Enchantment[] aEnchantmentsAdded,
int[] aEnchantmentLevelsAdded, Object[] aRecipe) {
return addCraftingRecipe(
aResult,
aEnchantmentsAdded,
aEnchantmentLevelsAdded,
false,
true,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
true,
aRecipe);
}
/**
* Regular Crafting Recipes. Deletes conflicting Recipes too.
*
* You can insert instances of IItemContainer into the Recipe Input Array directly without having to call "get(1)"
* on them.
*
* Enums are automatically getting their "name()"-Method called in order to deliver an OreDict String.
*
* Lowercase Letters are reserved for Tools. They are as follows:
*
* 'b' ToolDictNames.craftingToolBlade 'c' ToolDictNames.craftingToolCrowbar, 'd'
* ToolDictNames.craftingToolScrewdriver, 'f' ToolDictNames.craftingToolFile, 'h'
* ToolDictNames.craftingToolHardHammer, 'i' ToolDictNames.craftingToolSolderingIron, 'j'
* ToolDictNames.craftingToolSolderingMetal, 'k' ToolDictNames.craftingToolKnive 'm'
* ToolDictNames.craftingToolMortar, 'p' ToolDictNames.craftingToolDrawplate, 'r'
* ToolDictNames.craftingToolSoftHammer, 's' ToolDictNames.craftingToolSaw, 'w' ToolDictNames.craftingToolWrench,
* 'x' ToolDictNames.craftingToolWireCutter,
*/
public static boolean addCraftingRecipe(ItemStack aResult, Object[] aRecipe) {
return addCraftingRecipe(aResult, 0, aRecipe);
}
/**
* Regular Crafting Recipes. Deletes conflicting Recipes too.
*
* You can insert instances of IItemContainer into the Recipe Input Array directly without having to call "get(1)"
* on them.
*
* Enums are automatically getting their "name()"-Method called in order to deliver an OreDict String.
*
* Lowercase Letters are reserved for Tools. They are as follows:
*
* 'b' ToolDictNames.craftingToolBlade 'c' ToolDictNames.craftingToolCrowbar, 'd'
* ToolDictNames.craftingToolScrewdriver, 'f' ToolDictNames.craftingToolFile, 'h'
* ToolDictNames.craftingToolHardHammer, 'i' ToolDictNames.craftingToolSolderingIron, 'j'
* ToolDictNames.craftingToolSolderingMetal, 'k' ToolDictNames.craftingToolKnive 'm'
* ToolDictNames.craftingToolMortar, 'p' ToolDictNames.craftingToolDrawplate, 'r'
* ToolDictNames.craftingToolSoftHammer, 's' ToolDictNames.craftingToolSaw, 'w' ToolDictNames.craftingToolWrench,
* 'x' ToolDictNames.craftingToolWireCutter,
*/
public static boolean addCraftingRecipe(ItemStack aResult, long aBitMask, Object[] aRecipe) {
return addCraftingRecipe(
aResult,
new Enchantment[0],
new int[0],
(aBitMask & RecipeBits.MIRRORED) != 0,
(aBitMask & RecipeBits.BUFFERED) != 0,
(aBitMask & RecipeBits.KEEPNBT) != 0,
(aBitMask & RecipeBits.DISMANTLEABLE) != 0,
(aBitMask & RecipeBits.NOT_REMOVABLE) == 0,
(aBitMask & RecipeBits.REVERSIBLE) != 0,
(aBitMask & RecipeBits.DELETE_ALL_OTHER_RECIPES) != 0,
(aBitMask & RecipeBits.DELETE_ALL_OTHER_RECIPES_IF_SAME_NBT) != 0,
(aBitMask & RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES) != 0,
(aBitMask & RecipeBits.DELETE_ALL_OTHER_NATIVE_RECIPES) != 0,
(aBitMask & RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS) == 0,
(aBitMask & RecipeBits.ONLY_ADD_IF_THERE_IS_ANOTHER_RECIPE_FOR_IT) != 0,
(aBitMask & RecipeBits.ONLY_ADD_IF_RESULT_IS_NOT_NULL) != 0,
aRecipe);
}
public static boolean addMachineCraftingRecipe(ItemStack aResult, long aBitMask, Object[] aRecipe,
int machineTier) {
if (aRecipe != null) {
for (int i = 3; i < aRecipe.length; i++) {
if (!(aRecipe[i] instanceof MTEBasicMachineWithRecipe.X)) continue;
// spotless:off
aRecipe[i] = switch ((MTEBasicMachineWithRecipe.X) aRecipe[i]) {
case CIRCUIT -> Tier.ELECTRIC[machineTier].mManagingObject;
case BETTER_CIRCUIT -> Tier.ELECTRIC[machineTier].mBetterManagingObject;
case HULL -> Tier.ELECTRIC[machineTier].mHullObject;
case WIRE -> Tier.ELECTRIC[machineTier].mConductingObject;
case WIRE4 -> Tier.ELECTRIC[machineTier].mLargerConductingObject;
case STICK_DISTILLATION -> OrePrefixes.stick.get(Materials.Blaze);
case GLASS -> switch (machineTier) {
case 0, 1, 2, 3 -> new ItemStack(Blocks.glass, 1, W);
case 4, 5, 6, 7, 8 -> "blockGlass" + VN[machineTier];
default -> "blockGlass" + VN[8];
};
case PLATE -> switch (machineTier) {
case 0, 1 -> OrePrefixes.plate.get(Materials.Steel);
case 2 -> OrePrefixes.plate.get(Materials.Aluminium);
case 3 -> OrePrefixes.plate.get(Materials.StainlessSteel);
case 4 -> OrePrefixes.plate.get(Materials.Titanium);
case 5 -> OrePrefixes.plate.get(Materials.TungstenSteel);
case 6 -> OrePrefixes.plate.get(Materials.HSSG);
case 7 -> OrePrefixes.plate.get(Materials.HSSE);
default -> OrePrefixes.plate.get(Materials.Neutronium);
};
case PIPE -> switch (machineTier) {
case 0, 1 -> OrePrefixes.pipeMedium.get(Materials.Bronze);
case 2 -> OrePrefixes.pipeMedium.get(Materials.Steel);
case 3 -> OrePrefixes.pipeMedium.get(Materials.StainlessSteel);
case 4 -> OrePrefixes.pipeMedium.get(Materials.Titanium);
case 5 -> OrePrefixes.pipeMedium.get(Materials.TungstenSteel);
case 6 -> OrePrefixes.pipeSmall.get(Materials.Ultimate);
case 7 -> OrePrefixes.pipeMedium.get(Materials.Ultimate);
case 8 -> OrePrefixes.pipeLarge.get(Materials.Ultimate);
default -> OrePrefixes.pipeHuge.get(Materials.Ultimate);
};
case COIL_HEATING -> switch (machineTier) {
case 0, 1 -> OrePrefixes.wireGt02.get(Materials.AnyCopper);
case 2 -> OrePrefixes.wireGt02.get(Materials.Cupronickel);
case 3 -> OrePrefixes.wireGt02.get(Materials.Kanthal);
case 4 -> OrePrefixes.wireGt02.get(Materials.Nichrome);
case 5 -> OrePrefixes.wireGt02.get(Materials.TPV);
case 6 -> OrePrefixes.wireGt02.get(Materials.HSSG);
case 7 -> OrePrefixes.wireGt02.get(Materials.Naquadah);
case 8 -> OrePrefixes.wireGt02.get(Materials.NaquadahAlloy);
case 9 -> OrePrefixes.wireGt04.get(Materials.NaquadahAlloy);
default -> OrePrefixes.wireGt08.get(Materials.NaquadahAlloy);
};
case COIL_HEATING_DOUBLE -> switch (machineTier) {
case 0, 1 -> OrePrefixes.wireGt04.get(Materials.AnyCopper);
case 2 -> OrePrefixes.wireGt04.get(Materials.Cupronickel);
case 3 -> OrePrefixes.wireGt04.get(Materials.Kanthal);
case 4 -> OrePrefixes.wireGt04.get(Materials.Nichrome);
case 5 -> OrePrefixes.wireGt04.get(Materials.TPV);
case 6 -> OrePrefixes.wireGt04.get(Materials.HSSG);
case 7 -> OrePrefixes.wireGt04.get(Materials.Naquadah);
case 8 -> OrePrefixes.wireGt04.get(Materials.NaquadahAlloy);
case 9 -> OrePrefixes.wireGt08.get(Materials.NaquadahAlloy);
default -> OrePrefixes.wireGt16.get(Materials.NaquadahAlloy);
};
case STICK_MAGNETIC -> switch (machineTier) {
case 0, 1 -> OrePrefixes.stick.get(Materials.IronMagnetic);
case 2, 3 -> OrePrefixes.stick.get(Materials.SteelMagnetic);
case 4, 5 -> OrePrefixes.stick.get(Materials.NeodymiumMagnetic);
case 6, 7, 8, 9 -> OrePrefixes.stick.get(Materials.SamariumMagnetic);
default -> OrePrefixes.stick.get(Materials.TengamAttuned);
};
case STICK_ELECTROMAGNETIC -> switch (machineTier) {
case 0, 1 -> OrePrefixes.stick.get(Materials.AnyIron);
case 2, 3 -> OrePrefixes.stick.get(Materials.Steel);
case 4 -> OrePrefixes.stick.get(Materials.Neodymium);
default -> OrePrefixes.stick.get(Materials.VanadiumGallium);
};
case COIL_ELECTRIC -> switch (machineTier) {
case 0 -> OrePrefixes.wireGt01.get(Materials.Lead);
case 1 -> OrePrefixes.wireGt02.get(Materials.Tin);
case 2 -> OrePrefixes.wireGt02.get(Materials.AnyCopper);
case 3 -> OrePrefixes.wireGt04.get(Materials.AnyCopper);
case 4 -> OrePrefixes.wireGt08.get(Materials.AnnealedCopper);
case 5 -> OrePrefixes.wireGt16.get(Materials.AnnealedCopper);
case 6 -> OrePrefixes.wireGt04.get(Materials.YttriumBariumCuprate);
case 7 -> OrePrefixes.wireGt08.get(Materials.Iridium);
default -> OrePrefixes.wireGt16.get(Materials.Osmium);
};
case ROBOT_ARM -> switch (machineTier) {
case 0, 1 -> ItemList.Robot_Arm_LV;
case 2 -> ItemList.Robot_Arm_MV;
case 3 -> ItemList.Robot_Arm_HV;
case 4 -> ItemList.Robot_Arm_EV;
case 5 -> ItemList.Robot_Arm_IV;
case 6 -> ItemList.Robot_Arm_LuV;
case 7 -> ItemList.Robot_Arm_ZPM;
case 8 -> ItemList.Robot_Arm_UV;
case 9 -> ItemList.Robot_Arm_UHV;
case 10 -> ItemList.Robot_Arm_UEV;
case 11 -> ItemList.Robot_Arm_UIV;
case 12 -> ItemList.Robot_Arm_UMV;
case 13 -> ItemList.Robot_Arm_UXV;
default -> ItemList.Robot_Arm_MAX;
};
case PUMP -> switch (machineTier) {
case 0, 1 -> ItemList.Electric_Pump_LV;
case 2 -> ItemList.Electric_Pump_MV;
case 3 -> ItemList.Electric_Pump_HV;
case 4 -> ItemList.Electric_Pump_EV;
case 5 -> ItemList.Electric_Pump_IV;
case 6 -> ItemList.Electric_Pump_LuV;
case 7 -> ItemList.Electric_Pump_ZPM;
case 8 -> ItemList.Electric_Pump_UV;
case 9 -> ItemList.Electric_Pump_UHV;
case 10 -> ItemList.Electric_Pump_UEV;
case 11 -> ItemList.Electric_Pump_UIV;
case 12 -> ItemList.Electric_Pump_UMV;
case 13 -> ItemList.Electric_Pump_UXV;
default -> ItemList.Electric_Pump_MAX;
};
case MOTOR -> switch (machineTier) {
case 0, 1 -> ItemList.Electric_Motor_LV;
case 2 -> ItemList.Electric_Motor_MV;
case 3 -> ItemList.Electric_Motor_HV;
case 4 -> ItemList.Electric_Motor_EV;
case 5 -> ItemList.Electric_Motor_IV;
case 6 -> ItemList.Electric_Motor_LuV;
case 7 -> ItemList.Electric_Motor_ZPM;
case 8 -> ItemList.Electric_Motor_UV;
case 9 -> ItemList.Electric_Motor_UHV;
case 10 -> ItemList.Electric_Motor_UEV;
case 11 -> ItemList.Electric_Motor_UIV;
case 12 -> ItemList.Electric_Motor_UMV;
case 13 -> ItemList.Electric_Motor_UXV;
default -> ItemList.Electric_Motor_MAX;
};
case PISTON -> switch (machineTier) {
case 0, 1 -> ItemList.Electric_Piston_LV;
case 2 -> ItemList.Electric_Piston_MV;
case 3 -> ItemList.Electric_Piston_HV;
case 4 -> ItemList.Electric_Piston_EV;
case 5 -> ItemList.Electric_Piston_IV;
case 6 -> ItemList.Electric_Piston_LuV;
case 7 -> ItemList.Electric_Piston_ZPM;
case 8 -> ItemList.Electric_Piston_UV;
case 9 -> ItemList.Electric_Piston_UHV;
case 10 -> ItemList.Electric_Piston_UEV;
case 11 -> ItemList.Electric_Piston_UIV;
case 12 -> ItemList.Electric_Piston_UMV;
case 13 -> ItemList.Electric_Piston_UXV;
default -> ItemList.Electric_Piston_MAX;
};
case CONVEYOR -> switch (machineTier) {
case 0, 1 -> ItemList.Conveyor_Module_LV;
case 2 -> ItemList.Conveyor_Module_MV;
case 3 -> ItemList.Conveyor_Module_HV;
case 4 -> ItemList.Conveyor_Module_EV;
case 5 -> ItemList.Conveyor_Module_IV;
case 6 -> ItemList.Conveyor_Module_LuV;
case 7 -> ItemList.Conveyor_Module_ZPM;
case 8 -> ItemList.Conveyor_Module_UV;
case 9 -> ItemList.Conveyor_Module_UHV;
case 10 -> ItemList.Conveyor_Module_UEV;
case 11 -> ItemList.Conveyor_Module_UIV;
case 12 -> ItemList.Conveyor_Module_UMV;
case 13 -> ItemList.Conveyor_Module_UXV;
default -> ItemList.Conveyor_Module_MAX;
};
case EMITTER -> switch (machineTier) {
case 0, 1 -> ItemList.Emitter_LV;
case 2 -> ItemList.Emitter_MV;
case 3 -> ItemList.Emitter_HV;
case 4 -> ItemList.Emitter_EV;
case 5 -> ItemList.Emitter_IV;
case 6 -> ItemList.Emitter_LuV;
case 7 -> ItemList.Emitter_ZPM;
case 8 -> ItemList.Emitter_UV;
case 9 -> ItemList.Emitter_UHV;
case 10 -> ItemList.Emitter_UEV;
case 11 -> ItemList.Emitter_UIV;
case 12 -> ItemList.Emitter_UMV;
case 13 -> ItemList.Emitter_UXV;
default -> ItemList.Emitter_MAX;
};
case SENSOR -> switch (machineTier) {
case 0, 1 -> ItemList.Sensor_LV;
case 2 -> ItemList.Sensor_MV;
case 3 -> ItemList.Sensor_HV;
case 4 -> ItemList.Sensor_EV;
case 5 -> ItemList.Sensor_IV;
case 6 -> ItemList.Sensor_LuV;
case 7 -> ItemList.Sensor_ZPM;
case 8 -> ItemList.Sensor_UV;
case 9 -> ItemList.Sensor_UHV;
case 10 -> ItemList.Sensor_UEV;
case 11 -> ItemList.Sensor_UIV;
case 12 -> ItemList.Sensor_UMV;
case 13 -> ItemList.Sensor_UXV;
default -> ItemList.Sensor_MAX;
};
case FIELD_GENERATOR -> switch (machineTier) {
case 0, 1 -> ItemList.Field_Generator_LV;
case 2 -> ItemList.Field_Generator_MV;
case 3 -> ItemList.Field_Generator_HV;
case 4 -> ItemList.Field_Generator_EV;
case 5 -> ItemList.Field_Generator_IV;
case 6 -> ItemList.Field_Generator_LuV;
case 7 -> ItemList.Field_Generator_ZPM;
case 8 -> ItemList.Field_Generator_UV;
case 9 -> ItemList.Field_Generator_UHV;
case 10 -> ItemList.Field_Generator_UEV;
case 11 -> ItemList.Field_Generator_UIV;
case 12 -> ItemList.Field_Generator_UMV;
case 13 -> ItemList.Field_Generator_UXV;
default -> ItemList.Field_Generator_MAX;
};
case ROTOR -> switch (machineTier) {
case 0, 1 -> OrePrefixes.rotor.get(Materials.Tin);
case 2 -> OrePrefixes.rotor.get(Materials.Bronze);
case 3 -> OrePrefixes.rotor.get(Materials.Steel);
case 4 -> OrePrefixes.rotor.get(Materials.StainlessSteel);
case 5 -> OrePrefixes.rotor.get(Materials.TungstenSteel);
case 6 -> OrePrefixes.rotor.get(ExternalMaterials.getRhodiumPlatedPalladium());
case 7 -> OrePrefixes.rotor.get(Materials.Iridium);
default -> OrePrefixes.rotor.get(Materials.Osmium);
};
default -> throw new IllegalArgumentException("MISSING TIER MAPPING FOR: " + aRecipe[i] + " AT TIER " + machineTier);
};
// spotless:on
}
if (!GTModHandler.addCraftingRecipe(
aResult,
GTModHandler.RecipeBits.DISMANTLEABLE | GTModHandler.RecipeBits.BUFFERED
| GTModHandler.RecipeBits.NOT_REMOVABLE
| GTModHandler.RecipeBits.REVERSIBLE,
aRecipe)) {
throw new IllegalArgumentException("INVALID CRAFTING RECIPE FOR: " + aResult.getDisplayName());
}
}
return true;
}
/**
* Internal realisation of the Crafting Recipe adding Process.
*/
private static boolean addCraftingRecipe(ItemStack aResult, Enchantment[] aEnchantmentsAdded,
int[] aEnchantmentLevelsAdded, boolean aMirrored, boolean aBuffered, boolean aKeepNBT, boolean aDismantleable,
boolean aRemovable, boolean aReversible, boolean aRemoveAllOthersWithSameOutput,
boolean aRemoveAllOthersWithSameOutputIfTheyHaveSameNBT, boolean aRemoveAllOtherShapedsWithSameOutput,
boolean aRemoveAllOtherNativeRecipes, boolean aCheckForCollisions,
boolean aOnlyAddIfThereIsAnyRecipeOutputtingThis, boolean aOnlyAddIfResultIsNotNull, Object[] aRecipe) {
aResult = GTOreDictUnificator.get(true, aResult);
if (aOnlyAddIfResultIsNotNull && aResult == null) return false;
if (aResult != null && Items.feather.getDamage(aResult) == W) Items.feather.setDamage(aResult, 0);
if (aRecipe == null || aRecipe.length == 0) return false;
// The renamed variable clarifies what's happening
// noinspection UnnecessaryLocalVariable
boolean tDoWeCareIfThereWasARecipe = aOnlyAddIfThereIsAnyRecipeOutputtingThis;
boolean tThereWasARecipe = false;
for (byte i = 0; i < aRecipe.length; i++) {
if (aRecipe[i] instanceof IItemContainer) aRecipe[i] = ((IItemContainer) aRecipe[i]).get(1);
else if (aRecipe[i] instanceof Enum) aRecipe[i] = ((Enum>) aRecipe[i]).name();
else if (!(aRecipe[i] == null || aRecipe[i] instanceof ItemStack
|| aRecipe[i] instanceof ItemData
|| aRecipe[i] instanceof String
|| aRecipe[i] instanceof Character)) aRecipe[i] = aRecipe[i].toString();
}
try {
StringBuilder shape = new StringBuilder(E);
int idx = 0;
if (aRecipe[idx] instanceof Boolean) {
throw new IllegalArgumentException();
}
ArrayList