Skip to content

如果你只记一句话,请记住:

HNAttribute 里的 Buff,本质上是一组按 source 管理的属性修饰符。

它不是只挂一个状态名,而是真的会改属性、进战斗、进原版同步、进 Mythic 联动、进调试命令。

换句话说,Buff 不是"视觉特效",而是"真正改变角色数值的状态"。

一、Buff 的核心定位

Buff 负责什么

Buff 更像"状态模板 + 属性修饰层"。

它主要负责:

  • 状态标记: 给目标挂一个可管理的状态 key,比如"力量提升"、"钢铁护体"
  • 时间管理: 维护等级、持续时间、重施行为(比如刷新时间、叠加层数)
  • 属性修改: 把配置编译成属性修饰符,比如"增加 50 点攻击力"
  • 系统集成: 以 buff:<key> 的形式进入属性系统和战斗结算

举个例子:

  • 你给玩家施加了一个"力量提升"Buff
  • 这个 Buff 配置了"增加 50 点攻击力"
  • 系统会创建一个来源为 buff:力量提升 的修饰符
  • 这个修饰符会参与最终属性计算和战斗结算
  • 当 Buff 结束时,系统会精确移除这个来源的所有修饰符

所以 Buff 更偏向于:

  • 状态标记(比如"中毒"、"加速"、"虚弱")
  • 属性增减(比如增加攻击力、减少防御力)
  • 来源管理(系统知道这些属性变化来自哪个 Buff)

Buff 不负责什么

Buff 不适合做周期性效果。

如果你要做:

  • 中毒: 每秒掉血
  • 灼烧: 持续伤害
  • 流血: 周期性扣血
  • 持续回血: 每秒恢复生命值

不要用 Buff! 应该使用周期效果系统。

为什么?

因为 Buff 是"改属性"的,不是"周期执行动作"的:

  • Buff 可以让你"攻击力 +50",但不能让你"每秒掉 10 血"
  • 如果硬要用 Buff 做周期效果,你需要写很多额外的代码,而且不好调试
  • 周期效果系统专门为这类需求设计,有完整的实例管理、调试命令、生命周期钩子

正确的做法:

  • 用 Buff 做"中毒状态"(比如降低移速、降低防御)
  • 用周期效果做"中毒伤害"(每秒掉血)
  • 两者可以同时存在,互不冲突

二、Buff 的基本结构

一个 Buff 模板包含:

基础信息

  • key: Buff 的唯一标识,比如"力量提升"、"钢铁护体"。这个 key 会用在命令、来源追踪、MythicMobs 技能中
  • display: 显示名称,支持颜色代码(比如 &c力量提升 会显示为红色)。这是玩家看到的名字
  • default-time: 默认持续时间(单位:tick,20 tick = 1 秒)。比如 120 表示持续 6 秒

重施策略

  • reapply-mode: 重复施加时的处理方式

常用选项:

  • REFRESH: 刷新持续时间。比如你有一个 10 秒的 Buff,剩余 3 秒时再次施加,会重新变成 10 秒
  • IGNORE: 已有同 key Buff 时直接无效。比如你有一个"无敌"Buff,在它结束前再施加同样的 Buff 会被忽略
  • REPLACE: 覆盖旧 Buff。比如你有一个 1 级的"力量提升",施加 2 级的"力量提升"会完全替换掉旧的

如何选择?

  • 大多数普通 Buff 用 REFRESH(最常用)
  • 特殊状态(比如无敌、复活保护)用 IGNORE
  • 需要高等级覆盖低等级的用 REPLACE

属性修饰

  • attributes: 定义 Buff 对属性的影响

例如:

yml
attributes:
  attack_damage:
    operation: ADD
    formula: "20 + level * 10"
  crit_chance:
    operation: ADD
    formula: "5 + level * 2"

三、Buff 如何变成修饰符

每个 Buff 在运行时都会变成一个来源:

text
buff:<BuffKey>

例如:

text
buff:力量提升
buff:钢铁护体

这就是为什么你能在:

text
/hnattr source
/hnattr trace <属性ID>

里直接看到 Buff 对属性系统的影响。

四、属性的三种操作类型

ADD (加法)

最常用的操作类型,直接增加数值。

yml
attack_damage:
  operation: ADD
  formula: "20 + level * 10"

示例:

装备攻击力: 100 (ADD)
→ 最终攻击力 = 100

MULTIPLY_BASE (基础乘法)

✖️

对基础值进行百分比加成。

yml
attack_damage:
  operation: MULTIPLY_BASE
  formula: "0.5"  # 50% 加成

示例:

装备攻击力: 100 (ADD)
Buff攻击力: 50% (MULTIPLY_BASE)

计算过程:
  1. 基础值 = 100
  2. 应用 MULTIPLY_BASE: 100 × (1 + 0.5) = 150
  → 最终攻击力 = 150

多个 MULTIPLY_BASE 如何叠加:

