Skip to content

Commit

Permalink
Update Armor HUD (#5096)
Browse files Browse the repository at this point in the history
Co-authored-by: Wide_Cat <widecat@duck.com>
  • Loading branch information
machiecodes and Wide-Cat authored Feb 1, 2025
1 parent ff0e6c6 commit 5f16bf6
Showing 1 changed file with 58 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

package meteordevelopment.meteorclient.systems.hud.elements;

import meteordevelopment.meteorclient.renderer.text.TextRenderer;
import meteordevelopment.meteorclient.settings.*;
import meteordevelopment.meteorclient.systems.hud.Hud;
import meteordevelopment.meteorclient.systems.hud.HudElement;
Expand Down Expand Up @@ -45,16 +46,15 @@ public class ArmorHud extends HudElement {
.description("The scale.")
.defaultValue(2)
.onChanged(aDouble -> calculateSize())
.min(1)
.sliderRange(1, 5)
.min(0.5)
.sliderRange(0.5, 5)
.build()
);

private final Setting<Integer> border = sgGeneral.add(new IntSetting.Builder()
.name("border")
.description("How much space to add around the element.")
.defaultValue(0)
.onChanged(integer -> calculateSize())
private final Setting<Boolean> showEmpty = sgGeneral.add(new BoolSetting.Builder()
.name("show-empty")
.description("Renders barrier icons for empty slots.")
.defaultValue(false)
.build()
);

Expand Down Expand Up @@ -107,80 +107,84 @@ public ArmorHud() {
calculateSize();
}

@Override
public void setSize(double width, double height) {
super.setSize(width + border.get() * 2, height + border.get() * 2);
}

private void calculateSize() {
switch (orientation.get()) {
case Horizontal -> setSize(16 * scale.get() * 4 + 2 * 4, 16 * scale.get());
case Vertical -> setSize(16 * scale.get(), 16 * scale.get() * 4 + 2 * 4);
case Horizontal -> setSize(16 * scale.get() * 4 + 2 * 4 * scale.get(), 16 * scale.get());
case Vertical -> setSize(16 * scale.get(), 16 * scale.get() * 4 + 2 * 4 * scale.get());
}
}

@Override
public void render(HudRenderer renderer) {
double x = this.x;
double y = this.y;
double armorX;
double armorY;

int slot = flipOrder.get() ? 3 : 0;
for (int position = 0; position < 4; position++) {
ItemStack itemStack = getItem(slot);

if (orientation.get() == Orientation.Vertical) {
armorX = x;
armorY = y + position * 18 * scale.get();
}
else {
armorX = x + position * 18 * scale.get();
armorY = y;
}
int emptySlots = 0;

// default order is from boots to helmet
ItemStack[] armor = flipOrder.get() ?
new ItemStack[]{getItem(3), getItem(2), getItem(1), getItem(0)} :
new ItemStack[]{getItem(0), getItem(1), getItem(2), getItem(3)};

for (ItemStack stack : armor) {
if (stack.isEmpty()) emptySlots++;
}

if (background.get() && emptySlots < 4) {
renderer.quad(this.x, this.y, getWidth(), getHeight(), backgroundColor.get());
}

renderer.item(itemStack, (int) armorX, (int) armorY, scale.get().floatValue(), (itemStack.isDamageable() && durability.get() == Durability.Bar));
renderer.post(() -> {
double x = this.x;
double y = this.y;

if (itemStack.isDamageable() && !isInEditor() && durability.get() != Durability.Bar && durability.get() != Durability.None) {
String message = switch (durability.get()) {
case Total -> Integer.toString(itemStack.getMaxDamage() - itemStack.getDamage());
case Percentage -> Integer.toString(Math.round(((itemStack.getMaxDamage() - itemStack.getDamage()) * 100f) / (float) itemStack.getMaxDamage()));
default -> "err";
};
double armorX, armorY;

double messageWidth = renderer.textWidth(message);
for (int position = 0; position < 4; position++) {
ItemStack itemStack = armor[position];

if (orientation.get() == Orientation.Vertical) {
armorX = x + 8 * scale.get() - messageWidth / 2.0;
armorY = y + (18 * position * scale.get()) + (18 * scale.get() - renderer.textHeight());
armorX = x;
armorY = y + position * 18 * scale.get();
} else {
armorX = x + 18 * position * scale.get() + 8 * scale.get() - messageWidth / 2.0;
armorY = y + (getHeight() - renderer.textHeight());
armorX = x + position * 18 * scale.get();
armorY = y;
}

renderer.text(message, armorX, armorY, durabilityColor.get(), durabilityShadow.get());
}
renderer.item(itemStack, (int) armorX, (int) armorY, scale.get().floatValue(), (itemStack.isDamageable() && durability.get() == Durability.Bar));

if (flipOrder.get()) slot--;
else slot++;
}
if (itemStack.isDamageable() && durability.get() != Durability.Bar && durability.get() != Durability.None) {
String message = switch (durability.get()) {
case Total -> Integer.toString(itemStack.getMaxDamage() - itemStack.getDamage());
case Percentage -> Integer.toString(Math.round(((itemStack.getMaxDamage() - itemStack.getDamage()) * 100f) / (float) itemStack.getMaxDamage()));
default -> "err";
};

if (background.get()) {
renderer.quad(this.x, this.y, getWidth(), getHeight(), backgroundColor.get());
}
double messageWidth = renderer.textWidth(message);

if (orientation.get() == Orientation.Vertical) {
armorX = x + 8 * scale.get() - messageWidth / 2.0;
armorY = y + (18 * position * scale.get()) + (18 * scale.get() - renderer.textHeight());
} else {
armorX = x + 18 * position * scale.get() + 8 * scale.get() - messageWidth / 2.0;
armorY = y + (getHeight() - renderer.textHeight());
}

TextRenderer.get().render(message, armorX, armorY, durabilityColor.get(), durabilityShadow.get());
}
}
});
}

private ItemStack getItem(int i) {
if (isInEditor()) {
return switch (i) {
case 1 -> Items.NETHERITE_LEGGINGS.getDefaultStack();
case 2 -> Items.NETHERITE_CHESTPLATE.getDefaultStack();
case 3 -> Items.NETHERITE_HELMET.getDefaultStack();
case 2 -> Items.NETHERITE_CHESTPLATE.getDefaultStack();
case 1 -> Items.NETHERITE_LEGGINGS.getDefaultStack();
default -> Items.NETHERITE_BOOTS.getDefaultStack();
};
}

return mc.player.getInventory().getArmorStack(i);
ItemStack stack = mc.player.getInventory().getArmorStack(i);
return stack.isEmpty() && showEmpty.get() ? Items.BARRIER.getDefaultStack() : stack;
}

public enum Durability {
Expand Down

0 comments on commit 5f16bf6

Please sign in to comment.