点位 points.yml
每个副本的 dungeons/<副本>/points.yml 记录地图范围和所有点位(出生点、出怪点、区域、门……)。
这个文件由编辑模式自动产生,平常用工具点就好;也可以手改。
要改名、移动、删除点位,在编辑模式里右键点位上方的标签就能打开这个点位的编辑菜单,见 右键编辑点位。
坐标规则
所有副本都在同一个副本世界里,按格子(默认每格间隔 1024)分开进行,同一张地图每场可能贴在不同的格子 。所以点位不记世界坐标,而是:
- X / Z:相对于格子原点
- Y:世界高度(绝对值)
同一个副本在编辑世界和每一场副本里的格子原点都按同样的规则计算,所以编辑模式里看到的坐标,就是脚本里要写的坐标,换到哪一格都一样。
查坐标最简单的方法:在编辑模式用指南针左键点方块,聊天栏会显示这个方块的相对坐标,例如 12,65,30,点一下就能复制。
提示
能用点位名称就用名称。用指南针右键点一个点位、取个名字(例如 boss),脚本写 teleport boss,以后改地图只要移动点位,不用改脚本。
文件格式
map:
origin: [8, 40, 8] # 地图最小角(X/Z 相对格子原点,Y 是世界高度)
size: [120, 48, 96] # 地图长、高、宽
points:
- name: spawn
type: spawn
x: 20.5
y: 65.0
z: 5.5
yaw: 90.0
pitch: 0.0
- name: 前厅卫兵
type: mob
x: 30.5
y: 65.0
z: 22.5
yaw: 180.0
pitch: 0.0
- name: 前厅卫兵
type: mob
x: 36.5
y: 65.0
z: 22.5
yaw: 180.0
pitch: 0.0
- name: 大门
type: obstacle
x: 40
y: 65
z: 30
x2: 42
y2: 68
z2: 30
block: IRON_BARS
- name: 陷阱区
type: region
x: 50
y: 64
z: 40
x2: 60
y2: 70
z2: 52
map.origin/map.size在保存地图时自动算出来,不需要手改。- 一般点位有
x y z yaw pitch;区域和障碍是一个长方体,用x y z(最小角)和x2 y2 z2(最大角)。 - 名称不分大小写。
点位种类
| type | 编辑工具 | 用途 |
|---|---|---|
spawn | 床 | 出生点。名称要和副本 config.yml 的 spawn: 一致(默认 spawn),没有出生点无法开始 |
mob | 铁锹 | 出怪点。名称 = 怪物组名称(或怪物组 point: 写的名称) |
point | 指南针 | 一般点位:传送点、存档点、全息文字、NPC、单独生怪的位置……脚本都用名称找 |
region | 金斧 | 区域(长方体):触发组的 region:、条件 region、~区域 限制 |
obstacle | 铁栏杆 | 障碍 / 门(长方体):obstacle open 名称 打开、obstacle close 名称 关上 |
interact | 拉杆 | 互动点:触发组 type: interact 的 point:,玩家点这个方块时触发 |
npc | 村民蛋 | NPC 位置:npc spawn <ID> <点位> |
chest | 箱子 | 宝箱:loot.yml 用 point: 名称 设置战利品,见 宝箱组 |
种类只影响编辑模式的显示和用途分类,脚本里一律用名称找点位,所以任何种类的点位都能拿来 teleport、mob、hologram。
同名点位
- 出怪点可以很多个同名:怪物组出怪时,怪物会轮流分配到每个同名出怪点。
- 用铁锹在已经有同一组怪物点的方块上再点一次,会取代那个怪物点,不会重复。
- 其他种类用编辑工具新增时,同名的会被取代;出生点只会有一个。
- 手改文件时也可以写同名的非出怪点位:脚本用这个名称时,每次随机挑一个。
- 同名的多个区域会被当成同一个区域(玩家站在其中任何一块都算在区域里);同名的多个障碍会一起开关。
障碍的 block
block 是关门时要填的方块:编辑模式框选障碍时副手拿着的方块,没拿则是 BARRIER(屏障)。
- 地图上本来就有方块(例如盖好的铁门):
obstacle open把它们变成空气,obstacle close还原成原本的方块(朝向、状态都保留)。 - 地图上本来是空的:
obstacle close用block填满,obstacle open再拆掉。 - 单个障碍最大 32768 格;大门会分几个 tick 慢慢开,不会卡服。
脚本里怎么写位置
所有要位置的动作(teleport、mob、checkpoint、hologram、particle、block、npc……)都接受下面这些写法:
| 写法 | 意思 |
|---|---|
boss | 点位名称;区域名称 = 区域里随机一点;同名点位 = 随机一个 |
12,65,30 | 坐标(X/Z 相对格子原点,Y 是高度),可以有小数 |
12,65,30,90,0 | 坐标 + 朝向 yaw、俯仰 pitch |
~0,~3,~0 | 相对触发者当前位置(第一个数字带 ~ 就整组都当相对) |
checkpoint | 当前存档点(复活位置) |
self | 触发者所在位置 |
script:
- "teleport boss"
- "mob SkeletonKing 王座 1 10"
- "checkpoint 12,65,30,180,0"
- "hologram create 提示 祭坛 &e右键祭坛召唤守卫"
变量 {point:名称} 会换成这个点位的坐标文字,方便调试,见 变量与占位符。
手改之后
- 改完执行
/cd admin reload。编辑菜单的「重新读取设置」只重读副本的 yml 设置,不会重读points.yml。 - 有人正在编辑这个副本时不要手改:编辑模式里点位一有变动就会用内存里的版本整份覆盖
points.yml。 - 改了点位不需要重新保存地图;只有改了方块才需要
/cd admin save。 - 在编辑菜单给点位改名时,
trigger.yml与loot.yml里指向旧名称的点位设置会自动跟着改,但脚本行里写到的旧名称不会改,见 右键编辑点位。 - 检查有没有写错:
/cd admin validate <副本>会列出找不到的出生点、出怪点、区域。