diff options
| author | viciscat <51047087+viciscat@users.noreply.github.com> | 2024-06-27 12:17:09 +0200 |
|---|---|---|
| committer | viciscat <51047087+viciscat@users.noreply.github.com> | 2024-12-12 18:19:05 +0100 |
| commit | 4d6fb1f051751da1b4b99186f9324670d26b83c9 (patch) | |
| tree | 04c1140e6b30710cc1cbb190d1c067908f5de514 /src | |
| parent | 0e250cec774b36cab3f099e45b0784d9a0b3a830 (diff) | |
| download | Skyblocker-4d6fb1f051751da1b4b99186f9324670d26b83c9.tar.gz Skyblocker-4d6fb1f051751da1b4b99186f9324670d26b83c9.tar.bz2 Skyblocker-4d6fb1f051751da1b4b99186f9324670d26b83c9.zip | |
yea
Diffstat (limited to 'src')
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)); } } |
