Skip to content

语法与表达式

这一页讲的是 DM 脚本语言本身的写法。它支持的内容比“几行动作”要多得多,足够写完整的副本机制。

基本写法

  • 一行通常写一件事。
  • 多行脚本通常放在 YAML 的 | 块里。
  • 文本可以用双引号,也可以用单引号。
  • 代码块用 {} 包起来。
  • 注释支持 #//
text
# 这一行不会执行
// 这一行也不会执行
消息.全体("&e副本开始")

值和表达式

当前常见值类型包括:

  • 数字
  • 布尔值
  • 文本
  • 列表
  • 函数返回值
  • 对象.方法() 返回值

常见表达式写法:

text
阶段名 = "第一阶段"
击杀数 = 10
Boss已开启 = true
玩家列表 = 副本.玩家列表()
当前时间 = 时间戳()

赋值与复合赋值

普通赋值:

text
击杀数 = 0
奖励倍率 = 1.0

复合赋值:

text
击杀数 += 1
奖励倍率 *= 1.2
剩余次数 -= 1

当前版本支持 +=-=*=

判断分支

text
if 击杀数 >= 10 {
    消息.全体("&a击杀达标")
}

多分支:

text
if 难度 == "普通" {
    消息.全体("&e普通难度")
} else if 难度 == "困难" {
    消息.全体("&c困难难度")
} else {
    消息.全体("&7未设置难度")
}

常见运算符:

类型写法
比较== != > >= < <=
逻辑&& `
计算+ - * / %

概率分支

text
chance 30 {
    消息.全体("&6触发稀有事件")
} fail {
    消息.全体("&7本次未触发")
}

很适合做掉落特效、隐藏事件、随机阶段分支。

循环

列表循环:

text
for name in 副本.玩家列表() {
    日志(name)
}

区间循环:

text
for i in 1..10 {
    怪物组.生成("小怪波次")
}

当前版本里,区间循环超过 10000 次会被截断,避免脚本无限跑长循环。

分支选择

text
switch 难度 {
    case "普通":
        消息.全体("&e普通难度")
    case "困难":
        消息.全体("&c困难难度")
    default:
        消息.全体("&7未设置难度")
}

前置检查

require 适合放在脚本前面拦条件。

text
require @player.level >= 30
消息.发送("&a你满足进入条件")

支持自定义提示:

text
require @player.level >= 30: "&c等级不足"
命令.玩家("warp boss")

条件不满足时,后续逻辑不会继续执行。

异常处理

text
try {
    命令.控制台("say 剧情开始")
} catch {
    日志("剧情命令执行失败")
}

也支持主动抛错:

text
if !有变量("Boss配置") {
    throw("&cBoss 配置不存在")
}

延迟执行

推荐统一写这两种:

text
delay(60)
流程.等待(60)

示例:

text
消息.全体("&e3 秒后刷怪")
delay(60)
怪物组.生成("第一波")

当前版本里,delay 60 这种不带括号的写法虽然能被识别,但等待时间可能会回到默认 20 tick。正式脚本里直接用 delay(60)流程.等待(60) 更稳。

结束、跳过、终止

  • return:结束当前脚本
  • break:结束当前循环
  • continue:跳过本轮循环

这一层适合做什么

  • 控制副本什么时候转阶段
  • 写循环型天气机制、持续 Debuff、倒计时机制
  • 给剧情和机关做前置判断
  • 把随机事件和固定流程写在同一套逻辑里
  • 在复杂脚本里做失败保护和异常收口

需要注意的点

  • 没有玩家上下文时,@player.*、玩家函数、玩家动作都要谨慎用。
  • 读取条件尽量用函数或 对象.方法(),流程推进尽量用动作。
  • 长延迟和长循环脚本上线前先在测试服跑一遍。

TQ Minecraft Server Plugin Docs