Skip to content

障碍物.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 88120,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 写小了会让场景抖得很厉害。

下一步阅读

TQ Minecraft Server Plugin Docs