9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 18:09:27 +00:00

refactor(bukkit): 优化物品设置反射操作

- 移除了 VersionHelper 的引用,改用新的字段名常量
- 重构了 setItem 方法,使用预先获取的 Method 和 Field 对象
- 新增了相关反射操作的静态字段,提高代码可读性和性能
This commit is contained in:
jhqwqmc
2025-02-12 05:20:19 +08:00
parent 1e956f1e57
commit 7c455fea53
2 changed files with 27 additions and 9 deletions

View File

@@ -1,7 +1,6 @@
package net.momirealms.craftengine.bukkit.util;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.VersionHelper;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
@@ -20,19 +19,16 @@ public class ItemUtils {
public static void setItem(PlayerInventory inventory, int slot, ItemStack itemStack) {
try {
Object nmsInventory$getInventory = Reflections.clazz$CraftInventoryPlayer
.getMethod("getInventory").invoke(inventory);
Object nmsInventory$items = Reflections.clazz$Inventory
.getDeclaredField(VersionHelper.isMojmap() ? "items" : "i")
Object nmsInventory$getInventory = Reflections.method$CraftInventoryPlayer$getInventory
.invoke(inventory);
Object nmsInventory$items = Reflections.field$Inventory$items
.get(nmsInventory$getInventory);
Object nmsItemStack = Reflections.clazz$CraftItemStack
.getMethod("asNMSCopy", ItemStack.class)
Object nmsItemStack = Reflections.method$CraftItemStack$asNMSCopy
.invoke(null, itemStack);
nmsInventory$items.getClass()
.getMethod("set", int.class, Object.class)
.invoke(nmsInventory$items, slot, nmsItemStack);
} catch (InvocationTargetException | IllegalAccessException |
NoSuchMethodException | NoSuchFieldException e) {
} catch (InvocationTargetException | IllegalAccessException | NoSuchMethodException e) {
CraftEngine.instance().logger().warn("Failed to set item", e);
}
}

View File

@@ -41,6 +41,7 @@ public class Reflections {
}
public static final Unsafe UNSAFE;
public static final String INVENTORY$ITEMS = VersionHelper.isMojmap() ? "items" : "i";
static {
try {
@@ -3894,4 +3895,25 @@ 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 Method method$CraftItemStack$asNMSCopy = requireNonNull(
ReflectionUtils.getStaticMethod(
clazz$CraftItemStack,
clazz$ItemStack,
ItemStack.class
)
);
public static final Field field$Inventory$items = requireNonNull(
ReflectionUtils.getDeclaredField(
clazz$Inventory,
INVENTORY$ITEMS
)
);
}