diff --git a/src/main/java/de/shiewk/widgets/client/WidgetsModClient.java b/src/main/java/de/shiewk/widgets/client/WidgetsModClient.java index 9bec33f..c7b825f 100644 --- a/src/main/java/de/shiewk/widgets/client/WidgetsModClient.java +++ b/src/main/java/de/shiewk/widgets/client/WidgetsModClient.java @@ -68,5 +68,6 @@ public class WidgetsModClient implements ClientModInitializer { 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"))); } } diff --git a/src/main/java/de/shiewk/widgets/widgets/ArmorHudWidget.java b/src/main/java/de/shiewk/widgets/widgets/ArmorHudWidget.java new file mode 100644 index 0000000..bb0b3e0 --- /dev/null +++ b/src/main/java/de/shiewk/widgets/widgets/ArmorHudWidget.java @@ -0,0 +1,128 @@ +package de.shiewk.widgets.widgets; + +import de.shiewk.widgets.WidgetSettings; +import de.shiewk.widgets.widgets.settings.EnumWidgetSetting; +import de.shiewk.widgets.widgets.settings.IntSliderWidgetSetting; +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.client.network.ClientPlayerEntity; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import java.util.List; + +public class ArmorHudWidget extends ResizableWidget { + + public ArmorHudWidget(Identifier id) { + super(id, List.of( + new IntSliderWidgetSetting("padding", Text.translatable("widgets.widgets.armorHud.padding"), 0, 2, 5), + new ToggleWidgetSetting("show_durability", Text.translatable("widgets.widgets.armorHud.showDurability"), true), + new EnumWidgetSetting<>("durability_style", Text.translatable("widgets.widgets.armorHud.durabilityStyle"), DurabilityStyle.class, DurabilityStyle.NUMBER, DurabilityStyle::getDisplayName) + )); + getSettings().optionById("durability_style").setShowCondition(() -> this.showDurability); + } + + public enum DurabilityStyle { + NUMBER, + PERCENT; + + public Text getDisplayName() { + return Text.translatable("widgets.widgets.armorHud.durabilityStyle." + name().toLowerCase()); + } + } + + private int padding = 1; + private boolean showDurability = true; + private DurabilityStyle durabilityStyle; + private ItemStack helmet; + private ItemStack chestplate; + private ItemStack leggings; + private ItemStack boots; + + @Override + public void renderScaled(DrawContext context, long measuringTimeNano, TextRenderer textRenderer, int posX, int posY) { + if (helmet != null){ + renderItem(context, textRenderer, helmet, posX + padding, posY + padding); + } + if (chestplate != null){ + renderItem(context, textRenderer, chestplate, posX + padding, posY + 16 + padding); + } + if (leggings != null){ + renderItem(context, textRenderer, leggings, posX + padding, posY + 32 + padding); + } + if (boots != null){ + renderItem(context, textRenderer, boots, posX + padding, posY + 48 + padding); + } + } + + private void renderItem(DrawContext context, TextRenderer textRenderer, ItemStack stack, int posX, int posY){ + context.drawItemWithoutEntity(stack, posX, posY); + context.drawStackOverlay(textRenderer, stack, posX, posY); + if (showDurability){ + renderDurability(context, textRenderer, stack, posX, posY); + } + } + + private void renderDurability(DrawContext context, TextRenderer textRenderer, ItemStack stack, int posX, int posY) { + Integer maxDamage = stack.get(DataComponentTypes.MAX_DAMAGE); + if (maxDamage != null) { + int damage = stack.getOrDefault(DataComponentTypes.DAMAGE, 0); + String text = switch (durabilityStyle){ + case NUMBER -> String.valueOf(maxDamage - damage); + case PERCENT -> ((maxDamage - damage) * 100 / maxDamage) + "%"; + }; + context.drawText(textRenderer, text, posX + 16 + padding, posY + 5, 0xffffffff, true); + } + } + + @Override + public void tick() { + ClientPlayerEntity player = MinecraftClient.getInstance().player; + if (player != null) { + PlayerInventory inventory = player.getInventory(); + helmet = inventory.getStack(39); + chestplate = inventory.getStack(38); + leggings = inventory.getStack(37); + boots = inventory.getStack(36); + } else { + helmet = chestplate = leggings = boots = null; + } + } + + @Override + public Text getName() { + return Text.translatable("widgets.widgets.armorHud"); + } + + @Override + public Text getDescription() { + return Text.translatable("widgets.widgets.armorHud.description"); + } + + @Override + public int width() { + if (showDurability){ + return 36 + padding * 3; + } else { + return 16 + padding * 2; + } + } + + @Override + public int height() { + return 64 + padding * 2; + } + + @Override + public void onSettingsChanged(WidgetSettings settings) { + super.onSettingsChanged(settings); + this.padding = ((IntSliderWidgetSetting) settings.optionById("padding")).getValue(); + this.showDurability = ((ToggleWidgetSetting) settings.optionById("show_durability")).getValue(); + this.durabilityStyle = (DurabilityStyle) ((EnumWidgetSetting) settings.optionById("durability_style")).getValue(); + } +} diff --git a/src/main/resources/assets/widgets/lang/de_de.json b/src/main/resources/assets/widgets/lang/de_de.json index 37b96f7..d6e877e 100644 --- a/src/main/resources/assets/widgets/lang/de_de.json +++ b/src/main/resources/assets/widgets/lang/de_de.json @@ -10,6 +10,13 @@ "widgets.ui.preview": "Vorschau", "widgets.ui.search": "Suchen...", "widgets.ui.widgetSettings": "Bearbeite %s Einstellungen", + "widgets.widgets.armorHud": "Rüstungsstatus", + "widgets.widgets.armorHud.description": "Zeigt die Rüstung, die du gerade trägst, und ihre Haltbarkeit.", + "widgets.widgets.armorHud.durabilityStyle": "Haltbarkeitsstil", + "widgets.widgets.armorHud.durabilityStyle.number": "Anzahl", + "widgets.widgets.armorHud.durabilityStyle.percent": "Prozent", + "widgets.widgets.armorHud.padding": "Abstand", + "widgets.widgets.armorHud.showDurability": "Haltbarkeitsbeschriftung anzeigen", "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", @@ -92,10 +99,6 @@ "widgets.widgets.serverIP": "Server-IP", "widgets.widgets.serverIP.description": "Zeigt die Serveradresse an", "widgets.widgets.serverIP.dynamicWidth": "Widget-Breite dynamisch festlegen", - "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.speed": "Geschwindigkeit", "widgets.widgets.speed.description": "Zeigt, wie schnell du dich bewegst.", "widgets.widgets.speed.digits": "Nachkommastellen", @@ -103,5 +106,9 @@ "widgets.widgets.speed.windowSize": "Durchschnittsfenstergröße", "widgets.widgets.speed.withX": "Mit Geschwindigkeit auf der X-Achse", "widgets.widgets.speed.withY": "Mit Geschwindigkeit auf der Y-Achse", - "widgets.widgets.speed.withZ": "Mit Geschwindigkeit auf der Z-Achse" + "widgets.widgets.speed.withZ": "Mit Geschwindigkeit auf der Z-Achse", + "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" } \ 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 aa1b278..a4f7b28 100644 --- a/src/main/resources/assets/widgets/lang/en_us.json +++ b/src/main/resources/assets/widgets/lang/en_us.json @@ -10,6 +10,13 @@ "widgets.ui.preview": "Preview", "widgets.ui.search": "Search...", "widgets.ui.widgetSettings": "Edit %s settings", + "widgets.widgets.armorHud": "Armor Status", + "widgets.widgets.armorHud.description": "Shows the armor you are currently wearing and its durability.", + "widgets.widgets.armorHud.durabilityStyle": "Durability style", + "widgets.widgets.armorHud.durabilityStyle.number": "Number", + "widgets.widgets.armorHud.durabilityStyle.percent": "Percent", + "widgets.widgets.armorHud.padding": "Padding", + "widgets.widgets.armorHud.showDurability": "Show durability label", "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",