From b1ffaf7dc361882b4fa58b0bcb554ddd065c603c Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 8 Apr 2025 02:37:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8B=A6=E6=88=AA=E5=8C=85?= =?UTF-8?q?=E7=9B=B8=E5=BA=94=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/loader/src/main/resources/config.yml | 13 +++ .../plugin/network/BukkitNetworkManager.java | 6 +- .../plugin/network/PacketConsumers.java | 100 +++++++++++++++++- .../core/plugin/config/Config.java | 36 +++++++ 4 files changed, 148 insertions(+), 7 deletions(-) diff --git a/bukkit/loader/src/main/resources/config.yml b/bukkit/loader/src/main/resources/config.yml index c7a90b6a0..add64ec6f 100644 --- a/bukkit/loader/src/main/resources/config.yml +++ b/bukkit/loader/src/main/resources/config.yml @@ -152,6 +152,19 @@ image: chat: true command: true sign: true + # By intercepting packets, you are allowed to use in other plugins + intercept-packets: + system-chat: true + tab-list: true + actionbar: true + title: true + bossbar: true + container: true + # TODO: toast: true + # TODO: name: true + # TODO: team: true + +emoji: {} recipe: # Enable the plugin's recipe system diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index c7b472db4..4fa682f7d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -156,9 +156,9 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket()); registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.OPEN_SCREEN_1_20_3 : PacketConsumers.OPEN_SCREEN_1_20, this.packetIds.clientboundOpenScreenPacket()); - registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TEXT_1_20_3 : PacketConsumers.SET_TEXT_1_20, this.packetIds.clientboundSetTitleTextPacket()); - registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TEXT_1_20_3 : PacketConsumers.SET_TEXT_1_20, this.packetIds.clientboundSetSubtitleTextPacket()); - registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TEXT_1_20_3 : PacketConsumers.SET_TEXT_1_20, this.packetIds.clientboundSetActionBarTextPacket()); + registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TITLE_TEXT_1_20_3 : PacketConsumers.SET_TITLE_TEXT_1_20, this.packetIds.clientboundSetTitleTextPacket()); + registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_SUBTITLE_TEXT_1_20_3 : PacketConsumers.SET_SUBTITLE_TEXT_1_20, this.packetIds.clientboundSetSubtitleTextPacket()); + registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_ACTIONBAR_TEXT_1_20_3 : PacketConsumers.SET_ACTIONBAR_TEXT_1_20, this.packetIds.clientboundSetActionBarTextPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.BOSS_EVENT_1_20_3 : PacketConsumers.BOSS_EVENT_1_20, this.packetIds.clientboundBossEventPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SYSTEM_CHAT_1_20_3 : PacketConsumers.SYSTEM_CHAT_1_20, this.packetIds.clientboundSystemChatPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.TAB_LIST_1_20_3 : PacketConsumers.TAB_LIST_1_20, this.packetIds.clientboundTabListPacket()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index a625517be..d0c11d59b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -243,6 +243,7 @@ public class PacketConsumers { }; public static final BiConsumer BOSS_EVENT_1_20 = (user, event) -> { + if (!Config.interceptBossBar()) return; try { FriendlyByteBuf buf = event.getBuffer(); UUID uuid = buf.readUUID(); @@ -290,6 +291,7 @@ public class PacketConsumers { }; public static final BiConsumer BOSS_EVENT_1_20_3 = (user, event) -> { + if (!Config.interceptBossBar()) return; try { FriendlyByteBuf buf = event.getBuffer(); UUID uuid = buf.readUUID(); @@ -339,6 +341,7 @@ public class PacketConsumers { }; public static final BiConsumer SYSTEM_CHAT_1_20 = (user, event) -> { + if (!Config.interceptSystemChat()) return; try { FriendlyByteBuf buf = event.getBuffer(); String json = buf.readUtf(); @@ -360,6 +363,7 @@ public class PacketConsumers { }; public static final BiConsumer SYSTEM_CHAT_1_20_3 = (user, event) -> { + if (!Config.interceptSystemChat()) return; try { FriendlyByteBuf buf = event.getBuffer(); Tag nbt = buf.readNbt(false); @@ -381,7 +385,8 @@ public class PacketConsumers { } }; - public static final BiConsumer SET_TEXT_1_20 = (user, event) -> { + public static final BiConsumer SET_SUBTITLE_TEXT_1_20 = (user, event) -> { + if (!Config.interceptTitle()) return; try { FriendlyByteBuf buf = event.getBuffer(); String json = buf.readUtf(); @@ -396,11 +401,12 @@ public class PacketConsumers { buf.writeVarInt(event.packetID()); buf.writeUtf(AdventureHelper.componentToJson(component)); } catch (Exception e) { - CraftEngine.instance().logger().warn("Failed to handle ClientboundSet[(Sub)Title/ActionBar]TextPacket", e); + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetSubtitleTextPacket", e); } }; - public static final BiConsumer SET_TEXT_1_20_3 = (user, event) -> { + public static final BiConsumer SET_SUBTITLE_TEXT_1_20_3 = (user, event) -> { + if (!Config.interceptTitle()) return; try { FriendlyByteBuf buf = event.getBuffer(); Tag nbt = buf.readNbt(false); @@ -416,11 +422,94 @@ public class PacketConsumers { buf.writeVarInt(event.packetID()); buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); } catch (Exception e) { - CraftEngine.instance().logger().warn("Failed to handle ClientboundSet[(Sub)Title/ActionBar]TextPacket", e); + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetSubtitleTextPacket", e); + } + }; + + public static final BiConsumer SET_TITLE_TEXT_1_20 = (user, event) -> { + if (!Config.interceptTitle()) return; + try { + FriendlyByteBuf buf = event.getBuffer(); + String json = buf.readUtf(); + Map tokens = CraftEngine.instance().imageManager().matchTags(json); + if (tokens.isEmpty()) return; + event.setChanged(true); + Component component = AdventureHelper.jsonToComponent(json); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeUtf(AdventureHelper.componentToJson(component)); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetTitleTextPacket", e); + } + }; + + public static final BiConsumer SET_TITLE_TEXT_1_20_3 = (user, event) -> { + if (!Config.interceptTitle()) return; + try { + FriendlyByteBuf buf = event.getBuffer(); + Tag nbt = buf.readNbt(false); + if (nbt == null) return; + Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); + if (tokens.isEmpty()) return; + event.setChanged(true); + Component component = NBTComponentSerializer.nbt().deserialize(nbt); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetTitleTextPacket", e); + } + }; + + public static final BiConsumer SET_ACTIONBAR_TEXT_1_20 = (user, event) -> { + if (!Config.interceptActionBar()) return; + try { + FriendlyByteBuf buf = event.getBuffer(); + String json = buf.readUtf(); + Map tokens = CraftEngine.instance().imageManager().matchTags(json); + if (tokens.isEmpty()) return; + event.setChanged(true); + Component component = AdventureHelper.jsonToComponent(json); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeUtf(AdventureHelper.componentToJson(component)); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetActionBarTextPacket", e); + } + }; + + public static final BiConsumer SET_ACTIONBAR_TEXT_1_20_3 = (user, event) -> { + if (!Config.interceptActionBar()) return; + try { + FriendlyByteBuf buf = event.getBuffer(); + Tag nbt = buf.readNbt(false); + if (nbt == null) return; + Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); + if (tokens.isEmpty()) return; + event.setChanged(true); + Component component = NBTComponentSerializer.nbt().deserialize(nbt); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetActionBarTextPacket", e); } }; public static final BiConsumer TAB_LIST_1_20 = (user, event) -> { + if (!Config.interceptTabList()) return; try { FriendlyByteBuf buf = event.getBuffer(); String json1 = buf.readUtf(); @@ -455,6 +544,7 @@ public class PacketConsumers { }; public static final BiConsumer TAB_LIST_1_20_3 = (user, event) -> { + if (!Config.interceptTabList()) return; try { FriendlyByteBuf buf = event.getBuffer(); Tag nbt1 = buf.readNbt(false); @@ -491,6 +581,7 @@ public class PacketConsumers { }; public static final BiConsumer OPEN_SCREEN_1_20 = (user, event) -> { + if (!Config.interceptContainer()) return; try { FriendlyByteBuf buf = event.getBuffer(); int containerId = buf.readVarInt(); @@ -514,6 +605,7 @@ public class PacketConsumers { }; public static final BiConsumer OPEN_SCREEN_1_20_3 = (user, event) -> { + if (!Config.interceptContainer()) return; try { FriendlyByteBuf buf = event.getBuffer(); int containerId = buf.readVarInt(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java index 24b31ff21..5aaffc694 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java @@ -122,6 +122,12 @@ public class Config { protected boolean image$illegal_characters_filter$anvil; protected boolean image$illegal_characters_filter$sign; protected boolean image$illegal_characters_filter$book; + protected boolean image$intercept_packets$system_chat; + protected boolean image$intercept_packets$tab_list; + protected boolean image$intercept_packets$actionbar; + protected boolean image$intercept_packets$title; + protected boolean image$intercept_packets$bossbar; + protected boolean image$intercept_packets$container; public Config(CraftEngine plugin) { this.plugin = plugin; @@ -278,6 +284,12 @@ public class Config { image$illegal_characters_filter$chat = config.getBoolean("image.illegal-characters-filter.chat", true); image$illegal_characters_filter$command = config.getBoolean("image.illegal-characters-filter.command", true); image$illegal_characters_filter$sign = config.getBoolean("image.illegal-characters-filter.sign", true); + image$intercept_packets$system_chat = config.getBoolean("image.intercept-packets.system-chat", true); + image$intercept_packets$tab_list = config.getBoolean("image.intercept-packets.tab-list", true); + image$intercept_packets$actionbar = config.getBoolean("image.intercept-packets.actionbar", true); + image$intercept_packets$title = config.getBoolean("image.intercept-packets.title", true); + image$intercept_packets$bossbar = config.getBoolean("image.intercept-packets.bossbar", true); + image$intercept_packets$container = config.getBoolean("image.intercept-packets.container", true); Class modClazz = ReflectionUtils.getClazz(CraftEngine.MOD_CLASS); if (modClazz != null) { @@ -578,6 +590,30 @@ public class Config { return id; } + public static boolean interceptSystemChat() { + return instance.image$intercept_packets$system_chat; + } + + public static boolean interceptTabList() { + return instance.image$intercept_packets$tab_list; + } + + public static boolean interceptActionBar() { + return instance.image$intercept_packets$actionbar; + } + + public static boolean interceptTitle() { + return instance.image$intercept_packets$title; + } + + public static boolean interceptBossBar() { + return instance.image$intercept_packets$bossbar; + } + + public static boolean interceptContainer() { + return instance.image$intercept_packets$container; + } + public YamlDocument loadOrCreateYamlData(String fileName) { File file = new File(this.plugin.dataFolderFile(), fileName); if (!file.exists()) {