怪物组.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 -> 事件绑定
脚本执行顺序
按源码当前实现,怪物组生成时的顺序是:
- 执行这组怪自己的
生成脚本 - 执行这组怪自己的
生成玩家脚本 - 再触发
事件绑定 -> 怪物生成
怪物被击杀时:
- 每死一只都会触发
事件绑定 -> 怪物死亡 - 如果死的是
角色: Boss,还会触发事件绑定 -> Boss击杀
整组全灭时:
- 执行这组怪自己的
全灭脚本 - 执行这组怪自己的
全灭玩家脚本
这里要注意:
- 源码当前没有单独的全局事件叫“怪物组全灭”
- 某一组怪打完后的专属收尾,应该直接写在这组怪的
全灭脚本
生成玩家脚本 与 全灭玩家脚本
这两个脚本会对当前副本内在线玩家逐个执行。
适合写:
- 给全队挂效果
- 给全队发提示
- 某波怪开始或结束时做统一清理
例如:
yaml
生成玩家脚本: |
消息.发送("&c危险敌人已出现")
全灭玩家脚本: |
效果.药水("slowness", 0, 0)自动启动
yaml
自动启动: true这表示副本正式进入运行状态后,这组怪会自动启动,不需要你再手动写 怪物组.生成(...)。
这种写法适合开场第一波或固定必刷怪。
如果你的副本流程更复杂,还是推荐把刷怪明确写在阶段脚本里,读起来更清楚。
重复生成
源码当前支持重复生成配置:
yaml
重复生成:
间隔: 200
最大次数: 3
需清除前波: true这适合做连续刷怪和守点玩法。
最稳的用法还是先从固定波次做起,后面再加重复生成。
升级
成员还能按条件变种:
yaml
升级:
- 条件: '副本.读取变量("困难模式") == true'
怪物ID: EliteZombie
数量: 2这适合拿来做困难模式、词缀模式、活动版本切换。
配置建议
- 小怪、精英、Boss 拆成不同怪物组,后面阶段控制最清楚。
- 真正的 Boss 成员把
角色明确写成Boss。 - 第一版副本先做固定数量、固定波次,别一上来就上概率怪、升级、重复生成。
- 怪物组自己的脚本只管这一波怪,不要把全局流程全塞进去。
- 区域里的刷怪点先命好名,后面怪物组会省很多事。
常见问题
这组怪生成了,但 Boss击杀 没反应
先检查:
- 被打死的成员
角色有没有写成Boss - 写的是不是
Boss这个名字本身 - 逻辑是不是本来该写在这组怪自己的
全灭脚本
怪物刷不出来
优先检查:
怪物ID是否正确出生区域或刷新点是否存在- 对应区域是否有合法刷怪空间
- MythicMobs 怪物是否已经正常加载
这组怪打完了,但没开门
如果这是这组怪自己的专属收尾,优先检查这组怪的 全灭脚本。
不要只盯着全局 怪物死亡 事件。