GUI 与动画
GUI 字符布局
TreasuresLite 使用字符布局系统定义开箱界面。每个字符映射到一个槽位,通过 layout 定义界面结构,通过 claim.key 和 icons 定义各字符对应的内容。
默认配置示例
title: "奖励箱"
layout:
- '#########'
- ' 1111111 '
- ' 1111111 '
- ' 1111111 '
- ' 1111111 '
- '#########'
layout中的每一行对应 GUI 的一行(每行 9 个字符 = 9 个槽位)- 行数决定 GUI 的大小(上例为 6 行 = 54 格)
- 空格表示空槽位
1对应claim.key: 1,即可领取奖励的槽位#对应icons中定义的装饰图标
icons 装饰图标
icons:
'#':
material: "GRAY_STAINED_GLASS_PANE"
name: " "
actions:
left: |-
tell "点nm呢"
right: |-
tell "拿不了"
icons 中的每个键对应 layout 中的一个字符。支持配置:
| 配置项 | 说明 |
|---|---|
material | 物品材质,支持所有物品源格式。必填 |
name | 显示名称 |
lore | 显示 Lore |
amount | 显示数量,必须在 1 到该物品最大堆叠数之间 |
actions | 点击动作(Kether 脚本),支持 left、right、all |
图标也可以只写材质名的简写形式:
icons:
'#': "GRAY_STAINED_GLASS_PANE"
装饰图标会自动添加全部隐藏标签,因此不会显示附魔、属性等额外信息。图标的 material 同样是严格解析,材质名写错会导致宝箱界面构建失败。
开箱动画
插件通过 NMS 发包实现箱子的打开/关闭动画:
- 玩家右键点击虚拟宝箱
- 钥匙、事件和界面全部确认成功后,发送箱子打开动画数据包(箱盖打开效果)
- 打开 GUI 界面供玩家领取奖励
- 关闭 GUI 时发送箱子关闭动画数据包
- 延迟 15 tick 后还原方块,并重新对账一次显示
这个过程是自动的,不需要额外配置。
箱盖开合动画依赖原版箱子的方块动作数据包,因此只对 CHEST、TRAPPED_CHEST、ENDER_CHEST 生效。
配成头颅、木桶或 CraftEngine 自定义方块时,开箱流程一切正常,但不会有开合动画,只会更新方块状态。
如果玩家在界面打开期间被传送到别的世界,插件不会把旧世界的坐标动画发到新世界,避免出现错位的幽灵方块。
事件脚本
宝箱配置文件中的 events 节点可以绑定各阶段的 Kether 脚本:
events:
open: |-
tell "打开了闸总"
close: |-
tsl-claim
claim: |-
tell "领取了个什么东西啊"
| 事件 | 触发时机 | 说明 |
|---|---|---|
open | 玩家右键打开宝箱时 | 在钥匙检查通过后、GUI 打开前执行。可通过 tsl-cancel 取消 |
close | GUI 关闭时 | 常用于自动领取未领取的奖励(tsl-claim) |
claim | 玩家点击领取单个奖励时 | 可用 &amount 获取物品数量 |
spawn | — | 预留未生效,当前版本不会执行 |
默认 def.yml 带有 spawn 段落和 {{ &chest-world }} 之类的变量,但当前版本的代码只会执行 open、close、claim 三个事件,&chest-* 变量也没有实现。写在 spawn 下的脚本不会执行,也不会报错。
需要在宝箱显示时触发逻辑的话,只能让其他插件监听 Bukkit 事件 TreasureSpawnEvent。
全息文字
全息文字目前只是预留配置。插件里有 Adyeshach 的挂钩骨架和默认样例,但宝箱流程并没有调用它,配置 hologram 不会产生任何效果,也不会报错。不要按正式功能使用。
配置预留如下:
hologram:
offsetX: 0
offsetY: 0
offsetZ: 0
update: 20
text:
- '这是个全息'
- '这是个全息'
- '这是个全息'
背包锁定
开启 lock_inventory 后,玩家在开箱 GUI 中无法点击自己背包内的物品:
settings:
lock_inventory: true