From 1e8b7e0607e0d42a2ba893e4bad7a8837ef3eb46 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Apr 2025 18:17:17 +0800 Subject: [PATCH] =?UTF-8?q?refactor(network):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E5=AE=9E=E4=BD=93=E7=9B=B8=E5=85=B3=E7=9A=84=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E5=8C=85=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 9 ++- .../plugin/network/PacketConsumers.java | 78 ++++++++++++------- .../bukkit/plugin/network/PacketIds.java | 2 + .../plugin/network/impl/PacketIds1_20.java | 5 ++ .../plugin/network/impl/PacketIds1_20_2.java | 5 ++ .../plugin/network/impl/PacketIds1_20_3.java | 5 ++ .../plugin/network/impl/PacketIds1_20_5.java | 5 ++ .../plugin/network/impl/PacketIds1_21.java | 5 ++ .../craftengine/bukkit/util/Reflections.java | 18 +++++ gradle.properties | 2 +- 10 files changed, 101 insertions(+), 33 deletions(-) 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 8b55761d7..4cb0324bf 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 @@ -141,7 +141,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerNMSPacketConsumer(PacketConsumers.LOGIN, Reflections.clazz$ClientboundLoginPacket); registerNMSPacketConsumer(PacketConsumers.RESPAWN, Reflections.clazz$ClientboundRespawnPacket); registerNMSPacketConsumer(PacketConsumers.INTERACT_ENTITY, Reflections.clazz$ServerboundInteractPacket); - registerNMSPacketConsumer(PacketConsumers.REMOVE_ENTITY, Reflections.clazz$ClientboundRemoveEntitiesPacket); + // 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.PICK_ITEM_FROM_ENTITY, Reflections.clazz$ServerboundPickItemFromEntityPacket); @@ -157,7 +157,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket()); registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket()); registerByteBufPacketConsumer(PacketConsumers.OPEN_SCREEN, this.packetIds.clientboundOpenScreenPacket()); - // registerByteBufPacketConsumer(PacketConsumers.SYNC_ENTITY_POSITION, this.packetIds.clientboundEntityPositionSyncPacket()); + registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); + registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); } public static BukkitNetworkManager instance() { @@ -483,7 +484,9 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } if (byteBuf.isReadable()) { list.add(byteBuf.retain()); - } + }/* else { + list.add(io.netty.buffer.Unpooled.EMPTY_BUFFER); + }*/ } private boolean handleCompression(ChannelHandlerContext ctx, ByteBuf buffer) { 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 dd843561a..3f23869ae 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 @@ -652,18 +652,54 @@ public class PacketConsumers { Reflections.field$ServerPlayer$connection.get(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player)), FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(itemStack)); } - // TODO USE bytebuffer + public static final BiConsumer ADD_ENTITY_BYTEBUFFER = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + int id = buf.readVarInt(); + UUID uuid = buf.readUUID(); + int type = buf.readVarInt(); + double x = buf.readDouble(); + double y = buf.readDouble(); + double z = buf.readDouble(); + byte xRot = buf.readByte(); + byte yRot = buf.readByte(); + byte yHeadRot = buf.readByte(); + int data = buf.readVarInt(); + int xa = buf.readShort(); + int ya = buf.readShort(); + int za = buf.readShort(); + // Falling blocks + if (type == Reflections.instance$EntityType$FALLING_BLOCK$registryId) { + int remapped = remap(data); + if (remapped != data) { + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeVarInt(id); + buf.writeUUID(uuid); + buf.writeVarInt(type); + buf.writeDouble(x); + buf.writeDouble(y); + buf.writeDouble(z); + buf.writeByte(xRot); + buf.writeByte(yRot); + buf.writeByte(yHeadRot); + buf.writeVarInt(remapped); + buf.writeShort(xa); + buf.writeShort(ya); + buf.writeShort(za); + } + } else if (type == Reflections.instance$EntityType$BLOCK_DISPLAY$registryId) { + user.entityView().put(id, Reflections.instance$EntityType$BLOCK_DISPLAY); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundAddEntityPacket", e); + } + }; + public static final TriConsumer ADD_ENTITY = (user, event, packet) -> { try { Object entityType = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$type(packet); - // Falling blocks - if (entityType == Reflections.instance$EntityType$FALLING_BLOCK) { - int data = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$data(packet); - int remapped = remap(data); - if (remapped != data) { - Reflections.field$ClientboundAddEntityPacket$data.set(packet, remapped); - } - } else if (entityType == Reflections.instance$EntityType$ITEM_DISPLAY) { + if (entityType == Reflections.instance$EntityType$ITEM_DISPLAY) { // Furniture int entityId = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$entityId(packet); LoadedFurniture furniture = BukkitFurnitureManager.instance().loadedFurnitureByRealEntityId(entityId); @@ -681,9 +717,6 @@ public class PacketConsumers { if (furniture != null) { event.setCancelled(true); } - } else if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) { - int entityId = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$entityId(packet); - user.entityView().put(entityId, entityType); } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundAddEntityPacket", e); @@ -691,21 +724,9 @@ public class PacketConsumers { }; // 1.21.3+ - // TODO USE bytebuffer - // public static final BiConsumer OPEN_SCREEN = (user, event) -> { - // try { - // FriendlyByteBuf buf = event.getBuffer(); - // int entityId = buf.readVarInt(); - // if (BukkitFurnitureManager.instance().isFurnitureRealEntity(entityId)) { - // event.setCancelled(true); // 这里炸了导致无法实现 - // } - // } catch (Exception e) { - // CraftEngine.instance().logger().warn("Failed to handle ClientboundEntityPositionSyncPacket", e); - // } - // }; public static final TriConsumer SYNC_ENTITY_POSITION = (user, event, packet) -> { try { - int entityId = (int) Reflections.field$ClientboundEntityPositionSyncPacket$id.get(packet); + int entityId = FastNMS.INSTANCE.method$ClientboundEntityPositionSyncPacket$id(packet); if (BukkitFurnitureManager.instance().isFurnitureRealEntity(entityId)) { event.setCancelled(true); } @@ -714,7 +735,6 @@ public class PacketConsumers { } }; - // TODO USE bytebuffer public static final TriConsumer MOVE_ENTITY = (user, event, packet) -> { try { int entityId = (int) Reflections.field$ClientboundMoveEntityPacket$entityId.get(packet); @@ -726,10 +746,10 @@ public class PacketConsumers { } }; - // TODO USE bytebuffer - public static final TriConsumer REMOVE_ENTITY = (user, event, packet) -> { + public static final BiConsumer REMOVE_ENTITY = (user, event) -> { try { - IntList intList = FastNMS.INSTANCE.field$ClientboundRemoveEntitiesPacket$entityIds(packet); + FriendlyByteBuf buf = event.getBuffer(); + IntList intList = buf.readIntIdList(); for (int i = 0, size = intList.size(); i < size; i++) { List entities = user.furnitureView().remove(intList.getInt(i)); if (entities == null) continue; 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 d560aa1d1..92bd4c108 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 @@ -15,4 +15,6 @@ public interface PacketIds { int clientboundOpenScreenPacket(); int clientboundEntityPositionSyncPacket(); + + int clientboundRemoveEntitiesPacket(); } 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 4a501c330..b299a92c5 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 @@ -38,4 +38,9 @@ public class PacketIds1_20 implements PacketIds { public int clientboundEntityPositionSyncPacket() { return -1; } + + @Override + public int clientboundRemoveEntitiesPacket() { + return 62; + } } 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 ff30aa2ca..e4774319e 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 @@ -38,4 +38,9 @@ public class PacketIds1_20_2 implements PacketIds { public int clientboundEntityPositionSyncPacket() { return -1; } + + @Override + public int clientboundRemoveEntitiesPacket() { + return 64; + } } 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 284377e77..4d1a66b7d 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 @@ -38,4 +38,9 @@ public class PacketIds1_20_3 implements PacketIds { public int clientboundEntityPositionSyncPacket() { return -1; } + + @Override + public int clientboundRemoveEntitiesPacket() { + return 64; + } } 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 ef0f54612..df520e0f3 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 @@ -38,4 +38,9 @@ public class PacketIds1_20_5 implements PacketIds { public int clientboundEntityPositionSyncPacket() { return -1; } + + @Override + public int clientboundRemoveEntitiesPacket() { + return 66; + } } 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 41afe8ae1..48b07e5fd 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 @@ -38,4 +38,9 @@ public class PacketIds1_21 implements PacketIds { public int clientboundEntityPositionSyncPacket() { return PacketIdFinder.clientboundByName("minecraft:entity_position_sync"); } + + @Override + public int clientboundRemoveEntitiesPacket() { + return PacketIdFinder.clientboundByName("minecraft:remove_entities"); + } } 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 46cdb16c4..487d633b3 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 @@ -6264,4 +6264,22 @@ public class Reflections { public static final Field field$ClientInformation$particleStatus = Optional.ofNullable(clazz$ClientInformation) .map(it -> ReflectionUtils.getDeclaredField(it, 8)) .orElse(null); + + public static final Method method$Registry$getId = requireNonNull( + ReflectionUtils.getMethod(clazz$Registry, int.class, Object.class) + ); + + public static final int instance$EntityType$FALLING_BLOCK$registryId; + public static final int instance$EntityType$BLOCK_DISPLAY$registryId; + + static { + try { + Object blockDisplay = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "block_display"); + instance$EntityType$BLOCK_DISPLAY$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, blockDisplay); + Object fallingBlock = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "falling_block"); + instance$EntityType$FALLING_BLOCK$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, fallingBlock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } } diff --git a/gradle.properties b/gradle.properties index a80c87bb7..700cc6878 100644 --- a/gradle.properties +++ b/gradle.properties @@ -51,7 +51,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.13 -nms_helper_version=0.43 +nms_helper_version=0.44 # Ignite Dependencies mixinextras_version=0.4.1 mixin_version=0.15.2+mixin.0.8.7