diff options
author | SKProCH <29896317+SKProCH@users.noreply.github.com> | 2023-09-05 07:54:47 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-05 06:54:47 +0200 |
commit | 8beb872db7d19665a09518c5a5d90577b9f3f847 (patch) | |
tree | a024db315009e544c2ffc1a0a87dc9a82692d157 /src/main/java/gregtech/api/util/GT_Recipe.java | |
parent | 1249b547f0813db813d1c12713b5dafbf46996df (diff) | |
download | GT5-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.java | 131 |
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, |