跳到主要内容

怪物组 monster.yml

怪物组是副本的主线:叫出来 → 出怪 → 达成条件 → 执行 end。在 end 里叫下一组,就能把整个副本串成一关一关:

start.yml ─▶ 怪物组1 ─end─▶ 怪物组2 ─end─▶ Boss ─end─▶ clear(通关)
monster.yml
前厅卫兵:
name: "&c前厅卫兵"
objective: "&f击败前厅卫兵 &e{killed}/{total}"
mobs:
- "minecraft:zombie 3"
- "minecraft:skeleton 2"
end:
- "obstacle open 大门"
- "monstergroup 霜烬守卫"

霜烬守卫:
name: "&4霜烬守卫"
objective: "&f击败 &4霜烬守卫"
mobs:
- "minecraft:wither_skeleton 1 10 王座 boss"
- "minecraft:stray 2 5 王座"
end:
- "delay 2"
- "clear"

一个怪物组的流程​

  1. 叫出来:任何脚本执行 monstergroup 组名;或这一组设了 auto-start: true,在副本正式开始时自动叫出。
  2. 组开始:计分板目标换成这组的 objective、播放 group-start 音效、group-start 触发组触发; 有分波(waves)时先执行组的 start。
  3. 第 1 波开始:执行这一波的 start(里面的 delay 都会等)→ 依序生成 mobs 里的怪 → 执行 monster(DungeonPlus 的 $mob 行)。
  4. 检查条件:每次有怪死掉、每只怪生成完成、以及每秒,检查这一波的 condition。 没写条件 = 这一波的怪全部生成完而且全部死掉。
  5. 这一波达成:执行这一波的 end,跑完后进入下一波,回到第 3 步。
  6. 最后一波达成:
    • 先把整组标记为打完({group:组名:state} 变成 done)、播放 group-end 音效、清掉这组设的计分板目标、group-end 触发组触发;
    • 再执行最后一波的 end,接着执行组的 end。

因为第 6 步「先标记打完、再跑 end」,组的 end 里写 clear、或用条件判断这组是否打完,都不会出问题。

条件达成时还活着的怪

条件(例如 kill 骷髅王 1)达成时,还活着的小怪不会被自动清掉。需要的话在 end 里加 killmobs 怪物ID, 或用 monstergroup kill 组名 连怪带组一起停掉。通关 / 失败时副本里所有怪都会被清掉。

串起来​

在一组的 end 里叫下一组,最后一组的 end 写 clear:

monster.yml
怪物组1:
mobs: ["minecraft:zombie 6"]
end:
- "title &a第一关完成"
- "delay 3"
- "monstergroup 怪物组2"

怪物组2:
mobs: ["minecraft:skeleton 6"]
end:
- "obstacle open Boss门"
- "trigger enable 进入王座厅" # 走进王座厅才叫出 Boss(见触发组)

Boss:
mobs: ["SkeletonKing 1 20 王座 boss"]
end:
- "clear"

end 里能做的不只是叫下一组:开门(obstacle open)、打开触发组(trigger enable)、开始任务(task start)、 设存档点(checkpoint)、执行脚本组(script)……都可以。

叫出怪物组​

写法意思
monstergroup 怪物组1叫出 怪物组1
monstergroup=怪物组1同上
monstergroup 甲 乙 / monstergroup 甲,乙同时叫出两组
monstergroup 怪物组2 55 秒后叫出(最后一个是数字 = 延迟秒数,不会卡住后面的行)
monstergroup stop 怪物组1停止这组(怪留着)
monstergroup kill 怪物组1停止这组并清掉它的怪
monstergroup reset 怪物组1忘掉这组的进度,之后可以重新叫出(怪留着)
remove-monstergroup all忘掉所有怪物组的进度(DungeonPlus 的写法)
$monstergroup{group=怪物组1;repeat=false;delay=3} @dungeonDungeonPlus 写法
  • 正在进行中的组再叫一次会被略过(不会重复出怪)。
  • 已经打完的组:组的 repeat 为 true(默认)时可以再叫一次,从第 1 波重新开始; repeat: false(或动作带 repeat=false)时整场只会跑一次。
  • 怪物组名称不分大小写。动作的完整参数见 动作:怪物。

