Layout
Layout 把按钮 ID 映射到容器的物理槽位。每一行代表一行库存;空格表示空槽位,普通单字符是按钮 ID,反引号包裹的多字符内容作为一个逻辑槽位。
字段一览#
| 写法 | 占用逻辑槽位 | 作用 |
|---|---|---|
Layout |
整个布局 | 必须是字符串列表,每行对应一行库存 |
| 空格 | 1 | 保持为空,不渲染按钮 |
普通字符,如 A、# |
1 | 引用 Buttons.A 或 Buttons.# |
反引号,如 `shop` |
1 | 引用多字符按钮 ID Buttons.shop |
布局只负责“按钮放在哪里”,不负责“按钮显示什么”或“点击做什么”。后两项分别写在 Buttons.<id>.display 和 Buttons.<id>.actions。
Type: CHEST
Layout:
- '#########'
- '####`shop`####'
- '#########'
上例的中间行仍然是 9 个逻辑槽位:4 个空位、1 个 shop 按钮、4 个空位。Buttons.shop 必须存在;同一按钮 ID 可以占用多个槽位,并在这些槽位显示相同状态。
规则#
- 普通箱子为 9 列,允许 1 至 6 行;漏斗为 5 槽;发射器和投掷器为 3 x 3;熔炉类和铁砧为 3 槽。
- 行数或槽位数量不符合
Type时,菜单解析失败,不会打开残缺菜单。 - 按钮 ID 建议使用字母、数字、
_、-和/;多字符 ID 必须使用反引号。 - 不要把 Dialog 的
Bottom矩阵写进容器类菜单的Layout;容器类菜单的按钮矩阵由库存槽位决定。
使用案例:箱子和漏斗#
# CHEST 必须有 9 个逻辑槽位,每行 9 列
Type: CHEST
Layout:
- '# # # # #'
- ' `shop` '
- 'A B C D E'
# HOPPER 必须只有 5 个逻辑槽位
Type: HOPPER
Layout:
- 'ABCDE'
解析器按逻辑槽位计数,而不是简单按按钮名称长度计数。因此 `shop` 和一个普通字符都只占一个槽位;行数或列数错误会阻止菜单打开。
运行时动态槽位#
除了在 Layout 中用静态字符定位,按钮也可以在 Buttons.<id> 下声明 slot 表达式,由 KaMenu 在每次打开、刷新或翻页时按玩家状态解析槽位,从而不依赖布局固定位置。
slot 写法 |
行为 |
|---|---|
slot: 5 |
单静态槽位 |
slot: '%player_empty_slots%' |
单表达式,支持 PAPI / KaMenu 变量,按玩家状态解析 |
slot: [8, 9, 10] |
扁平列表,同一按钮同时渲染在多个槽位(多副本) |
slot: [[8], [9], [10]] |
列表的列表,逐帧循环,每次刷新移动到下一帧(运动槽位) |
Buttons:
moving:
slot: '%player_empty_slots%'
display:
material: PAPER
cycle:
slot: [[8], [9], [10]]
display:
material: DIAMOND
- 声明了
slot的按钮不需要在Layout中分配字符;它不会被报告为“未使用的按钮”。 - 点击位置优先查运行时动态槽位映射,再回退到静态
Layout字符。 - 动态槽位与静态布局槽位冲突时,该动态按钮被跳过;帧切换时旧槽位物品会被自动清理。
- 动画帧(
[[8], [9], [10]])随菜单Update刷新节拍循环;未配置Update时静止在首帧。