指南
如何制作 Minecraft GUI 菜单插件
更新于 2026年10月18日
服务器菜单(传送点、商店、礼包、设置)都是由插件打开并控制的箱子物品栏。每个格子里放一个物品,充当按钮。它们看起来简单,但只要菜单没有取消所有类型的点击,玩家就能把按钮直接拿走。本指南介绍菜单的工作原理,以及如何让 Codexe 构建并测试一个菜单。
从这个例子开始。
用 Codexe 生成这个分步说明
1.画出菜单草图
箱子菜单有 1 到 6 行,每行 9 格(9 到 54 格)。写明哪个物品放在哪一格、每次点击做什么,以及哪些格子只是装饰,比如玻璃板。
2.用 holder 创建物品栏
用
Bukkit.createInventory(holder, size, title)打开它,并使用你自己的InventoryHolder类。插件正是靠 holder 判断一次点击发生在它的菜单里,而不是普通箱子里。3.处理点击
在
InventoryClickEvent中检查 holder,取消事件,然后执行该格子对应的操作。操作完成后关闭或刷新菜单。4.封住移动物品的其他所有方式
同样要取消
InventoryDragEvent,并在菜单打开期间处理 Shift 点击、数字键,以及在玩家自己物品栏里的点击。5.列表很长就加上分页
放不下的传送点或商店物品,把最下面一行留给上一页、下一页和关闭按钮。
6.通过命令打开
例如
/warps,或者通过物品、NPC 打开。如果菜单不是给所有人用的,就给命令加上权限。7.构建并逐一点击测试
让 Codexe 编译插件,加入测试服务器,点一遍每个按钮。测试玩家也可以替你打开菜单并点击格子。
保证菜单安全的规则
- 通过 holder 识别菜单,绝不要靠标题:任何改过名的箱子都能复制标题。
- 在做任何其他事之前先取消点击,这样即使操作出错,物品也不会留在玩家的光标上。
- 取消来自玩家物品栏的拖动和 Shift 点击,否则物品可能被塞进菜单。
- 不要信任格子里的物品:按格子编号或物品上的标签查找对应操作。
- 把耗时的工作(读数据库、网络请求)放到主线程之外,完成后再更新菜单。
用配置文件定义菜单
服务器所有者喜欢不重新构建就修改菜单。要求把每个菜单定义在配置文件里,包括大小、标题,以及每个按钮的格子、材料、名称、描述和操作:
| 键 | 示例 | 作用 |
|---|---|---|
size | 27 | 格子数量,必须是 9 的倍数 |
slot | 13 | 按钮放在哪一格,从 0 开始计数 |
material | ENDER_PEARL | 显示的物品 |
action | warp:spawn | 点击后做什么:传送点、命令、另一个菜单 |
描述示例
“一个名为 WarpMenu 的 Paper 1.21.4 插件。/warps 打开一个 6 行菜单,每个传送点一个按钮,每页 45 个,最下面一行是上一页、下一页和关闭按钮。管理员用 /setwarp <name> <material> 添加传送点,用 /delwarp 删除。点击传送点后有 3 秒预热,移动则取消,之后传送。玩家不能拿走或移动菜单中的任何物品。传送点保存在 warps.yml 中,菜单标题、按钮名称和消息在 config.yml 中。”
用测试玩家测试菜单
Codexe 的测试玩家可以打开菜单并点击某个格子,然后检查是否打开了菜单、出现了消息或给予了物品。用你自己的话添加一个测试,比如“普通玩家运行 /warps 并点击 0 号格子,看到传送消息”,之后 Codexe 每次交付修改时都会重新运行它。
常见问题
1.8 上能用吗?
从 1.8 起每个版本都有箱子菜单。API 在细节上(材料名称、标题)有差别,所以请在需求中写明版本。
能改用 Skript 做菜单吗?
能,用 skript-gui 附加组件,Codexe 的 Skript 测试服务器已经装好了它。大型或使用频繁的菜单,用插件更好。
菜单能做成自定义材质的样子吗?
只能借助资源包,修改物品或物品栏背景。插件这边是一样的:格子、物品和点击。
制作你的菜单
这条提示词打开后即可直接发送:
“一个名为 WarpMenu 的 Paper 1.21.4 插件:/warps 打开 6 行菜单,每个传送点一个按钮,每页 45 个,最下面一行是上一页/下一页/关闭按钮,管理员可用 /setwarp(带名称和材料)和 /delwarp,传送前 3 秒预热且移动即取消,任何物品都不能被拿走或移动,传送点保存在 warps.yml 中,标题和消息在 config.yml 中。”
用 Codexe 生成这个