aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/util/GT_Recipe.java
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/main/java/gregtech/api/util/GT_Recipe.java
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/main/java/gregtech/api/util/GT_Recipe.java')
-rw-r--r--src/main/java/gregtech/api/util/GT_Recipe.java131
1 files changed, 81 insertions, 50 deletions
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,