aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/common/covers
diff options
context:
space:
mode:
authorquerns <33518699+querns@users.noreply.github.com>2023-10-09 09:55:31 -0500
committerGitHub <noreply@github.com>2023-10-09 16:55:31 +0200
commitdff250c6d32156270b9a39137346a2b3767cb4a2 (patch)
treec3ad948b6aa9e5b9edefde7e4517e9b78be7d2fe /src/main/java/gregtech/common/covers
parent45566b43ee5d8b8f75170916530fd884e0ff74db (diff)
downloadGT5-Unofficial-dff250c6d32156270b9a39137346a2b3767cb4a2.tar.gz
GT5-Unofficial-dff250c6d32156270b9a39137346a2b3767cb4a2.tar.bz2
GT5-Unofficial-dff250c6d32156270b9a39137346a2b3767cb4a2.zip
Allows covers to be configured to tick more slowly (#2307)
* Right clicking covers with a jackhammer will now make them tick more slowly * Interim commit, switching tasks * Finishes tick rate button in cover UIs * Change tick rate multiplier to a tick rate addition * Missed one number in the multiplier -> addition conversion * Hold Ctrl to adjust tick rate by 5 steps per click, move button closer to corner of cover GUI * Adjust how holding Ctrl computes tick rate change, remove gray formatting option for tick rate formatter * Cover tick rate addition can now be prevented per-cover-behavior, minor code tweaks
Diffstat (limited to 'src/main/java/gregtech/common/covers')
-rw-r--r--src/main/java/gregtech/common/covers/CoverInfo.java90
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java5
2 files changed, 93 insertions, 2 deletions
diff --git a/src/main/java/gregtech/common/covers/CoverInfo.java b/src/main/java/gregtech/common/covers/CoverInfo.java
index 0fac00218c..7f45085ead 100644
--- a/src/main/java/gregtech/common/covers/CoverInfo.java
+++ b/src/main/java/gregtech/common/covers/CoverInfo.java
@@ -7,6 +7,7 @@ import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.StatCollector;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
@@ -19,11 +20,15 @@ import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.tileentity.ICoverable;
import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_Utility;
import gregtech.api.util.ISerializableObject;
public final class CoverInfo {
- private static final String NBT_SIDE = "s", NBT_ID = "id", NBT_DATA = "d";
+ private static final String NBT_SIDE = "s", NBT_ID = "id", NBT_DATA = "d", NBT_TICK_RATE_ADDITION = "tra";
+
+ // One minute
+ public static final int MAX_TICK_RATE_ADDITION = 1200;
public static final CoverInfo EMPTY_INFO = new CoverInfo(ForgeDirection.UNKNOWN, null);
private final ForgeDirection coverSide;
@@ -33,6 +38,8 @@ public final class CoverInfo {
private final WeakReference<ICoverable> coveredTile;
private boolean needsUpdate = false;
+ private int tickRateAddition = 0;
+
public CoverInfo(ForgeDirection side, ICoverable aTile) {
coverSide = side;
coveredTile = new WeakReference<>(aTile);
@@ -53,6 +60,7 @@ public final class CoverInfo {
coverData = aNBT.hasKey(NBT_DATA) ? coverBehavior.createDataObject(aNBT.getTag(NBT_DATA))
: coverBehavior.createDataObject();
coveredTile = new WeakReference<>(aTile);
+ tickRateAddition = aNBT.hasKey(NBT_TICK_RATE_ADDITION) ? aNBT.getInteger(NBT_TICK_RATE_ADDITION) : 0;
}
public boolean isValid() {
@@ -62,6 +70,7 @@ public final class CoverInfo {
public NBTTagCompound writeToNBT(NBTTagCompound aNBT) {
aNBT.setByte(NBT_SIDE, (byte) coverSide.ordinal());
aNBT.setInteger(NBT_ID, coverID);
+ aNBT.setInteger(NBT_TICK_RATE_ADDITION, tickRateAddition);
if (coverData != null) aNBT.setTag(NBT_DATA, coverData.saveDataToNBT());
return aNBT;
@@ -122,7 +131,7 @@ public final class CoverInfo {
}
public int getTickRate() {
- return getCoverBehavior().getTickRate(coverSide, coverID, coverData, coveredTile.get());
+ return getMinimumTickRate() + tickRateAddition;
}
public ForgeDirection getSide() {
@@ -234,6 +243,49 @@ public final class CoverInfo {
.onCoverScrewdriverClick(coverSide, coverID, coverData, coveredTile.get(), aPlayer, aX, aY, aZ);
}
+ public void onCoverJackhammer(EntityPlayer aPlayer) {
+ adjustTickRateMultiplier(aPlayer.isSneaking());
+
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocalFormatted("gt.cover.info.chat.tick_rate", getCurrentTickRateFormatted()));
+ }
+
+ /**
+ * Adjusts the tick rate by one step.
+ *
+ * @param isDecreasing If true, lower one step.
+ */
+ public void adjustTickRateMultiplier(final boolean isDecreasing) {
+ final int currentTickRate = getTickRate();
+ final int stepAmount = currentTickRate == 20 ? (isDecreasing ? 5 : 20) : (currentTickRate < 20 ? 5 : 20);
+
+ tickRateAddition = clamp(tickRateAddition + (isDecreasing ? -1 : 1) * stepAmount);
+ tickRateAddition = clamp(tickRateAddition - (getTickRate() % stepAmount));
+ }
+
+ /**
+ * Returns information about the cover's tick rate.
+ *
+ * @return An instance of tick rate components
+ */
+ @NotNull
+ public CoverInfo.ClientTickRateFormatter getCurrentTickRateFormatted() {
+ return new ClientTickRateFormatter(getTickRate());
+ }
+
+ public int getMinimumTickRate() {
+ return getCoverBehavior().getTickRate(coverSide, coverID, coverData, coveredTile.get());
+ }
+
+ public int getTickRateAddition() {
+ return tickRateAddition;
+ }
+
+ public void setTickRateAddition(final int tickRateAddition) {
+ this.tickRateAddition = clamp(tickRateAddition);
+ }
+
public Block getFacadeBlock() {
return getCoverBehavior().getFacadeBlock(coverSide, coverID, coverData, coveredTile.get());
}
@@ -246,4 +298,38 @@ public final class CoverInfo {
public List<String> getAdditionalTooltip(ISerializableObject data) {
return getCoverBehavior().getAdditionalTooltip(data);
}
+
+ private static int clamp(int input) {
+ return Math.min(MAX_TICK_RATE_ADDITION, Math.max(0, input));
+ }
+
+ public static final class ClientTickRateFormatter {
+
+ /** A translation key for the type of time units being used (e.g.: "tick", "seconds".) */
+ private final String unitI18NKey;
+ /** A number representing a quantity of time. */
+ private final int tickRate;
+
+ /**
+ * Converts a given tick rate into a human-friendly format.
+ *
+ * @param tickRate The rate at which something ticks, in ticks per operation.
+ */
+ public ClientTickRateFormatter(final int tickRate) {
+ if (tickRate < 20) {
+ this.unitI18NKey = tickRate == 1 ? "gt.time.tick.singular" : "gt.time.tick.plural";
+ this.tickRate = tickRate;
+ } else {
+ this.unitI18NKey = tickRate == 20 ? "gt.time.second.singular" : "gt.time.second.plural";
+ this.tickRate = tickRate / 20;
+ }
+ }
+
+ public String toString() {
+ return StatCollector.translateToLocalFormatted(
+ "gt.cover.info.format.tick_rate",
+ tickRate,
+ StatCollector.translateToLocal(unitI18NKey));
+ }
+ }
}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java b/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java
index 9afb2cf765..1910d27b39 100644
--- a/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java
+++ b/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java
@@ -406,6 +406,11 @@ public class GT_Cover_FluidRegulator extends GT_CoverBehaviorBase<GT_Cover_Fluid
}
}
+ @Override
+ public boolean allowsTickRateAddition() {
+ return false;
+ }
+
public enum Conditional {
Always(false) {