diff options
| author | viciscat <51047087+viciscat@users.noreply.github.com> | 2025-06-23 05:36:00 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-22 23:36:00 -0400 |
| commit | 532179ca43ae143ed9b17b707d1020026073cb9b (patch) | |
| tree | 1b91d4b64bbe90bfcb5af24e69f943c46d220dc9 /src/main/java | |
| parent | c4887e5f419e0d51e80497d41de092c8e6b99d4c (diff) | |
| download | Skyblocker-532179ca43ae143ed9b17b707d1020026073cb9b.tar.gz Skyblocker-532179ca43ae143ed9b17b707d1020026073cb9b.tar.bz2 Skyblocker-532179ca43ae143ed9b17b707d1020026073cb9b.zip | |
Various bar changes (#1385)
* fix wacky positioning behavior
* add more options and smarter oxygen bar
* show text on action bar if their respective bar isn't enabled
* fix tests
Diffstat (limited to 'src/main/java')
10 files changed, 175 insertions, 131 deletions
diff --git a/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java b/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java index 192cfedd..6f502bb6 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java @@ -70,7 +70,7 @@ public abstract class InGameHudMixin { @Inject(method = { "renderExperienceBar", "renderExperienceLevel" }, at = @At("HEAD"), cancellable = true, require = 2) private void skyblocker$renderExperienceBar(CallbackInfo ci) { - if (Utils.isOnSkyblock() && FancyStatusBars.isEnabled() && FancyStatusBars.isExperienceFancyBarVisible()) + if (Utils.isOnSkyblock() && FancyStatusBars.isEnabled() && FancyStatusBars.isExperienceFancyBarEnabled()) ci.cancel(); } @@ -82,12 +82,12 @@ public abstract class InGameHudMixin { @Inject(method = "renderHealthBar", at = @At(value = "HEAD"), cancellable = true) private void skyblocker$renderHealthBar(DrawContext context, PlayerEntity player, int x, int y, int lines, int regeneratingHeartIndex, float maxHealth, int lastHealth, int health, int absorption, boolean blinking, CallbackInfo ci) { if (!Utils.isOnSkyblock()) return; - if (FancyStatusBars.isEnabled() && FancyStatusBars.isHealthFancyBarVisible()) ci.cancel(); + if (FancyStatusBars.isEnabled() && FancyStatusBars.isHealthFancyBarEnabled()) ci.cancel(); } @ModifyExpressionValue(method = "renderStatusBars", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;getScaledWindowHeight()I")) private int skyblocker$moveHealthDown(int original) { - return Utils.isOnSkyblock() && FancyStatusBars.isEnabled() && !FancyStatusBars.isHealthFancyBarVisible() && FancyStatusBars.isExperienceFancyBarVisible() ? original + 6 : original; + return Utils.isOnSkyblock() && FancyStatusBars.isEnabled() && !FancyStatusBars.isHealthFancyBarEnabled() && FancyStatusBars.isExperienceFancyBarEnabled() ? original + 6 : original; } @Inject(method = "renderArmor", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/de/hysky/skyblocker/mixins/WindowMixin.java b/src/main/java/de/hysky/skyblocker/mixins/WindowMixin.java index 69409b1e..bd2633b8 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/WindowMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/WindowMixin.java @@ -11,6 +11,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; public class WindowMixin { @Inject(method = "setScaleFactor", at = @At("TAIL")) public void skyblocker$onScaleFactorChange(CallbackInfo ci) { - FancyStatusBars.updatePositions(); + FancyStatusBars.updatePositions(false); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java b/src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java index 910f5795..67945ffc 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java @@ -2,6 +2,8 @@ package de.hysky.skyblocker.skyblock; import de.hysky.skyblocker.annotations.Init; import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars; +import de.hysky.skyblocker.skyblock.fancybars.StatusBarType; import de.hysky.skyblocker.skyblock.item.PetInfo; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Location; @@ -86,12 +88,14 @@ public class StatusBarTracker { if (matcher.group("healing") != null) { sb.append("§c❤"); } - matcher.appendReplacement(sb, "$3"); + if (!FancyStatusBars.isHealthFancyBarEnabled()) matcher.appendReplacement(sb, "$0"); + else matcher.appendReplacement(sb, "$3"); // Match defense or mana use and don't add it to the string builder if (matcher.usePattern(DEFENSE_STATUS).find()) { defense = RegexUtils.parseIntFromMatcher(matcher, "defense"); - matcher.appendReplacement(sb, ""); + if (FancyStatusBars.isBarEnabled(StatusBarType.DEFENSE)) matcher.appendReplacement(sb, ""); + else matcher.appendReplacement(sb, "$0"); } else if (filterManaUse && matcher.usePattern(MANA_USE).find()) { matcher.appendReplacement(sb, ""); } @@ -99,7 +103,8 @@ public class StatusBarTracker { // Match mana and don't add it to the string builder if (matcher.usePattern(MANA_STATUS).find()) { updateMana(matcher); - matcher.appendReplacement(sb, ""); + if (FancyStatusBars.isBarEnabled(StatusBarType.INTELLIGENCE)) matcher.appendReplacement(sb, ""); + else matcher.appendReplacement(sb, "$0"); } // Append the rest of the message to the string builder diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/BarPositioner.java b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/BarPositioner.java index ddea76b3..badd110a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/BarPositioner.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/BarPositioner.java @@ -41,7 +41,13 @@ public class BarPositioner { * @param row row index */ public void addRow(@NotNull BarAnchor barAnchor, int row) { - map.get(barAnchor).add(row, new LinkedList<>()); + LinkedList<LinkedList<StatusBar>> rows = map.get(barAnchor); + for (int i = row; i < rows.size(); i++) { + for (StatusBar bar : rows.get(i)) { + bar.gridY++; + } + } + rows.add(row, new LinkedList<>()); } /** @@ -69,6 +75,9 @@ public class BarPositioner { */ public void addBar(@NotNull BarAnchor barAnchor, int row, int x, StatusBar bar) { LinkedList<StatusBar> statusBars = map.get(barAnchor).get(row); + for (int i = x; i < statusBars.size(); i++) { + statusBars.get(i).gridX++; + } statusBars.add(x, bar); bar.gridY = row; bar.gridX = statusBars.indexOf(bar); @@ -163,7 +172,7 @@ public class BarPositioner { SizeRule.freeSize(25, 2, 6)), HOTBAR_TOP(true, true, - (scaledWidth, scaledHeight) -> new ScreenPos(scaledWidth / 2 - 91, scaledHeight - (FancyStatusBars.isExperienceFancyBarVisible() ? 23 : 35)), + (scaledWidth, scaledHeight) -> new ScreenPos(scaledWidth / 2 - 91, scaledHeight - (FancyStatusBars.isExperienceFancyBarEnabled() ? 23 : 35)), SizeRule.targetSize(12, 182, 2), anchorPosition -> new ScreenRect(anchorPosition.x(), anchorPosition.y() - 20, 182, 20)), diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/EditBarColorPopup.java b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/EditBarColorPopup.java index c98e18f8..7dd2b973 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/EditBarColorPopup.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/EditBarColorPopup.java @@ -14,6 +14,7 @@ import java.awt.*; import java.util.List; import java.util.function.Consumer; +// TODO use the new color things after collapse buttons is merged public class EditBarColorPopup extends AbstractPopupScreen { private final Consumer<Color> setColor; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/EditBarWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/EditBarWidget.java index 18c8905a..912a53ce 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/EditBarWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/EditBarWidget.java @@ -27,18 +27,23 @@ public class EditBarWidget extends ContainerWidget { private final EnumCyclingOption<StatusBar.IconPosition> iconOption; private final EnumCyclingOption<StatusBar.TextPosition> textOption; + private final BooleanOption showMaxOption; + private final BooleanOption showOverflowOption; + private final ColorOption color1; private final ColorOption color2; private final ColorOption textColor; - private final TextWidget nameWidget; + private final RunnableOption hideOption; + private final TextWidget nameWidget; + private final List<? extends ClickableWidget> options; private int contentsWidth = 0; public EditBarWidget(int x, int y, Screen parent) { - super(x, y, 100, 77, Text.literal("Edit bar")); + super(x, y, 100, 99, Text.literal("Edit bar")); TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; @@ -52,24 +57,32 @@ public class EditBarWidget extends ContainerWidget { textOption = new EnumCyclingOption<>(0, 22, getWidth(), translatable, StatusBar.TextPosition.class); contentsWidth = Math.max(contentsWidth, textRenderer.getWidth(translatable) + textOption.getLongestOptionWidth() + 10); + translatable = Text.translatable("skyblocker.bars.config.showMax"); + showMaxOption = new BooleanOption(0, 33, getWidth(), translatable); + contentsWidth = Math.max(contentsWidth, textRenderer.getWidth(translatable) + 9 + 10); + + translatable = Text.translatable("skyblocker.bars.config.showOverflow"); + showOverflowOption = new BooleanOption(0, 44, getWidth(), translatable); + contentsWidth = Math.max(contentsWidth, textRenderer.getWidth(translatable) + 9 + 10); + // COLO(u)RS translatable = Text.translatable("skyblocker.bars.config.mainColor"); contentsWidth = Math.max(contentsWidth, textRenderer.getWidth(translatable) + 9 + 10); - color1 = new ColorOption(0, 33, getWidth(), translatable, parent); + color1 = new ColorOption(0, 55, getWidth(), translatable, parent); translatable = Text.translatable("skyblocker.bars.config.overflowColor"); contentsWidth = Math.max(contentsWidth, textRenderer.getWidth(translatable) + 9 + 10); - color2 = new ColorOption(0, 44, getWidth(), translatable, parent); + color2 = new ColorOption(0, 66, getWidth(), translatable, parent); translatable = Text.translatable("skyblocker.bars.config.textColor"); contentsWidth = Math.max(contentsWidth, textRenderer.getWidth(translatable) + 9 + 10); - textColor = new ColorOption(0, 55, getWidth(), translatable, parent); + textColor = new ColorOption(0, 77, getWidth(), translatable, parent); translatable = Text.translatable("skyblocker.bars.config.hide"); contentsWidth = Math.max(contentsWidth, textRenderer.getWidth(translatable) + 9 + 10); - hideOption = new RunnableOption(0, 66, getWidth(), translatable); + hideOption = new RunnableOption(0, 88, getWidth(), translatable); - options = List.of(iconOption, textOption, color1, color2, textColor, hideOption); + options = List.of(iconOption, textOption, showMaxOption, showOverflowOption, color1, color2, textColor, hideOption); setWidth(contentsWidth); } @@ -121,6 +134,13 @@ public class EditBarWidget extends ContainerWidget { color1.setCurrent(statusBar.getColors()[0].getRGB()); color1.setOnChange(color -> statusBar.getColors()[0] = color); + showMaxOption.active = statusBar.hasMax(); + showMaxOption.setCurrent(statusBar.showMax); + showOverflowOption.active = statusBar.hasOverflow(); + showOverflowOption.setCurrent(statusBar.showOverflow); + showMaxOption.setOnChange(showMax -> statusBar.showMax = showMax); + showOverflowOption.setOnChange(showOverflow -> statusBar.showOverflow = showOverflow); + color2.active = statusBar.hasOverflow(); if (color2.active) { color2.setCurrent(statusBar.getColors()[1].getRGB()); @@ -135,7 +155,7 @@ public class EditBarWidget extends ContainerWidget { hideOption.setRunnable(() -> { if (statusBar.anchor != null) FancyStatusBars.barPositioner.removeBar(statusBar.anchor, statusBar.gridY, statusBar); - FancyStatusBars.updatePositions(); + FancyStatusBars.updatePositions(true); }); MutableText formatted = statusBar.getName().copy().formatted(Formatting.BOLD); @@ -235,10 +255,6 @@ public class EditBarWidget extends ContainerWidget { } } - /** - * Unused but could always come in handy I guess - */ - @SuppressWarnings("unused") public static class BooleanOption extends ClickableWidget { private boolean current = false; @@ -254,9 +270,9 @@ public class EditBarWidget extends ContainerWidget { context.fill(getX(), getY(), getRight(), getBottom(), 0x20FFFFFF); } TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; - context.drawText(textRenderer, getMessage(), getX() + 1, getY() + 1, -1, true); - context.drawBorder(getRight() - 10, getY() + 1, 9, 9, -1); - if (current) context.fill(getRight() - 8, getY() + 3, getRight() - 3, getY() + 8, -1); + context.drawText(textRenderer, getMessage(), getX() + 1, getY() + 1, active ? -1 : Colors.GRAY, true); + context.drawBorder(getRight() - 10, getY() + 1, 9, 9, active ? -1 : Colors.GRAY); + if (current && active) context.fill(getRight() - 8, getY() + 3, getRight() - 3, getY() + 8, -1); } @Override diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/FancyStatusBars.java b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/FancyStatusBars.java index 73cb26fa..aa2b107d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/FancyStatusBars.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/FancyStatusBars.java @@ -5,6 +5,7 @@ import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.annotations.Init; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.config.configs.UIAndVisualsConfig; +import de.hysky.skyblocker.debug.Debug; import de.hysky.skyblocker.skyblock.StatusBarTracker; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.scheduler.Scheduler; @@ -38,14 +39,17 @@ public class FancyStatusBars { public static BarPositioner barPositioner = new BarPositioner(); public static Map<StatusBarType, StatusBar> statusBars = new EnumMap<>(StatusBarType.class); - public static boolean isHealthFancyBarVisible() { - StatusBar health = statusBars.get(StatusBarType.HEALTH); - return health.anchor != null || health.inMouse; + public static boolean isHealthFancyBarEnabled() { + return isBarEnabled(StatusBarType.HEALTH); } - public static boolean isExperienceFancyBarVisible() { - StatusBar experience = statusBars.get(StatusBarType.EXPERIENCE); - return experience.anchor != null || experience.inMouse; + public static boolean isExperienceFancyBarEnabled() { + return isBarEnabled(StatusBarType.EXPERIENCE); + } + + public static boolean isBarEnabled(StatusBarType type) { + StatusBar statusBar = statusBars.get(type); + return Debug.isTestEnvironment() || statusBar.anchor != null || statusBar.inMouse; } @SuppressWarnings("deprecation") @@ -171,7 +175,7 @@ public class FancyStatusBars { } } - public static void updatePositions() { + public static void updatePositions(boolean ignoreVisibility) { if (!configLoaded) return; final int width = MinecraftClient.getInstance().getWindow().getScaledWidth(); final int height = MinecraftClient.getInstance().getWindow().getScaledHeight(); @@ -192,7 +196,7 @@ public class FancyStatusBars { BarPositioner.SizeRule sizeRule = barAnchor.getSizeRule(); int targetSize = sizeRule.targetSize(); - boolean visibleHealthMove = barAnchor == BarPositioner.BarAnchor.HOTBAR_TOP && !isHealthFancyBarVisible(); + boolean visibleHealthMove = barAnchor == BarPositioner.BarAnchor.HOTBAR_TOP && !isHealthFancyBarEnabled(); if (visibleHealthMove) { targetSize /= 2; } @@ -231,15 +235,22 @@ public class FancyStatusBars { } } - for (int row = 0; row < barPositioner.getRowCount(barAnchor); row++) { - List<StatusBar> barRow = barPositioner.getRow(barAnchor, row); + int row = 0; + for (int i = 0; i < barPositioner.getRowCount(barAnchor); i++) { + List<StatusBar> barRow = barPositioner.getRow(barAnchor, i); if (barRow.isEmpty()) continue; // Update the positions float widthPerSize; - if (sizeRule.isTargetSize()) - widthPerSize = (float) sizeRule.totalWidth() / targetSize; + if (sizeRule.isTargetSize()) { + int size = 0; + for (StatusBar bar : barRow) { + if (bar.visible || ignoreVisibility) size += bar.size; + } + widthPerSize = (float) sizeRule.totalWidth() / size; + + } else widthPerSize = sizeRule.widthPerSize(); @@ -247,13 +258,13 @@ public class FancyStatusBars { int currSize = 0; int rowSize = barRow.size(); - for (int i = 0; i < rowSize; i++) { + for (int j = 0; j < rowSize; j++) { // A bit of a padding int offsetX = 0; int lessWidth = 0; if (rowSize > 1) { // Technically bars in the middle of 3+ bars will be smaller than the 2 side ones but shh - if (i == 0) lessWidth = 1; - else if (i == rowSize - 1) { + if (j == 0) lessWidth = 1; + else if (j == rowSize - 1) { lessWidth = 1; offsetX = 1; } else { @@ -261,9 +272,11 @@ public class FancyStatusBars { offsetX = 1; } } - StatusBar statusBar = barRow.get(i); + StatusBar statusBar = barRow.get(j); statusBar.size = Math.clamp(statusBar.size, sizeRule.minSize(), sizeRule.maxSize()); + if (!statusBar.visible && !ignoreVisibility) continue; + float x = barAnchor.isRight() ? anchorPosition.x() + (visibleHealthMove ? sizeRule.totalWidth() / 2.f : 0) + currSize * widthPerSize : anchorPosition.x() - currSize * widthPerSize - statusBar.size * widthPerSize; @@ -276,10 +289,8 @@ public class FancyStatusBars { statusBar.setWidth(MathHelper.floor(statusBar.size * widthPerSize) - lessWidth); currSize += statusBar.size; - statusBar.gridX = i; - statusBar.gridY = row; - } + if (currSize > 0) row++; } } @@ -296,25 +307,30 @@ public class FancyStatusBars { Collection<StatusBar> barCollection = statusBars.values(); for (StatusBar statusBar : barCollection) { - if (statusBar.anchor == null) continue; + if (statusBar.anchor == null || !statusBar.visible) continue; if (statusBar == statusBars.get(StatusBarType.AIR) && !player.isSubmergedInWater()) continue; statusBar.render(context, -1, -1, client.getRenderTickCounter().getDynamicDeltaTicks()); } StatusBarTracker.Resource health = StatusBarTracker.getHealth(); - statusBars.get(StatusBarType.HEALTH).updateValues(health.value() / (float) health.max(), health.overflow() / (float) health.max(), health.value()); + statusBars.get(StatusBarType.HEALTH).updateWithResource(health); StatusBarTracker.Resource intelligence = StatusBarTracker.getMana(); if (SkyblockerConfigManager.get().uiAndVisuals.bars.intelligenceDisplay == UIAndVisualsConfig.IntelligenceDisplay.ACCURATE) { float totalIntelligence = (float) intelligence.max() + intelligence.overflow(); - statusBars.get(StatusBarType.INTELLIGENCE).updateValues(intelligence.value() / totalIntelligence + intelligence.overflow() / totalIntelligence, intelligence.overflow() / totalIntelligence, intelligence.value()); - } else statusBars.get(StatusBarType.INTELLIGENCE).updateValues(intelligence.value() / (float) intelligence.max(), intelligence.overflow() / (float) intelligence.max(), intelligence.value()); + statusBars.get(StatusBarType.INTELLIGENCE).updateValues(intelligence.value() / totalIntelligence + intelligence.overflow() / totalIntelligence, intelligence.overflow() / totalIntelligence, intelligence.value(), intelligence.max(), intelligence.overflow()); + } else statusBars.get(StatusBarType.INTELLIGENCE).updateWithResource(intelligence); int defense = StatusBarTracker.getDefense(); - statusBars.get(StatusBarType.DEFENSE).updateValues(defense / (defense + 100.f), 0, defense); + statusBars.get(StatusBarType.DEFENSE).updateValues(defense / (defense + 100.f), 0, defense, null, null); StatusBarTracker.Resource speed = StatusBarTracker.getSpeed(); - statusBars.get(StatusBarType.SPEED).updateValues(speed.value() / (float) speed.max(), 0, speed.value()); - statusBars.get(StatusBarType.EXPERIENCE).updateValues(player.experienceProgress, 0, player.experienceLevel); + statusBars.get(StatusBarType.SPEED).updateWithResource(speed); + statusBars.get(StatusBarType.EXPERIENCE).updateValues(player.experienceProgress, 0, player.experienceLevel, null, null); StatusBarTracker.Resource air = StatusBarTracker.getAir(); - statusBars.get(StatusBarType.AIR).updateValues(air.value() / (float) air.max(), 0, air.value()); + StatusBar airBar = statusBars.get(StatusBarType.AIR); + airBar.updateWithResource(air); + if (player.isSubmergedInWater() != airBar.visible) { + airBar.visible = player.isSubmergedInWater(); + updatePositions(false); + } return true; } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBar.java b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBar.java index d215e578..98709993 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBar.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBar.java @@ -7,6 +7,7 @@ import com.google.gson.JsonObject; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.config.configs.UIAndVisualsConfig; +import de.hysky.skyblocker.skyblock.StatusBarTracker; import de.hysky.skyblocker.utils.render.RenderHelper; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; @@ -16,6 +17,7 @@ import net.minecraft.client.gui.widget.ClickableWidget; import net.minecraft.client.gui.widget.Widget; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.render.RenderLayer; +import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Identifier; import net.minecraft.util.StringIdentifiable; @@ -30,65 +32,35 @@ public class StatusBar implements Widget, Drawable, Element, Selectable { private static final Identifier BAR_FILL = Identifier.of(SkyblockerMod.NAMESPACE, "bars/bar_fill"); private static final Identifier BAR_BACK = Identifier.of(SkyblockerMod.NAMESPACE, "bars/bar_back"); - - /* public static final Codec<StatusBar> CODEC = RecordCodecBuilder.create(instance -> instance.group( - Codec.INT.fieldOf("size").forGetter(bar -> bar.size), - Codec.INT.fieldOf("x").forGetter(bar -> bar.gridX), - Codec.INT.fieldOf("y").forGetter(bar -> bar.gridY), - Codec.STRING.listOf().fieldOf("colors").xmap( - strings -> strings.stream().map(s -> Integer.parseInt(s, 16)).map(Color::new).toArray(Color[]::new), - colors -> Arrays.stream(colors).map(color -> Integer.toHexString(color.getRGB())).toList()) - .forGetter(StatusBar::getColors), - Codec.STRING.optionalFieldOf("text_color").xmap( - s -> { - if (s.isPresent()) { - return Optional.of(new Color(Integer.parseInt(s.get(), 16))); - } else return Optional.empty(); - }, - o -> o.map(object -> Integer.toHexString(((Color) object).getRGB()))) - .forGetter(bar -> { - if (bar.getTextColor() != null) { - return Optional.of(bar.getTextColor()); - } else return Optional.empty(); - }), - Codec.BOOL.optionalFieldOf("show_text", true).forGetter(StatusBar::showText), - Codec.STRING.fieldOf("icon_position").xmap( - IconPosition::valueOf, - Enum::toString - ).forGetter(bar -> bar.iconPosition) - ) - - .apply(instance, ));*/ - private final Identifier icon; + private final StatusBarType type; + private Color[] colors; + private @Nullable Color textColor; public Color[] getColors() { return colors; } public boolean hasOverflow() { - return hasOverflow; + return type.hasOverflow(); + } + + public boolean hasMax() { + return type.hasMax(); } public @Nullable Color getTextColor() { return textColor; } - private Color[] colors; - private final boolean hasOverflow; - public void setTextColor(@Nullable Color textColor) { this.textColor = textColor; } - private @Nullable Color textColor; - public Text getName() { - return name; + return type.getName(); } - private final Text name; - private @Nullable OnClick onClick = null; public int gridX = 0; public int gridY = 0; @@ -100,8 +72,14 @@ public class StatusBar implements Widget, Drawable, Element, Selectable { public float fill = 0; public float overflowFill = 0; public boolean inMouse = false; + /** + * Used to hide the bar dynamically, like the oxygen bar + */ + public boolean visible = true; private Object value = "???"; + private @Nullable Object max = "???"; + private @Nullable Object overflow = "???"; private int x = 0; private int y = 0; @@ -109,16 +87,14 @@ public class StatusBar implements Widget, Drawable, Element, Selectable { private IconPosition iconPosition = IconPosition.LEFT; private TextPosition textPosition = TextPosition.BAR_CENTER; - public StatusBar(Identifier icon, Color[] colors, boolean hasOverflow, @Nullable Color textColor, Text name) { - this.icon = icon; - this.colors = colors; - this.hasOverflow = hasOverflow; - this.textColor = textColor; - this.name = name; - } + public boolean showMax = false; + public boolean showOverflow = false; - public StatusBar(Identifier icon, Color[] colors, boolean hasOverflow, @Nullable Color textColor) { - this(icon, colors, hasOverflow, textColor, Text.empty()); + public StatusBar(StatusBarType type) { + this.icon = Identifier.of(SkyblockerMod.NAMESPACE, "bars/icons/" + type.asString()); + this.colors = type.getColors(); + this.textColor = type.getTextColor(); + this.type = type; } protected int transparency(int color) { @@ -152,15 +128,21 @@ public class StatusBar implements Widget, Drawable, Element, Selectable { RenderHelper.renderNineSliceColored(context, BAR_FILL, barX + 1, y + 2, (int) ((barWith - 2) * fill), 5, transparency(colors[0].getRGB())); - if (hasOverflow && overflowFill > 0) { + if (hasOverflow() && overflowFill > 0) { RenderHelper.renderNineSliceColored(context, BAR_FILL, barX + 1, y + 2, (int) ((barWith - 2) * Math.min(overflowFill, 1)), 5, transparency(colors[1].getRGB())); } } - public void updateValues(float fill, float overflowFill, Object text) { + public void updateValues(float fill, float overflowFill, Object text, @Nullable Object max, @Nullable Object overflow) { this.value = text; this.fill = fill; this.overflowFill = overflowFill; + this.max = max; + this.overflow = overflow; + } + + public void updateWithResource(StatusBarTracker.Resource resource) { + updateValues(resource.value() / (float) resource.max(), resource.overflow() / (float) resource.max(), resource.value(), resource.max(), resource.overflow() > 0 ? resource.overflow() : null); } public void renderText(DrawContext context) { @@ -168,7 +150,18 @@ public class StatusBar implements Widget, Drawable, Element, Selectable { TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; int barWith = iconPosition.equals(IconPosition.OFF) ? width : width - 10; int barX = iconPosition.equals(IconPosition.LEFT) ? x + 11 : x; - String text = this.value.toString(); + String stringValue = this.value.toString(); + MutableText text = Text.literal(stringValue).styled(style -> style.withColor((textColor == null ? colors[0] : textColor).getRGB())); + + if (hasMax() && showMax && max != null) { + text.append("/").append(max.toString()); + } + if (hasOverflow() && showOverflow && overflow != null) { + MutableText literal = Text.literal(" + ").styled(style -> style.withColor(colors[1].getRGB())); + literal.append(overflow.toString()); + text.append(literal); + } + int textWidth = textRenderer.getWidth(text); int x; switch (textPosition) { @@ -180,10 +173,10 @@ public class StatusBar implements Widget, Drawable, Element, Selectable { int y = this.y - 3; context.draw(consumers -> textRenderer.drawWithOutline( - Text.of(text).asOrderedText(), + text.asOrderedText(), x, y, - transparency((textColor == null ? colors[0] : textColor).getRGB()), + transparency(-1), transparency(0), context.getMatrices().peek().getPositionMatrix(), consumers, @@ -294,7 +287,7 @@ public class StatusBar implements Widget, Drawable, Element, Selectable { @Override public String toString() { return new ToStringBuilder(this) - .append("name", name) + .append("name", getName()) .append("gridX", gridX) .append("gridY", gridY) .append("size", size) @@ -370,7 +363,7 @@ public class StatusBar implements Widget, Drawable, Element, Selectable { // Make colors optional, so it's easy to reset to default if (object.has("colors")) { JsonArray colors1 = object.get("colors").getAsJsonArray(); - if (colors1.size() < 2 && hasOverflow) { + if (colors1.size() < 2 && hasOverflow()) { throw new IllegalStateException("Missing second color of bar that has overflow"); } Color[] newColors = new Color[colors1.size()]; @@ -393,6 +386,8 @@ public class StatusBar implements Widget, Drawable, Element, Selectable { // backwards compat teehee if (object.has("show_text")) this.textPosition = object.get("show_text").getAsBoolean() ? TextPosition.BAR_CENTER : TextPosition.OFF; if (object.has("text_position")) this.textPosition = TextPosition.valueOf(object.get("text_position").getAsString().trim()); + if (object.has("show_max")) this.showMax = object.get("show_max").getAsBoolean(); + if (object.has("show_overflow")) this.showOverflow = object.get("show_overflow").getAsBoolean(); } @@ -414,17 +409,15 @@ public class StatusBar implements Widget, Drawable, Element, Selectable { object.addProperty("y", gridY); object.addProperty("icon_position", iconPosition.asString()); object.addProperty("text_position", textPosition.asString()); + object.addProperty("show_max", showMax); + object.addProperty("show_overflow", showOverflow); return object; } public static class ManaStatusBar extends StatusBar { - public ManaStatusBar(Identifier icon, Color[] colors, boolean hasOverflow, @Nullable Color textColor, Text name) { - super(icon, colors, hasOverflow, textColor, name); - } - - public ManaStatusBar(Identifier icon, Color[] colors, boolean hasOverflow, @Nullable Color textColor) { - super(icon, colors, hasOverflow, textColor); + public ManaStatusBar(StatusBarType type) { + super(type); } @Override diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarType.java b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarType.java index 451412c2..95203fa5 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarType.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarType.java @@ -1,36 +1,36 @@ package de.hysky.skyblocker.skyblock.fancybars; -import de.hysky.skyblocker.SkyblockerMod; import net.minecraft.text.Text; -import net.minecraft.util.Identifier; import net.minecraft.util.StringIdentifiable; import org.jetbrains.annotations.Nullable; import java.awt.*; public enum StatusBarType implements StringIdentifiable { - HEALTH("health", BarPositioner.BarAnchor.HOTBAR_TOP, 0, new Color[]{new Color(255, 0, 0), new Color(255, 220, 0)}, true, new Color(255, 85, 85), Text.translatable("skyblocker.bars.config.health")), - INTELLIGENCE("intelligence", BarPositioner.BarAnchor.HOTBAR_TOP, 0, new Color[]{new Color(0, 255, 255), new Color(180, 0, 255)}, true, new Color(85, 255, 255), Text.translatable("skyblocker.bars.config.intelligence")), - DEFENSE("defense", BarPositioner.BarAnchor.HOTBAR_RIGHT, 0, new Color[]{new Color(255, 255, 255)}, false, new Color(185, 185, 185), Text.translatable("skyblocker.bars.config.defense")), - EXPERIENCE("experience", BarPositioner.BarAnchor.HOTBAR_TOP, 1, new Color[]{new Color(100, 230, 70)}, false, new Color(128, 255, 32), Text.translatable("skyblocker.bars.config.experience")), - SPEED("speed", BarPositioner.BarAnchor.HOTBAR_RIGHT, 0, new Color[]{new Color(255, 255, 255)}, false, new Color(185, 185, 185), Text.translatable("skyblocker.bars.config.speed")), - AIR("air", BarPositioner.BarAnchor.HOTBAR_RIGHT, 1, new Color[]{new Color(135, 206, 250)}, false, new Color(150, 230, 255), Text.translatable("skyblocker.bars.config.air")); + HEALTH("health", BarPositioner.BarAnchor.HOTBAR_TOP, 0, new Color[]{new Color(255, 0, 0), new Color(255, 220, 0)}, true, true, new Color(255, 85, 85), Text.translatable("skyblocker.bars.config.health")), + INTELLIGENCE("intelligence", BarPositioner.BarAnchor.HOTBAR_TOP, 0, new Color[]{new Color(0, 255, 255), new Color(180, 0, 255)}, true, true, new Color(85, 255, 255), Text.translatable("skyblocker.bars.config.intelligence")), + DEFENSE("defense", BarPositioner.BarAnchor.HOTBAR_RIGHT, 0, new Color[]{new Color(255, 255, 255)}, false, false, new Color(185, 185, 185), Text.translatable("skyblocker.bars.config.defense")), + EXPERIENCE("experience", BarPositioner.BarAnchor.HOTBAR_TOP, 1, new Color[]{new Color(100, 230, 70)}, false, false, new Color(128, 255, 32), Text.translatable("skyblocker.bars.config.experience")), + SPEED("speed", BarPositioner.BarAnchor.HOTBAR_RIGHT, 0, new Color[]{new Color(255, 255, 255)}, false, true, new Color(185, 185, 185), Text.translatable("skyblocker.bars.config.speed")), + AIR("air", BarPositioner.BarAnchor.HOTBAR_RIGHT, 1, new Color[]{new Color(135, 206, 250)}, false, true, new Color(150, 230, 255), Text.translatable("skyblocker.bars.config.air")); private final String id; private final BarPositioner.BarAnchor defaultAnchor; private final int defaultGridY; private final Color[] colors; private final boolean hasOverflow; + private final boolean hasMax; @Nullable private final Color textColor; private final Text name; - StatusBarType(String id, BarPositioner.BarAnchor defaultAnchor, int defaultGridY, Color[] colors, boolean hasOverflow, @Nullable Color textColor, Text name) { + StatusBarType(String id, BarPositioner.BarAnc |
