共享血量 - woshiermuqwq/mythic-chinese GitHub Wiki

情景

假设有3个实体, 它们同时生成, 且您想让三者之一死亡后另外俩实体也随之死亡
如果用 Remove@MIR ~onDeath的话
假设1个实体的最大生命是50, 共享血量只需要 玩家对这三个实体造成的总伤害为 50 就能让三者全部死亡
而 Remove 则需要你去打死三者之一, 如果我打掉每个实体的一半血量(总伤害为75) 那就和预期不一致

[]

原理 (无载体)

因为这3个实体的血量要统一, 所以我们干脆给它们一个统一的虚拟血条

涉及技能 / 条件

步骤

现在, 我们先让这三个实体拥有 "虚拟血条"

实体配置


共享血量实体:
  Type: zombie
  Faction: 无
  Options:
    PreventSunburn: true
    NoAI: true
  Skills:
  - setvariable{var=caster.共享血量;type=float;value="100"} @self ~onSpawn
  - skill:共享血量-伤害抵消{sync=true} @trigger ~onDamaged

生成后 设置位于自身身上的变量: 共享血量 的值为 100 (100就是共享血量的最大值) 受伤后 强制(因cancelevent必须被强制激活) 对 攻击自身的实体 激活技能组: 共享血量-伤害抵消
大前提是这些实体在同一阵营 (Faction)

技能组配置


共享血量-伤害抵消:
  TriggerConditions:
  - samefaction false
  Conditions:
  - variableinrange{var=caster.共享血量;v=>0}
  Skills:
  - cancelevent @self
  - setvariable{var=caster.共享血量;type=float;value="<caster.var.共享血量> - <skill.var.damage-amount>"} @self
  - skill:共享血量-计算 @EIR{r=16}
  - damage{a=0;pk=true;pi=true} @self

技能组: 共享血量-伤害抵消的条件为:
触发者(攻击施法者的实体)与施法者不在同一阵营 施法者(实体本身) 身上的变量: 共享血量 的值≥0

这里用到了 MythicMobs 异步, 即 条件一定比技能行更快一步激活

受伤后最先执行的是取消受伤事件(即被左键了什么反应都没有, 包括受伤变红)
随后设置自身身上的变量: 共享血量 的值为 自身身上的变量: 共享血量的值 - 自身最后一次所受到的伤害值 最后由于取消了受伤事件, 受伤变红也没了 所以这边damage自己一下(即使伤害为0也仍有变红效果)

这样, 这个虚拟血条就跟护盾一样, 剩余虚拟血条 > 0 时不会受到任何伤害 不会受到伤害的同时 虚拟血条的值被减了, 相当于护盾消耗 剩余虚拟血条 <0 时相当于无护盾
自身不会受到伤害的同时会和正常受伤一样令自身短暂变红,与自身共享生命的实体也会变红

既然是共享血量,那就得对所有拥有共享血量的实体(@EIR)激活一个技能组...

共享血量-计算:
  TargetConditions:
  - samefaction
  Skills:
  - setvariable{var=target.共享血量;type=float;value="<caster.var.共享血量> - <skill.var.damage-amount>"}
  - damage{a=0;pk=true;pi=true}

技能组:共享血量-计算 对每个技能目标 (由@EIR所选取的实体) 的要求是 处在同一阵营
@EIR不会选取自己, 所以只会计算位于 符合条件的实体 身上的变量: 共享血量
再次强调, 符合条件的实体 就是 拥有虚拟血条的实体.
技能组内容是 设置位于每个符合条件的实体身上的变量: 共享血量 值为 它们各自身上的变量: 共享血量 的值 - 施法者最后一次所受到的伤害值
这里的 施法者最后一次所受到的伤害值 与 第一个技能组的 自身最后一次所受到的伤害值 是同一个实体

疑难解答

Q: 受伤事件不是被取消了嘛? 为啥还能读取到 自身最后一次所受到的伤害值?
E: 这可能也是MythicMobs的异步, 占位符 又比 条件 更快一步读取


Q:为什么damage自己不会被取消?因为damage自己后,自己成了这个技能组的触发者(~onDamaged)
E: 而触发者条件写了 不在相同阵营 实体检测自己 那肯定在相同阵营 故不符合条件 不激活下方的取消事件

⚠️ **GitHub.com Fallback** ⚠️