主题
如果你只记一句话,请记住:
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)
→ 最终攻击力 = 100MULTIPLY_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
→ 最终攻击力 = 180MULTIPLY_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: 等于 leveltime: 剩余时间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: 施加 Buffhna-removebuff: 移除 Buffhna-clearbuff: 清空 Buff
最短示例:
text
hna-buff{key="力量提升";time=100;level=1} @target十、这一页最该记住的重点
- Buff 本质上是"按
source管理的一组属性修饰符" - Buff 更偏向于状态标记和属性增减,不适合做周期性效果
- 每个 Buff 会以
buff:<key>的形式进入属性系统 - Buff 调试最常用的命令是
/hnattr buffs和/hnattr trace - 如果要做 DOT / HOT,应该使用周期效果系统
