From d52cc6d8b57058e515e2d669cd9f62c61db0fd1e Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Sun, 23 Mar 2025 05:06:04 +0800 Subject: [PATCH] =?UTF-8?q?feat(network):=20=E8=A1=A5=E5=85=85=E8=81=8A?= =?UTF-8?q?=E5=A4=A9=E5=91=BD=E4=BB=A4=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 | 44 +++++++++++++ .../craftengine/bukkit/util/Reflections.java | 64 +++++++++++++++++++ 3 files changed, 110 insertions(+) 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 606f31b5a..01a98be91 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 @@ -128,6 +128,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener { registerNMSPacketConsumer(PacketConsumers.CHAT, Reflections.clazz$ServerboundChatPacket); registerNMSPacketConsumer(PacketConsumers.RENAME_ITEM, Reflections.clazz$ServerboundRenameItemPacket); registerNMSPacketConsumer(PacketConsumers.SIGN_UPDATE, Reflections.clazz$ServerboundSignUpdatePacket); + registerNMSPacketConsumer(PacketConsumers.COMMAND_SIGNED, Reflections.clazz$ServerboundChatCommandSignedPacket); + registerNMSPacketConsumer(PacketConsumers.COMMAND, Reflections.clazz$ServerboundChatCommandPacket); registerByteBufPacketConsumer(PacketConsumers.SECTION_BLOCK_UPDATE, this.packetIds.clientboundSectionBlocksUpdatePacket()); registerByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket()); registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket()); 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 7d8048590..61033587e 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 @@ -732,6 +732,50 @@ public class PacketConsumers { } }; + public static final TriConsumer COMMAND_SIGNED = (user, event, packet) -> { + try { + String command = (String) Reflections.field$ServerboundChatCommandSignedPacket$command.get(packet); + ImageManager manager = CraftEngine.instance().imageManager(); + if (!manager.isDefaultFontInUse()) return; + runIfContainsIllegalCharacter(command, manager, (s) -> { + event.setCancelled(true); + try { + Object newPacket = Reflections.constructor$ServerboundChatCommandSignedPacket.newInstance( + s, + Reflections.field$ServerboundChatCommandSignedPacket$timeStamp.get(packet), + Reflections.field$ServerboundChatCommandSignedPacket$salt.get(packet), + Reflections.field$ServerboundChatCommandSignedPacket$argumentSignatures.get(packet), + Reflections.field$ServerboundChatCommandSignedPacket$lastSeenMessages.get(packet) + ); + user.receivePacket(newPacket); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to create replaced chat command signed packet", e); + } + }); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundChatCommandSignedPacket", e); + } + }; + + public static final TriConsumer COMMAND = (user, event, packet) -> { + try { + String command = (String) Reflections.field$SServerboundChatCommandPacket$command.get(packet); + ImageManager manager = CraftEngine.instance().imageManager(); + if (!manager.isDefaultFontInUse()) return; + runIfContainsIllegalCharacter(command, manager, (s) -> { + event.setCancelled(true); + try { + Object newPacket = Reflections.constructor$ServerboundChatCommandPacket.newInstance(s); + user.receivePacket(newPacket); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to create replaced chat command packet", e); + } + }); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundChatCommandPacket", e); + } + }; + private static void runIfContainsIllegalCharacter(String string, ImageManager manager, Consumer callback) { char[] chars = string.toCharArray(); int[] codepoints = CharacterUtils.charsToCodePoints(chars); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index 4ed697c8e..fba5c7c3a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -5201,4 +5201,68 @@ public class Reflections { clazz$ServerboundSignUpdatePacket, String[].class, 0 ) ); + + public static final Class clazz$ArgumentSignatures = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("commands.arguments.ArgumentSignatures") + ) + ); + + public static final Class clazz$ServerboundChatCommandSignedPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundChatCommandSignedPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundChatCommandPacket") + ) + ); + + public static final Field field$ServerboundChatCommandSignedPacket$command = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundChatCommandSignedPacket, String.class, 0 + ) + ); + + public static final Field field$ServerboundChatCommandSignedPacket$timeStamp = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundChatCommandSignedPacket, Instant.class, 0 + ) + ); + + public static final Field field$ServerboundChatCommandSignedPacket$salt = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundChatCommandSignedPacket, long.class, 0 + ) + ); + + public static final Field field$ServerboundChatCommandSignedPacket$argumentSignatures = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundChatCommandSignedPacket, clazz$ArgumentSignatures, 0 + ) + ); + + public static final Field field$ServerboundChatCommandSignedPacket$lastSeenMessages = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundChatCommandSignedPacket, clazz$LastSeenMessages$Update, 0 + ) + ); + + public static final Constructor constructor$ServerboundChatCommandSignedPacket = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ServerboundChatCommandSignedPacket, String.class, Instant.class, long.class, clazz$ArgumentSignatures, clazz$LastSeenMessages$Update + ) + ); + + // 1.20.5+ + public static final Class clazz$ServerboundChatCommandPacket = VersionHelper.isVersionNewerThan1_20_5() + ? ReflectionUtils.getClazz(BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundChatCommandPacket")) + : null; + + // 1.20.5+ + public static final Field field$SServerboundChatCommandPacket$command = Optional.ofNullable(clazz$ServerboundChatCommandPacket) + .map(it -> ReflectionUtils.getDeclaredField(it, String.class, 0)) + .orElse(null); + + // 1.20.5+ + public static final Constructor constructor$ServerboundChatCommandPacket = Optional.ofNullable(clazz$ServerboundChatCommandPacket) + .map(it -> ReflectionUtils.getConstructor(it, String.class)) + .orElse(null); }