From 0ae08a496a416be0965999e7f94b9baf1b7bb232 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Apr 2025 22:07:16 +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 | 6 +- .../plugin/network/PacketConsumers.java | 117 ++++++++++++------ .../bukkit/plugin/network/PacketIds.java | 4 +- .../plugin/network/impl/PacketIds1_20.java | 9 +- .../plugin/network/impl/PacketIds1_20_2.java | 9 +- .../plugin/network/impl/PacketIds1_20_3.java | 9 +- .../plugin/network/impl/PacketIds1_20_5.java | 9 +- .../plugin/network/impl/PacketIds1_21.java | 9 +- .../craftengine/bukkit/util/Reflections.java | 21 +++- 9 files changed, 140 insertions(+), 53 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 4cb0324bf..5a247e1a2 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,8 +157,10 @@ 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.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); + // registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); + // registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket()); + // registerByteBufPacketConsumer(PacketConsumers.SET_ENTITY_DATA, this.packetIds.clientboundSetEntityDataPacket()); } public static BukkitNetworkManager instance() { 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 c997fa049..84a60b157 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 @@ -673,6 +673,7 @@ public class PacketConsumers { if (type == Reflections.instance$EntityType$FALLING_BLOCK$registryId) { int remapped = remap(data); if (remapped != data) { + event.setChanged(true); buf.clear(); buf.writeVarInt(event.packetID()); buf.writeVarInt(id); @@ -747,12 +748,13 @@ public class PacketConsumers { } }; - public static final BiConsumer REMOVE_ENTITY = (user, event) -> { + // TODO USE bytebuffer + public static final TriConsumer REMOVE_ENTITY = (user, event, packet) -> { try { - FriendlyByteBuf buf = event.getBuffer(); - IntList intList = buf.readIntIdList(); + IntList intList = FastNMS.INSTANCE.field$ClientboundRemoveEntitiesPacket$entityIds(packet); for (int i = 0, size = intList.size(); i < size; i++) { List entities = user.furnitureView().remove(intList.getInt(i)); + System.out.println("Removing " + entities); if (entities == null) continue; for (int entityId : entities) { intList.add(entityId); @@ -1039,38 +1041,83 @@ public class PacketConsumers { } }; - // TODO 使用bytebuffer -// public static final TriConsumer SET_ENTITY_DATA = (user, event, packet) -> { -// try { -// int id = FastNMS.INSTANCE.field$ClientboundSetEntityDataPacket$id(packet); -// Object entityType = user.entityView().get(id); -// if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) { -// List packedItems = FastNMS.INSTANCE.field$ClientboundSetEntityDataPacket$packedItems(packet); -// for (int i = 0; i < packedItems.size(); i++) { -// Object packedItem = packedItems.get(i); -// int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); -// if (entityDataId != EntityDataUtils.BLOCK_STATE_DATA_ID) { -// continue; -// } -// Object blockState = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); -// int stateId = BlockStateUtils.blockStateToId(blockState); -// int newStateId; -// if (!user.clientModEnabled()) { -// newStateId = remap(stateId); -// } else { -// newStateId = remapMOD(stateId); -// } -// Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem); -// packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue( -// entityDataId, serializer, BlockStateUtils.idToBlockState(newStateId) -// )); -// break; -// } -// } -// } catch (Exception e) { -// CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e); -// } -// }; + + // TODO 需要修复 + // @SuppressWarnings("unchecked") + // public static final BiConsumer SET_ENTITY_DATA = (user, event) -> { + // try { + // FriendlyByteBuf buf = event.getBuffer(); + // int id = buf.readVarInt(); + // Object entityType = user.entityView().get(id); + // if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) { + // Object registryFriendlyByteBuf = FastNMS.INSTANCE.constructor$RegistryFriendlyByteBuf(buf, Reflections.instance$registryAccess); + // boolean isChanged = false; + // List packedItems = (List) Reflections.method$ClientboundSetEntityDataPacket$unpack.invoke(null, registryFriendlyByteBuf); + // for (int i = 0; i < packedItems.size(); i++) { + // Object packedItem = packedItems.get(i); + // int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); + // if (entityDataId != EntityDataUtils.BLOCK_STATE_DATA_ID) { + // continue; + // } + // Object blockState = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); + // int stateId = BlockStateUtils.blockStateToId(blockState); + // int newStateId; + // if (!user.clientModEnabled()) { + // newStateId = remap(stateId); + // } else { + // newStateId = remapMOD(stateId); + // } + // Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem); + // packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue( + // entityDataId, serializer, BlockStateUtils.idToBlockState(newStateId) + // )); + // isChanged = true; + // break; + // } + // if (isChanged) { + // System.out.println("Changed"); + // event.setChanged(true); + // buf.clear(); + // buf.writeVarInt(event.packetID()); + // Reflections.method$ClientboundSetEntityDataPacket$pack.invoke(null, packedItems, registryFriendlyByteBuf); + // } + // } + // } catch (Exception e) { + // CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e); + // } + // }; + // 之前的旧东西经供参考需要改成使用bytebuffer的 + // public static final TriConsumer SET_ENTITY_DATA = (user, event, packet) -> { + // try { + // int id = FastNMS.INSTANCE.field$ClientboundSetEntityDataPacket$id(packet); + // Object entityType = user.entityView().get(id); + // if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) { + // List packedItems = FastNMS.INSTANCE.field$ClientboundSetEntityDataPacket$packedItems(packet); + // for (int i = 0; i < packedItems.size(); i++) { + // Object packedItem = packedItems.get(i); + // int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); + // if (entityDataId != EntityDataUtils.BLOCK_STATE_DATA_ID) { + // continue; + // } + // Object blockState = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); + // int stateId = BlockStateUtils.blockStateToId(blockState); + // int newStateId; + // if (!user.clientModEnabled()) { + // newStateId = remap(stateId); + // } else { + // newStateId = remapMOD(stateId); + // } + // Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem); + // packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue( + // entityDataId, serializer, BlockStateUtils.idToBlockState(newStateId) + // )); + // break; + // } + // } + // } catch (Exception e) { + // CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e); + // } + // }; // public static final TriConsumer OPEN_SCREEN = (user, event, packet) -> { // try { 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 92bd4c108..bc89467c1 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 @@ -14,7 +14,9 @@ public interface PacketIds { int clientboundOpenScreenPacket(); - int clientboundEntityPositionSyncPacket(); + int clientboundSoundPacket(); int clientboundRemoveEntitiesPacket(); + + int clientboundSetEntityDataPacket(); } 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 b299a92c5..418af0473 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 @@ -35,12 +35,17 @@ public class PacketIds1_20 implements PacketIds { } @Override - public int clientboundEntityPositionSyncPacket() { - return -1; + public int clientboundSoundPacket() { + return 98; } @Override public int clientboundRemoveEntitiesPacket() { return 62; } + + @Override + public int clientboundSetEntityDataPacket() { + return 82; + } } 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 e4774319e..a79c2a0ea 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 @@ -35,12 +35,17 @@ public class PacketIds1_20_2 implements PacketIds { } @Override - public int clientboundEntityPositionSyncPacket() { - return -1; + public int clientboundSoundPacket() { + return 100; } @Override public int clientboundRemoveEntitiesPacket() { return 64; } + + @Override + public int clientboundSetEntityDataPacket() { + return 84; + } } 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 4d1a66b7d..dcae35e59 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 @@ -35,12 +35,17 @@ public class PacketIds1_20_3 implements PacketIds { } @Override - public int clientboundEntityPositionSyncPacket() { - return -1; + public int clientboundSoundPacket() { + return 102; } @Override public int clientboundRemoveEntitiesPacket() { return 64; } + + @Override + public int clientboundSetEntityDataPacket() { + return 86; + } } 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 df520e0f3..d6da5f830 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 @@ -35,12 +35,17 @@ public class PacketIds1_20_5 implements PacketIds { } @Override - public int clientboundEntityPositionSyncPacket() { - return -1; + public int clientboundSoundPacket() { + return 104; } @Override public int clientboundRemoveEntitiesPacket() { return 66; } + + @Override + public int clientboundSetEntityDataPacket() { + return 88; + } } 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 48b07e5fd..944d99a1a 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 @@ -35,12 +35,17 @@ public class PacketIds1_21 implements PacketIds { } @Override - public int clientboundEntityPositionSyncPacket() { - return PacketIdFinder.clientboundByName("minecraft:entity_position_sync"); + public int clientboundSoundPacket() { + return PacketIdFinder.clientboundByName("minecraft:sound"); } @Override public int clientboundRemoveEntitiesPacket() { return PacketIdFinder.clientboundByName("minecraft:remove_entities"); } + + @Override + public int clientboundSetEntityDataPacket() { + return PacketIdFinder.clientboundByName("minecraft:set_entity_data"); + } } 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 487d633b3..282888557 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 @@ -6269,17 +6269,28 @@ public class Reflections { 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; + public static final int instance$EntityType$FALLING_BLOCK$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); + instance$EntityType$BLOCK_DISPLAY$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, instance$EntityType$BLOCK_DISPLAY); + instance$EntityType$FALLING_BLOCK$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, instance$EntityType$FALLING_BLOCK); } catch (Exception e) { throw new RuntimeException(e); } } + + // 先注释后面再说 + // public static final Method method$ClientboundSetEntityDataPacket$pack = requireNonNull( + // ReflectionUtils.getDeclaredMethod( + // clazz$ClientboundSetEntityDataPacket, void.class, List.class, clazz$RegistryFriendlyByteBuf + // ) + // ); + // + // public static final Method method$ClientboundSetEntityDataPacket$unpack = requireNonNull( + // ReflectionUtils.getDeclaredMethod( + // clazz$ClientboundSetEntityDataPacket, List.class, clazz$RegistryFriendlyByteBuf + // ) + // ); }