diff --git a/src/main/java/de/shiewk/widgets/client/WidgetsModClient.java b/src/main/java/de/shiewk/widgets/client/WidgetsModClient.java index dde1812..e4cbcf8 100644 --- a/src/main/java/de/shiewk/widgets/client/WidgetsModClient.java +++ b/src/main/java/de/shiewk/widgets/client/WidgetsModClient.java @@ -54,5 +54,6 @@ public class WidgetsModClient implements ClientModInitializer { WidgetManager.register(new ServerIPWidget(Identifier.of(WidgetsMod.MOD_ID, "server_ip"))); WidgetManager.register(new PlayerCountWidget(Identifier.of(WidgetsMod.MOD_ID, "player_count"))); WidgetManager.register(new CPSWidget(Identifier.of(WidgetsMod.MOD_ID, "cps"))); + WidgetManager.register(new PlayTimeWidget(Identifier.of(WidgetsMod.MOD_ID, "playtime"))); } } diff --git a/src/main/java/de/shiewk/widgets/widgets/PlayTimeWidget.java b/src/main/java/de/shiewk/widgets/widgets/PlayTimeWidget.java new file mode 100644 index 0000000..155b3c4 --- /dev/null +++ b/src/main/java/de/shiewk/widgets/widgets/PlayTimeWidget.java @@ -0,0 +1,75 @@ +package de.shiewk.widgets.widgets; + +import de.shiewk.widgets.WidgetSettings; +import de.shiewk.widgets.widgets.settings.EnumWidgetSetting; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import java.util.List; + +public class PlayTimeWidget extends BasicTextWidget { + + private static final long startTime = System.nanoTime(); + + private LabelStyle labelStyle = LabelStyle.NO_LABEL; + + public enum LabelStyle { + NO_LABEL("none"), + PLAYTIME("playtime"), + PLAYED("played"); + + public final String key; + + LabelStyle(String key) { + this.key = key; + } + } + + public PlayTimeWidget(Identifier id) { + super(id, List.of( + new EnumWidgetSetting<>("labelstyle", Text.translatable("widgets.widgets.playtime.labelStyle"), LabelStyle.class, LabelStyle.NO_LABEL, labelStyle -> Text.translatable("widgets.widgets.playtime.labelStyle."+labelStyle.key)) + )); + } + + @Override + public void tickWidget() { + long timePlayedMs = getPlayedMs(); + switch (labelStyle){ + case NO_LABEL -> renderText = Text.literal(msToTimeStr(timePlayedMs)); + case PLAYTIME -> renderText = Text.literal(Text.translatable("widgets.widgets.playtime.playtime", msToTimeStr(timePlayedMs)).getString()); + case PLAYED -> renderText = Text.literal(Text.translatable("widgets.widgets.playtime.played", msToTimeStr(timePlayedMs)).getString()); + } + } + + private static long getPlayedMs() { + return (System.nanoTime() - startTime) / 1000000; + } + + private String msToTimeStr(long timePlayedMs) { + long seconds = timePlayedMs / 1000; + long minutes = seconds / 60; + long hours = minutes / 60; + + return formatTimeNumber(hours) + ":" + formatTimeNumber(minutes % 60) + ":" + formatTimeNumber(seconds % 60); + } + + private String formatTimeNumber(long l) { + return l < 10 ? "0" + l : String.valueOf(l); + } + + @Override + public Text getName() { + return Text.translatable("widgets.widgets.playtime"); + } + + @Override + public Text getDescription() { + return Text.translatable("widgets.widgets.playtime.description"); + } + + @Override + public void onSettingsChanged(WidgetSettings settings) { + super.onSettingsChanged(settings); + this.labelStyle = (LabelStyle) ((EnumWidgetSetting) settings.optionById("labelstyle")).getValue(); + } +} diff --git a/src/main/resources/assets/widgets/lang/de_de.json b/src/main/resources/assets/widgets/lang/de_de.json index 364570b..a7a44ba 100644 --- a/src/main/resources/assets/widgets/lang/de_de.json +++ b/src/main/resources/assets/widgets/lang/de_de.json @@ -57,5 +57,13 @@ "widgets.widgets.basictext.alignment.center": "Mitte", "widgets.widgets.basictext.alignment.right": "Rechts", "widgets.widgets.basictext.paddingX": "Textabstand X", - "widgets.widgets.basictext.paddingY": "Textabstand Y" + "widgets.widgets.basictext.paddingY": "Textabstand Y", + "widgets.widgets.playtime": "Spielzeit", + "widgets.widgets.playtime.description": "Zeigt die Spielzeit der aktuellen Sitzung an.", + "widgets.widgets.playtime.playtime": "Spielzeit: %s", + "widgets.widgets.playtime.played": "%s gespielt", + "widgets.widgets.playtime.labelStyle": "Beschriftungsstil", + "widgets.widgets.playtime.labelStyle.none": "Keine Beschriftung", + "widgets.widgets.playtime.labelStyle.playtime": "Spielzeit: Zeit", + "widgets.widgets.playtime.labelStyle.played": "Zeit gespielt" } diff --git a/src/main/resources/assets/widgets/lang/en_us.json b/src/main/resources/assets/widgets/lang/en_us.json index 5787c87..25a89c9 100644 --- a/src/main/resources/assets/widgets/lang/en_us.json +++ b/src/main/resources/assets/widgets/lang/en_us.json @@ -57,5 +57,13 @@ "widgets.widgets.basictext.alignment.center": "Center", "widgets.widgets.basictext.alignment.right": "Right", "widgets.widgets.basictext.paddingX": "Text padding X", - "widgets.widgets.basictext.paddingY": "Text padding Y" + "widgets.widgets.basictext.paddingY": "Text padding Y", + "widgets.widgets.playtime": "Playtime", + "widgets.widgets.playtime.description": "Shows the current session's uptime", + "widgets.widgets.playtime.playtime": "Playtime: %s", + "widgets.widgets.playtime.played": "%s played", + "widgets.widgets.playtime.labelStyle": "Label Style", + "widgets.widgets.playtime.labelStyle.none": "No label", + "widgets.widgets.playtime.labelStyle.playtime": "Playtime: Time", + "widgets.widgets.playtime.labelStyle.played": "Time played" } \ No newline at end of file