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 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")));
}
}
@@ -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();
}
}