From ca2c617e036dbfc07243faf06f0b77a03636134d Mon Sep 17 00:00:00 2001 From: vicisacat Date: Tue, 26 Mar 2024 17:50:20 +0100 Subject: testing things --- .../de/hysky/skyblocker/skyblock/FancyStatusBars.java | 13 +++++++++++++ .../skyblocker/textures/gui/sprites/bars/bar_test.png | Bin 0 -> 170 bytes 2 files changed, 13 insertions(+) create mode 100644 src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_test.png (limited to 'src') 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; } diff --git a/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_test.png b/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_test.png new file mode 100644 index 00000000..cde2a16f Binary files /dev/null and b/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_test.png differ -- cgit From 897b3021fbc1aca4b481c741fbe873bd7e5b197f Mon Sep 17 00:00:00 2001 From: vicisacat Date: Thu, 28 Mar 2024 13:43:10 +0100 Subject: colored nine-slice --- .../mixin/accessor/DrawContextInvoker.java | 3 + .../skyblocker/utils/render/RenderHelper.java | 71 ++++++++++++++++++++++ 2 files changed, 74 insertions(+) (limited to 'src') diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/DrawContextInvoker.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/DrawContextInvoker.java index 8dcccf34..bb201dce 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/DrawContextInvoker.java +++ b/src/main/java/de/hysky/skyblocker/mixin/accessor/DrawContextInvoker.java @@ -4,6 +4,7 @@ import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.tooltip.TooltipComponent; import net.minecraft.client.gui.tooltip.TooltipPositioner; +import net.minecraft.util.Identifier; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; @@ -14,4 +15,6 @@ public interface DrawContextInvoker { @Invoker void invokeDrawTooltip(TextRenderer textRenderer, List components, int x, int y, TooltipPositioner positioner); + @Invoker + void invokeDrawTexturedQuad(Identifier texture, int x1, int x2, int y1, int y2, int z, float u1, float u2, float v1, float v2, float red, float green, float blue, float alpha); } diff --git a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java index e39b5364..da179d0e 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.logging.LogUtils; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.mixin.accessor.BeaconBlockEntityRendererInvoker; +import de.hysky.skyblocker.mixin.accessor.DrawContextInvoker; import de.hysky.skyblocker.utils.render.culling.OcclusionCulling; import de.hysky.skyblocker.utils.render.title.Title; import de.hysky.skyblocker.utils.render.title.TitleContainer; @@ -12,8 +13,11 @@ import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; import net.fabricmc.fabric.api.event.Event; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.render.*; import net.minecraft.client.render.VertexFormat.DrawMode; +import net.minecraft.client.texture.Scaling; +import net.minecraft.client.texture.Sprite; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.sound.SoundEvents; import net.minecraft.text.OrderedText; @@ -28,6 +32,7 @@ import org.joml.Vector3f; import org.lwjgl.opengl.GL11; import org.slf4j.Logger; +import java.awt.*; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; @@ -370,6 +375,72 @@ public class RenderHelper { return x >= x1 && x <= x2 && y >= y1 && y <= y2; } + private static void drawSprite(DrawContext context, Sprite sprite, int i, int j, int k, int l, int x, int y, int z, int width, int height, float red, float green, float blue, float alpha) { + if (width == 0 || height == 0) { + return; + } + ((DrawContextInvoker) context).invokeDrawTexturedQuad(sprite.getAtlasId(), x, x + width, y, y + height, z, sprite.getFrameU((float)k / (float)i), sprite.getFrameU((float)(k + width) / (float)i), sprite.getFrameV((float)l / (float)j), sprite.getFrameV((float)(l + height) / (float)j), red, green, blue, alpha); + } + private static void drawSpriteTiled(DrawContext context, Sprite sprite, int x, int y, int z, int width, int height, int i, int j, int tileWidth, int tileHeight, int k, int l, float red, float green, float blue, float alpha) { + if (width <= 0 || height <= 0) { + return; + } + if (tileWidth <= 0 || tileHeight <= 0) { + throw new IllegalArgumentException("Tiled sprite texture size must be positive, got " + tileWidth + "x" + tileHeight); + } + for (int m = 0; m < width; m += tileWidth) { + int n = Math.min(tileWidth, width - m); + for (int o = 0; o < height; o += tileHeight) { + int p = Math.min(tileHeight, height - o); + drawSprite(context, sprite, k, l, i, j, x + m, y + o, z, n, p, red, green, blue, alpha); + } + } + } + + public static void renderNineSliceColored(DrawContext context, Identifier texture, int x, int y, int width, int height, float red, float green, float blue, float alpha) { + Sprite sprite = MinecraftClient.getInstance().getGuiAtlasManager().getSprite(texture); + Scaling scaling = MinecraftClient.getInstance().getGuiAtlasManager().getScaling(sprite); + if (!(scaling instanceof Scaling.NineSlice nineSlice)) return; + Scaling.NineSlice.Border border = nineSlice.border(); + int z = 0; + + int i = Math.min(border.left(), width / 2); + int j = Math.min(border.right(), width / 2); + int k = Math.min(border.top(), height / 2); + int l = Math.min(border.bottom(), height / 2); + if (width == nineSlice.width() && height == nineSlice.height()) { + drawSprite(context, sprite, nineSlice.width(), nineSlice.height(), 0, 0, x, y, z, width, height, red, green, blue, alpha); + return; + } + if (height == nineSlice.height()) { + drawSprite(context, sprite, nineSlice.width(), nineSlice.height(), 0, 0, x, y, z, i, height, red, green, blue, alpha); + drawSpriteTiled(context, sprite, x + i, y, z, width - j - i, height, i, 0, nineSlice.width() - j - i, nineSlice.height(), nineSlice.width(), nineSlice.height(), red, green, blue, alpha); + drawSprite(context, sprite, nineSlice.width(), nineSlice.height(), nineSlice.width() - j, 0, x + width - j, y, z, j, height, red, green, blue, alpha); + return; + } + if (width == nineSlice.width()) { + drawSprite(context, sprite, nineSlice.width(), nineSlice.height(), 0, 0, x, y, z, width, k, red, green, blue, alpha); + drawSpriteTiled(context, sprite, x, y + k, z, width, height - l - k, 0, k, nineSlice.width(), nineSlice.height() - l - k, nineSlice.width(), nineSlice.height(), red, green, blue, alpha); + drawSprite(context, sprite, nineSlice.width(), nineSlice.height(), 0, nineSlice.height() - l, x, y + height - l, z, width, l, red, green, blue, alpha); + return; + } + drawSprite(context, sprite, nineSlice.width(), nineSlice.height(), 0, 0, x, y, z, i, k, red, green, blue, alpha); + drawSpriteTiled(context, sprite, x + i, y, z, width - j - i, k, i, 0, nineSlice.width() - j - i, k, nineSlice.width(), nineSlice.height(), red, green, blue, alpha); + drawSprite(context, sprite, nineSlice.width(), nineSlice.height(), nineSlice.width() - j, 0, x + width - j, y, z, j, k, red, green, blue, alpha); + drawSprite(context, sprite, nineSlice.width(), nineSlice.height(), 0, nineSlice.height() - l, x, y + height - l, z, i, l, red, green, blue, alpha); + drawSpriteTiled(context, sprite, x + i, y + height - l, z, width - j - i, l, i, nineSlice.height() - l, nineSlice.width() - j - i, l, nineSlice.width(), nineSlice.height(), red, green, blue, alpha); + drawSprite(context, sprite, nineSlice.width(), nineSlice.height(), nineSlice.width() - j, nineSlice.height() - l, x + width - j, y + height - l, z, j, l, red, green, blue, alpha); + drawSpriteTiled(context, sprite, x, y + k, z, i, height - l - k, 0, k, i, nineSlice.height() - l - k, nineSlice.width(), nineSlice.height(), red, green, blue, alpha); + drawSpriteTiled(context, sprite, x + i, y + k, z, width - j - i, height - l - k, i, k, nineSlice.width() - j - i, nineSlice.height() - l - k, nineSlice.width(), nineSlice.height(), red, green, blue, alpha); + drawSpriteTiled(context, sprite, x + width - j, y + k, z, i, height - l - k, nineSlice.width() - j, k, j, nineSlice.height() - l - k, nineSlice.width(), nineSlice.height(), red, green, blue, alpha); + } + + private static final float[] colorBuffer = new float[4]; + public static void renderNineSliceColored(DrawContext context, Identifier texture, int x, int y, int width, int height, Color color) { + color.getComponents(colorBuffer); + renderNineSliceColored(context, texture, x, y, width, height, colorBuffer[0],colorBuffer[1],colorBuffer[2],colorBuffer[3]); + } + // TODO Get rid of reflection once the new Sodium is released private static MethodHandle getDeferredRenderTaskHandle() { try { -- 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 +++++++ .../textures/gui/sprites/bars/bar_back.png | Bin 0 -> 196 bytes .../textures/gui/sprites/bars/bar_back.png.mcmeta | 10 ++ .../textures/gui/sprites/bars/bar_fill.png | Bin 0 -> 179 bytes .../textures/gui/sprites/bars/bar_fill.png.mcmeta | 10 ++ .../textures/gui/sprites/bars/bar_test.png | Bin 170 -> 0 bytes 9 files changed, 325 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 create mode 100644 src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_back.png create mode 100644 src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_back.png.mcmeta create mode 100644 src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_fill.png create mode 100644 src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_fill.png.mcmeta delete mode 100644 src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_test.png (limited to 'src') 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) { + + } +} diff --git a/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_back.png b/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_back.png new file mode 100644 index 00000000..150d6ad6 Binary files /dev/null and b/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_back.png differ diff --git a/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_back.png.mcmeta b/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_back.png.mcmeta new file mode 100644 index 00000000..4744012e --- /dev/null +++ b/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_back.png.mcmeta @@ -0,0 +1,10 @@ +{ + "gui": { + "scaling": { + "type": "nine_slice", + "width": 120, + "height": 7, + "border": 3 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_fill.png b/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_fill.png new file mode 100644 index 00000000..714ae675 Binary files /dev/null and b/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_fill.png differ diff --git a/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_fill.png.mcmeta b/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_fill.png.mcmeta new file mode 100644 index 00000000..8a9af809 --- /dev/null +++ b/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_fill.png.mcmeta @@ -0,0 +1,10 @@ +{ + "gui": { + "scaling": { + "type": "nine_slice", + "width": 120, + "height": 5, + "border": 2 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_test.png b/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_test.png deleted file mode 100644 index cde2a16f..00000000 Binary files a/src/main/resources/assets/skyblocker/textures/gui/sprites/bars/bar_test.png and /dev/null differ -- 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') 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') 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 --- .../java/de/hysky/skyblocker/SkyblockerMod.java | 1 + .../hysky/skyblocker/skyblock/FancyStatusBars.java | 28 +++++++++++++--- .../skyblocker/skyblock/fancybars/BarGrid.java | 3 +- .../skyblocker/skyblock/fancybars/StatusBar.java | 38 ++++++++++++++++++++- .../skyblock/fancybars/StatusBarsConfigScreen.java | 39 +++++++++++++++++++--- 5 files changed, 98 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java index 091e8548..6d86c88d 100644 --- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java +++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java @@ -172,6 +172,7 @@ public class SkyblockerMod implements ClientModInitializer { Debug.init(); Kuudra.init(); RenderHelper.init(); + FancyStatusBars.init(); containerSolverManager.init(); statusBarTracker.init(); BeaconHighlighter.init(); 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') 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