diff --git a/src/main/java/gregtech/GT_Mod.java b/src/main/java/gregtech/GT_Mod.java index 081589db..10f1860e 100644 --- a/src/main/java/gregtech/GT_Mod.java +++ b/src/main/java/gregtech/GT_Mod.java @@ -227,6 +227,7 @@ public class GT_Mod implements IGT_Mod { gregtechproxy.mIncreaseDungeonLoot = tMainConfig.get(aTextGeneral, "IncreaseDungeonLoot", true).getBoolean(true); gregtechproxy.mAxeWhenAdventure = tMainConfig.get(aTextGeneral, "AdventureModeStartingAxe", true).getBoolean(true); gregtechproxy.mHardcoreCables = tMainConfig.get(aTextGeneral, "HardCoreCableLoss", false).getBoolean(false); + gregtechproxy.mSmallLavaBoilerEfficiencyLoss = tMainConfig.get(aTextGeneral, "SmallLavaBoilerEfficiencyLoss", true).getBoolean(true); gregtechproxy.mSurvivalIntoAdventure = tMainConfig.get(aTextGeneral, "forceAdventureMode", false).getBoolean(false); gregtechproxy.mHungerEffect = tMainConfig.get(aTextGeneral, "AFK_Hunger", false).getBoolean(false); gregtechproxy.mHardRock = tMainConfig.get(aTextGeneral, "harderstone", false).getBoolean(false); diff --git a/src/main/java/gregtech/common/GT_Proxy.java b/src/main/java/gregtech/common/GT_Proxy.java index 3abe2374..201e7bb6 100644 --- a/src/main/java/gregtech/common/GT_Proxy.java +++ b/src/main/java/gregtech/common/GT_Proxy.java @@ -132,6 +132,7 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler { private final DateFormat mDateFormat = DateFormat.getInstance(); public ArrayList mBufferedPlayerActivity = new ArrayList(); public boolean mHardcoreCables = false; + public boolean mSmallLavaBoilerEfficiencyLoss = true; public boolean mDisableVanillaOres = true; public boolean mNerfStorageBlocks = true; public boolean mHardMachineCasings = true; diff --git a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Lava.java b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Lava.java index 352a9c66..9c8d09b9 100644 --- a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Lava.java +++ b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Lava.java @@ -1,5 +1,6 @@ package gregtech.common.tileentities.boilers; +import gregtech.GT_Mod; import gregtech.api.enums.Dyes; import gregtech.api.enums.Materials; import gregtech.api.enums.OrePrefixes; @@ -10,10 +11,12 @@ import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.objects.GT_RenderedTexture; import gregtech.api.util.GT_ModHandler; import gregtech.api.util.GT_OreDictUnificator; +import gregtech.api.util.GT_Utility; import gregtech.common.GT_Pollution; import gregtech.common.gui.GT_Container_Boiler; import gregtech.common.gui.GT_GUIContainer_Boiler; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.item.ItemStack; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidHandler; @@ -24,6 +27,8 @@ public class GT_MetaTileEntity_Boiler_Lava super(aID, aName, aNameRegional, new String[]{ "A Boiler running off Lava", "Produces 600L of Steam per second", + "Drops to 200L of Steam per second as byproduct slot fills", + "Clean out byproducts to keep efficiency high", "Causes 20 Pollution per second"}); } @@ -96,13 +101,37 @@ public class GT_MetaTileEntity_Boiler_Lava aBaseMetaTileEntity.doExplosion(2048L); return; } - this.mFluid.amount -= 1; + + int maxOutput = 300; + int minOutput = 100; + + double efficiency = 1.0; + + if (GT_Mod.gregtechproxy.mSmallLavaBoilerEfficiencyLoss) { + ItemStack byproductStack = aBaseMetaTileEntity.getStackInSlot(3); + + if (byproductStack != null && !(GT_Utility.isStackInvalid(byproductStack))) { + // Efficiency drops from 100% when there is no byproduct, + // to 0% when there is a full stack of byproduct + efficiency = 1.0 - (double) byproductStack.stackSize / (double) byproductStack.getMaxStackSize(); + } + } + + //Decrease water amount in proportion to steam production + //Can't decrease by a fraction, as fluid amounts are integers, so need to decrease randomly so expected amount consumed is correct + if(aBaseMetaTileEntity.getRandomNumber(100) < Math.round(efficiency * 100.0)) { + this.mFluid.amount -= 1; + } + + //Steam output drops from maxOutput when efficiency is 100% to minOutput when efficiency is 0% + long output = (minOutput + Math.round((double) (maxOutput - minOutput) * efficiency)); + if (this.mSteam == null) { - this.mSteam = GT_ModHandler.getSteam(300L); + this.mSteam = GT_ModHandler.getSteam(output); } else if (GT_ModHandler.isSteam(this.mSteam)) { - this.mSteam.amount += 300; + this.mSteam.amount += output; } else { - this.mSteam = GT_ModHandler.getSteam(300L); + this.mSteam = GT_ModHandler.getSteam(output); } } } else { @@ -117,12 +146,20 @@ public class GT_MetaTileEntity_Boiler_Lava if ((this.mProcessingEnergy <= 0) && (aBaseMetaTileEntity.isAllowedToWork()) && (GT_OreDictUnificator.isItemStackInstanceOf(this.mInventory[2], OrePrefixes.bucket.get(Materials.Lava)))) { this.mProcessingEnergy += 1000; - aBaseMetaTileEntity.decrStackSize(2, 1); - aBaseMetaTileEntity.addStackToSlot(3, GT_OreDictUnificator.get(OrePrefixes.bucket, Materials.Empty, 1L)); + //Either we only had one bucket of lava in the input, and this is fine, or we had a stack of lava buckets. + //Those can only stack when cheating, so we don't care about voiding them as we can just cheat in more + aBaseMetaTileEntity.setInventorySlotContents(2, GT_OreDictUnificator.get(OrePrefixes.bucket, Materials.Empty, 1L)); } if ((this.mTemperature < 1000) && (this.mProcessingEnergy > 0) && (aTick % 8L == 0L)) { this.mProcessingEnergy -= 3; this.mTemperature += 1; + if (aBaseMetaTileEntity.getRandomNumber(333) == 0) { + //Produce one byproduct on average every one bucket of lava + if(!aBaseMetaTileEntity.addStackToSlot(3, GT_OreDictUnificator.get(OrePrefixes.dustImpure, Materials.Stone, 1L))) { + //If the output slot had something in it already, stick one dust in: + aBaseMetaTileEntity.setInventorySlotContents(3, GT_OreDictUnificator.get(OrePrefixes.dustImpure, Materials.Stone, 1)); + } + } } if (this.mProcessingEnergy > 0 && (aTick % 20L == 0L)) {