Dungeon
概览
Dungeon 让一支队伍游玩副本的私有副本。每一次通关过程称为一次运行(run):它拥有自己的世界(或共享世界中属于自己的槽位)、自己的成员、自己的时间限制、自己的箱子、NPC 和怪物,并且会干净地结束,把所有人送回他们来时的位置。
一个副本由一个 Dungeon Instance 条目描述。玩家在全局菜单(按分类归组的副本浏览器)中选择副本,在队伍菜单中加入大厅,标记为准备就绪,倒计时结束后被传送进去。管理人员和任务也可以用 Dungeon Enter 动作或命令,直接把玩家送进去。
副本有两种:
- 固定型:你在模板世界中一次性建好副本。房间是你在游戏中划出的区域,一切都发生在你设定的地点。这是经典的副本。
- 生成型:你构建房间模板(带有门和标记点的小型结构),生成器会为每次运行组装一个新的布局,从起始房间一直到 Boss 房间。相同的种子总是生成相同的副本。参见生成型副本。
两种副本共用相同的运行、菜单、箱子、NPC、怪物、事件和事实(fact)。
Dungeon 面向 Paper。它不支持 Folia:官方 Typewriter 插件无法在 Folia 上运行。
功能
- 运行与分组:每个分组一次运行;同一副本可同时存在多次运行(
maxSimultaneousInstances);时间限制、进入费用;运行会在完成、超时、无人或管理员关闭时结束。参见运行与世界隔离。 - 三种隔离模式:
SLIME_CLONE、WORLD_PER_RUN和SHARED_WORLD_SLOTS,按副本通过isolation字段选择。 - 固定型副本:带有
onEnter/onLeave触发器、修饰器(modifier)、条件(criteria)和优先级的房间。 - 生成型副本:房间模板、连接器类型、房间池、生成器、词缀(affix),以及用于捕获房间、放置门和标记点的游戏内编辑器。
- 全局菜单与队伍菜单:使用 GUI 扩展的布局,在玩家加入和离开大厅时实时刷新。
- 战利品箱:方块箱或锚定在 NPC 上的箱子;真实箱子或客户端箱子;每位玩家独立的物品栏或共享;加权或独立的战利品。
- 每次运行专属的 NPC:只向某一次运行的成员显示的 NPC,可来自任意 Typewriter 实体定义。参见副本中的实体。
- 战斗怪物:每次运行只出现一次的真实原版怪物,带有装备、属性、掉落规则和死亡触发器,数量受上限约束。
- 事件、事实与动作:开始、完成、进入房间、离开房间和怪物死亡事件;“是否在副本中”和“存活怪物数”事实;用于完成运行、清空房间和刷出一波怪物的动作。
- 统计:每名玩家 22 项统计(运行、最佳用时、击杀怪物数、造成和承受的伤害、死亡、已清理的波次等),可通过占位符和 fact 读取,并能在 GUI 排行榜中排名。参见统计。
- 重载安全:
typewriter reload或 Publish 不会中断运行。服务器重启则会结束运行。 - 其他插件的队伍:读取 MMOCore、Parties 或 Typewriter 队伍扩展的队伍,让好友一起进入。
安装
- 从其页面安装 GUI 扩展。Dungeon 的两个菜单都使用它的布局。
- 确认已安装 TypeWriter 的 Quest 扩展。
- 准备你的隔离模式所需的内容(参见运行与世界隔离):
- 固定型副本:一个模板世界,作为文件夹放在服务器根目录(与
world并列),例如dungeon_temple。名称可以使用字母、数字、_和-,最长 64 个字符。 - 生成型副本:不需要模板世界。扩展会为每次运行创建一个空世界。
- Slime 克隆:Advanced Slime Paper,并将模板作为已加载的 Slime 世界。
- 固定型副本:一个模板世界,作为文件夹放在服务器根目录(与
- 从商店下载 Dungeon(见上方面板中的按钮),把 JAR 放入
plugins/Typewriter/extensions/。 - 重启服务器。
- 可选:安装 MMOCore 或 Parties 以支持外部队伍,安装 PlaceholderAPI 以使用占位符。
从 0.10 升级?请先阅读迁移说明。
快速开始
本教程构建一个带有大厅菜单和一个箱子的固定型副本。若要创建生成型副本,请从生成型副本开始。
- 在 Web 面板中打开一个 manifest 页面,添加一个 Dungeon Room Config。站在玩家应当到达的位置,点击
spawnPoint的内容编辑器并确认。世界、坐标和视角方向会被捕获。 - 添加一个 Dungeon Instance。将
templateWorld设置为世界文件夹的名称,把房间配置加入roomConfigurations,并设置minPartySize和maxPartySize。 - 添加一个 Dungeon Artifact(统计)和一个 Active Dungeon Instance Artifact(运行的状态),并分别链接到
artifact和runtimeArtifact。没有第二个的话,运行会保存在扩展的runs.json文件中,并且加载时会记录一条警告。partyLobbyArtifact字段已不再使用:请留空。 - 添加一个 Dungeon Category。在
instances中添加一个槽位,设置dungeonInstance,并选择已解锁和已锁定时的物品。 - 在一个 sequence 页面中,添加一个 Dungeon Global Menu 和一个 Dungeon Party Menu。按照菜单中的说明设计这两个布局。
- 通过 NPC 对话、命令事件或任何其他触发器来触发全局菜单。然后 Publish。
- 为该实例添加一个 Dungeon Loot Chest。站在箱子应放置的位置,捕获
location,并填写lootTable。 - 在副本应当结束的位置(例如最后一个箱子之后的对话结尾)添加一个 Dungeon Complete 动作。
- 测试:打开菜单,点击副本,点击大厅,按下准备按钮。
若要跳过菜单、直接把一名玩家送进去,请使用 Dungeon Enter 或 /typewriter dungeon enter <instance>。它会跳过大厅,但不会跳过规则:分组人数(必须允许单人,即 minPartySize 允许)、条件(criteria)、进入费用和同时运行的数量都会被检查。
工作原理
当大厅启动,或 Dungeon Enter 动作执行时,一次运行开始。扩展会检查每位玩家的条件和分组人数,预留一个位置(双击只会产生一次运行),准备世界,收取进入费用(全部收取或完全不收),传送玩家,然后为每位成员触发 onStart 并应用 modifiers。如果途中任何一步失败,什么都不会保留:玩家留在原地,费用被退还,世界被丢弃。
运行在以下情况结束:Dungeon Complete 执行时、时间限制归零时、Dungeon Close 或 /typewriter dungeon close 执行时,或最后一名玩家离开、切换世界或断开连接时。onEnd 会为每位成员触发,运行的箱子、NPC 和怪物被移除,玩家被传送到出口点(或来时的位置),世界被释放。
多个结束条件同时发生时,只有一个生效,因此不会出现两次 onEnd 或重复退款。
重载与重启
typewriter reload 或 Publish 不会丢失运行:它们会连同成员、世界、截止时间、房间状态(once 房间保持已用完)、已打开的箱子和已刷出的怪物一起被重新接管。onStart、修饰器和箱子不会被重新执行。生成型副本会根据其种子在内存中重新构建。
服务器重启会结束运行:运行的世界会消失,玩家在下次加入时被送回,遗留的世界文件夹会被清除。大厅在这两种情况下都不会恢复。
断线
从进行中的副本断线的成员,会在 Dungeon Instance 的 reconnectGrace(默认 2 分钟)内保留自己的位置。在此期间运行不会关闭,该成员的统计也不会结算。及时回来的成员会出现在原来的位置,侧边栏、隐藏状态和游戏模式保持原样。时间用完后,他离开运行,下次加入时被送回进入的位置。运行的时间限制仍在继续计时。
被等待的成员仍然是成员:如果运行在此期间结束,他会像其他人一样得到结果(包括通关和最佳用时),而 onEnd 触发器只会为在线的成员执行。0 表示没有宽限:断线会立即移除玩家。宽限期间执行 typewriter reload 会终止对被等待玩家的宽限。
安装了 MMOProfiles 时,玩家选择档案后会再次检查返回情况。不在任何运行中、却被档案放进副本世界的玩家,会被送回进入的位置,副本改变过的游戏模式也会被归还,无论档案恢复的是什么模式。处于自己运行中的玩家(宽限期内)则直接继续。没有 MMOProfiles 时不会有任何变化。
菜单
Dungeon 有两个菜单。两者都是带有 GUI layoutPool 和 mainLayoutId 的动作。布局中的物品与普通 GUI 物品的工作方式相同。buttonType 为下列值之一的物品,会由 Dungeon 填充内容:你的物品(材质、名称、描述)会保留,并添加点击行为。请按所列的样子,以大写书写 buttonType。buttonPrefix 请留空。
两个菜单每隔 autoRefreshTicks(默认 20,限制在 10 到 1200 之间)重绘一次;并且每当它们所显示的副本的某个大厅发生变化时,会立即为所有打开它们的玩家重绘。玩家无需点击就能看到其他玩家加入。
关于布局类型、物品字段(x、y、count、direction、gap、repeatY)和点击动作,请阅读 GUI 指南。分步构建过程见设计菜单。
全局菜单
Dungeon Global Menu 显示某个 category 的副本。它在动作被触发时打开,或通过 /typewriter dungeon global-menu <category> 打开。
buttonType | 行为 |
|---|---|
DUNGEON_INSTANCE_SLOT | 标出一个副本出现的位置。每个副本放置一个,或使用 count、direction、gap 和 repeatY 标出一行或一块。每个标记会被分类中的下一个副本替换。多余的标记保持为空。 |
DUNGEON_FIND_PARTY | 左键点击会加入该分类中已解锁副本里第一个仍有空位且非空的大厅,并打开队伍菜单。如果玩家已经在该分类的某个大厅中,则改为离开它。 |
DUNGEON_INFO | 仅用于显示。可用作帮助物品。 |
副本的绘制方式:
- 副本按
categoryPriority(从小到大)排序,然后按条目 id 排序。 - 当槽位的
criteria与玩家匹配时(空列表总是匹配),使用unlockedItem、unlockedName和unlockLore显示。点击它会为该副本打开队伍菜单。 criteria不匹配的槽位以锁定外观显示,无法打开。条件会对每位打开菜单的玩家进行评估,并在玩家点击时再次评估。- 名称和描述可以使用
{dungeon_name}、{players}和{max},以及 PlaceholderAPI 占位符。{players}是该副本第一个大厅的人数。 - 请把
DUNGEON_INSTANCE_SLOT标记放在simple、paginated或scrollable布局中。如果基础布局是可滚动的,副本会随之滚动。 - 没有任何
DUNGEON_INSTANCE_SLOT标记时,不会显示任何副本。
队伍菜单
Dungeon Party Menu 就是大厅。它在玩家于全局菜单中点击副本时打开,也可通过 /typewriter dungeon instance-menu <instance> 打开。触发该动作本身除了打印一条提示外什么都不做,所以不要把它连接到 NPC。
哪个菜单服务哪个副本。 dungeonInstance 指定了该副本的队伍菜单会服务它。dungeonInstance 为空的队伍菜单,服务所有没有被其他菜单指定的副本。为另一个副本编写的菜单永远不会被替代打开:没有合适的菜单时,玩家会收到提示,服务器日志会显示 No dungeon_party_menu serves '<instance>'。因此你可以为每个副本配一个菜单、配一个共用菜单,或两者兼用。
一个副本拥有与其 maxSimultaneousInstances 一样多的大厅。每个大厅是一个物品:用 lobbyName 命名、用 lobbyLore 描述的 lobbyItem。大厅的绘制位置:
- 在
simple布局中有DUNGEON_LOBBY_SLOT标记时(与DUNGEON_INSTANCE_SLOT的用法相同,使用count、direction和gap标出多个),每个标记会被下一个大厅替换。 - 没有任何标记时,从 0 开始计数,第
n个大厅放在第lobbyOffsetX + (n mod 9)列、第lobbyOffsetY + (n div 9)行。
点击大厅即可加入。
lobbyName 和 lobbyLore 中的占位符 | 值 |
|---|---|
{index} | 大厅编号,从 1 开始。 |
{players}, {max} | 大厅中的玩家数,以及 maxPartySize。 |
{player_names} | 成员的名字,包裹在已准备或未准备的前缀和后缀中。仅用于描述。 |
{ready_players}, {not_ready_players} | 人数。仅用于描述。 |
readyPlayerPrefix、readyPlayerSuffix、notReadyPlayerPrefix 和 notReadyPlayerSuffix 为 {player_names} 中的名字着色。
buttonType | 行为 |
|---|---|
DUNGEON_LOBBY_SLOT | 标出一个大厅出现的位置。 |
DUNGEON_READY | 切换准备状态。如果玩家缺少进入费用,则没有人会被标记为已准备,大厅会收到该副本的 missingItemsMessage。 |
DUNGEON_LEAVE | 离开大厅,并返回玩家来时的全局菜单。 |
DUNGEON_AUTO_FILL | 加入第一个有空位的非空大厅。 |
运行开始时:
- 大厅里的每个人都必须已准备,并且大厅中至少有
minPartySize名玩家。 - 开始
startCooldownSeconds的倒计时。有人取消准备时倒计时停止。设为0时,运行立即开始。 - 先检查每位玩家的条件,再检查进入费用。
entryCostMode为LEADER时,由大厅中的第一位玩家支付。为GROUP时,每个人都支付。只有在没有人缺少任何物品时,才会收取物品。 - 创建运行,并把玩家传送到出生点。
一个没有倒计时、等待超过 lobbyIdleKickSeconds(默认 120 秒)的大厅会被清空。管理员可以用 /typewriter dungeon force-start <instance> 手动启动大厅,该命令会免除最小分组人数和条件的限制。
玩家等待期间,队伍菜单可以显示等待计分板(enableWaitingScoreboard、scoreboardTitle、带有 {missing} 的 scoreboardWaiting、带有 {time} 的 scoreboardCountdown)。
其他插件的队伍。 如果安装了 MMOCore(使用其自带的队伍模块)、Parties 或 Typewriter 队伍扩展,Dungeon 会读取它们的队伍,绝不创建、合并或修改。玩家加入大厅时,如果大厅有足够空位容纳整支队伍,该玩家的整支队伍会一起加入。存在 MMOCore 时,只使用 MMOCore。
按钮使用的命令
按钮不使用服务器命令:它们调用菜单系统的内部处理器,因此玩家不需要任何权限,也没有需要手动输入的内容。
配置
扩展没有配置文件。大多数设置位于条目上。动作条目(Enter、Leave、Close、Complete)的消息,以及副本实例的消息(missingItemsMessage)都是字段。大厅的闲置延迟是副本实例的 lobbyIdleKickSeconds 字段(默认 120,即 2 分钟)。
玩家读到的其他所有文本都是 Typewriter 的 snippet,因此代码中没有任何固定内容:可在 Web 面板(snippets)中修改或翻译。值使用 MiniMessage,{...} 占位符会按所列内容替换。保持默认值则不会有任何变化。
| 系列 | 键(前缀之后) |
|---|---|
content.dungeon_menu. | invalid_action, action_failed, in_instance, party_in_instance, global_in_instance, locked, lobby_unavailable, left_lobby, not_in_lobby, no_lobby_available, left_party, no_party_found, no_party_menu ({dungeon}), no_category, party_needs_dungeon |
content.dungeon_lobby. | idle_kick ({seconds}, {minutes}), party_sync, missing_items_fallback ({PlayerName}, {MissingQuantity}, {ItemName};当 missingItemsMessage 为空时使用), scoreboard_syncing |
content.dungeon_run.sidebar. | time_left ({seconds}), quest ({number})。侧边栏的一行是纯文本:MiniMessage 标签会被移除。 |
content.dungeon_chest. | default_title(containerTitle 为空的箱子的标题), trigger_chest_missing, trigger_not_manual |
content.dungeon_launch. | prefix(放在该系列每条文本之前), no_online_member, already_in_run ({player}), no_room_configuration, group_size ({size}, {min}, {max}), criteria_not_met ({player}), missing_cost 和 missing_cost_leader ({player}, {amount}, {item}), max_runs_reached, isolation_unavailable, generation_failed ({text}), failed |
content.dungeon_stats. | 统计占位符的写法:duration_format(标记 {h}、{m}、{mm}、{ss}、{SSS};默认 {mm}:{ss})和 missing_value(尚不存在的值显示的内容;默认 -)。 |
content.dungeon_command. | /typewriter dungeon ... 命令的回复: only_players.close, only_players.enter, only_players.leave, only_players.menu, only_players.force_start, only_players.edit_room (发送到控制台), not_in_run, close.done, close.already_closing, enter.done ({dungeon}), leave.done ({dungeon}), instance_menu.join_failed, instance_menu.joined ({dungeon}), global_menu.not_configured ({category}), force_start.not_in_lobby, force_start.done ({dungeon}), room.invalid_index ({index}) |
content.dungeon_room., content.dungeon_room_template., content.dungeon_generated. | 房间编辑器以及生成型副本的拒绝消息。 |
/typewriter dungeon ... 命令的回复同样是 snippet,尽管这些命令仅供工作人员使用。房间编辑器的回复(addnode、removenode、save 等)位于 content.dungeon_room.,被拒绝的 enter 的文本是 content.dungeon_launch. 中的 snippet。
artifact 会把数据存放在 plugins/Typewriter/ 下:
| Artifact | 内容 |
|---|---|
| Dungeon Artifact | 每个副本、每位玩家的统计(artifactId 默认为 dungeon_data)。 |
| Active Dungeon Instance Artifact | 进行中的运行的状态,使重载不会丢失它们。 |
| Dungeon Room Template | 生成型副本中某个房间保存下来的结构。 |
| Dungeon Party Lobby Artifact | 无效。保留是为了让旧页面仍能加载。 |
命令
所有 Dungeon 命令都在 /typewriter dungeon(/tw dungeon)之下。每个命令都需要权限 typewriter.dungeon.admin,并且必须由玩家执行。
| 命令 | 说明 |
|---|---|
/typewriter dungeon enter <instance> | 为你一个人创建一次运行并传送过去。分组人数、条件、进入费用和运行数量上限仍然适用。 |
/typewriter dungeon leave <instance> | 将你自己从该副本的运行中移除,并回到来时的位置。 |
/typewriter dungeon close <instance> | 结束你自己在该副本的运行(管理员关闭)。 |
/typewriter dungeon global-menu <category> | 打开为该分类配置的全局菜单。 |
/typewriter dungeon instance-menu <instance> | 加入第一个能容纳你的分组的大厅,并打开队伍菜单。 |
/typewriter dungeon force-start <instance> | 启动你所在的大厅,不等待准备、倒计时、最小分组人数或条件。 |
/typewriter dungeon room <room> edit | 为一个 Dungeon Room 打开游戏内房间编辑器。 |
/typewriter dungeon room <room> addnode | 在你脚下添加一个节点。 |
/typewriter dungeon room <room> removenode | 移除最后一个节点。 |
/typewriter dungeon room <room> removenodeat <index> | 按编号移除节点,从 1 开始。 |
/typewriter dungeon room <room> save | 保存房间。 |
/typewriter dungeon room <room> cancel | 放弃编辑。 |
leave 和 close 要求你处于所指定地牢的一次运行中,否则会回复“You are not in a run of this dungeon”(snippet content.dungeon_command.not_in_run)。旧的 start 子命令已不存在:请使用 enter。
生成型副本的房间模板在 Web 面板中编辑(artifactId 字段的内容编辑器),而不是通过命令。参见生成型副本。
房间编辑器(固定型副本)
edit 会打开一个编辑器,其工具栏位于你的快捷栏:1 号槽位的烈焰棒添加一个节点(在你注视的方块处,潜行时在你脚下),2 号槽位的红石移除最后一个节点,8 号槽位的黄绿色染料保存并退出。连按两次潜行会不保存而退出。节点以带有粒子轮廓的方块显示;潜行并点击某个节点可删除它。一个节点构成一个点状房间(半径 0.5 格),两个构成一条线,三个或更多构成一个多边形。垂直范围由最低和最高的节点决定,再加上 verticalMargin。
权限
| 权限 | 授予 |
|---|---|
typewriter.dungeon.admin | 所有 /typewriter dungeon 命令,包括房间编辑器。 |
玩家使用菜单不需要任何权限。
统计
Dungeon 会统计每名玩家在运行期间的表现,并按每个 Dungeon Artifact 保存为 22 项统计。一次运行的计数在运行期间保存在内存中,每名成员在离开运行或运行结束时只结算一次;不会每次命中都写入磁盘,typewriter reload 也会保留进行中运行的计数。与其他副本共用 artifact 的副本,会累加到同一组统计中。
| 键 | 单位 | 内容 |
|---|---|---|
runs_started | 次数 | 已开始的运行,在开始时计数,即使运行失败也算。 |
runs_completed | 次数 | 玩家仍在其中时完成的运行。 |
best_time | 时长 | 已完成运行的最短用时(纪录:首次通关前没有值)。 |
runs_timed_out | 次数 | 玩家仍在其中时时间限制已到的运行。 |
runs_left | 次数 | 玩家自己离开的运行,或重新连接的宽限已到期的运行。让玩家离开运行的死亡不在此统计(仍计入 deaths)。 |
mob_kills | 次数 | 击杀的怪物。 |
damage_dealt | 生命值 | 对怪物造成的伤害,按真正扣掉的生命值计算:对只有 2 点生命值的目标打出 100 的一击只算 2。 |
damage_taken | 生命值 | 承受的伤害,上限相同(玩家当时的生命值和伤害吸收)。 |
deaths | 次数 | 死亡次数。 |
time_played | 时长 | 在运行中度过的时间。 |
completion_rate | 比率 | runs_completed 除以 runs_started,读取时计算,以百分比写出。 |
current_health | 生命值 | 玩家当前的生命值。只在运行期间有值:从不保存。 |
best_run_kills | 次数 | 单次运行中击杀怪物最多的数量(纪录)。 |
best_run_damage | 生命值 | 单次运行中造成的最高伤害(纪录)。 |
flawless_completions | 次数 | 没有死亡就完成的运行。 |
solo_completions | 次数 | 以一名成员开始并完成的运行。 |
best_time_solo | 时长 | 单人完成的运行的最短用时。 |
health_regained | 生命值 | 真正恢复的生命值,不会超过缺少的部分。 |
rooms_entered | 次数 | 进入过的房间;一次运行中进入同一房间两次只算一次。 |
rooms_cleared | 次数 | 通过 Dungeon Clear Room 清理的房间,对在该房间内的成员计数。 |
chests_opened | 次数 | 打开的战利品箱,每个箱子对生成其战利品的玩家只计一次。 |
waves_cleared | 次数 | 已清理的波次。只有真正的波次才计入:即 Dungeon Mob Spawn 中定义了 waves 的组。 |
单位:生命值以生命点数计(一颗心等于两点),时长默认写成 mm:ss(除非片段另有设置),比率以百分比写出。
计入的内容:
- 只有进行中运行的成员、在其运行的世界内、处于
SURVIVAL或ADVENTURE模式时才计入。处于CREATIVE或SPECTATOR的玩家什么都不计,因此观战的管理员不会登上排行榜榜首。 - 计入哪些怪物由 Dungeon Instance 上的
statsMobScope决定。MARKED_ONLY(默认):只计该次运行生成的怪物(带有dungeon_mob_run标记);分裂史莱姆的碎块从不算击杀。ANY_MOB_IN_RUN_WORLD:还包括运行世界中的其他怪物,例如由其他插件放置的首领。SHARED_WORLD_SLOTS的世界里还有其他运行,因此不允许使用:那里改用MARKED_ONLY,并在加载时输出警告。 - 统计按 artifact 计数。跨多个 artifact 时,总和会累加计数并保留最佳纪录;
artifactId相同的两个 artifact 是同一个文件,只计一次。
可通过占位符、fact Player Dungeon Statistic 读取,也可以用 Dungeon Leaderboard Source 在 GUI 排行榜中排名(需要 GUI 0.20 或更高版本)。
占位符
PlaceholderAPI 占位符使用 %typewriter_dungeon_…% 前缀。关于当前运行的占位符,在玩家不在运行中时返回 0 或空值。例外:%typewriter_dungeon_stat_KEY% 及其 _raw 形式只在运行期间才会被替换,在运行之外会原样显示。只有 dungeon_total_KEY 和 dungeon_inst_ID_KEY 在运行之外也能使用。
| 占位符 | 返回 |
|---|---|
%typewriter_dungeon_remaining% | 玩家所在运行的剩余秒数。 |
%typewriter_dungeon_remaining_formatted% | 剩余时间,格式为 mm:ss。 |
%typewriter_dungeon_players% | 玩家所在运行中的玩家数。 |
%typewriter_dungeon_max% | 玩家所在副本的 maxPartySize。 |
%typewriter_dungeon_list% | 运行中玩家的名字,以逗号分隔。 |
%typewriter_dungeon_player_N_name% | 运行中第 N 位玩家的名字(从 1 开始)。 |
%typewriter_dungeon_player_N_health%, …_maxhealth%, …_healthpercent% | 第 N 位玩家的生命值、最大生命值和百分比。 |
%typewriter_dungeon_player_health_N% | 第 N 位玩家的 Name: health/max。 |
%typewriter_dungeon_lobby_time% | 玩家所在大厅倒计时的剩余秒数。加上 _formatted 得到 mm:ss。 |
%typewriter_dungeon_attempts%, %typewriter_dungeon_completions%, %typewriter_dungeon_best% | 玩家在其所处副本中的运行次数、完成次数和最佳用时。 |
%typewriter_dungeon_total_attempts%, …_total_completions%, …_total_ratio% | 所有副本的总计,以及完成百分比。 |
%typewriter_dungeon_inst_ID_attempts%, …_completions%, …_best% | 条目 id 为 ID 的副本的同样统计。id 不能包含下划线。 |
%typewriter_dungeon_stat_KEY%, …_stat_KEY_raw% | 玩家在所处副本的 artifact 中的任意统计。KEY 是表中的键,例如 %typewriter_dungeon_stat_mob_kills%。_raw 给出该单位下的纯数字(毫秒、生命点数、千分比),没有值时为 0。 |
%typewriter_dungeon_total_KEY%, …_total_KEY_raw% | 所有副本合计的同一项统计。 |
%typewriter_dungeon_inst_ID_KEY%, …_inst_ID_KEY_raw% | 条目 id 为 ID 的副本的同一项统计。 |
current_health 只有在运行期间的 dungeon_stat_current_health 中才有值。时长用片段 content.dungeon_stats.duration_format 书写,缺失的值用 content.dungeon_stats.missing_value 书写。
统计数据来自副本的 artifact 字段所链接的 Dungeon Artifact。Dungeon 自己写入这些数据(运行开始时记录尝试次数,运行完成时记录完成次数和最佳用时)。玩家的最佳用时每个 artifact 只保存一份,覆盖共用该 artifact 的所有副本:如果每个副本都需要各自的最佳用时,请给每个副本单独的 artifact。安装了 MMOProfiles 时,统计数据按 MMOProfiles 档案保存,否则按玩家保存。无需任何配置。
条目
39 个条目,由扩展源码生成。
动作9
- Dungeon Clear RoomDungeon Clear Room
- Dungeon CloseDungeon Close
- Dungeon CompleteDungeon Complete
- Dungeon EnterDungeon Enter
- Dungeon Global MenuDungeon Global Menu
- Dungeon LeaveDungeon Leave
- Dungeon Party MenuDungeon Party Menu
- Dungeon Spawn MobsDungeon Spawn Mobs
- Loot Chest TriggerLoot Chest Trigger
事件6
- On Dungeon CompleteWhen a dungeon run is completed
- On Dungeon Mob DeathWhen a dungeon mob dies
- On Dungeon Mobs ClearedWhen dungeon mobs are cleared
- On Dungeon Room EnterWhen a player enters a dungeon room
- On Dungeon Room LeaveWhen a player leaves a dungeon room
- On Dungeon StartWhen a dungeon run starts
事实4
- Dungeon Mobs AliveDungeon Mobs Alive
- Dungeon StatPlayer Dungeon Statistic
- IndungeonPlayer Inside Dungeon
- Indungeon InstancePlayer Inside Specific Dungeon
受众1
- Dungeon Run AudiencePlayers in a dungeon run
实体1
- Dungeon NPC InstanceDungeon NPC Instance
组1
- Dungeon Run GroupPlayers of a dungeon run
构件4
- Active Dungeon Instance ArtifactActive Dungeon Instance Artifact
- Dungeon ArtifactUnified Dungeon Data Artifact
- Dungeon Party Lobby ArtifactDungeon Party Lobby Artifact
- Dungeon Room TemplateDungeon Room Template
清单13
- Dungeon AffixDungeon Affix
- Dungeon CategoryDungeon Category
- Dungeon Connector TypeDungeon Connector Type
- Dungeon GeneratorDungeon Generator
- Dungeon InstanceDungeon Instance
- Dungeon Leaderboard SourceDungeon Leaderboard Source
- Dungeon Loot ChestDungeon Loot Chest
- Dungeon Loot TableDungeon Loot Table
- Dungeon Mob SpawnDungeon Mob Spawn
- Dungeon RestrictionsDungeon Restrictions
- Dungeon RoomDungeon Room
- Dungeon Room ConfigDungeon Room Config
- Dungeon Room PoolDungeon Room Pool
故障排除
菜单打不开。 缺少 GUI 扩展,或 mainLayoutId 与 layoutPool 中任何布局的 id 都不匹配。请安装 GUI,然后检查 id。
副本没有出现在全局菜单中。 布局中没有 buttonType 设为 DUNGEON_INSTANCE_SLOT 的物品,或者标记放在了 simple、paginated、scrollable 之外的布局类型中。
按钮没有反应,或看起来不像按钮。 buttonType 区分大小写,必须是 DUNGEON_FIND_PARTY、DUNGEON_INFO、DUNGEON_INSTANCE_SLOT、DUNGEON_LOBBY_SLOT、DUNGEON_READY、DUNGEON_LEAVE 或 DUNGEON_AUTO_FILL 之一。队伍菜单中的全局按钮,或反过来,会被忽略。
副本显示为已锁定(Locked)。 分类中该槽位的 criteria 与该玩家不匹配。请用玩家的事实检查它们,或清空列表。
点击副本没有任何输出,也没有菜单打开。 没有队伍菜单服务该副本。请在服务器日志中查找 No dungeon_party_menu serves,然后创建一个 dungeonInstance 为空的菜单,或一个指定了该副本的菜单。
“The dungeon cannot be started on this server.” 该副本的隔离模式在这里无法运行(例如没有 Advanced Slime Paper 的 SLIME_CLONE),或者它无法承载生成型副本。不会回退到其他模式。参见运行与世界隔离。
“The group has N player(s): this dungeon needs X to Y.” 大厅或 enter 命令所用的分组人数超出了 minPartySize 到 maxPartySize 的范围。管理员可以在大厅中使用 force-start。
“All the runs of this dungeon are taken.” 已有 maxSimultaneousInstances 个运行处于活动状态。
玩家到达了一个空的新世界。 templateWorld 与服务器根目录中的世界文件夹不匹配。完全无法加载该世界时,日志会显示 Cannot teleport player … world '…' not found。
玩家不断被踢出运行。 离开运行所在的世界,即使是通过命令,也会把玩家从运行中移除。最后一名玩家离开时,运行结束。
由 Loot Chest Trigger 触发的战利品箱再也不会回来。 默认的 triggerMode 为 ONCE,即每次运行一次。使用 REPEATABLE 可在同一次运行中多次触发。下一次运行会从干净状态开始。
NPC 从不显示。 在生成型副本中,NPC 只会通过该次运行的某个房间的 NPC 标记出现。在固定型副本中,请检查 allowedDungeonIds 和 spawnLocation。参见副本中的实体。
房间里没有怪物,但并没有怪物存活。 上限 maxAliveMobs 可能压住了一部分,而重载会让扩展重新计数。不要用 Dungeon Mobs Alive 来判断房间已被清空:请使用怪物死亡事件。