From 6c2ab27136d4f85e43f8009f037023c475440486 Mon Sep 17 00:00:00 2001
From: D-Cysteine <54219287+D-Cysteine@users.noreply.github.com>
Date: Sat, 27 Nov 2021 01:55:26 -0700
Subject: Fix large semi-fluid generator

---
 ...techMetaTileEntity_LargeSemifluidGenerator.java | 59 ++++++++++------------
 1 file changed, 28 insertions(+), 31 deletions(-)

(limited to 'src/Java/gtPlusPlus/xmod')

diff --git a/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java b/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java
index 20fd55ef53..dd5e5286b7 100644
--- a/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java
+++ b/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java
@@ -1,7 +1,6 @@
 package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
 
 import java.util.ArrayList;
-import java.util.Collection;
 
 import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
 import com.gtnewhorizon.structurelib.structure.StructureDefinition;
@@ -16,7 +15,6 @@ import gregtech.api.metatileentity.implementations.*;
 import gregtech.api.objects.GT_RenderedTexture;
 import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
 import gregtech.api.util.GT_Recipe;
-import gregtech.api.util.GT_Utility;
 import gregtech.api.util.GTPP_Recipe.GTPP_Recipe_Map;
 import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
 import net.minecraft.block.Block;
@@ -91,37 +89,36 @@ public class GregtechMetaTileEntity_LargeSemifluidGenerator extends GregtechMeta
 	@Override
 	public boolean checkRecipe(ItemStack aStack) {
 		ArrayList<FluidStack> tFluids = getStoredFluids();
-		Collection<GT_Recipe> tRecipeList = GTPP_Recipe_Map.sSemiFluidLiquidFuels.mRecipeList;
-
-		if(tFluids.size() > 0 && tRecipeList != null) { //Does input hatch have a semifluid fuel?
-			for (FluidStack hatchFluid1 : tFluids) { //Loops through hatches
-				for(GT_Recipe aFuel : tRecipeList) { //Loops through semifluid fuel recipes
-					FluidStack tLiquid;
-					if ((tLiquid = GT_Utility.getFluidForFilledItem(aFuel.getRepresentativeInput(0), true)) != null) { //Create fluidstack from current recipe
-						if (hatchFluid1.isFluidEqual(tLiquid)) { //Has a semifluid fluid
-							fuelConsumption = tLiquid.amount = boostEu ? (4096 / aFuel.mSpecialValue) : (2048 / aFuel.mSpecialValue); //Calc fuel consumption
-							if(depleteInput(tLiquid)) { //Deplete that amount
-								boostEu = depleteInput(Materials.Oxygen.getGas(4L));
-								if(tFluids.contains(Materials.Lubricant.getFluid(2L))) { //Has lubricant?
-									//Deplete Lubricant. 2000L should = 1 hour of runtime (if baseEU = 2048)
-									if(mRuntime % 72 == 0 || mRuntime == 0) {
-										depleteInput(Materials.Lubricant.getFluid(boostEu ? 2 : 1));
-									}
-								} 
-								else {
-									return false;
-								}
-
-								fuelValue = aFuel.mSpecialValue;
-								fuelRemaining = hatchFluid1.amount; //Record available fuel
-								this.mEUt = mEfficiency < 2000 ? 0 : 2048; //Output 0 if startup is less than 20%
-								this.mProgresstime = 1;
-								this.mMaxProgresstime = 1;
-								this.mEfficiencyIncrease = 15;
-								return true;
-							}
+
+		if(tFluids.size() > 0) { //Does input hatch have a semifluid fuel?
+			for (FluidStack hatchFluid : tFluids) { //Loops through hatches
+				GT_Recipe aFuel = GTPP_Recipe_Map.sSemiFluidLiquidFuels.findFuel(hatchFluid);
+				if (aFuel == null) {
+					// Not a valid semi-fluid fuel.
+					continue;
+				}
+
+				fuelConsumption = boostEu ? (4096 / aFuel.mSpecialValue) : (2048 / aFuel.mSpecialValue); //Calc fuel consumption
+				FluidStack tLiquid = new FluidStack(hatchFluid.getFluid(), fuelConsumption);
+				if(depleteInput(tLiquid)) { //Deplete that amount
+					boostEu = depleteInput(Materials.Oxygen.getGas(4L));
+					if(tFluids.contains(Materials.Lubricant.getFluid(2L))) { //Has lubricant?
+						//Deplete Lubricant. 2000L should = 1 hour of runtime (if baseEU = 2048)
+						if(mRuntime % 72 == 0 || mRuntime == 0) {
+							depleteInput(Materials.Lubricant.getFluid(boostEu ? 2 : 1));
 						}
 					}
+					else {
+						return false;
+					}
+
+					fuelValue = aFuel.mSpecialValue;
+					fuelRemaining = hatchFluid.amount; //Record available fuel
+					this.mEUt = mEfficiency < 2000 ? 0 : 2048; //Output 0 if startup is less than 20%
+					this.mProgresstime = 1;
+					this.mMaxProgresstime = 1;
+					this.mEfficiencyIncrease = 15;
+					return true;
 				}
 			}
 		}
-- 
cgit 


From 64d3f815ae02620dcbf5dbaa2091606f4335d086 Mon Sep 17 00:00:00 2001
From: D-Cysteine <54219287+D-Cysteine@users.noreply.github.com>
Date: Sat, 27 Nov 2021 02:28:10 -0700
Subject: Fix bug with failing to deplete lubricant

---
 ...techMetaTileEntity_LargeSemifluidGenerator.java | 70 ++++++++++++++--------
 1 file changed, 45 insertions(+), 25 deletions(-)

(limited to 'src/Java/gtPlusPlus/xmod')

diff --git a/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java b/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java
index dd5e5286b7..ee859ddf3c 100644
--- a/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java
+++ b/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java
@@ -90,38 +90,58 @@ public class GregtechMetaTileEntity_LargeSemifluidGenerator extends GregtechMeta
 	public boolean checkRecipe(ItemStack aStack) {
 		ArrayList<FluidStack> tFluids = getStoredFluids();
 
-		if(tFluids.size() > 0) { //Does input hatch have a semifluid fuel?
-			for (FluidStack hatchFluid : tFluids) { //Loops through hatches
-				GT_Recipe aFuel = GTPP_Recipe_Map.sSemiFluidLiquidFuels.findFuel(hatchFluid);
-				if (aFuel == null) {
-					// Not a valid semi-fluid fuel.
-					continue;
-				}
+		// Check for lubricant and oxygen first, so we can compute costs ahead of time.
+		// This will allow us to check costs without needing to actually try to deplete fluids
+		// (wasting earlier fluids in the check if later fluids turn out to be insufficient).
+		FluidStack lubricant = Materials.Lubricant.getFluid(0L);
+		FluidStack oxygen = Materials.Oxygen.getGas(0L);
+		for (FluidStack hatchFluid : tFluids) {
+			if (hatchFluid.isFluidEqual(lubricant)) {
+				lubricant.amount = Math.max(lubricant.amount, hatchFluid.amount);
+			} else if (hatchFluid.isFluidEqual(oxygen)) {
+				oxygen.amount = Math.max(oxygen.amount, hatchFluid.amount);
+			}
+		}
+		boostEu = oxygen.amount >= 4L;
+		long lubricantCost = boostEu ? 2L : 1L;
+		if (lubricant.amount < lubricantCost) {
+			return false;
+		}
+
+		for (FluidStack hatchFluid : tFluids) { //Loops through hatches
+			GT_Recipe aFuel = GTPP_Recipe_Map.sSemiFluidLiquidFuels.findFuel(hatchFluid);
+			if (aFuel == null) {
+				// Not a valid semi-fluid fuel.
+				continue;
+			}
 
-				fuelConsumption = boostEu ? (4096 / aFuel.mSpecialValue) : (2048 / aFuel.mSpecialValue); //Calc fuel consumption
-				FluidStack tLiquid = new FluidStack(hatchFluid.getFluid(), fuelConsumption);
-				if(depleteInput(tLiquid)) { //Deplete that amount
-					boostEu = depleteInput(Materials.Oxygen.getGas(4L));
-					if(tFluids.contains(Materials.Lubricant.getFluid(2L))) { //Has lubricant?
-						//Deplete Lubricant. 2000L should = 1 hour of runtime (if baseEU = 2048)
-						if(mRuntime % 72 == 0 || mRuntime == 0) {
-							depleteInput(Materials.Lubricant.getFluid(boostEu ? 2 : 1));
-						}
+			fuelConsumption = boostEu ? (4096 / aFuel.mSpecialValue) : (2048 / aFuel.mSpecialValue); //Calc fuel consumption
+			FluidStack tLiquid = new FluidStack(hatchFluid.getFluid(), fuelConsumption);
+			if(depleteInput(tLiquid)) { //Deplete that amount
+				// We checked beforehand, so both of these depletions should succeed.
+				// But check the return values anyway just to be safe.
+				if (boostEu) {
+					if (!depleteInput(Materials.Oxygen.getGas(4L))) {
+						return false;
 					}
-					else {
+				}
+				//Deplete Lubricant. 2000L should = 1 hour of runtime (if baseEU = 2048)
+				if(mRuntime % 72 == 0 || mRuntime == 0) {
+					if(!depleteInput(Materials.Lubricant.getFluid(lubricantCost))) {
 						return false;
 					}
-
-					fuelValue = aFuel.mSpecialValue;
-					fuelRemaining = hatchFluid.amount; //Record available fuel
-					this.mEUt = mEfficiency < 2000 ? 0 : 2048; //Output 0 if startup is less than 20%
-					this.mProgresstime = 1;
-					this.mMaxProgresstime = 1;
-					this.mEfficiencyIncrease = 15;
-					return true;
 				}
+
+				fuelValue = aFuel.mSpecialValue;
+				fuelRemaining = hatchFluid.amount; //Record available fuel
+				this.mEUt = mEfficiency < 2000 ? 0 : 2048; //Output 0 if startup is less than 20%
+				this.mProgresstime = 1;
+				this.mMaxProgresstime = 1;
+				this.mEfficiencyIncrease = 15;
+				return true;
 			}
 		}
+
 		this.mEUt = 0;
 		this.mEfficiency = 0;
 		return false;
-- 
cgit 


From e99a0e0cef774e2544497426e5834a26d46f45f8 Mon Sep 17 00:00:00 2001
From: D-Cysteine <54219287+D-Cysteine@users.noreply.github.com>
Date: Sat, 27 Nov 2021 03:37:48 -0700
Subject: Update output and efficiency to match tooltip

---
 .../production/GregtechMetaTileEntity_LargeSemifluidGenerator.java | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

(limited to 'src/Java/gtPlusPlus/xmod')

diff --git a/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java b/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java
index ee859ddf3c..283963ed88 100644
--- a/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java
+++ b/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java
@@ -115,7 +115,8 @@ public class GregtechMetaTileEntity_LargeSemifluidGenerator extends GregtechMeta
 				continue;
 			}
 
-			fuelConsumption = boostEu ? (4096 / aFuel.mSpecialValue) : (2048 / aFuel.mSpecialValue); //Calc fuel consumption
+			int newEUt = boostEu ? 4096 : 2048;
+			fuelConsumption = newEUt / aFuel.mSpecialValue; //Calc fuel consumption
 			FluidStack tLiquid = new FluidStack(hatchFluid.getFluid(), fuelConsumption);
 			if(depleteInput(tLiquid)) { //Deplete that amount
 				// We checked beforehand, so both of these depletions should succeed.
@@ -134,7 +135,7 @@ public class GregtechMetaTileEntity_LargeSemifluidGenerator extends GregtechMeta
 
 				fuelValue = aFuel.mSpecialValue;
 				fuelRemaining = hatchFluid.amount; //Record available fuel
-				this.mEUt = mEfficiency < 2000 ? 0 : 2048; //Output 0 if startup is less than 20%
+				this.mEUt = mEfficiency < 2000 ? 0 : newEUt; //Output 0 if startup is less than 20%
 				this.mProgresstime = 1;
 				this.mMaxProgresstime = 1;
 				this.mEfficiencyIncrease = 15;
@@ -286,7 +287,7 @@ public class GregtechMetaTileEntity_LargeSemifluidGenerator extends GregtechMeta
 	}
 
 	public int getMaxEfficiency(ItemStack aStack) {
-		return boostEu ? 20000 : 10000;
+		return boostEu ? 15000 : 10000;
 	}
 
 	@Override
-- 
cgit