任务组 task.yml
任务组是照时间轴执行的脚本:从任务开始算起,到了第几秒就执行那一段。适合时间提醒、定时补怪、限时机关、Boss 战中途的环境变化。
task.yml
时间提醒:
auto-start: true
timeline:
300:
- "message &e已经过了 5 分钟,加快脚步!"
600:
- "title &c只剩 5 分钟||&7快点打倒霜烬守卫"
每30秒补怪:
every: 30
script:
- "mob minecraft:zombie 补怪点 2"
设置项
| 设置项 | 类型 | 默认 | 说明 |
|---|---|---|---|
auto-start | 是 / 否 | false | true = 副本正式开始(倒数结束)时自动开始;false = 用 task start 名称 开始 |
loop | 是 / 否 | false | true = 时间轴跑完(到最后一个时间点)后从头再来(DungeonPlus 的 cycle) |
mode | cycle / timing | DungeonPlus 写法:cycle(或 loop)= loop: true | |
timeline | 对照表 | 秒数: [动作…],见下方 | |
every | 时间 | 简写:每隔几秒执行一次 script(自动 loop: true) | |
script | 脚本 | 与 every 一起用(别名 actions) |
timeline 与 every 至少要写一个;两个都写时会合在一起。任务名称不分大小写。
timeline:时间轴
timeline 底下的键是「任务开始后第几秒」,值是那一刻要执行的脚本:
task.yml
冰封倒数:
timeline:
0: # 一开始马上执行
- "title &b冰封开始||&790 秒内找到出口"
30:
- "message &b寒气越来越重了……"
1m: # 也可以写 1m、1m30s
- "effect SLOWNESS 30 1"
80:
- "title &c还剩 10 秒!"
90:
- "fail &c你们被冰封了"
- 秒数可以写
90、90s、1m30s、5m。 - 时间点照秒数排序执行,写的顺序不重要;同一个秒数写两次会合并。
- 每个时间点的脚本是独立的一串,里面可以用
delay、if区块、script;某一段还在delay时不会挡住后面的时间点。 - 任务没有触发者,
@self不会作用在任何人身上。
every:每隔几秒
只是想「每隔 N 秒做一次」时,用 every 最简单:
task.yml
毒雾:
every: 5
script:
- "effect POISON 3 1 @alive ~毒雾区"
- "particle 毒雾中心 SNEEZE 40"
every: 5 等于 timeline: {5: [...]} 加上 loop: true:第 5、10、15……秒各执行一次,直到任务被停止或副本结束。
开始与停止
| 写法 | 意思 |
|---|---|
task start 名称 | 开始任务(从第 0 秒算起) |
task 名称 | 同上 |
task stop 名称 | 停止(task end 也可以) |
task restart 名称 | 停止后从第 0 秒重新开始 |
task start 名称 mode=cycle | 开始,并且这次改成循环(mode=timing = 这次不循环) |
$task{name=名称;operation=start;mode=cycle} @dungeon | DungeonPlus 写法 |
- 对正在跑的任务再
task start一次,会从第 0 秒重新开始。 - 时间轴跑完、而且没设
loop的任务会自动停止,之后可以再task start。 - 判断任务是否在跑:条件
task 名称(!task 名称= 没在跑)、变量{task:名称}(true/false),见 条件。
trigger.yml
踩到冰面:
type: enter
region: 冰面
script:
- "if !task 冰封倒数 -> task start 冰封倒数"
时间怎么算
- 任务的秒数从任务开始那一刻算起,不是从副本开始算。
- 任务每秒前进一次,只有副本进行中才会前进;全队掉线导致副本暂停时,任务的时间也会暂停。
- 第
0秒的内容在任务开始时立刻执行。 - 循环(
loop: true)的任务,一轮的长度 = 最后一个时间点的秒数;一轮结束的那一刻就是下一轮的第0秒,不会多等一秒。 例如只写了0:和3:的循环任务,会在第 0、3、6、9……秒执行。 - 副本通关或失败时,所有任务都会停止,还在
delay的也会取消。 - 在
before.yml开始的任务,第 0 秒会马上执行,之后的时间点要等副本正式开始后才开始计时。
要依「副本开始后经过的时间」做事,用 auto-start: true 的任务即可:它和计时同一刻开始。
常见用法
限时机关:进入区域后 60 秒内要按下拉杆,否则失败。
task.yml
机关倒数:
timeline:
0:
- "title &c60 秒内拉下拉杆!"
50:
- "title &c还剩 10 秒"
60:
- "fail &c机关没有及时关闭"
trigger.yml
进入机关室:
type: enter
region: 机关室
once: true
script:
- "task start 机关倒数"
拉下拉杆:
type: interact
point: 拉杆
once: true
script:
- "task stop 机关倒数"
- "obstacle open 出口"
Boss 战定时召唤:Boss 出现时开始,Boss 打完时停止。
monster.yml
Boss:
mobs: ["SkeletonKing 1 20 王座 boss"]
start:
- "task start 召唤小兵"
end:
- "task stop 召唤小兵"
- "clear"
task.yml
召唤小兵:
every: 20
script:
- "title &7骷髅王召唤了援军"
- "mob minecraft:skeleton 王座 3 spread=4"
DungeonPlus 的写法
DungeonPlus task/*.yml 的格式可以原样贴进 task.yml:
task.yml
auto-start:
- "任务一 false cycle"
任务一:
- 2:
- "$message{type=text;text=时间又过去了两秒} @dungeon"
10:
- "$message{type=text;text=时间又过去了十秒} @dungeon"
任务名: [ {秒数: [...]} ]这种「只有一项的清单」格式可以直接读。- 文件最上面的
auto-start清单格式是"任务名 是否异步 cycle/timing":列在里面的任务会自动开始;第三个词是cycle就循环。 「是否异步」会被忽略(所有动作都在主线程依序执行)。 $task{…;operation=start/end/restart;mode=timing/cycle}与$taskcontain{name=…}条件都能用。