diff options
author | Jakub <53441451+kuba6000@users.noreply.github.com> | 2022-10-02 19:51:28 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-02 19:51:28 +0200 |
commit | 89eccf0728b9b2175c68036ead3408b359c2981c (patch) | |
tree | 2b25dc6b165ca8a64391a21806ca792051205957 /src/main/java/kubatech | |
parent | 697d8932b67b4c6fb5f698c4b72e004f518adc46 (diff) | |
download | GT5-Unofficial-89eccf0728b9b2175c68036ead3408b359c2981c.tar.gz GT5-Unofficial-89eccf0728b9b2175c68036ead3408b359c2981c.tar.bz2 GT5-Unofficial-89eccf0728b9b2175c68036ead3408b359c2981c.zip |
Allow Extreme Extermination Chamber to overclock past 1 tick (#25)
* Revert "Shift outputs when needed"
This reverts commit e476c41e8956a61de6e1d962c9bb40948db8c2b5.
* OC past 1 tick
* Fix
* ok
* Ye
* info
Diffstat (limited to 'src/main/java/kubatech')
3 files changed, 64 insertions, 8 deletions
diff --git a/src/main/java/kubatech/api/helpers/GTHelper.java b/src/main/java/kubatech/api/helpers/GTHelper.java new file mode 100644 index 0000000000..bf2b28ff79 --- /dev/null +++ b/src/main/java/kubatech/api/helpers/GTHelper.java @@ -0,0 +1,53 @@ +package kubatech.api.helpers; + +import static gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase.isValidMetaTileEntity; + +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase; +import java.util.ArrayList; +import java.util.Arrays; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +public class GTHelper { + + private static final double ln4 = Math.log(4d); + + public static int calculateOverclockedNessMulti( + GT_MetaTileEntity_MultiBlockBase mte, long aEUt, int aDuration, boolean perfect) { + final long maxInputVoltage = getMaxInputEU(mte); + final int tiers = (int) (Math.log((double) maxInputVoltage / (double) aEUt) / ln4); + if (tiers <= 0) { + mte.mEUt = (int) aEUt; + mte.mMaxProgresstime = aDuration; + return 0; + } + mte.mEUt = (int) (aEUt << (tiers << 1)); + int dMulti = 1; + final int aDurationModifier = perfect ? 2 : 1; + for (int i = 0; i < tiers; i++) + if (aDuration > 1) aDuration >>= aDurationModifier; + else dMulti <<= aDurationModifier; + if (dMulti > 1) { + final ArrayList<ItemStack> stacks = new ArrayList<>(Arrays.asList(mte.mOutputItems)); + for (ItemStack mOutputItem : mte.mOutputItems) { + mOutputItem.stackSize *= dMulti; + int maxSize = mOutputItem.getMaxStackSize(); + while (mOutputItem.stackSize > maxSize) + stacks.add(mOutputItem.splitStack(Math.min(mOutputItem.stackSize - maxSize, maxSize))); + } + if (stacks.size() != mte.mOutputItems.length) mte.mOutputItems = stacks.toArray(new ItemStack[0]); + for (FluidStack mOutputFluid : mte.mOutputFluids) mOutputFluid.amount *= dMulti; + } + if (aDuration <= 0) aDuration = 1; + mte.mMaxProgresstime = aDuration; + return tiers; + } + + public static long getMaxInputEU(GT_MetaTileEntity_MultiBlockBase mte) { + long rEU = 0; + for (GT_MetaTileEntity_Hatch_Energy tHatch : mte.mEnergyHatches) + if (isValidMetaTileEntity(tHatch)) rEU += tHatch.maxEUInput() * tHatch.maxAmperesIn(); + return rEU; + } +} diff --git a/src/main/java/kubatech/nei/Mob_Handler.java b/src/main/java/kubatech/nei/Mob_Handler.java index bdfda0202f..3031b2ccf8 100644 --- a/src/main/java/kubatech/nei/Mob_Handler.java +++ b/src/main/java/kubatech/nei/Mob_Handler.java @@ -392,7 +392,7 @@ public class Mob_Handler extends TemplateRecipeHandler { } x = 6; - y = Math.max(83, 83 + (y - 67)); + y = 83; yshift = nextRowYShift; if (currentrecipe.normalOutputsCount > 0) { GuiDraw.drawString(NORMAL_DROPS.get(), x, y, 0xFF555555, false); diff --git a/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java b/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java index 7e64f81c5c..030be98581 100644 --- a/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java +++ b/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java @@ -60,6 +60,7 @@ import java.util.HashMap; import java.util.Random; import kubatech.Tags; import kubatech.api.LoaderReference; +import kubatech.api.helpers.GTHelper; import kubatech.api.helpers.ReflectionHelper; import kubatech.api.network.CustomTileEntityPacket; import kubatech.api.tileentity.CustomTileEntityPacketHandler; @@ -213,6 +214,7 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber .addInfo("Spawns and Exterminates monsters for you") .addInfo("You have to insert the powered spawner in controller") .addInfo("Base energy usage: 2,000 EU/t") + .addInfo("Supports perfect OC and past 1 tick (multiplies outputs)") .addInfo("Recipe time is based on mob health") .addInfo("You can additionally put a weapon to the ULV input bus") .addInfo("It will speed up the process and apply looting level from the weapon") @@ -472,11 +474,14 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber && this.getBaseMetaTileEntity().getWorld().difficultySetting == EnumDifficulty.PEACEFUL) return false; if (isInRitualMode && isRitualValid()) { - this.mMaxProgresstime = 400; - this.mEUt /= 4; + if (getMaxInputVoltage() < recipe.mEUt / 4) return false; this.mOutputFluids = new FluidStack[] {FluidRegistry.getFluidStack("xpjuice", 5000)}; this.mOutputItems = recipe.generateOutputs(rand, this, 3, 0, mIsProducingInfernalDrops); + this.mEUt /= 4; + this.mMaxProgresstime = 400; } else { + if (getMaxInputVoltage() < recipe.mEUt) return false; + double attackDamage = DIAMOND_SPIKES_DAMAGE; // damage from spikes GT_MetaTileEntity_Hatch_InputBus inputbus = this.mInputBusses.size() == 0 ? null : this.mInputBusses.get(0); if (inputbus != null && !isValidMetaTileEntity(inputbus)) inputbus = null; @@ -510,19 +515,17 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber this.mOutputItems = recipe.generateOutputs( rand, this, attackDamage, weaponCache.isValid ? weaponCache.looting : 0, mIsProducingInfernalDrops); - int eut = this.mEUt; - calculatePerfectOverclockedNessMulti(this.mEUt, this.mMaxProgresstime, 2, getMaxInputVoltage()); + this.mOutputFluids = new FluidStack[] {FluidRegistry.getFluidStack("xpjuice", 120)}; + int times = GTHelper.calculateOverclockedNessMulti(this, this.mEUt, this.mMaxProgresstime, true); //noinspection ConstantConditions if (weaponCache.isValid && lootingholder.isItemStackDamageable()) { - do { + for (int i = 0; i < times + 1; i++) if (lootingholder.attemptDamageItem(1, rand)) { //noinspection ConstantConditions inputbus.setInventorySlotContents(0, null); break; } - } while ((eut <<= 2) < this.mEUt); } - this.mOutputFluids = new FluidStack[] {FluidRegistry.getFluidStack("xpjuice", 120)}; } if (this.mEUt > 0) this.mEUt = -this.mEUt; this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000); |