跳转到内容

障碍物配置 obstacles.yml

obstacles.yml 定义了地牢中的障碍物组。障碍物是在指定位置放置/移除方块的机制,常用于创建门、牢笼、机关等。

顶层段使用 障碍物(或英文 obstacles),其下每个键是一个障碍物组的名称。

obstacles:
出生点屏障:
# 方块列表,格式: "x,y,z,方块类型"
blocks:
- "-2,64,5,BARRIER"
- "-1,64,5,BARRIER"
- "0,64,5,BARRIER"
auto_create: true # 是否在副本开始时自动创建
trigger_mode: "进入触发" # 触发模式
trigger_cooldown: 2 # 触发冷却时间(秒)
trigger_once: false # 是否只能触发一次
on_create: |- # 创建时执行的脚本
action.message('@all', '&c能量屏障已激活!')
action.sound('@all', 'BLOCK_BEACON_ACTIVATE', 1.0, 1.2)
on_delete: |- # 删除时执行的脚本
action.message('@all', '&a屏障已解除,前方通路打开!')
action.sound('@all', 'ENTITY_GENERIC_EXPLODE', 1.0, 1.0)
trigger_script: |- # 触发时执行的脚本
action.damage('@trigger', 3.0)
action.message('@trigger', '&c你触碰到了能量屏障!')
Boss房大门:
blocks:
- "20,64,0,IRON_BARS"
- "20,65,0,IRON_BARS"
- "21,64,0,IRON_BARS"
on_create: |-
action.sound('@all', 'BLOCK_IRON_DOOR_CLOSE', 1.0, 0.8)
on_delete: |-
action.sound('@all', 'BLOCK_IRON_DOOR_OPEN', 1.0, 0.8)
auto_create: false # 不自动创建,由脚本控制
trigger_mode: "无触发"
trigger_script: []
trigger_cooldown: 0
trigger_once: false

blocks 列表的每个元素是 x,y,z,方块类型 四段,前三段为坐标、第四段为方块材质名(Bukkit Material)。

blocks:
- "10,64,10,IRON_BARS"
- "-10,63,-10,LAVA"
- "30,64,0,BARRIER"

触发模式的取值同时支持中文与英文写法,未识别的值按「无触发」处理。

配置值等价英文说明
无触发(默认)不触发,仅作为方块屏障
进入触发enter玩家进入障碍物区域时触发
离开触发leave玩家离开障碍物区域时触发
持续触发continuous玩家在区域内时持续触发
字段(中文 / 英文)类型默认值说明
方块 / blocksList必填方块列表,格式 x,y,z,方块类型
自动创建 / auto_createBooleanfalse副本开始时是否自动创建
触发模式 / trigger_modeString无触发触发模式
触发冷却 / trigger_cooldownInt0触发冷却(秒)
仅触发一次 / trigger_onceBooleanfalse是否只触发一次
创建时 / on_createList / 多行字符串空创建障碍物时执行的脚本
删除时 / on_deleteList / 多行字符串空删除障碍物时执行的脚本
触发脚本 / trigger_scriptList / 多行字符串空玩家接触障碍物时执行的脚本

以下全部可选,老配置逐字不变。先统一术语:关闭 = 方块存在、路堵着(action.create_obstacle);开启 = 方块不存在、路通了(action.remove_obstacle)。

obstacles:
Boss房大门:
anchor: "Boss房.门口" # 区域点位或 x,y,z;写了之后 blocks 视为相对锚点
blocks:
- "0,0,0,IRON_BARS"
- "0,1,0,IRON_BARS"
- "1,0,0,IRON_BARS"
- "1,1,0,IRON_BARS"
open_material: AIR # 开启时变成什么;不写 = 恢复原方块(旧行为)
default_state: closed # 副本开始就铺好,不跑 on_create;不写 = 沿用 auto_create
on_create: "..."
on_delete: "..."
节奏门:
anchor: "机关房.门"
blocks: ["0,0,0,STONE", "0,1,0,STONE"]
auto_toggle: 40 # 每 40 tick 开关一次,最小 20,写小了夹紧
default_state: closed
键(中/英)默认说明
anchor / 锚点无区域.点位 或 x,y,z;引用的点位不存在时加载期 warn
open_material / 开启材质恢复原方块开启状态的材质
default_state / 默认状态开启closed / 关闭 = 方块存在
auto_toggle / 自动切换0tick,0 = 不启用

写方块全部分帧:每 tick 最多 256 个方块、关闭物理更新(沙子不掉、水不流)、每实例同时最多两批。所以 create_obstacle / remove_obstacle 是异步的:紧跟其后的脚本语句可能在铺完前执行,on_create / on_delete 会在铺完后才跑;需要严格时序就把后续逻辑写进这两个脚本里。dungeon.isObstacleClosed('X') 铺设期间返回目标状态。单组方块上限 4096。

auto_toggle 挂在障碍物触发检测的既有任务上分频,不单独起定时器。

脚本说明
action.create_obstacle('X')关闭(堵路),已关闭时不重复跑脚本
action.remove_obstacle('X')开启(通路)
action.toggle_obstacle('X')切换
dungeon.isObstacleClosed('X')是否关闭态

编辑器:障碍物列表 Shift+左键 进设置。锚点可用当前站位或从区域点位里选,设了之后已有绝对坐标自动换算成相对坐标,清除锚点再换算回去。