From 73f77aacdef84d315fc48d56e33e1be42d3afaad Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Wed, 2 Apr 2025 16:24:18 +0800 Subject: [PATCH] =?UTF-8?q?fix(bukkit):=20=E9=98=BB=E6=AD=A2=E5=8F=91?= =?UTF-8?q?=E9=80=81=E4=BB=85=E6=9C=8D=E5=8A=A1=E7=AB=AF=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 3 ++ .../plugin/network/PacketConsumers.java | 42 +++++++++++++++++++ .../craftengine/bukkit/util/Reflections.java | 33 +++++++++++++++ 3 files changed, 78 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 b5f4b4db2..65dd8ff2a 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 @@ -134,6 +134,9 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerNMSPacketConsumer(PacketConsumers.REMOVE_ENTITY, Reflections.clazz$ClientboundRemoveEntitiesPacket); registerNMSPacketConsumer(PacketConsumers.SYNC_ENTITY_POSITION, Reflections.clazz$ClientboundEntityPositionSyncPacket); registerNMSPacketConsumer(PacketConsumers.MOVE_ENTITY, Reflections.clazz$ClientboundMoveEntityPacket$Pos); + registerNMSPacketConsumer(PacketConsumers.MOVE_AND_ROTATION_ENTITY, Reflections.clazz$ClientboundMoveEntityPacket$PosRot); + registerNMSPacketConsumer(PacketConsumers.ROTATE_HEAD, Reflections.clazz$ClientboundRotateHeadPacket); + registerNMSPacketConsumer(PacketConsumers.SET_ENTITY_MOTION, Reflections.clazz$ClientboundSetEntityMotionPacket); registerNMSPacketConsumer(PacketConsumers.PICK_ITEM_FROM_ENTITY, Reflections.clazz$ServerboundPickItemFromEntityPacket); registerNMSPacketConsumer(PacketConsumers.SOUND, Reflections.clazz$ClientboundSoundPacket); registerNMSPacketConsumer(PacketConsumers.RENAME_ITEM, Reflections.clazz$ServerboundRenameItemPacket); 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 23bd23cde..1faa248e9 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 @@ -666,6 +666,48 @@ public class PacketConsumers { } }; + public static final TriConsumer MOVE_AND_ROTATION_ENTITY = (user, event, packet) -> { + try { + int entityId = (int) Reflections.field$ClientboundMoveEntityPacket$entityId.get(packet); + if (BukkitFurnitureManager.instance().isFurnitureBaseEntity(entityId)) { + event.setCancelled(true); + } + if (BukkitFurnitureManager.instance().isFurnitureCollisionEntity(entityId)) { + event.setCancelled(true); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundMoveEntityPacket$PosRot", e); + } + }; + + public static final TriConsumer ROTATE_HEAD = (user, event, packet) -> { + try { + int entityId = (int) Reflections.field$ClientboundRotateHeadPacket$entityId.get(packet); + if (BukkitFurnitureManager.instance().isFurnitureBaseEntity(entityId)) { + event.setCancelled(true); + } + if (BukkitFurnitureManager.instance().isFurnitureCollisionEntity(entityId)) { + event.setCancelled(true); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundRotateHeadPacket", e); + } + }; + + public static final TriConsumer SET_ENTITY_MOTION = (user, event, packet) -> { + try { + int entityId = (int) Reflections.field$ClientboundSetEntityMotionPacket$id.get(packet); + if (BukkitFurnitureManager.instance().isFurnitureBaseEntity(entityId)) { + event.setCancelled(true); + } + if (BukkitFurnitureManager.instance().isFurnitureCollisionEntity(entityId)) { + event.setCancelled(true); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityMotionPacket", e); + } + }; + public static final TriConsumer REMOVE_ENTITY = (user, event, packet) -> { try { IntList intList = (IntList) Reflections.field$ClientboundRemoveEntitiesPacket$entityIds.get(packet); 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 16ecc73d9..860171138 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 @@ -5930,4 +5930,37 @@ public class Reflections { ? ReflectionUtils.getMethod(clazz$Entity, int.class, new String[]{"af"}) : ReflectionUtils.getMethod(clazz$Entity, int.class, new String[]{"getId", "aj", "ah", "af"}) ); + + public static final Class clazz$ClientboundMoveEntityPacket$PosRot = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundMoveEntityPacket$PosRot"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutEntity$PacketPlayOutRelEntityMoveLook") + ) + ); + + public static final Class clazz$ClientboundRotateHeadPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundRotateHeadPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutEntityHeadRotation") + ) + ); + + public static final Field field$ClientboundRotateHeadPacket$entityId = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundRotateHeadPacket, int.class, 0 + ) + ); + + public static final Class clazz$ClientboundSetEntityMotionPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSetEntityMotionPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutEntityVelocity") + ) + ); + + public static final Field field$ClientboundSetEntityMotionPacket$id = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundSetEntityMotionPacket, int.class, 0 + ) + ); }