From d1c83c40ccc691b8a77738ea6b9dcb4e3fdc68c3 Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Fri, 31 May 2024 19:02:15 +0200 Subject: progress on the preview tab --- .../skyblocker/mixins/PlayerListHudMixin.java | 3 +- .../skyblocker/skyblock/end/EndHudWidget.java | 5 + .../skyblock/garden/FarmingHudWidget.java | 6 + .../skyblock/tabhud/config/PreviewTab.java | 122 ++++++++++++- .../tabhud/config/WidgetsConfigurationScreen.java | 48 ++++- .../skyblock/tabhud/config/WidgetsOrderingTab.java | 1 - .../tabhud/screenbuilder/ScreenBuilder.java | 196 ++++++++------------- .../tabhud/screenbuilder/ScreenMaster.java | 36 ++-- .../pipeline/CenteredWidgetPositioner.java | 80 +++++++++ .../screenbuilder/pipeline/PositionRule.java | 19 ++ .../pipeline/TopAlignedWidgetPositioner.java | 3 +- .../screenbuilder/pipeline/WidgetPositioner.java | 57 ++++++ .../skyblock/tabhud/util/PlayerListMgr.java | 21 +-- .../tabhud/widget/CameraPositionWidget.java | 6 + .../skyblock/tabhud/widget/EmptyWidget.java | 6 + .../skyblock/tabhud/widget/ErrorWidget.java | 5 + .../skyblock/tabhud/widget/HudWidget.java | 10 ++ .../skyblock/tabhud/widget/TabHudWidget.java | 6 + .../skyblock/tabhud/widget/hud/HudCommsWidget.java | 6 + .../tabhud/widget/hud/HudPowderWidget.java | 6 + 20 files changed, 478 insertions(+), 164 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CenteredWidgetPositioner.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PositionRule.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java b/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java index ce04268a..fab7a172 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.mixins; +import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsConfigurationScreen; import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.tabhud.TabHud; @@ -29,7 +30,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.isOnSkyblock() || !SkyblockerConfigManager.get().uiAndVisuals.tabHud.tabHudEnabled || TabHud.defaultTgl.isPressed()) { + if (!Utils.isOnSkyblock() || !SkyblockerConfigManager.get().uiAndVisuals.tabHud.tabHudEnabled || TabHud.defaultTgl.isPressed() || MinecraftClient.getInstance().currentScreen instanceof WidgetsConfigurationScreen) { return; } 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 33a2980d..d91b8efe 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java @@ -5,6 +5,7 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; import de.hysky.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; +import de.hysky.skyblocker.utils.Location; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.ProfileComponent; import net.minecraft.item.ItemStack; @@ -42,6 +43,10 @@ public class EndHudWidget extends HudWidget { this.setY(5); this.update(); } + @Override + public boolean shouldRender(Location location) { + return location.equals(Location.THE_END) && SkyblockerConfigManager.get().otherLocations.end.hudEnabled; + } @Override public void updateContent() { 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 3bf72336..15be316a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java @@ -9,6 +9,7 @@ import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; import de.hysky.skyblocker.skyblock.tabhud.widget.component.ProgressComponent; import de.hysky.skyblocker.utils.ItemUtils; import it.unimi.dsi.fastutil.doubles.DoubleBooleanPair; +import de.hysky.skyblocker.utils.Location; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; @@ -101,4 +102,9 @@ public class FarmingHudWidget extends HudWidget { // Multiply by 60 to convert to hourly and divide by 100 for rounding is combined into multiplying by 0.6. return shouldUseNpcPrice || itemBazaarPrice.rightBoolean() ? FarmingHud.NUMBER_FORMAT.format((int) (price * cropsPerMinute * 0.6) * 100) : "No Data"; } + + @Override + public boolean shouldRender(Location location) { + return location.equals(Location.GARDEN) && SkyblockerConfigManager.get().farming.garden.farmingHud.enableHud; + } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/PreviewTab.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/PreviewTab.java index 65456c96..29aab7df 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/PreviewTab.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/PreviewTab.java @@ -1,23 +1,59 @@ package de.hysky.skyblocker.skyblock.tabhud.config; +import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenBuilder; import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster; +import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; +import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.ScreenRect; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; import net.minecraft.client.gui.tab.Tab; +import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.ClickableWidget; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.GenericContainerScreenHandler; +import net.minecraft.text.MutableText; +import net.minecraft.text.Style; import net.minecraft.text.Text; +import net.minecraft.util.Colors; +import java.awt.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; public class PreviewTab implements Tab { private final MinecraftClient client; + private final PreviewWidget previewWidget; + private final WidgetsConfigurationScreen parent; + private ScreenBuilder.Layer currentLayer = ScreenBuilder.Layer.MAIN_TAB; + private final ButtonWidget[] layerButtons; - public PreviewTab(MinecraftClient client) { + public PreviewTab(MinecraftClient client, WidgetsConfigurationScreen parent) { this.client = client; + previewWidget = new PreviewWidget(); + this.parent = parent; + + ScreenBuilder.Layer[] values = ScreenBuilder.Layer.values(); + layerButtons = new ButtonWidget[values.length]; + for (int i = 0; i < values.length; i++) { + ScreenBuilder.Layer layer = values[i]; + layerButtons[i] = ButtonWidget.builder(Text.literal(layer.toString()), button -> { + this.currentLayer = layer; + for (ButtonWidget layerButton : this.layerButtons) { + layerButton.active = !layerButton.equals(button); + } + }) + .size(80, 15) + .build(); + } } @Override @@ -27,15 +63,65 @@ public class PreviewTab implements Tab { @Override public void forEachChild(Consumer consumer) { - + consumer.accept(previewWidget); + for (ButtonWidget layerButton : layerButtons) { + consumer.accept(layerButton); + } } @Override public void refreshGrid(ScreenRect tabArea) { + float ratio = Math.min((tabArea.height() - 5) / (float) parent.height, (tabArea.width() - 105) / (float) parent.width); + previewWidget.setPosition(5, tabArea.getTop() + 5); + previewWidget.setWidth((int) (parent.width * ratio)); + previewWidget.setHeight((int) (parent.height * ratio)); + previewWidget.ratio = ratio; + updatePlayerListFromPreview(); + ScreenBuilder screenBuilder = ScreenMaster.getScreenBuilder(parent.getCurrentLocation()); + screenBuilder.positionWidgets(parent.width, parent.height); + + for (int i = 0; i < layerButtons.length; i++) { + ButtonWidget layerButton = layerButtons[i]; + layerButton.setPosition(tabArea.width() - 90, tabArea.getTop() + 10 + i * 15); + } + + forEachChild(clickableWidget -> clickableWidget.visible = parent.isPreviewVisible()); + } + + private void updatePlayerListFromPreview() { + if (!parent.isPreviewVisible()) return; + List lines = new ArrayList<>(); + for (int i = 3; i <= 5; i++) { + ItemStack stack = parent.getHandler().getSlot(i).getStack(); + + for (Text text : ItemUtils.getLore(stack)) { + MutableText mutableText = Text.empty(); + AtomicBoolean foundSquare = new AtomicBoolean(false); + text.visit((style, asString) -> { + if (!asString.startsWith("⬛")) { + mutableText.append(Text.literal(asString).fillStyle(style)); + } else foundSquare.set(true); + return Optional.empty(); + }, Style.EMPTY); + + if (foundSquare.get()) { + lines.add(mutableText); + System.out.println(mutableText.getString()); + System.out.println(mutableText); + } + } + } + PlayerListMgr.updateWidgetsFrom(lines); } - public static class PreviewWidget extends ClickableWidget { + public class PreviewWidget extends ClickableWidget { + + private float ratio = 1f; + + public PreviewWidget() { + this(0, 0, 0, 0, Text.literal("Preview widget")); + } public PreviewWidget(int x, int y, int width, int height, Text message) { super(x, y, width, height, message); @@ -43,7 +129,35 @@ public class PreviewTab implements Tab { @Override protected void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { - ScreenMaster.getScreenBuilder(Utils.getLocation()); + ScreenBuilder screenBuilder = ScreenMaster.getScreenBuilder(parent.getCurrentLocation()); + context.drawBorder(getX() - 1, getY() - 1, getWidth() + 2, getHeight() + 2, -1); + context.enableScissor(getX(), getY(), getRight(), getBottom()); + MatrixStack matrices = context.getMatrices(); + matrices.push(); + matrices.translate(getX(), getY(), 0f); + matrices.scale(ratio, ratio, 1f); + + screenBuilder.renderWidgets(context, PreviewTab.this.currentLayer); + + float localMouseX = (mouseX - getX()) / ratio; + float localMouseY = (mouseY - getY()) / ratio; + + context.drawBorder((int) localMouseX, (int) localMouseY, 2, 2, Colors.RED); + + for (HudWidget hudWidget : screenBuilder.getHudWidgets(PreviewTab.this.currentLayer)) { + if (hudWidget.isMouseOver(localMouseX, localMouseY)) { + context.drawBorder( + hudWidget.getX() - 1, + hudWidget.getY() - 1, + hudWidget.getWidth() + 2, + hudWidget.getHeight() + 2, + Colors.LIGHT_YELLOW); + break; + } + } + + matrices.pop(); + context.disableScissor(); } @Override diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfigurationScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfigurationScreen.java index 4ea8c157..e1684093 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfigurationScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfigurationScreen.java @@ -1,6 +1,8 @@ package de.hysky.skyblocker.skyblock.tabhud.config; import de.hysky.skyblocker.utils.ItemUtils; +import de.hysky.skyblocker.utils.Location; +import de.hysky.skyblocker.utils.Utils; import net.minecraft.client.gui.ScreenRect; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.tab.TabManager; @@ -13,12 +15,41 @@ import net.minecraft.screen.ScreenHandlerListener; import net.minecraft.text.Text; import org.jetbrains.annotations.Nullable; +import java.util.Map; + public class WidgetsConfigurationScreen extends Screen implements ScreenHandlerListener { private GenericContainerScreenHandler handler; private String titleLowercase; private boolean tabPreview = false; + private PreviewTab previewTab; + + private final Map nameToLocation = Map.ofEntries( + Map.entry("private islands", Location.PRIVATE_ISLAND), + Map.entry("the hub", Location.HUB), + Map.entry("the dungeon hub", Location.DUNGEON_HUB), + Map.entry("the farming islands", Location.THE_FARMING_ISLAND), + Map.entry("garden", Location.GARDEN), + Map.entry("the park", Location.THE_PARK), + Map.entry("the gold mine", Location.GOLD_MINE), + Map.entry("deep caverns", Location.DEEP_CAVERNS), + Map.entry("dwarven mines", Location.DWARVEN_MINES), + Map.entry("crystal hollows", Location.CRYSTAL_HOLLOWS), + Map.entry("the mineshaft", Location.GLACITE_MINESHAFT), + Map.entry("spider's den", Location.SPIDERS_DEN), + Map.entry("the end", Location.THE_END), + Map.entry("crimson isle", Location.CRIMSON_ISLE), + Map.entry("kuudra", Location.KUUDRAS_HOLLOW), + Map.entry("the rift", Location.THE_RIFT), + Map.entry("jerry's workshop", Location.WINTER_ISLAND) + ); + private Location currentLocation = Location.HUB; + + public Location getCurrentLocation() { + return currentLocation; + } + public boolean isPreviewVisible() { return tabPreview; } @@ -41,8 +72,9 @@ public class WidgetsConfigurationScreen extends Screen implements ScreenHandlerL @Override protected void init() { widgetsOrderingTab = new WidgetsOrderingTab(this.client, this.handler); + previewTab = new PreviewTab(this.client, this); this.tabNavigation = TabNavigationWidget.builder(this.tabManager, this.width) - .tabs(this.widgetsOrderingTab) + .tabs(this.widgetsOrderingTab, this.previewTab) .build(); this.tabNavigation.selectTab(0, false); this.addDrawableChild(tabNavigation); @@ -61,14 +93,24 @@ public class WidgetsConfigurationScreen extends Screen implements ScreenHandlerL } } - public void updateHandler(GenericContainerScreenHandler newHandler, String title) { + public void updateHandler(GenericContainerScreenHandler newHandler, String titleLowercase) { handler.removeListener(this); handler = newHandler; handler.addListener(this); - this.titleLowercase = title; + this.titleLowercase = titleLowercase; + String trim = this.titleLowercase + .replace("widgets in", "") + .replace("widgets on", "") + .trim(); + + currentLocation = nameToLocation.getOrDefault(trim, Utils.getLocation()); widgetsOrderingTab.updateHandler(handler); } + public GenericContainerScreenHandler getHandler() { + return handler; + } + private @Nullable ItemStack slotThirteenBacklog = null; @Override diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsOrderingTab.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsOrderingTab.java index 983ec41b..5a7a2481 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsOrderingTab.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsOrderingTab.java @@ -88,7 +88,6 @@ public class WidgetsOrderingTab implements Tab { for (int i = 0; i < hopperTooltip.size(); i++) { Text text = hopperTooltip.get(i); String string = text.getString(); - System.out.println(string); if (start == -1 && string.contains("▶")) { start = i; } 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 973d7204..8a3a0dd7 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 @@ -1,16 +1,15 @@ package de.hysky.skyblocker.skyblock.tabhud.screenbuilder; import java.util.*; +import java.util.function.BiFunction; import com.google.gson.JsonObject; +import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline.*; 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.utils.Location; +import de.hysky.skyblocker.utils.Utils; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectIntMutablePair; import it.unimi.dsi.fastutil.objects.ObjectIntPair; @@ -18,6 +17,7 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.util.Colors; import net.minecraft.util.Identifier; +import org.jetbrains.annotations.Nullable; public class ScreenBuilder { @@ -33,12 +33,14 @@ public class ScreenBuilder { //private final String builderName; - private final Map positioning = new Object2ObjectOpenHashMap<>(); + private final Map positioning = new Object2ObjectOpenHashMap<>(); + private final Location location; /** * Create a ScreenBuilder from a json. */ - public ScreenBuilder(Identifier ident) { + public ScreenBuilder(Location location) { + this.location = location; /*try (BufferedReader reader = MinecraftClient.getInstance().getResourceManager().openAsReader(ident)) { this.builderName = ident.getPath(); @@ -146,6 +148,10 @@ public class ScreenBuilder { }; } + public @Nullable PositionRule getPositionRule(String widgetInternalId) { + return positioning.get(widgetInternalId); + } + /** * Lookup Widget instance from alias name */ @@ -156,141 +162,70 @@ public class ScreenBuilder { return this.objectMap.get(name); } - private List topAligned(int screenW, int screenH) { - List affected = new ArrayList<>(); - List unaffected = new ArrayList<>(); + private final List hudScreen = new ArrayList<>(); + private final List mainTabScreen = new ArrayList<>(); + private final List secondaryTabScreen = new ArrayList<>(); - final int maxY = 300; - final int startY = 20; + public void positionWidgets(int screenW, int screenH) { + hudScreen.clear(); + mainTabScreen.clear(); + secondaryTabScreen.clear(); - int totalWidth = 0; + WidgetPositioner newPositioner = DefaultPositioner.CENTERED.getNewPositioner(screenW, screenH); - int currentWidth = 0; - int currentY = startY; - for (TabHudWidget tabHudWidget : PlayerListMgr.widgetsToShow) { - if (positioning.getOrDefault(tabHudWidget.getInternalID(), false)) { - unaffected.add(tabHudWidget); - tabHudWidget.setPositioned(false); - continue; + for (HudWidget widget : ScreenMaster.widgetInstances.values()) { + if (widget.shouldRender(location)) { + hudScreen.add(widget); + widget.update(); + widget.setPositioned(false); } - affected.add(tabHudWidget); - tabHudWidget.setPositioned(true); - - tabHudWidget.update(); - 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; - - // centering - int off = (screenW - totalWidth) / 2; - for (TabHudWidget tabHudWidget : affected) { - tabHudWidget.setX(tabHudWidget.getX() - off); } - return unaffected; + // TODO check things and stuff + mainTabScreen.addAll(PlayerListMgr.tabWidgetsToShow); - } - - private List centered(int screenW, int screenH) { - List affected = new ArrayList<>(); - List unaffected = new ArrayList<>(); - - int 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)) { - unaffected.add(tabHudWidget); - tabHudWidget.setPositioned(false); - continue; - } - affected.add(tabHudWidget); - tabHudWidget.setPositioned(true); - - tabHudWidget.update(); - // Too large to fit in column - 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 (HudWidget widget : mainTabScreen) { + newPositioner.positionWidget(widget); + widget.setPositioned(true); } - 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(); + newPositioner.finalizePositioning(); + for (HudWidget widget : hudScreen) { + if (!widget.isPositioned()) { + WidgetPositioner.applyRuleToWidget(widget, screenW, screenH, this::getPositionRule); } - // 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; } - - // Center everything - int off = (screenW - totalWidth) / 2; - for (TabHudWidget tabHudWidget : affected) { - tabHudWidget.setX(tabHudWidget.getX() - off); + for (HudWidget widget : secondaryTabScreen) { + if (!widget.isPositioned()) { + WidgetPositioner.applyRuleToWidget(widget, screenW, screenH, this::getPositionRule); + } } - - return unaffected; } - private final List hudScreen = new ArrayList<>(); - private final List mainTabScreen = new ArrayList<>(); - private final List secondaryTabScreen = new ArrayList<>(); - - private void positionWidgets(int screenW, int screenH) { - hudScreen.clear(); - mainTabScreen.clear(); - secondaryTabScreen.clear(); + public void renderWidgets(DrawContext context, Layer layer) { + List widgetsToRender = getHudWidgets(layer); - List unaffected; - if (false) { - unaffected = centered(screenW, screenH); - } else { - unaffected = topAligned(screenW, screenH); + for (HudWidget widget : widgetsToRender) { + widget.render(context); } } + public List getHudWidgets(Layer layer) { + return switch (layer) { + case MAIN_TAB -> mainTabScreen; + case SECONDARY_TAB -> secondaryTabScreen; + case HUD -> hudScreen; + case null -> List.of(); + }; + } + /** * 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); + for (TabHudWidget value : PlayerListMgr.tabWidgetInstances.values()) { + context.drawText(MinecraftClient.getInstance().textRenderer, value.getHypixelWidgetName(), 0, i, PlayerListMgr.tabWidgetsToShow.contains(value) ? Colors.LIGHT_YELLOW : -1, true); i += 9; } @@ -299,8 +234,27 @@ public class ScreenBuilder { positionWidgets(screenW, screenH); } - for (HudWidget w : PlayerListMgr.widgetsToShow) { - w.render(context); + renderWidgets(context, Layer.MAIN_TAB); + } + + public enum Layer { + MAIN_TAB, + SECONDARY_TAB, + HUD + } + + private enum DefaultPositioner { + TOP(TopAlignedWidgetPositioner::new), + CENTERED(CenteredWidgetPositioner::new); + + private final BiFunction function; + + DefaultPositioner(BiFunction widgetPositionerSupplier) { + function = widgetPositionerSupplier; + } + + public WidgetPositioner getNewPositioner(int screenWidth, int screenHeight) { + return function.apply(screenWidth, screenHeight); } } 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 2146d966..62c03ab3 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 @@ -1,9 +1,7 @@ package de.hysky.skyblocker.skyblock.tabhud.screenbuilder; import com.google.common.reflect.ClassPath; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.events.SkyblockEvents; import de.hysky.skyblocker.annotations.Init; import de.hysky.skyblocker.skyblock.tabhud.TabHud; import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr; @@ -11,22 +9,13 @@ 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 de.hysky.skyblocker.utils.Location; +import de.hysky.skyblocker.utils.Utils; 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; import net.minecraft.util.Identifier; 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; @@ -42,6 +31,8 @@ public class ScreenMaster { private static final HashMap screenBMap = new HashMap<>(); private static final Map builderMap = new HashMap<>(); + public static final Map widgetInstances = new HashMap<>(); + /** * Load a screen mapping from an identifier */ @@ -52,17 +43,10 @@ public class ScreenMaster { String screenType = parts[parts.length - 2]; String location = parts[parts.length - 1]; location = location.replace(".json", ""); - - ScreenBuilder sb = new ScreenBuilder(ident); - switch (screenType) { - case "standard" -> standardMap.put(location, sb); - case "screen_a" -> screenAMap.put(location, sb); - case "screen_b" -> screenBMap.put(location, sb); - } } public static ScreenBuilder getScreenBuilder(Location location) { - return builderMap.computeIfAbsent(location, location1 -> new ScreenBuilder(new Identifier(""))); + return builderMap.get(location); } /** @@ -87,13 +71,15 @@ public class ScreenMaster { sb = lookup.get("default"); } - sb.run(context, w, h); + getScreenBuilder(Utils.getLocation()).run(context, w, h); } @Init public static void init() { + SkyblockEvents.LOCATION_CHANGE.register(location -> ScreenBuilder.positionsNeedsUpdating = true); + ClientLifecycleEvents.CLIENT_STARTED.register(client -> { System.out.println(Object.class); try { @@ -102,7 +88,7 @@ public class ScreenMaster { 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); + PlayerListMgr.tabWidgetInstances.put(tabHudWidget.getHypixelWidgetName(), tabHudWidget); } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException | ClassNotFoundException e) { LOGGER.error("[Skyblocker] Failed to load {} hud widget", classInfo.getName(), e); } @@ -112,6 +98,10 @@ public class ScreenMaster { LOGGER.error("[Skyblocker] Failed to get instances of hud widgets", e); } }); + + for (Location value : Location.values()) { + builderMap.put(value, new ScreenBuilder(value)); + } /* diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CenteredWidgetPositioner.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CenteredWidgetPositioner.java new file mode 100644 index 00000000..2c97c973 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CenteredWidgetPositioner.java @@ -0,0 +1,80 @@ +package de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline; + +import de.hysky.skyblocker.skyblock.tabhud.util.ScreenConst; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; +import de.hysky.skyblocker.skyblock.tabhud.widget.TabHudWidget; +import it.unimi.dsi.fastutil.objects.ObjectIntMutablePair; +import it.unimi.dsi.fastutil.objects.ObjectIntPair; + +import java.util.ArrayList; +import java.util.List; + +public class CenteredWidgetPositioner extends WidgetPositioner { + + int totalWidth = 0; + + final int maxY; + + // each column is a pair containing a list of widgets for the rows and an int for the width of the column + List>> columns = new ArrayList<>(); + + private final List widgets = new ArrayList<>(); + + + int currentY = 0; + int currentWidth = 0; + + public CenteredWidgetPositioner(int screenWidth, int screenHeight) { + super(screenWidth, screenHeight); + columns.add(new ObjectIntMutablePair<>(new ArrayList<>(), 0)); + maxY = Math.min(400, (int) (screenHeight * 0.9f)); + } + + @Override + public void positionWidget(HudWidget hudWidget) { + widgets.add(hudWidget); + + if (currentY + hudWidget.getHeight() > maxY) { + currentY = 0; + currentWidth = 0; + columns.add(new ObjectIntMutablePair<>(new ArrayList<>(), 0)); + } + hudWidget.setY(currentY); + currentY += hudWidget.getHeight() + ScreenConst.WIDGET_PAD; + currentWidth = Math.max(currentWidth, hudWidget.getWidth()); + columns.getLast().right(currentWidth); + columns.getLast().left().add(hudWidget); + } + + @Override + public void finalizePositioning() { + 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 (HudWidget tabHudWidget : column) { + height += tabHudWidget.getHeight(); + } + // set x and y of the widgets! + int offset = (screenHeight - height) / 2; + for (HudWidget 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; + } + + // Center everything + int off = (screenWidth - totalWidth) / 2; + for (HudWidget tabHudWidget : widgets) { + tabHudWidget.setX(tabHudWidget.getX() + off); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PositionRule.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PositionRule.java new file mode 100644 index 00000000..ff9fe22f --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PositionRule.java @@ -0,0 +1,19 @@ +package de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline; + +public record PositionRule(String parent, Point parentPoint, Point thisPoint, int relativeX, int relativeY) { + + + public enum HorizontalPoint { + LEFT, + CENTER, + RIGHT + } + + public enum VerticalPoint { + TOP, + CENTER, + BOTTOM + } + + public record Point(HorizontalPoint horizontalPoint, VerticalPoint verticalPoint) {} +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/TopAlignedWidgetPositioner.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/TopAlignedWidgetPositioner.java index b2ecdf5e..8e033f2a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/TopAlignedWidgetPositioner.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/TopAlignedWidgetPositioner.java @@ -25,6 +25,7 @@ public class TopAlignedWidgetPositioner extends WidgetPositioner { @Override public void positionWidget(HudWidget hudWidget) { widgets.add(hudWidget); + if (currentY + hudWidget.getHeight() > MAX_COLUMN_HEIGHT) { totalWidth += currentWidth + ScreenConst.WIDGET_PAD; currentY = START_Y; @@ -40,7 +41,7 @@ public class TopAlignedWidgetPositioner extends WidgetPositioner { public void finalizePositioning() { int off = (screenWidth - totalWidth) / 2; for (HudWidget widget : widgets) { - widget.setX(widget.getX() - off); + widget.setX(widget.getX() + off); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/WidgetPositioner.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/WidgetPositioner.java index b4974705..2015db1d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/WidgetPositioner.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/WidgetPositioner.java @@ -1,7 +1,10 @@ package de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline; +import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster; import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; +import java.util.function.Function; + public abstract class WidgetPositioner { protected final int screenWidth; @@ -20,4 +23,58 @@ public abstract class WidgetPositioner { */ public abstract void finalizePositioning(); + public static void applyRuleToWidget(HudWidget widget, int screenWidth, int screenHeight, Function ruleProvider) { + widget.setPositioned(true); + PositionRule rule = ruleProvider.apply(widget.getInternalID()); + if (rule == null) return; + + int startX; + int startY; + if (rule.parent().equals("screen")) { + startX = switch (rule.parentPoint().horizontalPoint()) { + case LEFT -> 0; + case CENTER -> screenWidth / 2; + case RIGHT -> screenWidth; + }; + startY = switch (rule.parentPoint().verticalPoint()) { + case TOP -> 0; + case CENTER -> screenHeight / 2; + case BOTTOM -> screenHeight; + }; + } else { + HudWidget parentWidget = ScreenMaster.widgetInstances.get(rule.parent()); + if (parentWidget == null) return; + if (!parentWidget.isPositioned()) applyRuleToWidget(parentWidget, screenWidth, screenHeight, ruleProvider); + + startX = switch (rule.parentPoint().horizontalPoint()) { + case LEFT -> parentWidget.getX(); + case CENTER -> parentWidget.getX() + parentWidget.getWidth() / 2; + case RIGHT -> parentWidget.getX() + parentWidget.getWidth(); + }; + startY = switch (rule.parentPoint().verticalPoint()) { + case TOP -> parentWidget.getY(); + case CENTER -> parentWidget.getY() + parentWidget.getHeight() / 2; + case BOTTOM -> parentWidget.getY() + parentWidget.getHeight(); + }; + + } + + final int relativeX = rule.relativeX(); + widget.setX(switch (rule.thisPoint().horizontalPoint()) { + case LEFT -> startX + relativeX; + case CENTER -> startX + relativeX - widget.getWidth() / 2; + case RIGHT -> startX + relativeX - widget.getWidth(); + }); + + final int relativeY = rule.relativeY(); + widget.setY(switch (rule.thisPoint().verticalPoint()) { + case TOP -> startY + relativeY; + case CENTER -> startY + relativeY - widget.getHeight() / 2; + case BOTTOM -> startY + relativeY - widget.getHeight(); + }); + + + + } + } 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 0e82d2a8..2f0f3bba 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 @@ -12,7 +12,6 @@ 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; @@ -54,8 +53,8 @@ public class PlayerListMgr { */ private static List playerStringList = new ArrayList<>(); private static String footer; - public static final Map widgetInstances = new Object2ObjectOpenHashMap<>(); - public static final List widgetsToShow = new ObjectArrayList<>(5); + public static final Map tabWidgetInstances = new Object2ObjectOpenHashMap<>(); + public static final List tabWidgetsToShow = new ObjectArrayList<>(5); public static void updateList() { @@ -83,7 +82,7 @@ public class PlayerListMgr { final Predicate playersColumnPredicate = PLAYERS_COLUMN_PATTERN.asMatchPredicate(); final Predicate infoColumnPredicate = INFO_COLUMN_PATTERN.asMatchPredicate(); - widgetsToShow.clear(); + tabWidgetsToShow.clear(); boolean doingPlayers = false; boolean playersDone = false; String hypixelWidgetName = ""; @@ -105,7 +104,7 @@ public class PlayerListMgr { // Check if info, if it is, dip out if (infoColumnPredicate.test(string)) { playersDone = true; - widgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents)); + if (!contents.isEmpty()) tabWidgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents)); contents.clear(); continue; } @@ -113,7 +112,7 @@ public class PlayerListMgr { if (infoColumnPredicate.test(string)) continue; // New widget alert!!!! if (!string.startsWith(" ")) { - if (!contents.isEmpty()) widgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents)); + if (!contents.isEmpty()) tabWidgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents)); contents.clear(); Pair nameAndInfo = getNameAndInfo(displayName); hypixelWidgetName = nameAndInfo.left(); @@ -124,7 +123,7 @@ public class PlayerListMgr { // Add the line to the content contents.add(trim(displayName)); } - if (!contents.isEmpty()) widgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents)); + if (!contents.isEmpty()) tabWidgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents)); ScreenBuilder.positionsNeedsUpdating = true; } @@ -161,14 +160,16 @@ public class PlayerListMgr { } private static TabHudWidget getTabHudWidget(String hypixelWidgetName, List lines) { - if (widgetInstances.containsKey(hypixelWidgetName)) { - TabHudWidget tabHudWidget = widgetInstances.get(hypixelWidgetName); + if (tabWidgetInstances.containsKey(hypixelWidgetName)) { + TabHudWidget tabHudWidget = tabWidgetInstances.get(hypixelWidgetName); tabHudWidget.updateFromTab(lines); + tabHudWidget.update(); return tabHudWidget; } else { DefaultTabHudWidget defaultTabHudWidget = new DefaultTabHudWidget(hypixelWidgetName, Text.literal(hypixelWidgetName).formatted(Formatting.BOLD)); - widgetInstances.put(defaultTabHudWidget.getHypixelWidgetName(), defaultTabHudWidget); + tabWidgetInstances.put(defaultTabHudWidget.getHypixelWidgetName(), defaultTabHudWidget); defaultTabHudWidget.updateFromTab(lines); + defaultTabHudWidget.update(); return defaultTabHudWidget; } } 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 e8b9c4f2..43ed9eec 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 @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock.tabhud.widget; import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; +import de.hysky.skyblocker.utils.Location; import net.minecraft.client.MinecraftClient; import net.minecraft.text.MutableText; import net.minecraft.text.Text; @@ -23,4 +24,9 @@ public class CameraPositionWidget extends HudWidget { addComponent(new PlainTextComponent(Text.literal("Yaw: " + String.format("%.3f", MathHelper.wrapDegrees(yaw))))); addComponent(new PlainTextComponent(Text.literal("Pitch: " + String.format("%.3f", MathHelper.wrapDegrees(pitch))))); } + + @Override + public boolean shouldRender(Location location) { + return false; + } } 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 e8181c4d..640bd38d 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 @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.tabhud.widget; +import de.hysky.skyblocker.utils.Location; import net.minecraft.text.Text; public class EmptyWidget extends HudWidget { @@ -9,4 +10,9 @@ public class EmptyWidget extends HudWidget { @Override public void updateContent() {} + + @Override + public boolean shouldRender(Location location) { + return false; + } } 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 05054891..cbfa56f0 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 @@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.tabhud.widget; import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; +import de.hysky.skyblocker.utils.Location; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -29,4 +30,8 @@ public class ErrorWidget extends HudWidget { this.addComponent(inf); } + @Override + public boolean shouldRender(Location location) { + return false; + } } 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 ea52d5a8..0256ceca 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 @@ -6,9 +6,11 @@ import java.util.function.Consumer; import com.mojang.blaze3d.systems.RenderSystem; import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster; 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 de.hysky.skyblocker.utils.Location; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; @@ -59,6 +61,7 @@ public abstract class HudWidget implements Element, Widget { this.color = 0xff000000 | colorValue; HUDS.put(internalID, this); this.internalID = internalID; + ScreenMaster.widgetInstances.put(internalID, this); } public void addComponent(Component c) { @@ -73,6 +76,8 @@ public abstract class HudWidget implements Element, Widget { public abstract void updateContent(); + public abstract boolean shouldRender(Location location); + /** * Shorthand function for simple components. * If the entry at idx has the format ": ", an IcoTextComponent is @@ -270,6 +275,11 @@ public abstract class HudWidget implements Element, Widget { return focused; } + @Override + public boolean isMouseOver(double mouseX, double mouseY) { + return mouseX >= getX() && mouseX <= getX() + getWidth() && mouseY >= getY() && mouseY <= getY() + getHeight(); + } + @Override public ScreenRect getNavigationFocus() { return Element.super.getNavigationFocus(); 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 bc3f8e5f..dadfbcdd 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 @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock.tabhud.widget; import de.hysky.skyblocker.skyblock.tabhud.widget.component.Component; +import de.hysky.skyblocker.utils.Location; import net.minecraft.text.MutableText; import net.minecraft.text.Text; @@ -31,6 +32,11 @@ public abstract class TabHudWidget extends HudWidget { updateContent(lines); } + @Override + public boolean shouldRender(Location location) { + return false; + } + /** * Update the content from the hypixel widget's lines * diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/hud/HudCommsWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/hud/HudCommsWidget.java index 0dabf8a8..bdea47a3 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/hud/HudCommsWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/hud/HudCommsWidget.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.tabhud.widget.hud; +import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.dwarven.DwarvenHud.Commission; import de.hysky.skyblocker.skyblock.tabhud.util.Colors; import de.hysky.skyblocker.skyblock.tabhud.util.Ico; @@ -7,6 +8,7 @@ import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; import de.hysky.skyblocker.skyblock.tabhud.widget.component.Component; import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; import de.hysky.skyblocker.skyblock.tabhud.widget.component.ProgressComponent; +import de.hysky.skyblocker.utils.Location; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -67,4 +69,8 @@ public class HudCommsWidget extends HudWidget { } } + @Override + public boolean shouldRender(Location location) { + return location.equals(Location.DWARVEN_MINES) || location.equals(Location.CRYSTAL_HOLLOWS) && SkyblockerConfigManager.get().mining.dwarvenHud.enabledCommissions; + } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/hud/HudPowderWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/hud/HudPowderWidget.java index 61aa2a14..47c884f2 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/hud/HudPowderWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/hud/HudPowderWidget.java @@ -1,8 +1,10 @@ package de.hysky.skyblocker.skyblock.tabhud.widget.hud; +import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.dwarven.DwarvenHud; import de.hysky.skyblocker.skyblock.tabhud.util.Ico; import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; +import de.hysky.skyblocker.utils.Location; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -129,4 +131,8 @@ public class HudPowderWidget extends HudWidget { this.addSimpleIcoText(Ico.BLUE_ICE, "Glacite: ", Formatting.AQUA, glacitePowderString); } + @Override + public boolean shouldRender(Location location) { + return location.equals(Location.DWARVEN_MINES) || location.equals(Location.CRYSTAL_HOLLOWS) && SkyblockerConfigManager.get().mining.dwarvenHud.enabledPowder; + } } -- cgit