From 0f28e8c900a67703a8bb8860a4d2b297e1b3640a Mon Sep 17 00:00:00 2001 From: ChomeNS <95471003+ChomeNS@users.noreply.github.com> Date: Mon, 19 May 2025 18:39:18 +0700 Subject: [PATCH] fix: make the events work with new adventure and improve SNBTUtilities a bit --- build-number.txt | 2 +- .../chomens_bot/chomeNSMod/Types.java | 3 +- .../chomens_bot/data/bossbar/BotBossBar.java | 2 +- .../evalFunctions/CoreFunction.java | 10 +- .../GetLatestChatMessageFunction.java | 4 +- .../evalFunctions/GetPlayerListFunction.java | 4 +- .../plugins/BossbarManagerPlugin.java | 4 +- .../chomens_bot/plugins/ChatPlugin.java | 4 +- .../plugins/ScreensharePlugin.java | 2 +- .../chomens_bot/util/SNBTUtilities.java | 91 +++++-------------- 10 files changed, 42 insertions(+), 84 deletions(-) diff --git a/build-number.txt b/build-number.txt index 18bc02fc..58f0d919 100644 --- a/build-number.txt +++ b/build-number.txt @@ -1 +1 @@ -3252 \ No newline at end of file +3260 \ No newline at end of file diff --git a/src/main/java/me/chayapak1/chomens_bot/chomeNSMod/Types.java b/src/main/java/me/chayapak1/chomens_bot/chomeNSMod/Types.java index 7cbf4ef7..8ca9ee4f 100644 --- a/src/main/java/me/chayapak1/chomens_bot/chomeNSMod/Types.java +++ b/src/main/java/me/chayapak1/chomens_bot/chomeNSMod/Types.java @@ -1,6 +1,7 @@ package me.chayapak1.chomens_bot.chomeNSMod; import io.netty.buffer.ByteBuf; +import me.chayapak1.chomens_bot.util.SNBTUtilities; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; @@ -46,7 +47,7 @@ public class Types { } public static void writeComponent (final ByteBuf buf, final Component component) { - final String stringJSON = GsonComponentSerializer.gson().serialize(component); + final String stringJSON = SNBTUtilities.fromComponent(false, component); writeString(buf, stringJSON); } diff --git a/src/main/java/me/chayapak1/chomens_bot/data/bossbar/BotBossBar.java b/src/main/java/me/chayapak1/chomens_bot/data/bossbar/BotBossBar.java index 6a48063b..4d03a848 100644 --- a/src/main/java/me/chayapak1/chomens_bot/data/bossbar/BotBossBar.java +++ b/src/main/java/me/chayapak1/chomens_bot/data/bossbar/BotBossBar.java @@ -65,7 +65,7 @@ public class BotBossBar extends BossBar { this.title = title; - final String serialized = SNBTUtilities.fromComponent(bot, title); + final String serialized = SNBTUtilities.fromComponent(bot.options.useSNBTComponents, title); bot.core.run("minecraft:bossbar set " + id + " name " + serialized); diff --git a/src/main/java/me/chayapak1/chomens_bot/evalFunctions/CoreFunction.java b/src/main/java/me/chayapak1/chomens_bot/evalFunctions/CoreFunction.java index abb35cd8..998c93db 100644 --- a/src/main/java/me/chayapak1/chomens_bot/evalFunctions/CoreFunction.java +++ b/src/main/java/me/chayapak1/chomens_bot/evalFunctions/CoreFunction.java @@ -2,8 +2,8 @@ package me.chayapak1.chomens_bot.evalFunctions; import me.chayapak1.chomens_bot.Bot; import me.chayapak1.chomens_bot.data.eval.EvalFunction; +import me.chayapak1.chomens_bot.util.SNBTUtilities; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -27,6 +27,12 @@ public class CoreFunction extends EvalFunction { final CompletableFuture future = bot.core.runTracked(command); - return new Output(GsonComponentSerializer.gson().serialize(future.get(1, TimeUnit.SECONDS)), true); + return new Output( + SNBTUtilities.fromComponent( + false, + future.get(1, TimeUnit.SECONDS) + ), + true + ); } } diff --git a/src/main/java/me/chayapak1/chomens_bot/evalFunctions/GetLatestChatMessageFunction.java b/src/main/java/me/chayapak1/chomens_bot/evalFunctions/GetLatestChatMessageFunction.java index 01751536..bf6c5172 100644 --- a/src/main/java/me/chayapak1/chomens_bot/evalFunctions/GetLatestChatMessageFunction.java +++ b/src/main/java/me/chayapak1/chomens_bot/evalFunctions/GetLatestChatMessageFunction.java @@ -3,8 +3,8 @@ package me.chayapak1.chomens_bot.evalFunctions; import me.chayapak1.chomens_bot.Bot; import me.chayapak1.chomens_bot.data.eval.EvalFunction; import me.chayapak1.chomens_bot.data.listener.Listener; +import me.chayapak1.chomens_bot.util.SNBTUtilities; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; public class GetLatestChatMessageFunction extends EvalFunction implements Listener { private String latestMessage = ""; @@ -17,7 +17,7 @@ public class GetLatestChatMessageFunction extends EvalFunction implements Listen @Override public boolean onSystemMessageReceived (final Component component, final String string, final String ansi) { - latestMessage = GsonComponentSerializer.gson().serialize(component); + latestMessage = SNBTUtilities.fromComponent(false, component); return true; } diff --git a/src/main/java/me/chayapak1/chomens_bot/evalFunctions/GetPlayerListFunction.java b/src/main/java/me/chayapak1/chomens_bot/evalFunctions/GetPlayerListFunction.java index 092961e2..ce677c47 100644 --- a/src/main/java/me/chayapak1/chomens_bot/evalFunctions/GetPlayerListFunction.java +++ b/src/main/java/me/chayapak1/chomens_bot/evalFunctions/GetPlayerListFunction.java @@ -5,7 +5,7 @@ import com.google.gson.JsonObject; import me.chayapak1.chomens_bot.Bot; import me.chayapak1.chomens_bot.data.eval.EvalFunction; import me.chayapak1.chomens_bot.data.player.PlayerEntry; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import me.chayapak1.chomens_bot.util.SNBTUtilities; import java.util.List; @@ -26,7 +26,7 @@ public class GetPlayerListFunction extends EvalFunction { object.addProperty("uuid", entry.profile.getIdAsString()); object.addProperty("username", entry.profile.getName()); if (entry.displayName != null) - object.addProperty("displayName", GsonComponentSerializer.gson().serialize(entry.displayName)); + object.addProperty("displayName", SNBTUtilities.fromComponent(false, entry.displayName)); array.add(object); } diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/BossbarManagerPlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/BossbarManagerPlugin.java index c82ac12c..3e11b9fd 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/BossbarManagerPlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/BossbarManagerPlugin.java @@ -5,8 +5,8 @@ import me.chayapak1.chomens_bot.data.bossbar.BossBar; import me.chayapak1.chomens_bot.data.bossbar.BotBossBar; import me.chayapak1.chomens_bot.data.listener.Listener; import me.chayapak1.chomens_bot.data.player.PlayerEntry; -import net.kyori.adventure.text.Component; import me.chayapak1.chomens_bot.util.SNBTUtilities; +import net.kyori.adventure.text.Component; import org.geysermc.mcprotocollib.network.Session; import org.geysermc.mcprotocollib.network.event.session.DisconnectedEvent; import org.geysermc.mcprotocollib.network.packet.Packet; @@ -196,7 +196,7 @@ public class BossbarManagerPlugin implements Listener { final Component title = bossBar.secret; - final String stringTitle = SNBTUtilities.fromComponent(bot, title); + final String stringTitle = SNBTUtilities.fromComponent(bot.options.useSNBTComponents, title); bot.core.run("minecraft:bossbar add " + name + " " + stringTitle); diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/ChatPlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/ChatPlugin.java index cca594ff..354440da 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/ChatPlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/ChatPlugin.java @@ -391,7 +391,7 @@ public class ChatPlugin implements Listener { final String stringified = ComponentUtilities.stringifyLegacy(component).replace("ยง", "&"); send(stringified); } else { - bot.core.run("minecraft:tellraw " + targets + " " + SNBTUtilities.fromComponent(bot, component)); + bot.core.run("minecraft:tellraw " + targets + " " + SNBTUtilities.fromComponent(bot.options.useSNBTComponents, component)); } } @@ -401,7 +401,7 @@ public class ChatPlugin implements Listener { public void actionBar (final Component component, final String targets) { if (bot.options.useChat) return; - bot.core.run("minecraft:title " + targets + " actionbar " + SNBTUtilities.fromComponent(bot, component)); + bot.core.run("minecraft:title " + targets + " actionbar " + SNBTUtilities.fromComponent(bot.options.useSNBTComponents, component)); } public void actionBar (final Component component, final UUID uuid) { actionBar(component, UUIDUtilities.selector(uuid)); } diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/ScreensharePlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/ScreensharePlugin.java index cff19a7e..9975554c 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/ScreensharePlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/ScreensharePlugin.java @@ -141,7 +141,7 @@ public class ScreensharePlugin { } for (int i = 0; i < names.size(); i++) { - bot.core.run("minecraft:data merge entity @e[tag=" + tags.get(i) + ",limit=1] {text:" + SNBTUtilities.fromComponent(bot, names.get(i)) + "}"); + bot.core.run("minecraft:data merge entity @e[tag=" + tags.get(i) + ",limit=1] {text:" + SNBTUtilities.fromComponent(bot.options.useSNBTComponents, names.get(i)) + "}"); } } diff --git a/src/main/java/me/chayapak1/chomens_bot/util/SNBTUtilities.java b/src/main/java/me/chayapak1/chomens_bot/util/SNBTUtilities.java index 8eac751a..4d0727c7 100644 --- a/src/main/java/me/chayapak1/chomens_bot/util/SNBTUtilities.java +++ b/src/main/java/me/chayapak1/chomens_bot/util/SNBTUtilities.java @@ -1,13 +1,13 @@ package me.chayapak1.chomens_bot.util; import com.google.gson.JsonElement; -import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; -import me.chayapak1.chomens_bot.Bot; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.kyori.adventure.text.serializer.json.JSONOptions; import java.util.Map; +import java.util.Set; // for 1.21.5 SNBT components, not sure how performant this is // since i'm not good at writing performant code, but this should @@ -16,6 +16,15 @@ import java.util.Map; // with some tests on my laptop, the output of help command can take as much as 43 ms (truly advanced) // but some small components can be as low as 8764 nanoseconds public class SNBTUtilities { + private static final GsonComponentSerializer SERIALIZER_1_21_4 = + GsonComponentSerializer.builder() + .options(JSONOptions.byDataVersion().at(4174)) // 24w44a, 1.21.4 + .build(); + private static final GsonComponentSerializer SERIALIZER_1_21_5 = + GsonComponentSerializer.builder() + .options(JSONOptions.byDataVersion().at(4298)) // 25w02a, 1.21.5, uses snake case for events + .build(); + private static final String QUOTE = "'"; private static final String COMMA = ","; @@ -27,12 +36,9 @@ public class SNBTUtilities { private static final String BEGIN_ARRAY = "["; private static final String END_ARRAY = "]"; - public static String fromComponent (final Bot bot, final Component component) { - if (!bot.options.useSNBTComponents) return GsonComponentSerializer.gson().serialize(component); - - final JsonElement json = GsonComponentSerializer.gson().serializeToTree(component); - - return fromJson(json); + public static String fromComponent (final boolean useSNBTComponents, final Component component) { + if (!useSNBTComponents) return SERIALIZER_1_21_4.serialize(component); + else return fromJson(SERIALIZER_1_21_5.serializeToTree(component)); } // RIPPED from https://minecraft.wiki/w/NBT_format#Conversion_from_JSON @@ -67,71 +73,16 @@ public class SNBTUtilities { } else if (json.isJsonObject()) { final StringBuilder stringBuilder = new StringBuilder(BEGIN_OBJECT); - boolean notEmpty = false; + final Set> entries = json.getAsJsonObject().entrySet(); - for (final Map.Entry entry : json.getAsJsonObject().entrySet()) { - notEmpty = true; - - // FIXME: remove all these events fixer after adventure updates to 1.21.5, this is a SUPER lazy and temporary fix - if (entry.getKey().equals("hoverEvent") && entry.getValue().isJsonObject()) { - final JsonObject object = entry.getValue().getAsJsonObject(); - final String action = object.getAsJsonPrimitive("action").getAsString(); - - final JsonObject fixedObject = new JsonObject(); - - fixedObject.addProperty("action", action); - - switch (action) { - case "show_text" -> fixedObject.add("value", object.get("contents")); - case "show_item" -> { - final JsonObject contents = object.get("contents").getAsJsonObject(); - fixedObject.add("id", contents.get("id")); - fixedObject.add("count", contents.get("count")); - fixedObject.add("components", contents.get("components")); - } - case "show_entity" -> { - final JsonObject contents = object.get("contents").getAsJsonObject(); - fixedObject.add("name", contents.get("name")); - fixedObject.add("id", contents.get("id")); - fixedObject.add("uuid", contents.get("uuid")); - } - } - - stringBuilder.append("hover_event") - .append(COLON) - .append(fromJson(fixedObject)) - .append(COMMA); - } else if (entry.getKey().equals("clickEvent") && entry.getValue().isJsonObject()) { - final JsonObject object = entry.getValue().getAsJsonObject(); - - final String action = object.getAsJsonPrimitive("action").getAsString(); - final JsonElement value = object.getAsJsonPrimitive("value"); - - final JsonObject fixedObject = new JsonObject(); - - fixedObject.addProperty("action", action); - - switch (action) { - case "open_url" -> fixedObject.add("url", value); - case "open_file" -> fixedObject.add("path", value); - case "run_command", "suggest_command" -> fixedObject.add("command", value); - case "change_page" -> fixedObject.add("page", value); - case "copy_to_clipboard" -> fixedObject.add("value", value); - } - - stringBuilder.append("click_event") - .append(COLON) - .append(fromJson(fixedObject)) - .append(COMMA); - } else { - stringBuilder.append(entry.getKey()) // no escape :O (optional for adventure) - .append(COLON) - .append(fromJson(entry.getValue())) - .append(COMMA); - } + for (final Map.Entry entry : entries) { + stringBuilder.append(entry.getKey()) // no escape :O (optional for adventure) + .append(COLON) + .append(fromJson(entry.getValue())) + .append(COMMA); } - if (notEmpty) stringBuilder.deleteCharAt(stringBuilder.length() - 1); // removes comma + if (!entries.isEmpty()) stringBuilder.deleteCharAt(stringBuilder.length() - 1); // removes comma stringBuilder.append(END_OBJECT);