主题
这篇教程演示的是 当前版本 的自定义战斗管线做法:
- 在
stages/*.yml里定义自定义 Stage - 在
pipelines/*.yml里编排执行顺序 damage_types/*.yml只负责显示身份与可选resist-formula
也就是说,这篇重点是改战斗步骤本身,不是新增元素通道。
目标
我们做一套偏刺客风格的近战管线:
- 命中
- 闪避
- 暴击判定
- 基础伤害
- 追加刺客附加伤害
- 如果处于背刺状态,再额外增伤
- 按通道减伤
- 再做暴击伤害修正
这套流程的重点是:
你可以在保留现有伤害通道体系的前提下,重新组织 Stage 顺序并插入自定义计算步骤。
一、先想清楚:这次要改的到底是哪一层
在当前版本里,四层分工一定要先分清:
attributes/*.yml:声明属性,以及channel + channel-rolestages/*.yml:定义每一个独立计算步骤pipelines/*.yml:把多个 Stage 编排成一条攻击流程damage_types/*.yml:定义显示身份与可选resist-formula
这篇教程会真正改动的是:
stages/*.ymlpipelines/*.yml
如果你想做的是“新增火焰 / 雷电 / 毒伤这种元素通道”,应该看:
二、先规划这条刺客管线
我们准备:
复用已有 Stage
hitdodgecritblockcollectdamageresistcrit_damagelifestealthorns
新增两个刺客专用 Stage
assassin_bonusbackstab_bonus
最终顺序:
text
hit
→ dodge
→ crit
→ block
→ collect
→ damage
→ assassin_bonus
→ backstab_bonus
→ resist
→ crit_damage
→ lifesteal
→ thorns这里要特别注意:
- 我们没有替换掉标准的
damageStage - 而是在
damage之后继续追加两个 modifier - 这样后面的
resist、crit_damage、lifesteal更容易继续复用默认逻辑
三、先写第一个自定义 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)这一步的意思很简单:
- 先拿到前面
damageStage 算出的基础伤害 - 再把
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:指定使用自定义 Pipelinedt=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
- resist2)致命一击
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.ymlstages/backstab_bonus.yml
重点看:
id是否和 Pipeline 里写的一致depends_on是否正确写成damage- 公式变量名是否拼对
4)最后做技能测试
yml
- hna-damage{a=100;pp=assassin_melee;dt=physical;st=skill} @target如果结果不符合预期,优先先排查:
- 自定义 Stage 是否真的被 Pipeline 引用了
- 相关属性是否真的有值
- 公式是否引用了不存在的变量
- Stage 顺序是否放反了
十、这一页最该记住的重点
- 自定义 Stage 放在
stages/*.yml。 - 自定义顺序放在
pipelines/*.yml的stages:列表。 damage_types/*.yml负责显示与可选resist-formula,不负责 Pipeline 顺序。- 想做复杂职业逻辑时,最好先把状态转成属性或可读上下文,再让公式读取。
- 真正稳定的做法通常是:复用标准
damage/resist/crit_damage,只把你自己的修正 Stage 插进去。
