Skip to content

配置详解 ​

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.enabledbooleanfalsetrue / falseDEBUG 锚日志开关, 打开后控制台输出实例, 队伍, 次数等详细事件
debug.retention-daysint30—审计与调试日志按天保留多久, 到期自动清理

limit 与 commands 全局限流 ​

字段类型默认值取值范围说明
limit.max-instancesint20—全局并发实例世界上限 (含还没人进的补位世界), 达限后新的挑战直接拒绝
commands.modestringblacklistblacklist / whitelist副本内命令过滤模式: 黑名单只拦 commands.rules 列出的命令, 白名单只放行列出的命令
commands.ruleslist<string>[]见说明规则 = 命令根 + 参数模式, 例如 "/tpa player", 玩家名位置统一写 player 占位
escape.blacklistlist<string>[]支持 * 通配符逃逸命令黑名单 (例如 "/tp *", "/back"), 判定优先级最高, 任何放行条目都无法豁免

party 与 isolation 组队社交 ​

字段类型默认值取值范围说明
party.max-sizeint4—一支队伍的人数上限
party.invite-modestringpublicpublic / apply / invite没队伍的玩家向别人发起加入时: public 直接进, apply 提交申请等批准, invite 仅被邀请者可进 (其他值按 invite 处理)
isolation.global-chat-defaultbooleanfalsetrue / false新玩家默认是否全局收听; 玩家可用 /edg globalchat 随时切换

general 与 rewardbox 基础项 ​

字段类型默认值取值范围说明
general.timezonestring""留空或时区名次数限制的默认时区, 留空用服务器时区
rewardbox.enabledbooleantruetrue / false奖励箱总开关; 关闭后副本产出直接进背包, 背包满则落地为可拾取掉落物

script GraalJS 脚本宿主 ​

字段类型默认值取值范围说明
script.enabledbooleantruetrue / false是否随实例启动装载 scripts/<副本ID>.js; 关闭后脚本功能整体停用
script.timeout-msint5000—单段脚本处理器的超时上限 (毫秒), 超时该脚本停用但实例继续
script.fail-on-errorbooleanfalsetrue / false脚本异常时是否判定本局副本失败; false 只停用脚本, 其余流程照常

monitor 运行告警 ​

字段类型默认值取值范围说明
monitor.mspt-p95-msint55> 0 或 <= 0 关闭稳态 MSPT P95 超过该值时控制台告警并写入审计日志
monitor.mspt-p95-enter-msint200> 0 或 <= 0 关闭进入/准备阶段专用 MSPT P95 阈值: 自挑战进入流程标记点 (世界获取/等待/入本完成) 起 65 秒内按此值判定, 期间超阈同样告警并写审计; 其余时间回退 monitor.mspt-p95-ms
monitor.memory-slope-mb-per-minint64> 0 或 <= 0 关闭堆内存斜率 (MB/分钟) 告警阈值
monitor.queue-backlog-secondsint5> 0 或 <= 0 关闭写队列持续积压 (秒) 告警阈值

storage / folia / action ​

字段类型默认值取值范围说明
storage.bstatsstringdisabled目前仅 disabledbStats 本期不接入, 接口就绪后经 CoreLib 统一接入
folia.held-worlds-maxint10—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-namestring示例副本任意文本副本展示名, 出现在列表与消息里
descriptionstring一份用于演示的线性副本配置任意文本副本描述
difficulty-groupstringdefault任意标识难度分组标识
enter.timeout-secondsint1800—单局最长时限 (秒), 到点判本局失败: 触发 DungeonFailEvent (TIMEOUT), 补走失败结算 (审计 [settle] 记 event=fail reason=timeout 与 duration_ms, 结算命令与掉落照常执行), 玩家送回进入前位置, 实例按 fail:timeout 销毁回收; 不触发 DungeonCompleteEvent, 不计入排行榜
enter.prepare-window-secondsint10>= 1全员准备确认窗口 (秒), 超时未确认则挑战作废; 小于 1 时该副本加载失败
enter.wait-channelstringbossbarbossbar / scoreboard / chat世界准备等待的提示通道; 填其他值会让该副本配置加载失败
enter.wait-timeout-secondsint60>= 1世界准备最长等待 (秒), 超时自动作废; 小于 1 时该副本加载失败
pool.max-worldsint5>= 1该副本实例世界上限 (含补位态), 达上限提示等待重试; 小于 1 时该副本加载失败
pool.warm-reservesint2>= 1 (小于 1 按 1)保持热备的补位世界数 = 活跃实例数 + 该值 (不超过 pool.max-worlds); 建议 2–3, 让克隆/挂载提前于下一次进入完成, 避免补位创建与玩家进入尖峰重叠; 缺省按 2

