diff options
Diffstat (limited to 'src/main/java/gregtech/api/metatileentity/implementations')
3 files changed, 76 insertions, 33 deletions
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEExtendedPowerMultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEExtendedPowerMultiBlockBase.java index 09bfda2d0a..9ff7f34fe3 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/MTEExtendedPowerMultiBlockBase.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEExtendedPowerMultiBlockBase.java @@ -2,7 +2,6 @@ package gregtech.api.metatileentity.implementations; import static gregtech.api.enums.GTValues.VN; import static gregtech.api.util.GTUtility.filterValidMTEs; -import static gregtech.api.util.GTUtility.validMTEList; import java.util.ArrayList; import java.util.List; @@ -138,11 +137,6 @@ public abstract class MTEExtendedPowerMultiBlockBase<T extends MTEEnhancedMultiB @Override public String[] getInfoData() { - int mPollutionReduction = 0; - for (MTEHatchMuffler tHatch : validMTEList(mMufflerHatches)) { - mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction); - } - long storedEnergy = 0; long maxEnergy = 0; for (MTEHatch tHatch : getExoticAndNormalEnergyHatchList()) { @@ -203,7 +197,7 @@ public abstract class MTEExtendedPowerMultiBlockBase<T extends MTEEnhancedMultiB + " %", /* 6 */ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " + EnumChatFormatting.GREEN - + mPollutionReduction + + getAveragePollutionPercentage() + EnumChatFormatting.RESET + " %" }; } diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMuffler.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMuffler.java index 576389de80..d1c957b976 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMuffler.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMuffler.java @@ -194,15 +194,24 @@ public class MTEHatchMuffler extends MTEHatch { } /** - * @param mte The multi-block controller's {@link MetaTileEntity} MetaTileEntity is passed so newer muffler hatches - * can do wacky things with the multis + * @param mte The multi-block controller's {@link MetaTileEntity} MetaTileEntity is passed so newer + * muffler hatches can do wacky things with the multis + * @param pollutionAmount How much pollution to output. Reduced by muffler efficiency. * @return pollution success */ - public boolean polluteEnvironment(MetaTileEntity mte) { + public boolean polluteEnvironment(MetaTileEntity mte, int pollutionAmount) { if (getBaseMetaTileEntity().getAirAtSide(getBaseMetaTileEntity().getFrontFacing())) { - Pollution.addPollution(getBaseMetaTileEntity(), calculatePollutionReduction(10000)); + Pollution.addPollution(getBaseMetaTileEntity(), calculatePollutionReduction(pollutionAmount)); return true; } return false; } + + /** + * @deprecated Use {@link #polluteEnvironment(MetaTileEntity, int)}. + */ + @Deprecated + public boolean polluteEnvironment(MetaTileEntity mte) { + return polluteEnvironment(mte, 10000); + } } diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEMultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEMultiBlockBase.java index 0550e8da7d..1e29d797a4 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/MTEMultiBlockBase.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEMultiBlockBase.java @@ -632,23 +632,73 @@ public abstract class MTEMultiBlockBase extends MetaTileEntity } public boolean polluteEnvironment(int aPollutionLevel) { + final int VENT_AMOUNT = 10_000; // Early exit if pollution is disabled if (!GTMod.gregtechproxy.mPollution) return true; mPollution += aPollutionLevel; - if (mPollution < 10000) return true; - var validMufflers = new ArrayList<MTEHatchMuffler>(mMufflerHatches.size()); - validMTEList(mMufflerHatches).forEach(validMufflers::add); - Collections.shuffle(validMufflers); - for (MTEHatchMuffler tHatch : validMufflers) { - if (mPollution >= 10000) { - if (tHatch.polluteEnvironment(this)) { - mPollution -= 10000; - } + if (mPollution < VENT_AMOUNT) return true; + if (mMufflerHatches.size() == 0) { + // No muffler present. Fail. + return false; + } else if (mMufflerHatches.size() == 1) { + // One muffler, use simple method for performance. + MTEHatchMuffler muffler = mMufflerHatches.get(0); + if (muffler == null || !muffler.isValid()) { + // Muffler invalid. Fail. + mMufflerHatches.remove(0); + return false; } else { - break; + if (muffler.polluteEnvironment(this, VENT_AMOUNT)) { + mPollution -= VENT_AMOUNT; + } else { + // Muffler blocked. Fail. + return false; + } } + } else { + // Multiple mufflers, split pollution output evenly between all of them. + int mufflerCount = 0; + int ventAmount = 0; // Allow venting of up to VENT_AMOUNT of pollution per muffler. + for (MTEHatchMuffler muffler : validMTEList(mMufflerHatches)) { + mufflerCount++; + if (ventAmount + VENT_AMOUNT <= mPollution) { + ventAmount += VENT_AMOUNT; + } + } + // This might lose some small amount of pollution due to rounding, this is fine. + ventAmount /= mufflerCount; + + for (MTEHatchMuffler muffler : validMTEList(mMufflerHatches)) { + if (muffler.polluteEnvironment(this, ventAmount)) { + mPollution -= ventAmount; + } else { + // Muffler blocked. Fail. + return false; + } + } + } + return mPollution < VENT_AMOUNT; + } + + /** + * How much pollution this outputs to the environment. 100 = outputs all, 0 = outputs none. Calculated as an average + * across all muffler hatches. + * + * @return Fraction of pollution output to the environment (out of 100). + */ + public int getAveragePollutionPercentage() { + int pollutionPercent = 0; + int mufflerCount = 0; + for (MTEHatchMuffler muffler : validMTEList(mMufflerHatches)) { + pollutionPercent += muffler.calculatePollutionReduction(100); + mufflerCount++; + } + if (mufflerCount > 0) { + pollutionPercent /= mufflerCount; + } else { + pollutionPercent = 100; } - return mPollution < 10000; + return pollutionPercent; } protected void sendStartMultiBlockSoundLoop() { @@ -1826,16 +1876,6 @@ public abstract class MTEMultiBlockBase extends MetaTileEntity @Override public String[] getInfoData() { - int mPollutionReduction = 0; - var validMufflers = new ArrayList<MTEHatchMuffler>(mMufflerHatches.size()); - validMTEList(mMufflerHatches).forEach(validMufflers::add); - if (validMufflers.size() > 0) { - for (MTEHatchMuffler tHatch : validMufflers) { - mPollutionReduction += tHatch.calculatePollutionReduction(100); - } - mPollutionReduction /= validMufflers.size(); - } - long storedEnergy = 0; long maxEnergy = 0; for (MTEHatchEnergy tHatch : validMTEList(mEnergyHatches)) { @@ -1891,7 +1931,7 @@ public abstract class MTEMultiBlockBase extends MetaTileEntity + " %", /* 6 */ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": " + EnumChatFormatting.GREEN - + mPollutionReduction + + getAveragePollutionPercentage() + EnumChatFormatting.RESET + " %" }; } |