Skip to content

这篇教程演示的是 当前版本 的自定义战斗管线做法:

  • stages/*.yml 里定义自定义 Stage
  • pipelines/*.yml 里编排执行顺序
  • damage_types/*.yml 只负责显示身份与可选 resist-formula

也就是说,这篇重点是改战斗步骤本身,不是新增元素通道。


目标

我们做一套偏刺客风格的近战管线:

  1. 命中
  2. 闪避
  3. 暴击判定
  4. 基础伤害
  5. 追加刺客附加伤害
  6. 如果处于背刺状态,再额外增伤
  7. 按通道减伤
  8. 再做暴击伤害修正

这套流程的重点是:

你可以在保留现有伤害通道体系的前提下,重新组织 Stage 顺序并插入自定义计算步骤。


一、先想清楚:这次要改的到底是哪一层

在当前版本里,四层分工一定要先分清:

  • attributes/*.yml:声明属性,以及 channel + channel-role
  • stages/*.yml:定义每一个独立计算步骤
  • pipelines/*.yml:把多个 Stage 编排成一条攻击流程
  • damage_types/*.yml:定义显示身份与可选 resist-formula

这篇教程会真正改动的是:

  • stages/*.yml
  • pipelines/*.yml

如果你想做的是“新增火焰 / 雷电 / 毒伤这种元素通道”,应该看:


二、先规划这条刺客管线

我们准备:

复用已有 Stage

  • hit
  • dodge
  • crit
  • block
  • collect
  • damage
  • resist
  • crit_damage
  • lifesteal
  • thorns

新增两个刺客专用 Stage

  • assassin_bonus
  • backstab_bonus

最终顺序:

text
hit
→ dodge
→ crit
→ block
→ collect
→ damage
→ assassin_bonus
→ backstab_bonus
→ resist
→ crit_damage
→ lifesteal
→ thorns

这里要特别注意:

  • 我们没有替换掉标准的 damage Stage
  • 而是在 damage 之后继续追加两个 modifier
  • 这样后面的 resistcrit_damagelifesteal 更容易继续复用默认逻辑

三、先写第一个自定义 Stage:刺客附加伤害

新建文件:

text
plugins/HNAttribute/stages/assassin_bonus.yml

内容:

yml
id: assassin_bonus
type: modifier
depends_on:
  - damage
description: "刺客附加伤害"
formula: |-
  return damage + Math.max(0, self_assassin_bonus_damage)

这一步的意思很简单:

  • 先拿到前面 damage Stage 算出的基础伤害
  • 再把 self_assassin_bonus_damage 直接加上去

也就是说:

text
最终值 = 基础伤害 + 刺客附加伤害

如果你的角色当前没有这条属性,那它自然就是 0,不会出问题。


四、再写第二个自定义 Stage:背刺增伤

新建文件:

text
plugins/HNAttribute/stages/backstab_bonus.yml

内容:

yml
id: backstab_bonus
type: modifier
depends_on:
  - damage
description: "背刺增伤"
formula: |-
  if (self_backstab_bonus <= 0) {
    return damage
  }
  return damage * (1 + self_backstab_bonus / 100)

这一步假设:

  • 你已经通过别的系统,把“当前是否满足背刺条件”折算成了 self_backstab_bonus
  • 例如:
    • 没有背刺时 = 0
    • 满足背刺时 = 25

那么它的效果就是:

  • 0 → 不增伤
  • 25 → 当前伤害 × 1.25

这里最重要的设计意识

当前战斗管线不会凭空知道

  • 你是不是站在目标背后
  • 你是不是正处于潜行状态
  • 你是不是拿着某种职业武器

这些信息通常应该由:

  • 职业系统
  • Buff 系统
  • 技能系统
  • 外部状态系统

先转成属性、标签或显式上下文,再交给 Stage 公式读取。


五、创建刺客专用 Pipeline

新建文件:

text
plugins/HNAttribute/pipelines/assassin_melee.yml

内容:

yml
id: assassin_melee
description: "刺客近战"
stages:
  - hit
  - dodge
  - crit
  - block
  - collect
  - damage
  - assassin_bonus
  - backstab_bonus
  - resist
  - crit_damage
  - lifesteal
  - thorns

这一步才是真正控制顺序的地方。

你现在已经拥有一条和默认 melee 不同的近战流程:

  • 默认 melee:基础流程
  • assassin_melee:基础流程 + 两个刺客专用修正阶段

六、什么时候需要改 damage_types

大多数情况下,只想改顺序时不需要动 damage_types/*.yml

因为当前版本里:

  • Pipeline 决定 先做什么、后做什么
  • DamageType 决定 这种伤害怎么显示、是否有专属减伤公式

所以如果你只是想做“刺客型物理伤害流程”,完全可以继续使用:

text
dt=physical
pp=assassin_melee

只有当你还想让这套伤害:

  • 有独立显示名
  • 有独立颜色
  • 有单独 resist-formula

才需要额外考虑对应的 damage_types/*.yml


七、怎么调用这条自定义管线

MythicMobs 示例

yml
AssassinStrike:
  Skills:
    - hna-damage{a=100;pp=assassin_melee;dt=physical;st=skill} @target

参数含义:

  • a=100:显式伤害输入
  • pp=assassin_melee:指定使用自定义 Pipeline
  • dt=physical:继续使用物理伤害类型
  • st=skill:来源类型为技能

如果你想走普通近战但只在特定技能上启用刺客流程

就保持:

  • 普通攻击继续走默认 melee
  • 只有特定技能明确写 pp=assassin_melee

这样不会污染全服所有近战攻击。


八、如果还想继续扩展

1)连击加成

你可以继续新增一个 modifier:

yml
id: combo_bonus
type: modifier
depends_on:
  - damage
description: "连击增伤"
formula: |-
  if (self_combo_bonus <= 0) {
    return damage
  }
  return damage * (1 + self_combo_bonus / 100)

然后在 assassin_melee.yml 里插到:

yml
- damage
- assassin_bonus
- combo_bonus
- backstab_bonus
- resist

2)致命一击

yml
id: lethal_bonus
type: modifier
depends_on:
  - damage
description: "致命一击"
formula: |-
  if (!crit) {
    return damage
  }
  return damage + target_max_health * Math.max(0, self_lethal_percent / 100)

然后你可以自己决定它放在:

  • resist
  • resist
  • crit_damage
  • crit_damage

不同位置,语义就不同。

这正是 Pipeline 体系的自由度:

  • 顺序自己定
  • 公式自己写
  • 每一层先后关系自己控制

九、测试建议

1)先确认输入值

text
/hnattr lookup
/hnattr trace attack_damage
/hnattr trace assassin_bonus_damage
/hnattr trace backstab_bonus

先确认:

  • attack_damage 是否正常
  • assassin_bonus_damage 是否真的有值
  • backstab_bonus 是否真的有值

2)再确认 Pipeline 文件

检查 pipelines/assassin_melee.yml

  • id 是否正确
  • stages: 列表顺序是否正确
  • 是否真的引用了 assassin_bonus / backstab_bonus

3)再确认 Stage 文件

检查:

  • stages/assassin_bonus.yml
  • stages/backstab_bonus.yml

重点看:

  • id 是否和 Pipeline 里写的一致
  • depends_on 是否正确写成 damage
  • 公式变量名是否拼对

4)最后做技能测试

yml
- hna-damage{a=100;pp=assassin_melee;dt=physical;st=skill} @target

如果结果不符合预期,优先先排查:

  1. 自定义 Stage 是否真的被 Pipeline 引用了
  2. 相关属性是否真的有值
  3. 公式是否引用了不存在的变量
  4. Stage 顺序是否放反了

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

  1. 自定义 Stage 放在 stages/*.yml
  2. 自定义顺序放在 pipelines/*.ymlstages: 列表。
  3. damage_types/*.yml 负责显示与可选 resist-formula,不负责 Pipeline 顺序。
  4. 想做复杂职业逻辑时,最好先把状态转成属性或可读上下文,再让公式读取。
  5. 真正稳定的做法通常是:复用标准 damage / resist / crit_damage,只把你自己的修正 Stage 插进去。

HN 系列插件文档