From d49e466158a400620e90ae1ea729fa5cb09e17ba Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 7 May 2025 21:08:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D1.21.5=E4=B8=AD=E9=94=AEpick?= =?UTF-8?q?=E7=89=A9=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/plugin/network/PacketConsumers.java | 17 ++++++++++++----- .../craftengine/bukkit/util/Reflections.java | 4 ++++ 2 files changed, 16 insertions(+), 5 deletions(-) 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 1651cf099..a5cb326fc 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 @@ -54,6 +54,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import org.bukkit.util.RayTraceResult; import org.bukkit.util.Vector; +import org.jetbrains.annotations.Nullable; import java.lang.reflect.InvocationTargetException; import java.nio.charset.StandardCharsets; @@ -1479,7 +1480,7 @@ public class PacketConsumers { if (state == null) return; Key itemId = state.settings().itemId(); if (itemId == null) return; - pickItem(player, itemId); + pickItem(player, itemId, pos, null); } // 1.21.4+ @@ -1518,18 +1519,24 @@ public class PacketConsumers { private static void handlePickItemFromEntityOnMainThread(Player player, LoadedFurniture furniture) throws Exception { Key itemId = furniture.config().settings().itemId(); if (itemId == null) return; - pickItem(player, itemId); + pickItem(player, itemId, null, FastNMS.INSTANCE.method$CraftEntity$getHandle(furniture.baseEntity())); } - private static void pickItem(Player player, Key itemId) throws IllegalAccessException, InvocationTargetException { + private static void pickItem(Player player, Key itemId, @Nullable Object blockPos, @Nullable Object entity) throws IllegalAccessException, InvocationTargetException { ItemStack itemStack = BukkitCraftEngine.instance().itemManager().buildCustomItemStack(itemId, BukkitCraftEngine.instance().adapt(player)); if (itemStack == null) { CraftEngine.instance().logger().warn("Item: " + itemId + " is not a valid item"); return; } assert Reflections.method$ServerGamePacketListenerImpl$tryPickItem != null; - Reflections.method$ServerGamePacketListenerImpl$tryPickItem.invoke( - Reflections.field$ServerPlayer$connection.get(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player)), FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(itemStack)); + if (VersionHelper.isOrAbove1_21_5()) { + Reflections.method$ServerGamePacketListenerImpl$tryPickItem.invoke( + Reflections.field$ServerPlayer$connection.get(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player)), + FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(itemStack), blockPos, entity, true); + } else { + Reflections.method$ServerGamePacketListenerImpl$tryPickItem.invoke( + Reflections.field$ServerPlayer$connection.get(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player)), FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(itemStack)); + } } public static final BiConsumer ADD_ENTITY_BYTEBUFFER = (user, event) -> { 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 87c8dfcd5..3ffed4d5b 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 @@ -5029,6 +5029,10 @@ public class Reflections { ); public static final Method method$ServerGamePacketListenerImpl$tryPickItem = + VersionHelper.isOrAbove1_21_5() ? + ReflectionUtils.getDeclaredMethod( + clazz$ServerGamePacketListenerImpl, void.class, clazz$ItemStack, clazz$BlockPos, clazz$Entity, boolean.class + ) : ReflectionUtils.getDeclaredMethod( clazz$ServerGamePacketListenerImpl, void.class, clazz$ItemStack );