From ff596b83910a93b111eea8996777ccb2bfa00b71 Mon Sep 17 00:00:00 2001 From: Spencer <75862693+TacoMonkey11@users.noreply.github.com> Date: Tue, 12 Apr 2022 07:54:27 -0400 Subject: Switch to new discord-ipc library --- .../skyblocker/config/SkyblockerConfig.java | 2 +- .../skyblocker/discord/DiscordRPCManager.java | 103 +++++++-------------- 2 files changed, 34 insertions(+), 71 deletions(-) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 1862313b..9c832baa 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -65,7 +65,7 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.Gui.Tooltip() public Info info = Info.LOCATION; public boolean cycleMode = false; - public String customMessage; + public String customMessage = "All on Fabric!"; } public static class ItemList { diff --git a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java index e13dfd09..43d5f9f7 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java @@ -1,101 +1,64 @@ package me.xmrvizzy.skyblocker.discord; -import com.google.gson.JsonObject; -import com.jagrosh.discordipc.IPCClient; -import com.jagrosh.discordipc.IPCListener; -import com.jagrosh.discordipc.entities.RichPresence; -import com.jagrosh.discordipc.entities.pipe.PipeStatus; + import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.Utils; +import meteordevelopment.discordipc.DiscordIPC; +import meteordevelopment.discordipc.RichPresence; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.text.DecimalFormat; -import java.time.OffsetDateTime; +import java.time.Instant; -public class DiscordRPCManager implements IPCListener{ - public static long startTimestamp; - public static IPCClient client; - public boolean isConnected; - private static final Logger LOGGER = LoggerFactory.getLogger(DiscordRPCManager.class.getName()); - public static DecimalFormat dFormat = new DecimalFormat("###,###.##"); - public int cycleCount = 0; +public class DiscordRPCManager { + public static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("###,###.##"); + public static final Logger LOGGER = LoggerFactory.getLogger(DiscordRPCManager.class.getName()); + public static long startTimeStamp; + public static int cycleCount; - public void update() { - if (!SkyblockerConfig.get().richPresence.enableRichPresence || !Utils.isOnSkyblock) { - if (isConnected) stop(); - return; + public void update(){ + if (!SkyblockerConfig.get().richPresence.enableRichPresence || !Utils.isOnSkyblock){ + if (DiscordIPC.isConnected()) DiscordIPC.stop(); } - if (!isConnected) start(); - if (SkyblockerConfig.get().richPresence.cycleMode) - cycleCount = (cycleCount + 1) % 3; - updatePresence(); - } - - public void start(){ - try { - LOGGER.info("[Skyblocker DiscordRPC] Starting..."); - startTimestamp = OffsetDateTime.now().toEpochSecond(); - client = new IPCClient(934607927837356052L); - client.setListener(this); - try { - client.connect(); - } catch (Exception e) { - LOGGER.warn("Failed to connect: " + e.getMessage()); + if (SkyblockerConfig.get().richPresence.enableRichPresence && Utils.isOnSkyblock && !DiscordIPC.isConnected()){ + if (!DiscordIPC.start(934607927837356052L, () -> { + LOGGER.info("Started up rich presence"); + startTimeStamp = Instant.now().getEpochSecond(); + })){ + LOGGER.info("An error occurred while attempting to connect to discord"); + return; } - } catch (Throwable ex) { - LOGGER.error("[Skyblocker DiscordRPC] unexpected error occurred while trying to start..."); - ex.printStackTrace(); } + if (SkyblockerConfig.get().richPresence.cycleMode) + cycleCount = (cycleCount + 1) % 3; + buildPresence(); } - public void updatePresence(){ - RichPresence presence = new RichPresence.Builder() - .setState(SkyblockerConfig.get().richPresence.customMessage) - .setDetails(getInfo()) - .setStartTimestamp(startTimestamp) - .setLargeImage("skyblocker-default") - .build(); - if (client != null && isConnected) client.sendRichPresence(presence); + public void buildPresence(){ + RichPresence presence = new RichPresence(); + presence.setLargeImage("skyblocker-default", null); + presence.setStart(startTimeStamp); + presence.setDetails(SkyblockerConfig.get().richPresence.customMessage); + presence.setState(getInfo()); + DiscordIPC.setActivity(presence); } public String getInfo(){ String info = null; if (!SkyblockerConfig.get().richPresence.cycleMode){ switch (SkyblockerConfig.get().richPresence.info){ - case BITS -> info = "Bits: " + dFormat.format(Utils.getBits()); - case PURSE -> info = "Purse: " + dFormat.format(Utils.getPurse()); + case BITS -> info = "Bits: " + DECIMAL_FORMAT.format(Utils.getBits()); + case PURSE -> info = "Purse: " + DECIMAL_FORMAT.format(Utils.getPurse()); case LOCATION -> info = "⏣ " + Utils.getLocation(); } } else if (SkyblockerConfig.get().richPresence.cycleMode){ switch (cycleCount){ - case 0 -> info = "Bits: " + dFormat.format(Utils.getBits()); - case 1 -> info = "Purse: " + dFormat.format(Utils.getPurse()); + case 0 -> info = "Bits: " + DECIMAL_FORMAT.format(Utils.getBits()); + case 1 -> info = "Purse: " + DECIMAL_FORMAT.format(Utils.getPurse()); case 2 -> info = "⏣ " + Utils.getLocation(); } } return info; } - - public void stop(){ - if (client != null && client.getStatus() == PipeStatus.CONNECTED) { - LOGGER.info("[Skyblocker DiscordRPC] Closing..."); - isConnected = false; - client.close(); - client = null; - } - } - - @Override - public void onReady(IPCClient client) { - LOGGER.info("[Skyblocker DiscordRPC] Started!"); - isConnected = true; - } - - @Override - public void onClose(IPCClient client, JsonObject json) { - LOGGER.info("[Skyblocker DiscordRPC] Closed"); - isConnected = false; - } - } -- cgit From 19a13e0f1391629918b316b4d0f3453595f1ec99 Mon Sep 17 00:00:00 2001 From: TacoMonkey <75862693+TacoMonkey11@users.noreply.github.com> Date: Sat, 19 Mar 2022 17:44:43 -0400 Subject: create skyblock join callback --- .../utils/events/SkyblockJoinCallback.java | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockJoinCallback.java (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockJoinCallback.java b/src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockJoinCallback.java new file mode 100644 index 00000000..ca407c92 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockJoinCallback.java @@ -0,0 +1,24 @@ +package me.xmrvizzy.skyblocker.utils.events; + +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.fabricmc.fabric.api.networking.v1.PacketSender; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.util.ActionResult; + +public interface SkyblockJoinCallback { + Event EVENT = EventFactory.createArrayBacked(SkyblockJoinCallback.class, + (listeners) -> (handler, sender, client) -> { + for (SkyblockJoinCallback listener : listeners) { + ActionResult result = listener.join(handler, sender, client); + + if(result != ActionResult.PASS) { + return result; + } + } + return ActionResult.PASS; + }); + + ActionResult join(ClientPlayNetworkHandler handler, PacketSender sender, MinecraftClient client); +} -- cgit From be9bf6d47cc64cf5de6a7e33dda24b69fe7c56e7 Mon Sep 17 00:00:00 2001 From: TacoMonkey <75862693+TacoMonkey11@users.noreply.github.com> Date: Sat, 19 Mar 2022 18:08:57 -0400 Subject: Simplify callback --- .../xmrvizzy/skyblocker/utils/events/SkyblockJoinCallback.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockJoinCallback.java b/src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockJoinCallback.java index ca407c92..b5d621dd 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockJoinCallback.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockJoinCallback.java @@ -2,16 +2,13 @@ package me.xmrvizzy.skyblocker.utils.events; import net.fabricmc.fabric.api.event.Event; import net.fabricmc.fabric.api.event.EventFactory; -import net.fabricmc.fabric.api.networking.v1.PacketSender; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.util.ActionResult; public interface SkyblockJoinCallback { Event EVENT = EventFactory.createArrayBacked(SkyblockJoinCallback.class, - (listeners) -> (handler, sender, client) -> { + (listeners) -> () -> { for (SkyblockJoinCallback listener : listeners) { - ActionResult result = listener.join(handler, sender, client); + ActionResult result = listener.join(); if(result != ActionResult.PASS) { return result; @@ -20,5 +17,5 @@ public interface SkyblockJoinCallback { return ActionResult.PASS; }); - ActionResult join(ClientPlayNetworkHandler handler, PacketSender sender, MinecraftClient client); + ActionResult join(); } -- cgit From da2b7afe80b97198dfc5c9bddc93f468ca9a49d2 Mon Sep 17 00:00:00 2001 From: TacoMonkey <75862693+TacoMonkey11@users.noreply.github.com> Date: Sat, 19 Mar 2022 18:09:38 -0400 Subject: clean up UpdateChecker --- .../xmrvizzy/skyblocker/utils/UpdateChecker.java | 62 +++++++++++++--------- 1 file changed, 38 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java b/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java index fd43d8e3..b64541c9 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java @@ -3,16 +3,18 @@ package me.xmrvizzy.skyblocker.utils; import com.google.gson.*; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.events.SkyblockJoinCallback; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.ClickEvent; +import net.minecraft.text.HoverEvent; +import net.minecraft.text.TranslatableText; +import net.minecraft.util.ActionResult; import org.spongepowered.asm.util.VersionNumber; -import javax.net.ssl.HttpsURLConnection; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; -import java.net.HttpURLConnection; import java.net.URL; -import java.net.URLConnection; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -25,31 +27,43 @@ public class UpdateChecker { public static VersionNumber latestVersion = null; public static boolean shouldUpdate(){ if (SkyblockerConfig.get().general.enableUpdateNotification){ - new Thread(new Runnable() { - @Override - public void run() { - try{ - URL url = new URL("https://api.modrinth.com/v2/project/skyblocker-liap/version"); + new Thread(() -> { + try{ + URL url = new URL("https://api.modrinth.com/v2/project/skyblocker-liap/version"); - InputStreamReader reader = new InputStreamReader(url.openStream()); - JsonObject versionJson = new Gson().fromJson(reader, JsonElement.class).getAsJsonArray().get(0).getAsJsonObject(); - matcher = pattern.matcher(versionJson.get("version_number").getAsString()); - if (matcher.find()){ - latestVersion = VersionNumber.parse(matcher.group(1) + "." + matcher.group(2) + "." + matcher.group(3)); - } - matcher = localPattern.matcher(FabricLoader.getInstance().getModContainer(SkyblockerMod.NAMESPACE).get().getMetadata().getVersion().getFriendlyString()); - if (matcher.find()){ - localVersion = VersionNumber.parse(matcher.group(1) + "." + matcher.group(2) + "." + matcher.group(3)); - } - if (localVersion != null && latestVersion != null) - if (localVersion.compareTo(latestVersion) < 0) shouldUpdate = true; - - } catch (IOException e) { - e.printStackTrace(); + InputStreamReader reader = new InputStreamReader(url.openStream()); + JsonObject versionJson = new Gson().fromJson(reader, JsonElement.class).getAsJsonArray().get(0).getAsJsonObject(); + matcher = pattern.matcher(versionJson.get("version_number").getAsString()); + if (matcher.find()){ + latestVersion = VersionNumber.parse(matcher.group(1) + "." + matcher.group(2) + "." + matcher.group(3)); + } + matcher = localPattern.matcher(FabricLoader.getInstance().getModContainer(SkyblockerMod.NAMESPACE).get().getMetadata().getVersion().getFriendlyString()); + if (matcher.find()){ + localVersion = VersionNumber.parse(matcher.group(1) + "." + matcher.group(2) + "." + matcher.group(3)); } + if (localVersion != null && latestVersion != null) + if (localVersion.compareTo(latestVersion) < 0) shouldUpdate = true; + + } catch (IOException e) { + e.printStackTrace(); } }).start(); } return shouldUpdate; } + + public static void init(){ + if (shouldUpdate()){ + SkyblockJoinCallback.EVENT.register(() -> { + TranslatableText linkMessage = new TranslatableText("skyblocker.update.update_message"); + TranslatableText linkMessageEnding = new TranslatableText("skyblocker.update.update_message_end"); + TranslatableText link = new TranslatableText("skyblocker.update.update_link"); + TranslatableText hoverText = new TranslatableText("skyblocker.update.hover_text"); + linkMessage.append(link.styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://modrinth.com/mod/skyblocker-liap/versions")).withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hoverText)))).append(linkMessageEnding); + + MinecraftClient.getInstance().player.sendMessage(linkMessage, false); + return ActionResult.PASS; + }); + } + } } -- cgit From b6b785f26995e647886be4824d8cc1fb0b4897f0 Mon Sep 17 00:00:00 2001 From: TacoMonkey <75862693+tacomonkey11@users.noreply.github.com> Date: Sat, 19 Mar 2022 18:10:03 -0400 Subject: switch to fabric api events --- .../xmrvizzy/skyblocker/SkyblockerInitializer.java | 3 +++ .../skyblocker/discord/DiscordRPCManager.java | 9 +++++++++ .../java/me/xmrvizzy/skyblocker/utils/Utils.java | 12 +++++++++--- .../utils/events/SkyblockLeaveCallback.java | 21 +++++++++++++++++++++ 4 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockLeaveCallback.java (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java index be0bb0dd..b60ae4d1 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java @@ -7,6 +7,7 @@ import me.xmrvizzy.skyblocker.skyblock.api.StatsCommand; 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 { @@ -19,5 +20,7 @@ public class SkyblockerInitializer implements ClientModInitializer { ItemRegistry.init(); StatsCommand.init(); ChatMessageListener.init(); + UpdateChecker.init(); + SkyblockerMod.getInstance().discordRPCManager.init(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java index e13dfd09..68963809 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java @@ -7,6 +7,8 @@ import com.jagrosh.discordipc.entities.RichPresence; import com.jagrosh.discordipc.entities.pipe.PipeStatus; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.Utils; +import me.xmrvizzy.skyblocker.utils.events.SkyblockLeaveCallback; +import net.minecraft.util.ActionResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -98,4 +100,11 @@ public class DiscordRPCManager implements IPCListener{ isConnected = false; } + public void init(){ + SkyblockLeaveCallback.EVENT.register(() -> { + stop(); + return ActionResult.PASS; + }); + } + } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index 66d04b50..045da7fe 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -1,6 +1,8 @@ package me.xmrvizzy.skyblocker.utils; import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; +import me.xmrvizzy.skyblocker.utils.events.SkyblockJoinCallback; +import me.xmrvizzy.skyblocker.utils.events.SkyblockLeaveCallback; import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.scoreboard.Scoreboard; @@ -34,10 +36,14 @@ public class Utils { isInjected = true; ItemTooltipCallback.EVENT.register(PriceInfoTooltip::onInjectTooltip); } - Events.onSkyblockJoin(); - + SkyblockJoinCallback.EVENT.invoker().join(); + isOnSkyblock = true; + } + if (!sidebar.get(0).contains("SKYBLOCK") && isOnSkyblock) { + SkyblockLeaveCallback.EVENT.invoker().leave(); + Utils.isOnSkyblock = false; + Utils.isInDungeons = false; } - if (!sidebar.get(0).contains("SKYBLOCK") && isOnSkyblock) Events.onSkyblockDisconnect(); isInDungeons = isOnSkyblock && string.contains("The Catacombs"); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockLeaveCallback.java b/src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockLeaveCallback.java new file mode 100644 index 00000000..c02ddba4 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockLeaveCallback.java @@ -0,0 +1,21 @@ +package me.xmrvizzy.skyblocker.utils.events; + +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.minecraft.util.ActionResult; + +public interface SkyblockLeaveCallback { + Event EVENT = EventFactory.createArrayBacked(SkyblockLeaveCallback.class, + (listeners) -> () -> { + for (SkyblockLeaveCallback listener : listeners) { + ActionResult result = listener.leave(); + + if(result != ActionResult.PASS) { + return result; + } + } + return ActionResult.PASS; + }); + + ActionResult leave(); +} -- cgit From 1971d74529540a230acff05bc87c82997462da67 Mon Sep 17 00:00:00 2001 From: TacoMonkey <75862693+TacoMonkey11@users.noreply.github.com> Date: Sun, 20 Mar 2022 11:17:12 -0400 Subject: Move events into one file --- .../skyblocker/discord/DiscordRPCManager.java | 8 ++---- .../xmrvizzy/skyblocker/utils/SkyblockEvents.java | 33 ++++++++++++++++++++++ .../xmrvizzy/skyblocker/utils/UpdateChecker.java | 11 +++----- .../java/me/xmrvizzy/skyblocker/utils/Utils.java | 6 ++-- .../utils/events/SkyblockJoinCallback.java | 21 -------------- .../utils/events/SkyblockLeaveCallback.java | 21 -------------- 6 files changed, 41 insertions(+), 59 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/SkyblockEvents.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockJoinCallback.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockLeaveCallback.java (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java index 68963809..867e16b2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java @@ -7,8 +7,7 @@ import com.jagrosh.discordipc.entities.RichPresence; import com.jagrosh.discordipc.entities.pipe.PipeStatus; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.Utils; -import me.xmrvizzy.skyblocker.utils.events.SkyblockLeaveCallback; -import net.minecraft.util.ActionResult; +import me.xmrvizzy.skyblocker.utils.SkyblockEvents; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -101,10 +100,7 @@ public class DiscordRPCManager implements IPCListener{ } public void init(){ - SkyblockLeaveCallback.EVENT.register(() -> { - stop(); - return ActionResult.PASS; - }); + SkyblockEvents.LEAVE.register(this::stop); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/SkyblockEvents.java b/src/main/java/me/xmrvizzy/skyblocker/utils/SkyblockEvents.java new file mode 100644 index 00000000..2dd83ffa --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/SkyblockEvents.java @@ -0,0 +1,33 @@ +package me.xmrvizzy.skyblocker.utils; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + +@Environment(EnvType.CLIENT) +public final class SkyblockEvents { + public static final Event JOIN = EventFactory.createArrayBacked(SkyblockEvents.SkyblockJoin.class, callbacks -> () -> { + for (SkyblockEvents.SkyblockJoin callback : callbacks) { + callback.onSkyblockJoin(); + } + }); + + public static final Event LEAVE = EventFactory.createArrayBacked(SkyblockEvents.SkyblockLeave.class, callbacks -> () -> { + for (SkyblockEvents.SkyblockLeave callback : callbacks) { + callback.onSkyblockLeave(); + } + }); + + @Environment(EnvType.CLIENT) + @FunctionalInterface + public interface SkyblockJoin { + void onSkyblockJoin(); + } + + @Environment(EnvType.CLIENT) + @FunctionalInterface + public interface SkyblockLeave { + void onSkyblockLeave(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java b/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java index b64541c9..8909b5a9 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java @@ -3,13 +3,11 @@ package me.xmrvizzy.skyblocker.utils; import com.google.gson.*; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.utils.events.SkyblockJoinCallback; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.text.ClickEvent; import net.minecraft.text.HoverEvent; import net.minecraft.text.TranslatableText; -import net.minecraft.util.ActionResult; import org.spongepowered.asm.util.VersionNumber; import java.io.IOException; @@ -53,8 +51,8 @@ public class UpdateChecker { } public static void init(){ - if (shouldUpdate()){ - SkyblockJoinCallback.EVENT.register(() -> { + SkyblockEvents.JOIN.register(() -> { + if (shouldUpdate()) { TranslatableText linkMessage = new TranslatableText("skyblocker.update.update_message"); TranslatableText linkMessageEnding = new TranslatableText("skyblocker.update.update_message_end"); TranslatableText link = new TranslatableText("skyblocker.update.update_link"); @@ -62,8 +60,7 @@ public class UpdateChecker { linkMessage.append(link.styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://modrinth.com/mod/skyblocker-liap/versions")).withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hoverText)))).append(linkMessageEnding); MinecraftClient.getInstance().player.sendMessage(linkMessage, false); - return ActionResult.PASS; - }); - } + } + }); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index 045da7fe..4551564d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -1,8 +1,6 @@ package me.xmrvizzy.skyblocker.utils; import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; -import me.xmrvizzy.skyblocker.utils.events.SkyblockJoinCallback; -import me.xmrvizzy.skyblocker.utils.events.SkyblockLeaveCallback; import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.scoreboard.Scoreboard; @@ -36,11 +34,11 @@ public class Utils { isInjected = true; ItemTooltipCallback.EVENT.register(PriceInfoTooltip::onInjectTooltip); } - SkyblockJoinCallback.EVENT.invoker().join(); + SkyblockEvents.JOIN.invoker().onSkyblockJoin(); isOnSkyblock = true; } if (!sidebar.get(0).contains("SKYBLOCK") && isOnSkyblock) { - SkyblockLeaveCallback.EVENT.invoker().leave(); + SkyblockEvents.LEAVE.invoker().onSkyblockLeave(); Utils.isOnSkyblock = false; Utils.isInDungeons = false; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockJoinCallback.java b/src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockJoinCallback.java deleted file mode 100644 index b5d621dd..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockJoinCallback.java +++ /dev/null @@ -1,21 +0,0 @@ -package me.xmrvizzy.skyblocker.utils.events; - -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; -import net.minecraft.util.ActionResult; - -public interface SkyblockJoinCallback { - Event EVENT = EventFactory.createArrayBacked(SkyblockJoinCallback.class, - (listeners) -> () -> { - for (SkyblockJoinCallback listener : listeners) { - ActionResult result = listener.join(); - - if(result != ActionResult.PASS) { - return result; - } - } - return ActionResult.PASS; - }); - - ActionResult join(); -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockLeaveCallback.java b/src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockLeaveCallback.java deleted file mode 100644 index c02ddba4..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/events/SkyblockLeaveCallback.java +++ /dev/null @@ -1,21 +0,0 @@ -package me.xmrvizzy.skyblocker.utils.events; - -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; -import net.minecraft.util.ActionResult; - -public interface SkyblockLeaveCallback { - Event EVENT = EventFactory.createArrayBacked(SkyblockLeaveCallback.class, - (listeners) -> () -> { - for (SkyblockLeaveCallback listener : listeners) { - ActionResult result = listener.leave(); - - if(result != ActionResult.PASS) { - return result; - } - } - return ActionResult.PASS; - }); - - ActionResult leave(); -} -- cgit From 61216edf3ebd20ce0e37ffdd0fc42e89068abe49 Mon Sep 17 00:00:00 2001 From: External Time <84183548+ExternalTime@users.noreply.github.com> Date: Wed, 27 Apr 2022 00:25:33 +0200 Subject: Separated parsing action bar and drawing hud. Rewrote parsing to be hopefully more robust. --- .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 2 + .../xmrvizzy/skyblocker/mixin/InGameHudMixin.java | 17 +- .../skyblocker/skyblock/FancyStatusBars.java | 215 +++++++-------------- .../skyblocker/skyblock/StatusBarTracker.java | 110 +++++++++++ .../skyblocker/skyblock/StatusBarTrackerTest.java | 74 +++++++ 5 files changed, 270 insertions(+), 148 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTracker.java create mode 100644 src/test/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTrackerTest.java (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index f3c851f1..f729019f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -3,6 +3,7 @@ package me.xmrvizzy.skyblocker; import me.xmrvizzy.skyblocker.container.ContainerSolverManager; import me.xmrvizzy.skyblocker.discord.DiscordRPCManager; import me.xmrvizzy.skyblocker.skyblock.BackpackPreview; +import me.xmrvizzy.skyblocker.skyblock.StatusBarTracker; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonBlaze; import me.xmrvizzy.skyblocker.utils.Scheduler; import me.xmrvizzy.skyblocker.utils.Utils; @@ -14,6 +15,7 @@ public class SkyblockerMod { public final Scheduler scheduler = new Scheduler(); public final ContainerSolverManager containerSolverManager = new ContainerSolverManager(); public final DiscordRPCManager discordRPCManager = new DiscordRPCManager(); + public final StatusBarTracker statusBarTracker = new StatusBarTracker(); private SkyblockerMod() { scheduler.scheduleCyclic(Utils::sbChecker, 20); diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java index b9e80bd6..9ceebf9f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java @@ -5,6 +5,7 @@ import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; 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.utils.Utils; import net.fabricmc.api.EnvType; @@ -24,14 +25,12 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - @Environment(EnvType.CLIENT) @Mixin(InGameHud.class) public abstract class InGameHudMixin extends DrawableHelper { private static final Identifier SLOT_LOCK = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/slot_lock.png"); + private final StatusBarTracker statusBarTracker = SkyblockerMod.getInstance().statusBarTracker; private final FancyStatusBars statusBars = new FancyStatusBars(); private MatrixStack hotbarMatrices; private int hotbarSlotIndex; @@ -44,13 +43,21 @@ public abstract class InGameHudMixin extends DrawableHelper { @Shadow private int scaledWidth; + @Shadow + private void setOverlayMessage(Text message, boolean tinted) { + } + @Inject(method = "setOverlayMessage(Lnet/minecraft/text/Text;Z)V", at = @At("HEAD"), cancellable = true) private void onSetOverlayMessage(Text message, boolean tinted, CallbackInfo ci) { - if(!Utils.isOnSkyblock) + if (!Utils.isOnSkyblock || !SkyblockerConfig.get().general.bars.enableBars) return; String msg = message.getString(); - if(statusBars.update(msg)) + String res = statusBarTracker.update(msg, SkyblockerConfig.get().messages.hideMana); + if (msg != res) { + if (res != null) + setOverlayMessage(Text.of(res), tinted); ci.cancel(); + } } @Inject(method = "renderHotbar", at = @At("HEAD")) diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java index 5d3cf9c4..c463ecb5 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java @@ -7,164 +7,93 @@ 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.Text; import net.minecraft.util.Identifier; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - public class FancyStatusBars extends DrawableHelper { - private static final MinecraftClient client = MinecraftClient.getInstance(); private static final Identifier BARS = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/bars.png"); - private static final Pattern ACTION_BAR_MANA = Pattern.compile("§b-\\d+ Mana \\(.*\\) +"); - private static final Pattern ACTION_BAR_STATUS = Pattern.compile("^§[6c](\\d+)/(\\d+)❤(\\+§c\\d+.)? +(?:§a(\\d+)§a❈ Defense|([^✎]*?))?(?: +§b(\\d+)/(\\d+)✎ +(?:Mana|§3(\\d+)ʬ))?(?: +(§[27].*))?$"); - - private final Resource[] resources = new Resource[]{ - // Health - new Resource(16733525), - // Mana - new Resource(5636095), - // Defense - new Resource(12106180), - // Experience - new Resource(8453920), - }; - - public boolean update(String actionBar) { - if (!SkyblockerConfig.get().general.bars.enableBars) { - if (SkyblockerConfig.get().messages.hideMana) { - Matcher mana = ACTION_BAR_MANA.matcher(actionBar); - if (mana.find()) { - assert client.player != null; - client.player.sendMessage(Text.of(actionBar.replace(mana.group(), "")), true); - return true; - } - } - return false; - } - - Matcher matcher = ACTION_BAR_STATUS.matcher(actionBar); - if (!matcher.matches()) - return false; - - resources[0].setMax(Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2))); - if (matcher.group(4) != null) { - int def = Integer.parseInt(matcher.group(4)); - resources[2].setFillLevel(def, (double) def / ((double) def + 100D)); - } - if (matcher.group(6) != null) { - int m = Integer.parseInt(matcher.group(6)); - if (matcher.group(8) != null) - m += Integer.parseInt(matcher.group(8)); - resources[1].setMax(m, Integer.parseInt(matcher.group(7))); - } - assert client.player != null; - resources[3].setFillLevel(client.player.experienceLevel, client.player.experienceProgress); - StringBuilder sb = new StringBuilder(); - if (matcher.group(3) != null) { - sb.append("§c").append(matcher.group(3)); - } - if (SkyblockerConfig.get().messages.hideMana) { - Matcher mana = ACTION_BAR_MANA.matcher(actionBar); - if (!mana.find()) - appendIfNotNull(sb, matcher.group(5)); - } else { - appendIfNotNull(sb, matcher.group(5)); - } - appendIfNotNull(sb, matcher.group(9)); + private final MinecraftClient client = MinecraftClient.getInstance(); + private final StatusBarTracker statusBarTracker = SkyblockerMod.getInstance().statusBarTracker; - if (!sb.isEmpty()) { - assert client.player != null; - client.player.sendMessage(Text.of(sb.toString()), true); - } + private final StatusBar[] bars = new StatusBar[]{ + new StatusBar(0, 16733525, 2), + new StatusBar(1, 5636095, 2), + new StatusBar(2, 12106180, 1), + new StatusBar(3, 8453920, 1), + }; - return true; - } + private int left; + private int top; - private void appendIfNotNull(StringBuilder sb, String str) { - if (str == null) - return; - if (!sb.isEmpty()) - sb.append(" "); - sb.append(str); + private int fill(int value, int max) { + return (32 * value - 1) / max; } - private static final int BAR_SPACING = 46; - public boolean render(MatrixStack matrices, int scaledWidth, int scaledHeight) { - if (!SkyblockerConfig.get().general.bars.enableBars) + var player = client.player; + if (!SkyblockerConfig.get().general.bars.enableBars || player == null) return false; - int left = scaledWidth / 2 - 91; - int top = scaledHeight - 35; - RenderSystem.setShaderTexture(0, BARS); - for (int i = 0; i < 4; i++) { - this.drawTexture(matrices, left + i * BAR_SPACING, top, 0, 9 * i, 43, 9); - int fillCount = resources[i].getFillCount(); - for (int j = 0; j < fillCount; j++) { - this.drawTexture(matrices, left + 11 + i * BAR_SPACING, top, 43 + 31 * j, 9 * i, Resource.INNER_WIDTH, 9); - } - int fillLevel = resources[i].getFillLevel(); - if (0 < fillLevel) - this.drawTexture(matrices, left + 11 + i * BAR_SPACING, top, 43 + 31 * fillCount, 9 * i, fillLevel, 9); - } - for (int i = 0; i < 4; i++) { - renderText(matrices, resources[i].getValue(), left + 11 + i * BAR_SPACING, top, resources[i].getTextColor()); - } - return true; - } + left = scaledWidth / 2 - 91; + top = scaledHeight - 35; - private void renderText(MatrixStack matrices, int value, int left, int top, int color) { - TextRenderer textRenderer = client.textRenderer; - String text = Integer.toString(value); - int x = left + (33 - textRenderer.getWidth(text)) / 2; - int y = top - 3; + bars[0].update(statusBarTracker.getHealth()); + bars[1].update(statusBarTracker.getMana()); + int def = statusBarTracker.getDefense(); + bars[2].fill[0] = fill(def, def + 100); + bars[2].text = def; + bars[3].fill[0] = (int) (32 * player.experienceProgress); + bars[3].text = player.experienceLevel; - // for i in [-1, 1] - for (int i = -1; i < 2; i += 2) { - textRenderer.draw(matrices, text, (float) (x + i), (float) y, 0); - textRenderer.draw(matrices, text, (float) x, (float) (y + i), 0); - } - - textRenderer.draw(matrices, text, (float) x, (float) y, color); + RenderSystem.setShaderTexture(0, BARS); + for (var bar : bars) + bar.draw(matrices); + for (var bar : bars) + bar.drawText(matrices); + return true; } - private static class Resource { - static final int INNER_WIDTH = 31; - private int value; - private int fillLevel; - private final int textColor; - - public Resource(int textColor) { - this.value = 0; - this.fillLevel = INNER_WIDTH; - this.textColor = textColor; - } - - public void setMax(int value, int max) { - this.value = value; - this.fillLevel = value * INNER_WIDTH / max; - } - - public void setFillLevel(int value, double fillLevel) { - this.value = value; - this.fillLevel = (int) (INNER_WIDTH * fillLevel); - } - - public int getValue() { - return value; - } - - public int getFillCount() { - return fillLevel / INNER_WIDTH; - } - - public int getFillLevel() { - return fillLevel % INNER_WIDTH; - } - - public int getTextColor() { - return textColor; + private class StatusBar { + public final int[] fill; + private final int offsetX; + private final int v; + private final int text_color; + public Object text; + + private StatusBar(int i, int textColor, int fillNum) { + this.offsetX = i * 46; + this.v = i * 9; + this.text_color = textColor; + this.fill = new int[fillNum]; + this.fill[0] = 33; + this.text = ""; + } + + public void update(StatusBarTracker.Resource resource) { + int max = resource.max(); + int val = resource.value(); + this.fill[0] = fill(val, max); + this.fill[1] = fill(resource.overflow(), max); + this.text = val; + } + + public void draw(MatrixStack matrices) { + drawTexture(matrices, left + offsetX, top, 0, v, 43, 9); + for (int i = 0; i < fill.length; i++) + drawTexture(matrices, left + offsetX + 11, top, 43 + i * 31, v, fill[i], 9); + } + + public void drawText(MatrixStack matrices) { + TextRenderer textRenderer = client.textRenderer; + String text = this.text.toString(); + int x = left + this.offsetX + 11 + (33 - textRenderer.getWidth(text)) / 2; + int y = top - 3; + + 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); + } + textRenderer.draw(matrices, text, (float) x, (float) y, text_color); } } -} \ No newline at end of file +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTracker.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTracker.java new file mode 100644 index 00000000..0111f75a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTracker.java @@ -0,0 +1,110 @@ +package me.xmrvizzy.skyblocker.skyblock; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class StatusBarTracker { + private static final Pattern STATUS_HEALTH = Pattern.compile("§[6c](\\d+)/(\\d+)❤(?:(\\+§c\\d+. *)| *)"); + private static final Pattern DEFENSE_STATUS = Pattern.compile("§a(\\d+)§a❈ Defense *"); + private static final Pattern MANA_USE = Pattern.compile("§b-\\d+ Mana \\(§\\S+(?:\\s\\S+)* *"); + private static final Pattern MANA_STATUS = Pattern.compile("§b(\\d+)/(\\d+)✎ (?:Mana|§3(\\d+)ʬ) *"); + + private Resource health = new Resource(100, 100, 0); + private Resource mana = new Resource(100, 100, 0); + private int defense = 0; + + public Resource getHealth() { + return this.health; + } + + public Resource getMana() { + return this.mana; + } + + public int getDefense() { + return this.defense; + } + + private int parseInt(Matcher m, int group) { + return Integer.parseInt(m.group(group)); + } + + private void updateMana(Matcher m) { + int value = parseInt(m, 1); + int max = parseInt(m, 2); + int overflow = m.group(3) == null ? 0 : parseInt(m, 3); + this.mana = new Resource(value, max, overflow); + } + + private void updateHealth(Matcher m) { + int value = parseInt(m, 1); + int max = parseInt(m, 2); + int overflow = 0; + ClientPlayerEntity player = null; + try { + player = MinecraftClient.getInstance().player; + } + // Is triggered by tests. Couldn't come up with a better solution. + catch (NullPointerException ignored) { + } + if (player != null) { + int hp = (int) (player.getHealth() * max / player.getMaxHealth()); + overflow = value - hp; + value = hp; + } else if (value > max) { + overflow = value - max; + value = max; + } + if (overflow > max) + overflow = max; + this.health = new Resource(value, max, overflow); + } + + private String reset(String str, Matcher m) { + str = str.substring(m.end()); + m.reset(str); + return str; + } + + public String update(String actionBar, boolean filterManaUse) { + var sb = new StringBuilder(); + Matcher matcher = STATUS_HEALTH.matcher(actionBar); + if (!matcher.lookingAt()) + return actionBar; + updateHealth(matcher); + if (matcher.group(3) != null) { + sb.append("§c❤"); + sb.append(matcher.group(3)); + } + actionBar = reset(actionBar, matcher); + if (matcher.usePattern(MANA_STATUS).lookingAt()) { + defense = 0; + updateMana(matcher); + actionBar = reset(actionBar, matcher); + } else { + if (matcher.usePattern(DEFENSE_STATUS).lookingAt()) { + defense = parseInt(matcher, 1); + actionBar = reset(actionBar, matcher); + } else if (filterManaUse && matcher.usePattern(MANA_USE).lookingAt()) { + actionBar = reset(actionBar, matcher); + } + if (matcher.usePattern(MANA_STATUS).find()) { + updateMana(matcher); + matcher.appendReplacement(sb, ""); + } + } + matcher.appendTail(sb); + String res = sb.toString().trim(); + return res.isEmpty() ? null : res; + } + + public record Resource( + int value, + int max, + int overflow + ) { + } +} diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTrackerTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTrackerTest.java new file mode 100644 index 00000000..da919699 --- /dev/null +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTrackerTest.java @@ -0,0 +1,74 @@ +package me.xmrvizzy.skyblocker.skyblock; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class StatusBarTrackerTest { + private StatusBarTracker tracker; + + @BeforeEach + void setUp() { + tracker = new StatusBarTracker(); + } + + void assertStats(int hp, int maxHp, int def, int mana, int maxMana, int overflowMana) { + int absorption = 0; + if(hp > maxHp) { + absorption = hp - maxHp; + hp -= absorption; + if(absorption > maxHp) + absorption = maxHp; + } + assertEquals(new StatusBarTracker.Resource(hp, maxHp, absorption), tracker.getHealth()); + assertEquals(new StatusBarTracker.Resource(mana, maxMana, overflowMana), tracker.getMana()); + } + + @Test + void normalStatusBar() { + String res = tracker.update("§c934/1086❤ §a159§a❈ Defense §b562/516✎ Mana", false); + assertNull(res); + assertStats(934, 1086, 159, 562, 516, 0); + } + + @Test + void overflowMana() { + String res = tracker.update("§61605/1305❤ §a270§a❈ Defense §b548/548✎ §3200ʬ", false); + assertNull(res); + assertStats(1605, 1305, 270, 548, 548, 200); + } + + @Test + void regeneration() { + String res = tracker.update("§c2484/2484❤+§c120▄ §a642§a❈ Defense §b2557/2611✎ Mana", false); + assertEquals("§c❤+§c120▄", res); + } + + @Test + void instantTransmission() { + String actionBar = "§c2259/2259❤ §b-20 Mana (§6Instant Transmission§b) §b549/2676✎ Mana"; + assertEquals("§b-20 Mana (§6Instant Transmission§b)", tracker.update(actionBar, false)); + assertNull(tracker.update(actionBar, true)); + } + + @Test + void rapidFire() { + String actionBar = "§c2509/2509❤ §b-48 Mana (§6Rapid-fire§b) §b2739/2811✎ Mana"; + assertEquals("§b-48 Mana (§6Rapid-fire§b)", tracker.update(actionBar, false)); + assertNull(tracker.update(actionBar, true)); + } + + @Test + void zombieSword() { + String actionBar = "§c2509/2509❤ §b-56 Mana (§6Instant Heal§b) §b2674/2821✎ Mana §e§lⓩⓩⓩⓩ§6§lⓄ"; + assertEquals("§b-56 Mana (§6Instant Heal§b) §e§lⓩⓩⓩⓩ§6§lⓄ", tracker.update(actionBar, false)); + assertEquals("§e§lⓩⓩⓩⓩ§6§lⓄ", tracker.update(actionBar, true)); + } + + @Test + void campfire() { + String res = tracker.update("§c17070/25565❤+§c170▃ §65,625 DPS §c1 second §b590/626✎ §3106ʬ", false); + assertEquals("§c❤+§c170▃ §65,625 DPS §c1 second", res); + } +} -- cgit From 9a1eebebd9ce9b7b04991fe1940bcad78f509f0b Mon Sep 17 00:00:00 2001 From: Spencer <75862693+TacoMonkey11@users.noreply.github.com> Date: Mon, 2 May 2022 19:35:32 -0400 Subject: remove useless class --- .../java/me/xmrvizzy/skyblocker/utils/Events.java | 35 ---------------------- 1 file changed, 35 deletions(-) delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/Events.java (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Events.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Events.java deleted file mode 100644 index 9c488f34..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Events.java +++ /dev/null @@ -1,35 +0,0 @@ -package me.xmrvizzy.skyblocker.utils; - -import me.xmrvizzy.skyblocker.SkyblockerMod; -import net.minecraft.client.MinecraftClient; -import net.minecraft.text.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class Events { - public static MinecraftClient client = MinecraftClient.getInstance(); - public static Logger LOGGER = LoggerFactory.getLogger(SkyblockerMod.NAMESPACE); - - public static void onSkyblockJoin(){ - Utils.isOnSkyblock = true; - LOGGER.info("[Skyblocker] Joined Skyblock"); - if (UpdateChecker.shouldUpdate()){ - TranslatableText linkMessage = new TranslatableText("skyblocker.update.update_message"); - TranslatableText linkMessageEnding = new TranslatableText("skyblocker.update.update_message_end"); - TranslatableText link = new TranslatableText("skyblocker.update.update_link"); - TranslatableText hoverText = new TranslatableText("skyblocker.update.hover_text"); - linkMessage.append(link.styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://modrinth.com/mod/skyblocker-liap/versions")).withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hoverText)))).append(linkMessageEnding); - - if (client.player != null) { - client.player.sendMessage(linkMessage, false); - } - } - } - - public static void onSkyblockDisconnect(){ - LOGGER.info("[Skyblocker] Disconnected from Skyblock"); - SkyblockerMod.getInstance().discordRPCManager.stop(); - Utils.isOnSkyblock = false; - Utils.isInDungeons = false; - } -} -- cgit From 7baa58d98a6322e6c0f43ceaa46d9d2ea2f82c3c Mon Sep 17 00:00:00 2001 From: LifeIsAParadox Date: Tue, 3 May 2022 14:15:59 +0200 Subject: Fix trivia --- .../me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'src') 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 673797d4..7f22f59b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java @@ -60,16 +60,15 @@ public class Trivia extends ChatPatternListener { answers.put("What is the status of Thorn?", new String[]{"Shaman Necromancer"}); answers.put("What is the status of Livid?", new String[]{"Master Necromancer"}); answers.put("What is the status of Sadan?", new String[]{"Necromancer Lord"}); - answers.put("What is the status of Maxor?", new String[]{"Young Wither"}); - answers.put("What is the status of Goldor?", new String[]{"Wither Soldier"}); - answers.put("What is the status of Storm?", new String[]{"Elementalist"}); - answers.put("What is the status of Necron?", new String[]{"Wither Lord"}); - answers.put("How many total Fairy Souls are there?", new String[]{"227 Fairy Souls"}); + answers.put("What is the status of Maxor?", new String[]{"The Wither Lords"}); + answers.put("What is the status of Goldor?", new String[]{"The Wither Lords"}); + 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("How many total Fairy Souls are there?", new String[]{"238 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 Barn?", new String[]{"7 Fairy Souls"}); - answers.put("How many Fairy Souls are there in Mushroom Desert?", new String[]{"13 Fairy Souls"}); - answers.put("How many Fairy Souls are there in Blazing Fortress?", new String[]{"19 Fairy Souls"}); + answers.put("How many Fairy Souls are there in The Farming Islands?", new String[]{"20 Fairy Souls"}); + answers.put("How many Fairy Souls are there in Crimson Isle?", new String[]{"29 Fairy Souls"}); answers.put("How many Fairy Souls are there in The Park?", new String[]{"11 Fairy Souls"}); answers.put("How many Fairy Souls are there in Jerry's Workshop?", new String[]{"5 Fairy Souls"}); answers.put("How many Fairy Souls are there in Hub?", new String[]{"79 Fairy Souls"}); @@ -83,7 +82,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[]{"55 Minions"}); + answers.put("How many unique minions are there?", new String[]{"58 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"}); -- cgit From 6f9fd121f5c77202a8103a047f315d5ffcef93ed Mon Sep 17 00:00:00 2001 From: LifeIsAParadox Date: Tue, 3 May 2022 14:16:50 +0200 Subject: fix legacy "timestamp" conversion --- .../skyblocker/skyblock/item/PriceInfoTooltip.java | 32 ++++++++++++++++++---- 1 file changed, 27 insertions(+), 5 deletions(-) (limited to 'src') 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 3a5980f0..fdff7831 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java @@ -13,7 +13,6 @@ import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.Formatting; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,8 +20,10 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; -import java.time.Month; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.Locale; import java.util.concurrent.CompletableFuture; @@ -180,6 +181,20 @@ public class PriceInfoTooltip { return stack.getNbt(); } + /** + * this method converts the "timestamp" variable into the same date format as Hypixel represents it in the museum. + * Currently there are two types of timestamps the legacy which is built like this + * "dd/MM/yy hh:mm" ("25/04/20 16:38") and the current which is built like this + * "MM/dd/yy hh:mm aa" ("12/24/20 11:08 PM"). Since Hypixel transforms the two formats into one format without + * taking into account of their formats, we do the same. The final result looks like this + * "MMMM dd, yyyy" (December 24, 2020). + * Since the legacy format has a 25 as "month" SimpleDateFormat converts the 25 into 2 years and 1 month and makes + * "25/04/20 16:38" -> "January 04, 2022" instead of "April 25, 2020". + * This causes the museum rank to be much worse than it should be. + * + * @param stack the item under the pointer + * @return if the item have an "Timestamp" it will be shown formated on the tooltip + */ public static String getTimestamp(ItemStack stack) { NbtCompound tag = getInternalNameForItem(stack); String internalName = null; @@ -187,9 +202,16 @@ public class PriceInfoTooltip { NbtCompound ea = tag.getCompound("ExtraAttributes"); if (ea.contains("timestamp", 8)) { - internalName = ea.getString("timestamp").replaceAll("\\s(.*)", ""); - int month = Integer.parseInt(internalName.replaceAll("(\\d+)/(\\d+)/(\\d+)", "$1")); - internalName = StringUtils.capitalize(internalName.replaceAll("(\\d+)/(\\d+)/(\\d+)", Month.of(month) + " $2, 20$3").toLowerCase()); + internalName = ea.getString("timestamp"); + SimpleDateFormat dt = new SimpleDateFormat("MM/dd/yy"); + + try { + Date date = dt.parse(internalName); + SimpleDateFormat dt1 = new SimpleDateFormat("MMMM dd, yyyy", Locale.ENGLISH); + internalName = dt1.format(date); + } catch (ParseException e) { + LOGGER.warn("[Skyblocker-tooltip] getTimestamp", e); + } } } return internalName; -- cgit From 231450a50ec0e5b4632bf961fbb821b7c899424d Mon Sep 17 00:00:00 2001 From: Spencer <75862693+TacoMonkey11@users.noreply.github.com> Date: Tue, 3 May 2022 08:18:45 -0400 Subject: use new events --- src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java index 43d5f9f7..9240587f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java @@ -2,6 +2,7 @@ package me.xmrvizzy.skyblocker.discord; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.SkyblockEvents; import me.xmrvizzy.skyblocker.utils.Utils; import meteordevelopment.discordipc.DiscordIPC; import meteordevelopment.discordipc.RichPresence; @@ -17,6 +18,10 @@ public class DiscordRPCManager { public static long startTimeStamp; public static int cycleCount; + public static void init(){ + SkyblockEvents.LEAVE.register(DiscordIPC::stop); + } + public void update(){ if (!SkyblockerConfig.get().richPresence.enableRichPresence || !Utils.isOnSkyblock){ if (DiscordIPC.isConnected()) DiscordIPC.stop(); -- cgit From 6a0a4962018840a82cc464eaf05bd9c8e2a9f284 Mon Sep 17 00:00:00 2001 From: Spencer <75862693+TacoMonkey11@users.noreply.github.com> Date: Tue, 3 May 2022 15:56:50 -0400 Subject: add default message --- src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java | 2 +- src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 622e4584..93e1d8e9 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -65,7 +65,7 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.Gui.Tooltip() public Info info = Info.LOCATION; public boolean cycleMode = false; - public String customMessage = "All on Fabric!"; + public String customMessage; } public static class ItemList { diff --git a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java index 9240587f..bb141690 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java @@ -1,6 +1,7 @@ package me.xmrvizzy.skyblocker.discord; +import me.shedaniel.autoconfig.AutoConfig; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.SkyblockEvents; import me.xmrvizzy.skyblocker.utils.Utils; @@ -23,6 +24,10 @@ public class DiscordRPCManager { } public void update(){ + if (SkyblockerConfig.get().richPresence.customMessage.isBlank()) { + SkyblockerConfig.get().richPresence.customMessage = "All on Fabric!"; + AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); + } if (!SkyblockerConfig.get().richPresence.enableRichPresence || !Utils.isOnSkyblock){ if (DiscordIPC.isConnected()) DiscordIPC.stop(); } -- cgit From c015f85445e813154bcf62ce345953bd3311ae05 Mon Sep 17 00:00:00 2001 From: LifeIsAParadox Date: Tue, 3 May 2022 22:46:03 +0200 Subject: fix nullpointer exception --- .../java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java index bb141690..87405989 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java @@ -24,9 +24,11 @@ public class DiscordRPCManager { } public void update(){ - if (SkyblockerConfig.get().richPresence.customMessage.isBlank()) { - SkyblockerConfig.get().richPresence.customMessage = "All on Fabric!"; - AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); + if (SkyblockerConfig.get().richPresence.customMessage != null ) { + if (SkyblockerConfig.get().richPresence.customMessage.isBlank()) { + SkyblockerConfig.get().richPresence.customMessage = "All on Fabric!"; + AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); + } } if (!SkyblockerConfig.get().richPresence.enableRichPresence || !Utils.isOnSkyblock){ if (DiscordIPC.isConnected()) DiscordIPC.stop(); -- cgit From 27ce53e6550da16a8c89401b92f204810cd61eb9 Mon Sep 17 00:00:00 2001 From: Trương Hoàng Long Date: Wed, 4 May 2022 03:03:43 +0200 Subject: Fix some items having the wrong texture Added variants for some blocks Added missing enchantment glints --- .../skyblock/itemlist/ItemFixerUpper.java | 70 +++++++++++++++++++++- .../skyblock/itemlist/ItemStackBuilder.java | 13 ++-- 2 files changed, 73 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java index b694f451..4c56546d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java @@ -27,12 +27,11 @@ public class ItemFixerUpper { Map.entry("minecraft:netherbrick", "minecraft:nether_brick"), Map.entry("minecraft:stained_hardened_clay", "minecraft:terracotta"), Map.entry("minecraft:quartz_ore", "minecraft:nether_quartz_ore"), - Map.entry("minecraft:fish", "minecraft:cod"), - Map.entry("minecraft:cooked_fish", "minecraft:cooked_cod"), Map.entry("minecraft:red_flower", "minecraft:poppy"), Map.entry("minecraft:tallgrass", "minecraft:grass"), Map.entry("minecraft:stone_slab2", "minecraft:red_sandstone_slab"), - Map.entry("minecraft:waterlily", "minecraft:lily_pad") + Map.entry("minecraft:waterlily", "minecraft:lily_pad"), + Map.entry("minecraft:stone_stairs", "minecraft:cobblestone_stairs") ); private final static String[] DYE_COLORS = { @@ -136,6 +135,63 @@ public class ItemFixerUpper { "minecraft:creeper_head" }; + private final static String[] FISH_VARIANTS = { + "minecraft:cod", + "minecraft:salmon", + "minecraft:tropical_fish", + "minecraft:pufferfish" + }; + + private final static String[] COOKED_FISH_VARIANTS = { + "minecraft:cooked_cod", + "minecraft:cooked_salmon" + }; + + private final static String[] STONE_VARIANTS = { + "minecraft:stone", + "minecraft:granite", + "minecraft:polished_granite", + "minecraft:diorite", + "minecraft:polished_diorite", + "minecraft:andesite", + "minecraft:polished_andesite" + }; + + private final static String[] STONE_SLAB_VARIANTS = { + "minecraft:smooth_stone_slab", + "minecraft:sandstone_slab", + "minecraft:barrier", // doesn't exist + "minecraft:cobblestone_slab", + "minecraft:brick_slab", + "minecraft:stone_brick_slab", + "minecraft:nether_brick_slab", + "minecraft:quartz_slab" + }; + + private final static String[] COBBLESTONE_WALL_VARIANTS = { + "minecraft:cobblestone_wall", + "minecraft:mossy_cobblestone_wall" + }; + + private final static String[] DIRT_VARIANTS = { + "minecraft:dirt", + "minecraft:coarse_dirt", + "minecraft:podzol" + }; + + private final static String[] SPONGE_VARIANTS = { + "minecraft:sponge", + "minecraft:wet_sponge" + }; + + private final static String[] PRISMARINE_VARIANTS = { + "minecraft:prismarine", + "minecraft:prismarine_bricks", + "minecraft:dark_prismarine" + }; + + // TODO: map potions to their correct colors + public static String convertItemId(String id, int damage) { if (id.equals("minecraft:dye")) return DYE_COLORS[damage]; if (id.equals("minecraft:log2")) return "minecraft:" + TREE_VARIANTS[damage + 4] + "log"; @@ -145,6 +201,14 @@ public class ItemFixerUpper { if (id.equals("minecraft:spawn_egg")) return SPAWN_EGG_VARIANTS.getOrDefault(damage, "minecraft:ghast_spawn_egg"); if (id.equals("minecraft:banner")) return "minecraft:" + BLOCK_COLORS[15 - damage] + "banner"; if (id.equals("minecraft:skull")) return SKULL_VARIANTS[damage]; + if (id.equals("minecraft:fish")) return FISH_VARIANTS[damage]; + if (id.equals("minecraft:cooked_fish")) return COOKED_FISH_VARIANTS[damage]; + if (id.equals("minecraft:stone")) return STONE_VARIANTS[damage]; + if (id.equals("minecraft:stone_slab")) return STONE_SLAB_VARIANTS[damage]; + if (id.equals("minecraft:cobblestone_wall")) return COBBLESTONE_WALL_VARIANTS[damage]; + if (id.equals("minecraft:dirt")) return DIRT_VARIANTS[damage]; + if (id.equals("minecraft:sponge")) return SPONGE_VARIANTS[damage]; + if (id.equals("minecraft:prismarine")) return PRISMARINE_VARIANTS[damage]; id = MAPPING.getOrDefault(id, id); if (Registry.ITEM.get(new Identifier(id)).equals(Items.AIR)) { 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 f21c7ccb..fbbd49d7 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemStackBuilder.java @@ -47,13 +47,6 @@ public class ItemStackBuilder { tag.put("ExtraAttributes", extra); extra.put("id", NbtString.of(internalName)); - // add enchantment glint - if (internalName.contains("ENCHANTED")) { - NbtList enchantments = new NbtList(); - enchantments.add(new NbtCompound()); - tag.put("Enchantments", enchantments); - } - NbtCompound display = new NbtCompound(); tag.put("display", display); @@ -90,6 +83,12 @@ public class ItemStackBuilder { NbtInt color = NbtInt.of(Integer.parseInt(colorMatcher.group(1))); display.put("color", color); } + // add enchantment glint + if (nbttag.contains("ench:")) { + NbtList enchantments = new NbtList(); + enchantments.add(new NbtCompound()); + tag.put("Enchantments", enchantments); + } return ItemStack.fromNbt(root); } -- cgit From 56e411f89a200f423ab6c2315492034571e3623f Mon Sep 17 00:00:00 2001 From: ADON15c Date: Thu, 26 May 2022 22:10:36 -0600 Subject: Added support for moving and resizing fancy bars --- .../skyblocker/skyblock/FancyStatusBars.java | 105 +++++++++++++++++---- 1 file changed, 88 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java index c463ecb5..48ef3251 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java @@ -16,25 +16,38 @@ public class FancyStatusBars extends DrawableHelper { private final StatusBarTracker statusBarTracker = SkyblockerMod.getInstance().statusBarTracker; private final StatusBar[] bars = new StatusBar[]{ - new StatusBar(0, 16733525, 2), - new StatusBar(1, 5636095, 2), - new StatusBar(2, 12106180, 1), - new StatusBar(3, 8453920, 1), + new StatusBar(0, 16733525, 2), // Health Bar + new StatusBar(1, 5636095, 2), // Intelligence Bar + new StatusBar(2, 12106180, 1), // Defence Bar + new StatusBar(3, 8453920, 1), // Experience Bar }; - private int left; - private int top; + // Positions to show the bars + // 0: Hotbar Layer 1, 1: Hotbar Layer 2, 2: Right of hotbar + private final int[] anchorsX = new int[3]; + private final int[] anchorsY = new int[3]; + + public FancyStatusBars() { + moveBar(0, 0); + moveBar(1, 0); + moveBar(2, 0); + moveBar(3, 0); + } private int fill(int value, int max) { - return (32 * value - 1) / max; + return (100 * value) / max; } public boolean render(MatrixStack matrices, int scaledWidth, int scaledHeight) { var player = client.player; if (!SkyblockerConfig.get().general.bars.enableBars || player == null) return false; - left = scaledWidth / 2 - 91; - top = scaledHeight - 35; + anchorsX[0] = scaledWidth / 2 - 91; + anchorsY[0] = scaledHeight - 33; + anchorsX[1] = anchorsX[0]; + anchorsY[1] = anchorsY[0] - 13; + anchorsX[2] = (scaledWidth / 2 + 91) + 2; + anchorsY[2] = scaledHeight - 16; bars[0].update(statusBarTracker.getHealth()); bars[1].update(statusBarTracker.getMana()); @@ -52,19 +65,64 @@ public class FancyStatusBars extends DrawableHelper { return true; } + public void moveBar(int bar, int location) { + // Set the bar to the new anchor + bars[bar].anchorNum = location; + + // Count how many bars are in each location + int layer1Count = 0, layer2Count = 0, rightCount = 0; + for (int i = 0; i < 4; i++) { + switch (bars[i].anchorNum) { + case 0: + layer1Count++; + break; + case 1: + layer2Count++; + break; + case 2: + rightCount++; + break; + } + } + + // Set the bars width and offsetX according to their anchor and how many bars are on that layer + int adjustedLayer1Count = 0, adjustedLayer2Count = 0, adjustedRightCount = 0; + for (int i = 0; i < 4; i++) { + switch (bars[i].anchorNum) { + case 0: + bars[i].bar_width = (172 - ((layer1Count - 1) * 11)) / layer1Count; + bars[i].offsetX = adjustedLayer1Count * (bars[i].bar_width + 11 + (layer1Count == 3 ? 0 : 1)); + adjustedLayer1Count++; + break; + case 1: + bars[i].bar_width = (172 - ((layer2Count - 1) * 11)) / layer2Count; + bars[i].offsetX = adjustedLayer2Count * (bars[i].bar_width + 11 + (layer2Count == 3 ? 0 : 1)); + adjustedLayer2Count++; + break; + case 2: + bars[i].bar_width = 50; + bars[i].offsetX = adjustedRightCount * (50 + 11); + adjustedRightCount++; + break; + } + } + } + private class StatusBar { public final int[] fill; - private final int offsetX; + public int offsetX; private final int v; private final int text_color; + public int anchorNum; + public int bar_width; public Object text; private StatusBar(int i, int textColor, int fillNum) { - this.offsetX = i * 46; this.v = i * 9; this.text_color = textColor; this.fill = new int[fillNum]; - this.fill[0] = 33; + this.fill[0] = 100; + this.anchorNum = 0; this.text = ""; } @@ -77,16 +135,29 @@ public class FancyStatusBars extends DrawableHelper { } public void draw(MatrixStack matrices) { - drawTexture(matrices, left + offsetX, top, 0, v, 43, 9); - for (int i = 0; i < fill.length; i++) - drawTexture(matrices, left + offsetX + 11, top, 43 + i * 31, v, fill[i], 9); + // Draw the icon for the bar + drawTexture(matrices, 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); + for (int i = 2; i < bar_width - 2; i++) + drawTexture(matrices, anchorsX[anchorNum] + offsetX + 10 + i, anchorsY[anchorNum], 12, v, 1, 9); + drawTexture(matrices, anchorsX[anchorNum] + offsetX + 10 + bar_width - 2, anchorsY[anchorNum], 41, v, 2, 9); + + // Draw the filled part of the bar + for (int i = 0; i < fill.length; i++) { + for (int j = (bar_width - 3); j >= 0; j--) { + if ( Math.max((j * 100)/(bar_width - 3), 1) > fill[i]) continue; + drawTexture(matrices, anchorsX[anchorNum] + offsetX + 11 + j, anchorsY[anchorNum], ((j == 0 || j == bar_width - 3) ? 43 : 44) + i * 31, v, 1, 9); + } + } } public void drawText(MatrixStack matrices) { TextRenderer textRenderer = client.textRenderer; String text = this.text.toString(); - int x = left + this.offsetX + 11 + (33 - textRenderer.getWidth(text)) / 2; - int y = top - 3; + int x = anchorsX[anchorNum] + this.offsetX + 11 + (bar_width - textRenderer.getWidth(text)) / 2; + int y = anchorsY[anchorNum] - 3; final int[] offsets = new int[]{-1, 1}; for (int i : offsets) { -- cgit From 678025b21af4d45518a382b546c14fb12f131114 Mon Sep 17 00:00:00 2001 From: Trương Hoàng Long Date: Fri, 27 May 2022 16:06:50 +0200 Subject: Add option to use 1.8 farmland hitbox also moved the old lever hitbox config option to the same category --- .../skyblocker/config/SkyblockerConfig.java | 27 ++++++++++++------ .../skyblocker/mixin/FarmlandBlockMixin.java | 33 ++++++++++++++++++++++ .../skyblocker/skyblock/dungeon/OldLever.java | 2 +- .../resources/assets/skyblocker/lang/en_us.json | 4 ++- src/main/resources/skyblocker.mixins.json | 1 + 5 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 93e1d8e9..5357fade 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -37,21 +37,25 @@ public class SkyblockerConfig implements ConfigData { public String apiKey; @ConfigEntry.Category("bars") - @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) public Bars bars = new Bars(); @ConfigEntry.Category("itemList") - @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) public ItemList itemList = new ItemList(); @ConfigEntry.Category("quicknav") - @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) public Quicknav quicknav = new Quicknav(); @ConfigEntry.Category("itemTooltip") - @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) public ItemTooltip itemTooltip = new ItemTooltip(); + @ConfigEntry.Category("hitbox") + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) + public Hitbox hitbox = new Hitbox(); + @ConfigEntry.Gui.Excluded public List lockedSlots = new ArrayList<>(); } @@ -59,6 +63,12 @@ public class SkyblockerConfig implements ConfigData { public static class Bars { public boolean enableBars = true; } + + public static class Hitbox { + public boolean oldFarmlandHitbox = true; + public boolean oldLeverHitbox = false; + } + public static class RichPresence { public boolean enableRichPresence = false; @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) @@ -103,11 +113,11 @@ public class SkyblockerConfig implements ConfigData { public static class Locations { @ConfigEntry.Category("dungeons") - @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) public Dungeons dungeons = new Dungeons(); @ConfigEntry.Category("dwarvenmines") - @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) public DwarvenMines dwarvenMines = new DwarvenMines(); } @@ -116,8 +126,7 @@ public class SkyblockerConfig implements ConfigData { public boolean solveThreeWeirdos = true; public boolean blazesolver = true; public boolean solveTrivia = true; - public boolean oldLevers = false; - @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) public Terminals terminals = new Terminals(); } @@ -131,7 +140,7 @@ public class SkyblockerConfig implements ConfigData { public boolean enableDrillFuel = true; public boolean solveFetchur = true; public boolean solvePuzzler = true; - @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) public DwarvenHud dwarvenHud = new DwarvenHud(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java new file mode 100644 index 00000000..d7ca3686 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java @@ -0,0 +1,33 @@ +package me.xmrvizzy.skyblocker.mixin; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.FarmlandBlock; +import net.minecraft.block.ShapeContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; +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.CallbackInfoReturnable; + +@Mixin(FarmlandBlock.class) +public abstract class FarmlandBlockMixin extends Block { + protected FarmlandBlockMixin(Settings settings) { + super(settings); + } + + @Inject(method = "getOutlineShape", at = @At("HEAD"), cancellable = true) + public void onGetOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context, CallbackInfoReturnable cir) { + if (Utils.isOnSkyblock && SkyblockerConfig.get().general.hitbox.oldFarmlandHitbox) + cir.setReturnValue(Block.createCuboidShape(0.0, 0.0, 0.0, 16.0, 16.0, 16.0)); + } + + @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/skyblock/dungeon/OldLever.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/OldLever.java index fc26f913..c836e4f3 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/OldLever.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/OldLever.java @@ -14,7 +14,7 @@ public class OldLever { protected static final VoxelShape WEST_SHAPE; public static VoxelShape getShape(WallMountLocation wallMountLocation, Direction direction) { - if (!SkyblockerConfig.get().locations.dungeons.oldLevers) + if (!SkyblockerConfig.get().general.hitbox.oldLeverHitbox) return null; if (wallMountLocation == WallMountLocation.FLOOR) { diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 0b148a91..d3f4ab60 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -19,6 +19,9 @@ "text.autoconfig.skyblocker.option.general.itemTooltip.enableLowestBIN": "Enable Lowest BIN Price", "text.autoconfig.skyblocker.option.general.itemTooltip.enableBazaarPrice": "Enable Bazaar buy/sell Price", "text.autoconfig.skyblocker.option.general.itemTooltip.enableMuseumDate": "Enable Museum & Date", + "text.autoconfig.skyblocker.option.general.hitbox": "Hitboxes", + "text.autoconfig.skyblocker.option.general.hitbox.oldFarmlandHitbox": "Enable 1.8 farmland hitbox", + "text.autoconfig.skyblocker.option.general.hitbox.oldLeverHitbox": "Enable 1.8 lever hitbox", "skyblocker.itemTooltip.nullMessage": "§b[§6Skyblocker§b] §cItem price information on tooltip will renew in max 60 seconds. If not, check latest.log", "text.autoconfig.skyblocker.category.richPresence": "Discord Rich Presence", @@ -37,7 +40,6 @@ "text.autoconfig.skyblocker.option.locations.dungeons.solveThreeWeirdos": "Solve Three Weirdos Puzzle", "text.autoconfig.skyblocker.option.locations.dungeons.blazesolver": "Solve Blaze Puzzle", "text.autoconfig.skyblocker.option.locations.dungeons.solveTrivia": "Solve Trivia Puzzle", - "text.autoconfig.skyblocker.option.locations.dungeons.oldLevers": "1.8 lever hitbox", "text.autoconfig.skyblocker.option.locations.dungeons.terminals": "Terminal Solvers", "text.autoconfig.skyblocker.option.locations.dungeons.terminals.solveColor": "Solve Select Colored", "text.autoconfig.skyblocker.option.locations.dungeons.terminals.solveOrder": "Solve Click In Order", diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index f07fbfc8..654e0400 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -9,6 +9,7 @@ "InGameHudMixin", "ItemRendererMixin", "LeverBlockMixin", + "FarmlandBlockMixin", "MinecraftClientMixin", "AccessorWorldRenderer", "GenericContainerScreenMixin", -- cgit From 082a61bbc9891d61bdbd70dc5b2e2d58d1b9a300 Mon Sep 17 00:00:00 2001 From: ADON15c Date: Fri, 27 May 2022 16:00:51 -0600 Subject: Added config options for moving bars --- .../skyblocker/config/SkyblockerConfig.java | 39 ++++++++++++++++++++++ .../skyblocker/skyblock/FancyStatusBars.java | 14 ++++++++ .../resources/assets/skyblocker/lang/en_us.json | 5 +++ 3 files changed, 58 insertions(+) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 93e1d8e9..e3b4339a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -58,7 +58,46 @@ public class SkyblockerConfig implements ConfigData { public static class Bars { public boolean enableBars = true; + + @ConfigEntry.Category("barpositions") + @ConfigEntry.Gui.CollapsibleObject(startExpanded = false) + public BarPositions barpositions = new BarPositions(); + } + + public static class BarPositions { + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public BarPosition healthBarPosition = BarPosition.LAYER1; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public BarPosition manaBarPosition = BarPosition.LAYER1; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public BarPosition defenceBarPosition = BarPosition.LAYER1; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public BarPosition experienceBarPosition = BarPosition.LAYER1; + + } + + public enum BarPosition { + LAYER1, + LAYER2, + RIGHT; + + public String toString() { + return switch (this) { + case LAYER1 -> "Layer 1"; + case LAYER2 -> "Layer 2"; + case RIGHT -> "Right"; + }; + } + + public int toInt() { + return switch (this) { + case LAYER1 -> 0; + case LAYER2 -> 1; + case RIGHT -> 2; + }; + } } + public static class RichPresence { public boolean enableRichPresence = false; @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java index 48ef3251..e2a9a684 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java @@ -57,6 +57,20 @@ public class FancyStatusBars extends DrawableHelper { bars[3].fill[0] = (int) (32 * player.experienceProgress); bars[3].text = player.experienceLevel; + // Update positions of bars from config + for (int i = 0; i < 4; i++) { + int configAnchorNum = switch (i) { + case 0 -> SkyblockerConfig.get().general.bars.barpositions.healthBarPosition.toInt(); + case 1 -> SkyblockerConfig.get().general.bars.barpositions.manaBarPosition.toInt(); + case 2 -> SkyblockerConfig.get().general.bars.barpositions.defenceBarPosition.toInt(); + case 3 -> SkyblockerConfig.get().general.bars.barpositions.experienceBarPosition.toInt(); + default -> 0; + }; + + if (bars[i].anchorNum != configAnchorNum) + moveBar(i, configAnchorNum); + } + RenderSystem.setShaderTexture(0, BARS); for (var bar : bars) bar.draw(matrices); diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 0b148a91..c758a715 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -8,6 +8,11 @@ "text.autoconfig.skyblocker.category.general": "General", "text.autoconfig.skyblocker.option.general.bars": "Health, Mana, Defence & XP Bars", "text.autoconfig.skyblocker.option.general.bars.enableBars": "Enable Bars", + "text.autoconfig.skyblocker.option.general.bars.barpositions": "Configure Bar Positions", + "text.autoconfig.skyblocker.option.general.bars.barpositions.healthBarPosition": "Health Bar Position", + "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.quicknav": "Quicknav", "text.autoconfig.skyblocker.option.general.quicknav.enableQuicknav": "Enable Quicknav", "text.autoconfig.skyblocker.option.general.backpackPreviewWithoutShift": "View backpack preview without holding Shift", -- cgit From 7049afabe59c533c795fbce9d8675585fe156fd4 Mon Sep 17 00:00:00 2001 From: ADON15c Date: Fri, 27 May 2022 17:34:03 -0600 Subject: Added option for hiding bars --- src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java | 5 ++++- src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index e3b4339a..c6c6979d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -79,13 +79,15 @@ public class SkyblockerConfig implements ConfigData { public enum BarPosition { LAYER1, LAYER2, - RIGHT; + RIGHT, + NONE; public String toString() { return switch (this) { case LAYER1 -> "Layer 1"; case LAYER2 -> "Layer 2"; case RIGHT -> "Right"; + case NONE -> "Disabled"; }; } @@ -94,6 +96,7 @@ public class SkyblockerConfig implements ConfigData { case LAYER1 -> 0; case LAYER2 -> 1; case RIGHT -> 2; + case NONE -> -1; }; } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java index e2a9a684..2b96da12 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java @@ -24,6 +24,7 @@ public class FancyStatusBars extends DrawableHelper { // Positions to show the bars // 0: Hotbar Layer 1, 1: Hotbar Layer 2, 2: Right of hotbar + // Anything outside the set values hides the bar private final int[] anchorsX = new int[3]; private final int[] anchorsY = new int[3]; @@ -149,6 +150,9 @@ public class FancyStatusBars extends DrawableHelper { } public void draw(MatrixStack matrices) { + // 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); @@ -168,6 +172,9 @@ public class FancyStatusBars extends DrawableHelper { } public void drawText(MatrixStack matrices) { + // Dont draw if anchorNum is outside of range + if (anchorNum < 0 || anchorNum > 2) return; + TextRenderer textRenderer = client.textRenderer; String text = this.text.toString(); int x = anchorsX[anchorNum] + this.offsetX + 11 + (bar_width - textRenderer.getWidth(text)) / 2; -- cgit From f89443259892b8cb450a680bac2c5b25dc9c9d0a Mon Sep 17 00:00:00 2001 From: ADON15c Date: Fri, 27 May 2022 19:46:46 -0600 Subject: Repositioned bars a bit and rewrote some code --- .../skyblocker/skyblock/FancyStatusBars.java | 28 +++++++++------------- 1 file changed, 11 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java index 2b96da12..dd7ef478 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java @@ -46,7 +46,7 @@ public class FancyStatusBars extends DrawableHelper { anchorsX[0] = scaledWidth / 2 - 91; anchorsY[0] = scaledHeight - 33; anchorsX[1] = anchorsX[0]; - anchorsY[1] = anchorsY[0] - 13; + anchorsY[1] = anchorsY[0] - 10; anchorsX[2] = (scaledWidth / 2 + 91) + 2; anchorsY[2] = scaledHeight - 16; @@ -88,15 +88,9 @@ public class FancyStatusBars extends DrawableHelper { int layer1Count = 0, layer2Count = 0, rightCount = 0; for (int i = 0; i < 4; i++) { switch (bars[i].anchorNum) { - case 0: - layer1Count++; - break; - case 1: - layer2Count++; - break; - case 2: - rightCount++; - break; + case 0 -> layer1Count++; + case 1 -> layer2Count++; + case 2 -> rightCount++; } } @@ -104,21 +98,21 @@ public class FancyStatusBars extends DrawableHelper { int adjustedLayer1Count = 0, adjustedLayer2Count = 0, adjustedRightCount = 0; for (int i = 0; i < 4; i++) { switch (bars[i].anchorNum) { - case 0: + case 0 -> { bars[i].bar_width = (172 - ((layer1Count - 1) * 11)) / layer1Count; - bars[i].offsetX = adjustedLayer1Count * (bars[i].bar_width + 11 + (layer1Count == 3 ? 0 : 1)); + bars[i].offsetX = adjustedLayer1Count * (bars[i].bar_width + 11 + (layer1Count == 3 ? 0 : 1)); adjustedLayer1Count++; - break; - case 1: + } + case 1 -> { bars[i].bar_width = (172 - ((layer2Count - 1) * 11)) / layer2Count; bars[i].offsetX = adjustedLayer2Count * (bars[i].bar_width + 11 + (layer2Count == 3 ? 0 : 1)); adjustedLayer2Count++; - break; - case 2: + } + case 2 -> { bars[i].bar_width = 50; bars[i].offsetX = adjustedRightCount * (50 + 11); adjustedRightCount++; - break; + } } } } -- cgit From 3a1a1427b838fbfb992c0eab48d4282aa42ea1e3 Mon Sep 17 00:00:00 2001 From: Trương Hoàng Long Date: Mon, 30 May 2022 17:12:43 +0200 Subject: remove dead code from original mod --- .../xmrvizzy/skyblocker/mixin/ChatScreenMixin.java | 29 ------------------ .../mixin/ClientPlayNetworkHandlerMixin.java | 34 ---------------------- .../skyblocker/mixin/ClientPlayerEntityMixin.java | 9 ------ src/main/resources/skyblocker.mixins.json | 1 - 4 files changed, 73 deletions(-) delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/ChatScreenMixin.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatScreenMixin.java deleted file mode 100644 index e85a64fc..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatScreenMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package me.xmrvizzy.skyblocker.mixin; - -import net.minecraft.client.gui.screen.ChatScreen; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.text.Text; -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.CallbackInfoReturnable; - -@Mixin(ChatScreen.class) -public class ChatScreenMixin extends Screen { - - @Shadow protected TextFieldWidget chatField; - - protected ChatScreenMixin(Text title) { - super(title); - } - - @Inject(method = "keyPressed", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;openScreen(Lnet/minecraft/client/gui/screen/Screen;)V", ordinal = 1), cancellable = true) - public void keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable cir) { - String[] split = this.chatField.getText().trim().toLowerCase().split(" "); - if (split.length > 0 && split[0].contentEquals("/skb")) { - cir.setReturnValue(true); - } - } -} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java deleted file mode 100644 index ef900eef..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java +++ /dev/null @@ -1,34 +0,0 @@ -package me.xmrvizzy.skyblocker.mixin; - -import com.mojang.authlib.GameProfile; -import com.mojang.brigadier.CommandDispatcher; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.util.telemetry.TelemetrySender; -import net.minecraft.command.CommandSource; -import net.minecraft.network.ClientConnection; -import net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket; -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 static com.mojang.brigadier.builder.LiteralArgumentBuilder.literal; - -@Mixin(ClientPlayNetworkHandler.class) -public class ClientPlayNetworkHandlerMixin { - - @Shadow private CommandDispatcher commandDispatcher; - - @Inject(method = "", at = @At("RETURN")) - private void init(MinecraftClient client, Screen screen, ClientConnection connection, GameProfile profile, TelemetrySender telemetrySender, CallbackInfo ci) { - commandDispatcher.register(literal("skb")); - } - - @Inject(method = "onCommandTree", at = @At("RETURN")) - private void onCommandTree(CommandTreeS2CPacket packet, CallbackInfo ci) { - commandDispatcher.register(literal("skb")); - } -} \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java index 160c8078..2d016459 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java @@ -9,7 +9,6 @@ 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) @@ -19,14 +18,6 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity super(world, profile); } - @Inject(method = "sendChatMessage", at = @At("HEAD"), cancellable = true) - public void sendChatMessage(String message, CallbackInfo ci) { - String[] split = message.toLowerCase().split(" "); - if (split.length > 0 && split[0].contentEquals("/skb")) { - ci.cancel(); - } - } - @Inject(method = "dropSelectedItem", at = @At("HEAD"), cancellable = true) public void dropSelectedItem(boolean dropEntireStack, CallbackInfoReturnable cir) { if (Utils.isOnSkyblock) HotbarSlotLock.handleDropSelectedItem(this.getInventory().selectedSlot, cir); diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index 654e0400..fc37cfb0 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -5,7 +5,6 @@ "client": [ "ChatHudListenerMixin", "ClientPlayerEntityMixin", - "ClientPlayNetworkHandlerMixin", "InGameHudMixin", "ItemRendererMixin", "LeverBlockMixin", -- cgit From aa5cf6bb18e84d604880ef37f2bda7250feaad2e Mon Sep 17 00:00:00 2001 From: Trương Hoàng Long Date: Tue, 31 May 2022 02:08:47 +0200 Subject: reparty one at a time fixes weird party issues caused by sending out multiple invites at once --- .../skyblocker/skyblock/dungeon/Reparty.java | 43 ++++++++-------------- 1 file changed, 16 insertions(+), 27 deletions(-) (limited to 'src') 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 c3da7c18..3af82b6e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java @@ -16,7 +16,7 @@ public class Reparty extends ChatPatternListener { private static final MinecraftClient client = MinecraftClient.getInstance(); private static final SkyblockerMod skyblocker = SkyblockerMod.getInstance(); public static final Pattern PLAYER = Pattern.compile(" ([a-zA-Z0-9_]{2,16}) ●"); - private static final int BASE_DELAY = 20; + private static final int BASE_DELAY = 10; private String[] players; private int playersSoFar; @@ -24,12 +24,11 @@ public class Reparty extends ChatPatternListener { public Reparty() { super("^(?:You are not currently in a party\\.|Party (?:Membe|Moderato)rs(?: \\(([0-9]+)\\)|:( .*)))$"); - repartying = false; + this.repartying = false; ClientCommandManager.DISPATCHER.register( ClientCommandManager.literal("rp").executes(context -> { - if (!Utils.isOnSkyblock || repartying || client.player == null) - return 0; - repartying = true; + if (!Utils.isOnSkyblock || this.repartying || client.player == null) return 0; + this.repartying = true; client.player.sendChatMessage("/p list"); return 0; }) @@ -38,52 +37,42 @@ public class Reparty extends ChatPatternListener { @Override public ChatFilterResult state() { - return repartying ? ChatFilterResult.FILTER : ChatFilterResult.PASS; + return this.repartying ? ChatFilterResult.FILTER : ChatFilterResult.PASS; } @Override public boolean onMatch(Text message, Matcher matcher) { if (matcher.group(1) != null) { - playersSoFar = 0; - players = new String[Integer.parseInt(matcher.group(1)) - 1]; + this.playersSoFar = 0; + this.players = new String[Integer.parseInt(matcher.group(1)) - 1]; } else if (matcher.group(2) != null) { Matcher m = PLAYER.matcher(matcher.group(2)); while (m.find()) { - players[playersSoFar++] = m.group(1); + this.players[playersSoFar++] = m.group(1); } } else { - repartying = false; + this.repartying = false; return false; } - if (playersSoFar == players.length) - reparty(); + if (this.playersSoFar == this.players.length) reparty(); return false; } private void reparty() { ClientPlayerEntity playerEntity = client.player; if (playerEntity == null) { - repartying = false; + this.repartying = false; return; } sendCommand(playerEntity, "/p disband", 1); - StringBuilder sb = new StringBuilder(); - int invites = (players.length - 1) / 5 + 1; - for (int i = 0; i < invites; i++) { - sb.setLength(0); - sb.append("/p invite"); - for (int j = 0; j < 5 && i * 5 + j < players.length; j++) { - sb.append(' '); - sb.append(players[i * 5 + j]); - } - sendCommand(playerEntity, sb.toString(), i + 2); + for (int i = 0; i < this.players.length; ++i) { + String command = "/p invite " + this.players[i]; + sendCommand(playerEntity, command, i + 2); } - skyblocker.scheduler.schedule(() -> repartying = false, invites + 2); + skyblocker.scheduler.schedule(() -> this.repartying = false, this.players.length + 2); } private void sendCommand(ClientPlayerEntity player, String command, int delay) { - skyblocker.scheduler.schedule(() -> - player.sendChatMessage(command), delay * BASE_DELAY - ); + skyblocker.scheduler.schedule(() -> player.sendChatMessage(command), delay * BASE_DELAY); } } -- cgit From 75918834349f1068557716142e342a7d01356040 Mon Sep 17 00:00:00 2001 From: Trương Hoàng Long Date: Sat, 4 Jun 2022 18:57:54 +0200 Subject: multi-profile support for backpack preview --- .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 2 +- .../skyblocker/mixin/HandledScreenMixin.java | 4 +- .../skyblocker/skyblock/BackpackPreview.java | 132 +++++++++++++-------- 3 files changed, 83 insertions(+), 55 deletions(-) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index f729019f..c2f947dc 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -21,7 +21,7 @@ public class SkyblockerMod { scheduler.scheduleCyclic(Utils::sbChecker, 20); scheduler.scheduleCyclic(discordRPCManager::update, 100); scheduler.scheduleCyclic(DungeonBlaze::update, 4); - scheduler.scheduleCyclic(BackpackPreview::tick, 100); + scheduler.scheduleCyclic(BackpackPreview::tick, 20); } public static SkyblockerMod getInstance() { diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index bd99f2d4..761db595 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -41,8 +41,8 @@ public abstract class HandledScreenMixin extends Screen { List buttons = QuickNav.init(screenTitle); for (QuickNavButton button : buttons) super.addDrawableChild(button); } - BackpackPreview.loadStorage((HandledScreen)(Object)this); - BackpackPreview.updateStorage((HandledScreen)(Object)this); + // backpack preview + BackpackPreview.updateStorage((HandledScreen)(Object)this); } @Inject(at = @At("HEAD"), method = "keyPressed", cancellable = true) diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java index 2638b0a6..123a4dab 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java @@ -9,6 +9,7 @@ import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.network.PlayerListEntry; import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.player.PlayerEntity; @@ -18,7 +19,9 @@ import net.minecraft.nbt.*; import net.minecraft.util.Identifier; import java.io.File; +import java.nio.file.Path; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -26,82 +29,94 @@ import java.util.regex.Pattern; public class BackpackPreview extends DrawableHelper { 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]+)"); private static final Pattern ECHEST_PATTERN = Pattern.compile("Ender Chest.*\\((\\d+)/\\d+\\)"); private static final Pattern BACKPACK_PATTERN = Pattern.compile("Backpack.*\\((\\d+)/\\d+\\)"); private static final int STORAGE_SIZE = 27; private static final Inventory[] storage = new Inventory[STORAGE_SIZE]; private static final boolean[] dirty = new boolean[STORAGE_SIZE]; - private static boolean loaded = false; + + private static String loaded = ""; // uuid + sb profile currently loaded + private static Path save_dir = null; public static void tick() { if (Utils.isOnSkyblock) { - for (int index = 0; index < STORAGE_SIZE; ++index) - if (dirty[index]) saveStorage(index); - if (MinecraftClient.getInstance().currentScreen != null) { - String title = MinecraftClient.getInstance().currentScreen.getTitle().getString(); - int index = getStorageIndexFromTitle(title); - if (index != -1) dirty[index] = true; + // save all dirty storages + saveStorage(); + // update save dir based on uuid and sb profile + String uuid = MinecraftClient.getInstance().getSession().getUuid().replaceAll("-", ""); + String profile = getSkyblockProfile(); + if (uuid != null && profile != null) { + save_dir = FabricLoader.getInstance().getConfigDir().resolve("skyblocker/backpack-preview/" + uuid + "/" + profile); + save_dir.toFile().mkdirs(); + if (loaded.equals(uuid + "/" + profile)) { + // mark currently opened storage as dirty + if (MinecraftClient.getInstance().currentScreen != null) { + String title = MinecraftClient.getInstance().currentScreen.getTitle().getString(); + int index = getStorageIndexFromTitle(title); + if (index != -1) dirty[index] = true; + } + } else { + // load storage again because uuid/profile changed + loaded = uuid + "/" + profile; + loadStorage(); + } } } } - private static File getSaveDir() { - String uuid = MinecraftClient.getInstance().getSession().getUuid(); - File dir = FabricLoader.getInstance().getConfigDir().resolve("skyblocker/backpack-preview/" + uuid).toFile(); - dir.mkdirs(); - return dir; - } - - public static void loadStorage(HandledScreen screen) { - if (!loaded) { - String title = screen.getTitle().getString(); - if (title.equals("Storage")) { - for (int index = 0; index < STORAGE_SIZE; ++index) { - File file = new File(getSaveDir().getPath(), index + ".nbt"); - if (file.isFile()) { - try { - NbtCompound root = NbtIo.read(file); - storage[index] = new DummyInventory(root); - } catch (Exception e) { - e.printStackTrace(); - } - } + public static void loadStorage() { + assert(save_dir != null); + for (int index = 0; index < STORAGE_SIZE; ++index) { + storage[index] = null; + dirty[index] = false; + File file = save_dir.resolve(index + ".nbt").toFile(); + if (file.isFile()) { + try { + NbtCompound root = NbtIo.read(file); + storage[index] = new DummyInventory(root); + } catch (Exception e) { + e.printStackTrace(); } - loaded = true; } } } - private static void saveStorage(int index) { - File file = new File(getSaveDir().getPath(), index + ".nbt"); - if (storage[index] != null) { - try { - NbtCompound root = new NbtCompound(); - NbtList list = new NbtList(); - for (int i = 9; i < storage[index].size(); ++i) { - ItemStack stack = storage[index].getStack(i); - NbtCompound item = new NbtCompound(); - if (stack.isEmpty()) { - item.put("id", NbtString.of("minecraft:air")); - item.put("Count", NbtInt.of(1)); - } else { - item.put("id", NbtString.of(stack.getItem().toString())); - item.put("Count", NbtInt.of(stack.getCount())); - item.put("tag", stack.getNbt()); + private static void saveStorage() { + assert(save_dir != null); + for (int index = 0; index < STORAGE_SIZE; ++index) { + if (dirty[index]) { + if (storage[index] != null) { + try { + NbtCompound root = new NbtCompound(); + NbtList list = new NbtList(); + for (int i = 9; i < storage[index].size(); ++i) { + ItemStack stack = storage[index].getStack(i); + NbtCompound item = new NbtCompound(); + if (stack.isEmpty()) { + item.put("id", NbtString.of("minecraft:air")); + item.put("Count", NbtInt.of(1)); + } else { + item.put("id", NbtString.of(stack.getItem().toString())); + item.put("Count", NbtInt.of(stack.getCount())); + item.put("tag", stack.getNbt()); + } + list.add(item); + } + root.put("list", list); + root.put("size", NbtInt.of(storage[index].size() - 9)); + NbtIo.write(root, save_dir.resolve(index + ".nbt").toFile()); + dirty[index] = false; + } catch (Exception e) { + e.printStackTrace(); } - list.add(item); } - root.put("list", list); - root.put("size", NbtInt.of(storage[index].size() - 9)); - NbtIo.write(root, file); - } catch (Exception e) { - e.printStackTrace(); } } } - public static void updateStorage(HandledScreen screen) { + public static void updateStorage(HandledScreen screen) { String title = screen.getTitle().getString(); int index = getStorageIndexFromTitle(title); if (index != -1) { @@ -151,6 +166,19 @@ public class BackpackPreview extends DrawableHelper { if (backpack.find()) return Integer.parseInt(backpack.group(1)) + 8; return -1; } + + private static String getSkyblockProfile() { + Collection list = MinecraftClient.getInstance().getNetworkHandler().getPlayerList(); + for (PlayerListEntry entry : list) { + if (entry.getDisplayName() != null) { + Matcher matcher = PROFILE_PATTERN.matcher(entry.getDisplayName().getString()); + if (matcher.find()) { + return matcher.group(1); + } + } + } + return null; + } } class DummyInventory implements Inventory { -- cgit From 15abbaaf4a3f192947df9f5d17dbfc2c81a00092 Mon Sep 17 00:00:00 2001 From: Trương Hoàng Long Date: Sat, 4 Jun 2022 19:15:59 +0200 Subject: fix backpack preview rendering in player inventory --- .../me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index 761db595..0303bca2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -47,19 +47,20 @@ public abstract class HandledScreenMixin extends Screen { @Inject(at = @At("HEAD"), method = "keyPressed", cancellable = true) public void keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable cir) { - if (focusedSlot != null){ - if (keyCode != 256 && !MinecraftClient.getInstance().options.inventoryKey.matchesKey(keyCode, scanCode)){ - if (WikiLookup.wikiLookup.matchesKey(keyCode, scanCode)) WikiLookup.openWiki(focusedSlot); + if (this.focusedSlot != null){ + if (keyCode != 256 && !this.client.options.inventoryKey.matchesKey(keyCode, scanCode)){ + if (WikiLookup.wikiLookup.matchesKey(keyCode, scanCode)) WikiLookup.openWiki(this.focusedSlot); } } } @Inject(at = @At("HEAD"), method = "drawMouseoverTooltip", cancellable = true) public void drawMouseOverTooltip(MatrixStack matrices, int x, int y, CallbackInfo ci) { - String title = ((HandledScreen)(Object)this).getTitle().getString(); - boolean shiftDown = SkyblockerConfig.get().general.backpackPreviewWithoutShift || Screen.hasShiftDown(); - if (shiftDown && title.equals("Storage") && focusedSlot != null) { - if (BackpackPreview.renderPreview(matrices, focusedSlot.getIndex(), x, y)) ci.cancel(); + String title = ((HandledScreen)(Object)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(); } } } -- cgit From 7a8ad1e4f6a7cc3e685a5199a5dd0ca0049c61ff Mon Sep 17 00:00:00 2001 From: Trương Hoàng Long Date: Tue, 14 Jun 2022 04:18:15 +0200 Subject: fix issue #73 --- src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 2 +- src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index c2f947dc..6b5558cf 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -21,7 +21,7 @@ public class SkyblockerMod { scheduler.scheduleCyclic(Utils::sbChecker, 20); scheduler.scheduleCyclic(discordRPCManager::update, 100); scheduler.scheduleCyclic(DungeonBlaze::update, 4); - scheduler.scheduleCyclic(BackpackPreview::tick, 20); + scheduler.scheduleCyclic(BackpackPreview::tick, 50); } public static SkyblockerMod getInstance() { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java index 123a4dab..00f32459 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java @@ -41,6 +41,7 @@ public class BackpackPreview extends DrawableHelper { private static Path save_dir = null; public static void tick() { + Utils.sbChecker(); // force update isOnSkyblock to prevent crash on disconnect if (Utils.isOnSkyblock) { // save all dirty storages saveStorage(); -- cgit