aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/common/tileentities/machines/multi
diff options
context:
space:
mode:
authormiozune <miozune@gmail.com>2023-06-04 19:54:11 +0900
committerGitHub <noreply@github.com>2023-06-04 12:54:11 +0200
commitf046db94220c1b582175f858f07fd64e81e6e864 (patch)
tree217d79501c31b76db9d38a75ccaa1ee09d96117e /src/main/java/gregtech/common/tileentities/machines/multi
parent9e4456e39709d815ba28064620ff0290ac14151b (diff)
downloadGT5-Unofficial-f046db94220c1b582175f858f07fd64e81e6e864.tar.gz
GT5-Unofficial-f046db94220c1b582175f858f07fd64e81e6e864.tar.bz2
GT5-Unofficial-f046db94220c1b582175f858f07fd64e81e6e864.zip
Fix void protection not working with MB with custom output hatch field (#2051)
* Fix void protection not working with MB with custom output hatch field * forgot to filter * Add util method for DT-like structure
Diffstat (limited to 'src/main/java/gregtech/common/tileentities/machines/multi')
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DistillationTower.java6
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ElectricBlastFurnace.java70
2 files changed, 57 insertions, 19 deletions
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 5c23d6cc7b..e8443fbe88 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
@@ -32,6 +32,7 @@ import gregtech.api.enums.Textures;
import gregtech.api.enums.Textures.BlockIcons;
import gregtech.api.interfaces.IHatchElement;
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.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
@@ -278,6 +279,11 @@ public class GT_MetaTileEntity_DistillationTower extends
}
@Override
+ public List<? extends IFluidStore> getFluidOutputSlots(FluidStack[] toOutput) {
+ return getFluidOutputSlotsByLayer(toOutput, mOutputHatchesByLayer);
+ }
+
+ @Override
protected IAlignmentLimits getInitialAlignmentLimits() {
// don't rotate a freaking tower, it won't work
return (d, r, f) -> (d.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 && r.isNotRotated()
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 dbb934cb80..a7b845b5de 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
@@ -9,6 +9,11 @@ import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
import static gregtech.api.util.GT_StructureUtility.ofCoil;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
@@ -28,6 +33,7 @@ import gregtech.api.GregTech_API;
import gregtech.api.enums.HeatingCoilLevel;
import gregtech.api.enums.Materials;
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.metatileentity.implementations.*;
@@ -207,7 +213,7 @@ public class GT_MetaTileEntity_ElectricBlastFurnace extends
if (tRecipe == null) return false;
if (this.mHeatingCapacity < tRecipe.mSpecialValue) return false;
- if (!canOutputAll(tRecipe)) 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;
@@ -281,6 +287,16 @@ public class GT_MetaTileEntity_ElectricBlastFurnace extends
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) {
if (aTileEntity == null) return false;
IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
@@ -314,37 +330,53 @@ public class GT_MetaTileEntity_ElectricBlastFurnace extends
public boolean addOutput(FluidStack aLiquid) {
if (aLiquid == null) return false;
FluidStack tLiquid = aLiquid.copy();
- boolean isOutputPollution = false;
- for (FluidStack pollutionFluidStack : pollutionFluidStacks) {
- if (!tLiquid.isFluidEqual(pollutionFluidStack)) continue;
-
- isOutputPollution = true;
- break;
- }
ArrayList<GT_MetaTileEntity_Hatch_Output> tOutputHatches;
- if (isOutputPollution) {
+ if (isPollutionFluid(tLiquid)) {
tOutputHatches = this.mPollutionOutputHatches;
- int pollutionReduction = 0;
- for (GT_MetaTileEntity_Hatch_Muffler tHatch : mMufflerHatches) {
- if (!isValidMetaTileEntity(tHatch)) continue;
- pollutionReduction = 100 - tHatch.calculatePollutionReduction(100);
- break;
- }
- tLiquid.amount = tLiquid.amount * (pollutionReduction + 5) / 100;
+ multiplyPollutionFluidAmount(tLiquid);
} else {
tOutputHatches = this.mOutputHatches;
}
return dumpFluid(tOutputHatches, tLiquid, true) || dumpFluid(tOutputHatches, tLiquid, false);
}
+ protected boolean isPollutionFluid(@Nullable FluidStack fluidStack) {
+ if (fluidStack == null) return false;
+ for (FluidStack pollutionFluidStack : pollutionFluidStacks) {
+ if (!fluidStack.isFluidEqual(pollutionFluidStack)) continue;
+ return true;
+ }
+ return false;
+ }
+
@Override
- public String[] getInfoData() {
- int mPollutionReduction = 0;
+ public List<? extends IFluidStore> getFluidOutputSlots(FluidStack[] toOutput) {
+ if (Arrays.stream(toOutput)
+ .anyMatch(this::isPollutionFluid)) {
+ return filterValidMetaTileEntities(mPollutionOutputHatches);
+ }
+ return filterValidMetaTileEntities(mOutputHatches);
+ }
+
+ /**
+ * @return 100 -> all released to air, 0 -> all dumped to hatch
+ */
+ public int getPollutionReduction() {
+ int reduction = 100;
for (GT_MetaTileEntity_Hatch_Muffler tHatch : mMufflerHatches) {
if (!isValidMetaTileEntity(tHatch)) continue;
- mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction);
+ reduction = Math.min(tHatch.calculatePollutionReduction(100), reduction);
}
+ return reduction;
+ }
+
+ protected void multiplyPollutionFluidAmount(@Nonnull FluidStack fluid) {
+ fluid.amount = fluid.amount * Math.min(100 - getPollutionReduction() + 5, 100) / 100;
+ }
+ @Override
+ public String[] getInfoData() {
+ int mPollutionReduction = getPollutionReduction();
long storedEnergy = 0;
long maxEnergy = 0;
for (GT_MetaTileEntity_Hatch_Energy tHatch : mEnergyHatches) {