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

Add armor hud widget (#3)

This commit is contained in:
Shy
2025-08-09 11:41:59 +02:00
parent 669dfb2de4
commit d39473d296
4 changed files with 148 additions and 5 deletions
@@ -68,5 +68,6 @@ public class WidgetsModClient implements ClientModInitializer {
WidgetManager.register(new TPSWidget(Identifier.of(WidgetsMod.MOD_ID, "tps"))); 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")));
} }
} }
@@ -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();
}
}
@@ -10,6 +10,13 @@
"widgets.ui.preview": "Vorschau", "widgets.ui.preview": "Vorschau",
"widgets.ui.search": "Suchen...", "widgets.ui.search": "Suchen...",
"widgets.ui.widgetSettings": "Bearbeite %s Einstellungen", "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": "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",
@@ -92,10 +99,6 @@
"widgets.widgets.serverIP": "Server-IP", "widgets.widgets.serverIP": "Server-IP",
"widgets.widgets.serverIP.description": "Zeigt die Serveradresse an", "widgets.widgets.serverIP.description": "Zeigt die Serveradresse an",
"widgets.widgets.serverIP.dynamicWidth": "Widget-Breite dynamisch festlegen", "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": "Geschwindigkeit",
"widgets.widgets.speed.description": "Zeigt, wie schnell du dich bewegst.", "widgets.widgets.speed.description": "Zeigt, wie schnell du dich bewegst.",
"widgets.widgets.speed.digits": "Nachkommastellen", "widgets.widgets.speed.digits": "Nachkommastellen",
@@ -103,5 +106,9 @@
"widgets.widgets.speed.windowSize": "Durchschnittsfenstergröße", "widgets.widgets.speed.windowSize": "Durchschnittsfenstergröße",
"widgets.widgets.speed.withX": "Mit Geschwindigkeit auf der X-Achse", "widgets.widgets.speed.withX": "Mit Geschwindigkeit auf der X-Achse",
"widgets.widgets.speed.withY": "Mit Geschwindigkeit auf der Y-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"
} }
@@ -10,6 +10,13 @@
"widgets.ui.preview": "Preview", "widgets.ui.preview": "Preview",
"widgets.ui.search": "Search...", "widgets.ui.search": "Search...",
"widgets.ui.widgetSettings": "Edit %s settings", "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": "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",