You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:58:15