aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/common
diff options
context:
space:
mode:
authorMaxim <maxim235@gmx.de>2023-07-10 10:13:04 +0200
committerGitHub <noreply@github.com>2023-07-10 10:13:04 +0200
commitfe0387946550f89a403b09f4e8cf6e43ee8f2e8f (patch)
tree6b56a553c2a5bbf2427a93e92724452ba5bc60f7 /src/main/java/gregtech/common
parent9fe44bf0eaa55825c1c3cdf90f69aeeb668f45b1 (diff)
downloadGT5-Unofficial-fe0387946550f89a403b09f4e8cf6e43ee8f2e8f.tar.gz
GT5-Unofficial-fe0387946550f89a403b09f4e8cf6e43ee8f2e8f.tar.bz2
GT5-Unofficial-fe0387946550f89a403b09f4e8cf6e43ee8f2e8f.zip
Generic processing logic (#2096)
* Added enumeration for check recipe result * Rework processing logic to work with MTEs too * Switched first few multiblocks to new checkRecipe method * Applied generic logic to EBF * Added support for long power base and applied generic processing logic to more machines * Address some feedback * Added more setter to further configure the processing logic * Change internal checkRecipe to work with checkRecipeResult, to allow the injection of custom failure messages * Suppress warning, change access * Merge recipeMap and mapSupplier * Move calls to setMetaTEController and setRecipeMap to base classes * Make processingLogic final * Make results non-null * Rename `ProcessingLogic#checkRecipe` -> `#validateRecipe` Otherwise it's confusing with `GT_MetaTileEntity_MultiBlockBase#checkRecipe` * oops * Added recipe locking to generic processing logic * Rename: getWorldObject -> getIHasWorldObjectAndCoords * Annotate missing overrides * Renamed recipeLockableController -> recipeLockableMachine * Migrated Cleanroom * Migrated pyrolyse oven * Migrated driller * Migrated charcoal pit * Migrated DT * Rename: controller -> machine * Make recipemaps override base `findRecipe` and mark others final * Remove unused maps * Add FindRecipeResult * Remove IHasWorldObjectAndCoords parameter from findRecipe This removes argument for printer recipemap to pass for GT_ModHandler.getAllRecipeOutput, but I don't think there's any mod that adds world-specific coloring recipe. * Added method to set processing logic power so machines can override it on demand * Restructure CheckRecipeResult, show voltage required and move package * Reword: insufficient voltage -> power * Change text color: dark gray -> gray * Added findRecipeResult for insufficient heat * Migrated PCB factory * Fix result not being reset on shut down * Show coil tier for heat * clean * Reverted migration of driller base * Migrated TPM * Moved getting of parallel supplier, to accomodate TPM * Migrated power gen multiblocks * Migrated Assembling Line * Migrated fusion * Migrated multi smelter * Migrated boiler * Migrated DTPF * Migrated ore factory * Migrated heat exchanger * Make checkRecipe() final, javadoc, minor cleanup * Fix overclock behavior with multiple hatches, javadoc, minor cleanup * Minor fix for javadoc * Fixed creation of OC calculator not factoring in batch mode correctly * Make GT_ParallelHelper#setRecipe nonnull * Rework SimpleCheckRecipeResult to not require registration * Migrate charcoal pit and cleanroom * Fix result not being reset when turning off machine * Add API for BW to make recipemap sensitive to special slot on recipe search * Migrated PA * Migrated driller base * Make ProcessingLogic#duration int * Minor cleanup * missing recipe locking for long multi * Fix NPE * Show crash message and turn off machine * minor javadoc fix * Fixed power setting for extended power base * Integrate SingleRecipeCheck into ProcessingLogic, fix duration overflow, fix duration for batch mode, migrate PA for GT_MetaTileEntity_ExtendedPowerMultiBlockBase * Fixed ME stocking busses * Minor PA fixes * Cleanup item collecting logic & apply to normal multi as well * Oversight * Derp * Multiple voltage instead of amperage with recipe map amperage, since usually amperage is intended for parallel, not for recipe checking * Fix missing EU modifiers on PCB factory OC calculator * Removed left over OC method * Fixed duration calculation of PCB not applying roughness multiplier * Fixed OC parameters * Make createOverclockCalculator nonnull & more nonnull annotations * Fixed input processing voltage * Round down voltage for other machines too * Revert Nano Forge, return correct long voltage * Use region / endregion --------- Co-authored-by: miozune <miozune@gmail.com>
Diffstat (limited to 'src/main/java/gregtech/common')
-rw-r--r--src/main/java/gregtech/common/gui/modularui/widget/CheckRecipeResultSyncer.java26
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AssemblyLine.java22
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Charcoal_Pit.java13
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Cleanroom.java9
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DieselEngine.java18
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DistillationTower.java70
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DrillerBase.java37
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ElectricBlastFurnace.java147
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer.java15
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_HeatExchanger.java13
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ImplosionCompressor.java44
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IntegratedOreFactory.java13
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler.java19
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeChemicalReactor.java69
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine.java52
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Plasma.java50
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiFurnace.java16
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_NanoForge.java85
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilCracker.java51
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PCBFactory.java251
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java24
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ProcessingArray.java491
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PyrolyseOven.java69
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java95
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_VacuumFreezer.java33
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalReactor.java9
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/logic/CokeOvenProcessingLogic.java15
-rw-r--r--src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java1
28 files changed, 624 insertions, 1133 deletions
diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CheckRecipeResultSyncer.java b/src/main/java/gregtech/common/gui/modularui/widget/CheckRecipeResultSyncer.java
new file mode 100644
index 0000000000..9028c66be8
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/modularui/widget/CheckRecipeResultSyncer.java
@@ -0,0 +1,26 @@
+package gregtech.common.gui.modularui.widget;
+
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+
+public class CheckRecipeResultSyncer extends FakeSyncWidget<CheckRecipeResult> {
+
+ public CheckRecipeResultSyncer(Supplier<CheckRecipeResult> getter, Consumer<CheckRecipeResult> setter) {
+ super(getter, setter, (buffer, result) -> {
+ NetworkUtils.writeStringSafe(buffer, result.getID());
+ result.encode(buffer);
+ }, buffer -> {
+ String id = NetworkUtils.readStringSafe(buffer);
+ CheckRecipeResult result = CheckRecipeResultRegistry.getSampleFromRegistry(id)
+ .newInstance();
+ result.decode(buffer);
+ return result;
+ });
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AssemblyLine.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AssemblyLine.java
index 454f04066f..5575b0f9f1 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AssemblyLine.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AssemblyLine.java
@@ -24,6 +24,8 @@ import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
+import org.jetbrains.annotations.NotNull;
+
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
@@ -32,7 +34,6 @@ import com.gtnewhorizon.structurelib.structure.StructureDefinition;
import gregtech.api.GregTech_API;
import gregtech.api.enums.GT_Values;
import gregtech.api.enums.ItemList;
-import gregtech.api.enums.SoundResource;
import gregtech.api.enums.Textures;
import gregtech.api.enums.Textures.BlockIcons;
import gregtech.api.interfaces.IHatchElement;
@@ -45,6 +46,8 @@ import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_DataA
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_MultiInput;
import gregtech.api.multitileentity.multiblock.casing.Glasses;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_AssemblyLineUtils;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
@@ -185,13 +188,14 @@ public class GT_MetaTileEntity_AssemblyLine
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
if (GT_Values.D1) {
GT_FML_LOGGER.info("Start ALine recipe check");
}
ArrayList<ItemStack> tDataStickList = getDataItems(2);
if (tDataStickList.isEmpty()) {
- return false;
+ return CheckRecipeResultRegistry.NO_DATA_STICKS;
}
if (GT_Values.D1) {
GT_FML_LOGGER.info("Stick accepted, " + tDataStickList.size() + " Data Sticks found");
@@ -305,7 +309,7 @@ public class GT_MetaTileEntity_AssemblyLine
// Best not to run this recipe.
if (!foundRecipe || tStack.length == 0) {
- return false;
+ return CheckRecipeResultRegistry.NO_RECIPE;
}
if (GT_Values.D1) {
@@ -340,7 +344,7 @@ public class GT_MetaTileEntity_AssemblyLine
if (GT_Values.D1) {
GT_FML_LOGGER.info("Recipe successful");
}
- return true;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
}
private static int isStackValidIngredient(ItemStack aSlotStack, ItemStack aIngredient, ItemStack[] alts) {
@@ -367,14 +371,6 @@ public class GT_MetaTileEntity_AssemblyLine
}
@Override
- public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
- super.startSoundLoop(aIndex, aX, aY, aZ);
- if (aIndex == 20) {
- GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, 10, 1.0F, aX, aY, aZ);
- }
- }
-
- @Override
public IStructureDefinition<GT_MetaTileEntity_AssemblyLine> getStructureDefinition() {
return STRUCTURE_DEFINITION;
}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Charcoal_Pit.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Charcoal_Pit.java
index 6250b11300..392b77eb74 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Charcoal_Pit.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Charcoal_Pit.java
@@ -9,6 +9,8 @@ import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
import java.util.ArrayList;
+import javax.annotation.Nonnull;
+
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
@@ -27,6 +29,8 @@ import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TooltipMultiBlockBase;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
import gregtech.api.util.GT_Recipe;
@@ -62,14 +66,15 @@ public class GT_MetaTileEntity_Charcoal_Pit extends GT_MetaTileEntity_TooltipMul
return true;
}
+ @Nonnull
@Override
- public boolean checkRecipe(ItemStack aStack) {
+ public CheckRecipeResult checkProcessing() {
if (!checkRecursiveBlocks()) {
mEfficiency = 0;
mEfficiencyIncrease = 0;
mMaxProgresstime = 0;
running = false;
- return false;
+ return CheckRecipeResultRegistry.NO_RECIPE;
}
if (mEfficiency == 0) {
@@ -79,13 +84,13 @@ public class GT_MetaTileEntity_Charcoal_Pit extends GT_MetaTileEntity_TooltipMul
// adds all the pollution at once when the recipe starts
GT_Pollution.addPollution(getBaseMetaTileEntity(), mMaxProgresstime * getPollutionPerTick(null));
- return true;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
} else {
mEfficiency = 0;
mEfficiencyIncrease = 0;
mMaxProgresstime = 0;
+ return CheckRecipeResultRegistry.NO_RECIPE;
}
- return false;
}
private boolean checkRecursiveBlocks() {
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Cleanroom.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Cleanroom.java
index 07023bfdcf..4c308370aa 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Cleanroom.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Cleanroom.java
@@ -12,6 +12,8 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Set;
+import javax.annotation.Nonnull;
+
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
@@ -33,6 +35,8 @@ import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicHull;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TooltipMultiBlockBase;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Log;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
@@ -116,15 +120,16 @@ public class GT_MetaTileEntity_Cleanroom extends GT_MetaTileEntity_TooltipMultiB
return new String[] { "The base can be rectangular." };
}
+ @Nonnull
@Override
- public boolean checkRecipe(ItemStack aStack) {
+ public CheckRecipeResult checkProcessing() {
mEfficiencyIncrease = 100;
// use the standard overclock mechanism to determine duration and estimate a maximum consumption
calculateOverclockedNessMultiInternal(40, 45 * Math.max(1, mHeight - 1), 1, getMaxInputVoltage(), false);
// negate it to trigger the special energy consumption function. divide by 10 to get the actual final
// consumption.
mEUt /= -10;
- return true;
+ return SimpleCheckRecipeResult.ofSuccess("cleanroom_running");
}
@Override
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DieselEngine.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DieselEngine.java
index ff28a9e40a..ff8fa7eeb1 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DieselEngine.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DieselEngine.java
@@ -24,6 +24,8 @@ import net.minecraft.util.StatCollector;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
+import org.jetbrains.annotations.NotNull;
+
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
@@ -38,6 +40,9 @@ import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
import gregtech.api.util.GT_Recipe;
@@ -183,7 +188,8 @@ public class GT_MetaTileEntity_DieselEngine
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
ArrayList<FluidStack> tFluids = getStoredFluids();
// fast track lookup
@@ -219,30 +225,30 @@ public class GT_MetaTileEntity_DieselEngine
}
// Deplete that amount
- if (!depleteInput(tLiquid)) return false;
+ if (!depleteInput(tLiquid)) return CheckRecipeResultRegistry.NO_FUEL_FOUND;
boostEu = depleteInput(getBooster().getGas(2L * getAdditiveFactor()));
// Check to prevent burning HOG without consuming it, if not boosted
if (!boostEu && fuelValue > getNominalOutput()) {
- return false;
+ return SimpleCheckRecipeResult.ofFailure("fuel_quality_too_high");
}
// Deplete Lubricant. 1000L should = 1 hour of runtime (if baseEU = 2048)
if ((mRuntime % 72 == 0 || mRuntime == 0)
&& !depleteInput(Materials.Lubricant.getFluid((boostEu ? 2L : 1L) * getAdditiveFactor())))
- return false;
+ return SimpleCheckRecipeResult.ofFailure("no_lubricant");
fuelRemaining = tFluid.amount; // Record available fuel
this.mEUt = mEfficiency < 2000 ? 0 : getNominalOutput(); // Output 0 if startup is less than 20%
this.mProgresstime = 1;
this.mMaxProgresstime = 1;
this.mEfficiencyIncrease = getEfficiencyIncrease();
- return true;
+ return CheckRecipeResultRegistry.GENERATING;
}
}
this.mEUt = 0;
this.mEfficiency = 0;
- return false;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
}
@Override
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DistillationTower.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DistillationTower.java
index 3a75cab071..e368e43518 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DistillationTower.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DistillationTower.java
@@ -40,12 +40,12 @@ import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.fluid.IFluidStore;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
import gregtech.api.util.GT_Recipe;
-import gregtech.api.util.GT_Utility;
public class GT_MetaTileEntity_DistillationTower extends
GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_DistillationTower> implements ISurvivalConstructable {
@@ -191,72 +191,8 @@ public class GT_MetaTileEntity_DistillationTower extends
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
- GT_Recipe tRecipe;
-
- ArrayList<ItemStack> tInputList = getStoredInputs();
- int tInputList_sS = tInputList.size();
- for (int i = 0; i < tInputList_sS - 1; i++) {
- for (int j = i + 1; j < tInputList_sS; j++) {
- if (GT_Utility.areStacksEqual(tInputList.get(i), tInputList.get(j))) {
- if (tInputList.get(i).stackSize >= tInputList.get(j).stackSize) {
- tInputList.remove(j--);
- tInputList_sS = tInputList.size();
- } else {
- tInputList.remove(i--);
- tInputList_sS = tInputList.size();
- break;
- }
- }
- }
- }
- ItemStack[] inputs = tInputList.toArray(new ItemStack[0]);
-
- ArrayList<FluidStack> tFluidList = getStoredFluids();
- for (int i = 0; i < tFluidList.size() - 1; i++) {
- for (int j = i + 1; j < tFluidList.size(); j++) {
- if (GT_Utility.areFluidsEqual(tFluidList.get(i), tFluidList.get(j))) {
- if (tFluidList.get(i).amount >= tFluidList.get(j).amount) {
- tFluidList.remove(j--);
- } else {
- tFluidList.remove(i--);
- break;
- }
- }
- }
- }
-
- long tVoltage = getMaxInputVoltage();
- byte tTier = (byte) Math.max(0, GT_Utility.getTier(tVoltage));
- FluidStack[] tFluids = tFluidList.toArray(new FluidStack[0]);
- for (FluidStack tFluid : tFluids) {
- tRecipe = GT_Recipe.GT_Recipe_Map.sDistillationRecipes.findRecipe(
- getBaseMetaTileEntity(),
- false,
- gregtech.api.enums.GT_Values.V[tTier],
- new FluidStack[] { tFluid },
- inputs);
- if (tRecipe != null) {
- if (!canOutputAll(tRecipe)) continue;
- if (tRecipe.isRecipeInputEqual(true, tFluids, inputs)) {
- this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
- this.mEfficiencyIncrease = 10000;
- calculateOverclockedNessMultiInternal(tRecipe.mEUt, tRecipe.mDuration, 1, tVoltage, false);
- // In case recipe is too OP for that machine
- if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) return false;
- if (this.mEUt > 0) {
- this.mEUt = (-this.mEUt);
- }
- this.mMaxProgresstime = Math.max(1, this.mMaxProgresstime);
- this.mOutputItems = new ItemStack[] { tRecipe.getOutput(0) };
- this.mOutputFluids = tRecipe.mFluidOutputs.clone();
- updateSlots();
- return true;
- }
- }
- }
-
- return false;
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic();
}
protected void onCasingFound() {
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DrillerBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DrillerBase.java
index 8c671f69a8..77b5073c86 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DrillerBase.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DrillerBase.java
@@ -33,6 +33,8 @@ import net.minecraft.world.ChunkCoordIntPair;
import net.minecraftforge.common.util.FakePlayer;
import net.minecraftforge.common.util.ForgeDirection;
+import org.jetbrains.annotations.NotNull;
+
import com.google.common.collect.ImmutableList;
import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
@@ -53,6 +55,8 @@ import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_DataAccess;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
import gregtech.api.objects.GT_ChunkManager;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_ModHandler;
import gregtech.api.util.GT_Utility;
@@ -414,21 +418,38 @@ public abstract class GT_MetaTileEntity_DrillerBase
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ ItemStack controllerStack = getControllerSlot();
// Public pipe actions
setElectricityStats();
int oldYHead = yHead;
if (!checkPipesAndSetYHead() || !isEnergyEnough()) {
stopMachine();
- return false;
+ return SimpleCheckRecipeResult.ofFailure("no_mining_pipe");
}
putMiningPipesFromInputsInController();
- return switch (workState) {
- case STATE_DOWNWARD -> workingDownward(aStack, xDrill, yDrill, zDrill, xPipe, zPipe, yHead, oldYHead);
- case STATE_AT_BOTTOM -> workingAtBottom(aStack, xDrill, yDrill, zDrill, xPipe, zPipe, yHead, oldYHead);
- case STATE_UPWARD -> workingUpward(aStack, xDrill, yDrill, zDrill, xPipe, zPipe, yHead, oldYHead);
- default -> false;
- };
+ switch (workState) {
+ case STATE_DOWNWARD -> {
+ return workingDownward(controllerStack, xDrill, yDrill, zDrill, xPipe, zPipe, yHead, oldYHead)
+ ? SimpleCheckRecipeResult.ofSuccess("drilling")
+ : SimpleCheckRecipeResult.ofFailure("extracting_pipe");
+
+ }
+ case STATE_AT_BOTTOM -> {
+ return workingAtBottom(controllerStack, xDrill, yDrill, zDrill, xPipe, zPipe, yHead, oldYHead)
+ ? SimpleCheckRecipeResult.ofSuccess("drilling")
+ : SimpleCheckRecipeResult.ofFailure("no_mining_pipe");
+ }
+ case STATE_UPWARD -> {
+ return workingUpward(controllerStack, xDrill, yDrill, zDrill, xPipe, zPipe, yHead, oldYHead)
+ ? SimpleCheckRecipeResult.ofSuccess("retracting_pipe")
+ : SimpleCheckRecipeResult.ofFailure("no_mining_pipe");
+ }
+ default -> {
+ return SimpleCheckRecipeResult.ofFailure("no_mining_pipe");
+ }
+ }
}
@Override
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ElectricBlastFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ElectricBlastFurnace.java
index 0557128b60..65890b0cc0 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ElectricBlastFurnace.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ElectricBlastFurnace.java
@@ -8,7 +8,6 @@ import static gregtech.api.enums.GT_HatchElement.Maintenance;
import static gregtech.api.enums.GT_HatchElement.Muffler;
import static gregtech.api.enums.GT_HatchElement.OutputBus;
import static gregtech.api.enums.GT_HatchElement.OutputHatch;
-import static gregtech.api.enums.GT_Values.V;
import static gregtech.api.enums.GT_Values.VN;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE;
@@ -46,13 +45,17 @@ import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.fluid.IFluidStore;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
import gregtech.api.util.GT_Recipe;
import gregtech.api.util.GT_Utility;
@@ -187,128 +190,29 @@ public class GT_MetaTileEntity_ElectricBlastFurnace extends
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
- if (inputSeparation) {
- FluidStack[] tFluids = getStoredFluids().toArray(new FluidStack[0]);
- for (GT_MetaTileEntity_Hatch_InputBus tBus : mInputBusses) {
- ArrayList<ItemStack> tInputs = new ArrayList<>();
- tBus.mRecipeMap = getRecipeMap();
-
- if (isValidMetaTileEntity(tBus)) {
- for (int i = tBus.getBaseMetaTileEntity()
- .getSizeInventory() - 1; i >= 0; i--) {
- if (tBus.getBaseMetaTileEntity()
- .getStackInSlot(i) != null) {
- tInputs.add(
- tBus.getBaseMetaTileEntity()
- .getStackInSlot(i));
- }
- }
- }
- ItemStack[] tItems = tInputs.toArray(new ItemStack[0]);
- if (processRecipe(tItems, tFluids)) {
- return true;
- }
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe,
+ @Nonnull GT_ParallelHelper helper) {
+ return new GT_OverclockCalculator().setRecipeEUt(recipe.mEUt)
+ .setDuration(recipe.mDuration)
+ .setEUt(availableVoltage)
+ .setRecipeHeat(recipe.mSpecialValue)
+ .setMultiHeat(mHeatingCapacity)
+ .enableHeatOC()
+ .enableHeatDiscount()
+ .calculate();
}
- return false;
- } else {
- return processRecipe(getCompactedInputs(), getCompactedFluids());
- }
- }
-
- protected boolean processRecipe(ItemStack[] tItems, FluidStack[] tFluids) {
- if (tItems.length == 0) return false;
-
- long tVoltage = getMaxInputVoltage();
- byte tTier = (byte) Math.max(1, GT_Utility.getTier(tVoltage));
-
- GT_Recipe tRecipe = GT_Recipe.GT_Recipe_Map.sBlastRecipes
- .findRecipe(getBaseMetaTileEntity(), false, V[tTier], tFluids, tItems);
- if (tRecipe == null) return false;
- if (this.mHeatingCapacity < tRecipe.mSpecialValue) return false;
- if (!canOutputAll(tRecipe.mOutputs, getPollutionMultiplierAppliedFluids(tRecipe.mFluidOutputs))) return false;
- if (!tRecipe.isRecipeInputEqual(true, tFluids, tItems)) return false;
- // In case recipe is too OP for that machine
- if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) return false;
-
- this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
- this.mEfficiencyIncrease = 10000;
-
- int tHeatCapacityDivTiers = (mHeatingCapacity - tRecipe.mSpecialValue) / 900;
- byte overclockCount = calculateOverclockednessEBF(tRecipe.mEUt, tRecipe.mDuration, tVoltage);
- if (this.mEUt > 0) {
- this.mEUt = (-this.mEUt);
- }
- if (tHeatCapacityDivTiers > 0) {
- this.mEUt = (int) (this.mEUt * (Math.pow(0.95, tHeatCapacityDivTiers)));
- this.mMaxProgresstime >>= Math.min(tHeatCapacityDivTiers / 2, overclockCount); // extra free overclocking if
- // possible
- if (this.mMaxProgresstime < 1) this.mMaxProgresstime = 1; // no eu efficiency correction
- }
- this.mMaxProgresstime = Math.max(1, this.mMaxProgresstime);
- this.mOutputItems = new ItemStack[] { tRecipe.getOutput(0), tRecipe.getOutput(1) };
- this.mOutputFluids = new FluidStack[] { tRecipe.getFluidOutput(0) };
- updateSlots();
- return true;
- }
-
- /**
- * Calcualtes overclocked ness using long integers
- *
- * @param aEUt - recipe EUt
- * @param aDuration - recipe Duration
- */
- protected byte calculateOverclockednessEBF(int aEUt, int aDuration, long maxInputVoltage) {
- byte mTier = (byte) Math.max(0, GT_Utility.getTier(maxInputVoltage)), timesOverclocked = 0;
- if (mTier == 0) {
- // Long time calculation
- long xMaxProgresstime = ((long) aDuration) << 1;
- if (xMaxProgresstime > Integer.MAX_VALUE - 1) {
- // make impossible if too long
- mEUt = Integer.MAX_VALUE - 1;
- mMaxProgresstime = Integer.MAX_VALUE - 1;
- } else {
- mEUt = aEUt >> 2;
- mMaxProgresstime = (int) xMaxProgresstime;
- }
- // return 0;
- } else {
- // Long EUt calculation
- long xEUt = aEUt;
- // Isnt too low EUt check?
- long tempEUt = Math.max(xEUt, V[1]);
-
- mMaxProgresstime = aDuration;
-
- while (tempEUt <= V[mTier - 1]) {
- tempEUt <<= 2; // this actually controls overclocking
- // xEUt *= 4;//this is effect of everclocking
- mMaxProgresstime >>= 1; // this is effect of overclocking
- xEUt = mMaxProgresstime == 0 ? xEUt >> 1 : xEUt << 2; // U know, if the time is less than 1 tick make
- // the machine use less power
- timesOverclocked++;
- }
- if (xEUt > Integer.MAX_VALUE - 1) {
- mEUt = Integer.MAX_VALUE - 1;
- mMaxProgresstime = Integer.MAX_VALUE - 1;
- } else {
- mEUt = (int) xEUt;
- if (mEUt == 0) mEUt = 1;
- if (mMaxProgresstime == 0) mMaxProgresstime = 1; // set time to 1 tick
+ @Override
+ protected @Nonnull CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+ return recipe.mSpecialValue <= mHeatingCapacity ? CheckRecipeResultRegistry.SUCCESSFUL
+ : CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue);
}
- }
- return timesOverclocked;
- }
-
- private FluidStack[] getPollutionMultiplierAppliedFluids(FluidStack[] original) {
- FluidStack[] fluids = GT_Utility.copyFluidArray(original);
- for (FluidStack fluid : fluids) {
- if (isPollutionFluid(fluid)) {
- multiplyPollutionFluidAmount(fluid);
- }
- }
- return fluids;
+ };
}
public boolean addOutputHatchToTopList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
@@ -481,6 +385,7 @@ public class GT_MetaTileEntity_ElectricBlastFurnace extends
public void loadNBTData(final NBTTagCompound aNBT) {
super.loadNBTData(aNBT);
if (aNBT.hasKey("isBussesSeparate")) {
+ // backward compatibility
inputSeparation = aNBT.getBoolean("isBussesSeparate");
}
}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer.java
index d7b51c8de6..fd77caa201 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer.java
@@ -22,6 +22,8 @@ import net.minecraft.util.StatCollector;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
+import org.jetbrains.annotations.NotNull;
+
import com.google.common.collect.ImmutableMap;
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
@@ -52,6 +54,8 @@ import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energ
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
import gregtech.api.util.GT_Recipe;
@@ -284,7 +288,8 @@ public abstract class GT_MetaTileEntity_FusionComputer
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
ArrayList<FluidStack> tFluidList = getStoredFluids();
int tFluidList_sS = tFluidList.size();
for (int i = 0; i < tFluidList_sS - 1; i++) {
@@ -315,9 +320,9 @@ public abstract class GT_MetaTileEntity_FusionComputer
if ((tRecipe == null && !mRunningOnLoad) || (maxEUStore() < tRecipe.mSpecialValue)) {
turnCasingActive(false);
this.mLastRecipe = null;
- return false;
+ return CheckRecipeResultRegistry.NO_RECIPE;
}
- if (!canOutputAll(tRecipe)) return false;
+ if (!canOutputAll(tRecipe)) return CheckRecipeResultRegistry.OUTPUT_FULL;
if (mRunningOnLoad || tRecipe.isRecipeInputEqual(true, tFluids)) {
this.mLastRecipe = tRecipe;
this.mEUt = (this.mLastRecipe.mEUt * overclock(this.mLastRecipe.mSpecialValue));
@@ -326,10 +331,10 @@ public abstract class GT_MetaTileEntity_FusionComputer
this.mOutputFluids = this.mLastRecipe.mFluidOutputs;
turnCasingActive(true);
mRunningOnLoad = false;
- return true;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
}
}
- return false;
+ return CheckRecipeResultRegistry.NO_RECIPE;
}
public abstract int tierOverclock();
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_HeatExchanger.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_HeatExchanger.java
index d3c1267f3f..90413888b2 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_HeatExchanger.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_HeatExchanger.java
@@ -23,6 +23,8 @@ import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
+import org.jetbrains.annotations.NotNull;
+
import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
@@ -38,6 +40,8 @@ import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMul
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Log;
import gregtech.api.util.GT_ModHandler;
@@ -176,8 +180,9 @@ public class GT_MetaTileEntity_HeatExchanger extends
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
- if (mInputHotFluidHatch.getFluid() == null) return true;
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ if (mInputHotFluidHatch.getFluid() == null) return CheckRecipeResultRegistry.NO_RECIPE;
int fluidAmountToConsume = mInputHotFluidHatch.getFluidAmount(); // how much fluid is in hatch
@@ -224,7 +229,7 @@ public class GT_MetaTileEntity_HeatExchanger extends
} else {
// If we're working with neither, fail out
superheated_threshold = 0;
- return false;
+ return CheckRecipeResultRegistry.NO_RECIPE;
}
superheated = fluidAmountToConsume >= superheated_threshold; // set the internal superheated flag if we have
@@ -243,7 +248,7 @@ public class GT_MetaTileEntity_HeatExchanger extends
mOutputColdFluidHatch.fill(FluidRegistry.getFluidStack("molten.solarsaltcold", fluidAmountToConsume), true);
}
this.mEfficiencyIncrease = 80;
- return true;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
}
private int useWater(int steam) {
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ImplosionCompressor.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ImplosionCompressor.java
index 3cceb98bf0..4fe75734c3 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ImplosionCompressor.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ImplosionCompressor.java
@@ -7,8 +7,6 @@ import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_IMPLOSION_COM
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE_GLOW;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_IMPLOSION_COMPRESSOR_GLOW;
-import java.util.ArrayList;
-
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.ForgeDirection;
@@ -22,11 +20,11 @@ import gregtech.api.enums.Textures.BlockIcons;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_CubicMultiBlockBase;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
import gregtech.api.util.GT_Recipe;
-import gregtech.api.util.GT_Utility;
public class GT_MetaTileEntity_ImplosionCompressor
extends GT_MetaTileEntity_CubicMultiBlockBase<GT_MetaTileEntity_ImplosionCompressor> {
@@ -108,44 +106,8 @@ public class GT_MetaTileEntity_ImplosionCompressor
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
- ArrayList<ItemStack> tInputList = getStoredInputs();
- int tInputList_sS = tInputList.size();
- for (int i = 0; i < tInputList_sS - 1; i++) {
- for (int j = i + 1; j < tInputList_sS; j++) {
- if (GT_Utility.areStacksEqual(tInputList.get(i), tInputList.get(j))) {
- if (tInputList.get(i).stackSize >= tInputList.get(j).stackSize) {
- tInputList.remove(j--);
- tInputList_sS = tInputList.size();
- } else {
- tInputList.remove(i--);
- tInputList_sS = tInputList.size();
- break;
- }
- }
- }
- }
- ItemStack[] tInputs = tInputList.toArray(new ItemStack[0]);
- if (!tInputList.isEmpty()) {
- GT_Recipe tRecipe = GT_Recipe.GT_Recipe_Map.sImplosionRecipes
- .findRecipe(getBaseMetaTileEntity(), false, 9223372036854775807L, null, tInputs);
- if ((tRecipe != null) && canOutputAll(tRecipe) && tRecipe.isRecipeInputEqual(true, null, tInputs)) {
- this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
- this.mEfficiencyIncrease = 10000;
- // OC THAT EXPLOSIVE SHIT!!!
- calculateOverclockedNessMultiInternal(tRecipe.mEUt, tRecipe.mDuration, 1, getMaxInputVoltage(), false);
- // In case recipe is too OP for that machine
- if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) return false;
- if (this.mEUt > 0) {
- this.mEUt = (-this.mEUt);
- }
- this.mOutputItems = new ItemStack[] { tRecipe.getOutput(0), tRecipe.getOutput(1) };
- sendLoopStart((byte) 20);
- updateSlots();
- return true;
- }
- }
- return false;
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic();
}
@Override
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IntegratedOreFactory.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IntegratedOreFactory.java
index 438aa80219..af467e067b 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IntegratedOreFactory.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IntegratedOreFactory.java
@@ -36,6 +36,8 @@ import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.oredict.OreDictionary;
+import org.jetbrains.annotations.NotNull;
+
import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
@@ -54,6 +56,8 @@ import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
import gregtech.api.multitileentity.multiblock.casing.Glasses;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_ModHandler;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
@@ -256,7 +260,8 @@ public class GT_MetaTileEntity_IntegratedOreFactory extends
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
if (!isInit) {
initHash();
isInit = true;
@@ -311,7 +316,7 @@ public class GT_MetaTileEntity_IntegratedOreFactory extends
setCurrentParallelism(tRealUsed);
if (tRealUsed == 0) {
- return false;
+ return CheckRecipeResultRegistry.NO_RECIPE;
}
depleteInput(GT_ModHandler.getDistilledWater(tRealUsed * 200L));
@@ -349,7 +354,7 @@ public class GT_MetaTileEntity_IntegratedOreFactory extends
doCentrifuge(isImpureDust, isPureDust);
}
default -> {
- return false;
+ return CheckRecipeResultRegistry.NO_RECIPE;
}
}
@@ -362,7 +367,7 @@ public class GT_MetaTileEntity_IntegratedOreFactory extends
}
this.updateSlots();
- return true;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
}
@SafeVarargs
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler.java
index 37495c60ea..8d165e34f4 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler.java
@@ -27,6 +27,8 @@ import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
+import org.jetbrains.annotations.NotNull;
+
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
@@ -40,6 +42,8 @@ import gregtech.api.enums.Textures.BlockIcons;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Log;
import gregtech.api.util.GT_ModHandler;
@@ -239,8 +243,9 @@ public abstract class GT_MetaTileEntity_LargeBoiler
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
- if (!isFuelValid()) return false;
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ if (!isFuelValid()) return CheckRecipeResultRegistry.NO_FUEL_FOUND;
// Do we have an integrated circuit with a valid configuration?
if (Circuit_Integrated.isStackEqual(mInventory[1], true, true)) {
int circuit_config = mInventory[1].getItemDamage();
@@ -263,7 +268,7 @@ public abstract class GT_MetaTileEntity_LargeBoiler
this.mMaxProgresstime = adjustBurnTimeForConfig(runtimeBoost(tRecipe.mSpecialValue / 2));
this.mEUt = adjustEUtForConfig(getEUt());
this.mEfficiencyIncrease = this.mMaxProgresstime * getEfficiencyIncrease() * 4;
- return true;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
}
}
}
@@ -276,7 +281,7 @@ public abstract class GT_MetaTileEntity_LargeBoiler
Math.max(1, runtimeBoost(tRecipe.mSpecialValue * 2)));
this.mEUt = adjustEUtForConfig(getEUt());
this.mEfficiencyIncrease = this.mMaxProgresstime * getEfficiencyIncrease();
- return true;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
}
}
}
@@ -302,7 +307,7 @@ public abstract class GT_MetaTileEntity_LargeBoiler
this.mEfficiencyIncrease = 0;
this.mSuperEfficencyIncrease = 20;
}
- return true;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
}
}
}
@@ -328,7 +333,7 @@ public abstract class GT_MetaTileEntity_LargeBoiler
this.mEfficiencyIncrease = 0;
this.mSuperEfficencyIncrease = 20;
}
- return true;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
}
}
}
@@ -336,7 +341,7 @@ public abstract class GT_MetaTileEntity_LargeBoiler
}
this.mMaxProgresstime = 0;
this.mEUt = 0;
- return false;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
}
abstract int runtimeBoost(int mTime);
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeChemicalReactor.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeChemicalReactor.java
index 2c647aa458..ded2621fec 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeChemicalReactor.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeChemicalReactor.java
@@ -16,7 +16,6 @@ import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICA
import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
-import java.util.ArrayList;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@@ -27,7 +26,6 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.IChatComponent;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
-import net.minecraftforge.fluids.FluidStack;
import com.gtnewhorizon.structurelib.StructureLibAPI;
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
@@ -46,12 +44,11 @@ import gregtech.api.interfaces.IHeatingCoil;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
import gregtech.api.util.GT_Recipe;
-import gregtech.api.util.GT_Single_Recipe_Check;
-import gregtech.api.util.GT_Utility;
public class GT_MetaTileEntity_LargeChemicalReactor extends
GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_LargeChemicalReactor> implements ISurvivalConstructable {
@@ -169,68 +166,8 @@ public class GT_MetaTileEntity_LargeChemicalReactor extends
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
- long tVoltage = getMaxInputVoltage();
- byte tier = (byte) Math.max(1, GT_Utility.getTier(tVoltage));
- GT_Recipe tRecipe;
-
- if (mLockedToSingleRecipe && mSingleRecipeCheck != null) {
- if (!mSingleRecipeCheck.checkRecipeInputsSingleStack(true)) {
- return false;
- }
- tRecipe = mSingleRecipeCheck.getRecipe();
- } else {
- ArrayList<ItemStack> tInputList = getStoredInputs();
- ArrayList<FluidStack> tFluidList = getStoredFluids();
-
- ItemStack[] inputs = tInputList.toArray(new ItemStack[0]);
- FluidStack[] fluids = tFluidList.toArray(new FluidStack[0]);
-
- if (inputs.length == 0 && fluids.length == 0) {
- return false;
- }
-
- GT_Single_Recipe_Check.Builder tSingleRecipeCheckBuilder = null;
- if (mLockedToSingleRecipe) {
- // We're locked to a single recipe, but haven't built the recipe checker yet.
- // Build the checker on next successful recipe.
- tSingleRecipeCheckBuilder = GT_Single_Recipe_Check.builder(this)
- .setBefore(inputs, fluids);
- }
-
- tRecipe = GT_Recipe.GT_Recipe_Map.sMultiblockChemicalRecipes.findRecipe(
- getBaseMetaTileEntity(),
- false,
- false,
- gregtech.api.enums.GT_Values.V[tier],
- fluids,
- inputs);
-
- if (tRecipe == null || !canOutputAll(tRecipe) || !tRecipe.isRecipeInputEqual(true, fluids, inputs)) {
- return false;
- }
-
- if (mLockedToSingleRecipe) {
- mSingleRecipeCheck = tSingleRecipeCheckBuilder.setAfter(inputs, fluids)
- .setRecipe(tRecipe)
- .build();
- }
- }
-
- this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
- this.mEfficiencyIncrease = 10000;
-
- calculateOverclockedNessMultiInternal(tRecipe.mEUt, tRecipe.mDuration, 1, tVoltage, true);
- // In case recipe is too OP for that machine
- if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) return false;
- if (this.mEUt > 0) {
- this.mEUt = (-this.mEUt);
- }
-
- this.mOutputItems = tRecipe.mOutputs;
- this.mOutputFluids = tRecipe.mFluidOutputs;
- this.updateSlots();
- return true;
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().enablePerfectOverclock();
}
@Override
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine.java
index f31967674c..a8961ce542 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine.java
@@ -28,6 +28,8 @@ import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
+import org.jetbrains.annotations.NotNull;
+
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
@@ -41,6 +43,8 @@ import gregtech.api.items.GT_MetaGenerated_Tool;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
import gregtech.api.util.GT_Utility;
import gregtech.api.util.LightingHelper;
import gregtech.common.items.GT_MetaGenerated_Tool_01;
@@ -226,12 +230,15 @@ public abstract class GT_MetaTileEntity_LargeTurbine
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
- if ((counter & 7) == 0 && (aStack == null || !(aStack.getItem() instanceof GT_MetaGenerated_Tool)
- || aStack.getItemDamage() < 170
- || aStack.getItemDamage() > 179)) {
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ ItemStack controllerSlot = getControllerSlot();
+ if ((counter & 7) == 0
+ && (controllerSlot == null || !(controllerSlot.getItem() instanceof GT_MetaGenerated_Tool)
+ || controllerSlot.getItemDamage() < 170
+ || controllerSlot.getItemDamage() > 179)) {
stopMachine();
- return false;
+ return CheckRecipeResultRegistry.NO_TURBINE_FOUND;
}
ArrayList<FluidStack> tFluids = getStoredFluids();
if (!tFluids.isEmpty()) {
@@ -244,24 +251,25 @@ public abstract class GT_MetaTileEntity_LargeTurbine
.hasInventoryBeenModified()) {
counter = 0;
baseEff = GT_Utility.safeInt(
- (long) ((5F + ((GT_MetaGenerated_Tool) aStack.getItem()).getToolCombatDamage(aStack)) * 1000F));
- optFlow = GT_Utility
- .safeInt(
- (long) Math.max(
- Float.MIN_NORMAL,
- ((GT_MetaGenerated_Tool) aStack.getItem()).getToolStats(aStack)
- .getSpeedMultiplier() * GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mToolSpeed
- * 50));
-
- overflowMultiplier = getOverflowMultiplier(aStack);
-
- flowMultipliers[0] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mSteamMultiplier;
- flowMultipliers[1] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mGasMultiplier;
- flowMultipliers[2] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mPlasmaMultiplier;
+ (long) ((5F
+ + ((GT_MetaGenerated_Tool) controllerSlot.getItem()).getToolCombatDamage(controllerSlot))
+ * 1000F));
+ optFlow = GT_Utility.safeInt(
+ (long) Math.max(
+ Float.MIN_NORMAL,
+ ((GT_MetaGenerated_Tool) controllerSlot.getItem()).getToolStats(controllerSlot)
+ .getSpeedMultiplier() * GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mToolSpeed
+ * 50));
+
+ overflowMultiplier = getOverflowMultiplier(controllerSlot);
+
+ flowMultipliers[0] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mSteamMultiplier;
+ flowMultipliers[1] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mGasMultiplier;
+ flowMultipliers[2] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mPlasmaMultiplier;
if (optFlow <= 0 || baseEff <= 0) {
stopMachine(); // in case the turbine got removed
- return false;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
}
} else {
counter++;
@@ -288,12 +296,12 @@ public abstract class GT_MetaTileEntity_LargeTurbine
// stopMachine();
this.mEUt = 0;
this.mEfficiency = 0;
- return false;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
} else {
this.mMaxProgresstime = 1;
this.mEfficiencyIncrease = 10;
// Overvoltage is handled inside the MultiBlockBase when pushing out to dynamos. no need to do it here.
- return true;
+ return CheckRecipeResultRegistry.GENERATING;
}
}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Plasma.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Plasma.java
index 9e54fe11a5..0eec9ef238 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Plasma.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Plasma.java
@@ -16,6 +16,8 @@ import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
+import org.jetbrains.annotations.NotNull;
+
import gregtech.api.GregTech_API;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
@@ -23,6 +25,8 @@ import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.items.GT_MetaGenerated_Tool;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
import gregtech.api.util.GT_Recipe;
@@ -202,12 +206,15 @@ public class GT_MetaTileEntity_LargeTurbine_Plasma extends GT_MetaTileEntity_Lar
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
- if ((counter & 7) == 0 && (aStack == null || !(aStack.getItem() instanceof GT_MetaGenerated_Tool)
- || aStack.getItemDamage() < 170
- || aStack.getItemDamage() > 179)) {
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ ItemStack controllerSlot = getControllerSlot();
+ if ((counter & 7) == 0
+ && (controllerSlot == null || !(controllerSlot.getItem() instanceof GT_MetaGenerated_Tool)
+ || controllerSlot.getItemDamage() < 170
+ || controllerSlot.getItemDamage() > 179)) {
stopMachine();
- return false;
+ return CheckRecipeResultRegistry.NO_TURBINE_FOUND;
}
ArrayList<FluidStack> tFluids = getStoredFluids();
if (!tFluids.isEmpty()) {
@@ -219,19 +226,20 @@ public class GT_MetaTileEntity_LargeTurbine_Plasma extends GT_MetaTileEntity_Lar
.hasInventoryBeenModified()) {
counter = 0;
baseEff = GT_Utility.safeInt(
- (long) ((5F + ((GT_MetaGenerated_Tool) aStack.getItem()).getToolCombatDamage(aStack)) * 1000F));
- optFlow = GT_Utility
- .safeInt(
- (long) Math.max(
- Float.MIN_NORMAL,
- ((GT_MetaGenerated_Tool) aStack.getItem()).getToolStats(aStack)
- .getSpeedMultiplier() * GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mToolSpeed
- * 50));
- overflowMultiplier = getOverflowMultiplier(aStack);
-
- flowMultipliers[0] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mSteamMultiplier;
- flowMultipliers[1] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mGasMultiplier;
- flowMultipliers[2] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mPlasmaMultiplier;
+ (long) ((5F
+ + ((GT_MetaGenerated_Tool) controllerSlot.getItem()).getToolCombatDamage(controllerSlot))
+ * 1000F));
+ optFlow = GT_Utility.safeInt(
+ (long) Math.max(
+ Float.MIN_NORMAL,
+ ((GT_MetaGenerated_Tool) controllerSlot.getItem()).getToolStats(controllerSlot)
+ .getSpeedMultiplier() * GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mToolSpeed
+ * 50));
+ overflowMultiplier = getOverflowMultiplier(controllerSlot);
+
+ flowMultipliers[0] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mSteamMultiplier;
+ flowMultipliers[1] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mGasMultiplier;
+ flowMultipliers[2] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mPlasmaMultiplier;
} else {
counter++;
}
@@ -239,7 +247,7 @@ public class GT_MetaTileEntity_LargeTurbine_Plasma extends GT_MetaTileEntity_Lar
if (optFlow <= 0 || baseEff <= 0) {
stopMachine(); // in case the turbine got removed
- return false;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
}
int newPower = fluidIntoPower(tFluids, optFlow, baseEff, overflowMultiplier, flowMultipliers); // How much the
@@ -263,13 +271,13 @@ public class GT_MetaTileEntity_LargeTurbine_Plasma extends GT_MetaTileEntity_Lar
// stopMachine();
this.mEUt = 0;
this.mEfficiency = 0;
- return false;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
} else {
this.mMaxProgresstime = 20;
this.mEfficiencyIncrease = 200;
// Overvoltage is handled inside the MultiBlockBase when pushing out to dynamos. no need to do it here.
- return true;
+ return CheckRecipeResultRegistry.GENERATING;
}
}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiFurnace.java
index e04255c28b..c80062ff09 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiFurnace.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiFurnace.java
@@ -22,6 +22,8 @@ import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.StatCollector;
import net.minecraftforge.common.util.ForgeDirection;
+import org.jetbrains.annotations.NotNull;
+
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
@@ -35,6 +37,8 @@ import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_ModHandler;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
@@ -142,9 +146,10 @@ public class GT_MetaTileEntity_MultiFurnace
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
ArrayList<ItemStack> tInputList = getStoredInputs();
- if (tInputList.isEmpty()) return false;
+ if (tInputList.isEmpty()) return CheckRecipeResultRegistry.NO_RECIPE;
int mVolatage = GT_Utility.safeInt(getMaxInputVoltage());
int tMaxParallel = this.mLevel;
@@ -182,15 +187,16 @@ public class GT_MetaTileEntity_MultiFurnace
this.mEfficiencyIncrease = 10000;
calculateOverclockedNessMultiInternal(4, 512, 1, mVolatage, false);
// In case recipe is too OP for that machine
- if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) return false;
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return CheckRecipeResultRegistry.NO_RECIPE;
this.mEUt = GT_Utility.safeInt(((long) mEUt) * (this.mLevel / 8) / (long) this.mCostDiscount, 1);
- if (mEUt == Integer.MAX_VALUE - 1) return false;
+ if (mEUt == Integer.MAX_VALUE - 1) return CheckRecipeResultRegistry.NO_RECIPE;
if (this.mEUt > 0) this.mEUt = (-this.mEUt);
}
updateSlots();
- return true;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
}
@Override
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_NanoForge.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_NanoForge.java
index 6018cb7450..ca68d3ad4c 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_NanoForge.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_NanoForge.java
@@ -16,7 +16,7 @@ import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE
import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
import static gregtech.api.util.GT_StructureUtility.ofFrame;
-import java.util.ArrayList;
+import javax.annotation.Nonnull;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
@@ -24,7 +24,6 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.StatCollector;
import net.minecraftforge.common.util.ForgeDirection;
-import net.minecraftforge.fluids.FluidStack;
import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
@@ -44,8 +43,10 @@ import gregtech.api.enums.Textures.BlockIcons;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
import gregtech.api.util.GT_Recipe;
@@ -232,72 +233,21 @@ public class GT_MetaTileEntity_NanoForge extends
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
- GT_Recipe.GT_Recipe_Map map = getRecipeMap();
- FluidStack[] tFluidInputs = getCompactedFluids();
- if (inputSeparation) {
- ArrayList<ItemStack> tInputList = new ArrayList<>();
- for (GT_MetaTileEntity_Hatch_InputBus tBus : mInputBusses) {
- for (int i = tBus.getSizeInventory() - 1; i >= 0; i--) {
- if (tBus.getStackInSlot(i) != null) tInputList.add(tBus.getStackInSlot(i));
- }
- ItemStack[] tInputs = tInputList.toArray(new ItemStack[0]);
- if (processRecipe(tInputs, tFluidInputs, map)) return true;
- else tInputList.clear();
- }
- } else {
- ItemStack[] tItemInputs = getStoredInputs().toArray(new ItemStack[0]);
- return processRecipe(tItemInputs, tFluidInputs, map);
- }
- return false;
- }
-
- private boolean processRecipe(ItemStack[] tItemInputs, FluidStack[] tFluidInputs, GT_Recipe.GT_Recipe_Map map) {
- lEUt = 0;
- mOutputItems = null;
- mOutputFluids = null;
- long tTotalEU = getMaxInputEu();
- GT_Recipe tRecipe = map
- .findRecipe(getBaseMetaTileEntity(), null, false, false, tTotalEU, tFluidInputs, null, tItemInputs);
-
- if (tRecipe == null) return false;
- if (tRecipe.mSpecialValue > mSpecialTier) return false;
- if (!canOutputAll(tRecipe)) return false;
-
- if (tRecipe.isRecipeInputEqual(true, tFluidInputs, tItemInputs)) {
- this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
- this.mEfficiencyIncrease = 10000;
- this.mMaxProgresstime = tRecipe.mDuration;
- this.lEUt = -tRecipe.mEUt;
- calculateOverclockedNessMultiInternal(
- tRecipe.mEUt,
- tRecipe.mDuration,
- 1,
- tTotalEU,
- tRecipe.mSpecialValue < mSpecialTier);
-
- if (this.lEUt == Long.MAX_VALUE - 1 || this.mMaxProgresstime == Integer.MAX_VALUE - 1) return false;
-
- if (this.lEUt > 0) {
- this.lEUt *= -1;
- }
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
- ArrayList<ItemStack> tOutputs = new ArrayList<>();
- for (int i = 0; i < tRecipe.mOutputs.length; i++) {
- if (getBaseMetaTileEntity().getRandomNumber(10000) < tRecipe.getOutputChance(i)) {
- tOutputs.add(tRecipe.getOutput(i));
- }
+ @Override
+ protected @Nonnull CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+ return recipe.mSpecialValue <= mSpecialTier ? CheckRecipeResultRegistry.SUCCESSFUL
+ : CheckRecipeResultRegistry.NO_RECIPE;
}
+ };
+ }
- this.mMaxProgresstime = Math.max(1, this.mMaxProgresstime);
- mOutputItems = tOutputs.toArray(new ItemStack[0]);
- mOutputFluids = tRecipe.mFluidOutputs.clone();
- updateSlots();
-
- return true;
- }
-
- return false;
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(getMaxInputEu());
+ logic.setAvailableAmperage(1);
}
@Override
@@ -371,7 +321,8 @@ public class GT_MetaTileEntity_NanoForge extends
@Override
public void loadNBTData(final NBTTagCompound aNBT) {
super.loadNBTData(aNBT);
- if (!aNBT.hasKey(INPUT_SEPARATION_NBT_KEY)) {
+ if (aNBT.hasKey("mSeparate")) {
+ // backward compatibility
inputSeparation = aNBT.getBoolean("mSeparate");
}
mSpecialTier = aNBT.getByte("mSpecialTier");
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilCracker.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilCracker.java
index 2e82efa4f9..e531108e1a 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilCracker.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilCracker.java
@@ -14,6 +14,8 @@ import static gregtech.api.util.GT_StructureUtility.ofCoil;
import java.util.ArrayList;
import java.util.List;
+import javax.annotation.Nonnull;
+
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
@@ -29,14 +31,16 @@ import gregtech.api.enums.HeatingCoilLevel;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_MultiInput;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
import gregtech.api.util.GT_Recipe;
-import gregtech.api.util.GT_Utility;
public class GT_MetaTileEntity_OilCracker extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_OilCracker>
implements ISurvivalConstructable {
@@ -168,42 +172,17 @@ public class GT_MetaTileEntity_OilCracker extends GT_MetaTileEntity_EnhancedMult
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
- ArrayList<FluidStack> tInputList = getStoredFluids();
- FluidStack[] tFluidInputs = tInputList.toArray(new FluidStack[0]);
- long tVoltage = getMaxInputVoltage();
- byte tTier = (byte) Math.max(1, GT_Utility.getTier(tVoltage));
-
- GT_Recipe tRecipe = getRecipeMap().findRecipe(
- getBaseMetaTileEntity(),
- false,
- gregtech.api.enums.GT_Values.V[tTier],
- tFluidInputs,
- mInventory[1]);
-
- if (tRecipe == null) return false;
- if (!canOutputAll(tRecipe)) return false;
-
- if (tRecipe.isRecipeInputEqual(true, tFluidInputs, mInventory[1])) {
- this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
- this.mEfficiencyIncrease = 10000;
- calculateOverclockedNessMultiInternal(tRecipe.mEUt, tRecipe.mDuration, 1, tVoltage, false);
- // In case recipe is too OP for that machine
- if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) return false;
-
- // heatLevel.getTier() starts at 0
- if (this.heatLevel.getTier() < 5) {
- this.mEUt *= 1 - (0.1D * (this.heatLevel.getTier() + 1));
- } else {
- this.mEUt *= 0.5;
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe,
+ @Nonnull GT_ParallelHelper helper) {
+ return super.createOverclockCalculator(recipe, helper)
+ .setEUtDiscount(Math.max((0.1F * (heatLevel.getTier() + 1.0F)), 0.5F));
}
-
- if (this.mEUt > 0) this.mEUt = (-this.mEUt);
-
- this.mOutputFluids = new FluidStack[] { tRecipe.getFluidOutput(0) };
- return true;
- }
- return false;
+ };
}
@Override
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PCBFactory.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PCBFactory.java
index 8605f3643f..2cfbd1a30e 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PCBFactory.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PCBFactory.java
@@ -9,7 +9,6 @@ import static gregtech.api.enums.GT_HatchElement.InputHatch;
import static gregtech.api.enums.GT_HatchElement.Maintenance;
import static gregtech.api.enums.GT_HatchElement.OutputBus;
import static gregtech.api.enums.GT_Values.AuthorBlueWeabo;
-import static gregtech.api.enums.GT_Values.V;
import static gregtech.api.enums.GT_Values.VN;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE;
@@ -21,6 +20,8 @@ import static gregtech.api.util.GT_StructureUtility.ofFrame;
import java.util.ArrayList;
import java.util.List;
+import javax.annotation.Nonnull;
+
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
@@ -31,6 +32,8 @@ import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
+import org.jetbrains.annotations.NotNull;
+
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
import com.gtnewhorizon.structurelib.alignment.enumerable.Flip;
@@ -63,13 +66,17 @@ import gregtech.api.gui.modularui.GT_UITextures;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
import gregtech.api.metatileentity.GregTechTileClientEvents;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
import gregtech.api.multitileentity.multiblock.casing.Glasses;
+import gregtech.api.objects.ItemData;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_ModHandler;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
@@ -515,141 +522,116 @@ public class GT_MetaTileEntity_PCBFactory extends
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
- mCurrentParallel = 0;
- GT_Recipe.GT_Recipe_Map aMap = getRecipeMap();
- FluidStack[] tFluidInputs = getStoredFluids().toArray(new FluidStack[0]);
- if (inputSeparation) {
- ArrayList<ItemStack> tInputList = new ArrayList<>();
- for (GT_MetaTileEntity_Hatch_InputBus tBus : mInputBusses) {
- for (int i = tBus.getSizeInventory() - 1; i >= 0; i--) {
- if (tBus.getStackInSlot(i) != null) tInputList.add(tBus.getStackInSlot(i));
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+ // Here we check the dynamic parallels, which depend on the recipe
+ int numberOfNanites = 0;
+ ItemStack aNanite = recipe.getRepresentativeInput(1);
+ ItemData naniteData = GT_OreDictUnificator.getAssociation(aNanite);
+ if (naniteData != null && naniteData.mPrefix != null && naniteData.mPrefix.equals(OrePrefixes.nanite)) {
+ for (ItemStack aItem : inputItems) {
+ if (aItem != null && aItem.isItemEqual(aNanite)) {
+ numberOfNanites += aItem.stackSize;
+ }
+ }
}
- ItemStack[] tInputs = tInputList.toArray(new ItemStack[0]);
- if (processRecipe(aStack, tInputs, tFluidInputs, aMap)) return true;
- else tInputList.clear();
- }
- } else {
- ItemStack[] tItemInputs = getStoredInputs().toArray(new ItemStack[0]);
- return processRecipe(aStack, tItemInputs, tFluidInputs, aMap);
- }
+ maxParallel = (int) Math.max(Math.ceil(Math.log(numberOfNanites) / Math.log(2) + 0.00001), 1);
+ mMaxParallel = maxParallel;
- return false;
- }
-
- private boolean processRecipe(ItemStack aStack, ItemStack[] aItemInputs, FluidStack[] aFluidInputs,
- GT_Recipe.GT_Recipe_Map aMap) {
- mOutputItems = null;
- mOutputFluids = null;
- if (aItemInputs == null || aFluidInputs == null) {
- return false;
- }
+ int recipeBitMap = recipe.mSpecialValue;
- long voltage = getAverageInputVoltage();
- long amps = getMaxInputAmps();
- int tier = GT_Utility.getTier(voltage);
+ if (((recipeBitMap & mBioBitMap) == mBioBitMap && !mBioUpgrade))
+ return SimpleCheckRecipeResult.ofFailure("bio_upgrade_missing");
- GT_Recipe tRecipe = aMap
- .findRecipe(getBaseMetaTileEntity(), null, true, false, V[tier], aFluidInputs, aStack, aItemInputs);
+ int requiredPCBTier = 0;
+ if ((recipeBitMap & mTier3BitMap) == mTier3BitMap) requiredPCBTier = 3;
+ if ((recipeBitMap & mTier2BitMap) == mTier2BitMap) requiredPCBTier = 2;
+ if ((recipeBitMap & mTier1BitMap) == mTier1BitMap) requiredPCBTier = 1;
- if (tRecipe == null) {
- return false;
- }
+ if (requiredPCBTier > mTier) return CheckRecipeResultRegistry.insufficientMachineTier(requiredPCBTier);
- int recipeBitMap = tRecipe.mSpecialValue;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
- int aNanitesOfRecipe = 0;
+ @Override
+ protected double calculateDuration(@Nonnull GT_Recipe recipe, @Nonnull GT_ParallelHelper helper,
+ @Nonnull GT_OverclockCalculator calculator) {
+ if (isNoOC()) {
+ return super.calculateDuration(recipe, helper, calculator) * getDurationMultiplierFromRoughness();
+ }
+ return super.calculateDuration(recipe, helper, calculator);
+ }
- ItemStack aNanite = tRecipe.getRepresentativeInput(1);
- if (GT_OreDictUnificator.getAssociation(aNanite).mPrefix.equals(OrePrefixes.nanite)) {
- for (ItemStack aItem : aItemInputs) {
- if (aItem.isItemEqual(aNanite)) {
- aNanitesOfRecipe += aItem.stackSize;
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe,
+ @Nonnull GT_ParallelHelper helper) {
+ if (isNoOC()) {
+ return GT_OverclockCalculator.ofNoOverclock(recipe);
+ }
+ GT_OverclockCalculator calculator = super.createOverclockCalculator(recipe, helper)
+ .setEUtDiscount((float) Math.sqrt(mUpgradesInstalled == 0 ? 1 : mUpgradesInstalled))
+ .setSpeedBoost(getDurationMultiplierFromRoughness());
+ if (mOCTier2) {
+ calculator.enablePerfectOC();
}
+ return calculator;
}
- }
- int aMaxParallel = (int) Math.max(Math.ceil(Math.log(aNanitesOfRecipe) / Math.log(2) + 0.00001), 1);
- mMaxParallel = aMaxParallel;
- float aExtraPower = (float) Math.sqrt(mUpgradesInstalled == 0 ? 1 : mUpgradesInstalled);
+ @Nonnull
+ @Override
+ protected GT_ParallelHelper createParallelHelper(@Nonnull GT_Recipe recipe) {
+ return super.createParallelHelper(recipe)
+ .setEUtModifier((float) Math.sqrt(mUpgradesInstalled == 0 ? 1 : mUpgradesInstalled));
+ }
- if (tRecipe.mEUt > voltage) {
- return false;
- }
+ @NotNull
+ @Override
+ public CheckRecipeResult process() {
+ CheckRecipeResult result = super.process();
- boolean recipeAllowed = (((recipeBitMap & mTier1BitMap) == mTier1BitMap && (mTier >= 1))
- || ((recipeBitMap & mTier2BitMap) == mTier2BitMap && (mTier >= 2))
- || ((recipeBitMap & mTier3BitMap) == mTier3BitMap && (mTier >= 3)))
- && ((recipeBitMap & mBioBitMap) == 0 || ((recipeBitMap & mBioBitMap) == mBioBitMap && mBioUpgrade));
-
- if (recipeAllowed) {
- GT_ParallelHelper helper = new GT_ParallelHelper().setRecipe(tRecipe)
- .setMachine(this)
- .setItemInputs(aItemInputs)
- .setFluidInputs(aFluidInputs)
- .setMaxParallel(aMaxParallel)
- .setAvailableEUt(getMaxInputEu())
- .setEUtModifier(aExtraPower)
- .enableConsumption()
- .build();
- mCurrentParallel = helper.getCurrentParallel();
-
- if (mCurrentParallel > 0) {
- this.mEfficiency = (getMaxEfficiency(aStack) - (getIdealStatus() - getRepairStatus()) * 1000);
- this.mEfficiencyIncrease = getMaxEfficiency(aStack);
- this.lEUt = -(long) Math.ceil(tRecipe.mEUt * mCurrentParallel * aExtraPower);
- this.mMaxProgresstime = (int) Math.ceil(tRecipe.mDuration * Math.pow(mRoughnessMultiplier, 2));
-
- if (mOCTier1 || mOCTier2) {
- GT_OverclockCalculator calc = new GT_OverclockCalculator().setRecipeEUt(tRecipe.mEUt)
- .setDuration(tRecipe.mDuration)
- .setEUt(voltage)
- .setAmperage(amps)
- .setEUtDiscount(aExtraPower)
- .setSpeedBoost((float) Math.pow(mRoughnessMultiplier, 2));
- if (mOCTier2) {
- calc.enablePerfectOC();
- }
- calc.calculate();
- this.lEUt = calc.getConsumption();
- this.mMaxProgresstime = calc.getDuration();
+ if (!result.wasSuccessful()) {
+ return result;
}
- if (this.lEUt == Long.MAX_VALUE - 1 || this.mProgresstime == Integer.MAX_VALUE - 1) return false;
+ mCurrentParallel = calculatedParallels;
- if (this.lEUt > 0) {
- this.lEUt *= -1;
- }
+ ItemStack controllerStack = getControllerSlot();
- ArrayList<ItemStack> tOutputs = new ArrayList<>();
- int remainingEfficiency = getMaxEfficiency(aStack);
- for (int j = 0; j < (int) Math.ceil(getMaxEfficiency(aStack) / 10000.0f); j++) {
- int chanced = getBaseMetaTileEntity().getRandomNumber(10000);
- if (chanced >= remainingEfficiency) {
- continue;
- }
- for (ItemStack tOutput : tRecipe.mOutputs) {
- if (tOutput == null) {
- break;
+ if (mCurrentParallel > 0) {
+ ArrayList<ItemStack> chancedOutputs = new ArrayList<>();
+ int remainingEfficiency = getMaxEfficiency(controllerStack);
+ for (int j = 0; j < (int) Math.ceil(getMaxEfficiency(controllerStack) / 10000.0f); j++) {
+ int chanced = getBaseMetaTileEntity().getRandomNumber(10000);
+ if (chanced >= remainingEfficiency) {
+ continue;
+ }
+ for (ItemStack tOutput : outputItems) {
+ if (tOutput == null) {
+ break;
+ }
+ chancedOutputs.add(tOutput);
}
- tOutputs.add(tOutput.copy());
+ remainingEfficiency -= 10000;
}
- remainingEfficiency -= 10000;
+ setOutputItems(chancedOutputs.toArray(new ItemStack[0]));
}
- for (ItemStack itemStack : tOutputs) {
- itemStack.stackSize *= mCurrentParallel;
- }
-
- mOutputItems = tOutputs.toArray(new ItemStack[0]);
- mOutputFluids = tRecipe.mFluidOutputs.clone();
- updateSlots();
-
- return true;
+ return result;
}
- }
+ };
+ }
- return false;
+ private boolean isNoOC() {
+ return !mOCTier1 && !mOCTier2;
+ }
+
+ private float getDurationMultiplierFromRoughness() {
+ return (float) Math.pow(mRoughnessMultiplier, 2);
}
private int ticker = 0;
@@ -810,44 +792,6 @@ public class GT_MetaTileEntity_PCBFactory extends
}
@Override
- protected void calculateOverclockedNessMultiInternal(long aEUt, int aDuration, int mAmperage, long maxInputVoltage,
- boolean perfectOC) {
- int hatches = Math.max(getExoticEnergyHatches().size(), 1);
- long zTime = aDuration;
- long zEUt = aEUt;
- if (maxInputVoltage < zEUt) {
- this.lEUt = Long.MAX_VALUE - 1;
- this.mMaxProgresstime = Integer.MAX_VALUE - 1;
- return;
- }
-
- while (zEUt < maxInputVoltage) {
- zEUt = zEUt << 2;
- zTime = zTime >> (perfectOC ? 2 : 1);
- if (zTime <= 1) {
- break;
- }
- }
-
- if (zTime <= 0) {
- zTime = 1;
- }
-
- while (zEUt * mAmperage > maxInputVoltage * getMaxInputAmps() / hatches) {
- zEUt = zEUt >> 2;
- zTime = zTime << (perfectOC ? 2 : 1);
- }
-
- if (zEUt > maxInputVoltage) {
- zEUt = zEUt >> 2;
- zTime = zTime << (perfectOC ? 2 : 1);
- }
-
- this.lEUt = zEUt * mAmperage;
- this.mMaxProgresstime = (int) zTime;
- }
-
- @Override
protected long getActualEnergyUsage() {
return (-this.lEUt * 10000) / Math.min(Math.max(1000, mEfficiency), 10000);
}
@@ -1071,7 +1015,8 @@ public class GT_MetaTileEntity_PCBFactory extends
@Override
public void loadNBTData(final NBTTagCompound aNBT) {
super.loadNBTData(aNBT);
- if (!aNBT.hasKey(INPUT_SEPARATION_NBT_KEY)) {
+ if (aNBT.hasKey("mSeparate")) {
+ // backward compatibility
inputSeparation = aNBT.getBoolean("mSeparate");
}
mBioUpgrade = aNBT.getBoolean("mBioUpgrade");
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java
index 2a92fff523..d1a2a9dd7f 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java
@@ -33,6 +33,8 @@ import net.minecraft.world.ChunkCoordIntPair;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
+import org.jetbrains.annotations.NotNull;
+
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
@@ -50,6 +52,8 @@ import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
import gregtech.api.objects.GT_ChunkManager;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_ExoticEnergyInputHelper;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
@@ -661,18 +665,19 @@ public class GT_MetaTileEntity_PlasmaForge extends GT_MetaTileEntity_AbstractMul
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
- boolean recipe_process = processRecipe(getCompactedInputs(), getCompactedFluids());
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ CheckRecipeResult recipe_process = processRecipe(getCompactedInputs(), getCompactedFluids());
// If recipe cannot be found then continuity is broken and reset running time to 0.
- if (!recipe_process) {
+ if (!recipe_process.wasSuccessful()) {
resetDiscount();
}
return recipe_process;
}
- protected boolean processRecipe(ItemStack[] tItems, FluidStack[] tFluids) {
+ protected CheckRecipeResult processRecipe(ItemStack[] tItems, FluidStack[] tFluids) {
// Gets the EU input of the
long tTotalEU = GT_ExoticEnergyInputHelper.getTotalEuMulti(getExoticAndNormalEnergyHatchList());
@@ -682,10 +687,11 @@ public class GT_MetaTileEntity_PlasmaForge extends GT_MetaTileEntity_AbstractMul
.findRecipe(getBaseMetaTileEntity(), false, tTotalEU, tFluids, tItems);
// Check if recipe found.
- if (tRecipe_0 == null) return false;
+ if (tRecipe_0 == null) return CheckRecipeResultRegistry.NO_RECIPE;
// If coil heat capacity is too low, refuse to start recipe.
- if (mHeatingCapacity <= tRecipe_0.mSpecialValue) return false;
+ if (mHeatingCapacity <= tRecipe_0.mSpecialValue)
+ return CheckRecipeResultRegistry.insufficientHeat(tRecipe_0.mSpecialValue);
// Reduce fuel quantity if machine has been running for long enough.
GT_Recipe tRecipe_1 = tRecipe_0.copy();
@@ -705,9 +711,9 @@ public class GT_MetaTileEntity_PlasmaForge extends GT_MetaTileEntity_AbstractMul
}
}
- if (!canOutputAll(tRecipe_1)) return false;
+ if (!canOutputAll(tRecipe_1)) return CheckRecipeResultRegistry.OUTPUT_FULL;
// Takes items/fluids from hatches/busses.
- if (!tRecipe_1.isRecipeInputEqual(true, tFluids, tItems)) return false;
+ if (!tRecipe_1.isRecipeInputEqual(true, tFluids, tItems)) return CheckRecipeResultRegistry.NO_RECIPE;
// Logic for overclocking calculations.
double EU_input_tier = log(tTotalEU) / log4;
@@ -727,7 +733,7 @@ public class GT_MetaTileEntity_PlasmaForge extends GT_MetaTileEntity_AbstractMul
// All conditions met so increment running_time.
running_time += mMaxProgresstime;
- return true;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
}
@Override
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ProcessingArray.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ProcessingArray.java
index 1c4374fd34..ff918fe196 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ProcessingArray.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ProcessingArray.java
@@ -1,6 +1,10 @@
package gregtech.common.tileentities.machines.multi;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
import static gregtech.api.enums.GT_HatchElement.Energy;
import static gregtech.api.enums.GT_HatchElement.ExoticEnergy;
import static gregtech.api.enums.GT_HatchElement.InputBus;
@@ -8,8 +12,7 @@ import static gregtech.api.enums.GT_HatchElement.InputHatch;
import static gregtech.api.enums.GT_HatchElement.Maintenance;
import static gregtech.api.enums.GT_HatchElement.OutputBus;
import static gregtech.api.enums.GT_HatchElement.OutputHatch;
-import static gregtech.api.enums.GT_Values.V;
-import static gregtech.api.enums.GT_Values.VN;
+import static gregtech.api.enums.GT_Values.*;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW;
@@ -17,11 +20,9 @@ import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_AR
import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
import static gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine.isValidForLowGravity;
-import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
-import java.util.Objects;
-import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
@@ -29,10 +30,14 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.StatCollector;
import net.minecraftforge.common.util.ForgeDirection;
-import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
import com.google.common.collect.ImmutableList;
-import com.gtnewhorizon.structurelib.structure.IStructureElement;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
import com.gtnewhorizons.modularui.api.drawable.IDrawable;
import com.gtnewhorizons.modularui.api.screen.ModularWindow;
import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
@@ -50,33 +55,55 @@ import gregtech.api.interfaces.IHatchElement;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_CubicMultiBlockBase;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_ExoticEnergyInputHelper;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
import gregtech.api.util.GT_ProcessingArray_Manager;
import gregtech.api.util.GT_Recipe;
import gregtech.api.util.GT_Recipe.GT_Recipe_Map;
-import gregtech.api.util.GT_Single_Recipe_Check;
-import gregtech.api.util.GT_Single_Recipe_Check_Processing_Array;
+import gregtech.api.util.GT_StructureUtility;
import gregtech.api.util.GT_Utility;
import gregtech.common.blocks.GT_Item_Machines;
-public class GT_MetaTileEntity_ProcessingArray
- extends GT_MetaTileEntity_CubicMultiBlockBase<GT_MetaTileEntity_ProcessingArray> {
+public class GT_MetaTileEntity_ProcessingArray extends
+ GT_MetaTileEntity_ExtendedPowerMultiBlockBase<GT_MetaTileEntity_ProcessingArray> implements ISurvivalConstructable {
+
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final IStructureDefinition<GT_MetaTileEntity_ProcessingArray> STRUCTURE_DEFINITION = StructureDefinition
+ .<GT_MetaTileEntity_ProcessingArray>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ transpose(new String[][] { { "hhh", "hhh", "hhh" }, { "h~h", "h-h", "hhh" }, { "hhh", "hhh", "hhh" }, }))
+ .addElement(
+ 'h',
+ ofChain(
+ lazy(
+ t -> GT_StructureUtility.<GT_MetaTileEntity_ProcessingArray>buildHatchAdder()
+ .atLeastList(t.getAllowedHatches())
+ .casingIndex(48)
+ .dot(1)
+ .build()),
+ onElementPass(t -> t.mCasingAmount++, ofBlock(GregTech_API.sBlockCasings4, 0))))
+ .build();
+
+ private int mCasingAmount = 0;
private GT_Recipe_Map mLastRecipeMap;
- private GT_Recipe mLastRecipe;
+ private ItemStack lastControllerStack;
private int tTier = 0;
private int mMult = 0;
private boolean downtierUEV = true;
- private String mMachineName = "";
- // Value needed so that the PA can use energy above MAX voltage
- private long mEUPerTick = 0;
public GT_MetaTileEntity_ProcessingArray(int aID, String aName, String aNameRegional) {
super(aID, aName, aNameRegional);
@@ -148,24 +175,12 @@ public class GT_MetaTileEntity_ProcessingArray
return new ITexture[] { Textures.BlockIcons.casingTexturePages[0][48] };
}
- // TODO: Expand so it also does the non recipe map recipes
- /*
- * public void remoteRecipeCheck() { if (mInventory[1] == null) return; String tmp =
- * mInventory[1].getUnlocalizedName().replaceAll("gt.blockmachines.basicmachine.", ""); if
- * (tmp.startsWith("replicator")) { } else if (tmp.startsWith("brewery")) { } else if (tmp.startsWith("packer")) { }
- * else if (tmp.startsWith("printer")) { } else if (tmp.startsWith("disassembler")) { } else if
- * (tmp.startsWith("massfab")) { } else if (tmp.startsWith("scanner")) { } }
- */
-
- // Gets the recipe map for the given machine through its unlocalized name
@Override
public GT_Recipe_Map getRecipeMap() {
- if (isCorrectMachinePart(mInventory[1])) {
- int length = mInventory[1].getUnlocalizedName()
- .length();
- String aMachineName = mInventory[1].getUnlocalizedName()
- .substring(17, length - 8);
- return GT_ProcessingArray_Manager.giveRecipeMap(aMachineName);
+ if (isCorrectMachinePart(getControllerSlot())) {
+ // Gets the recipe map for the given machine through its unlocalized name
+ return GT_ProcessingArray_Manager
+ .giveRecipeMap(GT_ProcessingArray_Manager.getMachineName(getControllerSlot()));
}
return null;
}
@@ -177,8 +192,12 @@ public class GT_MetaTileEntity_ProcessingArray
}
@Override
- public boolean supportsSingleRecipeLocking() {
- return true;
+ protected void sendStartMultiBlockSoundLoop() {
+ SoundResource sound = GT_ProcessingArray_Manager
+ .getSoundResource(GT_ProcessingArray_Manager.getMachineName(getControllerSlot()));
+ if (sound != null) {
+ sendLoopStart((byte) sound.id);
+ }
}
@Override
@@ -191,220 +210,85 @@ public class GT_MetaTileEntity_ProcessingArray
}
@Override
- protected boolean checkRecipe() {
- startRecipeProcessing();
- boolean result = checkRecipe(mInventory[1]);
- if (result) {
- int length = mInventory[1].getUnlocalizedName()
- .length();
- String aMachineName = mInventory[1].getUnlocalizedName()
- .substring(17, length - 8);
- SoundResource sound = GT_ProcessingArray_Manager.getSoundResource(aMachineName);
- if (sound != null) {
- sendLoopStart((byte) sound.id);
- }
- }
- endRecipeProcessing();
- return result;
- }
-
- @Override
- public boolean checkRecipe(ItemStack aStack) {
- if (mLockedToSingleRecipe && mSingleRecipeCheck != null) {
- return processLockedRecipe();
- }
-
- if (!isCorrectMachinePart(mInventory[1])) {
- return false;
- }
- GT_Recipe.GT_Recipe_Map map = getRecipeMap();
- if (map == null) return false;
-
- if (!mMachineName.equals(mInventory[1].getUnlocalizedName())) {
- mLastRecipe = null;
- mMachineName = mInventory[1].getUnlocalizedName();
- }
-
- if (mLastRecipe == null) {
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ if (!GT_Utility.areStacksEqual(lastControllerStack, getControllerSlot())) {
+ // controller slot has changed
+ lastControllerStack = getControllerSlot();
+ mLastRecipeMap = getRecipeMap();
setTierAndMult();
}
- ArrayList<FluidStack> tFluidList = getStoredFluids();
- FluidStack[] tFluids = tFluidList.toArray(new FluidStack[0]);
- if (inputSeparation) {
- ArrayList<ItemStack> tInputList = new ArrayList<>();
- for (GT_MetaTileEntity_Hatch_InputBus tHatch : mInputBusses) {
- IGregTechTileEntity tInputBus = tHatch.getBaseMetaTileEntity();
- for (int i = tInputBus.getSizeInventory() - 1; i >= 0; i--) {
- if (tInputBus.getStackInSlot(i) != null) tInputList.add(tInputBus.getStackInSlot(i));
- }
- ItemStack[] tInputs = tInputList.toArray(new ItemStack[0]);
- if (processRecipe(tInputs, tFluids, map)) return true;
- else tInputList.clear();
+ if (mLastRecipeMap == null) return SimpleCheckRecipeResult.ofFailure("no_machine");
+ if (mLockedToSingleRecipe && mSingleRecipeCheck != null) {
+ if (mSingleRecipeCheck.getRecipeMap() != mLastRecipeMap) {
+ return SimpleCheckRecipeResult.ofFailure("machine_mismatch");
}
- } else {
- ArrayList<ItemStack> tInputList = getStoredInputs();
- ItemStack[] tInputs = tInputList.toArray(new ItemStack[0]);
- return processRecipe(tInputs, tFluids, map);
}
- return false;
- }
- private void setTierAndMult() {
- IMetaTileEntity aMachine = GT_Item_Machines.getMetaTileEntity(mInventory[1]);
- if (aMachine != null) tTier = ((GT_MetaTileEntity_TieredMachineBlock) aMachine).mTier;
- mMult = 0;
- if (downtierUEV && tTier > 9) {
- tTier--; // Lowers down the tier by 1 to allow for bigger parallel
- mMult = 2; // Multiplies Parallels by 4x, keeping the energy cost
- }
+ return super.checkProcessing();
}
- public boolean processLockedRecipe() {
- GT_Single_Recipe_Check_Processing_Array tSingleRecipeCheck = (GT_Single_Recipe_Check_Processing_Array) mSingleRecipeCheck;
-
- if (mLastRecipe == null) {
- setTierAndMult();
- mLastRecipe = tSingleRecipeCheck.getRecipe();
- }
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
- int machines = mInventory[1].stackSize << mMult;
- int parallel = tSingleRecipeCheck.checkRecipeInputs(true, machines);
-
- return processRecipeOutputs(
- tSingleRecipeCheck.getRecipe(),
- tSingleRecipeCheck.getRecipeAmperage(),
- parallel,
- 1);
- }
-
- public boolean processRecipe(ItemStack[] tInputs, FluidStack[] tFluids, GT_Recipe.GT_Recipe_Map map) {
- if (tInputs.length == 0 && tFluids.length == 0) return false;
- GT_Recipe tRecipe = map.findRecipe(
- getBaseMetaTileEntity(),
- mLastRecipe,
- false,
- gregtech.api.enums.GT_Values.V[tTier],
- tFluids,
- tInputs);
- if (tRecipe == null) return false;
- if (GT_Mod.gregtechproxy.mLowGravProcessing && tRecipe.mSpecialValue == -100
- && !isValidForLowGravity(tRecipe, getBaseMetaTileEntity().getWorld().provider.dimensionId)) return false;
-
- GT_Single_Recipe_Check_Processing_Array.Builder tSingleRecipeCheckBuilder = null;
- if (mLockedToSingleRecipe) {
- // We're locked to a single recipe, but haven't built the recipe checker yet.
- // Build the checker on next successful recipe.
- tSingleRecipeCheckBuilder = GT_Single_Recipe_Check_Processing_Array.processingArrayBuilder(this)
- .setBefore(tInputs, tFluids);
- }
+ @Override
+ protected double calculateDuration(@Nonnull GT_Recipe recipe, @Nonnull GT_ParallelHelper helper,
+ @Nonnull GT_OverclockCalculator calculator) {
+ return calculator.getDuration();
+ }
- boolean recipeLocked = false;
- mLastRecipe = tRecipe;
- int machines = mInventory[1].stackSize << mMult;
- int i = 0;
- for (; i < machines; i++) {
- if (!tRecipe.isRecipeInputEqual(true, tFluids, tInputs)) {
- break;
- } else if (mLockedToSingleRecipe && !recipeLocked) {
- // We want to lock to a single run of the recipe.
- mSingleRecipeCheck = tSingleRecipeCheckBuilder.setAfter(tInputs, tFluids)
- .setRecipe(tRecipe)
- .setRecipeAmperage(map.mAmperage)
- .build();
- recipeLocked = true;
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe,
+ @Nonnull GT_ParallelHelper helper) {
+ return new GT_OverclockCalculator().setRecipeEUt(recipe.mEUt)
+ .setParallel((int) Math.floor(helper.getCurrentParallel() / helper.getDurationMultiplierDouble()))
+ .setDuration((int) Math.ceil(recipe.mDuration * helper.getDurationMultiplierDouble()))
+ .setAmperage(availableAmperage)
+ .setEUt(availableVoltage)
+ .setDurationDecreasePerOC(overClockTimeReduction)
+ .setEUtIncreasePerOC(overClockPowerIncrease);
}
- }
- // Check how many times we can run the same recipe
- int multiplier = 1;
- if (batchMode && i == machines) {
- for (; multiplier < 128; ++multiplier) {
- if (!tRecipe.isRecipeInputEqual(true, false, machines, tFluids, tInputs)) {
- break;
+ @Nonnull
+ @Override
+ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+ if (GT_Mod.gregtechproxy.mLowGravProcessing && recipe.mSpecialValue == -100
+ && !isValidForLowGravity(recipe, getBaseMetaTileEntity().getWorld().provider.dimensionId)) {
+ return SimpleCheckRecipeResult.ofFailure("high_gravity");
}
+ return CheckRecipeResultRegistry.SUCCESSFUL;
}
- }
- return processRecipeOutputs(tRecipe, map.mAmperage, i, multiplier);
+ }.setMaxParallelSupplier(this::getMaxParallel);
}
- public boolean processRecipeOutputs(GT_Recipe aRecipe, int aAmperage, int parallel, int multiplier) {
- this.mEUPerTick = 0;
- this.mOutputItems = null;
- this.mOutputFluids = null;
- if (parallel == 0) {
- return false;
- }
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ GT_Recipe_Map recipeMap = getRecipeMap();
+ logic.setAvailableVoltage(GT_Values.V[tTier] * (recipeMap != null ? recipeMap.mAmperage : 1));
+ logic.setAvailableAmperage(getMaxParallel());
+ }
- this.mMaxProgresstime = aRecipe.mDuration * multiplier;
-
- this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
- this.mEfficiencyIncrease = 10000;
- ProcessingArrayCalculateOverclock(
- aRecipe.mEUt,
- aRecipe.mDuration * multiplier,
- aAmperage,
- GT_Values.V[tTier],
- false);
- // In case recipe is too OP for that machine
- if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUPerTick == Long.MAX_VALUE - 1) return false;
- mEUPerTick = mEUPerTick * parallel;
- if (mEUPerTick == Long.MAX_VALUE - 1) return false;
-
- if (mEUPerTick > 0) {
- mEUPerTick = (-mEUPerTick);
- }
- ItemStack[] tOut = new ItemStack[aRecipe.mOutputs.length];
- for (int h = 0; h < aRecipe.mOutputs.length; h++) {
- if (aRecipe.getOutput(h) != null) {
- tOut[h] = aRecipe.getOutput(h)
- .copy();
- tOut[h].stackSize = 0;
- }
- }
- FluidStack[] tFOut = new FluidStack[aRecipe.mFluidOutputs.length];
- for (int i = 0; i < aRecipe.mFluidOutputs.length; i++)
- if (aRecipe.getFluidOutput(i) != null) tFOut[i] = aRecipe.getFluidOutput(i)
- .copy();
- for (int f = 0; f < tOut.length; f++) {
- if (aRecipe.mOutputs[f] != null && tOut[f] != null) {
- for (int g = 0; g < parallel * multiplier; g++) {
- if (getBaseMetaTileEntity().getRandomNumber(10000) < aRecipe.getOutputChance(f))
- tOut[f].stackSize += aRecipe.mOutputs[f].stackSize;
- }
- }
+ private void setTierAndMult() {
+ IMetaTileEntity aMachine = GT_Item_Machines.getMetaTileEntity(getControllerSlot());
+ if (aMachine instanceof GT_MetaTileEntity_TieredMachineBlock) {
+ tTier = ((GT_MetaTileEntity_TieredMachineBlock) aMachine).mTier;
+ } else {
+ tTier = 0;
}
- byte oNumber = 0;
- for (FluidStack fluidStack : tFOut) {
- if (fluidStack != null) {
- int tSize = fluidStack.amount;
- tFOut[oNumber].amount = tSize * parallel * multiplier;
- }
- oNumber++;
+ mMult = 0;
+ if (downtierUEV && tTier > 9) {
+ tTier--; // Lowers down the tier by 1 to allow for bigger parallel
+ mMult = 2; // Multiplies Parallels by 4x, keeping the energy cost
}
- this.mMaxProgresstime = Math.max(1, this.mMaxProgresstime);
- this.mOutputItems = Arrays.stream(tOut)
- .filter(Objects::nonNull)
- .flatMap(GT_MetaTileEntity_ProcessingArray::splitOversizedStack)
- .filter(is -> is.stackSize > 0)
- .toArray(ItemStack[]::new);
- this.mOutputFluids = tFOut;
- updateSlots();
- return true;
}
- private static Stream<ItemStack> splitOversizedStack(ItemStack aStack) {
- int tMaxStackSize = aStack.getMaxStackSize();
- if (aStack.stackSize <= tMaxStackSize) return Stream.of(aStack);
- int tRepeat = aStack.stackSize / tMaxStackSize;
- aStack.stackSize = aStack.stackSize % tMaxStackSize;
- Stream.Builder<ItemStack> tBuilder = Stream.builder();
- tBuilder.add(aStack);
- for (int i = 0; i < tRepeat; i++) {
- ItemStack rStack = aStack.copy();
- rStack.stackSize = tMaxStackSize;
- tBuilder.add(rStack);
+ private int getMaxParallel() {
+ if (getControllerSlot() == null) {
+ return 0;
}
- return tBuilder.build();
+ return getControllerSlot().stackSize << mMult;
}
@Override
@@ -421,43 +305,43 @@ public class GT_MetaTileEntity_ProcessingArray
}
@Override
- protected IStructureElement<GT_MetaTileEntity_CubicMultiBlockBase<?>> getCasingElement() {
- return ofBlock(GregTech_API.sBlockCasings4, 0);
+ public IStructureDefinition<GT_MetaTileEntity_ProcessingArray> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
}
@Override
- protected int getHatchTextureIndex() {
- return 48;
+ public void construct(ItemStack aStack, boolean aHintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, aStack, aHintsOnly, 1, 1, 0);
}
@Override
- protected int getRequiredCasingCount() {
- return 14;
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ private boolean checkHatches() {
+ return mMaintenanceHatches.size() == 1;
}
@Override
public void saveNBTData(NBTTagCompound aNBT) {
super.saveNBTData(aNBT);
aNBT.setBoolean("downtierUEV", downtierUEV);
- aNBT.setLong("mEUPerTick", mEUPerTick);
}
@Override
public void loadNBTData(final NBTTagCompound aNBT) {
super.loadNBTData(aNBT);
- if (!aNBT.hasKey(INPUT_SEPARATION_NBT_KEY)) {
+ if (aNBT.hasKey("mSeparate")) {
+ // backward compatibility
inputSeparation = aNBT.getBoolean("mSeparate");
}
- if (!aNBT.hasKey(BATCH_MODE_NBT_KEY)) {
+ if (aNBT.hasKey("mUseMultiparallelMode")) {
+ // backward compatibility
batchMode = aNBT.getBoolean("mUseMultiparallelMode");
}
downtierUEV = aNBT.getBoolean("downtierUEV");
- mEUPerTick = aNBT.getLong("mEUPerTick");
- }
-
- @Override
- protected GT_Single_Recipe_Check loadSingleRecipeChecker(NBTTagCompound aNBT) {
- return GT_Single_Recipe_Check_Processing_Array.tryLoad(this, getRecipeMap(), aNBT, mInventory[1]);
}
@Override
@@ -483,13 +367,11 @@ public class GT_MetaTileEntity_ProcessingArray
} else {
GT_Utility.sendChatToPlayer(aPlayer, "Don't batch recipes");
}
- return true;
} else {
downtierUEV = !downtierUEV;
- mLastRecipe = null; // clears last recipe
GT_Utility.sendChatToPlayer(aPlayer, "Treat UEV+ machines as multiple UHV " + downtierUEV);
- return true;
}
+ return true;
}
@Override
@@ -507,20 +389,15 @@ public class GT_MetaTileEntity_ProcessingArray
return false;
}
- @Override
- protected List<IHatchElement<? super GT_MetaTileEntity_CubicMultiBlockBase<?>>> getAllowedHatches() {
+ private List<IHatchElement<? super GT_MetaTileEntity_ProcessingArray>> getAllowedHatches() {
return ImmutableList.of(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy, ExoticEnergy);
}
@Override
public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
mExoticEnergyHatches.clear();
- return super.checkMachine(aBaseMetaTileEntity, aStack);
- }
-
- @Override
- public boolean drainEnergyInput(long aEU) {
- return GT_ExoticEnergyInputHelper.drainEnergy(aEU, getExoticAndNormalEnergyHatchList());
+ mCasingAmount = 0;
+ return checkPiece(STRUCTURE_PIECE_MAIN, 1, 1, 0) && mCasingAmount >= 14 && checkHatches();
}
@Override
@@ -557,7 +434,7 @@ public class GT_MetaTileEntity_ProcessingArray
+ " EU",
StatCollector.translateToLocal("GT5U.multiblock.usage") + ": "
+ EnumChatFormatting.RED
- + GT_Utility.formatNumbers(-mEUPerTick)
+ + GT_Utility.formatNumbers(-lEUt)
+ EnumChatFormatting.RESET
+ " EU/t",
StatCollector.translateToLocal("GT5U.multiblock.mei") + ": "
@@ -599,84 +476,22 @@ public class GT_MetaTileEntity_ProcessingArray
+ " x",
StatCollector.translateToLocal("GT5U.PA.parallel") + ": "
+ EnumChatFormatting.GREEN
- + GT_Utility.formatNumbers((mInventory[1] != null) ? ((long) mInventory[1].stackSize << mMult) : 0)
+ + GT_Utility.formatNumbers(getMaxParallel())
+ EnumChatFormatting.RESET };
}
- public List<GT_MetaTileEntity_Hatch> getExoticAndNormalEnergyHatchList() {
- List<GT_MetaTileEntity_Hatch> tHatches = new ArrayList<>();
- tHatches.addAll(mExoticEnergyHatches);
- tHatches.addAll(mEnergyHatches);
- return tHatches;
- }
-
@Override
- public boolean onRunningTick(ItemStack aStack) {
- if (mEUPerTick < 0) {
- if (!drainEnergyInput(-mEUPerTick)) {
- mEUPerTick = 0;
- criticalStopMachine();
- return false;
- }
- }
+ public boolean supportsInputSeparation() {
return true;
}
- protected void ProcessingArrayCalculateOverclock(long aEUt, int aDuration, int mAmperage, long maxInputVoltage,
- boolean perfectOC) {
- byte mTier = (byte) Math.max(0, GT_Utility.getTier(maxInputVoltage));
- if (mTier == 0) {
- // Long time calculation
- long xMaxProgresstime = ((long) aDuration) << 1;
- if (xMaxProgresstime > Integer.MAX_VALUE - 1) {
- // make impossible if too long
- mEUPerTick = Long.MAX_VALUE - 1;
- mMaxProgresstime = Integer.MAX_VALUE - 1;
- } else {
- mEUPerTick = aEUt >> 2;
- mMaxProgresstime = (int) xMaxProgresstime;
- }
- } else {
- // Long EUt calculation
- long xEUt = aEUt;
- // Isnt too low EUt check?
- long tempEUt = Math.max(xEUt, V[1]);
-
- mMaxProgresstime = aDuration;
-
- final int ocTimeShift = perfectOC ? 2 : 1;
-
- while (tempEUt <= V[mTier - 1] * mAmperage) {
- tempEUt <<= 2; // this actually controls overclocking
- // xEUt *= 4;//this is effect of everclocking
- int oldTime = mMaxProgresstime;
- mMaxProgresstime >>= ocTimeShift; // this is effect of overclocking
- if (mMaxProgresstime < 1) {
- if (oldTime == 1) break;
- xEUt *= (long) oldTime * (perfectOC ? 1 : 2);
- break;
- } else {
- xEUt <<= 2;
- }
- }
- if (xEUt > Long.MAX_VALUE - 1) {
- mEUPerTick = Long.MAX_VALUE - 1;
- mMaxProgresstime = Integer.MAX_VALUE - 1;
- } else {
- mEUPerTick = xEUt;
- if (mEUPerTick == 0) mEUPerTick = 1;
- if (mMaxProgresstime == 0) mMaxProgresstime = 1; // set time to 1 tick
- }
- }
- }
-
@Override
- public boolean supportsInputSeparation() {
+ public boolean supportsBatchMode() {
return true;
}
@Override
- public boolean supportsBatchMode() {
+ public boolean supportsSingleRecipeLocking() {
return true;
}
@@ -684,22 +499,24 @@ public class GT_MetaTileEntity_ProcessingArray
public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
super.addUIWidgets(builder, buildContext);
- builder.widget(
- new ButtonWidget().setOnClick((clickData, widget) -> downtierUEV = !downtierUEV)
- .setPlayClickSound(true)
- .setBackground(() -> {
- if (downtierUEV) {
- return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED,
- GT_UITextures.OVERLAY_BUTTON_DOWN_TIERING_ON };
- } else {
- return new IDrawable[] { GT_UITextures.BUTTON_STANDARD,
- GT_UITextures.OVERLAY_BUTTON_DOWN_TIERING_OFF };
- }
- })
- .setPos(80, 91)
- .setSize(16, 16)
- .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.down_tier"))
- .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ downtierUEV = !downtierUEV;
+ setTierAndMult();
+ })
+ .setPlayClickSound(true)
+ .setBackground(() -> {
+ if (downtierUEV) {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED,
+ GT_UITextures.OVERLAY_BUTTON_DOWN_TIERING_ON };
+ } else {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD,
+ GT_UITextures.OVERLAY_BUTTON_DOWN_TIERING_OFF };
+ }
+ })
+ .setPos(80, 91)
+ .setSize(16, 16)
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.down_tier"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
.widget(new FakeSyncWidget.BooleanSyncer(() -> downtierUEV, val -> downtierUEV = val));
}
}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PyrolyseOven.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PyrolyseOven.java
index 2a36377acc..c76ac32863 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PyrolyseOven.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PyrolyseOven.java
@@ -21,7 +21,8 @@ import static gregtech.api.util.GT_StructureUtility.ofCoil;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.ForgeDirection;
-import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
@@ -37,12 +38,12 @@ import gregtech.api.enums.Textures.BlockIcons;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
+import gregtech.api.recipe.check.CheckRecipeResult;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
import gregtech.api.util.GT_Recipe;
-import gregtech.api.util.GT_Single_Recipe_Check;
-import gregtech.api.util.GT_Utility;
public class GT_MetaTileEntity_PyrolyseOven
extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_PyrolyseOven> implements ISurvivalConstructable {
@@ -157,56 +158,20 @@ public class GT_MetaTileEntity_PyrolyseOven
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
- long tVoltage = getMaxInputVoltage();
- byte tTier = (byte) Math.max(1, GT_Utility.getTier(tVoltage));
- GT_Recipe tRecipe;
-
- if (mLockedToSingleRecipe && mSingleRecipeCheck != null) {
- if (!mSingleRecipeCheck.checkRecipeInputsSingleStack(true)) {
- return false;
- }
-
- tRecipe = mSingleRecipeCheck.getRecipe();
- } else {
- ItemStack[] tInputs = getCompactedInputs();
- FluidStack[] tFluids = getCompactedFluids();
-
- if (tInputs.length == 0) return false;
-
- GT_Single_Recipe_Check.Builder tSingleRecipeCheckBuilder = null;
- if (mLockedToSingleRecipe) {
- // We're locked to a single recipe, but haven't built the recipe checker yet.
- // Build the checker on next successful recipe.
- tSingleRecipeCheckBuilder = GT_Single_Recipe_Check.builder(this)
- .setBefore(tInputs, tFluids);
- }
-
- tRecipe = GT_Recipe.GT_Recipe_Map.sPyrolyseRecipes
- .findRecipe(getBaseMetaTileEntity(), false, gregtech.api.enums.GT_Values.V[tTier], tFluids, tInputs);
-
- if (tRecipe == null || !canOutputAll(tRecipe) || !tRecipe.isRecipeInputEqual(true, tFluids, tInputs))
- return false;
-
- if (mLockedToSingleRecipe) {
- mSingleRecipeCheck = tSingleRecipeCheckBuilder.setAfter(tInputs, tFluids)
- .setRecipe(tRecipe)
- .build();
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ public CheckRecipeResult process() {
+ CheckRecipeResult result = super.process();
+ if (!result.wasSuccessful()) {
+ return result;
+ }
+ duration = Math.max(duration * 2 / (1 + coilHeat.getTier()), 1);
+ return result;
}
- }
-
- this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
- this.mEfficiencyIncrease = 10000;
-
- calculateOverclockedNessMultiInternal(tRecipe.mEUt, tRecipe.mDuration, 1, tVoltage, false);
- // In case recipe is too OP for that machine
- if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) return false;
- if (this.mEUt > 0) this.mEUt = (-this.mEUt);
- this.mMaxProgresstime = Math.max(mMaxProgresstime * 2 / (1 + coilHeat.getTier()), 1);
- if (tRecipe.mOutputs.length > 0) this.mOutputItems = new ItemStack[] { tRecipe.getOutput(0) };
- if (tRecipe.mFluidOutputs.length > 0) this.mOutputFluids = new FluidStack[] { tRecipe.getFluidOutput(0) };
- updateSlots();
- return true;
+ };
}
@Override
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java
index 429a8a4ddf..54f903299e 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java
@@ -18,10 +18,13 @@ import static java.lang.Math.max;
import static net.minecraft.util.EnumChatFormatting.GOLD;
import static net.minecraft.util.EnumChatFormatting.GRAY;
+import javax.annotation.Nonnull;
+
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
-import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
@@ -33,9 +36,14 @@ import gregtech.api.interfaces.IGlobalWirelessEnergy;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
import gregtech.api.util.GT_Recipe;
import gregtech.common.items.GT_IntegratedCircuit_Item;
@@ -136,56 +144,53 @@ public class GT_MetaTileEntity_TranscendentPlasmaMixer
long mWirelessEUt = 0;
@Override
- public boolean checkRecipe(ItemStack aStack) {
- if (aStack != null && aStack.getItem() instanceof GT_IntegratedCircuit_Item) {
- multiplier = aStack.stackSize * max(1, aStack.getItemDamage());
- }
-
- return processRecipe(getCompactedInputs(), getCompactedFluids());
+ public GT_Recipe.GT_Recipe_Map getRecipeMap() {
+ return GT_Recipe.GT_Recipe_Map.sTranscendentPlasmaMixerRecipes;
}
- boolean processRecipe(ItemStack[] items, FluidStack[] fluids) {
-
- GT_Recipe originalRecipe = GT_Recipe.GT_Recipe_Map.sTranscendentPlasmaMixerRecipes
- .findRecipe(getBaseMetaTileEntity(), false, Long.MAX_VALUE, fluids, items);
-
- if (originalRecipe == null) {
- return false;
- }
- mWirelessEUt = 10L * (long) originalRecipe.mEUt * (long) multiplier;
- // 100L - recipe takes 100 ticks
- if (!addEUToGlobalEnergyMap(ownerUUID, mWirelessEUt * -100L)) {
- return false;
- }
-
- // Fluid handling.
- {
- // Output items/fluids.
- GT_Recipe modifiedRecipe = originalRecipe.copy();
-
- // Multiply up the input plasmas.
- for (FluidStack fluidStack : modifiedRecipe.mFluidInputs) {
- fluidStack.amount *= multiplier;
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+ mWirelessEUt = 10L * (long) recipe.mEUt * (long) multiplier;
+ if (!addEUToGlobalEnergyMap(ownerUUID, -mWirelessEUt * recipe.mDuration)) {
+ return CheckRecipeResultRegistry.insufficientPower(mWirelessEUt * recipe.mDuration);
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
}
- // Multiply up the output fluid.
- modifiedRecipe.mFluidOutputs[0].amount *= multiplier;
-
- if (!canOutputAll(modifiedRecipe)) return false;
-
- // Takes items/fluids from hatches/busses.
- if (!modifiedRecipe.isRecipeInputEqual(true, fluids, items)) return false;
-
- mOutputFluids = modifiedRecipe.mFluidOutputs;
- mOutputItems = modifiedRecipe.mOutputs;
- }
-
- mMaxProgresstime = 100;
- mEUt = 0;
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe,
+ @Nonnull GT_ParallelHelper helper) {
+ return GT_OverclockCalculator.ofNoOverclock(recipe);
+ }
- updateSlots();
+ @NotNull
+ @Override
+ public CheckRecipeResult process() {
+ CheckRecipeResult result = super.process();
+ // Power will be directly consumed through wireless
+ setCalculatedEut(0);
+ return result;
+ }
+ }.setMaxParallelSupplier(() -> {
+ ItemStack controllerStack = getControllerSlot();
+ if (controllerStack != null && controllerStack.getItem() instanceof GT_IntegratedCircuit_Item) {
+ multiplier = controllerStack.stackSize * max(1, controllerStack.getItemDamage());
+ }
+ return multiplier;
+ });
+ }
- return true;
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ // The voltage is only used for recipe finding
+ logic.setAvailableVoltage(Long.MAX_VALUE);
+ logic.setAvailableAmperage(1);
}
@Override
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_VacuumFreezer.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_VacuumFreezer.java
index 815515b555..e353d5d980 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_VacuumFreezer.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_VacuumFreezer.java
@@ -8,7 +8,6 @@ import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.ForgeDirection;
-import net.minecraftforge.fluids.FluidStack;
import com.gtnewhorizon.structurelib.structure.IStructureElement;
import com.gtnewhorizon.structurelib.structure.StructureUtility;
@@ -17,11 +16,11 @@ import gregtech.api.GregTech_API;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_CubicMultiBlockBase;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
import gregtech.api.util.GT_Recipe;
-import gregtech.api.util.GT_Utility;
public class GT_MetaTileEntity_VacuumFreezer
extends GT_MetaTileEntity_CubicMultiBlockBase<GT_MetaTileEntity_VacuumFreezer> {
@@ -102,34 +101,8 @@ public class GT_MetaTileEntity_VacuumFreezer
}
@Override
- public boolean checkRecipe(ItemStack aStack) {
- ItemStack[] tInputList = getCompactedInputs();
- FluidStack[] tFluidList = getCompactedFluids();
-
- long tVoltage = getMaxInputVoltage();
- byte tTier = (byte) Math.max(1, GT_Utility.getTier(tVoltage));
- GT_Recipe tRecipe = getRecipeMap()
- .findRecipe(getBaseMetaTileEntity(), false, gregtech.api.enums.GT_Values.V[tTier], tFluidList, tInputList);
- if (tRecipe != null) {
- if (!canOutputAll(tRecipe)) return false;
- if (tRecipe.isRecipeInputEqual(true, tFluidList, tInputList)) {
- this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
- this.mEfficiencyIncrease = 10000;
-
- calculateOverclockedNessMultiInternal(tRecipe.mEUt, tRecipe.mDuration, 1, tVoltage, false);
- // In case recipe is too OP for that machine
- if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) return false;
- if (this.mEUt > 0) {
- this.mEUt = (-this.mEUt);
- }
- this.mMaxProgresstime = Math.max(1, this.mMaxProgresstime);
- this.mOutputItems = new ItemStack[] { tRecipe.getOutput(0) };
- this.mOutputFluids = new FluidStack[] { tRecipe.getFluidOutput(0) };
- updateSlots();
- return true;
- }
- }
- return false;
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic();
}
@Override
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalReactor.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalReactor.java
index e9db6c2256..38152869e4 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalReactor.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalReactor.java
@@ -78,9 +78,12 @@ public class AdvChemicalReactor extends ComplexParallelController<AdvChemicalRea
}
processFluidWhiteLists.add(processFluidTanks);
}
- processingLogic = new ComplexParallelProcessingLogic(
- GT_Recipe.GT_Recipe_Map_LargeChemicalReactor.sChemicalRecipes,
- MAX_PROCESSES);
+ processingLogic = new ComplexParallelProcessingLogic(getRecipeMap(), MAX_PROCESSES);
+ }
+
+ @Override
+ public GT_Recipe.GT_Recipe_Map getRecipeMap() {
+ return GT_Recipe.GT_Recipe_Map_LargeChemicalReactor.sChemicalRecipes;
}
@Override
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/CokeOvenProcessingLogic.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/CokeOvenProcessingLogic.java
index 4a84c1503f..046bb4a114 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/CokeOvenProcessingLogic.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/CokeOvenProcessingLogic.java
@@ -4,10 +4,14 @@ import static gregtech.api.enums.Mods.Railcraft;
import static net.minecraftforge.oredict.OreDictionary.getOreID;
import static net.minecraftforge.oredict.OreDictionary.getOreIDs;
+import javax.annotation.Nonnull;
+
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
import gregtech.api.util.GT_ModHandler;
import gregtech.api.util.GT_OreDictUnificator;
@@ -24,21 +28,22 @@ public class CokeOvenProcessingLogic extends ProcessingLogic {
private int timeMultiplier = 1;
@Override
- public boolean process() {
+ public @Nonnull CheckRecipeResult process() {
if (inputItems == null || inputItems[0] == null) {
- return false;
+ return CheckRecipeResultRegistry.NO_RECIPE;
}
ItemStack input = inputItems[0];
int originalStackSize = input.stackSize;
ItemStack output = findRecipe(input);
if (currentOutputItems != null && currentOutputItems[0] != null && !currentOutputItems[0].isItemEqual(output)) {
- return false;
+ return CheckRecipeResultRegistry.NO_RECIPE;
}
input.stackSize -= 1;
- setDuration((long) NORMAL_RECIPE_TIME * timeMultiplier);
+ setDuration(NORMAL_RECIPE_TIME * timeMultiplier);
setOutputItems(output);
- return originalStackSize > input.stackSize;
+ return originalStackSize > input.stackSize ? CheckRecipeResultRegistry.SUCCESSFUL
+ : CheckRecipeResultRegistry.NO_RECIPE;
}
protected ItemStack findRecipe(ItemStack input) {
diff --git a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java
index 123e193f03..dd76ddf45e 100644
--- a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java
+++ b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java
@@ -476,6 +476,7 @@ public abstract class GT_MetaTileEntity_DigitalTankBase extends GT_MetaTileEntit
return allowOverflow() ? Integer.MAX_VALUE : getRealCapacity();
}
+ @Override
public int getRealCapacity() {
return commonSizeCompute(mTier);
}