From 152b6c6ce8331567d37e0d88721b33eef495031e Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Sun, 5 May 2024 16:43:19 +0200 Subject: and so it begins (sorry msg) --- .../hysky/skyblocker/config/HudConfigScreen.java | 22 +- .../skyblock/dwarven/CrystalsHudConfigScreen.java | 6 +- .../skyblock/dwarven/DwarvenHudConfigScreen.java | 6 +- .../skyblock/end/EndHudConfigScreen.java | 4 +- .../skyblocker/skyblock/end/EndHudWidget.java | 4 +- .../skyblock/garden/FarmingHudConfigScreen.java | 4 +- .../skyblock/garden/FarmingHudWidget.java | 4 +- .../tabhud/screenbuilder/ScreenBuilder.java | 18 +- .../tabhud/screenbuilder/ScreenMaster.java | 4 + .../tabhud/screenbuilder/pipeline/AlignStage.java | 4 +- .../screenbuilder/pipeline/CollideStage.java | 18 +- .../screenbuilder/pipeline/PipelineStage.java | 6 +- .../tabhud/screenbuilder/pipeline/PlaceStage.java | 4 +- .../tabhud/screenbuilder/pipeline/StackStage.java | 10 +- .../skyblock/tabhud/util/PlayerListMgr.java | 116 ++++++++- .../tabhud/widget/CameraPositionWidget.java | 2 +- .../skyblock/tabhud/widget/CommsWidget.java | 2 +- .../skyblock/tabhud/widget/ComposterWidget.java | 2 +- .../skyblock/tabhud/widget/CookieWidget.java | 2 +- .../skyblock/tabhud/widget/DungeonBuffWidget.java | 2 +- .../skyblock/tabhud/widget/DungeonDeathWidget.java | 4 +- .../tabhud/widget/DungeonDownedWidget.java | 4 +- .../tabhud/widget/DungeonPlayerWidget.java | 2 +- .../tabhud/widget/DungeonPuzzleWidget.java | 2 +- .../tabhud/widget/DungeonSecretWidget.java | 3 +- .../tabhud/widget/DungeonServerWidget.java | 2 +- .../skyblock/tabhud/widget/EffectWidget.java | 2 +- .../skyblock/tabhud/widget/ElectionWidget.java | 4 +- .../skyblock/tabhud/widget/EmptyWidget.java | 2 +- .../skyblock/tabhud/widget/ErrorWidget.java | 2 +- .../skyblock/tabhud/widget/EssenceWidget.java | 18 +- .../skyblock/tabhud/widget/EventWidget.java | 4 +- .../skyblock/tabhud/widget/FireSaleWidget.java | 2 +- .../skyblock/tabhud/widget/ForgeWidget.java | 2 +- .../skyblock/tabhud/widget/GardenServerWidget.java | 6 +- .../skyblock/tabhud/widget/GardenSkillsWidget.java | 6 +- .../tabhud/widget/GardenVisitorsWidget.java | 2 +- .../skyblock/tabhud/widget/GuestServerWidget.java | 2 +- .../skyblock/tabhud/widget/HudWidget.java | 265 +++++++++++++++++++++ .../skyblock/tabhud/widget/IslandGuestsWidget.java | 2 +- .../skyblock/tabhud/widget/IslandOwnersWidget.java | 2 +- .../skyblock/tabhud/widget/IslandSelfWidget.java | 2 +- .../skyblock/tabhud/widget/IslandServerWidget.java | 2 +- .../tabhud/widget/JacobsContestWidget.java | 2 +- .../skyblock/tabhud/widget/MinionWidget.java | 2 +- .../skyblock/tabhud/widget/ParkServerWidget.java | 2 +- .../skyblock/tabhud/widget/PlayerListWidget.java | 2 +- .../skyblock/tabhud/widget/PowderWidget.java | 2 +- .../skyblock/tabhud/widget/ProfileWidget.java | 2 +- .../skyblock/tabhud/widget/QuestWidget.java | 2 +- .../skyblock/tabhud/widget/ReputationWidget.java | 4 +- .../skyblock/tabhud/widget/ServerWidget.java | 2 +- .../skyblock/tabhud/widget/SkillsWidget.java | 12 +- .../tabhud/widget/SpidersDenServerWidget.java | 2 +- .../skyblock/tabhud/widget/TabHudWidget.java | 45 ++++ .../skyblock/tabhud/widget/TrapperWidget.java | 2 +- .../skyblock/tabhud/widget/UpgradeWidget.java | 2 +- .../skyblock/tabhud/widget/VolcanoWidget.java | 2 +- .../skyblocker/skyblock/tabhud/widget/Widget.java | 238 ------------------ .../skyblock/tabhud/widget/hud/HudCommsWidget.java | 4 +- .../tabhud/widget/hud/HudPowderWidget.java | 4 +- .../tabhud/widget/rift/AdvertisementWidget.java | 4 +- .../tabhud/widget/rift/GoodToKnowWidget.java | 4 +- .../tabhud/widget/rift/RiftProfileWidget.java | 4 +- .../tabhud/widget/rift/RiftProgressWidget.java | 4 +- .../tabhud/widget/rift/RiftServerInfoWidget.java | 4 +- .../tabhud/widget/rift/RiftStatsWidget.java | 12 +- .../skyblock/tabhud/widget/rift/ShenWidget.java | 4 +- 68 files changed, 568 insertions(+), 381 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/TabHudWidget.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/Widget.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java b/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java index 328cbe18..2e4b8977 100644 --- a/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java @@ -1,6 +1,6 @@ package de.hysky.skyblocker.config; -import de.hysky.skyblocker.skyblock.tabhud.widget.Widget; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; import de.hysky.skyblocker.utils.render.RenderHelper; import it.unimi.dsi.fastutil.ints.IntIntMutablePair; import net.minecraft.client.gui.DrawContext; @@ -19,9 +19,9 @@ import java.util.List; */ public abstract class HudConfigScreen extends Screen { private final Screen parent; - private final List widgets; + private final List widgets; - private Widget draggingWidget; + private HudWidget draggingWidget; private double mouseClickRelativeX; private double mouseClickRelativeY; @@ -31,7 +31,7 @@ public abstract class HudConfigScreen extends Screen { * @param parent the parent screen * @param widget the widget to configure */ - public HudConfigScreen(Text title, Screen parent, Widget widget) { + public HudConfigScreen(Text title, Screen parent, HudWidget widget) { this(title, parent, List.of(widget)); } @@ -41,7 +41,7 @@ public abstract class HudConfigScreen extends Screen { * @param parent the parent screen * @param widgets the widgets to configure */ - public HudConfigScreen(Text title, Screen parent, List widgets) { + public HudConfigScreen(Text title, Screen parent, List widgets) { super(title); this.parent = parent; this.widgets = widgets; @@ -56,12 +56,12 @@ public abstract class HudConfigScreen extends Screen { } /** - * Renders the widgets using the default {@link Widget#render(DrawContext, boolean)} method. Override to change the behavior. + * Renders the widgets using the default {@link HudWidget#render(DrawContext, boolean)} method. Override to change the behavior. * @param context the context to render in * @param widgets the widgets to render */ - protected void renderWidget(DrawContext context, List widgets) { - for (Widget widget : widgets) { + protected void renderWidget(DrawContext context, List widgets) { + for (HudWidget widget : widgets) { widget.render(context, SkyblockerConfigManager.get().uiAndVisuals.tabHud.enableHudBackground); } } @@ -78,7 +78,7 @@ public abstract class HudConfigScreen extends Screen { @Override public final boolean mouseClicked(double mouseX, double mouseY, int button) { if (button == 0) { - for (Widget widget : widgets) { + for (HudWidget widget : widgets) { if (RenderHelper.pointIsInArea(mouseX, mouseY, widget.getX(), widget.getY(), widget.getX() + widget.getWidth(), widget.getY() + widget.getHeight())) { draggingWidget = widget; mouseClickRelativeX = mouseX - widget.getX(); @@ -107,7 +107,7 @@ public abstract class HudConfigScreen extends Screen { throw new IllegalStateException("The number of positions (" + configPositions.size() + ") does not match the number of widgets (" + widgets.size() + ")"); } for (int i = 0; i < widgets.size(); i++) { - Widget widget = widgets.get(i); + HudWidget widget = widgets.get(i); IntIntMutablePair configPos = configPositions.get(i); widget.setX(configPos.leftInt()); widget.setY(configPos.rightInt()); @@ -137,5 +137,5 @@ public abstract class HudConfigScreen extends Screen { * @param configManager the config so you don't have to get it * @param widgets the widgets to save */ - protected abstract void savePos(SkyblockerConfig configManager, List widgets); + protected abstract void savePos(SkyblockerConfig configManager, List widgets); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudConfigScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudConfigScreen.java index 0348c09d..1858b214 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudConfigScreen.java @@ -3,7 +3,7 @@ package de.hysky.skyblocker.skyblock.dwarven; import de.hysky.skyblocker.config.HudConfigScreen; import de.hysky.skyblocker.config.SkyblockerConfig; import de.hysky.skyblocker.skyblock.tabhud.widget.EmptyWidget; -import de.hysky.skyblocker.skyblock.tabhud.widget.Widget; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; import it.unimi.dsi.fastutil.ints.IntIntMutablePair; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; @@ -31,14 +31,14 @@ public class CrystalsHudConfigScreen extends HudConfigScreen { } @Override - protected void renderWidget(DrawContext context, List widgets) { + protected void renderWidget(DrawContext context, List widgets) { int size = CrystalsHud.getDimensionsForConfig(); WIDGET.setDimensions(size); context.drawTexture(RenderLayer::getGuiTextured, CrystalsHud.MAP_TEXTURE, WIDGET.getX(), WIDGET.getY(), 0, 0, size, size, size, size); } @Override - protected void savePos(SkyblockerConfig configManager, List widgets) { + protected void savePos(SkyblockerConfig configManager, List widgets) { configManager.mining.crystalsHud.x = widgets.getFirst().getX(); configManager.mining.crystalsHud.y = widgets.getFirst().getY(); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java index baa3ed55..40124ce0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java @@ -5,7 +5,7 @@ import de.hysky.skyblocker.config.SkyblockerConfig; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.config.configs.MiningConfig; import de.hysky.skyblocker.skyblock.dwarven.DwarvenHud.Commission; -import de.hysky.skyblocker.skyblock.tabhud.widget.Widget; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; import de.hysky.skyblocker.skyblock.tabhud.widget.hud.HudCommsWidget; import de.hysky.skyblocker.skyblock.tabhud.widget.hud.HudPowderWidget; import it.unimi.dsi.fastutil.ints.IntIntMutablePair; @@ -42,12 +42,12 @@ public class DwarvenHudConfigScreen extends HudConfigScreen { } @Override - protected void renderWidget(DrawContext context, List widgets) { + protected void renderWidget(DrawContext context, List widgets) { DwarvenHud.render(HudCommsWidget.INSTANCE_CFG, HudPowderWidget.INSTANCE_CFG, context, widgets.getFirst().getX(), widgets.getFirst().getY(), widgets.get(1).getX(), widgets.get(1).getY(), CFG_COMMS); } @Override - protected void savePos(SkyblockerConfig configManager, List widgets) { + protected void savePos(SkyblockerConfig configManager, List widgets) { configManager.mining.dwarvenHud.commissionsX = widgets.getFirst().getX(); configManager.mining.dwarvenHud.commissionsY = widgets.getFirst().getY(); configManager.mining.dwarvenHud.powderX = widgets.get(1).getX(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudConfigScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudConfigScreen.java index 4540ce6e..19a96bd4 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudConfigScreen.java @@ -2,7 +2,7 @@ package de.hysky.skyblocker.skyblock.end; import de.hysky.skyblocker.config.HudConfigScreen; import de.hysky.skyblocker.config.SkyblockerConfig; -import de.hysky.skyblocker.skyblock.tabhud.widget.Widget; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; import it.unimi.dsi.fastutil.ints.IntIntMutablePair; import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.Text; @@ -21,7 +21,7 @@ public class EndHudConfigScreen extends HudConfigScreen { } @Override - protected void savePos(SkyblockerConfig configManager, List widgets) { + protected void savePos(SkyblockerConfig configManager, List widgets) { configManager.otherLocations.end.x = widgets.getFirst().getX(); configManager.otherLocations.end.y = widgets.getFirst().getY(); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java index a2869447..56a41e3d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java @@ -2,7 +2,7 @@ package de.hysky.skyblocker.skyblock.end; import com.mojang.authlib.properties.PropertyMap; import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.tabhud.widget.Widget; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; import de.hysky.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; import net.minecraft.component.DataComponentTypes; @@ -17,7 +17,7 @@ import java.text.NumberFormat; import java.util.Locale; import java.util.Optional; -public class EndHudWidget extends Widget { +public class EndHudWidget extends HudWidget { private static final MutableText TITLE = Text.literal("The End").formatted(Formatting.LIGHT_PURPLE, Formatting.BOLD); public static final EndHudWidget INSTANCE = new EndHudWidget(TITLE, Formatting.DARK_PURPLE.getColorValue()); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudConfigScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudConfigScreen.java index 0271c66a..47059ec0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudConfigScreen.java @@ -2,7 +2,7 @@ package de.hysky.skyblocker.skyblock.garden; import de.hysky.skyblocker.config.HudConfigScreen; import de.hysky.skyblocker.config.SkyblockerConfig; -import de.hysky.skyblocker.skyblock.tabhud.widget.Widget; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; import it.unimi.dsi.fastutil.ints.IntIntMutablePair; import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.Text; @@ -23,7 +23,7 @@ public class FarmingHudConfigScreen extends HudConfigScreen { } @Override - protected void savePos(SkyblockerConfig configManager, List widgets) { + protected void savePos(SkyblockerConfig configManager, List widgets) { configManager.farming.garden.farmingHud.x = widgets.getFirst().getX(); configManager.farming.garden.farmingHud.y = widgets.getFirst().getY(); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java index 954c9f27..1fdcdac1 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java @@ -4,7 +4,7 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.item.tooltip.info.TooltipInfoType; import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; import de.hysky.skyblocker.skyblock.tabhud.util.Ico; -import de.hysky.skyblocker.skyblock.tabhud.widget.Widget; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; import de.hysky.skyblocker.skyblock.tabhud.widget.component.ProgressComponent; import de.hysky.skyblocker.utils.ItemUtils; @@ -19,7 +19,7 @@ import net.minecraft.util.math.MathHelper; import java.util.Map; -public class FarmingHudWidget extends Widget { +public class FarmingHudWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Farming").formatted(Formatting.YELLOW, Formatting.BOLD); public static final Map FARMING_TOOLS = Map.ofEntries( Map.entry("THEORETICAL_HOE_WHEAT_1", "WHEAT"), diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java index ceeaa365..4f311cb1 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java @@ -12,7 +12,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import de.hysky.skyblocker.skyblock.tabhud.widget.Widget; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline.AlignStage; import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline.CollideStage; import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline.PipelineStage; @@ -31,9 +31,9 @@ public class ScreenBuilder { private final ArrayList layoutPipeline = new ArrayList<>(); // all widget instances this builder knows - private final ArrayList instances = new ArrayList<>(); + private final ArrayList instances = new ArrayList<>(); // maps alias -> widget instance - private final HashMap objectMap = new HashMap<>(); + private final HashMap objectMap = new HashMap<>(); private final String builderName; @@ -55,7 +55,7 @@ public class ScreenBuilder { String name = widget.get("name").getAsString(); String alias = widget.get("alias").getAsString(); - Widget wid = instanceFrom(name, widget); + HudWidget wid = instanceFrom(name, widget); objectMap.put(alias, wid); instances.add(wid); } @@ -74,7 +74,7 @@ public class ScreenBuilder { * 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) { + public HudWidget instanceFrom(String name, JsonObject widget) { // do widgets that require args the normal way JsonElement arg; @@ -127,7 +127,7 @@ public class ScreenBuilder { // return instance of that class. try { Constructor ctor = clazz.getConstructor(); - return (Widget) ctor.newInstance(); + return (HudWidget) ctor.newInstance(); } catch (NoSuchMethodException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | SecurityException ex) { throw new IllegalStateException(builderName + "/" + name + ": Internal error..."); @@ -153,7 +153,7 @@ public class ScreenBuilder { /** * Lookup Widget instance from alias name */ - public Widget getInstance(String name) { + public HudWidget getInstance(String name) { if (!this.objectMap.containsKey(name)) { throw new NoSuchElementException("No widget with alias " + name + " in screen " + builderName); } @@ -165,13 +165,13 @@ public class ScreenBuilder { */ public void run(DrawContext context, int screenW, int screenH) { - for (Widget w : instances) { + for (HudWidget w : instances) { w.update(); } for (PipelineStage ps : layoutPipeline) { ps.run(screenW, screenH); } - for (Widget w : instances) { + for (HudWidget w : instances) { w.render(context); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java index bb4a5ea3..a877e052 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java @@ -1,11 +1,13 @@ package de.hysky.skyblocker.skyblock.tabhud.screenbuilder; +import com.google.common.reflect.ClassPath; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.annotations.Init; import de.hysky.skyblocker.skyblock.tabhud.TabHud; import de.hysky.skyblocker.skyblock.tabhud.util.PlayerLocator; +import de.hysky.skyblocker.skyblock.tabhud.widget.TabHudWidget; import net.fabricmc.fabric.api.resource.ResourceManagerHelper; import net.fabricmc.fabric.api.resource.ResourcePackActivationType; import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener; @@ -80,6 +82,8 @@ public class ScreenMaster { @Init public static void init() { + //ClassPath.from(TabHudWidget.class.getClassLoader()).getTopLevelClasses("de.hysky.skyblocker.skyblock.tabhud.widget").iterator().forEachRemaining(); + // WHY MUST IT ALWAYS BE SUCH NESTED GARBAGE MINECRAFT KEEP THAT IN DFU FFS ResourceManagerHelper.registerBuiltinResourcePack( diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/AlignStage.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/AlignStage.java index 7c01a6db..f5663d45 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/AlignStage.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/AlignStage.java @@ -6,7 +6,7 @@ import java.util.NoSuchElementException; import com.google.gson.JsonObject; import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenBuilder; -import de.hysky.skyblocker.skyblock.tabhud.widget.Widget; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; import de.hysky.skyblocker.skyblock.tabhud.util.ScreenConst; public class AlignStage extends PipelineStage { @@ -52,7 +52,7 @@ public class AlignStage extends PipelineStage { public void run(int screenW, int screenH) { int wHalf, hHalf; - for (Widget wid : primary) { + for (HudWidget wid : primary) { switch (this.reference) { case HORICENT -> wid.setX((screenW - wid.getWidth()) / 2); case VERTCENT -> wid.setY((screenH - wid.getHeight()) / 2); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CollideStage.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CollideStage.java index d100a52e..745cf4e8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CollideStage.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CollideStage.java @@ -6,7 +6,7 @@ import java.util.NoSuchElementException; import com.google.gson.JsonObject; import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenBuilder; -import de.hysky.skyblocker.skyblock.tabhud.widget.Widget; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; import de.hysky.skyblocker.skyblock.tabhud.util.ScreenConst; public class CollideStage extends PipelineStage { @@ -58,13 +58,13 @@ public class CollideStage extends PipelineStage { } } - public void collideAgainstL(int screenW, Widget w) { + public void collideAgainstL(int screenW, HudWidget w) { int yMin = w.getY(); int yMax = w.getY() + w.getHeight(); int xCor = screenW; - for (Widget other : secondary) { + for (HudWidget other : secondary) { if (other.getY() + other.getHeight() + ScreenConst.WIDGET_PAD < yMin) { // too high, next one continue; @@ -81,13 +81,13 @@ public class CollideStage extends PipelineStage { w.setX(xCor); } - public void collideAgainstR(int screenW, Widget w) { + public void collideAgainstR(int screenW, HudWidget w) { int yMin = w.getY(); int yMax = w.getY() + w.getHeight(); int xCor = 0; - for (Widget other : secondary) { + for (HudWidget other : secondary) { if (other.getY() + other.getHeight() + ScreenConst.WIDGET_PAD < yMin) { // too high, next one continue; @@ -104,13 +104,13 @@ public class CollideStage extends PipelineStage { w.setX(xCor); } - public void collideAgainstT(int screenH, Widget w) { + public void collideAgainstT(int screenH, HudWidget w) { int xMin = w.getX(); int xMax = w.getX() + w.getWidth(); int yCor = screenH; - for (Widget other : secondary) { + for (HudWidget other : secondary) { if (other.getX() + other.getWidth() + ScreenConst.WIDGET_PAD < xMin) { // too far left, next one continue; @@ -127,13 +127,13 @@ public class CollideStage extends PipelineStage { w.setY(yCor); } - public void collideAgainstB(int screenH, Widget w) { + public void collideAgainstB(int screenH, HudWidget w) { int xMin = w.getX(); int xMax = w.getX() + w.getWidth(); int yCor = 0; - for (Widget other : secondary) { + for (HudWidget other : secondary) { if (other.getX() + other.getWidth() + ScreenConst.WIDGET_PAD < xMin) { // too far left, next one continue; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PipelineStage.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PipelineStage.java index 20e4859e..c4de10a7 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PipelineStage.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PipelineStage.java @@ -2,12 +2,12 @@ package de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline; import java.util.ArrayList; -import de.hysky.skyblocker.skyblock.tabhud.widget.Widget; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; public abstract class PipelineStage { - protected ArrayList primary = null; - protected ArrayList secondary = null; + protected ArrayList primary = null; + protected ArrayList secondary = null; public abstract void run(int screenW, int screenH); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PlaceStage.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PlaceStage.java index 1e6cdf22..affc3847 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PlaceStage.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PlaceStage.java @@ -6,7 +6,7 @@ import java.util.NoSuchElementException; import com.google.gson.JsonObject; import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenBuilder; -import de.hysky.skyblocker.skyblock.tabhud.widget.Widget; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; import de.hysky.skyblocker.skyblock.tabhud.util.ScreenConst; public class PlaceStage extends PipelineStage { @@ -51,7 +51,7 @@ public class PlaceStage extends PipelineStage { } public void run(int screenW, int screenH) { - Widget wid = primary.getFirst(); + HudWidget wid = primary.getFirst(); switch (where) { case CENTER -> { wid.setX((screenW - wid.getWidth()) / 2); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/StackStage.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/StackStage.java index f4fe07e5..f39ce472 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/StackStage.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/StackStage.java @@ -6,7 +6,7 @@ import java.util.NoSuchElementException; import com.google.gson.JsonObject; import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenBuilder; -import de.hysky.skyblocker.skyblock.tabhud.widget.Widget; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; import de.hysky.skyblocker.skyblock.tabhud.util.ScreenConst; public class StackStage extends PipelineStage { @@ -76,7 +76,7 @@ public class StackStage extends PipelineStage { public void stackWidgetsVert(int screenH) { int compHeight = -ScreenConst.WIDGET_PAD; - for (Widget wid : primary) { + for (HudWidget wid : primary) { compHeight += wid.getHeight() + 5; } @@ -87,7 +87,7 @@ public class StackStage extends PipelineStage { default -> (screenH - compHeight) / 2; }; - for (Widget wid : primary) { + for (HudWidget wid : primary) { wid.setY(y); y += wid.getHeight() + ScreenConst.WIDGET_PAD; } @@ -95,7 +95,7 @@ public class StackStage extends PipelineStage { public void stackWidgetsHoriz(int screenW) { int compWidth = -ScreenConst.WIDGET_PAD; - for (Widget wid : primary) { + for (HudWidget wid : primary) { compWidth += wid.getWidth() + ScreenConst.WIDGET_PAD; } @@ -106,7 +106,7 @@ public class StackStage extends PipelineStage { default -> (screenW - compWidth) / 2; }; - for (Widget wid : primary) { + for (HudWidget wid : primary) { wid.setX(x); x += wid.getWidth() + ScreenConst.WIDGET_PAD; } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java index b08a09d6..01bf4500 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java @@ -1,18 +1,31 @@ package de.hysky.skyblocker.skyblock.tabhud.util; + import de.hysky.skyblocker.mixins.accessors.PlayerListHudAccessor; +import de.hysky.skyblocker.skyblock.tabhud.widget.TabHudWidget; +import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; import de.hysky.skyblocker.utils.Utils; +import it.unimi.dsi.fastutil.Pair; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import it.unimi.dsi.fastutil.objects.ObjectObjectMutablePair; +import net.minecraft.text.Style; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.util.Objects; import java.util.ArrayList; import java.util.List; -import java.util.Objects; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -24,6 +37,8 @@ import java.util.regex.Pattern; public class PlayerListMgr { public static final Logger LOGGER = LoggerFactory.getLogger("Skyblocker Regex"); + private static final Pattern PLAYERS_COLUMN_PATTERN = Pattern.compile("(^|\\s)Players \\((\\d+)\\)(\\s|$)"); + private static final Pattern INFO_COLUMN_PATTERN = Pattern.compile("(^|\\s)Info(\\s|$)"); /** * The player list in tab. @@ -34,6 +49,8 @@ public class PlayerListMgr { */ private static List playerStringList = new ArrayList<>(); private static String footer; + public static final Map widgetInstances = new Object2ObjectOpenHashMap<>(); + public static final List widgetsToShow = new ObjectArrayList<>(5); public static void updateList() { @@ -48,6 +65,88 @@ public class PlayerListMgr { playerList = cpnwh.getPlayerList().stream().sorted(PlayerListHudAccessor.getOrdering()).toList(); playerStringList = playerList.stream().map(PlayerListEntry::getDisplayName).filter(Objects::nonNull).map(Text::getString).map(String::strip).toList(); } + + Predicate playersColumnPredicate = PLAYERS_COLUMN_PATTERN.asMatchPredicate(); + Predicate infoColumnPredicate = INFO_COLUMN_PATTERN.asMatchPredicate(); + + widgetsToShow.clear(); + boolean doingPlayers = false; + boolean playersDone = false; + String hypixelWidgetName = ""; + List contents = new ArrayList<>(); + + for (PlayerListEntry playerListEntry : playerList) { + Text displayName = playerListEntry.getDisplayName(); + if (displayName == null) continue; + String string = displayName.getString(); + + if (!playersDone) { + // check if Players (number) + if (playersColumnPredicate.test(string)) { + if (!doingPlayers) { + doingPlayers = true; + hypixelWidgetName = "Players"; + } + continue; + } + // Check if info, if it is, dip out + if (infoColumnPredicate.test(string)) { + playersDone = true; + widgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents)); + contents.clear(); + continue; + } + // add player to contents + contents.add(displayName); + } else { + if (string.isBlank()) continue; + if (infoColumnPredicate.test(string)) continue; + if (!string.startsWith(" ")) { + if (!contents.isEmpty()) widgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents)); + contents.clear(); + Pair nameAndInfo = getNameAndInfo(displayName); + hypixelWidgetName = nameAndInfo.left(); + contents.add(nameAndInfo.right()); + continue; + } + contents.add(displayName); + } + } + } + + private static TabHudWidget getTabHudWidget(String hypixelWidgetName, List lines) { + if (widgetInstances.containsKey(hypixelWidgetName)) { + TabHudWidget tabHudWidget = widgetInstances.get(hypixelWidgetName); + tabHudWidget.updateFromTab(lines); + return tabHudWidget; + } else { + DefaultTabHudWidget defaultTabHudWidget = new DefaultTabHudWidget(hypixelWidgetName, Text.literal(hypixelWidgetName)); + widgetInstances.put(defaultTabHudWidget.getHypixelWidgetName(), defaultTabHudWidget); + defaultTabHudWidget.updateFromTab(lines); + return defaultTabHudWidget; + } + } + + private static Pair getNameAndInfo(Text text) { + ObjectObjectMutablePair toReturn = new ObjectObjectMutablePair<>("", Text.empty()); + AtomicBoolean inInfo = new AtomicBoolean(false); + text.visit((style, asString) -> { + if (inInfo.get()) { + toReturn.right().append(Text.literal(asString).fillStyle(style)); + } else { + if (asString.contains(":")) { + inInfo.set(true); + String[] split = asString.split(":", 2); + toReturn.left(toReturn.left() + split[0]); + toReturn.right().append(Text.literal(split[1]).fillStyle(style)); + } else { + toReturn.left(toReturn.left() + asString); + } + } + return Optional.empty(); + }, Style.EMPTY); + + return toReturn; } /** @@ -191,4 +290,15 @@ public class PlayerListMgr { return playerList.size(); } + private static final class DefaultTabHudWidget extends TabHudWidget { + public DefaultTabHudWidget(String hypixelWidgetName, MutableText title) { + super(hypixelWidgetName, title, 0xFFFF00); + } + + @Override + protected void updateContent(List lines) { + lines.forEach(text -> addComponent(new PlainTextComponent(text))); + } + } + } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CameraPositionWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CameraPositionWidget.java index 9aa4a50e..7464429f 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CameraPositionWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CameraPositionWidget.java @@ -7,7 +7,7 @@ import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.math.MathHelper; -public class CameraPositionWidget extends Widget { +public class CameraPositionWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Camera Pos").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CommsWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CommsWidget.java index a5fb4d32..be72b31b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CommsWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CommsWidget.java @@ -15,7 +15,7 @@ import net.minecraft.util.Formatting; // this widget shows the status of the king's commissions. // (dwarven mines and crystal hollows) -public class CommsWidget extends Widget { +public class CommsWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Commissions").formatted(Formatting.DARK_AQUA, Formatting.BOLD); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ComposterWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ComposterWidget.java index f50b617b..a7fd93e5 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ComposterWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ComposterWidget.java @@ -9,7 +9,7 @@ import net.minecraft.util.Formatting; // this widget shows info about the garden's composter -public class ComposterWidget extends Widget { +public class ComposterWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Composter").formatted(Formatting.GREEN, Formatting.BOLD); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CookieWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CookieWidget.java index a5883e7e..c65d5a58 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CookieWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/CookieWidget.java @@ -13,7 +13,7 @@ import net.minecraft.util.Formatting; // this widget shows info about active super cookies // or not, if you're unwilling to buy one -public class CookieWidget extends Widget { +public class CookieWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Cookie Info").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonBuffWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonBuffWidget.java index fd896796..a86f27bf 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonBuffWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonBuffWidget.java @@ -11,7 +11,7 @@ import java.util.Comparator; // this widget shows a list of obtained dungeon buffs -public class DungeonBuffWidget extends Widget { +public class DungeonBuffWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Dungeon Buffs").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDeathWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDeathWidget.java index 79193b51..651b24e4 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDeathWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDeathWidget.java @@ -13,7 +13,7 @@ import net.minecraft.util.Formatting; // this widget shows various dungeon info // deaths, healing, dmg taken, milestones -public class DungeonDeathWidget extends Widget { +public class DungeonDeathWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Death").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); @@ -33,7 +33,7 @@ public class DungeonDeathWidget extends Widget { this.addComponent(new IcoTextComponent()); } else { Formatting f = (m.group("deathnum").equals("0")) ? Formatting.GREEN : Formatting.RED; - Text d = Widget.simpleEntryText(m.group("deathnum"), "Deaths: ", f); + Text d = HudWidget.simpleEntryText(m.group("deathnum"), "Deaths: ", f); IcoTextComponent deaths = new IcoTextComponent(Ico.SKULL, d); this.addComponent(deaths); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDownedWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDownedWidget.java index 9a8de0eb..365c3d21 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDownedWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonDownedWidget.java @@ -10,7 +10,7 @@ import net.minecraft.util.Formatting; // this widget shows info about... something? // related to downed people in dungeons, not sure what this is supposed to show -public class DungeonDownedWidget extends Widget { +public class DungeonDownedWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Downed").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); @@ -32,7 +32,7 @@ public class DungeonDownedWidget extends Widget { } int idx = down.indexOf(": "); Text downed = (idx == -1) ? null - : Widget.simpleEntryText(down.substring(idx + 2), "Downed: ", format); + : HudWidget.simpleEntryText(down.substring(idx + 2), "Downed: ", format); IcoTextComponent d = new IcoTextComponent(Ico.SKULL, downed); this.addComponent(d); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPlayerWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPlayerWidget.java index d71eb190..0b3f8f10 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPlayerWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPlayerWidget.java @@ -16,7 +16,7 @@ import net.minecraft.util.Formatting; // this widget shows info about a player in the current dungeon group -public class DungeonPlayerWidget extends Widget { +public class DungeonPlayerWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Player").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPuzzleWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPuzzleWidget.java index 53f84f71..42cc06a8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPuzzleWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonPuzzleWidget.java @@ -12,7 +12,7 @@ import net.minecraft.util.Formatting; // this widget shows info about all puzzeles in the dungeon (name and status) -public class DungeonPuzzleWidget extends Widget { +public class DungeonPuzzleWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Puzzles").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java index 359e9ef2..8d28208d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java @@ -11,7 +11,8 @@ import java.util.regex.Pattern; // this widget shows info about the secrets of the dungeon -public class DungeonSecretWidget extends Widget { +public class DungeonSecretWidget extends HudWidget { + private static final MutableText TITLE = Text.literal("Discoveries").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); private static final Pattern DISCOVERIES = Pattern.compile("Discoveries: (\\d+)"); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonServerWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonServerWidget.java index 569987e8..87d9c6fe 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonServerWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/DungeonServerWidget.java @@ -13,7 +13,7 @@ import net.minecraft.util.Formatting; // this widget shows broad info about the current dungeon // opened/completed rooms, % of secrets found and time taken -public class DungeonServerWidget extends Widget { +public class DungeonServerWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Dungeon Info").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EffectWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EffectWidget.java index d1b3a9cd..924289d8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EffectWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EffectWidget.java @@ -12,7 +12,7 @@ import net.minecraft.util.Formatting; // it also shows one of those in detail. // the parsing is super suspect and should be replaced by some regexes sometime later -public class EffectWidget extends Widget { +public class EffectWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Effect Info").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ElectionWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ElectionWidget.java index 8f50f9ff..96557556 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ElectionWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ElectionWidget.java @@ -15,7 +15,7 @@ import net.minecraft.util.Formatting; // this widget shows the status or results of the current election -public class ElectionWidget extends Widget { +public class ElectionWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Election Info").formatted(Formatting.YELLOW, Formatting.BOLD); @@ -71,7 +71,7 @@ public class ElectionWidget extends Widget { this.addComponent(new IcoTextComponent()); } else { String winnername = win.split(": ")[1]; - Text winnertext = Widget.simpleEntryText(winnername, "Winner: ", Formatting.GREEN); + Text winnertext = HudWidget.simpleEntryText(winnername, "Winner: ", Formatting.GREEN); IcoTextComponent winner = new IcoTextComponent(MAYOR_DATA.get(winnername), winnertext); this.addComponent(winner); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EmptyWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EmptyWidget.java index 4c9bcf7f..c21666d2 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EmptyWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EmptyWidget.java @@ -2,7 +2,7 @@ package de.hysky.skyblocker.skyblock.tabhud.widget; import net.minecraft.text.Text; -public class EmptyWidget extends Widget { +public class EmptyWidget extends HudWidget { public EmptyWidget() { super(Text.empty(), 0); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ErrorWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ErrorWidget.java index 85019dbf..fe5d9591 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ErrorWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ErrorWidget.java @@ -8,7 +8,7 @@ import net.minecraft.util.Formatting; // empty widget for when nothing can be shown -public class ErrorWidget extends Widget { +public class ErrorWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Error").formatted(Formatting.RED, Formatting.BOLD); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EssenceWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EssenceWidget.java index d171b753..ff97ed3d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EssenceWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EssenceWidget.java @@ -10,7 +10,7 @@ import net.minecraft.util.Formatting; // this widget shows your dungeon essences (dungeon hub only) -public class EssenceWidget extends Widget { +public class EssenceWidget extends HudWidget { private Text undead, wither, diamond, gold, dragon, spider, ice, crimson; @@ -23,14 +23,14 @@ public class EssenceWidget extends Widget { @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); - dragon = Widget.simpleEntryText(49, "Dragon:", Formatting.DARK_PURPLE); - gold = Widget.simpleEntryText(50, "Gold:", Formatting.DARK_PURPLE); - diamond = Widget.simpleEntryText(51, "Diamond:", Formatting.DARK_PURPLE); - ice = Widget.simpleEntryText(52, "Ice:", Formatting.DARK_PURPLE); - crimson = Widget.simpleEntryText(53, "Crimson:", Formatting.DARK_PURPLE); + wither = HudWidget.simpleEntryText(46, "Wither:", Formatting.DARK_PURPLE); + spider = HudWidget.simpleEntryText(47, "Spider:", Formatting.DARK_PURPLE); + undead = HudWidget.simpleEntryText(48, "Undead:", Formatting.DARK_PURPLE); + dragon = HudWidget.simpleEntryText(49, "Dragon:", Formatting.DARK_PURPLE); + gold = HudWidget.simpleEntryText(50, "Gold:", Formatting.DARK_PURPLE); + diamond = HudWidget.simpleEntryText(51, "Diamond:", Formatting.DARK_PURPLE); + ice = HudWidget.simpleEntryText(52, "Ice:", Formatting.DARK_PURPLE); + crimson = HudWidget.simpleEntryText(53, "Crimson:", Formatting.DARK_PURPLE); TableComponent tc = new TableComponent(2, 4, Formatting.DARK_AQUA.getColorValue()); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EventWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EventWidget.java index 5a1e4239..13092dd1 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EventWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/EventWidget.java @@ -8,7 +8,7 @@ import net.minecraft.util.Formatting; // this widget shows info about ongoing events (e.g. election) -public class EventWidget extends Widget { +public class EventWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Event Info").formatted(Formatting.YELLOW, Formatting.BOLD); private final boolean isInGarden; @@ -27,7 +27,7 @@ public class EventWidget extends Widget { this.addSimpleIcoText(Ico.NTAG, "Name:", Formatting.YELLOW, 73 + offset); // this could look better - Text time = Widget.plainEntryText(74 + offset); + Text time = HudWidget.plainEntryText(74 + offset); IcoTextComponent t = new IcoTextComponent(Ico.CLOCK, time); this.addComponent(t); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java index 715a99bd..a7928b6b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java @@ -16,7 +16,7 @@ import net.minecraft.util.Formatting; // this widget shows info about fire sales when in the hub. // or not, if there isn't one going on -public class FireSaleWidget extends Widget { +public class FireSaleWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Fire Sales").formatted(Formatting.DARK_AQUA, Formatting.BOLD); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ForgeWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ForgeWidget.java index adae7daf..ff20aa86 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ForgeWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ForgeWidget.java @@ -13,7 +13,7 @@ import net.minecraft.util.Formatting; // this widget shows what you're forging right now. // for locked slots, the unlock requirement is shown -public class ForgeWidget extends Widget { +public class ForgeWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Forge Status").formatted(Formatting.DARK_AQUA, Formatting.BOLD); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenServerWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenServerWidget.java index 8b7c08b4..af0b5769 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenServerWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenServerWidget.java @@ -12,7 +12,7 @@ import net.minecraft.util.Formatting; // this widget shows info about the garden server -public class GardenServerWidget extends Widget { +public class GardenServerWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Server Info").formatted(Formatting.DARK_AQUA, Formatting.BOLD); //From the armor trim tooltip @@ -32,7 +32,7 @@ public class GardenServerWidget extends Widget { this.addSimpleIcoText(Ico.NTAG, "Server ID:", Formatting.GRAY, 42); this.addSimpleIcoText(Ico.EMERALD, "Gems:", Formatting.GREEN, 43); - Text copperText = Widget.simpleEntryText(44, "Copper:", Formatting.WHITE); + Text copperText = HudWidget.simpleEntryText(44, "Copper:", Formatting.WHITE); ((MutableText) copperText.getSiblings().getFirst()).withColor(COPPER_COLOR); this.addComponent(new IcoTextComponent(Ico.COPPER, copperText)); @@ -58,7 +58,7 @@ public class GardenServerWidget extends Widget { } else { col = Formatting.GREEN; } - Text visitor = Widget.simpleEntryText(vis, "Next Visitor: ", col); + Text visitor = HudWidget.simpleEntryText(vis, "Next Visitor: ", col); IcoTextComponent v = new IcoTextComponent(Ico.PLAYER, visitor); this.addComponent(v); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenSkillsWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenSkillsWidget.java index 9e1f3989..69631722 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenSkillsWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenSkillsWidget.java @@ -15,7 +15,7 @@ import net.minecraft.util.Formatting; // this widget shows info about your skills while in the garden -public class GardenSkillsWidget extends Widget { +public class GardenSkillsWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Skill Info").formatted(Formatting.YELLOW, Formatting.BOLD); @@ -79,9 +79,9 @@ public class GardenSkillsWidget extends Widget { this.addComponent(glpc); - Text speed = Widget.simpleEntryText(67, "SPD", Formatting.WHITE); + Text speed = HudWidget.simpleEntryText(67, "SPD", Formatting.WHITE); IcoTextComponent spd = new IcoTextComponent(Ico.SUGAR, speed); - Text farmfort = Widget.simpleEntryText(68, "FFO", Formatting.GOLD); + Text farmfort = HudWidget.simpleEntryText(68, "FFO", Formatting.GOLD); IcoTextComponent ffo = new IcoTextComponent(Ico.IRON_HOE, farmfort); TableComponent tc = new TableComponent(2, 1, Formatting.YELLOW.getColorValue()); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenVisitorsWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenVisitorsWidget.java index 2b0036ad..c16c2fc3 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenVisitorsWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GardenVisitorsWidget.java @@ -6,7 +6,7 @@ import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -public class GardenVisitorsWidget extends Widget { +public class GardenVisitorsWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Visitors").formatted(Formatting.DARK_GREEN, Formatting.BOLD); public GardenVisitorsWidget() { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java index bbd97fb5..e06fe6cb 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java @@ -9,7 +9,7 @@ import net.minecraft.util.Formatting; // this widget shows info about the private island you're visiting -public class GuestServerWidget extends Widget { +public class GuestServerWidget extends HudWidget { private static final MutableText TITLE = Text.literal("Island Info").formatted(Formatting.DARK_AQUA, Formatting.BOLD); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java new file mode 100644 index 00000000..8cc7471a --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java @@ -0,0 +1,265 @@ +package de.hysky.skyblocker.skyblock.tabhud.widget; + +import java.util.ArrayList; +import java.util.function.Consumer; + +import com.mojang.blaze3d.systems.RenderSystem; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr; +import de.hysky.skyblocker.skyblock.tabhud.widget.component.Component; +import de.hysky.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.ScreenRect; +import net.minecraft.client.gui.widget.ClickableWidget; +import net.minecraft.client.gui.widget.Widget; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +/** + * Abstract base class for a Widget. + * Widgets are containers for components with a border and a title. + * Their size is dependent on the components inside, + * the position may be changed after construction. + */ +public abstract class HudWidget implements Element, Widget { + + private final ArrayList components = new ArrayList<>(); + protected int w = 0, h = 0; + private int x = 0, y = 0; + private final int color; + private final Text title; + + private static final TextRenderer txtRend = MinecraftClient.getInstance().textRenderer; + + static final int BORDER_SZE_N = txtRend.fontHeight + 4; + static final int BORDER_SZE_S = 4; + static final int BORDER_SZE_W = 4; + static final int BORDER_SZE_E = 4; + static final int COL_BG_BOX = 0xc00c0c0c; + + public HudWidget(MutableText title, Integer colorValue) { + this.title = title; + this.color = 0xff000000 | colorValue; + } + + public void addComponent(Component c) { + this.components.add(c); + } + + 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 + * added as such: + * [ico] [string] [textB.formatted(fmt)] + */ + public final void addSimpleIcoText(ItemStack ico, String string, Formatting fmt, int idx) { + Text txt = HudWidget.simpleEntryText(idx, string, fmt); + this.addComponent(new IcoTextComponent(ico, txt)); + } + + public final void addSimpleIcoText(ItemStack ico, String string, Formatting fmt, String content) { + Text txt = HudWidget.simpleEntryText(content, string, fmt); + this.addComponent(new IcoTextComponent(ico, txt)); + } + + /** + * Calculate the size of this widget. + * Must be called before returning from the widget constructor and after all + * components are added! + */ + private void pack() { + h = 0; + w = 0; + for (Component c : components) { + h += c.getHeight() + Component.PAD_L; + w = Math.max(w, c.getWidth() + Component.PAD_S); + } + + h -= Component.PAD_L / 2; // less padding after lowest/last component + h += BORDER_SZE_N + BORDER_SZE_S - 2; + w += BORDER_SZE_E + BORDER_SZE_W; + + // min width is dependent on title + w = Math.max(w, BORDER_SZE_W + BORDER_SZE_E + HudWidget.txtRend.getWidth(title) + 4 + 4 + 1); + } + + public final int getX() { + return this.x; + } + + public final void setX(int x) { + this.x = x; + } + + public final int getY() { + return this.y; + } + + public final void setY(int y) { + this.y = y; + } + + public final int getWidth() { + return this.w; + } + + public void setWidth(int width) { + this.w = width; + } + + public final int getHeight() { + return this.h; + } + + @Override + public void forEachChild(Consumer consumer) { + + } + + public void setHeight(int height) { + this.h = height; + } + + public void setDimensions(int size) { + setDimensions(size, size); + } + + public void setDimensions(int width, int height) { + this.w = width; + this.h = height; + } + + /** + * Draw this widget with a background + */ + public final void render(DrawContext context) { + this.render(context, true); + } + + /** + * Draw this widget, possibly with a background + */ + public final void render(DrawContext context, boolean hasBG) { + MatrixStack ms = context.getMatrices(); + + // not sure if this is the way to go, but it fixes Z-layer issues + // like blocks being rendered behind the BG and the hotbar clipping into things + RenderSystem.enableDepthTest(); + ms.push(); + + float scale = SkyblockerConfigManager.get().uiAndVisuals.tabHud.tabHudScale / 100f; + ms.scale(scale, scale, 1); + + // move above ot