脚本组 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=甲,乙} @dungeon | DungeonPlus 写法 |
- "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 指令 | 改用触发组或其他脚本呼叫 |