跳到主要内容

条件判断

条件是「成立 / 不成立」的判断,用在这些地方:

位置作用
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-allall-dead、clear-wave这一波的怪全部打完
leftalive-mobs这一波剩下几只
timeelapsed经过几秒
varvariable副本变量
data-condition副本变量(DungeonPlus 写法)
tasktaskcontain、task-running任务组是否在跑
groupmonstergroup怪物组的状态
playersteam、team-condition队伍人数
regionarea区域里有没有玩家
mob-inmonster-in区域里的怪物数量
chance机率
permissionperm权限
itemhas-item背包里的物品
level原版经验等级
js-conditionexpr、check运算式(DungeonPlus 写法)
true / falsealways / 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 移除的不算。
monster.yml
霜烬守卫:
mobs:
- "FrostWarden 1 10 王座 boss"
- "minecraft:stray 6 1 王座"
condition:
- "kill FrostWarden 1" # 打倒王就过关,小怪不用清完
end:
- "killmobs"
- "clear"
script.yml
检查进度:
- "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
monster.yml
亡灵大军:
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

没有参数。只能用在怪物组的条件里,在其他地方一律不成立。

monster.yml
前厅卫兵:
mobs:
- "minecraft:zombie 5"
condition:
- "kill-all"
- "time 30" # 至少打 30 秒,太快清完也要等

left 剩下几只​

别名:alive-mobs

这一波的怪都出完之后,场上剩下的数量小于等于这个数。

简写:left 数量

参数必填说明
第 1 个 / amount否剩几只以下就成立,默认 0

只能用在怪物组的条件里。

monster.yml
尸潮:
mobs:
- "minecraft:zombie 30"
condition:
- "left 3" # 剩 3 只就进下一波,不用追着最后几只跑

time 经过时间​

别名:elapsed

简写:time 秒数

参数必填说明
第 1 个 / time(或 seconds)是秒数,也可以写 1m30s 这种格式
  • 在怪物组的条件里:从这个怪物组开始到现在经过的秒数(不是这一波)。
  • 在其他地方:从副本正式开始到现在经过的秒数。全员掉线暂停的时间不算。
monster.yml
守住祭坛:
objective: "&f守住祭坛 60 秒"
mobs:
- "minecraft:zombie 20"
condition:
- "time 60" # 撑过 60 秒就算过关,不管怪打完没
end:
- "killmobs"
trigger.yml
速通奖励:
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:需要碎片}。

script.yml
检查钥匙:
- 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 时:东侧 = 清单里有「东侧」,!东侧 = 没有
script.yml
开启王座:
- 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 里的任务名称
trigger.yml
启动倒计时:
type: interact
point: 计时石碑
script:
- "if !task 倒计时 -> task start 倒计时"

group 怪物组状态​

别名:monstergroup

简写:group 组名 [状态]

参数必填说明
第 1 个 / group(或 name)是怪物组名称
第 2 个 / state否running 进行中(默认)/ done 已打完 / stopped 被 monstergroup stop 停掉 / idle 还没开始(或被 reset)
loot.yml
王座宝箱:
point: 王座宝箱
condition:
- "group 霜烬守卫 done"
locked-message: "&c宝箱被寒冰封住了,先击败霜烬守卫。"
monster.yml
亡灵潮:
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> = 目前人数

人数 = 还在副本里的队员(含倒下、掉线等待重连的人,不含已经离开的人)。

script.yml
开场:
- "if players == 1 -> message &e单人挑战:额外获得 2 次复活机会。"
- "if players == 1 -> lives +2"
monster.yml
精英:
start:
- if: "players >= 3"
then:
- "mob FrostElite 王座 1 15 boss=true"

region 区域里有玩家​

别名:area

简写:region 区域 [all|人数]

参数必填说明
第 1 个 / region(或 area、name)是区域名称(编辑模式框的区域)
第 2 个 / players(或 mode)否不写 = 至少 1 人;数字 = 至少这么多人;all = 所有活着的人都在里面

只算活着的人,倒下旁观的人不算。

trigger.yml
集合启动:
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
task.yml
护送检查:
auto-start: true
loop: true
timeline:
1:
- "if mob-in 祭坛区 all 5 -> fail &c祭坛被怪物占领了"
monster.yml
引怪:
condition:
- "mob-in 陷阱坑 FrostGolem 1" # 把冰霜傀儡引进陷阱坑就过关

chance 机率​

简写:chance 机率

参数必填说明
第 1 个 / chance(或 value)是0~100 的百分比,30 和 30% 都可以

每次检查都重新抽一次。

trigger.yml
宝箱怪:
type: interact
point: 可疑宝箱
once: true
script:
- "chance 30 -> mob Mimic 可疑宝箱 1 5"

permission 权限​

别名:perm

简写:permission 权限

参数必填说明
第 1 个 / permission(或 name)是权限节点

@self = 只看触发者;不写 = 副本里每个人都要有。

trigger.yml
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 = 只看触发者;不写 = 每个人都要有。

trigger.yml
交钥匙:
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。

trigger.yml
高阶传送门:
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 = 对每个人各代入一次 %…%,每个人都要成立;其它情况对触发者代入。

trigger.yml
职业之门:
type: interact
point: 职业之门
condition:
- "$js-condition{text='%mmocore_class%' == '剑士'} @self"
script:
- "obstacle open 剑士通道"

true / false​

别名:always / never

一定成立 / 一定不成立,暂时关掉某个条件或测试时用。

monster.yml
测试组:
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"
键别名说明
ifcondition、conditions一个条件或条件清单
thentrue、do成立时执行
elsefalse不成立时执行(可省略)
anytrue = 任一成立就算成立

分支里也可以有 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 这类副本里才有的条件在这里不能用,副本变量也还不存在。

大部分门槛建议写在 config.yml 的 requirements,见 副本设置 和 开场与开始前。