diff options
Diffstat (limited to 'src/main/java/gregtech/api/recipe')
-rw-r--r-- | src/main/java/gregtech/api/recipe/check/FindRecipeResult.java | 40 | ||||
-rw-r--r-- | src/main/java/gregtech/api/recipe/check/RecipeValidator.java | 80 |
2 files changed, 109 insertions, 11 deletions
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; + } +} |