命令与权限
DungeonMaster 的主命令是:
text
/dm常见别名:
text
/dungeon
/dungeonmaster这一页主要给服主和管理看。你可以先用它确认三件事:
- 玩家平时会用到哪些命令
- 管理、策划、活动 GM 的权限拆分
- 源码里到底实际用了哪些权限节点
一页看懂
玩家平时最常用的是这几类:
- 进出副本:
/dm join、/dm leave - 看副本信息:
/dm list、/dm info、/dm preview - 组队:
/dm party ... - 排行与活力:
/dm lb、/dm vitality - 保险箱和复活:
/dm safebox、/dm revive
管理侧最常用的是这几类:
- 重载与编辑:
/dm reload、/dm edit - 建模板和导世界:
/dm template create、/dm world ... - 实例控制:
/dm create、/dm start、/dm stop、/dm tp - 运维排查:
/dm admin ...、/dm script ...
玩家常用命令
| 命令 | 说明 | 权限 |
|---|---|---|
/dm help | 查看帮助 | 无 |
/dm join <副本ID> [参数:值] ... | 进入指定副本 | dm.command.join |
/dm leave | 离开当前副本 | dm.command.leave |
/dm list | 查看已加载的副本模板 | dm.command.list |
/dm info [副本ID] | 查看某个副本信息,或查看自己当前所在实例信息 | dm.command.info |
/dm preview <副本ID> | 打开副本预览和掉落预览 | dm.command.preview |
/dm sweep <副本ID> [次数] | 对已启用扫荡的副本执行扫荡 | dm.command.sweep |
/dm vitality | 查看自己的活力值 | dm.command.vitality |
/dm safebox | 打开保险箱 | dm.command.safebox |
/dm revive | 使用复活道具或复活功能 | dm.command.revive |
/dm leaderboard <副本ID> [页码] | 查看某个副本排行榜 | dm.command.leaderboard |
/dm lb <副本ID> [页码] | leaderboard 的简写 | dm.command.leaderboard |
几个使用细节:
/dm join会自动识别队伍。如果玩家已有队伍,且他是队长,会按整队一起进入。/dm sweep只有在该副本启用了扫荡模块后才会生效。/dm safebox只能在副本外使用。/dm info和/dm list也可以从控制台执行,其他大部分玩家命令要求执行者必须是玩家。
/dm join 参数写法
最基础的进入方式:
text
/dm join shadow_crypt也可以在进入时附带参数:
text
/dm join shadow_crypt 难度:3
/dm join shadow_crypt 模式:竞速
/dm join shadow_crypt @职业:牧师
/dm join shadow_crypt @门票已核验:true参数规则:
- 普通
键:值会作为副本级启动参数 @键:值会作为玩家级启动参数- 参数值会自动按整数、小数、布尔、文本识别
这套写法同样适用于:
text
/dm admin join <玩家> <副本ID> [参数:值] ...组队与局内邀请
组队系统统一走:
text
/dm party <子命令>| 命令 | 说明 | 权限 |
|---|---|---|
/dm party gui | 打开组队界面 | dm.command.party |
/dm party create | 创建队伍 | dm.command.party |
/dm party invite <玩家> | 邀请玩家进队 | dm.command.party |
/dm party accept [玩家] | 接受邀请 | dm.command.party |
/dm party decline [玩家] | 拒绝邀请 | dm.command.party |
/dm party leave | 离开队伍 | dm.command.party |
/dm party kick <玩家> | 踢出队员 | dm.command.party |
/dm party list | 查看队伍成员 | dm.command.party |
/dm party disband | 解散队伍 | dm.command.party |
局内补人还有两种方式:
方式 1:运行中的副本直接邀请
text
/dm invite <玩家名>这条命令适合队伍已经开进副本,中途需要补人。
使用条件:
- 执行者在副本里
- 副本状态已经是运行中
- 执行者是队长
- 目标玩家在线,且当前不在别的副本里
- 当前实例人数没有超过上限
对应权限:
dm.command.invite
接受方式:
text
/dm party accept [队长名]当前版本里,局内邀请发给玩家的聊天提示可能还会显示 /dm accept。实际请使用 /dm party accept。
方式 2:CDK 进本
玩家使用:
text
/dm cdk <CDK码>管理员或队长在运行中的副本里生成:
text
/dm cdk generate [过期分钟]对应权限:
- 玩家使用 CDK:
dm.command.cdk - 生成 CDK:
dm.admin.cdk - 如果玩家本身有
dm.admin,也能直接使用生成命令
CDK 适合临时拉人、补位、跨频道发放入场资格。
管理员与运维命令
| 命令 | 说明 | 权限 |
|---|---|---|
/dm create <副本ID> | 创建一个实例,但不强制让玩家进入 | dm.command.create |
/dm start [实例ID] | 强制开始副本。玩家在副本里时可省略实例 ID | dm.command.start |
/dm stop [实例ID] | 强制结束副本。玩家在副本里时可省略实例 ID | dm.command.stop |
/dm tp <实例ID> | 传送到指定实例世界 | dm.command.tp |
/dm reload | 重载配置、模板、消息、组队、活力、排行榜重置等 | dm.command.reload |
/dm edit <副本ID> | 进入编辑模式 | dm.command.edit |
/dm edit save | 保存并退出编辑模式 | dm.command.edit |
/dm edit exit | 放弃修改并退出编辑模式 | dm.command.edit |
/dm template create <副本ID> [世界模板名] | 快速生成一套副本模板目录 | dm.admin |
/dm world import <服务器世界名> [模板名] | 导入世界模板 | dm.admin |
/dm world scan | 扫描并注册世界模板 | dm.admin |
/dm world list | 查看世界模板列表 | dm.admin |
/dm delete <副本ID> | 删除副本模板 | dm.admin |
/dm script <玩家> <脚本> | 在指定玩家所在副本中执行一段脚本 | dm.admin |
/dm script 重点说明
这条命令不只是调试命令。
它更重要的价值,是把外部系统和副本内脚本真正接起来。
它的作用很直接:把你输入的一段 DM 脚本,塞进指定玩家当前所在的副本实例里,当场执行。
常见用途:
- 把道具插件、菜单插件、NPC 插件、任务插件、奖励插件接进副本玩法
- 让控制台命令直接修改当前实例变量
- 让外部系统主动触发刷怪、开门、提示、Debuff、结算这类副本逻辑
- 做限时解谜、道具解锁、机关解除、剧情推进、特殊技能这类玩法
- 在线排查、补偿处理、应急修复
基础格式:
text
/dm script <玩家名> <脚本>源码里的实际规则:
- 需要权限
dm.admin - 可以由玩家执行,也可以由控制台执行
- 目标玩家必须在线
- 目标玩家必须正在某个副本实例里
- 玩家名用的是精确匹配,写错一个字符都找不到
- 脚本会在这个玩家当前所在的副本上下文里执行
这意味着:
@player指向的就是你写在命令里的那个玩家- 副本变量、玩家变量、当前实例状态,都会按那个副本的实时数据来取
- 你在事件脚本里能调用的大部分动作和函数,这里同样能直接调
玩法接入价值
很多外部插件本身只会做三件事:
- 给玩家一个道具
- 监听一次点击、右键、击杀、菜单选择
- 执行一条命令
真正复杂的副本逻辑,还是应该留在 DM 自己的脚本里。
/dm script 刚好就是中间这座桥。
你可以把外部插件的触发结果,转成一条 dm script 命令,再让 DM 在玩家当前所在的副本里继续往下执行。
这条链路很适合这些场景:
- 外部道具解除某个副本状态
- 菜单按钮改变当前阶段变量
- NPC 对话后直接推进副本流程
- 任务完成时,给当前副本开门或刷怪
- 活动插件触发后,给本内全队挂状态或播提示
服主角度可以直接这样理解:
- 外部插件负责“什么时候触发”
dm script负责“触发后把副本逻辑接进去”- 具体效果、变量、判断、等待、后续流程,仍然交给 DM 脚本维护
空格与换行写法
命令里有两个特殊替代符:
^会还原成空格|会还原成换行
这是为了方便你在聊天栏或控制台里输入多行脚本。
例如源码帮助里给的示例:
text
/dm script Steve 货币.给予("金币",^50)|消息.发送("OK")实际执行时会变成:
text
货币.给予("金币", 50)
消息.发送("OK")最常见的几种写法
给指定玩家发一条测试消息:
text
/dm script Steve 消息.发送("&a脚本测试成功")给指定玩家补一段奖励:
text
/dm script Steve 货币.给予("金币",^500)|消息.发送("&e已补发500金币")手动生成一组怪:
text
/dm script Steve 怪物组.生成("Boss二阶段")手动开门:
text
/dm script Steve 障碍物.关闭("Boss房大门")给外部插件当玩法入口:
text
[console]dm script %p 副本.设置变量("Boss开门",^true)|障碍物.关闭("Boss房大门")带判断的多行脚本:
text
/dm script Steve if^true^{|消息.全体("&a这是一条多行测试脚本")|怪物组.生成("第一波")|}玩法示例:外部道具解除暴雪
这类玩法就很适合用 /dm script。
比如副本第一阶段开启暴雪,全体玩家持续吃减速和失明。玩家拿到一个外部道具后,右键触发控制台命令,把副本里的暴雪状态关掉。
阶段脚本可以这样写:
yaml
第一阶段:
显示名称: '&e第一阶段'
类型: 顺序
完成条件: "无法通关"
开始脚本: |
副本.设置变量("暴雪开启", 1)
开始玩家脚本: |
效果.药水("slowness", 99999, 5)
效果.药水("blindness", 99999, 100)
for i in 1..10000 {
状态 = 副本.读取变量("暴雪开启") * 1
if (状态 == 0) {
效果.药水("slowness", 0, 0)
效果.药水("blindness", 0, 0)
break
}
if (状态 == 1) {
效果.药水("slowness", 99999, 5)
效果.药水("blindness", 99999, 100)
}
流程.等待(100)
}
通关玩家脚本: |
效果.药水("slowness", 0, 0)
效果.药水("blindness", 0, 0)外部道具插件触发时,可以直接执行:
text
[console]tell %p &b[暴雪]&f 成功使用道具,暴雪已解除
[console]dm script %p 副本.设置变量("暴雪开启",^0)
[console]effect %p clear如果你想做成“短暂解除,100 tick 后重新恢复”,可以写成:
text
[console]dm script %p 副本.设置变量("暴雪开启",^0)|流程.等待(100)|副本.设置变量("暴雪开启",^1)这里有一个很重要的点:
- 阶段循环里读的是
暴雪开启 - 外部命令里改的也必须是
暴雪开启
如果阶段脚本读的是 暴雪开启,外部命令却去改 停止暴雪,那循环不会停,效果也不会按预期解除。
它到底是在谁的上下文里跑
这一点很关键。
/dm script 不是在命令执行者自己的上下文里跑,也不是在一个空白环境里跑。它会拿到目标玩家当前所在实例的脚本执行器,再把上下文里的玩家切成目标玩家本身。
服主可以直接这样理解:
- 你对谁执行,脚本里的玩家相关内容就按谁来算
- 你对谁执行,脚本里的副本相关内容就按那个人当前所在的本来算
- 如果这个玩家不在副本里,这条命令就不会执行
所以它既适合做现场调试,也很适合拿来接玩法。
比如某个玩家卡在副本里,你可以直接对这个玩家执行:
text
/dm script Steve 消息.发送("&e开始排查")|消息.全体("&7已手动触发一次调试脚本")使用时要注意什么
- 这条命令执行的是正式脚本,不是预演。发奖、扣物、传送、结束副本这类动作都会真实生效。
- 如果它是从外部插件触发的,那就等于你的外部插件已经拿到了副本内脚本入口,玩法能力会一下子大很多。
- 如果你是拿它做测试,建议先从
消息.发送(...)这种无副作用脚本开始。 - 玩家名用的是精确匹配,别用简称,也别用模糊名。
- 如果脚本比较长,优先拆成多行,用
|写清楚,排错轻松很多。 - 如果脚本里要写带空格的文本或表达式,记得把空格换成
^。 - 这条命令更适合临时排查和人工处理。稳定流程还是应该回到模板脚本里维护。
什么时候适合用它
适合:
- 把外部插件能力接进 DM 副本
- 用道具、菜单、NPC、任务去驱动副本机制
- 本已经开着,想立刻验证一段脚本
- 个别玩家状态错了,需要人工补偿
- 想确认某个动作在真实副本里会不会报错
- 想快速判断卡流程是不是脚本条件没满足
不建议拿它长期替代正常配置:
- 经常靠手输命令发奖励
- 经常靠手输命令推进阶段
- 把固定流程做成管理手动操作
这些情况后面都会变成维护负担,最好还是回到模板和事件脚本里整理。
另外还有一条内部命令:
text
/dm callback <回调ID>这条命令给可点击消息和编辑器内部回调用,平时不用手动输入。
/dm admin 子命令
这组命令主要给服主、运维、问题排查人员使用。
| 命令 | 说明 | 权限 |
|---|---|---|
/dm admin setvitality <玩家> <值> | 直接设置活力值 | dm.admin |
/dm admin addvitality <玩家> <值> | 增加活力值 | dm.admin |
/dm admin takevitality <玩家> <值> | 扣除活力值 | dm.admin |
/dm admin resetvitality <玩家> | 把玩家活力值回满 | dm.admin |
/dm admin vitality <玩家> | 查看指定玩家活力值 | dm.admin |
/dm admin resetcount <玩家> [副本ID] | 重置每日进入次数 | dm.admin |
/dm admin join <玩家> <副本ID> [参数] | 强制让指定玩家或其整队进入副本 | dm.admin |
/dm admin sweep <玩家> <副本ID> [次数] | 强制给玩家执行扫荡 | dm.admin |
/dm admin instances | 查看所有运行中的实例 | dm.admin |
/dm admin worldpool | 查看世界池完整状态 | dm.admin |
/dm admin debug | 开关调试模式 | dm.admin |
/dm admin cleanworlds | 清理孤立副本世界 | dm.admin |
/dm admin perf | 查看性能观测状态 | dm.admin |
排行榜管理
text
/dm lb reset
/dm lb reset <副本ID>
/dm lb reset <副本ID> <玩家名或UUID>这几条命令也要求:
dm.command.leaderboarddm.admin
权限节点总表
源码里实际使用到的命令权限如下。
玩家基础权限
| 权限节点 | 用途 |
|---|---|
dm.command.join | 进入副本 |
dm.command.leave | 离开副本 |
dm.command.list | 查看副本列表 |
dm.command.info | 查看副本信息 |
dm.command.party | 使用整套组队命令 |
dm.command.preview | 预览副本 |
dm.command.sweep | 扫荡 |
dm.command.leaderboard | 查看排行榜 |
dm.command.vitality | 查看活力值 |
dm.command.safebox | 打开保险箱 |
dm.command.revive | 使用复活功能 |
dm.command.invite | 局内邀请玩家进本 |
dm.command.cdk | 使用 CDK 进入副本 |
管理权限
| 权限节点 | 用途 |
|---|---|
dm.command.create | 创建实例 |
dm.command.start | 强制开始副本 |
dm.command.stop | 强制结束副本 |
dm.command.tp | 传送到实例 |
dm.command.reload | 重载 |
dm.command.edit | 编辑模式 |
dm.admin.cdk | 在副本中生成 CDK |
dm.admin | 管理总权限,同时绕过大多数 dm.command.* 检查 |
保险箱相关权限
| 权限节点 | 用途 |
|---|---|
dm.command.safebox | 打开保险箱界面 |
dm.safebox.slots.1 | 保险箱可保护 1 格 |
dm.safebox.slots.2 | 保险箱可保护 2 格 |
dm.safebox.slots.3 | 保险箱可保护 3 格 |
dm.safebox.slots.4 | 保险箱可保护 4 格 |
dm.safebox.slots.6 | 保险箱可保护 6 格 |
dm.safebox.slots.9 | 保险箱可保护 9 格 |
dm.safebox.slots.18 | 保险箱可保护 18 格 |
dm.safebox.slots.27 | 保险箱可保护 27 格 |
dm.safebox.slots.36 | 保险箱可保护 36 格 |
dm.safebox.slots.45 | 保险箱可保护 45 格 |
dm.safebox.slots.54 | 保险箱可保护 54 格 |
保险箱会按最高档位权限生效。一个玩家同时有 9 和 27 时,最终会按 27 格处理。
非命令权限
| 权限节点 | 用途 |
|---|---|
dungeon.admin.bypass | 在副本中绕过方块交互、放置、破坏、桶、展示框等保护限制 |
这条权限只建议给极少数排查人员。给得太宽,玩家在副本里就能直接改地图、拆机关。
当前版本里容易漏配的权限
按源码看,下面几个权限节点已经参与判断:
dm.command.invitedm.command.cdkdm.admin.cdkdungeon.admin.bypass
但当前插件包里的 plugin.yml 还没有把这几项都完整声明出来。
如果你用的是 LuckPerms、PEX 这类权限插件,直接按这里的节点名手动授权就可以,不需要等 plugin.yml 更新后再配。
推荐分权方案
下面这套拆法比较省心,也方便后面继续加人。
普通玩家
建议给:
dm.command.joindm.command.leavedm.command.listdm.command.infodm.command.partydm.command.previewdm.command.leaderboarddm.command.vitalitydm.command.safeboxdm.command.revive
如果你的服有扫荡和中途补人,再额外给:
dm.command.sweepdm.command.invitedm.command.cdk
活动 GM
建议在普通玩家基础上增加:
dm.command.createdm.command.startdm.command.stopdm.command.tp
这套权限够处理日常开本、拉人、结束卡死实例。
副本策划或编辑
建议给:
dm.command.editdm.command.reload
如果他还要新建模板或导世界,再补:
dm.admin
服主或核心运维
建议给:
dm.admindm.admin.cdk
只有在确实需要局内排查地形或保护问题时,再临时补:
dungeon.admin.bypass
LuckPerms 示例
如果你想快速上手,可以参考下面这几条:
text
/lp group default permission set dm.command.join true
/lp group default permission set dm.command.leave true
/lp group default permission set dm.command.party true
/lp group default permission set dm.command.preview true
/lp group default permission set dm.command.leaderboard true给活动 GM:
text
/lp group dm_gm permission set dm.command.create true
/lp group dm_gm permission set dm.command.start true
/lp group dm_gm permission set dm.command.stop true
/lp group dm_gm permission set dm.command.tp true给服主:
text
/lp group admin permission set dm.admin true
/lp group admin permission set dm.admin.cdk true常见问题
玩家明明能看到命令,却提示无权限
先检查这几项:
- 权限插件里是否真的给了对应节点
- 玩家是否继承到了上级组
- 是否把命令给了默认组,但把实际权限只给了管理组
- 服里是否还有别的插件改了命令别名或拦截了命令
/dm invite 的接受方式
让对方输入:
text
/dm party accept [队长名]如果对方已经在别的副本里、当前实例人数已满,或者副本已经结束,这个邀请就接不进来。
/dm cdk generate 的使用条件
这条命令同时要求:
- 玩家有
dm.admin.cdk或dm.admin - 玩家当前人在副本里
- 副本状态是运行中
- 服务器启用了 CDK 系统
/dm script 没反应或者执行失败
先按这个顺序看:
- 执行者有没有
dm.admin - 目标玩家名是不是写的完整名字
- 目标玩家是不是在线
- 目标玩家是不是正在副本里
- 脚本里有没有把空格写成
^ - 多行脚本有没有用
|拆开
如果命令已经提示 脚本执行失败,那就是脚本本身报错了,不是权限问题。
/dm reload 的生效范围
reload 主要影响配置、模板和全局组件。
已经在运行中的实例,通常不会自动把所有流程状态重新算一遍。改了关键配置后,建议重新开一个新实例再测。
控制台与玩家命令范围
不能。/dm join、/dm leave、/dm party、/dm preview、/dm revive、/dm invite、/dm cdk 这些都要求执行者是玩家。
控制台更适合执行:
/dm list/dm info <副本ID>/dm reload/dm admin .../dm world .../dm template create ...