diff options
author | miozune <miozune@gmail.com> | 2023-06-04 19:54:11 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-04 12:54:11 +0200 |
commit | f046db94220c1b582175f858f07fd64e81e6e864 (patch) | |
tree | 217d79501c31b76db9d38a75ccaa1ee09d96117e /src/main/java/gregtech/common/tileentities/machines/multi | |
parent | 9e4456e39709d815ba28064620ff0290ac14151b (diff) | |
download | GT5-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')
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) { |