1
mirror of https://github.com/Shiewk/Widgets.git synced 2026-04-28 11:34:17 +02:00

Support latest changes for 1.21.4 (2.2.0)

This commit is contained in:
Shy
2025-12-21 19:47:21 +01:00
parent 269743269b
commit 0e45582293
15 changed files with 163 additions and 45 deletions
+1 -1
View File
@@ -6,7 +6,7 @@ minecraft_version=1.21.4
yarn_mappings=1.21.4+build.8 yarn_mappings=1.21.4+build.8
loader_version=0.17.2 loader_version=0.17.2
# Mod Properties # Mod Properties
mod_version=2.0.0 mod_version=2.2.0
maven_group=de.shiewk maven_group=de.shiewk
archives_base_name=Widgets archives_base_name=Widgets
# Dependencies # Dependencies
@@ -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"); public static final Identifier LAYER_ID = Identifier.of(WidgetsMod.MOD_ID, "widgets-hud-layer");
private static MinecraftClient client; private static MinecraftClient client;
public static int guiScale = 1;
@Override @Override
public void register(LayeredDrawerWrapper layeredDrawerWrapper) { public void register(LayeredDrawerWrapper layeredDrawerWrapper) {
@@ -63,6 +64,7 @@ public class WidgetRenderer implements ClientTickEvents.StartTick, ClientLifecyc
WidgetRenderer.client = client; WidgetRenderer.client = client;
final Profiler profiler = Profilers.get(); final Profiler profiler = Profilers.get();
profiler.push("widgets"); profiler.push("widgets");
guiScale = (int) client.getWindow().getScaleFactor();
final ObjectArrayList<ModWidget> enabled = WidgetManager.enabled; final ObjectArrayList<ModWidget> enabled = WidgetManager.enabled;
for (int i = 0, enabledSize = enabled.size(); i < enabledSize; i++) { for (int i = 0, enabledSize = enabled.size(); i < enabledSize; i++) {
@@ -67,11 +67,11 @@ public class WidgetsModClient implements ClientModInitializer {
WidgetManager.register(new MemoryUsageWidget(Identifier.of(WidgetsMod.MOD_ID, "memory"))); WidgetManager.register(new MemoryUsageWidget(Identifier.of(WidgetsMod.MOD_ID, "memory")));
WidgetManager.register(new KeyStrokesWidget(Identifier.of(WidgetsMod.MOD_ID, "keystrokes"))); WidgetManager.register(new KeyStrokesWidget(Identifier.of(WidgetsMod.MOD_ID, "keystrokes")));
WidgetManager.register(new PlainTextWidget(Identifier.of(WidgetsMod.MOD_ID, "plaintext"))); 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 BiomeWidget(Identifier.of(WidgetsMod.MOD_ID, "biome")));
WidgetManager.register(new SpeedWidget(Identifier.of(WidgetsMod.MOD_ID, "speed"))); WidgetManager.register(new SpeedWidget(Identifier.of(WidgetsMod.MOD_ID, "speed")));
WidgetManager.register(new ArmorHudWidget(Identifier.of(WidgetsMod.MOD_ID, "armor"))); WidgetManager.register(new ArmorHudWidget(Identifier.of(WidgetsMod.MOD_ID, "armor")));
WidgetManager.register(new InventoryWidget(Identifier.of(WidgetsMod.MOD_ID, "inventory"))); WidgetManager.register(new InventoryWidget(Identifier.of(WidgetsMod.MOD_ID, "inventory")));
WidgetManager.register(TPSWidget.INSTANCE);
ComboWidget comboWidget = new ComboWidget(Identifier.of(WidgetsMod.MOD_ID, "combo")); ComboWidget comboWidget = new ComboWidget(Identifier.of(WidgetsMod.MOD_ID, "combo"));
WidgetManager.register(comboWidget); WidgetManager.register(comboWidget);
@@ -64,6 +64,7 @@ public class WidgetConfigScreen extends Screen {
this.addDrawableChild(widgetList); this.addDrawableChild(widgetList);
this.addDrawableChild(searchField); this.addDrawableChild(searchField);
setInitialFocus(searchField);
// Left side // Left side
GridWidget gw = new GridWidget(0, 0); GridWidget gw = new GridWidget(0, 0);
@@ -17,7 +17,9 @@ import net.minecraft.sound.SoundEvents;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.function.Consumer; import java.util.function.Consumer;
public class WidgetListWidget extends ScrollableWidget { public class WidgetListWidget extends ScrollableWidget {
@@ -30,6 +32,7 @@ public class WidgetListWidget extends ScrollableWidget {
private final Consumer<ModWidget> onEdit; private final Consumer<ModWidget> onEdit;
public static boolean searchQueryMatches(String search, ModWidget widget) { 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); 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<ModWidget> loadWidgets(String search) { private List<ModWidget> loadWidgets(String search) {
if (search == null) { return WidgetManager.getAllWidgets()
return WidgetManager.getAllWidgets(); .stream()
} else { .filter(w -> searchQueryMatches(search, w))
return WidgetManager.getAllWidgets().stream().filter(w -> searchQueryMatches(search, w)).toList(); .sorted(Comparator.comparing(w -> w.getName().getString().toLowerCase(Locale.ROOT)))
} .toList();
} }
private void init(){ private void init(){
@@ -25,12 +25,16 @@ public class ArmorHudWidget extends ResizableWidget {
super(id, List.of( super(id, List.of(
new IntSliderWidgetSetting("padding", translatable("widgets.widgets.armorHud.padding"), 0, 2, 5), new IntSliderWidgetSetting("padding", translatable("widgets.widgets.armorHud.padding"), 0, 2, 5),
new ToggleWidgetSetting("show_durability", translatable("widgets.widgets.armorHud.showDurability"), true), 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 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 EnumWidgetSetting<>("durability_style", translatable("widgets.widgets.armorHud.durabilityStyle"), DurabilityStyle.class, DurabilityStyle.NUMBER, DurabilityStyle::getDisplayName),
new ToggleWidgetSetting("rainbow", translatable("widgets.widgets.common.rainbow"), false), new ToggleWidgetSetting("rainbow", translatable("widgets.widgets.common.rainbow"), false),
new IntSliderWidgetSetting("rainbow_speed", translatable("widgets.widgets.common.rainbow.speed"), 1, 3, 10), 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) 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("durability_style").setShowCondition(() -> this.showDurability);
getSettings().optionById("rainbow_speed").setShowCondition(() -> this.rainbow); getSettings().optionById("rainbow_speed").setShowCondition(() -> this.rainbow);
getSettings().optionById("textcolor").setShowCondition(() -> !this.rainbow); getSettings().optionById("textcolor").setShowCondition(() -> !this.rainbow);
@@ -54,6 +58,8 @@ public class ArmorHudWidget extends ResizableWidget {
protected ItemStack boots; protected ItemStack boots;
protected boolean rainbow = false; protected boolean rainbow = false;
protected int rainbowSpeed = 3; 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; protected int backgroundColor = 0x50_00_00_00, textColor = 0xff_ff_ff_ff;
@Override @Override
@@ -89,9 +95,21 @@ public class ArmorHudWidget extends ResizableWidget {
case NUMBER -> String.valueOf(maxDamage - damage); case NUMBER -> String.valueOf(maxDamage - damage);
case PERCENT -> ((maxDamage - damage) * 100 / maxDamage) + "%"; case PERCENT -> ((maxDamage - damage) * 100 / maxDamage) + "%";
}; };
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); context.drawText(textRenderer, text, posX + 16 + padding, posY + 5, rainbow ? BasicTextWidget.rainbowColor(mt, rainbowSpeed) : textColor, true);
} }
} }
}
}
@Override @Override
public void tick() { public void tick() {
@@ -120,9 +138,9 @@ public class ArmorHudWidget extends ResizableWidget {
@Override @Override
public int width() { public int width() {
if (showDurability){ if (showDurability){
return 36 + padding * 3; return 3 * padding + this.preferredWidth;
} else { } 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.rainbowSpeed = ((IntSliderWidgetSetting) settings.optionById("rainbow_speed")).getValue();
this.textColor = ((RGBAColorWidgetSetting) settings.optionById("textcolor")).getColor(); this.textColor = ((RGBAColorWidgetSetting) settings.optionById("textcolor")).getColor();
this.backgroundColor = ((RGBAColorWidgetSetting) settings.optionById("backgroundcolor")).getColor(); this.backgroundColor = ((RGBAColorWidgetSetting) settings.optionById("backgroundcolor")).getColor();
this.preferredWidth = ((IntSliderWidgetSetting) settings.optionById("width")).getValue();
this.textAlignment = (BasicTextWidget.TextAlignment) ((EnumWidgetSetting<?>) settings.optionById("alignment")).getValue();
} }
} }
@@ -13,6 +13,7 @@ import java.util.List;
import java.util.function.LongFunction; import java.util.function.LongFunction;
import static net.minecraft.text.Text.literal; import static net.minecraft.text.Text.literal;
import static net.minecraft.text.Text.translatable;
public class BandwidthWidget extends BasicTextWidget { public class BandwidthWidget extends BasicTextWidget {
@@ -48,7 +49,8 @@ public class BandwidthWidget extends BasicTextWidget {
super(id, List.of( super(id, List.of(
new ToggleWidgetSetting("dynamic_color", Text.translatable("widgets.widgets.bandwidth.dynamicColor"), true), new ToggleWidgetSetting("dynamic_color", Text.translatable("widgets.widgets.bandwidth.dynamicColor"), true),
new ToggleWidgetSetting("hide_in_singleplayer", Text.translatable("widgets.widgets.common.hideInSingleplayer"), false), 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("textcolor").setShowCondition(() -> !this.dynamicColor && !this.rainbow);
getSettings().optionById("rainbow").setShowCondition(() -> !this.dynamicColor); getSettings().optionById("rainbow").setShowCondition(() -> !this.dynamicColor);
@@ -59,6 +61,7 @@ public class BandwidthWidget extends BasicTextWidget {
private boolean dynamicColor = false; private boolean dynamicColor = false;
private boolean hideInSingleplayer = false; private boolean hideInSingleplayer = false;
private Unit unit = Unit.KB; private Unit unit = Unit.KB;
protected boolean fastUpdate = false;
@Override @Override
public void tickWidget() { public void tickWidget() {
@@ -66,7 +69,7 @@ public class BandwidthWidget extends BasicTextWidget {
if (!shouldRender) return; if (!shouldRender) return;
float tickRate = WidgetUtils.getClientTickRate(); float tickRate = WidgetUtils.getClientTickRate();
t++; t++;
if (t >= tickRate){ if (t >= tickRate || fastUpdate){
t = 0; t = 0;
long avgBytesPerSecond = getAvgBytesPerSecond(MinecraftClient.getInstance(), tickRate); long avgBytesPerSecond = getAvgBytesPerSecond(MinecraftClient.getInstance(), tickRate);
formatAndSetRenderText(literal(unit.sizeFormatter.apply(avgBytesPerSecond))); formatAndSetRenderText(literal(unit.sizeFormatter.apply(avgBytesPerSecond)));
@@ -100,6 +103,7 @@ public class BandwidthWidget extends BasicTextWidget {
this.dynamicColor = ((ToggleWidgetSetting) settings.optionById("dynamic_color")).getValue(); this.dynamicColor = ((ToggleWidgetSetting) settings.optionById("dynamic_color")).getValue();
this.hideInSingleplayer = ((ToggleWidgetSetting) settings.optionById("hide_in_singleplayer")).getValue(); this.hideInSingleplayer = ((ToggleWidgetSetting) settings.optionById("hide_in_singleplayer")).getValue();
this.unit = (Unit) ((EnumWidgetSetting<?>) settings.optionById("unit")).getValue(); this.unit = (Unit) ((EnumWidgetSetting<?>) settings.optionById("unit")).getValue();
this.fastUpdate = ((ToggleWidgetSetting) settings.optionById("fastupdate")).getValue();
} }
@Override @Override
@@ -2,6 +2,7 @@ package de.shiewk.widgets.widgets;
import de.shiewk.widgets.WidgetSettingOption; import de.shiewk.widgets.WidgetSettingOption;
import de.shiewk.widgets.WidgetSettings; import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.client.WidgetRenderer;
import de.shiewk.widgets.widgets.settings.EnumWidgetSetting; import de.shiewk.widgets.widgets.settings.EnumWidgetSetting;
import de.shiewk.widgets.widgets.settings.IntSliderWidgetSetting; import de.shiewk.widgets.widgets.settings.IntSliderWidgetSetting;
import de.shiewk.widgets.widgets.settings.RGBAColorWidgetSetting; 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 it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.client.font.TextRenderer; import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
@@ -60,8 +62,8 @@ public abstract class BasicTextWidget extends ResizableWidget {
protected Text renderText = empty(); protected Text renderText = empty();
protected boolean shouldRender = true; protected boolean shouldRender = true;
private int textX = 0; private float textX = 0;
private int textY = 0; private float textY = 0;
private int padding = 0; private int padding = 0;
private TextRenderer renderer = null; private TextRenderer renderer = null;
private boolean textShadow = true; private boolean textShadow = true;
@@ -114,7 +116,11 @@ public abstract class BasicTextWidget extends ResizableWidget {
if (!shouldRender) return; if (!shouldRender) return;
renderer = textRenderer; renderer = textRenderer;
context.fill(posX, posY, posX + width(), posY + height(), this.backgroundColor); 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) { public static int rainbowColor(long n, float speed) {
@@ -128,11 +134,22 @@ public abstract class BasicTextWidget extends ResizableWidget {
int textWidth = renderer.getWidth(renderText); int textWidth = renderer.getWidth(renderText);
switch (textAlignment){ switch (textAlignment){
case LEFT -> textX = padding; 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; 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) { protected void formatAndSetRenderText(Text renderText) {
@@ -12,6 +12,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
import static net.minecraft.text.Text.literal; import static net.minecraft.text.Text.literal;
import static net.minecraft.text.Text.translatable;
public class CPSWidget extends BasicTextWidget { public class CPSWidget extends BasicTextWidget {
@@ -44,6 +45,7 @@ public class CPSWidget extends BasicTextWidget {
} }
private Appearance appearance = Appearance.UNIFIED; private Appearance appearance = Appearance.UNIFIED;
private boolean showLabel = true;
public enum Appearance { public enum Appearance {
SPLIT_PIPE("pipe"), SPLIT_PIPE("pipe"),
@@ -59,10 +61,11 @@ public class CPSWidget extends BasicTextWidget {
public CPSWidget(Identifier id) { public CPSWidget(Identifier id) {
super(id, List.of( 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("show_label", translatable("widgets.widgets.common.showLabel"), true),
new ToggleWidgetSetting("left", Text.translatable("widgets.widgets.cps.left"), true), new EnumWidgetSetting<>("appearance", translatable("widgets.widgets.cps.appearance"), Appearance.class, Appearance.UNIFIED, appearance -> translatable("widgets.widgets.cps.appearance."+appearance.key)),
new ToggleWidgetSetting("middle", Text.translatable("widgets.widgets.cps.middle"), false), new ToggleWidgetSetting("left", translatable("widgets.widgets.cps.left"), true),
new ToggleWidgetSetting("right", Text.translatable("widgets.widgets.cps.right"), 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); middleClicks.removeIf(click -> click.expiresAt <= mtime);
middle = middleClicks.size(); middle = middleClicks.size();
} }
if (showLabel){
formatAndSetRenderText(switch (appearance){ formatAndSetRenderText(switch (appearance){
case UNIFIED -> literal((left + right + middle) + " CPS"); case UNIFIED -> literal((left + right + middle) + " CPS");
case SPLIT_PIPE, SPLIT_SLASH -> literal(getClickText(left, middle, right) + " 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) { 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(); countMiddleClicks = ((ToggleWidgetSetting) settings.optionById("middle")).getValue();
countRightClicks = ((ToggleWidgetSetting) settings.optionById("right")).getValue(); countRightClicks = ((ToggleWidgetSetting) settings.optionById("right")).getValue();
appearance = (Appearance) ((EnumWidgetSetting<?>) settings.optionById("appearance")).getValue(); appearance = (Appearance) ((EnumWidgetSetting<?>) settings.optionById("appearance")).getValue();
showLabel = ((ToggleWidgetSetting) settings.optionById("show_label")).getValue();
} }
@Override @Override
public Text getName() { public Text getName() {
return Text.translatable("widgets.widgets.cps"); return translatable("widgets.widgets.cps");
} }
@Override @Override
public Text getDescription() { public Text getDescription() {
return Text.translatable("widgets.widgets.cps.description"); return translatable("widgets.widgets.cps.description");
} }
} }
@@ -1,30 +1,64 @@
package de.shiewk.widgets.widgets; 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.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import static net.minecraft.text.Text.literal; import static net.minecraft.text.Text.literal;
import static net.minecraft.text.Text.translatable;
public class FPSWidget extends BasicTextWidget { public class FPSWidget extends BasicTextWidget {
protected boolean realtime = false;
protected LinkedList<Long> timedFrames = null;
public FPSWidget(Identifier id) { 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 @Override
public void tickWidget() { public void tickWidget() {
if (!realtime){
formatAndSetRenderText(literal(MinecraftClient.getInstance().getCurrentFps() + " FPS")); formatAndSetRenderText(literal(MinecraftClient.getInstance().getCurrentFps() + " FPS"));
} }
}
@Override @Override
public Text getName() { public Text getName() {
return Text.translatable("widgets.widgets.fps"); return translatable("widgets.widgets.fps");
} }
@Override @Override
public Text getDescription() { 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;
} }
} }
@@ -2,6 +2,8 @@ package de.shiewk.widgets.widgets;
import de.shiewk.widgets.WidgetSettings; import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting; 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.text.Text;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
@@ -14,16 +16,28 @@ public class MemoryUsageWidget extends BasicTextWidget {
private boolean showPercentage = true; private boolean showPercentage = true;
private boolean showLabel = true; private boolean showLabel = true;
protected boolean realtime = false;
public MemoryUsageWidget(Identifier id) { public MemoryUsageWidget(Identifier id) {
super(id, List.of( super(id, List.of(
new ToggleWidgetSetting("percentage", translatable("widgets.widgets.memory.showPercentage"), true), 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 @Override
public void tickWidget() { public void tickWidget() {
if (!realtime) refresh();
}
private void refresh() {
Runtime runtime = Runtime.getRuntime(); Runtime runtime = Runtime.getRuntime();
long memTotal = runtime.maxMemory(); long memTotal = runtime.maxMemory();
long memAllocated = runtime.totalMemory(); long memAllocated = runtime.totalMemory();
@@ -38,7 +52,6 @@ public class MemoryUsageWidget extends BasicTextWidget {
} else { } else {
formatAndSetRenderText(literal(memUsageString)); formatAndSetRenderText(literal(memUsageString));
} }
} }
private long mib(long bytes) { private long mib(long bytes) {
@@ -58,7 +71,8 @@ public class MemoryUsageWidget extends BasicTextWidget {
@Override @Override
public void onSettingsChanged(WidgetSettings settings) { public void onSettingsChanged(WidgetSettings settings) {
super.onSettingsChanged(settings); super.onSettingsChanged(settings);
showPercentage = ((ToggleWidgetSetting) settings.optionById("percentage")).getValue(); this.showPercentage = ((ToggleWidgetSetting) settings.optionById("percentage")).getValue();
showLabel = ((ToggleWidgetSetting) settings.optionById("label")).getValue(); this.showLabel = ((ToggleWidgetSetting) settings.optionById("label")).getValue();
this.realtime = ((ToggleWidgetSetting) settings.optionById("realtime")).getValue();
} }
} }
@@ -25,7 +25,7 @@ public abstract class ResizableWidget extends ModWidget {
return settings; return settings;
} }
private float size = 1f; protected float size = 1f;
@Override @Override
public final void render(DrawContext context, long measuringTimeNano, TextRenderer textRenderer, int posX, int posY) { public final void render(DrawContext context, long measuringTimeNano, TextRenderer textRenderer, int posX, int posY) {
@@ -1,6 +1,8 @@
package de.shiewk.widgets.widgets; package de.shiewk.widgets.widgets;
import de.shiewk.widgets.WidgetSettings; 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 de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.server.ServerTickManager; import net.minecraft.server.ServerTickManager;
@@ -14,21 +16,20 @@ import static net.minecraft.text.Text.literal;
import static net.minecraft.text.Text.translatable; import static net.minecraft.text.Text.translatable;
public class TPSWidget extends BasicTextWidget { public class TPSWidget extends BasicTextWidget {
public TPSWidget(Identifier id) { private TPSWidget(Identifier id) {
super(id, List.of( super(id, List.of(
new ToggleWidgetSetting("show_label", translatable("widgets.widgets.common.showLabel"), true), 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("textcolor").setShowCondition(() -> !this.dynamicColor && !this.rainbow);
getSettings().optionById("rainbow").setShowCondition(() -> !this.dynamicColor); getSettings().optionById("rainbow").setShowCondition(() -> !this.dynamicColor);
getSettings().optionById("rainbow_speed").setShowCondition(() -> !this.dynamicColor && this.rainbow); 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 updatePointer = 0;
private static int updatesSinceWorldChange = 0; private static int updatesSinceWorldChange = 0;
@@ -69,7 +70,7 @@ public class TPSWidget extends BasicTextWidget {
float mspt = avgDifference / 20000000f; float mspt = avgDifference / 20000000f;
float ticksPerSecond = 1000f / mspt; float ticksPerSecond = 1000f / mspt;
boolean loadingFinished = updatesSinceWorldChange > 5; boolean loadingFinished = updatesSinceWorldChange > lastUpdates.length;
if (client.world != null) { if (client.world != null) {
INSTANCE.updateTPS(ticksPerSecond, client.world.getTickManager().getTickRate(), loadingFinished); INSTANCE.updateTPS(ticksPerSecond, client.world.getTickManager().getTickRate(), loadingFinished);
} else { } else {
@@ -125,5 +126,10 @@ public class TPSWidget extends BasicTextWidget {
super.onSettingsChanged(settings); super.onSettingsChanged(settings);
this.dynamicColor = ((ToggleWidgetSetting) settings.optionById("dynamic_color")).getValue(); this.dynamicColor = ((ToggleWidgetSetting) settings.optionById("dynamic_color")).getValue();
this.showLabel = ((ToggleWidgetSetting) settings.optionById("show_label")).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];
} }
} }
@@ -33,6 +33,7 @@
"widgets.widgets.bandwidth": "Bandbreite", "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.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.dynamicColor": "Farbe dynamisch anzeigen",
"widgets.widgets.bandwidth.fastupdate": "Schnelle Aktualisierung",
"widgets.widgets.bandwidth.unit": "Einheit", "widgets.widgets.bandwidth.unit": "Einheit",
"widgets.widgets.basictext.alignment": "Text Ausrichtung", "widgets.widgets.basictext.alignment": "Text Ausrichtung",
"widgets.widgets.basictext.alignment.center": "Mitte", "widgets.widgets.basictext.alignment.center": "Mitte",
@@ -71,6 +72,7 @@
"widgets.widgets.common.hideInSingleplayer": "In Einzelspielerwelten verbergen", "widgets.widgets.common.hideInSingleplayer": "In Einzelspielerwelten verbergen",
"widgets.widgets.common.rainbow": "Regenbogen-Text", "widgets.widgets.common.rainbow": "Regenbogen-Text",
"widgets.widgets.common.rainbow.speed": "Regenbogengeschwindigkeit", "widgets.widgets.common.rainbow.speed": "Regenbogengeschwindigkeit",
"widgets.widgets.common.realtime": "Echtzeit-Update (braucht mehr Leistung)",
"widgets.widgets.common.showLabel": "Beschriftung anzeigen", "widgets.widgets.common.showLabel": "Beschriftung anzeigen",
"widgets.widgets.common.sizePercent": "Widgetgröße (%)", "widgets.widgets.common.sizePercent": "Widgetgröße (%)",
"widgets.widgets.coordinates": "Koordinaten", "widgets.widgets.coordinates": "Koordinaten",
@@ -146,5 +148,6 @@
"widgets.widgets.tps": "TPS", "widgets.widgets.tps": "TPS",
"widgets.widgets.tps.description": "Zeigt die TPS im Einzelspielermodus an oder schätzt die TPS im Mehrspielermodus", "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.dynamicColor": "Farbe dynamisch anzeigen",
"widgets.widgets.tps.tps": "%s TPS" "widgets.widgets.tps.tps": "%s TPS",
"widgets.widgets.tps.windowSize": "Durchschnittsfenstergröße (Sekunden)"
} }
@@ -33,6 +33,7 @@
"widgets.widgets.bandwidth": "Bandwidth", "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.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.dynamicColor": "Dynamic Color",
"widgets.widgets.bandwidth.fastupdate": "Fast update",
"widgets.widgets.bandwidth.unit": "Unit", "widgets.widgets.bandwidth.unit": "Unit",
"widgets.widgets.basictext.alignment": "Text alignment", "widgets.widgets.basictext.alignment": "Text alignment",
"widgets.widgets.basictext.alignment.center": "Center", "widgets.widgets.basictext.alignment.center": "Center",
@@ -71,6 +72,7 @@
"widgets.widgets.common.hideInSingleplayer": "Hide in singleplayer worlds", "widgets.widgets.common.hideInSingleplayer": "Hide in singleplayer worlds",
"widgets.widgets.common.rainbow": "Rainbow text", "widgets.widgets.common.rainbow": "Rainbow text",
"widgets.widgets.common.rainbow.speed": "Rainbow speed", "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.showLabel": "Show label",
"widgets.widgets.common.sizePercent": "Widget size (%)", "widgets.widgets.common.sizePercent": "Widget size (%)",
"widgets.widgets.coordinates": "Coordinates", "widgets.widgets.coordinates": "Coordinates",
@@ -146,5 +148,6 @@
"widgets.widgets.tps": "TPS", "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.description": "Shows the current TPS when in singleplayer and estimates server TPS when in multiplayer.",
"widgets.widgets.tps.dynamicColor": "Dynamic Color", "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)"
} }