aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java2
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java14
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java98
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java23
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/TabHud.java17
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java186
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java150
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/AlignStage.java95
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CollideStage.java161
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PipelineStage.java14
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PlaceStage.java94
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/StackStage.java119
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/EmptyScreen.java16
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java230
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GardenInfoScreen.java51
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericInfoScreen.java48
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericRiftInfoScreen.java38
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/CrimsonIsleScreen.java32
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/DungeonHubScreen.java25
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/DungeonScreen.java40
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/FarmingServerScreen.java26
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/GardenScreen.java30
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/GenericServerScreen.java21
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/GuestServerScreen.java22
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/HomeServerScreen.java26
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/HubServerScreen.java26
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/MineServerScreen.java30
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/ParkServerScreen.java19
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/RiftScreen.java28
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/playerList/DungeonPlayerScreen.java29
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/playerList/GuestPlayerScreen.java26
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/playerList/HomePlayerScreen.java25
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/playerList/PlayerListScreen.java20
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerListMgr.java9
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerLocator.java48
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/ScreenConst.java13
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CameraPositionWidget.java47
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CommsWidget.java34
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ComposterWidget.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CookieWidget.java10
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonBuffWidget.java12
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonDeathWidget.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonDownedWidget.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonPlayerWidget.java8
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonPuzzleWidget.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonServerWidget.java5
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EffectWidget.java13
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ElectionWidget.java5
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ErrorWidget.java (renamed from src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EmptyWidget.java)20
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EssenceWidget.java5
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EventWidget.java7
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java6
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ForgeWidget.java6
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GardenServerWidget.java5
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GardenSkillsWidget.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GardenVisitorsWidget.java37
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandGuestsWidget.java5
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandOwnersWidget.java7
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandSelfWidget.java12
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandServerWidget.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/JacobsContestWidget.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/MinionWidget.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ParkServerWidget.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java10
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PowderWidget.java5
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ProfileWidget.java5
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/QuestWidget.java5
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ReputationWidget.java5
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ServerWidget.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/SkillsWidget.java5
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/TrapperWidget.java5
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/UpgradeWidget.java12
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/VolcanoWidget.java6
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/Widget.java35
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/Component.java1
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/hud/HudCommsWidget.java73
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/AdvertisementWidget.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/GoodToKnowWidget.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProfileWidget.java6
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftProgressWidget.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftServerInfoWidget.java7
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/RiftStatsWidget.java6
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/rift/ShenWidget.java6
-rw-r--r--src/main/resources/assets/skyblocker/lang/en_us.json4
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/readme.md186
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/screen_a/default.json70
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/screen_a/garden.json70
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/screen_a/rift.json48
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/screen_a/unknown.json17
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/screen_b/default.json17
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/screen_b/dungeon.json53
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/screen_b/garden.json29
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/screen_b/guest_island.json29
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/screen_b/home_island.json29
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/screen_b/unknown.json17
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/standard/crimson_isle.json44
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/standard/crystal_hollows.json44
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/standard/default.json17
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/standard/dungeon.json52
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/standard/dungeon_hub.json25
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/standard/dwarven_mines.json44
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/standard/farming_island.json25
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/standard/garden.json44
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/standard/guest_island.json17
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/standard/home_island.json29
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/standard/hub.json25
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/standard/park.json17
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/standard/rift.json39
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/standard/unknown.json17
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/version.json1
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_a/default.json70
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_a/garden.json70
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_a/rift.json48
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_a/unknown.json17
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/default.json17
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/dungeon.json54
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/garden.json29
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/guest_island.json29
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/home_island.json29
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/unknown.json17
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/crimson_isle.json44
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/crystal_hollows.json44
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/default.json17
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/dungeon.json69
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/dungeon_hub.json30
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/dwarven_mines.json44
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/farming_island.json29
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/garden.json44
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/guest_island.json17
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/home_island.json29
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/hub.json29
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/park.json17
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/rift.json39
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/unknown.json17
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/version.json1
-rw-r--r--src/main/resources/resourcepacks/default_top/pack.mcmeta6
-rw-r--r--src/main/resources/resourcepacks/default_top/pack.pngbin0 -> 844 bytes
139 files changed, 3158 insertions, 1054 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
index 4ec579ae..fe05e793 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
@@ -21,6 +21,7 @@ import me.xmrvizzy.skyblocker.skyblock.quicknav.QuickNav;
import me.xmrvizzy.skyblocker.skyblock.rift.TheRift;
import me.xmrvizzy.skyblocker.skyblock.shortcut.Shortcuts;
import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud;
+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.culling.OcclusionCulling;
@@ -89,6 +90,7 @@ public class SkyblockerMod implements ClientModInitializer {
DungeonMap.init();
TheRift.init();
TitleContainer.init();
+ ScreenMaster.init();
OcclusionCulling.init();
TeleportOverlay.init();
CustomItemNames.init();
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java
index 819ddb4b..ec7b6ddd 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java
@@ -2,7 +2,8 @@ package me.xmrvizzy.skyblocker.mixin;
import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.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;
@@ -37,9 +38,16 @@ public class PlayerListHudMixin {
}
int h = MinecraftClient.getInstance().getWindow().getScaledHeight();
+ float scale = SkyblockerConfig.get().general.tabHud.tabHudScale / 100f;
+ w = (int) (w / scale);
+ h = (int) (h / scale);
+
+ PlayerListMgr.updateFooter(footer);
+
try {
- Screen screen = Screen.getCorrect(w, h, footer);
- screen.render(context);
+ ScreenMaster.render(context, w,h);
+ // Screen screen = Screen.getCorrect(w, h, footer);
+ // screen.render(context);
info.cancel();
} catch (Exception e) {
TabHud.LOGGER.error("[Skyblocker] Encountered unknown exception while drawing default hud", e);
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 a52f288c..8e9f0b26 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java
@@ -1,7 +1,15 @@
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 it.unimi.dsi.fastutil.ints.IntIntPair;
import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.CommsWidget;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.hud.HudCommsWidget;
import me.xmrvizzy.skyblocker.utils.Scheduler;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
@@ -11,34 +19,24 @@ import net.minecraft.client.gui.DrawContext;
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<Commission> commissionList = new ArrayList<>();
-
public static final List<Pattern> COMMISSIONS = Stream.of(
- "(?:Titanium|Mithril|Hard Stone) Miner",
- "(?:Ice Walker|Goblin|Goblin Raid|Automaton|Sludge|Team Treasurite Member|Yog|Boss Corleone|Thyst) Slayer",
- "(?:Lava Springs|Cliffside Veins|Rampart's Quarry|Upper Mines|Royal Mines) Mithril",
- "(?:Lava Springs|Cliffside Veins|Rampart's Quarry|Upper Mines|Royal Mines) Titanium",
- "Goblin Raid",
- "(?:Powder Ghast|Star Sentry) Puncher",
- "(?<!Lucky )Raffle",
- "Lucky Raffle",
- "2x Mithril Powder Collector",
- "(?:Ruby|Amber|Sapphire|Jade|Amethyst|Topaz) Gemstone Collector",
- "(?:Amber|Sapphire|Jade|Amethyst|Topaz) Crystal Hunter",
- "Chest Looter"
- ).map(s -> Pattern.compile("^.*(" + s + "): (\\d+\\.?\\d*%|DONE)"))
+ "(?:Titanium|Mithril|Hard Stone) Miner",
+ "(?:Ice Walker|Goblin|Goblin Raid|Automaton|Sludge|Team Treasurite Member|Yog|Boss Corleone|Thyst) Slayer",
+ "(?:Lava Springs|Cliffside Veins|Rampart's Quarry|Upper Mines|Royal Mines) Mithril",
+ "(?:Lava Springs|Cliffside Veins|Rampart's Quarry|Upper Mines|Royal Mines) Titanium",
+ "Goblin Raid",
+ "(?:Powder Ghast|Star Sentry) Puncher",
+ "(?<!Lucky )Raffle",
+ "Lucky Raffle",
+ "2x Mithril Powder Collector",
+ "(?:Ruby|Amber|Sapphire|Jade|Amethyst|Topaz) Gemstone Collector",
+ "(?:Amber|Sapphire|Jade|Amethyst|Topaz) Crystal Hunter",
+ "Chest Looter").map(s -> Pattern.compile("^.*(" + s + "): (\\d+\\.?\\d*%|DONE)"))
.collect(Collectors.toList());
public static void init() {
@@ -54,15 +52,34 @@ public class DwarvenHud {
|| commissionList.isEmpty()) {
return;
}
- render(context, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.x, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.y, commissionList);
+ render(HudCommsWidget.INSTANCE, context, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.x,
+ SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.y, commissionList);
});
}
- public static void render(DrawContext context, int hudX, int hudY, List<Commission> commissions) {
+ public static IntIntPair getDimForConfig(List<Commission> commissions) {
+ switch (SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.style) {
+ case SIMPLE:
+ HudCommsWidget.INSTANCE_CFG.updateData(commissions, false);
+ return IntIntPair.of(
+ HudCommsWidget.INSTANCE_CFG.getWidth(),
+ HudCommsWidget.INSTANCE_CFG.getHeight());
+ case FANCY :
+ HudCommsWidget.INSTANCE_CFG.updateData(commissions, true);
+ return IntIntPair.of(
+ HudCommsWidget.INSTANCE_CFG.getWidth(),
+ HudCommsWidget.INSTANCE_CFG.getHeight());
+ case CLASSIC:
+ default:
+ return IntIntPair.of(200, 20 * commissions.size());
+ }
+ }
+
+ public static void render(HudCommsWidget hcw, DrawContext context, int hudX, int hudY, List<Commission> commissions) {
switch (SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.style) {
- case SIMPLE -> renderSimple(context, hudX, hudY, commissions);
- case FANCY -> renderFancy(context, hudX, hudY, commissions);
+ case SIMPLE -> renderSimple(hcw, context, hudX, hudY, commissions);
+ case FANCY -> renderFancy(hcw, context, hudX, hudY, commissions);
case CLASSIC -> renderClassic(context, hudX, hudY, commissions);
}
}
@@ -85,23 +102,28 @@ public class DwarvenHud {
}
}
- public static void renderSimple(DrawContext context, int hudX, int hudY, List<Commission> commissions) {
- CommsWidget cw = new CommsWidget(commissions, false);
- cw.setX(hudX);
- cw.setY(hudY);
- cw.render(context, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground);
+ public static void renderSimple(HudCommsWidget hcw, DrawContext context, int hudX, int hudY, List<Commission> commissions) {
+ hcw.updateData(commissions, false);
+ hcw.update();
+ hcw.setX(hudX);
+ hcw.setY(hudY);
+ hcw.render(context,
+ SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground);
}
- public static void renderFancy(DrawContext context, int hudX, int hudY, List<Commission> commissions) {
- CommsWidget cw = new CommsWidget(commissions, true);
- cw.setX(hudX);
- cw.setY(hudY);
- cw.render(context, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground);
+ public static void renderFancy(HudCommsWidget hcw, DrawContext context, int hudX, int hudY, List<Commission> commissions) {
+ hcw.updateData(commissions, true);
+ hcw.update();
+ hcw.setX(hudX);
+ hcw.setY(hudY);
+ hcw.render(context,
+ SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground);
}
public static void update() {
commissionList = new ArrayList<>();
- if (client.player == null || !SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enabled) return;
+ if (client.player == null || !SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enabled)
+ return;
client.getNetworkHandler().getPlayerList().forEach(playerListEntry -> {
if (playerListEntry.getDisplayName() != null) {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java
index 10e62d88..d3c0fa76 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java
@@ -1,17 +1,22 @@
package me.xmrvizzy.skyblocker.skyblock.dwarven;
+import java.awt.Color;
+import java.util.List;
+
+import it.unimi.dsi.fastutil.ints.IntIntPair;
import me.shedaniel.autoconfig.AutoConfig;
import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHud.Commission;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.hud.HudCommsWidget;
import me.xmrvizzy.skyblocker.utils.RenderUtils;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.text.Text;
-import java.awt.*;
-import java.util.List;
-
public class DwarvenHudConfigScreen extends Screen {
+ private static final List<Commission> CFG_COMMS = List.of(new DwarvenHud.Commission("Test Commission 1", "1%"), new DwarvenHud.Commission("Test Commission 2", "2%"));
+
private int hudX = SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.x;
private int hudY = SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.y;
@@ -23,15 +28,16 @@ public class DwarvenHudConfigScreen extends Screen {
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
super.render(context, mouseX, mouseY, delta);
renderBackground(context);
- DwarvenHud.render(context, hudX, hudY, List.of(new DwarvenHud.Commission("Test Commission 1", "1%"), new DwarvenHud.Commission("Test Commission 2", "2%")));
+ DwarvenHud.render(HudCommsWidget.INSTANCE_CFG, context, hudX, hudY, List.of(new DwarvenHud.Commission("Test Commission 1", "1%"), new DwarvenHud.Commission("Test Commission 2", "2%")));
context.drawCenteredTextWithShadow(textRenderer, "Right Click To Reset Position", width / 2, height / 2, Color.GRAY.getRGB());
}
@Override
public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
+ IntIntPair dims = DwarvenHud.getDimForConfig(CFG_COMMS);
if (RenderUtils.pointExistsInArea((int) mouseX, (int) mouseY, hudX, hudY, hudX + 200, hudY + 40) && button == 0) {
- hudX = (int) Math.max(Math.min(mouseX - 100, this.width - 200), 0);
- hudY = (int) Math.max(Math.min(mouseY - 20, this.height - 40), 0);
+ hudX = (int) Math.max(Math.min(mouseX - dims.leftInt()/2, this.width - dims.leftInt()), 0);
+ hudY = (int) Math.max(Math.min(mouseY - dims.rightInt()/2, this.height - dims.rightInt()), 0);
}
return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY);
}
@@ -39,8 +45,9 @@ public class DwarvenHudConfigScreen extends Screen {
@Override
public boolean mouseClicked(double mouseX, double mouseY, int button) {
if (button == 1) {
- hudX = this.width / 2 - 100;
- hudY = this.height / 2 - 20;
+ IntIntPair dims = DwarvenHud.getDimForConfig(CFG_COMMS);
+ hudX = this.width / 2 - dims.leftInt();
+ hudY = this.height / 2 - dims.rightInt();
}
return super.mouseClicked(mouseX, mouseY, button);
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/TabHud.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/TabHud.java
index 6d90b269..8f18e367 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/TabHud.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/TabHud.java
@@ -10,8 +10,8 @@ import net.minecraft.client.util.InputUtil;
public class TabHud {
- public static KeyBinding playerTgl;
- public static KeyBinding genericTgl;
+ public static KeyBinding toggleB;
+ public static KeyBinding toggleA;
// public static KeyBinding mapTgl;
public static KeyBinding defaultTgl;
@@ -19,21 +19,16 @@ public class TabHud {
public static void init() {
- playerTgl = KeyBindingHelper.registerKeyBinding(
- new KeyBinding("key.skyblocker.playerTgl",
+ toggleB = KeyBindingHelper.registerKeyBinding(
+ new KeyBinding("key.skyblocker.toggleB",
InputUtil.Type.KEYSYM,
GLFW.GLFW_KEY_B,
"key.categories.skyblocker"));
- genericTgl = KeyBindingHelper.registerKeyBinding(
- new KeyBinding("key.skyblocker.genericTgl",
+ toggleA = KeyBindingHelper.registerKeyBinding(
+ new KeyBinding("key.skyblocker.toggleA",
InputUtil.Type.KEYSYM,
GLFW.GLFW_KEY_N,
"key.categories.skyblocker"));
- // mapTgl = KeyBindingHelper.registerKeyBinding(
- // new KeyBinding("key.tabhud.mapTgl",
- // InputUtil.Type.KEYSYM,
- // GLFW.GLFW_KEY_LEFT_ALT,
- // "key.categories.skyblocker"));
defaultTgl = KeyBindingHelper.registerKeyBinding(
new KeyBinding("key.skyblocker.defaultTgl",
InputUtil.Type.KEYSYM,
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..76b675ce
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java
@@ -0,0 +1,186 @@
+package me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder;
+
+import java.io.BufferedReader;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.NoSuchElementException;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+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.DungeonPlayerWidget;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ErrorWidget;
+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<PipelineStage> layoutPipeline = new ArrayList<>();
+
+ // all widget instances this builder knows
+ private ArrayList<Widget> instances = new ArrayList<>();
+ // maps alias -> widget instance
+ private HashMap<String, Widget> objectMap = new HashMap<>();
+
+ private String builderName;
+
+ /**
+ * Create a ScreenBuilder from a json.
+ */
+ public ScreenBuilder(Identifier ident) {
+
+ try (BufferedReader reader = MinecraftClient.getInstance().getResourceManager().openAsReader(ident);) {
+ this.builderName = ident.getPath();
+
+ JsonObject json = JsonParser.parseReader(reader).getAsJsonObject();
+
+ 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) {
+ PipelineStage ps = createStage(l.getAsJsonObject());
+ layoutPipeline.add(ps);
+ }
+ } catch (Exception ex) {
+ // rethrow as unchecked exception so that I don't have to catch anything in the ScreenMaster
+ throw new IllegalStateException("Failed to load file " + ident + ". Reason: " + ex.getMessage());
+ }
+ }
+
+ /**
+ * 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
+ JsonElement arg;
+ switch (name) {
+ case "EventWidget":
+ return new EventWidget(widget.get("inGarden").getAsBoolean());
+
+ case "DungeonPlayerWidget":
+ return new DungeonPlayerWidget(widget.get("player").getAsInt());
+
+ case "ErrorWidget":
+ arg = widget.get("text");
+ if (arg == null) {
+ return new ErrorWidget();
+ } else {
+ return new ErrorWidget(arg.getAsString());
+ }
+
+ case "Widget":
+ // clown case sanity check. don't instantiate the superclass >:|
+ throw new NoSuchElementException(builderName + "[ERROR]: No such Widget type \"Widget\"!");
+ }
+
+ // 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
+
+ // list all packages that might contain widget classes
+ // using Package isn't reliable, as some classes might not be loaded yet,
+ // causing the packages not to show.
+ String packbase = "me.xmrvizzy.skyblocker.skyblock.tabhud.widget";
+ String[] packnames = {
+ packbase,
+ packbase + ".rift"
+ };
+
+ // 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) {
+ throw new NoSuchElementException(builderName + "/[ERROR]: No such Widget type \"" + name + "\"!");
+ }
+
+ // return instance of that class.
+ try {
+ Constructor<?> ctor = clazz.getConstructor();
+ return (Widget) ctor.newInstance();
+ } catch (NoSuchMethodException | InstantiationException | IllegalAccessException
+ | IllegalArgumentException | InvocationTargetException | SecurityException ex) {
+ throw new IllegalStateException(builderName + "/" + name + ": Internal error...");
+ }
+ }
+
+ /**
+ * Create a PipelineStage from a json object.
+ */
+ public PipelineStage createStage(JsonObject descr) throws NoSuchElementException {
+
+ 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);
+ default:
+ throw new NoSuchElementException("No such op " + op + " as requested by " + this.builderName);
+ }
+ }
+
+ /**
+ * Lookup Widget instance from alias name
+ */
+ public Widget getInstance(String name) {
+ if (!this.objectMap.containsKey(name)) {
+ throw new NoSuchElementException("No widget with alias " + name + " in screen " + builderName);
+ }
+ return this.objectMap.get(name);
+ }
+
+ /**
+ * Run the pipeline to build a Screen
+ */
+ public void run(DrawContext context, int screenW, int screenH) {
+
+ 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..165e875d
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java
@@ -0,0 +1,150 @@
+package me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder;
+
+import java.io.BufferedReader;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.pipeline.PipelineStage;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerLocator;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget;
+import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
+import net.fabricmc.fabric.api.resource.ResourcePackActivationType;
+import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener;
+import net.fabricmc.loader.api.FabricLoader;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.resource.Resource;
+import net.minecraft.resource.ResourceManager;
+import net.minecraft.resource.ResourceType;
+import net.minecraft.util.Identifier;
+
+public class ScreenMaster {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger("skyblocker");
+
+ private static final int VERSION = 1;
+
+ private static HashMap<String, ScreenBuilder> standardMap = new HashMap<>();
+ private static HashMap<String, ScreenBuilder> screenAMap = new HashMap<>();
+ private static HashMap<String, ScreenBuilder> screenBMap = new HashMap<>();
+
+ /**
+ * Load a screen mapping from an identifier
+ */
+ public static void load(Identifier ident) {
+
+ String path = ident.getPath();
+ String[] parts = path.split("/");
+ String screenType = parts[parts.length - 2];
+ String location = parts[parts.length - 1];
+ location = location.replace(".json", "");
+
+ ScreenBuilder sb = new ScreenBuilder(ident);
+ if (screenType.equals("standard")) {
+ standardMap.put(location, sb);
+ } else if (screenType.equals("screen_a")) {
+ screenAMap.put(location, sb);
+ } else if (screenType.equals("screen_b")) {
+ screenBMap.put(location, sb);
+ }
+ }
+
+ /**
+ * Top level render method.
+ * Calls the appropriate ScreenBuilder with the screen's dimensions
+ */
+ public static void render(DrawContext context, int w, int h) {
+ String location = PlayerLocator.getPlayerLocation().internal;
+ HashMap<String, ScreenBuilder> lookup;
+ if (TabHud.toggleA.isPressed()) {
+ lookup = screenAMap;
+ } else if (TabHud.toggleB.isPressed()) {
+ lookup = screenBMap;
+ } else {
+ lookup = standardMap;
+ }
+
+ ScreenBuilder sb = lookup.get(location);
+ // seems suboptimal, maybe load the default first into all possible values
+ // and then override?
+ if (sb == null) {
+ sb = lookup.get("default");
+ }
+
+ sb.run(context, w, h);
+
+ }
+
+ public static void init() {
+
+ // WHY MUST IT ALWAYS BE SUCH NESTED GARBAGE MINECRAFT KEEP THAT IN DFU FFS
+
+ FabricLoader.getInstance()
+ .getModContainer("skyblocker")
+ .ifPresent(container -> ResourceManagerHelper.registerBuiltinResourcePack(
+ new Identifier("skyblocker", "default_top"),
+ container,
+ ResourcePackActivationType.NORMAL));
+
+ ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(
+ // ...why are we instantiating an interface again?
+ new SimpleSynchronousResourceReloadListener() {
+ @Override
+ public Identifier getFabricId() {
+ return new Identifier("skyblocker", "tabhud");
+ }
+
+ @Override
+ public void reload(ResourceManager manager) {
+
+ standardMap.clear();
+ screenAMap.clear();
+ screenBMap.clear();
+
+ int excnt = 0;
+
+ for (Map.Entry<Identifier, Resource> entry : manager
+ .findResources("tabhud", path -> path.getPath().endsWith("version.json"))
+ .entrySet()) {
+
+ try (BufferedReader reader = MinecraftClient.getInstance().getResourceManager()
+ .openAsReader(entry.getKey());) {
+ JsonObject json = JsonParser.parseReader(reader).getAsJsonObject();
+ if (json.get("format_version").getAsInt() != VERSION) {
+ throw new IllegalStateException(String.format("Resource pack isn't compatible! Expected version %d, got %d", VERSION, json.get("format_version").getAsInt()));
+ }
+
+ } catch (Exception ex) {
+ throw new IllegalStateException(
+ "Rejected this resource pack. Reason: " + ex.getMessage());
+ }
+ }
+
+ for (Map.Entry<Identifier, Resource> entry : manager
+ .findResources("tabhud", path -> path.getPath().endsWith(".json") && !path.getPath().endsWith("version.json"))
+ .entrySet()) {
+ try {
+
+ load(entry.getKey());
+ } catch (Exception e) {
+ LOGGER.error(e.getMessage());
+ excnt++;
+ }
+ }
+ if (excnt > 0) {
+ throw new IllegalStateException("This screen definition isn't valid, see above");
+ }
+ }
+ });
+ }
+
+}
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..74ebed64
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/AlignStage.java
@@ -0,0 +1,95 @@
+package me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.pipeline;
+
+import java.util.ArrayList;
+import java.util.NoSuchElementException;
+
+import com.google.gson.JsonObject;
+
+import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.ScreenBuilder;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.util.ScreenConst;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget;
+
+public class AlignStage extends PipelineStage {
+
+ private enum AlignReference {
+ HORICENT("horizontalCenter"),
+ VERTCENT("verticalCenter"),
+ LEFTCENT("leftOfCenter"),
+ RIGHTCENT("rightOfCenter"),
+ TOPCENT("topOfCenter"),
+ BOTCENT("botOfCenter"),
+ TOP("top"),
+ BOT("bot"),
+ LEFT("left"),
+ RIGHT("right");
+
+ private final String str;
+
+ private AlignReference(String d) {
+ this.str = d;
+ }
+
+ public static AlignReference parse(String s) throws NoSuchElementException {
+ for (AlignReference d : AlignReference.values()) {
+ if (d.str.equals(s)) {
+ return d;
+ }
+ }
+ throw new NoSuchElementException("\"" + s + "\" is not a valid reference for an align op!");
+ }
+ }
+
+ private AlignReference reference;
+
+ public AlignStage(ScreenBuilder builder, JsonObject descr) {
+ this.reference = AlignReference.parse(descr.get("reference").getAsString());
+ this.primary = new ArrayList<Widget>(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 HORICENT:
+ wid.setX((screenW - wid.getWidth()) / 2);
+ break;
+ case VERTCENT:
+ wid.setY((screenH - wid.getHeight()) / 2);
+ break;
+ case LEFTCENT:
+ wHalf = screenW / 2;
+ wid.setX(wHalf - ScreenConst.WIDGET_PAD_HALF - wid.getWidth());
+ break;
+ case RIGHTCENT:
+ wHalf = screenW / 2;
+ wid.setX(wHalf + ScreenConst.WIDGET_PAD_HALF);
+ break;
+ case TOPCENT:
+ hHalf = screenH / 2;
+ wid.setY(hHalf - ScreenConst.WIDGET_PAD_HALF - wid.getHeight());
+ break;
+ case BOTCENT:
+ hHalf = screenH / 2;
+ wid.setY(hHalf + ScreenConst.WIDGET_PAD_HALF);
+ break;
+ case TOP:
+ wid.setY(ScreenConst.getScreenPad());
+ break;
+ case BOT:
+ wid.setY(screenH - wid.getHeight() - ScreenConst.getScreenPad());
+ break;
+ case LEFT:
+ wid.setX(ScreenConst.getScreenPad());
+ break;
+ case RIGHT:
+ wid.setX(screenW - wid.getWidth() - ScreenConst.getScreenPad());
+ 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..30031c93
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CollideStage.java
@@ -0,0 +1,161 @@
+package me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.pipeline;
+
+import java.util.ArrayList;
+import java.util.NoSuchElementException;
+
+import com.google.gson.JsonObject;
+
+import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.ScreenBuilder;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.util.ScreenConst;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget;
+
+public class CollideStage extends PipelineStage {
+
+ private enum CollideDirection {
+ LEFT("left"),
+ RIGHT("right"),
+ TOP("top"),
+ BOT("bot");
+
+ private final String str;
+
+ private CollideDirection(String d) {
+ this.str = d;
+ }
+
+ public static CollideDirection parse(String s) throws NoSuchElementException {
+ for (CollideDirection d : CollideDirection.values()) {
+ if (d.str.equals(s)) {
+ return d;
+ }
+ }
+ throw new NoSuchElementException("\"" + s + "\" is not a valid direction for a collide op!");
+ }
+ }
+
+ private CollideDirection direction;
+
+ public CollideStage(ScreenBuilder builder, JsonObject descr) {
+ this.direction = CollideDirection.parse(descr.get("direction").getAsString());
+ this.primary = new ArrayList<Widget>(descr.getAsJsonArray("widgets")
+ .asList()
+ .stream()
+ .map(x -> builder.getInstance(x.getAsString()))
+ .toList());
+ this.secondary = new ArrayList<Widget>(descr.getAsJsonArray("colliders")
+ .asList()
+ .stream()
+ .map(x -> builder.getInstance(x.getAsString()))
+ .toList());
+ }
+
+ public void run(int screenW, int screenH) {
+ switch (this.direction) {
+ case LEFT:
+ primary.forEach(w -> collideAgainstL(screenW, w));
+ break;
+ case RIGHT:
+ primary.forEach(w -> collideAgainstR(screenW, w));
+ break;
+ case TOP:
+ primary.forEach(w -> collideAgainstT(screenH, w));
+ break;
+ case BOT:
+ primary.forEach(w -> collideAgainstB(screenH, w));
+ break;
+ }
+ }
+
+ public void collideAgainstL(int screenW, Widget w) {
+ int yMin = w.getY();
+ int yMax = w.getY() + w.getHeight();
+
+ int xCor = screenW;
+
+ for (Widget other : secondary) {
+ if (other.getY() + other.getHeight() + ScreenConst.WIDGET_PAD < yMin) {
+ // too high, next one
+ continue;
+ }
+
+ if (other.getY() - ScreenConst.WIDGET_PAD > yMax) {
+ // too low, next
+ continue;
+ }
+
+ int xPos = other.getX() - ScreenConst.WIDGET_PAD - 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 = 0;
+
+ for (Widget other : secondary) {
+ if (other.getY() + other.getHeight() + ScreenConst.WIDGET_PAD < yMin) {
+ // too high, next one
+ continue;
+ }
+
+ if (other.getY() - ScreenConst.WIDGET_PAD > yMax) {
+ // too low, next
+ continue;
+ }
+
+ int xPos = other.getX() + other.getWidth() + ScreenConst.WIDGET_PAD;
+ xCor = Math.max(xCor, xPos);
+ }
+ w.setX(xCor);
+ }
+
+ public void collideAgainstT(int screenH, Widget w) {
+ int xMin = w.getX();
+ int xMax = w.getX() + w.getWidth();
+
+ int yCor = screenH;
+
+ for (Widget other : secondary) {
+ if (other.getX() + other.getWidth() + ScreenConst.WIDGET_PAD < xMin) {
+ // too far left, next one
+ continue;
+ }
+
+ if (other.getX() - ScreenConst.WIDGET_PAD > xMax) {
+ // too far right, next
+ continue;
+ }
+
+ int yPos = other.getY() - ScreenConst.WIDGET_PAD - w.getHeight();
+ yCor = Math.min(yCor, yPos);
+ }
+ w.setY(yCor);
+ }
+
+ public void collideAgainstB(int screenH, Widget w) {
+ int xMin = w.getX();
+ int xMax = w.getX() + w.getWidth();
+
+ int yCor = 0;
+
+ for (Widget other : secondary) {
+ if (other.getX() + other.getWidth() + ScreenConst.WIDGET_PAD < xMin) {
+ // too far left, next one
+ continue;
+ }
+
+ if (other.getX() - ScreenConst.WIDGET_PAD > xMax) {
+ // too far right, next
+ continue;
+ }
+
+ int yPos = other.getY() + other.getHeight() + ScreenConst.WIDGET_PAD;
+ yCor = Math.max(yCor, yPos);
+ }
+ w.setY(yCor);
+ }
+
+}
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<Widget> primary = null;
+ protected ArrayList<Widget> 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..31a27001
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PlaceStage.java
@@ -0,0 +1,94 @@
+package me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.pipeline;
+
+import java.util.ArrayList;
+import java.util.NoSuchElementException;
+
+import com.google.gson.JsonObject;
+
+import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.ScreenBuilder;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.util.ScreenConst;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget;
+
+public class PlaceStage extends PipelineStage {
+
+ private enum PlaceLocation {
+ CENTER("center"),
+ TOPCENT("centerTop"),
+ BOTCENT("centerBot"),
+ LEFTCENT("centerLeft"),
+ RIGHTCENT("centerRight"),
+ TRCORNER("cornerTopRight"),
+ TLCORNER("cornerTopLeft"),
+ BRCORNER("cornerBotRight"),
+ BLCORNER("cornerBotLeft");
+
+ private final String str;
+
+ private PlaceLocation(String d) {
+ this.str = d;
+ }
+
+ public static PlaceLocation parse(String s) throws NoSuchElementException {
+ for (PlaceLocation d : PlaceLocation.values()) {
+ if (d.str.equals(s)) {
+ return d;
+ }
+ }
+ throw new NoSuchElementException("\"" + s + "\" is not a valid location for a place op!");
+ }
+ }
+
+ private PlaceLocation where;
+
+ public PlaceStage(ScreenBuilder builder, JsonObject descr) {
+ this.where = PlaceLocation.parse(descr.get("where").getAsString());
+ this.primary = new ArrayList<Widget>(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);
+ switch (where) {
+ case CENTER:
+ wid.setX((screenW - wid.getWidth()) / 2);
+ wid.setY((screenH - wid.getHeight()) / 2);
+ break;
+ case TOPCENT:
+ wid.setX((screenW - wid.getWidth()) / 2);
+ wid.setY(ScreenConst.getScreenPad());
+ break;
+ case BOTCENT:
+ wid.setX((screenW - wid.getWidth()) / 2);
+ wid.setY((screenH - wid.getHeight()) - ScreenConst.getScreenPad());
+ break;
+ case LEFTCENT:
+ wid.setX(ScreenConst.getScreenPad());
+ wid.setY((screenH - wid.getHeight()) / 2);
+ break;
+ case RIGHTCENT:
+ wid.setX((screenW - wid.getWidth()) - ScreenConst.getScreenPad());
+ wid.setY((screenH - wid.getHeight()) / 2);
+ break;
+ case TLCORNER:
+ wid.setX(ScreenConst.getScreenPad());
+ wid.setY(ScreenConst.getScreenPad());
+ break;
+ case TRCORNER:
+ wid.setX((screenW - wid.getWidth()) - ScreenConst.getScreenPad());
+ wid.setY(ScreenConst.getScreenPad());
+ break;
+ case BLCORNER:
+ wid.setX(ScreenConst.getScreenPad());
+ wid.setY((screenH - wid.getHeight()) - ScreenConst.getScreenPad());
+ break;
+ case BRCORNER:
+ wid.setX((screenW - wid.getWidth()) - ScreenConst.getScreenPad());
+ wid.setY((screenH - wid.getHeight()) - ScreenConst.getScreenPad());
+ break;
+ }
+ }
+} \ 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..b32a3cca
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/pipeline/StackStage.java
@@ -0,0 +1,119 @@
+package me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.pipeline;
+
+import java.util.ArrayList;
+import java.util.NoSuchElementException;
+
+import com.google.gson.JsonObject;
+
+import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.ScreenBuilder;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.util.ScreenConst;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget;
+
+public class StackStage extends PipelineStage {
+
+ private enum StackDirection {
+ HORIZONTAL("horizontal"),
+ VERTICAL("vertical");
+
+ private final String str;
+
+ private StackDirection(String d) {
+ this.str = d;
+ }
+
+ public static StackDirection parse(String s) throws NoSuchElementException {
+ for (StackDirection d : StackDirection.values()) {
+ if (d.str.equals(s)) {
+ return d;
+ }
+ }
+ throw new NoSuchElementException("\"" + s + "\" is not a valid direction for a stack op!");
+ }
+ }
+
+ private enum StackAlign {
+ TOP("top"),
+ BOT("bot"),
+ LEFT("left"),
+ RIGHT("right"),
+ CENTER("center");
+
+ private final String str;
+
+ private StackAlign(String d) {
+ this.str = d;
+ }
+
+ public static StackAlign parse(String s) throws NoSuchElementException {
+ for (StackAlign d : StackAlign.values()) {
+ if (d.str.equals(s)) {
+ return d;
+ }
+ }
+ throw new NoSuchElementException("\"" + s + "\" is not a valid alignment for a stack op!");
+ }
+ }
+
+ private StackDirection direction;
+ private StackAlign align;
+
+ public StackStage(ScreenBuilder builder, JsonObject descr) {
+ this.direction = StackDirection.parse(descr.get("direction").getAsString());
+ this.align = StackAlign.parse(descr.get("align").getAsString());
+ this.primary = new ArrayList<Widget>(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 = -ScreenConst.WIDGET_PAD;
+ for (Widget wid : primary) {
+ compHeight += wid.getHeight() + 5;
+ }
+
+ int y = switch (this.align) {
+
+ case TOP -> y = ScreenConst.getScreenPad();
+ case BOT -> y = (screenH - compHeight) - ScreenConst.getScreenPad();
+ default -> y = (screenH - compHeight) / 2;
+ };
+
+ for (Widget wid : primary) {
+ wid.setY(y);
+ y += wid.getHeight() + ScreenConst.WIDGET_PAD;
+ }
+ }
+
+ public void stackWidgetsHoriz(int screenW) {
+ // TODO not centered (?)
+ int compWidth = -ScreenConst.WIDGET_PAD;
+ for (Widget wid : primary) {
+ compWidth += wid.getWidth() + ScreenConst.WIDGET_PAD;
+ }
+
+ int x = switch (this.align) {
+
+ case LEFT-> x = ScreenConst.getScreenPad();
+ case RIGHT -> x = (screenW - compWidth) - ScreenConst.getScreenPad();
+ default -> x = (screenW - compWidth) / 2;
+ };
+
+ for (Widget wid : primary) {
+ wid.setX(x);
+ x += wid.getWidth() + ScreenConst.WIDGET_PAD;
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/EmptyScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/EmptyScreen.java
deleted file mode 100644
index 5c302eb3..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/EmptyScreen.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens;
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.EmptyWidget;
-
-import net.minecraft.text.Text;
-
-public class EmptyScreen extends Screen {
-
- public EmptyScreen(int w, int h, Text footer) {
- super(w, h);
- EmptyWidget ew = new EmptyWidget();
- this.center(ew);
- this.addWidget(ew);
- }
-
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java
deleted file mode 100644
index 6d06c637..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java
+++ /dev/null
@@ -1,230 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens;
-
-import java.util.ArrayList;
-
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.genericInfo.GardenInfoScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.genericInfo.GenericInfoScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.genericInfo.GenericRiftInfoScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.CrimsonIsleScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.DungeonHubScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.DungeonScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.FarmingServerScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.GardenScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.GenericServerScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.GuestServerScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.HomeServerScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.HubServerScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.MineServerScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.ParkServerScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main.RiftScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList.DungeonPlayerScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList.GuestPlayerScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList.HomePlayerScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList.PlayerListScreen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerLocator;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget;
-import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.text.Text;
-
-public class Screen {
-
- private ArrayList<Widget> widgets = new ArrayList<>();
- private int w, h;
-
- public Screen(int w, int h) {
- float scale = SkyblockerConfig.get().general.tabHud.tabHudScale / 100f;
- this.w = (int) (w / scale);
- this.h = (int) (h / scale);
- }
-
- public static Screen getCorrect(int w, int h, Text footer) {
- if (TabHud.genericTgl.isPressed()) {
- return Screen.correctGenericScrn(w, h, footer);
- } else if (TabHud.playerTgl.isPressed()) {
- return Screen.correctPlayerScrn(w, h, footer);
- } else {
- return Screen.correctMainScrn(w, h, footer);
- }
- }
-
- private static Screen correctGenericScrn(int w, int h, Text footer) {
- return switch (PlayerLocator.getPlayerLocation()) {
- case GARDEN -> new GardenInfoScreen(w, h, footer); // ok
- case THE_RIFT -> new GenericRiftInfoScreen(w, h, footer);
- case UNKNOWN -> new EmptyScreen(w, h, footer); // ok
- default -> new GenericInfoScreen(w, h, footer); // ok
- };
- }
-
- private static Screen correctPlayerScrn(int w, int h, Text footer) {
- return switch (PlayerLocator.getPlayerLocation()) {
- case GUEST_ISLAND -> new GuestPlayerScreen(w, h, footer); // ok
- case HOME_ISLAND, GARDEN -> new HomePlayerScreen(w, h, footer); // ok for 1 player
- case DUNGEON -> new DungeonPlayerScreen(w, h, footer);
- case UNKNOWN -> new EmptyScreen(w, h, footer); // ok
- default -> new PlayerListScreen(w, h, footer); // ok
- };
- }
-
- private static Screen correctMainScrn(int w, int h, Text footer) {
- return switch (PlayerLocator.getPlayerLocation()) {
- case PARK -> new ParkServerScreen(w, h, footer); // ok
- case HUB -> new HubServerScreen(w, h, footer); // ok when fire sale incoming
- case HOME_ISLAND -> new HomeServerScreen(w, h, footer); // ok
- case GUEST_ISLAND -> new GuestServerScreen(w, h, footer); // ok
- case CRYSTAL_HOLLOWS, DWARVEN_MINES -> new MineServerScreen(w, h, footer); // ok, TODO active forge
- case FARMING_ISLAND -> new FarmingServerScreen(w, h, footer);
- case DUNGEON_HUB -> new DungeonHubScreen(w, h, footer); // ok
- case DUNGEON -> new DungeonScreen(w, h, footer); // ok
- case CRIMSON_ISLE -> new CrimsonIsleScreen(w, h, footer);
- case GARDEN -> new GardenScreen(w, h, footer); // ok
- case THE_RIFT -> new RiftScreen(w, h, footer);
- case UNKNOWN -> new EmptyScreen(w, h, footer); // ok
- default -> new GenericServerScreen(w, h, footer); // ok
- };
- }
-
- /**
- * Add a widget to this screen
- */
- public void addWidget(Widget w) {
- widgets.add(w);
- }
-
- /**
- * Add many widgets to this screen
- */
- public void addWidgets(Widget... ws) {
- for (Widget w : ws) {
- widgets.add(w);
- }
- }
-
- public void render(DrawContext context) {
- for (Widget w : widgets) {
- w.render(context);
- }
- }
-
- /**
- * Stack these widgets on top of each other as determined by the lists's order
- */
- public void stackWidgetsH(Widget... list) {
- int compHeight = -5;
- for (Widget wid : list) {
- compHeight += wid.getHeight() + 5;
- }
-
- int y = (h - compHeight) / 2;
- for (Widget wid : list) {
- wid.setY(y);
- y += wid.getHeight() + 5;
- }
- }
-
- /**
- * Arrange these widgets next to each other as determined by the lists's order
- */
- public void stackWidgetsW(Widget... list) {
- // TODO not centered
- int compWidth = -5;
- for (Widget wid : list) {
- compWidth += wid.getWidth() + 5;
- }
-
- int x = (w - compWidth) / 2;
- for (Widget wid : list) {
- wid.setX(x);
- x += wid.getWidth() + 5;
- }
- }
-
- /**
- * Center a widget vertically, keeping X pos
- */
- public void centerH(Widget wid) {
- wid.setY((h - wid.getHeight()) / 2);
- }
-
- /**
- * Center a widget horizontally, keeping Y pos
- */
- public void centerW(Widget wid) {
- wid.setX((w - wid.getWidth()) / 2);
- }
-
- /**
- * Center a widget vertically and horizontally
- */
- public void center(Widget wid) {
- this.centerH(wid);
- this.centerW(wid);
- }
-
- /**
- * Let a widget's left border be on the screen's center, keeping Y pos
- */
- public void offCenterL(Widget wid) {
- int wHalf = this.w / 2;
- wid.setX(wHalf - 3 - wid.getWidth());
- }
-
- /**
- * Let a widget's right border be on the screen's center, keeping Y pos
- */
- public void offCenterR(Widget wid) {
- int wHalf = this.w / 2;
- wid.setX(wHalf + 3);
- }
-
- public void collideAgainstL(Widget w, Widget... others) {
- int yMin = w.getY();
- int yMax = w.getY() + w.getHeight();
-
- int xCor = this.w / 2;
-
- // assume others to be sorted top-bottom.
- for (Widget other : others) {
- if (other.getY() + other.getHeight() + 5 < yMin) {
- // too high, next one
- continue;
- }
-
- if (other.getY() - 5 > yMax) {
- // too low, no more collisions possible
- break;
- }
-
- int xPos = other.getX() - 5 - w.getWidth();
- xCor = Math.min(xCor, xPos);
- }
- w.setX(xCor);
- }
-
- public void collideAgainstR(Widget w, Widget... others) {
- int yMin = w.getY();
- int yMax = w.getY() + w.getHeight();
-
- int xCor = this.w / 2;
-
- // assume others to be sorted top-bottom.
- for (Widget other : others) {
- if (other.getY() + other.getHeight() + 5 < yMin) {
- // too high, next one
- continue;
- }
-
- if (other.getY() - 5 > yMax) {
- // too low, no more collisions possible
- break;
- }
-
- 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/screens/genericInfo/GardenInfoScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GardenInfoScreen.java
deleted file mode 100644
index 0bb12c8e..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GardenInfoScreen.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.genericInfo;
-
-
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.CookieWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.EffectWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.EventWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.GardenSkillsWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.JacobsContestWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ProfileWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.UpgradeWidget;
-
-import net.minecraft.text.Text;
-
-public class GardenInfoScreen extends Screen {
-
- public GardenInfoScreen(int w, int h, Text footer) {
- super(w, h);
-
- String f = footer.getString();
-
- GardenSkillsWidget gsw = new GardenSkillsWidget();
- EventWidget evw = new EventWidget(true);
- UpgradeWidget uw = new UpgradeWidget(f);
-
- ProfileWidget pw = new ProfileWidget();
- EffectWidget efw = new EffectWidget(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);
-
- this.centerW(gsw);
- this.centerW(evw);
- this.centerW(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.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
deleted file mode 100644
index 046a9313..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericInfoScreen.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.genericInfo;
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.CookieWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.EffectWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ElectionWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.EventWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ProfileWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.SkillsWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.UpgradeWidget;
-
-import net.minecraft.text.Text;
-
-public class GenericInfoScreen extends Screen {
-
- public GenericInfoScreen(int w, int h, Text footer) {
- super(w, h);
-
- String f = footer.getString();
-
- SkillsWidget sw = new SkillsWidget();
- EventWidget evw = new EventWidget(false);
- UpgradeWidget uw = new UpgradeWidget(f);
-
- ProfileWidget pw = new ProfileWidget();
- EffectWidget efw = new EffectWidget(f);
-
- ElectionWidget elw = new ElectionWidget();
- CookieWidget cw = new CookieWidget(f);
-
- this.stackWidgetsH(sw, evw, uw);
- this.stackWidgetsH(pw, efw);
- this.stackWidgetsH(elw, cw);
-
- this.centerW(sw);
- this.centerW(evw);
- this.centerW(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.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
deleted file mode 100644
index 9821b5a3..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericRiftInfoScreen.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.genericInfo;
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift.RiftProfileWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift.RiftStatsWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift.ShenWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.CookieWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift.AdvertisementWidget;
-import net.minecraft.text.Text;
-
-public class GenericRiftInfoScreen extends Screen {
-
- public GenericRiftInfoScreen(int w, int h, Text footer) {
- super(w, h);
-
- String f = footer.getString();
-
- RiftProfileWidget profile = new RiftProfileWidget();
- RiftStatsWidget stats = new RiftStatsWidget();
- ShenWidget shen = new ShenWidget();
-
- CookieWidget cookie = new CookieWidget(f);
- AdvertisementWidget advertisement = new AdvertisementWidget();
-
- this.stackWidgetsH(stats, advertisement);
- this.stackWidgetsH(profile, shen, cookie);
-
- this.offCenterL(stats);
- this.offCenterL(advertisement);
-
- this.offCenterR(profile);
- this.offCenterR(shen);
- this.offCenterR(cookie);
-
- this.addWidgets(profile, stats, shen, cookie, advertisement);
- }
-
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/CrimsonIsleScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/CrimsonIsleScreen.java
deleted file mode 100644
index 6e6f563b..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/CrimsonIsleScreen.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main;
-
-
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.QuestWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ReputationWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ServerWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.VolcanoWidget;
-
-import net.minecraft.text.Text;
-
-public class CrimsonIsleScreen extends Screen {
-
- public CrimsonIsleScreen(int w, int h, Text footer) {
- super(w, h);
-
- ServerWidget sw = new ServerWidget();
- ReputationWidget rw = new ReputationWidget();
- QuestWidget qw = new QuestWidget();
- VolcanoWidget vw = new VolcanoWidget();
-
- this.stackWidgetsH(sw, rw);
- this.stackWidgetsH(qw, vw);
- this.offCenterL(sw);
- this.offCenterL(rw);
- this.offCenterR(vw);
- this.offCenterR(qw);
- this.addWidgets(sw, rw, qw, vw);
- }
-
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/DungeonHubScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/DungeonHubScreen.java
deleted file mode 100644
index 5db461af..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/DungeonHubScreen.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main;
-
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.EssenceWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ServerWidget;
-
-import net.minecraft.text.Text;
-
-public class DungeonHubScreen extends Screen{
-
- public DungeonHubScreen(int w, int h, Text footer) {
- super(w, h);
-
- ServerWidget sw = new ServerWidget();
- EssenceWidget ew = new EssenceWidget();
-
- this.centerW(sw);
- this.centerW(ew);
- this.stackWidgetsH(sw, ew);
- this.addWidget(ew);
- this.addWidget(sw);
- }
-
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/DungeonScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/DungeonScreen.java
deleted file mode 100644
index 852ee876..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/DungeonScreen.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main;
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.DungeonBuffWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.DungeonDeathWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.DungeonDownedWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.DungeonPuzzleWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.DungeonSecretWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.DungeonServerWidget;
-import net.minecraft.text.Text;
-
-public class DungeonScreen extends Screen {
-
- public DungeonScreen(int w, int h, Text footer) {
- super(w, h);
-
- String f = footer.getString();
-
- DungeonDownedWidget ddow = new DungeonDownedWidget();
- DungeonDeathWidget ddew = new DungeonDeathWidget();
- DungeonSecretWidget dscw = new DungeonSecretWidget();
- DungeonServerWidget dsrw = new DungeonServerWidget();
- DungeonPuzzleWidget dpuw = new DungeonPuzzleWidget();
- DungeonBuffWidget dbw = new DungeonBuffWidget(f);
-
- this.offCenterL(ddow);
- this.offCenterL(ddew);
- this.offCenterL(dbw);
- this.offCenterR(dsrw);
- this.offCenterR(dpuw);
- this.offCenterR(dscw);
-
- this.stackWidgetsH(ddow, ddew, dbw);
- this.stackWidgetsH(dsrw, dpuw, dscw);
-
- this.addWidgets(ddow, ddew, dscw, dsrw, dpuw, dbw);
-
- }
-
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/FarmingServerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/FarmingServerScreen.java
deleted file mode 100644
index 02c81f23..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/FarmingServerScreen.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main;
-
-
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ServerWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.TrapperWidget;
-
-
-import net.minecraft.text.Text;
-
-public class FarmingServerScreen extends Screen{
-
- public FarmingServerScreen(int w, int h, Text footer) {
- super(w, h);
-
- ServerWidget sw = new ServerWidget();
- TrapperWidget tw = new TrapperWidget();
-
- this.centerW(sw);
- this.centerW(tw);
- this.stackWidgetsH(sw, tw);
- this.addWidgets(tw, sw);
- }
-
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/GardenScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/GardenScreen.java
deleted file mode 100644
index 8fd69cbb..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/GardenScreen.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main;
-
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.CameraPositionWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ComposterWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.GardenServerWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.GardenVisitorsWidget;
-import net.minecraft.text.Text;
-
-public class GardenScreen extends Screen{
-
- public GardenScreen(int w, int h, Text footer) {
- super(w, h);
-
- GardenServerWidget gsw = new GardenServerWidget();
- ComposterWidget cw = new ComposterWidget();
- GardenVisitorsWidget vw = new GardenVisitorsWidget();
- CameraPositionWidget cpw = new CameraPositionWidget();
-
- this.stackWidgetsH(gsw, vw);
- this.stackWidgetsH(cw, cpw);
- this.offCenterL(gsw);
- this.offCenterL(vw);
- this.offCenterR(cw);
- this.offCenterR(cpw);
- this.addWidgets(gsw, cw, vw, cpw);
- }
-
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/GenericServerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/GenericServerScreen.java
deleted file mode 100644
index a89563db..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/GenericServerScreen.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main;
-
-
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ServerWidget;
-
-import net.minecraft.text.Text;
-
-public class GenericServerScreen extends Screen {
-
- public GenericServerScreen(int w, int h, Text footer) {
- super(w, h);
-
- ServerWidget sw = new ServerWidget();
-
- this.center(sw);
- this.addWidget(sw);
- }
-
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/GuestServerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/GuestServerScreen.java
deleted file mode 100644
index 57d7a199..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/GuestServerScreen.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main;
-
-
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.GuestServerWidget;
-
-
-import net.minecraft.text.Text;
-
-public class GuestServerScreen extends Screen{
-
- public GuestServerScreen(int w, int h, Text footer) {
- super(w, h);
-
- GuestServerWidget gsw = new GuestServerWidget();
-
- this.center(gsw);
- this.addWidget(gsw);
- }
-
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/HomeServerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/HomeServerScreen.java
deleted file mode 100644
index e61ba4b0..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/HomeServerScreen.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main;
-
-
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.IslandServerWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.MinionWidget;
-
-
-import net.minecraft.text.Text;
-
-public class HomeServerScreen extends Screen {
-
- public HomeServerScreen(int w, int h, Text footer) {
- super(w, h);
-
- IslandServerWidget isw = new IslandServerWidget();
- MinionWidget mw = new MinionWidget();
-
- this.centerH(isw);
- this.centerH(mw);
- this.stackWidgetsW(isw, mw);
- this.addWidgets(isw, mw);
- }
-
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/HubServerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/HubServerScreen.java
deleted file mode 100644
index e2857f7e..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/HubServerScreen.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main;
-
-
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.FireSaleWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ServerWidget;
-
-
-import net.minecraft.text.Text;
-
-public class HubServerScreen extends Screen {
-
- public HubServerScreen(int w, int h, Text footer) {
- super(w, h);
-
- ServerWidget sw = new ServerWidget();
- FireSaleWidget fsw = new FireSaleWidget();
-
- this.centerW(sw);
- this.centerW(fsw);
- this.stackWidgetsH(sw, fsw);
- this.addWidgets(sw, fsw);
- }
-
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/MineServerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/MineServerScreen.java
deleted file mode 100644
index 616c3e82..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/MineServerScreen.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main;
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.CommsWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ForgeWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.PowderWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ServerWidget;
-
-import net.minecraft.text.Text;
-
-public class MineServerScreen extends Screen {
-
- public MineServerScreen(int w, int h, Text footer) {
- super(w, h);
-
- ServerWidget sw = new ServerWidget();
- PowderWidget pw = new PowderWidget();
- CommsWidget cw = new CommsWidget();
- ForgeWidget fw = new ForgeWidget();
-
- this.stackWidgetsH(sw, cw);
- this.stackWidgetsH(fw, pw);
- this.offCenterL(sw);
- this.offCenterL(cw);
- this.offCenterR(pw);
- this.offCenterR(fw);
- this.addWidgets(fw, cw, pw, sw);
- }
-
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/ParkServerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/ParkServerScreen.java
deleted file mode 100644
index aa65d946..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/ParkServerScreen.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main;
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ParkServerWidget;
-
-import net.minecraft.text.Text;
-
-public class ParkServerScreen extends Screen{
-
- public ParkServerScreen(int w, int h, Text footer) {
- super(w, h);
-
- ParkServerWidget sw = new ParkServerWidget();
-
- this.center(sw);
- this.addWidget(sw);
- }
-
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/RiftScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/RiftScreen.java
deleted file mode 100644
index d63bcf62..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/main/RiftScreen.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main;
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift.RiftProgressWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift.GoodToKnowWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.rift.RiftServerInfoWidget;
-
-
-import net.minecraft.text.Text;
-
-public class RiftScreen extends Screen {
-
- public RiftScreen(int w, int h, Text footer) {
- super(w, h);
-
- RiftProgressWidget rftProg = new RiftProgressWidget();
- GoodToKnowWidget gtk = new GoodToKnowWidget();
- RiftServerInfoWidget si = new RiftServerInfoWidget();
-
- this.stackWidgetsH(si, gtk);
- this.stackWidgetsH(rftProg);
- this.offCenterL(si);
- this.offCenterL(gtk);
- this.offCenterR(rftProg);
- this.addWidgets(si, gtk, rftProg);
- }
-
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/playerList/DungeonPlayerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/playerList/DungeonPlayerScreen.java
deleted file mode 100644
index 2567da13..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/playerList/DungeonPlayerScreen.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList;
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.DungeonPlayerWidget;
-import net.minecraft.text.Text;
-
-public class DungeonPlayerScreen extends Screen {
-
- public DungeonPlayerScreen(int w, int h, Text footer) {
-
- super(w, h);
-
- DungeonPlayerWidget dpw1 = new DungeonPlayerWidget(1);
- DungeonPlayerWidget dpw2 = new DungeonPlayerWidget(2);
- DungeonPlayerWidget dpw3 = new DungeonPlayerWidget(3);
- DungeonPlayerWidget dpw4 = new DungeonPlayerWidget(4);
- DungeonPlayerWidget dpw5 = new DungeonPlayerWidget(5);
-
- this.offCenterL(dpw1);
- this.offCenterL(dpw2);
- this.offCenterL(dpw3);
- this.offCenterR(dpw4);
- this.offCenterR(dpw5);
- this.stackWidgetsH(dpw1, dpw2, dpw3);
- this.stackWidgetsH(dpw4, dpw5);
- this.addWidgets(dpw1, dpw2, dpw3, dpw4, dpw5);
- }
-
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/playerList/GuestPlayerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/playerList/GuestPlayerScreen.java
deleted file mode 100644
index 5a9733cc..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/playerList/GuestPlayerScreen.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList;
-
-
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.IslandGuestsWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.IslandOwnersWidget;
-
-
-import net.minecraft.text.Text;
-
-public class GuestPlayerScreen extends Screen{
-
- public GuestPlayerScreen(int w, int h, Text footer) {
- super(w, h);
-
- IslandGuestsWidget igw = new IslandGuestsWidget();
- IslandOwnersWidget iow = new IslandOwnersWidget();
-
- this.centerH(iow);
- this.centerH(igw);
- this.stackWidgetsW(igw, iow);
- this.addWidgets(iow, igw);
- }
-
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/playerList/HomePlayerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/playerList/HomePlayerScreen.java
deleted file mode 100644
index 2a159ecc..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/playerList/HomePlayerScreen.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList;
-
-
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.IslandGuestsWidget;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.IslandSelfWidget;
-
-
-import net.minecraft.text.Text;
-
-public class HomePlayerScreen extends Screen {
-
- public HomePlayerScreen(int w, int h, Text footer) {
- super(w, h);
-
- IslandSelfWidget isw = new IslandSelfWidget();
- IslandGuestsWidget igw = new IslandGuestsWidget();
-
- this.centerH(isw);
- this.centerH(igw);
- this.stackWidgetsW(isw, igw);
- this.addWidgets(isw, igw);
- }
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/playerList/PlayerListScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/playerList/PlayerListScreen.java
deleted file mode 100644
index 5db01512..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/playerList/PlayerListScreen.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList;
-
-
-import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen;
-import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.PlayerListWidget;
-
-import net.minecraft.text.Text;
-
-public class PlayerListScreen extends Screen {
-
- public PlayerListScreen(int w, int h, Text footer) {
- super(w, h);
-
- PlayerListWidget plw = new PlayerListWidget();
-
- this.center(plw);
- this.addWidget(plw);
- }
-
-}
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 d0ce6b72..30cc242e 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
@@ -26,6 +26,7 @@ public class PlayerListMgr {
public static final Logger LOGGER = LoggerFactory.getLogger("Skyblocker Regex");
private static List<PlayerListEntry> playerList;
+ private static String footer;
public static void updateList() {
@@ -41,6 +42,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/util/PlayerLocator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerLocator.java
index f7a989bc..e6aa0336 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerLocator.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerLocator.java
@@ -8,26 +8,34 @@ import me.xmrvizzy.skyblocker.utils.Utils;
public class PlayerLocator {
public static enum Location {
- DUNGEON,
- GUEST_ISLAND,
- HOME_ISLAND,
- CRIMSON_ISLE,
- DUNGEON_HUB,
- FARMING_ISLAND,
- PARK,
- DWARVEN_MINES,
- CRYSTAL_HOLLOWS,
- END,
- GOLD_MINE,
- DEEP_CAVERNS,
- HUB,
- SPIDER_DEN,
- JERRY,
- GARDEN,
- INSTANCED,
- THE_RIFT,
- DARK_AUCTION,
- UNKNOWN
+ DUNGEON("dungeon"),
+ GUEST_ISLAND("guest_island"),
+ HOME_ISLAND("home_island"),
+ CRIMSON_ISLE("crimson_isle"),
+ DUNGEON_HUB("dungeon_hub"),
+ FARMING_ISLAND("farming_island"),
+ PARK("park"),
+ DWARVEN_MINES("dwarven_mines"),
+ CRYSTAL_HOLLOWS("crystal_hollows"),
+ END("end"),
+ GOLD_MINE("gold_mine"),
+ DEEP_CAVERNS("deep_caverns"),
+ HUB("hub"),
+ SPIDER_DEN("spider_den"),
+ JERRY("jerry_workshop"),
+ GARDEN("garden"),
+ INSTANCED("kuudra"),
+ THE_RIFT("rift"),
+ DARK_AUCTION("dark_auction"),
+ UNKNOWN("unknown");
+
+ public final String internal;
+
+ private Location(String i) {
+ // as used internally by the mod, e.g. in the json
+ this.internal = i;
+ }
+
}
public static Location getPlayerLocation() {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/ScreenConst.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/ScreenConst.java
new file mode 100644
index 00000000..42089e9e
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/ScreenConst.java
@@ -0,0 +1,13 @@
+package me.xmrvizzy.skyblocker.skyblock.tabhud.util;
+
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+
+public class ScreenConst {
+ public static final int WIDGET_PAD = 5;
+ public static final int WIDGET_PAD_HALF = 3;
+ private static final int SCREEN_PAD_BASE = 20;
+
+ public static int getScreenPad() {
+ return (int) ((1f/((float)SkyblockerConfig.get().general.tabHud.tabHudScale/100f) * SCREEN_PAD_BASE));
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CameraPositionWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CameraPositionWidget.java
index ca108837..7e44bc44 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CameraPositionWidget.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CameraPositionWidget.java
@@ -8,25 +8,30 @@ import net.minecraft.util.Formatting;
import net.minecraft.util.math.MathHelper;
public class CameraPositionWidget extends Widget {
- private static final MutableText TITLE = Text.literal("Camera Pos").formatted(Formatting.DARK_PURPLE, Formatting.BOLD);
- private static final MinecraftClient CLIENT = MinecraftClient.getInstance();
-
- public CameraPositionWidget() {
- super(TITLE, Formatting.DARK_PURPLE.getColorValue());
-
- double yaw = CLIENT.getCameraEntity().getYaw();
- double pitch = CLIENT.getCameraEntity().getPitch();
-
- this.addComponent(new PlainTextComponent(Text.literal("Yaw: " + roundToDecimalPlaces(MathHelper.wrapDegrees(yaw), 3))));
- this.addComponent(new PlainTextComponent(Text.literal("Pitch: " + roundToDecimalPlaces(MathHelper.wrapDegrees(pitch), 3))));
-
- this.pack();
- }
-
- //https://stackoverflow.com/a/33889423
- private static double roundToDecimalPlaces(double value, int decimalPlaces) {
- double shift = Math.pow(10, decimalPlaces);
-
- return Math.round(value * shift) / shift;
- }
+ private static final MutableText TITLE = Text.literal("Camera Pos").formatted(Formatting.DARK_PURPLE,
+ Formatting.BOLD);
+ private static final MinecraftClient CLIENT = MinecraftClient.getInstance();
+
+ public CameraPositionWidget() {
+ super(TITLE, Formatting.DARK_PURPLE.getColorValue());
+ }
+
+ @Override
+ public void updateContent() {
+ double yaw = CLIENT.getCameraEntity().getYaw();
+ double pitch = CLIENT.getCameraEntity().getPitch();
+
+ this.addComponent(
+ new PlainTextComponent(Text.literal("Yaw: " + roundToDecimalPlaces(MathHelper.wrapDegrees(yaw), 3))));
+ this.addComponent(new PlainTextComponent(
+ Text.literal("Pitch: " + roundToDecimalPlaces(MathHelper.wrapDegrees(pitch), 3))));
+
+ }
+
+ // https://stackoverflow.com/a/33889423
+ private static double roundToDecimalPlaces(double value, int decimalPlaces) {
+ double shift = Math.pow(10, decimalPlaces);
+
+ return Math.round(value * shift) / shift;
+ }
}
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..8bbdb25f 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
@@ -1,15 +1,11 @@
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;
@@ -31,7 +27,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 +54,6 @@ public class CommsWidget extends Widget {
}
this.addComponent(pc);
}
- this.pack();
- }
-
- // for the dwarven hud
- public CommsWidget(List<Commission> 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(?<buff>.*)\\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..b7f58763 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;
@@ -16,12 +17,17 @@ public class DungeonBuffWidget extends Widget {
private static final MutableText TITLE = Text.literal("Dungeon Buffs").formatted(Formatting.DARK_PURPLE,
Formatting.BOLD);
- public DungeonBuffWidget(String footertext) {
+ public DungeonBuffWidget() {
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 05223211..80134b66 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/ErrorWidget.java
index 52d6cfbd..7f53fde7 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EmptyWidget.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ErrorWidget.java
@@ -8,17 +8,25 @@ import net.minecraft.util.Formatting;
// empty widget for when nothing can be shown
-public class EmptyWidget extends Widget {
- private static final MutableText TITLE = Text.literal("Empty").formatted(Formatting.RED,
+public class ErrorWidget extends Widget {
+ private static final MutableText TITLE = Text.literal("Error").formatted(Formatting.RED,
Formatting.BOLD);
- public EmptyWidget() {
+ Text error = Text.of("No info available!");
+
+ public ErrorWidget() {
super(TITLE, Formatting.RED.getColorValue());
+ }
+
+ public ErrorWidget(String error) {
+ super(TITLE, Formatting.RED.getColorValue());
+ this.error = Text.of(error);
+ }
- Text info = Text.of("No info for this area!");
- PlainTextComponent inf = new PlainTextComponent(info);
+ @Override
+ public void updateContent() {
+ PlainTextComponent inf = new PlainTextComponent(this.error);
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/GardenVisitorsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GardenVisitorsWidget.java
index 6a4d2af3..945fb17c 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GardenVisitorsWidget.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GardenVisitorsWidget.java
@@ -7,23 +7,24 @@ import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
public class GardenVisitorsWidget extends Widget {
- private static final MutableText TITLE = Text.literal("Visitors").formatted(Formatting.DARK_GREEN, Formatting.BOLD);
+ private static final MutableText TITLE = Text.literal("Visitors").formatted(Formatting.DARK_GREEN, Formatting.BOLD);
- public GardenVisitorsWidget() {
- super(TITLE, Formatting.DARK_GREEN.getColorValue());
-
- if (PlayerListMgr.textAt(54) == null) {
- this.addComponent(new PlainTextComponent(Text.literal("No visitors!").formatted(Formatting.GRAY)));
- this.pack();
-
- return;
- }
-
- for (int i = 54; i < 59; i++) {
- String text = PlayerListMgr.strAt(i);
- if (text != null) this.addComponent(new PlainTextComponent(Text.literal(text)));
- }
-
- this.pack();
- }
+ public GardenVisitorsWidget() {
+ super(TITLE, Formatting.DARK_GREEN.getColorValue());
+ }
+
+ @Override
+ public void updateContent() {
+ if (PlayerListMgr.textAt(54) == null) {
+ this.addComponent(new PlainTextComponent(Text.literal("No visitors!").formatted(Formatting.GRAY)));
+ return;
+ }
+
+ for (int i = 54; i < 59; i++) {
+ String text = PlayerListMgr.strAt(i);
+ if (text != null)
+ this.addComponent(new PlainTextComponent(Text.literal(text)));
+ }
+
+ }
}
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/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..31370dc6 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
@@ -21,11 +21,15 @@ public class PlayerListWidget extends Widget {
private static final MutableText TITLE = Text.literal("Players").formatted(Formatting.GREEN,
Formatting.BOLD);
- private final ArrayList<PlayerListEntry> list = new ArrayList<>();
-
public PlayerListWidget() {
super(TITLE, Formatting.GREEN.getColorValue());
+ }
+
+ @Override
+ public void updateContent() {
+ ArrayList<PlayerListEntry> list = new ArrayList<>();
+
// 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 33f77933..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
@@ -45,12 +45,21 @@ public abstract class Widget {
}
public final void addComponent(Component c) {
- components.add(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 "<textA>: <textB>", an IcoTextComponent is added as such:
+ * If the entry at idx has the format "<textA>: <textB>", an IcoTextComponent is
+ * added as such:
* [ico] [string] [textB.formatted(fmt)]
*/
public final void addSimpleIcoText(ItemStack ico, String string, Formatting fmt, int idx) {
@@ -60,9 +69,12 @@ public abstract class Widget {
/**
* Calculate the size of this widget.
- * <b>Must be called before returning from the widget constructor and after all components are added!</b>
+ * <b>Must be called before returning from the widget constructor and after all
+ * components are added!</b>
*/
- public final void pack() {
+ 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);
@@ -111,7 +123,7 @@ public abstract class Widget {
* Draw this widget, possibly with a background
*/
public final void render(DrawContext context, boolean hasBG) {
- MatrixStack ms = context.getMatrices();
+ MatrixStack ms = context.getMatrices();
// not sure if this is the way to go, but it fixes Z-layer issues
// like blocks being rendered behind the BG and the hotbar clipping into things
@@ -124,9 +136,9 @@ public abstract class Widget {
// move above other UI elements
ms.translate(0, 0, 200);
if (hasBG) {
- context.fill(x + 1, y, x + w - 1, y + h, COL_BG_BOX);
- context.fill(x, y + 1, x + 1, y + h - 1, COL_BG_BOX);
- context.fill(x + w - 1, y + 1, x + w, y + h - 1, COL_BG_BOX);
+ context.fill(x + 1, y, x + w - 1, y + h, COL_BG_BOX);
+ context.fill(x, y + 1, x + 1, y + h - 1, COL_BG_BOX);
+ context.fill(x + w - 1, y + 1, x + w, y + h - 1, COL_BG_BOX);
}
// move above background (if exists)
ms.translate(0, 0, 100);
@@ -163,9 +175,10 @@ public abstract class Widget {
}
/**
- * If the entry at idx has the format "[textA]: [textB]", the following is returned:
+ * If the entry at idx has the format "[textA]: [textB]", the following is
+ * returned:
* [entryName] [textB.formatted(contentFmt)]
- */
+ */
public static Text simpleEntryText(int idx, String entryName, Formatting contentFmt) {
String src = PlayerListMgr.strAt(idx);
@@ -185,7 +198,7 @@ public abstract class Widget {
/**
* @return [entryName] [entryContent.formatted(contentFmt)]
- */
+ */
public static Text simpleEntryText(String entryContent, String entryName, Formatting contentFmt) {
return Text.literal(entryName).append(Text.literal(entryContent).formatted(contentFmt));
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/Component.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/Component.java
index 850cb3d2..57e26ab2 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/Component.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/Component.java
@@ -3,7 +3,6 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.render.item.ItemRenderer;
/**
* Abstract base class for a component that may be added to a Widget.
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/hud/HudCommsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/hud/HudCommsWidget.java
new file mode 100644
index 00000000..ab8546cc
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/hud/HudCommsWidget.java
@@ -0,0 +1,73 @@
+package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.hud;
+
+import java.util.List;
+
+import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHud.Commission;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget;
+import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.Component;
+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<Commission> 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();
+ public static HudCommsWidget INSTANCE_CFG = 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<Commission> 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/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/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json
index 39a215d2..578917e2 100644
--- a/src/main/resources/assets/skyblocker/lang/en_us.json
+++ b/src/main/resources/assets/skyblocker/lang/en_us.json
@@ -1,9 +1,9 @@
{
"key.categories.skyblocker": "Skyblocker",
"key.hotbarSlotLock": "Slot Lock (Hotbar)",
- "key.skyblocker.playerTgl": "Switch tab HUD to player list",
+ "key.skyblocker.toggleB": "Toggle tab HUD to screen B",
"key.skyblocker.defaultTgl": "Switch tab HUD to default view",
- "key.skyblocker.genericTgl": "Switch tab HUD to general info",
+ "key.skyblocker.toggleA": "Toggle tab HUD to screen A",
"key.wikiLookup": "Wiki Lookup",
"text.autoconfig.skyblocker.title": "Skyblocker Settings",
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..a50c1f96
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/readme.md
@@ -0,0 +1,186 @@
+# Directory layout
+The resource pack should look like this:
+```
+my_pack
+├───pack.mcmeta
+└───assets
+ └───skyblocker
+ └───tabhud
+ ├───version.json
+ ├───screen_a
+ ├───screen_b
+ └───standard
+```
+The three dirs `screen_a`, `screen_b` and `standard` contain the screen definition JSON files as described below. `standard` describes the screens shown when just the TAB key is pressed, while `screen_a/b` describe the screens shown when using the modifier keys A and B (default binds: N and B).
+The file names are used to describe where a screen is shown. They are case sensitive. For a full list of possible names see Appendix A. While this scheme necessitates duplicate file contents and results in similar file names in different directories, it also allows for much control both when creating a complete layout or when only overriding specific screens.
+The `version.json` file contains a single line `{ "version": X }`, where X is the version of the internal resource pack format. This number is incremented when major changes to the resource pack structure are made in the future. It's currently 1; packs with a different version number are rejected.
+IF A MAJOR CHANGE IS MADE THAT MODIFIES THE VERSION NUMBER AND THEREFORE BREAKS YOUR LAYOUT, EDITING THE VERSION FILE WITHOUT REMAKING THE RESOURCE PACK DOES NOT FIX ANYTHING.
+
+# Screen definition JSONs
+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.
+
+Be advised that most widgets only work correctly in some areas. The MinionWidget for example can't show your minions when you're not on the home island. General rule of thumb: If the info is displayed in the unmodded tab hud, the correlating widget works.
+
+## 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
+Some are self-explaining, others have clarification
+- default: Any area without its own dedicated layout file.
+- unknown: The mod doesn't know where you are.
+- dungeon: Inside a dungon.
+- dungeon_hub: In the dungeon hub.
+- farming_island: The island with the barn, wheat, melons and pumpkins.
+- park: The island with the trees and the harp.
+- garden: The new(er) personal farming area
+- hub: The main hub area.
+- deep_caverns
+- home_island
+- guest_island
+- crimson_isle
+- dwarven_mines
+- crystal_hollows
+- end
+- gold_mine
+- spider_den
+- jerry_workshop
+- kuudra
+- rift
+
+## Appendix B: Widget identifiers and arguments
+Grouped by themes (roughly)
+
+- CookieWidget: Your super cookie.
+- EffectWidget: Currently active effects.
+- ElectionWidget: The current mayor election.
+- EssenceWidget: Your dungeon essences.
+- ErrorWidget: Displays an error message, "No data available" by default. Optional arg `text`: The error to be displayed.
+- EventWidget: Current events. Arg `inGarden: true|false`: Is this widget displayed in the garden area?
+- FireSaleWidget: Ongoing fire sales.
+- MinionWidget: The minions on your island.
+- ProfileWidget: Data about the player's profile.
+- SkillsWidget: The player's skill levels and stats
+- TrapperWidget: Trapper pelts on the farming island.
+- UpgradeWidget: Currently running upgrades
+
+#### Garden
+- ComposterWidget: The composter in the garden.
+- GardenServerWidget: Server widget specialized for the garden.
+- GardenSkillsWidget: Skills widget specialized for the garden.
+- JacobsContestWidget: The current Jacob's contest when in the garden.
+
+#### Mining
+- CommsWidget: Shows the king's commissions in the dwarven mines and the crystal hollows.
+- ForgeWidget: Items in the forge
+- PowderWidget: Gemstone and Mithril powder collection.
+
+#### Crimson Isle
+- QuestWidget: Crimson Isle faction quests.
+- ReputationWidget: Crimson Isle faction reputation.
+- VolcanoWidget: Volcano status on the crimson isle
+
+#### Dungeon In-game
+- DungeonBuffWidget: The dungeon buffs you've found in this run.
+- DungeonDeathWidget: Various dungeon stats (deaths, but also milestones, healing, damage taken).
+- DungeonDownedWidget: Downed people in the dungeon.
+- DungeonPlayerWidget: A single dungeon player. Arg `player: 1|2|3|4|5`: For which player should this widget display info? One for each player is recommended.
+- DungeonPuzzleWidget: A list of all dungeon puzzles and their status.
+- DungeonSecretWidget: How many secrets and crypts you've found in this run.
+- DungeonServerWidget: Server widget specialized for the dungeon.
+
+#### Rift
+- AdvertisementWidget: Shows rift ads.
+- GoodToKnowWidget:
+- RiftProfileWidget:
+- RiftProgressWidget:
+- RiftServerInfoWidget: Server widget specialized for the rift.
+- RiftStatsWidget: Server widget specialized for the rift.
+- ShenWidget:
+
+#### Player lists
+- PlayerListWidget: Generic list of players in the area.
+- IslandGuestsWidget: Players visiting you or the same private island as you.
+- IslandOwnersWidget: Owners of the island you're visiting.
+- IslandSelfWidget: Owners of your home island.
+
+#### Server info
+- ServerWidget: Generic server information.
+- GuestServerWidget: Server widget specialized for guesting.
+- IslandServerWidget: Server widget specialized for the home island.
+- ParkServerWidget: Server widget specialized for the park.
+
+## Appendix C: Pipeline stages
+
+#### Align
+- op: `align`
+- reference: One of `horizontalCenter`, `verticalCenter`, `leftOfCenter`, `rightOfCenter`, `topOfCenter`, `botOfCenter`, `top`, `bot`, `left`, `right`
+- 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`, `top`, `bot`
+- 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`, `centerTop`, `centerBot`, `centerLeft`, `centerRight`, `cornerTopRight`, `cornerTopLeft`, `cornerBotRight`, `cornerBotLeft`.
+- 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/screen_a/default.json b/src/main/resources/assets/skyblocker/tabhud/screen_a/default.json
new file mode 100644
index 00000000..dcfa5138
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/screen_a/default.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/screen_a/garden.json b/src/main/resources/assets/skyblocker/tabhud/screen_a/garden.json
new file mode 100644
index 00000000..3e1556ef
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/screen_a/garden.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/screen_a/rift.json b/src/main/resources/assets/skyblocker/tabhud/screen_a/rift.json
new file mode 100644
index 00000000..8d1d4c5f
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/screen_a/rift.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",
+ "reference": "rightOfCenter",
+ "apply_to": ["profile", "shen", "cookie"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/screen_a/unknown.json b/src/main/resources/assets/skyblocker/tabhud/screen_a/unknown.json
new file mode 100644
index 00000000..b682cc3d
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/screen_a/unknown.json
@@ -0,0 +1,17 @@
+{
+ "widgets": [
+ {
+ "name": "ErrorWidget",
+ "alias": "ew"
+ }
+ ],
+ "layout": [
+ {
+ "op": "place",
+ "where": "center",
+ "apply_to": [
+ "ew"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/screen_b/default.json b/src/main/resources/assets/skyblocker/tabhud/screen_b/default.json
new file mode 100644
index 00000000..a1f52ad5
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/screen_b/default.json
@@ -0,0 +1,17 @@
+{
+ "widgets": [
+ {
+ "name": "PlayerListWidget",
+ "alias": "plw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "place",
+ "where": "center",
+ "apply_to": [
+ "plw"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/screen_b/dungeon.json b/src/main/resources/assets/skyblocker/tabhud/screen_b/dungeon.json
new file mode 100644
index 00000000..075e3d4c
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/screen_b/dungeon.json
@@ -0,0 +1,53 @@
+{
+ "widgets":[
+ {
+ "name": "DungeonPlayerWidget",
+ "alias": "dpw1",
+ "player": 1
+ },
+ {
+ "name": "DungeonPlayerWidget",
+ "alias": "dpw2",
+ "player": 2
+ },
+ {
+ "name": "DungeonPlayerWidget",
+ "alias": "dpw3",
+ "player": 3
+ },
+ {
+ "name": "DungeonPlayerWidget",
+ "alias": "dpw4",
+ "player": 4
+ },
+ {
+ "name": "DungeonPlayerWidget",
+ "alias": "dpw5",
+ "player": 5
+ }
+ ],
+ "layout": [
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "center",
+ "apply_to": ["dpw1", "dpw2", "dpw3"]
+ },
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "center",
+ "apply_to": ["dpw4", "dpw5"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["dpw1", "dpw2", "dpw3"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["dpw4", "dpw5"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/screen_b/garden.json b/src/main/resources/assets/skyblocker/tabhud/screen_b/garden.json
new file mode 100644
index 00000000..772e0594
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/screen_b/garden.json
@@ -0,0 +1,29 @@
+{
+ "widgets":[
+ {
+ "name": "IslandGuestsWidget",
+ "alias": "igw"
+ },
+ {
+ "name": "IslandSelfWidget",
+ "alias": "isw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["igw"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["isw"]
+ },
+ {
+ "op": "align",
+ "reference": "verticalCenter",
+ "apply_to": ["igw", "isw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/screen_b/guest_island.json b/src/main/resources/assets/skyblocker/tabhud/screen_b/guest_island.json
new file mode 100644
index 00000000..54a4039d
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/screen_b/guest_island.json
@@ -0,0 +1,29 @@
+{
+ "widgets":[
+ {
+ "name": "IslandGuestsWidget",
+ "alias": "igw"
+ },
+ {
+ "name": "IslandOwnersWidget",
+ "alias": "iow"
+ }
+ ],
+ "layout": [
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["igw"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["iow"]
+ },
+ {
+ "op": "align",
+ "reference": "verticalCenter",
+ "apply_to": ["igw", "iow"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/screen_b/home_island.json b/src/main/resources/assets/skyblocker/tabhud/screen_b/home_island.json
new file mode 100644
index 00000000..772e0594
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/screen_b/home_island.json
@@ -0,0 +1,29 @@
+{
+ "widgets":[
+ {
+ "name": "IslandGuestsWidget",
+ "alias": "igw"
+ },
+ {
+ "name": "IslandSelfWidget",
+ "alias": "isw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["igw"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["isw"]
+ },
+ {
+ "op": "align",
+ "reference": "verticalCenter",
+ "apply_to": ["igw", "isw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/screen_b/unknown.json b/src/main/resources/assets/skyblocker/tabhud/screen_b/unknown.json
new file mode 100644
index 00000000..b682cc3d
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/screen_b/unknown.json
@@ -0,0 +1,17 @@
+{
+ "widgets": [
+ {
+ "name": "ErrorWidget",
+ "alias": "ew"
+ }
+ ],
+ "layout": [
+ {
+ "op": "place",
+ "where": "center",
+ "apply_to": [
+ "ew"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/standard/crimson_isle.json b/src/main/resources/assets/skyblocker/tabhud/standard/crimson_isle.json
new file mode 100644
index 00000000..7584c423
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/standard/crimson_isle.json
@@ -0,0 +1,44 @@
+{
+ "widgets":[
+ {
+ "name": "ServerWidget",
+ "alias": "sw"
+ },
+ {
+ "name": "ReputationWidget",
+ "alias": "rw"
+ },
+ {
+ "name": "QuestWidget",
+ "alias": "qw"
+ },
+ {
+ "name": "VolcanoWidget",
+ "alias": "vw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "center",
+ "apply_to": ["sw", "rw"]
+ },
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "center",
+ "apply_to": ["qw", "vw"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["sw", "rw"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["qw", "vw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/standard/crystal_hollows.json b/src/main/resources/assets/skyblocker/tabhud/standard/crystal_hollows.json
new file mode 100644
index 00000000..7a9db97d
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/standard/crystal_hollows.json
@@ -0,0 +1,44 @@
+{
+ "widgets":[
+ {
+ "name": "ServerWidget",
+ "alias": "sw"
+ },
+ {
+ "name": "PowderWidget",
+ "alias": "pw"
+ },
+ {
+ "name": "CommsWidget",
+ "alias": "cw"
+ },
+ {
+ "name": "ForgeWidget",
+ "alias": "fw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "center",
+ "apply_to": ["sw", "cw"]
+ },
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "center",
+ "apply_to": ["fw", "pw"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["sw", "cw"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["pw", "fw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/standard/default.json b/src/main/resources/assets/skyblocker/tabhud/standard/default.json
new file mode 100644
index 00000000..99ca3323
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/standard/default.json
@@ -0,0 +1,17 @@
+{
+ "widgets": [
+ {
+ "name": "ServerWidget",
+ "alias": "sw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "place",
+ "where": "center",
+ "apply_to": [
+ "sw"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/standard/dungeon.json b/src/main/resources/assets/skyblocker/tabhud/standard/dungeon.json
new file mode 100644
index 00000000..f0fce5c6
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/standard/dungeon.json
@@ -0,0 +1,52 @@
+{
+ "widgets":[
+ {
+ "name": "DungeonDownedWidget",
+ "alias": "ddow"
+ },
+ {
+ "name": "DungeonDeathWidget",
+ "alias": "ddew"
+ },
+ {
+ "name": "DungeonSecretWidget",
+ "alias": "dscw"
+ },
+ {
+ "name": "DungeonServerWidget",
+ "alias": "dsrw"
+ },
+ {
+ "name": "DungeonPuzzleWidget",
+ "alias": "dpuw"
+ },
+ {
+ "name": "DungeonBuffWidget",
+ "alias": "dbw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "center",
+ "apply_to": ["ddow", "ddew", "dbw"]
+ },
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "center",
+ "apply_to": ["dsrw", "dpuw", "dscw"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["ddow", "ddew", "dbw"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["dsrw", "dpuw", "dscw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/standard/dungeon_hub.json b/src/main/resources/assets/skyblocker/tabhud/standard/dungeon_hub.json
new file mode 100644
index 00000000..09b39296
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/standard/dungeon_hub.json
@@ -0,0 +1,25 @@
+{
+ "widgets":[
+ {
+ "name": "ServerWidget",
+ "alias": "sw"
+ },
+ {
+ "name": "EssenceWidget",
+ "alias": "ew"
+ }
+ ],
+ "layout": [
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "center",
+ "apply_to": ["sw", "ew"]
+ },
+ {
+ "op": "align",
+ "reference": "horizontalCenter",
+ "apply_to": ["sw", "ew"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/standard/dwarven_mines.json b/src/main/resources/assets/skyblocker/tabhud/standard/dwarven_mines.json
new file mode 100644
index 00000000..7a9db97d
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/standard/dwarven_mines.json
@@ -0,0 +1,44 @@
+{
+ "widgets":[
+ {
+ "name": "ServerWidget",
+ "alias": "sw"
+ },
+ {
+ "name": "PowderWidget",
+ "alias": "pw"
+ },
+ {
+ "name": "CommsWidget",
+ "alias": "cw"
+ },
+ {
+ "name": "ForgeWidget",
+ "alias": "fw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "center",
+ "apply_to": ["sw", "cw"]
+ },
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "center",
+ "apply_to": ["fw", "pw"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["sw", "cw"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["pw", "fw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/standard/farming_island.json b/src/main/resources/assets/skyblocker/tabhud/standard/farming_island.json
new file mode 100644
index 00000000..16e0c0c0
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/standard/farming_island.json
@@ -0,0 +1,25 @@
+{
+ "widgets":[
+ {
+ "name": "ServerWidget",
+ "alias": "sw"
+ },
+ {
+ "name": "TrapperWidget",
+ "alias": "tw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "center",
+ "apply_to": ["sw", "tw"]
+ },
+ {
+ "op": "align",
+ "reference": "horizontalCenter",
+ "apply_to": ["sw", "tw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/standard/garden.json b/src/main/resources/assets/skyblocker/tabhud/standard/garden.json
new file mode 100644
index 00000000..cc270c02
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/standard/garden.json
@@ -0,0 +1,44 @@
+{
+ "widgets":[
+ {
+ "name": "GardenServerWidget",
+ "alias": "gsw"
+ },
+ {
+ "name": "ComposterWidget",
+ "alias": "cw"
+ },
+ {
+ "name": "GardenVisitorsWidget",
+ "alias": "vw"
+ },
+ {
+ "name": "CameraPositionWidget",
+ "alias": "cpw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "center",
+ "apply_to": ["gsw", "vw"]
+ },
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "center",
+ "apply_to": ["cw", "cpw"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["gsw", "vw"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["cw", "cpw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/standard/guest_island.json b/src/main/resources/assets/skyblocker/tabhud/standard/guest_island.json
new file mode 100644
index 00000000..cc1be77f
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/standard/guest_island.json
@@ -0,0 +1,17 @@
+{
+ "widgets": [
+ {
+ "name": "GuestServerWidget",
+ "alias": "gsw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "place",
+ "where": "center",
+ "apply_to": [
+ "gsw"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/standard/home_island.json b/src/main/resources/assets/skyblocker/tabhud/standard/home_island.json
new file mode 100644
index 00000000..6fe3c32d
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/standard/home_island.json
@@ -0,0 +1,29 @@
+{
+ "widgets":[
+ {
+ "name": "IslandServerWidget",
+ "alias": "isw"
+ },
+ {
+ "name": "MinionWidget",
+ "alias": "mw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["isw"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["mw"]
+ },
+ {
+ "op": "align",
+ "reference": "verticalCenter",
+ "apply_to": ["isw", "mw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/standard/hub.json b/src/main/resources/assets/skyblocker/tabhud/standard/hub.json
new file mode 100644
index 00000000..aa66d6ea
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/standard/hub.json
@@ -0,0 +1,25 @@
+{
+ "widgets":[
+ {
+ "name": "ServerWidget",
+ "alias": "sw"
+ },
+ {
+ "name": "FireSaleWidget",
+ "alias": "fsw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "center",
+ "apply_to": ["sw", "fsw"]
+ },
+ {
+ "op": "align",
+ "reference": "horizontalCenter",
+ "apply_to": ["sw", "fsw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/standard/park.json b/src/main/resources/assets/skyblocker/tabhud/standard/park.json
new file mode 100644
index 00000000..2c8a96cc
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/standard/park.json
@@ -0,0 +1,17 @@
+{
+ "widgets": [
+ {
+ "name": "ParkServerWidget",
+ "alias": "psw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "place",
+ "where": "center",
+ "apply_to": [
+ "psw"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/standard/rift.json b/src/main/resources/assets/skyblocker/tabhud/standard/rift.json
new file mode 100644
index 00000000..2f5a48b2
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/standard/rift.json
@@ -0,0 +1,39 @@
+{
+ "widgets":[
+ {
+ "name": "RiftProgressWidget",
+ "alias": "rft"
+ },
+ {
+ "name": "GoodToKnowWidget",
+ "alias": "gtk"
+ },
+ {
+ "name": "RiftServerInfoWidget",
+ "alias": "si"
+ }
+ ],
+ "layout": [
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "center",
+ "apply_to": ["si", "gtk"]
+ },
+ {
+ "op": "align",
+ "reference": "verticalCenter",
+ "apply_to": ["rft"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["si", "gtk"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["rft"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/standard/unknown.json b/src/main/resources/assets/skyblocker/tabhud/standard/unknown.json
new file mode 100644
index 00000000..b682cc3d
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/standard/unknown.json
@@ -0,0 +1,17 @@
+{
+ "widgets": [
+ {
+ "name": "ErrorWidget",
+ "alias": "ew"
+ }
+ ],
+ "layout": [
+ {
+ "op": "place",
+ "where": "center",
+ "apply_to": [
+ "ew"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/tabhud/version.json b/src/main/resources/assets/skyblocker/tabhud/version.json
new file mode 100644
index 00000000..2fd60949
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/tabhud/version.json
@@ -0,0 +1 @@
+{ "format_version": 1 } \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_a/default.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_a/default.json
new file mode 100644
index 00000000..2002591f
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_a/default.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": "top",
+ "apply_to": ["sw", "evw", "uw"]
+ },
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "top",
+ "apply_to": ["pw", "efw"]
+ },
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "top",
+ "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/resourcepacks/default_top/assets/skyblocker/tabhud/screen_a/garden.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_a/garden.json
new file mode 100644
index 00000000..39ee5b98
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_a/garden.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": "top",
+ "apply_to": ["gsw", "evw", "uw"]
+ },
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "top",
+ "apply_to": ["pw", "efw"]
+ },
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "top",
+ "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/resourcepacks/default_top/assets/skyblocker/tabhud/screen_a/rift.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_a/rift.json
new file mode 100644
index 00000000..d18efca8
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_a/rift.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": "top",
+ "apply_to": ["stats", "ad"]
+ },
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "top",
+ "apply_to": ["profile", "shen", "cookie"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["stats", "ad"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["profile", "shen", "cookie"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_a/unknown.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_a/unknown.json
new file mode 100644
index 00000000..280a46a8
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_a/unknown.json
@@ -0,0 +1,17 @@
+{
+ "widgets": [
+ {
+ "name": "ErrorWidget",
+ "alias": "ew"
+ }
+ ],
+ "layout": [
+ {
+ "op": "place",
+ "where": "centerTop",
+ "apply_to": [
+ "ew"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/default.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/default.json
new file mode 100644
index 00000000..e857ee6f
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/default.json
@@ -0,0 +1,17 @@
+{
+ "widgets": [
+ {
+ "name": "PlayerListWidget",
+ "alias": "plw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "place",
+ "where": "centerTop",
+ "apply_to": [
+ "plw"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/dungeon.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/dungeon.json
new file mode 100644
index 00000000..78fb6a25
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/dungeon.json
@@ -0,0 +1,54 @@
+{
+ "widgets":[
+ {
+ "name": "DungeonPlayerWidget",
+ "alias": "dpw1",
+ "player": 1
+ },
+ {
+ "name": "DungeonPlayerWidget",
+ "alias": "dpw2",
+ "player": 2
+ },
+ {
+ "name": "DungeonPlayerWidget",
+ "alias": "dpw3",
+ "player": 3
+ },
+ {
+ "name": "DungeonPlayerWidget",
+ "alias": "dpw4",
+ "player": 4
+ },
+ {
+ "name": "DungeonPlayerWidget",
+ "alias": "dpw5",
+ "player": 5
+ }
+ ],
+ "layout": [
+ {
+ "op": "stack",
+ "direction": "horizontal",
+ "align": "center",
+ "apply_to": ["dpw1", "dpw2", "dpw3"]
+ },
+ {
+ "op": "stack",
+ "direction": "horizontal",
+ "align": "center",
+ "apply_to": ["dpw4", "dpw5"]
+ },
+ {
+ "op": "align",
+ "reference": "top",
+ "apply_to": ["dpw1", "dpw2", "dpw3"]
+ },
+ {
+ "op": "collideAgainst",
+ "direction": "bot",
+ "widgets": ["dpw4", "dpw5"],
+ "colliders": ["dpw1", "dpw2", "dpw3"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/garden.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/garden.json
new file mode 100644
index 00000000..64fe8de4
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/garden.json
@@ -0,0 +1,29 @@
+{
+ "widgets":[
+ {
+ "name": "IslandGuestsWidget",
+ "alias": "igw"
+ },
+ {
+ "name": "IslandSelfWidget",
+ "alias": "isw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["igw"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["isw"]
+ },
+ {
+ "op": "align",
+ "reference": "top",
+ "apply_to": ["igw", "isw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/guest_island.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/guest_island.json
new file mode 100644
index 00000000..98d9bd9e
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/guest_island.json
@@ -0,0 +1,29 @@
+{
+ "widgets":[
+ {
+ "name": "IslandGuestsWidget",
+ "alias": "igw"
+ },
+ {
+ "name": "IslandOwnersWidget",
+ "alias": "iow"
+ }
+ ],
+ "layout": [
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["igw"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["iow"]
+ },
+ {
+ "op": "align",
+ "reference": "top",
+ "apply_to": ["igw", "iow"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/home_island.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/home_island.json
new file mode 100644
index 00000000..64fe8de4
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/home_island.json
@@ -0,0 +1,29 @@
+{
+ "widgets":[
+ {
+ "name": "IslandGuestsWidget",
+ "alias": "igw"
+ },
+ {
+ "name": "IslandSelfWidget",
+ "alias": "isw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["igw"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["isw"]
+ },
+ {
+ "op": "align",
+ "reference": "top",
+ "apply_to": ["igw", "isw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/unknown.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/unknown.json
new file mode 100644
index 00000000..280a46a8
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/screen_b/unknown.json
@@ -0,0 +1,17 @@
+{
+ "widgets": [
+ {
+ "name": "ErrorWidget",
+ "alias": "ew"
+ }
+ ],
+ "layout": [
+ {
+ "op": "place",
+ "where": "centerTop",
+ "apply_to": [
+ "ew"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/crimson_isle.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/crimson_isle.json
new file mode 100644
index 00000000..07e00d5f
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/crimson_isle.json
@@ -0,0 +1,44 @@
+{
+ "widgets":[
+ {
+ "name": "ServerWidget",
+ "alias": "sw"
+ },
+ {
+ "name": "ReputationWidget",
+ "alias": "rw"
+ },
+ {
+ "name": "QuestWidget",
+ "alias": "qw"
+ },
+ {
+ "name": "VolcanoWidget",
+ "alias": "vw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "top",
+ "apply_to": ["sw", "rw"]
+ },
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "top",
+ "apply_to": ["qw", "vw"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["sw", "rw"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["qw", "vw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/crystal_hollows.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/crystal_hollows.json
new file mode 100644
index 00000000..45d3c188
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/crystal_hollows.json
@@ -0,0 +1,44 @@
+{
+ "widgets":[
+ {
+ "name": "ServerWidget",
+ "alias": "sw"
+ },
+ {
+ "name": "PowderWidget",
+ "alias": "pw"
+ },
+ {
+ "name": "CommsWidget",
+ "alias": "cw"
+ },
+ {
+ "name": "ForgeWidget",
+ "alias": "fw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "top",
+ "apply_to": ["sw", "cw"]
+ },
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "top",
+ "apply_to": ["fw", "pw"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["sw", "cw"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["pw", "fw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/default.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/default.json
new file mode 100644
index 00000000..c56e2bc2
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/default.json
@@ -0,0 +1,17 @@
+{
+ "widgets": [
+ {
+ "name": "ServerWidget",
+ "alias": "sw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "place",
+ "where": "centerTop",
+ "apply_to": [
+ "sw"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/dungeon.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/dungeon.json
new file mode 100644
index 00000000..5fde959f
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/dungeon.json
@@ -0,0 +1,69 @@
+{
+ "widgets":[
+ {
+ "name": "DungeonDownedWidget",
+ "alias": "downed"
+ },
+ {
+ "name": "DungeonDeathWidget",
+ "alias": "death"
+ },
+ {
+ "name": "DungeonSecretWidget",
+ "alias": "secret"
+ },
+ {
+ "name": "DungeonServerWidget",
+ "alias": "server"
+ },
+ {
+ "name": "DungeonPuzzleWidget",
+ "alias": "puzzle"
+ },
+ {
+ "name": "DungeonBuffWidget",
+ "alias": "buffs"
+ }
+ ],
+ "layout": [
+ {
+ "op": "align",
+ "reference": "top",
+ "apply_to": ["death", "downed", "server", "secret"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["death", "buffs"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["server", "puzzle"]
+ },
+ {
+ "op": "collideAgainst",
+ "direction": "left",
+ "widgets": ["downed"],
+ "colliders": ["death"]
+ },
+ {
+ "op": "collideAgainst",
+ "direction": "right",
+ "widgets": ["secret"],
+ "colliders": ["server"]
+ },
+ {
+ "op": "collideAgainst",
+ "direction": "bot",
+ "widgets": ["buffs"],
+ "colliders": ["death", "downed"]
+ },
+ {
+ "op": "collideAgainst",
+ "direction": "bot",
+ "widgets": ["puzzle"],
+ "colliders": ["secret", "server"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/dungeon_hub.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/dungeon_hub.json
new file mode 100644
index 00000000..9a926fab
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/dungeon_hub.json
@@ -0,0 +1,30 @@
+{
+ "widgets":[
+ {
+ "name": "ServerWidget",
+ "alias": "sw"
+ },
+ {
+ "name": "EssenceWidget",
+ "alias": "ew"
+ }
+ ],
+ "layout": [
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["sw"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["ew"]
+ },
+ {
+ "op": "align",
+ "reference": "top",
+ "apply_to": ["sw", "ew"]
+ }
+
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/dwarven_mines.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/dwarven_mines.json
new file mode 100644
index 00000000..45d3c188
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/dwarven_mines.json
@@ -0,0 +1,44 @@
+{
+ "widgets":[
+ {
+ "name": "ServerWidget",
+ "alias": "sw"
+ },
+ {
+ "name": "PowderWidget",
+ "alias": "pw"
+ },
+ {
+ "name": "CommsWidget",
+ "alias": "cw"
+ },
+ {
+ "name": "ForgeWidget",
+ "alias": "fw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "top",
+ "apply_to": ["sw", "cw"]
+ },
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "top",
+ "apply_to": ["fw", "pw"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["sw", "cw"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["pw", "fw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/farming_island.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/farming_island.json
new file mode 100644
index 00000000..ca6c0d7d
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/farming_island.json
@@ -0,0 +1,29 @@
+{
+ "widgets":[
+ {
+ "name": "ServerWidget",
+ "alias": "sw"
+ },
+ {
+ "name": "TrapperWidget",
+ "alias": "tw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["sw"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["tw"]
+ },
+ {
+ "op": "align",
+ "reference": "top",
+ "apply_to": ["sw", "tw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/garden.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/garden.json
new file mode 100644
index 00000000..6a26ebaf
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/garden.json
@@ -0,0 +1,44 @@
+{
+ "widgets":[
+ {
+ "name": "GardenServerWidget",
+ "alias": "gsw"
+ },
+ {
+ "name": "ComposterWidget",
+ "alias": "cw"
+ },
+ {
+ "name": "GardenVisitorsWidget",
+ "alias": "vw"
+ },
+ {
+ "name": "CameraPositionWidget",
+ "alias": "cpw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "top",
+ "apply_to": ["gsw", "vw"]
+ },
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "top",
+ "apply_to": ["cw", "cpw"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["gsw", "vw"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["cw", "cpw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/guest_island.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/guest_island.json
new file mode 100644
index 00000000..9c8cff77
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/guest_island.json
@@ -0,0 +1,17 @@
+{
+ "widgets": [
+ {
+ "name": "GuestServerWidget",
+ "alias": "gsw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "place",
+ "where": "centerTop",
+ "apply_to": [
+ "gsw"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/home_island.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/home_island.json
new file mode 100644
index 00000000..e775d216
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/home_island.json
@@ -0,0 +1,29 @@
+{
+ "widgets":[
+ {
+ "name": "IslandServerWidget",
+ "alias": "isw"
+ },
+ {
+ "name": "MinionWidget",
+ "alias": "mw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["isw"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["mw"]
+ },
+ {
+ "op": "align",
+ "reference": "top",
+ "apply_to": ["isw", "mw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/hub.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/hub.json
new file mode 100644
index 00000000..37d77e98
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/hub.json
@@ -0,0 +1,29 @@
+{
+ "widgets":[
+ {
+ "name": "ServerWidget",
+ "alias": "sw"
+ },
+ {
+ "name": "FireSaleWidget",
+ "alias": "fsw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["sw"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["fsw"]
+ },
+ {
+ "op": "align",
+ "reference": "top",
+ "apply_to": ["sw", "fsw"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/park.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/park.json
new file mode 100644
index 00000000..c8151af9
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/park.json
@@ -0,0 +1,17 @@
+{
+ "widgets": [
+ {
+ "name": "ParkServerWidget",
+ "alias": "psw"
+ }
+ ],
+ "layout": [
+ {
+ "op": "place",
+ "where": "centerTop",
+ "apply_to": [
+ "psw"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/rift.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/rift.json
new file mode 100644
index 00000000..87414cbb
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/rift.json
@@ -0,0 +1,39 @@
+{
+ "widgets":[
+ {
+ "name": "RiftProgressWidget",
+ "alias": "rft"
+ },
+ {
+ "name": "GoodToKnowWidget",
+ "alias": "gtk"
+ },
+ {
+ "name": "RiftServerInfoWidget",
+ "alias": "si"
+ }
+ ],
+ "layout": [
+ {
+ "op": "stack",
+ "direction": "vertical",
+ "align": "top",
+ "apply_to": ["si", "gtk"]
+ },
+ {
+ "op": "align",
+ "reference": "top",
+ "apply_to": ["rft"]
+ },
+ {
+ "op": "align",
+ "reference": "leftOfCenter",
+ "apply_to": ["si", "gtk"]
+ },
+ {
+ "op": "align",
+ "reference": "rightOfCenter",
+ "apply_to": ["rft"]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/unknown.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/unknown.json
new file mode 100644
index 00000000..280a46a8
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/standard/unknown.json
@@ -0,0 +1,17 @@
+{
+ "widgets": [
+ {
+ "name": "ErrorWidget",
+ "alias": "ew"
+ }
+ ],
+ "layout": [
+ {
+ "op": "place",
+ "where": "centerTop",
+ "apply_to": [
+ "ew"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/version.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/version.json
new file mode 100644
index 00000000..2fd60949
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/version.json
@@ -0,0 +1 @@
+{ "format_version": 1 } \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/pack.mcmeta b/src/main/resources/resourcepacks/default_top/pack.mcmeta
new file mode 100644
index 00000000..764d5396
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/pack.mcmeta
@@ -0,0 +1,6 @@
+{
+ "pack": {
+ "pack_format": 15,
+ "description": "Alternative layout for Skyblocker's Fancy Tab-HUD"
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/resourcepacks/default_top/pack.png b/src/main/resources/resourcepacks/default_top/pack.png
new file mode 100644
index 00000000..04c17abf
--- /dev/null
+++ b/src/main/resources/resourcepacks/default_top/pack.png
Binary files differ