From 88a982a183ec7201666fd58cfd1376de2403302c Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 17 Jun 2025 01:38:56 +0800 Subject: [PATCH] =?UTF-8?q?perf(network):=20=E5=8F=91=E5=8C=85=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 3 +++ .../plugin/network/PacketConsumers.java | 25 +++++++++++++++++++ .../minecraft/NetworkReflections.java | 10 ++++++++ 3 files changed, 38 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 d2b03175a..95941ad85 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 registerNMSPacketConsumer(PacketConsumers.ENTITY_EVENT, NetworkReflections.clazz$ClientboundEntityEventPacket); registerNMSPacketConsumer(PacketConsumers.MOVE_POS_AND_ROTATE_ENTITY, NetworkReflections.clazz$ClientboundMoveEntityPacket$PosRot); registerNMSPacketConsumer(PacketConsumers.MOVE_POS_ENTITY, NetworkReflections.clazz$ClientboundMoveEntityPacket$Pos); + registerNMSPacketConsumer(PacketConsumers.ROTATE_HEAD, NetworkReflections.clazz$ClientboundRotateHeadPacket); + registerNMSPacketConsumer(PacketConsumers.SET_ENTITY_MOTION, NetworkReflections.clazz$ClientboundSetEntityMotionPacket); registerS2CByteBufPacketConsumer(PacketConsumers.LEVEL_CHUNK_WITH_LIGHT, this.packetIds.clientboundLevelChunkWithLightPacket()); registerS2CByteBufPacketConsumer(PacketConsumers.SECTION_BLOCK_UPDATE, this.packetIds.clientboundSectionBlocksUpdatePacket()); registerS2CByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket()); @@ -490,6 +492,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes NMSPacketEvent event = new NMSPacketEvent(packet); onNMSPacketSend(player, event, packet); if (event.isCancelled()) return; + System.out.println(packet.getClass()); if (event.isUsingNewPacket()) { super.write(context, event.optionalNewPacket(), channelPromise); } else { 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 9db9963f1..ad0d26c34 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 @@ -2365,6 +2365,9 @@ public class PacketConsumers { public static final TriConsumer MOVE_POS_AND_ROTATE_ENTITY = (user, event, packet) -> { try { int entityId = ProtectedFieldVisitor.get().field$ClientboundMoveEntityPacket$entityId(packet); + if (BukkitFurnitureManager.instance().isFurnitureRealEntity(entityId)) { + event.setCancelled(true); + } EntityPacketHandler handler = user.entityPacketHandlers().get(entityId); if (handler != null) { handler.handleMoveAndRotate(user, event, packet); @@ -2385,4 +2388,26 @@ public class PacketConsumers { CraftEngine.instance().logger().warn("Failed to handle ClientboundMoveEntityPacket", e); } }; + + public static final TriConsumer ROTATE_HEAD = (user, event, packet) -> { + try { + int entityId = (int) NetworkReflections.methodHandle$ClientboundRotateHeadPacket$entityIdGetter.invokeExact(packet); + if (BukkitFurnitureManager.instance().isFurnitureRealEntity(entityId)) { + event.setCancelled(true); + } + } catch (Throwable e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundRotateHeadPacket", e); + } + }; + + public static final TriConsumer SET_ENTITY_MOTION = (user, event, packet) -> { + try { + int entityId = (int) NetworkReflections.methodHandle$ClientboundSetEntityMotionPacket$idGetter.invokeExact(packet); + if (BukkitFurnitureManager.instance().isFurnitureRealEntity(entityId)) { + event.setCancelled(true); + } + } catch (Throwable e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityMotionPacket", e); + } + }; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java index 2b0498e8c..9ec3071d9 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java @@ -1329,6 +1329,8 @@ public final class NetworkReflections { public static final MethodHandle methodHandle$ServerboundPickItemFromBlockPacket$posGetter; public static final MethodHandle methodHandle$ServerboundPickItemFromEntityPacket$idGetter; public static final MethodHandle methodHandle$ServerboundCustomPayloadPacket$payloadGetter; + public static final MethodHandle methodHandle$ClientboundRotateHeadPacket$entityIdGetter; + public static final MethodHandle methodHandle$ClientboundSetEntityMotionPacket$idGetter; static { try { @@ -1400,6 +1402,14 @@ public final class NetworkReflections { ReflectionUtils.unreflectGetter(field$ClientIntentionPacket$protocolVersion) .asType(MethodType.methodType(int.class, Object.class)) ); + methodHandle$ClientboundRotateHeadPacket$entityIdGetter = requireNonNull( + ReflectionUtils.unreflectGetter(field$ClientboundRotateHeadPacket$entityId) + .asType(MethodType.methodType(int.class, Object.class)) + ); + methodHandle$ClientboundSetEntityMotionPacket$idGetter = requireNonNull( + ReflectionUtils.unreflectGetter(field$ClientboundSetEntityMotionPacket$id) + .asType(MethodType.methodType(int.class, Object.class)) + ); if (field$ServerboundCustomPayloadPacket$payload != null) { methodHandle$ServerboundCustomPayloadPacket$payloadGetter = requireNonNull( ReflectionUtils.unreflectGetter(field$ServerboundCustomPayloadPacket$payload)