简体中文
配置详解
EmakiDungeon 一共有三份配置: 全局主配置 plugins/EmakiDungeon/config.yml, 每个副本自己的 plugins/EmakiDungeon/world/<副本ID>/config.yml, 以及奖励箱界面 plugins/EmakiDungeon/gui/rewardbox.yml. 你改完执行 /edg admin reload 即可生效 (这条命令由有 emakidungeon.admin 权限的玩家执行), 运行中的实例不受影响, 只对之后新建的实例生效
文件顶部的 version 与 language 由资源同步流程维护, 你不要手动改. 副本级配置没有 schema 兼容层, 加载期会按当前结构严格校验; 下表"取值范围"列里标注了源码校验的键, 未标注 — 的键都以源码校验为准, 校验分两种:
- 直接报错 (该副本被跳过, 控制台报"副本配置非法"):
pool.max-worlds,enter.prepare-window-seconds,enter.wait-timeout-seconds,enter.wait-channel,limits.daily.time-window格式,limits里的days/weeks条目 - 静默回退: 插件把非法值剔除, 夹到边界或按默认值继续跑 (见各键说明)
全局主配置 config.yml
debug 调试日志
| 字段 | 类型 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|
debug.enabled | boolean | false | true / false | DEBUG 锚日志开关, 打开后控制台输出实例, 队伍, 次数等详细事件 |
debug.retention-days | int | 30 | — | 审计与调试日志按天保留多久, 到期自动清理 |
limit 与 commands 全局限流
| 字段 | 类型 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|
limit.max-instances | int | 20 | — | 全局并发实例世界上限 (含还没人进的补位世界), 达限后新的挑战直接拒绝 |
commands.mode | string | blacklist | blacklist / whitelist | 副本内命令过滤模式: 黑名单只拦 commands.rules 列出的命令, 白名单只放行列出的命令 |
commands.rules | list<string> | [] | 见说明 | 规则 = 命令根 + 参数模式, 例如 "/tpa player", 玩家名位置统一写 player 占位 |
escape.blacklist | list<string> | [] | 支持 * 通配符 | 逃逸命令黑名单 (例如 "/tp *", "/back"), 判定优先级最高, 任何放行条目都无法豁免 |
party 与 isolation 组队社交
| 字段 | 类型 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|
party.max-size | int | 4 | — | 一支队伍的人数上限 |
party.invite-mode | string | public | public / apply / invite | 没队伍的玩家向别人发起加入时: public 直接进, apply 提交申请等批准, invite 仅被邀请者可进 (其他值按 invite 处理) |
isolation.global-chat-default | boolean | false | true / false | 新玩家默认是否全局收听; 玩家可用 /edg globalchat 随时切换 |
general 与 rewardbox 基础项
| 字段 | 类型 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|
general.timezone | string | "" | 留空或时区名 | 次数限制的默认时区, 留空用服务器时区 |
rewardbox.enabled | boolean | true | true / false | 奖励箱总开关; 关闭后副本产出直接进背包, 背包满则落地为可拾取掉落物 |
script GraalJS 脚本宿主
| 字段 | 类型 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|
script.enabled | boolean | true | true / false | 是否随实例启动装载 scripts/<副本ID>.js; 关闭后脚本功能整体停用 |
script.timeout-ms | int | 5000 | — | 单段脚本处理器的超时上限 (毫秒), 超时该脚本停用但实例继续 |
script.fail-on-error | boolean | false | true / false | 脚本异常时是否判定本局副本失败; false 只停用脚本, 其余流程照常 |
monitor 运行告警
| 字段 | 类型 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|
monitor.mspt-p95-ms | int | 55 | > 0 或 <= 0 关闭 | 稳态 MSPT P95 超过该值时控制台告警并写入审计日志 |
monitor.mspt-p95-enter-ms | int | 200 | > 0 或 <= 0 关闭 | 进入/准备阶段专用 MSPT P95 阈值: 自挑战进入流程标记点 (世界获取/等待/入本完成) 起 65 秒内按此值判定, 期间超阈同样告警并写审计; 其余时间回退 monitor.mspt-p95-ms |
monitor.memory-slope-mb-per-min | int | 64 | > 0 或 <= 0 关闭 | 堆内存斜率 (MB/分钟) 告警阈值 |
monitor.queue-backlog-seconds | int | 5 | > 0 或 <= 0 关闭 | 写队列持续积压 (秒) 告警阈值 |
storage / folia / action
| 字段 | 类型 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|
storage.bstats | string | disabled | 目前仅 disabled | bStats 本期不接入, 接口就绪后经 CoreLib 统一接入 |
folia.held-worlds-max | int | 10 | — | Folia 上挂起世界的全局上限, 达限时按满载拒绝新挑战, 重启回收 |
action.<段id> | map | {} | 动作管道行列表 | 副本生命周期动作, 段 id 即键名, 值为 CoreLib 动作管道配置 |
action 支持的段 id 共 11 个: dungeon_enter, dungeon_exit, dungeon_room_clear, dungeon_gate_open, dungeon_wave_start, dungeon_score, dungeon_complete, dungeon_fail, dungeon_reward, dungeon_ending, dungeon_destroy. 写法与 CoreLib 动作系统 相同, 例如:
yaml
action:
dungeon_enter:
- 'self | send_message text="<green>进入副本</green>"'副本级配置 world/<副本ID>/config.yml
此文件缺失时, 插件会在启动或重载时按内置模板自动生成; 已存在的文件不会被覆盖
元数据与进入
| 字段 | 类型 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|
display-name | string | 示例副本 | 任意文本 | 副本展示名, 出现在列表与消息里 |
description | string | 一份用于演示的线性副本配置 | 任意文本 | 副本描述 |
difficulty-group | string | default | 任意标识 | 难度分组标识 |
enter.timeout-seconds | int | 1800 | — | 单局最长时限 (秒), 到点判本局失败: 触发 DungeonFailEvent (TIMEOUT), 补走失败结算 (审计 [settle] 记 event=fail reason=timeout 与 duration_ms, 结算命令与掉落照常执行), 玩家送回进入前位置, 实例按 fail:timeout 销毁回收; 不触发 DungeonCompleteEvent, 不计入排行榜 |
enter.prepare-window-seconds | int | 10 | >= 1 | 全员准备确认窗口 (秒), 超时未确认则挑战作废; 小于 1 时该副本加载失败 |
enter.wait-channel | string | bossbar | bossbar / scoreboard / chat | 世界准备等待的提示通道; 填其他值会让该副本配置加载失败 |
enter.wait-timeout-seconds | int | 60 | >= 1 | 世界准备最长等待 (秒), 超时自动作废; 小于 1 时该副本加载失败 |
pool.max-worlds | int | 5 | >= 1 | 该副本实例世界上限 (含补位态), 达上限提示等待重试; 小于 1 时该副本加载失败 |
pool.warm-reserves | int | 2 | >= 1 (小于 1 按 1) | 保持热备的补位世界数 = 活跃实例数 + 该值 (不超过 pool.max-worlds); 建议 2–3, 让克隆/挂载提前于下一次进入完成, 避免补位创建与玩家进入尖峰重叠; 缺省按 2 |
limits 挑战限制
判定顺序固定为 月 > 周 > 日: 任一层不满足或次数耗尽就不可进入, 后面的层级不再判定. count 为 0 表示该层不限次数, 负数会被按 0 处理
| 字段 | 类型 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|
limits.daily.count | int | 1 | >= 0 | 每日可挑战次数, 0 不限 |
limits.daily.time-window | string | "" | "HH:mm-HH:mm" 或留空 | 每日可挑战时段, 支持跨午夜 (如 "23:00-01:00"); 格式不对时该副本加载失败 |
limits.weekly.count | int | 0 | >= 0 | 每周可挑战次数 |
limits.weekly.days | list<int> | [] | 1–7 (1 = 周一) | 允许挑战的周几, 空列表不拦; 写错条目时该副本加载失败 |
limits.monthly.count | int | 0 | >= 0 | 每月可挑战次数 |
limits.monthly.weeks | list<int> | [] | 1–6 | 允许挑战的月周次 (周一起始), 空列表不拦; 写错条目时该副本加载失败 |
limits.cooldown-seconds | int | 0 | >= 0 | 每次进入后的冷却秒数, 负数按 0 处理 |
world 与 difficulty
| 字段 | 类型 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|
world.simulation-distance | int | 6 | — | 每个实例世界独立生效的仿真距离 |
world.entity-limit | int | 0 | — | 实例世界实体上限, 0 不限 |
difficulty.<档名>.mob-multiplier | double | 1.0 (normal) | >= 0 | 怪物属性倍率, 负数按 0 处理 |
difficulty.<档名>.drop-multiplier | double | 1.0 (normal) | >= 0 | 掉落数量倍率, 负数按 0 处理 |
difficulty.<档名>.respawn-count | int | 3 (normal) | — | 玩家剩余重生次数, 用尽转入观战 |
模板默认提供 normal 与 hard 两档 (hard 为 1.5 / 1.2 / 1), 玩家在进入流程的难度面板里选择; 你把 difficulty 段清空时按默认两档处理, 也可以自行增删档名
score 评分与 drop 掉落
| 字段 | 类型 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|
score.damage-weight | double | 1.0 | — | 伤害贡献权重 |
score.kill-weight | double | 1.0 | — | 击杀贡献权重 |
score.heal-weight | double | 1.0 | — | 治疗贡献权重 |
score.death-weight | double | 1.0 | — | 死亡贡献权重 |
score.defense-weight | double | 1.0 | — | 承伤/防守贡献权重 |
score.max | double | 100.0 | <= 0 时回退默认 | 评分满分 (完成时间权重暂不计入); 填 0 或负数会静默回退为默认 100 |
drop.levels | map | common: 1, rare: 3, epic: 5 | 整数, 小于 1 按 1 | 掉落等级权重, 仅评分贡献分配模式下参与分配 |
drop.default-mode | string | free | 见 mode-allowed | 默认掉落分配模式, 填了无效模式会回退为 free |
drop.mode-allowed | list<string> | [free, roll, killer, score, share] | 五种模式的子集 | 队长在分配模式面板里可选的模式集合; 无效条目被剔除, 全部无效则用默认五种 |
五种分配模式: free 自由拾取暂存, roll 自动 ROLL 分配, killer 归击杀者, score 按评分贡献分配, share 全队平分; 你在 drop.mode-allowed 里决定面板上开放哪几种
其余副本级配置
| 字段 | 类型 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|
commands.allow | list<string> | [] | 同全局 commands.rules 写法 | 本副本额外放行的命令; 可豁免常规管控, 不可豁免逃逸黑名单 |
interaction.containers | boolean | true | true / false | 副本内是否允许开箱子等容器交互 |
interaction.hoppers | boolean | false | true / false | 是否允许漏斗行为, 默认关闭 |
timer.messages | list<int> | [300, 60, 10] | 秒数列表 | 剩余时间倒计时提醒档位, 触发时给玩家发"剩余 N 秒" |
settlement.commands | list<string> | [] | 控制台命令行 | 通关结算时逐条执行的命令, 可用 %player% 占位, 调 EmakiItem/EmakiLevel 发奖 |
leaderboard.max-entries | int | 100 | < 1 回退 100 | 排行榜保留条数, 超限淘汰最差记录; 填 0 或负数会回退默认 100 |
奖励箱界面 gui/rewardbox.yml
这个界面的布局结构固定, 不可配置, 只开放两个数值:
| 字段 | 类型 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|
default-pages | int | 1 | — | 玩家没有更高页数权限时的基础可见页数 |
capacity-slots | int | 135 | — | 奖励箱总容量 (物品格总数), 达到即视为箱满; 满箱规则见 挑战与奖励 |
流程文件 world/<副本ID>/flow.yml
这个文件承载房间, 波次, 门禁, 选项等全部流程模块, 缺失时插件会自动生成; 完整结构见 流程与触发器