auto-start​

auto-start: true 的组在副本正式开始(倒数结束)时自动叫出,和 start.yml 同一刻。 一般只有「第一组」或「整场都在的背景怪」才用;其他组都用 monstergroup 在前一组的 end 里叫。

自己叫自己:无限刷怪​

因为组在 end 执行前已经标记为打完,end 里叫自己就会从头再来一次:

小怪潮:
auto-start: true
mobs: ["minecraft:zombie 4"]
end:
- "var add 波数 1"
- "if {v:波数} >= 10 -> clear"
- "monstergroup 小怪潮 3" # 3 秒后再来一波

一组分好几波​

用 waves 列出每一波,每一波都有自己的 mobs、condition、start、end;全部打完才执行组的 end。

monster.yml
前厅卫兵:
name: "&c前厅卫兵"
objective: "&f击败前厅卫兵 &e{killed}/{total} &7(第 {wave}/{waves} 波)"
start: # 组开始时(第 1 波之前)执行一次
- "title &c敌袭!"
waves:
- mobs:
- "minecraft:zombie 3"
- "minecraft:skeleton 2"
- mobs:
- "minecraft:stray 4"
start: # 这一波出怪前执行
- "title &c第二波||&7冰霜流浪者出现了"
- "sound ENTITY_STRAY_AMBIENT 1 0.8"
- "delay 2" # 等 2 秒才出怪
end: # 这一波打完执行
- "message &a第二波清空了"
end: # 整组打完执行
- "obstacle open 大门"
- "checkpoint 前厅存档"
- "trigger enable 启动祭坛"
写法start 是end 是
没有 waves(只有一波)出怪前执行(这一波的开场)整组打完执行
有 waves组的 start:第 1 波之前执行一次组的 end:最后一波打完、最后一波的 end 跑完后执行

设置项​

组​

设置项类型默认说明
name文字组名显示名称(计分板、{group_name}、组时限的失败原因)
auto-start是 / 否false副本正式开始时自动叫出;false = 用 monstergroup 组名 叫
point点位名称组名这组默认的出怪点(别名 spawn)。没写 = 和组名同名的点位
objective文字空组开始时把计分板目标换成这段文字,见 计分板目标
mobs清单只有一波时直接写在组底下,见 怪物行
monster脚本DungeonPlus 的 $mob 行,生成的怪也算这一组(可以和 mobs 同时用)
condition条件清单全部击杀打完条件(别名 conditions),见 打完条件
start脚本空见上方表格
end脚本空见上方表格
waves清单分波,每一项是一波
repeat是 / 否true打完后能不能再被叫出(DungeonPlus 的 repeat)
interval秒数0同一行怪一只一只生成的间隔(DungeonPlus 的 scattered);0 = 同时生成
glowing是 / 否false这组的怪全部发光(隔墙看得到);只要某几只发光,在那一行怪物后面加 glow
time-limit时间0这组要在几秒内打完,0 = 不限,见 组时限
timeout脚本空组时限到了执行;没写 = 副本直接失败

每一波(waves 的每一项)​

设置项说明
mobs这一波的怪物行
monsterDungeonPlus 的 $mob 行
condition这一波的打完条件(没写 = 这一波全部击杀)
start这一波出怪前执行
end这一波打完执行

point、interval、glowing、objective、time-limit 是整组共用的,写在组底下。

怪物行写法​

mobs 的每一行是一种怪:

怪物 [数量] [等级] [出怪点] [boss] [glow]
部分说明
怪物MythicMobs 的怪物 ID(例如 SkeletonKing);原版怪写 minecraft:名称(例如 minecraft:zombie)
数量几只,默认 1
等级MythicMobs 等级,默认 1(原版怪没有等级)
出怪点点位名称或坐标 x,y,z;没写 = 组的 point
boss标记为 Boss:王条显示它的血量
glow只让这一行的怪发光(隔墙看得到)

