From bfc02b6baf755dd193ea499dcec3f73a64acad33 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 8 Apr 2025 02:14:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Tab=20footer=20header?= =?UTF-8?q?=EF=BC=8C=E6=B6=88=E6=81=AF=E6=8B=A6=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 2 + .../plugin/network/PacketConsumers.java | 115 +++++++++++++++++- .../bukkit/plugin/network/PacketIds.java | 4 + .../plugin/network/impl/PacketIds1_20.java | 10 ++ .../plugin/network/impl/PacketIds1_20_2.java | 10 ++ .../plugin/network/impl/PacketIds1_20_3.java | 10 ++ .../plugin/network/impl/PacketIds1_20_5.java | 10 ++ .../plugin/network/impl/PacketIds1_21.java | 10 ++ 8 files changed, 170 insertions(+), 1 deletion(-) 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 7f81d157f..c7b472db4 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 @@ -160,6 +160,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes 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.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()); // registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); // registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket()); 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 350a5309f..a625517be 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 @@ -5,7 +5,6 @@ import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.IntList; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TranslationArgument; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.momirealms.craftengine.bukkit.api.CraftEngineFurniture; import net.momirealms.craftengine.bukkit.api.event.FurnitureBreakEvent; import net.momirealms.craftengine.bukkit.api.event.FurnitureInteractEvent; @@ -339,6 +338,49 @@ public class PacketConsumers { } }; + public static final BiConsumer SYSTEM_CHAT_1_20 = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + String json = buf.readUtf(); + Map tokens = CraftEngine.instance().imageManager().matchTags(json); + if (tokens.isEmpty()) return; + boolean overlay = buf.readBoolean(); + 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)); + buf.writeBoolean(overlay); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSystemChatPacket", e); + } + }; + + public static final BiConsumer SYSTEM_CHAT_1_20_3 = (user, event) -> { + 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; + boolean overlay = buf.readBoolean(); + 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); + buf.writeBoolean(overlay); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSystemChatPacket", e); + } + }; + public static final BiConsumer SET_TEXT_1_20 = (user, event) -> { try { FriendlyByteBuf buf = event.getBuffer(); @@ -365,6 +407,7 @@ public class PacketConsumers { 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()))); @@ -377,6 +420,76 @@ public class PacketConsumers { } }; + public static final BiConsumer TAB_LIST_1_20 = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + String json1 = buf.readUtf(); + String json2 = buf.readUtf(); + Map tokens1 = CraftEngine.instance().imageManager().matchTags(json1); + Map tokens2 = CraftEngine.instance().imageManager().matchTags(json2); + if (tokens1.isEmpty() && tokens2.isEmpty()) return; + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + if (!tokens1.isEmpty()) { + Component component = AdventureHelper.jsonToComponent(json1); + for (Map.Entry token : tokens1.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.writeUtf(AdventureHelper.componentToJson(component)); + } else { + buf.writeUtf(json1); + } + if (!tokens2.isEmpty()) { + Component component = AdventureHelper.jsonToComponent(json2); + for (Map.Entry token : tokens2.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.writeUtf(AdventureHelper.componentToJson(component)); + } else { + buf.writeUtf(json2); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSet[(Sub)Title/ActionBar]TextPacket", e); + } + }; + + public static final BiConsumer TAB_LIST_1_20_3 = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + Tag nbt1 = buf.readNbt(false); + if (nbt1 == null) return; + Tag nbt2 = buf.readNbt(false); + if (nbt2 == null) return; + Map tokens1 = CraftEngine.instance().imageManager().matchTags(nbt1.getAsString()); + Map tokens2 = CraftEngine.instance().imageManager().matchTags(nbt2.getAsString()); + if (tokens1.isEmpty() && tokens2.isEmpty()) return; + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + if (!tokens1.isEmpty()) { + Component component = NBTComponentSerializer.nbt().deserialize(nbt1); + for (Map.Entry token : tokens1.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + } else { + buf.writeNbt(nbt1, false); + } + if (!tokens2.isEmpty()) { + Component component = NBTComponentSerializer.nbt().deserialize(nbt2); + for (Map.Entry token : tokens2.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + } else { + buf.writeNbt(nbt2, false); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSet[(Sub)Title/ActionBar]TextPacket", e); + } + }; + public static final BiConsumer OPEN_SCREEN_1_20 = (user, event) -> { try { FriendlyByteBuf buf = event.getBuffer(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java index 424447dbf..cba589e6e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java @@ -27,4 +27,8 @@ public interface PacketIds { int clientboundSetActionBarTextPacket(); int clientboundBossEventPacket(); + + int clientboundSystemChatPacket(); + + int clientboundTabListPacket(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java index bbdd64ea2..68b07152f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java @@ -68,4 +68,14 @@ public class PacketIds1_20 implements PacketIds { public int clientboundBossEventPacket() { return 11; } + + @Override + public int clientboundSystemChatPacket() { + return 100; + } + + @Override + public int clientboundTabListPacket() { + return 101; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java index 4c19842d7..9773d7cb5 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java @@ -68,4 +68,14 @@ public class PacketIds1_20_2 implements PacketIds { public int clientboundBossEventPacket() { return 10; } + + @Override + public int clientboundSystemChatPacket() { + return 103; + } + + @Override + public int clientboundTabListPacket() { + return 104; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java index 7a74981a3..c6d0a66ca 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java @@ -68,4 +68,14 @@ public class PacketIds1_20_3 implements PacketIds { public int clientboundBossEventPacket() { return 10; } + + @Override + public int clientboundSystemChatPacket() { + return 105; + } + + @Override + public int clientboundTabListPacket() { + return 106; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java index 6f70f8b33..75b6566e3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java @@ -68,4 +68,14 @@ public class PacketIds1_20_5 implements PacketIds { public int clientboundBossEventPacket() { return 10; } + + @Override + public int clientboundSystemChatPacket() { + return 108; + } + + @Override + public int clientboundTabListPacket() { + return 109; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java index fd8008c27..5dc7fa843 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java @@ -68,4 +68,14 @@ public class PacketIds1_21 implements PacketIds { public int clientboundBossEventPacket() { return PacketIdFinder.clientboundByName("minecraft:boss_event"); } + + @Override + public int clientboundSystemChatPacket() { + return PacketIdFinder.clientboundByName("minecraft:system_chat"); + } + + @Override + public int clientboundTabListPacket() { + return PacketIdFinder.clientboundByName("minecraft:tab_list"); + } }