aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/metatileentity
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api/metatileentity')
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/MTEExtendedPowerMultiBlockBase.java8
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/MTEHatchMuffler.java17
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/MTEMultiBlockBase.java84
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
+ " %" };
}