aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/logic/ProcessingLogic.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api/logic/ProcessingLogic.java')
-rw-r--r--src/main/java/gregtech/api/logic/ProcessingLogic.java323
1 files changed, 18 insertions, 305 deletions
diff --git a/src/main/java/gregtech/api/logic/ProcessingLogic.java b/src/main/java/gregtech/api/logic/ProcessingLogic.java
index 6b9f2d454f..4d203ed80f 100644
--- a/src/main/java/gregtech/api/logic/ProcessingLogic.java
+++ b/src/main/java/gregtech/api/logic/ProcessingLogic.java
@@ -1,7 +1,6 @@
package gregtech.api.logic;
import java.util.List;
-import java.util.function.Supplier;
import java.util.stream.Stream;
import javax.annotation.Nonnull;
@@ -10,10 +9,7 @@ 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.RecipeMap;
import gregtech.api.recipe.check.CheckRecipeResult;
import gregtech.api.recipe.check.CheckRecipeResultRegistry;
@@ -26,90 +22,45 @@ import gregtech.api.util.GT_Recipe;
* Logic class to calculate result of recipe check from inputs, based on recipemap.
*/
@SuppressWarnings({ "unused", "UnusedReturnValue" })
-public class ProcessingLogic {
+public class ProcessingLogic extends AbstractProcessingLogic<ProcessingLogic> {
- protected IVoidable machine;
protected IRecipeLockable recipeLockableMachine;
- protected Supplier<RecipeMap<?>> recipeMapSupplier;
- protected GT_Recipe lastRecipe;
- protected RecipeMap<?> lastRecipeMap;
protected ItemStack specialSlotItem;
protected ItemStack[] inputItems;
- protected ItemStack[] outputItems;
- protected ItemStack[] currentOutputItems;
protected FluidStack[] inputFluids;
- protected FluidStack[] outputFluids;
- protected FluidStack[] currentOutputFluids;
- protected long calculatedEut;
- protected int duration;
- protected long availableVoltage;
- protected long availableAmperage;
- protected int overClockTimeReduction = 1;
- protected int overClockPowerIncrease = 2;
- protected boolean protectItems;
- protected boolean protectFluids;
protected boolean isRecipeLocked;
- protected int maxParallel = 1;
- protected int calculatedParallels = 0;
- protected Supplier<Integer> maxParallelSupplier;
- protected int batchSize = 1;
- protected float euModifier = 1.0f;
- protected float speedBoost = 1.0f;
- protected boolean amperageOC = true;
public ProcessingLogic() {}
- // region Setters
+ // #region Setters
+ @Nonnull
public ProcessingLogic setInputItems(ItemStack... itemInputs) {
this.inputItems = itemInputs;
- return this;
+ return getThis();
}
+ @Nonnull
public ProcessingLogic setInputItems(List<ItemStack> itemOutputs) {
this.inputItems = itemOutputs.toArray(new ItemStack[0]);
- return this;
+ return getThis();
}
+ @Nonnull
public ProcessingLogic setInputFluids(FluidStack... fluidInputs) {
this.inputFluids = fluidInputs;
- return this;
+ return getThis();
}
+ @Nonnull
public ProcessingLogic setInputFluids(List<FluidStack> fluidInputs) {
this.inputFluids = fluidInputs.toArray(new FluidStack[0]);
- return this;
+ return getThis();
}
public ProcessingLogic setSpecialSlotItem(ItemStack specialSlotItem) {
this.specialSlotItem = specialSlotItem;
- return this;
- }
-
- /**
- * Overwrites item output result of the calculation.
- */
- public ProcessingLogic setOutputItems(ItemStack... itemOutputs) {
- this.outputItems = itemOutputs;
- return this;
- }
-
- /**
- * Overwrites fluid output result of the calculation.
- */
- public ProcessingLogic setOutputFluids(FluidStack... fluidOutputs) {
- this.outputFluids = fluidOutputs;
- return this;
- }
-
- public ProcessingLogic setCurrentOutputItems(ItemStack... currentOutputItems) {
- this.currentOutputItems = currentOutputItems;
- return this;
- }
-
- public ProcessingLogic setCurrentOutputFluids(FluidStack... currentOutputFluids) {
- this.currentOutputFluids = currentOutputFluids;
- return this;
+ return getThis();
}
/**
@@ -118,129 +69,13 @@ public class ProcessingLogic {
public ProcessingLogic setRecipeLocking(IRecipeLockable recipeLockableMachine, boolean isRecipeLocked) {
this.recipeLockableMachine = recipeLockableMachine;
this.isRecipeLocked = isRecipeLocked;
- return this;
- }
-
- /**
- * Sets max amount of parallel.
- */
- public ProcessingLogic setMaxParallel(int maxParallel) {
- this.maxParallel = maxParallel;
- return this;
- }
-
- /**
- * Sets method to get max amount of parallel.
- */
- public ProcessingLogic setMaxParallelSupplier(Supplier<Integer> supplier) {
- this.maxParallelSupplier = supplier;
- return this;
- }
-
- /**
- * Sets batch size for batch mode.
- */
- public ProcessingLogic setBatchSize(int size) {
- this.batchSize = size;
- return this;
- }
-
- public ProcessingLogic setRecipeMap(RecipeMap<?> recipeMap) {
- return setRecipeMapSupplier(() -> recipeMap);
- }
-
- public ProcessingLogic setRecipeMapSupplier(Supplier<RecipeMap<?>> supplier) {
- this.recipeMapSupplier = supplier;
- return this;
- }
-
- public ProcessingLogic setEuModifier(float modifier) {
- this.euModifier = modifier;
- return this;
- }
-
- public ProcessingLogic setSpeedBonus(float speedModifier) {
- this.speedBoost = speedModifier;
- return this;
- }
-
- /**
- * Sets machine used for void protection logic.
- */
- public ProcessingLogic setMachine(IVoidable machine) {
- this.machine = machine;
- return this;
- }
-
- /**
- * Overwrites duration result of the calculation.
- */
- public ProcessingLogic setDuration(int duration) {
- this.duration = duration;
- return this;
- }
-
- /**
- * Overwrites EU/t result of the calculation.
- */
- public ProcessingLogic setCalculatedEut(long calculatedEut) {
- this.calculatedEut = calculatedEut;
- return this;
- }
-
- /**
- * Sets voltage of the machine. It doesn't need to be actual voltage (excluding amperage) of the machine;
- * For example, most of the multiblock machines set maximum possible input power (including amperage) as voltage
- * and 1 as amperage. That way recipemap search will be executed with overclocked voltage.
- */
- public ProcessingLogic setAvailableVoltage(long voltage) {
- availableVoltage = voltage;
- return this;
- }
-
- /**
- * Sets amperage of the machine. This amperage doesn't involve in EU/t when searching recipemap.
- * Useful for preventing tier skip but still considering amperage for parallel.
- */
- public ProcessingLogic setAvailableAmperage(long amperage) {
- availableAmperage = amperage;
- return this;
- }
-
- public ProcessingLogic setVoidProtection(boolean protectItems, boolean protectFluids) {
- this.protectItems = protectItems;
- this.protectFluids = protectFluids;
- return this;
- }
-
- /**
- * Sets custom overclock ratio. 2/4 by default.
- * Parameters represent number of bit shift, so 1 -> 2x, 2 -> 4x.
- */
- public ProcessingLogic setOverclock(int timeReduction, int powerIncrease) {
- this.overClockTimeReduction = timeReduction;
- this.overClockPowerIncrease = powerIncrease;
- return this;
- }
-
- /**
- * Sets overclock ratio to 4/4.
- */
- public ProcessingLogic enablePerfectOverclock() {
- return this.setOverclock(2, 2);
- }
-
- /**
- * Sets wether the multi should use amperage to OC or not
- */
- public ProcessingLogic setAmperageOC(boolean amperageOC) {
- this.amperageOC = amperageOC;
- return this;
+ return getThis();
}
/**
* Clears calculated results and provided machine inputs to prepare for the next machine operation.
*/
+
public ProcessingLogic clear() {
this.inputItems = null;
this.inputFluids = null;
@@ -250,32 +85,19 @@ public class ProcessingLogic {
this.calculatedEut = 0;
this.duration = 0;
this.calculatedParallels = 0;
- return this;
+ return getThis();
}
- // endregion
+ // #endregion
- // region Logic
+ // #region Logic
/**
* Executes the recipe check: Find recipe from recipemap, Calculate parallel, overclock and outputs.
*/
@Nonnull
public CheckRecipeResult process() {
- RecipeMap<?> recipeMap;
- if (recipeMapSupplier == null) {
- recipeMap = null;
- } else {
- recipeMap = recipeMapSupplier.get();
- }
- if (lastRecipeMap != recipeMap) {
- lastRecipe = null;
- lastRecipeMap = recipeMap;
- }
-
- if (maxParallelSupplier != null) {
- maxParallel = maxParallelSupplier.get();
- }
+ RecipeMap<?> recipeMap = preProcess();
if (inputItems == null) {
inputItems = new ItemStack[0];
@@ -297,7 +119,6 @@ public class ProcessingLogic {
recipeLockableMachine.getSingleRecipeCheck()
.getRecipe()).checkRecipeResult;
}
-
Stream<GT_Recipe> matchedRecipes = findRecipeMatches(recipeMap);
Iterable<GT_Recipe> recipeIterable = matchedRecipes::iterator;
CheckRecipeResult checkRecipeResult = CheckRecipeResultRegistry.NO_RECIPE;
@@ -342,53 +163,6 @@ public class ProcessingLogic {
}
/**
- * Check has been succeeded, so it applies the recipe and calculated parameters.
- * At this point, inputs have been already consumed.
- */
- private CheckRecipeResult applyRecipe(@NotNull GT_Recipe recipe, GT_ParallelHelper helper,
- GT_OverclockCalculator calculator, CheckRecipeResult result) {
- if (recipe.mCanBeBuffered) {
- lastRecipe = recipe;
- } else {
- lastRecipe = null;
- }
- calculatedParallels = helper.getCurrentParallel();
-
- if (calculator.getConsumption() == Long.MAX_VALUE) {
- return CheckRecipeResultRegistry.POWER_OVERFLOW;
- }
- if (calculator.getDuration() == Integer.MAX_VALUE) {
- return CheckRecipeResultRegistry.DURATION_OVERFLOW;
- }
-
- calculatedEut = calculator.getConsumption();
-
- double finalDuration = calculateDuration(recipe, helper, calculator);
- if (finalDuration >= Integer.MAX_VALUE) {
- return CheckRecipeResultRegistry.DURATION_OVERFLOW;
- }
- duration = (int) finalDuration;
-
- CheckRecipeResult hookResult = onRecipeStart(recipe);
- if (!hookResult.wasSuccessful()) {
- return hookResult;
- }
-
- outputItems = helper.getItemOutputs();
- outputFluids = helper.getFluidOutputs();
-
- return result;
- }
-
- /**
- * Override to tweak final duration that will be set as a result of this logic class.
- */
- protected double calculateDuration(@Nonnull GT_Recipe recipe, @Nonnull GT_ParallelHelper helper,
- @Nonnull GT_OverclockCalculator calculator) {
- return calculator.getDuration() * helper.getDurationMultiplierDouble();
- }
-
- /**
* Finds a list of matched recipes. At this point no additional check to the matched recipe has been done.
* <p>
* Override {@link #validateRecipe} to have custom check.
@@ -409,14 +183,6 @@ public class ProcessingLogic {
}
/**
- * Override to do additional check for found recipe if needed.
- */
- @Nonnull
- protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
- return CheckRecipeResultRegistry.SUCCESSFUL;
- }
-
- /**
* Override to tweak parallel logic if needed.
*/
@Nonnull
@@ -434,60 +200,7 @@ public class ProcessingLogic {
.setOutputCalculation(true);
}
- /**
- * Override to tweak overclock logic if needed.
- */
- @Nonnull
- protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) {
- return new GT_OverclockCalculator().setRecipeEUt(recipe.mEUt)
- .setAmperage(availableAmperage)
- .setEUt(availableVoltage)
- .setDuration(recipe.mDuration)
- .setSpeedBoost(speedBoost)
- .setEUtDiscount(euModifier)
- .setAmperageOC(amperageOC)
- .setDurationDecreasePerOC(overClockTimeReduction)
- .setEUtIncreasePerOC(overClockPowerIncrease);
- }
-
- /**
- * Override to perform additional logic when recipe starts.
- *
- * This is called when the recipe processing logic has finished all
- * checks, consumed all inputs, but has not yet set the outputs to
- * be produced. Returning a result other than SUCCESSFUL will void
- * all inputs!
- */
- @Nonnull
- protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) {
- return CheckRecipeResultRegistry.SUCCESSFUL;
- }
-
- // endregion
-
- // region Getters
-
- public ItemStack[] getOutputItems() {
- return outputItems;
- }
-
- public FluidStack[] getOutputFluids() {
- return outputFluids;
- }
-
- public int getDuration() {
- return duration;
- }
-
- public long getCalculatedEut() {
- return calculatedEut;
- }
-
- public int getCurrentParallels() {
- return calculatedParallels;
- }
-
- // endregion
+ // #endregion
/**
* Represents the status of check recipe calculation. {@link #successfullyConsumedInputs} does not necessarily mean