障碍物.yml
障碍物.yml 负责副本里的动态结构切换。
门、墙、封锁、升降桥、火焰陷阱、战斗屏障,这类“本质上是一批方块在两种状态之间切换”的内容,适合放在这里。
它和别的文件分工很清楚:
阶段.yml决定什么时候开、什么时候关交互.yml决定玩家碰了什么机关才开障碍物.yml负责这些结构本身长什么样、切换后会变成什么样
适合放什么
- 入口门、Boss 门、结算门
- 战斗中封路的墙
- 清怪后撤掉的屏障
- 会按节奏开关的机关
- 需要脚本联动的陷阱块组
基本结构
顶层是“组”。
一组下面可以放多个障碍物,脚本里既可以整组控制,也可以点名控制其中一个子项。
yaml
Boss门组:
自动激活: false
障碍物:
左门:
显示名称: 'Boss 左门'
锚点: '120 65 88'
默认状态: 关闭
激活脚本: |
消息.全体("&cBoss 房门已封锁")
方块:
- x: 0
y: 0
z: 0
材料: AIR
激活材料: STONE
- x: 0
y: 1
z: 0
材料: AIR
激活材料: STONE
右门:
显示名称: 'Boss 右门'
锚点: '123 65 88'
默认状态: 关闭
方块:
- x: 0
y: 0
z: 0
材料: AIR
激活材料: STONE
- x: 0
y: 1
z: 0
材料: AIR
激活材料: STONE组级字段
| 字段 | 说明 |
|---|---|
自动激活 | 副本实例创建后,这一组是否立刻执行一次“激活” |
障碍物 | 这一组里实际的障碍物列表 |
单个障碍物字段
| 字段 | 说明 |
|---|---|
显示名称 | 展示名,不写就用障碍物 ID |
类型 | 仅作分类记录,默认是 自定义 |
锚点 | 基准坐标 |
默认状态 | 初始状态。源码里只有写成 激活 或 active 才算激活,其他写法都会按关闭处理 |
自动切换 | 自动开关间隔,单位是 tick |
激活脚本 | 激活时执行一次 |
关闭脚本 | 关闭时执行一次 |
激活玩家脚本 | 激活时对当前副本内在线玩家逐个执行 |
关闭玩家脚本 | 关闭时对当前副本内在线玩家逐个执行 |
方块 | 这个障碍物包含的方块列表 |
方块 列表字段
| 字段 | 说明 |
|---|---|
x y z | 相对锚点的偏移坐标 |
材料 | 关闭状态使用的方块材质 |
激活材料 | 激活状态使用的方块材质 |
数据值 | 关闭状态的数据值,老版本材质朝向这类用得上 |
激活数据值 | 激活状态的数据值 |
锚点 写法
源码当前支持两种写法:
- 直接写坐标,比如
120 65 88或120,65,88 - 写成
区域.yml里已经定义过的刷怪点名
第二种写法很适合大型副本。地图改坐标时,你只改区域里的命名点,障碍物本身不用跟着全部重写。
激活和关闭时到底会发生什么
障碍物的状态只有两种:
- 激活:使用
激活材料和激活数据值 - 关闭:使用
材料和数据值
常见理解方式可以这样记:
- 想把门“堵上”,就把堵门方块写在
激活材料 - 想把门“打开”,就把
材料写成AIR
自动激活 和 默认状态 的区别
这两个字段看起来像一回事,实际不是。
自动激活: true 的组,在副本启动时会真的执行一次激活动作:
- 改方块
- 跑
激活脚本 - 跑
激活玩家脚本
默认状态: 激活 只是让它初始显示为激活状态。
如果这组没有开 自动激活,源码只会把方块放成激活后的样子,不会额外补跑激活脚本。
正式服常见用法:
- 只想让门一开始就是关着,用
默认状态: 激活 - 想让副本开场时顺带播报、上特效、挂玩家状态,用
自动激活: true
自动切换 的用法
自动切换 是按 tick 计数的。
例如:
yaml
自动切换: 40表示每 40 tick 切换一次状态,差不多每 2 秒开关一次。
这类配置适合:
- 节奏门
- 周期火焰陷阱
- 来回升降的平台
脚本执行范围
源码当前行为是:
激活脚本、关闭脚本只执行一次,属于副本级公共脚本激活玩家脚本、关闭玩家脚本会对当前副本里在线玩家逐个执行
如果你在玩家脚本里加药水、标题、个人提示,这些内容会发给当前在线成员,不会只给某一个触发者。
常见脚本控制方式
脚本里可以按组控制,也可以控制单个子项。
text
障碍物.激活("Boss门组")
障碍物.关闭("Boss门组")
障碍物.切换("Boss门组")
障碍物.重置("Boss门组")
障碍物.激活("Boss门组", "左门")
障碍物.关闭("Boss门组", "右门")组控适合大门、战斗封锁。
单项控制适合双开门、机关阵列、左右分路。
一份更完整的示例
yaml
战斗封锁:
自动激活: true
障碍物:
入口墙:
显示名称: '战斗区封锁'
锚点: '战斗区门口'
默认状态: 关闭
激活脚本: |
消息.全体("&c战斗开始,退路已封锁")
关闭脚本: |
消息.全体("&a区域已清空,封锁解除")
激活玩家脚本: |
音效.播放("BLOCK_ANVIL_PLACE", 1, 1)
方块:
- x: 0
y: 0
z: 0
材料: AIR
激活材料: STONE
- x: 0
y: 1
z: 0
材料: AIR
激活材料: STONE
- x: 1
y: 0
z: 0
材料: AIR
激活材料: STONE
- x: 1
y: 1
z: 0
材料: AIR
激活材料: STONE配置建议
- 一组只放一套逻辑上应该一起开关的结构,不要把整张图所有门都塞进一组。
锚点尽量统一走命名点,后面改图省事很多。- 大门、墙、屏障优先整组控制,维护成本最低。
- 会影响玩家状态的逻辑放进玩家脚本,纯地图变化放进普通脚本。
自动切换用之前先测一遍频率,tick 写小了会让场景抖得很厉害。