From f046db94220c1b582175f858f07fd64e81e6e864 Mon Sep 17 00:00:00 2001 From: miozune Date: Sun, 4 Jun 2023 19:54:11 +0900 Subject: 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 --- .../multi/GT_MetaTileEntity_DistillationTower.java | 6 ++ .../GT_MetaTileEntity_ElectricBlastFurnace.java | 70 ++++++++++++++++------ 2 files changed, 57 insertions(+), 19 deletions(-) (limited to 'src/main/java/gregtech/common/tileentities/machines/multi') 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; @@ -277,6 +278,11 @@ public class GT_MetaTileEntity_DistillationTower extends .add(tHatch); } + @Override + public List getFluidOutputSlots(FluidStack[] toOutput) { + return getFluidOutputSlotsByLayer(toOutput, mOutputHatchesByLayer); + } + @Override protected IAlignmentLimits getInitialAlignmentLimits() { // don't rotate a freaking tower, it won't work 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 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 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) { -- cgit