布局、框架与槽位
布局是菜单中一个具名的区块。你在 Open GUI 条目的 layoutPool 中创建它,并为其指定一个 id。其他布局通过这个 id 来引用它。
选择布局
| 布局 | 适用场景 | 字段 |
|---|---|---|
simple | 静态菜单、边框和固定按钮。 | items |
flex | 按行自动排列物品。 | items, justifyContent, alignItems, wrap, virtualHeight |
paginated | 分成多页的列表。 | itemsPerPage, slots, items, navigationButtons |
scrollable | 比窗口更大的内容。 | innerId, virtualWidth, virtualHeight, buttons |
frame | 相互独立的矩形区域。 | frames |
composite | 相互叠放的图层。 | children |
book | 一本成书。 | pages |
merchant | 村民交易。 | trades |
storage | 可持久保存物品的槽位。 | entry, groupKey, slots |
leaderboard | Fact 排行榜。 | leaderboard, x, y, width, height, previousButton, nextButton |
simple
每个物品都有一个 x(列,0 到 8)和一个 y(行,顶部为 0)。这是入门时应该使用的布局。
dropOnClose 会在菜单关闭时(包括被另一个菜单替换时)归还布局槽位中剩下的内容:玩家没有拿走的战利品,或他们放进去的物品。只有带 allowPickup 的物品会被归还,且只归还一次;装饰物从不归还。closeDelivery 决定归还方式:GIVE_OR_DROP(默认)放入背包,放不下的掉落在玩家脚下,DROP 全部掉落。默认关闭;如果开启了但没有任何物品允许拾取,编辑器会给出警告。
flex
flex 会忽略其物品的 x 和 y,而是在菜单宽度内从左到右、逐行排列它们。justifyContent 决定一行如何分布(START、CENTER、END、SPACE_BETWEEN),alignItems 决定整个区块在 virtualHeight 内的垂直位置,wrap 决定排满一行后是否继续换到下一行。没有 wrap 时,超出最后一列的物品会被丢弃并记录日志。
paginated
物品按每页 itemsPerPage 个切分成多页,并填入实际的 slots(槽位索引为 y * 9 + x)。当 slots 为空时,物品从左上角开始填充整个物品栏。在 navigationButtons 中添加按钮,每个 role 对应一个:
NEXT和PREVIOUS仅在存在可翻到的页面时才会显示。BACK始终显示,并返回上一个菜单。INDICATOR不可点击,且仅在有两页或更多页时才显示。其名称和 lore 支持{page}、{total_pages}、{next_page}、{prev_page}和{page_indicator}。
请为按钮预留格子:分页会填满 slots 中列出的槽位,不会自动避开你的按钮。
scrollable
scrollable 布局会在 innerId 所指定的布局上显示一个窗口。virtualWidth 和 virtualHeight 给出完整区域的大小。通过 buttons 添加按钮,设置 direction(UP、DOWN、LEFT、RIGHT)和 step(每次点击滚动的槽位数)。每个按钮仅在其方向上还有可滚动内容时才会显示。
showDefaultButtons 开启(默认)时,会为每个在 buttons 中没有条目的方向添加一个箭头。defaultStep(至少为 1)是这些箭头每次点击滚动的格数;你自己的按钮保留各自的 step。关闭则不添加默认箭头。
默认箭头遵循与你自己的箭头相同的规则:只有内容能向其方向滚动时才会显示。未配置时,它们是名为 ▲、▼、◀ 或 ▶ 的普通箭头物品,向上和向下位于右侧列(第 8 列),向左和向右位于最后一行。它们绝不会盖住任何东西:如果该格子已经有内容物品、按钮或装饰,箭头就不会显示,控制台也没有任何消息。可在 GUI Settings 的 scrollArrows 列表中更改箭头的物品、名称或位置。
showDefaultButtons 默认开启,因此已有的 scrollable 布局会多出箭头。关闭它,或把箭头放到别处,即可让菜单与原来完全一致。
菜单打开时,鼠标滚轮也会让获得焦点的可滚动布局垂直滚动。请为每个 scrollable 和 paginated 布局设置唯一的 id,因为位置是按 id 分别记录的。
frame
frame 布局列出若干矩形:id、x、y、width、height,以及填充该矩形的布局的 layoutId。框架内的内容相对于其左上角定位。无法解析 layoutId 的框架会被跳过。将 @view 用作 layoutId,可以让当前视图来填充它。
典型的仪表盘:一列固定的标签页、一个可滚动的内容框架,以及一个页脚框架。
composite
composite 按顺序绘制其 children(布局 id),后面的子项叠在上层。请先放背景,中间放内容,最后放按钮。不存在的子项会被跳过,布局之间形成循环则会得到一个空布局。
连接布局
布局只有被引用时才会被使用:通过 mainLayoutId、composite 的子项、scrollable 的 innerId 或 frame 的 layoutId。没有任何地方引用的布局不会被绘制。
物品与槽位
物品的字段请参见 GUI 页面的“菜单”部分。