条件判断
条件是「成立 / 不成立」的判断,用在这些地方:
| 位置 | 作用 |
|---|---|
monster.yml 每一波的 condition | 全部成立,这一波才算打完。没写 = 这一波的怪全部击杀(kill-all) |
脚本里的 if 条件 -> 动作、if / then / else、condition / true / false | 成立才执行、或二选一,见 下方 |
trigger.yml 的 condition | 触发时全部成立才执行,见 触发组 |
loot.yml 的 condition | 宝箱能不能打开(开箱的人 = 触发者) |
before.yml 的 condition | 开始挑战前的检查,能用的条件比较少,见 入场条件 |
怪物组的条件会在每次有怪死掉、出怪完成时、以及每秒检查一次。
写法
和动作一样有两种写法,也可以直接写运算式:
condition:
- "kill SkeletonKing 1" # 简写:条件名称 参数…
- "$kill{mobname=SkeletonKing;amount=1} @system" # DungeonPlus 写法
- "{v:钥匙} >= 3 && {alive} > 1" # 不是条件名称 → 当成运算式
- 反过来:简写条件或运算式前面加
!,例如!task 倒计时、!region 祭坛区。 - 玩家条件的
@对象:permission、item、level、js-condition这类看玩家的条件,写@self= 只看触发者; 不写(或@system)= 副本里每个人都要符合(含倒下旁观的人)。 - 写错(例如参数不是数字)的条件一律算不成立,开启 debug 时控制台会写出原因。
条件一览
| 条件 | 别名 | 判断什么 |
|---|---|---|
kill | 某种怪的击杀数 | |
kill-any | 几种怪加起来的击杀数 | |
kill-all | all-dead、clear-wave | 这一波的怪全部打完 |
left | alive-mobs | 这一波剩下几只 |
time | elapsed | 经过几秒 |
var | variable | 副本变量 |
data-condition | 副本变量(DungeonPlus 写法) | |
task | taskcontain、task-running | 任务组是否在跑 |
group | monstergroup | 怪物组的状态 |
players | team、team-condition | 队伍人数 |
region | area | 区域里有没有玩家 |
mob-in | monster-in | 区域里的怪物数量 |
chance | 机率 | |
permission | perm | 权限 |
item | has-item | 背包里的物品 |
level | 原版经验等级 | |
js-condition | expr、check | 运算式(DungeonPlus 写法) |
true / false | always / never | 一定成立 / 一定不成立 |
| 运算式 | 其它任何写法 |
kill 击杀数
简写:kill 怪物 [数量]
DungeonPlus 写法:$kill{mobname=SkeletonKing;amount=1} @system
| 参数 | 必填 | 说明 |
|---|---|---|
第 1 个 / mobname(或 mob、name) | 是 | 怪物 ID 或显示名称(不含颜色)。原版怪写 minecraft:zombie 或 zombie |
第 2 个 / amount | 否 | 至少几只,默认 1 |
算哪些击杀:
- 在怪物组的条件里:从这一波开始到现在的击杀数。副本里生成的任何怪都算(别的怪物组的、
mob生的也算),每一波重新从 0 开始。 - 在其他地方(
if、触发组):整场副本累计的击杀数。 - 只算副本自己生成的怪;被
killmobs移除的不算。
霜烬守卫:
mobs:
- "FrostWarden 1 10 王座 boss"
- "minecraft:stray 6 1 王座"
condition:
- "kill FrostWarden 1" # 打倒王就过关,小怪不用清完
end:
- "killmobs"
- "clear"
检查进度:
- "if kill 冰霜骷髅 20 -> message &a已经击杀 20 只冰霜骷髅了!"
注意:MythicMobs 怪的显示名称如果是 小怪:[HP] 这种带冒号的格式,只取冒号左边比对(和 DungeonPlus 相同)。
kill-any 几种怪合计
DungeonPlus 1.4.2 的条件。几种怪的击杀数加起来达到数量。
简写:kill-any 怪物甲,怪物乙 数量
DungeonPlus 写法:$kill-any{mobname=冰霜骷髅,冰霜流浪者;amount=10} @system
| 参数 | 必填 | 说明 |
|---|---|---|
第 1 个 / mobname(或 mob、name) | 是 | 怪物 ID 或显示名称,用英文逗号分开,逗号前后不要空格 |
第 2 个 / amount | 否 | 合计至少几只,默认 1 |
亡灵大军:
mobs:
- "minecraft:zombie 10"
- "minecraft:skeleton 10"
condition:
- "kill-any minecraft:zombie,minecraft:skeleton 15"
计算方式同 kill(怪物组里从这一波开始算)。
kill-all 这一波全部打完
别名:all-dead、clear-wave
这一波的怪全部出完而且都死了。怪物组没写 condition 时就是用这个。
简写:kill-all
没有参数。只能用在怪物组的条件里,在其他地方一律不成立。
前厅卫兵:
mobs:
- "minecraft:zombie 5"
condition:
- "kill-all"
- "time 30" # 至少打 30 秒,太快清完也要等
left 剩下几只
别名:alive-mobs
这一波的怪都出完之后,场上剩下的数量小于等于这个数。
简写:left 数量
| 参数 | 必填 | 说明 |
|---|---|---|
第 1 个 / amount | 否 | 剩几只以下就成立,默认 0 |
只能用在怪物组的条件里。
尸潮:
mobs:
- "minecraft:zombie 30"
condition:
- "left 3" # 剩 3 只就进下一波,不用追着最后几只跑
time 经过时间
别名:elapsed
简写:time 秒数
| 参数 | 必填 | 说明 |
|---|---|---|
第 1 个 / time(或 seconds) | 是 | 秒 数,也可以写 1m30s 这种格式 |
- 在怪物组的条件里:从这个怪物组开始到现在经过的秒数(不是这一波)。
- 在其他地方:从副本正式开始到现在经过的秒数。全员掉线暂停的时间不算。
守住祭坛:
objective: "&f守住祭坛 60 秒"
mobs:
- "minecraft:zombie 20"
condition:
- "time 60" # 撑过 60 秒就算过关,不管怪打完没
end:
- "killmobs"
速通奖励:
type: group-end
group: 前厅卫兵
script:
- "if !time 90 -> message &6开场 90 秒内就打完前厅,额外奖励一颗钻石!"
- "if !time 90 -> give DIAMOND 1"
var 副本变量
别名:variable
简写:var 名称 [比较 值]
| 写法 | 成立条件 |
|---|---|
var 钥匙 >= 3 | 变量 钥匙 大于等于 3(可以用 >= <= > < == !=) |
var 阶段 2 | 等于 2(没写比较符号 = ==) |
var 门已开 | 值是任何不是 0 的数字,或 true、yes(只写 {v:门已开} 也一样) |
比较的值可以用变量:var 碎片 >= {v:需要碎片}。
检查钥匙:
- if: "var 钥匙 >= 3"
then:
- "obstacle open 大门"
else:
- "message &c还差钥匙({v:钥匙}/3) @self"
和直接写运算式 {v:钥匙} >= 3 效果一样,选你看得顺眼的写法即可。
data-condition 副本变量(DungeonPlus)
DungeonPlus 写法:$data-condition{key=钥匙;type=value;value=>=3} @system
只有完整写法。
| 参数 | 必填 | 说明 |
|---|---|---|
key | 是 | 变量名称 |
type | 否 | value(默认,一般变量)/ list(清单) |
value | 是 | value 时:可以带比较符号,>=3、<10、!=0;不带 = 等于(value=1、value===1 都是等于 1)。list 时:东侧 = 清单里有「东侧」,!东侧 = 没有 |
开启王座:
- condition:
- "$data-condition{key=已启动祭坛;type=list;value=东侧} @system"
- "$data-condition{key=已启动祭坛;type=list;value=西侧} @system"
true:
- "obstacle open 王座大门"
false:
- "message &7还有祭坛没有启动。"
task 任务组在跑
别名:taskcontain(DungeonPlus)、task-running
简写:task 任务名
DungeonPlus 写法:$taskcontain{name=倒计时} @system
| 参数 | 必填 | 说明 |
|---|---|---|
第 1 个 / name | 是 | task.yml 里的任务名称 |
启动倒计时:
type: interact
point: 计时石碑
script:
- "if !task 倒计时 -> task start 倒计时"
group 怪物组状态
别名:monstergroup
简写:group 组名 [状态]
| 参数 | 必填 | 说明 |
|---|---|---|
第 1 个 / group(或 name) | 是 | 怪物组名称 |
第 2 个 / state | 否 | running 进行中(默认)/ done 已打完 / stopped 被 monstergroup stop 停掉 / idle 还没开始(或被 reset) |
王座宝箱:
point: 王座宝箱
condition:
- "group 霜烬守卫 done"
locked-message: "&c宝箱被寒冰封住了,先击败霜烬守卫。"
亡灵潮:
mobs:
- "minecraft:zombie 4"
end:
- "if group 亡灵领主 -> monstergroup 亡灵潮 3" # 王还在打就再来一批
也可以用变量写成运算式:{group:霜烬守卫:state} == done。
players 队伍人数
别名:team、team-condition(DungeonPlus)
简写:players 比较 数量
DungeonPlus 写法:$team-condition{team=true;min=2;max=4} @system
| 参数 | 必填 | 说明 |
|---|---|---|
| 简写第 1 个起 | 否 | 比较符号加数量,例如 >= 2、== 1。要写比较符号;不写 = >= 1 |
min / max | 否 | 人数要在 min 到 max 之间(简写写成 players min=2 max=4) |
team | 否 | 完整写法:true(默认)且 min 大于 1 时,一定要组队 |
message | 否 | 只在 before.yml 的开始条件里用:不符合时的提示,<size> = 目前人数 |
人数 = 还在副本里的队员(含倒下、掉线等待重连的人,不含已经离开的人)。
开场:
- "if players == 1 -> message &e单人挑战:额外获得 2 次复活机会。"
- "if players == 1 -> lives +2"
精英:
start:
- if: "players >= 3"
then:
- "mob FrostElite 王座 1 15 boss=true"
region 区域里有玩家
别名:area
简写:region 区域 [all|人数]
| 参数 | 必填 | 说明 |
|---|---|---|
第 1 个 / region(或 area、name) | 是 | 区域名称(编辑模式框的区域) |
第 2 个 / players(或 mode) | 否 | 不写 = 至少 1 人;数字 = 至少这么多人;all = 所有活着的人都在里面 |
只算活着的人,倒下旁观的人不算。
集合启动:
type: interact
point: 祭坛
script:
- if: "region 祭坛区 all"
then:
- "monstergroup 霜烬守卫"
else:
- "tell &c所有人都站到祭坛上才能启动。"
mob-in 区域里的怪物
别名:monster-in
简写:mob-in 区域 [怪物] [数量]
| 参数 | 必填 | 说明 |
|---|---|---|
第 1 个 / region(或 area) | 是 | 区域名称 |
第 2 个 / mob | 否 | 怪物 ID,或显示名称的一部分。不写或写 all = 任何副本怪物 |
第 3 个 / amount | 否 | 至少几只,默认 1 |
护送检查:
auto-start: true
loop: true
timeline:
1:
- "if mob-in 祭坛区 all 5 -> fail &c祭坛被怪物占领了"
引怪:
condition:
- "mob-in 陷阱坑 FrostGolem 1" # 把冰霜傀儡引进陷阱坑就过关
chance 机率
简写:chance 机率
| 参数 | 必填 | 说明 |
|---|---|---|
第 1 个 / chance(或 value) | 是 | 0~100 的百分比,30 和 30% 都可以 |
每次检查都重新抽一次。
宝箱怪:
type: interact
point: 可疑宝箱
once: true
script:
- "chance 30 -> mob Mimic 可疑宝箱 1 5"
permission 权限
别名:perm
简写:permission 权限
| 参数 | 必填 | 说明 |
|---|---|---|
第 1 个 / permission(或 name) | 是 | 权限节点 |
@self = 只看触发者;不写 = 副本里每个人都要有。
VIP宝箱:
type: interact
point: VIP宝箱
condition:
- "permission server.vip @self"
script:
- "give DIAMOND 2 @self"
item 背包物品
别名:has-item
简写:item 物品 [数量]
| 参数 | 必填 | 说明 |
|---|---|---|
第 1 个 / item(或 name) | 是 | 门票 ID、原版物品 ID,或物品名字里的一段文字(不看颜色)。比对方式同 take |
第 2 个 / amount | 否 | 至少几个,默认 1 |
只检查,不会拿走;要拿走用 take 动作。@self = 只看触发者;不写 = 每个人都要有。
交钥匙:
type: interact
point: 冰封大门
script:
- if: "item 霜之钥匙 @self"
then:
- "take 霜之钥匙 1 @self"
- "obstacle open 冰封大门"
else:
- "tell &c需要一把霜之钥匙。"
level 经验等级
简写:level 等级
| 参数 | 必填 | 说明 |
|---|---|---|
第 1 个 / level | 是 | 原版经验等级至少多少 |
@self = 只看触发者;不写 = 每个人都要符合。看 RPG 插件的等级请用运算式,例如 %mmocore_level% >= 20。
高阶传送门:
type: enter
region: 高阶传送门
condition:
- "level 30 @self"
script:
- "teleport 隐藏房间 @self"
js-condition 运算式(DungeonPlus)
别名:expr、check
DungeonPlus 用 JavaScript 判断;本插件用内建的运算式(语法见 下方),DungeonPlus 常见的写法都能直接用,不需要装 JS 引擎。
简写:expr 运算式
DungeonPlus 写法:$js-condition{text=%player_level%>=30;message=玩家 <player> 等级不足} @system
| 参数 | 必填 | 说明 |
|---|---|---|
第 1 个起的整段 / text(或 expr) | 是 | 运算式 |
message | 否 | 只在 before.yml 的开始条件里用:不符合时的提示,<player> = 不符合的人 |
对象:完整写法 @system = 对每个人各代入一次 %…%,每个人都要成立;其它情况对触发者代入。
职业之门:
type: interact
point: 职业之门
condition:
- "$js-condition{text='%mmocore_class%' == '剑士'} @self"
script:
- "obstacle open 剑士通道"
true / false
别名:always / never
一定成立 / 一定 不成立,暂时关掉某个条件或测试时用。
测试组:
condition:
- "false" # 测试时让这一波永远不结束
运算式
不是条件名称的行都会当成运算式:先把变量({…}、<…>、%…%)代入,再计算结果。
- "{v:钥匙} >= 3"
- "%player_level% >= 20 && {alive} > 1"
- "({v:甲} + {v:乙}) * 2 > 10 || '%mmocore_class%' == '剑士'"
- "{group:霜烬守卫:state} == done"
| 种类 | 写法 |
|---|---|
| 四则运算 | + - * / %(取余数);除以 0 得 0 |
| 比较 | >= <= > < == !=(=== 等于 ==) |
| 组合 | &&(而且)、||(或者)、!(不是),&& 比 || 先算 |
| 括号 | ( ) |
| 文字 | 加 单引号或双引号:'剑士'、"冰霜 骷髅";只有一个词时可以不加 |
| 真假 | true、false |
数字与文字的规则:
- 两边都是数字才比大小;
1,000会当成 1000。 - 只要有一边是文字,就只能用
==、!=比较(不分大小写);用><比文字一律不成立。 - 数字后面直接接文字(例如
3级)会整个当成文字。 - 中间有空格的文字要加引号,否则整行会被当成一段文字,结果是不成立。
- 运算式算不下去(例如拿文字做乘除)时算不成立。
PlaceholderAPI 变量:
- 有触发者时对触发者代入。
- 在没有触发者的地方(怪物组、任务组),含有
%…%的运算式会对副本里每个人各算一次,全部成立才算成立。 - 没装 PlaceholderAPI 或变量名称写错时,
%…%不会被代入,条件不成立。
一行条件与条件区块
完整说明见 脚本写法,这里只列格式。
一行:成立才执行箭头后面的一个动作。
- "if {v:钥匙} >= 3 -> obstacle open 大门"
- "if !task 倒计时 -> task start 倒计时"
- "if item 霜之钥匙 @self -> tell &b钥匙在你身上发光。"
- "chance 30 -> message &e幸运!你捡到了额外的碎片"
区块:要执行好几行,或不成立时也要做事。
- if: "{v:钥匙} >= 3" # 也可以写成清单,默认全部成立才算成立
then:
- "obstacle open 大门"
- "title &a大门开启了"
else:
- "message &c还差 {v:钥匙}/3 把钥匙 @self"
- if:
- "region 东侧祭坛 all"
- "region 西侧祭坛 all"
any: true # 任一成立就算成立
then:
- "monstergroup 守卫"
DungeonPlus 写法:condition / true / false。
- condition:
- "$data-condition{key=钥匙;type=value;value=>=3} @system"
true:
- "$obstacle{group=大门;operation=delete} @dungeon"
false:
- "$message{type=text;text=还差钥匙} @self"
| 键 | 别名 | 说明 |
|---|---|---|
if | condition、conditions | 一个条件或条件清单 |
then | true、do | 成立时执行 |
else | false | 不成立时执行(可省略) |
any | true = 任一成立就算成立 |
分支里也可以有 delay、script、另一个区块;分支跑完才继续执行区块后面的行。分支里的 stop 会结束整串。
入场条件(before.yml)
before.yml 的 condition 在队长开始挑战时、副本还没建立前检查,所以只能判断队伍和玩家。能用的写法:
| 写法 | 意思 |
|---|---|
players min=2 max=4 | 队伍人数在 2~4 人之间 |
players >= 2 | 队伍人数至少 2 人(比较符号同 players) |
level 30 | 每位队员的原版经验等级至少 30 |
permission vip.dungeon | 每位队员都要有这个权限 |
$team-condition{team=true;min=2;max=4;message=…} @system | 人数(DungeonPlus 写法) |
$js-condition{text=…;message=…} @system | 运算式(DungeonPlus 写法) |
| 其他任何一行 | 当成运算式:对每位队员各代入一次 PlaceholderAPI,每个人都要成立,例如 %mmocore_level% >= 20 |
- 前面加
!= 反过来,例如!permission dungeon.banned。 - 人数不符合时,提示语言文件的
start.condition-players({size}= 目前人数);条件自己写了message时改用它的。 kill、var、group这类副本里才有的条件在这里不能用,副本变量也还不存在。