Skip to content

区域.yml

区域.yml 用来定义副本里的空间区域。

房间边界、战斗区范围、Boss 房、奖励区、进入某片区域后的专属处理,主要都在这里配置。

这页重点是把空间逻辑和流程逻辑分开。

  • 阶段.yml 负责流程推进
  • 区域.yml 负责空间边界和区域专属脚本

区域最常拿来做什么

  • 划分房间和战斗区
  • 控制区域状态
  • 给玩家传送到某个区域出生点
  • 在进入或离开某片区域时执行脚本
  • 给怪物组提供刷怪点

先看一个标准示例

yaml
战斗区:
  显示名称: '前厅战斗区'
  世界: 当前
  初始状态: 解锁
  范围:
    点1: '-10,60,-10'
    点2: '10,80,10'
  出生点: '0,65,0,0,0'
  进入脚本: |
    消息.发送("&e你进入了前厅")
  离开脚本: |
    消息.发送("&7你离开了前厅")
  刷怪点:
    中心: '0,65,0'
    左侧: '-4,65,3'
    右侧: '4,65,3'

Boss房:
  显示名称: 'Boss 房'
  世界: 当前
  初始状态: 锁定
  范围:
    点1: '20,60,-10'
    点2: '40,80,10'
  出生点: '30,65,0,180,0'

字段说明

显示名称

不写也能用,默认就是区域 ID。

建议正式副本还是写上,后面做提示和日志时更好认。

世界

默认值是 当前

大多数副本都直接写:

yaml
世界: 当前

源码也兼容 current

初始状态

当前支持四种状态:

  • 锁定
  • 解锁
  • 激活
  • 已清除

源码默认值是 锁定

最常见的开局写法只有两种:

  • 开场就能进的区域:解锁
  • 后面才开放的区域:锁定

范围

按源码当前实现,推荐写法是:

yaml
范围:
  点1: '-10,60,-10'
  点2: '10,80,10'

系统会自动按两点算出整个立方体区域。

坐标顺序不用纠结大小,源码会自己取最小值和最大值。

出生点

用于把玩家传送进这个区域。

写法:

yaml
出生点: '0,65,0,0,0'

前 3 个是坐标,后 2 个是朝向和俯仰。

如果你后面会用 区域.传送(...) 这类动作,最好都把出生点补上。

进入脚本离开脚本

这两个脚本属于区域自己的专属脚本。

最适合写:

  • 玩家进房提示
  • 区域专属机关
  • 进入某片区域时开演出、播语音、切状态
  • 离开区域时清理某个临时效果

和全局 事件绑定 -> 区域进入 的区别在于:

  • 区域自己的 进入脚本 / 离开脚本 拿得到更明确的区域切换上下文
  • 全局 事件绑定 更适合做整队广播、全局统计、公共反应

源码当前会额外放这两个变量:

  • from_zone
  • to_zone

所以区域脚本里可以直接按区域切换来写逻辑。

刷怪点

区域里可以提前定义一组命名刷怪点:

yaml
刷怪点:
  中心: '0,65,0'
  左侧: '-4,65,3'
  右侧: '4,65,3'

这类点位更适合给怪物组、演出、传送做复用,后面比手写坐标好维护得多。

连接

区域之间还能配置连接关系。

写法是列表:

yaml
连接:
  - 目标: Boss房
    条件: '副本.读取变量("Boss房已开放") == true'
    提示: '&cBoss 房尚未开放'

这更适合拿来做区域之间的通行门槛。

区域状态流转

区域状态最常见的流转是:

text
锁定 -> 解锁 -> 激活 -> 已清除

按源码当前实现:

  • 区域解锁 事件在 锁定 -> 解锁 时触发
  • 区域清除 事件在 激活 -> 已清除 时触发

所以区域状态最好按流程一步步推,不要随手乱跳。

什么时候写在区域里,什么时候写到事件绑定

优先这样分:

  • 只和这个区域本身有关的,写在 区域.yml
  • 会影响整队或整场副本的,写在 main.yml -> 事件绑定

适合写在区域里的:

  • 进入房间后给玩家单独提示
  • 离开某片危险区后清 Buff
  • 进入某片区域后触发局部剧情
  • 这个区域自己的出生点和刷怪点

适合放在全局事件里的:

  • 全队播报“已进入 Boss 区”
  • 记录全局进度
  • 统一播放音效、统一刷提示

推荐拆法

用区域管理空间,用阶段管理流程

推荐思路:

  • 区域.yml 只定义房间边界、状态、进入离开脚本、刷怪点
  • 阶段.yml 决定什么时候解锁、激活、清除这些区域

这样后面改流程时,不用反复改坐标;改地图时,也不会把阶段逻辑搅乱。

一个区域只表达一个明确用途

例如:

  • 前厅
  • 战斗区_第一波
  • Boss房
  • 奖励区

区域名越清楚,后面脚本越好读。

玩法示例

比如你要做“进入暴雪区后给玩家提示,离开后清提示”的处理,可以直接写在区域里:

yaml
暴雪区:
  显示名称: '暴雪区'
  世界: 当前
  初始状态: 解锁
  范围:
    点1: '-30,60,-30'
    点2: '30,90,30'
  出生点: '0,65,0,0,0'
  进入脚本: |
    消息.发送("&b你进入了暴雪区")
  离开脚本: |
    消息.发送("&7你离开了暴雪区")

如果你还要在这个区域解锁时给全队播报,再把公共提示写进 main.yml -> 事件绑定 -> 区域解锁

配置建议

  • 第一个版本先只画关键区域,不要一上来切得太碎。
  • 范围宁可略大一点,也不要把战斗空间切漏。
  • 每个需要传送的区域都补上 出生点
  • 刷怪点统一命名,后面怪物组和脚本会省很多事。
  • 区域专属逻辑尽量留在区域里,不要所有东西都绕去全局事件。

常见问题

区域相关脚本没反应

先检查:

  • 范围.点1范围.点2 是否写对
  • 世界 是否和实例世界一致
  • 玩家是否真的完成了跨区域移动
  • 这段脚本是不是应该写在区域里,而不是误写到全局事件里

区域解锁了,但玩家没感觉

区域状态变化本身未必自带可视效果。

通常还要配合这些内容一起写:

  • 门或障碍物变化
  • 全息提示
  • 消息播报
  • 怪物生成

传送到区域失败

最常见的问题是:

  • 区域没有写 出生点
  • 区域还是 锁定
  • 世界名写错

下一步阅读

TQ Minecraft Server Plugin Docs