装备攻击力: 100 (ADD)
Buff1: 50% (MULTIPLY_BASE)
Buff2: 30% (MULTIPLY_BASE)

计算过程:
  1. 基础值 = 100
  2. 百分比相加: 50% + 30% = 80%
  3. 应用加成: 100 × (1 + 0.8) = 180
  → 最终攻击力 = 180

MULTIPLY_TOTAL (总值乘法)

对最终值进行百分比加成,在所有计算的最后阶段应用。

yml
attack_damage:
  operation: MULTIPLY_TOTAL
  formula: "0.2"  # 20% 加成

示例:

装备攻击力: 100 (ADD)
Buff1: 50% (MULTIPLY_BASE)
Buff2: 20% (MULTIPLY_TOTAL)

计算过程:
  1. 基础值 = 100
  2. 应用 MULTIPLY_BASE: 100 × 1.5 = 150
  3. 应用 MULTIPLY_TOTAL: 150 × 1.2 = 180
  → 最终攻击力 = 180

三种操作类型的计算顺序

1
收集所有 ADD得到基础值
2
应用所有 MULTIPLY_BASE(百分比相加)得到中间值
3
应用所有 MULTIPLY_TOTAL(逐个相乘)得到最终值

完整示例:

输入

  • 装备: 100 (ADD)
  • 装备: 50 (ADD)
  • Buff1: 50% (MULTIPLY_BASE)
  • Buff2: 30% (MULTIPLY_BASE)
  • Buff3: 20% (MULTIPLY_TOTAL)
  • Buff4: 10% (MULTIPLY_TOTAL)

计算过程

ADD 阶段:100 + 50 = 150
MULTIPLY_BASE 阶段:150 × (1 + 0.5 + 0.3) = 150 × 1.8 = 270
MULTIPLY_TOTAL 阶段:270 × 1.2 × 1.1 = 356.4

最终结果

356.4

如何选择操作类型

ADD (推荐新手优先使用)

  • 最容易理解和调试
  • 适合大部分常规增益
  • 数值增长可控

MULTIPLY_BASE

  • 适合百分比类增益
  • 多个 BUFF 叠加时是加法关系,不会失控
  • 适合装备套装、职业被动等

MULTIPLY_TOTAL

  • 适合最终爆发倍率
  • 会让数值增长更激进
  • 适合 Boss 狂怒、终极技能等
  • 使用前务必做好数值测试

为什么要区分两种乘法?

如果只有一种乘法,多个百分比 Buff 叠加时会指数增长:

错误示例 (如果只有一种乘法):
  基础值: 100
  Buff1: 50% → 100 × 1.5 = 150
  Buff2: 50% → 150 × 1.5 = 225
  Buff3: 50% → 225 × 1.5 = 337.5
  → 三个 50% 的 Buff 让数值翻了 3.375 倍!

通过分层计算:

  • MULTIPLY_BASE 之间是加法叠加 (50% + 50% + 50% = 150%)
  • MULTIPLY_TOTAL 单独控制最终倍率
  • 数值增长更可控,更容易平衡

五、Buff 公式中的变量

Buff 公式里常用变量:

  • level: Buff 等级
  • amplifier: 等于 level
  • time: 剩余时间
  • duration: 总持续时间

例如:

yml
formula: "10 + level * 5"

表示:

  • 1 级 = 15
  • 2 级 = 20
  • 3 级 = 25

六、Buff 的生命周期

施加 Buff

text
/hnattr buff apply <buffKey> <时长> <等级>

查看 Buff

text
/hnattr buffs

移除 Buff

text
/hnattr buff remove <buffKey>

清空所有 Buff

text
/hnattr buff clear

七、Buff 与周期效果的区别

Buff 适合

  • 状态标记
  • 属性增减
  • 不需要周期跳动的效果

周期效果适合

  • DOT / HOT
  • 需要周期跳动的效果
  • 需要运行时实例追踪的效果

八、Buff 调试命令

查看所有 Buff 模板

text
/hnattr buff list

施加 Buff

text
/hnattr buff apply <buffKey> 100 1

查看当前 Buff

text
/hnattr buffs

查看 Buff 对属性的影响

text
/hnattr source
/hnattr trace <属性ID>

九、MythicMobs 集成

如果服务器装了 MythicMobs,可以直接使用:

  • hna-buff: 施加 Buff
  • hna-removebuff: 移除 Buff
  • hna-clearbuff: 清空 Buff

最短示例:

text
hna-buff{key="力量提升";time=100;level=1} @target

十、这一页最该记住的重点

  1. Buff 本质上是"按 source 管理的一组属性修饰符"
  2. Buff 更偏向于状态标记和属性增减,不适合做周期性效果
  3. 每个 Buff 会以 buff:<key> 的形式进入属性系统
  4. Buff 调试最常用的命令是 /hnattr buffs/hnattr trace
  5. 如果要做 DOT / HOT,应该使用周期效果系统

HN 系列插件文档