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/main') 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); + // JacobsContestWidget jcw = new JacobsContestWidget(); + // CookieWidget cw = new CookieWidget(f); - // layout code incoming - this.stackWidgetsH(gsw, evw, uw); - this.stackWidgetsH(pw, efw); - this.stackWidgetsH(jcw, cw); + // // layout code incoming + // this.stackWidgetsH(gsw, evw, uw); + // this.stackWidgetsH(pw, efw); + // this.stackWidgetsH(jcw, cw); - this.centerW(gsw); - this.centerW(evw); - this.centerW(uw); + // this.centerW(gsw); + // this.centerW(evw); + // this.centerW(uw); - this.collideAgainstL(pw, gsw, evw, uw); - this.collideAgainstL(efw, gsw, evw, uw); + // this.collideAgainstL(pw, gsw, evw, uw); + // this.collideAgainstL(efw, gsw, evw, uw); - this.collideAgainstR(jcw, gsw, evw, uw); - this.collideAgainstR(cw, gsw, evw, uw); + // this.collideAgainstR(jcw, gsw, evw, uw); + // this.collideAgainstR(cw, gsw, evw, uw); - this.addWidgets(gsw, evw, uw, pw, efw, jcw, cw); + // this.addWidgets(gsw, evw, uw, pw, efw, jcw, cw); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericInfoScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericInfoScreen.java index 046a9313..15c3b0e5 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericInfoScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericInfoScreen.java @@ -16,33 +16,33 @@ public class GenericInfoScreen extends Screen { public GenericInfoScreen(int w, int h, Text footer) { super(w, h); - String f = footer.getString(); + // String f = footer.getString(); - SkillsWidget sw = new SkillsWidget(); - EventWidget evw = new EventWidget(false); - UpgradeWidget uw = new UpgradeWidget(f); + // SkillsWidget sw = new SkillsWidget(); + // EventWidget evw = new EventWidget(false); + // UpgradeWidget uw = new UpgradeWidget(f); - ProfileWidget pw = new ProfileWidget(); - EffectWidget efw = new EffectWidget(f); + // ProfileWidget pw = new ProfileWidget(); + // EffectWidget efw = new EffectWidget(f); - ElectionWidget elw = new ElectionWidget(); - CookieWidget cw = new CookieWidget(f); + // ElectionWidget elw = new ElectionWidget(); + // CookieWidget cw = new CookieWidget(f); - this.stackWidgetsH(sw, evw, uw); - this.stackWidgetsH(pw, efw); - this.stackWidgetsH(elw, cw); + // this.stackWidgetsH(sw, evw, uw); + // this.stackWidgetsH(pw, efw); + // this.stackWidgetsH(elw, cw); - this.centerW(sw); - this.centerW(evw); - this.centerW(uw); + // this.centerW(sw); + // this.centerW(evw); + // this.centerW(uw); - this.collideAgainstL(pw, sw, evw, uw); - this.collideAgainstL(efw, sw, evw, uw); + // this.collideAgainstL(pw, sw, evw, uw); + // this.collideAgainstL(efw, sw, evw, uw); - this.collideAgainstR(elw, sw, evw, uw); - this.collideAgainstR(cw, sw, evw, uw); + // this.collideAgainstR(elw, sw, evw, uw); + // this.collideAgainstR(cw, sw, evw, uw); - this.addWidgets(sw, evw, uw, pw, efw, elw, cw); + // this.addWidgets(sw, evw, uw, pw, efw, elw, cw); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericRiftInfoScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericRiftInfoScreen.java index 9821b5a3..cf6ee77a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericRiftInfoScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericRiftInfoScreen.java @@ -13,26 +13,26 @@ public class GenericRiftInfoScreen extends Screen { public GenericRiftInfoScreen(int w, int h, Text footer) { super(w, h); - String f = footer.getString(); + // String f = footer.getString(); - RiftProfileWidget profile = new RiftProfileWidget(); - RiftStatsWidget stats = new RiftStatsWidget(); - ShenWidget shen = new ShenWidget(); + // RiftProfileWidget profile = new RiftProfileWidget(); + // RiftStatsWidget stats = new RiftStatsWidget(); + // ShenWidget shen = new ShenWidget(); - CookieWidget cookie = new CookieWidget(f); - AdvertisementWidget advertisement = new AdvertisementWidget(); + // // CookieWidget cookie = new CookieWidget(f); + // AdvertisementWidget advertisement = new AdvertisementWidget(); - this.stackWidgetsH(stats, advertisement); - this.stackWidgetsH(profile, shen, cookie); + // this.stackWidgetsH(stats, advertisement); + // // this.stackWidgetsH(profile, shen, cookie); - this.offCenterL(stats); - this.offCenterL(advertisement); + // this.offCenterL(stats); + // this.offCenterL(advertisement); - this.offCenterR(profile); - this.offCenterR(shen); - this.offCenterR(cookie); + // this.offCenterR(profile); + // this.offCenterR(shen); + // // this.offCenterR(cookie); - this.addWidgets(profile, stats, shen, cookie, advertisement); + // // this.addWidgets(profile, stats, shen, cookie, advertisement); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerListMgr.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerListMgr.java index ee4319dc..7895b77b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerListMgr.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerListMgr.java @@ -27,6 +27,7 @@ public class PlayerListMgr { public static final Logger LOGGER = LoggerFactory.getLogger("Skyblocker Regex"); private static List playerList; + private static String footer; public static void updateList() { @@ -42,6 +43,14 @@ public class PlayerListMgr { } } + public static void updateFooter(Text f) { + footer = f.getString(); + } + + public static String getFooter() { + return footer; + } + /** * Get the display name at some index of the player list and apply a pattern to * it diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CommsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CommsWidget.java index de90cf30..1cfa0cb2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CommsWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CommsWidget.java @@ -31,7 +31,10 @@ public class CommsWidget extends Widget { public CommsWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); + } + @Override + public void updateContent() { for (int i = 50; i <= 53; i++) { Matcher m = PlayerListMgr.regexAt(i, COMM_PATTERN); // end of comms found? @@ -55,33 +58,6 @@ public class CommsWidget extends Widget { } this.addComponent(pc); } - this.pack(); - } - - // for the dwarven hud - public CommsWidget(List commissions, boolean isFancy) { - super(TITLE, Formatting.AQUA.getColorValue()); - for (Commission comm : commissions) { - - Text c = Text.literal(comm.commission()); - - float p = 100f; - if (!comm.progression().contains("DONE")) { - p = Float.parseFloat(comm.progression().substring(0, comm.progression().length() - 1)); - } - - Component comp; - if (isFancy) { - comp = new ProgressComponent(Ico.BOOK, c, p, pcntToCol(p)); - } else { - comp = new PlainTextComponent( - Text.literal(comm.commission() + ": ") - .append(Text.literal(comm.progression()).formatted(Formatting.GREEN))); - } - this.addComponent(comp); - } - this.pack(); - } private int pcntToCol(float pcnt) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ComposterWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ComposterWidget.java index 5922fcbc..1307b407 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ComposterWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ComposterWidget.java @@ -16,13 +16,15 @@ public class ComposterWidget extends Widget { public ComposterWidget() { super(TITLE, Formatting.GREEN.getColorValue()); + } + @Override + public void updateContent() { this.addSimpleIcoText(Ico.SAPLING, "Organic Matter:", Formatting.YELLOW, 48); this.addSimpleIcoText(Ico.FURNACE, "Fuel:", Formatting.BLUE, 49); this.addSimpleIcoText(Ico.CLOCK, "Time Left:", Formatting.RED, 50); this.addSimpleIcoText(Ico.COMPOSTER, "Stored Compost:", Formatting.DARK_GREEN, 51); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CookieWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CookieWidget.java index 48cb90bd..bf1d086f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CookieWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CookieWidget.java @@ -4,6 +4,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; import net.minecraft.text.MutableText; import net.minecraft.text.Text; @@ -19,19 +20,21 @@ public class CookieWidget extends Widget { private static final Pattern COOKIE_PATTERN = Pattern.compile(".*\\nCookie Buff\\n(?.*)\\n"); - public CookieWidget(String footertext) { + public CookieWidget() { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + } + @Override + public void updateContent() { + String footertext = PlayerListMgr.getFooter(); if (footertext == null || !footertext.contains("Cookie Buff")) { this.addComponent(new IcoTextComponent()); - this.pack(); return; } Matcher m = COOKIE_PATTERN.matcher(footertext); if (!m.find() || m.group("buff") == null) { this.addComponent(new IcoTextComponent()); - this.pack(); return; } @@ -42,7 +45,6 @@ public class CookieWidget extends Widget { Text cookie = Text.literal("Time Left: ").append(buff); this.addComponent(new IcoTextComponent(Ico.COOKIE, cookie)); } - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonBuffWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonBuffWidget.java index d56d3522..5b880514 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonBuffWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonBuffWidget.java @@ -1,5 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; import net.minecraft.text.MutableText; import net.minecraft.text.Text; @@ -18,10 +19,15 @@ public class DungeonBuffWidget extends Widget { public DungeonBuffWidget(String footertext) { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + } + + @Override + public void updateContent() { + + String footertext = PlayerListMgr.getFooter(); if (footertext == null || !footertext.contains("Dungeon Buffs")) { this.addComponent(new PlainTextComponent(Text.literal("No data").formatted(Formatting.GRAY))); - this.pack(); return; } @@ -30,7 +36,6 @@ public class DungeonBuffWidget extends Widget { if (!lines[1].startsWith("Blessing")) { this.addComponent(new PlainTextComponent(Text.literal("No buffs found!").formatted(Formatting.GRAY))); - this.pack(); return; } @@ -48,7 +53,6 @@ public class DungeonBuffWidget extends Widget { this.addComponent(new PlainTextComponent(Text.literal(line).styled(style -> style.withColor(color)))); } - this.pack(); } @SuppressWarnings("DataFlowIssue") diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonDeathWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonDeathWidget.java index 78e1aeae..6cdf946a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonDeathWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonDeathWidget.java @@ -24,7 +24,10 @@ public class DungeonDeathWidget extends Widget { public DungeonDeathWidget() { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + } + @Override + public void updateContent() { Matcher m = PlayerListMgr.regexAt(25, DEATH_PATTERN); if (m == null) { this.addComponent(new IcoTextComponent()); @@ -39,7 +42,6 @@ public class DungeonDeathWidget extends Widget { this.addSimpleIcoText(Ico.POTION, "Healing Done:", Formatting.RED, 27); this.addSimpleIcoText(Ico.NTAG, "Milestone:", Formatting.YELLOW, 28); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonDownedWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonDownedWidget.java index 9bb250f7..2ca617ee 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonDownedWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonDownedWidget.java @@ -17,7 +17,10 @@ public class DungeonDownedWidget extends Widget { public DungeonDownedWidget() { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + } + @Override + public void updateContent() { String down = PlayerListMgr.strAt(21); if (down == null) { this.addComponent(new IcoTextComponent()); @@ -36,7 +39,6 @@ public class DungeonDownedWidget extends Widget { this.addSimpleIcoText(Ico.CLOCK, "Time:", Formatting.GRAY, 22); this.addSimpleIcoText(Ico.POTION, "Revive:", Formatting.GRAY, 23); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonPlayerWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonPlayerWidget.java index 443cca55..e565bd8f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonPlayerWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonPlayerWidget.java @@ -45,10 +45,16 @@ public class DungeonPlayerWidget extends Widget { MSGS.add("More is better!"); } + private int player; + // title needs to be changeable here public DungeonPlayerWidget(int player) { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + this.player = player; + } + @Override + public void updateContent() { int start = 1 + (player - 1) * 4; if (PlayerListMgr.strAt(start) == null) { @@ -56,7 +62,6 @@ public class DungeonPlayerWidget extends Widget { IcoTextComponent noplayer = new IcoTextComponent(Ico.SIGN, Text.literal(MSGS.get(idx)).formatted(Formatting.GRAY)); this.addComponent(noplayer); - this.pack(); return; } Matcher m = PlayerListMgr.regexAt(start, PLAYER_PATTERN); @@ -94,6 +99,5 @@ public class DungeonPlayerWidget extends Widget { this.addSimpleIcoText(Ico.CLOCK, "Ult Cooldown:", Formatting.GOLD, start + 1); this.addSimpleIcoText(Ico.POTION, "Revives:", Formatting.DARK_PURPLE, start + 2); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonPuzzleWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonPuzzleWidget.java index 2529e876..ef765fc3 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonPuzzleWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonPuzzleWidget.java @@ -26,7 +26,10 @@ public class DungeonPuzzleWidget extends Widget { public DungeonPuzzleWidget() { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + } + @Override + public void updateContent() { int pos = 48; while (pos < 60) { @@ -49,7 +52,6 @@ public class DungeonPuzzleWidget extends Widget { this.addComponent( new IcoTextComponent(Ico.BARRIER, Text.literal("No puzzles!").formatted(Formatting.GRAY))); } - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java index 93eb69de..a985b4b1 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java @@ -14,11 +14,13 @@ public class DungeonSecretWidget extends Widget { public DungeonSecretWidget() { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + } + @Override + public void updateContent() { this.addSimpleIcoText(Ico.CHEST, "Secrets:", Formatting.YELLOW, 31); this.addSimpleIcoText(Ico.SKULL, "Crypts:", Formatting.YELLOW, 32); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonServerWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonServerWidget.java index 81b8f907..05b88127 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonServerWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonServerWidget.java @@ -24,7 +24,10 @@ public class DungeonServerWidget extends Widget { public DungeonServerWidget() { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + } + @Override + public void updateContent() { this.addSimpleIcoText(Ico.NTAG, "Name:", Formatting.AQUA, 41); this.addSimpleIcoText(Ico.SIGN, "Rooms Visited:", Formatting.DARK_PURPLE, 42); this.addSimpleIcoText(Ico.SIGN, "Rooms Completed:", Formatting.LIGHT_PURPLE, 43); @@ -40,8 +43,6 @@ public class DungeonServerWidget extends Widget { } this.addSimpleIcoText(Ico.CLOCK, "Time:", Formatting.GOLD, 45); - - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EffectWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EffectWidget.java index cd39a25a..718ea2d3 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EffectWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EffectWidget.java @@ -1,6 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoFatTextComponent; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; import net.minecraft.text.MutableText; @@ -16,12 +17,17 @@ public class EffectWidget extends Widget { private static final MutableText TITLE = Text.literal("Effect Info").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); - public EffectWidget(String footertext) { + public EffectWidget() { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + } + + @Override + public void updateContent() { + + String footertext = PlayerListMgr.getFooter(); if (footertext == null || !footertext.contains("Active Effects")) { this.addComponent(new IcoTextComponent()); - this.pack(); return; } @@ -29,7 +35,6 @@ public class EffectWidget extends Widget { String[] lines = footertext.split("Active Effects")[1].split("\n"); if (lines.length < 2) { this.addComponent(new IcoTextComponent()); - this.pack(); return; } @@ -47,7 +52,6 @@ public class EffectWidget extends Widget { int idx = number.indexOf(' '); if (idx == -1 || lines.length < 4) { this.addComponent(new IcoFatTextComponent()); - this.pack(); return; } number = number.substring(0, idx); @@ -58,7 +62,6 @@ public class EffectWidget extends Widget { Text.literal(lines[3]).formatted(Formatting.AQUA)); this.addComponent(iftc); } - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ElectionWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ElectionWidget.java index ed07982c..0f858fb6 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ElectionWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ElectionWidget.java @@ -48,14 +48,16 @@ public class ElectionWidget extends Widget { public ElectionWidget() { super(TITLE, Formatting.YELLOW.getColorValue()); + } + @Override + public void updateContent() { String status = PlayerListMgr.strAt(76); if (status == null) { this.addComponent(new IcoTextComponent()); this.addComponent(new IcoTextComponent()); this.addComponent(new IcoTextComponent()); this.addComponent(new IcoTextComponent()); - this.pack(); return; } @@ -97,7 +99,6 @@ public class ElectionWidget extends Widget { } } } - this.pack(); } } 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 61da439a..0e85003f 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 @@ -17,12 +17,10 @@ public class EmptyWidget extends Widget { } @Override - public void update() { - super.update(); + public void updateContent() { Text info = Text.of("No info for this area!"); PlainTextComponent inf = new PlainTextComponent(info); this.addComponent(inf); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EssenceWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EssenceWidget.java index fc0780e1..c503d89f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EssenceWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EssenceWidget.java @@ -19,6 +19,10 @@ public class EssenceWidget extends Widget { public EssenceWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); + } + + @Override + public void updateContent() { wither = Widget.simpleEntryText(46, "Wither:", Formatting.DARK_PURPLE); spider = Widget.simpleEntryText(47, "Spider:", Formatting.DARK_PURPLE); undead = Widget.simpleEntryText(48, "Undead:", Formatting.DARK_PURPLE); @@ -39,6 +43,5 @@ public class EssenceWidget extends Widget { tc.addToCell(1, 2, new IcoTextComponent(Ico.ICE, ice)); tc.addToCell(1, 3, new IcoTextComponent(Ico.REDSTONE, crimson)); this.addComponent(tc); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EventWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EventWidget.java index 1b46e621..b3563f1b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EventWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EventWidget.java @@ -11,9 +11,15 @@ import net.minecraft.util.Formatting; public class EventWidget extends Widget { private static final MutableText TITLE = Text.literal("Event Info").formatted(Formatting.YELLOW, Formatting.BOLD); + private boolean isInGarden; + public EventWidget(boolean isInGarden) { super(TITLE, Formatting.YELLOW.getColorValue()); + this.isInGarden = isInGarden; + } + @Override + public void updateContent() { // hypixel devs carefully inserting the most random edge cases #317: // the event info is placed a bit differently when in the garden. int offset = (isInGarden) ? -1 : 0; @@ -24,7 +30,6 @@ public class EventWidget extends Widget { Text time = Widget.plainEntryText(74 + offset); IcoTextComponent t = new IcoTextComponent(Ico.CLOCK, time); this.addComponent(t); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java index ddf51f32..ba6a0ec1 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java @@ -29,18 +29,19 @@ public class FireSaleWidget extends Widget { public FireSaleWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); + } + @Override + public void updateContent() { String event = PlayerListMgr.strAt(46); if (event == null) { this.addComponent(new PlainTextComponent(Text.literal("No Fire Sale!").formatted(Formatting.GRAY))); - this.pack(); return; } if (event.contains("Starts In")) { this.addSimpleIcoText(Ico.CLOCK, "Starts in:", Formatting.DARK_AQUA, 46); - this.pack(); return; } @@ -57,7 +58,6 @@ public class FireSaleWidget extends Widget { ProgressComponent pc = new ProgressComponent(Ico.GOLD, itemTxt, prgressTxt, pcnt, pcntToCol(pcnt)); this.addComponent(pc); } - this.pack(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ForgeWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ForgeWidget.java index da1ba6c5..96b85fef 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ForgeWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ForgeWidget.java @@ -20,12 +20,15 @@ public class ForgeWidget extends Widget { public ForgeWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); + } + + @Override + public void updateContent() { int forgestart = 54; // why is it forges and not looms >:( String pos = PlayerListMgr.strAt(53); if (pos == null) { this.addComponent(new IcoTextComponent()); - this.pack(); return; } @@ -73,7 +76,6 @@ public class ForgeWidget extends Widget { } this.addComponent(c); } - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GardenServerWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GardenServerWidget.java index b0fc160f..2fd81873 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GardenServerWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GardenServerWidget.java @@ -24,7 +24,10 @@ public class GardenServerWidget extends Widget { public GardenServerWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); + } + @Override + public void updateContent() { this.addSimpleIcoText(Ico.MAP, "Area:", Formatting.DARK_AQUA, 41); this.addSimpleIcoText(Ico.NTAG, "Server ID:", Formatting.GRAY, 42); this.addSimpleIcoText(Ico.EMERALD, "Gems:", Formatting.GREEN, 43); @@ -33,7 +36,6 @@ public class GardenServerWidget extends Widget { Matcher m = PlayerListMgr.regexAt(45, VISITOR_PATTERN); if (m == null ) { this.addComponent(new IcoTextComponent()); - this.pack(); return; } @@ -47,7 +49,6 @@ public class GardenServerWidget extends Widget { Text visitor = Widget.simpleEntryText(vis, "Next Visitor: ", col); IcoTextComponent v = new IcoTextComponent(Ico.PLAYER, visitor); this.addComponent(v); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GardenSkillsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GardenSkillsWidget.java index 26e29ce2..2b928cba 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GardenSkillsWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GardenSkillsWidget.java @@ -30,7 +30,10 @@ public class GardenSkillsWidget extends Widget { public GardenSkillsWidget() { super(TITLE, Formatting.YELLOW.getColorValue()); + } + @Override + public void updateContent() { ProgressComponent pc; Matcher m = PlayerListMgr.regexAt(66, SKILL_PATTERN); if (m == null) { @@ -72,7 +75,6 @@ public class GardenSkillsWidget extends Widget { } this.addComponent(pc2); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java index cb208e92..6f1f4811 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java @@ -16,13 +16,15 @@ public class GuestServerWidget extends Widget { public GuestServerWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); + } + @Override + public void updateContent() { this.addSimpleIcoText(Ico.MAP, "Area:", Formatting.DARK_AQUA, 41); this.addSimpleIcoText(Ico.NTAG, "Server ID:", Formatting.GRAY, 42); this.addSimpleIcoText(Ico.SIGN, "Owner:", Formatting.GREEN, 43); this.addSimpleIcoText(Ico.SIGN, "Status:", Formatting.BLUE, 44); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/HudCommsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/HudCommsWidget.java new file mode 100644 index 00000000..4ba4b0aa --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/HudCommsWidget.java @@ -0,0 +1,75 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHud.Commission; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.Component; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.ProgressComponent; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.math.MathHelper; + +// this widget shows the status of the king's commissions. +// (dwarven mines and crystal hollows) +// USE ONLY WITH THE DWARVEN HUD! + +public class HudCommsWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Commissions").formatted(Formatting.DARK_AQUA, + Formatting.BOLD); + + private List commissions; + private boolean isFancy; + + // disgusting hack to get around text renderer issues. + // the ctor eventually tries to get the font's height, which doesn't work + // when called before the client window is created (roughly). + // the rebdering god 2 from the fabricord explained that detail, thanks! + public static HudCommsWidget INSTANCE = new HudCommsWidget(); + + // another repulsive hack to make this widget-like hud element work with the new widget class + // DON'T USE WITH THE WIDGET SYSTEM, ONLY USE FOR DWARVENHUD! + public HudCommsWidget() { + super(TITLE, Formatting.DARK_AQUA.getColorValue()); + } + + public void updateData(List commissions, boolean isFancy) { + this.commissions = commissions; + this.isFancy = isFancy; + } + + @Override + public void updateContent() { + for (Commission comm : commissions) { + + Text c = Text.literal(comm.commission()); + + float p = 100f; + if (!comm.progression().contains("DONE")) { + p = Float.parseFloat(comm.progression().substring(0, comm.progression().length() - 1)); + } + + Component comp; + if (isFancy) { + comp = new ProgressComponent(Ico.BOOK, c, p, pcntToCol(p)); + } else { + comp = new PlainTextComponent( + Text.literal(comm.commission() + ": ") + .append(Text.literal(comm.progression()).formatted(Formatting.GREEN))); + } + this.addComponent(comp); + } + } + + private int pcntToCol(float pcnt) { + return MathHelper.hsvToRgb(pcnt / 300f, 0.9f, 0.9f); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandGuestsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandGuestsWidget.java index e0f5f1a3..faf231a8 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandGuestsWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandGuestsWidget.java @@ -23,6 +23,10 @@ public class IslandGuestsWidget extends Widget { public IslandGuestsWidget() { super(TITLE, Formatting.AQUA.getColorValue()); + } + + @Override + public void updateContent() { for (int i = 21; i < 40; i++) { String str = PlayerListMgr.strAt(i); if (str == null) { @@ -38,7 +42,6 @@ public class IslandGuestsWidget extends Widget { this.addComponent(new PlainTextComponent(Text.of(m.group(1)))); } } - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandOwnersWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandOwnersWidget.java index e81a6d85..a978654f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandOwnersWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandOwnersWidget.java @@ -26,6 +26,11 @@ public class IslandOwnersWidget extends Widget { public IslandOwnersWidget() { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + } + + @Override + public void updateContent() { + for (int i = 1; i < 20; i++) { Matcher m = PlayerListMgr.regexAt(i, OWNER_PATTERN); if (m == null) { @@ -55,7 +60,7 @@ public class IslandOwnersWidget extends Widget { PlainTextComponent ptc = new PlainTextComponent(entry); this.addComponent(ptc); } - this.pack(); + } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandSelfWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandSelfWidget.java index 4b03da6e..cc7a2f0c 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandSelfWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandSelfWidget.java @@ -20,20 +20,24 @@ public class IslandSelfWidget extends Widget { // matches an owner // group 1: player name, optionally offline time // ^\[\d*\] (?:\[[A-Za-z]+\] )?([A-Za-z0-9_() ]*)(?: .*)?$|^(.*)$ - private static final Pattern OWNER_PATTERN = Pattern.compile("^\\[\\d*\\] (?:\\[[A-Za-z]+\\] )?([A-Za-z0-9_() ]*)(?: .*)?$|^(.*)$"); + private static final Pattern OWNER_PATTERN = Pattern + .compile("^\\[\\d*\\] (?:\\[[A-Za-z]+\\] )?([A-Za-z0-9_() ]*)(?: .*)?$|^(.*)$"); public IslandSelfWidget() { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + } + + @Override + public void updateContent() { for (int i = 1; i < 20; i++) { - Matcher m = PlayerListMgr.regexAt( i, OWNER_PATTERN); + Matcher m = PlayerListMgr.regexAt(i, OWNER_PATTERN); if (m == null) { break; } - + Text entry = (m.group(1) != null) ? Text.of(m.group(1)) : Text.of(m.group(2)); this.addComponent(new PlainTextComponent(entry)); } - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandServerWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandServerWidget.java index 2b02c514..1ed15f5e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandServerWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandServerWidget.java @@ -16,14 +16,16 @@ public class IslandServerWidget extends Widget { public IslandServerWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); + } + @Override + public void updateContent() { this.addSimpleIcoText(Ico.MAP, "Area:", Formatting.DARK_AQUA, 41); this.addSimpleIcoText(Ico.NTAG, "Server ID:", Formatting.GRAY, 42); this.addSimpleIcoText(Ico.EMERALD, "Crystals:", Formatting.DARK_PURPLE, 43); this.addSimpleIcoText(Ico.CHEST, "Stash:", Formatting.GREEN, 44); this.addSimpleIcoText(Ico.COMMAND, "Minions:", Formatting.BLUE, 45); - this.pack(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/JacobsContestWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/JacobsContestWidget.java index 8d49efaa..888c3697 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/JacobsContestWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/JacobsContestWidget.java @@ -37,7 +37,10 @@ public class JacobsContestWidget extends Widget { public JacobsContestWidget() { super(TITLE, Formatting.YELLOW.getColorValue()); + } + @Override + public void updateContent() { this.addSimpleIcoText(Ico.CLOCK, "Starts in:", Formatting.GOLD, 76); TableComponent tc = new TableComponent(1, 3, Formatting.YELLOW .getColorValue()); @@ -54,7 +57,6 @@ public class JacobsContestWidget extends Widget { } this.addComponent(tc); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/MinionWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/MinionWidget.java index fe52fcdf..039871b2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/MinionWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/MinionWidget.java @@ -93,7 +93,10 @@ public class MinionWidget extends Widget { public MinionWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); + } + @Override + public void updateContent() { for (int i = 48; i < 59; i++) { Matcher m = PlayerListMgr.regexAt(i, MINION_PATTERN); if (m != null) { @@ -128,7 +131,6 @@ public class MinionWidget extends Widget { if (more != null) { this.addComponent(new PlainTextComponent(Text.of(more))); } - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ParkServerWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ParkServerWidget.java index 4148ed77..2c422bd1 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ParkServerWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ParkServerWidget.java @@ -16,13 +16,15 @@ public class ParkServerWidget extends Widget { public ParkServerWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); + } + @Override + public void updateContent() { this.addSimpleIcoText(Ico.MAP, "Area:", Formatting.DARK_AQUA, 41); this.addSimpleIcoText(Ico.NTAG, "Server ID:", Formatting.GRAY, 42); this.addSimpleIcoText(Ico.EMERALD, "Gems:", Formatting.GREEN, 43); this.addSimpleIcoText(Ico.WATER, "Rain:", Formatting.BLUE, 44); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java index 439fcb56..04327365 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java @@ -26,6 +26,10 @@ public class PlayerListWidget extends Widget { public PlayerListWidget() { super(TITLE, Formatting.GREEN.getColorValue()); + } + + @Override + public void updateContent() { // hard cap to 4x20 entries. // 5x20 is too wide (and not possible in theory. in reality however...) int listlen = Math.min(PlayerListMgr.getSize(), 160); @@ -33,7 +37,6 @@ public class PlayerListWidget extends Widget { // list isn't fully loaded, so our hack won't work... if (listlen < 80) { this.addComponent(new PlainTextComponent(Text.literal("List loading...").formatted(Formatting.GRAY))); - this.pack(); return; } @@ -63,6 +66,5 @@ public class PlayerListWidget extends Widget { } this.addComponent(tc); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PowderWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PowderWidget.java index 459e3de2..7e56d4d9 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PowderWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PowderWidget.java @@ -17,12 +17,13 @@ public class PowderWidget extends Widget { public PowderWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); + } + @Override + public void updateContent() { this.addSimpleIcoText(Ico.MITHRIL, "Mithril:", Formatting.AQUA, 46); this.addSimpleIcoText(Ico.EMERALD, "Gemstone:", Formatting.DARK_PURPLE, 47); - this.pack(); - } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ProfileWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ProfileWidget.java index a6d9e82d..8bc94622 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ProfileWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ProfileWidget.java @@ -14,12 +14,15 @@ public class ProfileWidget extends Widget { public ProfileWidget() { super(TITLE, Formatting.YELLOW.getColorValue()); + } + + @Override + public void updateContent() { this.addSimpleIcoText(Ico.SIGN, "Profile:", Formatting.GREEN, 61); this.addSimpleIcoText(Ico.BONE, "Pet Sitter:", Formatting.AQUA, 62); this.addSimpleIcoText(Ico.EMERALD, "Balance:", Formatting.GOLD, 63); this.addSimpleIcoText(Ico.CLOCK, "Interest in:", Formatting.GOLD, 64); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/QuestWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/QuestWidget.java index 43b741ba..02137b1a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/QuestWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/QuestWidget.java @@ -18,12 +18,15 @@ public class QuestWidget extends Widget { public QuestWidget() { super(TITLE, Formatting.AQUA.getColorValue()); + } + + @Override + public void updateContent() { for (int i = 51; i < 56; i++) { Text q = PlayerListMgr.textAt(i); IcoTextComponent itc = new IcoTextComponent(Ico.BOOK, q); this.addComponent(itc); } - this.pack(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ReputationWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ReputationWidget.java index 3685e0ca..32060bd0 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ReputationWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ReputationWidget.java @@ -29,7 +29,10 @@ public class ReputationWidget extends Widget { public ReputationWidget() { super(TITLE, Formatting.AQUA.getColorValue()); + } + @Override + public void updateContent() { String fracstr = PlayerListMgr.strAt(45); int spaceidx; @@ -61,8 +64,6 @@ public class ReputationWidget extends Widget { this.addComponent(pc); } - this.pack(); - } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ServerWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ServerWidget.java index 2d8d1c63..62c01b63 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ServerWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ServerWidget.java @@ -18,11 +18,13 @@ public class ServerWidget extends Widget { public ServerWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); + } + @Override + public void updateContent() { this.addSimpleIcoText(Ico.MAP, "Area:", Formatting.DARK_AQUA, 41); this.addSimpleIcoText(Ico.NTAG, "Server ID:", Formatting.GRAY, 42); this.addSimpleIcoText(Ico.EMERALD, "Gems:", Formatting.GREEN, 43); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/SkillsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/SkillsWidget.java index 88ba8022..cecee76c 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/SkillsWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/SkillsWidget.java @@ -30,6 +30,10 @@ public class SkillsWidget extends Widget { public SkillsWidget() { super(TITLE, Formatting.YELLOW.getColorValue()); + } + + @Override + public void updateContent() { Matcher m = PlayerListMgr.regexAt(66, SKILL_PATTERN); Component progress; if (m == null) { @@ -69,7 +73,6 @@ public class SkillsWidget extends Widget { tc.addToCell(1, 0, cdg); tc.addToCell(1, 1, cch); this.addComponent(tc); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/TrapperWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/TrapperWidget.java index d47849c3..68f8dcf2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/TrapperWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/TrapperWidget.java @@ -15,8 +15,11 @@ public class TrapperWidget extends Widget { public TrapperWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); + } + + @Override + public void updateContent() { this.addSimpleIcoText(Ico.LEATHER, "Pelts:", Formatting.AQUA, 46); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/UpgradeWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/UpgradeWidget.java index ef7c21d0..4553c7f9 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/UpgradeWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/UpgradeWidget.java @@ -1,6 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; @@ -17,17 +18,21 @@ public class UpgradeWidget extends Widget { private static final MutableText TITLE = Text.literal("Upgrade Info").formatted(Formatting.GOLD, Formatting.BOLD); - public UpgradeWidget(String footertext) { + public UpgradeWidget() { super(TITLE, Formatting.GOLD.getColorValue()); + } + + @Override + public void updateContent() { + String footertext = PlayerListMgr.getFooter(); + if (footertext == null) { this.addComponent(new PlainTextComponent(Text.literal("No data").formatted(Formatting.GRAY))); - this.pack(); return; } if (!footertext.contains("Upgrades")) { this.addComponent(new PlainTextComponent(Text.of("Currently no upgrades..."))); - this.pack(); return; } @@ -41,7 +46,6 @@ public class UpgradeWidget extends Widget { IcoTextComponent itc = new IcoTextComponent(Ico.SIGN, Text.of(lines[i])); this.addComponent(itc); } - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/VolcanoWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/VolcanoWidget.java index ec6a35fb..d0e01590 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/VolcanoWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/VolcanoWidget.java @@ -42,6 +42,10 @@ public class VolcanoWidget extends Widget { public VolcanoWidget() { super(TITLE, Formatting.AQUA.getColorValue()); + } + + @Override + public void updateContent() { String s = PlayerListMgr.strAt(58); if (s == null) { this.addComponent(new IcoTextComponent()); @@ -50,8 +54,6 @@ public class VolcanoWidget extends Widget { this.addComponent(new IcoTextComponent(p.getLeft(), Text.literal(s).formatted(p.getRight()))); } - this.pack(); - } } 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 15b2adf2..3e037256 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 @@ -48,10 +48,14 @@ public abstract class Widget { this.components.add(c); } - public void update() { + public final void update() { this.components.clear(); + this.updateContent(); + this.pack(); } + public abstract void updateContent(); + /** * Shorthand function for simple components. * If the entry at idx has the format ": ", an IcoTextComponent is @@ -68,7 +72,7 @@ public abstract class Widget { * Must be called before returning from the widget constructor and after all * components are added! */ - public final void pack() { + private void pack() { h = 0; w = 0; for (Component c : components) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/AdvertisementWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/AdvertisementWidget.java index 287b25b1..88e3a5cd 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/AdvertisementWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/AdvertisementWidget.java @@ -14,14 +14,16 @@ public class AdvertisementWidget extends Widget { public AdvertisementWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); + } + @Override + public void updateContent() { for (int i = 73; i < 80; i++) { Text text = PlayerListMgr.textAt(i); if (text != null) this.addComponent(new PlainTextComponent(text)); } - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/GoodToKnowWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/GoodToKnowWidget.java index 667bc154..e3b462a9 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/GoodToKnowWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/GoodToKnowWidget.java @@ -14,7 +14,10 @@ public class GoodToKnowWidget extends Widget { public GoodToKnowWidget() { super(TITLE, Formatting.BLUE.getColorValue()); + } + @Override + public void updateContent() { // After you progress further the tab adds more info so we need to be careful of // that // In beginning it only shows montezuma, then timecharms and enigma souls are @@ -50,6 +53,5 @@ public class GoodToKnowWidget extends Widget { new IcoTextComponent(Ico.PINK_DYE, Text.literal("Lifetime Earned: ").append(lifetimeMotesEarned))); } - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProfileWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProfileWidget.java index 5460de49..0b6ff5bf 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProfileWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProfileWidget.java @@ -12,8 +12,10 @@ public class RiftProfileWidget extends Widget { public RiftProfileWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); - + } + + @Override + public void updateContent() { this.addSimpleIcoText(Ico.SIGN, "Profile:", Formatting.GREEN, 61); - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProgressWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProgressWidget.java index 9ce12e76..ea67a309 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProgressWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProgressWidget.java @@ -22,7 +22,10 @@ public class RiftProgressWidget extends Widget { public RiftProgressWidget() { super(TITLE, Formatting.BLUE.getColorValue()); + } + @Override + public void updateContent() { // After you progress further the tab adds more info so we need to be careful of // that // In beginning it only shows montezuma, then timecharms and enigma souls are @@ -88,7 +91,6 @@ public class RiftProgressWidget extends Widget { this.addComponent(pc); } - this.pack(); } private static int pcntToCol(float pcnt) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftServerInfoWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftServerInfoWidget.java index 2ac2a35d..cab38a86 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftServerInfoWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftServerInfoWidget.java @@ -16,11 +16,12 @@ public class RiftServerInfoWidget extends Widget { public RiftServerInfoWidget() { super(TITLE, Formatting.LIGHT_PURPLE.getColorValue()); - + } + + @Override + public void updateContent() { this.addSimpleIcoText(Ico.MAP, "Area:", Formatting.LIGHT_PURPLE, 41); this.addSimpleIcoText(Ico.NTAG, "Server ID:", Formatting.GRAY, 42); - - this.pack(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftStatsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftStatsWidget.java index ef5876f2..8fab3dd4 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftStatsWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftStatsWidget.java @@ -15,7 +15,10 @@ public class RiftStatsWidget extends Widget { public RiftStatsWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); - + } + + @Override + public void updateContent() { Text riftDamage = Widget.simpleEntryText(64, "RDG", Formatting.DARK_PURPLE); IcoTextComponent rdg = new IcoTextComponent(Ico.DIASWORD, riftDamage); @@ -35,7 +38,6 @@ public class RiftStatsWidget extends Widget { tc.addToCell(1, 1, mrg); this.addComponent(tc); - this.pack(); } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/ShenWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/ShenWidget.java index 5dcc08c0..a1345c49 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/ShenWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/ShenWidget.java @@ -13,8 +13,10 @@ public class ShenWidget extends Widget { public ShenWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); - + } + + @Override + public void updateContent() { this.addComponent(new PlainTextComponent(Text.literal(PlayerListMgr.strAt(70)))); - this.pack(); } } diff --git a/src/main/resources/assets/skyblocker/tabhud/assignment.json b/src/main/resources/assets/skyblocker/tabhud/assignment.json index a7b8dd80..85c8f938 100644 --- a/src/main/resources/assets/skyblocker/tabhud/assignment.json +++ b/src/main/resources/assets/skyblocker/tabhud/assignment.json @@ -1,11 +1,11 @@ { - "screenA": { + "standard" : { "default": "generic_info_screen" }, - "screenB": { + "screenA": { "default": "empty_screen" }, - "screenC": { + "screenB": { "default": "empty_screen" } } \ 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 deleted file mode 100644 index 3ddfdfc3..00000000 --- a/src/main/resources/assets/skyblocker/tabhud/garden_info_screen.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "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 deleted file mode 100644 index 27a28008..00000000 --- a/src/main/resources/assets/skyblocker/tabhud/generic_info_screen.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "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 diff --git a/src/main/resources/assets/skyblocker/tabhud/info/garden_info_screen.json b/src/main/resources/assets/skyblocker/tabhud/info/garden_info_screen.json new file mode 100644 index 00000000..3e1556ef --- /dev/null +++ b/src/main/resources/assets/skyblocker/tabhud/info/garden_info_screen.json @@ -0,0 +1,70 @@ +{ + "widgets":[ + { + "name": "GardenSkillsWidget", + "alias": "gsw" + }, + { + "name": "EventWidget", + "alias": "evw", + "inGarden": true + }, + { + "name": "UpgradeWidget", + "alias": "uw" + }, + { + "name": "ProfileWidget", + "alias": "pw" + }, + { + "name": "EffectWidget", + "alias": "efw" + }, + { + "name": "JacobsContestWidget", + "alias": "jcw" + }, + { + "name": "CookieWidget", + "alias": "cw" + } + ], + "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", + "reference": "horizontalCenter", + "apply_to": ["gsw", "evw", "uw"] + }, + { + "op": "collideAgainst", + "direction": "left", + "widgets": ["pw", "efw"], + "colliders": ["gsw", "evw", "uw"] + }, + { + "op": "collideAgainst", + "direction": "right", + "widgets": ["jcw", "cw"], + "colliders": ["gsw", "evw", "uw"] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/skyblocker/tabhud/info/generic_info_screen.json b/src/main/resources/assets/skyblocker/tabhud/info/generic_info_screen.json new file mode 100644 index 00000000..dcfa5138 --- /dev/null +++ b/src/main/resources/assets/skyblocker/tabhud/info/generic_info_screen.json @@ -0,0 +1,70 @@ +{ + "widgets":[ + { + "name": "SkillsWidget", + "alias": "sw" + }, + { + "name": "EventWidget", + "alias": "evw", + "inGarden": false + }, + { + "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 diff --git a/src/main/resources/assets/skyblocker/tabhud/info/rift_info_screen.json b/src/main/resources/assets/skyblocker/tabhud/info/rift_info_screen.json new file mode 100644 index 00000000..3eda517d --- /dev/null +++ b/src/main/resources/assets/skyblocker/tabhud/info/rift_info_screen.json @@ -0,0 +1,48 @@ +{ + "widgets":[ + { + "name": "RiftProfileWidget", + "alias": "profile" + }, + { + "name": "RiftStatsWidget", + "alias": "stats" + }, + { + "name": "ShenWidget", + "alias": "shen" + }, + { + "name": "CookieWidget", + "alias": "cookie" + }, + { + "name": "AdvertisementWidget", + "alias": "ad" + } + ], + "layout": [ + { + "op": "stack", + "direction": "vertical", + "align": "center", + "apply_to": ["stats", "ad"] + }, + { + "op": "stack", + "direction": "vertical", + "align": "center", + "apply_to": ["profile", "shen", "cookie"] + }, + { + "op": "align", + "reference": "leftOfCenter", + "apply_to": ["stats", "ad"] + }, + { + "op": "align", + "direction": "rightOfCenter", + "apply_to": ["profile", "shen", "cookie"] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/skyblocker/tabhud/readme.md b/src/main/resources/assets/skyblocker/tabhud/readme.md new file mode 100644 index 00000000..7167f561 --- /dev/null +++ b/src/main/resources/assets/skyblocker/tabhud/readme.md @@ -0,0 +1,100 @@ +# assignment.json +Assigns the screens to a type (standard, screenA, screenB). standard is shown when just pressing tab, A and B are shown when using other keys/the modifiers. +For every type, the concrete screens are mapped to the areas they are supposed to be shown in. See Appendix A for a list of valid areas. +To find the screen definition, ".json" is appended to the screen key, so specifying `"foo": "generic_info_screen"` will try to find `generic_info_screen.json` and assign this definition to the "foo" area. + +# Screen definition JSON +This file consists of one widgets section and one layout section. + +## Widget section +The widget section defines all of the widgets that a screen uses. It also defines an alias that is used in the layout section and possibly a widget's argument if its behaviour can be changed by one. +For a full list of widgets, their names and their arguments see Appendix B + +## Layout section +The layout section defines how the widgets are arranged on the screen. This is done using a pipeline; an ordered list of stages where each stage moves the widgets in some way. The initial position of the widgets is undefined. As a rule of thumb, every stage (except "Place", see below) only moves the widget in one direction, so at least two operations need to be done executed on each widget for it to be in a well defined position. A full list of operations and their arguments is found in Appendix C. + +# Appendices + +## Appendix A: Area identifiers +- default: Any area not explicitly listed in the type. + +## Appendix B: Widget identifiers and arguments + +- EmptyWidget: Generic "No data available" +- SkillsWidget: The player's skill levels and stats +- EventWidget: Info about current events. Arg `inGarden: true|false`: Is this widget displayed in the garden area? +- UpgradeWidget: Currently running upgrades +- ProfileWidget: Data about the player's profile +- EffectWidget: Currently active effects +- ElectionWidget: Info about the current mayor election +- CookieWidget: Info about your super cookie + +## Appendix C: Pipeline stages + +#### Align +- op: `align` +- reference: One of `horizontalCenter`, `verticalCenter`, `leftOfCenter`, `rightOfCenter`, `topOfCenter`, `botOfCenter` +- apply_to: List of widgets to individually apply this operation to. +- Moves a widget in *one* direction (up/down OR left/right) until it's positioned in the way described by `reference`. This reference may be thought of as a straight line, with some describing the screen's borders and others referring to it's two center axis. + +Example: align A and B with "horizontalCenter" +``` ++-----------+ +-----------+ +| | | | +| A | | -> A | +| | --> | | +| | | | +| B| | B <- | ++-----------+ +-----------+ +``` + +#### Collide +- op: `collideAgainst` +- direction: One of `left`, `right` +- widgets: List of widgets to individually move. +- colliders: List static reference widgets to "collide against". +- Moves a widget in the `direction` until it would overlap with any one of the colliders. Doesn't move the widget in the other direction, doesn't move the widget if it wouldn't collide with anything. + +Example: Collide A and B from the right with X, Y and Z +``` ++-----------+ +-----------+ +| A | | A | +| A XX | | -> AXX | +| XX | --> | XX | +| Y | | Y | +| Y BB| | -> BBY | ++-----------+ +-----------+ +``` + +#### Stack +- op: `stack` +- direction: One of `vertical`, `horizontal` +- align: One of `center`, `top`, `bot`, `left`, `right` +- apply_to: List of widgets to stack, order of the list is important (top -> bot or left -> right) +- Move the widgets vertically or horizontally as indicated by the `direction`. `align` indicates if the list is touching a screen border or is centered on the screen. This only works with borders in the direction of the stacking; combinations such as `vertical`/`left` are considered invalid and act like `align` was set to `center`. This only moves the widget in one direction so in order to get a clean list, an Align operation must be executed as well. + +Example: Stack A, B, C vertically/center-aligned, then align with leftOfCenter +``` ++-----------+ +-----------+ +-----------+ +| A | | v | | | +| | stack | A | align | -> A | +| C | --> | v B | --> | B <- | +| | | C ^ | | C <- | +| B | | | | | ++-----------+ +-----------+ +-----------+ +``` + +#### Place +- op: `place` +- where: One of `center` +- apply_to: Widget to place an the indicated position. +- Places a widget at some position, moving it in any direction as needed. Only makes sense to use on one widget at a time, as applying the same Place op to multiple widgtes causes them to be on top of each other. + +Example: Place A at "center" ++-----------+ +-----------+ +| | | | +| A | | -> v | +| | --> | A | +| | | | +| | | | ++-----------+ +-----------+ \ No newline at end of file diff --git a/src/main/resources/assets/skyblocker/tabhud/test_screen.json b/src/main/resources/assets/skyblocker/tabhud/test_screen.json new file mode 100644 index 00000000..2ffa802d --- /dev/null +++ b/src/main/resources/assets/skyblocker/tabhud/test_screen.json @@ -0,0 +1,122 @@ +{ + "widgets": [ + { + "name": "EmptyWidget", + "alias": "ew1" + }, + { + "name": "EmptyWidget", + "alias": "ew2" + }, + { + "name": "EffectWidget", + "alias": "ew3" + }, + { + "name": "EffectWidget", + "alias": "ew4" + }, + { + "name": "CookieWidget", + "alias": "ew5" + }, + { + "name": "CookieWidget", + "alias": "ew6" + }, + { + "name": "UpgradeWidget", + "alias": "ew7" + }, + { + "name": "UpgradeWidget", + "alias": "ew8" + }, + { + "name": "FireSaleWidget", + "alias": "ew9" + }, + { + "name": "FireSaleWidget", + "alias": "ew10" + }, + { + "name": "EventWidget", + "alias": "ew11", + "inGarden": true + }, + { + "name": "EventWidget", + "alias": "ew12", + "inGarden": true + } + ], + "layout": [ + { + "op": "stack", + "direction": "vertical", + "align": "top", + "apply_to": ["ew1", "ew2"] + }, + { + "op": "align", + "reference": "leftOfCenter", + "apply_to": ["ew1", "ew2"] + }, + { + "op": "stack", + "direction": "vertical", + "align": "center", + "apply_to": ["ew3", "ew4"] + }, + { + "op": "align", + "reference": "horizontalCenter", + "apply_to": ["ew3", "ew4"] + }, + { + "op": "stack", + "direction": "vertical", + "align": "bot", + "apply_to": ["ew5", "ew6"] + }, + { + "op": "align", + "reference": "rightOfCenter", + "apply_to": ["ew5", "ew6"] + }, + { + "op": "stack", + "direction": "horizontal", + "align": "left", + "apply_to": ["ew7", "ew8"] + }, + { + "op": "align", + "reference": "topOfCenter", + "apply_to": ["ew7", "ew8"] + }, + { + "op": "stack", + "direction": "horizontal", + "align": "center", + "apply_to": ["ew9", "ew10"] + }, + { + "op": "align", + "reference": "verticalCenter", + "apply_to": ["ew9", "ew10"] + }, + { + "op": "stack", + "direction": "horizontal", + "align": "right", + "apply_to": ["ew11", "ew12"] + }, + { + "op": "align", + "reference": "botOfCenter", + "apply_to": ["ew11", "ew12"] + } + ] +} \ No newline at end of file -- cgit