From 251a8996aadcc2cac1aca1c64511932511274fe2 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 12 Feb 2025 17:22:43 +0800 Subject: [PATCH] Optimize reflections --- .../bukkit/block/BlockEventListener.java | 9 +++----- .../craftengine/bukkit/util/ItemUtils.java | 13 ++++------- .../craftengine/bukkit/util/Reflections.java | 23 ++++++++----------- .../craftengine/core/item/ItemKeys.java | 1 + 4 files changed, 18 insertions(+), 28 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java index bf998a186..2ccfa9e3d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java @@ -14,6 +14,7 @@ import net.momirealms.craftengine.core.block.PushReaction; import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemKeys; import net.momirealms.craftengine.core.loot.parameter.LootParameters; import net.momirealms.craftengine.core.plugin.config.ConfigManager; import net.momirealms.craftengine.core.util.Key; @@ -37,6 +38,7 @@ import org.bukkit.event.world.GenericGameEvent; import org.bukkit.inventory.ItemStack; import java.util.List; +import java.util.Optional; // TODO interact waterlogged blocks public class BlockEventListener implements Listener { @@ -121,12 +123,7 @@ public class BlockEventListener implements Listener { BukkitServerPlayer serverPlayer = plugin.adapt(player); Item itemInHand = serverPlayer.getItemInHand(InteractionHand.MAIN_HAND); - Key itemId; - if (itemInHand == null) { - itemId = Key.of("minecraft:air"); - } else { - itemId = itemInHand.id(); - } + Key itemId = Optional.ofNullable(itemInHand).map(Item::id).orElse(ItemKeys.AIR); // do not drop if it's not the correct tool if (!state.settings().isCorrectTool(itemId)) { return; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemUtils.java index d9dc9695e..ffeda325a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemUtils.java @@ -17,16 +17,13 @@ public class ItemUtils { return item.getAmount() == 0; } + // 1.21.4+ public static void setItem(PlayerInventory inventory, int slot, ItemStack itemStack) { try { - Object nmsInventory = Reflections.method$CraftInventoryPlayer$getInventory - .invoke(inventory); - Object nmsInventory$items = Reflections.field$Inventory$items - .get(nmsInventory); - Object nmsItemStack = Reflections.method$CraftItemStack$asNMSMirror - .invoke(null, itemStack); - Reflections.method$NonNullList$set - .invoke(nmsInventory$items, slot, nmsItemStack); + Object nmsInventory = Reflections.method$CraftInventoryPlayer$getInventory.invoke(inventory); + Object nmsInventory$items = Reflections.field$Inventory$items.get(nmsInventory); + Object nmsItemStack = Reflections.method$CraftItemStack$asNMSMirror.invoke(null, itemStack); + Reflections.method$NonNullList$set.invoke(nmsInventory$items, slot, nmsItemStack); } catch (InvocationTargetException | IllegalAccessException e) { CraftEngine.instance().logger().warn("Failed to set item", 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 f0ffe7c24..09b18499a 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 @@ -41,7 +41,6 @@ public class Reflections { } public static final Unsafe UNSAFE; - public static final String INVENTORY$ITEMS = VersionHelper.isMojmap() ? "items" : "i"; static { try { @@ -3895,17 +3894,10 @@ public class Reflections { BukkitReflectionUtils.assembleMCClass("world.entity.player.PlayerInventory") ) ); + public static final Method method$CraftInventoryPlayer$getInventory = requireNonNull( ReflectionUtils.getMethod( - clazz$CraftInventoryPlayer, - new String[]{ "getInventory" } - ) - ); - - public static final Field field$Inventory$items = requireNonNull( - ReflectionUtils.getDeclaredField( - clazz$Inventory, - INVENTORY$ITEMS + clazz$CraftInventoryPlayer, new String[]{ "getInventory" } ) ); @@ -3915,12 +3907,15 @@ public class Reflections { ) ); + public static final Field field$Inventory$items = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Inventory, clazz$NonNullList, 0 + ) + ); + public static final Method method$NonNullList$set = requireNonNull( ReflectionUtils.getMethod( - clazz$NonNullList, - Object.class, - int.class, - Object.class + clazz$NonNullList, Object.class, int.class, Object.class ) ); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java index 464b94248..f7bb2225a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java @@ -3,6 +3,7 @@ package net.momirealms.craftengine.core.item; import net.momirealms.craftengine.core.util.Key; public class ItemKeys { + public static final Key AIR = Key.of("minecraft:air"); public static final Key TRIDENT = Key.of("minecraft:trident"); public static final Key SHIELD = Key.of("minecraft:shield"); public static final Key BOW = Key.of("minecraft:bow");