1.20.2版本Minecraft插件自定义铁砧菜单无法打开求助
解决1.20.2版本Minecraft插件自定义铁砧菜单无法打开的问题
你的代码存在三个关键问题导致铁砧菜单无法正常打开,以下是修正后的代码及说明:
问题分析与修复点
- 未触发玩家打开菜单的核心逻辑:仅调用
CraftEventFactory.callInventoryOpenEvent不足以让玩家打开菜单,必须调用ServerPlayer.openMenu()方法完成窗口打开操作。 - 标题设置错误:
Component.translatable()是用于加载游戏内置翻译键的,直接传入普通文本会找不到对应翻译,应使用Component.literal()来设置自定义文本标题。 - 窗口ID硬编码:硬写窗口ID为0可能引发冲突,使用
serverPlayer.nextContainerCounter()获取玩家的下一个可用窗口ID更安全。
修正后的完整代码
import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.inventory.AnvilMenu; import net.minecraft.world.inventory.ContainerLevelAccess; import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_20_R2.event.CraftEventFactory; import org.bukkit.entity.Player; public void OpenAnvilMenu(Player player) { ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); BlockPos position = serverPlayer.blockPosition(); // 使用玩家的下一个可用窗口ID,避免冲突 int windowId = serverPlayer.nextContainerCounter(); AnvilMenu anvilMenu = new AnvilMenu(windowId, serverPlayer.getInventory(), ContainerLevelAccess.create(serverPlayer.level(), position)); // 使用literal直接设置自定义标题,而非翻译键 anvilMenu.setTitle(Component.literal("Hello World")); // 先触发打开事件,再让玩家打开菜单 CraftEventFactory.callInventoryOpenEvent(serverPlayer, anvilMenu); serverPlayer.openMenu(anvilMenu); player.sendMessage("Opened anvil menu"); }
额外说明
如果需要监听玩家在铁砧菜单的输入(比如重命名操作),可以通过监听InventoryCloseEvent或直接处理NMS层面的菜单交互逻辑,获取铁砧输入槽的内容。
内容的提问来源于stack exchange,提问作者Entropire
相关产品推荐
相关产品推荐

