From ac73162054a4aba93c96b4039f2cf71b1ce4dc79 Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Thu, 9 May 2024 23:56:54 +0200 Subject: made it work! yes I deleted a lot of files also created the config screen class or whatever --- .../mixins/GenericContainerScreenHandlerMixin.java | 1 + .../skyblocker/mixins/PlayerListHudMixin.java | 2 +- .../auction/AuctionHouseScreenHandler.java | 1 - .../skyblocker/skyblock/end/EndHudWidget.java | 2 +- .../skyblock/garden/FarmingHudWidget.java | 2 +- .../tabhud/config/WidgetsConfiguration.java | 29 +++++ .../tabhud/screenbuilder/ScreenBuilder.java | 95 +++++++++++++--- .../tabhud/screenbuilder/ScreenMaster.java | 41 +++---- .../skyblock/tabhud/util/PlayerListMgr.java | 62 +++++++---- .../skyblock/tabhud/widget/ElectionWidget.java | 29 ++--- .../skyblock/tabhud/widget/GardenSkillsWidget.java | 108 ------------------- .../tabhud/widget/GardenVisitorsWidget.java | 31 ------ .../skyblock/tabhud/widget/GuestServerWidget.java | 30 ------ .../skyblock/tabhud/widget/IslandGuestsWidget.java | 47 -------- .../skyblock/tabhud/widget/IslandOwnersWidget.java | 66 ------------ .../skyblock/tabhud/widget/IslandSelfWidget.java | 43 -------- .../skyblock/tabhud/widget/IslandServerWidget.java | 32 ------ .../tabhud/widget/JacobsContestWidget.java | 45 ++++---- .../skyblock/tabhud/widget/MinionWidget.java | 2 +- .../skyblock/tabhud/widget/PlayerListWidget.java | 71 ------------ .../skyblock/tabhud/widget/PowderWidget.java | 20 +++- .../skyblock/tabhud/widget/ProfileWidget.java | 24 +++-- .../skyblock/tabhud/widget/QuestWidget.java | 33 ------ .../skyblock/tabhud/widget/ReputationWidget.java | 69 ------------ .../skyblock/tabhud/widget/ServerWidget.java | 1 + .../tabhud/widget/SpidersDenServerWidget.java | 87 --------------- .../skyblock/tabhud/widget/TabHudWidget.java | 2 +- .../skyblock/tabhud/widget/TrapperWidget.java | 25 ----- .../skyblock/tabhud/widget/UpgradeWidget.java | 51 --------- .../skyblock/tabhud/widget/VolcanoWidget.java | 59 ---------- .../skyblock/tabhud/widget/hud/HudCommsWidget.java | 2 +- .../tabhud/widget/hud/HudPowderWidget.java | 2 +- .../tabhud/widget/rift/AdvertisementWidget.java | 35 ------ .../tabhud/widget/rift/GoodToKnowWidget.java | 69 ------------ .../tabhud/widget/rift/RiftProfileWidget.java | 21 ---- .../tabhud/widget/rift/RiftProgressWidget.java | 119 --------------------- .../tabhud/widget/rift/RiftServerInfoWidget.java | 27 ----- .../tabhud/widget/rift/RiftStatsWidget.java | 43 -------- .../skyblock/tabhud/widget/rift/ShenWidget.java | 22 ---- 39 files changed, 251 insertions(+), 1199 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfiguration.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenSkillsWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenVisitorsWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandGuestsWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandOwnersWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandSelfWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandServerWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/QuestWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ReputationWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/SpidersDenServerWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/TrapperWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/UpgradeWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/VolcanoWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/rift/AdvertisementWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/rift/GoodToKnowWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/rift/RiftProfileWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/rift/RiftProgressWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/rift/RiftServerInfoWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/rift/RiftStatsWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/rift/ShenWidget.java (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java index d3a24308..e671406a 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java @@ -42,6 +42,7 @@ public abstract class GenericContainerScreenHandlerMixin extends ScreenHandler { } case null, default -> {} } + onContentChanged(slots.get(slot).inventory); // this should be default behavior } @Override diff --git a/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java b/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java index 2c7fde47..ce04268a 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java @@ -29,7 +29,7 @@ public class PlayerListHudMixin { @Inject(at = @At("HEAD"), method = "render", cancellable = true) public void skyblocker$renderTabHud(CallbackInfo info, @Local(argsOnly = true) DrawContext context, @Local(argsOnly = true) int w) { - if (!Utils.isInDungeons() || !SkyblockerConfigManager.get().uiAndVisuals.tabHud.tabHudEnabled || TabHud.defaultTgl.isPressed()) { + if (!Utils.isOnSkyblock() || !SkyblockerConfigManager.get().uiAndVisuals.tabHud.tabHudEnabled || TabHud.defaultTgl.isPressed()) { return; } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java index 4c4e1c0f..cad56cfa 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java @@ -53,6 +53,5 @@ public class AuctionHouseScreenHandler extends GenericContainerScreenHandler { @Override public void setStackInSlot(int slot, int revision, ItemStack stack) { super.setStackInSlot(slot, revision, stack); - onContentChanged(slots.get(slot).inventory); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java index 56a41e3d..33a2980d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java @@ -37,7 +37,7 @@ public class EndHudWidget extends HudWidget { } public EndHudWidget(MutableText title, Integer colorValue) { - super(title, colorValue); + super(title, colorValue, "hud_end"); this.setX(5); this.setY(5); this.update(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java index 1fdcdac1..3bf72336 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java @@ -51,7 +51,7 @@ public class FarmingHudWidget extends HudWidget { private final MinecraftClient client = MinecraftClient.getInstance(); public FarmingHudWidget() { - super(TITLE, Formatting.YELLOW.getColorValue()); + super(TITLE, Formatting.YELLOW.getColorValue(), "hud_farming"); setX(SkyblockerConfigManager.get().farming.garden.farmingHud.x); setY(SkyblockerConfigManager.get().farming.garden.farmingHud.y); update(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfiguration.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfiguration.java new file mode 100644 index 00000000..5fcde767 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfiguration.java @@ -0,0 +1,29 @@ +package de.hysky.skyblocker.skyblock.tabhud.config; + +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.GenericContainerScreenHandler; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.ScreenHandlerListener; +import net.minecraft.text.Text; + +public class WidgetsConfiguration extends Screen implements ScreenHandlerListener { + + private GenericContainerScreenHandler handler; + + protected WidgetsConfiguration(GenericContainerScreenHandler handler) { + super(Text.literal("Widgets Configuration")); + this.handler = handler; + } + + public void updateHandler(GenericContainerScreenHandler newHandler) { + handler = newHandler; + } + + @Override + public void onSlotUpdate(ScreenHandler handler, int slotId, ItemStack stack) { + } + + @Override + public void onPropertyUpdate(ScreenHandler handler, int property, int value) {} +} 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 78118e4c..7290ecea 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 @@ -3,10 +3,7 @@ package de.hysky.skyblocker.skyblock.tabhud.screenbuilder; import java.io.BufferedReader; 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 java.util.*; import com.google.gson.JsonArray; import com.google.gson.JsonElement; @@ -22,9 +19,12 @@ 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 it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectIntMutablePair; +import it.unimi.dsi.fastutil.objects.ObjectIntPair; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.Colors; import net.minecraft.util.Identifier; public class ScreenBuilder { @@ -85,9 +85,6 @@ public class ScreenBuilder { // do widgets that require args the normal way JsonElement arg; switch (name) { - case "EventWidget" -> { - return new EventWidget(widget.get("inGarden").getAsBoolean()); - } case "DungeonPlayerWidget" -> { return new DungeonPlayerWidget(widget.get("player").getAsInt()); } @@ -168,15 +165,11 @@ public class ScreenBuilder { private static int totalWidth = 0; - /** - * Run the pipeline to build a Screen - */ - public void run(DrawContext context, int screenW, int screenH) { - + private void topAligned(MatrixStack matrices, int screenW, int screenH) { if (positionsNeedsUpdating) { positionsNeedsUpdating = false; - final int maxY = 200; + final int maxY = 300; final int startY = 20; totalWidth = 0; @@ -185,6 +178,7 @@ public class ScreenBuilder { int currentY = startY; for (TabHudWidget tabHudWidget : PlayerListMgr.widgetsToShow) { if (positioning.getOrDefault(tabHudWidget.getInternalID(), false)) continue; + tabHudWidget.update(); if (currentY + tabHudWidget.getHeight() > maxY) { totalWidth += currentWidth + ScreenConst.WIDGET_PAD; currentY = startY; @@ -196,11 +190,82 @@ public class ScreenBuilder { } totalWidth += currentWidth; } + matrices.translate((float) (screenW - totalWidth)/2, 0, 0); + } + + private void centered(MatrixStack matrices, int screenW, int screenH) { + if (positionsNeedsUpdating) { + positionsNeedsUpdating = false; + totalWidth = 0; + + final int maxY = Math.min(400, (int) (screenH*0.9f)); + // each column is a pair of a list of widgets for the rows and an int for the width of the column + List>> columns = new ArrayList<>(); + columns.add(new ObjectIntMutablePair<>(new ArrayList<>(), 0)); + + int currentY = 0; + int currentWidth = 0; + + for (TabHudWidget tabHudWidget : PlayerListMgr.widgetsToShow) { + if (positioning.getOrDefault(tabHudWidget.getInternalID(), false)) continue; + tabHudWidget.update(); + if (currentY + tabHudWidget.getHeight() > maxY) { + currentY = 0; + currentWidth = 0; + columns.add(new ObjectIntMutablePair<>(new ArrayList<>(), 0)); + } + tabHudWidget.setY(currentY); + currentY += tabHudWidget.getHeight() + ScreenConst.WIDGET_PAD; + currentWidth = Math.max(currentWidth, tabHudWidget.getWidth()); + columns.getLast().right(currentWidth); + columns.getLast().left().add(tabHudWidget); + } + for (int i = 0; i < columns.size(); i++) { + ObjectIntPair> listObjectIntPair = columns.get(i); + int columnWidth = listObjectIntPair.rightInt(); + List column = listObjectIntPair.left(); + + // calculate the height of the column + int height = (column.size() - 1) * ScreenConst.WIDGET_PAD; + for (TabHudWidget tabHudWidget : column) { + height += tabHudWidget.getHeight(); + } + // set x and y of the widgets! + int offset = (screenH - height) / 2; + for (TabHudWidget tabHudWidget : column) { + tabHudWidget.setY(tabHudWidget.getY() + offset); + if (i < columns.size() / 2) { + tabHudWidget.setX(totalWidth + columnWidth - tabHudWidget.getWidth()); + } else { + tabHudWidget.setX(totalWidth); + } + } + totalWidth += columnWidth + ScreenConst.WIDGET_PAD; + } + } + + matrices.translate((float) (screenW - totalWidth)/2, 0, 0); + } + + /** + * Run the pipeline to build a Screen + */ + public void run(DrawContext context, int screenW, int screenH) { + + int i = 0; + for (TabHudWidget value : PlayerListMgr.widgetInstances.values()) { + context.drawText(MinecraftClient.getInstance().textRenderer, value.getHypixelWidgetName(), 0, i, PlayerListMgr.widgetsToShow.contains(value) ? Colors.LIGHT_YELLOW : -1, true); + i+=9; + } + + MatrixStack matrices = context.getMatrices(); matrices.push(); - matrices.translate((float) (screenW - totalWidth)/2, 0, 0); - for (HudWidget w : instances) { + + centered(matrices, screenW, screenH); + + for (HudWidget w : PlayerListMgr.widgetsToShow) { 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 5591ea37..258a831e 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 @@ -10,11 +10,13 @@ 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.client.event.lifecycle.v1.ClientLifecycleEvents; import net.fabricmc.fabric.api.resource.ResourceManagerHelper; import net.fabricmc.fabric.api.resource.ResourcePackActivationType; import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.main.Main; import net.minecraft.resource.Resource; import net.minecraft.resource.ResourceManager; import net.minecraft.resource.ResourceType; @@ -86,21 +88,25 @@ public class ScreenMaster { @Init public static void init() { - 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); - } + ClientLifecycleEvents.CLIENT_STARTED.register(client -> { + System.out.println(Object.class); + try { + ClassPath.from(TabHudWidget.class.getClassLoader()).getTopLevelClasses("de.hysky.skyblocker.skyblock.tabhud.widget").iterator().forEachRemaining(classInfo -> { + try { + Class load = Class.forName(classInfo.getName()); + if (!load.getSuperclass().equals(TabHudWidget.class)) return; + TabHudWidget tabHudWidget = (TabHudWidget) load.getDeclaredConstructor().newInstance(); + PlayerListMgr.widgetInstances.put(tabHudWidget.getHypixelWidgetName(), tabHudWidget); + } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException | ClassNotFoundException 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 @@ -139,8 +145,7 @@ public class ScreenMaster { } } catch (Exception ex) { - throw new IllegalStateException( - "Rejected this resource pack. Reason: " + ex.getMessage()); + LOGGER.error("it borked", ex); } } @@ -156,7 +161,7 @@ public class ScreenMaster { } } if (excnt > 0) { - throw new IllegalStateException("This screen definition isn't valid, see above"); + LOGGER.warn("shit went down"); } } }); 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 b8f0cc42..8832e6f0 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 @@ -10,7 +10,9 @@ import it.unimi.dsi.fastutil.Pair; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectObjectMutablePair; +import net.minecraft.text.OrderedText; import net.minecraft.text.Style; +import net.minecraft.util.Formatting; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,8 +40,8 @@ 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+\\)|Island)(\\s|$)"); - private static final Pattern INFO_COLUMN_PATTERN = Pattern.compile("(^|\\s)Info(\\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*|$)"); /** * The player list in tab. @@ -82,8 +84,9 @@ public class PlayerListMgr { if (displayName == null) continue; String string = displayName.getString(); - if (!playersDone) { - // check if Players (number) + if (string.isBlank()) continue; + if (!playersDone) { + // check if Players (number) if (playersColumnPredicate.test(string)) { if (!doingPlayers) { doingPlayers = true; @@ -98,35 +101,54 @@ public class PlayerListMgr { contents.clear(); continue; } - // add player to contents - contents.add(displayName); // Players don't have the silly space } else { - if (string.isBlank()) continue; - if (infoColumnPredicate.test(string)) continue; + if (infoColumnPredicate.test(string)) continue; + // New widget alert!!!! if (!string.startsWith(" ")) { if (!contents.isEmpty()) widgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents)); contents.clear(); Pair nameAndInfo = getNameAndInfo(displayName); hypixelWidgetName = nameAndInfo.left(); - if (!nameAndInfo.right().getString().isBlank()) contents.add(nameAndInfo.right()); + if (!nameAndInfo.right().getString().isBlank()) contents.add(trim(nameAndInfo.right())); continue; } - contents.add(removeSpace(displayName)); // remove the silly space - } - } + } + // Add the line to the content + contents.add(trim(displayName)); + } + if (!contents.isEmpty()) widgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents)); ScreenBuilder.positionsNeedsUpdating = true; } - private static Text removeSpace(Text text) { - AtomicBoolean removed = new AtomicBoolean(false); - MutableText out = Text.empty(); + private static Text trim(Text text) { + List trimmedParts = new ArrayList<>(); + AtomicBoolean leadingSpaceFound = new AtomicBoolean(false); + + // leading spaces text.visit((style, asString) -> { - if (!removed.get()) { - out.append(Text.literal(asString.substring(1)).fillStyle(style)); - removed.set(true); - } else out.append(Text.literal(asString).fillStyle(style)); + String trimmed = asString; + if (!leadingSpaceFound.get()) { + trimmed = trimmed.stripLeading(); + if (!trimmed.isBlank()) leadingSpaceFound.set(true); + else return Optional.empty(); + } + trimmedParts.add(Text.literal(trimmed).setStyle(style)); return Optional.empty(); }, Style.EMPTY); + + // trailing spaces + for (int i = 0; i < trimmedParts.size(); i++) { + Text last = trimmedParts.removeLast(); + String trimmed = last.getString().stripTrailing(); + if (!trimmed.isBlank()) { + trimmedParts.add(Text.literal(trimmed).setStyle(last.getStyle())); + break; + } + } + + MutableText out = Text.empty(); + trimmedParts.forEach(out::append); + return out; } @@ -136,7 +158,7 @@ public class PlayerListMgr { tabHudWidget.updateFromTab(lines); return tabHudWidget; } else { - DefaultTabHudWidget defaultTabHudWidget = new DefaultTabHudWidget(hypixelWidgetName, Text.literal(hypixelWidgetName)); + DefaultTabHudWidget defaultTabHudWidget = new DefaultTabHudWidget(hypixelWidgetName, Text.literal(hypixelWidgetName).formatted(Formatting.BOLD)); widgetInstances.put(defaultTabHudWidget.getHypixelWidgetName(), defaultTabHudWidget); defaultTabHudWidget.updateFromTab(lines); return defaultTabHudWidget; 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 68635ee6..6aedded7 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 @@ -8,6 +8,7 @@ import java.util.regex.Pattern; 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 de.hysky.skyblocker.skyblock.tabhud.widget.component.ProgressComponent; import net.minecraft.item.ItemStack; import net.minecraft.text.MutableText; @@ -53,7 +54,7 @@ public class ElectionWidget extends TabHudWidget { @Override public void updateContent(List lines) { - String status = PlayerListMgr.strAt(76); + String status = lines.getFirst().getString(); if (status == null) { this.addComponent(new IcoTextComponent()); this.addComponent(new IcoTextComponent()); @@ -67,7 +68,11 @@ public class ElectionWidget extends TabHudWidget { IcoTextComponent over = new IcoTextComponent(Ico.BARRIER, EL_OVER); this.addComponent(over); - String win = PlayerListMgr.strAt(77); + for (int i = 1; i < lines.size(); i++) { + this.addComponent(new PlainTextComponent(lines.get(i))); + } + + /*String win = PlayerListMgr.strAt(77); if (win == null || !win.contains(": ")) { this.addComponent(new IcoTextComponent()); } else { @@ -78,26 +83,24 @@ public class ElectionWidget extends TabHudWidget { } this.addSimpleIcoText(Ico.PLAYER, "Participants:", Formatting.AQUA, 78); - this.addSimpleIcoText(Ico.SIGN, "Year:", Formatting.LIGHT_PURPLE, 79); + this.addSimpleIcoText(Ico.SIGN, "Year:", Formatting.LIGHT_PURPLE, 79);*/ } else { // election is going on - this.addSimpleIcoText(Ico.CLOCK, "End in:", Formatting.GOLD, 76); - - for (int i = 77; i <= 79; i++) { - Matcher m = PlayerListMgr.regexAt(i, VOTE_PATTERN); - if (m == null) { - this.addComponent(new ProgressComponent()); - } else { + this.addSimpleIcoText(Ico.CLOCK, "End in:", Formatting.GOLD, lines.getFirst().getString().trim()); + for (int i = 1; i < lines.size(); i++) { + String string = lines.get(i).getString(); + Matcher m = VOTE_PATTERN.matcher(string); + if (m.matches()) { String mayorname = m.group("mayor"); String pcntstr = m.group("pcnt"); float pcnt = Float.parseFloat(pcntstr); - Text candidate = Text.literal(mayorname).formatted(COLS[i - 77]); + Text candidate = Text.literal(mayorname).formatted(COLS[i - 1]); ProgressComponent pc = new ProgressComponent(MAYOR_DATA.get(mayorname), candidate, pcnt, - COLS[i - 77].getColorValue()); + COLS[i - 1].getColorValue()); this.addComponent(pc); - } + } else this.addComponent(new PlainTextComponent(lines.get(i))); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenSkillsWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenSkillsWidget.java deleted file mode 100644 index 69631722..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenSkillsWidget.java +++ /dev/null @@ -1,108 +0,0 @@ -package de.hysky.skyblocker.skyblock.tabhud.widget; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -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.ProgressComponent; -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 info about your skills while in the garden - -public class GardenSkillsWidget extends HudWidget { - - private static final MutableText TITLE = Text.literal("Skill Info").formatted(Formatting.YELLOW, - Formatting.BOLD); - - // match the skill entry - // group 1: skill name and level - // group 2: progress to next level (without "%") - private static final Pattern SKILL_PATTERN = Pattern - .compile("Skills: (?[A-Za-z]* [0-9]*): (?[0-9.MAX]*)%?"); - - private static final Pattern GARDEN_LEVEL_PATTERN = Pattern.compile("Garden Level: (?[IVX0-9]+)(?: \\((?[0-9.]+)% to [IVX0-9]+\\))?"); - - // same, more or less - private static final Pattern MS_PATTERN = Pattern - .compile("Milestone: (?[A-Za-z ]* [0-9]*): (?[0-9.]*)%"); - - public GardenSkillsWidget() { - super(TITLE, Formatting.YELLOW.getColorValue()); - } - - @Override - public void updateContent() { - ProgressComponent spc; - Matcher skillMatcher = PlayerListMgr.regexAt(66, SKILL_PATTERN); - if (skillMatcher == null) { - spc = new ProgressComponent(); - } else { - - String strpcnt = skillMatcher.group("progress"); - String skill = skillMatcher.group("skill"); - - if (strpcnt.equals("MAX")) { - spc = new ProgressComponent(Ico.LANTERN, Text.of(skill), Text.of("MAX"), 100f, - Formatting.RED.getColorValue()); - } else { - float pcnt = Float.parseFloat(strpcnt); - spc = new ProgressComponent(Ico.LANTERN, Text.of(skill), pcnt, - Formatting.GOLD.getColorValue()); - } - } - - this.addComponent(spc); - - ProgressComponent glpc; - Matcher glMatcher = PlayerListMgr.regexAt(45, GARDEN_LEVEL_PATTERN); - - if (glMatcher == null) { - glpc = new ProgressComponent(); - } else { - String level = glMatcher.group("level"); - - if (level.equals("15") || level.equals("XV")) { - glpc = new ProgressComponent(Ico.SEEDS, Text.literal("Garden Level " + level), 100f, Formatting.RED.getColorValue()); - } else { - String strpcnt = glMatcher.group("progress"); - float pcnt = Float.parseFloat(strpcnt); - - glpc = new ProgressComponent(Ico.SEEDS, Text.literal("Garden Level " + level), pcnt, Formatting.DARK_GREEN.getColorValue()); - } - } - - this.addComponent(glpc); - - Text speed = HudWidget.simpleEntryText(67, "SPD", Formatting.WHITE); - IcoTextComponent spd = new IcoTextComponent(Ico.SUGAR, speed); - Text farmfort = HudWidget.simpleEntryText(68, "FFO", Formatting.GOLD); - IcoTextComponent ffo = new IcoTextComponent(Ico.IRON_HOE, farmfort); - - TableComponent tc = new TableComponent(2, 1, Formatting.YELLOW.getColorValue()); - tc.addToCell(0, 0, spd); - tc.addToCell(1, 0, ffo); - this.addComponent(tc); - - this.addComponent(new IcoTextComponent(Ico.IRON_HOE, PlayerListMgr.textAt(70))); - - ProgressComponent pc2; - Matcher milestoneMatcher = PlayerListMgr.regexAt(69, MS_PATTERN); - if (milestoneMatcher == null) { - pc2 = new ProgressComponent(); - } else { - String strpcnt = milestoneMatcher.group("progress"); - String milestone = milestoneMatcher.group("milestone"); - - float pcnt = Float.parseFloat(strpcnt); - pc2 = new ProgressComponent(Ico.MILESTONE, Text.of(milestone), pcnt, - Formatting.GREEN.getColorValue()); - } - this.addComponent(pc2); - } -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenVisitorsWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenVisitorsWidget.java deleted file mode 100644 index c16c2fc3..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenVisitorsWidget.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.hysky.skyblocker.skyblock.tabhud.widget; - -import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr; -import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -public class GardenVisitorsWidget extends HudWidget { - private static final MutableText TITLE = Text.literal("Visitors").formatted(Formatting.DARK_GREEN, Formatting.BOLD); - - public GardenVisitorsWidget() { - super(TITLE, Formatting.DARK_GREEN.getColorValue()); - } - - @Override - public void updateContent() { - int offset = (PlayerListMgr.strAt(46) != null) ? 1 : 0; - - if (PlayerListMgr.textAt(54 + offset) == null) { - this.addComponent(new PlainTextComponent(Text.literal("No visitors!").formatted(Formatting.GRAY))); - return; - } - - for (int i = 54 + offset; i < 59 + offset; i++) { - String text = PlayerListMgr.strAt(i); - if (text != null) - this.addComponent(new PlainTextComponent(Text.literal(text))); - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java deleted file mode 100644 index e06fe6cb..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java +++ /dev/null @@ -1,30 +0,0 @@ -package de.hysky.skyblocker.skyblock.tabhud.widget; - - -import de.hysky.skyblocker.skyblock.tabhud.util.Ico; - -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -// this widget shows info about the private island you're visiting - -public class GuestServerWidget extends HudWidget { - - private static final MutableText TITLE = Text.literal("Island Info").formatted(Formatting.DARK_AQUA, - Formatting.BOLD); - - public GuestServerWidget() { - super(TITLE, Formatting.DARK_AQUA.getColorValue()); - } - - @Override - public void updateContent() { - this.addSimpleIcoText(Ico.MAP, "Area:", Formatting.DARK_AQUA, 41); - this.addSimpleIcoText(Ico.NTAG, "Server ID:", Formatting.GRAY, 42); - this.addSimpleIcoText(Ico.SIGN, "Owner:", Formatting.GREEN, 43); - this.addSimpleIcoText(Ico.SIGN, "Status:", Formatting.BLUE, 44); - - } - -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandGuestsWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandGuestsWidget.java deleted file mode 100644 index 7ad2a09d..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandGuestsWidget.java +++ /dev/null @@ -1,47 +0,0 @@ -package de.hysky.skyblocker.skyblock.tabhud.widget; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr; -import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; - -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -// this widget shows a list of all people visiting the same private island as you - -public class IslandGuestsWidget extends HudWidget { - - private static final MutableText TITLE = Text.literal("Guests").formatted(Formatting.AQUA, - Formatting.BOLD); - - // matches a player entry, removing their level and the hand icon - // group 1: player name - private static final Pattern GUEST_PATTERN = Pattern.compile("\\[\\d*\\] (.*) \\[.\\]"); - - public IslandGuestsWidget() { - super(TITLE, Formatting.AQUA.getColorValue()); - } - - @Override - public void updateContent() { - for (int i = 21; i < 40; i++) { - String str = PlayerListMgr.strAt(i); - if (str == null) { - if (i == 21) { - this.addComponent(new PlainTextComponent(Text.literal("No Visitors!").formatted(Formatting.GRAY))); - } - break; - } - Matcher m = PlayerListMgr.regexAt( i, GUEST_PATTERN); - if (m == null) { - this.addComponent(new PlainTextComponent(Text.of("???"))); - } else { - this.addComponent(new PlainTextComponent(Text.of(m.group(1)))); - } - } - } - -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandOwnersWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandOwnersWidget.java deleted file mode 100644 index aaf24e16..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandOwnersWidget.java +++ /dev/null @@ -1,66 +0,0 @@ -package de.hysky.skyblocker.skyblock.tabhud.widget; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr; -import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; - -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -// this widget shows a list of the owners of a home island while guesting - -public class IslandOwnersWidget extends HudWidget { - - private static final MutableText TITLE = Text.literal("Owners").formatted(Formatting.DARK_PURPLE, - Formatting.BOLD); - - // matches an owner - // group 1: player name - // group 2: last seen, if owner not online - // ^(?.*) \((?.*)\)$|^\[\d*\] (?:\[[A-Za-z]+\] )?(?[A-Za-z0-9_]*)(?: .*)?$|^(?.*)$ - private static final Pattern OWNER_PATTERN = Pattern - .compile("^(?.*) \\((?.*)\\)$|^\\[\\d*\\] (?:\\[[A-Za-z]+\\] )?(?[A-Za-z0-9_]*)(?: .*)?$|^(?.*)$"); - - public IslandOwnersWidget() { - super(TITLE, Formatting.DARK_PURPLE.getColorValue()); - } - - @Override - public void updateContent() { - - for (int i = 1; i < 20; i++) { - Matcher m = PlayerListMgr.regexAt(i, OWNER_PATTERN); - if (m == null) { - break; - } - - String name, lastseen; - Formatting format; - if (m.group("nameA") != null) { - name = m.group("nameA"); - lastseen = m.group("lastseen"); - format = Formatting.GRAY; - } else if (m.group("nameB")!=null){ - name = m.group("nameB"); - lastseen = "Online"; - format = Formatting.WHITE; - } else { - name = m.group("nameC"); - lastseen = "Online"; - format = Formatting.WHITE; - } - - Text entry = Text.literal(name) - .append( - Text.literal(" (" + lastseen + ")") - .formatted(format)); - PlainTextComponent ptc = new PlainTextComponent(entry); - this.addComponent(ptc); - } - - } - -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandSelfWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandSelfWidget.java deleted file mode 100644 index f6afb921..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandSelfWidget.java +++ /dev/null @@ -1,43 +0,0 @@ -package de.hysky.skyblocker.skyblock.tabhud.widget; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr; -import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; - -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -// this widget shows a list of the owners while on your home island - -public class IslandSelfWidget extends HudWidget { - - private static final MutableText TITLE = Text.literal("Owners").formatted(Formatting.DARK_PURPLE, - Formatting.BOLD); - - // matches an owner - // group 1: player name, optionally offline time - // ^\[\d*\] (?:\[[A-Za-z]+\] )?([A-Za-z0-9_() ]*)(?: .*)?$|^(.*)$ - private static final Pattern OWNER_PATTERN = Pattern - .compile("^\\[\\d*\\] (?:\\[[A-Za-z]+\\] )?([A-Za-z0-9_() ]*)(?: .*)?$|^(.*)$"); - - public IslandSelfWidget() { - super(TITLE, Formatting.DARK_PURPLE.getColorValue()); - } - - @Override - public void updateContent() { - for (int i = 1; i < 20; i++) { - Matcher m = PlayerListMgr.regexAt(i, OWNER_PATTERN); - if (m == null) { - break; - } - - Text entry = (m.group(1) != null) ? Text.of(m.group(1)) : Text.of(m.group(2)); - this.addComponent(new PlainTextComponent(entry)); - } - } - -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandServerWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandServerWidget.java deleted file mode 100644 index fcb03b02..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/IslandServerWidget.java +++ /dev/null @@ -1,32 +0,0 @@ -package de.hysky.skyblocker.skyblock.tabhud.widget; - - -import de.hysky.skyblocker.skyblock.tabhud.util.Ico; - -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -// this widget shows info about your home island - -public class IslandServerWidget extends HudWidget { - - private static final MutableText TITLE = Text.literal("Island Info").formatted(Formatting.DARK_AQUA, - Formatting.BOLD); - - public IslandServerWidget() { - super(TITLE, Formatting.DARK_AQUA.getColorValue()); - } - - @Override - public void updateContent() { - this.addSimpleIcoText(Ico.MAP, "Area:", Formatting.DARK_AQUA, 41); - this.addSimpleIcoText(Ico.NTAG, "Server ID:", Formatting.GRAY, 42); - this.addSimpleIcoText(Ico.EMERALD, "Crystals:", Formatting.DARK_PURPLE, 43); - this.addSimpleIcoText(Ico.CHEST, "Stash:", Formatting.GREEN, 44); - this.addSimpleIcoText(Ico.COMMAND, "Minions:", Formatting.BLUE, 45); - - - } - -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/JacobsContestWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/JacobsContestWidget.java index a1c3458b..6e04bd44 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/JacobsContestWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/JacobsContestWidget.java @@ -3,6 +3,7 @@ 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 de.hysky.skyblocker.skyblock.tabhud.widget.component.TableComponent; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -10,6 +11,7 @@ import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -18,7 +20,7 @@ import static java.util.Map.entry; // this widget shows info about the current jacob's contest (garden only) -public class JacobsContestWidget extends HudWidget { +public class JacobsContestWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Jacob's Contest").formatted(Formatting.YELLOW, Formatting.BOLD); @@ -40,36 +42,29 @@ public class JacobsContestWidget extends HudWidget { ); public JacobsContestWidget() { - super(TITLE, Formatting.YELLOW.getColorValue()); + super("Jacob's Contest", TITLE, Formatting.YELLOW.getColorValue()); } @Override - public void updateContent() { - Text jacobStatus = PlayerListMgr.textAt(76); - - if (jacobStatus.getString().equals("ACTIVE")) { - this.addComponent(new IcoTextComponent(Ico.CLOCK, jacobStatus)); + public void updateContent(List lines) { + if (!lines.getFirst().getString().contains("Starts")) { + this.addComponent(new IcoTextComponent(Ico.CLOCK, Text.literal("Ends in: ").append(lines.getFirst()))); + for (int i = 1; i < lines.size(); i++) { + this.addComponent(new PlainTextComponent(lines.get(i))); + } } else { - this.addSimpleIcoText(Ico.CLOCK, "Starts in:", Formatting.GOLD, 76); - } - - TableComponent tc = new TableComponent(1, 3, Formatting.YELLOW.getColorValue()); - - for (int i = 77; i < 80; i++) { - Matcher item = PlayerListMgr.regexAt(i, CROP_PATTERN); - IcoTextComponent itc; - if (item == null) { - itc = new IcoTextComponent(); - } else { - String cropName = item.group("crop").trim(); //Trimming is needed because during a contest the space separator will be caught - if (item.group("fortune").equals("☘")) { - itc = new IcoTextComponent(FARM_DATA.get(cropName), Text.literal(cropName).append(Text.literal(" ☘").formatted(Formatting.GOLD))); - } else { - itc = new IcoTextComponent(FARM_DATA.get(cropName), Text.of(cropName)); + for (Text line : lines) { + String string = line.getString(); + switch (string.toLowerCase()) { + case String s when s.contains("ends") || s.contains("starts") -> + this.addComponent(new IcoTextComponent(Ico.CLOCK, line)); + case String s when s.contains("○") -> { + String trim = string.replace("○", "").trim(); + this.addComponent(new IcoTextComponent(FARM_DATA.get(trim), Text.literal(trim))); + } + default -> this.addComponent(new PlainTextComponent(line)); } } - tc.addToCell(0, i - 77, itc); } - this.addComponent(tc); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/MinionWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/MinionWidget.java index 1e2d6eb9..99f45832 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/MinionWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/MinionWidget.java @@ -93,7 +93,7 @@ public class MinionWidget extends TabHudWidget { public static final Pattern MINION_PATTERN = Pattern.compile("^(?\\d+)x (?.*) (?[XVI]*) \\[(?.*)]"); public MinionWidget() { - super("Minions" ,TITLE, Formatting.DARK_AQUA.getColorValue()); + super("Minions", TITLE, Formatting.DARK_AQUA.getColorValue()); } @Override diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java index 7961c781..e69de29b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java @@ -1,71 +0,0 @@ -package de.hysky.skyblocker.skyblock.tabhud.widget; - -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.config.configs.UIAndVisualsConfig; -import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr; -import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; -import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlayerComponent; -import de.hysky.skyblocker.skyblock.tabhud.widget.component.TableComponent; -import net.minecraft.client.network.PlayerListEntry; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import java.util.ArrayList; -import java.util.Comparator; - -// this widget shows a list of players with their skins. -// responsible for non-private-island areas - -public class PlayerListWidget extends HudWidget { - - private static final MutableText TITLE = Text.literal("Players").formatted(Formatting.GREEN, - Formatting.BOLD); - - public PlayerListWidget() { - super(TITLE, Formatting.GREEN.getColorValue()); - - } - - @Override - public void updateContent() { - ArrayList list = new ArrayList<>(); - - // hard cap to 4x20 entries. - // 5x20 is too wide (and not possible in theory. in reality however...) - int listlen = Math.min(PlayerListMgr.getSize(), 160); - - // list isn't fully loaded, so our hack won't work... - if (listlen < 80) { - this.addComponent(new PlainTextComponent(Text.literal("List loading...").formatted(Formatting.GRAY))); - return; - } - - // unintuitive int ceil division stolen from - // https://stackoverflow.com/questions/7139382/java-rounding-up-to-an-int-using-math-ceil#21830188 - int tblW = ((listlen - 80) - 1) / 20 + 1; - - TableComponent tc = new TableComponent(tblW, Math.min(listlen - 80, 20), Formatting.GREEN.getColorValue()); - - for (int i = 80; i < listlen; i++) { - list.add(PlayerListMgr.getRaw(i)); - } - - if (SkyblockerConfigManager.get().uiAndVisuals.tabHud.nameSorting == UIAndVisualsConfig.NameSorting.ALPHABETICAL) { - list.sort(Comparator.comparing(o -> o.getProfile().getName().toLowerCase())); - } - - int x = 0, y = 0; - - for (PlayerListEntry ple : list) { - tc.addToCell(x, y, new PlayerComponent(ple)); - y++; - if (y >= 20) { - y = 0; - x++; - } - } - - this.addComponent(tc); - } -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/PowderWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/PowderWidget.java index ed986b9a..f8edc554 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/PowderWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/PowderWidget.java @@ -3,26 +3,36 @@ 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 net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import java.util.List; + // this widget shows how much mithril and gemstone powder you have // (dwarven mines and crystal hollows) -public class PowderWidget extends HudWidget { +public class PowderWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Powders").formatted(Formatting.DARK_AQUA, Formatting.BOLD); public PowderWidget() { - super(TITLE, Formatting.DARK_AQUA.getColorValue()); + super("Powders", TITLE, Formatting.DARK_AQUA.getColorValue()); } @Override - public void updateContent() { - this.addSimpleIcoText(Ico.MITHRIL, "Mithril:", Formatting.AQUA, 46); - this.addSimpleIcoText(Ico.AMETHYST_SHARD, "Gemstone:", Formatting.DARK_PURPLE, 47); + public void updateContent(List lines) { + for (Text line : lines) { + switch (line.getString().toLowerCase()) { + case String s when s.contains("mithril") -> this.addComponent(new IcoTextComponent(Ico.MITHRIL, line)); + case String s when s.contains("gemstone") -> this.addComponent(new IcoTextComponent(Ico.AMETHYST_SHARD, line)); + case String s when s.contains("glacite") -> this.addComponent(new IcoTextComponent(Ico.BLUE_ICE, line)); + default -> this.addComponent(new PlainTextComponent(line)); + } + } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ProfileWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ProfileWidget.java index 45d85c3e..997fc69b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ProfileWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ProfileWidget.java @@ -1,27 +1,37 @@ 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 net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import java.util.List; + // this widget shows info about your profile and bank -public class ProfileWidget extends HudWidget { +public class ProfileWidget extends TabHudWidget { private static final MutableText TITLE = Text.literal("Profile").formatted(Formatting.YELLOW, Formatting.BOLD); public ProfileWidget() { - super(TITLE, Formatting.YELLOW.getColorValue()); + super("Profile", TITLE, Formatting.YELLOW.getColorValue()); } @Override - public void updateContent() { - this.addSimpleIcoText(Ico.SIGN, "Profile:", Formatting.GREEN, 61); - this.addSimpleIcoText(Ico.BONE, "Pet Sitter:", Formatting.AQUA, 62); - this.addSimpleIcoText(Ico.EMERALD, "Balance:", Formatting.GOLD, 63); - this.addSimpleIcoText(Ico.CLOCK, "Interest in:", Formatting.GOLD, 64); + public void updateContent(List lines) { + this.addComponent(new IcoTextComponent(Ico.SIGN, Text.literal("Profile: ").append(lines.getFirst()))); + for (int i = 1; i < lines.size(); i++) { + Text text = lines.get(i); + switch (text.getString().toLowerCase()) { + case String s when s.contains("bank") -> this.addComponent(new IcoTextComponent(Ico.EMERALD, text)); + case String s when s.contains("interest") -> this.addComponent(new IcoTextComponent(Ico.CLOCK, text)); + case String s when s.contains("pet") -> this.addComponent(new IcoTextComponent(Ico.BONE, text)); + default -> this.addComponent(new PlainTextComponent(text)); + } + } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/QuestWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/QuestWidget.java deleted file mode 100644 index d354533c..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/QuestWidget.java +++ /dev/null @@ -1,33 +0,0 @@ -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 net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -// this widget shows your crimson isle faction quests - -public class QuestWidget extends HudWidget { - - private static final MutableText TITLE = Text.literal("Faction Quests").formatted(Formatting.AQUA, - Formatting.BOLD); - - public QuestWidget() { - super(TITLE, Formatting.AQUA.getColorValue()); - - } - - @Override - public void updateContent() { - for (int i = 51; i < 56; i++) { - Text q = PlayerListMgr.textAt(i); - IcoTextComponent itc = new IcoTextComponent(Ico.BOOK, q); - this.addComponent(itc); - } - - } - -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ReputationWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ReputationWidget.java deleted file mode 100644 index 34c9aede..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ReputationWidget.java +++ /dev/null @@ -1,69 +0,0 @@ -package de.hysky.skyblocker.skyblock.tabhud.widget; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -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.ProgressComponent; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -// this widget shows your faction status (crimson isle) - -public class ReputationWidget extends HudWidget { - - private static final MutableText TITLE = Text.literal("Faction Status").formatted(Formatting.AQUA, - Formatting.BOLD); - - // matches your faction alignment progress - // group 1: percentage to next alignment level - private static final Pattern PROGRESS_PATTERN = Pattern.compile("\\|+ \\((?[0-9.]*)%\\)"); - - // matches alignment level names - // group 1: left level name - // group 2: right level name - private static final Pattern STATE_PATTERN = Pattern.compile("(?\\S*) *(?\\S*)"); - - public ReputationWidget() { - super(TITLE, Formatting.AQUA.getColorValue()); - } - - @Override - public void updateContent() { - String fracstr = PlayerListMgr.strAt(45); - - int spaceidx; - IcoTextComponent faction; - if (fracstr == null || (spaceidx = fracstr.indexOf(' ')) == -1) { - faction = new IcoTextComponent(); - } else { - String fname = fracstr.substring(0, spaceidx); - if (fname.equals("Mage")) { - faction = new IcoTextComponent(Ico.POTION, Text.literal(fname).formatted(Formatting.DARK_AQUA)); - } else { - faction = new IcoTextComponent(Ico.IRON_SWORD, Text.literal(fname).formatted(Formatting.RED)); - } - } - this.addComponent(faction); - - Text rep = HudWidget.plainEntryText(46); - Matcher prog = PlayerListMgr.regexAt(47, PROGRESS_PATTERN); - Matcher state = PlayerListMgr.regexAt(48, STATE_PATTERN); - - if (prog == null || state == null) { - this.addComponent(new ProgressComponent()); - } else { - float pcnt = Float.parseFloat(prog.group("prog")); - Text reputationText = state.group("from").equals("Max") ? Text.literal("Max Reputation") : Text.literal(state.group("from") + " -> " + state.group("to")); - ProgressComponent pc = new ProgressComponent(Ico.LANTERN, - reputationText, rep, pcnt, - Formatting.AQUA.getColorValue()); - this.addComponent(pc); - } - - } - -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ServerWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ServerWidget.java index c0c4eb81..78a833b1 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ServerWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ServerWidget.java @@ -38,6 +38,7 @@ public class ServerWidget extends TabHudWidget { case String s when s.contains("garden") -> this.addComponent(new IcoTextComponent(Ico.EXPERIENCE_BOTTLE, text)); case String s when s.contains("fairy") -> this.addComponent(new IcoTextComponent(Ico.DIAMOND, text)); case String s when s.contains("rain") -> this.addComponent(new IcoTextComponent(Ico.WATER, text)); + case String s when s.contains("brood") -> this.addComponent(new IcoTextComponent(Ico.SPIDER_EYE, text)); default -> this.addComponent(new PlainTextComponent(text)); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/SpidersDenServerWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/SpidersDenServerWidget.java deleted file mode 100644 index b91bd8e3..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/SpidersDenServerWidget.java +++ /dev/null @@ -1,87 +0,0 @@ -package de.hysky.skyblocker.skyblock.tabhud.widget; - -import de.hysky.skyblocker.skyblock.tabhud.util.Ico; -import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import java.util.Arrays; - -/** - * This widget shows info about the Spider's Den server - */ -public class SpidersDenServerWidget extends HudWidget { - - private static final MutableText TITLE = - Text.literal("Server Info").formatted(Formatting.DARK_AQUA, Formatting.BOLD); - - /** - * Broodmother Mini-Boss tab states - */ - private enum BroodmotherState { - SOON("Soon", Formatting.GOLD), - AWAKENING("Awakening", Formatting.GOLD), - IMMINENT("Imminent", Formatting.DARK_RED), - ALIVE("Alive!", Formatting.DARK_RED), - SLAIN("Slain", Formatting.YELLOW), - DORMANT("Dormant", Formatting.YELLOW), - UNKNOWN("Unknown", Formatting.GRAY); - - private final String text; - private final Formatting formatting; - - BroodmotherState(String text, Formatting formatting) { - this.text = text; - this.formatting = formatting; - } - - public String text() { - return this.text; - } - - public Formatting formatting() { - return this.formatting; - } - - /** - * Returns a state object by text - * - * @param text text state from tab - * @return Broodmother State object - */ - public static BroodmotherState from(String text) { - return Arrays.stream(BroodmotherState.values()) - .filter(broodmotherState -> text.equals(broodmotherState.text())).findFirst().orElse(UNKNOWN); - } - } - - public SpidersDenServerWidget() { - super(TITLE, Formatting.DARK_AQUA.getColorValue()); - } - - /** - * Parses the Broodmother string from tab and returns a state object. - * - * @return Broodmother State object - */ - private static BroodmotherState parseTab() { - String state = PlayerListMgr.strA