配置文件
本页是按配置文件组织的参考手册。如果你想要从零开始、一步一步跟着做的版本,请看 详细版教程。
TreasuresLite 有三类配置文件,分别控制不同层面的行为:
| 文件 | 路径 | 作用 |
|---|---|---|
config.yml | plugins/TreasuresLite/config.yml | 全局设置(显示、发包、掉落归属、预留数据库配置) |
location.yml | plugins/TreasuresLite/location.yml | 坐标分组、刷新规则、生成器 |
treasures/*.yml | plugins/TreasuresLite/treasures/ | 每个宝箱的独立配置(外观、奖励、钥匙、事件) |
所有配置文件支持热重载,执行 /tsl reload 即可生效。config.yml 与 location.yml 还开启了自动重载,直接保存文件也会触发一次重载,并顺带重启内部周期任务、刷新在线玩家数据。
config.yml — 全局配置
控制宝箱的显示行为、物品掉落规则和预留数据库配置。
view:
refresh: 30000
distance: 16
# 兼容旧配置:该选项已停用,虚拟方块与动画固定按顺序同步发包
async: false
virtualize_ui: false
drop_owner: true
database:
enable: true
host: localhost
port: 3306
user: root
password: root
database: minecraft
table: "lite_treasure"
view — 显示与发包
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
refresh | 整数 (毫秒) | 30000 | 定时刷新宝箱显示的间隔。30000 毫秒 = 30 秒。除定时刷新外,玩家进服、传送、切换世界也会触发刷新 |
distance | 整数 (格) | 16 | 宝箱显示距离。只有玩家在此范围内才会收到虚拟方块数据包。值越大客户端负担越重,建议 16~32 |
async | 布尔 | false | 已停用的兼容项。当前版本的虚拟方块与动画固定按顺序同步发包,填 true 不会改变行为,只会在启动时输出一条 view.async 已停用 告警 |
virtualize_ui | 布尔 | false | 是否虚拟化宝箱 GUI 界面。BungeeCord 子服环境下可能出现异常,遇到问题请关闭。另外该项只在宝箱未开启 lock_inventory 时才会实际生效 |
refresh值越小刷新越频繁,对大量在线玩家的服务器建议适当调大(如 60000)distance建议不超过 32,过大会增加不必要的发包量- 定时刷新走差集对账,只补发发生变化的坐标;玩家进服、传送、切换世界时才会强制全量重发
drop_owner — 掉落物归属
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
drop_owner | 布尔 | true | 当玩家背包满时,领取的奖励物品会掉落到地面。开启后掉落物只有该玩家能拾取,防止被其他人捡走 |
database — 数据库
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enable | 布尔 | true | 预留开关。当前源码未读取该配置 |
host | 字符串 | localhost | 数据库地址 |
port | 整数 | 3306 | 数据库端口 |
user | 字符串 | root | 用户名 |
password | 字符串 | root | 密码 |
database | 字符串 | minecraft | 数据库名 |
table | 字符串 | lite_treasure | 数据表名 |
数据库功能目前为预留配置,暂未启用;源码中没有读取 database 节点的实际逻辑。不要依赖这里的数据库连接项来判断当前版本的数据存储方式。
location.yml — 坐标与刷新规则
这是 TreasuresLite 最核心的配置文件,决定了宝箱在哪里生成、多久刷新、谁能看到。
文件分为两大部分:location(坐标分组)和 generator(生成器规则)。
location — 坐标分组
定义固定坐标点,供后续生成器引用。每个分组包含一组坐标,格式为 世界名, X, Y, Z, 朝向,五段都必须写全。
location:
# 分组名可以自定义
spawn_area:
- 'world, 100, 65, 200, east'
- 'world, 105, 65, 210, south'
nether_area:
- 'world_nether, 50, 40, 50, north'
- 'world_nether, -30, 35, 80, random'
| 参数 | 说明 |
|---|---|
| 世界名 | 世界文件夹名称,如 world、world_nether。不能为空 |
| X, Y, Z | 方块坐标(必须是整数) |
| 朝向 | 必填。只能是 north、south、east、west、random 五个值之一 |
固定坐标必须写满 世界名, X, Y, Z, 朝向 五段。少写朝向(如 'world, 0, 80, 0')或填入其他朝向值,该行会解析失败并被跳过,控制台输出 无法解析坐标 location.<组名>[<序号>]='...',这个刷新点不会生成宝箱。
固定坐标里的 random 只在配置加载时随机一次并固定下来,不会每次刷新都变。
坐标分组只是定义"位置在哪",具体哪个宝箱出现在哪个分组,由下方 generator 配置决定。
generator.normal — 固定坐标生成器
将宝箱绑定到坐标分组,按周期刷新。
generator:
normal:
# 全局刷新周期(毫秒),1800000 = 30 分钟
period: 1800000
# 特定坐标组的独立刷新时间(覆盖全局 period)
cooldown:
spawn_area: 300000 # 5 分钟刷新一次
nether_area: 3600000 # 1 小时刷新一次
# 公共宝箱:一人领取后所有人都看不到,直到下次刷新
public:
def:
- spawn_area
# 宝箱与坐标组的绑定
treasure:
def:
spawn_area: "true"
nether_area: "check player level > 10"
逐项说明:
| 配置项 | 类型 | 说明 |
|---|---|---|
period | 整数 (毫秒) | 全局刷新周期。所有未配置独立 cooldown 的坐标组使用此值。填 0 或负数表示关闭这个全局周期任务,此时只有配了 cooldown 的坐标组还会自动刷新 |
cooldown.<组名> | 整数 (毫秒) | 为指定坐标组设置独立刷新时间,覆盖全局 period |
public.<宝箱> | 列表 | 公共宝箱。列出的坐标组中,宝箱被任意一个玩家领取后,所有玩家都看不到该坐标的宝箱,直到下次刷新 |
treasure.<宝箱>.<组名> | Kether 条件 | 将宝箱文件绑定到坐标组。值为 Kether 条件表达式,"true" 表示无条件显示 |
- 周期任务使用服务端原生调度器,配置的毫秒值会按 50 毫秒一 tick 向上取整(最小 1 tick),启动时控制台会打印每个任务的实际周期
- 刷新周期修改后,执行
/tsl reload会重新加载配置并重启内部刷新任务;直接保存配置文件也会触发自动重载 - 玩家退出服务器时会清理该玩家的缓存与显示记录
- 玩家进服后普通坐标缓存需要先初始化完成才会显示,因此首次进服可能有短暂延迟
- 如果同一物理坐标被多个来源占用,按
临时 > 固定 > 随机的优先级只保留一个
条件表达式
treasure 绑定支持 Kether 脚本作为条件。常见用法:
treasure:
# 无条件显示
daily_chest:
spawn_area: "true"
# 等级大于 10 才显示
elite_chest:
spawn_area: "check player level > 10"
# 拥有特定权限才显示
vip_chest:
spawn_area: "check player perm vip.chest"
generator.random — 随机坐标生成器
在指定区域内随机生成宝箱坐标,每个玩家的坐标独立随机。
generator:
random:
period: 1800000
treasure:
# 地表模式:从高处往下找到第一个实心方块
- location: "world: 50,100 ~ -50,-100: ground#255: random"
max: 5
chest: def
# 范围模式:在指定 Y 范围内随机
- location: "world: 50,100 ~ -50,-100: range#0~40#air,stone,water"
max: 4
chest: def
if: "check player level > 5"
location 格式
世界名: X1,Z1 ~ X2,Z2: 随机规则: 朝向
| 部分 | 说明 |
|---|---|
世界名 | 生成区域所在的世界 |
X1,Z1 ~ X2,Z2 | 矩形区域的两个对角坐标(只需 X 和 Z) |
| 随机规则 | 决定 Y 坐标的生成方式,见下表 |
| 朝向 | north/south/east/west/random。省略仍兼容为 random,但已弃用并会输出告警,建议始终显式写出 |
随机规则里的 random 会为每个最终采用的坐标单独随机一次,因此同一批宝箱的朝向可以各不相同。
随机规则
| 规则 | 格式 | 说明 |
|---|---|---|
ground | ground#最大Y | 从指定高度往下扫描,找到第一个非空气方块,在其上方放置宝箱。适合地表生成 |
range | range#最小Y~最大Y#方块类型 | 在 Y 范围内随机选择坐标。方块类型可省略;填写后只接受当前位置材质在列表内的坐标。适合矿洞、地下城等场景 |
其他参数
| 参数 | 类型 | 说明 |
|---|---|---|
max | 整数或范围 | 该条规则尝试生成的宝箱数量,支持范围写法如 3~5 |
chest | 字符串 | 宝箱文件名(不含 .yml 后缀) |
if | Kether 条件 | 可选。满足条件的玩家才会生成该区域的宝箱,默认 "true"。默认配置中没有这一项,需要自己添加 |
同一个 chest 配置多条规则时,结果按配置顺序合并而不是覆盖,因此上例的 def 最多会拿到 5 + 4 = 9 个坐标。
所有规则之间会按物理坐标去重,重复坐标不会占两个名额,插件会在剩余尝试次数内补抽。若地形不满足条件导致数量不足,控制台会输出实际生成数量和原因统计(重复、区块未加载、越界、材质不匹配、未找到支撑等)。
ground 规则和带材质过滤的 range 规则都需要读取方块,所在区块未加载时会直接跳过该候选坐标。
宝箱配置文件 — treasures/*.yml
每个 .yml 文件定义一种宝箱类型,文件名即宝箱 ID。插件会递归加载 treasures/ 目录下所有 .yml 文件,子目录不构成命名空间,因此不同子目录下的同名文件会互相覆盖。启动时控制台会打印已加载的宝箱数量和 ID 列表,单个文件解析失败只会跳过该文件并输出告警。
首次启动只会自动释放 treasures/def.yml;源码里的 treasures/skull_test.yml 是头颅发包测试样例,不会自动生成到服务器配置目录。
完整结构概览
# GUI 标题,支持颜色代码和 PlaceholderAPI
title: "奖励箱"
# GUI 字符布局
layout:
- '#########'
- ' 1111111 '
- '#########'
# 宝箱设置(方块外观、钥匙、背包锁定)
settings:
block: "CHEST"
lock_inventory: true
open_key: { ... }
# 事件脚本
events:
open: |-
tell "打开了宝箱"
close: |-
tsl-claim
claim: |-
tell "领取了奖励"
spawn: |-
tell "宝箱出现了"
# 可领取的奖励物品
claim:
key: 1
amount: 3~8
layout: random
generator: { ... }
# 装饰图标
icons:
'#':
material: "gray stained glass pane"
name: " "
各节点的详细配置说明请参阅对应的功能文档:
| 节点 | 详细文档 |
|---|---|
settings.block | 虚拟宝箱 — 方块外观配置 |
settings.open_key | 钥匙系统 |
layout / icons / events | GUI 与动画 |
claim / generator | 奖励系统 |
settings — 宝箱设置
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
block | 字符串或对象 | — | 虚拟方块的外观。支持简化字符串("CHEST")、CraftEngine ID("ce:xxx")、头颅("player_head:Notch")或详细对象配置 |
type | 字符串 | — | 旧版方块外观写法。仅在没有 block 时才会被读取,两者同时存在时 block 生效 |
lock_inventory | 布尔 | false | 开启后玩家在宝箱 GUI 中无法点击自己背包内的物品 |
open_key | 对象 | — | 钥匙配置。不写此节点则无需钥匙即可开箱 |
claim — 奖励生成
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
key | 字符 | — | 对应 layout 中代表可领取槽位的字符 |
amount | 字符串 | "0" | 生成的奖励数量,支持范围写法如 3~8。不能超过布局里该字符的槽位总数 |
layout | 字符串 | "random" | 物品在槽位中的分布方式:random(随机)或 order(顺序) |
generator | 对象 | — | 奖励物品定义,每个子键为一种奖励。详见 奖励系统 |
claim 下的这几项有硬性校验,不满足时该宝箱的界面会构建失败,虚拟方块被还原成真实方块,控制台输出 构建宝箱 <ID> 的 GUI 失败:
amount抽出的数量大于布局中可用奖励槽位数generator缺失或为空- 任意一个
generator的chance不大于 0 - 所有
generator都是unique: true,但amount超过了生成器个数 - 单个
generator的amount不在1~2304之间
events — 事件脚本
| 事件 | 触发时机 | 常用场景 |
|---|---|---|
open | 钥匙检查通过后、GUI 打开前 | 播放音效、发送提示。可用 tsl-cancel 取消开箱 |
close | GUI 关闭时 | 自动领取剩余奖励(tsl-claim) |
claim | 玩家点击领取单个奖励时 | 发送领取提示。可用 &amount 获取数量 |
spawn | — | 预留未生效。默认样例带有这一段,但当前版本不会执行它,&chest-* 变量也不存在 |
默认 def.yml 里的 spawn 脚本和 {{ &chest-world }} 等变量属于预留配置,当前版本的开箱流程只会执行 open、close、claim 三个事件。写在 spawn 下的脚本不会有任何效果,也不会报错。
如果你需要在宝箱显示时做事情,只能通过插件提供的 Bukkit 事件 TreasureSpawnEvent 在其他插件里监听。
实战示例:从零配置一个每日宝箱
下面演示如何创建一个每日刷新的宝箱,放在出生点附近,需要钥匙才能打开。
第一步:创建宝箱文件 treasures/daily.yml
title: "&6&l每日宝箱"
layout:
- '#########'
- ' 1111111 '
- ' 1111111 '
- '#########'
settings:
block: "TRAPPED_CHEST"
lock_inventory: true
open_key:
deny: |-
tell "&c你需要一把每日钥匙才能打开"
key:
- check:
material: "tripwire_hook"
name: "每日钥匙"
consume: true
events:
close: |-
tsl-claim
claim:
key: 1
amount: 3~5
layout: random
generator:
diamond:
chance: 20
material: "diamond"
amount: 1~3
give: source
iron:
chance: 50
material: "iron_ingot"
amount: 3~8
give: source
gold:
chance: 30
material: "gold_ingot"
amount: 2~5
give: source
icons:
'#':
material: "gray stained glass pane"
name: " "
第二步:配置坐标 在 location.yml 中添加:
location:
daily_spots:
- 'world, 100, 65, 200, east'
- 'world, -50, 70, 150, south'
generator:
normal:
period: 86400000
cooldown:
daily_spots: 86400000 # 24 小时 = 86400000 毫秒
treasure:
daily:
daily_spots: "true"
第三步: 执行 /tsl reload,然后用 /tsl open daily 测试效果。