跳到主要内容

任务组 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是 / 否falsetrue = 副本正式开始(倒数结束)时自动开始;false = 用 task start 名称 开始
loop是 / 否falsetrue = 时间轴跑完(到最后一个时间点)后从头再来(DungeonPlus 的 cycle)
modecycle / timingDungeonPlus 写法: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} @dungeonDungeonPlus 写法
  • 对正在跑的任务再 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=…} 条件都能用。