From 35bef4a2c721c7a315b136b20e9f7dd094dc60fd Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 8 Apr 2025 16:39:33 +0800 Subject: [PATCH] =?UTF-8?q?perf(network):=20=E4=BC=98=E5=8C=96=E5=AE=9E?= =?UTF-8?q?=E4=BD=93=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 3 +- .../plugin/network/PacketConsumers.java | 126 ++++++------------ .../craftengine/bukkit/util/Reflections.java | 21 +-- gradle.properties | 2 +- 4 files changed, 47 insertions(+), 105 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 552b6ba43..9b81c210e 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 @@ -149,7 +149,6 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerNMSPacketConsumer(PacketConsumers.SIGN_UPDATE, Reflections.clazz$ServerboundSignUpdatePacket); registerNMSPacketConsumer(PacketConsumers.EDIT_BOOK, Reflections.clazz$ServerboundEditBookPacket); registerNMSPacketConsumer(PacketConsumers.CUSTOM_PAYLOAD, Reflections.clazz$ServerboundCustomPayloadPacket); - // registerNMSPacketConsumer(PacketConsumers.SET_ENTITY_DATA, Reflections.clazz$ClientboundSetEntityDataPacket); registerByteBufPacketConsumer(PacketConsumers.SECTION_BLOCK_UPDATE, this.packetIds.clientboundSectionBlocksUpdatePacket()); registerByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket()); registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket()); @@ -164,7 +163,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes 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()); + 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 b4c1de552..464aa795d 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 @@ -1398,89 +1398,45 @@ public class PacketConsumers { }; - // 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 { -// -// } catch (Exception e) { -// CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e); -// } -// }; + 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) { + boolean isChanged = false; + List packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf); + 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) { + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeVarInt(id); + FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$pack(packedItems, buf); + } + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e); + } + }; } 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 282888557..874f9c2b4 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 @@ -2824,7 +2824,7 @@ public class Reflections { static { try { - if (VersionHelper.isVersionNewerThan1_20_5()) { + if (VersionHelper.isVersionNewerThan1_20_5() && method$Registry$getHolder0 != null) { Object block_break_speed = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", VersionHelper.isVersionNewerThan1_21_2() ? "block_break_speed" : "player.block_break_speed"); @SuppressWarnings("unchecked") Optional breakSpeedHolder = (Optional) method$Registry$getHolder0.invoke(instance$BuiltInRegistries$ATTRIBUTE, block_break_speed); @@ -3335,8 +3335,8 @@ public class Reflections { instance$ItemStack$EMPTY = requireNonNull( ReflectionUtils.getDeclaredField( clazz$ItemStack, clazz$ItemStack, 0 - ).get(null) - ); + ) + ).get(null); } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } @@ -6245,7 +6245,7 @@ public class Reflections { // 1.21.2+ static { try { - if (VersionHelper.isVersionNewerThan1_21_2()) { + if (VersionHelper.isVersionNewerThan1_21_2() && method$ParticleStatus$values != null) { Object[] values = (Object[]) method$ParticleStatus$values.invoke(null); instance$ParticleStatus$ALL = values[0]; instance$ParticleStatus$DECREASED = values[1]; @@ -6280,17 +6280,4 @@ public class Reflections { 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 - // ) - // ); } diff --git a/gradle.properties b/gradle.properties index 6db3d7e84..87061e98c 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.45 +nms_helper_version=0.46 # Ignite Dependencies mixinextras_version=0.4.1 mixin_version=0.15.2+mixin.0.8.7