From 6ca4c1ce4b0ecaefac92bee0599f3075f51b0329 Mon Sep 17 00:00:00 2001 From: Glease <4586901+Glease@users.noreply.github.com> Date: Mon, 19 Dec 2022 14:39:08 +0800 Subject: add LaSEr overclock --- src/main/java/net/glease/ggfab/GGUtils.java | 39 ----------- .../java/net/glease/ggfab/mte/MTE_AdvAssLine.java | 78 ++++++++++------------ src/main/java/net/glease/ggfab/util/GGUtils.java | 39 +++++++++++ .../net/glease/ggfab/util/OverclockHelper.java | 71 ++++++++++++++++++++ 4 files changed, 146 insertions(+), 81 deletions(-) delete mode 100644 src/main/java/net/glease/ggfab/GGUtils.java create mode 100644 src/main/java/net/glease/ggfab/util/GGUtils.java create mode 100644 src/main/java/net/glease/ggfab/util/OverclockHelper.java (limited to 'src/main/java') diff --git a/src/main/java/net/glease/ggfab/GGUtils.java b/src/main/java/net/glease/ggfab/GGUtils.java deleted file mode 100644 index ea34952971..0000000000 --- a/src/main/java/net/glease/ggfab/GGUtils.java +++ /dev/null @@ -1,39 +0,0 @@ -package net.glease.ggfab; - -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import net.minecraft.util.ChunkCoordinates; -import net.minecraftforge.common.util.ForgeDirection; - -import java.util.StringJoiner; - -public class GGUtils { - public static boolean isValidTile(IGregTechTileEntity tile) { - return tile != null && !tile.isDead() && tile.getMetaTileEntity() != null && tile.getMetaTileEntity().getBaseMetaTileEntity() == tile; - } - public static boolean isValidTile(IMetaTileEntity mte) { - return mte != null && mte.getBaseMetaTileEntity() != null && mte.getBaseMetaTileEntity().getMetaTileEntity() == mte && !mte.getBaseMetaTileEntity().isDead(); - } - public static ChunkCoordinates translate(ChunkCoordinates origin, ForgeDirection direction) { - return new ChunkCoordinates(origin.posX + direction.offsetX, origin.posY + direction.offsetY, origin.posZ + direction.offsetZ); - } - - public static String formatTileInfo(String prefix, IMetaTileEntity mte, String delimiter, String suffix) { - if (!isValidTile(mte)) return prefix + "N/A" + suffix; - StringJoiner sj = new StringJoiner(delimiter, prefix, suffix); - IGregTechTileEntity til = mte.getBaseMetaTileEntity(); - sj.add(String.valueOf(til.getXCoord())); - sj.add(String.valueOf(til.getYCoord())); - sj.add(String.valueOf(til.getZCoord())); - return sj.toString(); - } - - public static String formatTileInfo(String prefix, IGregTechTileEntity tile, String delimiter, String suffix) { - if (!isValidTile(tile)) return prefix + "N/A" + suffix; - StringJoiner sj = new StringJoiner(delimiter, prefix, suffix); - sj.add(String.valueOf(tile.getXCoord())); - sj.add(String.valueOf(tile.getYCoord())); - sj.add(String.valueOf(tile.getZCoord())); - return sj.toString(); - } -} diff --git a/src/main/java/net/glease/ggfab/mte/MTE_AdvAssLine.java b/src/main/java/net/glease/ggfab/mte/MTE_AdvAssLine.java index bd533b29c8..58aacf178c 100644 --- a/src/main/java/net/glease/ggfab/mte/MTE_AdvAssLine.java +++ b/src/main/java/net/glease/ggfab/mte/MTE_AdvAssLine.java @@ -1,6 +1,5 @@ package net.glease.ggfab.mte; -import com.google.common.collect.Collections2; import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; @@ -18,6 +17,7 @@ import gregtech.api.util.*; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; import net.glease.ggfab.GGConstants; +import net.glease.ggfab.util.OverclockHelper; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; @@ -49,7 +49,7 @@ Dev note: 1. This multi will be an assline but with greater throughput. it will take one input every 2. */ -public class MTE_AdvAssLine extends GT_MetaTileEntity_EnhancedMultiBlockBase implements ISurvivalConstructable { +public class MTE_AdvAssLine extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase implements ISurvivalConstructable { private static final String STRUCTURE_PIECE_FIRST = "first"; private static final String STRUCTURE_PIECE_LATER = "later"; private static final String STRUCTURE_PIECE_LAST = "last"; @@ -123,12 +123,12 @@ public class MTE_AdvAssLine extends GT_MetaTileEntity_EnhancedMultiBlockBase mDataAccessHatches = new ArrayList<>(); - private final Collection allEnergyHatchesView = Collections2.filter(new ConcatList<>(mExoticEnergyHatches, mEnergyHatches), GT_MetaTileEntity_MultiBlockBase::isValidMetaTileEntity); - public MTE_AdvAssLine(int aID, String aName, String aNameRegional) { super(aID, aName, aNameRegional); } @@ -200,7 +200,7 @@ public class MTE_AdvAssLine extends GT_MetaTileEntity_EnhancedMultiBlockBase l = MinecraftServer.getServer().getConfigurationManager().playerEntityList; for (EntityPlayerMP p : l) { if (p.getUniqueID().equals(ownerUuid)) { - for (int i = 0; i < 7; i++) { + for (int i = 0; i < 9; i++) { p.addChatMessage(new ChatComponentTranslation("ggfab.info.advassline." + i)); } } @@ -365,12 +365,9 @@ public class MTE_AdvAssLine extends GT_MetaTileEntity_EnhancedMultiBlockBase extends AbstractList { - private final List la, lb; - - public ConcatList(List la, List lb) { - this.la = la; - this.lb = lb; - } - - @Override - public T get(int index) { - int lasize = la.size(); - return index < lasize ? la.get(index) : lb.get(index - lasize); - } - - @Override - public int size() { - return la.size() + lb.size(); - } - - @Override - public T remove(int index) { - int lasize = la.size(); - return index < lasize ? la.remove(index) : lb.remove(index - lasize); - } - } } diff --git a/src/main/java/net/glease/ggfab/util/GGUtils.java b/src/main/java/net/glease/ggfab/util/GGUtils.java new file mode 100644 index 0000000000..1f47c82885 --- /dev/null +++ b/src/main/java/net/glease/ggfab/util/GGUtils.java @@ -0,0 +1,39 @@ +package net.glease.ggfab.util; + +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import net.minecraft.util.ChunkCoordinates; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.StringJoiner; + +public class GGUtils { + public static boolean isValidTile(IGregTechTileEntity tile) { + return tile != null && !tile.isDead() && tile.getMetaTileEntity() != null && tile.getMetaTileEntity().getBaseMetaTileEntity() == tile; + } + public static boolean isValidTile(IMetaTileEntity mte) { + return mte != null && mte.getBaseMetaTileEntity() != null && mte.getBaseMetaTileEntity().getMetaTileEntity() == mte && !mte.getBaseMetaTileEntity().isDead(); + } + public static ChunkCoordinates translate(ChunkCoordinates origin, ForgeDirection direction) { + return new ChunkCoordinates(origin.posX + direction.offsetX, origin.posY + direction.offsetY, origin.posZ + direction.offsetZ); + } + + public static String formatTileInfo(String prefix, IMetaTileEntity mte, String delimiter, String suffix) { + if (!isValidTile(mte)) return prefix + "N/A" + suffix; + StringJoiner sj = new StringJoiner(delimiter, prefix, suffix); + IGregTechTileEntity til = mte.getBaseMetaTileEntity(); + sj.add(String.valueOf(til.getXCoord())); + sj.add(String.valueOf(til.getYCoord())); + sj.add(String.valueOf(til.getZCoord())); + return sj.toString(); + } + + public static String formatTileInfo(String prefix, IGregTechTileEntity tile, String delimiter, String suffix) { + if (!isValidTile(tile)) return prefix + "N/A" + suffix; + StringJoiner sj = new StringJoiner(delimiter, prefix, suffix); + sj.add(String.valueOf(tile.getXCoord())); + sj.add(String.valueOf(tile.getYCoord())); + sj.add(String.valueOf(tile.getZCoord())); + return sj.toString(); + } +} diff --git a/src/main/java/net/glease/ggfab/util/OverclockHelper.java b/src/main/java/net/glease/ggfab/util/OverclockHelper.java new file mode 100644 index 0000000000..7d0699a298 --- /dev/null +++ b/src/main/java/net/glease/ggfab/util/OverclockHelper.java @@ -0,0 +1,71 @@ +package net.glease.ggfab.util; + +import gregtech.api.util.GT_Utility; + +public class OverclockHelper { + public static OverclockOutput normalOverclock(long recipeEUt, int duration, long inputVoltage, boolean perfectOC) { + if (recipeEUt > inputVoltage) return null; + int recipeTier = Math.max(1, GT_Utility.getTier(recipeEUt)); // ULV no overclock + int machineTier = GT_Utility.getTier(inputVoltage); + int shift = perfectOC ? 2 : 1; + while (recipeTier < machineTier && duration > 1) { + duration >>= shift; + recipeEUt <<= 2; + recipeTier++; + } + return new OverclockOutput(recipeEUt, duration); + } + + public static OverclockOutput laserOverclock(long recipeEUt, int duration, long inputEUt, float penaltyIncreaseFactor) { + if (recipeEUt > inputEUt) return null; + float currentPenalty = 4 + penaltyIncreaseFactor; + // 2/(n+k) overclock until energy hatch is crying + while (recipeEUt * currentPenalty < inputEUt && duration > 1) { + duration >>= 1; + recipeEUt *= currentPenalty; + currentPenalty += penaltyIncreaseFactor; + } + return new OverclockOutput(recipeEUt, duration); + } + + public static final class OverclockOutput { + private final long mEUt; + private final int mDuration; + + public OverclockOutput(long aEUt, int aDuration) { + this.mEUt = aEUt; + this.mDuration = aDuration; + } + + public long getEUt() { + return mEUt; + } + + public int getDuration() { + return mDuration; + } + + @Override + public String toString() { + return mEUt + "@" + mDuration + "ticks"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof OverclockOutput)) return false; + + OverclockOutput that = (OverclockOutput) o; + + if (mEUt != that.mEUt) return false; + return mDuration == that.mDuration; + } + + @Override + public int hashCode() { + int result = (int) (mEUt ^ (mEUt >>> 32)); + result = 31 * result + mDuration; + return result; + } + } +} -- cgit