aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorviciscat <51047087+viciscat@users.noreply.github.com>2024-05-31 19:02:15 +0200
committerviciscat <51047087+viciscat@users.noreply.github.com>2024-12-12 18:19:05 +0100
commitd1c83c40ccc691b8a77738ea6b9dcb4e3fdc68c3 (patch)
tree6b8b6f0b596a0da88ab3a78bec1aafb764f1184b /src/main/java
parent294782407a8732a042638acbce51a994de8de076 (diff)
downloadSkyblocker-d1c83c40ccc691b8a77738ea6b9dcb4e3fdc68c3.tar.gz
Skyblocker-d1c83c40ccc691b8a77738ea6b9dcb4e3fdc68c3.tar.bz2
Skyblocker-d1c83c40ccc691b8a77738ea6b9dcb4e3fdc68c3.zip
progress on the preview tab
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java5
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java6
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/PreviewTab.java122
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfigurationScreen.java48
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsOrderingTab.java1
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java196
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java36
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CenteredWidgetPositioner.java80
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PositionRule.java19
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/TopAlignedWidgetPositioner.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/WidgetPositioner.java57
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java21
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CameraPositionWidget.java6
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EmptyWidget.java6
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ErrorWidget.java5
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java10
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/TabHudWidget.java6
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/hud/HudCommsWidget.java6
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/hud/HudPowderWidget.java6
20 files changed, 478 insertions, 164 deletions
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<ClickableWidget> 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<Text> 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<String, Location> 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<String, Boolean> positioning = new Object2ObjectOpenHashMap<>();
+ private final Map<String, PositionRule> 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<TabHudWidget> topAligned(int screenW, int screenH) {
- List<TabHudWidget> affected = new ArrayList<>();
- List<TabHudWidget> unaffected = new ArrayList<>();
+ private final List<HudWidget> hudScreen = new ArrayList<>();
+ private final List<HudWidget> mainTabScreen = new ArrayList<>();
+ private final List<HudWidget> 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<TabHudWidget> centered(int screenW, int screenH) {
- List<TabHudWidget> affected = new ArrayList<>();
- List<TabHudWidget> 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<ObjectIntPair<List<TabHudWidget>>> 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<List<TabHudWidget>> listObjectIntPair = columns.get(i);
- int columnWidth = listObjectIntPair.rightInt();
- List<TabHudWidget> 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<HudWidget> hudScreen = new ArrayList<>();
- private final List<HudWidget> mainTabScreen = new ArrayList<>();
- private final List<HudWidget> secondaryTabScreen = new ArrayList<>();
-
- private void positionWidgets(int screenW, int screenH) {
- hudScreen.clear();
- mainTabScreen.clear();
- secondaryTabScreen.clear();
+ public void renderWidgets(DrawContext context, Layer layer) {
+ List<HudWidget> widgetsToRender = getHudWidgets(layer);
- List<TabHudWidget> unaffected;
- if (false) {
- unaffected = centered(screenW, screenH);
- } else {
- unaffected = topAligned(screenW, screenH);
+ for (HudWidget widget : widgetsToRender) {
+ widget.render(context);
}
}
+ public List<HudWidget> 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<Integer, Integer, WidgetPositioner> function;
+
+ DefaultPositioner(BiFunction<Integer, Integer, WidgetPositioner> 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<String, ScreenBuilder> screenBMap = new HashMap<>();
private static final Map<Location, ScreenBuilder> builderMap = new HashMap<>();
+ public static final Map<String, HudWidget> widgetInstances = new HashMap<>();
+
/**
* Load a screen mapping from an identifier
*/
@@ -52,17 +43,10 @@ public class ScreenMaster {
String screenTy