从 DungeonPlus 迁移
CloudDungeon 的脚本直接认得 DungeonPlus 的写法:$脚本{参数=值;...} @类型 ~区域、<头:参数 *参数> 地牢占位符、condition / true / false 脚本组、groups: 怪物组列表、任务的 auto-start 列表,大部分可以原样贴过来。
需要动手改的主要是三件事:地图搬进编辑模式、坐标换算、Kether / JS 改写。
先了解最大的差别
| DungeonPlus | CloudDungeon | |
|---|---|---|
| 地图 | 每场复制一个世界文件夹、加载新世界 | 所有副本在同一个常驻世界分格进行,FAWE 在后台贴 map.schem,不加载任何世界 |
| 坐标 | 地牢世界的世界坐标 | X/Z 相对格子原点、Y 是世界高度,或直接写点位名称,见 点位 |
| 编辑 | dp editor,锄头 / 木剑 / 木锹 | /cd admin edit,9 个工具 + 编辑菜单,见 编辑模式 |
| 条件 | JavaScript(需要 Nashorn) | 内置运算式(%player_level% >= 20 && {v:钥匙} == 3),不需要 JS 引擎 |
| Kether | 支持 | 不支持,改用一般动作 |
文件对照
DungeonPlus 的 dungeon/<地牢>/ 对应 CloudDungeon 的 dungeons/<副本ID>/。先用 /cd admin create <ID> 建好文件夹,再把内容搬进对应的文件。
| DungeonPlus | CloudDungeon | 怎么搬 |
|---|---|---|
map/<地图>/ 世界文件夹 | map.schem + points.yml | 用编辑模式导入后保存,见下方「地图」 |
option.yml → dungeon-init-script | before.yml 的 dungeon-init-script: | 原样贴,键名不用改 |
option.yml → dungeon-start.condition | before.yml 的 condition: | 原样贴到 before.yml 最外层的 condition: |
option.yml → dungeon-start.action-script | start.yml 的 action-script: | 原样贴 |
option.yml → dungeon-reward-script | end.yml 的 dungeon-reward-script: | 原样贴(通关时执行) |
option.yml → dungeon-area | points.yml 的 region 点位 | 用编辑模式金斧照原名重新框出来 |
obstacle.yml | points.yml 的 obstacle 点位 | 用编辑模式铁栏杆照原名重新框出来;action-script 改写在开门那一行的后面 |
monster.yml(groups: 列表格式) | monster.yml | 原样可读,只要换算 $mob 的坐标 |
task/*.yml | task.yml | 把所有文件合并成一个 task.yml,格式(含最上面的 auto-start: 列表)原样可读 |
interact/*.yml | trigger.yml | 每个文件变成 trigger.yml 里的一段,键名 = 原本的交互名称($interact{name=...} 用的名称) |
actionscript/*.yml | script.yml | 原样贴(async / action-script / condition / true / false 都认得);全局脚本组要贴进每个用到它的副本 |
extension/hologram/*.yml | 脚本 hologram + trigger.yml | 改写,见下方 $hologram |
extension/kether/ | — | 不支持,改写成一般动作 |
示例:
# before.yml
dungeon-init-script:
- "$setting{break=false;place=false;pvp=false;mode=ADVENTURE} @init"
- "$revive-setting{revive=true;number=5;death-location=true;time=3} @init"
condition:
- "$team-condition{team=false;min=1;max=4;message=人数不对,目前 <size> 人} @system"
# start.yml
action-script:
- "$message{type=title;text=&c古殿,&7第一波来了} @dungeon"
- "$monstergroup{group=default;repeat=false;delay=1} @dungeon"
# trigger.yml(原本的 interact/陷阱.yml)
陷阱:
type: AREA
parameter:
area: "陷阱区"
first: true
auto-start: false
script:
- "$message{type=text;text=<self:player-name> 踩到陷阱了} @self"
DungeonPlus 交互没写 auto-start 时默认关闭;CloudDungeon 的触发组没写时默认开启。原本靠 $interact{...;operation=start} 才启动的交互,搬过来时请确认写了 auto-start: false。
地图与坐标
- 把 DungeonPlus 的地图世界文件夹放进服务器根目录,用世界管理插件加载(例如
/cw import <文件夹>)。 /cd admin edit <副本>进入编辑模式,执行其中一种:/cd admin import world <世界> [半径]:复制出生点周围半径格(默认 150)的整块;- 或先在那个世界用 WorldEdit 选好范围,
/cd admin import selection。
- 用工具标好出生点(床)、 出怪点(铁锹)、区域(金斧)、障碍(铁栏杆)、需要的点位(指南针)。名称照 DungeonPlus 里用的名称取,脚本就不用改名字。
/cd admin save保存。
坐标换算
DungeonPlus 脚本里的 location=X,Y,Z 是世界坐标,CloudDungeon 要的是相对格子原点的坐标。导入时,来源范围的最小角会放在格子原点 +8 的地方,高度不变,所以:
新 X = 旧 X − 来源最小角 X + 8
新 Y = 旧 Y
新 Z = 旧 Z − 来源最小角 Z + 8
import world的来源最小角 = 世界出生点 −半径(例如出生点0, 0、半径 150 → 最小角-150, -150)。import selection的来源最小角 = 选区较小的那个角。
更省事的做法:把常用的位置都标成点位,脚本直接写名称(location=boss)。不确定时,在编辑模式用指南针左键点那个方块,聊天栏会显示正确的坐标。
脚本对照
@init @dungeon @player @self @system 与 ~区域 后缀都照常有效。下表「原样」= 贴过来就能用(坐标要换算的另外注明)。
| DungeonPlus | CloudDungeon | 说明 |
|---|---|---|
$setspawn{location;yaw;pitch} | 原样(坐标换算) | 设置存档点(复活位置)。开场传送的位置由编辑模式的床(config.yml 的 spawn:)决定,建议直接用床标出生点 |
$setmap{name} | 不需要 | 地图在开场前就已经贴好;要共用别的副本的地图或随机地图,写在 config.yml 的 map: |
$revive-setting{revive;number;death-location;time} | 原样 | 也可以改用 config.yml 的 lives: 设置 |
$setting{break;place;pvp;mode} | 原样 | 也可以改任何副本限制规则;rejoin、quit-number-limit 改用 disconnect: |
$task{name;operation;mode} | 原样 | start / end / restart,timing / cycle 都认得;async 忽略 |
$taskcontain{name} | 原样 | 条件 |
$obstacle{group;operation} | 原样(障碍要重新框) | delete = 开门、undelete = 关门;obstacle.yml 的 action-script 不会执行,写在这一行后面 |
$block{name;start;end} | 用铁栏杆工具 | 这是 obstacle.yml 里定义障碍范围用的,不用搬;CloudDungeon 的 block 动作是放 / 拆方块 |
$operation-block{loc;mode;type} | 原样(坐标换算) | loc 可以写点位 / 区域名称 |
$monstergroup{group;repeat;delay} | 原样 | |
$remove-monstergroup{group} | 原样 | ALL = 全部 |
$mob{plugin;name;location;amount;scattered;level;yaw;pitch;chance} | 原样(坐标换算) | name 写 MythicMobs ID 或 minecraft:原版怪;坐标请写方块中央(.5) |
$js-condition{text;message} | 原样(不是 JS) | 比较、&& ` |
$team-condition{team;min;max;message} | 原样 | |
$data-condition{key;type;value} | 原样 | |
$kill{mobname;amount} | 原样 | MythicMobs ID 或显示名称(自动去颜色、只取 : 左边) |
$kill-any{mobname;amount} | 原样 | |
$npc / $anpc{type;id;operation;location} | 原样(坐标换算) | 改为生成内置 NPC(无敌、不会动的村民,可改实体种类),不使用 Adyeshach / Citizens;点击用 trigger.yml 的 type: npc |
$command{text;console;death-player;chance} | 原样,注意多条指令 | <player.name> 照常替换。多条指令用 , 隔开时,每条都要以 / 开头(text=/fly <player.name>,/say 飞行,逗号后面有空格也可以),否则请改用 || 分隔 |
$teleport{location;yaw;pitch;defspawn} | 原样(坐标换算) | defspawn 默认 true(和 DungeonPlus 一样),传送时同时设存档点;不想改存档点写 defspawn=false。简写 teleport 点位 则默认不改存档点 |
$message{type;text} | 原样 | title 用 主标题,副标题;另外支持 type=actionbar |
$script{script} | 原样 | |
$end{type;text;reward;delay;end-type} | 原样 | reward=true 或 end-type=COMPLETE = 通关(执行 end.yml 的通关组与奖励);reward=false 或其他 end-type = 失败 |
$data{key;type;operation;value} | 原样 | add / take / reset,value / list |
$interact{type;name;operation} | 原样 | name = trigger.yml 里的键名;start / end = 开启 / 关闭 |
$sound{type} | 原样 | 另外可加 volume、pitch,也能播放资源包音效 |
$kether{group} | 不支持 | 会在控制台警告并跳过;改写成一般动作 |
$hologram{name;operation;location} | 要改写 | 文字直接写在 text= 参数(多行用 ||),点击改用 trigger.yml 的 type: hologram |
DungeonPlus 里不以 $ 开头的行会被当成 Kether 语句。CloudDungeon 里不以 $ 开头的行是简写动作,Kether 语句搬过来会报「不认识的动作」,请改写。
$hologram 改写示例:
# 原本:$hologram{name=example;operation=create;location=X,Y,Z} @dungeon + extension/hologram/example.yml
script:
- "$hologram{name=example;operation=create;location=祭坛;text=&e击杀狂暴村民 x3||&f进度 <mob:kill-amount *狂暴村民>/3} @dungeon"
# trigger.yml:点击全息时
点全息:
type: hologram
id: example
condition:
- "<mob:kill-amount *狂暴村民> >= 3"
script:
- "$end{type=text;text=挑战成功;reward=true} @dungeon"
交互类型对照(interact → trigger.yml)
type 写 DungeonPlus 的名称就认得,parameter: 底下的参数名也照用。坐标类参数(location、location-a、location-b)要换算,或改写成点位名称。
| DungeonPlus | CloudDungeon type | 参数 |
|---|---|---|
AREA | enter | area(区域名称)、player-size(人数,也可写 all) |
WALK | enter | location-a、location-b(或改用 region: / point:)、level、permission |
KILL | kill | mobName(逗号隔开多个)、另外可加 amount |
ENTITY_DEATH | mob-death | mobName |
ENTITY_AREA | mob-enter | area、entity-name、entity-size、entity-clear |
BREAK | break | location(或 point: / region:)、blockName |
PLACE | place | location、blockName |
BLOCK_INTERACT | interact | location(建议改用编辑模式拉杆标互动点,写 point:)、action、hand、level、permission |
COMMAND | command | command(逗号隔开多个)、cancel |
PLAYER_DROP | drop | item-name、item-remove、area |
PLAYER_DEATH | death | level、permission |
NPC | npc | id(对应 $npc 生成的 NPC ID) |
first = once(只触发一次)。CloudDungeon 另外有 leave(离开区域)、chat、use、sneak、revive、quit / rejoin、variable、wipe、group-start / group-end、mob-health,见 触发组。
地牢占位符
<头:参数 *参数> 写法照常可以用:
| DungeonPlus | 状态 | CloudDungeon 的写法 |
|---|---|---|
<dungeon:name> | 可用(返回副本 ID) | {dungeon_id};显示名称用 {dungeon} |
<dungeon:world-name> | 可用 | |
<dungeon:params *位 *默认 值> | 只会返回默认值 | 没有启动参数,改用难度模式 |
<data:value *名> | 可用 | {v:名} |
<data:list *名 *值> | 可用 | |
<mob:kill-amount *怪> | 可用 | {kills:怪} |
<mob:kill-contain *怪> | 可用 | |
<self:player-name> | 可用 | {self} |
<self:area-name> | 可用 | {region} |
<random:value *最小 *最大> | 可用 | {random:1-100} |
<area:player-size *区域> | 可用 | |
<area:monster-size *区域 *怪> | 可用 | |
<if:[条件] *成立 *不成立> | 可用(条件用内置运算式) | 或用 if: / then: / else: 区块 |
<item:物品 *数量 *是否扣除> | 可用 | 后面两个参数(过滤颜色、只检测队长)忽略 |
<player.name> | 可用(任何文字里都会替换) | {player}:收到这一行或执行这一次的玩家 |
<player> / <size> | 在 before.yml 的条件 message 里可用 |
{变量} 写法与完整列表见 变量与占位符。
PlaceholderAPI 变量
| DungeonPlus | CloudDungeon |
|---|---|
%dungeon_name% | %clouddungeon_dungeon_id%(显示名称 %clouddungeon_dungeon%) |
%dungeon_player_size% | %clouddungeon_party_size% |
%dungeon_task_state_<任务>% | %clouddungeon_task_<任务>% |
%dungeon_data_<名>#<默认>% | %clouddungeon_var_<名>%(没设置过是 0) |
%dungeon_area_name% | %clouddungeon_region% |
%team_leader% | %clouddungeon_party_leader% |
%team_player_size% | %clouddungeon_party_size% |
%dungeon_uuid% %dungeon_state% %dungeon_death_state% %team_uuid% %team_is_leader% | 没有对应 |
全部变量见 PlaceholderAPI 变量。
config.yml 对照
| DungeonPlus | CloudDungeon |
|---|---|
options.lang | lang.yml |
setting.world / setting.mode | 自动回到进副本前的位置与游戏模式;要统一送到大厅填 lobby |
setting.bungee-cord + BungeeCord 附属 | network:,见 跨服 |
dungeon.command | rules.commands |