aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorviciscat <51047087+viciscat@users.noreply.github.com>2024-06-27 12:17:09 +0200
committerviciscat <51047087+viciscat@users.noreply.github.com>2024-12-12 18:19:05 +0100
commit4d6fb1f051751da1b4b99186f9324670d26b83c9 (patch)
tree04c1140e6b30710cc1cbb190d1c067908f5de514 /src
parent0e250cec774b36cab3f099e45b0784d9a0b3a830 (diff)
downloadSkyblocker-4d6fb1f051751da1b4b99186f9324670d26b83c9.tar.gz
Skyblocker-4d6fb1f051751da1b4b99186f9324670d26b83c9.tar.bz2
Skyblocker-4d6fb1f051751da1b4b99186f9324670d26b83c9.zip
yea
Diffstat (limited to 'src')
-rw-r--r--src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java21
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/PreviewTab.java85
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java51
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java89
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PositionRule.java27
5 files changed, 199 insertions, 74 deletions
diff --git a/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java b/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java
index fab7a172..044c7d2c 100644
--- a/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java
@@ -1,7 +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;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
@@ -11,7 +10,6 @@ import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.hud.PlayerListHud;
-import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.text.Text;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
@@ -34,24 +32,7 @@ public class PlayerListHudMixin {
return;
}
- ClientPlayNetworkHandler nwH = MinecraftClient.getInstance().getNetworkHandler();
- if (nwH == null) {
- return;
- }
-
- int h = MinecraftClient.getInstance().getWindow().getScaledHeight();
- float scale = SkyblockerConfigManager.get().uiAndVisuals.tabHud.tabHudScale / 100f;
- w = (int) (w / scale);
- h = (int) (h / scale);
-
- try {
- ScreenMaster.render(context, w,h);
- // Screen screen = Screen.getCorrect(w, h, footer);
- // screen.render(context);
- info.cancel();
- } catch (Exception e) {
- TabHud.LOGGER.error("[Skyblocker] Encountered unknown exception while drawing default hud", e);
- }
+ info.cancel();
}
@Inject(at = @At("HEAD"), method = "setFooter")
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 d473d89e..45548812 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
@@ -15,6 +15,7 @@ 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.gui.widget.ScrollableWidget;
+import net.minecraft.client.gui.widget.TextWidget;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.ItemStack;
import net.minecraft.text.MutableText;
@@ -39,7 +40,7 @@ public class PreviewTab implements Tab {
private final PreviewWidget previewWidget;
private final WidgetsConfigurationScreen parent;
private final WidgetOptionsScrollable widgetOptions;
- private ScreenBuilder.ScreenLayer currentScreenLayer = ScreenBuilder.ScreenLayer.MAIN_TAB;
+ private ScreenMaster.ScreenLayer currentScreenLayer = ScreenMaster.ScreenLayer.MAIN_TAB;
private final ButtonWidget[] layerButtons;
public PreviewTab(MinecraftClient client, WidgetsConfigurationScreen parent) {
@@ -50,10 +51,10 @@ public class PreviewTab implements Tab {
widgetOptions = new WidgetOptionsScrollable();
widgetOptions.setWidth(RIGHT_SIDE_WIDTH - 10);
- ScreenBuilder.ScreenLayer[] values = ScreenBuilder.ScreenLayer.values();
+ ScreenMaster.ScreenLayer[] values = ScreenMaster.ScreenLayer.values();
layerButtons = new ButtonWidget[values.length];
for (int i = 0; i < values.length; i++) {
- ScreenBuilder.ScreenLayer screenLayer = values[i];
+ ScreenMaster.ScreenLayer screenLayer = values[i];
layerButtons[i] = ButtonWidget.builder(Text.literal(screenLayer.toString()), button -> {
this.currentScreenLayer = screenLayer;
for (ButtonWidget layerButton : this.layerButtons) {
@@ -135,6 +136,9 @@ public class PreviewTab implements Tab {
ScreenBuilder screenBuilder = ScreenMaster.getScreenBuilder(parent.getCurrentLocation());
PositionRule positionRule = screenBuilder.getPositionRule(hudWidget.getInternalID());
int width = widgetOptions.getWidth() - widgetOptions.getScrollerWidth();
+ // TODO localization
+
+ widgetOptions.addWidget(new TextWidget(width, 9, Text.literal(hudWidget.getNiceName()).formatted(Formatting.BOLD, Formatting.UNDERLINE), client.textRenderer));
if (positionRule == null) {
widgetOptions.addWidget(ButtonWidget.builder(Text.literal("Positioning: Auto"), button -> {
screenBuilder.setPositionRule(hudWidget.getInternalID(), PositionRule.DEFAULT);
@@ -152,6 +156,38 @@ public class PreviewTab implements Tab {
.width(width)
.build());
+ String ye = "Layer: " + (positionRule.screenLayer() == null ? "Default" : positionRule.screenLayer().toString());
+
+ widgetOptions.addWidget(ButtonWidget.builder(Text.literal(ye), button -> {
+ ScreenBuilder builder = ScreenMaster.getScreenBuilder(parent.getCurrentLocation());
+ PositionRule rule = builder.getPositionRuleOrDefault(hudWidget.getInternalID());
+ ScreenMaster.ScreenLayer[] values = ScreenMaster.ScreenLayer.values();
+ ScreenMaster.ScreenLayer newLayer;
+ if (rule.screenLayer() == null) {
+ newLayer = values[0];
+ } else if (rule.screenLayer().ordinal() == values.length - 1) {
+ newLayer = null;
+ } else {
+ newLayer = values[rule.screenLayer().ordinal() + 1];
+ }
+
+ PositionRule newRule = new PositionRule(
+ rule.parent(),
+ rule.parentPoint(),
+ rule.thisPoint(),
+ rule.relativeX(),
+ rule.relativeY(),
+ newLayer
+ );
+ builder.setPositionRule(hudWidget.getInternalID(), newRule);
+ button.setMessage(Text.literal("Layer: " + (newRule.screenLayer() == null ? "Default" : newRule.screenLayer().toString())));
+ updateWidgets();
+ if (newLayer != null) {
+ layerButtons[newLayer.ordinal()].onPress();
+ }
+
+ }).width(width).build());
+
String parentName = positionRule.parent().equals("screen") ? "Screen" : ScreenMaster.widgetInstances.get(positionRule.parent()).getNiceName();
widgetOptions.addWidget(ButtonWidget.builder(Text.literal("Parent: " + parentName), button -> {
@@ -257,15 +293,17 @@ public class PreviewTab implements Tab {
int thisAnchorX = (int) (selectedWidget.getX() + rule.thisPoint().horizontalPoint().getPercentage() * selectedWidget.getWidth());
int thisAnchorY = (int) (selectedWidget.getY() + rule.thisPoint().verticalPoint().getPercentage() * selectedWidget.getHeight());
- context.drawCenteredTextWithShadow(client.textRenderer, String.valueOf(relativeX + rule.relativeX()), thisAnchorX - (relativeX + rule.relativeX()) / 2, thisAnchorY + 2, Colors.LIGHT_RED);
- context.drawText(client.textRenderer, String.valueOf(rule.relativeY() + relativeY), thisAnchorX - rule.relativeX() - relativeX + 2, thisAnchorY - rule.relativeY() - relativeY + 2, Colors.LIGHT_RED, true);
+ int translatedX = Math.min(thisAnchorX - rule.relativeX() - relativeX, parent.width - 2);
+ int translatedY = Math.min(thisAnchorY - rule.relativeY() - relativeY, parent.height - 2);
- context.drawHorizontalLine(thisAnchorX - rule.relativeX() - relativeX, thisAnchorX, thisAnchorY + 1, 0xAAAA0000);
- context.drawVerticalLine(thisAnchorX - rule.relativeX() - relativeX + 1, thisAnchorY - rule.relativeY() - relativeY, thisAnchorY, 0xAAAA0000);
+ renderUnits(context, relativeX, rule, thisAnchorX, thisAnchorY, relativeY, translatedX, translatedY);
+ context.drawHorizontalLine(translatedX, thisAnchorX, thisAnchorY + 1, 0xAAAA0000);
+ context.drawVerticalLine(translatedX + 1, translatedY, thisAnchorY, 0xAAAA0000);
- context.drawHorizontalLine(thisAnchorX - rule.relativeX() - relativeX, thisAnchorX, thisAnchorY, Colors.RED);
- context.drawVerticalLine(thisAnchorX - rule.relativeX() - relativeX, thisAnchorY - rule.relativeY() - relativeY, thisAnchorY, Colors.RED);
+
+ context.drawHorizontalLine(translatedX, thisAnchorX, thisAnchorY, Colors.RED);
+ context.drawVerticalLine(translatedX, translatedY, thisAnchorY, Colors.RED);
}
}
@@ -273,6 +311,23 @@ public class PreviewTab implements Tab {
context.disableScissor();
}
+ private void renderUnits(DrawContext context, int relativeX, PositionRule rule, int thisAnchorX, int thisAnchorY, int relativeY, int translatedX, int translatedY) {
+ boolean xUnitOnTop = rule.relativeY() > 0;
+ if (xUnitOnTop && thisAnchorY < 10) xUnitOnTop = false;
+ if (!xUnitOnTop && thisAnchorY > parent.height - 10) xUnitOnTop = true;
+
+ String yUnitText = String.valueOf(rule.relativeY() + relativeY);
+ int yUnitTextWidth = client.textRenderer.getWidth(yUnitText);
+ boolean yUnitOnRight = rule.relativeX() > 0;
+ if (yUnitOnRight && translatedX + 2 + yUnitTextWidth >= parent.width) yUnitOnRight = false;
+ if (!yUnitOnRight && translatedX - 2 - yUnitTextWidth <= 0) yUnitOnRight = true;
+
+ // X
+ context.drawCenteredTextWithShadow(client.textRenderer, String.valueOf(relativeX + rule.relativeX()), thisAnchorX - (relativeX + rule.relativeX()) / 2, xUnitOnTop ? thisAnchorY - 9 : thisAnchorY + 2, Colors.LIGHT_RED);
+ // Y
+ context.drawText(client.textRenderer, yUnitText, yUnitOnRight ? translatedX + 2 : translatedX - 1 - yUnitTextWidth, thisAnchorY - (relativeY + rule.relativeY() - 9) / 2, Colors.LIGHT_RED, true);
+ }
+
@Override
protected void appendClickableNarrations(NarrationMessageBuilder builder) {
}
@@ -316,7 +371,8 @@ public class PreviewTab implements Tab {
oldRule.parentPoint(),
oldRule.thisPoint(),
oldRule.relativeX() + relativeX,
- oldRule.relativeY() + relativeY));
+ oldRule.relativeY() + relativeY,
+ oldRule.screenLayer()));
updateWidgets();
}
@@ -343,7 +399,8 @@ public class PreviewTab implements Tab {
PositionRule.Point.DEFAULT,
oldRule.thisPoint(),
thisAnchorX - otherAnchorX,
- thisAnchorY - otherAnchorY
+ thisAnchorY - otherAnchorY,
+ oldRule.screenLayer()
);
screenBuilder.setPositionRule(selectedWidget.getInternalID(), newRule);
updateWidgets();
@@ -488,14 +545,16 @@ public class PreviewTab implements Tab {
hoveredPoint,
oldRule.thisPoint(),
oldRule.relativeX(),
- oldRule.relativeY()));
+ oldRule.relativeY(),
+ oldRule.screenLayer()));
} else {
screenBuilder.setPositionRule(internalID, new PositionRule(
oldRule.parent(),
oldRule.parentPoint(),
hoveredPoint,
oldRule.relativeX(),
- oldRule.relativeY()));
+ oldRule.relativeY(),
+ oldRule.screenLayer()));
}
}
updateWidgets();
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 f4865cdd..d4f3e3d9 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
@@ -147,6 +147,11 @@ public class ScreenBuilder {
return positioning.get(widgetInternalId);
}
+ public PositionRule getPositionRuleOrDefault(String widgetInternalId) {
+ PositionRule positionRule = getPositionRule(widgetInternalId);
+ return positionRule == null ? PositionRule.DEFAULT : positionRule;
+ }
+
public void setPositionRule(String widgetInternalId, @Nullable PositionRule newPositionRule) {
if (newPositionRule == null) positioning.remove(widgetInternalId);
else positioning.put(widgetInternalId, newPositionRule);
@@ -175,16 +180,36 @@ public class ScreenBuilder {
for (HudWidget widget : ScreenMaster.widgetInstances.values()) {
if (widget.shouldRender(location)) { // TabHudWidget has this at false
- hudScreen.add(widget);
+ // TODO maybe behavior to change? (having no position rule on a normal hud widget shouldn't quite be possible)
+ PositionRule rule = getPositionRule(widget.getInternalID());
+ if (rule == null) {
+ hudScreen.add(widget);
+ } else {
+ switch (rule.screenLayer()) {
+ case MAIN_TAB -> mainTabScreen.add(widget);
+ case SECONDARY_TAB -> secondaryTabScreen.add(widget);
+ case null, default -> hudScreen.add(widget);
+ }
+ }
widget.update();
widget.setPositioned(false);
}
}
- // TODO check things and stuff
- mainTabScreen.addAll(PlayerListMgr.tabWidgetsToShow);
+ for (TabHudWidget widget : PlayerListMgr.tabWidgetsToShow) {
+ PositionRule rule = getPositionRule(widget.getInternalID());
+ if (rule == null) {
+ mainTabScreen.add(widget);
+ } else {
+ widget.setPositioned(false);
+ switch (rule.screenLayer()) {
+ case HUD -> hudScreen.add(widget);
+ case SECONDARY_TAB -> secondaryTabScreen.add(widget);
+ case null, default -> mainTabScreen.add(widget);
+ }
+ }
+ }
- System.out.println(positioning);
// Auto positioning
for (HudWidget widget : mainTabScreen) {
@@ -215,7 +240,7 @@ public class ScreenBuilder {
}
}
- public void renderWidgets(DrawContext context, ScreenLayer screenLayer) {
+ public void renderWidgets(DrawContext context, ScreenMaster.ScreenLayer screenLayer) {
List<HudWidget> widgetsToRender = getHudWidgets(screenLayer);
for (HudWidget widget : widgetsToRender) {
@@ -223,7 +248,7 @@ public class ScreenBuilder {
}
}
- public List<HudWidget> getHudWidgets(ScreenLayer screenLayer) {
+ public List<HudWidget> getHudWidgets(ScreenMaster.ScreenLayer screenLayer) {
return switch (screenLayer) {
case MAIN_TAB -> mainTabScreen;
case SECONDARY_TAB -> secondaryTabScreen;
@@ -235,13 +260,13 @@ public class ScreenBuilder {
/**
* Run the pipeline to build a Screen
*/
- public void run(DrawContext context, int screenW, int screenH) {
+ public void run(DrawContext context, int screenW, int screenH, ScreenMaster.ScreenLayer screenLayer) {
- int i = 0;
+ /*int i = 0;
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;
- }
+ }*/
if (positionsNeedsUpdating) {
positionsNeedsUpdating = false;
@@ -249,14 +274,10 @@ public class ScreenBuilder {
System.out.println(location);
}
- renderWidgets(context, ScreenLayer.MAIN_TAB);
+ renderWidgets(context, screenLayer);
}
- public enum ScreenLayer {
- MAIN_TAB,
- SECONDARY_TAB,
- HUD
- }
+
private enum DefaultPositioner {
TOP(TopAlignedWidgetPositioner::new),
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 62c03ab3..6b7068d6 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,35 +1,44 @@
package de.hysky.skyblocker.skyblock.tabhud.screenbuilder;
import com.google.common.reflect.ClassPath;
+import com.mojang.logging.LogUtils;
+import com.mojang.serialization.Codec;
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.events.HudRenderEvents;
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;
-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.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
+import net.minecraft.client.util.Window;
import net.minecraft.util.Identifier;
+import net.minecraft.util.StringIdentifiable;
import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.io.BufferedReader;
import java.lang.reflect.InvocationTargetException;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;
public class ScreenMaster {
- private static final Logger LOGGER = LoggerFactory.getLogger("skyblocker");
+ private static final Logger LOGGER = LogUtils.getLogger();
private static final int VERSION = 1;
+ private static final Path FILE = SkyblockerMod.CONFIG_DIR.resolve("hud_widgets.json");
- private static final HashMap<String, ScreenBuilder> standardMap = new HashMap<>();
- private static final HashMap<String, ScreenBuilder> screenAMap = new HashMap<>();
- private static final HashMap<String, ScreenBuilder> screenBMap = new HashMap<>();
- private static final Map<Location, ScreenBuilder> builderMap = new HashMap<>();
+ private static final Map<Location, ScreenBuilder> builderMap = new EnumMap<>(Location.class);
public static final Map<String, HudWidget> widgetInstances = new HashMap<>();
@@ -54,25 +63,30 @@ public class ScreenMaster {
* Calls the appropriate ScreenBuilder with the screen's dimensions
*/
public static void render(DrawContext context, int w, int h) {
- String location = PlayerLocator.getPlayerLocation().internal;
- HashMap<String, ScreenBuilder> lookup;
- if (TabHud.toggleA.isPressed()) {
- lookup = screenAMap;
- } else if (TabHud.toggleB.isPressed()) {
- lookup = screenBMap;
+ MinecraftClient client = MinecraftClient.getInstance();
+ ScreenLayer screenLayer;
+ if (client.options.playerListKey.isPressed()) {
+ if (TabHud.defaultTgl.isPressed()) return;
+ if (TabHud.toggleA.isPressed()) {
+ screenLayer = ScreenLayer.SECONDARY_TAB;
+ } else {
+ screenLayer = ScreenLayer.MAIN_TAB;
+ }
} else {
- lookup = standardMap;
- }
-
- ScreenBuilder sb = lookup.get(location);
- // seems suboptimal, maybe load the default first into all possible values
- // and then override?
- if (sb == null) {
- sb = lookup.get("default");
+ screenLayer = ScreenLayer.HUD;
}
- getScreenBuilder(Utils.getLocation()).run(context, w, h);
+ getScreenBuilder(Utils.getLocation()).run(context, w, h, screenLayer);
+ }
+ public static void loadConfig() {
+ try (BufferedReader reader = Files.newBufferedReader(FILE)) {
+
+ } catch (NoSuchFileException e) {
+ LOGGER.warn("[Skyblocker] No status bar config file found, using defaults");
+ } catch (Exception e) {
+ LOGGER.error("[Skyblocker] Failed to load hud widgets config", e);
+ }
}
@Init
@@ -80,8 +94,14 @@ public class ScreenMaster {
SkyblockEvents.LOCATION_CHANGE.register(location -> ScreenBuilder.positionsNeedsUpdating = true);
+ HudRenderEvents.BEFORE_CHAT.register((context, tickDelta) -> {
+ MinecraftClient client = MinecraftClient.getInstance();
+ Window window = client.getWindow();
+ float scale = SkyblockerConfigManager.get().uiAndVisuals.tabHud.tabHudScale / 100f;
+ render(context, (int) (window.getScaledWidth() / scale), (int) (window.getScaledHeight() / scale));
+ });
+
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 {
@@ -89,7 +109,8 @@ public class ScreenMaster {
if (!load.getSuperclass().equals(TabHudWidget.class)) return;
TabHudWidget tabHudWidget = (TabHudWidget) load.getDeclaredConstructor().newInstance();
PlayerListMgr.tabWidgetInstances.put(tabHudWidget.getHypixelWidgetName(), tabHudWidget);
- } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException | ClassNotFoundException e) {
+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException |
+ IllegalAccessException | ClassNotFoundException e) {
LOGGER.error("[Skyblocker] Failed to load {} hud widget", classInfo.getName(), e);
}
@@ -97,6 +118,7 @@ public class ScreenMaster {
} catch (Exception e) {
LOGGER.error("[Skyblocker] Failed to get instances of hud widgets", e);
}
+
});
for (Location value : Location.values()) {
@@ -166,4 +188,23 @@ public class ScreenMaster {
*/
}
+ public enum ScreenLayer {
+ MAIN_TAB,
+ SECONDARY_TAB,
+ HUD;
+
+ public static final Codec<ScreenLayer> CODEC_NULLABLE = Codec.STRING.xmap(
+ s -> s.equals("null") ? null : ScreenLayer.valueOf(s),
+ screenLayer -> screenLayer == null ? "null": screenLayer.name());
+
+ @Override
+ public String toString() {
+ return switch (this) {
+ case MAIN_TAB -> "Main Tab";
+ case SECONDARY_TAB -> "Secondary Tab";
+ case HUD -> "HUD";
+ };
+ }
+ }
+
}
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
index c84dd0a2..c71b13a9 100644
--- 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
@@ -1,8 +1,23 @@
package de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline;
-public record PositionRule(String parent, Point parentPoint, Point thisPoint, int relativeX, int relativeY) {
+import com.mojang.serialization.Codec;
+import com.mojang.serialization.codecs.RecordCodecBuilder;
+import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster;
+import org.jetbrains.annotations.Nullable;
- public static final PositionRule DEFAULT = new PositionRule("screen", Point.DEFAULT, Point.DEFAULT, 0, 0);
+public record PositionRule(String parent, Point parentPoint, Point thisPoint, int relativeX, int relativeY, @Nullable
+ScreenMaster.ScreenLayer screenLayer) {
+
+ public static final PositionRule DEFAULT = new PositionRule("screen", Point.DEFAULT, Point.DEFAULT, 0, 0, null);
+
+ public static final Codec<PositionRule> CODEC = RecordCodecBuilder.create(instance -> instance.group(
+ Codec.STRING.fieldOf("parent").forGetter(PositionRule::parent),
+ Point.CODEC.fieldOf("parent_anchor").forGetter(PositionRule::parentPoint),
+ Point.CODEC.fieldOf("this_anchor").forGetter(PositionRule::thisPoint),
+ Codec.INT.fieldOf("relative_x").forGetter(PositionRule::relativeX),
+ Codec.INT.fieldOf("relative_y").forGetter(PositionRule::relativeY),
+ ScreenMaster.ScreenLayer.CODEC_NULLABLE.fieldOf("layer").forGetter(PositionRule::screenLayer)
+ ).apply(instance, PositionRule::new));
public enum HorizontalPoint {
@@ -10,6 +25,8 @@ public record PositionRule(String parent, Point parentPoint, Point thisPoint, in
CENTER,
RIGHT;
+ public static final Codec<HorizontalPoint> CODEC = Codec.STRING.xmap(HorizontalPoint::valueOf, HorizontalPoint::name);
+
public float getPercentage() {
return switch (this) {
case LEFT -> 0.f;
@@ -24,6 +41,8 @@ public record PositionRule(String parent, Point parentPoint, Point thisPoint, in
CENTER,
BOTTOM;
+ public static final Codec<VerticalPoint> CODEC = Codec.STRING.xmap(VerticalPoint::valueOf, VerticalPoint::name);
+
public float getPercentage() {
return switch (this) {
case TOP -> 0.f;
@@ -35,5 +54,9 @@ public record PositionRule(String parent, Point parentPoint, Point thisPoint, in
public record Point(VerticalPoint verticalPoint, HorizontalPoint horizontalPoint) {
public static final Point DEFAULT = new Point(VerticalPoint.TOP, HorizontalPoint.LEFT);
+ public static final Codec<Point> CODEC = RecordCodecBuilder.create(instance -> instance.group(
+ VerticalPoint.CODEC.fieldOf("v").forGetter(Point::verticalPoint),
+ HorizontalPoint.CODEC.fieldOf("h").forGetter(Point::horizontalPoint)
+ ).apply(instance, Point::new));
}
}