diff --git a/src/main/java/cc/fros/features/modules/hud/ArmorHudModule.java b/src/main/java/cc/fros/features/modules/hud/ArmorHudModule.java index 496b926..c84f75b 100644 --- a/src/main/java/cc/fros/features/modules/hud/ArmorHudModule.java +++ b/src/main/java/cc/fros/features/modules/hud/ArmorHudModule.java @@ -19,6 +19,7 @@ public class ArmorHudModule extends HudModule { private static final int CRITICAL = 0xFF5555; public final Setting icons = bool("Icons", true); + public final Setting alignment = mode("Alignment", Align.VERTICAL); public ArmorHudModule() { super("Armor", "Display armor durability", 70, 40); @@ -32,15 +33,17 @@ public class ArmorHudModule extends HudModule { float x = getX(); float y = getY(); boolean showIcons = icons.getValue(); - int rowHeight = showIcons ? 16 : FrosFont.lineHeight(); + boolean horizontal = alignment.getValue() == Align.HORIZONTAL; + int slotSize = showIcons ? 16 : FrosFont.lineHeight(); + int gap = showIcons ? 3 : 6; int rows = 0; - int textWidth = 0; + int cross = 0; + int flow = 0; for (EquipmentSlot slot : SLOTS) { ItemStack stack = mc.player.getItemBySlot(slot); if (stack.isEmpty()) continue; - float rowY = y + rows * rowHeight; float ratio = durability(stack); String percent = ratio < 0f ? "\u2014" : Math.round(ratio * 100) + "%"; int color = ratio < 0f ? -1 @@ -48,26 +51,61 @@ public class ArmorHudModule extends HudModule { : ratio >= 0.3f ? WORN : CRITICAL; + // origin of this slot along the flow (down or across) and cross axis + int slotX = (int) (horizontal ? x + flow : x); + int slotY = (int) (horizontal ? y : y + flow); int textX; int textY; + int size; + if (showIcons) { - e.getContext().renderItem(stack, (int) x, (int) rowY); - textX = (int) x + 19; - textY = (int) (rowY + 8 - FrosFont.visualCenter()); + e.getContext().renderItem(stack, slotX, slotY); + if (horizontal) { + // icon on top, percent centered underneath it + textX = (int) (slotX + (slotSize - FrosFont.width(percent)) / 2f); + textY = (int) (slotY + slotSize + 1 - FrosFont.visualCenter()); + size = Math.max(slotSize, FrosFont.width(percent)); + } else { + textX = slotX + slotSize + 3; + textY = (int) (slotY + 8 - FrosFont.visualCenter()); + size = textX - slotX + FrosFont.width(percent); + } } else { Component name = stack.getHoverName(); - FrosFont.draw(e.getContext(), name, (int) x, (int) rowY, -1); - textX = (int) (x + FrosFont.width(name) + 4); - textY = (int) rowY; + FrosFont.draw(e.getContext(), name, slotX, slotY, -1); + int nameWidth = FrosFont.width(name); + if (horizontal) { + // name on top, percent centered underneath it + textX = (int) (slotX + (nameWidth - FrosFont.width(percent)) / 2f); + textY = slotY + FrosFont.lineHeight(); + size = nameWidth; + } else { + textX = slotX + nameWidth + 4; + textY = slotY; + size = textX - slotX + FrosFont.width(percent); + } } + FrosFont.draw(e.getContext(), percent, textX, textY, color); - textWidth = Math.max(textWidth, textX - (int) x + FrosFont.width(percent)); + + if (horizontal) { + flow += size + gap; + cross = Math.max(cross, slotSize + FrosFont.lineHeight()); + } else { + flow += slotSize; + cross = Math.max(cross, size); + } rows++; } if (rows > 0) { - setWidth(textWidth); - setHeight(rows * rowHeight); + if (horizontal) { + setWidth(Math.max(0, flow - gap)); + setHeight(cross); + } else { + setWidth(cross); + setHeight(flow); + } } } @@ -77,4 +115,9 @@ public class ArmorHudModule extends HudModule { if (max <= 0) return -1f; return (max - stack.getDamageValue()) / (float) max; } + + public enum Align { + VERTICAL, + HORIZONTAL + } }