From bd8415eafe741d37f658c3235658a1f2d9fb4ed2 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Sat, 1 Apr 2023 13:22:24 -0400 Subject: Migrated to ClientReceiveMessageEvents and some fixes (cherry picked from commit 9a8799ac40b12bed3e5e4d7aa32054eba7882580) --- .../skyblocker/mixin/ChatHudListenerMixin.java | 41 ---------------------- 1 file changed, 41 deletions(-) delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java deleted file mode 100644 index 8176a810..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java +++ /dev/null @@ -1,41 +0,0 @@ -package me.xmrvizzy.skyblocker.mixin; - -import me.xmrvizzy.skyblocker.chat.ChatFilterResult; -import me.xmrvizzy.skyblocker.chat.ChatMessageListener; -import me.xmrvizzy.skyblocker.utils.Utils; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.hud.ChatHud; -import net.minecraft.client.gui.hud.MessageIndicator; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.network.message.MessageSignatureData; -import net.minecraft.text.Text; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(ChatHud.class) -public abstract class ChatHudListenerMixin { - @Shadow - @Final - private MinecraftClient client; - - @Inject(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", at = @At("HEAD"), cancellable = true) - public void skyblocker$onMessage(Text message, MessageSignatureData signature, int ticks, MessageIndicator indicator, boolean refresh, CallbackInfo ci) { - if (!Utils.isOnSkyblock) - return; - String asString = message.getString(); - ChatFilterResult result = ChatMessageListener.EVENT.invoker().onMessage(message, asString); - switch (result) { - case ACTION_BAR: - ClientPlayerEntity player = client.player; - if (player != null) - player.sendMessage(message, true); - case FILTER: - ci.cancel(); - } - } - -} -- cgit From 9cbce39d68c1c766e20819101fbb803ad05e8fdc Mon Sep 17 00:00:00 2001 From: msg-programs Date: Sun, 2 Apr 2023 14:58:42 +0200 Subject: Merging SkyHyTab into Skyblocker: Initial commit Needs cleanup --- .../xmrvizzy/skyblocker/SkyblockerInitializer.java | 2 + .../skyblocker/config/SkyblockerConfig.java | 2 + .../skyblocker/mixin/PlayerListHudAccessor.java | 18 ++ .../skyblocker/mixin/PlayerListHudMixin.java | 70 ++++++ .../skyblocker/skyblock/tabhud/TabHud.java | 40 ++++ .../skyblock/tabhud/screens/DungeonHubScreen.java | 24 ++ .../tabhud/screens/DungeonPlayerScreen.java | 30 +++ .../skyblock/tabhud/screens/DungeonScreen.java | 37 +++ .../skyblock/tabhud/screens/EmptyScreen.java | 19 ++ .../tabhud/screens/FarmingServerScreen.java | 23 ++ .../skyblock/tabhud/screens/GardenScreen.java | 23 ++ .../skyblock/tabhud/screens/GenericInfoScreen.java | 51 +++++ .../tabhud/screens/GenericServerScreen.java | 19 ++ .../skyblock/tabhud/screens/GuestPlayerScreen.java | 23 ++ .../skyblock/tabhud/screens/GuestServerScreen.java | 19 ++ .../skyblock/tabhud/screens/HomePlayerScreen.java | 22 ++ .../skyblock/tabhud/screens/HomeServerScreen.java | 24 ++ .../skyblock/tabhud/screens/HubServerScreen.java | 23 ++ .../skyblock/tabhud/screens/MineServerScreen.java | 30 +++ .../skyblock/tabhud/screens/ParkServerScreen.java | 19 ++ .../skyblock/tabhud/screens/PlayerListScreen.java | 19 ++ .../skyblocker/skyblock/tabhud/screens/Screen.java | 250 +++++++++++++++++++++ .../skyblocker/skyblock/tabhud/util/Ico.java | 50 +++++ .../skyblocker/skyblock/tabhud/util/StrMan.java | 64 ++++++ .../skyblock/tabhud/widget/CommsWidget.java | 53 +++++ .../skyblock/tabhud/widget/ComposterWidget.java | 44 ++++ .../skyblock/tabhud/widget/CookieWidget.java | 33 +++ .../skyblock/tabhud/widget/DungeonDeathWidget.java | 53 +++++ .../tabhud/widget/DungeonDownedWidget.java | 42 ++++ .../tabhud/widget/DungeonPlayerWidget.java | 83 +++++++ .../tabhud/widget/DungeonPuzzleWidget.java | 51 +++++ .../tabhud/widget/DungeonSecretWidget.java | 35 +++ .../tabhud/widget/DungeonServerWidget.java | 56 +++++ .../skyblock/tabhud/widget/EffectWidget.java | 40 ++++ .../skyblock/tabhud/widget/ElectionWidget.java | 97 ++++++++ .../skyblock/tabhud/widget/EmptyWidget.java | 27 +++ .../skyblock/tabhud/widget/EssenceWidget.java | 48 ++++ .../skyblock/tabhud/widget/EventWidget.java | 33 +++ .../skyblock/tabhud/widget/FireSaleWidget.java | 56 +++++ .../skyblock/tabhud/widget/ForgeWidget.java | 60 +++++ .../skyblock/tabhud/widget/GardenServerWidget.java | 59 +++++ .../skyblock/tabhud/widget/GuestServerWidget.java | 41 ++++ .../skyblock/tabhud/widget/IslandGuestsWidget.java | 44 ++++ .../skyblock/tabhud/widget/IslandOwnersWidget.java | 47 ++++ .../skyblock/tabhud/widget/IslandSelfWidget.java | 40 ++++ .../skyblock/tabhud/widget/IslandServerWidget.java | 47 ++++ .../skyblock/tabhud/widget/MinionWidget.java | 135 +++++++++++ .../skyblock/tabhud/widget/ParkServerWidget.java | 42 ++++ .../skyblock/tabhud/widget/PlayerListWidget.java | 61 +++++ .../skyblock/tabhud/widget/PowderWidget.java | 35 +++ .../skyblock/tabhud/widget/ProfileWidget.java | 42 ++++ .../skyblock/tabhud/widget/ServerWidget.java | 40 ++++ .../skyblock/tabhud/widget/SkillsWidget.java | 63 ++++++ .../skyblock/tabhud/widget/TrapperWidget.java | 29 +++ .../skyblock/tabhud/widget/UpgradeWidget.java | 38 ++++ .../skyblocker/skyblock/tabhud/widget/Widget.java | 183 +++++++++++++++ .../tabhud/widget/component/Component.java | 29 +++ .../widget/component/IcoFatTextComponent.java | 30 +++ .../tabhud/widget/component/IcoTextComponent.java | 26 +++ .../widget/component/PlainTextComponent.java | 22 ++ .../tabhud/widget/component/PlayerComponent.java | 33 +++ .../tabhud/widget/component/ProgressComponent.java | 49 ++++ .../tabhud/widget/component/TableComponent.java | 53 +++++ src/main/resources/skyblocker.mixins.json | 4 +- 64 files changed, 2903 insertions(+), 1 deletion(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudAccessor.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/TabHud.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/DungeonHubScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/DungeonPlayerScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/DungeonScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/EmptyScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/FarmingServerScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GardenScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GenericInfoScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GenericServerScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GuestPlayerScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GuestServerScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/HomePlayerScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/HomeServerScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/HubServerScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/MineServerScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ParkServerScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PlayerListScreen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/Ico.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/StrMan.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CommsWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ComposterWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CookieWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonDeathWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonDownedWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonPlayerWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonPuzzleWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonServerWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EffectWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ElectionWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EmptyWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EssenceWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EventWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ForgeWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GardenServerWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandGuestsWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandOwnersWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandSelfWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandServerWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/MinionWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ParkServerWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PowderWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ProfileWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ServerWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/SkillsWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/TrapperWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/UpgradeWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/Widget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/Component.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoFatTextComponent.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoTextComponent.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlainTextComponent.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/TableComponent.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java index 3d713727..c866ea01 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java @@ -9,6 +9,7 @@ import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHud; import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup; import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; +import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud; import me.xmrvizzy.skyblocker.utils.UpdateChecker; import net.fabricmc.api.ClientModInitializer; @@ -25,5 +26,6 @@ public class SkyblockerInitializer implements ClientModInitializer { ChatMessageListener.init(); UpdateChecker.init(); DiscordRPCManager.init(); + TabHud.init(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 21322c81..41ac7f2d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -125,6 +125,8 @@ public class SkyblockerConfig implements ConfigData { public final boolean enableUpdateNotification = true; public final boolean backpackPreviewWithoutShift = false; + public boolean tabHudEnabled = true; + @ConfigEntry.Gui.Excluded public String apiKey; diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudAccessor.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudAccessor.java new file mode 100644 index 00000000..e96e4ede --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudAccessor.java @@ -0,0 +1,18 @@ +package me.xmrvizzy.skyblocker.mixin; + +import java.util.Comparator; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.client.gui.hud.PlayerListHud; +import net.minecraft.client.network.PlayerListEntry; + +@Mixin(PlayerListHud.class) +public interface PlayerListHudAccessor { + + @Accessor("ENTRY_ORDERING") + public static Comparator getOrdering() { + throw new AssertionError(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java new file mode 100644 index 00000000..36d4a375 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java @@ -0,0 +1,70 @@ +package me.xmrvizzy.skyblocker.mixin; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud; +import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.hud.PlayerListHud; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraft.scoreboard.ScoreboardObjective; +import net.minecraft.text.Text; + +@Environment(EnvType.CLIENT) +@Mixin(PlayerListHud.class) +public class PlayerListHudMixin { + + @Shadow + private Text footer; + + boolean ok = true; + @Inject(at = @At("HEAD"), method = "render(Lnet/minecraft/client/util/math/MatrixStack;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreboardObjective;)V", cancellable = true) + public void skyblocker$renderTabHud(MatrixStack ms, int scaledW, Scoreboard sb, ScoreboardObjective sbo, CallbackInfo info) { + + if (!Utils.isOnSkyblock) { + return; + } + + if (TabHud.defaultTgl.isPressed()) { + return; + } + + MinecraftClient client = MinecraftClient.getInstance(); + ClientPlayNetworkHandler nwH = client.getNetworkHandler(); + if (nwH == null) { + return; + } + + List list = nwH.getListedPlayerListEntries().stream().sorted(PlayerListHudAccessor.getOrdering()).toList(); + int w = scaledW; + int h = MinecraftClient.getInstance().getWindow().getScaledHeight(); + + try { + + Screen screen = Screen.getCorrect(w, h, list, footer); + if (screen != null) { + screen.render(ms); + info.cancel(); + } + } catch (Exception e) { + e.printStackTrace(); + SkyblockerConfig.get().general.tabHudEnabled = false; + MinecraftClient.getInstance().player.sendMessage(Text.of("The tab HUD has crashed due to some unexpected text, see log! :(")); + } + + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/TabHud.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/TabHud.java new file mode 100644 index 00000000..3cc75e00 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/TabHud.java @@ -0,0 +1,40 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud; + +import org.lwjgl.glfw.GLFW; + +import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +import net.minecraft.client.option.KeyBinding; +import net.minecraft.client.util.InputUtil; + +public class TabHud { + + public static KeyBinding playerTgl; + public static KeyBinding genericTgl; + // public static KeyBinding mapTgl; + public static KeyBinding defaultTgl; + + public static void init() { + + playerTgl = KeyBindingHelper.registerKeyBinding( + new KeyBinding("key.skyhytab.playerTgl", + InputUtil.Type.KEYSYM, + GLFW.GLFW_KEY_LEFT_SHIFT, + "key.categories.skyblocker")); + genericTgl = KeyBindingHelper.registerKeyBinding( + new KeyBinding("key.tabhud.genericTgl", + InputUtil.Type.KEYSYM, + GLFW.GLFW_KEY_LEFT_ALT, + "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.tabhud.defaultTgl", + InputUtil.Type.KEYSYM, + GLFW.GLFW_KEY_B, + "key.categories.skyblocker")); + + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/DungeonHubScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/DungeonHubScreen.java new file mode 100644 index 00000000..4bd48f89 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/DungeonHubScreen.java @@ -0,0 +1,24 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.EssenceWidget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ServerWidget; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.Text; + +public class DungeonHubScreen extends Screen{ + + public DungeonHubScreen(int w, int h, List list, Text footer) { + super(w, h); + ServerWidget sw = new ServerWidget(list); + EssenceWidget ew = new EssenceWidget(list); + centerW(sw); + centerW(ew); + stackWidgetsH(sw, ew); + this.addWidget(ew); + this.addWidget(sw); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/DungeonPlayerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/DungeonPlayerScreen.java new file mode 100644 index 00000000..ce87a035 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/DungeonPlayerScreen.java @@ -0,0 +1,30 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.DungeonPlayerWidget; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.Text; + +public class DungeonPlayerScreen extends Screen { + + public DungeonPlayerScreen(int w, int h, List ple, Text footer) { + super(w, h); + DungeonPlayerWidget dpw1 = new DungeonPlayerWidget(ple, 1); + DungeonPlayerWidget dpw2 = new DungeonPlayerWidget(ple, 2); + DungeonPlayerWidget dpw3 = new DungeonPlayerWidget(ple, 3); + DungeonPlayerWidget dpw4 = new DungeonPlayerWidget(ple, 4); + DungeonPlayerWidget dpw5 = new DungeonPlayerWidget(ple, 5); + + offCenterL(dpw1); + offCenterL(dpw2); + offCenterL(dpw3); + offCenterR(dpw4); + offCenterR(dpw5); + stackWidgetsH(dpw1, dpw2, dpw3); + stackWidgetsH(dpw4, dpw5); + addWidgets(dpw1, dpw2, dpw3, dpw4, dpw5); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/DungeonScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/DungeonScreen.java new file mode 100644 index 00000000..bb80b01b --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/DungeonScreen.java @@ -0,0 +1,37 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.List; + +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.client.network.PlayerListEntry; +import net.minecraft.text.Text; + +public class DungeonScreen extends Screen { + + public DungeonScreen(int w, int h, List ple, Text footer) { + super(w, h); + DungeonDownedWidget ddow = new DungeonDownedWidget(ple); + DungeonDeathWidget ddew = new DungeonDeathWidget(ple); + DungeonSecretWidget dscw = new DungeonSecretWidget(ple); + DungeonServerWidget dsrw = new DungeonServerWidget(ple); + DungeonPuzzleWidget dpuw = new DungeonPuzzleWidget(ple); + + offCenterL(ddow); + offCenterL(ddew); + offCenterL(dscw); + offCenterR(dsrw); + offCenterR(dpuw); + + stackWidgetsH(ddow, ddew, dscw); + stackWidgetsH(dsrw, dpuw); + + addWidgets(ddow, ddew, dscw, dsrw, dpuw); + + } + +} 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 new file mode 100644 index 00000000..07162834 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/EmptyScreen.java @@ -0,0 +1,19 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.EmptyWidget; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.Text; + +public class EmptyScreen extends Screen { + + public EmptyScreen(int w, int h, List ple, Text footer) { + super(w, h); + EmptyWidget ew = new EmptyWidget(ple); + this.center(ew); + this.addWidget(ew); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/FarmingServerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/FarmingServerScreen.java new file mode 100644 index 00000000..f66638a9 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/FarmingServerScreen.java @@ -0,0 +1,23 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ServerWidget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.TrapperWidget; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.Text; + +public class FarmingServerScreen extends Screen{ + + public FarmingServerScreen(int w, int h, List list, Text footer) { + super(w, h); + ServerWidget sw = new ServerWidget(list); + TrapperWidget tw = new TrapperWidget(list); + centerW(sw); + centerW(tw); + stackWidgetsH(sw, tw); + this.addWidgets(tw, sw); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GardenScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GardenScreen.java new file mode 100644 index 00000000..30f4bbc3 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GardenScreen.java @@ -0,0 +1,23 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ComposterWidget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.GardenServerWidget; +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.Text; + +public class GardenScreen extends Screen{ + + public GardenScreen(int w, int h, List ple, Text footer) { + super(w, h); + GardenServerWidget gsw = new GardenServerWidget(ple); + ComposterWidget cw = new ComposterWidget(ple); + + this.stackWidgetsH(gsw, cw); + this.centerW(gsw); + this.centerW(cw); + this.addWidgets(gsw, cw); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GenericInfoScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GenericInfoScreen.java new file mode 100644 index 00000000..01b159e2 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GenericInfoScreen.java @@ -0,0 +1,51 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.List; + +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.client.network.PlayerListEntry; +import net.minecraft.text.Text; + +public class GenericInfoScreen extends Screen { + + public GenericInfoScreen(int w, int h, List ple, Text footer) { + super(w, h); + + String f = footer.getString(); + + SkillsWidget sw = new SkillsWidget(ple); + EventWidget evw = new EventWidget(ple); + UpgradeWidget uw = new UpgradeWidget(f); + + ProfileWidget pw = new ProfileWidget(ple); + EffectWidget efw = new EffectWidget(f); + + ElectionWidget elw = new ElectionWidget(ple); + CookieWidget cw = new CookieWidget(f); + + // goofy ahh layout code incoming + 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/GenericServerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GenericServerScreen.java new file mode 100644 index 00000000..fee4a9f8 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GenericServerScreen.java @@ -0,0 +1,19 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ServerWidget; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.Text; + +public class GenericServerScreen extends Screen { + + public GenericServerScreen(int w, int h, List ple, Text footer) { + super(w, h); + ServerWidget sw = new ServerWidget(ple); + this.center(sw); + this.addWidget(sw); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GuestPlayerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GuestPlayerScreen.java new file mode 100644 index 00000000..4647da7a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GuestPlayerScreen.java @@ -0,0 +1,23 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.IslandGuestsWidget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.IslandOwnersWidget; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.Text; + +public class GuestPlayerScreen extends Screen{ + + public GuestPlayerScreen(int w, int h, List list, Text footer) { + super(w, h); + IslandGuestsWidget igw = new IslandGuestsWidget(list); + IslandOwnersWidget iow = new IslandOwnersWidget(list); + 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/GuestServerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GuestServerScreen.java new file mode 100644 index 00000000..03e22292 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/GuestServerScreen.java @@ -0,0 +1,19 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.GuestServerWidget; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.Text; + +public class GuestServerScreen extends Screen{ + + public GuestServerScreen(int w, int h, List list, Text footer) { + super(w, h); + GuestServerWidget gsw = new GuestServerWidget(list); + this.center(gsw); + this.addWidget(gsw); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/HomePlayerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/HomePlayerScreen.java new file mode 100644 index 00000000..506f773f --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/HomePlayerScreen.java @@ -0,0 +1,22 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.IslandGuestsWidget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.IslandSelfWidget; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.Text; + +public class HomePlayerScreen extends Screen { + + public HomePlayerScreen(int w, int h, List list, Text footer) { + super(w, h); + IslandSelfWidget isw = new IslandSelfWidget(list); + IslandGuestsWidget igw = new IslandGuestsWidget(list); + 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/HomeServerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/HomeServerScreen.java new file mode 100644 index 00000000..6d67f829 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/HomeServerScreen.java @@ -0,0 +1,24 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.IslandServerWidget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.MinionWidget; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.Text; + +public class HomeServerScreen extends Screen { + + public HomeServerScreen(int w, int h, List list, Text footer) { + super(w, h); + + IslandServerWidget isw = new IslandServerWidget(list); + MinionWidget mw = new MinionWidget(list); + 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/HubServerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/HubServerScreen.java new file mode 100644 index 00000000..15ac3183 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/HubServerScreen.java @@ -0,0 +1,23 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.FireSaleWidget; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ServerWidget; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.Text; + +public class HubServerScreen extends Screen { + + public HubServerScreen(int w, int h, List ple, Text footer) { + super(w, h); + ServerWidget sw = new ServerWidget(ple); + FireSaleWidget fsw = new FireSaleWidget(ple); + 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/MineServerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/MineServerScreen.java new file mode 100644 index 00000000..0e581852 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/MineServerScreen.java @@ -0,0 +1,30 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.List; + +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.client.network.PlayerListEntry; +import net.minecraft.text.Text; + +public class MineServerScreen extends Screen{ + + public MineServerScreen(int w, int h, List list, Text footer) { + super(w, h); + ServerWidget sw = new ServerWidget(list); + PowderWidget pw = new PowderWidget(list); + CommsWidget cw = new CommsWidget(list); + ForgeWidget fw = new ForgeWidget(list); + stackWidgetsH(sw, pw, cw); + centerH(fw); + offCenterL(sw); + offCenterL(pw); + offCenterL(cw); + offCenterR(fw); + this.addWidgets(fw, cw, pw, sw); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ParkServerScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ParkServerScreen.java new file mode 100644 index 00000000..bb601251 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/ParkServerScreen.java @@ -0,0 +1,19 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ParkServerWidget; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.Text; + +public class ParkServerScreen extends Screen{ + + public ParkServerScreen(int w, int h, List ple, Text footer) { + super(w, h); + ParkServerWidget sw = new ParkServerWidget(ple); + this.center(sw); + this.addWidget(sw); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PlayerListScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PlayerListScreen.java new file mode 100644 index 00000000..14adc322 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/PlayerListScreen.java @@ -0,0 +1,19 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.PlayerListWidget; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.Text; + +public class PlayerListScreen extends Screen { + + public PlayerListScreen(int w, int h, List ple, Text footer) { + super(w, h); + PlayerListWidget plw = new PlayerListWidget(ple); + this.center(plw); + this.addWidget(plw); + } + +} 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 new file mode 100644 index 00000000..8e99698b --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java @@ -0,0 +1,250 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; + +import java.util.ArrayList; +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; + +public class Screen { + + private enum ScreenType { + 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, + NONE + } + + private ArrayList widgets = new ArrayList<>(); + private int w, h; + + public Screen(int w, int h) { + this.w = w; + this.h = h; + } + + public void addWidget(Widget w) { + widgets.add(w); + } + + public void addWidgets(Widget... ws) { + for (Widget w : ws) { + widgets.add(w); + } + } + + public void render(MatrixStack ms) { + for (Widget w : widgets) { + w.render(ms); + } + } + + 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; + } + } + + 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; + } + } + + public void centerH(Widget wid) { + wid.setY((h - wid.getHeight()) / 2); + } + + public void centerW(Widget wid) { + wid.setX((w - wid.getWidth()) / 2); + } + + public void center(Widget wid) { + this.centerH(wid); + this.centerW(wid); + } + + public void offCenterL(Widget wid) { + int wHalf = this.w / 2; + wid.setX(wHalf - 3 - wid.getWidth()); + } + + 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); + } + + public static Screen getCorrect(int w, int h, List ple, Text footer) { + if (TabHud.genericTgl.isPressed()) { + return new GenericInfoScreen(w, h, ple, footer); + // } else if (TabHud.mapTgl.isPressed()) { + // return Screen.correctMapScrn(w, h, ple, footer); + } else if (TabHud.playerTgl.isPressed()) { + return Screen.correctPlayerScrn(w, h, ple, footer); + } else { + return Screen.correctMainScrn(w, h, ple, footer); + } + } + + private static ScreenType getScreenType(List ple) { + String cat2Name = StrMan.strAt(ple, 40); + + if (cat2Name.contains("Dungeon Stats")) { + return ScreenType.DUNGEON; + } + + String areaDesciptor = StrMan.strAt(ple, 41).substring(6); + switch (areaDesciptor) { + case "Private Island": + if (ple.get(44).getDisplayName().getString().endsWith("Guest")) { + return ScreenType.GUEST_ISLAND; + } else { + return ScreenType.HOME_ISLAND; + } + case "Crimson Isle": + return ScreenType.CRIMSON_ISLE; + case "Dungeon Hub": + return ScreenType.DUNGEON_HUB; + case "The Farming Islands": + return ScreenType.FARMING_ISLAND; + case "The Park": + return ScreenType.PARK; + case "Dwarven Mines": + return ScreenType.DWARVEN_MINES; + case "Crystal Hollows": + return ScreenType.CRYSTAL_HOLLOWS; + case "The End": + return ScreenType.END; + case "Gold Mine": + return ScreenType.GOLD_MINE; + case "Deep Caverns": + return ScreenType.DEEP_CAVERNS; + case "Hub": + return ScreenType.HUB; + case "Spider's Den": + return ScreenType.SPIDER_DEN; + case "Jerry's Workshop": + return ScreenType.JERRY; + case "Garden": + return ScreenType.GARDEN; + default: + return ScreenType.NONE; + } + } + + // private static Screen correctMapScrn(int w, int h, List list, Text footer) { + // // return switch (getScreenType(list)) { + // // case CRYSTAL_HOLLOWS -> null; + // // case DUNGEON -> null; + // // default -> new EmptyScreen(w, h, list, footer); + // // }; + // return new EmptyScreen(w, h, list, footer); + // } + + private static Screen correctPlayerScrn(int w, int h, List list, Text footer) { + return switch (getScreenType(list)) { + case GUEST_ISLAND -> new GuestPlayerScreen(w, h, list, footer); // ok + case HOME_ISLAND -> new HomePlayerScreen(w, h, list, footer); // ok + case DUNGEON -> new DungeonPlayerScreen(w, h, list, footer); + default -> new PlayerListScreen(w, h, list, footer); // ok + }; + } + + private static Screen correctMainScrn(int w, int h, List list, Text footer) { + return switch (getScreenType(list)) { + case PARK -> new ParkServerScreen(w, h, list, footer); // ok + case HUB -> new HubServerScreen(w, h, list, footer); // ok + case HOME_ISLAND -> new HomeServerScreen(w, h, list, footer); // ok + case GUEST_ISLAND -> new GuestServerScreen(w, h, list, footer); // ok + case CRYSTAL_HOLLOWS, DWARVEN_MINES -> new MineServerScreen(w, h, list, footer); + case FARMING_ISLAND -> new FarmingServerScreen(w, h, list, footer); // ok + case DUNGEON_HUB -> new DungeonHubScreen(w, h, list, footer); // ok + case DUNGEON -> new DungeonScreen(w, h, list, footer); + case CRIMSON_ISLE -> null; // TODO + case GARDEN -> new GardenScreen(w, h, list, footer); + default -> new GenericServerScreen(w, h, list, footer); // ok + }; + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/Ico.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/Ico.java new file mode 100644 index 00000000..a9f8e22f --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/Ico.java @@ -0,0 +1,50 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.util; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; + +public class Ico { + public static final ItemStack MAP = new ItemStack(Items.FILLED_MAP); + public static final ItemStack NTAG = new ItemStack(Items.NAME_TAG); + public static final ItemStack EMERALD = new ItemStack(Items.EMERALD); + public static final ItemStack CLOCK = new ItemStack(Items.CLOCK); + public static final ItemStack DIASWORD = new ItemStack(Items.DIAMOND_SWORD); + public static final ItemStack DBUSH = new ItemStack(Items.DEAD_BUSH); + public static final ItemStack VILLAGER = new ItemStack(Items.VILLAGER_SPAWN_EGG); + public static final ItemStack MOREGOLD = new ItemStack(Items.GOLDEN_APPLE); + public static final ItemStack COMPASS = new ItemStack(Items.COMPASS); + public static final ItemStack SUGAR = new ItemStack(Items.SUGAR); + public static final ItemStack HOE = new ItemStack(Items.IRON_HOE); + public static final ItemStack GOLD = new ItemStack(Items.GOLD_INGOT); + public static final ItemStack BONE = new ItemStack(Items.BONE); + public static final ItemStack SIGN = new ItemStack(Items.OAK_SIGN); + public static final ItemStack FISH_ROD = new ItemStack(Items.FISHING_ROD); + public static final ItemStack SWORD = new ItemStack(Items.IRON_SWORD); + public static final ItemStack LANTERN = new ItemStack(Items.LANTERN); + public static final ItemStack COOKIE = new ItemStack(Items.COOKIE); + public static final ItemStack POTION = new ItemStack(Items.POTION); + public static final ItemStack BARRIER = new ItemStack(Items.BARRIER); + public static final ItemStack PLAYER = new ItemStack(Items.PLAYER_HEAD); + public static final ItemStack WATER = new ItemStack(Items.WATER_BUCKET); + public static final ItemStack LEATHER = new ItemStack(Items.LEATHER); + public static final ItemStack MITHRIL = new ItemStack(Items.PRISMARINE_CRYSTALS); + public static final ItemStack REDSTONE = new ItemStack(Items.REDSTONE); + public static final ItemStack FIRE = new ItemStack(Items.CAMPFIRE); + public static final ItemStack STRING = new ItemStack(Items.STRING); + public static final ItemStack WITHER = new ItemStack(Items.WITHER_SKELETON_SKULL); + public static final ItemStack FLESH = new ItemStack(Items.ROTTEN_FLESH); + public static final ItemStack DRAGON = new ItemStack(Items.DRAGON_HEAD); + public static final ItemStack DIAMOND = new ItemStack(Items.DIAMOND); + public static final ItemStack ICE = new ItemStack(Items.ICE); + public static final ItemStack CHEST = new ItemStack(Items.CHEST); + public static final ItemStack COMMAND = new ItemStack(Items.COMMAND_BLOCK); + public static final ItemStack SKULL = new ItemStack(Items.SKELETON_SKULL); + public static final ItemStack BOOK = new ItemStack(Items.WRITABLE_BOOK); + public static final ItemStack FURNACE = new ItemStack(Items.FURNACE); + public static final ItemStack CHESTPLATE = new ItemStack(Items.IRON_CHESTPLATE); + public static final ItemStack B_ROD = new ItemStack(Items.BLAZE_ROD); + public static final ItemStack BOW = new ItemStack(Items.BOW); + public static final ItemStack COPPER = new ItemStack(Items.COPPER_INGOT); + public static final ItemStack COMPOSTER = new ItemStack(Items.COMPOSTER); + public static final ItemStack SAPLING = new ItemStack(Items.OAK_SAPLING); +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/StrMan.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/StrMan.java new file mode 100644 index 00000000..8cd77ac2 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/StrMan.java @@ -0,0 +1,64 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.util; + +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +public class StrMan { + + private static final Logger LOGGER = LoggerFactory.getLogger(StrMan.class.getName()); + private static final Text ERROR_TXT = Text.literal("[ERROR]").formatted(Formatting.RED, Formatting.BOLD); + + public static Text stdEntry(List ple, int idx, String entryName, Formatting contentFmt) { + Text txt = ple.get(idx).getDisplayName(); + if (txt == null) { + return ERROR_TXT; + } + String src = txt.getString(); + src = src.substring(src.indexOf(':') + 1); + return StrMan.stdEntry(src, entryName, contentFmt); + } + + public static Text stdEntry(String entryContent, String entryName, Formatting contentFmt) { + return Text.literal(entryName).append(Text.literal(entryContent).formatted(contentFmt)); + } + + public static Text plainEntry(List ple, int idx) { + Text txt = ple.get(idx).getDisplayName(); + if (txt == null) { + return ERROR_TXT; + } + return Text.of(txt.getString().trim()); + } + + public static Matcher regexAt(List ple, int idx, Pattern p) { + Text txt = ple.get(idx).getDisplayName(); + if (txt == null) { + return null; + } + String str = txt.getString(); + Matcher m = p.matcher(str); + if (!m.matches()) { + LOGGER.error("ERROR: Regex {} failed for input \"{}\"", p.pattern(), str); + return null; + } else { + return m; + } + } + + public static String strAt(List ple, int idx) { + Text txt = ple.get(idx).getDisplayName(); + if (txt == null) { + return null; + } + return txt.getString(); + } + +} 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 new file mode 100644 index 00000000..ef86b8f0 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CommsWidget.java @@ -0,0 +1,53 @@ +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.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.ProgressComponent; + +import net.minecraft.client.network.PlayerListEntry; +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. +// works in both the dwarven mines and the CH + +public class CommsWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Commissions").formatted(Formatting.DARK_AQUA, + Formatting.BOLD); + + // match a comm + // group 1: comm name + // group 2: comm progress (without "%" for comms that show a percentage) + private static final Pattern COMM_PATTERN = Pattern.compile(" (.*): (.*)%?"); + + public CommsWidget(List list) { + super(TITLE, Formatting.DARK_AQUA.getColorValue()); + + for (int i = 50; i <= 51; i++) { + Matcher m = StrMan.regexAt(list, i, COMM_PATTERN); + + String g2 = m.group(2); + ProgressComponent pc; + if (g2.equals("DONE")) { + pc = new ProgressComponent(Ico.BOOK, Text.of(m.group(1)), Text.of(g2), 100f, pcntToCol(100)); + } else { + float pcnt = Float.parseFloat(g2.substring(0, g2.length() - 1)); + pc = new ProgressComponent(Ico.BOOK, Text.of(m.group(1)), pcnt, pcntToCol(pcnt)); + } + this.addComponent(pc); + } + this.pack(); + } + + 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/ComposterWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ComposterWidget.java new file mode 100644 index 00000000..2537b90a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ComposterWidget.java @@ -0,0 +1,44 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows info about the garden's composter + +public class ComposterWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Composter").formatted(Formatting.GREEN, + Formatting.BOLD); + + + public ComposterWidget(List list) { + super(TITLE, Formatting.GREEN.getColorValue()); + + Text matter = StrMan.stdEntry(list, 48, "Organic Matter:", Formatting.YELLOW); + IcoTextComponent mat = new IcoTextComponent(Ico.SAPLING, matter); + this.addComponent(mat); + + Text fuel = StrMan.stdEntry(list, 49, "Fuel:", Formatting.BLUE); + IcoTextComponent f = new IcoTextComponent(Ico.FURNACE, fuel); + this.addComponent(f); + + Text timeLeft = StrMan.stdEntry(list, 50, "Time Left:", Formatting.RED); + IcoTextComponent time = new IcoTextComponent(Ico.CLOCK, timeLeft); + this.addComponent(time); + + Text compost = StrMan.stdEntry(list, 51, "Stored Compost:", Formatting.DARK_GREEN); + IcoTextComponent comp = new IcoTextComponent(Ico.COMPOSTER, compost); + this.addComponent(comp); + + 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 new file mode 100644 index 00000000..86d9dd7f --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/CookieWidget.java @@ -0,0 +1,33 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows info about active super cookies +// or not, if you're unwilling to buy one +// TODO: test with active cookie. I'm not buying one. + +public class CookieWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Cookie Info").formatted(Formatting.DARK_PURPLE, + Formatting.BOLD); + + public CookieWidget(String footertext) { + super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + + String interesting = footertext.split("Cookie Buff")[1]; + String[] lines = interesting.split("\n"); + if (lines[1].startsWith("Not")) { + this.addComponent(new IcoTextComponent(Ico.COOKIE, Text.of("Not active"))); + } else { + Text cookie = Text.literal("Time Left: ").append(lines[2]); + this.addComponent(new IcoTextComponent(Ico.COOKIE, cookie)); + } + this.pack(); + } + +} 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 new file mode 100644 index 00000000..928d9f76 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonDeathWidget.java @@ -0,0 +1,53 @@ +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.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows various dungeon info +// deaths, healing, dmg taken, milestones + +public class DungeonDeathWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Death").formatted(Formatting.DARK_PURPLE, + Formatting.BOLD); + + // match the deaths entry + // group 1: amount of deaths + private static final Pattern DEATH_PATTERN = Pattern.compile("\\S*: \\((\\d+)\\).*"); + + public DungeonDeathWidget(List list) { + super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + + Matcher m = StrMan.regexAt(list, 25, DEATH_PATTERN); + Formatting f = (m.group(1).equals("0")) ? Formatting.GREEN : Formatting.RED; + Text d = Text.literal("Deaths: ").append(Text.literal(m.group(1)).formatted(f)); + IcoTextComponent deaths = new IcoTextComponent(Ico.SKULL, d); + this.addComponent(deaths); + + Text dealt = StrMan.stdEntry(list, 26, "Damage Dealt:", Formatting.RED); + IcoTextComponent de = new IcoTextComponent(Ico.SWORD, dealt); + this.addComponent(de); + + Text heal = StrMan.stdEntry(list, 27, "Healing Done:", Formatting.RED); + IcoTextComponent he = new IcoTextComponent(Ico.POTION, heal); + this.addComponent(he); + + Text mile = StrMan.stdEntry(list, 28, "Milestone:", Formatting.YELLOW); + IcoTextComponent mi = new IcoTextComponent(Ico.NTAG, mile); + this.addComponent(mi); + + 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 new file mode 100644 index 00000000..9146fdbb --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonDownedWidget.java @@ -0,0 +1,42 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows info about... something? +// TODO: test this. + +public class DungeonDownedWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Downed").formatted(Formatting.DARK_PURPLE, + Formatting.BOLD); + + public DungeonDownedWidget(List list) { + super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + Formatting format = Formatting.RED; + if (StrMan.strAt(list, 21).endsWith("NONE")) { + format = Formatting.GRAY; + } + Text downed = StrMan.stdEntry(list, 21, "Downed:", format); + IcoTextComponent down = new IcoTextComponent(Ico.SKULL, downed); + this.addComponent(down); + + Text time = StrMan.stdEntry(list, 22, "Time:", Formatting.GRAY); + IcoTextComponent t = new IcoTextComponent(Ico.CLOCK, time); + this.addComponent(t); + + Text revive = StrMan.stdEntry(list, 23, "Revive:", Formatting.GRAY); + IcoTextComponent rev = new IcoTextComponent(Ico.POTION, revive); + this.addComponent(rev); + 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 new file mode 100644 index 00000000..ce7b13bd --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonPlayerWidget.java @@ -0,0 +1,83 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.HashMap; +import java.util.List; +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.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.item.ItemStack; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows info about a player in the current dungeon group +// when inside a dungeon + +public class DungeonPlayerWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Player").formatted(Formatting.DARK_PURPLE, + Formatting.BOLD); + + // match a player entry + // group 1: name + // group 2: class (or literal "EMPTY" pre dungeon start) + // group 3: level (or nothing, if pre dungeon start) + // as a side effect, this regex keeps the iron man icon in the name + // not sure if that should be + private static final Pattern PLAYER_PATTERN = Pattern.compile("\\[\\d*\\] (.*) \\((\\S*) ?([XVI]*)\\)"); + + private static final HashMap ICOS = new HashMap<>(); + static { + ICOS.put("Tank", Ico.CHESTPLATE); + ICOS.put("Mage", Ico.B_ROD); + ICOS.put("Berserk", Ico.DIASWORD); + ICOS.put("Archer", Ico.BOW); + ICOS.put("Healer", Ico.POTION); + } + + // title needs to be changeable here + public DungeonPlayerWidget(List list, int player) { + super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + + int start = 1 + (player - 1) * 4; + + if (list.get(start).getDisplayName().getString().length() < 2) { + this.addComponent( + new IcoTextComponent(Ico.SIGN, Text.literal("PRESS A TO JOIN").formatted(Formatting.GRAY))); + } else { + Matcher m = StrMan.regexAt(list, start, PLAYER_PATTERN); + + Text name = Text.literal("Name: ").append(Text.literal(m.group(1)).formatted(Formatting.YELLOW)); + this.addComponent(new IcoTextComponent(Ico.PLAYER, name)); + + String cl = m.group(2); + Formatting clf = Formatting.GRAY; + ItemStack cli = Ico.BARRIER; + if (!cl.equals("EMPTY")) { + cli = ICOS.get(cl); + clf = Formatting.LIGHT_PURPLE; + cl += " " + m.group(3); + } + + Text class_ = Text.literal("Class: ").append(Text.literal(cl).formatted(clf)); + IcoTextComponent itclass = new IcoTextComponent(cli, class_); + this.addComponent(itclass); + + Text ult = StrMan.stdEntry(list, start + 1, "Ult Cooldown:", Formatting.GOLD); + IcoTextComponent ul = new IcoTextComponent(Ico.CLOCK, ult); + this.addComponent(ul); + + Text revive = StrMan.stdEntry(list, start + 2, "Revives:", Formatting.DARK_PURPLE); + IcoTextComponent re = new IcoTextComponent(Ico.POTION, revive); + this.addComponent(re); + + } + 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 new file mode 100644 index 00000000..906d449b --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonPuzzleWidget.java @@ -0,0 +1,51 @@ +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.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows info about all puzzeles in the dungeon (name and status) +// TODO: if puzzle was failed, show player name + +public class DungeonPuzzleWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Puzzles").formatted(Formatting.DARK_PURPLE, + Formatting.BOLD); + + // match a puzzle entry + // group 1: name + // group 2: status + // yes, that " ?" is needed. + // the teleport maze has a trailing whitespace that messes with the regex + private static final Pattern PUZZLE_PATTERN = Pattern.compile(" (.*): \\[(.*)\\] ?"); + + public DungeonPuzzleWidget(List list) { + super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + + int pos = 48; + + while (pos < 60) { + Matcher m = StrMan.regexAt(list, pos, PUZZLE_PATTERN); + if (m == null) { + break; + } + Text t = Text.literal(m.group(1) + ": ").append(Text.literal("[").formatted(Formatting.GRAY)) + .append(m.group(2)).append(Text.literal("]").formatted(Formatting.GRAY)); + IcoTextComponent itc = new IcoTextComponent(Ico.SIGN, t); + this.addComponent(itc); + pos++; + } + 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 new file mode 100644 index 00000000..fed6b0b2 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonSecretWidget.java @@ -0,0 +1,35 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows info about secrets of the dungeon + +public class DungeonSecretWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Discoveries").formatted(Formatting.DARK_PURPLE, + Formatting.BOLD); + + public DungeonSecretWidget(List list) { + super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + + Text secrets = StrMan.stdEntry(list, 31, "Secrets:", Formatting.YELLOW); + IcoTextComponent sec = new IcoTextComponent(Ico.CHEST, secrets); + this.addComponent(sec); + + Text crypts = StrMan.stdEntry(list, 32, "Crypts:", Formatting.YELLOW); + IcoTextComponent cry = new IcoTextComponent(Ico.SKULL, crypts); + this.addComponent(cry); + + 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 new file mode 100644 index 00000000..89d3b1ca --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonServerWidget.java @@ -0,0 +1,56 @@ +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.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.ProgressComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows broad info about the current dungeon +// opened/completed rooms, % of secrets found and time taken + +public class DungeonServerWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Dungeon Info").formatted(Formatting.DARK_PURPLE, + Formatting.BOLD); + + // match the secrets text + // group 1: % of secrets found (without "%") + private static final Pattern SECRET_PATTERN = Pattern.compile(" Secrets Found: (.*)%"); + + public DungeonServerWidget(List list) { + super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + Text name = StrMan.stdEntry(list, 41, "Name:", Formatting.AQUA); + IcoTextComponent na = new IcoTextComponent(Ico.NTAG, name); + this.addComponent(na); + + Text open = StrMan.stdEntry(list, 42, "Rooms Visited:", Formatting.DARK_PURPLE); + IcoTextComponent op = new IcoTextComponent(Ico.SIGN, open); + this.addComponent(op); + + Text compl = StrMan.stdEntry(list, 43, "Rooms Completed:", Formatting.LIGHT_PURPLE); + IcoTextComponent co = new IcoTextComponent(Ico.SIGN, compl); + this.addComponent(co); + + Matcher m = StrMan.regexAt(list, 44, SECRET_PATTERN); + Text secrets = Text.of("Secrets found:"); + ProgressComponent scp = new ProgressComponent(Ico.CHEST, secrets, Float.parseFloat(m.group(1)), + Formatting.DARK_PURPLE.getColorValue()); + this.addComponent(scp); + + Text time = StrMan.stdEntry(list, 45, "Time:", Formatting.GOLD); + IcoTextComponent ti = new IcoTextComponent(Ico.CLOCK, time); + this.addComponent(ti); + + 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 new file mode 100644 index 00000000..54b49465 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EffectWidget.java @@ -0,0 +1,40 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoFatTextComponent; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widgte shows, how many active effects you have +// it also shows one of those in detail + +public class EffectWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Effect Info").formatted(Formatting.DARK_PURPLE, + Formatting.BOLD); + + public EffectWidget(String footertext) { + super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + + String interesting = footertext.split("Active Effects")[1]; + String[] lines = interesting.split("\n"); + + if (lines[1].startsWith("No")) { + Text txt = Text.literal("No effects active").formatted(Formatting.GRAY); + this.addComponent(new IcoTextComponent(Ico.POTION, txt)); + } else { + String number = lines[1].substring("You have ".length()); + number = number.substring(0, number.indexOf(' ')); + Text active = Text.literal("Active Effects: ").append(Text.literal(number).formatted(Formatting.YELLOW)); + + IcoFatTextComponent iftc = new IcoFatTextComponent(Ico.POTION, active, + 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 new file mode 100644 index 00000000..e75b7152 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ElectionWidget.java @@ -0,0 +1,97 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.HashMap; +import java.util.List; +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.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.ProgressComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.item.ItemStack; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// XXX crashes when in garden, as this shows jacob's farming info there... +// "starts in", then the three farmable things +// this widget shows the status or results of the current election + +public class ElectionWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Election Info").formatted(Formatting.YELLOW, + Formatting.BOLD); + + private static final HashMap MAYOR_DATA = new HashMap<>(); + + private static final Text EL_OVER = Text.literal("Election ") + .append(Text.literal("over!").formatted(Formatting.RED)); + + // pattern matching a candidate while people are voting + // group 1: name + // group 2: % of votes + private static final Pattern VOTE_PATTERN = Pattern.compile(" (\\S*): \\|+ \\((\\d*)%\\)"); + + static { + MAYOR_DATA.put("Aatrox", Ico.DIASWORD); + MAYOR_DATA.put("Diana", Ico.BONE); + MAYOR_DATA.put("Diaz", Ico.GOLD); + MAYOR_DATA.put("Finnegan", Ico.HOE); + MAYOR_DATA.put("Foxy", Ico.SUGAR); + MAYOR_DATA.put("Paul", Ico.COMPASS); + MAYOR_DATA.put("Scorpius", Ico.MOREGOLD); + MAYOR_DATA.put("Jerry", Ico.VILLAGER); + MAYOR_DATA.put("Derpy", Ico.DBUSH); + MAYOR_DATA.put("Marina", Ico.FISH_ROD); + } + + private static final Formatting[] COLS = { Formatting.GOLD, Formatting.RED, Formatting.LIGHT_PURPLE }; + + public ElectionWidget(List list) { + super(TITLE, Formatting.YELLOW.getColorValue()); + + if (StrMan.strAt(list, 76).contains("Over!")) { + // election is over + + IcoTextComponent over = new IcoTextComponent(Ico.BARRIER, EL_OVER); + this.addComponent(over); + + String winnername = StrMan.strAt(list, 77).split(": ")[1]; + Text winnertext = Text.literal("Winner: ") + .append(Text.literal(winnername).formatted(Formatting.GREEN)); + IcoTextComponent winner = new IcoTextComponent(MAYOR_DATA.get(winnername), winnertext); + this.addComponent(winner); + + Text participants = StrMan.stdEntry(list, 78, "Participants:", Formatting.AQUA); + IcoTextComponent part = new IcoTextComponent(Ico.PLAYER, participants); + this.addComponent(part); + + Text year = StrMan.stdEntry(list, 79, "Year:", Formatting.LIGHT_PURPLE); + IcoTextComponent y = new IcoTextComponent(Ico.SIGN, year); + this.addComponent(y); + + } else { + // election is going on + Text time = StrMan.stdEntry(list, 76, "End in:", Formatting.GOLD); + IcoTextComponent t = new IcoTextComponent(Ico.CLOCK, time); + this.addComponent(t); + + for (int i = 77; i <= 79; i++) { + Matcher m = StrMan.regexAt(list, i, VOTE_PATTERN); + String g1 = m.group(1); + String g2 = m.group(2); + float pcnt = Float.parseFloat(g2); + Text candidate = Text.literal(g1).formatted(COLS[i - 77]); + ProgressComponent pc = new ProgressComponent(MAYOR_DATA.get(g1), candidate, pcnt, + COLS[i - 77].getColorValue()); + this.addComponent(pc); + + } + } + this.pack(); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EmptyWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EmptyWidget.java new file mode 100644 index 00000000..584a593e --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EmptyWidget.java @@ -0,0 +1,27 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +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, + Formatting.BOLD); + + public EmptyWidget(List list) { + super(TITLE, Formatting.RED.getColorValue()); + + Text info = Text.of("No info for this area!"); + PlainTextComponent inf = new PlainTextComponent(info); + this.addComponent(inf); + this.pack(); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EssenceWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EssenceWidget.java new file mode 100644 index 00000000..903c3a3d --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EssenceWidget.java @@ -0,0 +1,48 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.TableComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows your dungeon essences + +public class EssenceWidget extends Widget { + + private Text undead, wither, diamond, gold, dragon, spider, ice, crimson; + + private static final MutableText TITLE = Text.literal("Essences").formatted(Formatting.DARK_AQUA, + Formatting.BOLD); + + public EssenceWidget(List list) { + super(TITLE, Formatting.DARK_AQUA.getColorValue()); + wither = StrMan.stdEntry(list, 46, "Wither:", Formatting.DARK_PURPLE); + spider = StrMan.stdEntry(list, 47, "Spider:", Formatting.DARK_PURPLE); + undead = StrMan.stdEntry(list, 48, "Undead:", Formatting.DARK_PURPLE); + dragon = StrMan.stdEntry(list, 49, "Dragon:", Formatting.DARK_PURPLE); + gold = StrMan.stdEntry(list, 50, "Gold:", Formatting.DARK_PURPLE); + diamond = StrMan.stdEntry(list, 51, "Diamond:", Formatting.DARK_PURPLE); + ice = StrMan.stdEntry(list, 52, "Ice:", Formatting.DARK_PURPLE); + crimson = StrMan.stdEntry(list, 53, "Crimson:", Formatting.DARK_PURPLE); + + TableComponent tc = new TableComponent(2, 4, Formatting.DARK_AQUA.getColorValue()); + + tc.addToCell(0, 0, new IcoTextComponent(Ico.WITHER, wither)); + tc.addToCell(0, 1, new IcoTextComponent(Ico.STRING, spider)); + tc.addToCell(0, 2, new IcoTextComponent(Ico.FLESH, undead)); + tc.addToCell(0, 3, new IcoTextComponent(Ico.DRAGON, dragon)); + tc.addToCell(1, 0, new IcoTextComponent(Ico.GOLD, gold)); + tc.addToCell(1, 1, new IcoTextComponent(Ico.DIAMOND, diamond)); + 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 new file mode 100644 index 00000000..051ce11c --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EventWidget.java @@ -0,0 +1,33 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows info about ongoing events (e.g. jacob's farming) + +public class EventWidget extends Widget { + private static final MutableText TITLE = Text.literal("Event Info").formatted(Formatting.YELLOW, Formatting.BOLD); + + public EventWidget(List list) { + super(TITLE, Formatting.YELLOW.getColorValue()); + + Text eventName = StrMan.stdEntry(list, 73, "Name:", Formatting.YELLOW); + IcoTextComponent event = new IcoTextComponent(Ico.NTAG, eventName); + this.addComponent(event); + + // this could look better + Text time = StrMan.plainEntry(list, 74); + 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 new file mode 100644 index 00000000..7531b071 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java @@ -0,0 +1,56 @@ +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.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.ProgressComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// TODO: untested with active fire sales +// this widget shows info about fire sales when in the hub +// or not, if there isn't one going on + +public class FireSaleWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Fire Sale").formatted(Formatting.DARK_AQUA, + Formatting.BOLD); + + // matches a fire sale item + // group 1: item name + // group 2: # items bought + // group 1: # items available in total (1 digit + "k") + private static final Pattern FIRE_PATTERN = Pattern.compile(" (.*): (\\d*)/(\\d)k"); + + public FireSaleWidget(List list) { + super(TITLE, Formatting.DARK_AQUA.getColorValue()); + + boolean found = false; + + for (int i = 46;; i++) { + Matcher m = StrMan.regexAt(list, i, FIRE_PATTERN); + if (m == null ||!m.matches()) { + break; + } + found = true; + Text a = Text.literal(m.group(1)); + Text b = Text.literal(m.group(2) + "/" + m.group(3) + "000"); + float pcnt = (1 - (Float.parseFloat(m.group(2)) / (Float.parseFloat(m.group(3)) * 1000)))/100f; + ProgressComponent pc = new ProgressComponent(Ico.GOLD, a, b, pcnt, Formatting.LIGHT_PURPLE.getColorValue()); + this.addComponent(pc); + } + if (!found) { + this.addComponent(new PlainTextComponent(Text.literal("No Fire Sale!").formatted(Formatting.GRAY))); + } + 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 new file mode 100644 index 00000000..553a001f --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ForgeWidget.java @@ -0,0 +1,60 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.Component; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoFatTextComponent; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows what you're forging right now +// for locked slots, the unlock requirement is shown + +public class ForgeWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Forge Status").formatted(Formatting.DARK_AQUA, + Formatting.BOLD); + + public ForgeWidget(List list) { + super(TITLE, Formatting.DARK_AQUA.getColorValue()); + + for (int i = 0; i < 5; i++) { + String fstr = StrMan.strAt(list, i + 54).substring(4); + Component c; + Text l1, l2; + + switch (fstr) { + case "LOCKED": + l1 = Text.literal("Locked").formatted(Formatting.RED); + l2 = switch (i + 1) { + case 3 -> Text.literal("Req. HotM 3").formatted(Formatting.GRAY); + case 4 -> Text.literal("Req. HotM 4").formatted(Formatting.GRAY); + case 5 -> Text.literal("Req. PotM 2").formatted(Formatting.GRAY); + default -> + Text.literal("This message should not appear").formatted(Formatting.RED, Formatting.BOLD); + }; + c = new IcoFatTextComponent(Ico.BARRIER, l1, l2); + break; + case "EMPTY": + l1 = Text.literal("Empty").formatted(Formatting.GRAY); + c = new IcoTextComponent(Ico.FURNACE, l1); + break; + default: + String[] parts = fstr.split(": "); + l1 = Text.of(parts[0]); + l2 = Text.literal(parts[1]).formatted(Formatting.YELLOW); + c = new IcoFatTextComponent(Ico.FIRE, l1, l2); + break; + } + 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 new file mode 100644 index 00000000..c6c334d5 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GardenServerWidget.java @@ -0,0 +1,59 @@ +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.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows info about the garden server + +public class GardenServerWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Server Info").formatted(Formatting.DARK_AQUA, + Formatting.BOLD); + + private static final Pattern VISITOR_PATTERN = Pattern.compile(" Next Visitor: (.*)$"); + + public GardenServerWidget(List list) { + super(TITLE, Formatting.DARK_AQUA.getColorValue()); + + Text areaName = StrMan.stdEntry(list, 41, "Area:", Formatting.DARK_AQUA); + IcoTextComponent area = new IcoTextComponent(Ico.MAP, areaName); + this.addComponent(area); + + Text serverName = StrMan.stdEntry(list, 42, "Server ID:", Formatting.GRAY); + IcoTextComponent server = new IcoTextComponent(Ico.NTAG, serverName); + this.addComponent(server); + + Text amtGems = StrMan.stdEntry(list, 43, "Gems:", Formatting.GREEN); + IcoTextComponent gems = new IcoTextComponent(Ico.EMERALD, amtGems); + this.addComponent(gems); + + Text copper = StrMan.stdEntry(list, 44, "Copper:", Formatting.GOLD); + IcoTextComponent co = new IcoTextComponent(Ico.COPPER, copper); + this.addComponent(co); + + Matcher v = StrMan.regexAt(list, 45, VISITOR_PATTERN); + String vString = v.group(1); + Formatting col; + if (vString.equals("Not Unlocked!")) { + col = Formatting.RED; + } else { + col = Formatting.GREEN; + } + MutableText visitor = Text.literal("Next Visitor: ") + .append(Text.literal(vString).formatted(col)); + IcoTextComponent vis = new IcoTextComponent(Ico.PLAYER, visitor); + this.addComponent(vis); + this.pack(); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java new file mode 100644 index 00000000..67b61667 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java @@ -0,0 +1,41 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows info about the private island you're visiting + +public class GuestServerWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Island Info").formatted(Formatting.DARK_AQUA, + Formatting.BOLD); + + public GuestServerWidget(List list) { + super(TITLE, Formatting.DARK_AQUA.getColorValue()); + Text areaName = StrMan.stdEntry(list, 41, "Area:", Formatting.DARK_AQUA); + IcoTextComponent area = new IcoTextComponent(Ico.MAP, areaName); + this.addComponent(area); + + Text serverName = StrMan.stdEntry(list, 42, "Server ID:", Formatting.GRAY); + IcoTextComponent server = new IcoTextComponent(Ico.NTAG, serverName); + this.addComponent(server); + + Text owner = StrMan.stdEntry(list, 43, "Owner:", Formatting.GREEN); + IcoTextComponent own = new IcoTextComponent(Ico.SIGN, owner); + this.addComponent(own); + + Text status = StrMan.stdEntry(list, 44, "Status:", Formatting.BLUE); + IcoTextComponent stat = new IcoTextComponent(Ico.SIGN, status); + this.addComponent(stat); + 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 new file mode 100644 index 00000000..5814c15c --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandGuestsWidget.java @@ -0,0 +1,44 @@ +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.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows a list of all people visiting +// the same private island as you + +public class IslandGuestsWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Guests").formatted(Formatting.AQUA, + Formatting.BOLD); + + // matches a player entry, removing their level and the hand icon + // group 1: player name + private static final Pattern GUEST_PATTERN = Pattern.compile("\\[\\d*\\] (.*) \\[.\\]"); + + public IslandGuestsWidget(List list) { + super(TITLE, Formatting.AQUA.getColorValue()); + for (int i = 21; i < 40; i++) { + String str = list.get(i).getDisplayName().getString(); + if (str.length() == 0) { + if (i == 21) { + this.addComponent(new PlainTextComponent(Text.literal("No Visitors!").formatted(Formatting.GRAY))); + } + break; + } + Matcher m = StrMan.regexAt(list, i, GUEST_PATTERN); + PlainTextComponent ptc = new PlainTextComponent(Text.of(m.group(1))); + this.addComponent(ptc); + } + 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 new file mode 100644 index 00000000..a0056a06 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandOwnersWidget.java @@ -0,0 +1,47 @@ +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.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows a list of the owners of a private island +// when you're visiting someone else + +public class IslandOwnersWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Owners").formatted(Formatting.DARK_PURPLE, + Formatting.BOLD); + + // matches an owner + // group 1: player name (cut off by hypixel for some reason) + // group 2: last seem + // TODO: test with owner online + private static final Pattern OWNER_PATTERN = Pattern.compile("(.*) \\((.*)\\)"); + + public IslandOwnersWidget(List list) { + super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + for (int i = 1; i < 20; i++) { + if (list.get(i).getDisplayName().getString().length() == 0) { + break; + } + + Matcher m = StrMan.regexAt(list, i, OWNER_PATTERN); + Text entry = Text.literal(m.group(1)) + .append( + Text.literal(" (" + m.group(2) + ")") + .formatted(Formatting.GRAY)); + 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 new file mode 100644 index 00000000..96ec8ba5 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandSelfWidget.java @@ -0,0 +1,40 @@ +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.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows a list of the owners of your home island + +public class IslandSelfWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Owners").formatted(Formatting.DARK_PURPLE, + Formatting.BOLD); + + // matches an owner + // group 1: player name + private static final Pattern OWNER_PATTERN = Pattern.compile("\\[\\d*\\] (.*)"); + + public IslandSelfWidget(List list) { + super(TITLE, Formatting.DARK_PURPLE.getColorValue()); + for (int i = 1; i < 20; i++) { + String str = list.get(i).getDisplayName().getString(); + if (str.length() == 0) { + break; + } + Matcher m = StrMan.regexAt(list, i, OWNER_PATTERN); + PlainTextComponent ptc = new PlainTextComponent(Text.of(m.group(1))); + this.addComponent(ptc); + } + 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 new file mode 100644 index 00000000..1bbe0ed7 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/IslandServerWidget.java @@ -0,0 +1,47 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows info about your home island + +public class IslandServerWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Island Info").formatted(Formatting.DARK_AQUA, + Formatting.BOLD); + + public IslandServerWidget(List list) { + super(TITLE, Formatting.DARK_AQUA.getColorValue()); + + Text areaName = StrMan.stdEntry(list, 41, "Area:", Formatting.DARK_AQUA); + IcoTextComponent area = new IcoTextComponent(Ico.MAP, areaName); + this.addComponent(area); + + Text serverName = StrMan.stdEntry(list, 42, "Server ID:", Formatting.GRAY); + IcoTextComponent server = new IcoTextComponent(Ico.NTAG, serverName); + this.addComponent(server); + + Text crystals = StrMan.stdEntry(list, 43, "Crystals:", Formatting.DARK_PURPLE); + IcoTextComponent crys = new IcoTextComponent(Ico.EMERALD, crystals); + this.addComponent(crys); + + Text stash = StrMan.stdEntry(list, 44, "Stash:", Formatting.GREEN); + IcoTextComponent st = new IcoTextComponent(Ico.CHEST, stash); + this.addComponent(st); + + Text minions = StrMan.stdEntry(list, 45, "Minions:", Formatting.BLUE); + IcoTextComponent min = new IcoTextComponent(Ico.COMMAND, minions); + this.addComponent(min); + 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 new file mode 100644 index 00000000..2ba94b48 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/MinionWidget.java @@ -0,0 +1,135 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.HashMap; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows info about minions placed on the home island + +public class MinionWidget extends Widget { + private static final MutableText TITLE = Text.literal("Minions").formatted(Formatting.DARK_AQUA, + Formatting.BOLD); + + private static final HashMap MIN_ICOS = new HashMap<>(); + + // hmm... + static { + MIN_ICOS.put("Blaze", new ItemStack(Items.BLAZE_ROD)); + MIN_ICOS.put("Cave Spider", new ItemStack(Items.SPIDER_EYE)); + MIN_ICOS.put("Creeper", new ItemStack(Items.GUNPOWDER)); + MIN_ICOS.put("Enderman", new ItemStack(Items.ENDER_PEARL)); + MIN_ICOS.put("Ghast", new ItemStack(Items.GHAST_TEAR)); + MIN_ICOS.put("Magma Cube", new ItemStack(Items.MAGMA_CREAM)); + MIN_ICOS.put("Skeleton", new ItemStack(Items.BONE)); + MIN_ICOS.put("Slime", new ItemStack(Items.SLIME_BALL)); + MIN_ICOS.put("Spider", new ItemStack(Items.STRING)); + MIN_ICOS.put("Zombie", new ItemStack(Items.ROTTEN_FLESH)); + MIN_ICOS.put("Cactus", new ItemStack(Items.CACTUS)); + MIN_ICOS.put("Carrot", new ItemStack(Items.CARROT)); + MIN_ICOS.put("Chicken", new ItemStack(Items.CHICKEN)); + MIN_ICOS.put("Cocoa Beans", new ItemStack(Items.COCOA_BEANS)); + MIN_ICOS.put("Cow", new ItemStack(Items.BEEF)); + MIN_ICOS.put("Melon", new ItemStack(Items.MELON_SLICE)); + MIN_ICOS.put("Mushroom", new ItemStack(Items.RED_MUSHROOM)); + MIN_ICOS.put("Nether Wart", new ItemStack(Items.NETHER_WART)); + MIN_ICOS.put("Pig", new ItemStack(Items.PORKCHOP)); + MIN_ICOS.put("Potato", new ItemStack(Items.POTATO)); + MIN_ICOS.put("Pumpkin", new ItemStack(Items.PUMPKIN)); + MIN_ICOS.put("Rabbit", new ItemStack(Items.RABBIT)); + MIN_ICOS.put("Sheep", new ItemStack(Items.WHITE_WOOL)); + MIN_ICOS.put("Sugar Cane", new ItemStack(Items.SUGAR_CANE)); + MIN_ICOS.put("Wheat", new ItemStack(Items.WHEAT)); + MIN_ICOS.put("Clay", new ItemStack(Items.CLAY)); + MIN_ICOS.put("Fishing", new ItemStack(Items.FISHING_ROD)); + MIN_ICOS.put("Coal", new ItemStack(Items.COAL)); + MIN_ICOS.put("Cobblestone", new ItemStack(Items.COBBLESTONE)); + MIN_ICOS.put("Diamond", new ItemStack(Items.DIAMOND)); + MIN_ICOS.put("Emerald", new ItemStack(Items.EMERALD)); + MIN_ICOS.put("End Stone", new ItemStack(Items.END_STONE)); + MIN_ICOS.put("Glowstone", new ItemStack(Items.GLOWSTONE_DUST)); + MIN_ICOS.put("Gold", new ItemStack(Items.GOLD_INGOT)); + MIN_ICOS.put("Gravel", new ItemStack(Items.GRAVEL)); + MIN_ICOS.put("Hard Stone", new ItemStack(Items.STONE)); + MIN_ICOS.put("Ice", new ItemStack(Items.ICE)); + MIN_ICOS.put("Iron", new ItemStack(Items.IRON_INGOT)); + MIN_ICOS.put("Lapis", new ItemStack(Items.LAPIS_LAZULI)); + MIN_ICOS.put("Mithril", new ItemStack(Items.PRISMARINE_CRYSTALS)); + MIN_ICOS.put("Mycelium", new ItemStack(Items.MYCELIUM)); + MIN_ICOS.put("Obsidian", new ItemStack(Items.OBSIDIAN)); + MIN_ICOS.put("Quartz", new ItemStack(Items.QUARTZ)); + MIN_ICOS.put("Red Sand", new ItemStack(Items.RED_SAND)); + MIN_ICOS.put("Redstone", new ItemStack(Items.REDSTONE)); + MIN_ICOS.put("Sand", new ItemStack(Items.SAND)); + MIN_ICOS.put("Snow", new ItemStack(Items.SNOWBALL)); + MIN_ICOS.put("Inferno", new ItemStack(Items.BLAZE_SPAWN_EGG)); + MIN_ICOS.put("Revenant", new ItemStack(Items.ZOMBIE_SPAWN_EGG)); + MIN_ICOS.put("Tarantula", new ItemStack(Items.SPIDER_SPAWN_EGG)); + MIN_ICOS.put("Voidling", new ItemStack(Items.ENDERMAN_SPAWN_EGG)); + MIN_ICOS.put("Acacia", new ItemStack(Items.ACACIA_LOG)); + MIN_ICOS.put("Birch", new ItemStack(Items.BIRCH_LOG)); + MIN_ICOS.put("Dark Oak", new ItemStack(Items.DARK_OAK_LOG)); + MIN_ICOS.put("Flower", new ItemStack(Items.POPPY)); + MIN_ICOS.put("Jungle", new ItemStack(Items.JUNGLE_LOG)); + MIN_ICOS.put("Oak", new ItemStack(Items.OAK_LOG)); + MIN_ICOS.put("Spruce", new ItemStack(Items.SPRUCE_LOG)); + } + + // matches a minion entry + // group 1: name + // group 2: level + // group 3: status + public static final Pattern MINION_PATTERN = Pattern.compile(" (.*) ([XVI]*) \\[(.*)\\]"); + + public MinionWidget(List list) { + super(TITLE, Formatting.DARK_AQUA.getColorValue()); + + for (int i = 48; i < 59; i++) { + Matcher m = StrMan.regexAt(list, i, MINION_PATTERN); + if (m != null) { + + String min = m.group(1); + String lvl = m.group(2); + String stat = m.group(3); + + MutableText mt = Text.literal(min + " " + lvl).append(Text.literal(": ")); + + Formatting format = Formatting.RED; + if (stat.equals("ACTIVE")) { + format = Formatting.GREEN; + } else if (stat.equals("SLOW")) { + format = Formatting.YELLOW; + } + // makes "BLOCKED" also red. in reality, it's some kind of crimson + mt.append(Text.literal(stat).formatted(format)); + + IcoTextComponent itc = new IcoTextComponent(MIN_ICOS.get(min), mt); + this.addComponent(itc); + + } else { + break; + } + } + + // if more minions are placed than the tab menu can display, + // a "And X more..." text is shown + // look for that and add it to the widget + if (list.get(59).getDisplayName() != null) { + String other = list.get(59).getDisplayName().getString(); + this.addComponent(new PlainTextComponent(Text.of(other.trim()))); + } + 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 new file mode 100644 index 00000000..a94b5948 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ParkServerWidget.java @@ -0,0 +1,42 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows info about the park server + +public class ParkServerWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Server Info").formatted(Formatting.DARK_AQUA, + Formatting.BOLD); + + public ParkServerWidget(List list) { + super(TITLE, Formatting.DARK_AQUA.getColorValue()); + + Text areaName = StrMan.stdEntry(list, 41, "Area:", Formatting.DARK_AQUA); + IcoTextComponent area = new IcoTextComponent(Ico.MAP, areaName); + this.addComponent(area); + + Text serverName = StrMan.stdEntry(list, 42, "Server ID:", Formatting.GRAY); + IcoTextComponent server = new IcoTextComponent(Ico.NTAG, serverName); + this.addComponent(server); + + Text amtGems = StrMan.stdEntry(list, 43, "Gems:", Formatting.GREEN); + IcoTextComponent gems = new IcoTextComponent(Ico.EMERALD, amtGems); + this.addComponent(gems); + + Text rain = StrMan.stdEntry(list, 44, "Rain:", Formatting.BLUE); + IcoTextComponent ra = new IcoTextComponent(Ico.WATER, rain); + this.addComponent(ra); + 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 new file mode 100644 index 00000000..27c69567 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java @@ -0,0 +1,61 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlayerComponent; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.TableComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows a list of players with their skins +// in most areas + +public class PlayerListWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Players").formatted(Formatting.GREEN, + Formatting.BOLD); + + private ArrayList list = new ArrayList<>(); + + public PlayerListWidget(List l) { + super(TITLE, Formatting.GREEN.getColorValue()); + + // unintuitive int ceil division stolen from + // https://stackoverflow.com/questions/7139382/java-rounding-up-to-an-int-using-math-ceil#21830188 + int tblW = ((l.size() - 80) - 1) / 20 + 1; + + TableComponent tc = new TableComponent(tblW, (l.size() - 80 >= 20) ? 20 : l.size() - 80, + Formatting.GREEN.getColorValue()); + + for (int i = 80; i < l.size(); i++) { + list.add(l.get(i)); + } + + Collections.sort(list, new Comparator() { + @Override + public int compare(PlayerListEntry o1, PlayerListEntry o2) { + return o1.getProfile().getName().toLowerCase().compareTo(o2.getProfile().getName().toLowerCase()); + } + }); + + int x = 0, y = 0; + + for (PlayerListEntry ple : list) { + tc.addToCell(x, y, new PlayerComponent(ple)); + y++; + if (y >= 20) { + y = 0; + x++; + } + } + + 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 new file mode 100644 index 00000000..97485b4f --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PowderWidget.java @@ -0,0 +1,35 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows how much mithril and gemstone powder you have + +public class PowderWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Powders").formatted(Formatting.DARK_AQUA, + Formatting.BOLD); + + public PowderWidget(List list) { + super(TITLE, Formatting.DARK_AQUA.getColorValue()); + + Text amtMith = StrMan.stdEntry(list, 46, "Mithril:", Formatting.AQUA); + IcoTextComponent mith = new IcoTextComponent(Ico.MITHRIL, amtMith); + this.addComponent(mith); + + Text amtGem = StrMan.stdEntry(list, 47, "Gemstone:", Formatting.DARK_PURPLE); + IcoTextComponent gem = new IcoTextComponent(Ico.EMERALD, amtGem); + this.addComponent(gem); + 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 new file mode 100644 index 00000000..59342b9d --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ProfileWidget.java @@ -0,0 +1,42 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows info about your profile and bank + +public class ProfileWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Profile").formatted(Formatting.YELLOW, Formatting.BOLD); + + public ProfileWidget(List list) { + super(TITLE, Formatting.YELLOW.getColorValue()); + + Text profileType = StrMan.stdEntry(list, 61, "Type:", Formatting.GREEN); + IcoTextComponent profile = new IcoTextComponent(Ico.SIGN, profileType); + this.addComponent(profile); + + Text petInfo = StrMan.stdEntry(list, 62, "Pet Sitter:", Formatting.AQUA); + IcoTextComponent pet = new IcoTextComponent(Ico.BONE, petInfo); + this.addComponent(pet); + + Text bankAmt = StrMan.stdEntry(list, 63, "Balance:", Formatting.GOLD); + IcoTextComponent bank = new IcoTextComponent(Ico.EMERALD, bankAmt); + this.addComponent(bank); + + Text interest = StrMan.stdEntry(list, 64, "Interest in:", Formatting.GOLD); + IcoTextComponent inter = new IcoTextComponent(Ico.CLOCK, interest); + this.addComponent(inter); + 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 new file mode 100644 index 00000000..ce7bc56f --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/ServerWidget.java @@ -0,0 +1,40 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows info about "generic" servers +// a server is "generic", when only name, server ID and gems are shown +// in the thrid column of the tab menu + +public class ServerWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Server Info").formatted(Formatting.DARK_AQUA, + Formatting.BOLD); + + public ServerWidget(List list) { + super(TITLE, Formatting.DARK_AQUA.getColorValue()); + + Text areaName = StrMan.stdEntry(list, 41, "Area:", Formatting.DARK_AQUA); + IcoTextComponent area = new IcoTextComponent(Ico.MAP, areaName); + this.addComponent(area); + + Text serverName = StrMan.stdEntry(list, 42, "Server ID:", Formatting.GRAY); + IcoTextComponent server = new IcoTextComponent(Ico.NTAG, serverName); + this.addComponent(server); + + Text amtGems = StrMan.stdEntry(list, 43, "Gems:", Formatting.GREEN); + IcoTextComponent gems = new IcoTextComponent(Ico.EMERALD, amtGems); + this.addComponent(gems); + 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 new file mode 100644 index 00000000..85bd630b --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/SkillsWidget.java @@ -0,0 +1,63 @@ +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.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.ProgressComponent; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.TableComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows info about a skill and some stats + +public class SkillsWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Skill Info").formatted(Formatting.YELLOW, + Formatting.BOLD); + + // match the skill entry + // group 1: skill name and level + // group 2: progress to next level (without "%") + private static final Pattern SKILL_PATTERN = Pattern.compile("\\S*: ([A-Za-z]* [0-9]*): (\\S*)%"); + + public SkillsWidget(List list) { + super(TITLE, Formatting.YELLOW.getColorValue()); + + Matcher m = StrMan.regexAt(list, 66, SKILL_PATTERN); + + float pcnt = Float.parseFloat(m.group(2)); + String skill = m.group(1); + + ProgressComponent pc = new ProgressComponent(Ico.LANTERN, Text.of(skill), pcnt, Formatting.GOLD.getColorValue()); + + this.addComponent(pc); + + Text speed = StrMan.stdEntry(list, 67, "SPD", Formatting.WHITE); + IcoTextComponent spd = new IcoTextComponent(Ico.SUGAR, speed); + Text strength = StrMan.stdEntry(list, 68, "STR", Formatting.RED); + IcoTextComponent str = new IcoTextComponent(Ico.SWORD, strength); + Text critDmg = StrMan.stdEntry(list, 69, "CDG", Formatting.BLUE); + IcoTextComponent cdg = new IcoTextComponent(Ico.SWORD, critDmg); + Text critCh = StrMan.stdEntry(list, 70, "CCH", Formatting.BLUE); + IcoTextComponent cch = new IcoTextComponent(Ico.SWORD, critCh); + Text aSpeed = StrMan.stdEntry(list, 71, "ASP", Formatting.YELLOW); + IcoTextComponent asp = new IcoTextComponent(Ico.HOE, aSpeed); + + TableComponent tc = new TableComponent(2, 3, Formatting.YELLOW.getColorValue()); + tc.addToCell(0, 0, spd); + tc.addToCell(0, 1, str); + tc.addToCell(0, 2, asp); + 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 new file mode 100644 index 00000000..981e4eef --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/TrapperWidget.java @@ -0,0 +1,29 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.List; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; + +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows, how meny pelts you have (farming island only) + +public class TrapperWidget extends Widget { + private static final MutableText TITLE = Text.literal("Trapper").formatted(Formatting.DARK_AQUA, + Formatting.BOLD); + + public TrapperWidget(List list) { + super(TITLE, Formatting.DARK_AQUA.getColorValue()); + + Text amtPelts = StrMan.stdEntry(list, 46, "Pelts:", Formatting.AQUA); + IcoTextComponent pelts = new IcoTextComponent(Ico.LEATHER, amtPelts); + this.addComponent(pelts); + 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 new file mode 100644 index 00000000..9f3be82a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/UpgradeWidget.java @@ -0,0 +1,38 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; + +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +// this widget shows info about current profile/account upgrades +// or not, if there aren't any +// TODO: not very pretty atm + +public class UpgradeWidget extends Widget { + + private static final MutableText TITLE = Text.literal("Upgrade Info").formatted(Formatting.GOLD, + Formatting.BOLD); + + public UpgradeWidget(String footertext) { + super(TITLE, Formatting.GOLD.getColorValue()); + String[] interesting = footertext.split("Upgrades"); + if (interesting.length < 2) { + this.addComponent(new PlainTextComponent(Text.of("Currently no upgrades..."))); + this.pack(); + return; + } + String[] lines = interesting[1].split("\n"); + IcoTextComponent u1 = new IcoTextComponent(Ico.SIGN, Text.of(lines[1])); + this.addComponent(u1); + if (lines.length == 5) { + IcoTextComponent u2 = new IcoTextComponent(Ico.SIGN, Text.of(lines[2])); + this.addComponent(u2); + } + 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 new file mode 100644 index 00000000..1fdad37a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/Widget.java @@ -0,0 +1,183 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; + +import java.util.ArrayList; + +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.Component; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; + +public abstract class Widget { + + private ArrayList components = new ArrayList<>(); + private int w = 0, h = 0; + private int x = 0, y = 0; + private int color; + private Text title; + + private static TextRenderer txtRend = MinecraftClient.getInstance().textRenderer; + + static final int BORDER_SZE_N = txtRend.fontHeight + 4; + static final int BORDER_SZE_S = 4; + static final int BORDER_SZE_W = 4; + static final int BORDER_SZE_E = 4; + static final int COL_BG_BOX = 0xc00c0c0c; + + public Widget(MutableText title, Integer colorValue) { + this.title = title; + this.color = 0xff000000 | colorValue; + } + + public final void addComponent(Component c) { + components.add(c); + } + + public final void pack() { + for (Component c : components) { + h += c.getHeight() + 4; + w = Math.max(w, c.getWidth()); + } + h += BORDER_SZE_N + BORDER_SZE_S - 2; + w += BORDER_SZE_E + BORDER_SZE_W; + + // min width is dependent on title + w = Math.max(w, BORDER_SZE_W + BORDER_SZE_E + Widget.txtRend.getWidth(title) + 4 + 4 + 1); + } + + public final void setX(int x) { + this.x = x; + } + + public final int getY() { + return this.y; + } + + public final int getX() { + return this.x; + } + + public final void setY(int y) { + this.y = y; + } + + public final int getWidth() { + return this.w; + } + + public final int getHeight() { + return this.h; + } + + public final void render(MatrixStack ms) { + + DrawableHelper.fill(ms, x + 1, y, x + w - 1, y + h, COL_BG_BOX); + DrawableHelper.fill(ms, x, y + 1, x + 1, y + h - 1, COL_BG_BOX); + DrawableHelper.fill(ms, x + w - 1, y + 1, x + w, y + h - 1, COL_BG_BOX); + + int strHeightHalf = Widget.txtRend.fontHeight / 2; + int strAreaWidth = Widget.txtRend.getWidth(title) + 4; + + txtRend.draw(ms, title, x + 8, y + 2, this.color); + + DrawableHelper.fill(ms, x + 2, y + 1 + strHeightHalf, strAreaWidth, strHeightHalf, strAreaWidth); + + this.drawHLine(ms, x + 2, y + 1 + strHeightHalf, 4); + this.drawHLine(ms, x + 2 + strAreaWidth + 4, y + 1 + strHeightHalf, w - 4 - 4 - strAreaWidth); + this.drawHLine(ms, x + 2, y + h - 2, w - 4); + + this.drawVLine(ms, x + 1, y + 2 + strHeightHalf, h - 4 - strHeightHalf); + this.drawVLine(ms, x + w - 2, y + 2 + strHeightHalf, h - 4 - strHeightHalf); + + int yOffs = y + BORDER_SZE_N; + + for (Component c : components) { + c.render(ms, x + BORDER_SZE_W, yOffs); + yOffs += c.getHeight() + 4; + } + } + + private void drawHLine(MatrixStack ms, int xpos, int ypos, int width) { + DrawableHelper.fill(ms, xpos, ypos, xpos + width, ypos + 1, this.color); + } + + private void drawVLine(MatrixStack ms, int xpos, int ypos, int height) { + DrawableHelper.fill(ms, xpos, ypos, xpos + 1, ypos + height, this.color); + } + + // static final int ICO_DIM = 16; + // static final int PAD_S = 2; + // static final int PAD_L = 4; + // static final int SKIN_ICO_DIM = 8; + + // static final int TEXT_H = txtRend.fontHeight; + // static final int BAR_H = TEXT_H; + + // static final int TITLED_BAR_H = TEXT_H + PAD_S + BAR_H + PAD_L; + // static final int ICO_LINE_H = ICO_DIM + PAD_L; + + // public void drawRect(MatrixStack ms, int x, int y, int w, int h) { + // DrawableHelper.fill(ms, x + xpos + CONTENT_OFFS_X, y + ypos + CONTENT_OFFS_Y, + // x + xpos + CONTENT_OFFS_X + w, + // y + ypos + CONTENT_OFFS_Y + h, this.color); + // } + + // void drawIcon(ItemStack ico, int x, int y) { + // itmRend.renderGuiItemIcon(ico, x + x + CONTENT_OFFS_X, y + y + // + CONTENT_OFFS_Y); + // } + + // void drawText(MatrixStack ms, Text text, int x, int y, int color) { + // txtRend.draw(ms, text, x + x + CONTENT_OFFS_X, y + y + + // CONTENT_OFFS_Y, 0xff000000 | color); + // } + + // void drawText(MatrixStack ms, Text text, int x, int y) { + // this.drawText(ms, text, x, y, 0xffffffff); + // } + + // void drawIcoText(MatrixStack ms, ItemStack ico, Text text, int x, int y) { + // this.drawIcon(ico, x, y); + // this.drawText(ms, text, x + ICO_DIM + PAD_L, y + 5); + // } + + // void fill(MatrixStack ms, int x1, int y1, int x2, int y2, int color) { + // DrawableHelper.fill(ms, x1 + x + CONTENT_OFFS_X, y1 + y + + // CONTENT_OFFS_Y, + // x2 + x + CONTENT_OFFS_X, y2 + y + CONTENT_OFFS_Y, 0xff000000 + // | color); + // } + + // void drawBar(MatrixStack ms, int x, int y, int width, float fillPcnt, int + // color) { + // this.fill(ms, x, y, x + width, y + 10, COL_BG_BAR); + // this.fill(ms, x, y, x + (int) (width * (fillPcnt / 100f)), y + 10, color); + // } + + // void drawTitledIcoBar(MatrixStack ms, ItemStack ico, Text title, int width, + // float pcnt, int x, int y, int color) { + // final int ICO_OFFS = 3; + // this.drawIcon(ico, x, y + ICO_OFFS); + // this.drawText(ms, title, x + ICO_DIM + PAD_L, y); + // this.drawBar(ms, x + ICO_DIM + PAD_L, y + TEXT_H + PAD_S, width, pcnt, + // color); + // } + + // void drawIcoFatText(MatrixStack ms, ItemStack ico, Text line1, Text line2, + // int x, int y) { + // final int ICO_OFFS = 1; + // this.drawIcon(ico, x, y + ICO_OFFS); + // this.drawText(ms, line1, x + ICO_DIM + PAD_L, y); + // this.drawText(ms, line2, x + ICO_DIM + PAD_L, y + TEXT_H + PAD_S); + // } + + // public void drawPlayerIco(MatrixStack ms, int x, int y, Identifier + // skinTexture) { + // RenderSystem.setShaderTexture(0, skinTexture); + // PlayerSkinDrawer.draw(ms, x + x + CONTENT_OFFS_X, y + y + + // CONTENT_OFFS_Y, SKIN_ICO_DIM); + // } +} 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 new file mode 100644 index 00000000..92b7ed1b --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/Component.java @@ -0,0 +1,29 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.render.item.ItemRenderer; +import net.minecraft.client.util.math.MatrixStack; + +public abstract class Component { + + static final int ICO_DIM = 16; + static final int PAD_S = 2; + static final int PAD_L = 4; + + static TextRenderer txtRend = MinecraftClient.getInstance().textRenderer; + static ItemRenderer itmRend = MinecraftClient.getInstance().getItemRenderer(); + + int width, height; + + public abstract void render(MatrixStack ms, int x, int y); + + public int getWidth() { + return this.width; + } + + public int getHeight() { + return this.height; + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoFatTextComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoFatTextComponent.java new file mode 100644 index 00000000..5865138c --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoFatTextComponent.java @@ -0,0 +1,30 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; + +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; + +public class IcoFatTextComponent extends Component { + + private static final int ICO_OFFS = 1; + + private ItemStack ico; + private Text l1, l2; + + public IcoFatTextComponent(ItemStack ico, Text l1, Text l2) { + this.ico = ico; + this.l1 = l1; + this.l2 = l2; + + this.width = ICO_DIM + PAD_L + Math.max(txtRend.getWidth(l1), txtRend.getWidth(l2)) + PAD_S; + this.height = txtRend.fontHeight * 2 + PAD_S; + } + + @Override + public void render(MatrixStack ms, int x, int y) { + itmRend.renderGuiItemIcon(ms, ico, x, y + ICO_OFFS); + txtRend.draw(ms, l1, x + ICO_DIM + PAD_L, y, 0xffffffff); + txtRend.draw(ms, l2, x + ICO_DIM + PAD_L, y + txtRend.fontHeight + PAD_S, 0xffffffff); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoTextComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoTextComponent.java new file mode 100644 index 00000000..66f15479 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoTextComponent.java @@ -0,0 +1,26 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; + +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; + +public class IcoTextComponent extends Component { + + private ItemStack ico; + private Text text; + + public IcoTextComponent(ItemStack ico, Text text) { + this.ico = ico; + this.text = text; + + this.width = ICO_DIM + PAD_L + txtRend.getWidth(text) + PAD_S; + this.height = ICO_DIM; + } + + @Override + public void render(MatrixStack ms, int x, int y) { + itmRend.renderGuiItemIcon(ms, ico, x, y); + txtRend.draw(ms, text, x + ICO_DIM + PAD_L, y + 5, 0xffffffff); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlainTextComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlainTextComponent.java new file mode 100644 index 00000000..b801f3aa --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlainTextComponent.java @@ -0,0 +1,22 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; + +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; + +public class PlainTextComponent extends Component { + + private Text text; + + public PlainTextComponent(Text text) { + this.text = text; + + this.width = PAD_S + txtRend.getWidth(text) + PAD_S; + this.height = txtRend.fontHeight; + } + + @Override + public void render(MatrixStack ms, int x, int y) { + txtRend.draw(ms, text, x + PAD_S, y, 0xffffffff); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java new file mode 100644 index 00000000..7e1fd399 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java @@ -0,0 +1,33 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; + +import com.mojang.blaze3d.systems.RenderSystem; + +import net.minecraft.client.gui.PlayerSkinDrawer; +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.Identifier; + +public class PlayerComponent extends Component { + + private static final int SKIN_ICO_DIM = 8; + + private String name; + private Identifier tex; + + public PlayerComponent(PlayerListEntry ple) { + + name = ple.getProfile().getName(); + tex = ple.getSkinTexture(); + + this.width = txtRend.getWidth(name) + PAD_S + SKIN_ICO_DIM; + this.height = txtRend.fontHeight; + } + + @Override + public void render(MatrixStack ms, int x, int y) { + RenderSystem.setShaderTexture(0, tex); + PlayerSkinDrawer.draw(ms, x, y, SKIN_ICO_DIM); + txtRend.draw(ms, name, x + SKIN_ICO_DIM + PAD_S, y, 0xffffffff); + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java new file mode 100644 index 00000000..41539d1c --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java @@ -0,0 +1,49 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; + +import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; + +public class ProgressComponent extends Component { + + private static final int BAR_WIDTH = 100; + private static final int BAR_HEIGHT = txtRend.fontHeight + 3; + private static final int ICO_OFFS = 4; + private static final int COL_BG_BAR = 0xf0101010; + + private ItemStack ico; + private Text desc, bar; + private float pcnt; + private int color; + private int barW; + + public ProgressComponent(ItemStack ico, Text desc, Text bar, float pcnt, int color) { + this.ico = ico; + this.desc = desc; + this.bar = bar; + this.color = 0xff000000 | color; + this.pcnt = pcnt; + + this.barW = BAR_WIDTH; + this.height = txtRend.fontHeight + PAD_S + 2 + txtRend.fontHeight + 2; + this.width = ICO_DIM + PAD_L + Math.max(this.barW, txtRend.getWidth(desc)) + PAD_S; + } + + public ProgressComponent(ItemStack ico, Text text, float pcnt, int color) { + this(ico, text, Text.of(pcnt + "%"), pcnt, color); + } + + @Override + public void render(MatrixStack ms, int x, int y) { + itmRend.renderGuiItemIcon(ms, ico, x, y + ICO_OFFS); + txtRend.draw(ms, desc, x + ICO_DIM + PAD_L, y, 0xffffffff); + + int barX = x + ICO_DIM + PAD_L; + int barY = y + txtRend.fontHeight + PAD_S; + DrawableHelper.fill(ms, barX, barY, barX + this.barW, barY + BAR_HEIGHT, COL_BG_BAR); + DrawableHelper.fill(ms, barX, barY, barX + ((int) (this.barW * (this.pcnt / 100f))), barY + BAR_HEIGHT, + this.color); + txtRend.drawWithShadow(ms, bar, barX + 3, barY + 2, 0xffffffff); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/TableComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/TableComponent.java new file mode 100644 index 00000000..66c1b73b --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/TableComponent.java @@ -0,0 +1,53 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; + +import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.util.math.MatrixStack; + +// FIXME: table isn't wide enough sometimes +// FIXME: dividers drift when there are >2 cols +public class TableComponent extends Component { + + private Component[][] comps; + private int color; + private int tw, th; + private int cellW, cellH; + + public TableComponent(int w, int h, int col) { + comps = new Component[w][h]; + color = 0xff000000 | col; + tw = w; + th = h; + } + + public void addToCell(int x, int y, Component c) { + comps[x][y] = c; + + // are tables still too wide? + cellW = Math.max(cellW, c.width + PAD_S); + + // assume all rows are equally high so overwriting doesn't matter + // if this wasn't the case, drawing would need more math + // not doing any of that if it's not needed + cellH = c.height; + + this.width = cellW * tw; + this.height = (cellH + PAD_S) * th - PAD_S; + + } + + @Override + public void render(MatrixStack ms, int xpos, int ypos) { + for (int x = 0; x < tw; x++) { + for (int y = 0; y < th; y++) { + if (comps[x][y] != null) { + comps[x][y].render(ms, xpos + x * cellW + x * PAD_L, ypos + y * cellH + y * PAD_S); + } + } + if (x != tw - 1) { + DrawableHelper.fill(ms, xpos + ((x + 1) * (cellW + PAD_S)) - 1, ypos + 1, + xpos + ((x + 1) * (cellW + PAD_S)), ypos + this.height - 1, color); + } + } + } + +} diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index fc37cfb0..6d3fd9ee 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -16,7 +16,9 @@ "HandledScreenMixin", "InventoryScreenMixin", "RecipeBookWidgetAccessor", - "HandledScreenAccessor" + "HandledScreenAccessor", + "PlayerListHudAccessor", + "PlayerListHudMixin" ], "injectors": { "defaultRequire": 1 -- cgit From 20ef6eaf4672fac2d98022f9f2368b3b83868ab0 Mon Sep 17 00:00:00 2001 From: msg-programs Date: Sat, 8 Apr 2023 20:20:07 +0200 Subject: Cleanup unused things in the mixin, reword crashing text --- src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java index 36d4a375..ca6c9b41 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java @@ -30,7 +30,6 @@ public class PlayerListHudMixin { @Shadow private Text footer; - boolean ok = true; @Inject(at = @At("HEAD"), method = "render(Lnet/minecraft/client/util/math/MatrixStack;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreboardObjective;)V", cancellable = true) public void skyblocker$renderTabHud(MatrixStack ms, int scaledW, Scoreboard sb, ScoreboardObjective sbo, CallbackInfo info) { @@ -61,8 +60,7 @@ public class PlayerListHudMixin { } } catch (Exception e) { e.printStackTrace(); - SkyblockerConfig.get().general.tabHudEnabled = false; - MinecraftClient.getInstance().player.sendMessage(Text.of("The tab HUD has crashed due to some unexpected text, see log! :(")); + MinecraftClient.getInstance().player.sendMessage(Text.of("The tab HUD has encountered unexpected text, see log! :(")); } } -- cgit From 9c1d500ff84641612c178f883e2dbeb2f3bfef84 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Wed, 3 May 2023 17:14:28 -0400 Subject: Refactored container to gui --- .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 2 +- .../skyblocker/container/ColorHighlight.java | 4 - .../skyblocker/container/ContainerSolver.java | 39 ---------- .../container/ContainerSolverManager.java | 89 ---------------------- .../me/xmrvizzy/skyblocker/gui/ColorHighlight.java | 4 + .../xmrvizzy/skyblocker/gui/ContainerSolver.java | 39 ++++++++++ .../skyblocker/gui/ContainerSolverManager.java | 89 ++++++++++++++++++++++ .../skyblocker/mixin/MinecraftClientMixin.java | 2 +- .../skyblocker/skyblock/dungeon/CroesusHelper.java | 4 +- .../skyblock/dungeon/terminal/ColorTerminal.java | 4 +- .../skyblock/dungeon/terminal/OrderTerminal.java | 4 +- .../dungeon/terminal/StartsWithTerminal.java | 4 +- .../skyblock/quicknav/QuickNavButton.java | 2 +- 13 files changed, 143 insertions(+), 143 deletions(-) delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/container/ColorHighlight.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolver.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolverManager.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/gui/ColorHighlight.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolver.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index f804d90e..c519109a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -1,6 +1,6 @@ package me.xmrvizzy.skyblocker; -import me.xmrvizzy.skyblocker.container.ContainerSolverManager; +import me.xmrvizzy.skyblocker.gui.ContainerSolverManager; import me.xmrvizzy.skyblocker.discord.DiscordRPCManager; import me.xmrvizzy.skyblocker.skyblock.BackpackPreview; import me.xmrvizzy.skyblocker.skyblock.StatusBarTracker; diff --git a/src/main/java/me/xmrvizzy/skyblocker/container/ColorHighlight.java b/src/main/java/me/xmrvizzy/skyblocker/container/ColorHighlight.java deleted file mode 100644 index c4380eab..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/container/ColorHighlight.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.xmrvizzy.skyblocker.container; - -public record ColorHighlight(int slot, int color) { -} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolver.java b/src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolver.java deleted file mode 100644 index ecec2449..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolver.java +++ /dev/null @@ -1,39 +0,0 @@ -package me.xmrvizzy.skyblocker.container; - -import net.minecraft.item.ItemStack; - -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; - -/** - * Abstract class for container solvers. Extend this class to add a new container solver, like terminal solvers or experiment solvers. - */ -public abstract class ContainerSolver { - private final Pattern CONTAINER_NAME; - protected final static int GREEN_HIGHLIGHT = 128 << 24 | 64 << 16 | 196 << 8 | 64; - protected final static int GRAY_HIGHLIGHT = 128 << 24 | 64 << 16 | 64 << 8 | 64; - - public ContainerSolver(String containerName) { - CONTAINER_NAME = Pattern.compile(containerName); - } - - public abstract boolean isEnabled(); - - public Pattern getName() { - return CONTAINER_NAME; - } - - public abstract List getColors(String[] groups, Map slots); - - public void trimEdges(Map slots, int rows) { - for (int i = 0; i < rows; i++) { - slots.remove(9 * i); - slots.remove(9 * i + 8); - } - for (int i = 1; i < 8; i++) { - slots.remove(i); - slots.remove((rows - 1) * 9 + i); - } - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolverManager.java b/src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolverManager.java deleted file mode 100644 index b50231fb..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolverManager.java +++ /dev/null @@ -1,89 +0,0 @@ -package me.xmrvizzy.skyblocker.container; - -import com.mojang.blaze3d.systems.RenderSystem; -import me.xmrvizzy.skyblocker.skyblock.dungeon.CroesusHelper; -import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.ColorTerminal; -import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.OrderTerminal; -import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.StartsWithTerminal; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.slot.Slot; -import org.jetbrains.annotations.NotNull; - -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Manager class for {@link ContainerSolver}s like terminal solvers and experiment solvers. To add a new container solver, extend {@link ContainerSolver} and register it in {@link #ContainerSolverManager()}. - */ -public class ContainerSolverManager extends DrawableHelper { - private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile(""); - private final ContainerSolver[] solvers; - private ContainerSolver currentSolver = null; - private String[] groups; - private List highlights; - - public ContainerSolverManager() { - solvers = new ContainerSolver[]{ - new ColorTerminal(), - new OrderTerminal(), - new StartsWithTerminal(), - new CroesusHelper() - }; - } - - public void onSetScreen(@NotNull GenericContainerScreen screen) { - String screenName = screen.getTitle().getString(); - Matcher matcher = PLACEHOLDER_PATTERN.matcher(screenName); - for (ContainerSolver solver : solvers) { - if (solver.isEnabled()) { - matcher.usePattern(solver.getName()); - matcher.reset(); - if (matcher.matches()) { - currentSolver = solver; - groups = new String[matcher.groupCount()]; - for (int i = 0; i < groups.length; i++) - groups[i] = matcher.group(i + 1); - return; - } - } - } - currentSolver = null; - } - - public void clearScreen() { - currentSolver = null; - } - - public void markDirty() { - highlights = null; - } - - public void onDraw(MatrixStack matrices, List slots) { - if (currentSolver == null) - return; - if (highlights == null) - highlights = currentSolver.getColors(groups, slotMap(slots)); - RenderSystem.disableDepthTest(); - RenderSystem.colorMask(true, true, true, false); - for (ColorHighlight highlight : highlights) { - Slot slot = slots.get(highlight.slot()); - int color = highlight.color(); - fillGradient(matrices, slot.x, slot.y, slot.x + 16, slot.y + 16, color, color); - } - RenderSystem.colorMask(true, true, true, true); - RenderSystem.enableDepthTest(); - } - - private Map slotMap(List slots) { - Map slotMap = new TreeMap<>(); - for (int i = 0; i < slots.size(); i++) - slotMap.put(i, slots.get(i).getStack()); - return slotMap; - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/gui/ColorHighlight.java b/src/main/java/me/xmrvizzy/skyblocker/gui/ColorHighlight.java new file mode 100644 index 00000000..5120ceac --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/gui/ColorHighlight.java @@ -0,0 +1,4 @@ +package me.xmrvizzy.skyblocker.gui; + +public record ColorHighlight(int slot, int color) { +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolver.java b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolver.java new file mode 100644 index 00000000..84de64eb --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolver.java @@ -0,0 +1,39 @@ +package me.xmrvizzy.skyblocker.gui; + +import net.minecraft.item.ItemStack; + +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +/** + * Abstract class for gui solvers. Extend this class to add a new gui solver, like terminal solvers or experiment solvers. + */ +public abstract class ContainerSolver { + private final Pattern CONTAINER_NAME; + protected final static int GREEN_HIGHLIGHT = 128 << 24 | 64 << 16 | 196 << 8 | 64; + protected final static int GRAY_HIGHLIGHT = 128 << 24 | 64 << 16 | 64 << 8 | 64; + + public ContainerSolver(String containerName) { + CONTAINER_NAME = Pattern.compile(containerName); + } + + public abstract boolean isEnabled(); + + public Pattern getName() { + return CONTAINER_NAME; + } + + public abstract List getColors(String[] groups, Map slots); + + public void trimEdges(Map slots, int rows) { + for (int i = 0; i < rows; i++) { + slots.remove(9 * i); + slots.remove(9 * i + 8); + } + for (int i = 1; i < 8; i++) { + slots.remove(i); + slots.remove((rows - 1) * 9 + i); + } + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java new file mode 100644 index 00000000..c965154f --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java @@ -0,0 +1,89 @@ +package me.xmrvizzy.skyblocker.gui; + +import com.mojang.blaze3d.systems.RenderSystem; +import me.xmrvizzy.skyblocker.skyblock.dungeon.CroesusHelper; +import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.ColorTerminal; +import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.OrderTerminal; +import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.StartsWithTerminal; +import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Manager class for {@link ContainerSolver}s like terminal solvers and experiment solvers. To add a new gui solver, extend {@link ContainerSolver} and register it in {@link #ContainerSolverManager()}. + */ +public class ContainerSolverManager extends DrawableHelper { + private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile(""); + private final ContainerSolver[] solvers; + private ContainerSolver currentSolver = null; + private String[] groups; + private List highlights; + + public ContainerSolverManager() { + solvers = new ContainerSolver[]{ + new ColorTerminal(), + new OrderTerminal(), + new StartsWithTerminal(), + new CroesusHelper() + }; + } + + public void onSetScreen(@NotNull GenericContainerScreen screen) { + String screenName = screen.getTitle().getString(); + Matcher matcher = PLACEHOLDER_PATTERN.matcher(screenName); + for (ContainerSolver solver : solvers) { + if (solver.isEnabled()) { + matcher.usePattern(solver.getName()); + matcher.reset(); + if (matcher.matches()) { + currentSolver = solver; + groups = new String[matcher.groupCount()]; + for (int i = 0; i < groups.length; i++) + groups[i] = matcher.group(i + 1); + return; + } + } + } + currentSolver = null; + } + + public void clearScreen() { + currentSolver = null; + } + + public void markDirty() { + highlights = null; + } + + public void onDraw(MatrixStack matrices, List slots) { + if (currentSolver == null) + return; + if (highlights == null) + highlights = currentSolver.getColors(groups, slotMap(slots)); + RenderSystem.disableDepthTest(); + RenderSystem.colorMask(true, true, true, false); + for (ColorHighlight highlight : highlights) { + Slot slot = slots.get(highlight.slot()); + int color = highlight.color(); + fillGradient(matrices, slot.x, slot.y, slot.x + 16, slot.y + 16, color, color); + } + RenderSystem.colorMask(true, true, true, true); + RenderSystem.enableDepthTest(); + } + + private Map slotMap(List slots) { + Map slotMap = new TreeMap<>(); + for (int i = 0; i < slots.size(); i++) + slotMap.put(i, slots.get(i).getStack()); + return slotMap; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java index 2bc47bba..1f9009b7 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java @@ -1,7 +1,7 @@ package me.xmrvizzy.skyblocker.mixin; import me.xmrvizzy.skyblocker.SkyblockerMod; -import me.xmrvizzy.skyblocker.container.ContainerSolverManager; +import me.xmrvizzy.skyblocker.gui.ContainerSolverManager; import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock; import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.MinecraftClient; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/CroesusHelper.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/CroesusHelper.java index c536542b..ec3655f0 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/CroesusHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/CroesusHelper.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.container.ColorHighlight; -import me.xmrvizzy.skyblocker.container.ContainerSolver; +import me.xmrvizzy.skyblocker.gui.ColorHighlight; +import me.xmrvizzy.skyblocker.gui.ContainerSolver; import net.minecraft.item.ItemStack; import java.util.ArrayList; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java index f5c97738..0bfc0d60 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon.terminal; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.container.ColorHighlight; -import me.xmrvizzy.skyblocker.container.ContainerSolver; +import me.xmrvizzy.skyblocker.gui.ColorHighlight; +import me.xmrvizzy.skyblocker.gui.ContainerSolver; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java index c61395f4..1cf0dcfc 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon.terminal; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.container.ColorHighlight; -import me.xmrvizzy.skyblocker.container.ContainerSolver; +import me.xmrvizzy.skyblocker.gui.ColorHighlight; +import me.xmrvizzy.skyblocker.gui.ContainerSolver; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java index 7c56746f..26d2a2c4 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon.terminal; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.container.ColorHighlight; -import me.xmrvizzy.skyblocker.container.ContainerSolver; +import me.xmrvizzy.skyblocker.gui.ColorHighlight; +import me.xmrvizzy.skyblocker.gui.ContainerSolver; import net.minecraft.item.ItemStack; import java.util.ArrayList; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java index e31827ab..042d96d9 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java @@ -19,7 +19,7 @@ import net.minecraft.util.Identifier; @Environment(value=EnvType.CLIENT) public class QuickNavButton extends ClickableWidget { private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); - private static final Identifier BUTTON_TEXTURE = new Identifier("textures/gui/container/creative_inventory/tabs.png"); + private static final Identifier BUTTON_TEXTURE = new Identifier("textures/gui/gui/creative_inventory/tabs.png"); private final int index; private boolean toggled; -- cgit From fca101c2d22c682856f7097a1c013c59d0850e0d Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Wed, 3 May 2023 17:35:43 -0400 Subject: Migrated client tick and container mixins to ClientTickEvents and ScreenEvents --- .../xmrvizzy/skyblocker/SkyblockerInitializer.java | 29 ------------------- .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 33 ++++++++++++++++++++-- .../container/ContainerSolverManager.java | 15 ++++++++++ .../mixin/GenericContainerScreenMixin.java | 31 -------------------- .../skyblocker/mixin/MinecraftClientMixin.java | 22 ++------------- src/main/resources/fabric.mod.json | 2 +- src/main/resources/skyblocker.mixins.json | 1 - 7 files changed, 50 insertions(+), 83 deletions(-) delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenMixin.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java deleted file mode 100644 index 3d713727..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java +++ /dev/null @@ -1,29 +0,0 @@ -package me.xmrvizzy.skyblocker; - -import me.xmrvizzy.skyblocker.chat.ChatMessageListener; -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.discord.DiscordRPCManager; -import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock; -import me.xmrvizzy.skyblocker.skyblock.api.StatsCommand; -import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHud; -import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; -import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup; -import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; -import me.xmrvizzy.skyblocker.utils.UpdateChecker; -import net.fabricmc.api.ClientModInitializer; - -public class SkyblockerInitializer implements ClientModInitializer { - @Override - public void onInitializeClient() { - HotbarSlotLock.init(); - SkyblockerConfig.init(); - PriceInfoTooltip.init(); - WikiLookup.init(); - ItemRegistry.init(); - StatsCommand.init(); - DwarvenHud.init(); - ChatMessageListener.init(); - UpdateChecker.init(); - DiscordRPCManager.init(); - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index f804d90e..f91192ba 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -1,15 +1,28 @@ package me.xmrvizzy.skyblocker; +import me.xmrvizzy.skyblocker.chat.ChatMessageListener; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.container.ContainerSolverManager; import me.xmrvizzy.skyblocker.discord.DiscordRPCManager; import me.xmrvizzy.skyblocker.skyblock.BackpackPreview; +import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock; import me.xmrvizzy.skyblocker.skyblock.StatusBarTracker; +import me.xmrvizzy.skyblocker.skyblock.api.StatsCommand; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonBlaze; import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHud; +import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; +import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup; +import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; import me.xmrvizzy.skyblocker.utils.Scheduler; +import me.xmrvizzy.skyblocker.utils.UpdateChecker; import me.xmrvizzy.skyblocker.utils.Utils; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.minecraft.client.MinecraftClient; -public class SkyblockerMod { +import java.awt.*; + +public class SkyblockerMod implements ClientModInitializer { public static final String NAMESPACE = "skyblocker"; private static final SkyblockerMod instance = new SkyblockerMod(); @@ -29,7 +42,23 @@ public class SkyblockerMod { return instance; } - public void onTick() { + @Override + public void onInitializeClient() { + ClientTickEvents.END_CLIENT_TICK.register(this::tick); + HotbarSlotLock.init(); + SkyblockerConfig.init(); + PriceInfoTooltip.init(); + WikiLookup.init(); + ItemRegistry.init(); + ContainerSolverManager.init(); + StatsCommand.init(); + DwarvenHud.init(); + ChatMessageListener.init(); + UpdateChecker.init(); + DiscordRPCManager.init(); + } + + public void tick(MinecraftClient client) { scheduler.tick(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolverManager.java b/src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolverManager.java index 276ac3b9..e2bf359f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolverManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/container/ContainerSolverManager.java @@ -1,10 +1,13 @@ package me.xmrvizzy.skyblocker.container; import com.mojang.blaze3d.systems.RenderSystem; +import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.skyblock.dungeon.CroesusHelper; import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.ColorTerminal; import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.OrderTerminal; import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.StartsWithTerminal; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; import net.minecraft.client.util.math.MatrixStack; @@ -34,6 +37,18 @@ public class ContainerSolverManager extends DrawableHelper { }; } + public static void init() { + ScreenEvents.BEFORE_INIT.register((client, screen, scaledWidth, scaledHeight) -> { + ContainerSolverManager containerSolverManager = SkyblockerMod.getInstance().containerSolverManager; + if (Utils.isOnSkyblock && screen instanceof GenericContainerScreen genericContainerScreen) { + ScreenEvents.afterRender(screen).register((screen1, matrices, mouseX, mouseY, delta) -> containerSolverManager.onDraw(matrices, genericContainerScreen.getScreenHandler().slots.subList(0, genericContainerScreen.getScreenHandler().getRows() * 9))); + containerSolverManager.onSetScreen(genericContainerScreen); + } else { + containerSolverManager.clearScreen(); + } + }); + } + public void onSetScreen(@NotNull GenericContainerScreen screen) { String screenName = screen.getTitle().getString(); Matcher matcher = PLACEHOLDER_PATTERN.matcher(screenName); diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenMixin.java deleted file mode 100644 index d63d17b8..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenMixin.java +++ /dev/null @@ -1,31 +0,0 @@ -package me.xmrvizzy.skyblocker.mixin; - -import me.xmrvizzy.skyblocker.SkyblockerMod; -import me.xmrvizzy.skyblocker.utils.Utils; -import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.screen.GenericContainerScreenHandler; -import net.minecraft.text.Text; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(GenericContainerScreen.class) -public abstract class GenericContainerScreenMixin extends HandledScreen { - @Shadow - @Final - private int rows; - - public GenericContainerScreenMixin(GenericContainerScreenHandler handler, PlayerInventory inventory, Text title) { - super(handler, inventory, title); - } - - @Override - protected void drawForeground(MatrixStack matrices, int mouseX, int mouseY) { - super.drawForeground(matrices, mouseX, mouseY); - if (Utils.isOnSkyblock) - SkyblockerMod.getInstance().containerSolverManager.onDraw(matrices, this.handler.slots.subList(0, rows * 9)); - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java index 2bc47bba..24e27c08 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java @@ -1,12 +1,8 @@ package me.xmrvizzy.skyblocker.mixin; -import me.xmrvizzy.skyblocker.SkyblockerMod; -import me.xmrvizzy.skyblocker.container.ContainerSolverManager; import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock; import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; import net.minecraft.client.network.ClientPlayerEntity; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; @@ -22,22 +18,10 @@ public abstract class MinecraftClientMixin { @Nullable public ClientPlayerEntity player; - @Inject(method = "tick", at = @At("HEAD")) - public void skyblocker$tick(CallbackInfo ci) { - SkyblockerMod.getInstance().onTick(); - } - @Inject(method = "handleInputEvents", at = @At("HEAD")) public void skyblocker$handleInputEvents(CallbackInfo ci) { - if (Utils.isOnSkyblock) HotbarSlotLock.handleInputEvents(player); - } - - @Inject(method = "setScreen", at = @At("HEAD")) - public void skyblocker$onSetScreen(Screen screen, CallbackInfo ci) { - ContainerSolverManager manager = SkyblockerMod.getInstance().containerSolverManager; - if (Utils.isOnSkyblock && screen instanceof GenericContainerScreen) - manager.onSetScreen((GenericContainerScreen) screen); - else - manager.clearScreen(); + if (Utils.isOnSkyblock) { + HotbarSlotLock.handleInputEvents(player); + } } } \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index d8ef4941..00bf5b57 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -16,7 +16,7 @@ "environment": "client", "entrypoints": { "client": [ - "me.xmrvizzy.skyblocker.SkyblockerInitializer" + "me.xmrvizzy.skyblocker.SkyblockerMod" ], "modmenu": [ "me.xmrvizzy.skyblocker.config.modmenu.ModMenuEntry" diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index 4a6be779..24feafda 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -11,7 +11,6 @@ "FarmlandBlockMixin", "MinecraftClientMixin", "AccessorWorldRenderer", - "GenericContainerScreenMixin", "GenericContainerScreenHandlerMixin", "HandledScreenMixin", "InventoryScreenMixin", -- cgit From 38d19549c1f02dee99d803e735d7989f528637f6 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Wed, 3 May 2023 17:55:23 -0400 Subject: Migrated backpack and QuickNav mixins to ScreenEvents --- src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 5 +++-- .../xmrvizzy/skyblocker/mixin/HandledScreenMixin.java | 17 ----------------- .../xmrvizzy/skyblocker/skyblock/BackpackPreview.java | 9 +++++++++ .../xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java | 17 +++++++++++++++-- 4 files changed, 27 insertions(+), 21 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index f91192ba..80b02eee 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -13,6 +13,7 @@ import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHud; import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup; import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; +import me.xmrvizzy.skyblocker.skyblock.quicknav.QuickNav; import me.xmrvizzy.skyblocker.utils.Scheduler; import me.xmrvizzy.skyblocker.utils.UpdateChecker; import me.xmrvizzy.skyblocker.utils.Utils; @@ -20,8 +21,6 @@ import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.minecraft.client.MinecraftClient; -import java.awt.*; - public class SkyblockerMod implements ClientModInitializer { public static final String NAMESPACE = "skyblocker"; private static final SkyblockerMod instance = new SkyblockerMod(); @@ -51,6 +50,8 @@ public class SkyblockerMod implements ClientModInitializer { WikiLookup.init(); ItemRegistry.init(); ContainerSolverManager.init(); + BackpackPreview.init(); + QuickNav.init(); StatsCommand.init(); DwarvenHud.init(); ChatMessageListener.init(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index 44b1b5c8..2d200a86 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -3,9 +3,6 @@ package me.xmrvizzy.skyblocker.mixin; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.BackpackPreview; import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup; -import me.xmrvizzy.skyblocker.skyblock.quicknav.QuickNav; -import me.xmrvizzy.skyblocker.skyblock.quicknav.QuickNavButton; -import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.util.math.MatrixStack; @@ -19,8 +16,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.List; - @Mixin(HandledScreen.class) public abstract class HandledScreenMixin extends Screen { protected HandledScreenMixin(Text title) { @@ -31,18 +26,6 @@ public abstract class HandledScreenMixin extends Screen { @Nullable protected Slot focusedSlot; - @Inject(method = "init()V", at = @At("TAIL")) - private void skyblocker$init(CallbackInfo ci) { - // quicknav - if (Utils.isOnSkyblock && SkyblockerConfig.get().quickNav.enableQuickNav) { - String screenTitle = super.getTitle().getString().trim(); - List buttons = QuickNav.init(screenTitle); - for (QuickNavButton button : buttons) super.addDrawableChild(button); - } - // backpack preview - BackpackPreview.updateStorage((HandledScreen) (Object) this); - } - @Inject(at = @At("HEAD"), method = "keyPressed") public void skyblocker$keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable cir) { if (this.focusedSlot != null) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java index d8cca051..a6dfe31d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java @@ -3,6 +3,7 @@ package me.xmrvizzy.skyblocker.skyblock; import com.mojang.blaze3d.systems.RenderSystem; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; @@ -40,6 +41,14 @@ public class BackpackPreview extends DrawableHelper { private static String loaded = ""; // uuid + sb profile currently loaded private static Path save_dir = null; + public static void init() { + ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> { + if (screen instanceof HandledScreen handledScreen) { + updateStorage(handledScreen); + } + }); + } + public static void tick() { Utils.sbChecker(); // force update isOnSkyblock to prevent crash on disconnect if (Utils.isOnSkyblock) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java index 99e1c529..8ab49754 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java @@ -1,9 +1,11 @@ package me.xmrvizzy.skyblocker.skyblock.quicknav; import com.mojang.brigadier.exceptions.CommandSyntaxException; - import me.xmrvizzy.skyblocker.config.SkyblockerConfig; - +import me.xmrvizzy.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; +import net.fabricmc.fabric.api.client.screen.v1.Screens; +import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.item.ItemStack; import net.minecraft.nbt.StringNbtReader; @@ -14,6 +16,17 @@ import java.util.Locale; public class QuickNav { private static final String skyblockHubIconNbt = "{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;-300151517,-631415889,-1193921967,-1821784279],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDdjYzY2ODc0MjNkMDU3MGQ1NTZhYzUzZTA2NzZjYjU2M2JiZGQ5NzE3Y2Q4MjY5YmRlYmVkNmY2ZDRlN2JmOCJ9fX0=\"}]}}}}"; private static final String dungeonHubIconNbt = "{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;1605800870,415127827,-1236127084,15358548],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzg5MWQ1YjI3M2ZmMGJjNTBjOTYwYjJjZDg2ZWVmMWM0MGExYjk0MDMyYWU3MWU3NTQ3NWE1NjhhODI1NzQyMSJ9fX0=\"}]}}}}"; + + public static void init() { + ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> { + if (Utils.isOnSkyblock && SkyblockerConfig.get().quickNav.enableQuickNav && screen instanceof HandledScreen) { + String screenTitle = screen.getTitle().getString().trim(); + List buttons = QuickNav.init(screenTitle); + for (QuickNavButton button : buttons) Screens.getButtons(screen).add(button); + } + }); + } + public static List init(String screenTitle) { List buttons = new ArrayList<>(); SkyblockerConfig.QuickNav data = SkyblockerConfig.get().quickNav; -- cgit From 763507b427d151c77a3c5a1b8dfe03f0a4a059e1 Mon Sep 17 00:00:00 2001 From: msg-programs Date: Sat, 6 May 2023 11:32:50 +0200 Subject: Minor refactoring --- .../me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java index ca6c9b41..f4089f83 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java @@ -31,13 +31,12 @@ public class PlayerListHudMixin { private Text footer; @Inject(at = @At("HEAD"), method = "render(Lnet/minecraft/client/util/math/MatrixStack;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreboardObjective;)V", cancellable = true) - public void skyblocker$renderTabHud(MatrixStack ms, int scaledW, Scoreboard sb, ScoreboardObjective sbo, CallbackInfo info) { + public void skyblocker$renderTabHud(MatrixStack ms, int scaledW, Scoreboard sb, ScoreboardObjective sbo, + CallbackInfo info) { - if (!Utils.isOnSkyblock) { - return; - } - - if (TabHud.defaultTgl.isPressed()) { + if (!Utils.isOnSkyblock + || !SkyblockerConfig.get().general.tabHudEnabled + || TabHud.defaultTgl.isPressed()) { return; } @@ -47,7 +46,8 @@ public class PlayerListHudMixin { return; } - List list = nwH.getListedPlayerListEntries().stream().sorted(PlayerListHudAccessor.getOrdering()).toList(); + List list = nwH.getListedPlayerListEntries().stream() + .sorted(PlayerListHudAccessor.getOrdering()).toList(); int w = scaledW; int h = MinecraftClient.getInstance().getWindow().getScaledHeight(); @@ -60,7 +60,7 @@ public class PlayerListHudMixin { } } catch (Exception e) { e.printStackTrace(); - MinecraftClient.getInstance().player.sendMessage(Text.of("The tab HUD has encountered unexpected text, see log! :(")); + client.player.sendMessage(Text.of("The tab HUD has encountered unexpected text, see log! :(")); } } -- cgit From e332b243dcea6ec567bd38db99ec3cfa35a57fe1 Mon Sep 17 00:00:00 2001 From: msg-programs Date: Sat, 6 May 2023 13:15:51 +0200 Subject: Minor foramtting and code style changes --- .../me/xmrvizzy/skyblocker/mixin/PlayerListHudAccessor.java | 4 ++-- .../skyblock/tabhud/widget/component/TableComponent.java | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudAccessor.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudAccessor.java index e96e4ede..db329775 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudAccessor.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudAccessor.java @@ -10,9 +10,9 @@ import net.minecraft.client.network.PlayerListEntry; @Mixin(PlayerListHud.class) public interface PlayerListHudAccessor { - + @Accessor("ENTRY_ORDERING") public static Comparator getOrdering() { - throw new AssertionError(); + throw new AssertionError(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/TableComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/TableComponent.java index 66c1b73b..2d367b11 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/TableComponent.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/TableComponent.java @@ -20,18 +20,18 @@ public class TableComponent extends Component { } public void addToCell(int x, int y, Component c) { - comps[x][y] = c; + this.comps[x][y] = c; // are tables still too wide? - cellW = Math.max(cellW, c.width + PAD_S); + this.cellW = Math.max(this.cellW, c.width + PAD_S); // assume all rows are equally high so overwriting doesn't matter // if this wasn't the case, drawing would need more math // not doing any of that if it's not needed - cellH = c.height; + this.cellH = c.height; - this.width = cellW * tw; - this.height = (cellH + PAD_S) * th - PAD_S; + this.width = this.cellW * this.tw; + this.height = (this.cellH + PAD_S) * this.th - PAD_S; } @@ -45,7 +45,7 @@ public class TableComponent extends Component { } if (x != tw - 1) { DrawableHelper.fill(ms, xpos + ((x + 1) * (cellW + PAD_S)) - 1, ypos + 1, - xpos + ((x + 1) * (cellW + PAD_S)), ypos + this.height - 1, color); + xpos + ((x + 1) * (cellW + PAD_S)), ypos + this.height - 1, this.color); } } } -- cgit From 8716da49090362275e94d159b0dc7be4781f6451 Mon Sep 17 00:00:00 2001 From: msg-programs Date: Sun, 7 May 2023 11:32:45 +0200 Subject: Put fancy tab HUD config into its own section --- .../me/xmrvizzy/skyblocker/config/SkyblockerConfig.java | 15 +++++++++++---- .../me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java | 2 +- .../skyblocker/skyblock/tabhud/screens/Screen.java | 2 +- .../skyblocker/skyblock/tabhud/widget/Widget.java | 2 +- src/main/resources/assets/skyblocker/lang/de_de.json | 7 ++++--- src/main/resources/assets/skyblocker/lang/en_us.json | 7 ++++--- 6 files changed, 22 insertions(+), 13 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index f612ae08..e89c32bd 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -127,10 +127,9 @@ public class SkyblockerConfig implements ConfigData { public boolean backpackPreviewWithoutShift = false; public boolean hideEmptyTooltips = true; - public boolean tabHudEnabled = true; - @ConfigEntry.BoundedDiscrete(min=10, max=200) - @ConfigEntry.Gui.Tooltip() - public int tabHudScale = 100; + @ConfigEntry.Category("tabHud") + @ConfigEntry.Gui.CollapsibleObject() + public TabHudConf tabHud = new TabHudConf(); @ConfigEntry.Gui.Excluded public String apiKey; @@ -155,6 +154,14 @@ public class SkyblockerConfig implements ConfigData { public List lockedSlots = new ArrayList<>(); } + public static class TabHudConf { + public boolean tabHudEnabled = true; + + @ConfigEntry.BoundedDiscrete(min=10, max=200) + @ConfigEntry.Gui.Tooltip() + public int tabHudScale = 100; + } + public static class Bars { public boolean enableBars = true; diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java index f4089f83..bb2c0e0c 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java @@ -35,7 +35,7 @@ public class PlayerListHudMixin { CallbackInfo info) { if (!Utils.isOnSkyblock - || !SkyblockerConfig.get().general.tabHudEnabled + || !SkyblockerConfig.get().general.tabHud.tabHudEnabled || TabHud.defaultTgl.isPressed()) { return; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java index 8edfbb56..cc16da8b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java @@ -34,7 +34,7 @@ public class Screen { private int w, h; public Screen(int w, int h) { - float scale = SkyblockerConfig.get().general.tabHudScale / 100f; + float scale = SkyblockerConfig.get().general.tabHud.tabHudScale / 100f; this.w = (int) (w / scale); this.h = (int) (h / scale); } 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 b7e8f1e9..c0d3bf0e 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 @@ -85,7 +85,7 @@ public abstract class Widget { RenderSystem.enableDepthTest(); ms.push(); - float scale = SkyblockerConfig.get().general.tabHudScale / 100f; + float scale = SkyblockerConfig.get().general.tabHud.tabHudScale / 100f; ms.scale(scale, scale, 1); // move above other UI elements diff --git a/src/main/resources/assets/skyblocker/lang/de_de.json b/src/main/resources/assets/skyblocker/lang/de_de.json index 1b6b75ac..4a84719c 100644 --- a/src/main/resources/assets/skyblocker/lang/de_de.json +++ b/src/main/resources/assets/skyblocker/lang/de_de.json @@ -4,9 +4,10 @@ "text.autoconfig.skyblocker.title": "Skyblocker-Einstellungen", "text.autoconfig.skyblocker.category.general": "Allgemein", "text.autoconfig.skyblocker.option.general.bars": "Gesundheits-, Mana-, Verteidigungs- und XP-Balken", - "text.autoconfig.skyblocker.option.general.tabHudEnabled": "Schöneres Tab-HUD aktivieren", - "text.autoconfig.skyblocker.option.general.tabHudScale": "Skalierungsfaktor für schöners Tab-HUD", - "text.autoconfig.skyblocker.option.general.tabHudScale.@Tooltip": "Wert in %, relativ zur Skalierung des Vanilla-GUIs", + "text.autoconfig.skyblocker.option.general.tabHud": "Schöneres Tab-HUD", + "text.autoconfig.skyblocker.option.general.tabHud.tabHudEnabled": "Schöneres Tab-HUD aktivieren", + "text.autoconfig.skyblocker.option.general.tabHud.tabHudScale": "Skalierungsfaktor für schöners Tab-HUD", + "text.autoconfig.skyblocker.option.general.tabHud.tabHudScale.@Tooltip": "Wert in %, relativ zur Skalierung des Vanilla-GUIs", "text.autoconfig.skyblocker.option.general.bars.enableBars": "Balken aktivieren", "text.autoconfig.skyblocker.option.general.hideEmptyTooltips": "Leere Item-Tooltips in Menüs verstecken", diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index ae1b2719..9e467505 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -23,9 +23,10 @@ "text.autoconfig.skyblocker.option.general.quicknav": "Quicknav", "text.autoconfig.skyblocker.option.general.quicknav.enableQuicknav": "Enable Quicknav", "text.autoconfig.skyblocker.option.general.backpackPreviewWithoutShift": "View backpack preview without holding Shift", - "text.autoconfig.skyblocker.option.general.tabHudEnabled": "Enable fancy tab HUD", - "text.autoconfig.skyblocker.option.general.tabHudScale": "Scale factor of fancy tab HUD", - "text.autoconfig.skyblocker.option.general.tabHudScale.@Tooltip": "Value in %, relative to your vanilla GUI scale", + "text.autoconfig.skyblocker.option.general.tabHud": "Fancy tab HUD", + "text.autoconfig.skyblocker.option.general.tabHud.tabHudEnabled": "Enable fancy tab HUD", + "text.autoconfig.skyblocker.option.general.tabHud.tabHudScale": "Scale factor of fancy tab HUD", + "text.autoconfig.skyblocker.option.general.tabHud.tabHudScale.@Tooltip": "Value in %, relative to your vanilla GUI scale", "text.autoconfig.skyblocker.option.general.itemTooltip": "Item Tooltip", "text.autoconfig.skyblocker.option.general.itemTooltip.enableNPCPrice": "Enable NPC Price", "text.autoconfig.skyblocker.option.general.itemTooltip.enableAvgBIN": "Enable Avg. BIN Price", -- cgit From 272b19c2d8219380caf4ed74042d6d62152ac2fb Mon Sep 17 00:00:00 2001 From: msg-programs Date: Fri, 12 May 2023 23:57:21 +0200 Subject: Prevent errors when player list is incomplete shortly after join or area change --- src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java index bb2c0e0c..a2ab848a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java @@ -48,6 +48,12 @@ public class PlayerListHudMixin { List list = nwH.getListedPlayerListEntries().stream() .sorted(PlayerListHudAccessor.getOrdering()).toList(); + + // list hasn't loaded completely, abort until widgets handle errors correctly + if (list.size() < 40) { + return; + } + int w = scaledW; int h = MinecraftClient.getInstance().getWindow().getScaledHeight(); -- cgit From 73968e490b4a6886b05f45a95bfcd2328affdac4 Mon Sep 17 00:00:00 2001 From: msg-programs Date: Fri, 19 May 2023 17:05:00 +0200 Subject: Rework just about everything to gracefully handle unexpected inputs --- .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 2 + .../skyblocker/mixin/PlayerListHudMixin.java | 25 ++---- .../skyblock/tabhud/screens/EmptyScreen.java | 7 +- .../skyblocker/skyblock/tabhud/screens/Screen.java | 65 +++++++-------- .../screens/genericInfo/GardenInfoScreen.java | 14 ++-- .../screens/genericInfo/GenericInfoScreen.java | 14 ++-- .../tabhud/screens/main/CrimsonIsleScreen.java | 14 ++-- .../tabhud/screens/main/DungeonHubScreen.java | 8 +- .../tabhud/screens/main/DungeonScreen.java | 16 ++-- .../tabhud/screens/main/FarmingServerScreen.java | 10 +-- .../skyblock/tabhud/screens/main/GardenScreen.java | 8 +- .../tabhud/screens/main/GenericServerScreen.java | 7 +- .../tabhud/screens/main/GuestServerScreen.java | 8 +- .../tabhud/screens/main/HomeServerScreen.java | 10 +-- .../tabhud/screens/main/HubServerScreen.java | 10 +-- .../tabhud/screens/main/MineServerScreen.java | 14 ++-- .../tabhud/screens/main/ParkServerScreen.java | 7 +- .../screens/playerList/DungeonPlayerScreen.java | 16 ++-- .../screens/playerList/GuestPlayerScreen.java | 10 +-- .../screens/playerList/HomePlayerScreen.java | 10 +-- .../screens/playerList/PlayerListScreen.java | 6 +- .../skyblock/tabhud/util/PlayerListMgr.java | 92 ++++++++++++++++++++++ .../skyblock/tabhud/util/PlayerLocator.java | 29 +++---- .../skyblocker/skyblock/tabhud/util/StrMan.java | 68 ---------------- .../skyblock/tabhud/widget/CommsWidget.java | 28 ++++--- .../skyblock/tabhud/widget/ComposterWidget.java | 26 ++---- .../skyblock/tabhud/widget/CookieWidget.java | 20 +++-- .../skyblock/tabhud/widget/DungeonDeathWidget.java | 38 ++++----- .../tabhud/widget/DungeonDownedWidget.java | 26 +++--- .../tabhud/widget/DungeonPlayerWidget.java | 47 +++++------ .../tabhud/widget/DungeonPuzzleWidget.java | 20 +++-- .../tabhud/widget/DungeonSecretWidget.java | 16 +--- .../tabhud/widget/DungeonServerWidget.java | 45 +++++------ .../skyblock/tabhud/widget/EffectWidget.java | 23 +++++- .../skyblock/tabhud/widget/ElectionWidget.java | 69 +++++++++------- .../skyblock/tabhud/widget/EmptyWidget.java | 5 +- .../skyblock/tabhud/widget/EssenceWidget.java | 22 +++--- .../skyblock/tabhud/widget/EventWidget.java | 12 +-- .../skyblock/tabhud/widget/FireSaleWidget.java | 45 ++++++----- .../skyblock/tabhud/widget/ForgeWidget.java | 47 +++++++---- .../skyblock/tabhud/widget/GardenServerWidget.java | 44 +++++------ .../skyblock/tabhud/widget/GardenSkillsWidget.java | 47 +++++++---- .../skyblock/tabhud/widget/GuestServerWidget.java | 23 ++---- .../skyblock/tabhud/widget/IslandGuestsWidget.java | 19 ++--- .../skyblock/tabhud/widget/IslandOwnersWidget.java | 16 ++-- .../skyblock/tabhud/widget/IslandSelfWidget.java | 15 ++-- .../skyblock/tabhud/widget/IslandServerWidget.java | 29 ++----- .../tabhud/widget/JacobsContestWidget.java | 20 ++--- .../skyblock/tabhud/widget/MinionWidget.java | 24 +++--- .../skyblock/tabhud/widget/ParkServerWidget.java | 24 ++---- .../skyblock/tabhud/widget/PlayerListWidget.java | 16 +++- .../skyblock/tabhud/widget/PowderWidget.java | 14 +--- .../skyblock/tabhud/widget/ProfileWidget.java | 24 ++---- .../skyblock/tabhud/widget/QuestWidget.java | 12 +-- .../skyblock/tabhud/widget/ReputationWidget.java | 42 ++++++---- .../skyblock/tabhud/widget/ServerWidget.java | 20 +---- .../skyblock/tabhud/widget/SkillsWidget.java | 40 +++++----- .../skyblock/tabhud/widget/TrapperWidget.java | 11 +-- .../skyblock/tabhud/widget/UpgradeWidget.java | 13 ++- .../skyblock/tabhud/widget/VolcanoWidget.java | 18 +++-- .../skyblocker/skyblock/tabhud/widget/Widget.java | 38 +++++++++ .../widget/component/IcoFatTextComponent.java | 26 ++++-- .../tabhud/widget/component/IcoTextComponent.java | 19 ++++- .../widget/component/PlainTextComponent.java | 11 ++- .../tabhud/widget/component/ProgressComponent.java | 26 ++++-- 65 files changed, 780 insertions(+), 770 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerListMgr.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/StrMan.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index f804d90e..fa80bcc2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -6,6 +6,7 @@ import me.xmrvizzy.skyblocker.skyblock.BackpackPreview; import me.xmrvizzy.skyblocker.skyblock.StatusBarTracker; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonBlaze; import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHud; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.utils.Scheduler; import me.xmrvizzy.skyblocker.utils.Utils; @@ -23,6 +24,7 @@ public class SkyblockerMod { scheduler.scheduleCyclic(DungeonBlaze::update, 4); scheduler.scheduleCyclic(BackpackPreview::tick, 50); scheduler.scheduleCyclic(DwarvenHud::update, 40); + scheduler.scheduleCyclic(PlayerListMgr::updateList, 20); } public static SkyblockerMod getInstance() { diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java index a2ab848a..53494940 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java @@ -1,7 +1,5 @@ package me.xmrvizzy.skyblocker.mixin; -import java.util.List; - import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -17,7 +15,6 @@ import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.hud.PlayerListHud; import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.scoreboard.Scoreboard; import net.minecraft.scoreboard.ScoreboardObjective; @@ -46,29 +43,17 @@ public class PlayerListHudMixin { return; } - List list = nwH.getListedPlayerListEntries().stream() - .sorted(PlayerListHudAccessor.getOrdering()).toList(); - - // list hasn't loaded completely, abort until widgets handle errors correctly - if (list.size() < 40) { - return; - } - int w = scaledW; int h = MinecraftClient.getInstance().getWindow().getScaledHeight(); - try { - - Screen screen = Screen.getCorrect(w, h, list, footer); - if (screen != null) { - screen.render(ms); - info.cancel(); - } + long then = System.nanoTime(); + Screen screen = Screen.getCorrect(w, h, footer); + screen.render(ms); + info.cancel(); } catch (Exception e) { e.printStackTrace(); - client.player.sendMessage(Text.of("The tab HUD has encountered unexpected text, see log! :(")); } } -} +} \ 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 index efc64a70..5c302eb3 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/EmptyScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/EmptyScreen.java @@ -1,17 +1,14 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; -import java.util.List; - import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.EmptyWidget; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.Text; public class EmptyScreen extends Screen { - public EmptyScreen(int w, int h, List ple, Text footer) { + public EmptyScreen(int w, int h, Text footer) { super(w, h); - EmptyWidget ew = new EmptyWidget(ple); + 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 index cc16da8b..ae71d7bd 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java @@ -1,7 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens; import java.util.ArrayList; -import java.util.List; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud; @@ -24,7 +23,6 @@ import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList.HomePlayerScree 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.network.PlayerListEntry; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; @@ -39,57 +37,48 @@ public class Screen { this.h = (int) (h / scale); } - public static Screen getCorrect(int w, int h, List ple, Text footer) { + public static Screen getCorrect(int w, int h, Text footer) { if (TabHud.genericTgl.isPressed()) { - return Screen.correctGenericScrn(w, h, ple, footer); - // } else if (TabHud.mapTgl.isPressed()) { - // return Screen.correctMapScrn(w, h, ple, footer); + return Screen.correctGenericScrn(w, h, footer); } else if (TabHud.playerTgl.isPressed()) { - return Screen.correctPlayerScrn(w, h, ple, footer); + return Screen.correctPlayerScrn(w, h, footer); } else { - return Screen.correctMainScrn(w, h, ple, footer); + return Screen.correctMainScrn(w, h, footer); } } - // private static Screen correctMapScrn(int w, int h, List - // list, Text footer) { - // // return switch (getScreenType(list)) { - // // case CRYSTAL_HOLLOWS -> null; - // // case DUNGEON -> null; - // // default -> new EmptyScreen(w, h, list, footer); - // // }; - // return new EmptyScreen(w, h, list, footer); - // } - - private static Screen correctGenericScrn(int w, int h, List list, Text footer) { + private static Screen correctGenericScrn(int w, int h, Text footer) { return switch (PlayerLocator.getPlayerLocation()) { - case GARDEN -> new GardenInfoScreen(w, h, list, footer); // ok - default -> new GenericInfoScreen(w, h, list, footer); // ok + case GARDEN -> new GardenInfoScreen(w, h, footer); // ok + case UNKNOWN -> new EmptyScreen(w, h, footer); // ok + default -> new GenericInfoScreen(w, h, footer); // ok }; } - private static Screen correctPlayerScrn(int w, int h, List list, Text footer) { + private static Screen correctPlayerScrn(int w, int h, Text footer) { return switch (PlayerLocator.getPlayerLocation()) { - case GUEST_ISLAND -> new GuestPlayerScreen(w, h, list, footer); // ok - case HOME_ISLAND -> new HomePlayerScreen(w, h, list, footer); // ok - case DUNGEON -> new DungeonPlayerScreen(w, h, list, footer); - default -> new PlayerListScreen(w, h, list, footer); // ok + 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, List list, Text footer) { + private static Screen correctMainScrn(int w, int h, Text footer) { return switch (PlayerLocator.getPlayerLocation()) { - case PARK -> new ParkServerScreen(w, h, list, footer); // ok - case HUB -> new HubServerScreen(w, h, list, footer); // ok - case HOME_ISLAND -> new HomeServerScreen(w, h, list, footer); // ok - case GUEST_ISLAND -> new GuestServerScreen(w, h, list, footer); // ok - case CRYSTAL_HOLLOWS, DWARVEN_MINES -> new MineServerScreen(w, h, list, footer); - case FARMING_ISLAND -> new FarmingServerScreen(w, h, list, footer); // ok - case DUNGEON_HUB -> new DungeonHubScreen(w, h, list, footer); // ok - case DUNGEON -> new DungeonScreen(w, h, list, footer); // ok - case CRIMSON_ISLE -> new CrimsonIsleScreen(w, h, list, footer); // ??? - case GARDEN -> new GardenScreen(w, h, list, footer); - default -> new GenericServerScreen(w, h, list, footer); // ok + case PARK -> new ParkServerScreen(w, h, footer); // ok + case HUB -> new HubServerScreen(w, h, footer); // ok when fire sale incoming, TODO active fs, no fs + 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 4 comms, 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 UNKNOWN -> new EmptyScreen(w, h, footer); // ok + default -> new GenericServerScreen(w, h, footer); // ok }; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GardenInfoScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GardenInfoScreen.java index f24fb82a..0bb12c8e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GardenInfoScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GardenInfoScreen.java @@ -1,6 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.genericInfo; -import java.util.List; + import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.CookieWidget; @@ -10,24 +10,24 @@ 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.client.network.PlayerListEntry; + import net.minecraft.text.Text; public class GardenInfoScreen extends Screen { - public GardenInfoScreen(int w, int h, List ple, Text footer) { + public GardenInfoScreen(int w, int h, Text footer) { super(w, h); String f = footer.getString(); - GardenSkillsWidget gsw = new GardenSkillsWidget(ple); - EventWidget evw = new EventWidget(ple, true); + GardenSkillsWidget gsw = new GardenSkillsWidget(); + EventWidget evw = new EventWidget(true); UpgradeWidget uw = new UpgradeWidget(f); - ProfileWidget pw = new ProfileWidget(ple); + ProfileWidget pw = new ProfileWidget(); EffectWidget efw = new EffectWidget(f); - JacobsContestWidget jcw = new JacobsContestWidget(ple); + JacobsContestWidget jcw = new JacobsContestWidget(); CookieWidget cw = new CookieWidget(f); // layout code incoming diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericInfoScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericInfoScreen.java index 764397ae..a3e75ab6 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericInfoScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/genericInfo/GenericInfoScreen.java @@ -1,6 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.genericInfo; -import java.util.List; + import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.CookieWidget; @@ -11,24 +11,24 @@ 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.client.network.PlayerListEntry; + import net.minecraft.text.Text; public class GenericInfoScreen extends Screen { - public GenericInfoScreen(int w, int h, List ple, Text footer) { + public GenericInfoScreen(int w, int h, Text footer) { super(w, h); String f = footer.getString(); - SkillsWidget sw = new SkillsWidget(ple); - EventWidget evw = new EventWidget(ple, false); + SkillsWidget sw = new SkillsWidget(); + EventWidget evw = new EventWidget(false); UpgradeWidget uw = new UpgradeWidget(f); - ProfileWidget pw = new ProfileWidget(ple); + ProfileWidget pw = new ProfileWidget(); EffectWidget efw = new EffectWidget(f); - ElectionWidget elw = new ElectionWidget(ple); + ElectionWidget elw = new ElectionWidget(); CookieWidget cw = new CookieWidget(f); this.stackWidgetsH(sw, evw, uw); 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 index 046abcbb..6e6f563b 100644 --- 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 @@ -1,24 +1,24 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main; -import java.util.List; + 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.client.network.PlayerListEntry; + import net.minecraft.text.Text; public class CrimsonIsleScreen extends Screen { - public CrimsonIsleScreen(int w, int h, List ple, Text footer) { + public CrimsonIsleScreen(int w, int h, Text footer) { super(w, h); - ServerWidget sw = new ServerWidget(ple); - ReputationWidget rw = new ReputationWidget(ple); - QuestWidget qw = new QuestWidget(ple); - VolcanoWidget vw = new VolcanoWidget(ple); + ServerWidget sw = new ServerWidget(); + ReputationWidget rw = new ReputationWidget(); + QuestWidget qw = new QuestWidget(); + VolcanoWidget vw = new VolcanoWidget(); this.stackWidgetsH(sw, rw); this.stackWidgetsH(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 index 4f721dfc..5db461af 100644 --- 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 @@ -1,21 +1,19 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main; -import java.util.List; 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.client.network.PlayerListEntry; import net.minecraft.text.Text; public class DungeonHubScreen extends Screen{ - public DungeonHubScreen(int w, int h, List list, Text footer) { + public DungeonHubScreen(int w, int h, Text footer) { super(w, h); - ServerWidget sw = new ServerWidget(list); - EssenceWidget ew = new EssenceWidget(list); + ServerWidget sw = new ServerWidget(); + EssenceWidget ew = new EssenceWidget(); this.centerW(sw); this.centerW(ew); 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 index 35383f1b..98ce476e 100644 --- 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 @@ -1,6 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main; -import java.util.List; + import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.DungeonDeathWidget; @@ -9,18 +9,18 @@ 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.client.network.PlayerListEntry; + import net.minecraft.text.Text; public class DungeonScreen extends Screen { - public DungeonScreen(int w, int h, List ple, Text footer) { + public DungeonScreen(int w, int h, Text footer) { super(w, h); - DungeonDownedWidget ddow = new DungeonDownedWidget(ple); - DungeonDeathWidget ddew = new DungeonDeathWidget(ple); - DungeonSecretWidget dscw = new DungeonSecretWidget(ple); - DungeonServerWidget dsrw = new DungeonServerWidget(ple); - DungeonPuzzleWidget dpuw = new DungeonPuzzleWidget(ple); + DungeonDownedWidget ddow = new DungeonDownedWidget(); + DungeonDeathWidget ddew = new DungeonDeathWidget(); + DungeonSecretWidget dscw = new DungeonSecretWidget(); + DungeonServerWidget dsrw = new DungeonServerWidget(); + DungeonPuzzleWidget dpuw = new DungeonPuzzleWidget(); this.offCenterL(ddow); this.offCenterL(ddew); 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 index 206af26c..02c81f23 100644 --- 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 @@ -1,21 +1,21 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main; -import java.util.List; + 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.client.network.PlayerListEntry; + import net.minecraft.text.Text; public class FarmingServerScreen extends Screen{ - public FarmingServerScreen(int w, int h, List list, Text footer) { + public FarmingServerScreen(int w, int h, Text footer) { super(w, h); - ServerWidget sw = new ServerWidget(list); - TrapperWidget tw = new TrapperWidget(list); + ServerWidget sw = new ServerWidget(); + TrapperWidget tw = new TrapperWidget(); this.centerW(sw); this.centerW(tw); 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 index 3debf905..ae5b642f 100644 --- 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 @@ -1,20 +1,18 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main; -import java.util.List; import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ComposterWidget; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.GardenServerWidget; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.Text; public class GardenScreen extends Screen{ - public GardenScreen(int w, int h, List ple, Text footer) { + public GardenScreen(int w, int h, Text footer) { super(w, h); - GardenServerWidget gsw = new GardenServerWidget(ple); - ComposterWidget cw = new ComposterWidget(ple); + GardenServerWidget gsw = new GardenServerWidget(); + ComposterWidget cw = new ComposterWidget(); this.stackWidgetsH(gsw, cw); this.centerW(gsw); 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 index 8afdcac5..a89563db 100644 --- 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 @@ -1,19 +1,18 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main; -import java.util.List; + import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ServerWidget; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.Text; public class GenericServerScreen extends Screen { - public GenericServerScreen(int w, int h, List ple, Text footer) { + public GenericServerScreen(int w, int h, Text footer) { super(w, h); - ServerWidget sw = new ServerWidget(ple); + 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 index b6388be9..57d7a199 100644 --- 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 @@ -1,19 +1,19 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main; -import java.util.List; + import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.GuestServerWidget; -import net.minecraft.client.network.PlayerListEntry; + import net.minecraft.text.Text; public class GuestServerScreen extends Screen{ - public GuestServerScreen(int w, int h, List list, Text footer) { + public GuestServerScreen(int w, int h, Text footer) { super(w, h); - GuestServerWidget gsw = new GuestServerWidget(list); + 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 index 9ce8ee0e..e61ba4b0 100644 --- 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 @@ -1,21 +1,21 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main; -import java.util.List; + 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.client.network.PlayerListEntry; + import net.minecraft.text.Text; public class HomeServerScreen extends Screen { - public HomeServerScreen(int w, int h, List list, Text footer) { + public HomeServerScreen(int w, int h, Text footer) { super(w, h); - IslandServerWidget isw = new IslandServerWidget(list); - MinionWidget mw = new MinionWidget(list); + IslandServerWidget isw = new IslandServerWidget(); + MinionWidget mw = new MinionWidget(); this.centerH(isw); this.centerH(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 index 3ba8fc47..e2857f7e 100644 --- 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 @@ -1,21 +1,21 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main; -import java.util.List; + 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.client.network.PlayerListEntry; + import net.minecraft.text.Text; public class HubServerScreen extends Screen { - public HubServerScreen(int w, int h, List ple, Text footer) { + public HubServerScreen(int w, int h, Text footer) { super(w, h); - ServerWidget sw = new ServerWidget(ple); - FireSaleWidget fsw = new FireSaleWidget(ple); + ServerWidget sw = new ServerWidget(); + FireSaleWidget fsw = new FireSaleWidget(); this.centerW(sw); this.centerW(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 index f0dd6e0a..22eb0ffa 100644 --- 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 @@ -1,6 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main; -import java.util.List; + import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.CommsWidget; @@ -8,18 +8,18 @@ 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.client.network.PlayerListEntry; + import net.minecraft.text.Text; public class MineServerScreen extends Screen{ - public MineServerScreen(int w, int h, List list, Text footer) { + public MineServerScreen(int w, int h, Text footer) { super(w, h); - ServerWidget sw = new ServerWidget(list); - PowderWidget pw = new PowderWidget(list); - CommsWidget cw = new CommsWidget(list); - ForgeWidget fw = new ForgeWidget(list); + ServerWidget sw = new ServerWidget(); + PowderWidget pw = new PowderWidget(); + CommsWidget cw = new CommsWidget(); + ForgeWidget fw = new ForgeWidget(); this.stackWidgetsH(sw, pw, cw); this.centerH(fw); 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 index c1d09f6c..aa65d946 100644 --- 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 @@ -1,19 +1,16 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.main; -import java.util.List; - import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.ParkServerWidget; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.Text; public class ParkServerScreen extends Screen{ - public ParkServerScreen(int w, int h, List ple, Text footer) { + public ParkServerScreen(int w, int h, Text footer) { super(w, h); - ParkServerWidget sw = new ParkServerWidget(ple); + ParkServerWidget sw = new ParkServerWidget(); this.center(sw); this.addWidget(sw); 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 index aba19c56..64d0db99 100644 --- 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 @@ -1,23 +1,23 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList; -import java.util.List; + import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.DungeonPlayerWidget; -import net.minecraft.client.network.PlayerListEntry; + import net.minecraft.text.Text; public class DungeonPlayerScreen extends Screen { - public DungeonPlayerScreen(int w, int h, List ple, Text footer) { + public DungeonPlayerScreen(int w, int h, Text footer) { super(w, h); - DungeonPlayerWidget dpw1 = new DungeonPlayerWidget(ple, 1); - DungeonPlayerWidget dpw2 = new DungeonPlayerWidget(ple, 2); - DungeonPlayerWidget dpw3 = new DungeonPlayerWidget(ple, 3); - DungeonPlayerWidget dpw4 = new DungeonPlayerWidget(ple, 4); - DungeonPlayerWidget dpw5 = new DungeonPlayerWidget(ple, 5); + 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); 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 index f8210443..5a9733cc 100644 --- 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 @@ -1,21 +1,21 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList; -import java.util.List; + 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.client.network.PlayerListEntry; + import net.minecraft.text.Text; public class GuestPlayerScreen extends Screen{ - public GuestPlayerScreen(int w, int h, List list, Text footer) { + public GuestPlayerScreen(int w, int h, Text footer) { super(w, h); - IslandGuestsWidget igw = new IslandGuestsWidget(list); - IslandOwnersWidget iow = new IslandOwnersWidget(list); + IslandGuestsWidget igw = new IslandGuestsWidget(); + IslandOwnersWidget iow = new IslandOwnersWidget(); this.centerH(iow); this.centerH(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 index d89f6d6a..2a159ecc 100644 --- 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 @@ -1,21 +1,21 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList; -import java.util.List; + 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.client.network.PlayerListEntry; + import net.minecraft.text.Text; public class HomePlayerScreen extends Screen { - public HomePlayerScreen(int w, int h, List list, Text footer) { + public HomePlayerScreen(int w, int h, Text footer) { super(w, h); - IslandSelfWidget isw = new IslandSelfWidget(list); - IslandGuestsWidget igw = new IslandGuestsWidget(list); + IslandSelfWidget isw = new IslandSelfWidget(); + IslandGuestsWidget igw = new IslandGuestsWidget(); this.centerH(isw); this.centerH(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 index eca2e4aa..5db01512 100644 --- 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 @@ -1,19 +1,17 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList; -import java.util.List; import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.Screen; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.PlayerListWidget; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.Text; public class PlayerListScreen extends Screen { - public PlayerListScreen(int w, int h, List ple, Text footer) { + public PlayerListScreen(int w, int h, Text footer) { super(w, h); - PlayerListWidget plw = new PlayerListWidget(ple); + 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 new file mode 100644 index 00000000..6243415d --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/PlayerListMgr.java @@ -0,0 +1,92 @@ +package me.xmrvizzy.skyblocker.skyblock.tabhud.util; + +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import me.xmrvizzy.skyblocker.mixin.PlayerListHudAccessor; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.Text; + +public class PlayerListMgr { + + public static final Logger LOGGER = LoggerFactory.getLogger("Skyblocker Regex"); + + private static List playerList; + + public static void updateList() { + + if (!Utils.isOnSkyblock) { + return; + } + + ClientPlayNetworkHandler cpnwh = MinecraftClient.getInstance().getNetworkHandler(); + + // check is needed, else crash on server leave + if (cpnwh != null) { + + playerList = cpnwh.getPlayerList() + .stream() + .sorted(PlayerListHudAccessor.getOrdering()) + .toList(); + } + } + + // apply pattern to entry at index of player list. + // return null if there's nothing to match against in the entry, + // or if the pattern doesn't fully match. + public static Matcher regexAt(int idx, Pattern p) { + + String str = PlayerListMgr.strAt(idx); + + if (str == null) { + return null; + } + + Matcher m = p.matcher(str); + if (!m.matches()) { + LOGGER.debug("no match: \"{}\" against \"{}\"", str, p); + return null; + } else { + return m; + } + } + + // return string (i.e. displayName) at index of player list. + // return null if string is null, empty or whitespace only. + public static String strAt(int idx) { + + if (playerList == null) { + return null; + } + + if (playerList.size() <= idx) { + return null; + } + + Text txt = playerList.get(idx).getDisplayName(); + if (txt == null) { + return null; + } + String str = txt.getString().trim(); + if (str.length() == 0) { + return null; + } + return str; + } + + public static PlayerListEntry getRaw(int i) { + return playerList.get(i); + } + + public static int getSize() { + return playerList.size(); + } + +} 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 cffac5c4..eb8210d9 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 @@ -1,11 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.util; -import java.util.List; - -import me.xmrvizzy.skyblocker.mixin.PlayerListHudAccessor; import me.xmrvizzy.skyblocker.utils.Utils; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.PlayerListEntry; public class PlayerLocator { @@ -26,8 +21,7 @@ public class PlayerLocator { SPIDER_DEN, JERRY, GARDEN, - UNKNOWN, - NONE + UNKNOWN } public static Location getPlayerLocation() { @@ -36,19 +30,22 @@ public class PlayerLocator { return Location.UNKNOWN; } - List ple = MinecraftClient.getInstance().getNetworkHandler().getPlayerList().stream() - .sorted(PlayerListHudAccessor.getOrdering()).toList(); + if (Utils.isInDungeons) { + return Location.DUNGEON; + } - String cat2Name = StrMan.strAt(ple, 40); + String areaDesciptor = PlayerListMgr.strAt(41); - if (cat2Name.contains("Dungeon Stats")) { - return Location.DUNGEON; + if (areaDesciptor == null || areaDesciptor.length() < 6) { + return Location.UNKNOWN; } - String areaDesciptor = StrMan.strAt(ple, 41).substring(6); - switch (areaDesciptor) { + switch (areaDesciptor.substring(6)) { case "Private Island": - if (ple.get(44).getDisplayName().getString().endsWith("Guest")) { + String islandType = PlayerListMgr.strAt(44); + if (islandType == null) { + return Location.UNKNOWN; + } else if (islandType.endsWith("Guest")) { return Location.GUEST_ISLAND; } else { return Location.HOME_ISLAND; @@ -80,7 +77,7 @@ public class PlayerLocator { case "Garden": return Location.GARDEN; default: - return Location.NONE; + return Location.UNKNOWN; } } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/StrMan.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/StrMan.java deleted file mode 100644 index 4a30cf0f..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/StrMan.java +++ /dev/null @@ -1,68 +0,0 @@ -package me.xmrvizzy.skyblocker.skyblock.tabhud.util; - -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.minecraft.client.network.PlayerListEntry; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -public class StrMan { - - private static final Logger LOGGER = LoggerFactory.getLogger(StrMan.class.getName()); - private static final Text ERROR_TXT = Text.literal("[ERROR]").formatted(Formatting.RED, Formatting.BOLD); - - public static Text stdEntry(List ple, int idx, String entryName, Formatting contentFmt) { - Text txt = ple.get(idx).getDisplayName(); - if (txt == null) { - return ERROR_TXT; - } - String src = txt.getString(); - src = src.substring(src.indexOf(':') + 1); - return StrMan.stdEntry(src, entryName, contentFmt); - } - - public static Text stdEntry(String entryContent, String entryName, Formatting contentFmt) { - return Text.literal(entryName).append(Text.literal(entryContent).formatted(contentFmt)); - } - - public static Text plainEntry(List ple, int idx) { - Text txt = ple.get(idx).getDisplayName(); - if (txt == null) { - return ERROR_TXT; - } - return Text.of(txt.getString().trim()); - } - - public static Matcher regexAt(List ple, int idx, Pattern p) { - Text txt = ple.get(idx).getDisplayName(); - if (txt == null) { - return null; - } - String str = txt.getString(); - if (str.length() == 0) { - return null; - } - - Matcher m = p.matcher(str); - if (!m.matches()) { - LOGGER.error("ERROR: Regex {} failed for input \"{}\"", p.pattern(), str); - return null; - } else { - return m; - } - } - - public static String strAt(List ple, int idx) { - Text txt = ple.get(idx).getDisplayName(); - if (txt == null) { - return null; - } - return txt.getString(); - } - -} 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 e45865e4..de90cf30 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 @@ -6,11 +6,11 @@ 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.StrMan; +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.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -27,23 +27,31 @@ public class CommsWidget extends Widget { // match a comm // group 1: comm name // group 2: comm progress (without "%" for comms that show a percentage) - private static final Pattern COMM_PATTERN = Pattern.compile(" (.*): (.*)%?"); + private static final Pattern COMM_PATTERN = Pattern.compile("(?.*): (?.*)%?"); - public CommsWidget(List list) { + public CommsWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); for (int i = 50; i <= 53; i++) { - Matcher m = StrMan.regexAt(list, i, COMM_PATTERN); + Matcher m = PlayerListMgr.regexAt(i, COMM_PATTERN); + // end of comms found? if (m == null) { + if (i == 50) { + this.addComponent(new IcoTextComponent()); + } break; } - String g2 = m.group(2); + ProgressComponent pc; - if (g2.equals("DONE")) { - pc = new ProgressComponent(Ico.BOOK, Text.of(m.group(1)), Text.of(g2), 100f, pcntToCol(100)); + + String name = m.group("name"); + String progress = m.group("progress"); + + if (progress.equals("DONE")) { + pc = new ProgressComponent(Ico.BOOK, Text.of(name), Text.of(progress), 100f, pcntToCol(100)); } else { - float pcnt = Float.parseFloat(g2.substring(0, g2.length() - 1)); - pc = new ProgressComponent(Ico.BOOK, Text.of(m.group(1)), pcnt, pcntToCol(pcnt)); + float pcnt = Float.parseFloat(progress.substring(0, progress.length() - 1)); + pc = new ProgressComponent(Ico.BOOK, Text.of(name), pcnt, pcntToCol(pcnt)); } this.addComponent(pc); } 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 2537b90a..5922fcbc 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 @@ -1,12 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; -import java.util.List; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; -import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -18,25 +14,13 @@ public class ComposterWidget extends Widget { private static final MutableText TITLE = Text.literal("Composter").formatted(Formatting.GREEN, Formatting.BOLD); - - public ComposterWidget(List list) { + public ComposterWidget() { super(TITLE, Formatting.GREEN.getColorValue()); - Text matter = StrMan.stdEntry(list, 48, "Organic Matter:", Formatting.YELLOW); - IcoTextComponent mat = new IcoTextComponent(Ico.SAPLING, matter); - this.addComponent(mat); - - Text fuel = StrMan.stdEntry(list, 49, "Fuel:", Formatting.BLUE); - IcoTextComponent f = new IcoTextComponent(Ico.FURNACE, fuel); - this.addComponent(f); - - Text timeLeft = StrMan.stdEntry(list, 50, "Time Left:", Formatting.RED); - IcoTextComponent time = new IcoTextComponent(Ico.CLOCK, timeLeft); - this.addComponent(time); - - Text compost = StrMan.stdEntry(list, 51, "Stored Compost:", Formatting.DARK_GREEN); - IcoTextComponent comp = new IcoTextComponent(Ico.COMPOSTER, compost); - this.addComponent(comp); + 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 8974efa7..42298fcd 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 @@ -1,8 +1,10 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; - import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -15,15 +17,23 @@ public class CookieWidget extends Widget { private static final MutableText TITLE = Text.literal("Cookie Info").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); + private static final Pattern COOKIE_PATTERN = Pattern.compile(".*\\nCookie Buff\\n(?.*)\\n"); + public CookieWidget(String footertext) { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); - String interesting = footertext.split("Cookie Buff")[1]; - String[] lines = interesting.split("\n"); - if (lines[1].startsWith("Not")) { + Matcher m = COOKIE_PATTERN.matcher(footertext); + if (!m.find() || m.group("buff") == null) { + this.addComponent(new IcoTextComponent()); + this.pack(); + return; + } + + String buff = m.group("buff"); + if (buff.startsWith("Not")) { this.addComponent(new IcoTextComponent(Ico.COOKIE, Text.of("Not active"))); } else { - Text cookie = Text.literal("Time Left: ").append(lines[1]); + 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/DungeonDeathWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/DungeonDeathWidget.java index 928d9f76..3e5d8d6a 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 @@ -1,14 +1,12 @@ 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.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -23,28 +21,24 @@ public class DungeonDeathWidget extends Widget { // match the deaths entry // group 1: amount of deaths - private static final Pattern DEATH_PATTERN = Pattern.compile("\\S*: \\((\\d+)\\).*"); + private static final Pattern DEATH_PATTERN = Pattern.compile("\\S*: \\((?\\d+)\\).*"); - public DungeonDeathWidget(List list) { + public DungeonDeathWidget() { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); - Matcher m = StrMan.regexAt(list, 25, DEATH_PATTERN); - Formatting f = (m.group(1).equals("0")) ? Formatting.GREEN : Formatting.RED; - Text d = Text.literal("Deaths: ").append(Text.literal(m.group(1)).formatted(f)); - IcoTextComponent deaths = new IcoTextComponent(Ico.SKULL, d); - this.addComponent(deaths); - - Text dealt = StrMan.stdEntry(list, 26, "Damage Dealt:", Formatting.RED); - IcoTextComponent de = new IcoTextComponent(Ico.SWORD, dealt); - this.addComponent(de); - - Text heal = StrMan.stdEntry(list, 27, "Healing Done:", Formatting.RED); - IcoTextComponent he = new IcoTextComponent(Ico.POTION, heal); - this.addComponent(he); - - Text mile = StrMan.stdEntry(list, 28, "Milestone:", Formatting.YELLOW); - IcoTextComponent mi = new IcoTextComponent(Ico.NTAG, mile); - this.addComponent(mi); + Matcher m = PlayerListMgr.regexAt( 25, DEATH_PATTERN); + if (m == null) { + this.addComponent(new IcoTextComponent()); + } else { + Formatting f = (m.group("deathnum").equals("0")) ? Formatting.GREEN : Formatting.RED; + Text d = Text.literal("Deaths: ").append(Text.literal(m.group("deathnum")).formatted(f)); + IcoTextComponent deaths = new IcoTextComponent(Ico.SKULL, d); + this.addComponent(deaths); + } + + this.addSimpleIcoText(Ico.SWORD, "Damage Dealt:", Formatting.RED, 26); + 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 36245a4e..35926d7d 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 @@ -1,12 +1,9 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; -import java.util.List; - import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -19,23 +16,20 @@ public class DungeonDownedWidget extends Widget { private static final MutableText TITLE = Text.literal("Downed").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); - public DungeonDownedWidget(List list) { + public DungeonDownedWidget() { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); Formatting format = Formatting.RED; - if (StrMan.strAt(list, 21).endsWith("NONE")) { + String down = PlayerListMgr.strAt(21); + if (down != null && down.endsWith("NONE")) { format = Formatting.GRAY; } - Text downed = StrMan.stdEntry(list, 21, "Downed:", format); - IcoTextComponent down = new IcoTextComponent(Ico.SKULL, downed); - this.addComponent(down); - - Text time = StrMan.stdEntry(list, 22, "Time:", Formatting.GRAY); - IcoTextComponent t = new IcoTextComponent(Ico.CLOCK, time); - this.addComponent(t); + int idx = down.indexOf(": "); + Text downed = (down == null || idx== -1) ? null : Widget.simpleEntryText(down.substring(idx + 2), "Downed:", format); + IcoTextComponent d = new IcoTextComponent(Ico.SKULL, downed); + this.addComponent(d); - Text revive = StrMan.stdEntry(list, 23, "Revive:", Formatting.GRAY); - IcoTextComponent rev = new IcoTextComponent(Ico.POTION, revive); - this.addComponent(rev); + 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 7195e455..8f28a2c6 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 @@ -2,14 +2,12 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; import java.util.ArrayList; import java.util.HashMap; -import java.util.List; 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.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.item.ItemStack; import net.minecraft.text.MutableText; import net.minecraft.text.Text; @@ -28,7 +26,8 @@ public class DungeonPlayerWidget extends Widget { // group 3: level (or nothing, if pre dungeon start) // as a side effect, this regex keeps the iron man icon in the name // not sure if that should be - private static final Pattern PLAYER_PATTERN = Pattern.compile("\\[\\d*\\] (.*) \\((\\S*) ?([LXVI]*)\\)"); + private static final Pattern PLAYER_PATTERN = Pattern + .compile("\\[\\d*\\] (?.*) \\((?\\S*) ?(?[LXVI]*)\\)"); private static final HashMap ICOS = new HashMap<>(); private static final ArrayList MSGS = new ArrayList<>(); @@ -42,45 +41,49 @@ public class DungeonPlayerWidget extends Widget { MSGS.add("PRESS A TO JOIN"); MSGS.add("Invite a friend!"); MSGS.add("But nobody came."); + MSGS.add("More is better!"); } // title needs to be changeable here - public DungeonPlayerWidget(List list, int player) { + public DungeonPlayerWidget(int player) { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); int start = 1 + (player - 1) * 4; - if (list.get(start).getDisplayName().getString().length() < 2) { - this.addComponent( - new IcoTextComponent(Ico.SIGN, Text.literal(MSGS.get((int)(Math.random()*MSGS.size()))).formatted(Formatting.GRAY))); + if (PlayerListMgr.strAt(start) == null) { + int idx = player - 2; + 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); + if (m == null) { + this.addComponent(new IcoTextComponent()); + this.addComponent(new IcoTextComponent()); } else { - Matcher m = StrMan.regexAt(list, start, PLAYER_PATTERN); - Text name = Text.literal("Name: ").append(Text.literal(m.group(1)).formatted(Formatting.YELLOW)); + Text name = Text.literal("Name: ").append(Text.literal(m.group("name")).formatted(Formatting.YELLOW)); this.addComponent(new IcoTextComponent(Ico.PLAYER, name)); - String cl = m.group(2); + String cl = m.group("class"); Formatting clf = Formatting.GRAY; ItemStack cli = Ico.BARRIER; if (!cl.equals("EMPTY")) { cli = ICOS.get(cl); clf = Formatting.LIGHT_PURPLE; - cl += " " + m.group(3); + cl += " " + m.group("level"); } - Text class_ = Text.literal("Class: ").append(Text.literal(cl).formatted(clf)); - IcoTextComponent itclass = new IcoTextComponent(cli, class_); + Text clazz = Text.literal("Class: ").append(Text.literal(cl).formatted(clf)); + IcoTextComponent itclass = new IcoTextComponent(cli, clazz); this.addComponent(itclass); + } - Text ult = StrMan.stdEntry(list, start + 1, "Ult Cooldown:", Formatting.GOLD); - IcoTextComponent ul = new IcoTextComponent(Ico.CLOCK, ult); - this.addComponent(ul); - - Text revive = StrMan.stdEntry(list, start + 2, "Revives:", Formatting.DARK_PURPLE); - IcoTextComponent re = new IcoTextComponent(Ico.POTION, revive); - this.addComponent(re); + 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 86d1f938..b689228d 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 @@ -1,14 +1,12 @@ 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.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -25,20 +23,22 @@ public class DungeonPuzzleWidget extends Widget { // group 2: status // " ?.*" to diescard the solver's name if present // the teleport maze has a trailing whitespace that messes with the regex - private static final Pattern PUZZLE_PATTERN = Pattern.compile(" (.*): \\[(.*)\\] ?.*"); + private static final Pattern PUZZLE_PATTERN = Pattern.compile("(?.*): \\[(?.*)\\] ?.*"); - public DungeonPuzzleWidget(List list) { + public DungeonPuzzleWidget() { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); int pos = 48; while (pos < 60) { - Matcher m = StrMan.regexAt(list, pos, PUZZLE_PATTERN); + Matcher m = PlayerListMgr.regexAt(pos, PUZZLE_PATTERN); if (m == null) { break; } - Text t = Text.literal(m.group(1) + ": ").append(Text.literal("[").formatted(Formatting.GRAY)) - .append(m.group(2)).append(Text.literal("]").formatted(Formatting.GRAY)); + Text t = Text.literal(m.group("name") + ": ") + .append(Text.literal("[").formatted(Formatting.GRAY)) + .append(m.group("status")) + .append(Text.literal("]").formatted(Formatting.GRAY)); IcoTextComponent itc = new IcoTextComponent(Ico.SIGN, t); this.addComponent(itc); pos++; @@ -46,6 +46,10 @@ public class DungeonPuzzleWidget extends Widget { // not sure which one is which // still need to find out codepoint for the puzzle failed char } + if (pos == 48) { + 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 e0c83a35..2c760dad 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 @@ -1,12 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; -import java.util.List; - import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; -import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -18,16 +13,11 @@ public class DungeonSecretWidget extends Widget { private static final MutableText TITLE = Text.literal("Discoveries").formatted(Formatting.DARK_PURPLE, Formatting.BOLD); - public DungeonSecretWidget(List list) { + public DungeonSecretWidget() { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); - Text secrets = StrMan.stdEntry(list, 31, "Secrets:", Formatting.YELLOW); - IcoTextComponent sec = new IcoTextComponent(Ico.CHEST, secrets); - this.addComponent(sec); - - Text crypts = StrMan.stdEntry(list, 32, "Crypts:", Formatting.YELLOW); - IcoTextComponent cry = new IcoTextComponent(Ico.SKULL, crypts); - this.addComponent(cry); + 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 89d3b1ca..8801df68 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 @@ -1,15 +1,12 @@ 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.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; -import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.ProgressComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -24,31 +21,25 @@ public class DungeonServerWidget extends Widget { // match the secrets text // group 1: % of secrets found (without "%") - private static final Pattern SECRET_PATTERN = Pattern.compile(" Secrets Found: (.*)%"); + private static final Pattern SECRET_PATTERN = Pattern.compile("Secrets Found: (?.*)%"); - public DungeonServerWidget(List list) { + public DungeonServerWidget() { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); - Text name = StrMan.stdEntry(list, 41, "Name:", Formatting.AQUA); - IcoTextComponent na = new IcoTextComponent(Ico.NTAG, name); - this.addComponent(na); - - Text open = StrMan.stdEntry(list, 42, "Rooms Visited:", Formatting.DARK_PURPLE); - IcoTextComponent op = new IcoTextComponent(Ico.SIGN, open); - this.addComponent(op); - - Text compl = StrMan.stdEntry(list, 43, "Rooms Completed:", Formatting.LIGHT_PURPLE); - IcoTextComponent co = new IcoTextComponent(Ico.SIGN, compl); - this.addComponent(co); - - Matcher m = StrMan.regexAt(list, 44, SECRET_PATTERN); - Text secrets = Text.of("Secrets found:"); - ProgressComponent scp = new ProgressComponent(Ico.CHEST, secrets, Float.parseFloat(m.group(1)), - Formatting.DARK_PURPLE.getColorValue()); - this.addComponent(scp); - - Text time = StrMan.stdEntry(list, 45, "Time:", Formatting.GOLD); - IcoTextComponent ti = new IcoTextComponent(Ico.CLOCK, time); - this.addComponent(ti); + + 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); + + Matcher m = PlayerListMgr.regexAt(44, SECRET_PATTERN); + if (m == null) { + this.addComponent(new ProgressComponent()); + } else { + ProgressComponent scp = new ProgressComponent(Ico.CHEST, Text.of("Secrets found:"), Float.parseFloat(m.group("secnum")), + Formatting.DARK_PURPLE.getColorValue()); + this.addComponent(scp); + } + + 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 d44d1ea7..b24f7535 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 @@ -20,8 +20,19 @@ public class EffectWidget extends Widget { public EffectWidget(String footertext) { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); - String interesting = footertext.split("Active Effects")[1]; - String[] lines = interesting.split("\n"); + if (footertext == null ||!footertext.contains("Active Effects")) { + this.addComponent(new IcoTextComponent()); + this.pack(); + return; + + } + + String[] lines = footertext.split("Active Effects")[1].split("\n"); + if (lines.length < 2) { + this.addComponent(new IcoTextComponent()); + this.pack(); + return; + } if (lines[1].startsWith("No")) { Text txt = Text.literal("No effects active").formatted(Formatting.GRAY); @@ -34,7 +45,13 @@ public class EffectWidget extends Widget { this.addComponent(iftc); } else { String number = lines[1].substring("You have ".length()); - number = number.substring(0, number.indexOf(' ')); + int idx = number.indexOf(' '); + if (idx == -1 ||lines.length < 4) { + this.addComponent(new IcoFatTextComponent()); + this.pack(); + return; + } + number = number.substring(0, idx); Text active = Text.literal("Active Effects: ").append(Text.literal(number).formatted(Formatting.YELLOW)); IcoFatTextComponent iftc = new IcoFatTextComponent(Ico.POTION, active, 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 1c845467..1a26026e 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 @@ -1,16 +1,14 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; import java.util.HashMap; -import java.util.List; 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.StrMan; +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.ProgressComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.item.ItemStack; import net.minecraft.text.MutableText; import net.minecraft.text.Text; @@ -31,7 +29,7 @@ public class ElectionWidget extends Widget { // pattern matching a candidate while people are voting // group 1: name // group 2: % of votes - private static final Pattern VOTE_PATTERN = Pattern.compile(" (\\S*): \\|+ \\((\\d*)%\\)"); + private static final Pattern VOTE_PATTERN = Pattern.compile("(?\\S*): \\|+ \\((?\\d*)%\\)"); static { MAYOR_DATA.put("Aatrox", Ico.DIASWORD); @@ -49,44 +47,55 @@ public class ElectionWidget extends Widget { private static final Formatting[] COLS = { Formatting.GOLD, Formatting.RED, Formatting.LIGHT_PURPLE }; - public ElectionWidget(List list) { + public ElectionWidget() { super(TITLE, Formatting.YELLOW.getColorValue()); - if (StrMan.strAt(list, 76).contains("Over!")) { + 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; + } + + if (status.contains("Over!")) { // election is over IcoTextComponent over = new IcoTextComponent(Ico.BARRIER, EL_OVER); this.addComponent(over); - String winnername = StrMan.strAt(list, 77).split(": ")[1]; - Text winnertext = Text.literal("Winner: ") - .append(Text.literal(winnername).formatted(Formatting.GREEN)); - IcoTextComponent winner = new IcoTextComponent(MAYOR_DATA.get(winnername), winnertext); - this.addComponent(winner); - - Text participants = StrMan.stdEntry(list, 78, "Participants:", Formatting.AQUA); - IcoTextComponent part = new IcoTextComponent(Ico.PLAYER, participants); - this.addComponent(part); + String win = PlayerListMgr.strAt(77); + if (win == null || !win.contains(": ")) { + this.addComponent(new IcoTextComponent()); + } else { + String winnername = win.split(": ")[1]; + Text winnertext = Widget.simpleEntryText(winnername, "Winner: ", Formatting.GREEN); + IcoTextComponent winner = new IcoTextComponent(MAYOR_DATA.get(winnername), winnertext); + this.addComponent(winner); + } - Text year = StrMan.stdEntry(list, 79, "Year:", Formatting.LIGHT_PURPLE); - IcoTextComponent y = new IcoTextComponent(Ico.SIGN, year); - this.addComponent(y); + this.addSimpleIcoText(Ico.PLAYER, "Participants:", Formatting.AQUA, 78); + this.addSimpleIcoText(Ico.SIGN, "Year:", Formatting.LIGHT_PURPLE, 79); } else { // election is going on - Text time = StrMan.stdEntry(list, 76, "End in:", Formatting.GOLD); - IcoTextComponent t = new IcoTextComponent(Ico.CLOCK, time); - this.addComponent(t); + this.addSimpleIcoText(Ico.CLOCK, "End in:", Formatting.GOLD, 76); for (int i = 77; i <= 79; i++) { - Matcher m = StrMan.regexAt(list, i, VOTE_PATTERN); - String g1 = m.group(1); - String g2 = m.group(2); - float pcnt = Float.parseFloat(g2); - Text candidate = Text.literal(g1).formatted(COLS[i - 77]); - ProgressComponent pc = new ProgressComponent(MAYOR_DATA.get(g1), candidate, pcnt, - COLS[i - 77].getColorValue()); - this.addComponent(pc); - + Matcher m = PlayerListMgr.regexAt(i, VOTE_PATTERN); + if (m == null) { + this.addComponent(new ProgressComponent()); + } else { + + String mayorname = m.group("mayor"); + String pcntstr = m.group("pcnt"); + float pcnt = Float.parseFloat(pcntstr); + Text candidate = Text.literal(mayorname).formatted(COLS[i - 77]); + ProgressComponent pc = new ProgressComponent(MAYOR_DATA.get(mayorname), candidate, pcnt, + COLS[i - 77].getColorValue()); + this.addComponent(pc); + } } } this.pack(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EmptyWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EmptyWidget.java index 584a593e..52d6cfbd 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EmptyWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/EmptyWidget.java @@ -1,10 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; -import java.util.List; - import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -15,7 +12,7 @@ public class EmptyWidget extends Widget { private static final MutableText TITLE = Text.literal("Empty").formatted(Formatting.RED, Formatting.BOLD); - public EmptyWidget(List list) { + public EmptyWidget() { super(TITLE, Formatting.RED.getColorValue()); Text info = Text.of("No info for this area!"); 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 7063ce3f..fc0780e1 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 @@ -1,13 +1,9 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; -import java.util.List; - import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.TableComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -21,16 +17,16 @@ public class EssenceWidget extends Widget { private static final MutableText TITLE = Text.literal("Essences").formatted(Formatting.DARK_AQUA, Formatting.BOLD); - public EssenceWidget(List list) { + public EssenceWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); - wither = StrMan.stdEntry(list, 46, "Wither:", Formatting.DARK_PURPLE); - spider = StrMan.stdEntry(list, 47, "Spider:", Formatting.DARK_PURPLE); - undead = StrMan.stdEntry(list, 48, "Undead:", Formatting.DARK_PURPLE); - dragon = StrMan.stdEntry(list, 49, "Dragon:", Formatting.DARK_PURPLE); - gold = StrMan.stdEntry(list, 50, "Gold:", Formatting.DARK_PURPLE); - diamond = StrMan.stdEntry(list, 51, "Diamond:", Formatting.DARK_PURPLE); - ice = StrMan.stdEntry(list, 52, "Ice:", Formatting.DARK_PURPLE); - crimson = StrMan.stdEntry(list, 53, "Crimson:", Formatting.DARK_PURPLE); + wither = Widget.simpleEntryText(46, "Wither:", Formatting.DARK_PURPLE); + spider = Widget.simpleEntryText(47, "Spider:", Formatting.DARK_PURPLE); + undead = Widget.simpleEntryText(48, "Undead:", Formatting.DARK_PURPLE); + dragon = Widget.simpleEntryText(49, "Dragon:", Formatting.DARK_PURPLE); + gold = Widget.simpleEntryText(50, "Gold:", Formatting.DARK_PURPLE); + diamond = Widget.simpleEntryText(51, "Diamond:", Formatting.DARK_PURPLE); + ice = Widget.simpleEntryText(52, "Ice:", Formatting.DARK_PURPLE); + crimson = Widget.simpleEntryText(53, "Crimson:", Formatting.DARK_PURPLE); TableComponent tc = new TableComponent(2, 4, Formatting.DARK_AQUA.getColorValue()); 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 eb741566..f9483bde 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 @@ -1,12 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; -import java.util.List; - import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -16,19 +12,17 @@ import net.minecraft.util.Formatting; public class EventWidget extends Widget { private static final MutableText TITLE = Text.literal("Event Info").formatted(Formatting.YELLOW, Formatting.BOLD); - public EventWidget(List list, boolean isInGarden) { + public EventWidget(boolean isInGarden) { super(TITLE, Formatting.YELLOW.getColorValue()); // 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; - Text eventName = StrMan.stdEntry(list, 73 + offset, "Name:", Formatting.YELLOW); - IcoTextComponent event = new IcoTextComponent(Ico.NTAG, eventName); - this.addComponent(event); + this.addSimpleIcoText(Ico.NTAG, "Name:", Formatting.YELLOW, 73 + offset); // this could look better - Text time = StrMan.plainEntry(list, 74 + offset); + 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 9b7b2678..ddf51f32 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 @@ -1,16 +1,13 @@ 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.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; -import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.ProgressComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.math.MathHelper; @@ -26,38 +23,40 @@ public class FireSaleWidget extends Widget { // matches a fire sale item // group 1: item name - // group 2: # items bought + // group 2: # items available // group 3: # items available in total (1 digit + "k") - private static final Pattern FIRE_PATTERN = Pattern.compile(" (.*): (\\d*)/([0-9.]*)k"); + private static final Pattern FIRE_PATTERN = Pattern.compile("(?.*): (?\\d*)/(?[0-9.]*)k"); - public FireSaleWidget(List list) { + public FireSaleWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); - boolean found = false; - if (StrMan.strAt(list, 46).contains("Starts In")) { - IcoTextComponent start = new IcoTextComponent(Ico.CLOCK, - StrMan.stdEntry(list, 46, "Starts in", Formatting.DARK_AQUA)); - this.addComponent(start); + 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; } for (int i = 46;; i++) { - Matcher m = StrMan.regexAt(list, i, FIRE_PATTERN); - if (m == null || !m.matches()) { + Matcher m = PlayerListMgr.regexAt( i, FIRE_PATTERN); + if (m == null) { break; } - found = true; - float amt = Float.parseFloat(m.group(3)) * 1000; - Text a = Text.literal(m.group(1)); - Text b = Text.literal(String.format("%s/%.0f", m.group(2), amt)); - float pcnt = (Float.parseFloat(m.group(2)) / (amt)) * 100f; - ProgressComponent pc = new ProgressComponent(Ico.GOLD, a, b, pcnt, pcntToCol(pcnt)); + String avail = m.group("avail"); + Text itemTxt = Text.literal(m.group("item")); + float total = Float.parseFloat(m.group("total")) * 1000; + Text prgressTxt = Text.literal(String.format("%s/%.0f", avail, total)); + float pcnt = (Float.parseFloat(avail) / (total)) * 100f; + ProgressComponent pc = new ProgressComponent(Ico.GOLD, itemTxt, prgressTxt, pcnt, pcntToCol(pcnt)); this.addComponent(pc); } - if (!found) { - this.addComponent(new PlainTextComponent(Text.literal("No Fire Sale!").formatted(Formatting.GRAY))); - } 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 40e2f56d..4de4a0b4 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 @@ -1,14 +1,11 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; -import java.util.List; - import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +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.IcoFatTextComponent; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -21,27 +18,39 @@ public class ForgeWidget extends Widget { private static final MutableText TITLE = Text.literal("Forge Status").formatted(Formatting.DARK_AQUA, Formatting.BOLD); - public ForgeWidget(List list) { + public ForgeWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); - int forgestart = 54; + int forgestart = 54; // why is it forges and not fabrics >:( - if (!StrMan.strAt(list, 53).startsWith("Forge")) { - forgestart += 2; + String pos = PlayerListMgr.strAt(53); + if (pos == null) { + this.addComponent(new IcoTextComponent()); + this.pack(); + return; } + if (!pos.startsWith("Forges")) { + forgestart += 2; + } - for (int i = forgestart, slot = 0; i < forgestart + 5 && i < 60; i++,slot ++) { - String fstr = StrMan.strAt(list, i).substring(4); + for (int i = forgestart, slot = 1; i < forgestart + 5 && i < 60; i++, slot++) { + String fstr = PlayerListMgr.strAt(i); + if (fstr == null || fstr.length() < 3) { + if (i == forgestart) { + this.addComponent(new IcoTextComponent()); + } + break; + } Component c; Text l1, l2; - switch (fstr) { + switch (fstr.substring(3)) { case "LOCKED": l1 = Text.literal("Locked").formatted(Formatting.RED); l2 = switch (slot) { - case 3 -> Text.literal("Req. HotM 3").formatted(Formatting.GRAY); - case 4 -> Text.literal("Req. HotM 4").formatted(Formatting.GRAY); - case 5 -> Text.literal("Req. PotM 2").formatted(Formatting.GRAY); + case 3 -> Text.literal("Needs HotM 3").formatted(Formatting.GRAY); + case 4 -> Text.literal("Needs HotM 4").formatted(Formatting.GRAY); + case 5 -> Text.literal("Needs PotM 2").formatted(Formatting.GRAY); default -> Text.literal("This message should not appear").formatted(Formatting.RED, Formatting.BOLD); }; @@ -53,9 +62,13 @@ public class ForgeWidget extends Widget { break; default: String[] parts = fstr.split(": "); - l1 = Text.of(parts[0]); - l2 = Text.literal(parts[1]).formatted(Formatting.YELLOW); - c = new IcoFatTextComponent(Ico.FIRE, l1, l2); + if (parts.length != 2) { + c = new IcoFatTextComponent(); + } else { + l1 = Text.of(parts[0]); + l2 = Text.literal(parts[1]).formatted(Formatting.YELLOW); + c = new IcoFatTextComponent(Ico.FIRE, l1, l2); + } break; } this.addComponent(c); 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 864dee8e..b0fc160f 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 @@ -1,14 +1,12 @@ 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.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -22,39 +20,33 @@ public class GardenServerWidget extends Widget { // match the next visitor in the garden // group 1: visitor name - private static final Pattern VISITOR_PATTERN = Pattern.compile(" Next Visitor: (.*)$"); + private static final Pattern VISITOR_PATTERN = Pattern.compile("Next Visitor: (?.*)"); - public GardenServerWidget(List list) { + public GardenServerWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); - Text areaName = StrMan.stdEntry(list, 41, "Area:", Formatting.DARK_AQUA); - IcoTextComponent area = new IcoTextComponent(Ico.MAP, areaName); - this.addComponent(area); + 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.COPPER, "Copper:", Formatting.GOLD, 44); - Text serverName = StrMan.stdEntry(list, 42, "Server ID:", Formatting.GRAY); - IcoTextComponent server = new IcoTextComponent(Ico.NTAG, serverName); - this.addComponent(server); - - Text amtGems = StrMan.stdEntry(list, 43, "Gems:", Formatting.GREEN); - IcoTextComponent gems = new IcoTextComponent(Ico.EMERALD, amtGems); - this.addComponent(gems); - - Text copper = StrMan.stdEntry(list, 44, "Copper:", Formatting.GOLD); - IcoTextComponent co = new IcoTextComponent(Ico.COPPER, copper); - this.addComponent(co); + Matcher m = PlayerListMgr.regexAt(45, VISITOR_PATTERN); + if (m == null ) { + this.addComponent(new IcoTextComponent()); + this.pack(); + return; + } - Matcher v = StrMan.regexAt(list, 45, VISITOR_PATTERN); - String vString = v.group(1); + String vis = m.group("vis"); Formatting col; - if (vString.equals("Not Unlocked!")) { + if (vis.equals("Not Unlocked!")) { col = Formatting.RED; } else { col = Formatting.GREEN; } - MutableText visitor = Text.literal("Next Visitor: ") - .append(Text.literal(vString).formatted(col)); - IcoTextComponent vis = new IcoTextComponent(Ico.PLAYER, visitor); - this.addComponent(vis); + 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 26c90df7..26e29ce2 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 @@ -1,16 +1,14 @@ 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.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +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.ProgressComponent; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.TableComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -25,24 +23,33 @@ public class GardenSkillsWidget extends Widget { // match the skill entry // group 1: skill name and level // group 2: progress to next level (without "%") - private static final Pattern SKILL_PATTERN = Pattern.compile("\\S*: ([A-Za-z]* [0-9]*): (\\S*)%"); + private static final Pattern SKILL_PATTERN = Pattern + .compile("\\S*: (?[A-Za-z]* [0-9]*): (?\\S*)%"); // same, but with leading space - private static final Pattern MS_PATTERN = Pattern.compile(" \\S*: ([A-Za-z]* [0-9]*): (\\S*)%"); + private static final Pattern MS_PATTERN = Pattern.compile("\\S*: (?[A-Za-z]* [0-9]*): (?\\S*)%"); - public GardenSkillsWidget(List list) { + public GardenSkillsWidget() { super(TITLE, Formatting.YELLOW.getColorValue()); - Matcher m = StrMan.regexAt(list, 66, SKILL_PATTERN); + ProgressComponent pc; + Matcher m = PlayerListMgr.regexAt(66, SKILL_PATTERN); + if (m == null) { + pc = new ProgressComponent(); + } else { - float pcnt = Float.parseFloat(m.group(2)); - String skill = m.group(1); + String strpcnt = m.group("progress"); + String skill = m.group("skill"); + + float pcnt = Float.parseFloat(strpcnt); + pc = new ProgressComponent(Ico.LANTERN, Text.of(skill), pcnt, + Formatting.GOLD.getColorValue()); + } - ProgressComponent pc = new ProgressComponent(Ico.LANTERN, Text.of(skill), pcnt, Formatting.GOLD.getColorValue()); this.addComponent(pc); - Text speed = StrMan.stdEntry(list, 67, "SPD", Formatting.WHITE); + Text speed = Widget.simpleEntryText(67, "SPD", Formatting.WHITE); IcoTextComponent spd = new IcoTextComponent(Ico.SUGAR, speed); - Text farmfort = StrMan.stdEntry(list, 68, "FFO", Formatting.GOLD); + Text farmfort = Widget.simpleEntryText(68, "FFO", Formatting.GOLD); IcoTextComponent ffo = new IcoTextComponent(Ico.HOE, farmfort); TableComponent tc = new TableComponent(2, 1, Formatting.YELLOW.getColorValue()); @@ -50,11 +57,19 @@ public class GardenSkillsWidget extends Widget { tc.addToCell(1, 0, ffo); this.addComponent(tc); - m = StrMan.regexAt(list, 69, MS_PATTERN); - pcnt = Float.parseFloat(m.group(2)); - skill = m.group(1); + ProgressComponent pc2; + m = PlayerListMgr.regexAt(69, MS_PATTERN); + if (m == null) { + pc2 = new ProgressComponent(); + } else { + String strpcnt = m.group("progress"); + String skill = m.group("skill"); + + float pcnt = Float.parseFloat(strpcnt); + pc2 = new ProgressComponent(Ico.MILESTONE, Text.of(skill), pcnt, + Formatting.GREEN.getColorValue()); - ProgressComponent pc2 = new ProgressComponent(Ico.MILESTONE, Text.of(skill), pcnt, Formatting.GREEN.getColorValue()); + } this.addComponent(pc2); this.pack(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/GuestServerWidget.java index 67b61667..cb208e92 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 @@ -1,12 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; -import java.util.List; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; -import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -18,23 +14,14 @@ public class GuestServerWidget extends Widget { private static final MutableText TITLE = Text.literal("Island Info").formatted(Formatting.DARK_AQUA, Formatting.BOLD); - public GuestServerWidget(List list) { + public GuestServerWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); - Text areaName = StrMan.stdEntry(list, 41, "Area:", Formatting.DARK_AQUA); - IcoTextComponent area = new IcoTextComponent(Ico.MAP, areaName); - this.addComponent(area); - Text serverName = StrMan.stdEntry(list, 42, "Server ID:", Formatting.GRAY); - IcoTextComponent server = new IcoTextComponent(Ico.NTAG, serverName); - this.addComponent(server); + 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); - Text owner = StrMan.stdEntry(list, 43, "Owner:", Formatting.GREEN); - IcoTextComponent own = new IcoTextComponent(Ico.SIGN, owner); - this.addComponent(own); - - Text status = StrMan.stdEntry(list, 44, "Status:", Formatting.BLUE); - IcoTextComponent stat = new IcoTextComponent(Ico.SIGN, status); - this.addComponent(stat); 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 fa27eaa0..e0f5f1a3 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 @@ -1,13 +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.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -23,19 +21,22 @@ public class IslandGuestsWidget extends Widget { // group 1: player name private static final Pattern GUEST_PATTERN = Pattern.compile("\\[\\d*\\] (.*) \\[.\\]"); - public IslandGuestsWidget(List list) { + public IslandGuestsWidget() { super(TITLE, Formatting.AQUA.getColorValue()); for (int i = 21; i < 40; i++) { - String str = list.get(i).getDisplayName().getString(); - if (str.length() == 0) { + String str = PlayerListMgr.strAt(i); + if (str == null) { if (i == 21) { this.addComponent(new PlainTextComponent(Text.literal("No Visitors!").formatted(Formatting.GRAY))); } break; } - Matcher m = StrMan.regexAt(list, i, GUEST_PATTERN); - PlainTextComponent ptc = new PlainTextComponent(Text.of(m.group(1))); - this.addComponent(ptc); + Matcher m = PlayerListMgr.regexAt( i, GUEST_PATTERN); + if (m == null) { + this.addComponent(new PlainTextComponent(Text.of("???"))); + } else { + 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 083f72b7..1c640ed1 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 @@ -1,13 +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.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -23,19 +21,19 @@ public class IslandOwnersWidget extends Widget { // group 1: player name (cut off by hypixel for some reason) // group 2: last seem // TODO: test with owner online - private static final Pattern OWNER_PATTERN = Pattern.compile("(.*) \\((.*)\\)"); + private static final Pattern OWNER_PATTERN = Pattern.compile("(?.*) \\((?.*)\\)"); - public IslandOwnersWidget(List list) { + public IslandOwnersWidget() { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); for (int i = 1; i < 20; i++) { - if (list.get(i).getDisplayName().getString().length() == 0) { + Matcher m = PlayerListMgr.regexAt( i, OWNER_PATTERN); + if (m == null) { break; } - Matcher m = StrMan.regexAt(list, i, OWNER_PATTERN); - Text entry = Text.literal(m.group(1)) + Text entry = Text.literal(m.group("name")) .append( - Text.literal(" (" + m.group(2) + ")") + Text.literal(" (" + m.group("lastseen") + ")") .formatted(Formatting.GRAY)); PlainTextComponent ptc = new PlainTextComponent(entry); this.addComponent(ptc); 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 aa1d951b..4324dad9 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 @@ -1,13 +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.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -20,17 +18,16 @@ public class IslandSelfWidget extends Widget { Formatting.BOLD); // matches an owner - // group 1: player name - private static final Pattern OWNER_PATTERN = Pattern.compile("\\[\\d*\\] (.*)"); + // group 1: player name, optionally offline time + private static final Pattern OWNER_PATTERN = Pattern.compile("^\\[\\d*\\] (.*)$|^(.*)$"); - public IslandSelfWidget(List list) { + public IslandSelfWidget() { super(TITLE, Formatting.DARK_PURPLE.getColorValue()); for (int i = 1; i < 20; i++) { - String str = list.get(i).getDisplayName().getString(); - if (str.length() == 0) { + Matcher m = PlayerListMgr.regexAt( i, OWNER_PATTERN); + if (m == null) { break; } - Matcher m = StrMan.regexAt(list, i, OWNER_PATTERN); PlainTextComponent ptc = new PlainTextComponent(Text.of(m.group(1))); this.addComponent(ptc); } 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 1bbe0ed7..2b02c514 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 @@ -1,12 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; -import java.util.List; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; -import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -18,28 +14,15 @@ public class IslandServerWidget extends Widget { private static final MutableText TITLE = Text.literal("Island Info").formatted(Formatting.DARK_AQUA, Formatting.BOLD); - public IslandServerWidget(List list) { + public IslandServerWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); - Text areaName = StrMan.stdEntry(list, 41, "Area:", Formatting.DARK_AQUA); - IcoTextComponent area = new IcoTextComponent(Ico.MAP, areaName); - this.addComponent(area); + 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); - Text serverName = StrMan.stdEntry(list, 42, "Server ID:", Formatting.GRAY); - IcoTextComponent server = new IcoTextComponent(Ico.NTAG, serverName); - this.addComponent(server); - - Text crystals = StrMan.stdEntry(list, 43, "Crystals:", Formatting.DARK_PURPLE); - IcoTextComponent crys = new IcoTextComponent(Ico.EMERALD, crystals); - this.addComponent(crys); - - Text stash = StrMan.stdEntry(list, 44, "Stash:", Formatting.GREEN); - IcoTextComponent st = new IcoTextComponent(Ico.CHEST, stash); - this.addComponent(st); - - Text minions = StrMan.stdEntry(list, 45, "Minions:", Formatting.BLUE); - IcoTextComponent min = new IcoTextComponent(Ico.COMMAND, minions); - this.addComponent(min); 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 03defb4c..8d49efaa 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 @@ -1,13 +1,11 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; import java.util.HashMap; -import java.util.List; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +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.TableComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.text.MutableText; @@ -37,18 +35,22 @@ public class JacobsContestWidget extends Widget { FARM_DATA.put("Mushroom", new ItemStack(Items.RED_MUSHROOM)); } - public JacobsContestWidget(List list) { + public JacobsContestWidget() { super(TITLE, Formatting.YELLOW.getColorValue()); - Text time = StrMan.stdEntry(list, 76, "Starts in:", Formatting.GOLD); - IcoTextComponent t = new IcoTextComponent(Ico.CLOCK, time); - this.addComponent(t); + this.addSimpleIcoText(Ico.CLOCK, "Starts in:", Formatting.GOLD, 76); TableComponent tc = new TableComponent(1, 3, Formatting.YELLOW .getColorValue()); for (int i = 77; i < 80; i++) { - String item = StrMan.strAt(list, i).trim(); - tc.addToCell(0, i - 77, new IcoTextComponent(FARM_DATA.get(item), Text.of(item))); + String item = PlayerListMgr.strAt(i); + IcoTextComponent itc; + if (item == null) { + itc = new IcoTextComponent(); + } else { + itc = new IcoTextComponent(FARM_DATA.get(item), Text.of(item)); + } + tc.addToCell(0, i - 77, itc); } this.addComponent(tc); 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 2ba94b48..22082202 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 @@ -1,15 +1,13 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; import java.util.HashMap; -import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +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; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.text.MutableText; @@ -90,18 +88,18 @@ public class MinionWidget extends Widget { // group 1: name // group 2: level // group 3: status - public static final Pattern MINION_PATTERN = Pattern.compile(" (.*) ([XVI]*) \\[(.*)\\]"); + public static final Pattern MINION_PATTERN = Pattern.compile("(?.*) (?[XVI]*) \\[(?.*)\\]"); - public MinionWidget(List list) { + public MinionWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); for (int i = 48; i < 59; i++) { - Matcher m = StrMan.regexAt(list, i, MINION_PATTERN); + Matcher m = PlayerListMgr.regexAt(i, MINION_PATTERN); if (m != null) { - String min = m.group(1); - String lvl = m.group(2); - String stat = m.group(3); + String min = m.group("name"); + String lvl = m.group("level"); + String stat = m.group("status"); MutableText mt = Text.literal(min + " " + lvl).append(Text.literal(": ")); @@ -111,7 +109,7 @@ public class MinionWidget extends Widget { } else if (stat.equals("SLOW")) { format = Formatting.YELLOW; } - // makes "BLOCKED" also red. in reality, it's some kind of crimson + // makes "BLOCKED" also red. in reality, it's some kind of crimson mt.append(Text.literal(stat).formatted(format)); IcoTextComponent itc = new IcoTextComponent(MIN_ICOS.get(min), mt); @@ -125,9 +123,9 @@ public class MinionWidget extends Widget { // if more minions are placed than the tab menu can display, // a "And X more..." text is shown // look for that and add it to the widget - if (list.get(59).getDisplayName() != null) { - String other = list.get(59).getDisplayName().getString(); - this.addComponent(new PlainTextComponent(Text.of(other.trim()))); + String more = PlayerListMgr.strAt(59); + 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 a94b5948..4148ed77 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 @@ -1,12 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; -import java.util.List; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; -import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -18,24 +14,14 @@ public class ParkServerWidget extends Widget { private static final MutableText TITLE = Text.literal("Server Info").formatted(Formatting.DARK_AQUA, Formatting.BOLD); - public ParkServerWidget(List list) { + public ParkServerWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); - Text areaName = StrMan.stdEntry(list, 41, "Area:", Formatting.DARK_AQUA); - IcoTextComponent area = new IcoTextComponent(Ico.MAP, areaName); - this.addComponent(area); + 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); - Text serverName = StrMan.stdEntry(list, 42, "Server ID:", Formatting.GRAY); - IcoTextComponent server = new IcoTextComponent(Ico.NTAG, serverName); - this.addComponent(server); - - Text amtGems = StrMan.stdEntry(list, 43, "Gems:", Formatting.GREEN); - IcoTextComponent gems = new IcoTextComponent(Ico.EMERALD, amtGems); - this.addComponent(gems); - - Text rain = StrMan.stdEntry(list, 44, "Rain:", Formatting.BLUE); - IcoTextComponent ra = new IcoTextComponent(Ico.WATER, rain); - this.addComponent(ra); 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 1678ca56..2cd710eb 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 @@ -3,8 +3,9 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.List; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlayerComponent; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.TableComponent; @@ -23,12 +24,19 @@ public class PlayerListWidget extends Widget { private ArrayList list = new ArrayList<>(); - public PlayerListWidget(List l) { + public PlayerListWidget() { super(TITLE, Formatting.GREEN.getColorValue()); // hard cap to 4x20 entries. // 5x20 is too wide (and not possible in theory. in reality however...) - int listlen = Math.min(l.size(), 160); + int listlen = Math.min(PlayerListMgr.getSize(), 160); + + // 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; + } // unintuitive int ceil division stolen from // https://stackoverflow.com/questions/7139382/java-rounding-up-to-an-int-using-math-ceil#21830188 @@ -38,7 +46,7 @@ public class PlayerListWidget extends Widget { Formatting.GREEN.getColorValue()); for (int i = 80; i < listlen; i++) { - list.add(l.get(i)); + list.add(PlayerListMgr.getRaw(i)); } Collections.sort(list, new Comparator() { 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 cca09d77..459e3de2 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 @@ -1,12 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; -import java.util.List; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; -import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -19,16 +15,12 @@ public class PowderWidget extends Widget { private static final MutableText TITLE = Text.literal("Powders").formatted(Formatting.DARK_AQUA, Formatting.BOLD); - public PowderWidget(List list) { + public PowderWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); - Text amtMith = StrMan.stdEntry(list, 46, "Mithril:", Formatting.AQUA); - IcoTextComponent mith = new IcoTextComponent(Ico.MITHRIL, amtMith); - this.addComponent(mith); + this.addSimpleIcoText(Ico.MITHRIL, "Mithril:", Formatting.AQUA, 46); + this.addSimpleIcoText(Ico.EMERALD, "Gemstone:", Formatting.DARK_PURPLE, 47); - Text amtGem = StrMan.stdEntry(list, 47, "Gemstone:", Formatting.DARK_PURPLE); - IcoTextComponent gem = new IcoTextComponent(Ico.EMERALD, amtGem); - this.addComponent(gem); 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 3d94fc59..ed375c6e 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 @@ -1,12 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; -import java.util.List; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; -import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -17,24 +13,14 @@ public class ProfileWidget extends Widget { private static final MutableText TITLE = Text.literal("Profile").formatted(Formatting.YELLOW, Formatting.BOLD); - public ProfileWidget(List list) { + public ProfileWidget() { super(TITLE, Formatting.YELLOW.getColorValue()); - Text profileType = StrMan.stdEntry(list, 61, "Profile:", Formatting.GREEN); - IcoTextComponent profile = new IcoTextComponent(Ico.SIGN, profileType); - this.addComponent(profile); + 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); - Text petInfo = StrMan.stdEntry(list, 62, "Pet Sitter:", Formatting.AQUA); - IcoTextComponent pet = new IcoTextComponent(Ico.BONE, petInfo); - this.addComponent(pet); - - Text bankAmt = StrMan.stdEntry(list, 63, "Balance:", Formatting.GOLD); - IcoTextComponent bank = new IcoTextComponent(Ico.EMERALD, bankAmt); - this.addComponent(bank); - - Text interest = StrMan.stdEntry(list, 64, "Interest in:", Formatting.GOLD); - IcoTextComponent inter = new IcoTextComponent(Ico.CLOCK, interest); - this.addComponent(inter); 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 5fdb1a5b..5c89964e 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 @@ -1,12 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; -import java.util.List; - import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -18,12 +14,12 @@ public class QuestWidget extends Widget { private static final MutableText TITLE = Text.literal("Faction Quests").formatted(Formatting.AQUA, Formatting.BOLD); - public QuestWidget(List list) { + public QuestWidget() { super(TITLE, Formatting.AQUA.getColorValue()); - for (int i = 51; i<56; i++) { - String q = StrMan.strAt(list, i).trim(); - IcoTextComponent itc = new IcoTextComponent(Ico.BOOK, Text.literal(q)); + for (int i = 51; i < 56; i++) { + Text q = Widget.plainEntryText(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 75bd4e92..c0379623 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 @@ -1,14 +1,12 @@ 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.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +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.ProgressComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -22,33 +20,45 @@ public class ReputationWidget extends Widget { // matches your faction alignment progress // group 1: percentage to next alignment level - private static final Pattern PROGRESS_PATTERN = Pattern.compile(" \\|+ \\(([0-9.]*)%\\)"); + private static final Pattern PROGRESS_PATTERN = Pattern.compile("\\|+ \\((?[0-9.]*)%\\)"); // matches alignment level names // group 1: left level name // group 2: right level name - private static final Pattern STATE_PATTERN = Pattern.compile("(\\S*) *(\\S*)"); + private static final Pattern STATE_PATTERN = Pattern.compile("(?\\S*) *(?\\S*)"); - public ReputationWidget(List list) { + public ReputationWidget() { super(TITLE, Formatting.AQUA.getColorValue()); - String fname = StrMan.strAt(list, 45).split(" ")[0]; - String rep = StrMan.strAt(list, 46).trim(); - Matcher prog = StrMan.regexAt(list, 47, PROGRESS_PATTERN); - Matcher state = StrMan.regexAt(list, 48, STATE_PATTERN); + String fracstr = PlayerListMgr.strAt(45); + int spaceidx; IcoTextComponent faction; - if (fname.equals("Mage")) { - faction = new IcoTextComponent(Ico.POTION, Text.literal(fname).formatted(Formatting.DARK_AQUA)); + if (fracstr == null || (spaceidx = fracstr.indexOf(' ')) == -1) { + faction = new IcoTextComponent(); } else { - faction = new IcoTextComponent(Ico.SWORD, Text.literal(fname).formatted(Formatting.RED)); + String fname = fracstr.substring(0, spaceidx); + if (fname.equals("Mage")) { + faction = new IcoTextComponent(Ico.POTION, Text.literal(fname).formatted(Formatting.DARK_AQUA)); + } else { + faction = new IcoTextComponent(Ico.SWORD, Text.literal(fname).formatted(Formatting.RED)); + } } this.addComponent(faction); - float pcnt = Float.parseFloat(prog.group(1)); + Text rep = Widget.plainEntryText(46); + Matcher prog = PlayerListMgr.regexAt(47, PROGRESS_PATTERN); + Matcher state = PlayerListMgr.regexAt(48, STATE_PATTERN); - ProgressComponent pc = new ProgressComponent(Ico.LANTERN, Text.of(state.group(1) + " -> " + state.group(2)), Text.of(rep), pcnt, Formatting.AQUA.getColorValue()); - this.addComponent(pc); + if (prog == null || state == null) { + this.addComponent(new ProgressComponent()); + } else { + float pcnt = Float.parseFloat(prog.group("prog")); + ProgressComponent pc = new ProgressComponent(Ico.LANTERN, + Text.of(state.group("from") + " -> " + state.group("to")), rep, pcnt, + Formatting.AQUA.getColorValue()); + 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 4084d4dd..2d8d1c63 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 @@ -1,12 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; -import java.util.List; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; -import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -20,20 +16,12 @@ public class ServerWidget extends Widget { private static final MutableText TITLE = Text.literal("Server Info").formatted(Formatting.DARK_AQUA, Formatting.BOLD); - public ServerWidget(List list) { + public ServerWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); - Text areaName = StrMan.stdEntry(list, 41, "Area:", Formatting.DARK_AQUA); - IcoTextComponent area = new IcoTextComponent(Ico.MAP, areaName); - this.addComponent(area); - - Text serverName = StrMan.stdEntry(list, 42, "Server ID:", Formatting.GRAY); - IcoTextComponent server = new IcoTextComponent(Ico.NTAG, serverName); - this.addComponent(server); - - Text amtGems = StrMan.stdEntry(list, 43, "Gems:", Formatting.GREEN); - IcoTextComponent gems = new IcoTextComponent(Ico.EMERALD, amtGems); - this.addComponent(gems); + 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 be412421..b426d9e6 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 @@ -1,18 +1,16 @@ 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.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +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.IcoFatTextComponent; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.ProgressComponent; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.TableComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -30,33 +28,39 @@ public class SkillsWidget extends Widget { // group 2: progress to next level (without "%") private static final Pattern SKILL_PATTERN = Pattern.compile("\\S*: ([A-Za-z]* [0-9]*): ([0-9.MAX]*)%?"); - public SkillsWidget(List list) { + public SkillsWidget() { super(TITLE, Formatting.YELLOW.getColorValue()); - Matcher m = StrMan.regexAt(list, 66, SKILL_PATTERN); - String skill = m.group(1); - String pcntStr = m.group(2); - + Matcher m = PlayerListMgr.regexAt(66, SKILL_PATTERN); Component progress; - if (!pcntStr.equals("MAX")) { - float pcnt = Float.parseFloat(pcntStr); - progress = new ProgressComponent(Ico.LANTERN, Text.of(skill), - Text.of(pcntStr), pcnt, Formatting.GOLD.getColorValue()); + if (m == null) { + progress = new ProgressComponent(); } else { - progress = new IcoFatTextComponent(Ico.LANTERN, Text.of(skill), Text.literal(pcntStr).formatted(Formatting.RED)); + + String skill = m.group(1); + String pcntStr = m.group(2); + + if (!pcntStr.equals("MAX")) { + float pcnt = Float.parseFloat(pcntStr); + progress = new ProgressComponent(Ico.LANTERN, Text.of(skill), + Text.of(pcntStr), pcnt, Formatting.GOLD.getColorValue()); + } else { + progress = new IcoFatTextComponent(Ico.LANTERN, Text.of(skill), + Text.literal(pcntStr).formatted(Formatting.RED)); + } } this.addComponent(progress); - Text speed = StrMan.stdEntry(list, 67, "SPD", Formatting.WHITE); + Text speed = Widget.simpleEntryText(67, "SPD", Formatting.WHITE); IcoTextComponent spd = new IcoTextComponent(Ico.SUGAR, speed); - Text strength = StrMan.stdEntry(list, 68, "STR", Formatting.RED); + Text strength = Widget.simpleEntryText(68, "STR", Formatting.RED); IcoTextComponent str = new IcoTextComponent(Ico.SWORD, strength); - Text critDmg = StrMan.stdEntry(list, 69, "CCH", Formatting.BLUE); + Text critDmg = Widget.simpleEntryText(69, "CCH", Formatting.BLUE); IcoTextComponent cdg = new IcoTextComponent(Ico.SWORD, critDmg); - Text critCh = StrMan.stdEntry(list, 70, "CDG", Formatting.BLUE); + Text critCh = Widget.simpleEntryText(70, "CDG", Formatting.BLUE); IcoTextComponent cch = new IcoTextComponent(Ico.SWORD, critCh); - Text aSpeed = StrMan.stdEntry(list, 71, "ASP", Formatting.YELLOW); + Text aSpeed = Widget.simpleEntryText(71, "ASP", Formatting.YELLOW); IcoTextComponent asp = new IcoTextComponent(Ico.HOE, aSpeed); TableComponent tc = new TableComponent(2, 3, Formatting.YELLOW.getColorValue()); 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 4252888e..d47849c3 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 @@ -1,12 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; -import java.util.List; - import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; -import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -17,12 +12,10 @@ public class TrapperWidget extends Widget { private static final MutableText TITLE = Text.literal("Trapper").formatted(Formatting.DARK_AQUA, Formatting.BOLD); - public TrapperWidget(List list) { + public TrapperWidget() { super(TITLE, Formatting.DARK_AQUA.getColorValue()); - Text amtPelts = StrMan.stdEntry(list, 46, "Pelts:", Formatting.AQUA); - IcoTextComponent pelts = new IcoTextComponent(Ico.LEATHER, amtPelts); - this.addComponent(pelts); + 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 0e0fe6b7..178c9c3c 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 @@ -19,16 +19,21 @@ public class UpgradeWidget extends Widget { public UpgradeWidget(String footertext) { super(TITLE, Formatting.GOLD.getColorValue()); - String[] interesting = footertext.split("Upgrades"); - if (interesting.length < 2) { - this.addComponent(new PlainTextComponent(Text.of("Currently no upgrades..."))); + + if (footertext == null || !footertext.contains("Upgrades")) { + this.addComponent(new PlainTextComponent(Text.literal("No data").formatted(Formatting.GRAY))); this.pack(); return; } + + String[] interesting = footertext.split("Upgrades"); + this.addComponent(new PlainTextComponent(Text.of("Currently no upgrades..."))); + this.pack(); + String[] lines = interesting[1].split("\n"); IcoTextComponent u1 = new IcoTextComponent(Ico.SIGN, Text.of(lines[1])); this.addComponent(u1); - if (lines.length == 5) { + if (lines.length == 5) { // ??? no idea how this works, but it does. don't touch until understood... IcoTextComponent u2 = new IcoTextComponent(Ico.SIGN, Text.of(lines[2])); this.addComponent(u2); } 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 cca4ca1b..ec6a35fb 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 @@ -1,11 +1,9 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget; import java.util.HashMap; -import java.util.List; -import me.xmrvizzy.skyblocker.skyblock.tabhud.util.StrMan; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; -import net.minecraft.client.network.PlayerListEntry; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.text.MutableText; @@ -41,13 +39,17 @@ public class VolcanoWidget extends Widget { new Pair(new ItemStack(Items.SKELETON_SKULL), Formatting.DARK_RED)); } - public VolcanoWidget(List list) { + public VolcanoWidget() { super(TITLE, Formatting.AQUA.getColorValue()); - String s = StrMan.strAt(list, 58).trim(); - Pair p = BOOM_TYPE.get(s); - IcoTextComponent itc = new IcoTextComponent(p.getLeft(), Text.literal(s).formatted(p.getRight())); - this.addComponent(itc); + String s = PlayerListMgr.strAt(58); + if (s == null) { + this.addComponent(new IcoTextComponent()); + } else { + Pair p = BOOM_TYPE.get(s); + 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 01f47933..23ec15d0 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 @@ -5,13 +5,17 @@ import java.util.ArrayList; import com.mojang.blaze3d.systems.RenderSystem; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +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 net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; import net.minecraft.text.MutableText; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; public abstract class Widget { @@ -38,6 +42,11 @@ public abstract class Widget { components.add(c); } + public final void addSimpleIcoText(ItemStack ico, String string, Formatting fmt, int idx) { + Text txt = Widget.simpleEntryText(idx, string, fmt); + this.addComponent(new IcoTextComponent(ico, txt)); + } + public final void pack() { for (Component c : components) { h += c.getHeight() + Component.PAD_L; @@ -130,4 +139,33 @@ public abstract class Widget { private void drawVLine(MatrixStack ms, int xpos, int ypos, int height) { DrawableHelper.fill(ms, xpos, ypos, xpos + 1, ypos + height, this.color); } + + public static Text simpleEntryText(int idx, String entryName, Formatting contentFmt) { + + String src = PlayerListMgr.strAt(idx); + + if (src == null) { + return null; + } + + int cidx = src.indexOf(':'); + if (cidx == -1) { + return null; + } + + src = src.substring(src.indexOf(':') + 1); + return Widget.simpleEntryText(src, entryName, contentFmt); + } + + public static Text simpleEntryText(String entryContent, String entryName, Formatting contentFmt) { + return Text.literal(entryName).append(Text.literal(entryContent).formatted(contentFmt)); + } + + public static Text plainEntryText(int idx) { + String str = PlayerListMgr.strAt(idx); + if (str == null) { + return null; + } + return Text.of(str); + } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoFatTextComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoFatTextComponent.java index 6a780159..55d9b889 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoFatTextComponent.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoFatTextComponent.java @@ -1,8 +1,10 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; // widget component that consists of an icon and two lines of text @@ -11,22 +13,32 @@ public class IcoFatTextComponent extends Component { private static final int ICO_OFFS = 1; private ItemStack ico; - private Text l1, l2; + private Text line1, line2; public IcoFatTextComponent(ItemStack ico, Text l1, Text l2) { - this.ico = ico; - this.l1 = l1; - this.l2 = l2; + this.ico = (ico == null) ? Ico.BARRIER : ico; + this.line1 = l1; + this.line2 = l2; - this.width = ICO_DIM + PAD_L + Math.max(txtRend.getWidth(l1), txtRend.getWidth(l2)); + if (l1 == null || l2 == null) { + this.ico = Ico.BARRIER; + this.line1 = Text.literal("No data").formatted(Formatting.GRAY); + this.line2 = Text.literal("No data").formatted(Formatting.GRAY); + } + + this.width = ICO_DIM + PAD_L + Math.max(txtRend.getWidth(this.line1), txtRend.getWidth(this.line2)); this.height = txtRend.fontHeight + PAD_S + txtRend.fontHeight; } + public IcoFatTextComponent() { + this(null, null, null); + } + @Override public void render(MatrixStack ms, int x, int y) { itmRend.renderGuiItemIcon(ms, ico, x, y + ICO_OFFS); - txtRend.draw(ms, l1, x + ICO_DIM + PAD_L, y, 0xffffffff); - txtRend.draw(ms, l2, x + ICO_DIM + PAD_L, y + txtRend.fontHeight + PAD_S, 0xffffffff); + txtRend.draw(ms, line1, x + ICO_DIM + PAD_L, y, 0xffffffff); + txtRend.draw(ms, line2, x + ICO_DIM + PAD_L, y + txtRend.fontHeight + PAD_S, 0xffffffff); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoTextComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoTextComponent.java index b54affbc..a14d0531 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoTextComponent.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoTextComponent.java @@ -1,8 +1,10 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; // widget component that consists of an icon and a line of text @@ -11,14 +13,23 @@ public class IcoTextComponent extends Component { private ItemStack ico; private Text text; - public IcoTextComponent(ItemStack ico, Text text) { - this.ico = ico; - this.text = text; + public IcoTextComponent(ItemStack ico, Text txt) { + this.ico = (ico == null) ? Ico.BARRIER : ico; + this.text = txt; - this.width = ICO_DIM + PAD_L + txtRend.getWidth(text); + if (txt == null) { + this.ico = Ico.BARRIER; + this.text = Text.literal("No data").formatted(Formatting.GRAY); + } + + this.width = ICO_DIM + PAD_L + txtRend.getWidth(this.text); this.height = ICO_DIM; } + public IcoTextComponent() { + this(null, null); + } + @Override public void render(MatrixStack ms, int x, int y) { itmRend.renderGuiItemIcon(ms, ico, x, y); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlainTextComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlainTextComponent.java index a2ffced9..70a72715 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlainTextComponent.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlainTextComponent.java @@ -2,6 +2,7 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; // widget component that consists of a line of text @@ -9,10 +10,14 @@ public class PlainTextComponent extends Component { private Text text; - public PlainTextComponent(Text text) { - this.text = text; + public PlainTextComponent(Text txt) { + this.text = txt; - this.width = PAD_S + txtRend.getWidth(text); // looks off without padding + if (txt == null) { + this.text = Text.literal("No data").formatted(Formatting.GRAY); + } + + this.width = PAD_S + txtRend.getWidth(this.text); // looks off without padding this.height = txtRend.fontHeight; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java index 753c9b21..f6618a98 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java @@ -1,9 +1,11 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; +import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; // widget component that consists of an icon, some text and a progress bar // progress bar either shows percentage or custom text @@ -22,15 +24,23 @@ public class ProgressComponent extends Component { private int color; private int barW; - public ProgressComponent(ItemStack ico, Text desc, Text bar, float pcnt, int color) { - this.ico = ico; - this.desc = desc; - this.bar = bar; - this.color = 0xff000000 | color; + public ProgressComponent(ItemStack ico, Text d, Text b, float pcnt, int color) { + this.ico = (ico == null) ? Ico.BARRIER : ico; + this.desc = d; + this.bar = b; + this.color = color; this.pcnt = pcnt; + if (d == null || b == null) { + this.ico = Ico.BARRIER; + this.desc = Text.literal("No data").formatted(Formatting.GRAY); + this.bar = Text.literal("---").formatted(Formatting.GRAY); + this.pcnt = 100f; + this.color = 0xff000000 | Formatting.DARK_GRAY.getColorValue(); + } + this.barW = BAR_WIDTH; - this.width = ICO_DIM + PAD_L + Math.max(this.barW, txtRend.getWidth(desc)); + this.width = ICO_DIM + PAD_L + Math.max(this.barW, txtRend.getWidth(this.desc)); this.height = txtRend.fontHeight + PAD_S + 2 + txtRend.fontHeight + 2; } @@ -38,6 +48,10 @@ public class ProgressComponent extends Component { this(ico, text, Text.of(pcnt + "%"), pcnt, color); } + public ProgressComponent() { + this(null, null, null, 100, 0); + } + @Override public void render(MatrixStack ms, int x, int y) { itmRend.renderGuiItemIcon(ms, ico, x, y + ICO_OFFS); -- cgit From 2512857cf028b7f72f951d975c745a4c50f22bf3 Mon Sep 17 00:00:00 2001 From: msg-programs Date: Sun, 21 May 2023 20:57:11 +0200 Subject: Remove debugging leftover --- src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java | 1 - 1 file changed, 1 deletion(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java index 53494940..3d915f8b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java @@ -46,7 +46,6 @@ public class PlayerListHudMixin { int w = scaledW; int h = MinecraftClient.getInstance().getWindow().getScaledHeight(); try { - long then = System.nanoTime(); Screen screen = Screen.getCorrect(w, h, footer); screen.render(ms); info.cancel(); -- cgit From 10ef8bb08547394468f231f66ba749d4c43a59e0 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Wed, 17 May 2023 23:18:48 -0400 Subject: Refactored mixins --- .../xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java | 4 ---- .../me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java | 1 + .../me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java | 1 - src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java | 12 ++++-------- 4 files changed, 5 insertions(+), 13 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java index 237f6ba9..e59a3bfb 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java @@ -6,7 +6,6 @@ import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.world.ClientWorld; -// import net.minecraft.network.encryption.PlayerPublicKey; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -14,10 +13,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ClientPlayerEntity.class) public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity { - - // public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile, PlayerPublicKey publicKey) { public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) { - // super(world, profile, publicKey); super(world, profile); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java index 29da4bd6..74cc4b1c 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java @@ -26,6 +26,7 @@ public abstract class FarmlandBlockMixin extends Block { cir.setReturnValue(Block.createCuboidShape(0.0, 0.0, 0.0, 16.0, 16.0, 16.0)); } + @SuppressWarnings("deprecation") @Override public VoxelShape getCullingShape(BlockState state, BlockView world, BlockPos pos) { return Block.createCuboidShape(0.0, 0.0, 0.0, 16.0, 15.0, 16.0); diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java index 24e27c08..66ec5c15 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java @@ -13,7 +13,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(MinecraftClient.class) public abstract class MinecraftClientMixin { - @Shadow @Nullable public ClientPlayerEntity player; diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java index 14aa8868..7d54ccb0 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java @@ -1,21 +1,18 @@ package me.xmrvizzy.skyblocker.mixin; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.Utils; - import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Screen.class) public abstract class ScreenMixin { - @Inject(at = @At("HEAD"), method = "renderTooltip(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/item/ItemStack;II)V", cancellable = true) public void skyblocker$renderTooltip(MatrixStack matrices, ItemStack itemStack, int x, int y, CallbackInfo ci) { Text stackName = itemStack.getName(); @@ -24,5 +21,4 @@ public abstract class ScreenMixin { ci.cancel(); } } - } -- cgit From 3391f91c985c9e34867b651cd3b0c34bd8950cc8 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Fri, 19 May 2023 23:19:10 -0400 Subject: Refactored Utils fields to use getters --- .../xmrvizzy/skyblocker/chat/ChatMessageListener.java | 2 +- .../xmrvizzy/skyblocker/discord/DiscordRPCManager.java | 2 +- .../skyblocker/gui/ContainerSolverManager.java | 2 +- .../skyblocker/mixin/ClientPlayerEntityMixin.java | 2 +- .../xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java | 2 +- .../me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java | 14 +++++++------- .../skyblocker/mixin/InventoryScreenMixin.java | 2 +- .../xmrvizzy/skyblocker/mixin/ItemRendererMixin.java | 2 +- .../me/xmrvizzy/skyblocker/mixin/LeverBlockMixin.java | 2 +- .../skyblocker/mixin/MinecraftClientMixin.java | 2 +- .../java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java | 2 +- .../xmrvizzy/skyblocker/skyblock/BackpackPreview.java | 2 +- .../skyblocker/skyblock/dungeon/DungeonBlaze.java | 2 +- .../xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java | 2 +- .../skyblocker/skyblock/item/PriceInfoTooltip.java | 4 ++-- .../xmrvizzy/skyblocker/skyblock/item/WikiLookup.java | 2 +- .../skyblocker/skyblock/quicknav/QuickNav.java | 2 +- src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java | 18 +++++++++++++++--- 18 files changed, 39 insertions(+), 27 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatMessageListener.java b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatMessageListener.java index 9e6b5f64..f502a356 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatMessageListener.java +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatMessageListener.java @@ -62,7 +62,7 @@ public interface ChatMessageListener { } // Register EVENT to ClientReceiveMessageEvents.ALLOW_GAME from fabric api ClientReceiveMessageEvents.ALLOW_GAME.register((message, overlay) -> { - if (!Utils.isOnSkyblock) { + if (!Utils.isOnSkyblock()) { return true; } ChatFilterResult result = EVENT.invoker().onMessage(message, message.getString()); diff --git a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java index 10b88ce8..4fa5265f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java @@ -37,7 +37,7 @@ public class DiscordRPCManager { SkyblockerConfig.get().richPresence.customMessage = "Playing Skyblock"; AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); } - if ((!Utils.isOnSkyblock || !SkyblockerConfig.get().richPresence.enableRichPresence) && DiscordIPC.isConnected()){ + if ((!Utils.isOnSkyblock() || !SkyblockerConfig.get().richPresence.enableRichPresence) && DiscordIPC.isConnected()){ DiscordIPC.stop(); LOGGER.info("Discord RPC stopped"); return; diff --git a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java index 8f3f7e2a..e4ff229d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java @@ -42,7 +42,7 @@ public class ContainerSolverManager extends DrawableHelper { public void init() { ScreenEvents.BEFORE_INIT.register((client, screen, scaledWidth, scaledHeight) -> { - if (Utils.isOnSkyblock && screen instanceof GenericContainerScreen genericContainerScreen) { + if (Utils.isOnSkyblock() && screen instanceof GenericContainerScreen genericContainerScreen) { ScreenEvents.afterRender(screen).register((screen1, matrices, mouseX, mouseY, delta) -> { matrices.push(); matrices.translate(((HandledScreenAccessor) genericContainerScreen).getX(), ((HandledScreenAccessor) genericContainerScreen).getY(), 300); diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java index e59a3bfb..76c4e8ec 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java @@ -19,6 +19,6 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity @Inject(method = "dropSelectedItem", at = @At("HEAD"), cancellable = true) public void skyblocker$dropSelectedItem(boolean dropEntireStack, CallbackInfoReturnable cir) { - if (Utils.isOnSkyblock) HotbarSlotLock.handleDropSelectedItem(this.getInventory().selectedSlot, cir); + if (Utils.isOnSkyblock()) HotbarSlotLock.handleDropSelectedItem(this.getInventory().selectedSlot, cir); } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java index 74cc4b1c..761f8a68 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java @@ -22,7 +22,7 @@ public abstract class FarmlandBlockMixin extends Block { @Inject(method = "getOutlineShape", at = @At("HEAD"), cancellable = true) public void skyblocker$onGetOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context, CallbackInfoReturnable cir) { - if (Utils.isOnSkyblock && SkyblockerConfig.get().general.hitbox.oldFarmlandHitbox) + if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.hitbox.oldFarmlandHitbox) cir.setReturnValue(Block.createCuboidShape(0.0, 0.0, 0.0, 16.0, 16.0, 16.0)); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java index c137e6c8..e17795ab 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java @@ -50,7 +50,7 @@ public abstract class InGameHudMixin extends DrawableHelper { @Inject(method = "setOverlayMessage(Lnet/minecraft/text/Text;Z)V", at = @At("HEAD"), cancellable = true) private void skyblocker$onSetOverlayMessage(Text message, boolean tinted, CallbackInfo ci) { - if (!Utils.isOnSkyblock || !SkyblockerConfig.get().general.bars.enableBars) + if (!Utils.isOnSkyblock() || !SkyblockerConfig.get().general.bars.enableBars) return; String msg = message.getString(); String res = statusBarTracker.update(msg, SkyblockerConfig.get().messages.hideMana); @@ -63,7 +63,7 @@ public abstract class InGameHudMixin extends DrawableHelper { @Inject(method = "renderHotbar", at = @At("HEAD")) public void skyblocker$renderHotbar(float f, MatrixStack matrices, CallbackInfo ci) { - if (Utils.isOnSkyblock) { + if (Utils.isOnSkyblock()) { hotbarMatrices = matrices; hotbarSlotIndex = 0; } @@ -71,7 +71,7 @@ public abstract class InGameHudMixin extends DrawableHelper { @Inject(method = "renderHotbarItem", at = @At("HEAD")) public void skyblocker$renderHotbarItem(MatrixStack matrices, int i, int j, float f, PlayerEntity player, ItemStack stack, int seed, CallbackInfo ci) { - if (Utils.isOnSkyblock) { + if (Utils.isOnSkyblock()) { if (HotbarSlotLock.isLocked(hotbarSlotIndex)) { RenderSystem.setShaderTexture(0, SLOT_LOCK); DrawableHelper.drawTexture(hotbarMatrices, i, j, 0, 0, 16, 16); @@ -82,18 +82,18 @@ public abstract class InGameHudMixin extends DrawableHelper { @Inject(method = "renderExperienceBar", at = @At("HEAD"), cancellable = true) private void skyblocker$renderExperienceBar(MatrixStack matrices, int x, CallbackInfo ci) { - if (Utils.isOnSkyblock && SkyblockerConfig.get().general.bars.enableBars) + if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars) ci.cancel(); } @Inject(method = "renderStatusBars", at = @At("HEAD"), cancellable = true) private void skyblocker$renderStatusBars(MatrixStack matrices, CallbackInfo ci) { - if (!Utils.isOnSkyblock) + if (!Utils.isOnSkyblock()) return; if (statusBars.render(matrices, scaledWidth, scaledHeight)) ci.cancel(); - if (Utils.isInDungeons && SkyblockerConfig.get().locations.dungeons.enableMap) + if (Utils.isInDungeons() && SkyblockerConfig.get().locations.dungeons.enableMap) DungeonMap.render(matrices); RenderSystem.setShaderTexture(0, GUI_ICONS_TEXTURE); @@ -101,7 +101,7 @@ public abstract class InGameHudMixin extends DrawableHelper { @Inject(method = "renderMountHealth", at = @At("HEAD"), cancellable = true) private void skyblocker$renderMountHealth(MatrixStack matrices, CallbackInfo ci) { - if (Utils.isOnSkyblock && SkyblockerConfig.get().general.bars.enableBars) + if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars) ci.cancel(); } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java index 8de390cc..64a1a4fe 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java @@ -19,7 +19,7 @@ public abstract class InventoryScreenMixin { ) ) RecipeBookWidget skyblocker$constructor() { - if (Utils.isOnSkyblock && SkyblockerConfig.get().general.itemList.enableItemList) + if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.itemList.enableItemList) return new ItemListWidget(); else return new RecipeBookWidget(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java index b9ddc156..26bafc14 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java @@ -27,7 +27,7 @@ public abstract class ItemRendererMixin { @Inject(method = "renderGuiItemOverlay(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD")) public void skyblocker$renderItemBar(MatrixStack matrices, TextRenderer renderer, ItemStack stack, int x, int y, @Nullable String countLabel, CallbackInfo ci) { - if (Utils.isOnSkyblock && SkyblockerConfig.get().locations.dwarvenMines.enableDrillFuel) { + if (Utils.isOnSkyblock() && SkyblockerConfig.get().locations.dwarvenMines.enableDrillFuel) { if (!stack.isEmpty()) { NbtCompound tag = stack.getNbt(); if (tag != null && tag.contains("ExtraAttributes")) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/LeverBlockMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/LeverBlockMixin.java index c28a7096..505de202 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/LeverBlockMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/LeverBlockMixin.java @@ -22,7 +22,7 @@ public abstract class LeverBlockMixin extends WallMountedBlock { @Inject(method = "getOutlineShape", at = @At("HEAD"), cancellable = true) public void skyblocker$onGetOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context, CallbackInfoReturnable cir) { - if (Utils.isOnSkyblock) { + if (Utils.isOnSkyblock()) { VoxelShape shape = OldLever.getShape(state.get(FACE), state.get(FACING)); if (shape != null) cir.setReturnValue(shape); diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java index 66ec5c15..0c1977fe 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java @@ -19,7 +19,7 @@ public abstract class MinecraftClientMixin { @Inject(method = "handleInputEvents", at = @At("HEAD")) public void skyblocker$handleInputEvents(CallbackInfo ci) { - if (Utils.isOnSkyblock) { + if (Utils.isOnSkyblock()) { HotbarSlotLock.handleInputEvents(player); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java index 7d54ccb0..9389b792 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java @@ -17,7 +17,7 @@ public abstract class ScreenMixin { public void skyblocker$renderTooltip(MatrixStack matrices, ItemStack itemStack, int x, int y, CallbackInfo ci) { Text stackName = itemStack.getName(); String strName = stackName.getString(); - if (Utils.isOnSkyblock && SkyblockerConfig.get().general.hideEmptyTooltips && strName.equals(" ")) { + if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.hideEmptyTooltips && strName.equals(" ")) { ci.cancel(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java index a6dfe31d..4820bc0f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java @@ -51,7 +51,7 @@ public class BackpackPreview extends DrawableHelper { public static void tick() { Utils.sbChecker(); // force update isOnSkyblock to prevent crash on disconnect - if (Utils.isOnSkyblock) { + if (Utils.isOnSkyblock()) { // save all dirty storages saveStorage(); // update save dir based on uuid and sb profile diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java index 4554372b..219f4258 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java @@ -21,7 +21,7 @@ public class DungeonBlaze { public static void update() { ClientWorld world = MinecraftClient.getInstance().world; - if (world == null || !Utils.isInDungeons) return; + if (world == null || !Utils.isInDungeons()) return; if(!renderHooked){ WorldRenderEvents.END.register(DungeonBlaze::blazeRenderer); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java index 42fcc36a..fdc39c42 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java @@ -27,7 +27,7 @@ public class Reparty extends ChatPatternListener { super("^(?:You are not currently in a party\\.|Party (?:Membe|Moderato)rs(?: \\(([0-9]+)\\)|:( .*)))$"); this.repartying = false; ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("rp").executes(context -> { - if (!Utils.isOnSkyblock || this.repartying || client.player == null) return 0; + if (!Utils.isOnSkyblock() || this.repartying || client.player == null) return 0; this.repartying = true; client.player.networkHandler.sendCommand("p list"); return 0; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java index d9263f9a..04f2b596 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java @@ -45,7 +45,7 @@ public class PriceInfoTooltip { private static final Map apiAddresses; public static void onInjectTooltip(ItemStack stack, TooltipContext context, List lines) { - if (!Utils.isOnSkyblock || client.player == null) return; + if (!Utils.isOnSkyblock() || client.player == null) return; String name = getInternalNameFromNBT(stack); if (name == null) return; @@ -295,7 +295,7 @@ public class PriceInfoTooltip { public static int minute = -1; public static void init() { skyblocker.scheduler.scheduleCyclic(() -> { - if (!Utils.isOnSkyblock && 0 < minute++) { + if (!Utils.isOnSkyblock() && 0 < minute++) { nullMsgSend = false; return; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java index 305720d0..d05e5cb8 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java @@ -42,7 +42,7 @@ public class WikiLookup { } public static void openWiki(Slot slot) { - if (Utils.isOnSkyblock) { + if (Utils.isOnSkyblock()) { id = getSkyblockId(slot); try { String wikiLink = ItemRegistry.getWikiLink(id); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java index 8ab49754..1d58435e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java @@ -19,7 +19,7 @@ public class QuickNav { public static void init() { ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> { - if (Utils.isOnSkyblock && SkyblockerConfig.get().quickNav.enableQuickNav && screen instanceof HandledScreen) { + if (Utils.isOnSkyblock() && SkyblockerConfig.get().quickNav.enableQuickNav && screen instanceof HandledScreen) { String screenTitle = screen.getTitle().getString().trim(); List buttons = QuickNav.init(screenTitle); for (QuickNavButton button : buttons) Screens.getButtons(screen).add(button); diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index 532de0dd..e1de7b6e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -15,9 +15,21 @@ import java.util.Collections; import java.util.List; public class Utils { - public static boolean isOnSkyblock = false; - public static boolean isInDungeons = false; - public static boolean isInjected = false; + private static boolean isOnSkyblock = false; + private static boolean isInDungeons = false; + private static boolean isInjected = false; + + public static boolean isOnSkyblock() { + return isOnSkyblock; + } + + public static boolean isInDungeons() { + return isInDungeons; + } + + public static boolean isInjected() { + return isInjected; + } public static void sbChecker() { MinecraftClient client = MinecraftClient.getInstance(); -- cgit From 18e0b1c1b18a6a0795894b71565f1950b513f666 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Sat, 20 May 2023 14:10:46 -0400 Subject: Add Fishing Helper --- .../skyblocker/config/SkyblockerConfig.java | 8 +++ .../mixin/ClientPlayNetworkHandlerMixin.java | 24 +++++++++ .../skyblocker/skyblock/FishingHelper.java | 61 ++++++++++++++++++++++ .../resources/assets/skyblocker/lang/en_us.json | 6 ++- src/main/resources/skyblocker.mixins.json | 1 + 5 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index e2e7b4ca..13f70137 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -142,6 +142,10 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.Gui.CollapsibleObject() public Bars bars = new Bars(); + @ConfigEntry.Category("fishing") + @ConfigEntry.Gui.CollapsibleObject() + public Fishing fishing = new Fishing(); + @ConfigEntry.Category("itemList") @ConfigEntry.Gui.CollapsibleObject() public ItemList itemList = new ItemList(); @@ -199,6 +203,10 @@ public class SkyblockerConfig implements ConfigData { } } + public static class Fishing { + public boolean enableFishingHelper = true; + } + public static class Hitbox { public boolean oldFarmlandHitbox = true; public boolean oldLeverHitbox = false; diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java new file mode 100644 index 00000000..80c98473 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java @@ -0,0 +1,24 @@ +package me.xmrvizzy.skyblocker.mixin; + +import me.xmrvizzy.skyblocker.skyblock.FishingHelper; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ClientPlayNetworkHandler.class) +public abstract class ClientPlayNetworkHandlerMixin { + @Shadow + @Final + private MinecraftClient client; + + @Inject(method = "onPlaySound", at = @At("RETURN")) + private void skyblockmod_onPlaySound(PlaySoundS2CPacket packet, CallbackInfo ci) { + FishingHelper.onSound(client, packet); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java new file mode 100644 index 00000000..790b27bf --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java @@ -0,0 +1,61 @@ +package me.xmrvizzy.skyblocker.skyblock; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import net.fabricmc.fabric.api.event.player.UseItemCallback; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.FishingRodItem; +import net.minecraft.item.ItemStack; +import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.TypedActionResult; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; + +public class FishingHelper { + private static long startTime; + private static Vec3d normalYawVector; + + public static void init() { + UseItemCallback.EVENT.register((player, world, hand) -> { + ItemStack stack = player.getStackInHand(hand); + if (stack.getItem() instanceof FishingRodItem) { + if (player.fishHook == null) { + start(player); + } else { + reset(); + } + } + return TypedActionResult.pass(stack); + }); + } + + public static void start(PlayerEntity player) { + startTime = System.currentTimeMillis(); + float yawRad = player.getYaw() * 0.017453292F; + normalYawVector = new Vec3d(-MathHelper.sin(yawRad), 0, MathHelper.cos(yawRad)); + } + + public static void reset() { + startTime = 0; + } + + public static void onSound(MinecraftClient client, PlaySoundS2CPacket packet) { + String path = packet.getSound().value().getId().getPath(); + if (SkyblockerConfig.get().general.fishing.enableFishingHelper && startTime != 0 && System.currentTimeMillis() >= startTime + 2000 && ("entity.generic.splash".equals(path) || "entity.player.splash".equals(path))) { + ClientPlayerEntity player = client.player; + if (player != null && player.fishHook != null) { + Vec3d soundToFishHook = player.fishHook.getPos().subtract(packet.getX(), 0, packet.getZ()); + if (Math.abs(normalYawVector.x * soundToFishHook.z - normalYawVector.z * soundToFishHook.x) < 0.2D && Math.abs(normalYawVector.dotProduct(soundToFishHook)) < 4D && player.getPos().squaredDistanceTo(packet.getX(), packet.getY(), packet.getZ()) > 1D) { + client.inGameHud.setTitleTicks(0, 10, 5); + client.inGameHud.setTitle(Text.translatable("skyblocker.fishing.reelNow").formatted(Formatting.GREEN)); + reset(); + } + } else { + reset(); + } + } + } +} diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 4809b8ab..80e3e05e 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -17,6 +17,8 @@ "text.autoconfig.skyblocker.option.general.bars.barpositions.manaBarPosition": "Mana Bar Position", "text.autoconfig.skyblocker.option.general.bars.barpositions.defenceBarPosition": "Defence Bar Position", "text.autoconfig.skyblocker.option.general.bars.barpositions.experienceBarPosition": "Experience Bar Position", + "text.autoconfig.skyblocker.option.general.fishing": "Fishing Helper", + "text.autoconfig.skyblocker.option.general.fishing.enableFishingHelper": "Enable Fishing Helper", "text.autoconfig.skyblocker.option.general.quicknav": "Quicknav", "text.autoconfig.skyblocker.option.general.quicknav.enableQuicknav": "Enable Quicknav", "text.autoconfig.skyblocker.option.general.backpackPreviewWithoutShift": "View backpack preview without holding Shift", @@ -197,5 +199,7 @@ "skyblocker.updaterepository.failed": "§b[§6Skyblocker§b] §cUpdating local repository failed. Remove files manually and restart game.", - "skyblocker.api.got_key": "§b[§6Skyblocker§b] §2Automatically set your API key!" + "skyblocker.api.got_key": "§b[§6Skyblocker§b] §2Automatically set your API key!", + + "skyblocker.fishing.reelNow": "Reel in now!" } diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index 2eba53e3..1744b5ba 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -5,6 +5,7 @@ "client": [ "AccessorWorldRenderer", "ClientPlayerEntityMixin", + "ClientPlayNetworkHandlerMixin", "FarmlandBlockMixin", "GenericContainerScreenHandlerMixin", "HandledScreenAccessor", -- cgit From ad9986028e5f7b1c2ec38323d3af19088d7089ac Mon Sep 17 00:00:00 2001 From: msg-programs Date: Sun, 28 May 2023 11:46:49 +0200 Subject: Use logger on PlayerListHudMixin exception instead of printStackTrace --- src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java index 3d915f8b..eee4eaca 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java @@ -1,5 +1,7 @@ package me.xmrvizzy.skyblocker.mixin; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -50,9 +52,8 @@ public class PlayerListHudMixin { screen.render(ms); info.cancel(); } catch (Exception e) { - e.printStackTrace(); + TabHud.LOGGER.error("Drawing default hud. Reason: Screen exception {}", e); } - } } \ No newline at end of file -- cgit From b28a20421348c3385022deeb3cb1ea0ea74928af Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Thu, 11 May 2023 01:54:39 -0400 Subject: 1.20 Port The game launches successfully without any crashes! --- gradle.properties | 8 +-- .../skyblocker/gui/ContainerSolverManager.java | 13 ++--- .../skyblocker/mixin/DrawContextMixin.java | 60 ++++++++++++++++++++++ .../skyblocker/mixin/HandledScreenMixin.java | 13 +++-- .../xmrvizzy/skyblocker/mixin/InGameHudMixin.java | 32 ++++++------ .../skyblocker/mixin/ItemRendererMixin.java | 60 ---------------------- .../skyblocker/mixin/PlayerListHudMixin.java | 8 +-- .../me/xmrvizzy/skyblocker/mixin/ScreenMixin.java | 24 --------- .../skyblocker/skyblock/BackpackPreview.java | 17 +++--- .../skyblocker/skyblock/FancyStatusBars.java | 37 ++++++------- .../skyblocker/skyblock/dungeon/DungeonMap.java | 8 ++- .../skyblock/dungeon/DungeonMapConfigScreen.java | 12 ++--- .../skyblocker/skyblock/dwarven/DwarvenHud.java | 32 ++++++------ .../skyblock/dwarven/DwarvenHudConfigScreen.java | 11 ++-- .../skyblock/itemlist/ItemListWidget.java | 24 ++++----- .../skyblock/itemlist/ResultButtonWidget.java | 27 ++++++---- .../skyblock/itemlist/SearchResultsWidget.java | 23 +++++---- .../skyblock/quicknav/QuickNavButton.java | 20 ++++---- .../skyblocker/skyblock/tabhud/screens/Screen.java | 5 +- .../skyblocker/skyblock/tabhud/widget/Widget.java | 37 ++++++------- .../tabhud/widget/component/Component.java | 5 +- .../widget/component/IcoFatTextComponent.java | 10 ++-- .../tabhud/widget/component/IcoTextComponent.java | 8 +-- .../widget/component/PlainTextComponent.java | 6 +-- .../tabhud/widget/component/PlayerComponent.java | 11 ++-- .../tabhud/widget/component/ProgressComponent.java | 15 +++--- .../tabhud/widget/component/TableComponent.java | 9 ++-- .../me/xmrvizzy/skyblocker/utils/ToastBuilder.java | 16 +++--- src/main/resources/fabric.mod.json | 4 +- src/main/resources/skyblocker.mixins.json | 6 +-- 30 files changed, 272 insertions(+), 289 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/gradle.properties b/gradle.properties index 64c5e5cd..7b8af977 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,19 +2,19 @@ org.gradle.jvmargs=-Xmx1G -Dfile.encoding=UTF-8 -Duser.language=en -Duser.countr # Fabric Properties (https://fabricmc.net/versions.html) ## 1.19.4 -minecraft_version=1.19.4 -yarn_mappings=1.19.4+build.2 +minecraft_version=1.20-pre1 +yarn_mappings=1.20-pre1+build.4 loader_version=0.14.19 #Fabric api ## 1.19.4 -fabric_api_version=0.81.1+1.19.4 +fabric_api_version=0.80.2+1.20 # Dependencies ## Cloth Api (https://www.curseforge.com/minecraft/mc-mods/cloth-config/files) clothconfig_version=10.0.96 ## Mod Menu (https://www.curseforge.com/minecraft/mc-mods/modmenu/files) -mod_menu_version=6.1.0-rc.4 +mod_menu_version=7.0.0-beta.2 ## REI (https://www.curseforge.com/minecraft/mc-mods/roughly-enough-items/files) rei_version=11.0.597 diff --git a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java index e4ff229d..354e7e3a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java @@ -8,7 +8,7 @@ import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.OrderTerminal; import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.StartsWithTerminal; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; @@ -24,7 +24,7 @@ import java.util.regex.Pattern; /** * Manager class for {@link ContainerSolver}s like terminal solvers and experiment solvers. To add a new gui solver, extend {@link ContainerSolver} and register it in {@link #ContainerSolverManager()}. */ -public class ContainerSolverManager extends DrawableHelper { +public class ContainerSolverManager { private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile(""); private final ContainerSolver[] solvers; private ContainerSolver currentSolver = null; @@ -43,10 +43,11 @@ public class ContainerSolverManager extends DrawableHelper { public void init() { ScreenEvents.BEFORE_INIT.register((client, screen, scaledWidth, scaledHeight) -> { if (Utils.isOnSkyblock() && screen instanceof GenericContainerScreen genericContainerScreen) { - ScreenEvents.afterRender(screen).register((screen1, matrices, mouseX, mouseY, delta) -> { + ScreenEvents.afterRender(screen).register((screen1, context, mouseX, mouseY, delta) -> { + MatrixStack matrices = context.getMatrices(); matrices.push(); matrices.translate(((HandledScreenAccessor) genericContainerScreen).getX(), ((HandledScreenAccessor) genericContainerScreen).getY(), 300); - onDraw(matrices, genericContainerScreen.getScreenHandler().slots.subList(0, genericContainerScreen.getScreenHandler().getRows() * 9)); + onDraw(context, genericContainerScreen.getScreenHandler().slots.subList(0, genericContainerScreen.getScreenHandler().getRows() * 9)); matrices.pop(); }); onSetScreen(genericContainerScreen); @@ -83,7 +84,7 @@ public class ContainerSolverManager extends DrawableHelper { highlights = null; } - public void onDraw(MatrixStack matrices, List slots) { + public void onDraw(DrawContext context, List slots) { if (currentSolver == null) return; if (highlights == null) @@ -93,7 +94,7 @@ public class ContainerSolverManager extends DrawableHelper { for (ColorHighlight highlight : highlights) { Slot slot = slots.get(highlight.slot()); int color = highlight.color(); - fillGradient(matrices, slot.x, slot.y, slot.x + 16, slot.y + 16, color, color); + context.fillGradient(slot.x, slot.y, slot.x + 16, slot.y + 16, color, color); } RenderSystem.colorMask(true, true, true, true); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java new file mode 100644 index 00000000..ccbeaca2 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java @@ -0,0 +1,60 @@ +package me.xmrvizzy.skyblocker.mixin; + +import java.awt.Color; +import java.util.regex.Pattern; + +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.mojang.blaze3d.systems.RenderSystem; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.ItemUtils; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.util.math.ColorHelper; + +@Mixin(DrawContext.class) +public abstract class DrawContextMixin { + @Inject(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD")) + public void skyblocker$renderItemBar(TextRenderer textRenderer, ItemStack stack, int x, int y, @Nullable String countOverride, CallbackInfo ci) { + + if (Utils.isOnSkyblock() && SkyblockerConfig.get().locations.dwarvenMines.enableDrillFuel) { + if (!stack.isEmpty()) { + NbtCompound tag = stack.getNbt(); + if (tag != null && tag.contains("ExtraAttributes")) { + if (tag.getCompound("ExtraAttributes").contains("drill_fuel")) { + float current = 3000.0F; + float max = 3000.0F; + + for (String line : ItemUtils.getTooltipStrings(stack)) { + if (line.contains("Fuel: ")) { + String clear = Pattern.compile("[^0-9 /]").matcher(line).replaceAll("").trim(); + String[] split = clear.split("/"); + current = Integer.parseInt(split[0]); + max = Integer.parseInt(split[1]) * 1000; + break; + } + } + + DrawContext context = ((DrawContext) (Object) this); + + RenderSystem.disableDepthTest(); + float hue = Math.max(0.0F, 1.0F - (max - current) / max); + int width = Math.round(current / max * 13.0F); + Color color = Color.getHSBColor(hue / 3.0F, 1.0F, 1.0F); + context.fill(x + 2, y + 13, x + 15, y + 15, 0xFF000000); + context.fill(x + 2, y + 13, x + 2 + width, y + 14, ColorHelper.Argb.getArgb(color.getAlpha(), color.getRed(), color.getGreen(), color.getBlue())); + RenderSystem.enableDepthTest(); + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index 2d200a86..30aa1ed2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -3,9 +3,10 @@ package me.xmrvizzy.skyblocker.mixin; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.BackpackPreview; import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; import org.jetbrains.annotations.Nullable; @@ -36,12 +37,18 @@ public abstract class HandledScreenMixin extends Screen { } @Inject(at = @At("HEAD"), method = "drawMouseoverTooltip", cancellable = true) - public void skyblocker$drawMouseOverTooltip(MatrixStack matrices, int x, int y, CallbackInfo ci) { + public void skyblocker$drawMouseOverTooltip(DrawContext context, int x, int y, CallbackInfo ci) { + //Hide Empty Tooltips + Text stackName = focusedSlot.getStack().getName(); + String strName = stackName.getString(); + if(this.focusedSlot != null && Utils.isOnSkyblock() && SkyblockerConfig.get().general.hideEmptyTooltips && strName.equals(" ")) ci.cancel(); + + //Backpack Preview String title = this.getTitle().getString(); boolean shiftDown = SkyblockerConfig.get().general.backpackPreviewWithoutShift ^ Screen.hasShiftDown(); if (shiftDown && title.equals("Storage") && this.focusedSlot != null) { if (this.focusedSlot.inventory == this.client.player.getInventory()) return; - if (BackpackPreview.renderPreview(matrices, this.focusedSlot.getIndex(), x, y)) ci.cancel(); + if (BackpackPreview.renderPreview(context, this.focusedSlot.getIndex(), x, y)) ci.cancel(); } } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java index e17795ab..335737a1 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java @@ -1,6 +1,5 @@ package me.xmrvizzy.skyblocker.mixin; -import com.mojang.blaze3d.systems.RenderSystem; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.FancyStatusBars; @@ -10,13 +9,14 @@ import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonMap; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.hud.InGameHud; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import net.minecraft.util.Identifier; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -26,7 +26,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Environment(EnvType.CLIENT) @Mixin(InGameHud.class) -public abstract class InGameHudMixin extends DrawableHelper { +public abstract class InGameHudMixin { + //@Shadow + //@Final + //private static Identifier ICONS = new Identifier("textures/gui/icons.png"); @Unique private static final Identifier SLOT_LOCK = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/slot_lock.png"); @Unique @@ -35,7 +38,7 @@ public abstract class InGameHudMixin extends DrawableHelper { @Unique private final FancyStatusBars statusBars = new FancyStatusBars(); @Unique - private MatrixStack hotbarMatrices; + private DrawContext hotbarContext; @Unique private int hotbarSlotIndex; @@ -62,45 +65,44 @@ public abstract class InGameHudMixin extends DrawableHelper { } @Inject(method = "renderHotbar", at = @At("HEAD")) - public void skyblocker$renderHotbar(float f, MatrixStack matrices, CallbackInfo ci) { + public void skyblocker$renderHotbar(float f, DrawContext context, CallbackInfo ci) { if (Utils.isOnSkyblock()) { - hotbarMatrices = matrices; + hotbarContext = context; hotbarSlotIndex = 0; } } @Inject(method = "renderHotbarItem", at = @At("HEAD")) - public void skyblocker$renderHotbarItem(MatrixStack matrices, int i, int j, float f, PlayerEntity player, ItemStack stack, int seed, CallbackInfo ci) { + public void skyblocker$renderHotbarItem(DrawContext context, int i, int j, float f, PlayerEntity player, ItemStack stack, int seed, CallbackInfo ci) { if (Utils.isOnSkyblock()) { if (HotbarSlotLock.isLocked(hotbarSlotIndex)) { - RenderSystem.setShaderTexture(0, SLOT_LOCK); - DrawableHelper.drawTexture(hotbarMatrices, i, j, 0, 0, 16, 16); + hotbarContext.drawTexture(SLOT_LOCK, i, j, 0, 0, 16, 16); } hotbarSlotIndex++; } } @Inject(method = "renderExperienceBar", at = @At("HEAD"), cancellable = true) - private void skyblocker$renderExperienceBar(MatrixStack matrices, int x, CallbackInfo ci) { + private void skyblocker$renderExperienceBar(DrawContext context, int x, CallbackInfo ci) { if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars) ci.cancel(); } @Inject(method = "renderStatusBars", at = @At("HEAD"), cancellable = true) - private void skyblocker$renderStatusBars(MatrixStack matrices, CallbackInfo ci) { + private void skyblocker$renderStatusBars(DrawContext context, CallbackInfo ci) { if (!Utils.isOnSkyblock()) return; - if (statusBars.render(matrices, scaledWidth, scaledHeight)) + if (statusBars.render(context, scaledWidth, scaledHeight)) ci.cancel(); if (Utils.isInDungeons() && SkyblockerConfig.get().locations.dungeons.enableMap) - DungeonMap.render(matrices); + DungeonMap.render(context.getMatrices()); - RenderSystem.setShaderTexture(0, GUI_ICONS_TEXTURE); + //RenderSystem.setShaderTexture(0, ICONS); } @Inject(method = "renderMountHealth", at = @At("HEAD"), cancellable = true) - private void skyblocker$renderMountHealth(MatrixStack matrices, CallbackInfo ci) { + private void skyblocker$renderMountHealth(DrawContext context, CallbackInfo ci) { if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars) ci.cancel(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java deleted file mode 100644 index 26bafc14..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java +++ /dev/null @@ -1,60 +0,0 @@ -package me.xmrvizzy.skyblocker.mixin; - -import java.awt.Color; -import java.util.regex.Pattern; - -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.mojang.blaze3d.systems.RenderSystem; - -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.utils.ItemUtils; -import me.xmrvizzy.skyblocker.utils.Utils; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.math.ColorHelper; - -@Mixin(ItemRenderer.class) -public abstract class ItemRendererMixin { - @Inject(method = "renderGuiItemOverlay(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD")) - public void skyblocker$renderItemBar(MatrixStack matrices, TextRenderer renderer, ItemStack stack, int x, int y, @Nullable String countLabel, CallbackInfo ci) { - - if (Utils.isOnSkyblock() && SkyblockerConfig.get().locations.dwarvenMines.enableDrillFuel) { - if (!stack.isEmpty()) { - NbtCompound tag = stack.getNbt(); - if (tag != null && tag.contains("ExtraAttributes")) { - if (tag.getCompound("ExtraAttributes").contains("drill_fuel")) { - float current = 3000.0F; - float max = 3000.0F; - - for (String line : ItemUtils.getTooltipStrings(stack)) { - if (line.contains("Fuel: ")) { - String clear = Pattern.compile("[^0-9 /]").matcher(line).replaceAll("").trim(); - String[] split = clear.split("/"); - current = Integer.parseInt(split[0]); - max = Integer.parseInt(split[1]) * 1000; - break; - } - } - - RenderSystem.disableDepthTest(); - float hue = Math.max(0.0F, 1.0F - (max - current) / max); - int width = Math.round(current / max * 13.0F); - Color color = Color.getHSBColor(hue / 3.0F, 1.0F, 1.0F); - DrawableHelper.fill(matrices, x + 2, y + 13, x + 15, y + 15, 0xFF000000); - DrawableHelper.fill(matrices, x + 2, y + 13, x + 2 + width, y + 14, ColorHelper.Argb.getArgb(color.getAlpha(), color.getRed(), color.getGreen(), color.getBlue())); - RenderSystem.enableDepthTest(); - } - } - } - } - } -} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java index b5403ae2..ef65190f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java @@ -13,9 +13,9 @@ import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.hud.PlayerListHud; import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.scoreboard.Scoreboard; import net.minecraft.scoreboard.ScoreboardObjective; import net.minecraft.text.Text; @@ -27,8 +27,8 @@ public class PlayerListHudMixin { @Shadow private Text footer; - @Inject(at = @At("HEAD"), method = "render(Lnet/minecraft/client/util/math/MatrixStack;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreboardObjective;)V", cancellable = true) - public void skyblocker$renderTabHud(MatrixStack ms, int scaledW, Scoreboard sb, ScoreboardObjective sbo, + @Inject(at = @At("HEAD"), method = "render(Lnet/minecraft/client/gui/DrawContext;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreboardObjective;)V", cancellable = true) + public void skyblocker$renderTabHud(DrawContext context, int scaledW, Scoreboard sb, ScoreboardObjective sbo, CallbackInfo info) { if (!Utils.isOnSkyblock() @@ -47,7 +47,7 @@ public class PlayerListHudMixin { int h = MinecraftClient.getInstance().getWindow().getScaledHeight(); try { Screen screen = Screen.getCorrect(w, h, footer); - screen.render(ms); + screen.render(context); info.cancel(); } catch (Exception e) { TabHud.LOGGER.error("Drawing default hud. Reason: Screen exception {}", e); diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java deleted file mode 100644 index 9389b792..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ScreenMixin.java +++ /dev/null @@ -1,24 +0,0 @@ -package me.xmrvizzy.skyblocker.mixin; - -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.utils.Utils; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(Screen.class) -public abstract class ScreenMixin { - @Inject(at = @At("HEAD"), method = "renderTooltip(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/item/ItemStack;II)V", cancellable = true) - public void skyblocker$renderTooltip(MatrixStack matrices, ItemStack itemStack, int x, int y, CallbackInfo ci) { - Text stackName = itemStack.getName(); - String strName = stackName.getString(); - if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.hideEmptyTooltips && strName.equals(" ")) { - ci.cancel(); - } - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java index 4820bc0f..e35ef605 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java @@ -7,7 +7,7 @@ import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.network.PlayerListEntry; @@ -27,7 +27,7 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class BackpackPreview extends DrawableHelper { +public class BackpackPreview { private static final Identifier TEXTURE = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/inventory_background.png"); private static final BackpackPreview instance = new BackpackPreview(); private static final Pattern PROFILE_PATTERN = Pattern.compile("Profile: ([a-zA-Z]+)"); @@ -135,7 +135,7 @@ public class BackpackPreview extends DrawableHelper { } } - public static boolean renderPreview(MatrixStack matrices, int index, int mouseX, int mouseY) { + public static boolean renderPreview(DrawContext context, int index, int mouseX, int mouseY) { if (index >= 9 && index < 18) index -= 9; else if (index >= 27 && index < 45) index -= 18; else return false; @@ -149,12 +149,13 @@ public class BackpackPreview extends DrawableHelper { RenderSystem.disableDepthTest(); RenderSystem.setShaderTexture(0, TEXTURE); - BackpackPreview.drawTexture(matrices, x, y, 0, 0, 176, 7); + context.drawTexture(TEXTURE, x, y, 0, 0, 176, 7); for (int i = 0; i < rows; ++i) - BackpackPreview.drawTexture(matrices, x, y + i * 18 + 7, 0, 7, 176, 18); - BackpackPreview.drawTexture(matrices, x, y + rows * 18 + 7, 0, 25, 176, 7); + context.drawTexture(TEXTURE, x, y + i * 18 + 7, 0, 7, 176, 18); + context.drawTexture(TEXTURE, x, y + rows * 18 + 7, 0, 25, 176, 7); RenderSystem.enableDepthTest(); + MatrixStack matrices = context.getMatrices(); ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer(); TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; for (int i = 9; i < storage[index].size(); ++i) { @@ -162,8 +163,8 @@ public class BackpackPreview extends DrawableHelper { int itemY = y + (i - 9) / 9 * 18 + 8; matrices.push(); matrices.translate(0, 0, 200); - itemRenderer.renderInGui(matrices, storage[index].getStack(i), itemX, itemY); - itemRenderer.renderGuiItemOverlay(matrices, textRenderer, storage[index].getStack(i), itemX, itemY); + context.drawItem(storage[index].getStack(i), itemX, itemY); + context.drawItemInSlot(textRenderer, storage[index].getStack(i), itemX, itemY); matrices.pop(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java index 05b57410..6af06e6d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java @@ -1,15 +1,13 @@ package me.xmrvizzy.skyblocker.skyblock; -import com.mojang.blaze3d.systems.RenderSystem; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.gui.DrawContext; import net.minecraft.util.Identifier; -public class FancyStatusBars extends DrawableHelper { +public class FancyStatusBars { private static final Identifier BARS = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/bars.png"); private final MinecraftClient client = MinecraftClient.getInstance(); @@ -39,7 +37,7 @@ public class FancyStatusBars extends DrawableHelper { return (100 * value) / max; } - public boolean render(MatrixStack matrices, int scaledWidth, int scaledHeight) { + public boolean render(DrawContext context, int scaledWidth, int scaledHeight) { var player = client.player; if (!SkyblockerConfig.get().general.bars.enableBars || player == null) return false; @@ -72,11 +70,10 @@ public class FancyStatusBars extends DrawableHelper { moveBar(i, configAnchorNum); } - RenderSystem.setShaderTexture(0, BARS); for (var bar : bars) - bar.draw(matrices); + bar.draw(context); for (var bar : bars) - bar.drawText(matrices); + bar.drawText(context); return true; } @@ -143,32 +140,32 @@ public class FancyStatusBars extends DrawableHelper { this.text = val; } - public void draw(MatrixStack matrices) { + public void draw(DrawContext context) { // Dont draw if anchorNum is outside of range if (anchorNum < 0 || anchorNum > 2) return; // Draw the icon for the bar - drawTexture(matrices, anchorsX[anchorNum] + offsetX, anchorsY[anchorNum], 0, v, 9, 9); + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX, anchorsY[anchorNum], 0, v, 9, 9); // Draw the background for the bar - drawTexture(matrices, anchorsX[anchorNum] + offsetX + 10, anchorsY[anchorNum], 10, v, 2, 9); + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10, anchorsY[anchorNum], 10, v, 2, 9); for (int i = 2; i < bar_width - 2; i += 58) - drawTexture(matrices, anchorsX[anchorNum] + offsetX + 10 + i, anchorsY[anchorNum], 12, v, Math.min(58, bar_width - 2 - i), 9); - drawTexture(matrices, anchorsX[anchorNum] + offsetX + 10 + bar_width - 2, anchorsY[anchorNum], 70, v, 2, 9); + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10 + i, anchorsY[anchorNum], 12, v, Math.min(58, bar_width - 2 - i), 9); + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10 + bar_width - 2, anchorsY[anchorNum], 70, v, 2, 9); // Draw the filled part of the bar for (int i = 0; i < fill.length; i++) { int fill_width = this.fill[i] * (bar_width - 2) / 100; if (fill_width >= 1) - drawTexture(matrices, anchorsX[anchorNum] + offsetX + 11, anchorsY[anchorNum], 72 + i*60, v, 1, 9); + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11, anchorsY[anchorNum], 72 + i*60, v, 1, 9); for (int j = 1; j < fill_width - 1; j += 58) - drawTexture(matrices, anchorsX[anchorNum] + offsetX + 11 + j, anchorsY[anchorNum], 73 + i*60, v, Math.min(58, fill_width - 1 - j), 9); + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11 + j, anchorsY[anchorNum], 73 + i*60, v, Math.min(58, fill_width - 1 - j), 9); if (fill_width == bar_width - 2) - drawTexture(matrices, anchorsX[anchorNum] + offsetX + 11 + fill_width - 1, anchorsY[anchorNum], 131 + i*60, v, 1, 9); + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11 + fill_width - 1, anchorsY[anchorNum], 131 + i*60, v, 1, 9); } } - public void drawText(MatrixStack matrices) { + public void drawText(DrawContext context) { // Dont draw if anchorNum is outside of range if (anchorNum < 0 || anchorNum > 2) return; @@ -179,10 +176,10 @@ public class FancyStatusBars extends DrawableHelper { final int[] offsets = new int[]{-1, 1}; for (int i : offsets) { - textRenderer.draw(matrices, text, (float) (x + i), (float) y, 0); - textRenderer.draw(matrices, text, (float) x, (float) (y + i), 0); + context.drawText(textRenderer, text, x + i, y, 0, false); + context.drawText(textRenderer, text, x, y + i, 0, false); } - textRenderer.draw(matrices, text, (float) x, (float) y, text_color); + context.drawText(textRenderer, text, x, y, text_color, false); } } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMap.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMap.java index e5441b5c..2a97d0ee 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMap.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMap.java @@ -2,14 +2,13 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; import org.apache.commons.lang3.StringUtils; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.brigadier.Command; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.render.MapRenderer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.util.math.MatrixStack; @@ -50,11 +49,10 @@ public class DungeonMap { } } - public static void renderHUDMap(MatrixStack matrices, int x, int y) { + public static void renderHUDMap(DrawContext context, int x, int y) { float scaling = SkyblockerConfig.get().locations.dungeons.mapScaling; int size = (int) (128 * scaling); - RenderSystem.setShaderTexture(0, MAP_BACKGROUND); - DrawableHelper.drawTexture(matrices, x, y, 0, 0, size, size, size, size); + context.drawTexture(MAP_BACKGROUND, x, y, 0, 0, size, size, size, size); } public static void init() { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java index 8fba6a7a..ffd7a8b6 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java @@ -5,8 +5,8 @@ import java.awt.Color; import me.shedaniel.autoconfig.AutoConfig; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.RenderUtils; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; public class DungeonMapConfigScreen extends Screen { @@ -19,11 +19,11 @@ public class DungeonMapConfigScreen extends Screen { } @Override - public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { - super.render(matrices, mouseX, mouseY, delta); - renderBackground(matrices); - DungeonMap.renderHUDMap(matrices, hudX, hudY); - drawCenteredTextWithShadow(matrices, textRenderer, "Right Click To Reset Position", width / 2, height / 2, Color.GRAY.getRGB()); + public void render(DrawContext context, int mouseX, int mouseY, float delta) { + super.render(context, mouseX, mouseY, delta); + renderBackground(context); + DungeonMap.renderHUDMap(context, hudX, hudY); + context.drawCenteredTextWithShadow(textRenderer, "Right Click To Reset Position", width / 2, height / 2, Color.GRAY.getRGB()); } @Override 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 15f9e58b..122f6c6c 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java @@ -6,7 +6,7 @@ import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -49,35 +49,35 @@ public class DwarvenHud { return 1; }))))); - HudRenderCallback.EVENT.register((matrixStack, tickDelta) -> { + HudRenderCallback.EVENT.register((context, tickDelta) -> { if (!SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enabled || client.options.playerListKey.isPressed() || client.player == null || commissionList.isEmpty()) { return; } - render(matrixStack, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.x, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.y, commissionList); + render(context, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.x, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.y, commissionList); }); } - public static void render(MatrixStack matrixStack, int hudX, int hudY, List commissions) { + public static void render(DrawContext context, int hudX, int hudY, List commissions) { switch(SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.style) { - case SIMPLE -> renderSimple(matrixStack, hudX, hudY, commissions); - case FANCY -> renderFancy(matrixStack, hudX, hudY, commissions); - case CLASSIC -> renderClassic(matrixStack, hudX, hudY, commissions); + case SIMPLE -> renderSimple(context, hudX, hudY, commissions); + case FANCY -> renderFancy(context, hudX, hudY, commissions); + case CLASSIC -> renderClassic(context, hudX, hudY, commissions); } } - public static void renderClassic(MatrixStack matrixStack, int hudX, int hudY, List commissions) { + public static void renderClassic(DrawContext context, int hudX, int hudY, List commissions) { if (SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground) { - DrawableHelper.fill(matrixStack, hudX, hudY, hudX + 200, hudY + (20 * commissions.size()), 0x64000000); + context.fill(hudX, hudY, hudX + 200, hudY + (20 * commissions.size()), 0x64000000); } int y = 0; for (Commission commission : commissions) { - client.textRenderer - .drawWithShadow(matrixStack, + context + .drawTextWithShadow(client.textRenderer, Text.literal(commission.commission + ": ") .styled(style -> style.withColor(Formatting.AQUA)) .append(Text.literal(commission.progression) @@ -87,18 +87,18 @@ public class DwarvenHud { } } - public static void renderSimple(MatrixStack matrixStack, int hudX, int hudY, List commissions) { + public static void renderSimple(DrawContext context, int hudX, int hudY, List commissions) { CommsWidget cw = new CommsWidget(commissions, false); cw.setX(hudX); cw.setY(hudY); - cw.render(matrixStack, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground); + cw.render(context, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground); } - public static void renderFancy(MatrixStack matrixStack, int hudX, int hudY, List commissions) { + public static void renderFancy(DrawContext context, int hudX, int hudY, List commissions) { CommsWidget cw = new CommsWidget(commissions, true); cw.setX(hudX); cw.setY(hudY); - cw.render(matrixStack, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground); + cw.render(context, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground); } public static void update() { @@ -121,4 +121,4 @@ public class DwarvenHud { // steamroller tactics to get visibility from outside classes (CommsWidget) public static record Commission(String commission, String progression){} -} +} \ No newline at end of file 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 2d0ba892..f91ed921 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java @@ -3,6 +3,7 @@ package me.xmrvizzy.skyblocker.skyblock.dwarven; import me.shedaniel.autoconfig.AutoConfig; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.RenderUtils; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; @@ -19,11 +20,11 @@ public class DwarvenHudConfigScreen extends Screen { } @Override - public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { - super.render(matrices, mouseX, mouseY, delta); - renderBackground(matrices); - DwarvenHud.render(matrices, hudX, hudY, List.of(new DwarvenHud.Commission("Test Commission 1", "1%"), new DwarvenHud.Commission("Test Commission 2", "2%"))); - drawCenteredTextWithShadow(matrices, textRenderer, "Right Click To Reset Position", width / 2, height / 2, Color.GRAY.getRGB()); + 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%"))); + context.drawCenteredTextWithShadow(textRenderer, "Right Click To Reset Position", width / 2, height / 2, Color.GRAY.getRGB()); } @Override diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java index d9acc75c..99715e29 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java @@ -5,12 +5,11 @@ import me.xmrvizzy.skyblocker.mixin.RecipeBookWidgetAccessor; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.Drawable; -import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.gui.Selectable; import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.render.GameRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.screen.AbstractRecipeScreenHandler; import net.minecraft.text.Text; @@ -46,27 +45,26 @@ public class ItemListWidget extends RecipeBookWidget implements Drawable, Select } @Override - public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { + public void render(DrawContext context, int mouseX, int mouseY, float delta) { if (this.isOpen()) { - matrices.push(); + MatrixStack matrices = context.getMatrices(); + matrices.push(); matrices.translate(0.0D, 0.0D, 100.0D); - RenderSystem.setShader(GameRenderer::getPositionTexProgram); - RenderSystem.setShaderTexture(0, TEXTURE); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); this.searchField = ((RecipeBookWidgetAccessor)this).getSearchField(); int i = (this.parentWidth - 147) / 2 - this.leftOffset; int j = (this.parentHeight - 166) / 2; - DrawableHelper.drawTexture(matrices, i, j, 1, 1, 147, 166); + context.drawTexture(TEXTURE, i, j, 1, 1, 147, 166); this.searchField = ((RecipeBookWidgetAccessor)this).getSearchField(); if (!ItemRegistry.filesImported && !this.searchField.isFocused() && this.searchField.getText().isEmpty()) { Text hintText = (Text.literal("Loading...")).formatted(Formatting.ITALIC).formatted(Formatting.GRAY); - drawTextWithShadow(matrices, this.client.textRenderer, hintText, i + 25, j + 14, -1); + context.drawTextWithShadow(this.client.textRenderer, hintText, i + 25, j + 14, -1); } else if (!this.searchField.isFocused() && this.searchField.getText().isEmpty()) { Text hintText = (Text.translatable("gui.recipebook.search_hint")).formatted(Formatting.ITALIC).formatted(Formatting.GRAY); - drawTextWithShadow(matrices, this.client.textRenderer, hintText, i + 25, j + 14, -1); + context.drawTextWithShadow(this.client.textRenderer, hintText, i + 25, j + 14, -1); } else { - this.searchField.render(matrices, mouseX, mouseY, delta); + this.searchField.render(context, mouseX, mouseY, delta); } if (ItemRegistry.filesImported){ if (results == null) { @@ -75,16 +73,16 @@ public class ItemListWidget extends RecipeBookWidget implements Drawable, Select this.results = new SearchResultsWidget(this.client, x, y); } this.updateSearchResult(); - this.results.render(matrices, mouseX, mouseY, delta); + this.results.render(context, mouseX, mouseY, delta); } matrices.pop(); } } @Override - public void drawTooltip(MatrixStack matrices, int x, int y, int mouseX, int mouseY) { + public void drawTooltip(DrawContext context, int x, int y, int mouseX, int mouseY) { if (this.isOpen() && ItemRegistry.filesImported && results != null) { - this.results.drawTooltip(matrices, mouseX, mouseY); + this.results.drawTooltip(context, mouseX, mouseY); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java index 41e5469d..8b0fe91d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java @@ -1,17 +1,21 @@ package me.xmrvizzy.skyblocker.skyblock.itemlist; import java.util.List; +import java.util.function.Function; +import java.util.ArrayList; +import com.google.common.collect.Lists; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; import net.minecraft.client.gui.widget.ClickableWidget; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.text.OrderedText; import net.minecraft.text.Text; import net.minecraft.util.Identifier; @@ -36,23 +40,26 @@ public class ResultButtonWidget extends ClickableWidget { } @Override - public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) { + public void renderButton(DrawContext context, int mouseX, int mouseY, float delta) { MinecraftClient client = MinecraftClient.getInstance(); - RenderSystem.setShader(GameRenderer::getPositionTexProgram); - RenderSystem.setShaderTexture(0, BACKGROUND_TEXTURE); // this.drawTexture(matrices, this.x, this.y, 29, 206, this.width, this.height); - DrawableHelper.drawTexture(matrices, this.getX(), this.getY(), 29, 206, this.getWidth(), this.getHeight()); + context.drawTexture(BACKGROUND_TEXTURE, this.getX(), this.getY(), 29, 206, this.getWidth(), this.getHeight()); // client.getItemRenderer().renderInGui(this.itemStack, this.x + 4, this.y + 4); - client.getItemRenderer().renderInGui(matrices, this.itemStack, this.getX() + 4, this.getY() + 4); + context.drawItem(this.itemStack, this.getX() + 4, this.getY() + 4); // client.getItemRenderer().renderGuiItemOverlay(client.textRenderer, itemStack, this.x + 4, this.y + 4); - client.getItemRenderer().renderGuiItemOverlay(matrices, client.textRenderer, itemStack, this.getX() + 4, this.getY() + 4); + context.drawItemInSlot(client.textRenderer, itemStack, this.getX() + 4, this.getY() + 4); } - public void renderTooltip(MatrixStack matrices, int mouseX, int mouseY) { + public void renderTooltip(DrawContext context, int mouseX, int mouseY) { MinecraftClient client = MinecraftClient.getInstance(); - List tooltip = client.currentScreen.getTooltipFromItem(this.itemStack); + List tooltip = client.currentScreen.getTooltipFromItem(client, this.itemStack); + List orderedTooltip = new ArrayList<>(); + + for(int i = 0; i < tooltip.size(); i++) orderedTooltip.add(tooltip.get(i).asOrderedText()); + // TODO : add null check with log error - client.currentScreen.renderTooltip(matrices, tooltip, mouseX, mouseY); + client.currentScreen.setTooltip(orderedTooltip); + client.currentScreen.renderWithTooltip(context, mouseX, mouseY, mouseY); } @Override diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java index ce53112b..058495a2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java @@ -2,6 +2,8 @@ package me.xmrvizzy.skyblocker.skyblock.itemlist; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.Drawable; import net.minecraft.client.gui.widget.ToggleButtonWidget; import net.minecraft.client.util.math.MatrixStack; @@ -106,32 +108,33 @@ public class SearchResultsWidget implements Drawable { this.nextPageButton.active = this.currentPage < this.pageCount - 1; } - public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { + public void render(DrawContext context, int mouseX, int mouseY, float delta) { + TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; RenderSystem.disableDepthTest(); if (this.displayRecipes) { String craftText = this.recipeResults.get(this.currentPage).craftText; - this.client.textRenderer.drawWithShadow(matrices, craftText, this.parentX + 11, this.parentY + 31, 0xffffffff); + context.drawTextWithShadow(textRenderer, craftText, this.parentX + 11, this.parentY + 31, 0xffffffff); Text resultText = this.recipeResults.get(this.currentPage).result.getName(); - this.client.textRenderer.drawWithShadow(matrices, resultText, this.parentX + 11, this.parentY + 43, 0xffffffff); - this.client.textRenderer.drawWithShadow(matrices, "▶", this.parentX + 96, this.parentY + 90, 0xaaffffff); + context.drawTextWithShadow(textRenderer, resultText, this.parentX + 11, this.parentY + 43, 0xffffffff); + context.drawTextWithShadow(textRenderer, "▶", this.parentX + 96, this.parentY + 90, 0xaaffffff); } for (ResultButtonWidget button : resultButtons) - button.render(matrices, mouseX, mouseY, delta); + button.render(context, mouseX, mouseY, delta); if (this.pageCount > 1) { String string = (this.currentPage + 1) + "/" + this.pageCount; int dx = this.client.textRenderer.getWidth(string) / 2; - this.client.textRenderer.draw(matrices, string, this.parentX - dx + 73, this.parentY + 141, -1); + context.drawText(textRenderer, string, this.parentX - dx + 73, this.parentY + 141, -1, false); } - if (this.prevPageButton.active) this.prevPageButton.render(matrices, mouseX, mouseY, delta); - if (this.nextPageButton.active) this.nextPageButton.render(matrices, mouseX, mouseY, delta); + if (this.prevPageButton.active) this.prevPageButton.render(context, mouseX, mouseY, delta); + if (this.nextPageButton.active) this.nextPageButton.render(context, mouseX, mouseY, delta); RenderSystem.enableDepthTest(); } - public void drawTooltip(MatrixStack matrices, int mouseX, int mouseY) { + public void drawTooltip(DrawContext context, int mouseX, int mouseY) { RenderSystem.disableDepthTest(); for (ResultButtonWidget button : resultButtons) if (button.isMouseOver(mouseX, mouseY)) - button.renderTooltip(matrices, mouseX, mouseY); + button.renderTooltip(context, mouseX, mouseY); RenderSystem.enableDepthTest(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java index 7269840a..c02463a3 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java @@ -7,7 +7,7 @@ import me.xmrvizzy.skyblocker.mixin.HandledScreenAccessor; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; @@ -64,41 +64,41 @@ public class QuickNavButton extends ClickableWidget { } @Override - public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) { + public void renderButton(DrawContext context, int mouseX, int mouseY, float delta) { this.updateCoordinates(); - RenderSystem.setShaderTexture(0, BUTTON_TEXTURE); + MatrixStack matrices = context.getMatrices(); RenderSystem.disableDepthTest(); // render button background if (!this.toggled) { if (this.index >= 6) // this.drawTexture(matrices, this.x, this.y + 4, this.u, this.v + 4, this.width, this.height - 4); - DrawableHelper.drawTexture(matrices, this.getX(), this.getY() + 4, this.u, this.v + 4, this.width, this.height - 4); + context.drawTexture(BUTTON_TEXTURE, this.getX(), this.getY() + 4, this.u, this.v + 4, this.width, this.height - 4); else // this.drawTexture(matrices, this.x, this.y, this.u, this.v, this.width, this.height - 4); - DrawableHelper.drawTexture(matrices, this.getX(), this.getY() - 2, this.u, this.v, this.width, this.height - 4); + context.drawTexture(BUTTON_TEXTURE, this.getX(), this.getY() - 2, this.u, this.v, this.width, this.height - 4); // } else this.drawTexture(matrices, this.x, this.y, this.u, this.v, this.width, this.height); } else { matrices.push(); //Move the top buttons 2 pixels up if they're selected if (this.index < 6) matrices.translate(0f, -2f, 0f); - DrawableHelper.drawTexture(matrices, this.getX(), this.getY(), this.u, this.v, this.width, this.height); + context.drawTexture(BUTTON_TEXTURE, this.getX(), this.getY(), this.u, this.v, this.width, this.height); matrices.pop(); } // render button icon if (!this.toggled) { if (this.index >= 6) // CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 6); - CLIENT.getItemRenderer().renderInGui(matrices, this.icon,this.getX() + 5, this.getY() + 6); + context.drawItem(this.icon,this.getX() + 5, this.getY() + 6); else // CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 9); - CLIENT.getItemRenderer().renderInGui(matrices, this.icon,this.getX() + 5, this.getY() + 7); + context.drawItem(this.icon,this.getX() + 5, this.getY() + 7); } else { if (this.index >= 6) // CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 9); - CLIENT.getItemRenderer().renderInGui(matrices, this.icon,this.getX() + 5, this.getY() + 9); + context.drawItem(this.icon,this.getX() + 5, this.getY() + 9); else // CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 6); - CLIENT.getItemRenderer().renderInGui(matrices, this.icon,this.getX() + 5, this.getY() + 6); + context.drawItem(this.icon,this.getX() + 5, this.getY() + 6); } RenderSystem.enableDepthTest(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java index 43b7f956..2ed15f27 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screens/Screen.java @@ -23,6 +23,7 @@ import me.xmrvizzy.skyblocker.skyblock.tabhud.screens.playerList.HomePlayerScree 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; @@ -98,9 +99,9 @@ public class Screen { } } - public void render(MatrixStack ms) { + public void render(DrawContext context) { for (Widget w : widgets) { - w.render(ms); + w.render(context); } } 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 6b96c151..33f77933 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 @@ -10,7 +10,7 @@ import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.Component; import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; import net.minecraft.text.MutableText; @@ -103,14 +103,15 @@ public abstract class Widget { /** * Draw this widget with a background */ - public final void render(MatrixStack ms) { - this.render(ms, true); + public final void render(DrawContext context) { + this.render(context, true); } /** * Draw this widget, possibly with a background */ - public final void render(MatrixStack ms, boolean hasBG) { + public final void render(DrawContext context, boolean hasBG) { + MatrixStack ms = context.getMatrices(); // not sure if this is the way to go, but it fixes Z-layer issues // like blocks being rendered behind the BG and the hotbar clipping into things @@ -123,9 +124,9 @@ public abstract class Widget { // move above other UI elements ms.translate(0, 0, 200); if (hasBG) { - DrawableHelper.fill(ms, x + 1, y, x + w - 1, y + h, COL_BG_BOX); - DrawableHelper.fill(ms, x, y + 1, x + 1, y + h - 1, COL_BG_BOX); - DrawableHelper.fill(ms, 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); @@ -133,19 +134,19 @@ public abstract class Widget { int strHeightHalf = Widget.txtRend.fontHeight / 2; int strAreaWidth = Widget.txtRend.getWidth(title) + 4; - txtRend.draw(ms, title, x + 8, y + 2, this.color); + context.drawText(txtRend, title, x + 8, y + 2, this.color, false); - this.drawHLine(ms, x + 2, y + 1 + strHeightHalf, 4); - this.drawHLine(ms, x + 2 + strAreaWidth + 4, y + 1 + strHeightHalf, w - 4 - 4 - strAreaWidth); - this.drawHLine(ms, x + 2, y + h - 2, w - 4); + this.drawHLine(context, x + 2, y + 1 + strHeightHalf, 4); + this.drawHLine(context, x + 2 + strAreaWidth + 4, y + 1 + strHeightHalf, w - 4 - 4 - strAreaWidth); + this.drawHLine(context, x + 2, y + h - 2, w - 4); - this.drawVLine(ms, x + 1, y + 2 + strHeightHalf, h - 4 - strHeightHalf); - this.drawVLine(ms, x + w - 2, y + 2 + strHeightHalf, h - 4 - strHeightHalf); + this.drawVLine(context, x + 1, y + 2 + strHeightHalf, h - 4 - strHeightHalf); + this.drawVLine(context, x + w - 2, y + 2 + strHeightHalf, h - 4 - strHeightHalf); int yOffs = y + BORDER_SZE_N; for (Component c : components) { - c.render(ms, x + BORDER_SZE_W, yOffs); + c.render(context, x + BORDER_SZE_W, yOffs); yOffs += c.getHeight() + Component.PAD_L; } // pop manipulations above @@ -153,12 +154,12 @@ public abstract class Widget { RenderSystem.disableDepthTest(); } - private void drawHLine(MatrixStack ms, int xpos, int ypos, int width) { - DrawableHelper.fill(ms, xpos, ypos, xpos + width, ypos + 1, this.color); + private void drawHLine(DrawContext context, int xpos, int ypos, int width) { + context.fill(xpos, ypos, xpos + width, ypos + 1, this.color); } - private void drawVLine(MatrixStack ms, int xpos, int ypos, int height) { - DrawableHelper.fill(ms, xpos, ypos, xpos + 1, ypos + height, this.color); + private void drawVLine(DrawContext context, int xpos, int ypos, int height) { + context.fill(xpos, ypos, xpos + 1, ypos + height, this.color); } /** 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 671b1f41..850cb3d2 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 @@ -2,8 +2,8 @@ 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; -import net.minecraft.client.util.math.MatrixStack; /** * Abstract base class for a component that may be added to a Widget. @@ -15,12 +15,11 @@ public abstract class Component { public static final int PAD_L = 4; static TextRenderer txtRend = MinecraftClient.getInstance().textRenderer; - static ItemRenderer itmRend = MinecraftClient.getInstance().getItemRenderer(); // these should always be the content dimensions without any padding. int width, height; - public abstract void render(MatrixStack ms, int x, int y); + public abstract void render(DrawContext context, int x, int y); public int getWidth() { return this.width; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoFatTextComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoFatTextComponent.java index f845eba5..afd05c26 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoFatTextComponent.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoFatTextComponent.java @@ -1,7 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.gui.DrawContext; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -36,10 +36,10 @@ public class IcoFatTextComponent extends Component { } @Override - public void render(MatrixStack ms, int x, int y) { - itmRend.renderGuiItemIcon(ms, ico, x, y + ICO_OFFS); - txtRend.draw(ms, line1, x + ICO_DIM + PAD_L, y, 0xffffffff); - txtRend.draw(ms, line2, x + ICO_DIM + PAD_L, y + txtRend.fontHeight + PAD_S, 0xffffffff); + public void render(DrawContext context, int x, int y) { + context.drawItem(ico, x, y + ICO_OFFS); + context.drawText(txtRend, line1, x + ICO_DIM + PAD_L, y, 0xffffffff, false); + context.drawText(txtRend, line2, x + ICO_DIM + PAD_L, y + txtRend.fontHeight + PAD_S, 0xffffffff, false); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoTextComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoTextComponent.java index 7a495a13..7ab92dd5 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoTextComponent.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/IcoTextComponent.java @@ -1,7 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.gui.DrawContext; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -32,9 +32,9 @@ public class IcoTextComponent extends Component { } @Override - public void render(MatrixStack ms, int x, int y) { - itmRend.renderGuiItemIcon(ms, ico, x, y); - txtRend.draw(ms, text, x + ICO_DIM + PAD_L, y + 5, 0xffffffff); + public void render(DrawContext context, int x, int y) { + context.drawItem(ico, x, y); + context.drawText(txtRend, text, x + ICO_DIM + PAD_L, y + 5, 0xffffffff, false); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlainTextComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlainTextComponent.java index 265d11f1..34e0268b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlainTextComponent.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlainTextComponent.java @@ -1,6 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.gui.DrawContext; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -23,8 +23,8 @@ public class PlainTextComponent extends Component { } @Override - public void render(MatrixStack ms, int x, int y) { - txtRend.draw(ms, text, x + PAD_S, y, 0xffffffff); + public void render(DrawContext context, int x, int y) { + context.drawText(txtRend, text, x + PAD_S, y, 0xffffffff, false); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java index 18859080..fd66ec73 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java @@ -1,10 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; -import com.mojang.blaze3d.systems.RenderSystem; - +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.PlayerSkinDrawer; import net.minecraft.client.network.PlayerListEntry; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.Identifier; /** @@ -27,10 +25,9 @@ public class PlayerComponent extends Component { } @Override - public void render(MatrixStack ms, int x, int y) { - RenderSystem.setShaderTexture(0, tex); - PlayerSkinDrawer.draw(ms, x, y, SKIN_ICO_DIM); - txtRend.draw(ms, name, x + SKIN_ICO_DIM + PAD_S, y, 0xffffffff); + public void render(DrawContext context, int x, int y) { + PlayerSkinDrawer.draw(context, tex, x, y, SKIN_ICO_DIM); + context.drawText(txtRend, name, x + SKIN_ICO_DIM + PAD_S, y, 0xffffffff, false); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java index b9ebc0e9..a7cc8d12 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/ProgressComponent.java @@ -1,8 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.Ico; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.gui.DrawContext; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -55,16 +54,16 @@ public class ProgressComponent extends Component { } @Override - public void render(MatrixStack ms, int x, int y) { - itmRend.renderGuiItemIcon(ms, ico, x, y + ICO_OFFS); - txtRend.draw(ms, desc, x + ICO_DIM + PAD_L, y, 0xffffffff); + public void render(DrawContext context, int x, int y) { + context.drawItem(ico, x, y + ICO_OFFS); + context.drawText(txtRend, desc, x + ICO_DIM + PAD_L, y, 0xffffffff, false); int barX = x + ICO_DIM + PAD_L; int barY = y + txtRend.fontHeight + PAD_S; int endOffsX = ((int) (this.barW * (this.pcnt / 100f))); - DrawableHelper.fill(ms, barX + endOffsX, barY, barX + this.barW, barY + BAR_HEIGHT, COL_BG_BAR); - DrawableHelper.fill(ms, barX, barY, barX + endOffsX, barY + BAR_HEIGHT, + context.fill(barX + endOffsX, barY, barX + this.barW, barY + BAR_HEIGHT, COL_BG_BAR); + context.fill(barX, barY, barX + endOffsX, barY + BAR_HEIGHT, this.color); - txtRend.drawWithShadow(ms, bar, barX + 3, barY + 2, 0xffffffff); + context.drawTextWithShadow(txtRend, bar, barX + 3, barY + 2, 0xffffffff); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/TableComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/TableComponent.java index 5d49be2c..30287dc0 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/TableComponent.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/TableComponent.java @@ -1,7 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.gui.DrawContext; /** * Meta-Component that consists of a grid of other components @@ -38,11 +37,11 @@ public class TableComponent extends Component { } @Override - public void render(MatrixStack ms, int xpos, int ypos) { + public void render(DrawContext context, int xpos, int ypos) { for (int x = 0; x < cols; x++) { for (int y = 0; y < rows; y++) { if (comps[x][y] != null) { - comps[x][y].render(ms, xpos + (x * cellW), ypos + y * cellH); + comps[x][y].render(context, xpos + (x * cellW), ypos + y * cellH); } } // add a line before the col if we're not drawing the first one @@ -51,7 +50,7 @@ public class TableComponent extends Component { int lineX2 = xpos + (x * cellW) - PAD_S; int lineY1 = ypos + 1; int lineY2 = ypos + this.height - PAD_S - 1; // not sure why but it looks correct - DrawableHelper.fill(ms, lineX1, lineY1, lineX2, lineY2, this.color); + context.fill(lineX1, lineY1, lineX2, lineY2, this.color); } } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/ToastBuilder.java b/src/main/java/me/xmrvizzy/skyblocker/utils/ToastBuilder.java index 7a0ad754..919975b0 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/ToastBuilder.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/ToastBuilder.java @@ -3,11 +3,10 @@ package me.xmrvizzy.skyblocker.utils; import com.mojang.blaze3d.systems.RenderSystem; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.toast.Toast; import net.minecraft.client.toast.ToastManager; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; @Environment(value= EnvType.CLIENT) @@ -21,14 +20,13 @@ public class ToastBuilder implements Toast { } @Override - public Toast.Visibility draw(MatrixStack matrices, ToastManager manager, long startTime) { - RenderSystem.setShader(GameRenderer::getPositionTexProgram); - RenderSystem.setShaderTexture(0, TEXTURE); + public Toast.Visibility draw(DrawContext context, ToastManager manager, long startTime) { + TextRenderer textRenderer = manager.getClient().textRenderer; RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - DrawableHelper.drawTexture(matrices, 0, 0, 0, 0, this.getWidth(), this.getHeight()); - manager.getClient().textRenderer.draw(matrices, title, 7.0f, 7.0f, -11534256); - manager.getClient().textRenderer.draw(matrices, description, 7.0f, 18.0f, -16777216); + context.drawTexture(TEXTURE, 0, 0, 0, 0, this.getWidth(), this.getHeight()); + context.drawText(textRenderer, title, 7, 7, -11534256, false); + context.drawText(textRenderer, description, 7, 18, -16777216, false); return startTime >= 3000L ? Toast.Visibility.HIDE : Toast.Visibility.SHOW; } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 14c1e6f1..b407b737 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -30,9 +30,9 @@ ], "depends": { "fabricloader": ">=0.14.19", - "fabric-api": ">=0.81.0+1.19.4", + "fabric-api": ">=0.80.2+1.20", "cloth-config2": "*", - "minecraft": "~1.19.4" + "minecraft": "~1.20-beta.1" }, "custom": { "modmenu": { diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index 6fa2596a..f8b39c93 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -6,20 +6,18 @@ "AccessorWorldRenderer", "ClientPlayerEntityMixin", "ClientPlayNetworkHandlerMixin", + "DrawContextMixin", "FarmlandBlockMixin", "GenericContainerScreenHandlerMixin", "HandledScreenAccessor", "HandledScreenMixin", "InGameHudMixin", "InventoryScreenMixin", - "ItemRendererMixin", "LeverBlockMixin", "MinecraftClientMixin", - "RecipeBookWidgetAccessor", - "HandledScreenAccessor", "PlayerListHudAccessor", "PlayerListHudMixin", - "ScreenMixin" + "RecipeBookWidgetAccessor" ], "injectors": { "defaultRequire": 1 -- cgit From dddb48315bd373b4e19f6a45da6ad21eacc26ff9 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Thu, 11 May 2023 01:57:03 -0400 Subject: Fix null check being useless --- .../java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index 30aa1ed2..2638db7e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -39,9 +39,11 @@ public abstract class HandledScreenMixin extends Screen { @Inject(at = @At("HEAD"), method = "drawMouseoverTooltip", cancellable = true) public void skyblocker$drawMouseOverTooltip(DrawContext context, int x, int y, CallbackInfo ci) { //Hide Empty Tooltips - Text stackName = focusedSlot.getStack().getName(); - String strName = stackName.getString(); - if(this.focusedSlot != null && Utils.isOnSkyblock() && SkyblockerConfig.get().general.hideEmptyTooltips && strName.equals(" ")) ci.cancel(); + if(this.focusedSlot != null) { + Text stackName = focusedSlot.getStack().getName(); + String strName = stackName.getString(); + if(Utils.isOnSkyblock() && SkyblockerConfig.get().general.hideEmptyTooltips && strName.equals(" ")) ci.cancel(); + } //Backpack Preview String title = this.getTitle().getString(); -- cgit From 9e142941684bb40fe48f7f68bcd456894d3acd57 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Wed, 7 Jun 2023 13:13:24 -0400 Subject: Fix drill fuel Z layering --- .../java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java index ccbeaca2..0c28491d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java @@ -5,6 +5,8 @@ import java.util.regex.Pattern; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -16,12 +18,15 @@ import me.xmrvizzy.skyblocker.utils.ItemUtils; import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.util.math.ColorHelper; @Mixin(DrawContext.class) public abstract class DrawContextMixin { + @Shadow @Final private MatrixStack matrices; + @Inject(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD")) public void skyblocker$renderItemBar(TextRenderer textRenderer, ItemStack stack, int x, int y, @Nullable String countOverride, CallbackInfo ci) { @@ -44,13 +49,17 @@ public abstract class DrawContextMixin { } DrawContext context = ((DrawContext) (Object) this); - + matrices.push(); + matrices.translate(0f, 0f, 200f); RenderSystem.disableDepthTest(); + float hue = Math.max(0.0F, 1.0F - (max - current) / max); int width = Math.round(current / max * 13.0F); Color color = Color.getHSBColor(hue / 3.0F, 1.0F, 1.0F); context.fill(x + 2, y + 13, x + 15, y + 15, 0xFF000000); context.fill(x + 2, y + 13, x + 2 + width, y + 14, ColorHelper.Argb.getArgb(color.getAlpha(), color.getRed(), color.getGreen(), color.getBlue())); + + matrices.pop(); RenderSystem.enableDepthTest(); } } -- cgit From 8278636bcf13450dfb0d505bd92d4355f7a85db8 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Wed, 7 Jun 2023 13:21:29 -0400 Subject: Write drill fuel bar to gui overlay buffer --- src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java index 0c28491d..32163c38 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java @@ -18,6 +18,7 @@ import me.xmrvizzy.skyblocker.utils.ItemUtils; import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.render.RenderLayer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; @@ -56,8 +57,8 @@ public abstract class DrawContextMixin { float hue = Math.max(0.0F, 1.0F - (max - current) / max); int width = Math.round(current / max * 13.0F); Color color = Color.getHSBColor(hue / 3.0F, 1.0F, 1.0F); - context.fill(x + 2, y + 13, x + 15, y + 15, 0xFF000000); - context.fill(x + 2, y + 13, x + 2 + width, y + 14, ColorHelper.Argb.getArgb(color.getAlpha(), color.getRed(), color.getGreen(), color.getBlue())); + context.fill(RenderLayer.getGuiOverlay(), x + 2, y + 13, x + 15, y + 15, 0xFF000000); + context.fill(RenderLayer.getGuiOverlay(), x + 2, y + 13, x + 2 + width, y + 14, ColorHelper.Argb.getArgb(color.getAlpha(), color.getRed(), color.getGreen(), color.getBlue())); matrices.pop(); RenderSystem.enableDepthTest(); -- cgit From 4e00861a7a7bff86a6869cca69e820d118cf0375 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Wed, 7 Jun 2023 15:29:11 -0400 Subject: Replace double cast with shadow --- src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java index 32163c38..a8a490b8 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java @@ -28,6 +28,10 @@ import net.minecraft.util.math.ColorHelper; public abstract class DrawContextMixin { @Shadow @Final private MatrixStack matrices; + @Shadow + public void fill(RenderLayer layer, int x1, int x2, int y1, int y2, int color) { + } + @Inject(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD")) public void skyblocker$renderItemBar(TextRenderer textRenderer, ItemStack stack, int x, int y, @Nullable String countOverride, CallbackInfo ci) { @@ -49,7 +53,6 @@ public abstract class DrawContextMixin { } } - DrawContext context = ((DrawContext) (Object) this); matrices.push(); matrices.translate(0f, 0f, 200f); RenderSystem.disableDepthTest(); @@ -57,8 +60,8 @@ public abstract class DrawContextMixin { float hue = Math.max(0.0F, 1.0F - (max - current) / max); int width = Math.round(current / max * 13.0F); Color color = Color.getHSBColor(hue / 3.0F, 1.0F, 1.0F); - context.fill(RenderLayer.getGuiOverlay(), x + 2, y + 13, x + 15, y + 15, 0xFF000000); - context.fill(RenderLayer.getGuiOverlay(), x + 2, y + 13, x + 2 + width, y + 14, ColorHelper.Argb.getArgb(color.getAlpha(), color.getRed(), color.getGreen(), color.getBlue())); + this.fill(RenderLayer.getGuiOverlay(), x + 2, y + 13, x + 15, y + 15, 0xFF000000); + this.fill(RenderLayer.getGuiOverlay(), x + 2, y + 13, x + 2 + width, y + 14, ColorHelper.Argb.getArgb(color.getAlpha(), color.getRed(), color.getGreen(), color.getBlue())); matrices.pop(); RenderSystem.enableDepthTest(); -- cgit From 027426aacac048b85cd310e9e3d4101e0156a917 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Mon, 22 May 2023 20:30:12 -0400 Subject: Add Fairy Souls Helper --- build.gradle | 3 + gradle.properties | 2 + .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 22 +-- .../skyblocker/config/SkyblockerConfig.java | 8 + .../accessor/BeaconBlockEntityRendererInvoker.java | 16 ++ .../xmrvizzy/skyblocker/skyblock/FairySouls.java | 184 +++++++++++++++++++++ .../skyblocker/skyblock/api/RepositoryUpdate.java | 62 ------- .../skyblocker/skyblock/dungeon/LividColor.java | 3 +- .../skyblocker/skyblock/itemlist/ItemRegistry.java | 75 ++------- .../skyblock/itemlist/ItemStackBuilder.java | 5 +- .../java/me/xmrvizzy/skyblocker/utils/NEURepo.java | 90 ++++++++++ .../me/xmrvizzy/skyblocker/utils/RenderHelper.java | 30 ++++ .../java/me/xmrvizzy/skyblocker/utils/Utils.java | 91 +++++++++- .../resources/assets/skyblocker/lang/en_us.json | 6 +- 14 files changed, 454 insertions(+), 143 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/api/RepositoryUpdate.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/build.gradle b/build.gradle index 4d2dc8ef..83da3489 100644 --- a/build.gradle +++ b/build.gradle @@ -60,6 +60,9 @@ dependencies { // https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit used pull data from the NEU item repo include(implementation("org.eclipse.jgit:org.eclipse.jgit:6.4.0.202211300538-r")) + // Renderer (https://github.com/0x3C50/Renderer) + include modImplementation("com.github.0x3C50:Renderer:${project.renderer_version}") + include(modImplementation ("meteordevelopment:discord-ipc:1.1")) } diff --git a/gradle.properties b/gradle.properties index 14a4fffc..d90dc6f2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,6 +17,8 @@ clothconfig_version=11.0.99 mod_menu_version=7.0.1 ## REI (https://www.curseforge.com/minecraft/mc-mods/roughly-enough-items/files) rei_version=12.0.625 +## Renderer (https://github.com/0x3C50/Renderer) +renderer_version = master-SNAPSHOT # Mod Properties mod_version = 1.10.0 diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index 189ecca3..04ab384f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -1,14 +1,12 @@ package me.xmrvizzy.skyblocker; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import me.xmrvizzy.skyblocker.chat.ChatMessageListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.discord.DiscordRPCManager; import me.xmrvizzy.skyblocker.gui.ContainerSolverManager; -import me.xmrvizzy.skyblocker.skyblock.BackpackPreview; -import me.xmrvizzy.skyblocker.skyblock.FishingHelper; -import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock; -import me.xmrvizzy.skyblocker.skyblock.StatusBarTracker; -import me.xmrvizzy.skyblocker.skyblock.api.RepositoryUpdate; +import me.xmrvizzy.skyblocker.skyblock.*; import me.xmrvizzy.skyblocker.skyblock.api.StatsCommand; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonBlaze; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonMap; @@ -20,14 +18,14 @@ import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; import me.xmrvizzy.skyblocker.skyblock.quicknav.QuickNav; import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; -import me.xmrvizzy.skyblocker.utils.MessageScheduler; -import me.xmrvizzy.skyblocker.utils.Scheduler; -import me.xmrvizzy.skyblocker.utils.UpdateChecker; -import me.xmrvizzy.skyblocker.utils.Utils; +import me.xmrvizzy.skyblocker.utils.*; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; +import java.nio.file.Path; + /** * Main class for Skyblocker which initializes features, registers events, and * manages ticks. This class will be instantiated by Fabric. Do not instantiate @@ -35,6 +33,8 @@ import net.minecraft.client.MinecraftClient; */ public class SkyblockerMod implements ClientModInitializer { public static final String NAMESPACE = "skyblocker"; + public static final Path CONFIG_DIR = FabricLoader.getInstance().getConfigDir().resolve(NAMESPACE); + public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); private static SkyblockerMod INSTANCE; @SuppressWarnings("deprecation") @@ -63,12 +63,13 @@ public class SkyblockerMod implements ClientModInitializer { @Override public void onInitializeClient() { ClientTickEvents.END_CLIENT_TICK.register(this::tick); + Utils.init(); HotbarSlotLock.init(); SkyblockerConfig.init(); PriceInfoTooltip.init(); WikiLookup.init(); ItemRegistry.init(); - RepositoryUpdate.init(); + NEURepo.init(); BackpackPreview.init(); QuickNav.init(); StatsCommand.init(); @@ -78,6 +79,7 @@ public class SkyblockerMod implements ClientModInitializer { DiscordRPCManager.init(); LividColor.init(); FishingHelper.init(); + FairySouls.init(); TabHud.init(); containerSolverManager.init(); DungeonMap.init(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index b1bc2001..f296e487 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -150,6 +150,10 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.Gui.CollapsibleObject() public Fishing fishing = new Fishing(); + @ConfigEntry.Category("fairySouls") + @ConfigEntry.Gui.CollapsibleObject() + public FairySouls fairySouls = new FairySouls(); + @ConfigEntry.Category("itemList") @ConfigEntry.Gui.CollapsibleObject() public ItemList itemList = new ItemList(); @@ -219,6 +223,10 @@ public class SkyblockerConfig implements ConfigData { public boolean enableFishingHelper = true; } + public static class FairySouls { + public boolean enableFairySouls = true; + } + public static class Hitbox { public boolean oldFarmlandHitbox = true; public boolean oldLeverHitbox = false; diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java new file mode 100644 index 00000000..ff7c7cbc --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java @@ -0,0 +1,16 @@ +package me.xmrvizzy.skyblocker.mixin.accessor; + +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.block.entity.BeaconBlockEntityRenderer; +import net.minecraft.client.util.math.MatrixStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(BeaconBlockEntityRenderer.class) +public interface BeaconBlockEntityRendererInvoker { + @SuppressWarnings("unused") + @Invoker("renderBeam") + static void renderBeam(MatrixStack matrices, VertexConsumerProvider vertexConsumers, float tickDelta, long worldTime, int yOffset, int maxY, float[] color) { + throw new IllegalStateException("Mixin invoker failed to apply."); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java new file mode 100644 index 00000000..4480c5e1 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java @@ -0,0 +1,184 @@ +package me.xmrvizzy.skyblocker.skyblock; + +import com.google.common.collect.ImmutableSet; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.NEURepo; +import me.xmrvizzy.skyblocker.utils.RenderHelper; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; +import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.minecraft.client.MinecraftClient; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.text.Text; +import net.minecraft.util.DyeColor; +import net.minecraft.util.math.BlockPos; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.util.*; +import java.util.concurrent.CompletableFuture; + +import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; + +public class FairySouls { + private static final Logger LOGGER = LoggerFactory.getLogger(FairySouls.class); + private static CompletableFuture fairySoulsLoaded; + private static final Map> fairySouls = new HashMap<>(); + private static final Map>> foundFairies = new HashMap<>(); + + public static void init() { + fairySoulsLoaded = NEURepo.runAsyncAfterLoad(() -> { + try { + BufferedReader reader = new BufferedReader(new FileReader(NEURepo.LOCAL_REPO_DIR.resolve("constants").resolve("fairy_souls.json").toFile())); + for (Map.Entry fairySoulJson : JsonParser.parseReader(reader).getAsJsonObject().asMap().entrySet()) { + if (fairySoulJson.getKey().equals("//") || fairySoulJson.getKey().equals("Max Souls")) { + continue; + } + ImmutableSet.Builder fairySoulsForLocation = ImmutableSet.builder(); + for (JsonElement fairySoul : fairySoulJson.getValue().getAsJsonArray().asList()) { + fairySoulsForLocation.add(parseBlockPos(fairySoul)); + } + fairySouls.put(fairySoulJson.getKey(), fairySoulsForLocation.build()); + } + reader = new BufferedReader(new FileReader(SkyblockerMod.CONFIG_DIR.resolve("found_fairy_souls.json").toFile())); + for (Map.Entry foundFairiesForProfileJson : JsonParser.parseReader(reader).getAsJsonObject().asMap().entrySet()) { + Map> foundFairiesForProfile = new HashMap<>(); + for (Map.Entry foundFairiesForLocationJson : foundFairiesForProfileJson.getValue().getAsJsonObject().asMap().entrySet()) { + Set foundFairiesForLocation = new HashSet<>(); + for (JsonElement foundFairy : foundFairiesForLocationJson.getValue().getAsJsonArray().asList()) { + foundFairiesForLocation.add(parseBlockPos(foundFairy)); + } + foundFairiesForProfile.put(foundFairiesForLocationJson.getKey(), foundFairiesForLocation); + } + foundFairies.put(foundFairiesForProfileJson.getKey(), foundFairiesForProfile); + } + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + LOGGER.error("Failed to load found fairy souls."); + } catch (Exception e) { + e.printStackTrace(); + } + }); + ClientLifecycleEvents.CLIENT_STOPPING.register(FairySouls::saveFoundFairySouls); + WorldRenderEvents.AFTER_TRANSLUCENT.register(FairySouls::render); + ClientReceiveMessageEvents.GAME.register(FairySouls::onChatMessage); + ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(literal(SkyblockerMod.NAMESPACE) + .then(literal("fairySouls") + .then(literal("markAllInCurrentIslandFound").executes(context -> { + FairySouls.markAllFairiesFound(); + context.getSource().sendFeedback(Text.translatable("skyblocker.fairySouls.markAllFound")); + return 1; + })) + .then(literal("markAllInCurrentIslandMissing").executes(context -> { + FairySouls.markAllFairiesNotFound(); + context.getSource().sendFeedback(Text.translatable("skyblocker.fairySouls.markAllMissing")); + return 1; + }))))); + } + + private static BlockPos parseBlockPos(JsonElement posJson) { + String[] posArray = posJson.getAsString().split(","); + return new BlockPos(Integer.parseInt(posArray[0]), Integer.parseInt(posArray[1]), Integer.parseInt(posArray[2])); + } + + public static void saveFoundFairySouls(MinecraftClient client) { + try { + BufferedWriter writer = new BufferedWriter(new FileWriter(SkyblockerMod.CONFIG_DIR.resolve("found_fairy_souls.json").toFile())); + JsonObject foundFairiesJson = new JsonObject(); + for (Map.Entry>> foundFairiesForProfile : foundFairies.entrySet()) { + JsonObject foundFairiesForProfileJson = new JsonObject(); + for (Map.Entry> foundFairiesForLocation : foundFairiesForProfile.getValue().entrySet()) { + JsonArray foundFairiesForLocationJson = new JsonArray(); + for (BlockPos foundFairy : foundFairiesForLocation.getValue()) { + foundFairiesForLocationJson.add(foundFairy.getX() + "," + foundFairy.getY() + "," + foundFairy.getZ()); + } + foundFairiesForProfileJson.add(foundFairiesForLocation.getKey(), foundFairiesForLocationJson); + } + foundFairiesJson.add(foundFairiesForProfile.getKey(), foundFairiesForProfileJson); + } + SkyblockerMod.GSON.toJson(foundFairiesJson, writer); + writer.close(); + } catch (IOException e) { + LOGGER.error("Failed to write found fairy souls to file."); + } + } + + public static void render(WorldRenderContext context) { + if (!SkyblockerConfig.get().general.fairySouls.enableFairySouls) { + return; + } + if (!fairySoulsLoaded.isDone()) { + LOGGER.warn("Fairy souls are not loaded yet."); + return; + } + if (!fairySouls.containsKey(Utils.getLocationRaw())) { + return; + } + for (BlockPos fairySoul : fairySouls.get(Utils.getLocationRaw())) { + float[] colorComponents = isFairySoulNotFound(fairySoul) ? DyeColor.GREEN.getColorComponents() : DyeColor.RED.getColorComponents(); + RenderHelper.renderFilledThroughWallsWithBeaconBeam(context, fairySoul, colorComponents, 0.5F); + } + } + + private static boolean isFairySoulNotFound(BlockPos fairySoul) { + Map> foundFairiesForProfile = foundFairies.get(Utils.getProfile()); + if (foundFairiesForProfile == null) { + return true; + } + Set foundFairiesForProfileAndLocation = foundFairiesForProfile.get(Utils.getLocationRaw()); + if (foundFairiesForProfileAndLocation == null) { + return true; + } + return !foundFairiesForProfileAndLocation.contains(fairySoul); + } + + public static void onChatMessage(Text text, boolean overlay) { + String message = text.getString(); + if (message.equals("You have already found that Fairy Soul!") || message.equals("SOUL! You found a Fairy Soul!")) { + markClosestFairyFound(); + } + } + + private static void markClosestFairyFound() { + PlayerEntity player = MinecraftClient.getInstance().player; + if (player == null) { + LOGGER.warn("Failed to mark closest fairy soul as found because player is null."); + return; + } + fairySouls.get(Utils.getLocationRaw()).stream().filter(FairySouls::isFairySoulNotFound).min(Comparator.comparingDouble(fairySoul -> fairySoul.getSquaredDistance(player.getPos()))).ifPresent(fairySoul -> { + initializeFoundFairiesForCurrentProfileAndLocation(); + foundFairies.get(Utils.getProfile()).get(Utils.getLocationRaw()).add(fairySoul); + }); + } + + public static void markAllFairiesFound() { + initializeFoundFairiesForCurrentProfileAndLocation(); + foundFairies.get(Utils.getProfile()).get(Utils.getLocationRaw()).addAll(fairySouls.get(Utils.getLocationRaw())); + } + + public static void markAllFairiesNotFound() { + Map> foundFairiesForProfile = foundFairies.get(Utils.getProfile()); + if (foundFairiesForProfile != null) { + foundFairiesForProfile.remove(Utils.getLocationRaw()); + } + } + + private static void initializeFoundFairiesForCurrentProfileAndLocation() { + initializeFoundFairiesForProfileAndLocation(Utils.getProfile(), Utils.getLocationRaw()); + } + + private static void initializeFoundFairiesForProfileAndLocation(String profile, String location) { + foundFairies.computeIfAbsent(profile, profileKey -> new HashMap<>()); + foundFairies.get(profile).computeIfAbsent(location, locationKey -> new HashSet<>()); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/RepositoryUpdate.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/RepositoryUpdate.java deleted file mode 100644 index e08cb1c0..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/RepositoryUpdate.java +++ /dev/null @@ -1,62 +0,0 @@ -package me.xmrvizzy.skyblocker.skyblock.api; - -import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; -import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; -import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; -import net.minecraft.client.MinecraftClient; -import net.minecraft.text.Text; - -import java.io.File; -import java.nio.file.Files; -import java.util.concurrent.CompletableFuture; - -public class RepositoryUpdate { - public static final MinecraftClient client = MinecraftClient.getInstance(); - - /** - * Adds command to update repository manually from ingame. - *

- * TODO A button could be added to the settings menu that will trigger this command. - */ - public static void init(){ - ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register( - ClientCommandManager.literal("skyblocker") - .then(ClientCommandManager.literal("updaterepository") - .executes(context -> { - updateRepository(); - return 1; - }) - ) - ) - ); - - } - - public static void updateRepository() { - CompletableFuture.runAsync(() -> { - try { - ItemRegistry.filesImported = false; - File dir = ItemRegistry.LOCAL_ITEM_REPO_DIR.toFile(); - recursiveDelete(dir); - } catch (Exception ex) { - if (client.player != null) - client.player.sendMessage( - Text.translatable("skyblocker.updaterepository.failed") - , false - ); - return; - } - - ItemRegistry.init(); - }); - } - - private static void recursiveDelete(File dir) { - if (dir.isDirectory() && !Files.isSymbolicLink(dir.toPath())) { - for (File child : dir.listFiles()) { - recursiveDelete(child); - } - } - dir.delete(); - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java index 276a41b6..4701c485 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java @@ -11,11 +11,10 @@ public class LividColor { private static int tenTicks = 0; public static void init() { - ClientReceiveMessageEvents.ALLOW_GAME.register((message, overlay) -> { + ClientReceiveMessageEvents.GAME.register((message, overlay) -> { if (SkyblockerConfig.get().locations.dungeons.lividColor.enableLividColor && message.getString().equals("[BOSS] Livid: I respect you for making it to here, but I'll be your undoing.")) { tenTicks = 8; } - return true; }); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java index d9f3b473..13ca356a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemRegistry.java @@ -2,32 +2,23 @@ package me.xmrvizzy.skyblocker.skyblock.itemlist; import com.google.gson.JsonObject; import com.google.gson.JsonParser; - -import me.xmrvizzy.skyblocker.skyblock.api.RepositoryUpdate; -import net.fabricmc.loader.api.FabricLoader; +import me.xmrvizzy.skyblocker.utils.NEURepo; import net.minecraft.client.MinecraftClient; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.text.Text; -import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.PullResult; -import org.eclipse.jgit.errors.RepositoryNotFoundException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.*; -import java.util.concurrent.CompletableFuture; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class ItemRegistry { - private static final Logger LOGGER = LoggerFactory.getLogger(ItemRegistry.class); - protected static final String REMOTE_ITEM_REPO = "https://github.com/NotEnoughUpdates/NotEnoughUpdates-REPO"; - public static final Path LOCAL_ITEM_REPO_DIR = FabricLoader.getInstance().getConfigDir().resolve("skyblocker/item-repo"); - - protected static final Path ITEM_LIST_DIR = LOCAL_ITEM_REPO_DIR.resolve("items"); + protected static final Path ITEM_LIST_DIR = NEURepo.LOCAL_REPO_DIR.resolve("items"); protected static final List items = new ArrayList<>(); protected static final Map itemsMap = new HashMap<>(); @@ -36,52 +27,8 @@ public class ItemRegistry { public static boolean filesImported = false; public static void init() { - CompletableFuture.runAsync(ItemRegistry::updateItemRepo) - .whenComplete((result, ex) -> { - if (ex == null) { - ItemStackBuilder.init(); - importItemFiles(); - } - else { - LOGGER.error("[Skyblocker-ItemRegistry] " + ex); - } - }); - } - - private static void updateItemRepo() { - Git git; - if (!Files.isDirectory(LOCAL_ITEM_REPO_DIR)) { - try { - git = Git.cloneRepository() - .setURI(REMOTE_ITEM_REPO) - .setDirectory(LOCAL_ITEM_REPO_DIR.toFile()) - .setBranchesToClone(List.of("refs/heads/master")) - .setBranch("refs/heads/master") - .call(); - git.close(); - LOGGER.info("[Skyblocker Repository Update] Repository updated."); - } catch (Exception e) { - e.printStackTrace(); - } - } else { - try { - git = Git.open(LOCAL_ITEM_REPO_DIR.toFile()); - PullResult pull = git.pull().setRebase(true).call(); - git.close(); - - if (pull.getRebaseResult() == null) { - LOGGER.info("[Skyblocker Repository Update] No update result"); - } else if (pull.getRebaseResult().getStatus().isSuccessful()) { - LOGGER.info("[Skyblocker Repository Update] Status: " + pull.getRebaseResult().getStatus().name()); - } else if (!pull.getRebaseResult().getStatus().isSuccessful()) { - LOGGER.warn("[Skyblocker Repository Update] Status: " + pull.getRebaseResult().getStatus().name()); - } - } catch (RepositoryNotFoundException e) { - RepositoryUpdate.updateRepository(); - } catch (Exception e) { - e.printStackTrace(); - } - } + NEURepo.runAsyncAfterLoad(ItemStackBuilder::loadPetNums); + NEURepo.runAsyncAfterLoad(ItemRegistry::importItemFiles); } private static void importItemFiles() { @@ -119,8 +66,7 @@ public class ItemRegistry { if (lhsFamilyName.equals(rhsFamilyName)) { if (lhsInternalName.length() != rhsInternalName.length()) return lhsInternalName.length() - rhsInternalName.length(); - else - return lhsInternalName.compareTo(rhsInternalName); + else return lhsInternalName.compareTo(rhsInternalName); } return lhsFamilyName.compareTo(rhsFamilyName); }); @@ -147,8 +93,7 @@ public class ItemRegistry { public static List getRecipes(String internalName) { List result = new ArrayList<>(); for (SkyblockCraftingRecipe recipe : recipes) - if (getInternalName(recipe.result).equals(internalName)) - result.add(recipe); + if (getInternalName(recipe.result).equals(internalName)) result.add(recipe); for (SkyblockCraftingRecipe recipe : recipes) for (ItemStack ingredient : recipe.grid) if (!ingredient.getItem().equals(Items.AIR) && getInternalName(ingredient).equals(internalName)) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java index b2d909a8..d420d54f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java @@ -4,6 +4,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import me.xmrvizzy.skyblocker.utils.NEURepo; import net.minecraft.item.ItemStack; import net.minecraft.nbt.*; import net.minecraft.text.Text; @@ -16,10 +17,10 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class ItemStackBuilder { - private final static Path PETNUMS_PATH = ItemRegistry.LOCAL_ITEM_REPO_DIR.resolve("constants/petnums.json"); + private final static Path PETNUMS_PATH = NEURepo.LOCAL_REPO_DIR.resolve("constants/petnums.json"); private static JsonObject petNums; - public static void init() { + public static void loadPetNums() { try { petNums = JsonParser.parseString(Files.readString(PETNUMS_PATH)).getAsJsonObject(); } catch (Exception e) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java b/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java new file mode 100644 index 00000000..027cfa7a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/NEURepo.java @@ -0,0 +1,90 @@ +package me.xmrvizzy.skyblocker.utils; + +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Text; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public class NEURepo { + private static final Logger LOGGER = LoggerFactory.getLogger(NEURepo.class); + public static final String REMOTE_REPO_URL = "https://github.com/NotEnoughUpdates/NotEnoughUpdates-REPO.git"; + public static final Path LOCAL_REPO_DIR = SkyblockerMod.CONFIG_DIR.resolve("item-repo"); + private static final CompletableFuture REPO_INITIALIZED = initRepository(); + + /** + * Adds command to update repository manually from ingame. + *

+ * TODO A button could be added to the settings menu that will trigger this command. + */ + public static void init() { + ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> + dispatcher.register(ClientCommandManager.literal(SkyblockerMod.NAMESPACE) + .then(ClientCommandManager.literal("updaterepository").executes(context -> { + deleteAndDownloadRepository(); + return 1; + })))); + } + + public static CompletableFuture initRepository() { + return CompletableFuture.runAsync(() -> { + try { + if (Files.isDirectory(NEURepo.LOCAL_REPO_DIR)) { + try (Git localRepo = Git.open(NEURepo.LOCAL_REPO_DIR.toFile())) { + localRepo.pull().setRebase(true).call(); + LOGGER.info("[Skyblocker] NEU Repository Updated"); + } + } else { + Git.cloneRepository().setURI(REMOTE_REPO_URL).setDirectory(NEURepo.LOCAL_REPO_DIR.toFile()).setBranchesToClone(List.of("refs/heads/master")).setBranch("refs/heads/master").call().close(); + LOGGER.info("[Skyblocker] NEU Repository Downloaded"); + } + } catch (RepositoryNotFoundException e) { + LOGGER.warn("Local NEU Repository not found or corrupted, downloading new one", e); + deleteAndDownloadRepository(); + } catch (Exception e) { + LOGGER.error("Encountered unknown exception while initializing NEU Repository", e); + } + }); + } + + public static void deleteAndDownloadRepository() { + CompletableFuture.runAsync(() -> { + try { + ItemRegistry.filesImported = false; + File dir = NEURepo.LOCAL_REPO_DIR.toFile(); + recursiveDelete(dir); + } catch (Exception ex) { + if (MinecraftClient.getInstance().player != null) + MinecraftClient.getInstance().player.sendMessage(Text.translatable("skyblocker.updaterepository.failed"), false); + return; + } + initRepository(); + }); + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + private static void recursiveDelete(File dir) { + File[] children; + if (dir.isDirectory() && !Files.isSymbolicLink(dir.toPath()) && (children = dir.listFiles()) != null) { + for (File child : children) { + recursiveDelete(child); + } + } + dir.delete(); + } + + public static CompletableFuture runAsyncAfterLoad(Runnable runnable) { + return REPO_INITIALIZED.thenRunAsync(runnable); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java new file mode 100644 index 00000000..79308dc3 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java @@ -0,0 +1,30 @@ +package me.xmrvizzy.skyblocker.utils; + +import me.x150.renderer.render.Renderer3d; +import me.xmrvizzy.skyblocker.mixin.accessor.BeaconBlockEntityRendererInvoker; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.minecraft.client.render.block.entity.BeaconBlockEntityRenderer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +import java.awt.*; + +public class RenderHelper { + public static void renderFilledThroughWallsWithBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { + renderFilledThroughWalls(context, pos, colorComponents, alpha); + renderBeaconBeam(context, pos, colorComponents); + } + + public static void renderFilledThroughWalls(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { + Renderer3d.renderThroughWalls(); + Renderer3d.renderFilled(context.matrixStack(), new Color(colorComponents[0], colorComponents[1], colorComponents[2], alpha), Vec3d.of(pos), new Vec3d(1, 1, 1)); + Renderer3d.stopRenderThroughWalls(); + } + + public static void renderBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents) { + context.matrixStack().push(); + context.matrixStack().translate(pos.getX() - context.camera().getPos().x, pos.getY() - context.camera().getPos().y, pos.getZ() - context.camera().getPos().z); + BeaconBlockEntityRendererInvoker.renderBeam(context.matrixStack(), context.consumers(), context.tickDelta(), context.world().getTime(), 0, BeaconBlockEntityRenderer.MAX_BEAM_HEIGHT, colorComponents); + context.matrixStack().pop(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index a4e403fc..40c96660 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -1,13 +1,21 @@ package me.xmrvizzy.skyblocker.utils; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; +import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; +import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.scoreboard.Scoreboard; import net.minecraft.scoreboard.ScoreboardObjective; import net.minecraft.scoreboard.ScoreboardPlayerScore; import net.minecraft.scoreboard.Team; +import net.minecraft.text.Text; import net.minecraft.util.Formatting; import java.util.ArrayList; @@ -21,6 +29,14 @@ public class Utils { private static boolean isOnSkyblock = false; private static boolean isInDungeons = false; private static boolean isInjected = false; + private static String profile = ""; + private static String server = ""; + private static String gameType = ""; + private static String locationRaw = ""; + private static String map = ""; + private static long clientWorldJoinTime = 0; + private static boolean sentLocRaw = false; + private static long lastLocRaw = 0; public static boolean isOnSkyblock() { return isOnSkyblock; @@ -34,6 +50,31 @@ public class Utils { return isInjected; } + public static String getProfile() { + return profile; + } + + public static String getServer() { + return server; + } + + public static String getGameType() { + return gameType; + } + + public static String getLocationRaw() { + return locationRaw; + } + + public static String getMap() { + return map; + } + + public static void init() { + ClientPlayConnectionEvents.JOIN.register(Utils::onClientWorldJoin); + ClientReceiveMessageEvents.ALLOW_GAME.register(Utils::onChatMessage); + } + public static void sbChecker() { MinecraftClient client = MinecraftClient.getInstance(); List sidebar; @@ -61,13 +102,14 @@ public class Utils { SkyblockEvents.LEAVE.invoker().onSkyblockLeave(); } isInDungeons = isOnSkyblock && string.contains("The Catacombs"); + updateLocRaw(); } public static String getLocation() { String location = null; List sidebarLines = getSidebar(); try { - if( sidebarLines != null) { + if (sidebarLines != null) { for (String sidebarLine : sidebarLines) { if (sidebarLine.contains("⏣")) location = sidebarLine; } @@ -149,4 +191,51 @@ public class Utils { return null; } } + + public static void onClientWorldJoin(ClientPlayNetworkHandler handler, PacketSender sender, MinecraftClient client) { + clientWorldJoinTime = System.currentTimeMillis(); + resetLocRawInfo(); + } + + private static void updateLocRaw() { + if (isOnSkyblock) { + long currentTime = System.currentTimeMillis(); + if (!sentLocRaw && currentTime > clientWorldJoinTime + 1000 && currentTime > lastLocRaw + 15000) { + SkyblockerMod.getInstance().messageScheduler.sendMessageAfterCooldown("/locraw"); + sentLocRaw = true; + lastLocRaw = currentTime; + } + } else { + resetLocRawInfo(); + } + } + + public static boolean onChatMessage(Text text, boolean overlay) { + String message = text.getString(); + if (message.startsWith("{\"server\":") && message.endsWith("}")) { + JsonObject locRaw = JsonParser.parseString(message).getAsJsonObject(); + if (locRaw.has("server")) { + server = locRaw.get("server").getAsString(); + if (locRaw.has("gameType")) { + gameType = locRaw.get("gameType").getAsString(); + } + if (locRaw.has("mode")) { + locationRaw = locRaw.get("mode").getAsString(); + } + if (locRaw.has("map")) { + map = locRaw.get("map").getAsString(); + } + return !sentLocRaw; + } + } + return true; + } + + private static void resetLocRawInfo() { + sentLocRaw = false; + server = ""; + gameType = ""; + locationRaw = ""; + map = ""; + } } \ No newline at end of file diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 858507fe..b40dd52e 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -22,6 +22,8 @@ "text.autoconfig.skyblocker.option.general.bars.barpositions.experienceBarPosition": "Experience Bar Position", "text.autoconfig.skyblocker.option.general.fishing": "Fishing Helper", "text.autoconfig.skyblocker.option.general.fishing.enableFishingHelper": "Enable Fishing Helper", + "text.autoconfig.skyblocker.option.general.fairySouls": "Fairy Souls Helper", + "text.autoconfig.skyblocker.option.general.fairySouls.enableFairySoulsHelper": "Enable Fairy Souls Helper", "text.autoconfig.skyblocker.option.general.quicknav": "Quicknav", "text.autoconfig.skyblocker.option.general.quicknav.enableQuicknav": "Enable Quicknav", "text.autoconfig.skyblocker.option.general.backpackPreviewWithoutShift": "View backpack preview without holding Shift", @@ -222,5 +224,7 @@ "skyblocker.api.got_key": "§b[§6Skyblocker§b] §2Automatically set your API key!", - "skyblocker.fishing.reelNow": "Reel in now!" + "skyblocker.fishing.reelNow": "Reel in now!", + "skyblocker.fairySouls.markAllFound": "Marked all fairy souls in the current island as found", + "skyblocker.fairySouls.markAllMissing": "Marked all fairy souls in the current island as missing" } -- cgit From 4a1075ce0e7c7bb53179820c44f639ce79fe7404 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Fri, 16 Jun 2023 16:34:16 +0800 Subject: Add Chronomatron Solver --- .../skyblocker/config/SkyblockerConfig.java | 10 ++ .../me/xmrvizzy/skyblocker/gui/ColorHighlight.java | 15 +++ .../xmrvizzy/skyblocker/gui/ContainerSolver.java | 21 +++- .../skyblocker/gui/ContainerSolverManager.java | 20 +++- .../skyblocker/mixin/HandledScreenMixin.java | 45 +++++++- .../skyblocker/skyblock/dungeon/CroesusHelper.java | 4 +- .../skyblock/dungeon/terminal/ColorTerminal.java | 4 +- .../skyblock/dungeon/terminal/OrderTerminal.java | 4 +- .../dungeon/terminal/StartsWithTerminal.java | 4 +- .../skyblock/experiment/ChronomatronSolver.java | 126 +++++++++++++++++++++ .../skyblock/experiment/ExperimentSolver.java | 59 ++++++++++ .../skyblock/experiment/SuperpairsSolver.java | 44 +++++++ .../skyblock/experiment/UltrasequencerSolver.java | 40 +++++++ 13 files changed, 378 insertions(+), 18 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ChronomatronSolver.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ExperimentSolver.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/SuperpairsSolver.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/UltrasequencerSolver.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 31887a90..5621a258 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -146,6 +146,10 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.Gui.CollapsibleObject() public Bars bars = new Bars(); + @ConfigEntry.Category("experiments") + @ConfigEntry.Gui.CollapsibleObject() + public Experiments experiments = new Experiments(); + @ConfigEntry.Category("fishing") @ConfigEntry.Gui.CollapsibleObject() public Fishing fishing = new Fishing(); @@ -219,6 +223,12 @@ public class SkyblockerConfig implements ConfigData { } } + public static class Experiments { + public boolean enableChronomatronSolver = true; + public boolean enableSuperpairsSolver = true; + public boolean enableUltrasequencerSolver = true; + } + public static class Fishing { public boolean enableFishingHelper = true; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/gui/ColorHighlight.java b/src/main/java/me/xmrvizzy/skyblocker/gui/ColorHighlight.java index 5120ceac..d0bd68ae 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/gui/ColorHighlight.java +++ b/src/main/java/me/xmrvizzy/skyblocker/gui/ColorHighlight.java @@ -1,4 +1,19 @@ package me.xmrvizzy.skyblocker.gui; public record ColorHighlight(int slot, int color) { + public static ColorHighlight red(int slot) { + return new ColorHighlight(slot, ContainerSolver.RED_HIGHLIGHT); + } + + public static ColorHighlight yellow(int slot) { + return new ColorHighlight(slot, ContainerSolver.YELLOW_HIGHLIGHT); + } + + public static ColorHighlight green(int slot) { + return new ColorHighlight(slot, ContainerSolver.GREEN_HIGHLIGHT); + } + + public static ColorHighlight gray(int slot) { + return new ColorHighlight(slot, ContainerSolver.GRAY_HIGHLIGHT); + } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolver.java b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolver.java index 84de64eb..e52855a2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolver.java +++ b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolver.java @@ -1,5 +1,6 @@ package me.xmrvizzy.skyblocker.gui; +import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; import net.minecraft.item.ItemStack; import java.util.List; @@ -11,22 +12,30 @@ import java.util.regex.Pattern; */ public abstract class ContainerSolver { private final Pattern CONTAINER_NAME; - protected final static int GREEN_HIGHLIGHT = 128 << 24 | 64 << 16 | 196 << 8 | 64; - protected final static int GRAY_HIGHLIGHT = 128 << 24 | 64 << 16 | 64 << 8 | 64; + protected static final int RED_HIGHLIGHT = 64 << 24 | 255 << 16; + protected static final int YELLOW_HIGHLIGHT = 128 << 24 | 255 << 16 | 255 << 8; + protected static final int GREEN_HIGHLIGHT = 128 << 24 | 64 << 16 | 196 << 8 | 64; + protected static final int GRAY_HIGHLIGHT = 128 << 24 | 64 << 16 | 64 << 8 | 64; - public ContainerSolver(String containerName) { + protected ContainerSolver(String containerName) { CONTAINER_NAME = Pattern.compile(containerName); } - public abstract boolean isEnabled(); + protected abstract boolean isEnabled(); public Pattern getName() { return CONTAINER_NAME; } - public abstract List getColors(String[] groups, Map slots); + protected void start(GenericContainerScreen screen) { + } + + protected void reset() { + } + + protected abstract List getColors(String[] groups, Map slots); - public void trimEdges(Map slots, int rows) { + protected void trimEdges(Map slots, int rows) { for (int i = 0; i < rows; i++) { slots.remove(9 * i); slots.remove(9 * i + 8); diff --git a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java index 354e7e3a..43bf32d7 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java @@ -6,6 +6,9 @@ import me.xmrvizzy.skyblocker.skyblock.dungeon.CroesusHelper; import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.ColorTerminal; import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.OrderTerminal; import me.xmrvizzy.skyblocker.skyblock.dungeon.terminal.StartsWithTerminal; +import me.xmrvizzy.skyblocker.skyblock.experiment.ChronomatronSolver; +import me.xmrvizzy.skyblocker.skyblock.experiment.SuperpairsSolver; +import me.xmrvizzy.skyblocker.skyblock.experiment.UltrasequencerSolver; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.minecraft.client.gui.DrawContext; @@ -36,10 +39,17 @@ public class ContainerSolverManager { new ColorTerminal(), new OrderTerminal(), new StartsWithTerminal(), - new CroesusHelper() + new CroesusHelper(), + new ChronomatronSolver(), + new SuperpairsSolver(), + new UltrasequencerSolver() }; } + public ContainerSolver getCurrentSolver() { + return currentSolver; + } + public void init() { ScreenEvents.BEFORE_INIT.register((client, screen, scaledWidth, scaledHeight) -> { if (Utils.isOnSkyblock() && screen instanceof GenericContainerScreen genericContainerScreen) { @@ -50,6 +60,7 @@ public class ContainerSolverManager { onDraw(context, genericContainerScreen.getScreenHandler().slots.subList(0, genericContainerScreen.getScreenHandler().getRows() * 9)); matrices.pop(); }); + ScreenEvents.remove(screen).register(screen1 -> clearScreen()); onSetScreen(genericContainerScreen); } else { clearScreen(); @@ -67,16 +78,19 @@ public class ContainerSolverManager { if (matcher.matches()) { currentSolver = solver; groups = new String[matcher.groupCount()]; - for (int i = 0; i < groups.length; i++) + for (int i = 0; i < groups.length; i++) { groups[i] = matcher.group(i + 1); + } + currentSolver.start(screen); return; } } } - currentSolver = null; + clearScreen(); } public void clearScreen() { + currentSolver.reset(); currentSolver = null; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index 2638db7e..b8df488c 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -1,19 +1,27 @@ package me.xmrvizzy.skyblocker.mixin; +import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.gui.ContainerSolver; import me.xmrvizzy.skyblocker.skyblock.BackpackPreview; +import me.xmrvizzy.skyblocker.skyblock.experiment.ChronomatronSolver; +import me.xmrvizzy.skyblocker.skyblock.experiment.ExperimentSolver; +import me.xmrvizzy.skyblocker.skyblock.experiment.SuperpairsSolver; +import me.xmrvizzy.skyblocker.skyblock.experiment.UltrasequencerSolver; import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup; import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.screen.slot.Slot; +import net.minecraft.screen.slot.SlotActionType; import net.minecraft.text.Text; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -44,7 +52,7 @@ public abstract class HandledScreenMixin extends Screen { String strName = stackName.getString(); if(Utils.isOnSkyblock() && SkyblockerConfig.get().general.hideEmptyTooltips && strName.equals(" ")) ci.cancel(); } - + //Backpack Preview String title = this.getTitle().getString(); boolean shiftDown = SkyblockerConfig.get().general.backpackPreviewWithoutShift ^ Screen.hasShiftDown(); @@ -53,4 +61,39 @@ public abstract class HandledScreenMixin extends Screen { if (BackpackPreview.renderPreview(context, this.focusedSlot.getIndex(), x, y)) ci.cancel(); } } + + @Redirect(method = {"drawSlot", "drawMouseoverTooltip"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/screen/slot/Slot;getStack()Lnet/minecraft/item/ItemStack;", ordinal = 0)) + private ItemStack skyblocker$experimentSolvers$getStack(Slot slot) { + ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver(); + if ((currentSolver instanceof SuperpairsSolver || currentSolver instanceof UltrasequencerSolver) && ((ExperimentSolver) currentSolver).getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) { + ItemStack itemStack = ((ExperimentSolver) currentSolver).getSlots().get(slot.getIndex()); + return itemStack == null ? slot.getStack() : itemStack; + } + return slot.getStack(); + } + + @Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;clickSlot(IIILnet/minecraft/screen/slot/SlotActionType;Lnet/minecraft/entity/player/PlayerEntity;)V")) + private void skyblockmod_onSlotClick(Slot slot, int slotId, int button, SlotActionType actionType, CallbackInfo ci) { + if (slot != null) { + ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver(); + if (currentSolver instanceof ExperimentSolver experimentSolver && experimentSolver.getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) { + if (currentSolver instanceof ChronomatronSolver chronomatronSolver) { + Item item = chronomatronSolver.getChronomatronSlots().get(chronomatronSolver.getChronomatronCurrentOrdinal()); + if (slot.getStack().isOf(item) || ChronomatronSolver.TERRACOTTA_TO_GLASS.get(slot.getStack().getItem()) == item) { + if (chronomatronSolver.incrementChronomatronCurrentOrdinal() >= chronomatronSolver.getChronomatronSlots().size()) { + chronomatronSolver.setState(ExperimentSolver.State.END); + } + } + } else if (currentSolver instanceof SuperpairsSolver superpairsSolver) { + superpairsSolver.setSuperpairsPrevClickedSlot(slot.getIndex()); + superpairsSolver.setSuperpairsCurrentSlot(ItemStack.EMPTY); + } else if (currentSolver instanceof UltrasequencerSolver ultrasequencerSolver) { + if (slot.getIndex() == ultrasequencerSolver.getUltrasequencerNextSlot()) { + int count = ultrasequencerSolver.getSlots().get(ultrasequencerSolver.getUltrasequencerNextSlot()).getCount() + 1; + ultrasequencerSolver.getSlots().entrySet().stream().filter(entry -> entry.getValue().getCount() == count).findAny().ifPresentOrElse((entry) -> ultrasequencerSolver.setUltrasequencerNextSlot(entry.getKey()), () -> ultrasequencerSolver.setState(ExperimentSolver.State.END)); + } + } + } + } + } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/CroesusHelper.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/CroesusHelper.java index ec3655f0..5e7ca95f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/CroesusHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/CroesusHelper.java @@ -14,12 +14,12 @@ public class CroesusHelper extends ContainerSolver { public CroesusHelper() { super("^Croesus$"); } @Override - public boolean isEnabled() { + protected boolean isEnabled() { return SkyblockerConfig.get().locations.dungeons.croesusHelper; } @Override - public List getColors(String[] groups, Map slots) { + protected List getColors(String[] groups, Map slots) { List highlights = new ArrayList<>(); for (Map.Entry entry : slots.entrySet()) { ItemStack stack = entry.getValue(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java index 0bfc0d60..30376254 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java @@ -27,13 +27,13 @@ public class ColorTerminal extends ContainerSolver { } @Override - public boolean isEnabled() { + protected boolean isEnabled() { targetColor = null; return SkyblockerConfig.get().locations.dungeons.terminals.solveColor; } @Override - public List getColors(String[] groups, Map slots) { + protected List getColors(String[] groups, Map slots) { trimEdges(slots, 6); List highlights = new ArrayList<>(); String colorString = groups[0]; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java index 1cf0dcfc..3b4e1c50 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java @@ -21,14 +21,14 @@ public class OrderTerminal extends ContainerSolver { } @Override - public boolean isEnabled() { + protected boolean isEnabled() { orderedSlots = null; currentNum = 0; return SkyblockerConfig.get().locations.dungeons.terminals.solveOrder; } @Override - public List getColors(String[] groups, Map slots) { + protected List getColors(String[] groups, Map slots) { if(orderedSlots == null && !orderSlots(slots)) return Collections.emptyList(); while(currentNum < PANES_NUM && Items.LIME_STAINED_GLASS_PANE.equals(slots.get(orderedSlots[currentNum]).getItem())) diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java index 26d2a2c4..a836a679 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java @@ -15,12 +15,12 @@ public class StartsWithTerminal extends ContainerSolver { } @Override - public boolean isEnabled() { + protected boolean isEnabled() { return SkyblockerConfig.get().locations.dungeons.terminals.solveStartsWith; } @Override - public List getColors(String[] groups, Map slots) { + protected List getColors(String[] groups, Map slots) { trimEdges(slots, 6); String prefix = groups[0]; List highlights = new ArrayList<>(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ChronomatronSolver.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ChronomatronSolver.java new file mode 100644 index 00000000..ee88b98f --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ChronomatronSolver.java @@ -0,0 +1,126 @@ +package me.xmrvizzy.skyblocker.skyblock.experiment; + +import com.google.common.collect.ImmutableMap; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.gui.ColorHighlight; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; + +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ChronomatronSolver extends ExperimentSolver { + public static final ImmutableMap TERRACOTTA_TO_GLASS = ImmutableMap.ofEntries( + new AbstractMap.SimpleImmutableEntry<>(Items.RED_TERRACOTTA, Items.RED_STAINED_GLASS), + new AbstractMap.SimpleImmutableEntry<>(Items.ORANGE_TERRACOTTA, Items.ORANGE_STAINED_GLASS), + new AbstractMap.SimpleImmutableEntry<>(Items.YELLOW_TERRACOTTA, Items.YELLOW_STAINED_GLASS), + new AbstractMap.SimpleImmutableEntry<>(Items.LIME_TERRACOTTA, Items.LIME_STAINED_GLASS), + new AbstractMap.SimpleImmutableEntry<>(Items.GREEN_TERRACOTTA, Items.GREEN_STAINED_GLASS), + new AbstractMap.SimpleImmutableEntry<>(Items.CYAN_TERRACOTTA, Items.CYAN_STAINED_GLASS), + new AbstractMap.SimpleImmutableEntry<>(Items.LIGHT_BLUE_TERRACOTTA, Items.LIGHT_BLUE_STAINED_GLASS), + new AbstractMap.SimpleImmutableEntry<>(Items.BLUE_TERRACOTTA, Items.BLUE_STAINED_GLASS), + new AbstractMap.SimpleImmutableEntry<>(Items.PURPLE_TERRACOTTA, Items.PURPLE_STAINED_GLASS), + new AbstractMap.SimpleImmutableEntry<>(Items.PINK_TERRACOTTA, Items.PINK_STAINED_GLASS) + ); + + private final List chronomatronSlots = new ArrayList<>(); + private int chronomatronChainLengthCount; + private int chronomatronCurrentSlot; + private int chronomatronCurrentOrdinal; + + public ChronomatronSolver() { + super("^Chronomatron \\("); + } + + public List getChronomatronSlots() { + return chronomatronSlots; + } + + public int getChronomatronCurrentOrdinal() { + return chronomatronCurrentOrdinal; + } + + public int incrementChronomatronCurrentOrdinal() { + return ++chronomatronCurrentOrdinal; + } + + @Override + protected boolean isEnabled(SkyblockerConfig.Experiments experimentsConfig) { + return experimentsConfig.enableChronomatronSolver; + } + + @Override + protected void tick(Screen screen) { + if (isEnabled() && screen instanceof GenericContainerScreen genericContainerScreen && genericContainerScreen.getTitle().getString().startsWith("Chronomatron (")) { + switch (state) { + case REMEMBER -> { + Inventory inventory = genericContainerScreen.getScreenHandler().getInventory(); + if (chronomatronCurrentSlot == 0) { + for (int index = 10; index < 43; index++) { + if (inventory.getStack(index).hasEnchantments()) { + if (chronomatronSlots.size() <= chronomatronChainLengthCount) { + chronomatronSlots.add(TERRACOTTA_TO_GLASS.get(inventory.getStack(index).getItem())); + state = State.WAIT; + } else { + chronomatronChainLengthCount++; + } + chronomatronCurrentSlot = index; + return; + } + } + } else if (!inventory.getStack(chronomatronCurrentSlot).hasEnchantments()) { + chronomatronCurrentSlot = 0; + } + } + case WAIT -> { + if (genericContainerScreen.getScreenHandler().getInventory().getStack(49).getName().getString().startsWith("Timer: ")) { + state = State.SHOW; + } + } + case END -> { + String name = genericContainerScreen.getScreenHandler().getInventory().getStack(49).getName().getString(); + if (!name.startsWith("Timer: ")) { + if (name.equals("Remember the pattern!")) { + chronomatronChainLengthCount = 0; + chronomatronCurrentOrdinal = 0; + state = State.REMEMBER; + } else { + reset(); + } + } + } + } + } else { + reset(); + } + } + + @Override + protected List getColors(String[] groups, Map slots) { + List highlights = new ArrayList<>(); + for (Map.Entry indexStack : slots.entrySet()) { + int index = indexStack.getKey(); + ItemStack stack = indexStack.getValue(); + Item item = chronomatronSlots.get(chronomatronCurrentOrdinal); + if (stack.isOf(item) || TERRACOTTA_TO_GLASS.get(stack.getItem()) == item) { + highlights.add(ColorHighlight.green(index)); + } + } + return highlights; + } + + @Override + protected void reset() { + super.reset(); + chronomatronSlots.clear(); + chronomatronChainLengthCount = 0; + chronomatronCurrentSlot = 0; + chronomatronCurrentOrdinal = 0; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ExperimentSolver.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ExperimentSolver.java new file mode 100644 index 00000000..91eabcfe --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ExperimentSolver.java @@ -0,0 +1,59 @@ +package me.xmrvizzy.skyblocker.skyblock.experiment; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.gui.ContainerSolver; +import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; +import net.minecraft.item.ItemStack; + +import java.util.HashMap; +import java.util.Map; + +public abstract class ExperimentSolver extends ContainerSolver { + public enum State { + REMEMBER, WAIT, SHOW, END + } + + protected State state = State.REMEMBER; + protected final Map slots = new HashMap<>(); + + protected ExperimentSolver(String containerName) { + super(containerName); + } + + public State getState() { + return state; + } + + public void setState(State state) { + this.state = state; + } + + public Map getSlots() { + return slots; + } + + @Override + protected final boolean isEnabled() { + return isEnabled(SkyblockerConfig.get().general.experiments); + } + + protected abstract boolean isEnabled(SkyblockerConfig.Experiments experimentsConfig); + + @Override + protected void start(GenericContainerScreen screen) { + super.start(screen); + state = State.REMEMBER; + ScreenEvents.afterTick(screen).register(this::tick); + } + + @Override + protected void reset() { + super.reset(); + state = State.REMEMBER; + slots.clear(); + } + + protected abstract void tick(Screen screen); +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/SuperpairsSolver.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/SuperpairsSolver.java new file mode 100644 index 00000000..5a5993bc --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/SuperpairsSolver.java @@ -0,0 +1,44 @@ +package me.xmrvizzy.skyblocker.skyblock.experiment; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.gui.ColorHighlight; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.item.ItemStack; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class SuperpairsSolver extends ExperimentSolver { + private int superpairsPrevClickedSlot; + private ItemStack superpairsCurrentSlot; + private final Set superpairsDuplicatedSlots = new HashSet<>(); + + public SuperpairsSolver() { + super("^Superpairs \\("); + } + + public void setSuperpairsPrevClickedSlot(int superpairsPrevClickedSlot) { + this.superpairsPrevClickedSlot = superpairsPrevClickedSlot; + } + + public void setSuperpairsCurrentSlot(ItemStack superpairsCurrentSlot) { + this.superpairsCurrentSlot = superpairsCurrentSlot; + } + + @Override + protected boolean isEnabled(SkyblockerConfig.Experiments experimentsConfig) { + return experimentsConfig.enableSuperpairsSolver; + } + + @Override + protected void tick(Screen screen) { + + } + + @Override + protected List getColors(String[] groups, Map slots) { + return null; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/UltrasequencerSolver.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/UltrasequencerSolver.java new file mode 100644 index 00000000..8ea44bce --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/UltrasequencerSolver.java @@ -0,0 +1,40 @@ +package me.xmrvizzy.skyblocker.skyblock.experiment; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.gui.ColorHighlight; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.item.ItemStack; + +import java.util.List; +import java.util.Map; + +public class UltrasequencerSolver extends ExperimentSolver { + private int ultrasequencerNextSlot; + + public UltrasequencerSolver() { + super("^Ultrasequencer \\("); + } + + public int getUltrasequencerNextSlot() { + return ultrasequencerNextSlot; + } + + public void setUltrasequencerNextSlot(int ultrasequencerNextSlot) { + this.ultrasequencerNextSlot = ultrasequencerNextSlot; + } + + @Override + protected boolean isEnabled(SkyblockerConfig.Experiments experimentsConfig) { + return experimentsConfig.enableUltrasequencerSolver; + } + + @Override + protected void tick(Screen screen) { + + } + + @Override + protected List getColors(String[] groups, Map slots) { + return null; + } +} -- cgit From 9f302adedceb0ab4f8ecd23cbb416f454fb688af Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Fri, 16 Jun 2023 16:49:38 +0800 Subject: Fix mixin method name --- src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index b8df488c..753ae986 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -73,7 +73,7 @@ public abstract class HandledScreenMixin extends Screen { } @Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;clickSlot(IIILnet/minecraft/screen/slot/SlotActionType;Lnet/minecraft/entity/player/PlayerEntity;)V")) - private void skyblockmod_onSlotClick(Slot slot, int slotId, int button, SlotActionType actionType, CallbackInfo ci) { + private void skyblocker$experimentSolvers$onSlotClick(Slot slot, int slotId, int button, SlotActionType actionType, CallbackInfo ci) { if (slot != null) { ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver(); if (currentSolver instanceof ExperimentSolver experimentSolver && experimentSolver.getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) { -- cgit From 631dd509925041c8ca6b63687fec565ecdff585d Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Fri, 16 Jun 2023 23:34:51 +0800 Subject: Fix currentSolver null crash and refactor mixin --- .../me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java | 6 ++++-- .../me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java | 14 +++++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java index 43bf32d7..0c27704d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/gui/ContainerSolverManager.java @@ -90,8 +90,10 @@ public class ContainerSolverManager { } public void clearScreen() { - currentSolver.reset(); - currentSolver = null; + if (currentSolver != null) { + currentSolver.reset(); + currentSolver = null; + } } public void markDirty() { diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index 753ae986..6d523343 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -19,8 +19,10 @@ import net.minecraft.text.Text; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -62,7 +64,17 @@ public abstract class HandledScreenMixin extends Screen { } } - @Redirect(method = {"drawSlot", "drawMouseoverTooltip"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/screen/slot/Slot;getStack()Lnet/minecraft/item/ItemStack;", ordinal = 0)) + @Redirect(method = "drawMouseoverTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/screen/slot/Slot;getStack()Lnet/minecraft/item/ItemStack;", ordinal = 0)) + private ItemStack skyblocker$experimentSolvers$replaceTooltipDisplayStack(Slot slot) { + return skyblocker$experimentSolvers$getStack(slot); + } + + @ModifyVariable(method = "drawSlot", at = @At(value = "LOAD", ordinal = 10), ordinal = 0) + private ItemStack skyblocker$experimentSolvers$replaceDisplayStack(ItemStack stack, MatrixStack matrices, Slot slot) { + return skyblocker$experimentSolvers$getStack(slot); + } + + @Unique private ItemStack skyblocker$experimentSolvers$getStack(Slot slot) { ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver(); if ((currentSolver instanceof SuperpairsSolver || currentSolver instanceof UltrasequencerSolver) && ((ExperimentSolver) currentSolver).getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) { -- cgit From 28d137d777ad1e78043f4639d8fbadd0d3392d2c Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Wed, 21 Jun 2023 18:08:33 +0800 Subject: Fix HandledScreenMixin for 1.20 --- .../xmrvizzy/skyblocker/mixin/HandledScreenMixin.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index 6d523343..b715560e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -13,6 +13,9 @@ import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.inventory.SimpleInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; import net.minecraft.screen.slot.SlotActionType; import net.minecraft.text.Text; @@ -48,14 +51,15 @@ public abstract class HandledScreenMixin extends Screen { @Inject(at = @At("HEAD"), method = "drawMouseoverTooltip", cancellable = true) public void skyblocker$drawMouseOverTooltip(DrawContext context, int x, int y, CallbackInfo ci) { - //Hide Empty Tooltips - if(this.focusedSlot != null) { + // Hide Empty Tooltips + if (this.focusedSlot != null) { Text stackName = focusedSlot.getStack().getName(); String strName = stackName.getString(); - if(Utils.isOnSkyblock() && SkyblockerConfig.get().general.hideEmptyTooltips && strName.equals(" ")) ci.cancel(); - } + if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.hideEmptyTooltips && strName.equals(" ")) + ci.cancel(); + } - //Backpack Preview + // Backpack Preview String title = this.getTitle().getString(); boolean shiftDown = SkyblockerConfig.get().general.backpackPreviewWithoutShift ^ Screen.hasShiftDown(); if (shiftDown && title.equals("Storage") && this.focusedSlot != null) { @@ -69,8 +73,8 @@ public abstract class HandledScreenMixin extends Screen { return skyblocker$experimentSolvers$getStack(slot); } - @ModifyVariable(method = "drawSlot", at = @At(value = "LOAD", ordinal = 10), ordinal = 0) - private ItemStack skyblocker$experimentSolvers$replaceDisplayStack(ItemStack stack, MatrixStack matrices, Slot slot) { + @ModifyVariable(method = "drawSlot", at = @At(value = "LOAD", ordinal = 4), ordinal = 0) + private ItemStack skyblocker$experimentSolvers$replaceDisplayStack(ItemStack stack, DrawContext context, Slot slot) { return skyblocker$experimentSolvers$getStack(slot); } -- cgit From e4b5090141ff10983c0d443d0f21b0c60d27f049 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Wed, 21 Jun 2023 18:10:26 +0800 Subject: Add null checks --- src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index b715560e..431880e5 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -42,7 +42,7 @@ public abstract class HandledScreenMixin extends Screen { @Inject(at = @At("HEAD"), method = "keyPressed") public void skyblocker$keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable cir) { - if (this.focusedSlot != null) { + if (this.client != null && this.focusedSlot != null) { if (keyCode != 256 && !this.client.options.inventoryKey.matchesKey(keyCode, scanCode)) { if (WikiLookup.wikiLookup.matchesKey(keyCode, scanCode)) WikiLookup.openWiki(this.focusedSlot); } @@ -62,7 +62,7 @@ public abstract class HandledScreenMixin extends Screen { // Backpack Preview String title = this.getTitle().getString(); boolean shiftDown = SkyblockerConfig.get().general.backpackPreviewWithoutShift ^ Screen.hasShiftDown(); - if (shiftDown && title.equals("Storage") && this.focusedSlot != null) { + if (this.client != null && this.client.player != null && this.focusedSlot != null && shiftDown && title.equals("Storage")) { if (this.focusedSlot.inventory == this.client.player.getInventory()) return; if (BackpackPreview.renderPreview(context, this.focusedSlot.getIndex(), x, y)) ci.cancel(); } -- cgit From 9da77e918acd36fa21181db43a80c6ac9429e489 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Wed, 21 Jun 2023 18:20:41 +0800 Subject: Refactor HandledScreenMixin --- .../skyblocker/mixin/HandledScreenMixin.java | 37 ++++++++-------------- 1 file changed, 13 insertions(+), 24 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index 431880e5..aefe11c6 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -42,29 +42,22 @@ public abstract class HandledScreenMixin extends Screen { @Inject(at = @At("HEAD"), method = "keyPressed") public void skyblocker$keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable cir) { - if (this.client != null && this.focusedSlot != null) { - if (keyCode != 256 && !this.client.options.inventoryKey.matchesKey(keyCode, scanCode)) { - if (WikiLookup.wikiLookup.matchesKey(keyCode, scanCode)) WikiLookup.openWiki(this.focusedSlot); - } + if (this.client != null && this.focusedSlot != null && keyCode != 256 && !this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && WikiLookup.wikiLookup.matchesKey(keyCode, scanCode)) { + WikiLookup.openWiki(this.focusedSlot); } } @Inject(at = @At("HEAD"), method = "drawMouseoverTooltip", cancellable = true) public void skyblocker$drawMouseOverTooltip(DrawContext context, int x, int y, CallbackInfo ci) { // Hide Empty Tooltips - if (this.focusedSlot != null) { - Text stackName = focusedSlot.getStack().getName(); - String strName = stackName.getString(); - if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.hideEmptyTooltips && strName.equals(" ")) - ci.cancel(); + if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.hideEmptyTooltips && this.focusedSlot != null && focusedSlot.getStack().getName().getString().equals(" ")) { + ci.cancel(); } // Backpack Preview - String title = this.getTitle().getString(); boolean shiftDown = SkyblockerConfig.get().general.backpackPreviewWithoutShift ^ Screen.hasShiftDown(); - if (this.client != null && this.client.player != null && this.focusedSlot != null && shiftDown && title.equals("Storage")) { - if (this.focusedSlot.inventory == this.client.player.getInventory()) return; - if (BackpackPreview.renderPreview(context, this.focusedSlot.getIndex(), x, y)) ci.cancel(); + if (this.client != null && this.client.player != null && this.focusedSlot != null && shiftDown && this.getTitle().getString().equals("Storage") && this.focusedSlot.inventory != this.client.player.getInventory() && BackpackPreview.renderPreview(context, this.focusedSlot.getIndex(), x, y)) { + ci.cancel(); } } @@ -93,21 +86,17 @@ public abstract class HandledScreenMixin extends Screen { if (slot != null) { ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver(); if (currentSolver instanceof ExperimentSolver experimentSolver && experimentSolver.getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) { - if (currentSolver instanceof ChronomatronSolver chronomatronSolver) { + if (experimentSolver instanceof ChronomatronSolver chronomatronSolver) { Item item = chronomatronSolver.getChronomatronSlots().get(chronomatronSolver.getChronomatronCurrentOrdinal()); - if (slot.getStack().isOf(item) || ChronomatronSolver.TERRACOTTA_TO_GLASS.get(slot.getStack().getItem()) == item) { - if (chronomatronSolver.incrementChronomatronCurrentOrdinal() >= chronomatronSolver.getChronomatronSlots().size()) { - chronomatronSolver.setState(ExperimentSolver.State.END); - } + if ((slot.getStack().isOf(item) || ChronomatronSolver.TERRACOTTA_TO_GLASS.get(slot.getStack().getItem()) == item) && chronomatronSolver.incrementChronomatronCurrentOrdinal() >= chronomatronSolver.getChronomatronSlots().size()) { + chronomatronSolver.setState(ExperimentSolver.State.END); } - } else if (currentSolver instanceof SuperpairsSolver superpairsSolver) { + } else if (experimentSolver instanceof SuperpairsSolver superpairsSolver) { superpairsSolver.setSuperpairsPrevClickedSlot(slot.getIndex()); superpairsSolver.setSuperpairsCurrentSlot(ItemStack.EMPTY); - } else if (currentSolver instanceof UltrasequencerSolver ultrasequencerSolver) { - if (slot.getIndex() == ultrasequencerSolver.getUltrasequencerNextSlot()) { - int count = ultrasequencerSolver.getSlots().get(ultrasequencerSolver.getUltrasequencerNextSlot()).getCount() + 1; - ultrasequencerSolver.getSlots().entrySet().stream().filter(entry -> entry.getValue().getCount() == count).findAny().ifPresentOrElse((entry) -> ultrasequencerSolver.setUltrasequencerNextSlot(entry.getKey()), () -> ultrasequencerSolver.setState(ExperimentSolver.State.END)); - } + } else if (experimentSolver instanceof UltrasequencerSolver ultrasequencerSolver && slot.getIndex() == ultrasequencerSolver.getUltrasequencerNextSlot()) { + int count = ultrasequencerSolver.getSlots().get(ultrasequencerSolver.getUltrasequencerNextSlot()).getCount() + 1; + ultrasequencerSolver.getSlots().entrySet().stream().filter(entry -> entry.getValue().getCount() == count).findAny().ifPresentOrElse((entry) -> ultrasequencerSolver.setUltrasequencerNextSlot(entry.getKey()), () -> ultrasequencerSolver.setState(ExperimentSolver.State.END)); } } } -- cgit From 384f75a5aec98713d719f01662fc95464bed84f3 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Mon, 26 Jun 2023 02:24:56 -0400 Subject: Add Mirrorverse Waypoints + Rift Fixes --- .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 2 + .../skyblocker/config/SkyblockerConfig.java | 8 + .../xmrvizzy/skyblocker/mixin/InGameHudMixin.java | 7 +- .../skyblocker/mixin/accessor/FrustumInvoker.java | 17 + .../skyblocker/skyblock/FancyStatusBars.java | 5 +- .../skyblocker/skyblock/dungeon/Trivia.java | 4 +- .../skyblock/rift/MirrorverseWaypoints.java | 101 ++ .../xmrvizzy/skyblocker/skyblock/rift/TheRift.java | 11 + .../resources/assets/skyblocker/lang/en_us.json | 3 + .../assets/skyblocker/mirrorverse_waypoints.json | 1019 ++++++++++++++++++++ src/main/resources/skyblocker.mixins.json | 3 +- 11 files changed, 1173 insertions(+), 7 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java create mode 100644 src/main/resources/assets/skyblocker/mirrorverse_waypoints.json (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index add81791..a629f851 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -16,6 +16,7 @@ import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup; import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; import me.xmrvizzy.skyblocker.skyblock.quicknav.QuickNav; +import me.xmrvizzy.skyblocker.skyblock.rift.TheRift; import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.utils.*; @@ -82,6 +83,7 @@ public class SkyblockerMod implements ClientModInitializer { FairySouls.init(); TabHud.init(); DungeonMap.init(); + TheRift.init(); containerSolverManager.init(); scheduler.scheduleCyclic(Utils::update, 20); scheduler.scheduleCyclic(DiscordRPCManager::updateDataAndPresence, 100); diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 5621a258..988f5f77 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -289,6 +289,10 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.Category("dwarvenmines") @ConfigEntry.Gui.CollapsibleObject() public DwarvenMines dwarvenMines = new DwarvenMines(); + + @ConfigEntry.Category("rift") + @ConfigEntry.Gui.CollapsibleObject() + public Rift rift = new Rift(); } public static class Dungeons { @@ -357,6 +361,10 @@ public class SkyblockerConfig implements ConfigData { public boolean solveHungryHiker = true; public boolean solveTreasureHunter = true; } + + public static class Rift { + public boolean mirrorverseWaypoints = true; + } public static class Messages { @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java index 335737a1..4c89d497 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java @@ -6,6 +6,7 @@ import me.xmrvizzy.skyblocker.skyblock.FancyStatusBars; import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock; import me.xmrvizzy.skyblocker.skyblock.StatusBarTracker; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonMap; +import me.xmrvizzy.skyblocker.skyblock.rift.TheRift; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -53,7 +54,7 @@ public abstract class InGameHudMixin { @Inject(method = "setOverlayMessage(Lnet/minecraft/text/Text;Z)V", at = @At("HEAD"), cancellable = true) private void skyblocker$onSetOverlayMessage(Text message, boolean tinted, CallbackInfo ci) { - if (!Utils.isOnSkyblock() || !SkyblockerConfig.get().general.bars.enableBars) + if (!Utils.isOnSkyblock() || !SkyblockerConfig.get().general.bars.enableBars || Utils.getLocationRaw().equals(TheRift.LOCATION)) return; String msg = message.getString(); String res = statusBarTracker.update(msg, SkyblockerConfig.get().messages.hideMana); @@ -84,7 +85,7 @@ public abstract class InGameHudMixin { @Inject(method = "renderExperienceBar", at = @At("HEAD"), cancellable = true) private void skyblocker$renderExperienceBar(DrawContext context, int x, CallbackInfo ci) { - if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars) + if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars && !Utils.getLocationRaw().equals(TheRift.LOCATION)) ci.cancel(); } @@ -103,7 +104,7 @@ public abstract class InGameHudMixin { @Inject(method = "renderMountHealth", at = @At("HEAD"), cancellable = true) private void skyblocker$renderMountHealth(DrawContext context, CallbackInfo ci) { - if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars) + if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars && !Utils.getLocationRaw().equals(TheRift.LOCATION)) ci.cancel(); } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java new file mode 100644 index 00000000..f086b9e5 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java @@ -0,0 +1,17 @@ +package me.xmrvizzy.skyblocker.mixin.accessor; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.client.render.Frustum; + +/** + * For the purpose of avoiding object allocations! + * + */ +@Mixin(Frustum.class) +public interface FrustumInvoker { + + @Invoker("isVisible") + public boolean isVisible(double minX, double minY, double minZ, double maxX, double maxY, double maxZ); +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java index 6af06e6d..8e0d43da 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java @@ -2,6 +2,8 @@ package me.xmrvizzy.skyblocker.skyblock; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.skyblock.rift.TheRift; +import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; @@ -9,6 +11,7 @@ import net.minecraft.util.Identifier; public class FancyStatusBars { private static final Identifier BARS = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/bars.png"); + private static final String RIFT_LOCATION = "rift"; private final MinecraftClient client = MinecraftClient.getInstance(); private final StatusBarTracker statusBarTracker = SkyblockerMod.getInstance().statusBarTracker; @@ -39,7 +42,7 @@ public class FancyStatusBars { public boolean render(DrawContext context, int scaledWidth, int scaledHeight) { var player = client.player; - if (!SkyblockerConfig.get().general.bars.enableBars || player == null) + if (!SkyblockerConfig.get().general.bars.enableBars || player == null || Utils.getLocationRaw().equals(TheRift.LOCATION)) return false; anchorsX[0] = scaledWidth / 2 - 91; anchorsY[0] = scaledHeight - 33; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java index 10a2e413..f7598af5 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java @@ -69,7 +69,7 @@ public class Trivia extends ChatPatternListener { answers.put("What is the status of Storm?", new String[]{"The Wither Lords"}); answers.put("What is the status of Necron?", new String[]{"The Wither Lords"}); answers.put("What is the status of Maxor, Storm, Goldor and Necron?", new String[]{"The Wither Lords"}); - answers.put("How many total Fairy Souls are there?", new String[]{"240 Fairy Souls"}); + answers.put("How many total Fairy Souls are there?", new String[]{"242 Fairy Souls"}); answers.put("How many Fairy Souls are there in Spider's Den?", new String[]{"19 Fairy Souls"}); answers.put("How many Fairy Souls are there in The End?", new String[]{"12 Fairy Souls"}); answers.put("How many Fairy Souls are there in The Farming Islands?", new String[]{"20 Fairy Souls"}); @@ -87,7 +87,7 @@ public class Trivia extends ChatPatternListener { answers.put("What is the name of the person that upgrades pets?", new String[]{"Kat"}); answers.put("What is the name of the lady of the Nether?", new String[]{"Elle"}); answers.put("Which villager in the Village gives you a Rogue Sword?", new String[]{"Jamie"}); - answers.put("How many unique minions are there?", new String[]{"58 Minions"}); + answers.put("How many unique minions are there?", new String[]{"59 Minions"}); answers.put("Which of these enemies does not spawn in the Spider's Den?", new String[]{"Zombie Spider", "Cave Spider", "Wither Skeleton", "Dashing Spooder", "Broodfather", "Night Spider"}); answers.put("Which of these monsters only spawns at night?", new String[]{"Zombie Villager", "Ghast"}); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java new file mode 100644 index 00000000..c0493d18 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java @@ -0,0 +1,101 @@ +package me.xmrvizzy.skyblocker.skyblock.rift; + +import java.awt.Color; +import java.io.BufferedReader; +import java.io.IOException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import me.x150.renderer.render.Renderer3d; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.mixin.accessor.FrustumInvoker; +import me.xmrvizzy.skyblocker.utils.FrustumUtils; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.minecraft.client.MinecraftClient; +import net.minecraft.util.DyeColor; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class MirrorverseWaypoints { + private static final Logger LOGGER = LoggerFactory.getLogger("skyblocker"); + private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); + private static final Identifier WAYPOINTS_JSON = new Identifier("skyblocker", "mirrorverse_waypoints.json"); + private static final BlockPos[] LAVA_PATH_WAYPOINTS = new BlockPos[107]; + private static final BlockPos[] UPSIDE_DOWN_WAYPOINTS = new BlockPos[66]; + private static final BlockPos[] TURBULATOR_WAYPOINTS = new BlockPos[27]; + private static final float[] COLOR_COMPONENTS = DyeColor.RED.getColorComponents(); + private static final Vec3d ONE = new Vec3d(1, 1, 1); + + static { + loadWaypoints(); + } + + /** + * Loads the waypoint locations into memory + */ + public static void loadWaypoints() { + try(BufferedReader reader = CLIENT.getResourceManager().openAsReader(WAYPOINTS_JSON)) { + JsonObject file = JsonParser.parseReader(reader).getAsJsonObject(); + JsonArray sections = file.get("sections").getAsJsonArray(); + + /// Lava Path + JsonArray lavaPathWaypoints = sections.get(0).getAsJsonObject().get("waypoints").getAsJsonArray(); + + for(int i = 0; i < lavaPathWaypoints.size(); i++) { + JsonObject point = lavaPathWaypoints.get(i).getAsJsonObject(); + LAVA_PATH_WAYPOINTS[i] = new BlockPos(point.get("x").getAsInt(), point.get("y").getAsInt(), point.get("z").getAsInt()); + } + + /// Upside Down Parkour + JsonArray upsideDownParkourWaypoints = sections.get(1).getAsJsonObject().get("waypoints").getAsJsonArray(); + + for(int i = 0; i < upsideDownParkourWaypoints.size(); i++) { + JsonObject point = upsideDownParkourWaypoints.get(i).getAsJsonObject(); + UPSIDE_DOWN_WAYPOINTS[i] = new BlockPos(point.get("x").getAsInt(), point.get("y").getAsInt(), point.get("z").getAsInt()); + } + + /// Turbulator Parkour + JsonArray turbulatorParkourWaypoints = sections.get(2).getAsJsonObject().get("waypoints").getAsJsonArray(); + + for(int i = 0; i < turbulatorParkourWaypoints.size(); i++) { + JsonObject point = turbulatorParkourWaypoints.get(i).getAsJsonObject(); + TURBULATOR_WAYPOINTS[i] = new BlockPos(point.get("x").getAsInt(), point.get("y").getAsInt(), point.get("z").getAsInt()); + } + + } catch (IOException e) { + LOGGER.info("[Skyblocker] Mirrorverse Waypoints failed to load ;("); + e.printStackTrace(); + } + } + + public static void render(WorldRenderContext wrc) { + FrustumInvoker frustum = ((FrustumInvoker) FrustumUtils.getFrustum()); + //I would also check for the mirrorverse location but the scoreboard stuff is not performant at all... + if(Utils.getLocationRaw().equals(TheRift.LOCATION) && SkyblockerConfig.get().locations.rift.mirrorverseWaypoints) { + for(BlockPos pos : LAVA_PATH_WAYPOINTS) { + if(frustum.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { + Renderer3d.renderFilled(wrc.matrixStack(), new Color(COLOR_COMPONENTS[0], COLOR_COMPONENTS[1], COLOR_COMPONENTS[2], 0.5f), Vec3d.of(pos), ONE); + }; + } + + for(BlockPos pos : UPSIDE_DOWN_WAYPOINTS) { + if(frustum.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { + Renderer3d.renderFilled(wrc.matrixStack(), new Color(COLOR_COMPONENTS[0], COLOR_COMPONENTS[1], COLOR_COMPONENTS[2], 0.5f), Vec3d.of(pos), ONE); + }; + } + + for(BlockPos pos : TURBULATOR_WAYPOINTS) { + if(frustum.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { + Renderer3d.renderFilled(wrc.matrixStack(), new Color(COLOR_COMPONENTS[0], COLOR_COMPONENTS[1], COLOR_COMPONENTS[2], 0.5f), Vec3d.of(pos), ONE); + }; + } + } + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java new file mode 100644 index 00000000..24f92238 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java @@ -0,0 +1,11 @@ +package me.xmrvizzy.skyblocker.skyblock.rift; + +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; + +public class TheRift { + public static final String LOCATION = "rift"; + + public static void init() { + WorldRenderEvents.AFTER_TRANSLUCENT.register(MirrorverseWaypoints::render); + } +} diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index f2eec8fd..d18e180e 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -200,6 +200,9 @@ "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enableBackground": "Enable Background", "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.x": "X", "text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.y": "Y", + + "text.autoconfig.skyblocker.option.locations.rift": "The Rift", + "text.autoconfig.skyblocker.option.locations.rift.mirrorverseWaypoints": "Enable Mirrorverse Waypoints", "text.autoconfig.skyblocker.category.messages": "Messages", "text.autoconfig.skyblocker.option.messages.chatFilterResult.PASS": "Disabled", diff --git a/src/main/resources/assets/skyblocker/mirrorverse_waypoints.json b/src/main/resources/assets/skyblocker/mirrorverse_waypoints.json new file mode 100644 index 00000000..2bc0296e --- /dev/null +++ b/src/main/resources/assets/skyblocker/mirrorverse_waypoints.json @@ -0,0 +1,1019 @@ +{ + "sections": [ + { + "name": "Lava Path", + "waypoints": [ + { + "x": -101, + "y": 52, + "z": -116 + }, + { + "x": -99, + "y": 52, + "z": -110 + }, + { + "x": -95, + "y": 52, + "z": -108 + }, + { + "x": -88, + "y": 52, + "z": -107 + }, + { + "x": -95, + "y": 52, + "z": -114 + }, + { + "x": -95, + "y": 52, + "z": -109 + }, + { + "x": -84, + "y": 52, + "z": -112 + }, + { + "x": -91, + "y": 52, + "z": -108 + }, + { + "x": -94, + "y": 52, + "z": -116 + }, + { + "x": -88, + "y": 52, + "z": -112 + }, + { + "x": -101, + "y": 52, + "z": -108 + }, + { + "x": -94, + "y": 52, + "z": -114 + }, + { + "x": -85, + "y": 52, + "z": -112 + }, + { + "x": -88, + "y": 52, + "z": -114 + }, + { + "x": -90, + "y": 52, + "z": -110 + }, + { + "x": -84, + "y": 52, + "z": -113 + }, + { + "x": -90, + "y": 52, + "z": -116 + }, + { + "x": -105, + "y": 52, + "z": -113 + }, + { + "x": -82, + "y": 52, + "z": -112 + }, + { + "x": -90, + "y": 52, + "z": -112 + }, + { + "x": -88, + "y": 52, + "z": -111 + }, + { + "x": -82, + "y": 52, + "z": -111 + }, + { + "x": -104, + "y": 52, + "z": -112 + }, + { + "x": -87, + "y": 52, + "z": -107 + }, + { + "x": -100, + "y": 52, + "z": -108 + }, + { + "x": -86, + "y": 52, + "z": -109 + }, + { + "x": -91, + "y": 52, + "z": -110 + }, + { + "x": -96, + "y": 52, + "z": -108 + }, + { + "x": -102, + "y": 52, + "z": -111 + }, + { + "x": -96, + "y": 52, + "z": -115 + }, + { + "x": -97, + "y": 52, + "z": -116 + }, + { + "x": -83, + "y": 52, + "z": -111 + }, + { + "x": -84, + "y": 52, + "z": -107 + }, + { + "x": -90, + "y": 52, + "z": -115 + }, + { + "x": -86, + "y": 52, + "z": -107 + }, + { + "x": -97, + "y": 52, + "z": -112 + }, + { + "x": -86, + "y": 52, + "z": -113 + }, + { + "x": -92, + "y": 52, + "z": -110 + }, + { + "x": -95, + "y": 52, + "z": -111 + }, + { + "x": -90, + "y": 52, + "z": -114 + }, + { + "x": -93, + "y": 52, + "z": -108 + }, + { + "x": -98, + "y": 52, + "z": -116 + }, + { + "x": -98, + "y": 52, + "z": -115 + }, + { + "x": -90, + "y": 52, + "z": -107 + }, + { + "x": -98, + "y": 52, + "z": -112 + }, + { + "x": -98, + "y": 52, + "z": -109 + }, + { + "x": -98, + "y": 52, + "z": -113 + }, + { + "x": -100, + "y": 52, + "z": -116 + }, + { + "x": -96, + "y": 52, + "z": -114 + }, + { + "x": -86, + "y": 52, + "z": -110 + }, + { + "x": -93, + "y": 52, + "z": -109 + }, + { + "x": -88, + "y": 52, + "z": -110 + }, + { + "x": -94, + "y": 52, + "z": -115 + }, + { + "x": -84, + "y": 52, + "z": -111 + }, + { + "x": -84, + "y": 52, + "z": -108 + }, + { + "x": -86, + "y": 52, + "z": -115 + }, + { + "x": -98, + "y": 52, + "z": -110 + }, + { + "x": -102, + "y": 52, + "z": -108 + }, + { + "x": -92, + "y": 52, + "z": -114 + }, + { + "x": -102, + "y": 52, + "z": -114 + }, + { + "x": -85, + "y": 52, + "z": -109 + }, + { + "x": -86, + "y": 52, + "z": -112 + }, + { + "x": -104, + "y": 52, + "z": -113 + }, + { + "x": -105, + "y": 52, + "z": -112 + }, + { + "x": -91, + "y": 52, + "z": -114 + }, + { + "x": -100, + "y": 52, + "z": -112 + }, + { + "x": -93, + "y": 52, + "z": -110 + }, + { + "x": -91, + "y": 52, + "z": -112 + }, + { + "x": -101, + "y": 52, + "z": -112 + }, + { + "x": -92, + "y": 52, + "z": -108 + }, + { + "x": -82, + "y": 52, + "z": -113 + }, + { + "x": -87, + "y": 52, + "z": -115 + }, + { + "x": -84, + "y": 52, + "z": -109 + }, + { + "x": -88, + "y": 52, + "z": -113 + }, + { + "x": -92, + "y": 52, + "z": -116 + }, + { + "x": -96, + "y": 52, + "z": -111 + }, + { + "x": -96, + "y": 52, + "z": -116 + }, + { + "x": -98, + "y": 52, + "z": -108 + }, + { + "x": -98, + "y": 52, + "z": -114 + }, + { + "x": -96, + "y": 52, + "z": -112 + }, + { + "x": -85, + "y": 52, + "z": -107 + }, + { + "x": -102, + "y": 52, + "z": -115 + }, + { + "x": -87, + "y": 52, + "z": -110 + }, + { + "x": -100, + "y": 52, + "z": -113 + }, + { + "x": -103, + "y": 52, + "z": -114 + }, + { + "x": -102, + "y": 52, + "z": -116 + }, + { + "x": -95, + "y": 52, + "z": -110 + }, + { + "x": -89, + "y": 52, + "z": -107 + }, + { + "x": -92, + "y": 52, + "z": -113 + }, + { + "x": -100, + "y": 52, + "z": -110 + }, + { + "x": -100, + "y": 52, + "z": -115 + }, + { + "x": -86, + "y": 52, + "z": -114 + }, + { + "x": -88, + "y": 52, + "z": -115 + }, + { + "x": -92, + "y": 52, + "z": -112 + }, + { + "x": -100, + "y": 52, + "z": -114 + }, + { + "x": -91, + "y": 52, + "z": -116 + }, + { + "x": -102, + "y": 52, + "z": -110 + }, + { + "x": -102, + "y": 52, + "z": -112 + }, + { + "x": -93, + "y": 52, + "z": -116 + }, + { + "x": -90, + "y": 52, + "z": -111 + }, + { + "x": -104, + "y": 52, + "z": -114 + }, + { + "x": -83, + "y": 52, + "z": -112 + }, + { + "x": -83, + "y": 52, + "z": -113 + }, + { + "x": -100, + "y": 52, + "z": -109 + }, + { + "x": -102, + "y": 52, + "z": -109 + }, + { + "x": -90, + "y": 52, + "z": -108 + }, + { + "x": -97, + "y": 52, + "z": -108 + } + ] + }, + { + "name": "Upside Down Parkour", + "waypoints": [ + { + "x": -137, + "y": 39, + "z": -104 + }, + { + "x": -169, + "y": 42, + "z": -116 + }, + { + "x": -173, + "y": 43, + "z": -112 + }, + { + "x": -197, + "y": 39, + "z": -92 + }, + { + "x": -161, + "y": 39, + "z": -92 + }, + { + "x": -137, + "y": 40, + "z": -116 + }, + { + "x": -213, + "y": 41, + "z": -116 + }, + { + "x": -173, + "y": 41, + "z": -96 + }, + { + "x": -205, + "y": 41, + "z": -100 + }, + { + "x": -205, + "y": 43, + "z": -108 + }, + { + "x": -137, + "y": 41, + "z": -96 + }, + { + "x": -145, + "y": 40, + "z": -104 + }, + { + "x": -149, + "y": 43, + "z": -112 + }, + { + "x": -189, + "y": 42, + "z": -120 + }, + { + "x": -157, + "y": 41, + "z": -104 + }, + { + "x": -189, + "y": 43, + "z": -116 + }, + { + "x": -193, + "y": 42, + "z": -104 + }, + { + "x": -161, + "y": 40, + "z": -120 + }, + { + "x": -221, + "y": 43, + "z": -104 + }, + { + "x": -185, + "y": 41, + "z": -108 + }, + { + "x": -141, + "y": 41, + "z": -120 + }, + { + "x": -157, + "y": 39, + "z": -116 + }, + { + "x": -153, + "y": 40, + "z": -100 + }, + { + "x": -209, + "y": 43, + "z": -120 + }, + { + "x": -129, + "y": 39, + "z": -108 + }, + { + "x": -189, + "y": 43, + "z": -100 + }, + { + "x": -141, + "y": 42, + "z": -100 + }, + { + "x": -133, + "y": 40, + "z": -108 + }, + { + "x": -209, + "y": 42, + "z": -104 + }, + { + "x": -173, + "y": 41, + "z": -100 + }, + { + "x": -189, + "y": 43, + "z": -112 + }, + { + "x": -145, + "y": 40, + "z": -108 + }, + { + "x": -217, + "y": 42, + "z": -108 + }, + { + "x": -169, + "y": 41, + "z": -120 + }, + { + "x": -165, + "y": 43, + "z": -109 + }, + { + "x": -145, + "y": 42, + "z": -116 + }, + { + "x": -165, + "y": 42, + "z": -104 + }, + { + "x": -181, + "y": 40, + "z": -112 + }, + { + "x": -193, + "y": 41, + "z": -108 + }, + { + "x": -201, + "y": 40, + "z": -96 + }, + { + "x": -137, + "y": 41, + "z": -124 + }, + { + "x": -173, + "y": 43, + "z": -108 + }, + { + "x": -133, + "y": 40, + "z": -100 + }, + { + "x": -201, + "y": 40, + "z": -116 + }, + { + "x": -185, + "y": 41, + "z": -108 + }, + { + "x": -125, + "y": 39, + "z": -108 + }, + { + "x": -161, + "y": 42, + "z": -112 + }, + { + "x": -165, + "y": 40, + "z": -96 + }, + { + "x": -141, + "y": 39, + "z": -112 + }, + { + "x": -177, + "y": 39, + "z": -92 + }, + { + "x": -213, + "y": 41, + "z": -112 + }, + { + "x": -153, + "y": 42, + "z": -108 + }, + { + "x": -205, + "y": 42, + "z": -120 + }, + { + "x": -197, + "y": 43, + "z": -112 + }, + { + "x": -181, + "y": 42, + "z": -104 + }, + { + "x": -165, + "y": 41, + "z": -100 + }, + { + "x": -193, + "y": 42, + "z": -96 + }, + { + "x": -133, + "y": 40, + "z": -120 + }, + { + "x": -185, + "y": 41, + "z": -100 + }, + { + "x": -165, + "y": 41, + "z": -124 + }, + { + "x": -177, + "y": 40, + "z": -104 + }, + { + "x": -157, + "y": 40, + "z": -96 + }, + { + "x": -205, + "y": 41, + "z": -116 + }, + { + "x": -181, + "y": 40, + "z": -96 + }, + { + "x": -201, + "y": 43, + "z": -108 + }, + { + "x": -185, + "y": 41, + "z": -116 + } + ] + }, + { + "name": "Turbulator Parkour", + "waypoints": [ + { + "x": -302, + "y": 34, + "z": -107 + }, + { + "x": -304, + "y": 52, + "z": -109 + }, + { + "x": -306, + "y": 16, + "z": -107 + }, + { + "x": -304, + "y": 12, + "z": -107 + }, + { + "x": -308, + "y": 6, + "z": -105 + }, + { + "x": -302, + "y": 44, + "z": -107 + }, + { + "x": -306, + "y": 24, + "z": -109 + }, + { + "x": -302, + "y": 18, + "z": -111 + }, + { + "x": -300, + "y": 36, + "z": -109 + }, + { + "x": -304, + "y": 30, + "z": -103 + }, + { + "x": -302, + "y": 26, + "z": -111 + }, + { + "x": -308, + "y": 14, + "z": -103 + }, + { + "x": -300, + "y": 46, + "z": -103 + }, + { + "x": -300, + "y": 10, + "z": -111 + }, + { + "x": -300, + "y": 20, + "z": -107 + }, + { + "x": -306, + "y": 54, + "z": -111 + }, + { + "x": -306, + "y": 4, + "z": -103 + }, + { + "x": -300, + "y": 28, + "z": -107 + }, + { + "x": -306, + "y": 42, + "z": -111 + }, + { + "x": -308, + "y": 50, + "z": -105 + }, + { + "x": -304, + "y": 48, + "z": -107 + }, + { + "x": -302, + "y": 38, + "z": -105 + }, + { + "x": -304, + "y": 22, + "z": -111 + }, + { + "x": -304, + "y": 2, + "z": -107 + }, + { + "x": -304, + "y": 40, + "z": -107 + }, + { + "x": -306, + "y": 32, + "z": -105 + }, + { + "x": -304, + "y": 8, + "z": -109 + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index 253e42d7..701d54e5 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -18,7 +18,8 @@ "PlayerListHudAccessor", "PlayerListHudMixin", "RecipeBookWidgetAccessor", - "accessor.BeaconBlockEntityRendererInvoker" + "accessor.BeaconBlockEntityRendererInvoker", + "accessor.FrustumInvoker" ], "injectors": { "defaultRequire": 1 -- cgit From 5764eed4cfd41e78a8cc1bb6ceb51fc0f5b84d9c Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Mon, 26 Jun 2023 19:39:18 +0800 Subject: Refactor MirrorverseWaypoints --- .../skyblocker/mixin/accessor/FrustumInvoker.java | 12 ++-- .../skyblock/rift/MirrorverseWaypoints.java | 73 +++++++++------------- .../me/xmrvizzy/skyblocker/utils/FrustumUtils.java | 5 ++ .../me/xmrvizzy/skyblocker/utils/RenderHelper.java | 12 +++- 4 files changed, 51 insertions(+), 51 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java index f086b9e5..108a7344 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java @@ -1,17 +1,15 @@ package me.xmrvizzy.skyblocker.mixin.accessor; +import me.xmrvizzy.skyblocker.utils.FrustumUtils; +import net.minecraft.client.render.Frustum; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -import net.minecraft.client.render.Frustum; - /** - * For the purpose of avoiding object allocations! - * + * Use {@link FrustumUtils#isVisible(double, double, double, double, double, double) FrustumUtils#isVisible} which is shorter. For the purpose of avoiding object allocations! */ @Mixin(Frustum.class) public interface FrustumInvoker { - - @Invoker("isVisible") - public boolean isVisible(double minX, double minY, double minZ, double maxX, double maxY, double maxZ); + @Invoker("isVisible") + boolean isVisible(double minX, double minY, double minZ, double maxX, double maxY, double maxZ); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java index c0493d18..630d953b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java @@ -1,74 +1,68 @@ package me.xmrvizzy.skyblocker.skyblock.rift; -import java.awt.Color; -import java.io.BufferedReader; -import java.io.IOException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; - -import me.x150.renderer.render.Renderer3d; +import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.mixin.accessor.FrustumInvoker; -import me.xmrvizzy.skyblocker.utils.FrustumUtils; +import me.xmrvizzy.skyblocker.utils.RenderHelper; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.minecraft.client.MinecraftClient; import net.minecraft.util.DyeColor; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.IOException; public class MirrorverseWaypoints { private static final Logger LOGGER = LoggerFactory.getLogger("skyblocker"); private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); - private static final Identifier WAYPOINTS_JSON = new Identifier("skyblocker", "mirrorverse_waypoints.json"); + private static final Identifier WAYPOINTS_JSON = new Identifier(SkyblockerMod.NAMESPACE, "mirrorverse_waypoints.json"); private static final BlockPos[] LAVA_PATH_WAYPOINTS = new BlockPos[107]; private static final BlockPos[] UPSIDE_DOWN_WAYPOINTS = new BlockPos[66]; private static final BlockPos[] TURBULATOR_WAYPOINTS = new BlockPos[27]; private static final float[] COLOR_COMPONENTS = DyeColor.RED.getColorComponents(); - private static final Vec3d ONE = new Vec3d(1, 1, 1); - + static { loadWaypoints(); } - + /** * Loads the waypoint locations into memory */ public static void loadWaypoints() { - try(BufferedReader reader = CLIENT.getResourceManager().openAsReader(WAYPOINTS_JSON)) { + try (BufferedReader reader = CLIENT.getResourceManager().openAsReader(WAYPOINTS_JSON)) { JsonObject file = JsonParser.parseReader(reader).getAsJsonObject(); JsonArray sections = file.get("sections").getAsJsonArray(); - + /// Lava Path JsonArray lavaPathWaypoints = sections.get(0).getAsJsonObject().get("waypoints").getAsJsonArray(); - - for(int i = 0; i < lavaPathWaypoints.size(); i++) { + + for (int i = 0; i < lavaPathWaypoints.size(); i++) { JsonObject point = lavaPathWaypoints.get(i).getAsJsonObject(); LAVA_PATH_WAYPOINTS[i] = new BlockPos(point.get("x").getAsInt(), point.get("y").getAsInt(), point.get("z").getAsInt()); } - + /// Upside Down Parkour JsonArray upsideDownParkourWaypoints = sections.get(1).getAsJsonObject().get("waypoints").getAsJsonArray(); - - for(int i = 0; i < upsideDownParkourWaypoints.size(); i++) { + + for (int i = 0; i < upsideDownParkourWaypoints.size(); i++) { JsonObject point = upsideDownParkourWaypoints.get(i).getAsJsonObject(); UPSIDE_DOWN_WAYPOINTS[i] = new BlockPos(point.get("x").getAsInt(), point.get("y").getAsInt(), point.get("z").getAsInt()); } - + /// Turbulator Parkour JsonArray turbulatorParkourWaypoints = sections.get(2).getAsJsonObject().get("waypoints").getAsJsonArray(); - - for(int i = 0; i < turbulatorParkourWaypoints.size(); i++) { + + for (int i = 0; i < turbulatorParkourWaypoints.size(); i++) { JsonObject point = turbulatorParkourWaypoints.get(i).getAsJsonObject(); TURBULATOR_WAYPOINTS[i] = new BlockPos(point.get("x").getAsInt(), point.get("y").getAsInt(), point.get("z").getAsInt()); } - + } catch (IOException e) { LOGGER.info("[Skyblocker] Mirrorverse Waypoints failed to load ;("); e.printStackTrace(); @@ -76,25 +70,18 @@ public class MirrorverseWaypoints { } public static void render(WorldRenderContext wrc) { - FrustumInvoker frustum = ((FrustumInvoker) FrustumUtils.getFrustum()); //I would also check for the mirrorverse location but the scoreboard stuff is not performant at all... - if(Utils.getLocationRaw().equals(TheRift.LOCATION) && SkyblockerConfig.get().locations.rift.mirrorverseWaypoints) { - for(BlockPos pos : LAVA_PATH_WAYPOINTS) { - if(frustum.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { - Renderer3d.renderFilled(wrc.matrixStack(), new Color(COLOR_COMPONENTS[0], COLOR_COMPONENTS[1], COLOR_COMPONENTS[2], 0.5f), Vec3d.of(pos), ONE); - }; + if (Utils.getLocationRaw().equals(TheRift.LOCATION) && SkyblockerConfig.get().locations.rift.mirrorverseWaypoints) { + for (BlockPos pos : LAVA_PATH_WAYPOINTS) { + RenderHelper.renderFilledIfVisible(wrc, pos, COLOR_COMPONENTS, 0.5f); } - - for(BlockPos pos : UPSIDE_DOWN_WAYPOINTS) { - if(frustum.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { - Renderer3d.renderFilled(wrc.matrixStack(), new Color(COLOR_COMPONENTS[0], COLOR_COMPONENTS[1], COLOR_COMPONENTS[2], 0.5f), Vec3d.of(pos), ONE); - }; + + for (BlockPos pos : UPSIDE_DOWN_WAYPOINTS) { + RenderHelper.renderFilledIfVisible(wrc, pos, COLOR_COMPONENTS, 0.5f); } - - for(BlockPos pos : TURBULATOR_WAYPOINTS) { - if(frustum.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { - Renderer3d.renderFilled(wrc.matrixStack(), new Color(COLOR_COMPONENTS[0], COLOR_COMPONENTS[1], COLOR_COMPONENTS[2], 0.5f), Vec3d.of(pos), ONE); - }; + + for (BlockPos pos : TURBULATOR_WAYPOINTS) { + RenderHelper.renderFilledIfVisible(wrc, pos, COLOR_COMPONENTS, 0.5f); } } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java index 6973aa1e..9ea90c16 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java @@ -1,6 +1,7 @@ package me.xmrvizzy.skyblocker.utils; import me.xmrvizzy.skyblocker.mixin.AccessorWorldRenderer; +import me.xmrvizzy.skyblocker.mixin.accessor.FrustumInvoker; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.Frustum; import net.minecraft.util.math.Box; @@ -14,4 +15,8 @@ public class FrustumUtils { public static boolean isBoxVisible(Box box) { return getFrustum().isVisible(box); } + + public static boolean isVisible(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) { + return ((FrustumInvoker) getFrustum()).isVisible(minX, minY, minZ, maxX, maxY, maxZ); + } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java index 79308dc3..c843dc43 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java @@ -17,10 +17,20 @@ public class RenderHelper { public static void renderFilledThroughWalls(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { Renderer3d.renderThroughWalls(); - Renderer3d.renderFilled(context.matrixStack(), new Color(colorComponents[0], colorComponents[1], colorComponents[2], alpha), Vec3d.of(pos), new Vec3d(1, 1, 1)); + renderFilled(context, pos, colorComponents, alpha); Renderer3d.stopRenderThroughWalls(); } + public static void renderFilledIfVisible(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { + if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { + renderFilled(context, pos, colorComponents, alpha); + } + } + + public static void renderFilled(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { + Renderer3d.renderFilled(context.matrixStack(), new Color(colorComponents[0], colorComponents[1], colorComponents[2], alpha), Vec3d.of(pos), new Vec3d(1, 1, 1)); + } + public static void renderBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents) { context.matrixStack().push(); context.matrixStack().translate(pos.getX() - context.camera().getPos().x, pos.getY() - context.camera().getPos().y, pos.getZ() - context.camera().getPos().z); -- cgit From c3dd9419010ba36647ee330ffb4e6873359d494a Mon Sep 17 00:00:00 2001 From: Futuremappermydud <54294576+Futuremappermydud@users.noreply.github.com> Date: Thu, 29 Jun 2023 06:18:23 -0400 Subject: Implement Vampire Slayer Features (#191) Implement Vampire Slayer Features Co-authored-by: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> --- .../skyblocker/config/SkyblockerConfig.java | 39 +++++++++-- .../skyblocker/mixin/ClientPlayerEntityMixin.java | 8 +++ .../xmrvizzy/skyblocker/mixin/InGameHudMixin.java | 8 +-- .../skyblocker/skyblock/FancyStatusBars.java | 28 ++++---- .../skyblocker/skyblock/FishingHelper.java | 8 +-- .../skyblocker/skyblock/rift/EffigyWaypoints.java | 79 ++++++++++++++++++++++ .../skyblock/rift/HealingMelonIndicator.java | 21 ++++++ .../skyblock/rift/MirrorverseWaypoints.java | 2 +- .../skyblocker/skyblock/rift/StakeIndicator.java | 21 ++++++ .../xmrvizzy/skyblocker/skyblock/rift/TheRift.java | 17 +++-- .../skyblock/rift/TwinClawsIndicator.java | 32 +++++++++ .../me/xmrvizzy/skyblocker/utils/RenderHelper.java | 17 +++++ .../me/xmrvizzy/skyblocker/utils/SlayerUtils.java | 66 ++++++++++++++++++ .../java/me/xmrvizzy/skyblocker/utils/Utils.java | 5 ++ .../resources/assets/skyblocker/lang/en_us.json | 19 ++++++ 15 files changed, 337 insertions(+), 33 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/SlayerUtils.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 988f5f77..4b1398e0 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -30,6 +30,10 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.Gui.TransitiveObject public Locations locations = new Locations(); + @ConfigEntry.Category("slayer") + @ConfigEntry.Gui.TransitiveObject + public Slayer slayer = new Slayer(); + @ConfigEntry.Category("quickNav") @ConfigEntry.Gui.TransitiveObject public QuickNav quickNav = new QuickNav(); @@ -177,7 +181,7 @@ public class SkyblockerConfig implements ConfigData { public static class TabHudConf { public boolean tabHudEnabled = true; - @ConfigEntry.BoundedDiscrete(min=10, max=200) + @ConfigEntry.BoundedDiscrete(min = 10, max = 200) @ConfigEntry.Gui.Tooltip() public int tabHudScale = 100; } @@ -289,7 +293,7 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.Category("dwarvenmines") @ConfigEntry.Gui.CollapsibleObject() public DwarvenMines dwarvenMines = new DwarvenMines(); - + @ConfigEntry.Category("rift") @ConfigEntry.Gui.CollapsibleObject() public Rift rift = new Rift(); @@ -348,7 +352,7 @@ public class SkyblockerConfig implements ConfigData { CLASSIC; @Override - public String toString() { + public String toString() { return switch (this) { case SIMPLE -> "Simple"; case FANCY -> "Fancy"; @@ -361,9 +365,34 @@ public class SkyblockerConfig implements ConfigData { public boolean solveHungryHiker = true; public boolean solveTreasureHunter = true; } - + public static class Rift { - public boolean mirrorverseWaypoints = true; + public boolean mirrorverseWaypoints = true; + } + + public static class Slayer { + @ConfigEntry.Category("vampire") + @ConfigEntry.Gui.CollapsibleObject() + public VampireSlayer vampireSlayer = new VampireSlayer(); + } + + public static class VampireSlayer { + public boolean enableEffigyWaypoints = true; + public boolean compactEffigyWaypoints; + @ConfigEntry.BoundedDiscrete(min = 1, max = 10) + @ConfigEntry.Gui.Tooltip() + public int effigyUpdateFrequency = 5; + public boolean enableHolyIceIndicator = true; + public int holyIceIndicatorTickDelay = 10; + @ConfigEntry.BoundedDiscrete(min = 1, max = 10) + @ConfigEntry.Gui.Tooltip() + public int holyIceUpdateFrequency = 5; + public boolean enableHealingMelonIndicator = true; + public float healingMelonHealthThreshold = 4F; + public boolean enableSteakStakeIndicator = true; + @ConfigEntry.BoundedDiscrete(min = 1, max = 10) + @ConfigEntry.Gui.Tooltip() + public int steakStakeUpdateFrequency = 5; } public static class Messages { diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java index 76c4e8ec..e48e725e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java @@ -2,13 +2,16 @@ package me.xmrvizzy.skyblocker.mixin; import com.mojang.authlib.GameProfile; import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock; +import me.xmrvizzy.skyblocker.skyblock.rift.HealingMelonIndicator; import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.world.ClientWorld; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ClientPlayerEntity.class) @@ -21,4 +24,9 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity public void skyblocker$dropSelectedItem(boolean dropEntireStack, CallbackInfoReturnable cir) { if (Utils.isOnSkyblock()) HotbarSlotLock.handleDropSelectedItem(this.getInventory().selectedSlot, cir); } + + @Inject(method = "updateHealth", at = @At("HEAD")) + public void skyblocker$updateHealth(float health, CallbackInfo info) { + HealingMelonIndicator.updateHealth(MinecraftClient.getInstance()); + } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java index 4c89d497..7d9182b5 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java @@ -6,13 +6,11 @@ import me.xmrvizzy.skyblocker.skyblock.FancyStatusBars; import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock; import me.xmrvizzy.skyblocker.skyblock.StatusBarTracker; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonMap; -import me.xmrvizzy.skyblocker.skyblock.rift.TheRift; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.hud.InGameHud; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; @@ -54,7 +52,7 @@ public abstract class InGameHudMixin { @Inject(method = "setOverlayMessage(Lnet/minecraft/text/Text;Z)V", at = @At("HEAD"), cancellable = true) private void skyblocker$onSetOverlayMessage(Text message, boolean tinted, CallbackInfo ci) { - if (!Utils.isOnSkyblock() || !SkyblockerConfig.get().general.bars.enableBars || Utils.getLocationRaw().equals(TheRift.LOCATION)) + if (!Utils.isOnSkyblock() || !SkyblockerConfig.get().general.bars.enableBars || Utils.isInTheRift()) return; String msg = message.getString(); String res = statusBarTracker.update(msg, SkyblockerConfig.get().messages.hideMana); @@ -85,7 +83,7 @@ public abstract class InGameHudMixin { @Inject(method = "renderExperienceBar", at = @At("HEAD"), cancellable = true) private void skyblocker$renderExperienceBar(DrawContext context, int x, CallbackInfo ci) { - if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars && !Utils.getLocationRaw().equals(TheRift.LOCATION)) + if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars && !Utils.isInTheRift()) ci.cancel(); } @@ -104,7 +102,7 @@ public abstract class InGameHudMixin { @Inject(method = "renderMountHealth", at = @At("HEAD"), cancellable = true) private void skyblocker$renderMountHealth(DrawContext context, CallbackInfo ci) { - if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars && !Utils.getLocationRaw().equals(TheRift.LOCATION)) + if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars && !Utils.isInTheRift()) ci.cancel(); } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java index 8e0d43da..1a460f5b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java @@ -2,7 +2,6 @@ package me.xmrvizzy.skyblocker.skyblock; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.skyblock.rift.TheRift; import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; @@ -11,7 +10,6 @@ import net.minecraft.util.Identifier; public class FancyStatusBars { private static final Identifier BARS = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/bars.png"); - private static final String RIFT_LOCATION = "rift"; private final MinecraftClient client = MinecraftClient.getInstance(); private final StatusBarTracker statusBarTracker = SkyblockerMod.getInstance().statusBarTracker; @@ -42,7 +40,7 @@ public class FancyStatusBars { public boolean render(DrawContext context, int scaledWidth, int scaledHeight) { var player = client.player; - if (!SkyblockerConfig.get().general.bars.enableBars || player == null || Utils.getLocationRaw().equals(TheRift.LOCATION)) + if (!SkyblockerConfig.get().general.bars.enableBars || player == null || Utils.isInTheRift()) return false; anchorsX[0] = scaledWidth / 2 - 91; anchorsY[0] = scaledHeight - 33; @@ -73,10 +71,12 @@ public class FancyStatusBars { moveBar(i, configAnchorNum); } - for (var bar : bars) + for (var bar : bars) { bar.draw(context); - for (var bar : bars) + } + for (var bar : bars) { bar.drawText(context); + } return true; } @@ -152,19 +152,23 @@ public class FancyStatusBars { // Draw the background for the bar context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10, anchorsY[anchorNum], 10, v, 2, 9); - for (int i = 2; i < bar_width - 2; i += 58) + for (int i = 2; i < bar_width - 2; i += 58) { context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10 + i, anchorsY[anchorNum], 12, v, Math.min(58, bar_width - 2 - i), 9); + } context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 10 + bar_width - 2, anchorsY[anchorNum], 70, v, 2, 9); // Draw the filled part of the bar for (int i = 0; i < fill.length; i++) { int fill_width = this.fill[i] * (bar_width - 2) / 100; - if (fill_width >= 1) - context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11, anchorsY[anchorNum], 72 + i*60, v, 1, 9); - for (int j = 1; j < fill_width - 1; j += 58) - context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11 + j, anchorsY[anchorNum], 73 + i*60, v, Math.min(58, fill_width - 1 - j), 9); - if (fill_width == bar_width - 2) - context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11 + fill_width - 1, anchorsY[anchorNum], 131 + i*60, v, 1, 9); + if (fill_width >= 1) { + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11, anchorsY[anchorNum], 72 + i * 60, v, 1, 9); + } + for (int j = 1; j < fill_width - 1; j += 58) { + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11 + j, anchorsY[anchorNum], 73 + i * 60, v, Math.min(58, fill_width - 1 - j), 9); + } + if (fill_width == bar_width - 2) { + context.drawTexture(BARS, anchorsX[anchorNum] + offsetX + 11 + fill_width - 1, anchorsY[anchorNum], 131 + i * 60, v, 1, 9); + } } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java index d82464e1..822b89d9 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java @@ -1,6 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.RenderHelper; import net.fabricmc.fabric.api.event.player.UseItemCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; @@ -8,10 +9,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.FishingRodItem; import net.minecraft.item.ItemStack; import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; -import net.minecraft.sound.SoundEvent; -import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import net.minecraft.util.Identifier; import net.minecraft.util.TypedActionResult; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; @@ -51,9 +49,7 @@ public class FishingHelper { if (player != null && player.fishHook != null) { Vec3d soundToFishHook = player.fishHook.getPos().subtract(packet.getX(), 0, packet.getZ()); if (Math.abs(normalYawVector.x * soundToFishHook.z - normalYawVector.z * soundToFishHook.x) < 0.2D && Math.abs(normalYawVector.dotProduct(soundToFishHook)) < 4D && player.getPos().squaredDistanceTo(packet.getX(), packet.getY(), packet.getZ()) > 1D) { - client.inGameHud.setTitleTicks(0, 10, 5); - client.inGameHud.setTitle(Text.translatable("skyblocker.fishing.reelNow").formatted(Formatting.GREEN)); - player.playSound(SoundEvent.of(new Identifier("minecraft", "entity.experience_orb.pickup")), 100f, 0.1f); + RenderHelper.displayTitleAndPlaySound(10, 5, "skyblocker.fishing.reelNow", Formatting.GREEN); reset(); } } else { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java new file mode 100644 index 00000000..0d44900a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java @@ -0,0 +1,79 @@ +package me.xmrvizzy.skyblocker.skyblock.rift; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.RenderHelper; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraft.scoreboard.ScoreboardObjective; +import net.minecraft.scoreboard.ScoreboardPlayerScore; +import net.minecraft.scoreboard.Team; +import net.minecraft.text.Text; +import net.minecraft.text.TextColor; +import net.minecraft.util.DyeColor; +import net.minecraft.util.math.BlockPos; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; + +public class EffigyWaypoints { + private static final Logger LOGGER = LoggerFactory.getLogger(EffigyWaypoints.class); + private static final List effigies = List.of( + new BlockPos(150, 79, 95), //Effigy 1 + new BlockPos(193, 93, 119), //Effigy 2 + new BlockPos(235, 110, 147), //Effigy 3 + new BlockPos(293, 96, 134), //Effigy 4 + new BlockPos(262, 99, 94), //Effigy 5 + new BlockPos(240, 129, 118) //Effigy 6 + ); + private static final List unBrokenEffigies = new ArrayList<>(); + + public static void updateEffigies() { + if (!SkyblockerConfig.get().slayer.vampireSlayer.enableEffigyWaypoints || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château")) return; + + unBrokenEffigies.clear(); + try { + ClientPlayerEntity player = MinecraftClient.getInstance().player; + if (player == null) return; + Scoreboard scoreboard = player.getScoreboard(); + ScoreboardObjective objective = scoreboard.getObjectiveForSlot(1); + for (ScoreboardPlayerScore score : scoreboard.getAllPlayerScores(objective)) { + Team team = scoreboard.getPlayerTeam(score.getPlayerName()); + if (team != null) { + String line = team.getPrefix().getString() + team.getSuffix().getString(); + if (line.contains("Effigies")) { + List newList = new ArrayList<>(team.getPrefix().getSiblings()); + newList.addAll(team.getSuffix().getSiblings()); + for (int i = 1; i < newList.size(); i++) { + if (newList.get(i).getStyle().getColor() == TextColor.parse("gray")) { + unBrokenEffigies.add(effigies.get(i - 1)); + } + } + } + } + } + } catch (NullPointerException e) { + LOGGER.error("[Skyblocker] Error while updating effigies.", e); + } + } + + public static void render(WorldRenderContext context) { + if (SkyblockerConfig.get().slayer.vampireSlayer.enableEffigyWaypoints && Utils.getLocation().contains("Stillgore Château")) { + for (BlockPos effigy : unBrokenEffigies) { + float[] colorComponents = DyeColor.RED.getColorComponents(); + if (SkyblockerConfig.get().slayer.vampireSlayer.compactEffigyWaypoints) { + RenderHelper.renderFilledThroughWallsWithBeaconBeam(context, effigy.down(6), colorComponents, 0.5F); + } else { + RenderHelper.renderFilledThroughWallsWithBeaconBeam(context, effigy, colorComponents, 0.5F); + for (int i = 1; i < 6; i++) { + RenderHelper.renderFilledThroughWalls(context, effigy.down(i), colorComponents, 0.5F - (0.075F * i)); + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java new file mode 100644 index 00000000..f98c17e7 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java @@ -0,0 +1,21 @@ +package me.xmrvizzy.skyblocker.skyblock.rift; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.RenderHelper; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.util.Formatting; + +public class HealingMelonIndicator { + private static long lastDisplayTime = 0; + + public static void updateHealth(MinecraftClient client) { + if (!SkyblockerConfig.get().slayer.vampireSlayer.enableHealingMelonIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château")) return; + ClientPlayerEntity player = client.player; + if (player != null && player.getHealth() <= SkyblockerConfig.get().slayer.vampireSlayer.healingMelonHealthThreshold * 2F && System.currentTimeMillis() - lastDisplayTime > 2500) { + lastDisplayTime = System.currentTimeMillis(); + RenderHelper.displayTitleAndPlaySound(15, 5, "skyblocker.rift.healNow", Formatting.DARK_RED); + } + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java index 630d953b..276ec551 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java @@ -71,7 +71,7 @@ public class MirrorverseWaypoints { public static void render(WorldRenderContext wrc) { //I would also check for the mirrorverse location but the scoreboard stuff is not performant at all... - if (Utils.getLocationRaw().equals(TheRift.LOCATION) && SkyblockerConfig.get().locations.rift.mirrorverseWaypoints) { + if (Utils.isInTheRift() && SkyblockerConfig.get().locations.rift.mirrorverseWaypoints) { for (BlockPos pos : LAVA_PATH_WAYPOINTS) { RenderHelper.renderFilledIfVisible(wrc, pos, COLOR_COMPONENTS, 0.5f); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java new file mode 100644 index 00000000..d1132be8 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java @@ -0,0 +1,21 @@ +package me.xmrvizzy.skyblocker.skyblock.rift; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.RenderHelper; +import me.xmrvizzy.skyblocker.utils.SlayerUtils; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.entity.Entity; +import net.minecraft.util.Formatting; + +public class StakeIndicator { + private static long lastDisplayTime = 0; + + public static void updateStake() { + if (!SkyblockerConfig.get().slayer.vampireSlayer.enableSteakStakeIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château") || !SlayerUtils.isInSlayer()) return; + Entity slayerEntity = SlayerUtils.getSlayerEntity(); + if (slayerEntity != null && slayerEntity.getDisplayName().toString().contains("҉") && System.currentTimeMillis() - lastDisplayTime > 2500) { + lastDisplayTime = System.currentTimeMillis(); + RenderHelper.displayTitleAndPlaySound(25, 5, "skyblocker.rift.stakeNow", Formatting.RED); + } + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java index 24f92238..91b727e2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java @@ -1,11 +1,20 @@ package me.xmrvizzy.skyblocker.skyblock.rift; +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; public class TheRift { - public static final String LOCATION = "rift"; + /** + * @see me.xmrvizzy.skyblocker.utils.Utils#isInTheRift() Utils#isInTheRift(). + */ + public static final String LOCATION = "rift"; - public static void init() { - WorldRenderEvents.AFTER_TRANSLUCENT.register(MirrorverseWaypoints::render); - } + public static void init() { + WorldRenderEvents.AFTER_TRANSLUCENT.register(MirrorverseWaypoints::render); + WorldRenderEvents.AFTER_TRANSLUCENT.register(EffigyWaypoints::render); + SkyblockerMod.getInstance().scheduler.scheduleCyclic(EffigyWaypoints::updateEffigies, SkyblockerConfig.get().slayer.vampireSlayer.effigyUpdateFrequency); + SkyblockerMod.getInstance().scheduler.scheduleCyclic(TwinClawsIndicator::updateIce, SkyblockerConfig.get().slayer.vampireSlayer.holyIceUpdateFrequency); + SkyblockerMod.getInstance().scheduler.scheduleCyclic(StakeIndicator::updateStake, SkyblockerConfig.get().slayer.vampireSlayer.steakStakeUpdateFrequency); + } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java new file mode 100644 index 00000000..7e1d6605 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java @@ -0,0 +1,32 @@ +package me.xmrvizzy.skyblocker.skyblock.rift; + +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.RenderHelper; +import me.xmrvizzy.skyblocker.utils.SlayerUtils; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.entity.Entity; +import net.minecraft.util.Formatting; + +public class TwinClawsIndicator { + private static long lastDisplayTime = 0; + + public static void updateIce() { + if (!SkyblockerConfig.get().slayer.vampireSlayer.enableHolyIceIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !(Utils.getLocation().contains("Stillgore Château")) || !SlayerUtils.isInSlayer()) return; + + Entity slayerEntity = SlayerUtils.getSlayerEntity(); + if (slayerEntity == null) return; + + for (Entity entity : SlayerUtils.getEntityArmorStands(slayerEntity)) { + if (entity.getDisplayName().toString().contains("TWINCLAWS")) { + SkyblockerMod.getInstance().scheduler.schedule(() -> { + if (System.currentTimeMillis() - lastDisplayTime > 2500) { + lastDisplayTime = System.currentTimeMillis(); + RenderHelper.displayTitleAndPlaySound(40, 5, "skyblocker.rift.iceNow", Formatting.AQUA); + } + }, SkyblockerConfig.get().slayer.vampireSlayer.holyIceIndicatorTickDelay); + } + } + + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java index 2e942905..a7e1fc99 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java @@ -3,7 +3,12 @@ package me.xmrvizzy.skyblocker.utils; import me.x150.renderer.render.Renderer3d; import me.xmrvizzy.skyblocker.mixin.accessor.BeaconBlockEntityRendererInvoker; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.block.entity.BeaconBlockEntityRenderer; +import net.minecraft.sound.SoundEvent; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -39,4 +44,16 @@ public class RenderHelper { BeaconBlockEntityRendererInvoker.renderBeam(context.matrixStack(), context.consumers(), context.tickDelta(), context.world().getTime(), 0, BeaconBlockEntityRenderer.MAX_BEAM_HEIGHT, colorComponents); context.matrixStack().pop(); } + + public static void displayTitleAndPlaySound(int stayTicks, int fadeOutTicks, String titleKey, Formatting formatting) { + MinecraftClient.getInstance().inGameHud.setTitleTicks(0, stayTicks, fadeOutTicks); + MinecraftClient.getInstance().inGameHud.setTitle(Text.translatable(titleKey).formatted(formatting)); + playNotificationSound(); + } + + private static void playNotificationSound() { + if (MinecraftClient.getInstance().player != null) { + MinecraftClient.getInstance().player.playSound(SoundEvent.of(new Identifier("entity.experience_orb.pickup")), 100f, 0.1f); + } + } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/SlayerUtils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/SlayerUtils.java new file mode 100644 index 00000000..6bc09456 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/SlayerUtils.java @@ -0,0 +1,66 @@ +package me.xmrvizzy.skyblocker.utils; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.entity.Entity; +import net.minecraft.entity.decoration.ArmorStandEntity; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraft.scoreboard.ScoreboardObjective; +import net.minecraft.scoreboard.ScoreboardPlayerScore; +import net.minecraft.scoreboard.Team; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +//TODO Slayer Packet system that can provide information about the current slayer boss, abstract so that different bosses can have different info +public class SlayerUtils { + private static final Logger LOGGER = LoggerFactory.getLogger(SlayerUtils.class); + + //TODO: Cache this, probably included in Packet system + public static List getEntityArmorStands(Entity entity) { + return entity.getEntityWorld().getOtherEntities(entity, entity.getBoundingBox().expand(1F, 2.5F, 1F), x -> x instanceof ArmorStandEntity && x.hasCustomName()); + } + + //Eventually this should be modified so that if you hit a slayer boss all slayer features will work on that boss. + public static Entity getSlayerEntity() { + if (MinecraftClient.getInstance().world != null) { + for (Entity entity : MinecraftClient.getInstance().world.getEntities()) { + //Check if entity is Bloodfiend + if (entity.hasCustomName() && entity.getCustomName().getString().contains("Bloodfiend")) { + //Grab the players username + String username = MinecraftClient.getInstance().getSession().getUsername(); + //Check all armor stands around the boss + for (Entity armorStand : getEntityArmorStands(entity)) { + //Check if the display name contains the players username + if (armorStand.getDisplayName().getString().contains(username)) { + return entity; + } + } + } + } + } + return null; + } + + public static boolean isInSlayer() { + try { + ClientPlayerEntity client = MinecraftClient.getInstance().player; + if (client == null) return false; + Scoreboard scoreboard = MinecraftClient.getInstance().player.getScoreboard(); + ScoreboardObjective objective = scoreboard.getObjectiveForSlot(1); + for (ScoreboardPlayerScore score : scoreboard.getAllPlayerScores(objective)) { + Team team = scoreboard.getPlayerTeam(score.getPlayerName()); + if (team != null) { + String line = team.getPrefix().getString() + team.getSuffix().getString(); + if (line.contains("Slay the boss!")) { + return true; + } + } + } + } catch (NullPointerException e) { + LOGGER.error("[Skyblocker] Error while checking if player is in slayer", e); + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index d961ba7e..35dfd368 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -4,6 +4,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; +import me.xmrvizzy.skyblocker.skyblock.rift.TheRift; import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; @@ -52,6 +53,10 @@ public class Utils { return isInDungeons; } + public static boolean isInTheRift() { + return getLocationRaw().equals(TheRift.LOCATION); + } + public static boolean isInjected() { return isInjected; } diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index d18e180e..647092a9 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -220,6 +220,22 @@ "text.autoconfig.skyblocker.option.messages.hideMana": "Hide Mana Consumption Messages from Action Bar", "text.autoconfig.skyblocker.option.messages.hideMana.@Tooltip": "Gives a better experience with FancyBar", + "text.autoconfig.skyblocker.category.slayer": "Slayers", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer": "Vampire Slayer", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.enableEffigyWaypoints": "Enable Effigy Waypoints", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.compactEffigyWaypoints": "Compact Effigy Waypoints", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.effigyUpdateFrequency": "Effigy Waypoints Update Frequency (Ticks)", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.effigyUpdateFrequency.@Tooltip": "The lower the value, the more frequent the updates, which may cause lag.", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.enableHolyIceIndicator": "Enable Holy Ice Indicator", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.holyIceIndicatorTickDelay": "Holy Ice Indicator Delay (Ticks)", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.holyIceUpdateFrequency": "Holy Ice Indicator Update Frequency (Ticks)", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.holyIceUpdateFrequency.@Tooltip": "The lower the value, the more frequent the updates, which may cause lag.", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.enableHealingMelonIndicator": "Enable Healing Melon Indicator", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.healingMelonHealthThreshold": "Healing Melon Indicator Threshold (Hearts)", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.enableSteakStakeIndicator": "Enable Steak Stake Indicator", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.steakStakeUpdateFrequency": "Steak Stake Indicator Update Frequency (Ticks)", + "text.autoconfig.skyblocker.option.slayer.vampireSlayer.steakStakeUpdateFrequency.@Tooltip": "The lower the value, the more frequent the updates, which may cause lag.", + "skyblocker.update.update_message": "§b[§6Skyblocker§b] §2There is a new version available!", "skyblocker.update.update_link": " §2§nClick here§r", "skyblocker.update.update_message_end" : " §ato find out about latest features.", @@ -232,6 +248,9 @@ "skyblocker.api.got_key": "§b[§6Skyblocker§b] §2Automatically set your API key!", "skyblocker.fishing.reelNow": "Reel in now!", + "skyblocker.rift.healNow": "Heal now!", + "skyblocker.rift.iceNow": "Ice now!", + "skyblocker.rift.stakeNow": "Stake now!", "skyblocker.fairySouls.markAllFound": "Marked all fairy souls in the current island as found", "skyblocker.fairySouls.markAllMissing": "Marked all fairy souls in the current island as missing" } -- cgit From 55b777dd07087569d7c3565de5cf4808c70eadb9 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Sat, 1 Jul 2023 22:11:10 -0400 Subject: Fix dragged items not rendering (#193) --- .../java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index aefe11c6..903d3992 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -63,22 +63,22 @@ public abstract class HandledScreenMixin extends Screen { @Redirect(method = "drawMouseoverTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/screen/slot/Slot;getStack()Lnet/minecraft/item/ItemStack;", ordinal = 0)) private ItemStack skyblocker$experimentSolvers$replaceTooltipDisplayStack(Slot slot) { - return skyblocker$experimentSolvers$getStack(slot); + return skyblocker$experimentSolvers$getStack(slot, null); } @ModifyVariable(method = "drawSlot", at = @At(value = "LOAD", ordinal = 4), ordinal = 0) private ItemStack skyblocker$experimentSolvers$replaceDisplayStack(ItemStack stack, DrawContext context, Slot slot) { - return skyblocker$experimentSolvers$getStack(slot); + return skyblocker$experimentSolvers$getStack(slot, stack); } @Unique - private ItemStack skyblocker$experimentSolvers$getStack(Slot slot) { + private ItemStack skyblocker$experimentSolvers$getStack(Slot slot, ItemStack stack) { ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver(); if ((currentSolver instanceof SuperpairsSolver || currentSolver instanceof UltrasequencerSolver) && ((ExperimentSolver) currentSolver).getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) { ItemStack itemStack = ((ExperimentSolver) currentSolver).getSlots().get(slot.getIndex()); return itemStack == null ? slot.getStack() : itemStack; } - return slot.getStack(); + return (stack != null) ? stack : slot.getStack(); } @Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;clickSlot(IIILnet/minecraft/screen/slot/SlotActionType;Lnet/minecraft/entity/player/PlayerEntity;)V")) -- cgit