跳到主要内容

脚本组 script.yml

脚本组是取了名字、可以重复使用的一串动作。同样的一段(开门动画、Boss 狂暴、发奖励)在好几个地方都要用时, 写一次放在 script.yml,到处用 script 名称 呼叫。

script.yml
开门动画:
- "sound BLOCK_IRON_DOOR_OPEN 1 0.7"
- "obstacle open 大门"
- "title &a大门开启了"

狂暴:
- "title &4守卫狂暴了||&7小心它的攻击"
- "sound ENTITY_WITHER_AMBIENT 1 0.6"
- "glow 霜烬守卫"
- "mob minecraft:stray 王座 2"
- if: "{v:碎片} >= 3"
then:
- "message &b寒冰碎片发出光芒,全队恢复了生命!"
- "heal"
monster.yml
前厅卫兵:
mobs: ["minecraft:zombie 5"]
end:
- "script 开门动画"
- "monstergroup 霜烬守卫"

写法​

script.yml
名称:
- "动作 …"
- "动作 …"

每个脚本组就是一个脚本清单,写法与其他文件完全相同(脚本写法):可以用 delay、if 区块、@对象、~区域、变量, 也可以再呼叫别的脚本组。名称不分大小写。

下面这些写法也可以读(script、actions、action-script 三个键选一个):

开门动画:
script:
- "obstacle open 大门"

执行脚本组​

写法意思
script 名称执行,跑完(包含里面的 delay)才接着执行下一行
script 甲 乙 / script 甲,乙依序执行甲、再执行乙(接成一串)
script 名称 @player副本里每个人各当一次触发者,同时执行;呼叫的这一串不会等它们跑完
run 名称同 script
$script{script=甲,乙} @dungeonDungeonPlus 写法
- "script 开门动画"
- "message &7(门开完才会显示这一行)"

触发者与变量​

脚本组本身没有固定的触发者,它沿用呼叫它的那一串:

从哪里呼叫脚本组里的 @self / {self}
触发组(例如玩家点了祭坛)那位玩家
script 名称 @player每次执行时轮到的那位玩家
怪物组、任务组、start.yml、end.yml没有触发者
  • 从怪物组呼叫时,脚本组也算在那个怪物组里:{killed}、{total}、kill 条件照样读得到那组的进度。
  • 呼叫端的区域变量会带进来,例如触发组的 {mob}、{count},失败组的 {reason}。
  • 副本变量({v:名称})是整场共用的,在脚本组里 var 改了,其他地方马上读得到。
script.yml
个人奖励:
- "message &a{self},这是你的补给 @self"
- "give GOLDEN_APPLE 2 @self"
end.yml
clear:
- "script 个人奖励 @player" # 每个人各执行一次,{self} 就是他自己

条件判断​

脚本组里最常用的就是 if 区块:

script.yml
检查钥匙:
- if: "{v:钥匙} >= 3"
then:
- "script 开门动画"
else:
- "message &c还差 {v:钥匙}/3 把钥匙 @self"

if / then / else、any、一行的 if 条件 -> 动作 写法见 脚本写法,条件写法见 条件。

stop​

stop(或 return)会结束目前的脚本组,脚本组里后面的行都不执行;呼叫它的那一串不受影响,会接着执行下一行:

script.yml
只能一次:
- if: "{v:已开启} == 1"
then:
- "message &7机关已经启动过了 @self"
- "stop"
- "var set 已开启 1"
- "script 开门动画"
trigger.yml
启动机关:
type: interact
point: 机关
script:
- "script 只能一次"
- "message &7(不管脚本组有没有 stop,这一行都会执行)"

想让呼叫端也一起停下,在脚本组里先设个变量(例如 var set 中止 1),呼叫端在 script 那一行后面写 if {v:中止} == 1 -> stop。

注意事项​

  • 脚本组互相呼叫最多 32 层,超过会停止并在控制台警告(防止 A 呼叫 B、B 又呼叫 A 的无限循环)。
  • 呼叫不存在的脚本组会跳过那一行并警告,不会中断后面。
  • 脚本组没有「异步」的设置:所有动作都在主线程依序执行,要等待就用 delay。

DungeonPlus 的写法​

DungeonPlus actionscript/*.yml 里的脚本组可以直接贴进 script.yml:

script.yml
测试:
async: false # 会被忽略
action-script:
- condition:
- "$data-condition{key=钥匙;type=value;value=>=3} @system"
true:
- "$message{type=text;text=门开了} @dungeon"
false:
- "$message{type=text;text=还差钥匙} @self"
DungeonPlus云副本
actionscript/*.yml 好几个文件同一个副本的 script.yml(每个副本有自己的脚本组)
action-script直接写清单,或沿用 action-script 键
condition / true / false原样可用;也可以写成 if / then / else
async不需要(忽略)
$script{script=…} @player相同:每个人各当一次触发者
dp script trigger 指令改用触发组或其他脚本呼叫