Skip to content

怪物组.yml

怪物组.yml 用来定义副本里刷什么怪、在哪刷、刷多少,以及这波怪刷出后和打完后要发生什么。

如果把副本流程拆开看:

  • 阶段.yml 决定什么时候刷这一组怪
  • 怪物组.yml 决定这组怪本身的生成方式、变化方式和收尾处理

怪物组最常负责什么

  • 定义一波怪由哪些成员组成
  • 指定出生区域或刷新点
  • 配置数量、延迟、概率、散布
  • 给这波怪单独写生成脚本和全灭脚本
  • 标记哪只怪是 Boss

一份够用的示例

yaml
第一波:
  怪物组名称: '前厅第一波'
  出生区域: 战斗区
  生成脚本: |
    消息.全体("&c第一波怪物来袭")
  全灭脚本: |
    消息.全体("&a第一波已清除")
  成员列表:
    普通怪A:
      怪物ID: ZOMBIE
      数量: 3
      角色: 普通
    精英怪:
      怪物ID: SKELETON
      数量: 1
      角色: 精英

Boss组:
  怪物组名称: 'Boss 战'
  出生区域: Boss房
  生成脚本: |
    消息.全体("&6Boss 已出现")
  成员列表:
    Boss本体:
      怪物ID: ShadowBoss
      数量: 1
      角色: Boss

先看懂两层结构

第一层:怪物组本身

怪物组这一层,最常见的字段有:

  • 怪物组名称
  • 怪物组描述
  • 出生区域
  • 刷新点
  • 生成脚本
  • 全灭脚本
  • 生成玩家脚本
  • 全灭玩家脚本
  • 散布范围
  • 自动启动
  • 重复生成
  • 成员列表

源码当前也兼容旧写法 角色,但文档建议统一写 成员列表,后面更好读。

第二层:成员列表

成员这一层定义的是这组怪里每一种成员。

最常见字段有:

  • 怪物ID
  • 数量
  • 刷怪点
  • 延迟
  • 必出
  • 出现概率
  • 角色
  • 坐标
  • 散布范围
  • 属性
  • 升级

出生区域刷新点

怪物组级别有两种常见定位方式。

按区域出生

yaml
出生区域: 战斗区

这是最常见、也最稳的写法。

区域里如果有刷怪点,成员还能再按名字取具体点位。

直接写坐标出生

yaml
刷新点: '0,65,0'

这适合很固定的 Boss 出场或演出怪。

一般流程型副本还是推荐优先用 出生区域,后面改地图轻松很多。

成员列表 里最重要的字段

怪物ID

这里填实际要生成的怪物 ID。

如果你接的是 MythicMobs,就写 MythicMobs 的怪物名。

如果不用 MythicMobs,源码也会尝试按 Bukkit 实体类型去生成,比如 ZOMBIE

数量

数量 可以直接写固定值:

yaml
数量: 5

也可以写范围:

yaml
数量: 3-6

源码会在这个范围里随机取值。

刷怪点

成员级 刷怪点 填区域里定义的刷怪点名字,不直接填坐标。

例如 区域.yml

yaml
战斗区:
  刷怪点:
    左侧: '-4,65,3'
    右侧: '4,65,3'

成员里就可以写:

yaml
刷怪点: 左侧

延迟

成员可以延迟生成:

yaml
延迟: 40

这类写法适合做分批刷怪和演出登场。

角色

这个字段很重要。

它不只是备注。

按源码当前实现,某个成员被击杀后,如果它的 角色 名正好是 Boss,就会触发全局事件里的 Boss击杀

所以你要让:

  • 事件绑定 -> Boss击杀
  • Boss 专属播报
  • Boss 收尾逻辑

正常工作,就要把对应成员的 角色 写成:

yaml
角色: Boss

必出出现概率

如果你想做可选怪、随机精英怪,可以这么写:

yaml
必出: false
出现概率: 30

这类成员不是每次都会刷出来。

