对比 DungeonPlus / QueDP
DungeonPlus 与 QueDP 都是国内服常用的副本插件。云副本在设计时把这两个插件拆开研究过,下面是做法上的差异。
最大的差别:开副本时要不要建世界
两个插件都是「每开一场副本,就复制一份地图文件夹、加载成一个新世界」,结束后再卸载。 Paper 规定建立和卸载世界只能在主线程做,所以每开一场、每关一场,服务器都会顿一下;同时开的人越多越明显。 它们能做的只有减轻:DungeonPlus 有「启动队列」(默认关闭)和「每 1000 毫秒才能建一个世界」的限制,配置注释里自己写着同时开太多会让 CPU 跑到 100%; QueDP 会先把文件夹复制好,但加载世界仍在主线程,并限制同时最多 3 场在建立中。
云副本完全不在运行中建世界:
- 开服时建一个空的副本世界,之后一直加载着,世界不存档;
- 这个世界切成很多格子,每格相隔 1024 格,一场副本占一格;
- 地图用 FastAsyncWorldEdit 在后台线程贴上,主线程只负责分批放方块;
- 热门副本可以事先贴好几份(预热),开副本时直接分到一格,等于秒开;
- 结束后清掉这一格的怪物与掉落物,这一格就能给下一场用。
实测(Purpur 1.21.4):连续贴 3 次 240 万方块的地图,每次约 0.56 秒(在后台线程);期间服务器 MSPT 平均 0.2 ms、最高 3.6 ms。
一张表看差异
| DungeonPlus 1.4.6 | QueDP 1.4.1 | CloudDungeon 云副本 | |
|---|---|---|---|
| 开副本 | 复制文件夹 + 加载新世界(主线程) | 复制文件夹 + 加载新世界(主线程) | 常驻世界分格 + FAWE 后台贴图,可预热秒开 |
| 文件组织 | option / monster / obstacle / task / interact | 单一配置 | 一个副本一个文件夹:config、开始前、开始后、怪物组、脚本组、任务组、触发组、通关组、宝箱组 |
| 脚本写法 | $脚本{参数} @类型,另有 Kether、JS 判断 | GraalJS(JavaScript) | 简写 动作 参数,也能直接贴 DungeonPlus 写法 |
| 延迟 | 只有 monstergroup / end 的 delay 参数与任务时间轴 | — | 任何地方都能写 delay 1.5 |
| 条件分支 | 脚本组 condition / true / false | JS | if / then / else 区块、一行 if 条件 -> 动作、chance,也读得懂 DungeonPlus 的写法 |
| 地图设置 | 在线编辑:锄头、木剑、木锹 | 网页编辑器(默认监听 0.0.0.0:28888,明文 HTTP) | 游戏内编辑模式:虚空编辑世界、9 个快捷工具、全息字标示每个点位、编辑菜单快速设置 |
| 掉线 | 默认等 120 秒;副本只剩一人时掉线直接结束 | 断线保护默认关闭(0 秒) | 默认保留 180 秒、重连直接回到副本;全队掉线时副本暂停(怪物停止行动、不计时) |
| 当机 / 重开 | — | — | 开服时找出没打完的场次,自动退还门票、次数与体力,玩家上线送回原处 |
| 门票 | 本体没有,需要自己用脚本扣物品 | 金币、物品、体力、每日次数 | 门票物品(隐藏标签防伪造)、金钱、体力;先押着,进场成功才算扣,开不成自动退 |
| 入场条件 | js-condition | 等级等 | 任何 PlaceholderAPI 变量(%mmocore_level% >= 20),每条可自订提示 |
| 防作弊 | 指令白名单、禁止右键物品 | 部分 | 默认关闭末影珍珠、紫颂果、鞘翅、烟花加速、激流、不死图腾、末影箱、桶、载具、拴绳、刷怪蛋、TNT、飞行… 每项可开关 |
| 计分板 / 王条 | 需另外搭配 | 有 | 每个副本自己的计分板、Boss 王条,变量即时更新 |
| 音效 | $sound 只有原版音效名 | — | 原版音效或资源包 ogg,可设音量与音调 |
| 复活 | 次数、死亡点复活 | 有 | 共用 / 个人生命、旁观等待、队友蹲下救援、复活道具、团灭重来 |
| 奖励 | 脚本自行发放 | 有 | 通关、首通、评价(S/A/B)、无伤 / 满人 / 时限内额外奖励;不在线的上线补发 |
| 世界存档 | 会接管服务器的自动存档 | — | 不动服务器存档 |
| 跨服 | 赞助版附属 | — | 内置(BungeeCord / Velocity + MySQL) |
| 支持版本 | 1.12 – 1.20.4 | — | 1.20 – 26.x |
「—」表示该插件本体没有直接对应的现成功能,或我们没有查证到;不代表做不到。 DungeonPlus 的信息以官方文档与 1.4.6 版本的默认配置为准,QueDP 以 1.4.1 版本的默认配置为准。
从 DungeonPlus 换过来
DungeonPlus 的脚本行($message{…} @dungeon、$monstergroup{group=…;delay=1}、$kill{mobname=…;amount=…} @system…)、
monster.yml 的 groups: 列表格式、task 的 auto-start: ["名称 false cycle"]、交互的 type: AREA / PLAYER_DEATH + parameter: 都能直接读。
主要要改的是坐标(云副本用点位名称或相对坐标)和 Kether(不支持,改用一般动作)。详见 从 DungeonPlus 迁移。