Skip to content

什么是公式系统

公式系统让你用数学表达式动态计算数值,适用于:

  • Buff 效果:攻击力 = 10 + 等级 × 5
  • 属性映射:攻击力 = 力量 × 0.5
  • 周期伤害:伤害 = 施法者魔法伤害 × 0.1
  • 战斗管线:伤害 = max(0, 攻击力 - 防御力 × 0.5)
  • 条件判断:血量 < 最大血量 × 0.5

公式语法

单行公式(Expression 模式)

直接写公式字符串:

yml
# 固定值
formula: 100

# 简单运算
formula: "10 + level * 5"

# 百分比
formula: "total * 0.5"

# 条件判断
formula: "level > 5 ? 100 : 50"

多行公式(Groovy 模式)

使用 |-| 符号,自动识别为 Groovy 模式:

yml
formula: |-
  if (total <= 50) {
    return total * 0.8
  } else if (total <= 100) {
    return 40 + (total - 50) * 1.2
  } else {
    return 100 + (total - 100) * 1.5
  }

注意:Groovy 模式需要使用 return 语句返回值。


变量参考(按使用场景)

不同的配置场景可以使用不同的变量:

Buff 配置中的变量

buffs/*.yml 中可用:

  • level - Buff 等级
  • time - 剩余时间
  • duration - 总持续时间

周期效果中的变量

periodic/*.yml 中可用:

  • target_<属性ID> - 目标的属性值
  • source_<属性ID> - 来源的属性值

属性映射中的变量

attributes/*.ymlmapping 中可用:

  • total - 源属性的总值
  • value - 同 total(别名)
  • source_value - 同 total(别名)

战斗管线中的变量

pipelines/*.yml 中可用:

  • damage - 当前伤害值
  • self_* / target_* - 攻击者/受击者属性值
  • damage_type / context_type - 当前伤害类型与场景
  • input_damage / explicit_damage - 显式伤害输入上下文

运算符与函数参考

公式系统支持:

  • 基础运算符+ - * / %
  • 比较运算符== != > < >= <=
  • 逻辑运算符&& || !
  • 三元运算符条件 ? 真值 : 假值
  • 数学函数Math.floor() Math.ceil() Math.max() Math.min()

公式实战示例

查看常见的公式使用场景:

  • 等级越高加成越大
  • 随时间衰减的 Buff
  • 分段增长
  • 血量越低效果越强
  • 基于双方属性的伤害

常见错误与调试

错误 1:变量名拼写错误

yml
# ❌ 错误
formula: "lv * 10"  # 应该是 level

# ✅ 正确
formula: "level * 10"

错误 2:除零错误

yml
# ❌ 危险
formula: "100 / time"  # time 可能为 0

# ✅ 安全
formula: "time > 0 ? 100 / time : 0"

错误 3:Groovy 模式忘记 return

yml
# ❌ 错误(多行公式)
formula: |-
  if (total > 50) {
    total * 2  # 缺少 return
  }

# ✅ 正确
formula: |-
  if (total > 50) {
    return total * 2
  }
  return total

调试方法

使用命令查看计算结果:

text
/hnattr lookup          # 查看最终属性值
/hnattr trace <属性ID>  # 查看属性计算过程
/hnattr buffs           # 查看当前 Buff
/hnattr source          # 查看属性来源

下一步

现在你已经了解了公式系统的基础,可以继续学习:

HN 系列插件文档