aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/kubatech
diff options
context:
space:
mode:
authorJakub <53441451+kuba6000@users.noreply.github.com>2022-10-02 19:51:28 +0200
committerGitHub <noreply@github.com>2022-10-02 19:51:28 +0200
commit89eccf0728b9b2175c68036ead3408b359c2981c (patch)
tree2b25dc6b165ca8a64391a21806ca792051205957 /src/main/java/kubatech
parent697d8932b67b4c6fb5f698c4b72e004f518adc46 (diff)
downloadGT5-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')
-rw-r--r--src/main/java/kubatech/api/helpers/GTHelper.java53
-rw-r--r--src/main/java/kubatech/nei/Mob_Handler.java2
-rw-r--r--src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java17
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);