package gregtech.api.util;
import static gregtech.api.util.GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES;
import static gregtech.api.util.GT_Utility.copyFluidArray;
import static gregtech.api.util.GT_Utility.copyItemArray;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Stream;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import net.minecraft.item.ItemStack;
import net.minecraft.launchwrapper.Launch;
import net.minecraftforge.fluids.FluidStack;
import org.jetbrains.annotations.Contract;
import gregtech.GT_Mod;
import gregtech.api.enums.Mods;
import gregtech.api.interfaces.IRecipeMap;
import gregtech.api.recipe.RecipeCategory;
import gregtech.api.recipe.RecipeMetadataKey;
import gregtech.api.recipe.metadata.IRecipeMetadataStorage;
import gregtech.api.recipe.metadata.RecipeMetadataStorage;
import gregtech.api.util.extensions.ArrayExt;
@SuppressWarnings({ "unused", "UnusedReturnValue" })
public class GT_RecipeBuilder {
// debug mode expose problems. panic mode help you check nothing is wrong-ish without you actively monitoring
private static final boolean DEBUG_MODE_NULL;
private static boolean PANIC_MODE_NULL;
private static final boolean DEBUG_MODE_INVALID;
private static final boolean PANIC_MODE_INVALID;
private static final boolean DEBUG_MODE_COLLISION;
private static final boolean PANIC_MODE_COLLISION;
public static final int WILDCARD = 32767;
// time units
public static final int HOURS = 20 * 60 * 60;
public static final int MINUTES = 20 * 60;
public static final int SECONDS = 20;
public static final int TICKS = 1;
// fluid units
public static final int INGOTS = 144;
public static final int HALF_INGOT = 72;
public static final int QUARTER_INGOT = 36;
public static final int EIGHTH_INGOT = 18;
public static final int NUGGETS = 16;
public static final int BUCKETS = 1000;
static {
final boolean debugAll;
if (System.getProperties()
.containsKey("gt.recipebuilder.debug")) {
debugAll = Boolean.getBoolean("gt.recipebuilder.debug");
} else {
// turn on debug by default in dev mode
debugAll = (boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment");
}
DEBUG_MODE_NULL = debugAll || Boolean.getBoolean("gt.recipebuilder.debug.null");
DEBUG_MODE_INVALID = debugAll || Boolean.getBoolean("gt.recipebuilder.debug.invalid");
DEBUG_MODE_COLLISION = debugAll || Boolean.getBoolean("gt.recipebuilder.debug.collision");
final boolean panicAll = Boolean.getBoolean("gt.recipebuilder.panic");
PANIC_MODE_NULL = panicAll || Boolean.getBoolean("gt.recipebuilder.panic.null");
PANIC_MODE_INVALID = panicAll || Boolean.getBoolean("gt.recipebuilder.panic.invalid");
PANIC_MODE_COLLISION = panicAll || Boolean.getBoolean("gt.recipebuilder.panic.collision");
}
protected ItemStack[] inputsBasic = new ItemStack[0];
protected Object[] inputsOreDict;
protected ItemStack[] outputs = new ItemStack[0];
protected ItemStack[][] alts;
protected FluidStack[] fluidInputs = new FluidStack[0];
protected FluidStack[] fluidOutputs = new FluidStack[0];
protected int[] chances;
protected Object special;
protected int duration = -1;
protected int eut = -1;
protected int specialValue;
protected boolean enabled = true;
protected boolean hidden = false;
protected boolean fakeRecipe = false;
protected boolean mCanBeBuffered = true;
protected boolean mNeedsEmptyOutput = false;
protected boolean nbtSensitive = false;
protected String[] neiDesc;
protected RecipeCategory recipeCategory;
protected boolean optimize = true;
@Nullable
protected IRecipeMetadataStorage metadataStorage;
protected boolean checkForCollision = true;
/**
* If recipe addition should be skipped.
*/
protected boolean skip = false;
protected boolean valid = true;
GT_RecipeBuilder() {}
private GT_RecipeBuilder(ItemStack[] inputsBasic, Object[] inputsOreDict, ItemStack[] outputs, ItemStack[][] alts,
FluidStack[] fluidInputs, FluidStack[] fluidOutputs, int[] chances, Object special, int duration, int eut,
int specialValue,