From f3c8d9c8c5f73d880a3ea4c75b8af44082081801 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 17 Jun 2025 07:57:50 +0800 Subject: [PATCH] =?UTF-8?q?perf(bukkit):=20=E5=8F=8D=E5=B0=84=E6=80=A7?= =?UTF-8?q?=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/reflection/minecraft/CoreReflections.java | 7 ++++++- .../plugin/reflection/minecraft/NetworkReflections.java | 5 +++++ .../bukkit/plugin/user/BukkitServerPlayer.java | 6 +++--- .../craftengine/core/util/ReflectionUtils.java | 9 +++++++++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java index 124dcf076..aa4fbaa1a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java @@ -2879,7 +2879,7 @@ public final class CoreReflections { public static final Method method$ServerPlayer$getAttribute = requireNonNull( VersionHelper.isOrAbove1_20_5() ? - ReflectionUtils.getMethod(clazz$ServerPlayer, clazz$AttributeInstance, CoreReflections.clazz$Holder) : + ReflectionUtils.getMethod(clazz$ServerPlayer, clazz$AttributeInstance, clazz$Holder) : ReflectionUtils.getMethod(clazz$ServerPlayer, clazz$AttributeInstance, clazz$Attribute) ); @@ -3275,6 +3275,7 @@ public final class CoreReflections { public static final MethodHandle methodHandle$ServerEntity$broadcastSetter; public static final MethodHandle methodHandle$ServerEntity$updateIntervalSetter; public static final MethodHandle methodHandle$ServerPlayer$connectionGetter; + public static final MethodHandle methodHandle$ServerPlayer$getAttributeMethod; static { try { @@ -3290,6 +3291,10 @@ public final class CoreReflections { ReflectionUtils.unreflectGetter(field$ServerPlayer$connection) .asType(MethodType.methodType(Object.class, Object.class)) ); + methodHandle$ServerPlayer$getAttributeMethod = requireNonNull( + ReflectionUtils.unreflectMethod(method$ServerPlayer$getAttribute) + .asType(MethodType.methodType(Object.class, Object.class, Object.class)) + ); } catch (IllegalAccessException e) { throw new ReflectionInitException("Failed to initialize reflection", 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 9ec3071d9..40ffdc977 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 @@ -1331,6 +1331,7 @@ public final class NetworkReflections { public static final MethodHandle methodHandle$ServerboundCustomPayloadPacket$payloadGetter; public static final MethodHandle methodHandle$ClientboundRotateHeadPacket$entityIdGetter; public static final MethodHandle methodHandle$ClientboundSetEntityMotionPacket$idGetter; + public static final MethodHandle methodHandle$ClientboundUpdateAttributesPacket0Constructor; static { try { @@ -1410,6 +1411,10 @@ public final class NetworkReflections { ReflectionUtils.unreflectGetter(field$ClientboundSetEntityMotionPacket$id) .asType(MethodType.methodType(int.class, Object.class)) ); + methodHandle$ClientboundUpdateAttributesPacket0Constructor = requireNonNull( + ReflectionUtils.unreflectConstructor(constructor$ClientboundUpdateAttributesPacket0) + .asType(MethodType.methodType(Object.class, int.class, List.class)) + ); if (field$ServerboundCustomPayloadPacket$payload != null) { methodHandle$ServerboundCustomPayloadPacket$payloadGetter = requireNonNull( ReflectionUtils.unreflectGetter(field$ServerboundCustomPayloadPacket$payload) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index a21f131ce..3a25e446c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -498,8 +498,8 @@ public class BukkitServerPlayer extends Player { if (canBreak) { if (VersionHelper.isOrAbove1_20_5()) { Object serverPlayer = serverPlayer(); - Object attributeInstance = CoreReflections.method$ServerPlayer$getAttribute.invoke(serverPlayer, MAttributeHolders.BLOCK_BREAK_SPEED); - Object newPacket = NetworkReflections.constructor$ClientboundUpdateAttributesPacket0.newInstance(entityID(), Lists.newArrayList(attributeInstance)); + Object attributeInstance = CoreReflections.methodHandle$ServerPlayer$getAttributeMethod.invokeExact(serverPlayer, MAttributeHolders.BLOCK_BREAK_SPEED); + Object newPacket = NetworkReflections.methodHandle$ClientboundUpdateAttributesPacket0Constructor.invokeExact(entityID(), (List) Lists.newArrayList(attributeInstance)); sendPacket(newPacket, true); } else { resetEffect(MMobEffects.MINING_FATIGUE); @@ -519,7 +519,7 @@ public class BukkitServerPlayer extends Player { sendPackets(List.of(fatiguePacket, hastePacket), true); } } - } catch (ReflectiveOperationException e) { + } catch (Throwable e) { plugin.logger().warn("Failed to set attribute for player " + platformPlayer().getName(), e); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java index ea6759cfb..4ac327b00 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java @@ -512,6 +512,15 @@ public class ReflectionUtils { } } + public static MethodHandle unreflectConstructor(Constructor constructor) throws IllegalAccessException { + try { + return LOOKUP.unreflectConstructor(constructor); + } catch (IllegalAccessException e) { + constructor.setAccessible(true); + return LOOKUP.unreflectConstructor(constructor); + } + } + public static VarHandle findVarHandle(Class clazz, String name, Class type) { try { return MethodHandles.privateLookupIn(clazz, LOOKUP)