From 0e455822938670fbe18a08b1995fc333c2b0b90a Mon Sep 17 00:00:00 2001 From: Shiewk Date: Sun, 21 Dec 2025 19:47:21 +0100 Subject: [PATCH] Support latest changes for 1.21.4 (2.2.0) --- gradle.properties | 2 +- .../shiewk/widgets/client/WidgetRenderer.java | 2 + .../widgets/client/WidgetsModClient.java | 2 +- .../client/screen/WidgetConfigScreen.java | 1 + .../screen/components/WidgetListWidget.java | 13 +++--- .../widgets/widgets/ArmorHudWidget.java | 26 ++++++++++-- .../widgets/widgets/BandwidthWidget.java | 8 +++- .../widgets/widgets/BasicTextWidget.java | 27 +++++++++--- .../de/shiewk/widgets/widgets/CPSWidget.java | 31 +++++++++----- .../de/shiewk/widgets/widgets/FPSWidget.java | 42 +++++++++++++++++-- .../widgets/widgets/MemoryUsageWidget.java | 22 ++++++++-- .../widgets/widgets/ResizableWidget.java | 2 +- .../de/shiewk/widgets/widgets/TPSWidget.java | 20 +++++---- .../resources/assets/widgets/lang/de_de.json | 5 ++- .../resources/assets/widgets/lang/en_us.json | 5 ++- 15 files changed, 163 insertions(+), 45 deletions(-) diff --git a/gradle.properties b/gradle.properties index 2893935..9e95364 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ minecraft_version=1.21.4 yarn_mappings=1.21.4+build.8 loader_version=0.17.2 # Mod Properties -mod_version=2.0.0 +mod_version=2.2.0 maven_group=de.shiewk archives_base_name=Widgets # Dependencies diff --git a/src/main/java/de/shiewk/widgets/client/WidgetRenderer.java b/src/main/java/de/shiewk/widgets/client/WidgetRenderer.java index b83aa0f..356591a 100644 --- a/src/main/java/de/shiewk/widgets/client/WidgetRenderer.java +++ b/src/main/java/de/shiewk/widgets/client/WidgetRenderer.java @@ -23,6 +23,7 @@ public class WidgetRenderer implements ClientTickEvents.StartTick, ClientLifecyc public static final Identifier LAYER_ID = Identifier.of(WidgetsMod.MOD_ID, "widgets-hud-layer"); private static MinecraftClient client; + public static int guiScale = 1; @Override public void register(LayeredDrawerWrapper layeredDrawerWrapper) { @@ -63,6 +64,7 @@ public class WidgetRenderer implements ClientTickEvents.StartTick, ClientLifecyc WidgetRenderer.client = client; final Profiler profiler = Profilers.get(); profiler.push("widgets"); + guiScale = (int) client.getWindow().getScaleFactor(); final ObjectArrayList enabled = WidgetManager.enabled; for (int i = 0, enabledSize = enabled.size(); i < enabledSize; i++) { diff --git a/src/main/java/de/shiewk/widgets/client/WidgetsModClient.java b/src/main/java/de/shiewk/widgets/client/WidgetsModClient.java index ddd03b5..c5d2bea 100644 --- a/src/main/java/de/shiewk/widgets/client/WidgetsModClient.java +++ b/src/main/java/de/shiewk/widgets/client/WidgetsModClient.java @@ -67,11 +67,11 @@ public class WidgetsModClient implements ClientModInitializer { WidgetManager.register(new MemoryUsageWidget(Identifier.of(WidgetsMod.MOD_ID, "memory"))); WidgetManager.register(new KeyStrokesWidget(Identifier.of(WidgetsMod.MOD_ID, "keystrokes"))); WidgetManager.register(new PlainTextWidget(Identifier.of(WidgetsMod.MOD_ID, "plaintext"))); - WidgetManager.register(new TPSWidget(Identifier.of(WidgetsMod.MOD_ID, "tps"))); WidgetManager.register(new BiomeWidget(Identifier.of(WidgetsMod.MOD_ID, "biome"))); WidgetManager.register(new SpeedWidget(Identifier.of(WidgetsMod.MOD_ID, "speed"))); WidgetManager.register(new ArmorHudWidget(Identifier.of(WidgetsMod.MOD_ID, "armor"))); WidgetManager.register(new InventoryWidget(Identifier.of(WidgetsMod.MOD_ID, "inventory"))); + WidgetManager.register(TPSWidget.INSTANCE); ComboWidget comboWidget = new ComboWidget(Identifier.of(WidgetsMod.MOD_ID, "combo")); WidgetManager.register(comboWidget); diff --git a/src/main/java/de/shiewk/widgets/client/screen/WidgetConfigScreen.java b/src/main/java/de/shiewk/widgets/client/screen/WidgetConfigScreen.java index 05baf08..80adf7d 100644 --- a/src/main/java/de/shiewk/widgets/client/screen/WidgetConfigScreen.java +++ b/src/main/java/de/shiewk/widgets/client/screen/WidgetConfigScreen.java @@ -64,6 +64,7 @@ public class WidgetConfigScreen extends Screen { this.addDrawableChild(widgetList); this.addDrawableChild(searchField); + setInitialFocus(searchField); // Left side GridWidget gw = new GridWidget(0, 0); diff --git a/src/main/java/de/shiewk/widgets/client/screen/components/WidgetListWidget.java b/src/main/java/de/shiewk/widgets/client/screen/components/WidgetListWidget.java index 1344488..21dcdbf 100644 --- a/src/main/java/de/shiewk/widgets/client/screen/components/WidgetListWidget.java +++ b/src/main/java/de/shiewk/widgets/client/screen/components/WidgetListWidget.java @@ -17,7 +17,9 @@ import net.minecraft.sound.SoundEvents; import net.minecraft.text.Text; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.Locale; import java.util.function.Consumer; public class WidgetListWidget extends ScrollableWidget { @@ -30,6 +32,7 @@ public class WidgetListWidget extends ScrollableWidget { private final Consumer onEdit; public static boolean searchQueryMatches(String search, ModWidget widget) { + if (search == null) return true; return widget.getName().getString().contains(search) || widget.getDescription().getString().contains(search) || widget.getId().toString().contains(search); } @@ -43,11 +46,11 @@ public class WidgetListWidget extends ScrollableWidget { } private List loadWidgets(String search) { - if (search == null) { - return WidgetManager.getAllWidgets(); - } else { - return WidgetManager.getAllWidgets().stream().filter(w -> searchQueryMatches(search, w)).toList(); - } + return WidgetManager.getAllWidgets() + .stream() + .filter(w -> searchQueryMatches(search, w)) + .sorted(Comparator.comparing(w -> w.getName().getString().toLowerCase(Locale.ROOT))) + .toList(); } private void init(){ diff --git a/src/main/java/de/shiewk/widgets/widgets/ArmorHudWidget.java b/src/main/java/de/shiewk/widgets/widgets/ArmorHudWidget.java index 41842a1..f80c99b 100644 --- a/src/main/java/de/shiewk/widgets/widgets/ArmorHudWidget.java +++ b/src/main/java/de/shiewk/widgets/widgets/ArmorHudWidget.java @@ -25,12 +25,16 @@ public class ArmorHudWidget extends ResizableWidget { super(id, List.of( new IntSliderWidgetSetting("padding", translatable("widgets.widgets.armorHud.padding"), 0, 2, 5), new ToggleWidgetSetting("show_durability", translatable("widgets.widgets.armorHud.showDurability"), true), + new IntSliderWidgetSetting("width", translatable("widgets.widgets.basictext.width"), 16, 42, 128), + new EnumWidgetSetting<>("alignment", translatable("widgets.widgets.basictext.alignment"), BasicTextWidget.TextAlignment.class, BasicTextWidget.TextAlignment.CENTER, BasicTextWidget.TextAlignment::displayText), new RGBAColorWidgetSetting("backgroundcolor", translatable("widgets.widgets.basictext.background"), 0, 0, 0, 80), new EnumWidgetSetting<>("durability_style", translatable("widgets.widgets.armorHud.durabilityStyle"), DurabilityStyle.class, DurabilityStyle.NUMBER, DurabilityStyle::getDisplayName), new ToggleWidgetSetting("rainbow", translatable("widgets.widgets.common.rainbow"), false), new IntSliderWidgetSetting("rainbow_speed", translatable("widgets.widgets.common.rainbow.speed"), 1, 3, 10), new RGBAColorWidgetSetting("textcolor", translatable("widgets.widgets.basictext.textcolor"), 255, 255, 255, 255) )); + getSettings().optionById("width").setShowCondition(() -> this.showDurability); + getSettings().optionById("alignment").setShowCondition(() -> this.showDurability); getSettings().optionById("durability_style").setShowCondition(() -> this.showDurability); getSettings().optionById("rainbow_speed").setShowCondition(() -> this.rainbow); getSettings().optionById("textcolor").setShowCondition(() -> !this.rainbow); @@ -54,6 +58,8 @@ public class ArmorHudWidget extends ResizableWidget { protected ItemStack boots; protected boolean rainbow = false; protected int rainbowSpeed = 3; + protected int preferredWidth = 42; + protected BasicTextWidget.TextAlignment textAlignment = BasicTextWidget.TextAlignment.CENTER; protected int backgroundColor = 0x50_00_00_00, textColor = 0xff_ff_ff_ff; @Override @@ -89,7 +95,19 @@ public class ArmorHudWidget extends ResizableWidget { case NUMBER -> String.valueOf(maxDamage - damage); case PERCENT -> ((maxDamage - damage) * 100 / maxDamage) + "%"; }; - context.drawText(textRenderer, text, posX + 16 + padding, posY + 5, rainbow ? BasicTextWidget.rainbowColor(mt, rainbowSpeed) : textColor, true); + switch (textAlignment){ + case RIGHT -> { + int width = textRenderer.getWidth(text); + context.drawText(textRenderer, text, posX + width() - width - padding * 2, posY + 5, rainbow ? BasicTextWidget.rainbowColor(mt, rainbowSpeed) : textColor, true); + } + case CENTER -> { + int width = textRenderer.getWidth(text); + context.drawText(textRenderer, text, posX + ((preferredWidth + padding*2) - width) / 2 + 8, posY + 5, rainbow ? BasicTextWidget.rainbowColor(mt, rainbowSpeed) : textColor, true); + } + case LEFT -> { + context.drawText(textRenderer, text, posX + 16 + padding, posY + 5, rainbow ? BasicTextWidget.rainbowColor(mt, rainbowSpeed) : textColor, true); + } + } } } @@ -120,9 +138,9 @@ public class ArmorHudWidget extends ResizableWidget { @Override public int width() { if (showDurability){ - return 36 + padding * 3; + return 3 * padding + this.preferredWidth; } else { - return 16 + padding * 2; + return 2 * padding + 16; } } @@ -141,5 +159,7 @@ public class ArmorHudWidget extends ResizableWidget { this.rainbowSpeed = ((IntSliderWidgetSetting) settings.optionById("rainbow_speed")).getValue(); this.textColor = ((RGBAColorWidgetSetting) settings.optionById("textcolor")).getColor(); this.backgroundColor = ((RGBAColorWidgetSetting) settings.optionById("backgroundcolor")).getColor(); + this.preferredWidth = ((IntSliderWidgetSetting) settings.optionById("width")).getValue(); + this.textAlignment = (BasicTextWidget.TextAlignment) ((EnumWidgetSetting) settings.optionById("alignment")).getValue(); } } diff --git a/src/main/java/de/shiewk/widgets/widgets/BandwidthWidget.java b/src/main/java/de/shiewk/widgets/widgets/BandwidthWidget.java index df6999c..697c380 100644 --- a/src/main/java/de/shiewk/widgets/widgets/BandwidthWidget.java +++ b/src/main/java/de/shiewk/widgets/widgets/BandwidthWidget.java @@ -13,6 +13,7 @@ import java.util.List; import java.util.function.LongFunction; import static net.minecraft.text.Text.literal; +import static net.minecraft.text.Text.translatable; public class BandwidthWidget extends BasicTextWidget { @@ -48,7 +49,8 @@ public class BandwidthWidget extends BasicTextWidget { super(id, List.of( new ToggleWidgetSetting("dynamic_color", Text.translatable("widgets.widgets.bandwidth.dynamicColor"), true), new ToggleWidgetSetting("hide_in_singleplayer", Text.translatable("widgets.widgets.common.hideInSingleplayer"), false), - new EnumWidgetSetting<>("unit", Text.translatable("widgets.widgets.bandwidth.unit"), Unit.class, Unit.KB, unit -> literal(unit.name)) + new EnumWidgetSetting<>("unit", Text.translatable("widgets.widgets.bandwidth.unit"), Unit.class, Unit.KB, unit -> literal(unit.name)), + new ToggleWidgetSetting("fastupdate", translatable("widgets.widgets.bandwidth.fastupdate"), false) )); getSettings().optionById("textcolor").setShowCondition(() -> !this.dynamicColor && !this.rainbow); getSettings().optionById("rainbow").setShowCondition(() -> !this.dynamicColor); @@ -59,6 +61,7 @@ public class BandwidthWidget extends BasicTextWidget { private boolean dynamicColor = false; private boolean hideInSingleplayer = false; private Unit unit = Unit.KB; + protected boolean fastUpdate = false; @Override public void tickWidget() { @@ -66,7 +69,7 @@ public class BandwidthWidget extends BasicTextWidget { if (!shouldRender) return; float tickRate = WidgetUtils.getClientTickRate(); t++; - if (t >= tickRate){ + if (t >= tickRate || fastUpdate){ t = 0; long avgBytesPerSecond = getAvgBytesPerSecond(MinecraftClient.getInstance(), tickRate); formatAndSetRenderText(literal(unit.sizeFormatter.apply(avgBytesPerSecond))); @@ -100,6 +103,7 @@ public class BandwidthWidget extends BasicTextWidget { this.dynamicColor = ((ToggleWidgetSetting) settings.optionById("dynamic_color")).getValue(); this.hideInSingleplayer = ((ToggleWidgetSetting) settings.optionById("hide_in_singleplayer")).getValue(); this.unit = (Unit) ((EnumWidgetSetting) settings.optionById("unit")).getValue(); + this.fastUpdate = ((ToggleWidgetSetting) settings.optionById("fastupdate")).getValue(); } @Override diff --git a/src/main/java/de/shiewk/widgets/widgets/BasicTextWidget.java b/src/main/java/de/shiewk/widgets/widgets/BasicTextWidget.java index 4290215..38109ef 100644 --- a/src/main/java/de/shiewk/widgets/widgets/BasicTextWidget.java +++ b/src/main/java/de/shiewk/widgets/widgets/BasicTextWidget.java @@ -2,6 +2,7 @@ package de.shiewk.widgets.widgets; import de.shiewk.widgets.WidgetSettingOption; import de.shiewk.widgets.WidgetSettings; +import de.shiewk.widgets.client.WidgetRenderer; import de.shiewk.widgets.widgets.settings.EnumWidgetSetting; import de.shiewk.widgets.widgets.settings.IntSliderWidgetSetting; import de.shiewk.widgets.widgets.settings.RGBAColorWidgetSetting; @@ -9,6 +10,7 @@ import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; import net.minecraft.util.Identifier; @@ -60,8 +62,8 @@ public abstract class BasicTextWidget extends ResizableWidget { protected Text renderText = empty(); protected boolean shouldRender = true; - private int textX = 0; - private int textY = 0; + private float textX = 0; + private float textY = 0; private int padding = 0; private TextRenderer renderer = null; private boolean textShadow = true; @@ -114,7 +116,11 @@ public abstract class BasicTextWidget extends ResizableWidget { if (!shouldRender) return; renderer = textRenderer; context.fill(posX, posY, posX + width(), posY + height(), this.backgroundColor); - context.drawText(textRenderer, renderText, posX + textX, posY + (textShadow ? textY : textY + 1), rainbow ? rainbowColor(n, rainbowSpeed) : this.textColor, textShadow); + MatrixStack matrices = context.getMatrices(); + matrices.push(); + matrices.translate(posX + textX, posY + textY, 0); + context.drawText(textRenderer, renderText, 0, 0, rainbow ? rainbowColor(n, rainbowSpeed) : this.textColor, textShadow); + matrices.pop(); } public static int rainbowColor(long n, float speed) { @@ -128,11 +134,22 @@ public abstract class BasicTextWidget extends ResizableWidget { int textWidth = renderer.getWidth(renderText); switch (textAlignment){ case LEFT -> textX = padding; - case CENTER -> textX = width() / 2 - textWidth / 2; + case CENTER -> { + if (textShadow){ + textX = (width() - textWidth) / 2f; + } else { + textX = (width() - textWidth + 1) / 2f; + } + } case RIGHT -> textX = width() - padding - textWidth; } + float textHeight = textShadow ? 8 : 7; + if (WidgetRenderer.guiScale == 1 && size <= 1){ + textY = (int) ((height() - textHeight) / 2); + } else { + textY = (height() - textHeight) / 2f; + } } - textY = (height-9) / 2; } protected void formatAndSetRenderText(Text renderText) { diff --git a/src/main/java/de/shiewk/widgets/widgets/CPSWidget.java b/src/main/java/de/shiewk/widgets/widgets/CPSWidget.java index 95f35f0..8fad003 100644 --- a/src/main/java/de/shiewk/widgets/widgets/CPSWidget.java +++ b/src/main/java/de/shiewk/widgets/widgets/CPSWidget.java @@ -12,6 +12,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; import static net.minecraft.text.Text.literal; +import static net.minecraft.text.Text.translatable; public class CPSWidget extends BasicTextWidget { @@ -44,6 +45,7 @@ public class CPSWidget extends BasicTextWidget { } private Appearance appearance = Appearance.UNIFIED; + private boolean showLabel = true; public enum Appearance { SPLIT_PIPE("pipe"), @@ -59,10 +61,11 @@ public class CPSWidget extends BasicTextWidget { public CPSWidget(Identifier id) { super(id, List.of( - new EnumWidgetSetting<>("appearance", Text.translatable("widgets.widgets.cps.appearance"), Appearance.class, Appearance.UNIFIED, appearance -> Text.translatable("widgets.widgets.cps.appearance."+appearance.key)), - new ToggleWidgetSetting("left", Text.translatable("widgets.widgets.cps.left"), true), - new ToggleWidgetSetting("middle", Text.translatable("widgets.widgets.cps.middle"), false), - new ToggleWidgetSetting("right", Text.translatable("widgets.widgets.cps.right"), true) + new ToggleWidgetSetting("show_label", translatable("widgets.widgets.common.showLabel"), true), + new EnumWidgetSetting<>("appearance", translatable("widgets.widgets.cps.appearance"), Appearance.class, Appearance.UNIFIED, appearance -> translatable("widgets.widgets.cps.appearance."+appearance.key)), + new ToggleWidgetSetting("left", translatable("widgets.widgets.cps.left"), true), + new ToggleWidgetSetting("middle", translatable("widgets.widgets.cps.middle"), false), + new ToggleWidgetSetting("right", translatable("widgets.widgets.cps.right"), true) )); } @@ -102,10 +105,17 @@ public class CPSWidget extends BasicTextWidget { middleClicks.removeIf(click -> click.expiresAt <= mtime); middle = middleClicks.size(); } - formatAndSetRenderText(switch (appearance){ - case UNIFIED -> literal((left + right + middle) + " CPS"); - case SPLIT_PIPE, SPLIT_SLASH -> literal(getClickText(left, middle, right) + " CPS"); - }); + if (showLabel){ + formatAndSetRenderText(switch (appearance){ + case UNIFIED -> literal((left + right + middle) + " CPS"); + case SPLIT_PIPE, SPLIT_SLASH -> literal(getClickText(left, middle, right) + " CPS"); + }); + } else { + formatAndSetRenderText(switch (appearance){ + case UNIFIED -> literal(""+(left + right + middle)); + case SPLIT_PIPE, SPLIT_SLASH -> literal(getClickText(left, middle, right).toString()); + }); + } } private @NotNull StringBuilder getClickText(int left, int middle, int right) { @@ -135,15 +145,16 @@ public class CPSWidget extends BasicTextWidget { countMiddleClicks = ((ToggleWidgetSetting) settings.optionById("middle")).getValue(); countRightClicks = ((ToggleWidgetSetting) settings.optionById("right")).getValue(); appearance = (Appearance) ((EnumWidgetSetting) settings.optionById("appearance")).getValue(); + showLabel = ((ToggleWidgetSetting) settings.optionById("show_label")).getValue(); } @Override public Text getName() { - return Text.translatable("widgets.widgets.cps"); + return translatable("widgets.widgets.cps"); } @Override public Text getDescription() { - return Text.translatable("widgets.widgets.cps.description"); + return translatable("widgets.widgets.cps.description"); } } diff --git a/src/main/java/de/shiewk/widgets/widgets/FPSWidget.java b/src/main/java/de/shiewk/widgets/widgets/FPSWidget.java index 962f9bd..000b794 100644 --- a/src/main/java/de/shiewk/widgets/widgets/FPSWidget.java +++ b/src/main/java/de/shiewk/widgets/widgets/FPSWidget.java @@ -1,30 +1,64 @@ package de.shiewk.widgets.widgets; +import de.shiewk.widgets.WidgetSettings; +import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; import net.minecraft.text.Text; import net.minecraft.util.Identifier; +import java.util.LinkedList; import java.util.List; import static net.minecraft.text.Text.literal; +import static net.minecraft.text.Text.translatable; public class FPSWidget extends BasicTextWidget { + + protected boolean realtime = false; + protected LinkedList timedFrames = null; + public FPSWidget(Identifier id) { - super(id, List.of()); + super(id, List.of( + new ToggleWidgetSetting("realtime", translatable("widgets.widgets.common.realtime"), false) + )); + } + + @Override + public void renderScaled(DrawContext context, long n, TextRenderer textRenderer, int posX, int posY) { + if (realtime){ + timedFrames.add(n); + while (timedFrames.getFirst() < n - 500_000_100L){ + timedFrames.removeFirst(); + } + formatAndSetRenderText(literal(timedFrames.size() * 2 + " FPS")); + } + super.renderScaled(context, n, textRenderer, posX, posY); } @Override public void tickWidget() { - formatAndSetRenderText(literal(MinecraftClient.getInstance().getCurrentFps() + " FPS")); + if (!realtime){ + formatAndSetRenderText(literal(MinecraftClient.getInstance().getCurrentFps() + " FPS")); + } } @Override public Text getName() { - return Text.translatable("widgets.widgets.fps"); + return translatable("widgets.widgets.fps"); } @Override public Text getDescription() { - return Text.translatable("widgets.widgets.fps.description"); + return translatable("widgets.widgets.fps.description"); + } + + @Override + public void onSettingsChanged(WidgetSettings settings) { + super.onSettingsChanged(settings); + this.realtime = ((ToggleWidgetSetting) settings.optionById("realtime")).getValue(); + + timedFrames = this.realtime ? new LinkedList<>() : null; } } diff --git a/src/main/java/de/shiewk/widgets/widgets/MemoryUsageWidget.java b/src/main/java/de/shiewk/widgets/widgets/MemoryUsageWidget.java index 05d8a14..2f5b1c9 100644 --- a/src/main/java/de/shiewk/widgets/widgets/MemoryUsageWidget.java +++ b/src/main/java/de/shiewk/widgets/widgets/MemoryUsageWidget.java @@ -2,6 +2,8 @@ package de.shiewk.widgets.widgets; import de.shiewk.widgets.WidgetSettings; import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; import net.minecraft.text.Text; import net.minecraft.util.Identifier; @@ -14,16 +16,28 @@ public class MemoryUsageWidget extends BasicTextWidget { private boolean showPercentage = true; private boolean showLabel = true; + protected boolean realtime = false; public MemoryUsageWidget(Identifier id) { super(id, List.of( new ToggleWidgetSetting("percentage", translatable("widgets.widgets.memory.showPercentage"), true), - new ToggleWidgetSetting("label", translatable("widgets.widgets.common.showLabel"), true) + new ToggleWidgetSetting("label", translatable("widgets.widgets.common.showLabel"), true), + new ToggleWidgetSetting("realtime", translatable("widgets.widgets.common.realtime"), false) )); } + @Override + public void renderScaled(DrawContext context, long n, TextRenderer textRenderer, int posX, int posY) { + if (realtime) refresh(); + super.renderScaled(context, n, textRenderer, posX, posY); + } + @Override public void tickWidget() { + if (!realtime) refresh(); + } + + private void refresh() { Runtime runtime = Runtime.getRuntime(); long memTotal = runtime.maxMemory(); long memAllocated = runtime.totalMemory(); @@ -38,7 +52,6 @@ public class MemoryUsageWidget extends BasicTextWidget { } else { formatAndSetRenderText(literal(memUsageString)); } - } private long mib(long bytes) { @@ -58,7 +71,8 @@ public class MemoryUsageWidget extends BasicTextWidget { @Override public void onSettingsChanged(WidgetSettings settings) { super.onSettingsChanged(settings); - showPercentage = ((ToggleWidgetSetting) settings.optionById("percentage")).getValue(); - showLabel = ((ToggleWidgetSetting) settings.optionById("label")).getValue(); + this.showPercentage = ((ToggleWidgetSetting) settings.optionById("percentage")).getValue(); + this.showLabel = ((ToggleWidgetSetting) settings.optionById("label")).getValue(); + this.realtime = ((ToggleWidgetSetting) settings.optionById("realtime")).getValue(); } } diff --git a/src/main/java/de/shiewk/widgets/widgets/ResizableWidget.java b/src/main/java/de/shiewk/widgets/widgets/ResizableWidget.java index b3a7178..0f796b2 100644 --- a/src/main/java/de/shiewk/widgets/widgets/ResizableWidget.java +++ b/src/main/java/de/shiewk/widgets/widgets/ResizableWidget.java @@ -25,7 +25,7 @@ public abstract class ResizableWidget extends ModWidget { return settings; } - private float size = 1f; + protected float size = 1f; @Override public final void render(DrawContext context, long measuringTimeNano, TextRenderer textRenderer, int posX, int posY) { diff --git a/src/main/java/de/shiewk/widgets/widgets/TPSWidget.java b/src/main/java/de/shiewk/widgets/widgets/TPSWidget.java index a8e684f..21ad950 100644 --- a/src/main/java/de/shiewk/widgets/widgets/TPSWidget.java +++ b/src/main/java/de/shiewk/widgets/widgets/TPSWidget.java @@ -1,6 +1,8 @@ package de.shiewk.widgets.widgets; import de.shiewk.widgets.WidgetSettings; +import de.shiewk.widgets.WidgetsMod; +import de.shiewk.widgets.widgets.settings.IntSliderWidgetSetting; import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting; import net.minecraft.client.MinecraftClient; import net.minecraft.server.ServerTickManager; @@ -14,21 +16,20 @@ import static net.minecraft.text.Text.literal; import static net.minecraft.text.Text.translatable; public class TPSWidget extends BasicTextWidget { - public TPSWidget(Identifier id) { + private TPSWidget(Identifier id) { super(id, List.of( new ToggleWidgetSetting("show_label", translatable("widgets.widgets.common.showLabel"), true), - new ToggleWidgetSetting("dynamic_color", translatable("widgets.widgets.tps.dynamicColor"), true) + new ToggleWidgetSetting("dynamic_color", translatable("widgets.widgets.tps.dynamicColor"), true), + new IntSliderWidgetSetting("window_size", translatable("widgets.widgets.tps.windowSize"), 2, 5, 20) )); getSettings().optionById("textcolor").setShowCondition(() -> !this.dynamicColor && !this.rainbow); getSettings().optionById("rainbow").setShowCondition(() -> !this.dynamicColor); getSettings().optionById("rainbow_speed").setShowCondition(() -> !this.dynamicColor && this.rainbow); - if (INSTANCE != null) throw new IllegalStateException("Instance already initialized"); - INSTANCE = this; } - private static TPSWidget INSTANCE; + public static final TPSWidget INSTANCE = new TPSWidget(Identifier.of(WidgetsMod.MOD_ID, "tps")); - private static final long[] lastUpdates = new long[5]; + private static long[] lastUpdates = new long[5]; private static int updatePointer = 0; private static int updatesSinceWorldChange = 0; @@ -69,7 +70,7 @@ public class TPSWidget extends BasicTextWidget { float mspt = avgDifference / 20000000f; float ticksPerSecond = 1000f / mspt; - boolean loadingFinished = updatesSinceWorldChange > 5; + boolean loadingFinished = updatesSinceWorldChange > lastUpdates.length; if (client.world != null) { INSTANCE.updateTPS(ticksPerSecond, client.world.getTickManager().getTickRate(), loadingFinished); } else { @@ -125,5 +126,10 @@ public class TPSWidget extends BasicTextWidget { super.onSettingsChanged(settings); this.dynamicColor = ((ToggleWidgetSetting) settings.optionById("dynamic_color")).getValue(); this.showLabel = ((ToggleWidgetSetting) settings.optionById("show_label")).getValue(); + + int windowSize = ((IntSliderWidgetSetting) settings.optionById("window_size")).getValue(); + updatePointer = 0; + updatesSinceWorldChange = 0; + lastUpdates = new long[windowSize]; } } diff --git a/src/main/resources/assets/widgets/lang/de_de.json b/src/main/resources/assets/widgets/lang/de_de.json index 2790cd7..b76c3d0 100644 --- a/src/main/resources/assets/widgets/lang/de_de.json +++ b/src/main/resources/assets/widgets/lang/de_de.json @@ -33,6 +33,7 @@ "widgets.widgets.bandwidth": "Bandbreite", "widgets.widgets.bandwidth.description": "Zeigt, wie viele Daten an den aktuell Server gesendet werden/vom Server an den Klient gesendet werden.", "widgets.widgets.bandwidth.dynamicColor": "Farbe dynamisch anzeigen", + "widgets.widgets.bandwidth.fastupdate": "Schnelle Aktualisierung", "widgets.widgets.bandwidth.unit": "Einheit", "widgets.widgets.basictext.alignment": "Text Ausrichtung", "widgets.widgets.basictext.alignment.center": "Mitte", @@ -71,6 +72,7 @@ "widgets.widgets.common.hideInSingleplayer": "In Einzelspielerwelten verbergen", "widgets.widgets.common.rainbow": "Regenbogen-Text", "widgets.widgets.common.rainbow.speed": "Regenbogengeschwindigkeit", + "widgets.widgets.common.realtime": "Echtzeit-Update (braucht mehr Leistung)", "widgets.widgets.common.showLabel": "Beschriftung anzeigen", "widgets.widgets.common.sizePercent": "Widgetgröße (%)", "widgets.widgets.coordinates": "Koordinaten", @@ -146,5 +148,6 @@ "widgets.widgets.tps": "TPS", "widgets.widgets.tps.description": "Zeigt die TPS im Einzelspielermodus an oder schätzt die TPS im Mehrspielermodus", "widgets.widgets.tps.dynamicColor": "Farbe dynamisch anzeigen", - "widgets.widgets.tps.tps": "%s TPS" + "widgets.widgets.tps.tps": "%s TPS", + "widgets.widgets.tps.windowSize": "Durchschnittsfenstergröße (Sekunden)" } \ No newline at end of file diff --git a/src/main/resources/assets/widgets/lang/en_us.json b/src/main/resources/assets/widgets/lang/en_us.json index 2c5113f..9b4b852 100644 --- a/src/main/resources/assets/widgets/lang/en_us.json +++ b/src/main/resources/assets/widgets/lang/en_us.json @@ -33,6 +33,7 @@ "widgets.widgets.bandwidth": "Bandwidth", "widgets.widgets.bandwidth.description": "Shows how much data is being read/sent from the server you're connected to.", "widgets.widgets.bandwidth.dynamicColor": "Dynamic Color", + "widgets.widgets.bandwidth.fastupdate": "Fast update", "widgets.widgets.bandwidth.unit": "Unit", "widgets.widgets.basictext.alignment": "Text alignment", "widgets.widgets.basictext.alignment.center": "Center", @@ -71,6 +72,7 @@ "widgets.widgets.common.hideInSingleplayer": "Hide in singleplayer worlds", "widgets.widgets.common.rainbow": "Rainbow text", "widgets.widgets.common.rainbow.speed": "Rainbow speed", + "widgets.widgets.common.realtime": "Real-time updating (may use more performance)", "widgets.widgets.common.showLabel": "Show label", "widgets.widgets.common.sizePercent": "Widget size (%)", "widgets.widgets.coordinates": "Coordinates", @@ -146,5 +148,6 @@ "widgets.widgets.tps": "TPS", "widgets.widgets.tps.description": "Shows the current TPS when in singleplayer and estimates server TPS when in multiplayer.", "widgets.widgets.tps.dynamicColor": "Dynamic Color", - "widgets.widgets.tps.tps": "%s TPS" + "widgets.widgets.tps.tps": "%s TPS", + "widgets.widgets.tps.windowSize": "Averaging window size (seconds)" } \ No newline at end of file