limits 挑战限制 ​

判定顺序固定为 月 > 周 > 日: 任一层不满足或次数耗尽就不可进入, 后面的层级不再判定. count 为 0 表示该层不限次数, 负数会被按 0 处理

字段类型默认值取值范围说明
limits.daily.countint1>= 0每日可挑战次数, 0 不限
limits.daily.time-windowstring"""HH:mm-HH:mm" 或留空每日可挑战时段, 支持跨午夜 (如 "23:00-01:00"); 格式不对时该副本加载失败
limits.weekly.countint0>= 0每周可挑战次数
limits.weekly.dayslist<int>[]1–7 (1 = 周一)允许挑战的周几, 空列表不拦; 写错条目时该副本加载失败
limits.monthly.countint0>= 0每月可挑战次数
limits.monthly.weekslist<int>[]1–6允许挑战的月周次 (周一起始), 空列表不拦; 写错条目时该副本加载失败
limits.cooldown-secondsint0>= 0每次进入后的冷却秒数, 负数按 0 处理

world 与 difficulty ​

字段类型默认值取值范围说明
world.simulation-distanceint6—每个实例世界独立生效的仿真距离
world.entity-limitint0—实例世界实体上限, 0 不限
difficulty.<档名>.mob-multiplierdouble1.0 (normal)>= 0怪物属性倍率, 负数按 0 处理
difficulty.<档名>.drop-multiplierdouble1.0 (normal)>= 0掉落数量倍率, 负数按 0 处理
difficulty.<档名>.respawn-countint3 (normal)—玩家剩余重生次数, 用尽转入观战

模板默认提供 normal 与 hard 两档 (hard 为 1.5 / 1.2 / 1), 玩家在进入流程的难度面板里选择; 你把 difficulty 段清空时按默认两档处理, 也可以自行增删档名

score 评分与 drop 掉落 ​

字段类型默认值取值范围说明
score.damage-weightdouble1.0—伤害贡献权重
score.kill-weightdouble1.0—击杀贡献权重
score.heal-weightdouble1.0—治疗贡献权重
score.death-weightdouble1.0—死亡贡献权重
score.defense-weightdouble1.0—承伤/防守贡献权重
score.maxdouble100.0<= 0 时回退默认评分满分 (完成时间权重暂不计入); 填 0 或负数会静默回退为默认 100
drop.levelsmapcommon: 1, rare: 3, epic: 5整数, 小于 1 按 1掉落等级权重, 仅评分贡献分配模式下参与分配
drop.default-modestringfree见 mode-allowed默认掉落分配模式, 填了无效模式会回退为 free
drop.mode-allowedlist<string>[free, roll, killer, score, share]五种模式的子集队长在分配模式面板里可选的模式集合; 无效条目被剔除, 全部无效则用默认五种

五种分配模式: free 自由拾取暂存, roll 自动 ROLL 分配, killer 归击杀者, score 按评分贡献分配, share 全队平分; 你在 drop.mode-allowed 里决定面板上开放哪几种

其余副本级配置 ​

字段类型默认值取值范围说明
commands.allowlist<string>[]同全局 commands.rules 写法本副本额外放行的命令; 可豁免常规管控, 不可豁免逃逸黑名单
interaction.containersbooleantruetrue / false副本内是否允许开箱子等容器交互
interaction.hoppersbooleanfalsetrue / false是否允许漏斗行为, 默认关闭
timer.messageslist<int>[300, 60, 10]秒数列表剩余时间倒计时提醒档位, 触发时给玩家发"剩余 N 秒"
settlement.commandslist<string>[]控制台命令行通关结算时逐条执行的命令, 可用 %player% 占位, 调 EmakiItem/EmakiLevel 发奖
leaderboard.max-entriesint100< 1 回退 100排行榜保留条数, 超限淘汰最差记录; 填 0 或负数会回退默认 100

奖励箱界面 gui/rewardbox.yml ​

这个界面的布局结构固定, 不可配置, 只开放两个数值:

字段类型默认值取值范围说明
default-pagesint1—玩家没有更高页数权限时的基础可见页数
capacity-slotsint135—奖励箱总容量 (物品格总数), 达到即视为箱满; 满箱规则见 挑战与奖励

流程文件 world/<副本ID>/flow.yml ​

这个文件承载房间, 波次, 门禁, 选项等全部流程模块, 缺失时插件会自动生成; 完整结构见 流程与触发器