aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorviciscat <51047087+viciscat@users.noreply.github.com>2025-06-23 05:36:00 +0200
committerGitHub <noreply@github.com>2025-06-22 23:36:00 -0400
commit532179ca43ae143ed9b17b707d1020026073cb9b (patch)
tree1b91d4b64bbe90bfcb5af24e69f943c46d220dc9 /src/main/java
parentc4887e5f419e0d51e80497d41de092c8e6b99d4c (diff)
downloadSkyblocker-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')
-rw-r--r--src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java6
-rw-r--r--src/main/java/de/hysky/skyblocker/mixins/WindowMixin.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java11
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/fancybars/BarPositioner.java13
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/fancybars/EditBarColorPopup.java1
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/fancybars/EditBarWidget.java46
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/fancybars/FancyStatusBars.java70
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBar.java115
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarType.java26
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java16
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