数量和等级要照顺序写;出怪点、boss、glow 放在后面,顺序不限。也可以用 名称=值 补上其他设置:

写法说明
at=王座出怪点(别名 point=、location=)
level=10等级(别名 lv=)
amount=3数量
spread=3在出怪点附近 ±3 格随机散开
chance=50这一行有 50% 的概率出现(整行一起,不是每只各自)
boss=true同 boss
glow=true同 glow
mobs:
- "minecraft:zombie 5" # 5 只僵尸,出在组的出怪点
- "SkeletonKing 1 10 王座 boss" # 1 只 10 级骷髅王,出在「王座」,王条显示它
- "FrostMage 2 5 at=左翼 spread=2" # 2 只 5 级冰法师,出在「左翼」附近散开
- "minecraft:stray 3 chance=30" # 30% 概率多来 3 只流浪者
- "minecraft:husk 2 12,65,30" # 写坐标(X/Z 相对副本格子原点)
- "minecraft:zombie 2 王座 glow" # 只有这 2 只僵尸发光

也可以写成对照表:

mobs:
- { mob: SkeletonKing, amount: 1, level: 10, at: 王座, boss: true, glow: true }
- { mob: "minecraft:zombie", amount: 4, spread: 3, chance: 80 }
出怪点名称不要是纯数字

第三个位置如果是数字会被当成等级。点位请取有文字的名称(例如 出怪点1,不要叫 1)。

出怪点​

出怪点在 编辑模式 里设:拿铲子点方块、输入名称,那里就是一个怪物点(points.yml 里 type: mob)。

  • 同一个名称可以点很多个:怪会平均分配到这些点(第 1 只在第 1 个点、第 2 只在第 2 个点……轮流)。 例如示例里「前厅卫兵」有左右两个点,5 只怪会分成 3 + 2。
  • 组的出怪点默认就是和组名同名的点位,所以最省事的做法是:怪物组叫「前厅卫兵」,铲子点的点也叫「前厅卫兵」。
  • 某一行要出在别的地方,就在那一行后面写点位名称(SkeletonKing 1 10 王座)。
  • 找不到出怪点、或怪物 ID 写错时,那一行的怪不会生成,控制台会警告。没写 condition 时如果整波一只都没生成,这一波会直接算打完(避免卡关), 所以测试时看到「一进去就跳到下一关」,先检查控制台的警告。

点位的完整说明见 点位。

打完条件 condition​

condition 是一个条件清单,全部成立这一波才算打完。没写 = 这一波的怪全部击杀。

骷髅王厅:
mobs:
- "minecraft:skeleton 6"
- "SkeletonKing 1 20 王座 boss"
condition:
- "kill SkeletonKing 1" # 只要打倒骷髅王就算过,小骷髅不用清完
end:
- "killmobs minecraft:skeleton" # 顺便清掉剩下的小骷髅
- "clear"

常用的条件:

条件意思
kill 怪物 数量这一波开始后,这种怪死了几只(怪物 ID 或显示名称都可以)
kill-any 甲,乙 数量几种怪加起来
kill-all这一波的怪全部击杀(没写条件时的默认)
left 数量这一波剩下的怪 ≤ 数量(例如 left 2 = 剩 2 只以下就算过)
time 秒数这一组开始后经过几秒(撑过 60 秒:time 60)
var 名称 >= 3、{v:钥匙} >= 3副本变量
region 祭坛区 all全部活着的人都站在区域里
$kill{mobname=骷髅王;amount=1} @systemDungeonPlus 写法

全部条件见 条件。

kill 怎么算
  • kill 只算这一波开始之后死掉的怪,每一波、每次重新叫出都会重新计算(所以「自己叫自己」的刷怪组每一轮都重新数)。
  • 副本里任何一只符合的怪死掉都会算进所有进行中的组(DungeonPlus 也是这样算),不限于这一组生成的怪,也不限于玩家亲手打死的。
  • {killed} 变量则只算这一组自己生成的怪。

