aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java233
1 files changed, 103 insertions, 130 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java
index 6bf012ff..306c2456 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java
@@ -4,6 +4,7 @@ import com.google.gson.JsonObject;
import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.fancybars.BarGrid;
+import de.hysky.skyblocker.skyblock.fancybars.BarPositioner;
import de.hysky.skyblocker.skyblock.fancybars.StatusBar;
import de.hysky.skyblocker.skyblock.fancybars.StatusBarsConfigScreen;
import de.hysky.skyblocker.utils.Utils;
@@ -15,6 +16,7 @@ import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
+import net.minecraft.client.gui.ScreenPos;
import net.minecraft.client.texture.Sprite;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.Text;
@@ -57,6 +59,8 @@ public class FancyStatusBars {
private final int[] anchorsX = new int[3];
private final int[] anchorsY = new int[3];
+ public static BarPositioner barPositioner = new BarPositioner();
+ @Deprecated(forRemoval = true)
public static BarGrid barGrid = new BarGrid();
public static Map<String, StatusBar> statusBars = new HashMap<>();
@@ -76,17 +80,21 @@ public class FancyStatusBars {
// Default positions
StatusBar health = statusBars.get("health");
- health.gridX = 1;
- health.gridY = 1;
+ health.anchor = BarPositioner.BarAnchor.HOTBAR_TOP;
+ health.gridX = 0;
+ health.gridY = 0;
StatusBar intelligence = statusBars.get("intelligence");
- intelligence.gridX = 2;
- intelligence.gridY = 1;
+ intelligence.anchor = BarPositioner.BarAnchor.HOTBAR_TOP;
+ intelligence.gridX = 1;
+ intelligence.gridY = 0;
StatusBar defense = statusBars.get("defense");
- defense.gridX = 1;
- defense.gridY = -1;
+ defense.anchor = BarPositioner.BarAnchor.HOTBAR_RIGHT;
+ defense.gridX = 0;
+ defense.gridY = 0;
StatusBar experience = statusBars.get("experience");
- experience.gridX = 1;
- experience.gridY = 2;
+ experience.anchor = BarPositioner.BarAnchor.HOTBAR_TOP;
+ experience.gridX = 0;
+ experience.gridY = 1;
CompletableFuture.supplyAsync(FancyStatusBars::loadBarConfig).thenAccept(object -> {
if (object != null) {
@@ -102,8 +110,11 @@ public class FancyStatusBars {
}
}
}
- placeBarsInGrid();
+ placeBarsInPositioner();
configLoaded = true;
+ }).exceptionally(throwable -> {
+ LOGGER.error("[Skyblocker] Failed reading status bars config", throwable);
+ return null;
});
ClientLifecycleEvents.CLIENT_STOPPING.register((client) -> {
saveBarConfig();
@@ -119,53 +130,30 @@ public class FancyStatusBars {
//placeBarsInGrid();
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(
- ClientCommandManager.literal("skyblocker")
- .then(ClientCommandManager.literal("bar_test").executes(Scheduler.queueOpenScreenCommand(StatusBarsConfigScreen::new)))));
+ ClientCommandManager.literal(SkyblockerMod.NAMESPACE)
+ .then(ClientCommandManager.literal("bars").executes(Scheduler.queueOpenScreenCommand(StatusBarsConfigScreen::new)))));
}
private static boolean configLoaded = false;
- private static void placeBarsInGrid() {
+ private static void placeBarsInPositioner() {
List<StatusBar> original = statusBars.values().stream().toList();
- // TOP
- List<StatusBar> barList = new ArrayList<>(original.stream().filter(statusBar -> statusBar.gridY > 0).toList());
- barList.sort((a, b) -> a.gridY == b.gridY ? Integer.compare(a.gridX, b.gridX) : Integer.compare(a.gridY, b.gridY));
-
- int y = 0;
- int rowNum = 0;
- for (StatusBar statusBar : barList) {
- if (statusBar.gridY > y) {
- barGrid.addRowToEnd(true, false);
- rowNum++;
- y = statusBar.gridY;
- }
- barGrid.addToEndOfRow(rowNum, false, statusBar);
- }
-
- // BOTTOM LEFT
- barList.clear();
- barList.addAll(original.stream().filter(statusBar -> statusBar.gridY < 0 && statusBar.gridX < 0).toList());
- barList.sort((a, b) -> a.gridY == b.gridY ? -Integer.compare(a.gridX, b.gridX) : -Integer.compare(a.gridY, b.gridY));
- doBottom(false, barList);
-
- // BOTTOM RIGHT
- barList.clear();
- barList.addAll(original.stream().filter(statusBar -> statusBar.gridY < 0 && statusBar.gridX > 0).toList());
- barList.sort((a, b) -> a.gridY == b.gridY ? Integer.compare(a.gridX, b.gridX) : -Integer.compare(a.gridY, b.gridY));
- doBottom(true, barList);
- }
-
- private static void doBottom(boolean right, List<StatusBar> barList) {
- int y = 0;
- int rowNum = 0;
- for (StatusBar statusBar : barList) {
- if (statusBar.gridY < y) {
- barGrid.addRowToEnd(false, right);
- rowNum--;
- y = statusBar.gridY;
+ for (BarPositioner.BarAnchor barAnchor : BarPositioner.BarAnchor.allAnchors()) {
+ List<StatusBar> barList = new ArrayList<>(original.stream().filter(bar -> bar.anchor == barAnchor).toList());
+ if (barList.isEmpty()) continue;
+ barList.sort((a, b) -> a.gridY == b.gridY ? Integer.compare(a.gridX, b.gridX) : Integer.compare(a.gridY, b.gridY));
+
+ int y = -1;
+ int rowNum = -1;
+ for (StatusBar statusBar : barList) {
+ if (statusBar.gridY > y) {
+ barPositioner.addRow(barAnchor);
+ rowNum++;
+ y = statusBar.gridY;
+ }
+ barPositioner.addBar(barAnchor, rowNum, statusBar);
}
- barGrid.addToEndOfRow(rowNum, right, statusBar);
}
}
@@ -193,97 +181,82 @@ public class FancyStatusBars {
public static void updatePositions() {
if (!configLoaded) return;
- final float hotbarSize = 182;
final int width = MinecraftClient.getInstance().getWindow().getScaledWidth();
final int height = MinecraftClient.getInstance().getWindow().getScaledHeight();
- for (StatusBar value : statusBars.values()) {
- if (value.gridX == 0 || value.gridY == 0) {
- value.setX(-1);
- value.setY(-1);
- value.setWidth(0);
- }
- }
-
- // THE TOP
- for (int i = 0; i < barGrid.getTopSize(); i++) {
- List<StatusBar> row = barGrid.getRow(i + 1, false);
- System.out.println(row);
- if (row.isEmpty()) continue;
- int totalSize = 0;
- for (StatusBar bar : row) {
- totalSize += bar.size;
- }
-
- // Fix sizing
- whileLoop:
- while (totalSize != 12) {
- if (totalSize > 12) {
- for (StatusBar bar : row) {
- if (bar.size > bar.getMinimumSize()) { // TODO: this can cause infinite looping if we add more than 6 bars
- bar.size--;
- totalSize--;
- }
- if (totalSize == 12) break whileLoop;
- }
- } else {
- for (StatusBar bar : row) {
- if (bar.size < bar.getMaximumSize()) {
- bar.size++;
- totalSize++;
+ for (BarPositioner.BarAnchor barAnchor : BarPositioner.BarAnchor.allAnchors()) {
+ ScreenPos anchorPosition = barAnchor.getAnchorPosition(width, height);
+ BarPositioner.SizeRule sizeRule = barAnchor.getSizeRule();
+
+ if (sizeRule.isTargetSize()) {
+ for (int row = 0; row < barPositioner.getRowCount(barAnchor); row++) {
+ LinkedList<StatusBar> barRow = barPositioner.getRow(barAnchor, row);
+ if (barRow.isEmpty()) continue;
+
+ // FIX SIZES
+ int totalSize = 0;
+ for (StatusBar statusBar : barRow)
+ totalSize += (statusBar.size = MathHelper.clamp(statusBar.size, sizeRule.minSize(), sizeRule.maxSize()));
+
+ whileLoop:
+ while (totalSize != sizeRule.targetSize()) {
+ if (totalSize > sizeRule.targetSize()) {
+ for (StatusBar statusBar : barRow) {
+ if (statusBar.size > sizeRule.minSize()) {
+ statusBar.size--;
+ totalSize--;
+ if (totalSize == sizeRule.targetSize()) break whileLoop;
+ }
+ }
+ } else {
+ for (StatusBar statusBar : barRow) {
+ if (statusBar.size < sizeRule.maxSize()) {
+ statusBar.size++;
+ totalSize++;
+ if (totalSize == sizeRule.targetSize()) break whileLoop;
+ }
+ }
}
- if (totalSize == 12) break whileLoop;
}
+
}
}
- int x = width / 2 - 91;
- int y = height - 33 - 10 * i;
- int size = 0;
- for (int j = 0; j < row.size(); j++) {
- StatusBar bar = row.get(j);
- bar.setX(x + (int) ((size / 12.d) * hotbarSize));
- bar.setY(y);
- bar.setWidth((int) ((bar.size / 12.d) * hotbarSize));
- size += bar.size;
- bar.gridY = i + 1;
- bar.gridX = j + 1;
- }
- }
+ for (int row = 0; row < barPositioner.getRowCount(barAnchor); row++) {
+ List<StatusBar> barRow = barPositioner.getRow(barAnchor, row);
+ if (barRow.isEmpty()) continue;
- // BOTTOM LEFT
- for (int i = 0; i < barGrid.getBottomLeftSize(); i++) {
- List<StatusBar> row = barGrid.getRow(-(i + 1), false);
- if (row.isEmpty()) continue;
- int x = width / 2 - 91 - 2;
- int y = height - 15 - 10 * (barGrid.getBottomLeftSize() - i - 1);
- for (int j = 0; j < row.size(); j++) {
- StatusBar bar = row.get(j);
- bar.size = MathHelper.clamp(bar.size, bar.getMinimumSize(), bar.getMaximumSize());
- bar.setY(y);
- bar.setWidth(bar.size * 25);
- x -= bar.getWidth();
- bar.setX(x);
- bar.gridX = -j - 1;
- bar.gridY = -i - 1;
- }
- }
- // BOTTOM RIGHT
- for (int i = 0; i < barGrid.getBottomRightSize(); i++) {
- List<StatusBar> row = barGrid.getRow(-(i + 1), true);
- if (row.isEmpty()) continue;
- int x = width / 2 + 91 + 2;
- int y = height - 15 - 10 * (barGrid.getBottomRightSize() - i - 1);
- for (int j = 0; j < row.size(); j++) {
- StatusBar bar = row.get(j);
- bar.size = MathHelper.clamp(bar.size, bar.getMinimumSize(), bar.getMaximumSize());
- bar.setX(x);
- bar.setY(y);
- bar.setWidth(bar.size * 25);
- x += bar.getWidth();
- bar.gridX = j + 1;
- bar.gridY = -i - 1;
+
+ // Update the positions
+ float widthPerSize;
+ if (sizeRule.isTargetSize())
+ widthPerSize = (float) sizeRule.totalWidth() / sizeRule.targetSize();
+ else
+ widthPerSize = sizeRule.widthPerSize();
+
+ int currSize = 0;
+ for (int i = 0; i < barRow.size(); i++) {
+ StatusBar statusBar = barRow.get(i);
+ statusBar.size = MathHelper.clamp(statusBar.size, sizeRule.minSize(), sizeRule.maxSize());
+
+ float x = barAnchor.isRight() ?
+ anchorPosition.x() + currSize * widthPerSize :
+ anchorPosition.x() - currSize * widthPerSize - statusBar.size * widthPerSize;
+ statusBar.setX((int) x);
+
+ int y = barAnchor.isUp() ?
+ anchorPosition.y() - (row + 1) * (statusBar.getHeight() + 1) :
+ anchorPosition.y() + row * (statusBar.getHeight() + 1);
+ statusBar.setY(y);
+
+ statusBar.setWidth((int) (statusBar.size * widthPerSize));
+ currSize += statusBar.size;
+ statusBar.gridX = i;
+ statusBar.gridY = row;
+
+ }
}
+
}
}