aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSKProCH <29896317+SKProCH@users.noreply.github.com>2023-09-05 07:54:47 +0300
committerGitHub <noreply@github.com>2023-09-05 06:54:47 +0200
commit8beb872db7d19665a09518c5a5d90577b9f3f847 (patch)
treea024db315009e544c2ffc1a0a87dc9a82692d157 /src
parent1249b547f0813db813d1c12713b5dafbf46996df (diff)
downloadGT5-Unofficial-8beb872db7d19665a09518c5a5d90577b9f3f847.tar.gz
GT5-Unofficial-8beb872db7d19665a09518c5a5d90577b9f3f847.tar.bz2
GT5-Unofficial-8beb872db7d19665a09518c5a5d90577b9f3f847.zip
Proper recipe selection for output overflow in LCR and other multiblocks (#2247)
* Implement Stream<FindRecipeResult> findRecipesWithResult for GT_RecipeMap * Change ProcessingLogic.process to actually use new findRecipesWithResult * Change ProcessingLogic.process to start finding something only for OUTPUT_FULL result * Refactor ProcessingLogic.process to make logic more readable * Replace while with for loop, remove NOT_FOUND return in end of findRecipesWithResult * Apply spotless * Make findRecipe use findRecipes, add annotation to GT_Recipe and FindRecipeResult for processRecipe and make method protected, replace wildcard imports * Remake isRecipeWithOutputFullFound * Add @Nonnull to methods * Apply spotless * Remove Stream version of findRecipeWithResult, replace with predicate one. Add GT_Predicated_Recipe_Map class for utilizing this method. Changes some existent recipe maps to inherit from base class. * Remove GT_Predicated_Recipe_Map, add Predicate directly to GT_Recipe_Map#findRecipeWithResult. Add AdvancedRecipeValidatorPredicate and FindRecipeWithAdvancedValidatorResult to allow store validation calculations for further use and proper errors displaying. * Fix InsufficientVoltage errors * Changes according to review comments. Integrate FindRecipeWithAdvancedValidatorResult to FindRecipeResult, rename AdvancedRecipeValidatorPredicate, encapsulate AdvancedRecipeValidatorPredicate fields, fixes some typos, etc * Moves InsufficientVoltage check to GT_ParallelHelper. Removes FindRecipeResult#State#INSUFFICIENT_VOLTAGE * Return an old findRecipeWithResult * Renames things, call old methods for singleblocks * Renames things, makes FindRecipeResult ctor private * Apply spotless * Move RecipeValidator, fix comments typos
Diffstat (limited to 'src')
-rw-r--r--src/main/java/gregtech/api/logic/ProcessingLogic.java99
-rw-r--r--src/main/java/gregtech/api/recipe/check/FindRecipeResult.java40
-rw-r--r--src/main/java/gregtech/api/recipe/check/RecipeValidator.java80
-rw-r--r--src/main/java/gregtech/api/util/GT_ParallelHelper.java10
-rw-r--r--src/main/java/gregtech/api/util/GT_Recipe.java131
5 files changed, 269 insertions, 91 deletions
diff --git a/src/main/java/gregtech/api/logic/ProcessingLogic.java b/src/main/java/gregtech/api/logic/ProcessingLogic.java
index 6fa25a6c40..345a3e59dd 100644
--- a/src/main/java/gregtech/api/logic/ProcessingLogic.java
+++ b/src/main/java/gregtech/api/logic/ProcessingLogic.java
@@ -9,12 +9,11 @@ import javax.annotation.Nullable;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
+import org.jetbrains.annotations.NotNull;
+
import gregtech.api.interfaces.tileentity.IRecipeLockable;
import gregtech.api.interfaces.tileentity.IVoidable;
-import gregtech.api.recipe.check.CheckRecipeResult;
-import gregtech.api.recipe.check.CheckRecipeResultRegistry;
-import gregtech.api.recipe.check.FindRecipeResult;
-import gregtech.api.recipe.check.SingleRecipeCheck;
+import gregtech.api.recipe.check.*;
import gregtech.api.util.GT_OverclockCalculator;
import gregtech.api.util.GT_ParallelHelper;
import gregtech.api.util.GT_Recipe;
@@ -275,7 +274,6 @@ public class ProcessingLogic {
maxParallel = maxParallelSupplier.get();
}
- FindRecipeResult findRecipeResult;
if (isRecipeLocked && recipeLockableMachine != null && recipeLockableMachine.getSingleRecipeCheck() != null) {
// Recipe checker is already built, we'll use it
SingleRecipeCheck singleRecipeCheck = recipeLockableMachine.getSingleRecipeCheck();
@@ -284,45 +282,81 @@ public class ProcessingLogic {
if (singleRecipeCheck.checkRecipeInputs(false, 1, inputItems, inputFluids) == 0) {
return CheckRecipeResultRegistry.NO_RECIPE;
}
- findRecipeResult = FindRecipeResult.ofSuccess(
+
+ return processRecipe(
recipeLockableMachine.getSingleRecipeCheck()
.getRecipe());
- } else {
- findRecipeResult = findRecipe(recipeMap);
}
- GT_Recipe recipe;
- CheckRecipeResult result;
- if (findRecipeResult.isSuccessful()) {
- recipe = findRecipeResult.getRecipeNonNull();
- result = validateRecipe(recipe);
- if (!result.wasSuccessful()) {
- return result;
- } else {
- if (recipe.mCanBeBuffered) {
- lastRecipe = recipe;
- } else {
- lastRecipe = null;
- }
+ FindRecipeResult findRecipeResult = findRecipe(recipeMap);
+ // If processRecipe is not overridden, advanced recipe validation logic is used, and we can reuse calculations.
+ if (findRecipeResult.hasRecipeValidator()) {
+ RecipeValidator recipeValidator = findRecipeResult.getRecipeValidator();
+
+ // There are two cases:
+ // 1 - there are actually no matching recipes
+ // 2 - there are some matching recipes, but we rejected it due to our advanced validation (e.g. OUTPUT_FULL)
+ if (findRecipeResult.getState() == FindRecipeResult.State.NOT_FOUND
+ && recipeValidator.getFirstCheckResult() != null) {
+ // Here we're handling case 2
+ // If there are matching recipes but our validation rejected them,
+ // we should return a first one to display a proper error in the machine GUI
+ return recipeValidator.getFirstCheckResult();
}
- } else {
- if (findRecipeResult.getState() == FindRecipeResult.State.INSUFFICIENT_VOLTAGE) {
- return CheckRecipeResultRegistry.insufficientPower(findRecipeResult.getRecipeNonNull().mEUt);
- } else {
- return CheckRecipeResultRegistry.NO_RECIPE;
+
+ // If everything is ok, reuse our calculations
+ if (recipeValidator.isExecutedAtLeastOnce() && findRecipeResult.isSuccessful()) {
+ return applyRecipe(
+ findRecipeResult.getRecipeNonNull(),
+ recipeValidator.getLastParallelHelper(),
+ recipeValidator.getLastOverclockCalculator(),
+ recipeValidator.getLastCheckResult());
}
}
+ if (!findRecipeResult.isSuccessful()) {
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ return processRecipe(findRecipeResult.getRecipeNonNull());
+ }
+
+ /**
+ * Checks if supplied recipe is valid for process.
+ * If so, additionally performs input consumption, output calculation with parallel, and overclock calculation.
+ *
+ * @param recipe The recipe which will be checked and processed
+ */
+ @Nonnull
+ protected CheckRecipeResult processRecipe(@Nonnull GT_Recipe recipe) {
+ CheckRecipeResult result = validateRecipe(recipe);
+ if (!result.wasSuccessful()) {
+ return result;
+ }
+
GT_ParallelHelper helper = createParallelHelper(recipe);
GT_OverclockCalculator calculator = createOverclockCalculator(recipe);
helper.setCalculator(calculator);
helper.build();
+ return applyRecipe(recipe, helper, calculator, result);
+ }
+
+ /**
+ * Applies the recipe and calculated parameters
+ */
+ private CheckRecipeResult applyRecipe(@NotNull GT_Recipe recipe, GT_ParallelHelper helper,
+ GT_OverclockCalculator calculator, CheckRecipeResult result) {
if (!helper.getResult()
.wasSuccessful()) {
return helper.getResult();
}
+ if (recipe.mCanBeBuffered) {
+ lastRecipe = recipe;
+ } else {
+ lastRecipe = null;
+ }
calculatedParallels = helper.getCurrentParallel();
if (calculator.getConsumption() == Long.MAX_VALUE) {
@@ -360,14 +394,25 @@ public class ProcessingLogic {
@Nonnull
protected FindRecipeResult findRecipe(@Nullable GT_Recipe_Map map) {
if (map == null) return FindRecipeResult.NOT_FOUND;
- return map.findRecipeWithResult(
+
+ RecipeValidator recipeValidator = new RecipeValidator(
+ this::validateRecipe,
+ this::createParallelHelper,
+ this::createOverclockCalculator);
+
+ FindRecipeResult findRecipeResult = map.findRecipeWithResult(
lastRecipe,
+ recipeValidator,
false,
false,
amperageOC ? availableVoltage * availableAmperage : availableVoltage,
inputFluids,
specialSlotItem,
inputItems);
+
+ findRecipeResult.setRecipeValidator(recipeValidator);
+
+ return findRecipeResult;
}
/**
diff --git a/src/main/java/gregtech/api/recipe/check/FindRecipeResult.java b/src/main/java/gregtech/api/recipe/check/FindRecipeResult.java
index 5791cb05e1..fa0e251fa1 100644
--- a/src/main/java/gregtech/api/recipe/check/FindRecipeResult.java
+++ b/src/main/java/gregtech/api/recipe/check/FindRecipeResult.java
@@ -5,6 +5,8 @@ import java.util.Objects;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
+import org.jetbrains.annotations.NotNull;
+
import gregtech.api.util.GT_Recipe;
/**
@@ -17,6 +19,8 @@ public class FindRecipeResult {
private final State state;
@Nullable
private final GT_Recipe recipe;
+ @Nullable
+ private RecipeValidator recipeValidator;
private FindRecipeResult(@Nonnull State state, @Nullable GT_Recipe recipe) {
this.state = state;
@@ -41,7 +45,7 @@ public class FindRecipeResult {
}
/**
- * You should use this ONLY WHEN state == FOUND or INSUFFICIENT_VOLTAGE.
+ * You should use this ONLY WHEN state == FOUND.
*/
@Nonnull
public GT_Recipe getRecipeNonNull() {
@@ -49,17 +53,35 @@ public class FindRecipeResult {
}
/**
- * Successfully found recipe.
+ * Gets recipeValidator if it is not null.
+ * Be sure to call hasRecipeValidator before to determine if recipeValidator exists
+ *
+ * @return not null recipe validator
*/
- public static FindRecipeResult ofSuccess(@Nonnull GT_Recipe recipe) {
- return new FindRecipeResult(State.FOUND, Objects.requireNonNull(recipe));
+ @NotNull
+ public RecipeValidator getRecipeValidator() {
+ return Objects.requireNonNull(recipeValidator);
+ }
+
+ /**
+ * Sets recipeValidator which used to get this result
+ */
+ public void setRecipeValidator(@Nullable RecipeValidator recipeValidator) {
+ this.recipeValidator = recipeValidator;
}
/**
- * Recipe was found, but voltage is not sufficient to run.
+ * Gets if this result has recipeValidator
*/
- public static FindRecipeResult ofInsufficientVoltage(@Nonnull GT_Recipe recipe) {
- return new FindRecipeResult(State.INSUFFICIENT_VOLTAGE, Objects.requireNonNull(recipe));
+ public boolean hasRecipeValidator() {
+ return recipeValidator != null;
+ }
+
+ /**
+ * Successfully found recipe.
+ */
+ public static FindRecipeResult ofSuccess(@Nonnull GT_Recipe recipe) {
+ return new FindRecipeResult(State.FOUND, Objects.requireNonNull(recipe));
}
/**
@@ -82,10 +104,6 @@ public class FindRecipeResult {
*/
FOUND(true),
/**
- * Recipe was found, but voltage is not sufficient to run.
- */
- INSUFFICIENT_VOLTAGE(false),
- /**
* No recipe found.
*/
NOT_FOUND(false),
diff --git a/src/main/java/gregtech/api/recipe/check/RecipeValidator.java b/src/main/java/gregtech/api/recipe/check/RecipeValidator.java
new file mode 100644
index 0000000000..8fb7b87cfe
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/check/RecipeValidator.java
@@ -0,0 +1,80 @@
+package gregtech.api.recipe.check;
+
+import java.util.function.Function;
+import java.util.function.Predicate;
+
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+
+/**
+ * Predicate for simple recipe validation.
+ * Also store some validation results for reusing it
+ */
+public class RecipeValidator implements Predicate<GT_Recipe> {
+
+ private CheckRecipeResult firstCheckResult;
+ private CheckRecipeResult lastCheckResult;
+ private GT_ParallelHelper lastParallelHelper;
+ private GT_OverclockCalculator lastOverclockCalculator;
+ private boolean wasExecutedAtLeastOnce = false;
+ private final Function<GT_Recipe, CheckRecipeResult> recipeValidator;
+ private final Function<GT_Recipe, GT_ParallelHelper> parallelHelperFactory;
+ private final Function<GT_Recipe, GT_OverclockCalculator> overclockCalculatorFactory;
+
+ public RecipeValidator(Function<GT_Recipe, CheckRecipeResult> recipeValidator,
+ Function<GT_Recipe, GT_ParallelHelper> parallelHelperFactory,
+ Function<GT_Recipe, GT_OverclockCalculator> overclockCalculatorFactory) {
+ this.recipeValidator = recipeValidator;
+ this.parallelHelperFactory = parallelHelperFactory;
+ this.overclockCalculatorFactory = overclockCalculatorFactory;
+ }
+
+ @Override
+ public boolean test(GT_Recipe recipe) {
+ wasExecutedAtLeastOnce = true;
+ CheckRecipeResult checkRecipeResult = checkRecipe(recipe);
+ if (firstCheckResult == null) {
+ firstCheckResult = checkRecipeResult;
+ }
+ return checkRecipeResult.wasSuccessful();
+ }
+
+ private CheckRecipeResult checkRecipe(GT_Recipe recipe) {
+ lastCheckResult = recipeValidator.apply(recipe);
+
+ if (!lastCheckResult.wasSuccessful()) {
+ return lastCheckResult;
+ }
+
+ lastParallelHelper = parallelHelperFactory.apply(recipe);
+ lastOverclockCalculator = overclockCalculatorFactory.apply(recipe);
+ lastParallelHelper.setCalculator(lastOverclockCalculator);
+ lastParallelHelper.build();
+
+ return lastParallelHelper.getResult();
+ }
+
+ public Boolean isExecutedAtLeastOnce() {
+ return wasExecutedAtLeastOnce;
+ }
+
+ /**
+ * Gets first check result in case if nothing matching recipe found.
+ */
+ public CheckRecipeResult getFirstCheckResult() {
+ return firstCheckResult;
+ }
+
+ public CheckRecipeResult getLastCheckResult() {
+ return lastCheckResult;
+ }
+
+ public GT_ParallelHelper getLastParallelHelper() {
+ return lastParallelHelper;
+ }
+
+ public GT_OverclockCalculator getLastOverclockCalculator() {
+ return lastOverclockCalculator;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_ParallelHelper.java b/src/main/java/gregtech/api/util/GT_ParallelHelper.java
index b44e9167f5..13fe6290f3 100644
--- a/src/main/java/gregtech/api/util/GT_ParallelHelper.java
+++ b/src/main/java/gregtech/api/util/GT_ParallelHelper.java
@@ -215,7 +215,7 @@ public class GT_ParallelHelper {
/**
* Set if we should consume inputs or not when trying for parallels
- *
+ *
* @param consume Should we consume inputs
*/
public GT_ParallelHelper setConsumption(boolean consume) {
@@ -251,7 +251,7 @@ public class GT_ParallelHelper {
/**
* Sets if we should calculate outputs with the parallels we found or not
- *
+ *
* @param calculateOutputs Should we calculate outputs with the helper or not
*/
public GT_ParallelHelper setOutputCalculation(boolean calculateOutputs) {
@@ -402,6 +402,11 @@ public class GT_ParallelHelper {
.setEUtDiscount(eutModifier);
}
+ final int tRecipeEUt = (int) Math.ceil(recipe.mEUt * eutModifier);
+ if (availableEUt < tRecipeEUt) {
+ result = CheckRecipeResultRegistry.insufficientPower(tRecipeEUt);
+ }
+
// Save the original max parallel before calculating our overclocking under 1 tick
int originalMaxParallel = maxParallel;
double tickTimeAfterOC = calculator.setParallel(originalMaxParallel)
@@ -450,7 +455,6 @@ public class GT_ParallelHelper {
maxParallelBeforeBatchMode = Math.min(maxParallel, maxParallelBeforeBatchMode);
- final int tRecipeEUt = (int) Math.ceil(recipe.mEUt * eutModifier);
// Consume inputs to determine normal parallel
if (recipeCheck != null) {
int actualMaxParallel = (int) Math.min(maxParallelBeforeBatchMode, availableEUt / tRecipeEUt);
diff --git a/src/main/java/gregtech/api/util/GT_Recipe.java b/src/main/java/gregtech/api/util/GT_Recipe.java
index 2442e5b720..cc2a2b0626 100644
--- a/src/main/java/gregtech/api/util/GT_Recipe.java
+++ b/src/main/java/gregtech/api/util/GT_Recipe.java
@@ -30,19 +30,11 @@ import static net.minecraft.util.EnumChatFormatting.GRAY;
import static net.minecraft.util.StatCollector.translateToLocal;
import java.awt.Rectangle;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
import java.util.function.Function;
+import java.util.function.Predicate;
import java.util.function.Supplier;
import javax.annotation.Nonnull;
@@ -3999,9 +3991,40 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
* @return Result of the recipe search
*/
@Nonnull
- public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, boolean aNotUnificated,
+ public final FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, boolean aNotUnificated,
boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids, ItemStack aSpecialSlot,
ItemStack... aInputs) {
+ return findRecipeWithResult(
+ aRecipe,
+ recipe -> aVoltage * mAmperage >= recipe.mEUt,
+ aNotUnificated,
+ aDontCheckStackSizes,
+ aVoltage,
+ aFluids,
+ aSpecialSlot,
+ aInputs);
+ }
+
+ /**
+ * finds a Recipe matching the aFluid and ItemStack Inputs.
+ *
+ * @param aRecipe in case this is != null it will try to use this Recipe first when looking things
+ * up.
+ * @param aIsValidRecipe predicate to help identify, if the recipe matches our machine
+ * @param aNotUnificated if this is T the Recipe searcher will unificate the ItemStack Inputs
+ * @param aDontCheckStackSizes if set to false will only return recipes that can be executed at least once with
+ * the provided input
+ * @param aVoltage Voltage of the Machine or Long.MAX_VALUE if it has no Voltage
+ * @param aFluids the Fluid Inputs
+ * @param aSpecialSlot the content of the Special Slot, the regular Manager doesn't do anything with
+ * this, but some custom ones do.
+ * @param aInputs the Item Inputs
+ * @return Result of the recipe search
+ */
+ @Nonnull
+ public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, Predicate<GT_Recipe> aIsValidRecipe,
+ boolean aNotUnificated, boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids,
+ ItemStack aSpecialSlot, ItemStack... aInputs) {
// No Recipes? Well, nothing to be found then.
if (mRecipeList.isEmpty()) return NOT_FOUND;
@@ -4032,9 +4055,9 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
&& aRecipe.isRecipeInputEqual(false, aDontCheckStackSizes, aFluids, aInputs)) {
if (!isSpecialSlotSensitive
|| GT_Utility.areStacksEqualOrNull((ItemStack) aRecipe.mSpecialItems, aSpecialSlot)) {
- return aRecipe.mEnabled && aVoltage * mAmperage >= aRecipe.mEUt
- ? FindRecipeResult.ofSuccess(aRecipe)
- : FindRecipeResult.ofInsufficientVoltage(aRecipe);
+ if (aRecipe.mEnabled && aIsValidRecipe.test(aRecipe)) {
+ return ofSuccess(aRecipe);
+ }
}
}
@@ -4045,9 +4068,9 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
&& tRecipe.isRecipeInputEqual(false, aDontCheckStackSizes, aFluids, aInputs)) {
if (!isSpecialSlotSensitive
|| GT_Utility.areStacksEqualOrNull((ItemStack) tRecipe.mSpecialItems, aSpecialSlot)) {
- return tRecipe.mEnabled && aVoltage * mAmperage >= tRecipe.mEUt
- ? FindRecipeResult.ofSuccess(tRecipe)
- : FindRecipeResult.ofInsufficientVoltage(tRecipe);
+ if (tRecipe.mEnabled && aIsValidRecipe.test(tRecipe)) {
+ return ofSuccess(tRecipe);
+ }
}
}
tRecipes = mRecipeItemMap.get(new GT_ItemStack(tStack, true));
@@ -4055,9 +4078,9 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
&& tRecipe.isRecipeInputEqual(false, aDontCheckStackSizes, aFluids, aInputs)) {
if (!isSpecialSlotSensitive
|| GT_Utility.areStacksEqualOrNull((ItemStack) tRecipe.mSpecialItems, aSpecialSlot)) {
- return tRecipe.mEnabled && aVoltage * mAmperage >= tRecipe.mEUt
- ? FindRecipeResult.ofSuccess(tRecipe)
- : FindRecipeResult.ofInsufficientVoltage(tRecipe);
+ if (tRecipe.mEnabled && aIsValidRecipe.test(tRecipe)) {
+ return ofSuccess(tRecipe);
+ }
}
}
}
@@ -4072,9 +4095,9 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
&& tRecipe.isRecipeInputEqual(false, aDontCheckStackSizes, aFluids, aInputs)) {
if (!isSpecialSlotSensitive
|| GT_Utility.areStacksEqualOrNull((ItemStack) tRecipe.mSpecialItems, aSpecialSlot)) {
- return tRecipe.mEnabled && aVoltage * mAmperage >= tRecipe.mEUt
- ? FindRecipeResult.ofSuccess(tRecipe)
- : FindRecipeResult.ofInsufficientVoltage(tRecipe);
+ if (tRecipe.mEnabled && aIsValidRecipe.test(tRecipe)) {
+ return ofSuccess(tRecipe);
+ }
}
}
}
@@ -4941,9 +4964,9 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
@Nonnull
@Override
- public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, boolean aNotUnificated,
- boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids, ItemStack aSpecialSlot,
- ItemStack... aInputs) {
+ public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, Predicate<GT_Recipe> aIsValidRecipe,
+ boolean aNotUnificated, boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids,
+ ItemStack aSpecialSlot, ItemStack... aInputs) {
if (aInputs == null || aInputs.length == 0 || aInputs[0] == null) return NOT_FOUND;
if (aRecipe != null && aRecipe.isRecipeInputEqual(false, true, aFluids, aInputs))
return FindRecipeResult.ofSuccess(aRecipe);
@@ -4998,9 +5021,9 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
@Nonnull
@Override
- public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, boolean aNotUnificated,
- boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids, ItemStack aSpecialSlot,
- ItemStack... aInputs) {
+ public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, Predicate<GT_Recipe> aIsValidRecipe,
+ boolean aNotUnificated, boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids,
+ ItemStack aSpecialSlot, ItemStack... aInputs) {
if (aInputs == null || aInputs.length == 0 || aInputs[0] == null) return NOT_FOUND;
if (aRecipe != null && aRecipe.isRecipeInputEqual(false, true, aFluids, aInputs))
return FindRecipeResult.ofSuccess(aRecipe);
@@ -5118,12 +5141,13 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
@Nonnull
@Override
- public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, boolean aNotUnificated,
- boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids, ItemStack aSpecialSlot,
- ItemStack... aInputs) {
+ public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, Predicate<GT_Recipe> aIsValidRecipe,
+ boolean aNotUnificated, boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids,
+ ItemStack aSpecialSlot, ItemStack... aInputs) {
if (aInputs == null || aInputs.length == 0 || !ItemList.IC2_Scrapbox.isStackEqual(aInputs[0], false, true))
return super.findRecipeWithResult(
aRecipe,
+ aIsValidRecipe,
aNotUnificated,
aDontCheckStackSizes,
aVoltage,
@@ -5133,6 +5157,7 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
ItemStack tOutput = GT_ModHandler.getRandomScrapboxDrop();
if (tOutput == null) return super.findRecipeWithResult(
aRecipe,
+ aIsValidRecipe,
aNotUnificated,
aDontCheckStackSizes,
aVoltage,
@@ -5193,11 +5218,12 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
@Nonnull
@Override
- public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, boolean aNotUnificated,
- boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids, ItemStack aSpecialSlot,
- ItemStack... aInputs) {
+ public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, Predicate<GT_Recipe> aIsValidRecipe,
+ boolean aNotUnificated, boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids,
+ ItemStack aSpecialSlot, ItemStack... aInputs) {
FindRecipeResult result = super.findRecipeWithResult(
aRecipe,
+ aIsValidRecipe,
aNotUnificated,
aDontCheckStackSizes,
aVoltage,
@@ -5293,9 +5319,9 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
@Nonnull
@Override
- public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, boolean aNotUnificated,
- boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids, ItemStack aSpecialSlot,
- ItemStack... aInputs) {
+ public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, Predicate<GT_Recipe> aIsValidRecipe,
+ boolean aNotUnificated, boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids,
+ ItemStack aSpecialSlot, ItemStack... aInputs) {
if (aInputs == null || aInputs.length == 0 || aInputs[0] == null) return NOT_FOUND;
if (aRecipe != null && aRecipe.isRecipeInputEqual(false, true, aFluids, aInputs))
return FindRecipeResult.ofSuccess(aRecipe);
@@ -5348,12 +5374,13 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
@Nonnull
@Override
- public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, boolean aNotUnificated,
- boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids, ItemStack aSpecialSlot,
- ItemStack... aInputs) {
+ public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, Predicate<GT_Recipe> aIsValidRecipe,
+ boolean aNotUnificated, boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids,
+ ItemStack aSpecialSlot, ItemStack... aInputs) {
if (aInputs == null || aInputs.length == 0 || aInputs[0] == null || !GregTech_API.sPostloadFinished)
return super.findRecipeWithResult(
aRecipe,
+ aIsValidRecipe,
aNotUnificated,
aDontCheckStackSizes,
aVoltage,
@@ -5362,6 +5389,7 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
aInputs);
FindRecipeResult result = super.findRecipeWithResult(
aRecipe,
+ aIsValidRecipe,
aNotUnificated,
aDontCheckStackSizes,
aVoltage,
@@ -5466,12 +5494,13 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
@Nonnull
@Override
- public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, boolean aNotUnificated,
- boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids, ItemStack aSpecialSlot,
- ItemStack... aInputs) {
+ public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, Predicate<GT_Recipe> aIsValidRecipe,
+ boolean aNotUnificated, boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids,
+ ItemStack aSpecialSlot, ItemStack... aInputs) {
FindRecipeResult result = super.findRecipeWithResult(
aRecipe,
+ aIsValidRecipe,
true,
aDontCheckStackSizes,
aVoltage,
@@ -5535,11 +5564,12 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
@Nonnull
@Override
- public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, boolean aNotUnificated,
- boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids, ItemStack aSpecialSlot,
- ItemStack... aInputs) {
+ public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, Predicate<GT_Recipe> aIsValidRecipe,
+ boolean aNotUnificated, boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids,
+ ItemStack aSpecialSlot, ItemStack... aInputs) {
FindRecipeResult result = super.findRecipeWithResult(
aRecipe,
+ aIsValidRecipe,
aNotUnificated,
aDontCheckStackSizes,
aVoltage,
@@ -5637,11 +5667,12 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
@Nonnull
@Override
- public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, boolean aNotUnificated,
- boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids, ItemStack aSpecialSlot,
- ItemStack... aInputs) {
+ public FindRecipeResult findRecipeWithResult(GT_Recipe aRecipe, Predicate<GT_Recipe> aIsValidRecipe,
+ boolean aNotUnificated, boolean aDontCheckStackSizes, long aVoltage, FluidStack[] aFluids,
+ ItemStack aSpecialSlot, ItemStack... aInputs) {
FindRecipeResult result = super.findRecipeWithResult(
aRecipe,
+ aIsValidRecipe,
aNotUnificated,
aDontCheckStackSizes,
aVoltage,