From dcba939382628279ebce2cb0dc4b4a0ce8ee2f2f Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Tue, 7 May 2024 23:10:15 +0200 Subject: progress porting all widgets --- .../tabhud/screenbuilder/ScreenBuilder.java | 48 ++++++++++++++++++---- .../tabhud/screenbuilder/ScreenMaster.java | 20 ++++++++- .../skyblock/tabhud/util/PlayerListMgr.java | 7 +++- .../tabhud/widget/CameraPositionWidget.java | 2 +- .../skyblock/tabhud/widget/CommsWidget.java | 45 ++++++++++---------- .../skyblock/tabhud/widget/ComposterWidget.java | 20 +++++++-- .../skyblock/tabhud/widget/CookieWidget.java | 8 ++-- .../skyblock/tabhud/widget/DungeonBuffWidget.java | 7 ++-- .../skyblock/tabhud/widget/DungeonDeathWidget.java | 7 ++-- .../tabhud/widget/DungeonDownedWidget.java | 8 ++-- .../tabhud/widget/DungeonPlayerWidget.java | 7 ++-- .../tabhud/widget/DungeonPuzzleWidget.java | 7 ++-- .../tabhud/widget/DungeonSecretWidget.java | 7 ++-- .../tabhud/widget/DungeonServerWidget.java | 7 ++-- .../skyblock/tabhud/widget/EffectWidget.java | 8 ++-- .../skyblock/tabhud/widget/ElectionWidget.java | 7 ++-- .../skyblock/tabhud/widget/EmptyWidget.java | 2 +- .../skyblock/tabhud/widget/ErrorWidget.java | 4 +- .../skyblock/tabhud/widget/EssenceWidget.java | 44 +++++++++----------- .../skyblock/tabhud/widget/EventWidget.java | 24 ++++------- .../skyblock/tabhud/widget/FireSaleWidget.java | 8 ++-- .../skyblock/tabhud/widget/ForgeWidget.java | 36 +++++----------- .../skyblock/tabhud/widget/HudWidget.java | 18 +++++++- .../skyblock/tabhud/widget/TabHudWidget.java | 2 +- 24 files changed, 210 insertions(+), 143 deletions(-) (limited to 'src') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java index 4f311cb1..78118e4c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java @@ -5,6 +5,7 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; +import java.util.Map; import java.util.NoSuchElementException; import com.google.gson.JsonArray; @@ -12,21 +13,24 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; +import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr; +import de.hysky.skyblocker.skyblock.tabhud.util.ScreenConst; +import de.hysky.skyblocker.skyblock.tabhud.widget.*; import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline.AlignStage; import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline.CollideStage; import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline.PipelineStage; import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline.PlaceStage; import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline.StackStage; -import de.hysky.skyblocker.skyblock.tabhud.widget.DungeonPlayerWidget; -import de.hysky.skyblocker.skyblock.tabhud.widget.ErrorWidget; -import de.hysky.skyblocker.skyblock.tabhud.widget.EventWidget; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.Identifier; public class ScreenBuilder { + public static boolean positionsNeedsUpdating = true; + // layout pipeline private final ArrayList layoutPipeline = new ArrayList<>(); @@ -37,6 +41,8 @@ public class ScreenBuilder { private final String builderName; + private final Map positioning = new Object2ObjectOpenHashMap<>(); + /** * Create a ScreenBuilder from a json. */ @@ -160,20 +166,44 @@ public class ScreenBuilder { return this.objectMap.get(name); } + private static int totalWidth = 0; + /** * Run the pipeline to build a Screen */ public void run(DrawContext context, int screenW, int screenH) { - for (HudWidget w : instances) { - w.update(); - } - for (PipelineStage ps : layoutPipeline) { - ps.run(screenW, screenH); + if (positionsNeedsUpdating) { + + positionsNeedsUpdating = false; + final int maxY = 200; + final int startY = 20; + + totalWidth = 0; + + int currentWidth = 0; + int currentY = startY; + for (TabHudWidget tabHudWidget : PlayerListMgr.widgetsToShow) { + if (positioning.getOrDefault(tabHudWidget.getInternalID(), false)) continue; + if (currentY + tabHudWidget.getHeight() > maxY) { + totalWidth += currentWidth + ScreenConst.WIDGET_PAD; + currentY = startY; + currentWidth = 0; + } + tabHudWidget.setPosition(totalWidth, currentY); + currentY += tabHudWidget.getHeight() + ScreenConst.WIDGET_PAD; + currentWidth = Math.max(currentWidth, tabHudWidget.getWidth()); + } + totalWidth += currentWidth; } + + MatrixStack matrices = context.getMatrices(); + matrices.push(); + matrices.translate((float) (screenW - totalWidth)/2, 0, 0); for (HudWidget w : instances) { w.render(context); } + matrices.pop(); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java index a877e052..5591ea37 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java @@ -6,7 +6,9 @@ import com.google.gson.JsonParser; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.annotations.Init; import de.hysky.skyblocker.skyblock.tabhud.TabHud; +import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr; import de.hysky.skyblocker.skyblock.tabhud.util.PlayerLocator; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; import de.hysky.skyblocker.skyblock.tabhud.widget.TabHudWidget; import net.fabricmc.fabric.api.resource.ResourceManagerHelper; import net.fabricmc.fabric.api.resource.ResourcePackActivationType; @@ -21,6 +23,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedReader; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; @@ -82,7 +86,21 @@ public class ScreenMaster { @Init public static void init() { - //ClassPath.from(TabHudWidget.class.getClassLoader()).getTopLevelClasses("de.hysky.skyblocker.skyblock.tabhud.widget").iterator().forEachRemaining(); + try { + ClassPath.from(TabHudWidget.class.getClassLoader()).getTopLevelClasses("de.hysky.skyblocker.skyblock.tabhud.widget").iterator().forEachRemaining(classInfo -> { + Class load = classInfo.load(); + if (!load.getSuperclass().equals(TabHudWidget.class)) return; + try { + TabHudWidget tabHudWidget = (TabHudWidget) load.getDeclaredConstructor().newInstance(); + PlayerListMgr.widgetInstances.put(tabHudWidget.getHypixelWidgetName(), tabHudWidget); + } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) { + LOGGER.error("[Skyblocker] Failed to load {} hud widget", classInfo.getName(), e); + } + + }); + } catch (Exception e) { + LOGGER.error("[Skyblocker] Failed to get instances of hud widgets", e); + } // WHY MUST IT ALWAYS BE SUCH NESTED GARBAGE MINECRAFT KEEP THAT IN DFU FFS diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java index 01bf4500..6cf8c684 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java @@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.tabhud.util; import de.hysky.skyblocker.mixins.accessors.PlayerListHudAccessor; +import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenBuilder; import de.hysky.skyblocker.skyblock.tabhud.widget.TabHudWidget; import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; import de.hysky.skyblocker.utils.Utils; @@ -37,7 +38,7 @@ import java.util.regex.Pattern; public class PlayerListMgr { public static final Logger LOGGER = LoggerFactory.getLogger("Skyblocker Regex"); - private static final Pattern PLAYERS_COLUMN_PATTERN = Pattern.compile("(^|\\s)Players \\((\\d+)\\)(\\s|$)"); + private static final Pattern PLAYERS_COLUMN_PATTERN = Pattern.compile("(^|\\s)(Players \\(\\d+\\)|Island)(\\s|$)"); private static final Pattern INFO_COLUMN_PATTERN = Pattern.compile("(^|\\s)Info(\\s|$)"); /** @@ -74,6 +75,7 @@ public class PlayerListMgr { boolean playersDone = false; String hypixelWidgetName = ""; List contents = new ArrayList<>(); + // TODO DUNGEONS CHECK for (PlayerListEntry playerListEntry : playerList) { Text displayName = playerListEntry.getDisplayName(); @@ -106,12 +108,13 @@ public class PlayerListMgr { contents.clear(); Pair nameAndInfo = getNameAndInfo(displayName); hypixelWidgetName = nameAndInfo.left(); - contents.add(nameAndInfo.right()); + if (!nameAndInfo.right().getString().isBlank()) contents.add(nameAndInfo.right()); continue; } contents.add(displayName); } } + ScreenBuilder.positionsNeedsUpdating = true; } private static TabHudWidget getTabHudWidget(String hypixelWidgetName, List lines) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CameraPositionWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CameraPositionWidget.java index 7464429f..e8b9c4f2 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CameraPositionWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CameraPositionWidget.java @@ -12,7 +12,7 @@ public class CameraPositionWidget extends HudWidget { private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); public CameraPositionWidget() { - super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + super(TITLE, Formatting.DARK_PURPLE.getColorValue(), "position"); } @Override diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CommsWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CommsWidget.java index be72b31b..04babee7 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CommsWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CommsWidget.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.tabhud.widget; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -15,7 +16,7 @@ import net.minecraft.util.Formatting; // this widget shows the status of the king's commissions. // (dwarven mines and crystal hollows) -public class CommsWidget extends HudWidget { +public class CommsWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Commissions").formatted(Formatting.DARK_AQUA, Formatting.BOLD); @@ -26,33 +27,31 @@ public class CommsWidget extends HudWidget { private static final Pattern COMM_PATTERN = Pattern.compile("(?.*): (?.*)%?"); public CommsWidget() { - super(TITLE, Formatting.DARK_AQUA.getColorValue()); + super("Commissions", TITLE, Formatting.DARK_AQUA.getColorValue()); } @Override - public void updateContent() { - for (int i = 50; i <= 53; i++) { - Matcher m = PlayerListMgr.regexAt(i, COMM_PATTERN); - // end of comms found? - if (m == null) { - if (i == 50) { - this.addComponent(new IcoTextComponent()); + public void updateContent(List lines) { + if (lines.isEmpty()) { + this.addComponent(new IcoTextComponent()); + return; + } + for (Text line : lines) { + Matcher m = COMM_PATTERN.matcher(line.getString()); + if (m.matches()) { + ProgressComponent pc; + + String name = m.group("name"); + String progress = m.group("progress"); + + if (progress.equals("DONE")) { + pc = new ProgressComponent(Ico.BOOK, Text.of(name), Text.of(progress), 100f, Colors.pcntToCol(100)); + } else { + float pcnt = Float.parseFloat(progress.substring(0, progress.length() - 1)); + pc = new ProgressComponent(Ico.BOOK, Text.of(name), pcnt, Colors.pcntToCol(pcnt)); } - break; - } - - ProgressComponent pc; - - String name = m.group("name"); - String progress = m.group("progress"); - - if (progress.equals("DONE")) { - pc = new ProgressComponent(Ico.BOOK, Text.of(name), Text.of(progress), 100f, Colors.pcntToCol(100)); - } else { - float pcnt = Float.parseFloat(progress.substring(0, progress.length() - 1)); - pc = new ProgressComponent(Ico.BOOK, Text.of(name), pcnt, Colors.pcntToCol(pcnt)); + this.addComponent(pc); } - this.addComponent(pc); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ComposterWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ComposterWidget.java index a7fd93e5..a00370ca 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ComposterWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ComposterWidget.java @@ -3,25 +3,39 @@ package de.hysky.skyblocker.skyblock.tabhud.widget; import de.hysky.skyblocker.skyblock.tabhud.util.Ico; import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr; +import de.hysky.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; +import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import java.util.List; + // this widget shows info about the garden's composter -public class ComposterWidget extends HudWidget { +public class ComposterWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Composter").formatted(Formatting.GREEN, Formatting.BOLD); public ComposterWidget() { - super(TITLE, Formatting.GREEN.getColorValue()); + super("Composter", TITLE, Formatting.GREEN.getColorValue()); } @Override - public void updateContent() { + public void updateContent(List lines) { int offset = (PlayerListMgr.strAt(46) != null) ? 1 : 0; + for (Text line : lines) { + switch (line.getString().toLowerCase()) { + case String s when s.contains("organic") -> this.addComponent(new IcoTextComponent(Ico.SAPLING, line)); + case String s when s.contains("fuel") -> this.addComponent(new IcoTextComponent(Ico.FURNACE, line)); + case String s when s.contains("time") -> this.addComponent(new IcoTextComponent(Ico.CLOCK, line)); + case String s when s.contains("stored") -> this.addComponent(new IcoTextComponent(Ico.COMPOSTER, line)); + default -> this.addComponent(new PlainTextComponent(line)); + } + } + this.addSimpleIcoText(Ico.SAPLING, "Organic Matter:", Formatting.YELLOW, 48 + offset); this.addSimpleIcoText(Ico.FURNACE, "Fuel:", Formatting.BLUE, 49 + offset); this.addSimpleIcoText(Ico.CLOCK, "Time Left:", Formatting.RED, 50 + offset); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CookieWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CookieWidget.java index c65d5a58..8a75f9af 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CookieWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CookieWidget.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.tabhud.widget; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -13,7 +14,8 @@ import net.minecraft.util.Formatting; // this widget shows info about active super cookies // or not, if you're unwilling to buy one -public class CookieWidget extends HudWidget { +// TODO change maybe at some point +public class CookieWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Cookie Info").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); @@ -21,11 +23,11 @@ public class CookieWidget extends HudWidget { private static final Pattern COOKIE_PATTERN = Pattern.compile(".*\\nCookie Buff\\n(?.*)\\n"); public CookieWidget() { - super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + super("Cookies", TITLE, Formatting.DARK_PURPLE.getColorValue()); } @Override - public void updateContent() { + public void updateContent(List ignored) { String footertext = PlayerListMgr.getFooter(); if (footertext == null || !footertext.contains("Cookie Buff")) { this.addComponent(new IcoTextComponent()); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonBuffWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonBuffWidget.java index a86f27bf..fc3362ed 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonBuffWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonBuffWidget.java @@ -8,20 +8,21 @@ import net.minecraft.util.Formatting; import java.util.Arrays; import java.util.Comparator; +import java.util.List; // this widget shows a list of obtained dungeon buffs -public class DungeonBuffWidget extends HudWidget { +public class DungeonBuffWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Dungeon Buffs").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); public DungeonBuffWidget() { - super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + super("Dungeon Buffs", TITLE, Formatting.DARK_PURPLE.getColorValue()); } @Override - public void updateContent() { + public void updateContent(List ignored) { String footertext = PlayerListMgr.getFooter(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDeathWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDeathWidget.java index 651b24e4..2494d742 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDeathWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDeathWidget.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.tabhud.widget; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -13,7 +14,7 @@ import net.minecraft.util.Formatting; // this widget shows various dungeon info // deaths, healing, dmg taken, milestones -public class DungeonDeathWidget extends HudWidget { +public class DungeonDeathWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Death").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); @@ -23,11 +24,11 @@ public class DungeonDeathWidget extends HudWidget { private static final Pattern DEATH_PATTERN = Pattern.compile("Team Deaths: (?\\d+).*"); public DungeonDeathWidget() { - super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + super("Dungeon Buffs", TITLE, Formatting.DARK_PURPLE.getColorValue()); } @Override - public void updateContent() { + public void updateContent(List ignored) { Matcher m = PlayerListMgr.regexAt(25, DEATH_PATTERN); if (m == null) { this.addComponent(new IcoTextComponent()); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDownedWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDownedWidget.java index 365c3d21..e8809596 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDownedWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDownedWidget.java @@ -7,20 +7,22 @@ import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import java.util.List; + // this widget shows info about... something? // related to downed people in dungeons, not sure what this is supposed to show -public class DungeonDownedWidget extends HudWidget { +public class DungeonDownedWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Downed").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); public DungeonDownedWidget() { - super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + super("Downed", TITLE, Formatting.DARK_PURPLE.getColorValue()); } @Override - public void updateContent() { + public void updateContent(List ignored) { String down = PlayerListMgr.strAt(21); if (down == null) { this.addComponent(new IcoTextComponent()); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPlayerWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPlayerWidget.java index 0b3f8f10..cbf881ea 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPlayerWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPlayerWidget.java @@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.tabhud.widget; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -16,7 +17,7 @@ import net.minecraft.util.Formatting; // this widget shows info about a player in the current dungeon group -public class DungeonPlayerWidget extends HudWidget { +public class DungeonPlayerWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Player").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); @@ -49,12 +50,12 @@ public class DungeonPlayerWidget extends HudWidget { // title needs to be changeable here public DungeonPlayerWidget(int player) { - super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + super("Dungeon Players", TITLE, Formatting.DARK_PURPLE.getColorValue()); this.player = player; } @Override - public void updateContent() { + public void updateContent(List ignored) { int start = 1 + (player - 1) * 4; if (PlayerListMgr.strAt(start) == null) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPuzzleWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPuzzleWidget.java index 42cc06a8..9beb85e1 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPuzzleWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPuzzleWidget.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.tabhud.widget; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -12,7 +13,7 @@ import net.minecraft.util.Formatting; // this widget shows info about all puzzeles in the dungeon (name and status) -public class DungeonPuzzleWidget extends HudWidget { +public class DungeonPuzzleWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Puzzles").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); @@ -25,11 +26,11 @@ public class DungeonPuzzleWidget extends HudWidget { private static final Pattern PUZZLE_PATTERN = Pattern.compile("(?.*): \\[(?.*)\\] ?.*"); public DungeonPuzzleWidget() { - super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + super("Puzzles", TITLE, Formatting.DARK_PURPLE.getColorValue()); } @Override - public void updateContent() { + public void updateContent(List ignored) { int pos = 48; while (pos < 60) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java index 8d28208d..4f30bd1d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java @@ -7,21 +7,22 @@ import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import java.util.List; import java.util.regex.Pattern; // this widget shows info about the secrets of the dungeon -public class DungeonSecretWidget extends HudWidget { +public class DungeonSecretWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Discoveries").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); private static final Pattern DISCOVERIES = Pattern.compile("Discoveries: (\\d+)"); public DungeonSecretWidget() { - super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + super("Discoveries", TITLE, Formatting.DARK_PURPLE.getColorValue()); } @Override - public void updateContent() { + public void updateContent(List ignored) { if (!DungeonScore.isDungeonStarted()) { this.addSimpleIcoText(Ico.CHEST, "Secrets:", Formatting.YELLOW, 30); this.addSimpleIcoText(Ico.SKULL, "Crypts:", Formatting.YELLOW, 31); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonServerWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonServerWidget.java index 87d9c6fe..ca208a48 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonServerWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonServerWidget.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.tabhud.widget; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -13,7 +14,7 @@ import net.minecraft.util.Formatting; // this widget shows broad info about the current dungeon // opened/completed rooms, % of secrets found and time taken -public class DungeonServerWidget extends HudWidget { +public class DungeonServerWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Dungeon Info").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); @@ -23,11 +24,11 @@ public class DungeonServerWidget extends HudWidget { private static final Pattern SECRET_PATTERN = Pattern.compile("Secrets Found: (?.*)%"); public DungeonServerWidget() { - super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + super("Dungeon Info", TITLE, Formatting.DARK_PURPLE.getColorValue()); } @Override - public void updateContent() { + public void updateContent(List ignored) { this.addSimpleIcoText(Ico.NTAG, "Name:", Formatting.AQUA, 41); this.addSimpleIcoText(Ico.SIGN, "Rooms Visited:", Formatting.DARK_PURPLE, 42); this.addSimpleIcoText(Ico.SIGN, "Rooms Completed:", Formatting.LIGHT_PURPLE, 43); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EffectWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EffectWidget.java index 924289d8..7dce42b6 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EffectWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EffectWidget.java @@ -8,21 +8,23 @@ import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import java.util.List; + // this widgte shows, how many active effects you have. // it also shows one of those in detail. // the parsing is super suspect and should be replaced by some regexes sometime later -public class EffectWidget extends HudWidget { +public class EffectWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Effect Info").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); public EffectWidget() { - super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + super("Effect Info", TITLE, Formatting.DARK_PURPLE.getColorValue()); } @Override - public void updateContent() { + public void updateContent(List ignored) { String footertext = PlayerListMgr.getFooter(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ElectionWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ElectionWidget.java index 96557556..68635ee6 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ElectionWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ElectionWidget.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock.tabhud.widget; import java.util.HashMap; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -15,7 +16,7 @@ import net.minecraft.util.Formatting; // this widget shows the status or results of the current election -public class ElectionWidget extends HudWidget { +public class ElectionWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Election Info").formatted(Formatting.YELLOW, Formatting.BOLD); @@ -47,11 +48,11 @@ public class ElectionWidget extends HudWidget { private static final Formatting[] COLS = { Formatting.GOLD, Formatting.RED, Formatting.LIGHT_PURPLE }; public ElectionWidget() { - super(TITLE, Formatting.YELLOW.getColorValue()); + super("Election", TITLE, Formatting.YELLOW.getColorValue()); } @Override - public void updateContent() { + public void updateContent(List lines) { String status = PlayerListMgr.strAt(76); if (status == null) { this.addComponent(new IcoTextComponent()); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EmptyWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EmptyWidget.java index c21666d2..e8181c4d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EmptyWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EmptyWidget.java @@ -4,7 +4,7 @@ import net.minecraft.text.Text; public class EmptyWidget extends HudWidget { public EmptyWidget() { - super(Text.empty(), 0); + super(Text.empty(), 0, "empty"); } @Override diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ErrorWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ErrorWidget.java index fe5d9591..05054891 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ErrorWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ErrorWidget.java @@ -15,11 +15,11 @@ public class ErrorWidget extends HudWidget { Text error = Text.of("No info available!"); public ErrorWidget() { - super(TITLE, Formatting.RED.getColorValue()); + super(TITLE, Formatting.RED.getColorValue(), "error"); } public ErrorWidget(String error) { - super(TITLE, Formatting.RED.getColorValue()); + super(TITLE, Formatting.RED.getColorValue(), "error"); this.error = Text.of(error); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EssenceWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EssenceWidget.java index ff97ed3d..c41582b6 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EssenceWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EssenceWidget.java @@ -2,46 +2,40 @@ package de.hysky.skyblocker.skyblock.tabhud.widget; import de.hysky.skyblocker.skyblock.tabhud.util.Ico; import de.hysky.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; +import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; import de.hysky.skyblocker.skyblock.tabhud.widget.component.TableComponent; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -// this widget shows your dungeon essences (dungeon hub only) +import java.util.List; -public class EssenceWidget extends HudWidget { +// this widget shows your dungeon essences (dungeon hub only) - private Text undead, wither, diamond, gold, dragon, spider, ice, crimson; +public class EssenceWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Essences").formatted(Formatting.DARK_AQUA, Formatting.BOLD); public EssenceWidget() { - super(TITLE, Formatting.DARK_AQUA.getColorValue()); + super("Essence", TITLE, Formatting.DARK_AQUA.getColorValue()); } @Override - public void updateContent() { - wither = HudWidget.simpleEntryText(46, "Wither:", Formatting.DARK_PURPLE); - spider = HudWidget.simpleEntryText(47, "Spider:", Formatting.DARK_PURPLE); - undead = HudWidget.simpleEntryText(48, "Undead:", Formatting.DARK_PURPLE); - dragon = HudWidget.simpleEntryText(49, "Dragon:", Formatting.DARK_PURPLE); - gold = HudWidget.simpleEntryText(50, "Gold:", Formatting.DARK_PURPLE); - diamond = HudWidget.simpleEntryText(51, "Diamond:", Formatting.DARK_PURPLE); - ice = HudWidget.simpleEntryText(52, "Ice:", Formatting.DARK_PURPLE); - crimson = HudWidget.simpleEntryText(53, "Crimson:", Formatting.DARK_PURPLE); - - TableComponent tc = new TableComponent(2, 4, Formatting.DARK_AQUA.getColorValue()); - - tc.addToCell(0, 0, new IcoTextComponent(Ico.WITHER, wither)); - tc.addToCell(0, 1, new IcoTextComponent(Ico.STRING, spider)); - tc.addToCell(0, 2, new IcoTextComponent(Ico.FLESH, undead)); - tc.addToCell(0, 3, new IcoTextComponent(Ico.DRAGON, dragon)); - tc.addToCell(1, 0, new IcoTextComponent(Ico.GOLD, gold)); - tc.addToCell(1, 1, new IcoTextComponent(Ico.DIAMOND, diamond)); - tc.addToCell(1, 2, new IcoTextComponent(Ico.ICE, ice)); - tc.addToCell(1, 3, new IcoTextComponent(Ico.REDSTONE, crimson)); - this.addComponent(tc); + public void updateContent(List lines) { + for (Text line : lines) { + switch (line.getString().toLowerCase()) { + case String s when s.contains("wither") -> this.addComponent(new IcoTextComponent(Ico.WITHER, line)); + case String s when s.contains("spider") -> this.addComponent(new IcoTextComponent(Ico.STRING, line)); + case String s when s.contains("undead") -> this.addComponent(new IcoTextComponent(Ico.FLESH, line)); + case String s when s.contains("dragon") -> this.addComponent(new IcoTextComponent(Ico.DRAGON, line)); + case String s when s.contains("gold") -> this.addComponent(new IcoTextComponent(Ico.GOLD, line)); + case String s when s.contains("diamond") -> this.addComponent(new IcoTextComponent(Ico.DIAMOND, line)); + case String s when s.contains("ice") -> this.addComponent(new IcoTextComponent(Ico.ICE, line)); + case String s when s.contains("crimson") -> this.addComponent(new IcoTextComponent(Ico.REDSTONE, line)); + default -> this.addComponent(new PlainTextComponent(line)); + } + } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EventWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EventWidget.java index 13092dd1..6072e4f9 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EventWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EventWidget.java @@ -6,30 +6,22 @@ import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import java.util.List; + // this widget shows info about ongoing events (e.g. election) -public class EventWidget extends HudWidget { +public class EventWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Event Info").formatted(Formatting.YELLOW, Formatting.BOLD); - private final boolean isInGarden; - public EventWidget(boolean isInGarden) { - super(TITLE, Formatting.YELLOW.getColorValue()); - this.isInGarden = isInGarden; + public EventWidget() { + super("Event", TITLE, Formatting.YELLOW.getColorValue()); } @Override - public void updateContent() { - // hypixel devs carefully inserting the most random edge cases #317: - // the event info is placed a bit differently when in the garden. - int offset = (isInGarden) ? -1 : 0; - - this.addSimpleIcoText(Ico.NTAG, "Name:", Formatting.YELLOW, 73 + offset); - - // this could look better - Text time = HudWidget.plainEntryText(74 + offset); - IcoTextComponent t = new IcoTextComponent(Ico.CLOCK, time); - this.addComponent(t); + public void updateContent(List lines) { + this.addComponent(new IcoTextComponent(Ico.NTAG, lines.getFirst())); + this.addComponent(new IcoTextComponent(Ico.CLOCK, lines.get(1))); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java index a7928b6b..7624c3cf 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.tabhud.widget; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -16,7 +17,7 @@ import net.minecraft.util.Formatting; // this widget shows info about fire sales when in the hub. // or not, if there isn't one going on -public class FireSaleWidget extends HudWidget { +public class FireSaleWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Fire Sales").formatted(Formatting.DARK_AQUA, Formatting.BOLD); @@ -28,11 +29,12 @@ public class FireSaleWidget extends HudWidget { private static final Pattern FIRE_PATTERN = Pattern.compile("(?.*): (?\\d*)/(?[0-9.]*)k"); public FireSaleWidget() { - super(TITLE, Formatting.DARK_AQUA.getColorValue()); + super("Fire Sales", TITLE, Formatting.DARK_AQUA.getColorValue()); } + // TODO make it work (waiting for a fire sale to see the widget) @Override - public void updateContent() { + public void updateContent(List ignore) { Text event = PlayerListMgr.textAt(46); if (event == null) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ForgeWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ForgeWidget.java index ff20aa86..40be16cc 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ForgeWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ForgeWidget.java @@ -10,44 +10,30 @@ import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import java.util.List; + // this widget shows what you're forging right now. // for locked slots, the unlock requirement is shown -public class ForgeWidget extends HudWidget { +public class ForgeWidget extends TabHudWidget { - private static final MutableText TITLE = Text.literal("Forge Status").formatted(Formatting.DARK_AQUA, + private static final MutableText TITLE = Text.literal("Forges").formatted(Formatting.DARK_AQUA, Formatting.BOLD); public ForgeWidget() { - super(TITLE, Formatting.DARK_AQUA.getColorValue()); + super("Forges", TITLE, Formatting.DARK_AQUA.getColorValue()); } @Override - public void updateContent() { - int forgestart = 54; - // why is it forges and not looms >:( - String pos = PlayerListMgr.strAt(53); - if (pos == null) { - this.addComponent(new IcoTextComponent()); - return; - } - - if (!pos.startsWith("Forges")) { - forgestart += 2; - } + public void updateContent(List lines) { + boolean b = lines.getFirst().getString().trim().startsWith("("); + for (int i = b ? 1 : 0, slot = 1; i < lines.size(); i++, slot++) { + String trim = lines.get(i).getString().trim(); - for (int i = forgestart, slot = 1; i < forgestart + 5 && i < 60; i++, slot++) { - String fstr = PlayerListMgr.strAt(i); - if (fstr == null || fstr.length() < 3) { - if (i == forgestart) { - this.addComponent(new IcoTextComponent()); - } - break; - } Component c; Text l1, l2; - switch (fstr.substring(3)) { + switch (trim.substring(3)) { case "LOCKED" -> { l1 = Text.literal("Locked").formatted(Formatting.RED); l2 = switch (slot) { @@ -64,7 +50,7 @@ public class ForgeWidget extends HudWidget { c = new IcoTextComponent(Ico.FURNACE, l1); } default -> { - String[] parts = fstr.split(": "); + String[] parts = trim.split(": "); if (parts.length != 2) { c = new IcoFatTextComponent(); } else { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java index 8cc7471a..d095ad60 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java @@ -9,6 +9,7 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr; import de.hysky.skyblocker.skyblock.tabhud.widget.component.Component; import de.hysky.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; @@ -30,7 +31,10 @@ import net.minecraft.util.Formatting; */ public abstract class HudWidget implements Element, Widget { + public static final Object2ObjectOpenHashMap HUDS = new Object2ObjectOpenHashMap<>(); + private final ArrayList components = new ArrayList<>(); + private final String internalID; protected int w = 0, h = 0; private int x = 0, y = 0; private final int color; @@ -44,9 +48,17 @@ public abstract class HudWidget implements Element, Widget { static final int BORDER_SZE_E = 4; static final int COL_BG_BOX = 0xc00c0c0c; - public HudWidget(MutableText title, Integer colorValue) { + /** + * Most often than not this should be instantiated only once. + * @param title title + * @param colorValue the colour + * @param internalID the internal ID, for config, positioning depending on other widgets, all that good stuff + */ + public HudWidget(MutableText title, Integer colorValue, String internalID) { this.title = title; this.color = 0xff000000 | colorValue; + HUDS.put(internalID, this); + this.internalID = internalID; } public void addComponent(Component c) { @@ -262,4 +274,8 @@ public abstract class HudWidget implements Element, Widget { public ScreenRect getNavigationFocus() { return Element.super.getNavigationFocus(); } + + public String getInternalID() { + return internalID; + } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/TabHudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/TabHudWidget.java index 856c9711..58b5d34a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/TabHudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/TabHudWidget.java @@ -13,7 +13,7 @@ public abstract class TabHudWidget extends HudWidget { public TabHudWidget(String hypixelWidgetName, MutableText title, Integer colorValue) { - super(title, colorValue); + super(title, colorValue, hypixelWidgetName.toLowerCase().replace(' ', '_')); this.hypixelWidgetName = hypixelWidgetName; } -- cgit