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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user