Skip to content

命令与权限

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]强制开始副本。玩家在副本里时可省略实例 IDdm.command.start
/dm stop [实例ID]强制结束副本。玩家在副本里时可省略实例 IDdm.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.leaderboard
  • dm.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 格

保险箱会按最高档位权限生效。一个玩家同时有 927 时,最终会按 27 格处理。

非命令权限

权限节点用途
dungeon.admin.bypass在副本中绕过方块交互、放置、破坏、桶、展示框等保护限制

这条权限只建议给极少数排查人员。给得太宽,玩家在副本里就能直接改地图、拆机关。

当前版本里容易漏配的权限

按源码看,下面几个权限节点已经参与判断:

  • dm.command.invite
  • dm.command.cdk
  • dm.admin.cdk
  • dungeon.admin.bypass

但当前插件包里的 plugin.yml 还没有把这几项都完整声明出来。

如果你用的是 LuckPerms、PEX 这类权限插件,直接按这里的节点名手动授权就可以,不需要等 plugin.yml 更新后再配。

推荐分权方案

下面这套拆法比较省心,也方便后面继续加人。

普通玩家

建议给:

  • dm.command.join
  • dm.command.leave
  • dm.command.list
  • dm.command.info
  • dm.command.party
  • dm.command.preview
  • dm.command.leaderboard
  • dm.command.vitality
  • dm.command.safebox
  • dm.command.revive

如果你的服有扫荡和中途补人,再额外给:

  • dm.command.sweep
  • dm.command.invite
  • dm.command.cdk

活动 GM

建议在普通玩家基础上增加:

  • dm.command.create
  • dm.command.start
  • dm.command.stop
  • dm.command.tp

这套权限够处理日常开本、拉人、结束卡死实例。

副本策划或编辑

建议给:

  • dm.command.edit
  • dm.command.reload

如果他还要新建模板或导世界,再补:

  • dm.admin

服主或核心运维

建议给:

  • dm.admin
  • dm.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.cdkdm.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 ...

下一步阅读

TQ Minecraft Server Plugin Docs