计分板目标 objective​

组开始时把计分板(与王条)的「目标」换成这段文字,组打完时自动清掉。可以用这些变量,会即时更新:

变量内容
{killed}这一波已经击杀几只(这组自己的怪)
{total}这一波一共几只(chance 没中、没生成的那几行不算)
{alive_mobs}这一波还活着几只
{wave}第几波
{waves}一共几波
{group_name}这组的 name
{group}这组的 ID(monster.yml 里的组名)
objective: "&f击败前厅卫兵 &e{killed}/{total} &7(第 {wave}/{waves} 波)"

目标属于某个怪物组时,王条的进度条就是这组的击杀进度。之后用 objective 文字 动作改写目标,也会取代这里的设置。 其他地方要读某一组的进度,用 {group:组名:killed}、{group:组名:total}、{group:组名:state},见 变量。

Boss 与王条​

怪物行加上 boss,这只怪活着的时候王条会显示它的名字与血量(红色);有好几只 Boss 时显示第一只还活着的。 Boss 死掉后王条回到显示目标与进度。王条的开关与颜色在 config.yml 的 bossbar 设置。

mobs:
- "SkeletonKing 1 20 王座 boss"

Boss 血量降到一定比例时触发机制(狂暴、召唤小怪),用触发组的 mob-health。

interval 与 glowing​

虫群:
interval: 0.5 # 每只间隔 0.5 秒生成
glowing: true # 全部发光,隔墙看得到
mobs:
- "minecraft:silverfish 10"
- "minecraft:endermite 4"

interval 是每一行各自一只一只出:上面会同时开始出蠹虫与末影螨,蠹虫 5 秒出完、末影螨 2 秒出完。 这一波要等全部生成完、而且全部死掉才算打完(默认条件)。

组时限 time-limit 与 timeout​

time-limit 让这一组要在时间内打完,从组开始算起(全队掉线暂停时也会暂停):

  • 没写 timeout:时间到副本直接失败,原因是「「组名」没有在时限内打完」。
  • 写了 timeout:时间到执行 timeout,组继续进行(每次叫出只会执行一次)。
守护水晶:
name: "&b守护水晶"
objective: "&f守住水晶 60 秒"
time-limit: 90
condition:
- "time 60" # 撑过 60 秒就算过
mobs:
- "minecraft:zombie 8"
timeout: # 90 秒还没过(理论上不会)就改成失败
- "fail &c水晶被摧毁了"
end:
- "killmobs minecraft:zombie"
- "monstergroup 下一关"

难度与人数​

每只怪生成时会套用:

  • config.yml 的 scaling:每多一位玩家加等级、乘血量、乘攻击;
  • 难度模式(modes)的 level、health、damage。

不必为不同人数、不同难度各写一套怪物组。详见 副本设置。

DungeonPlus 的写法​

DungeonPlus 的 monster.yml 可以原样放进来,最外层的 groups: 有没有都可以:

monster.yml
groups:
default:
- monster:
- "$mob{name=SkeletonKing;location=10,65,20;amount=3;level=5}"
condition:
- "$kill{mobname=骷髅王;amount=3} @system"
start:
- "$message{type=title;text=&c骷髅王来了} @dungeon"
end:
- "$monstergroup{group=default2} @dungeon"
auto-start: false
  • 清单里的每一项是一波:每一项的 start 在那一波出怪前执行、end 在那一波打完时执行;最后一项的 end 执行前整组已经标记为打完。
  • 任何一项写了 auto-start: true,整组就会自动开始。
  • 这种写法的组 repeat 都是 true,显示名称与出怪点都是组名。
  • monster 里的 $mob 生成的怪都算这一组:{killed}、默认的「全部击杀」条件都照常运作。
  • $kill 用怪物显示名称比对,DungeonPlus 的 骷髅王:[HP] 这种「冒号后面是血量」的名称会自动只取冒号前面。
  • $mob 的 location 坐标是相对副本格子的(与 points.yml 相同),从 DungeonPlus 搬过来的绝对坐标要换算,或改用点位名称。