坐标

成员级别也能单独指定坐标:

yaml
坐标: '10,65,10'

这适合你想把某一只怪钉死在特定位置。

散布范围

怪物组本身能写散布范围,成员也能单独覆盖。

成员级写了以后,会优先用成员自己的值。

生成脚本和全灭脚本

怪物组自己的脚本,是这页最值得用的一块。

适合放在这里的

  • 这波怪刷出来时的播报
  • 这波怪打完后的开门、收尾、变量变化
  • 某一波怪独有的效果

更适合放到全局事件里的

  • 整场副本通用的击杀统计
  • 全局 Boss 播报
  • 不分怪物组的统一反应

一句话记住:

  • 只和这一组怪有关的,写在怪物组自己的脚本里
  • 整场副本都关心的,写去 main.yml -> 事件绑定

脚本执行顺序

按源码当前实现,怪物组生成时的顺序是:

  1. 执行这组怪自己的 生成脚本
  2. 执行这组怪自己的 生成玩家脚本
  3. 再触发 事件绑定 -> 怪物生成

怪物被击杀时:

  • 每死一只都会触发 事件绑定 -> 怪物死亡
  • 如果死的是 角色: Boss,还会触发 事件绑定 -> Boss击杀

整组全灭时:

  1. 执行这组怪自己的 全灭脚本
  2. 执行这组怪自己的 全灭玩家脚本

这里要注意:

  • 源码当前没有单独的全局事件叫“怪物组全灭”
  • 某一组怪打完后的专属收尾,应该直接写在这组怪的 全灭脚本

生成玩家脚本全灭玩家脚本

这两个脚本会对当前副本内在线玩家逐个执行。

适合写:

  • 给全队挂效果
  • 给全队发提示
  • 某波怪开始或结束时做统一清理

例如:

yaml
生成玩家脚本: |
  消息.发送("&c危险敌人已出现")

全灭玩家脚本: |
  效果.药水("slowness", 0, 0)

自动启动

yaml
自动启动: true

这表示副本正式进入运行状态后,这组怪会自动启动,不需要你再手动写 怪物组.生成(...)

这种写法适合开场第一波或固定必刷怪。

如果你的副本流程更复杂,还是推荐把刷怪明确写在阶段脚本里,读起来更清楚。

重复生成

源码当前支持重复生成配置:

yaml
重复生成:
  间隔: 200
  最大次数: 3
  需清除前波: true

这适合做连续刷怪和守点玩法。

最稳的用法还是先从固定波次做起,后面再加重复生成。

升级

成员还能按条件变种:

yaml
升级:
  - 条件: '副本.读取变量("困难模式") == true'
    怪物ID: EliteZombie
    数量: 2

这适合拿来做困难模式、词缀模式、活动版本切换。

配置建议

  • 小怪、精英、Boss 拆成不同怪物组,后面阶段控制最清楚。
  • 真正的 Boss 成员把 角色 明确写成 Boss
  • 第一版副本先做固定数量、固定波次,别一上来就上概率怪、升级、重复生成。
  • 怪物组自己的脚本只管这一波怪,不要把全局流程全塞进去。
  • 区域里的刷怪点先命好名,后面怪物组会省很多事。

常见问题

这组怪生成了,但 Boss击杀 没反应

先检查:

  • 被打死的成员 角色 有没有写成 Boss
  • 写的是不是 Boss 这个名字本身
  • 逻辑是不是本来该写在这组怪自己的 全灭脚本

怪物刷不出来

优先检查:

  • 怪物ID 是否正确
  • 出生区域刷新点 是否存在
  • 对应区域是否有合法刷怪空间
  • MythicMobs 怪物是否已经正常加载

这组怪打完了,但没开门

如果这是这组怪自己的专属收尾,优先检查这组怪的 全灭脚本

不要只盯着全局 怪物死亡 事件。

下一步阅读

TQ Minecraft Server Plugin Docs