跳到主要内容

从 DungeonPlus 迁移

CloudDungeon 的脚本直接认得 DungeonPlus 的写法:$脚本{参数=值;...} @类型 ~区域、<头:参数 *参数> 地牢占位符、condition / true / false 脚本组、groups: 怪物组列表、任务的 auto-start 列表,大部分可以原样贴过来。 需要动手改的主要是三件事:地图搬进编辑模式、坐标换算、Kether / JS 改写。

先了解最大的差别​

DungeonPlusCloudDungeon
地图每场复制一个世界文件夹、加载新世界所有副本在同一个常驻世界分格进行,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> 建好文件夹,再把内容搬进对应的文件。

DungeonPlusCloudDungeon怎么搬
map/<地图>/ 世界文件夹map.schem + points.yml用编辑模式导入后保存,见下方「地图」
option.yml → dungeon-init-scriptbefore.yml 的 dungeon-init-script:原样贴,键名不用改
option.yml → dungeon-start.conditionbefore.yml 的 condition:原样贴到 before.yml 最外层的 condition:
option.yml → dungeon-start.action-scriptstart.yml 的 action-script:原样贴
option.yml → dungeon-reward-scriptend.yml 的 dungeon-reward-script:原样贴(通关时执行)
option.yml → dungeon-areapoints.yml 的 region 点位用编辑模式金斧照原名重新框出来
obstacle.ymlpoints.yml 的 obstacle 点位用编辑模式铁栏杆照原名重新框出来;action-script 改写在开门那一行的后面
monster.yml(groups: 列表格式)monster.yml原样可读,只要换算 $mob 的坐标
task/*.ymltask.yml把所有文件合并成一个 task.yml,格式(含最上面的 auto-start: 列表)原样可读
interact/*.ymltrigger.yml每个文件变成 trigger.yml 里的一段,键名 = 原本的交互名称($interact{name=...} 用的名称)
actionscript/*.ymlscript.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"
交互的 auto-start 默认值不同

DungeonPlus 交互没写 auto-start 时默认关闭;CloudDungeon 的触发组没写时默认开启。原本靠 $interact{...;operation=start} 才启动的交互,搬过来时请确认写了 auto-start: false。

地图与坐标​

  1. 把 DungeonPlus 的地图世界文件夹放进服务器根目录,用世界管理插件加载(例如 /cw import <文件夹>)。
  2. /cd admin edit <副本> 进入编辑模式,执行其中一种:
    • /cd admin import world <世界> [半径]:复制出生点周围 半径 格(默认 150)的整块;
    • 或先在那个世界用 WorldEdit 选好范围,/cd admin import selection。
  3. 用工具标好出生点(床)、出怪点(铁锹)、区域(金斧)、障碍(铁栏杆)、需要的点位(指南针)。名称照 DungeonPlus 里用的名称取,脚本就不用改名字。
  4. /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 与 ~区域 后缀都照常有效。下表「原样」= 贴过来就能用(坐标要换算的另外注明)。

DungeonPlusCloudDungeon说明
$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
Kether 单行

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)要换算,或改写成点位名称。

DungeonPlusCloudDungeon type参数
AREAenterarea(区域名称)、player-size(人数,也可写 all)
WALKenterlocation-a、location-b(或改用 region: / point:)、level、permission
KILLkillmobName(逗号隔开多个)、另外可加 amount
ENTITY_DEATHmob-deathmobName
ENTITY_AREAmob-enterarea、entity-name、entity-size、entity-clear
BREAKbreaklocation(或 point: / region:)、blockName
PLACEplacelocation、blockName
BLOCK_INTERACTinteractlocation(建议改用编辑模式拉杆标互动点,写 point:)、action、hand、level、permission
COMMANDcommandcommand(逗号隔开多个)、cancel
PLAYER_DROPdropitem-name、item-remove、area
PLAYER_DEATHdeathlevel、permission
NPCnpcid(对应 $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 变量​

DungeonPlusCloudDungeon
%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 对照​

DungeonPlusCloudDungeon
options.langlang.yml
setting.world / setting.mode自动回到进副本前的位置与游戏模式;要统一送到大厅填 lobby
setting.bungee-cord + BungeeCord 附属network:,见 跨服
dungeon.commandrules.commands(mode: whitelist + list;也可以改成黑名单或只能 /leave,见副本限制)
dungeon.dungeon-chatparty.party-chat-in-dungeon(发公开用 ! 开头)
dungeon.offline-timeoutdisconnect.grace
dungeon.dungeon-default-quit-numberdisconnect.max-reconnects
dungeon.dungeon-item-removerules.bound-item-lore
dungeon.dungeon-item-right-click-banrules.blocked-items
dungeon.dungeon-team-player-limitparty.max-size
dungeon.dungeon-team-damage-messagerules.pvp
dungeon.interact-particle副本 config.yml 的 interact-hint
dungeon.dungeon-chest-explore副本 config.yml 的 chest-mode: explore
dungeon.dungeon-start-queue、dungeon-world-create-*、dungeon-pre-folder、auto-save不需要:不加载世界,改用 prewarm 预热

指令对照​

DungeonPlusCloudDungeon
/dp start <地牢>/cd join <副本> [模式],或 /cd 大厅
/dp leave/leave 或 /cd leave
/dp team .../cd party ...
/dp editor edit <地牢>/cd admin edit <副本>
/dp editor save <地牢>/cd admin save
/dp editor cancel/cd admin exit
/dp import <地牢>/cd admin import world <世界>
/dp reload/cd admin reload
/dp revive ...脚本 revive 动作、复活道具 /cd revive
权限 dungeon.user / dungeon.startclouddungeon.use(默认所有人)

全部指令见 指令与权限。

搬过来之后多了什么​

  • 不卡服:不建立、不卸载世界,FAWE 后台贴图,热门副本可以预热到秒开。
  • delay:任何脚本中间都能停几秒(delay 1.5),不用再靠任务组排时间。
  • if / then / else:脚本里直接写条件区块,或一行 if 条件 -> 动作。
  • 编辑模式:游戏里点工具标点位、菜单快速改设置、自动补怪物组与触发。
  • 入场券与金钱:开不成、停服、当机自动退还。
  • 奖励:通关、首通、评价、无死亡 / 满员 / 限时等加成奖励,每人各自掷,离线自动补发。
  • 组队与配对:准备确认、招募板、快速配对、难度模式、排行榜与个人记录。
  • 计分板、王条、结算菜单,全部可以自定义。
  • 掉线保护:重连回副本、全队掉线暂停。

检查有没有漏改:/cd admin validate <副本> 会列出找不到的点位、怪物、脚本组与看不懂的写法。