主题
这页只做一件事:给已经在用 MythicMobs 的人提供快速可抄的写法和默认心智。
如果你现在想看原理,不要在这页硬啃:
- Buff 原理 → Buff 系统
- DOT / HOT runtime → 周期效果与实例系统
- 接入全貌 → 集成与 API
- 内部占位符速查 → MythicMobs 内部占位符速查表
快速导航
- 怪物属性标签
- 当前可用 Mechanics / Conditions
- 目标选择器注意点
hna-damage- 怪物按类型受伤倍率
damage-modifiers - 元素赋予 / 技能临时元素伤害
- Buff 相关 Mechanics
- 属性判断条件
hna-attribute hna-dot/hna-hot- 周期清理 Mechanics
- 周期结算 / 引爆 Mechanics
- DOT / HOT 差异
- 排查顺序
- 最后只记重点
一、怪物属性标签
当前默认按顺序读取:
yaml
Attribute
attribute所以你可以写:
yaml
Attribute:
- "攻击力: 100"
- "火焰伤害: 20"
- "火焰抗性: 10"如果你服里用别的标签名,例如:
StatsAttrHNAttribute
就去改:
yaml
plugins/HNAttribute/mythicmobs.yml怪物按类型受伤倍率
现在怪物还可以直接写:
yaml
damage-modifiers:
physical: 0.8
fire: 1.5
ice: 0.5含义是:
physical: 0.8→ 物理伤害最终只吃80%fire: 1.5→ 火伤最终吃150%ice: 0.5→ 冰伤最终只吃50%
最短可抄示例:
yaml
ElementDummy:
Type: ZOMBIE
Attribute:
- "攻击力: 100"
- "火焰抗性: 20"
damage-modifiers:
physical: 0.8
fire: 1.5
ice: 0.5它和抗性属性有什么区别
fire_resistance / ice_resistance:属于 HNAttribute 通道公式里的属性层damage-modifiers:属于怪物配置里的按伤害类型最终倍率层
可以把它理解成:
- 先按
*_damage / *_resistance走正常通道结算 - 再按这个怪自己配置的
damage-modifiers乘一次对应类型倍率
所以它很适合做:
- 怪物模板级弱点 / 抗性糖
- Boss 某阶段对某元素额外脆弱
- 不想额外加一堆属性时,直接在 MythicMobs 配表
补充一点:只要这次伤害明确标了 damage-type,像 hna-damage{dt=fire}、带 damage-type=fire 的 DOT,也会吃到这个倍率。
二、当前可用 Mechanics / Conditions
Mechanics
yaml
- hna-damage{amount=100} @target
- hna-buff{key="力量提升";time=100;level=1} @target
- hna-removebuff{key="力量提升"} @target
- hna-clearbuff @target
- hna-dot{amount=2;duration=60;interval=20;mode=refresh;key="burn-dot"} @target
- hna-hot{amount=2;duration=60;interval=20;mode=refresh;key="regen-hot"} @target
- hna-clearot{key="burn-dot"} @target
- hna-cleardot{source=caster} @target
- hna-clearhot{source=caster} @target
- hna-triggerot{all=true;type=all} @target
- hna-triggerdot{source=caster} @target
- hna-triggerhot{source=caster} @target
- hna-detonateot{all=true;type=all;stacks=all} @target
- hna-detonatedot{source=caster;stacks=2;aggregate=true} @target
- hna-detonatehot{source=caster;consume=false} @targetConditions
yaml
- hna-attribute{attribute=attack_damage;value=50;operator=>=} true
- hna-attribute{attribute=current_mana;value=30;operator=>=} true
- hna-hasbuff{key="重伤"} true
- hna-hasbuff{key="重伤";level=>=2} true
- hna-hasbuff{key="重伤";remaining=>20} true
- hna-hasot{key="burn-dot"} true
- hna-hasot{tag="dot"} true
- hna-hasot{source=caster;key="burn-dot"} true命名说明
主文档统一使用:
hna-clearothna-triggerothna-detonateot
这页后面的示例也统一按 ot 命名来写。
三、目标选择器要注意什么
当前这一批 HNAttribute Mythic mechanics,有一个很重要的实现约束:
- 只作用于 Mythic 明确选出来的实体目标
- 如果没有
entityTargets,技能会直接返回 - 不会再回退到
trigger - 也不会因为
trigger恰好是自己,就回打自己 / 给自己挂 DOT/HOT
所以现在最稳的写法是:
- 想打自己或给自己加效果 →
@Self - 想打目标 →
@target或其他可靠目标器 - 目标器本身无效时,先修目标器,不要指望 HNAttribute 自动兜底
例如:
@MIR是 MobsInRadius,不是“半径内任意实体”- 如果你想找半径内任意实体,优先用
@EIR @MIR{r=30}这类没写类型的写法,当前版本下通常会报配置错误
四、hna-damage
最短写法
yaml
- hna-damage{a=100} @target适合什么场景
- 固定值伤害
- 百分比伤害
- 接入 HNAttribute 战斗管线
你最常写的参数
amount/a:基础伤害;不写或<= 0时,回退为走 HNAttribute 战斗管线multiplier/m:最终倍率,默认1.0percent/p:是否按目标最大生命百分比结算,默认falsesource-type/st:来源类型,默认skilldamage-type/dt:伤害类型,默认physicaltags/t:附加标签;系统会自动补一个mythicpi:是否尽量绕过伤害间隔,默认falsepk:是否尽量抑制击退,默认false
三种最常见写法
1)固定伤害
yaml
- hna-damage{amount=100} @target2)百分比伤害
yaml
- hna-damage{amount=10;percent=true} @target3)走 HNAttribute 战斗管线
yaml
- hna-damage{m=1.2;source-type=skill;damage-type=fire;tags=mythic,skill} @target
- hna-damage{m=1.2;st=skill;dt=fire;t=mythic,skill;pi=true;pk=true} @target显式伤害参与战斗管线(新增)
从 2.2.0 版本开始,固定值和百分比伤害可以通过 participate-pipeline 参数进入战斗管线,继续走命中、闪避、格挡、增减伤、暴击等阶段。
基本用法
yaml
# 固定值伤害参与管线
- hna-damage{a=100;pp=true;st=skill;dt=physical} @target
# 百分比伤害参与管线
- hna-damage{a=12;p=true;pp=true;st=skill;dt=physical} @target参数说明
pp/participate-pipeline:是否参与战斗管线,默认false- 开启后,显式伤害会作为管线输入,继续经过增减伤、暴击等阶段
- 系统会自动附加标签:
explicit-damage:所有显式伤害fixed-damage:固定值伤害percent-damage:百分比伤害
与默认行为的区别
不开启 pp=true(默认):
- 固定值/百分比伤害直接结算
- 不经过战斗管线的增减伤、暴击等阶段
- 保持原有的直接伤害语义
开启 pp=true:
- 显式伤害作为管线输入
- 继续走命中、闪避、格挡判定
- 经过增减伤、暴击等阶段
- 可被管线配置的标签规则控制
实际应用场景
yaml
# 场景1:斩杀技能,按百分比但仍吃增伤和暴击
- hna-damage{a=15;p=true;pp=true;st=skill;dt=physical} @target
# 场景2:固定值技能伤害,需要吃增伤但不暴击(通过管线配置控制)
- hna-damage{a=200;pp=true;st=skill;dt=magic;t=no-crit} @target
# 场景3:真实伤害,不参与管线(默认行为)
- hna-damage{a=100;st=skill;dt=true} @target一句话理解
hna-damage不是 Mythic 原版damage{}的同义替代,而是 HNAttribute 自己的伤害入口。
元素赋予 / 技能临时元素伤害
这里先记住一个默认语义:
fire_damage是“火焰通道数值”,不是内置的“火焰赋予开关”。
也就是说,在当前默认战斗模型里:
- 只要
fire通道被启用 - 且攻击方的
fire_damage > 0 - 这次结算就可能产出火焰分量
当前系统没有内置 fire_imbue 这一层布尔开关。
如果你想做“平时有 fire_damage 数值,但必须开火焰赋予以后才允许打出火伤”,推荐这样配:
- 自己增加一个独立属性,例如
fire_imbue - 在
pipelines/*.yml的相关 stage 里,对fire类型或self_fire_damage做门控
例如可以新增一个按通道门控的 Stage:
yaml
# stages/fire_gate.yml
id: fire_gate
type: per_channel
description: "火焰通道门控"
formula: |-
if (channel_type == 'fire' && self_fire_imbue <= 0) {
return 0
}
return channel_value然后把它加入你实际使用的 pipelines/*.yml:
yaml
# pipelines/melee.yml
id: melee
stages:
- hit
- dodge
- crit
- block
- collect
- damage
- fire_gate
- resist
- crit_damage
- lifesteal
- thorns这样就变成:
- 平时
fire_damage只是“你有多少潜在火焰通道值” fire_imbue > 0时,才真的放行fire通道
如果你只是想打一发“明确是火属性”的技能伤害
最直接就写:
yaml
- hna-damage{a=100;damage-type=fire;source-type=skill} @target或者短写:
yaml
- hna-damage{a=100;dt=fire;st=skill} @target这更适合:
- 火球术
- 一次性火焰斩击
- Boss 某个技能临时转成火属性
如果你想做“开技能期间临时带火”
通常有两种思路:
- **赋予流:**先给自己临时加
fire_imbue,让普攻 / 常规战斗管线在持续时间内放行火通道 - **技能直伤流:**技能本身直接用
hna-damage{dt=fire},不改平A语义
你可以按玩法选:
- 想做“武器附魔一段时间” → 用
fire_imbue + pipeline门控 - 想做“这一招就是火属性” → 直接用
hna-damage{dt=fire}
排查时先看什么
text
/hnattr source
/hnattr trace attack_damage五、Buff 相关 Mechanics
hna-buff
yaml
- hna-buff{key="力量提升";time=100;level=1} @target关键参数:
key/id:Buff key;不写不会施加time/duration:持续时间;默认0level/lv/amplifier:Buff 等级;默认1
hna-removebuff
yaml
- hna-removebuff{key="力量提升"} @target关键参数:
key/id:Buff key;不写不会移除
hna-clearbuff
yaml
- hna-clearbuff @target作用:清掉目标当前全部 Buff。
最稳的排查方式
text
/hnattr buffs
/hnattr source
/hnattr trace <属性ID>六、属性判断条件 hna-attribute
最短写法
yaml
- hna-attribute{attribute=attack_damage;value=50;operator=>=} true
- hna-attribute{attr=max_health;v=100;op=>} true适合什么场景
- 判断任意属性的值(max_health、max_mana、attack_damage 等)
- 技能释放前置条件(如法力值足够)
- 根据属性值触发不同技能分支
- Boss 阶段判断(如生命值低于某个值)
你最常写的参数
attribute/attr/a:属性 ID(如max_mana、attack_damage、mana_deficit等)value/amount/v:比较的目标值operator/op/o:比较操作符,默认>=>=/ge:大于等于>/gt:大于<=/le:小于等于</lt:小于==/eq/=:等于!=/ne:不等于
常见使用场景
1)法力值判断
yaml
# 检查是否有至少 30 点法力值
- hna-attribute{attribute=current_mana;value=30;operator=>=} true
# 检查当前法力值是否大于 50
- hna-attribute{attribute=current_mana;value=50;operator=>} true
# 检查最大法力值是否达到 100
- hna-attribute{attribute=max_mana;value=100;operator=>=} true2)攻击力判断
yaml
# 检查攻击力是否达到 50
- hna-attribute{attribute=attack_damage;value=50;operator=>=} true
# 检查火焰伤害是否大于 20
- hna-attribute{attribute=fire_damage;value=20;operator=>} true3)生命值判断
yaml
# 检查最大生命值是否大于 100
- hna-attribute{attribute=max_health;value=100;operator=>} true
# 检查当前生命值是否低于 50(配合 current_health 属性)
- hna-attribute{attribute=current_health;value=50;operator=<} true4)抗性判断
yaml
# 检查火焰抗性是否达到 30
- hna-attribute{attribute=fire_resistance;value=30;operator=>=} true完整技能示例
yaml
FireballSkill:
Skills:
# 先检查法力值是否足够(至少需要 30 点)
- hna-attribute{attribute=current_mana;value=30;operator=>=} true
# 法力值足够,释放火球术
- hna-damage{amount=100;damage-type=fire;source-type=skill} @target
# 消耗 30 点法力值
- hna-attribute{attribute=current_mana;amount=-30;source=fireball_cost} @self与其他条件的区别
hna-attribute:判断任意属性的值(通用)hna-hasbuff:判断是否有某个 Buffhna-hasot:判断是否有某个周期效果
一句话理解
hna-attribute是通用的属性值判断条件,可以用于任何属性,不限于法力值。
七、hna-dot / hna-hot
最短 DOT
yaml
- hna-dot{amount=2;duration=60;interval=20;mode=refresh;key="burn-dot"} @target
- hna-dot{a=2;d=60;i=20;m=refresh;k="burn-dot"} @target最短 HOT
yaml
- hna-hot{amount=2;duration=60;interval=20;mode=refresh;key="regen-hot"} @target
- hna-hot{a=2;d=60;i=20;m=refresh;k="regen-hot"} @target起手只记这几个参数
amount/a:每跳数值;默认0duration/d/t:总持续时间;默认60interval/i:跳动间隔;默认20delay/dl:初始延迟;默认0mode/m:重施策略;默认refreshkey/k:实例 key;不写时回退到damage-typepercent/p:是否按目标最大生命百分比解释amount;默认falseparticipate-pipeline/pp:DOT 每跳是否参与战斗管线;默认falsesource-type/st:hna-dot默认dot,hna-hot默认internaldamage-type/dt:hna-dot默认dot,hna-hot默认internaltags/t:系统会自动补mythic和dot/hotmax-stacks/ms:最大层数;默认1stop-on-caster-death/siv:来源失效时是否停止实例;默认true
DOT/HOT 参与战斗管线(新增)
从 2.2.0 版本开始,DOT/HOT 每跳可以通过 participate-pipeline 参数进入战斗管线。
基本用法
yaml
# DOT 每跳参与管线
- hna-dot{a=5;d=60;i=20;pp=true;st=dot;dt=fire} @target
# 百分比 DOT 参与管线
- hna-dot{a=3;p=true;d=60;i=20;pp=true;st=dot;dt=poison} @target参数说明
pp/participate-pipeline:每跳是否参与战斗管线,默认false- 开启后,每跳伤害会作为显式伤害输入进入管线
- 系统会自动附加标签:
participate-pipelineexplicit-damagefixed-damage或percent-damage
与默认行为的区别
不开启 pp=true(默认):
- DOT 每跳直接结算,不经过战斗管线
- 保持原有的周期伤害语义
- 适合纯粹的持续伤害效果
开启 pp=true:
- 每跳伤害进入战斗管线
- 可被增减伤、暴击等阶段影响
- 可通过管线配置的标签规则控制
实际应用场景
yaml
# 场景1:灼烧 DOT,每跳吃增伤但不暴击
- hna-dot{a=8;d=100;i=20;pp=true;st=dot;dt=fire;k="burn"} @target
# 场景2:流血 DOT,按百分比且参与管线
- hna-dot{a=2;p=true;d=80;i=20;pp=true;st=dot;dt=physical;k="bleed"} @target
# 场景3:普通中毒,不参与管线(默认行为)
- hna-dot{a=5;d=60;i=20;st=dot;dt=poison;k="poison"} @target最稳起手模板
yaml
- hna-dot{amount=2;duration=60;interval=20;mode=refresh;key="tutorial-dot"} @target当前实现要特别注意什么
hna-dot / hna-hot没有显式实体目标就直接返回- DOT 每跳默认走的是无击退内部伤害
- HOT 每跳走的是普通周期治疗
- 从 2.2.0 开始,可通过
pp=true让 DOT 每跳参与战斗管线
八、周期清理 Mechanics
hna-clearot
yaml
- hna-clearot{key="burn-dot"} @target
- hna-clearot{tag="dot"} @target
- hna-clearot{source=caster;key="burn-dot"} @target
- hna-clearot{all=true} @target关键参数:
key:按 key 清理;支持*前缀匹配tag:按标签清理,如dot/hotsource:可写caster/trigger/allall:是否清理所有匹配实例,默认false
hna-cleardot
yaml
- hna-cleardot @target
- hna-cleardot{source=caster} @target只清 DOT;source 默认 all。
hna-clearhot
yaml
- hna-clearhot @target
- hna-clearhot{source=caster} @target只清 HOT;source 默认 all。
九、周期结算 / 引爆 Mechanics
这一组现在只要先记住两套语义:
trigger*= 立刻多跳一次detonate*= 把未来若干跳一次性合并结算
A. hna-triggerot / hna-triggerdot / hna-triggerhot
最短写法:
yaml
- hna-triggerot{all=true;type=all} @target
- hna-triggerdot{source=caster} @target
- hna-triggerhot{source=caster} @target你最常写的参数:
all:是否忽略key,直接处理所有匹配实例;默认falsekey/k:只处理某个 key;支持*前缀匹配source:来源过滤;默认alltype:动作类型过滤;triggerot默认all,triggerdot默认dot,triggerhot默认hotamp-attr/amp-owner/amp-base:DOT 放大参数,只对 DAMAGE 生效
当前语义:
- 找到匹配实例
- 立刻执行一次正常 tick
- 正常扣掉 1 次 repeat
也就是说,它是“补跳一跳”,不是“提前清算后面全部”。
B. hna-detonateot / hna-detonatedot / hna-detonatehot
最短写法:
yaml
- hna-detonateot{all=true;type=all;stacks=all} @target
- hna-detonatedot{source=caster;stacks=2;aggregate=true} @target
- hna-detonatehot{source=caster;consume=false} @target你最常写的参数:
all:是否忽略key,直接处理所有匹配实例;默认falsekey/k:只处理某个 key;支持*前缀匹配source:来源过滤;默认alltype:动作类型过滤;detonateot默认all,detonatedot默认dot,detonatehot默认hotstacks:提前清算多少次剩余 repeat;默认1,可写allconsume:是否真的消耗这些剩余 repeat;默认trueaggregate:是否按“来源 + action 签名”聚合成更少的结算段;默认falseamp-*:仍只对 DAMAGE 生效
当前语义:
- 找到匹配实例
- 按
stacks计算要提前结算多少次剩余 repeat - 把这几次未来跳动的值一次性合并执行
consume=true时才真正扣掉剩余 repeat
一句话理解:
trigger*= 补跳detonate*= 提前清算
十、DOT / HOT 的核心差异
它们共用同一套 periodic runtime,核心差异只有一个:
hna-dot= 周期实例 +DAMAGEactionhna-hot= 周期实例 +HEALaction
在当前实现里:
- DOT 默认
source-type=dot - DOT 默认
damage-type=dot - HOT 默认
source-type=internal - HOT 默认
damage-type=internal - DOT 自动补
dot标签 - HOT 自动补
hot标签
如果你想看更完整的 runtime 解释,直接去看:
十一、最推荐的排查顺序
怪物属性没读到
- 看
mythicmobs.yml的标签名 - 看怪物配置里是不是写到了正确节点
- 开启
/hnattr debug debug,攻击怪物后看控制台输出的战斗管线日志,确认怪物侧属性是否被正确注入
注意:/hnattr inspect、/hnattr trace 等命令只能查玩家属性,不能直接查怪物。怪物属性需要通过战斗 debug 日志间接验证。
Buff 没挂上
text
/hnattr buffs
/hnattr sourceDOT / HOT 没跑起来
text
/hnattr periodic list
/hnattr periodic inspect <key>
/hnattr periodic debug detail <key>结算语句体感不对
先分清你想要的是哪一种:
- 立刻额外跳一次 →
hna-triggerot / hna-triggerdot / hna-triggerhot - 一次性提前清算未来若干跳 →
hna-detonateot / hna-detonatedot / hna-detonatehot
十二、最该记住的重点
- MythicMobs 这边现在已经不只是
hna-damage,还包括 Buff、条件、周期实例、即时结算与引爆能力。 damage-modifiers可以直接给怪物模板加"按伤害类型最终倍率"的配置糖。fire_damage默认只是火焰通道数值,不等于内置的"火焰赋予开关"。hna-attribute是通用的属性值判断条件,可以用于任何属性(max_health、max_mana、attack_damage 等)。hna-dot / hna-hot已经是统一 periodic runtime 的入口之一。trigger*的语义是"立即多跳一次"。detonate*的语义是"把未来若干跳一次性合并结算"。- 从 2.2.0 开始,固定值/百分比伤害和 DOT/HOT 可通过
pp=true参与战斗管线。 - 显式伤害会自动附加
explicit-damage、fixed-damage或percent-damage标签,可在管线配置中控制。 - 最终排查不要只看 Mythic 技能链,要回到 HNAttribute 的运行时命令上看。
