From ca2c617e036dbfc07243faf06f0b77a03636134d Mon Sep 17 00:00:00 2001 From: vicisacat Date: Tue, 26 Mar 2024 17:50:20 +0100 Subject: testing things --- .../java/de/hysky/skyblocker/skyblock/FancyStatusBars.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java index 3456d1ad..c1632732 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java @@ -6,8 +6,12 @@ import de.hysky.skyblocker.utils.Utils; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.texture.Sprite; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.Identifier; +import java.util.function.Supplier; + public class FancyStatusBars { private static final Identifier BARS = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/bars.png"); @@ -38,6 +42,9 @@ public class FancyStatusBars { return (100 * value) / max; } + private static final Identifier TEST = new Identifier(SkyblockerMod.NAMESPACE, "bars/bar_test"); + private static final Supplier SUPPLIER = () -> MinecraftClient.getInstance().getGuiAtlasManager().getSprite(TEST); + public boolean render(DrawContext context, int scaledWidth, int scaledHeight) { var player = client.player; if (!SkyblockerConfigManager.get().general.bars.enableBars || player == null || Utils.isInTheRift()) @@ -77,6 +84,12 @@ public class FancyStatusBars { for (var bar : bars) { bar.drawText(context); } + MatrixStack matrices = context.getMatrices(); + matrices.push(); + matrices.translate(50, 50, 0); + matrices.scale(2,2,1); + context.drawSprite(0, 0, 0, 60, 5, SUPPLIER.get(), 1, 0.25f, 0.25f, 1); + matrices.pop(); return true; } -- cgit From 0d5b04f9a5f57be03c79b76ff9b730951b5f959f Mon Sep 17 00:00:00 2001 From: vicisacat Date: Sun, 31 Mar 2024 14:51:18 +0200 Subject: progress ig --- .../hysky/skyblocker/skyblock/FancyStatusBars.java | 53 ++++---- .../skyblocker/skyblock/fancybars/BarGrid.java | 93 ++++++++++++++ .../skyblocker/skyblock/fancybars/StatusBar.java | 136 +++++++++++++++++++++ .../skyblock/fancybars/StatusBarsConfigScreen.java | 44 +++++++ 4 files changed, 305 insertions(+), 21 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/fancybars/BarGrid.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBar.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java (limited to 'src/main/java/de/hysky/skyblocker/skyblock') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java index c1632732..7744626b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java @@ -2,7 +2,10 @@ package de.hysky.skyblocker.skyblock; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.fancybars.BarGrid; +import de.hysky.skyblocker.skyblock.fancybars.StatusBar; import de.hysky.skyblocker.utils.Utils; +import de.hysky.skyblocker.utils.render.RenderHelper; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; @@ -10,6 +13,11 @@ import net.minecraft.client.texture.Sprite; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.Identifier; +import java.awt.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.function.Supplier; public class FancyStatusBars { @@ -18,11 +26,11 @@ public class FancyStatusBars { private final MinecraftClient client = MinecraftClient.getInstance(); private final StatusBarTracker statusBarTracker = SkyblockerMod.getInstance().statusBarTracker; - private final StatusBar[] bars = new StatusBar[]{ - new StatusBar(0, 16733525, 2), // Health Bar - new StatusBar(1, 5636095, 2), // Intelligence Bar - new StatusBar(2, 12106180, 1), // Defence Bar - new StatusBar(3, 8453920, 1), // Experience Bar + private final OldStatusBar[] bars = new OldStatusBar[]{ + new OldStatusBar(0, 16733525, 2, new Color[]{new Color(255, 0, 0), new Color(255, 220, 0)}), // Health Bar + new OldStatusBar(1, 5636095, 2, new Color[]{new Color(0, 255, 255), new Color(180, 0, 255)}), // Intelligence Bar + new OldStatusBar(2, 12106180, 1, new Color[]{new Color(255, 255, 255)}), // Defence Bar + new OldStatusBar(3, 8453920, 1, new Color[]{new Color(100, 220, 70)}), // Experience Bar }; // Positions to show the bars @@ -31,6 +39,16 @@ public class FancyStatusBars { private final int[] anchorsX = new int[3]; private final int[] anchorsY = new int[3]; + public static BarGrid barGrid = new BarGrid(); + public static Map statusBars = new HashMap<>(); + + static { + statusBars.put("health", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(255, 0, 0), new Color(255, 220, 0)}, true, null)); + statusBars.put("intelligence", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(0, 255, 255), new Color(180, 0, 255)}, true, null)); + statusBars.put("defense", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(255, 255, 255)}, false, null)); + statusBars.put("experience", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(100, 220, 70)}, false, null)); + } + public FancyStatusBars() { moveBar(0, 0); moveBar(1, 0); @@ -42,8 +60,9 @@ public class FancyStatusBars { return (100 * value) / max; } - private static final Identifier TEST = new Identifier(SkyblockerMod.NAMESPACE, "bars/bar_test"); - private static final Supplier SUPPLIER = () -> MinecraftClient.getInstance().getGuiAtlasManager().getSprite(TEST); + private static final Identifier BAR_FILL = new Identifier(SkyblockerMod.NAMESPACE, "bars/bar_fill"); + private static final Identifier BAR_BACK = new Identifier(SkyblockerMod.NAMESPACE, "bars/bar_back"); + private static final Supplier SUPPLIER = () -> MinecraftClient.getInstance().getGuiAtlasManager().getSprite(BAR_FILL); public boolean render(DrawContext context, int scaledWidth, int scaledHeight) { var player = client.player; @@ -129,8 +148,9 @@ public class FancyStatusBars { } } - private class StatusBar { + private class OldStatusBar { public final int[] fill; + private final Color[] colors; public int offsetX; private final int v; private final int text_color; @@ -138,13 +158,14 @@ public class FancyStatusBars { public int bar_width; public Object text; - private StatusBar(int i, int textColor, int fillNum) { + private OldStatusBar(int i, int textColor, int fillNum, Color[] colors) { this.v = i * 9; this.text_color = textColor; this.fill = new int[fillNum]; this.fill[0] = 100; this.anchorNum = 0; this.text = ""; + this.colors = colors; } public void update(StatusBarTracker.Resource resource) { @@ -163,23 +184,13 @@ public class FancyStatusBars { context.drawTexture(BARS, anchorsX[anchorNum] + offsetX, anchorsY[anchorNum], 0, v, 9, 9); // Draw the background for the bar - context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10, anchorsY[anchorNum], 10, v, 2, 9); - for (int i = 2; i < bar_width - 2; i += 58) { - context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10 + i, anchorsY[anchorNum], 12, v, Math.min(58, bar_width - 2 - i), 9); - } - context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10 + bar_width - 2, anchorsY[anchorNum], 70, v, 2, 9); + context.drawGuiTexture(BAR_BACK, anchorsX[anchorNum]+ offsetX+10, anchorsY[anchorNum]+1, bar_width, 7); // Draw the filled part of the bar for (int i = 0; i < fill.length; i++) { int fill_width = this.fill[i] * (bar_width - 2) / 100; if (fill_width >= 1) { - context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11, anchorsY[anchorNum], 72 + i * 60, v, 1, 9); - } - for (int j = 1; j < fill_width - 1; j += 58) { - context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11 + j, anchorsY[anchorNum], 73 + i * 60, v, Math.min(58, fill_width - 1 - j), 9); - } - if (fill_width == bar_width - 2) { - context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11 + fill_width - 1, anchorsY[anchorNum], 131 + i * 60, v, 1, 9); + RenderHelper.renderNineSliceColored(context, BAR_FILL, anchorsX[anchorNum] + offsetX + 11, anchorsY[anchorNum]+2, fill_width, 5, colors[i]); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/BarGrid.java b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/BarGrid.java new file mode 100644 index 00000000..b85f85e1 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/BarGrid.java @@ -0,0 +1,93 @@ +package de.hysky.skyblocker.skyblock.fancybars; + +import java.util.LinkedList; +import java.util.List; + +public class BarGrid { + private final LinkedList> top = new LinkedList<>(); + private final LinkedList> bottomLeft = new LinkedList<>(); + private final LinkedList> bottomRight = new LinkedList<>(); + + public BarGrid() {} + + public void add(int row, StatusBar bar, boolean right) { + if (row > 0) + top.get(row).add(bar); + else if (row < 0) { + if (right) { + bottomRight.get(Math.abs(row)).add(bar); + } else { + bottomLeft.get(Math.abs(row)).add(bar); + } + } + } + + public void add(int x, int y, StatusBar bar) { + if (y > 0) { + if (x < 1) throw new IllegalArgumentException("x can't be negative, x: " + x); + LinkedList statusBars = top.get(y-1); + statusBars.add(Math.min(x-1, statusBars.size()), bar); + bar.gridY = y; + bar.gridX = statusBars.indexOf(bar)+1; + } else if (y < 0) { + LinkedList statusBars = (x < 0? bottomLeft: bottomRight).get(Math.abs(y)-1); + statusBars.add(Math.min(Math.abs(x)-1, statusBars.size()), bar); + bar.gridY = y; + bar.gridX = -(statusBars.indexOf(bar)+1); + } + } + + public List getRow(int row, boolean right) { + if (row > 0) { + return top.get(row-1); + } else { + return (right ? bottomRight: bottomLeft).get(Math.abs(row)-1); + } + } + + public void addRow(int row, boolean right) { + if (row>0) { + top.add(row-1, new LinkedList<>()); + } else if (row<0) { + (right ? bottomRight: bottomLeft).add(Math.abs(row)-1, new LinkedList<>()); + } + } + + public void remove(int x, int y) { + if (y > 0) { + if (x < 1) throw new IllegalArgumentException("x can't be negative, x: " + x); + LinkedList statusBars = top.get(y-1); + StatusBar remove = statusBars.remove(x-1); + for (int i = x-1; i < statusBars.size(); i++) { + statusBars.get(i).gridX--; + } + remove.gridX = 0; + remove.gridY = 0; + if (statusBars.isEmpty()) { + top.remove(y - 1); + for (int i = y-1; i < top.size(); i++) { + for (StatusBar bar : top.get(i)) { + bar.gridY--; + } + } + } + } else if (y < 0) { + LinkedList> bottom = x < 0 ? bottomLeft : bottomRight; + LinkedList statusBars = bottom.get(Math.abs(y)-1); + StatusBar remove = statusBars.remove(Math.abs(x) - 1); + for (int i = Math.abs(x)-1; i < statusBars.size(); i++) { + statusBars.get(i).gridX--; + } + remove.gridX = 0; + remove.gridY = 0; + if (statusBars.isEmpty()) { + bottom.remove(Math.abs(y) - 1); + for (int i = Math.abs(y)-1; i < bottom.size(); i++) { + for (StatusBar bar : bottom.get(i)) { + bar.gridY--; + } + } + } + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBar.java b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBar.java new file mode 100644 index 00000000..9c688051 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBar.java @@ -0,0 +1,136 @@ +package de.hysky.skyblocker.skyblock.fancybars; + +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.utils.render.RenderHelper; +import net.minecraft.client.gui.*; +import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; +import net.minecraft.client.gui.widget.ClickableWidget; +import net.minecraft.client.gui.widget.Widget; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.Nullable; + +import java.awt.*; +import java.util.function.Consumer; + +public class StatusBar implements Widget, Drawable, Element, Selectable { + + private static final Identifier BAR_FILL = new Identifier(SkyblockerMod.NAMESPACE, "bars/bar_fill"); + private static final Identifier BAR_BACK = new Identifier(SkyblockerMod.NAMESPACE, "bars/bar_back"); + + private final Identifier icon; + private final Color[] colors; + private final boolean hasOverflow; + private final @Nullable Color textColor; + + private @Nullable Consumer onClick = null; + public int gridX = 0; + public int gridY = 0; + + public float size = 1; + private int width = 0; + + public float fill = 0; + public float overflowFill = 0; + + private int x = 0; + private int y = 0; + + public StatusBar(Identifier icon, Color[] colors, boolean hasOverflow, @Nullable Color textColor) { + this.icon = icon; + this.colors = colors; + this.hasOverflow = hasOverflow; + this.textColor = textColor; + } + + @Override + public void render(DrawContext context, int mouseX, int mouseY, float delta) { + context.drawGuiTexture(icon, x, y, 9, 9); + context.drawGuiTexture(BAR_BACK, x + 10, y + 1, width - 10, 7); + RenderHelper.renderNineSliceColored(context, BAR_FILL, x + 11, y + 2, (int) ((width - 12) * fill), 5, colors[0]); + if (hasOverflow) { + RenderHelper.renderNineSliceColored(context, BAR_FILL, x + 11, y + 2, (int) ((width - 12) * overflowFill), 5, colors[1]); + } + } + + // GUI shenanigans + + @Override + public void setX(int x) { + this.x = x; + } + + @Override + public void setY(int y) { + this.y = y; + } + + @Override + public int getX() { + return x; + } + + @Override + public int getY() { + return y; + } + + @Override + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + + @Override + public int getHeight() { + return 9; + } + + @Override + public ScreenRect getNavigationFocus() { + return Widget.super.getNavigationFocus(); + } + + @Override + public boolean isMouseOver(double mouseX, double mouseY) { + return mouseX >= x && mouseX <= x + getWidth() && mouseY >= y && mouseY <= y + getHeight(); + } + + @Override + public void forEachChild(Consumer consumer) {} + + @Override + public void setFocused(boolean focused) { + + } + + @Override + public boolean isFocused() { + return false; + } + + @Override + public SelectionType getType() { + return SelectionType.NONE; + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (!isMouseOver(mouseX, mouseY)) return false; + if (onClick != null) { + onClick.accept(this); + } + return true; + } + + public void setOnClick(@Nullable Consumer onClick) { + this.onClick = onClick; + } + + @Override + public void appendNarrations(NarrationMessageBuilder builder) { + + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java new file mode 100644 index 00000000..1f0b7ffe --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java @@ -0,0 +1,44 @@ +package de.hysky.skyblocker.skyblock.fancybars; + +import de.hysky.skyblocker.skyblock.FancyStatusBars; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.Nullable; + +public class StatusBarsConfigScreen extends Screen { + + private static final Identifier HOTBAR_TEXTURE = new Identifier("hud/hotbar"); + + private @Nullable StatusBar cursorBar = null; + protected StatusBarsConfigScreen(Text title) { + super(title); + } + + @Override + public void render(DrawContext context, int mouseX, int mouseY, float delta) { + super.render(context, mouseX, mouseY, delta); + context.drawGuiTexture(HOTBAR_TEXTURE, width/2 - 91, height-22, 182, 22); + if (cursorBar != null) { + cursorBar.setX(mouseX); + cursorBar.setY(mouseY); + cursorBar.render(context, mouseX, mouseY, delta); + } + } + + @Override + protected void init() { + super.init(); + FancyStatusBars.statusBars.values().forEach(this::setup); + } + + private void setup(StatusBar statusBar) { + this.addDrawableChild(statusBar); + statusBar.setOnClick(this::onClick); + } + + private void onClick(StatusBar statusBar) { + + } +} -- cgit From 81ee919672b3628c58e6499c806bac14d6b40ec4 Mon Sep 17 00:00:00 2001 From: vicisacat Date: Tue, 2 Apr 2024 17:23:55 +0200 Subject: idk again --- .../skyblock/fancybars/StatusBarsConfigScreen.java | 35 +++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java index 1f0b7ffe..2d80e764 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java @@ -2,15 +2,24 @@ package de.hysky.skyblocker.skyblock.fancybars; import de.hysky.skyblocker.skyblock.FancyStatusBars; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.ScreenPos; +import net.minecraft.client.gui.ScreenRect; +import net.minecraft.client.gui.navigation.NavigationAxis; +import net.minecraft.client.gui.navigation.NavigationDirection; import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.Text; import net.minecraft.util.Identifier; import org.jetbrains.annotations.Nullable; +import java.util.HashMap; +import java.util.Map; + public class StatusBarsConfigScreen extends Screen { private static final Identifier HOTBAR_TEXTURE = new Identifier("hud/hotbar"); + private final Map meaningFullName = new HashMap<>(); + private @Nullable StatusBar cursorBar = null; protected StatusBarsConfigScreen(Text title) { super(title); @@ -24,6 +33,23 @@ public class StatusBarsConfigScreen extends Screen { cursorBar.setX(mouseX); cursorBar.setY(mouseY); cursorBar.render(context, mouseX, mouseY, delta); + + for (ScreenRect screenRect : meaningFullName.keySet()) { + for (NavigationDirection value : NavigationDirection.values()) { + boolean overlaps = screenRect.getBorder(value).overlaps(new ScreenRect(new ScreenPos(mouseX - 1, mouseY - 1), 3, 3)); + if (overlaps) { + int[] ints = meaningFullName.get(screenRect); + if (ints[0] != cursorBar.gridX || ints[1] != cursorBar.gridY) { + FancyStatusBars.barGrid.remove(cursorBar.gridX, cursorBar.gridY); + if (value.getAxis().equals(NavigationAxis.VERTICAL)) { + if (value.isPositive()) { + FancyStatusBars.barGrid.addRow(ints[1]+1, ints[0]>0); + } + } + } + } + } + } } } @@ -39,6 +65,13 @@ public class StatusBarsConfigScreen extends Screen { } private void onClick(StatusBar statusBar) { - + cursorBar = statusBar; + meaningFullName.clear(); + FancyStatusBars.barGrid.remove(statusBar.gridX, statusBar.gridY); + FancyStatusBars.statusBars.values().forEach(statusBar1 -> { + meaningFullName.put( + new ScreenRect(new ScreenPos(statusBar1.getX(), statusBar1.getY()), statusBar1.getWidth(), statusBar1.getHeight()), + new int[]{statusBar1.gridX, statusBar1.gridY}); + }); } } -- cgit From a6ac00af3844d5f59c1f528a901c94e91e58889d Mon Sep 17 00:00:00 2001 From: vicisacat Date: Wed, 3 Apr 2024 15:33:12 +0200 Subject: progress ig --- .../hysky/skyblocker/skyblock/FancyStatusBars.java | 77 ++++++++++++++++++++++ .../skyblocker/skyblock/fancybars/BarGrid.java | 5 ++ .../skyblocker/skyblock/fancybars/StatusBar.java | 2 +- .../skyblock/fancybars/StatusBarsConfigScreen.java | 13 +++- 4 files changed, 95 insertions(+), 2 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java index 7744626b..a5cbab1f 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java @@ -47,6 +47,83 @@ public class FancyStatusBars { statusBars.put("intelligence", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(0, 255, 255), new Color(180, 0, 255)}, true, null)); statusBars.put("defense", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(255, 255, 255)}, false, null)); statusBars.put("experience", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(100, 220, 70)}, false, null)); + + barGrid.addRow(1, false); + barGrid.add(1, 1, statusBars.get("health")); + barGrid.add(2, 1, statusBars.get("intelligence")); + barGrid.addRow(2, false); + barGrid.add(1, 2, statusBars.get("experience")); + barGrid.addRow(-1, true); + barGrid.add(1, -1, statusBars.get("defense")); + } + + public static void updatePositions() { + final float hotbarSize = 182; + final int width = MinecraftClient.getInstance().getWindow().getScaledWidth(); + final int height = MinecraftClient.getInstance().getWindow().getScaledHeight(); + + // THE TOP + for (int i = 0; i < barGrid.getTopSize(); i++) { + List row = barGrid.getRow(i + 1, false); + 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) { + bar.size--; + totalSize--; + if (totalSize == 12) break whileLoop; + } + } else { + for (StatusBar bar : row) { + bar.size++; + totalSize++; + if (totalSize == 12) break whileLoop; + } + } + } + + int x = width/2 - 91; + int y = height - 33 - 10*i; + for (StatusBar bar : row) { + bar.setX(x); + bar.setY(y); + bar.setWidth((int) ((bar.size / 12.f)*hotbarSize)); + x += bar.getWidth(); + } + } + + // BOTTOM LEFT + for (int i = 0; i < barGrid.getBottomLeftSize(); i++) { + List row = barGrid.getRow(-(i + 1), false); + if (row.isEmpty()) continue; + int x = width/2 - 91 - 2; + int y = height - 15-10*i; + for (StatusBar bar : row) { + bar.setY(y); + bar.setWidth(bar.size*25); + x -= bar.getWidth(); + bar.setX(x); + } + } + // BOTTOM RIGHT + for (int i = 0; i < barGrid.getBottomRightSize(); i++) { + List row = barGrid.getRow(-(i + 1), true); + if (row.isEmpty()) continue; + int x = width/2 + 91 + 2; + int y = height - 15-10*i; + for (StatusBar bar : row) { + bar.setX(x); + bar.setY(y); + bar.setWidth(bar.size*25); + x += bar.getWidth(); + } + } } public FancyStatusBars() { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/BarGrid.java b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/BarGrid.java index b85f85e1..5e774d4a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/BarGrid.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/BarGrid.java @@ -90,4 +90,9 @@ public class BarGrid { } } } + + public int getTopSize() {return top.size();} + + public int getBottomLeftSize() {return bottomLeft.size();} + public int getBottomRightSize() {return bottomRight.size();} } 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 9c688051..a15660f0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBar.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBar.java @@ -26,7 +26,7 @@ public class StatusBar implements Widget, Drawable, Element, Selectable { public int gridX = 0; public int gridY = 0; - public float size = 1; + public int size = 1; private int width = 0; public float fill = 0; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java index 2d80e764..0a08a199 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java @@ -34,7 +34,7 @@ public class StatusBarsConfigScreen extends Screen { cursorBar.setY(mouseY); cursorBar.render(context, mouseX, mouseY, delta); - for (ScreenRect screenRect : meaningFullName.keySet()) { + mainLoop: for (ScreenRect screenRect : meaningFullName.keySet()) { for (NavigationDirection value : NavigationDirection.values()) { boolean overlaps = screenRect.getBorder(value).overlaps(new ScreenRect(new ScreenPos(mouseX - 1, mouseY - 1), 3, 3)); if (overlaps) { @@ -44,8 +44,19 @@ public class StatusBarsConfigScreen extends Screen { if (value.getAxis().equals(NavigationAxis.VERTICAL)) { if (value.isPositive()) { FancyStatusBars.barGrid.addRow(ints[1]+1, ints[0]>0); + FancyStatusBars.barGrid.add(1, ints[1] + 1, cursorBar); + } else { + FancyStatusBars.barGrid.addRow(ints[1], ints[0]>0); + FancyStatusBars.barGrid.add(1, ints[1], cursorBar); + } + } else { + if (value.isPositive()) { + FancyStatusBars.barGrid.add(ints[0] + 1, ints[1], cursorBar); + } else { + FancyStatusBars.barGrid.add(ints[0], ints[1], cursorBar); } } + break mainLoop; } } } -- cgit From 3fe321f463fc728374e6f3423c6ac9eef31be184 Mon Sep 17 00:00:00 2001 From: vicisacat Date: Wed, 10 Apr 2024 18:19:29 +0200 Subject: more progress --- .../hysky/skyblocker/skyblock/FancyStatusBars.java | 28 +++++++++++++--- .../skyblocker/skyblock/fancybars/BarGrid.java | 3 +- .../skyblocker/skyblock/fancybars/StatusBar.java | 38 ++++++++++++++++++++- .../skyblock/fancybars/StatusBarsConfigScreen.java | 39 +++++++++++++++++++--- 4 files changed, 97 insertions(+), 11 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java index a5cbab1f..6995c4d2 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java @@ -1,11 +1,17 @@ package de.hysky.skyblocker.skyblock; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.fancybars.BarGrid; import de.hysky.skyblocker.skyblock.fancybars.StatusBar; +import de.hysky.skyblocker.skyblock.fancybars.StatusBarsConfigScreen; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.render.RenderHelper; +import de.hysky.skyblocker.utils.scheduler.Scheduler; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; @@ -43,11 +49,13 @@ public class FancyStatusBars { public static Map statusBars = new HashMap<>(); static { - statusBars.put("health", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(255, 0, 0), new Color(255, 220, 0)}, true, null)); - statusBars.put("intelligence", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(0, 255, 255), new Color(180, 0, 255)}, true, null)); - statusBars.put("defense", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(255, 255, 255)}, false, null)); - statusBars.put("experience", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(100, 220, 70)}, false, null)); + statusBars.put("health", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(255, 0, 0), new Color(255, 220, 0)}, true, null, "health")); + statusBars.put("intelligence", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(0, 255, 255), new Color(180, 0, 255)}, true, null, "intelligence")); + statusBars.put("defense", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(255, 255, 255)}, false, null, "defense")); + statusBars.put("experience", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(100, 220, 70)}, false, null, "experience")); + } + public static void init() { barGrid.addRow(1, false); barGrid.add(1, 1, statusBars.get("health")); barGrid.add(2, 1, statusBars.get("intelligence")); @@ -55,6 +63,10 @@ public class FancyStatusBars { barGrid.add(1, 2, statusBars.get("experience")); barGrid.addRow(-1, true); barGrid.add(1, -1, statusBars.get("defense")); + + ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register( + ClientCommandManager.literal("skyblocker") + .then(ClientCommandManager.literal("bar_test").executes(Scheduler.queueOpenScreenCommand(StatusBarsConfigScreen::new))))); } public static void updatePositions() { @@ -62,6 +74,14 @@ public class FancyStatusBars { 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 row = barGrid.getRow(i + 1, false); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/BarGrid.java b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/BarGrid.java index 5e774d4a..93219240 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/BarGrid.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/BarGrid.java @@ -33,7 +33,7 @@ public class BarGrid { LinkedList statusBars = (x < 0? bottomLeft: bottomRight).get(Math.abs(y)-1); statusBars.add(Math.min(Math.abs(x)-1, statusBars.size()), bar); bar.gridY = y; - bar.gridX = -(statusBars.indexOf(bar)+1); + bar.gridX = (int) ((statusBars.indexOf(bar)+1) * Math.signum(x)); } } @@ -54,6 +54,7 @@ public class BarGrid { } public void remove(int x, int y) { + System.out.println("Removing x: " + x + " y: " + y); if (y > 0) { if (x < 1) throw new IllegalArgumentException("x can't be negative, x: " + x); LinkedList statusBars = top.get(y-1); 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 a15660f0..3b6453a0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBar.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBar.java @@ -2,11 +2,14 @@ package de.hysky.skyblocker.skyblock.fancybars; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.utils.render.RenderHelper; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.*; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; import net.minecraft.client.gui.widget.ClickableWidget; import net.minecraft.client.gui.widget.Widget; +import net.minecraft.util.Colors; import net.minecraft.util.Identifier; +import org.apache.commons.lang3.builder.ToStringBuilder; import org.jetbrains.annotations.Nullable; import java.awt.*; @@ -21,6 +24,7 @@ public class StatusBar implements Widget, Drawable, Element, Selectable { private final Color[] colors; private final boolean hasOverflow; private final @Nullable Color textColor; + private final String name; private @Nullable Consumer onClick = null; public int gridX = 0; @@ -35,21 +39,41 @@ public class StatusBar implements Widget, Drawable, Element, Selectable { private int x = 0; private int y = 0; - public StatusBar(Identifier icon, Color[] colors, boolean hasOverflow, @Nullable Color textColor) { + public StatusBar(Identifier icon, Color[] colors, boolean hasOverflow, @Nullable Color textColor, String name) { this.icon = icon; this.colors = colors; this.hasOverflow = hasOverflow; this.textColor = textColor; + this.name = name; + } + + public StatusBar(Identifier icon, Color[] colors, boolean hasOverflow, @Nullable Color textColor){ + this(icon, colors, hasOverflow, textColor, "no name"); } @Override public void render(DrawContext context, int mouseX, int mouseY, float delta) { + if (width <= 0) return; context.drawGuiTexture(icon, x, y, 9, 9); context.drawGuiTexture(BAR_BACK, x + 10, y + 1, width - 10, 7); RenderHelper.renderNineSliceColored(context, BAR_FILL, x + 11, y + 2, (int) ((width - 12) * fill), 5, colors[0]); if (hasOverflow) { RenderHelper.renderNineSliceColored(context, BAR_FILL, x + 11, y + 2, (int) ((width - 12) * overflowFill), 5, colors[1]); } + context.drawText(MinecraftClient.getInstance().textRenderer, gridX + " ; " + gridY , x, y-9, Colors.WHITE, true); + } + + public void renderCursor(DrawContext context, int mouseX, int mouseY, float delta) { + int temp_x = x; + int temp_y = y; + int temp_width = width; + x = mouseX; + y = mouseY; + width = 100; + render(context, mouseX, mouseY, delta); + x = temp_x; + y = temp_y; + width = temp_width; } // GUI shenanigans @@ -133,4 +157,16 @@ public class StatusBar implements Widget, Drawable, Element, Selectable { public void appendNarrations(NarrationMessageBuilder builder) { } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("gridX", gridX) + .append("gridY", gridY) + .append("size", size) + .append("x", x) + .append("y", y) + .append("width", width) + .toString(); + } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java index 0a08a199..c1605303 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java @@ -21,18 +21,20 @@ public class StatusBarsConfigScreen extends Screen { private final Map meaningFullName = new HashMap<>(); private @Nullable StatusBar cursorBar = null; - protected StatusBarsConfigScreen(Text title) { - super(title); + public StatusBarsConfigScreen() { + super(Text.of("Status Bars Config")); + FancyStatusBars.updatePositions(); } @Override public void render(DrawContext context, int mouseX, int mouseY, float delta) { + for (ScreenRect screenRect : meaningFullName.keySet()) { + context.fillGradient(screenRect.position().x(), screenRect.position().y(), screenRect.position().x() + screenRect.width(), screenRect.position().y() + screenRect.height(), 0xFFFF0000, 0xFF0000FF); + } super.render(context, mouseX, mouseY, delta); context.drawGuiTexture(HOTBAR_TEXTURE, width/2 - 91, height-22, 182, 22); if (cursorBar != null) { - cursorBar.setX(mouseX); - cursorBar.setY(mouseY); - cursorBar.render(context, mouseX, mouseY, delta); + cursorBar.renderCursor(context, mouseX, mouseY, delta); mainLoop: for (ScreenRect screenRect : meaningFullName.keySet()) { for (NavigationDirection value : NavigationDirection.values()) { @@ -40,6 +42,8 @@ public class StatusBarsConfigScreen extends Screen { if (overlaps) { int[] ints = meaningFullName.get(screenRect); if (ints[0] != cursorBar.gridX || ints[1] != cursorBar.gridY) { + System.out.println("Moving " + cursorBar); + System.out.println(ints[0] + " " + ints[1]); FancyStatusBars.barGrid.remove(cursorBar.gridX, cursorBar.gridY); if (value.getAxis().equals(NavigationAxis.VERTICAL)) { if (value.isPositive()) { @@ -56,8 +60,11 @@ public class StatusBarsConfigScreen extends Screen { FancyStatusBars.barGrid.add(ints[0], ints[1], cursorBar); } } + FancyStatusBars.updatePositions(); + System.out.println("After " + cursorBar); break mainLoop; } + break; } } } @@ -75,14 +82,36 @@ public class StatusBarsConfigScreen extends Screen { statusBar.setOnClick(this::onClick); } + @Override + public void removed() { + super.removed(); + FancyStatusBars.statusBars.values().forEach(statusBar -> statusBar.setOnClick(null)); + } + + @Override + public boolean shouldPause() { + return false; + } + private void onClick(StatusBar statusBar) { cursorBar = statusBar; meaningFullName.clear(); FancyStatusBars.barGrid.remove(statusBar.gridX, statusBar.gridY); + FancyStatusBars.updatePositions(); FancyStatusBars.statusBars.values().forEach(statusBar1 -> { meaningFullName.put( new ScreenRect(new ScreenPos(statusBar1.getX(), statusBar1.getY()), statusBar1.getWidth(), statusBar1.getHeight()), new int[]{statusBar1.gridX, statusBar1.gridY}); }); } + + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (cursorBar != null) { + cursorBar = null; + FancyStatusBars.updatePositions(); + return true; + } + return super.mouseReleased(mouseX, mouseY, button); + } } -- cgit From 94f72e832a2c166c8bbd61480b75803f4c6b1071 Mon Sep 17 00:00:00 2001 From: vicisacat Date: Fri, 12 Apr 2024 17:16:39 +0200 Subject: guess what? progress! --- .../hysky/skyblocker/skyblock/FancyStatusBars.java | 18 +++- .../skyblock/fancybars/StatusBarsConfigScreen.java | 99 +++++++++++++++++----- 2 files changed, 94 insertions(+), 23 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java index 6995c4d2..a29d3f60 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java @@ -110,25 +110,33 @@ public class FancyStatusBars { int x = width/2 - 91; int y = height - 33 - 10*i; - for (StatusBar bar : row) { + for (int j = 0; j < row.size(); j++) { + StatusBar bar = row.get(j); bar.setX(x); bar.setY(y); bar.setWidth((int) ((bar.size / 12.f)*hotbarSize)); x += bar.getWidth(); + bar.gridY = i+1; + bar.gridX = j+1; } } + final int maxSize = 3; // BOTTOM LEFT for (int i = 0; i < barGrid.getBottomLeftSize(); i++) { List row = barGrid.getRow(-(i + 1), false); if (row.isEmpty()) continue; int x = width/2 - 91 - 2; int y = height - 15-10*i; - for (StatusBar bar : row) { + for (int j = 0; j < row.size(); j++) { + StatusBar bar = row.get(j); + bar.size = Math.min(bar.size, maxSize); bar.setY(y); bar.setWidth(bar.size*25); x -= bar.getWidth(); bar.setX(x); + bar.gridX = -j-1; + bar.gridY = -i-1; } } // BOTTOM RIGHT @@ -137,11 +145,15 @@ public class FancyStatusBars { if (row.isEmpty()) continue; int x = width/2 + 91 + 2; int y = height - 15-10*i; - for (StatusBar bar : row) { + for (int j = 0; j < row.size(); j++) { + StatusBar bar = row.get(j); + bar.size = Math.min(bar.size, maxSize); bar.setX(x); bar.setY(y); bar.setWidth(bar.size*25); x += bar.getWidth(); + bar.gridX = j+1; + bar.gridY = -i-1; } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java index c1605303..23b5b71c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBarsConfigScreen.java @@ -11,7 +11,9 @@ import net.minecraft.text.Text; import net.minecraft.util.Identifier; import org.jetbrains.annotations.Nullable; +import java.util.Collection; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; public class StatusBarsConfigScreen extends Screen { @@ -21,60 +23,100 @@ public class StatusBarsConfigScreen extends Screen { private final Map meaningFullName = new HashMap<>(); private @Nullable StatusBar cursorBar = null; + public StatusBarsConfigScreen() { super(Text.of("Status Bars Config")); FancyStatusBars.updatePositions(); } + private final int[] currentCoords = new int[]{0, 0}; + @Override public void render(DrawContext context, int mouseX, int mouseY, float delta) { for (ScreenRect screenRect : meaningFullName.keySet()) { context.fillGradient(screenRect.position().x(), screenRect.position().y(), screenRect.position().x() + screenRect.width(), screenRect.position().y() + screenRect.height(), 0xFFFF0000, 0xFF0000FF); } super.render(context, mouseX, mouseY, delta); - context.drawGuiTexture(HOTBAR_TEXTURE, width/2 - 91, height-22, 182, 22); + context.drawGuiTexture(HOTBAR_TEXTURE, width / 2 - 91, height - 22, 182, 22); if (cursorBar != null) { cursorBar.renderCursor(context, mouseX, mouseY, delta); + ScreenRect mouseRect = new ScreenRect(new ScreenPos(mouseX - 1, mouseY - 1), 3, 3); - mainLoop: for (ScreenRect screenRect : meaningFullName.keySet()) { + if (FancyStatusBars.barGrid.getTopSize() == 0 && topBarZone.overlaps(mouseRect) && currentCoords[1] != 1) { + FancyStatusBars.barGrid.remove(cursorBar.gridX, cursorBar.gridY); + FancyStatusBars.barGrid.addRow(1, true); + FancyStatusBars.barGrid.add(1, 1, cursorBar); + currentCoords[1] = 1; + FancyStatusBars.updatePositions(); + } else if (FancyStatusBars.barGrid.getBottomLeftSize() == 0 && bottomLeftBarZone.overlaps(mouseRect) && (currentCoords[0] != -1 || currentCoords[1] != -1)) { + FancyStatusBars.barGrid.remove(cursorBar.gridX, cursorBar.gridY); + FancyStatusBars.barGrid.addRow(-1, false); + FancyStatusBars.barGrid.add(-1, -1, cursorBar); + currentCoords[0] = -1; + currentCoords[1] = -1; + FancyStatusBars.updatePositions(); + } else if (FancyStatusBars.barGrid.getBottomRightSize() == 0 && bottomRightBarZone.overlaps(mouseRect) && (currentCoords[0] != 1 || currentCoords[1] != -1)) { + FancyStatusBars.barGrid.remove(cursorBar.gridX, cursorBar.gridY); + FancyStatusBars.barGrid.addRow(-1, true); + FancyStatusBars.barGrid.add(1, -1, cursorBar); + currentCoords[0] = 1; + currentCoords[1] = -1; + FancyStatusBars.updatePositions(); + } else rectLoop:for (ScreenRect screenRect : meaningFullName.keySet()) { for (NavigationDirection value : NavigationDirection.values()) { - boolean overlaps = screenRect.getBorder(value).overlaps(new ScreenRect(new ScreenPos(mouseX - 1, mouseY - 1), 3, 3)); + boolean overlaps = screenRect.getBorder(value).add(value).overlaps(mouseRect); + if (overlaps) { int[] ints = meaningFullName.get(screenRect); - if (ints[0] != cursorBar.gridX || ints[1] != cursorBar.gridY) { + if (ints[0] != currentCoords[0] || ints[1] != currentCoords[1]) { + currentCoords[0] = ints[0]; + currentCoords[1] = ints[1]; System.out.println("Moving " + cursorBar); System.out.println(ints[0] + " " + ints[1]); FancyStatusBars.barGrid.remove(cursorBar.gridX, cursorBar.gridY); + + int offset; if (value.getAxis().equals(NavigationAxis.VERTICAL)) { - if (value.isPositive()) { - FancyStatusBars.barGrid.addRow(ints[1]+1, ints[0]>0); - FancyStatusBars.barGrid.add(1, ints[1] + 1, cursorBar); + if (!value.isPositive()) { + offset = ints[1] > 0 ? 1 : 0; } else { - FancyStatusBars.barGrid.addRow(ints[1], ints[0]>0); - FancyStatusBars.barGrid.add(1, ints[1], cursorBar); + offset = ints[1] > 0 ? 0 : -1; } + + FancyStatusBars.barGrid.addRow(ints[1] + offset, ints[0] > 0); + FancyStatusBars.barGrid.add(ints[0] < 0 ? -1 : 1, ints[1] + offset, cursorBar); } else { if (value.isPositive()) { - FancyStatusBars.barGrid.add(ints[0] + 1, ints[1], cursorBar); + offset = ints[0] > 0 ? 1 : 0; } else { - FancyStatusBars.barGrid.add(ints[0], ints[1], cursorBar); + offset = ints[0] > 0 ? 0 : -1; } + + FancyStatusBars.barGrid.add(ints[0] + offset, ints[1], cursorBar); } FancyStatusBars.updatePositions(); System.out.println("After " + cursorBar); - break mainLoop; } - break; + break rectLoop; } } } } } + private ScreenRect topBarZone = new ScreenRect(0, 0, 0, 0); + private ScreenRect bottomLeftBarZone = new ScreenRect(0, 0, 0, 0); + private ScreenRect bottomRightBarZone = new ScreenRect(0, 0, 0, 0); + @Override protected void init() { super.init(); - FancyStatusBars.statusBars.values().forEach(this::setup); + Collection values = FancyStatusBars.statusBars.values(); + values.forEach(this::setup); + checkZeroCoordinates(values); + topBarZone = new ScreenRect(width / 2 - 91, height - 22 - 15, 182, 15); + bottomLeftBarZone = new ScreenRect(width / 2 - 91 - 20, height - 22, 20, 22); + bottomRightBarZone = new ScreenRect(width / 2 + 91, height - 22, 20, 22); } private void setup(StatusBar statusBar) { @@ -82,10 +124,23 @@ public class StatusBarsConfigScreen extends Screen { statusBar.setOnClick(this::onClick); } + private static void checkZeroCoordinates(Iterable bars) { + int offset = 0; + for (StatusBar statusBar : bars) { + if (statusBar.gridX == 0 || statusBar.gridY == 0) { + statusBar.setX(5); + statusBar.setY(5 + offset); + statusBar.setWidth(30); + offset += statusBar.getHeight(); + } + } + } + @Override public void removed() { super.removed(); FancyStatusBars.statusBars.values().forEach(statusBar -> statusBar.setOnClick(null)); + FancyStatusBars.updatePositions(); } @Override @@ -95,14 +150,16 @@ public class StatusBarsConfigScreen extends Screen { private void onClick(StatusBar statusBar) { cursorBar = statusBar; - meaningFullName.clear(); FancyStatusBars.barGrid.remove(statusBar.gridX, statusBar.gridY); FancyStatusBars.updatePositions(); - FancyStatusBars.statusBars.values().forEach(statusBar1 -> { - meaningFullName.put( - new ScreenRect(new ScreenPos(statusBar1.getX(), statusBar1.getY()), statusBar1.getWidth(), statusBar1.getHeight()), - new int[]{statusBar1.gridX, statusBar1.gridY}); - }); + updateScreenRects(); + } + + private void updateScreenRects() { + meaningFullName.clear(); + FancyStatusBars.statusBars.values().forEach(statusBar1 -> meaningFullName.put( + new ScreenRect(new ScreenPos(statusBar1.getX(), statusBar1.getY()), statusBar1.getWidth(), statusBar1.getHeight()), + new int[]{statusBar1.gridX, statusBar1.gridY})); } @Override @@ -110,6 +167,8 @@ public class StatusBarsConfigScreen extends Screen { if (cursorBar != null) { cursorBar = null; FancyStatusBars.updatePositions(); + checkZeroCoordinates(FancyStatusBars.statusBars.values()); + updateScreenRects(); return true; } return super.mouseReleased(mouseX, mouseY, button); -- cgit From 3581365e654306cf08d0c4284ddfa454befd519d Mon Sep 17 00:00:00 2001 From: vicisacat Date: Sat, 13 Apr 2024 00:00:50 +0200 Subject: ssergorp --- .../hysky/skyblocker/skyblock/FancyStatusBars.java | 49 ++++++++++---- .../skyblocker/skyblock/fancybars/StatusBar.java | 26 +++++++- .../skyblock/fancybars/StatusBarsConfigScreen.java | 78 ++++++++++++++++------ 3 files changed, 117 insertions(+), 36 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java index a29d3f60..1a582863 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/FancyStatusBars.java @@ -1,7 +1,5 @@ package de.hysky.skyblocker.skyblock; -import com.mojang.brigadier.Command; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.fancybars.BarGrid; @@ -10,6 +8,7 @@ import de.hysky.skyblocker.skyblock.fancybars.StatusBarsConfigScreen; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.render.RenderHelper; import de.hysky.skyblocker.utils.scheduler.Scheduler; +import jdk.jshell.EvalException; import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.minecraft.client.MinecraftClient; @@ -20,7 +19,7 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.Identifier; import java.awt.*; -import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -48,14 +47,13 @@ public class FancyStatusBars { public static BarGrid barGrid = new BarGrid(); public static Map statusBars = new HashMap<>(); - static { - statusBars.put("health", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(255, 0, 0), new Color(255, 220, 0)}, true, null, "health")); - statusBars.put("intelligence", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(0, 255, 255), new Color(180, 0, 255)}, true, null, "intelligence")); - statusBars.put("defense", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(255, 255, 255)}, false, null, "defense")); - statusBars.put("experience", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "temp"), new Color[]{new Color(100, 220, 70)}, false, null, "experience")); - } - public static void init() { + statusBars.put("health", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "bars/icons/health"), new Color[]{new Color(255, 0, 0), new Color(255, 220, 0)}, true, null, "health")); + statusBars.put("intelligence", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "bars/icons/intelligence"), new Color[]{new Color(0, 255, 255), new Color(180, 0, 255)}, true, null, "intelligence")); + statusBars.put("defense", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "bars/icons/defense"), new Color[]{new Color(255, 255, 255)}, false, null, "defense")); + statusBars.put("experience", new StatusBar(new Identifier(SkyblockerMod.NAMESPACE, "bars/icons/experience"), new Color[]{new Color(100, 220, 70)}, false, null, "experience")); + + barGrid.addRow(1, false); barGrid.add(1, 1, statusBars.get("health")); barGrid.add(2, 1, statusBars.get("intelligence")); @@ -95,14 +93,18 @@ public class FancyStatusBars { whileLoop: while (totalSize != 12) { if (totalSize > 12) { for (StatusBar bar : row) { - bar.size--; - totalSize--; + if (bar.size > 2) { // 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) { - bar.size++; - totalSize++; + if (bar.size < 12) { + bar.size++; + totalSize++; + } if (totalSize == 12) break whileLoop; } } @@ -177,6 +179,25 @@ public class FancyStatusBars { var player = client.player; if (!SkyblockerConfigManager.get().general.bars.enableBars || player == null || Utils.isInTheRift()) return false; + + if (!SkyblockerConfigManager.get().general.oldBars) { + Collection barCollection = statusBars.values(); + for (StatusBar value : barCollection) { + value.render(context, -1, -1, client.getLastFrameDuration()); + } + for (StatusBar statusBar : barCollection) { + statusBar.renderText(context); + } + StatusBarTracker.Resource health = statusBarTracker.getHealth(); + statusBars.get("health").updateValues(health.value() / (float) health.max(), health.overflow() / (float) health.max(), health.value()); + + StatusBarTracker.Resource intelligence = statusBarTracker.getMana(); + statusBars.get("intelligence").updateValues(intelligence.value() / (float) intelligence.max(), intelligence.overflow() / (float) intelligence.max(), intelligence.value()); + int defense = statusBarTracker.getDefense(); + statusBars.get("defense").updateValues(defense / (defense + 100.f), 0, defense); + statusBars.get("experience").updateValues(player.experienceProgress, 0, player.experienceLevel); + return true; + } anchorsX[0] = scaledWidth / 2 - 91; anchorsY[0] = scaledHeight - 33; anchorsX[1] = anchorsX[0]; 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 3b6453a0..6d321a90 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBar.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/fancybars/StatusBar.java @@ -3,6 +3,7 @@ package de.hysky.skyblocker.skyblock.fancybars; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.utils.render.RenderHelper; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.*; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; import net.minecraft.client.gui.widget.ClickableWidget; @@ -36,6 +37,8 @@ public class StatusBar implements Widget, Drawable, Element, Selectable { public float fill = 0; public float overflowFill = 0; + private Object text = ""; + private int x = 0; private int y = 0; @@ -57,12 +60,32 @@ public class StatusBar implements Widget, Drawable, Element, Selectable { context.drawGuiTexture(icon, x, y, 9, 9); context.drawGuiTexture(BAR_BACK, x + 10, y + 1, width - 10, 7); RenderHelper.renderNineSliceColored(context, BAR_FILL, x + 11, y + 2, (int) ((width - 12) * fill), 5, colors[0]); - if (hasOverflow) { + if (hasOverflow && overflowFill > 0) { RenderHelper.renderNineSliceColored(context, BAR_FILL, x + 11, y + 2, (int) ((width - 12) * overflowFill), 5, colors[1]); } context.drawText(MinecraftClient.getInstance().textRenderer, gridX + " ; " + gridY , x, y-9, Colors.WHITE, true); } + public void updateValues(float fill, float overflowFill, Object text) { + this.text = text; + this.fill = fill; + this.overflowFill = overflowFill; + } + + public void renderText(DrawContext context) { + TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; + String text = this.text.toString(); + int x = this.x + 11 + (width - textRenderer.getWidth(text) - 12) / 2; + int y = this.y - 3; + + final int[] offsets = new int[]{-1, 1}; + for (int i : offsets) { + context.drawText(textRenderer, text, x + i, y, 0, false); + context.drawText(textRenderer, text, x, y + i, 0, false); + } + context.drawText(textRenderer, text, x, y, (textColor == null ? colors[0]: textColor).getRGB(), false); + } + public void renderCursor(DrawContext context, int mouseX, int mouseY, float delta) { int temp_x = x; int temp_y = y; @@ -161,6 +184,7 @@ public class StatusBar implements Widget, Drawable, Element, Selectable { @Override public String toString() { return new ToStringBuilde