From f9740d423146fafa83a85704580368cdc1131377 Mon Sep 17 00:00:00 2001 From: msg-programs Date: Sun, 16 Jul 2023 14:44:32 +0200 Subject: POC for JSON-based tabhud config. --- .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 1 + .../skyblocker/mixin/PlayerListHudMixin.java | 11 ++- .../skyblock/tabhud/screens/PipelineStage.java | 14 ++++ .../skyblock/tabhud/screens/PlaceStage.java | 29 +++++++ .../skyblocker/skyblock/tabhud/screens/Screen.java | 4 +- .../skyblock/tabhud/screens/ScreenBuilder.java | 94 ++++++++++++++++++++++ .../skyblock/tabhud/screens/ScreenMaster.java | 76 +++++++++++++++++ .../skyblock/tabhud/widget/EmptyWidget.java | 4 + .../skyblocker/skyblock/tabhud/widget/Widget.java | 29 ++++--- .../assets/skyblocker/tabhud/assignment.json | 11 +++ .../assets/skyblocker/tabhud/empty_screen.json | 17 ++++ .../skyblocker/tabhud/garden_info_screen.json | 88 ++++++++++++++++++++ .../skyblocker/tabhud/generic_info_screen.json | 69 ++++++++++++++++ 13 files changed, 433 insertions(+), 14 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PipelineStage.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PlaceStage.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ScreenBuilder.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ScreenMaster.java create mode 100644 src/main/resources/assets/skyblocker/tabhud/assignment.json create mode 100644 src/main/resources/assets/skyblocker/tabhud/empty_screen.json create mode 100644 src/main/resources/assets/skyblocker/tabhud/garden_info_screen.json create mode 100644 src/main/resources/assets/skyblocker/tabhud/generic_info_screen.json (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index cc712405..461817ce 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -17,6 +17,7 @@ import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; import me.xmrvizzy.skyblocker.skyblock.quicknav.QuickNav; import me.xmrvizzy.skyblocker.skyblock.rift.TheRift; import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud; +import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.ScreenMaster; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.utils.*; import me.xmrvizzy.skyblocker.utils.title.TitleContainer; diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java index ef65190f..b3d78fa8 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java @@ -9,6 +9,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud; import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen; +import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.ScreenBuilder; +import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.ScreenMaster; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -45,9 +47,14 @@ public class PlayerListHudMixin { int w = scaledW; int h = MinecraftClient.getInstance().getWindow().getScaledHeight(); + float scale = SkyblockerConfig.get().general.tabHud.tabHudScale / 100f; + w = (int) (w / scale); + h = (int) (h / scale); + try { - Screen screen = Screen.getCorrect(w, h, footer); - screen.render(context); + ScreenMaster.render(context, w,h,footer); + // Screen screen = Screen.getCorrect(w, h, footer); + // screen.render(context); info.cancel(); } catch (Exception e) { TabHud.LOGGER.error("Drawing default hud. Reason: Screen exception {}", e); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PipelineStage.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PipelineStage.java new file mode 100644 index 00000000..d33078d8 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PipelineStage.java @@ -0,0 +1,14 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.ArrayList; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; + +public abstract class PipelineStage { + + protected ArrayList primary = null; + protected ArrayList secondary = null; + + public abstract void run(int screenW, int screenH); + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PlaceStage.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PlaceStage.java new file mode 100644 index 00000000..aba952a0 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PlaceStage.java @@ -0,0 +1,29 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.ArrayList; + +import com.google.gson.JsonObject; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; + +public class PlaceStage extends PipelineStage { + + private String where; + + public PlaceStage(ScreenBuilder builder, JsonObject descr) { + this.where = descr.get("where").getAsString(); + this.primary = new ArrayList(descr.getAsJsonArray("apply_to") + .asList() + .stream() + .map(x -> builder.getInstance(x.getAsString())) + .toList()); + } + + public void run(int screenW, int screenH) { + for (Widget wid : primary) { + if (where.equals("center")) { + wid.setY((screenH - wid.getHeight()) / 2); + wid.setX((screenW - wid.getWidth()) / 2); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java index 6d06c637..2673e1df 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java @@ -26,13 +26,12 @@ import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList.PlayerListScree import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerLocator; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; public class Screen { private ArrayList widgets = new ArrayList<>(); - private int w, h; + public int w, h; public Screen(int w, int h) { float scale = SkyblockerConfig.get().general.tabHud.tabHudScale / 100f; @@ -41,6 +40,7 @@ public class Screen { } public static Screen getCorrect(int w, int h, Text footer) { + if (TabHud.genericTgl.isPressed()) { return Screen.correctGenericScrn(w, h, footer); } else if (TabHud.playerTgl.isPressed()) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ScreenBuilder.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ScreenBuilder.java new file mode 100644 index 00000000..c9c4ad18 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ScreenBuilder.java @@ -0,0 +1,94 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.io.BufferedReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.EmptyWidget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +public class ScreenBuilder { + + private ArrayList layoutPipeline = new ArrayList<>(); + + private ArrayList instances = new ArrayList<>(); + private HashMap objectMap = new HashMap<>(); + + + public ScreenBuilder(String jsonfile) throws IOException { + + Identifier ident = new Identifier(SkyblockerMod.NAMESPACE, "tabhud/" + jsonfile + ".json"); + BufferedReader reader = MinecraftClient.getInstance().getResourceManager().openAsReader(ident); + JsonObject json = JsonParser.parseReader(reader).getAsJsonObject(); + reader.close(); + + JsonArray widgets = json.getAsJsonArray("widgets"); + JsonArray layout = json.getAsJsonArray("layout"); + + for (JsonElement w : widgets) { + JsonObject widget = w.getAsJsonObject(); + String name = widget.get("name").getAsString(); + String alias = widget.get("alias").getAsString(); + + JsonElement args = widget.get("args"); + JsonObject argsObj = (args == null) ? null : args.getAsJsonObject(); + + Widget wid = instanceFrom(name, argsObj); + objectMap.put(alias, wid); + instances.add(wid); + } + + for (JsonElement l : layout) { + layoutPipeline.add(createStage(l.getAsJsonObject())); + } + + } + + public Widget instanceFrom(String name, JsonObject args) { + return switch (name) { + case "EmptyWidget" -> new EmptyWidget(); + default -> new EmptyWidget(); + }; + } + + public PipelineStage createStage(JsonObject descr) { + + String op = descr.get("op").getAsString(); + + switch (op) { + case "place": + return new PlaceStage(this, descr); + } + return null; + } + + public Widget getInstance(String name) { + return this.objectMap.get(name); + } + + public void run(DrawContext context, int screenW, int screenH, Text footer) { + + for (Widget w : instances) { + w.update(); + } + for (PipelineStage ps : layoutPipeline) { + ps.run(screenW, screenH); + } + for (Widget w : instances) { + w.render(context); + } + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ScreenMaster.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ScreenMaster.java new file mode 100644 index 00000000..02b595d1 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ScreenMaster.java @@ -0,0 +1,76 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.io.BufferedReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map.Entry; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import me.xmrvizzy.skyblocker.SkyblockerMod; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +public class ScreenMaster { + + private static final Identifier ASSIGNMENT_JSON = new Identifier(SkyblockerMod.NAMESPACE, "tabhud/assignment.json"); + private static final Logger LOGGER = LoggerFactory.getLogger("skyblocker"); + + private static HashMap screenAMap = new HashMap<>(); + // private static HashMap screenBMap = new HashMap<>(); + // private static HashMap screenCMap = new HashMap<>(); + + static { + init(); + } + + public static void init() { + try (BufferedReader reader = MinecraftClient.getInstance().getResourceManager().openAsReader(ASSIGNMENT_JSON)) { + + JsonObject json = JsonParser.parseReader(reader).getAsJsonObject(); + JsonObject screenA = json.getAsJsonObject("screenA"); + for (Entry entry : screenA.entrySet()) { + screenAMap.put(entry.getKey(), new ScreenBuilder(entry.getValue().getAsString())); + } + + } catch (IOException ioex) { + LOGGER.info("[Skyblocker] Couldn't load tabhud config!"); + ioex.printStackTrace(); + } + } + + public static void render(DrawContext context, int w, int h, Text footer) { + screenAMap.get("default").run(context, w, h, footer); + } +} + +/* + * + * stackWidgetsH +stackWidgetsW +--> stack (direction?) horiz/vert (align?) center/top/bottom/left/right + +centerH +centerW +center +--> center (center/horiz/vert) +----> place (one) (where?) center/top/bot/left/right/[corners] + +offCenterL +offCenterR +--> offCenter left/right/top/bot +----> offsetPlace (where?) center/left/right/top/bot (offset to where?) left/right/top/bot + +----> align (any) (reference?) left, leftOfCenter, horizontalCenter, rightOfCenter, right, top, topOfCenter, verticalCenter, botOfCenter, bot + +collideAgainstL +collideAgainstR +--> collideAgainst (from where?) left/right/top/bot + */ \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EmptyWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EmptyWidget.java index 52d6cfbd..61da439a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EmptyWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EmptyWidget.java @@ -14,7 +14,11 @@ public class EmptyWidget extends Widget { public EmptyWidget() { super(TITLE, Formatting.RED.getColorValue()); + } + @Override + public void update() { + super.update(); Text info = Text.of("No info for this area!"); PlainTextComponent inf = new PlainTextComponent(info); this.addComponent(inf); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/Widget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/Widget.java index 33f77933..15b2adf2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/Widget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/Widget.java @@ -45,12 +45,17 @@ public abstract class Widget { } public final void addComponent(Component c) { - components.add(c); + this.components.add(c); + } + + public void update() { + this.components.clear(); } /** * Shorthand function for simple components. - * If the entry at idx has the format ": ", an IcoTextComponent is added as such: + * If the entry at idx has the format ": ", an IcoTextComponent is + * added as such: * [ico] [string] [textB.formatted(fmt)] */ public final void addSimpleIcoText(ItemStack ico, String string, Formatting fmt, int idx) { @@ -60,9 +65,12 @@ public abstract class Widget { /** * Calculate the size of this widget. - * Must be called before returning from the widget constructor and after all components are added! + * Must be called before returning from the widget constructor and after all + * components are added! */ public final void pack() { + h = 0; + w = 0; for (Component c : components) { h += c.getHeight() + Component.PAD_L; w = Math.max(w, c.getWidth() + Component.PAD_S); @@ -111,7 +119,7 @@ public abstract class Widget { * Draw this widget, possibly with a background */ public final void render(DrawContext context, boolean hasBG) { - MatrixStack ms = context.getMatrices(); + MatrixStack ms = context.getMatrices(); // not sure if this is the way to go, but it fixes Z-layer issues // like blocks being rendered behind the BG and the hotbar clipping into things @@ -124,9 +132,9 @@ public abstract class Widget { // move above other UI elements ms.translate(0, 0, 200); if (hasBG) { - context.fill(x + 1, y, x + w - 1, y + h, COL_BG_BOX); - context.fill(x, y + 1, x + 1, y + h - 1, COL_BG_BOX); - context.fill(x + w - 1, y + 1, x + w, y + h - 1, COL_BG_BOX); + context.fill(x + 1, y, x + w - 1, y + h, COL_BG_BOX); + context.fill(x, y + 1, x + 1, y + h - 1, COL_BG_BOX); + context.fill(x + w - 1, y + 1, x + w, y + h - 1, COL_BG_BOX); } // move above background (if exists) ms.translate(0, 0, 100); @@ -163,9 +171,10 @@ public abstract class Widget { } /** - * If the entry at idx has the format "[textA]: [textB]", the following is returned: + * If the entry at idx has the format "[textA]: [textB]", the following is + * returned: * [entryName] [textB.formatted(contentFmt)] - */ + */ public static Text simpleEntryText(int idx, String entryName, Formatting contentFmt) { String src = PlayerListMgr.strAt(idx); @@ -185,7 +194,7 @@ public abstract class Widget { /** * @return [entryName] [entryContent.formatted(contentFmt)] - */ + */ public static Text simpleEntryText(String entryContent, String entryName, Formatting contentFmt) { return Text.literal(entryName).append(Text.literal(entryContent).formatted(contentFmt)); } diff --git a/src/main/resources/assets/skyblocker/tabhud/assignment.json b/src/main/resources/assets/skyblocker/tabhud/assignment.json new file mode 100644 index 00000000..a7b8dd80 --- /dev/null +++ b/src/main/resources/assets/skyblocker/tabhud/assignment.json @@ -0,0 +1,11 @@ +{ + "screenA": { + "default": "generic_info_screen" + }, + "screenB": { + "default": "empty_screen" + }, + "screenC": { + "default": "empty_screen" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/skyblocker/tabhud/empty_screen.json b/src/main/resources/assets/skyblocker/tabhud/empty_screen.json new file mode 100644 index 00000000..0252940a --- /dev/null +++ b/src/main/resources/assets/skyblocker/tabhud/empty_screen.json @@ -0,0 +1,17 @@ +{ + "widgets": [ + { + "name": "EmptyWidget", + "alias": "ew" + } + ], + "layout": [ + { + "op": "place", + "where": "center", + "apply_to": [ + "ew" + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/skyblocker/tabhud/garden_info_screen.json b/src/main/resources/assets/skyblocker/tabhud/garden_info_screen.json new file mode 100644 index 00000000..3ddfdfc3 --- /dev/null +++ b/src/main/resources/assets/skyblocker/tabhud/garden_info_screen.json @@ -0,0 +1,88 @@ +{ + "widgets":[ + { + "name": "GardenSkillsWidget", + "alias": "gsw", + "args": null + }, + { + "name": "EventWidget", + "alias": "evw", + "args": true + }, + { + "name": "UpgradeWidget", + "alias": "uw", + "args": null + }, + { + "name": "ProfileWidget", + "alias": "pw", + "args": null + }, + { + "name": "EffectWidget", + "alias": "efw", + "args": null + }, + { + "name": "JacobsContestWidget", + "alias": "jcw", + "args": null + }, + { + "name": "CookieWidget", + "alias": "cw", + "args": null + } + ], + "layout": [ + { + "op": "stack", + "direction": "vertical", + "align": "center", + "apply_to": ["gsw", "evw", "uw"] + }, + { + "op": "stack", + "direction": "vertical", + "align": "center", + "apply_to": ["pw", "efw"] + }, + { + "op": "stack", + "direction": "vertical", + "align": "center", + "apply_to": ["jcw", "cw"] + }, + { + "op": "align", + "align": "center", + "apply_to": ["gsw", "evw", "uw"] + }, + { + "op": "collideAgainst", + "direction": "left", + "widget": "pw", + "colliders": ["gsw", "evw", "uw"] + }, + { + "op": "collideAgainst", + "direction": "left", + "widget": "efw", + "colliders": ["gsw", "evw", "uw"] + }, + { + "op": "collideAgainst", + "direction": "right", + "widget": "jcw", + "colliders": ["gsw", "evw", "uw"] + }, + { + "op": "collideAgainst", + "direction": "right", + "widget": "cw", + "colliders": ["gsw", "evw", "uw"] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/skyblocker/tabhud/generic_info_screen.json b/src/main/resources/assets/skyblocker/tabhud/generic_info_screen.json new file mode 100644 index 00000000..27a28008 --- /dev/null +++ b/src/main/resources/assets/skyblocker/tabhud/generic_info_screen.json @@ -0,0 +1,69 @@ +{ + "widgets":[ + { + "name": "SkillsWidget", + "alias": "sw" + }, + { + "name": "EventWidget", + "alias": "evw" + }, + { + "name": "UpgradeWidget", + "alias": "uw" + }, + { + "name": "ProfileWidget", + "alias": "pw" + }, + { + "name": "EffectWidget", + "alias": "efw" + }, + { + "name": "ElectionWidget", + "alias": "elw" + }, + { + "name": "CookieWidget", + "alias": "cw" + } + ], + "layout": [ + { + "op": "stack", + "direction": "vertical", + "align": "center", + "apply_to": ["sw", "evw", "uw"] + }, + { + "op": "stack", + "direction": "vertical", + "align": "center", + "apply_to": ["pw", "efw"] + }, + { + "op": "stack", + "direction": "vertical", + "align": "center", + "apply_to": ["elw", "cw"] + }, + { + "op": "align", + "reference": "horizontalCenter", + "apply_to": ["sw", "evw", "uw"] + }, + { + "op": "collideAgainst", + "direction": "left", + "widgets": ["pw", "efw"], + "colliders": ["sw", "evw", "uw"] + }, + { + "op": "collideAgainst", + "direction": "right", + "widgets": ["elw", "cw"], + "colliders": ["sw", "evw", "uw"] + } + ] +} \ No newline at end of file -- cgit From 384d9954aedefcee6f132d2bdadca11fca682bd7 Mon Sep 17 00:00:00 2001 From: msg-programs Date: Sun, 23 Jul 2023 12:29:32 +0200 Subject: Massive refactor, see details Instead of creating a new widget instance every frame, instantiate once and update content. This means that every widget had to be updated to work like that. This also necessitated some ugly hackery for the dwarven HUD. Many other minor things like moving and renaming classes --- .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 2 +- .../skyblocker/mixin/PlayerListHudMixin.java | 10 +- .../skyblocker/skyblock/dwarven/DwarvenHud.java | 34 ++--- .../tabhud/screenbuilder/ScreenBuilder.java | 166 +++++++++++++++++++++ .../tabhud/screenbuilder/ScreenMaster.java | 82 ++++++++++ .../tabhud/screenbuilder/pipeline/AlignStage.java | 53 +++++++ .../screenbuilder/pipeline/CollideStage.java | 84 +++++++++++ .../screenbuilder/pipeline/PipelineStage.java | 14 ++ .../tabhud/screenbuilder/pipeline/PlaceStage.java | 31 ++++ .../tabhud/screenbuilder/pipeline/StackStage.java | 74 +++++++++ .../skyblock/tabhud/screens/PipelineStage.java | 14 -- .../skyblock/tabhud/screens/PlaceStage.java | 29 ---- .../skyblock/tabhud/screens/ScreenBuilder.java | 94 ------------ .../skyblock/tabhud/screens/ScreenMaster.java | 76 ---------- .../screens/genericInfo/GardenInfoScreen.java | 38 ++--- .../screens/genericInfo/GenericInfoScreen.java | 38 ++--- .../screens/genericInfo/GenericRiftInfoScreen.java | 28 ++-- .../skyblock/tabhud/util/PlayerListMgr.java | 9 ++ .../skyblock/tabhud/widget/CommsWidget.java | 30 +--- .../skyblock/tabhud/widget/ComposterWidget.java | 4 +- .../skyblock/tabhud/widget/CookieWidget.java | 10 +- .../skyblock/tabhud/widget/DungeonBuffWidget.java | 10 +- .../skyblock/tabhud/widget/DungeonDeathWidget.java | 4 +- .../tabhud/widget/DungeonDownedWidget.java | 4 +- .../tabhud/widget/DungeonPlayerWidget.java | 8 +- .../tabhud/widget/DungeonPuzzleWidget.java | 4 +- .../tabhud/widget/DungeonSecretWidget.java | 4 +- .../tabhud/widget/DungeonServerWidget.java | 5 +- .../skyblock/tabhud/widget/EffectWidget.java | 13 +- .../skyblock/tabhud/widget/ElectionWidget.java | 5 +- .../skyblock/tabhud/widget/EmptyWidget.java | 4 +- .../skyblock/tabhud/widget/EssenceWidget.java | 5 +- .../skyblock/tabhud/widget/EventWidget.java | 7 +- .../skyblock/tabhud/widget/FireSaleWidget.java | 6 +- .../skyblock/tabhud/widget/ForgeWidget.java | 6 +- .../skyblock/tabhud/widget/GardenServerWidget.java | 5 +- .../skyblock/tabhud/widget/GardenSkillsWidget.java | 4 +- .../skyblock/tabhud/widget/GuestServerWidget.java | 4 +- .../skyblock/tabhud/widget/HudCommsWidget.java | 75 ++++++++++ .../skyblock/tabhud/widget/IslandGuestsWidget.java | 5 +- .../skyblock/tabhud/widget/IslandOwnersWidget.java | 7 +- .../skyblock/tabhud/widget/IslandSelfWidget.java | 12 +- .../skyblock/tabhud/widget/IslandServerWidget.java | 4 +- .../tabhud/widget/JacobsContestWidget.java | 4 +- .../skyblock/tabhud/widget/MinionWidget.java | 4 +- .../skyblock/tabhud/widget/ParkServerWidget.java | 4 +- .../skyblock/tabhud/widget/PlayerListWidget.java | 6 +- .../skyblock/tabhud/widget/PowderWidget.java | 5 +- .../skyblock/tabhud/widget/ProfileWidget.java | 5 +- .../skyblock/tabhud/widget/QuestWidget.java | 5 +- .../skyblock/tabhud/widget/ReputationWidget.java | 5 +- .../skyblock/tabhud/widget/ServerWidget.java | 4 +- .../skyblock/tabhud/widget/SkillsWidget.java | 5 +- .../skyblock/tabhud/widget/TrapperWidget.java | 5 +- .../skyblock/tabhud/widget/UpgradeWidget.java | 12 +- .../skyblock/tabhud/widget/VolcanoWidget.java | 6 +- .../skyblocker/skyblock/tabhud/widget/Widget.java | 8 +- .../tabhud/widget/rift/AdvertisementWidget.java | 4 +- .../tabhud/widget/rift/GoodToKnowWidget.java | 4 +- .../tabhud/widget/rift/RiftProfileWidget.java | 6 +- .../tabhud/widget/rift/RiftProgressWidget.java | 4 +- .../tabhud/widget/rift/RiftServerInfoWidget.java | 7 +- .../tabhud/widget/rift/RiftStatsWidget.java | 6 +- .../skyblock/tabhud/widget/rift/ShenWidget.java | 6 +- .../assets/skyblocker/tabhud/assignment.json | 6 +- .../skyblocker/tabhud/garden_info_screen.json | 88 ----------- .../skyblocker/tabhud/generic_info_screen.json | 69 --------- .../skyblocker/tabhud/info/garden_info_screen.json | 70 +++++++++ .../tabhud/info/generic_info_screen.json | 70 +++++++++ .../skyblocker/tabhud/info/rift_info_screen.json | 48 ++++++ .../resources/assets/skyblocker/tabhud/readme.md | 100 +++++++++++++ .../assets/skyblocker/tabhud/test_screen.json | 122 +++++++++++++++ 72 files changed, 1258 insertions(+), 551 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/AlignStage.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CollideStage.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PipelineStage.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PlaceStage.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/StackStage.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PipelineStage.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PlaceStage.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ScreenBuilder.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ScreenMaster.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/HudCommsWidget.java delete mode 100644 src/main/resources/assets/skyblocker/tabhud/garden_info_screen.json delete mode 100644 src/main/resources/assets/skyblocker/tabhud/generic_info_screen.json create mode 100644 src/main/resources/assets/skyblocker/tabhud/info/garden_info_screen.json create mode 100644 src/main/resources/assets/skyblocker/tabhud/info/generic_info_screen.json create mode 100644 src/main/resources/assets/skyblocker/tabhud/info/rift_info_screen.json create mode 100644 src/main/resources/assets/skyblocker/tabhud/readme.md create mode 100644 src/main/resources/assets/skyblocker/tabhud/test_screen.json (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index 461817ce..b6f11790 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -17,7 +17,7 @@ import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; import me.xmrvizzy.skyblocker.skyblock.quicknav.QuickNav; import me.xmrvizzy.skyblocker.skyblock.rift.TheRift; import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud; -import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.ScreenMaster; +import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.utils.*; import me.xmrvizzy.skyblocker.utils.title.TitleContainer; diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java index b3d78fa8..0acf5b31 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java @@ -6,11 +6,13 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import dev.architectury.event.events.common.TickEvent.Player; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud; +import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.ScreenBuilder; +import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster; import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen; -import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.ScreenBuilder; -import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.ScreenMaster; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -51,8 +53,10 @@ public class PlayerListHudMixin { w = (int) (w / scale); h = (int) (h / scale); + PlayerListMgr.updateFooter(footer); + try { - ScreenMaster.render(context, w,h,footer); + ScreenMaster.render(context, w,h); // Screen screen = Screen.getCorrect(w, h, footer); // screen.render(context); info.cancel(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java index 122f6c6c..8f8afb3a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java @@ -1,30 +1,29 @@ package me.xmrvizzy.skyblocker.skyblock.dwarven; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.CommsWidget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.HudCommsWidget; import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; - public class DwarvenHud { public static final MinecraftClient client = MinecraftClient.getInstance(); public static List commissionList = new ArrayList<>(); - public static final List COMMISSIONS = Stream.of( "(?:Titanium|Mithril|Hard Stone) Miner", "(?:Ice Walker|Goblin|Goblin Raid|Automaton|Sludge|Team Treasurite Member|Yog|Boss Corleone|Thyst) Slayer", @@ -40,6 +39,7 @@ public class DwarvenHud { "Chest Looter" ).map(s -> Pattern.compile("^.*(" + s + "): (\\d+\\.?\\d*%|DONE)")) .collect(Collectors.toList()); + public static void init() { ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("skyblocker") .then(ClientCommandManager.literal("hud") @@ -88,17 +88,17 @@ public class DwarvenHud { } public static void renderSimple(DrawContext context, int hudX, int hudY, List commissions) { - CommsWidget cw = new CommsWidget(commissions, false); - cw.setX(hudX); - cw.setY(hudY); - cw.render(context, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground); + HudCommsWidget.INSTANCE.updateData(commissions, false); + HudCommsWidget.INSTANCE.setX(hudX); + HudCommsWidget.INSTANCE.setY(hudY); + HudCommsWidget.INSTANCE.render(context, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground); } public static void renderFancy(DrawContext context, int hudX, int hudY, List commissions) { - CommsWidget cw = new CommsWidget(commissions, true); - cw.setX(hudX); - cw.setY(hudY); - cw.render(context, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground); + HudCommsWidget.INSTANCE.updateData(commissions, true); + HudCommsWidget.INSTANCE.setX(hudX); + HudCommsWidget.INSTANCE.setY(hudY); + HudCommsWidget.INSTANCE.render(context, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground); } public static void update() { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java new file mode 100644 index 00000000..1197ca2d --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java @@ -0,0 +1,166 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder; + +import java.io.BufferedReader; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.pipeline.AlignStage; +import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.pipeline.CollideStage; +import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.pipeline.PipelineStage; +import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.pipeline.PlaceStage; +import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.pipeline.StackStage; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.EmptyWidget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.EventWidget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.util.Identifier; + +public class ScreenBuilder { + + // layout pipeline + private ArrayList layoutPipeline = new ArrayList<>(); + + // all widget instances this builder knows + private ArrayList instances = new ArrayList<>(); + // maps alias -> widget instance + private HashMap objectMap = new HashMap<>(); + + /** + * Create a ScreenBuilder from a json. + */ + public ScreenBuilder(String jsonfile) throws IOException { + + Identifier ident = new Identifier(SkyblockerMod.NAMESPACE, "tabhud/" + jsonfile + ".json"); + BufferedReader reader = MinecraftClient.getInstance().getResourceManager().openAsReader(ident); + JsonObject json = JsonParser.parseReader(reader).getAsJsonObject(); + reader.close(); + + JsonArray widgets = json.getAsJsonArray("widgets"); + JsonArray layout = json.getAsJsonArray("layout"); + + for (JsonElement w : widgets) { + JsonObject widget = w.getAsJsonObject(); + String name = widget.get("name").getAsString(); + String alias = widget.get("alias").getAsString(); + + Widget wid = instanceFrom(name, widget); + objectMap.put(alias, wid); + instances.add(wid); + } + + for (JsonElement l : layout) { + layoutPipeline.add(createStage(l.getAsJsonObject())); + } + + } + + /** + * Try to find a class in the widget package that has the supplied name and + * call it's constructor. Manual work is required if the class has arguments. + */ + public Widget instanceFrom(String name, JsonObject widget) { + + // do widgets that require args the normal way + switch (name) { + case "EventWidget": + return new EventWidget(widget.get("inGarden").getAsBoolean()); + case "Widget": + // clown case sanity check. don't instantiate the superclass >:| + return new EmptyWidget(); + } + + // reflect something together for the "normal" ones. + // TODO don't get package list for every widget; do it once and cache. + // fine for now, as this would only shorten the load time anyways + + // find all packages that might contain widget classes + Package[] packs = Package.getPackages(); + + List packnames = Arrays.stream(packs) + .map(pack -> pack.getName()) + .filter(s -> s.startsWith("me.xmrvizzy.skyblocker.skyblock.tabhud.widget")) + .toList(); + + // construct the full class name and try to load. + Class clazz = null; + for (String pn : packnames) { + try { + clazz = Class.forName(pn + "." + name); + } catch (LinkageError | ClassNotFoundException ex) { + continue; + } + } + + // load failed. + if (clazz == null) { + return new EmptyWidget(); + } + + // return instance of that class. + try { + Constructor ctor = clazz.getConstructor(); + return (Widget) ctor.newInstance(); + } catch (NoSuchMethodException | InstantiationException | IllegalAccessException + | IllegalArgumentException | InvocationTargetException | SecurityException ex) { + return new EmptyWidget(); + } + } + + /** + * Create a PipelineStage from a json object. + */ + public PipelineStage createStage(JsonObject descr) { + + String op = descr.get("op").getAsString(); + + switch (op) { + case "place": + return new PlaceStage(this, descr); + case "stack": + return new StackStage(this, descr); + case "align": + return new AlignStage(this, descr); + case "collideAgainst": + return new CollideStage(this, descr); + } + return null; + } + + /** + * Lookup Widget instance from alias name + */ + public Widget getInstance(String name) { + return this.objectMap.get(name); + } + + /** + * Run the pipeline to build a Screen + */ + public void run(DrawContext context, int screenW, int screenH) { + // TODO for future: + // no need to update and run pipeline if PlayerListMgr wasn't updated. + + for (Widget w : instances) { + w.update(); + } + for (PipelineStage ps : layoutPipeline) { + ps.run(screenW, screenH); + } + for (Widget w : instances) { + w.render(context); + } + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java new file mode 100644 index 00000000..97969503 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java @@ -0,0 +1,82 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder; + +import java.io.BufferedReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map.Entry; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import me.xmrvizzy.skyblocker.SkyblockerMod; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.util.Identifier; + +public class ScreenMaster { + + private static final Identifier ASSIGNMENT_JSON = new Identifier(SkyblockerMod.NAMESPACE, "tabhud/assignment.json"); + private static final Logger LOGGER = LoggerFactory.getLogger("skyblocker"); + + private static HashMap standardMap = new HashMap<>(); + // private static HashMap screenAMap = new HashMap<>(); + // private static HashMap screenBMap = new HashMap<>(); + + static { + init(); + } + + /** + * Load the assignment json and construct the screen mapping + */ + public static void init() { + try (BufferedReader reader = MinecraftClient.getInstance().getResourceManager().openAsReader(ASSIGNMENT_JSON)) { + + JsonObject json = JsonParser.parseReader(reader).getAsJsonObject(); + JsonObject standard = json.getAsJsonObject("standard"); + for (Entry entry : standard.entrySet()) { + standardMap.put(entry.getKey(), new ScreenBuilder(entry.getValue().getAsString())); + } + + } catch (IOException ioex) { + LOGGER.info("[Skyblocker] Couldn't load tabhud config!"); + ioex.printStackTrace(); + } + } + + /** + * Top level render method. + * Calls the appropriate ScreenBuilder with the screen's dimensions + */ + public static void render(DrawContext context, int w, int h) { + standardMap.get("default").run(context, w, h); + } +} + +/* + * + * stackWidgetsH +stackWidgetsW +--> stack (direction?) horiz/vert (align?) center/top/bottom/left/right + +centerH +centerW +center +--> center (center/horiz/vert) +----> place (one) (where?) center/top/bot/left/right/[corners] + +offCenterL +offCenterR +--> offCenter left/right/top/bot +----> offsetPlace (where?) center/left/right/top/bot (offset to where?) left/right/top/bot + +----> align (any) (reference?) left, leftOfCenter, horizontalCenter, rightOfCenter, right, top, topOfCenter, verticalCenter, botOfCenter, bot + +collideAgainstL +collideAgainstR +--> collideAgainst (from where?) left/right/top/bot + */ \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/AlignStage.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/AlignStage.java new file mode 100644 index 00000000..87638c33 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/AlignStage.java @@ -0,0 +1,53 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.pipeline; + +import java.util.ArrayList; + +import com.google.gson.JsonObject; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.ScreenBuilder; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; + +public class AlignStage extends PipelineStage { + + private String reference; + + public AlignStage(ScreenBuilder builder, JsonObject descr) { + this.reference = descr.get("reference").getAsString(); + this.primary = new ArrayList(descr.getAsJsonArray("apply_to") + .asList() + .stream() + .map(x -> builder.getInstance(x.getAsString())) + .toList()); + } + + public void run(int screenW, int screenH) { + int wHalf, hHalf; + for (Widget wid : primary) { + switch (this.reference) { + case "horizontalCenter": + wid.setX((screenW - wid.getWidth()) / 2); + break; + case "verticalCenter": + wid.setY((screenH - wid.getHeight()) / 2); + break; + case "leftOfCenter": + wHalf = screenW / 2; + wid.setX(wHalf - 3 - wid.getWidth()); + break; + case "rightOfCenter": + wHalf = screenW / 2; + wid.setX(wHalf + 3); + break; + case "topOfCenter": + hHalf = screenH / 2; + wid.setY(hHalf - 3 - wid.getHeight()); + break; + case "botOfCenter": + hHalf = screenH / 2; + wid.setY(hHalf + 3); + break; + } + } + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CollideStage.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CollideStage.java new file mode 100644 index 00000000..8275e842 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CollideStage.java @@ -0,0 +1,84 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.pipeline; + +import java.util.ArrayList; + +import com.google.gson.JsonObject; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.ScreenBuilder; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; + +public class CollideStage extends PipelineStage { + + private String direction; + + public CollideStage(ScreenBuilder builder, JsonObject descr) { + this.direction = descr.get("direction").getAsString(); + this.primary = new ArrayList(descr.getAsJsonArray("widgets") + .asList() + .stream() + .map(x -> builder.getInstance(x.getAsString())) + .toList()); + this.secondary = new ArrayList(descr.getAsJsonArray("colliders") + .asList() + .stream() + .map(x -> builder.getInstance(x.getAsString())) + .toList()); + } + + public void run(int screenW, int screenH) { + if (this.direction.equals("left")) { + primary.forEach(w -> collideAgainstL(screenW, w)); + } else if (this.direction.equals("right")) { + primary.forEach(w -> collideAgainstR(screenW, w)); + } + } + + public void collideAgainstL(int screenW, Widget w) { + int yMin = w.getY(); + int yMax = w.getY() + w.getHeight(); + + int xCor = screenW / 2; + + // assume others to be sorted top-bottom. + for (Widget other : secondary) { + if (other.getY() + other.getHeight() + 5 < yMin) { + // too high, next one + continue; + } + + if (other.getY() - 5 > yMax) { + // too low, next + continue; + } + + int xPos = other.getX() - 5 - w.getWidth(); + xCor = Math.min(xCor, xPos); + } + w.setX(xCor); + } + + public void collideAgainstR(int screenW, Widget w) { + int yMin = w.getY(); + int yMax = w.getY() + w.getHeight(); + + int xCor = screenW / 2; + + // assume others to be sorted top-bottom. + for (Widget other : secondary) { + if (other.getY() + other.getHeight() + 5 < yMin) { + // too high, next one + continue; + } + + if (other.getY() - 5 > yMax) { + // too low, next + continue; + } + + int xPos = other.getX() + other.getWidth() + 5; + xCor = Math.max(xCor, xPos); + } + w.setX(xCor); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PipelineStage.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PipelineStage.java new file mode 100644 index 00000000..e560058c --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PipelineStage.java @@ -0,0 +1,14 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.pipeline; + +import java.util.ArrayList; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; + +public abstract class PipelineStage { + + protected ArrayList primary = null; + protected ArrayList secondary = null; + + public abstract void run(int screenW, int screenH); + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PlaceStage.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PlaceStage.java new file mode 100644 index 00000000..3ed89fda --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PlaceStage.java @@ -0,0 +1,31 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.pipeline; + +import java.util.ArrayList; + +import com.google.gson.JsonObject; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.ScreenBuilder; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; + +public class PlaceStage extends PipelineStage { + + private String where; + + public PlaceStage(ScreenBuilder builder, JsonObject descr) { + this.where = descr.get("where").getAsString(); + this.primary = new ArrayList(descr.getAsJsonArray("apply_to") + .asList() + .stream() + .map(x -> builder.getInstance(x.getAsString())) + .limit(1) + .toList()); + } + + public void run(int screenW, int screenH) { + Widget wid = primary.get(0); + if (where.equals("center")) { + wid.setY((screenH - wid.getHeight()) / 2); + wid.setX((screenW - wid.getWidth()) / 2); + } + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/StackStage.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/StackStage.java new file mode 100644 index 00000000..d144c67b --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/StackStage.java @@ -0,0 +1,74 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.pipeline; + +import java.util.ArrayList; + +import com.google.gson.JsonObject; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.ScreenBuilder; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; + +public class StackStage extends PipelineStage { + + private String direction; + private String align; + + public StackStage(ScreenBuilder builder, JsonObject descr) { + this.direction = descr.get("direction").getAsString(); + this.align = descr.get("align").getAsString(); + this.primary = new ArrayList(descr.getAsJsonArray("apply_to") + .asList() + .stream() + .map(x -> builder.getInstance(x.getAsString())) + .toList()); + } + + public void run(int screenW, int screenH) { + switch (this.direction) { + case "horizontal": + stackWidgetsHoriz(screenW); + break; + case "vertical": + stackWidgetsVert(screenH); + break; + } + } + + public void stackWidgetsVert( int screenH) { + int compHeight = -5; + for (Widget wid : primary) { + compHeight += wid.getHeight() + 5; + } + + int y = switch (this.align) { + + case "top" -> y = 5; + case "bot" -> y = (screenH-compHeight) - 5; + default -> y = (screenH-compHeight)/2; + }; + + for (Widget wid : primary) { + wid.setY(y); + y += wid.getHeight() + 5; + } + } + + public void stackWidgetsHoriz(int screenW) { + // TODO not centered + int compWidth = -5; + for (Widget wid : primary) { + compWidth += wid.getWidth() + 5; + } + + int x = switch (this.align) { + + case "left" -> x = 5; + case "right" -> x = (screenW-compWidth) - 5; + default -> x = (screenW-compWidth)/2; + }; + + for (Widget wid : primary) { + wid.setX(x); + x += wid.getWidth() + 5; + } + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PipelineStage.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PipelineStage.java deleted file mode 100644 index d33078d8..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PipelineStage.java +++ /dev/null @@ -1,14 +0,0 @@ -package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; - -import java.util.ArrayList; - -import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; - -public abstract class PipelineStage { - - protected ArrayList primary = null; - protected ArrayList secondary = null; - - public abstract void run(int screenW, int screenH); - -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PlaceStage.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PlaceStage.java deleted file mode 100644 index aba952a0..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PlaceStage.java +++ /dev/null @@ -1,29 +0,0 @@ -package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; - -import java.util.ArrayList; - -import com.google.gson.JsonObject; -import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; - -public class PlaceStage extends PipelineStage { - - private String where; - - public PlaceStage(ScreenBuilder builder, JsonObject descr) { - this.where = descr.get("where").getAsString(); - this.primary = new ArrayList(descr.getAsJsonArray("apply_to") - .asList() - .stream() - .map(x -> builder.getInstance(x.getAsString())) - .toList()); - } - - public void run(int screenW, int screenH) { - for (Widget wid : primary) { - if (where.equals("center")) { - wid.setY((screenH - wid.getHeight()) / 2); - wid.setX((screenW - wid.getWidth()) / 2); - } - } - } -} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ScreenBuilder.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ScreenBuilder.java deleted file mode 100644 index c9c4ad18..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ScreenBuilder.java +++ /dev/null @@ -1,94 +0,0 @@ -package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; - -import java.io.BufferedReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -import me.xmrvizzy.skyblocker.SkyblockerMod; -import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.EmptyWidget; -import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - -public class ScreenBuilder { - - private ArrayList layoutPipeline = new ArrayList<>(); - - private ArrayList instances = new ArrayList<>(); - private HashMap objectMap = new HashMap<>(); - - - public ScreenBuilder(String jsonfile) throws IOException { - - Identifier ident = new Identifier(SkyblockerMod.NAMESPACE, "tabhud/" + jsonfile + ".json"); - BufferedReader reader = MinecraftClient.getInstance().getResourceManager().openAsReader(ident); - JsonObject json = JsonParser.parseReader(reader).getAsJsonObject(); - reader.close(); - - JsonArray widgets = json.getAsJsonArray("widgets"); - JsonArray layout = json.getAsJsonArray("layout"); - - for (JsonElement w : widgets) { - JsonObject widget = w.getAsJsonObject(); - String name = widget.get("name").getAsString(); - String alias = widget.get("alias").getAsString(); - - JsonElement args = widget.get("args"); - JsonObject argsObj = (args == null) ? null : args.getAsJsonObject(); - - Widget wid = instanceFrom(name, argsObj); - objectMap.put(alias, wid); - instances.add(wid); - } - - for (JsonElement l : layout) { - layoutPipeline.add(createStage(l.getAsJsonObject())); - } - - } - - public Widget instanceFrom(String name, JsonObject args) { - return switch (name) { - case "EmptyWidget" -> new EmptyWidget(); - default -> new EmptyWidget(); - }; - } - - public PipelineStage createStage(JsonObject descr) { - - String op = descr.get("op").getAsString(); - - switch (op) { - case "place": - return new PlaceStage(this, descr); - } - return null; - } - - public Widget getInstance(String name) { - return this.objectMap.get(name); - } - - public void run(DrawContext context, int screenW, int screenH, Text footer) { - - for (Widget w : instances) { - w.update(); - } - for (PipelineStage ps : layoutPipeline) { - ps.run(screenW, screenH); - } - for (Widget w : instances) { - w.render(context); - } - } - -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ScreenMaster.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ScreenMaster.java deleted file mode 100644 index 02b595d1..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ScreenMaster.java +++ /dev/null @@ -1,76 +0,0 @@ -package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; - -import java.io.BufferedReader; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map.Entry; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -import me.xmrvizzy.skyblocker.SkyblockerMod; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - -public class ScreenMaster { - - private static final Identifier ASSIGNMENT_JSON = new Identifier(SkyblockerMod.NAMESPACE, "tabhud/assignment.json"); - private static final Logger LOGGER = LoggerFactory.getLogger("skyblocker"); - - private static HashMap screenAMap = new HashMap<>(); - // private static HashMap screenBMap = new HashMap<>(); - // private static HashMap screenCMap = new HashMap<>(); - - static { - init(); - } - - public static void init() { - try (BufferedReader reader = MinecraftClient.getInstance().getResourceManager().openAsReader(ASSIGNMENT_JSON)) { - - JsonObject json = JsonParser.parseReader(reader).getAsJsonObject(); - JsonObject screenA = json.getAsJsonObject("screenA"); - for (Entry entry : screenA.entrySet()) { - screenAMap.put(entry.getKey(), new ScreenBuilder(entry.getValue().getAsString())); - } - - } catch (IOException ioex) { - LOGGER.info("[Skyblocker] Couldn't load tabhud config!"); - ioex.printStackTrace(); - } - } - - public static void render(DrawContext context, int w, int h, Text footer) { - screenAMap.get("default").run(context, w, h, footer); - } -} - -/* - * - * stackWidgetsH -stackWidgetsW ---> stack (direction?) horiz/vert (align?) center/top/bottom/left/right - -centerH -centerW -center ---> center (center/horiz/vert) -----> place (one) (where?) center/top/bot/left/right/[corners] - -offCenterL -offCenterR ---> offCenter left/right/top/bot -----> offsetPlace (where?) center/left/right/top/bot (offset to where?) left/right/top/bot - -----> align (any) (reference?) left, leftOfCenter, horizontalCenter, rightOfCenter, right, top, topOfCenter, verticalCenter, botOfCenter, bot - -collideAgainstL -collideAgainstR ---> collideAgainst (from where?) left/right/top/bot - */ \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GardenInfoScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GardenInfoScreen.java index 0bb12c8e..587c2274 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GardenInfoScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GardenInfoScreen.java @@ -20,32 +20,32 @@ public class GardenInfoScreen extends Screen { String f = footer.getString(); - GardenSkillsWidget gsw = new GardenSkillsWidget(); - EventWidget evw = new EventWidget(true); - UpgradeWidget uw = new UpgradeWidget(f); + // GardenSkillsWidget gsw = new GardenSkillsWidget(); + // EventWidget evw = new EventWidget(true); + // // UpgradeWidget uw = new UpgradeWidget(f); - ProfileWidget pw = new ProfileWidget(); - EffectWidget efw = new EffectWidget(f); + // ProfileWidget pw = new ProfileWidget(); + // EffectWidget efw = new EffectWidget(f); - JacobsContestWidget jcw = new JacobsContestWidget(); - CookieWidget cw = new CookieWidget(f); + // JacobsContestWi