物品蓄力 - woshiermuqwq/mythic-chinese GitHub Wiki

情景

现有一个物品供玩家使用, 此物品功能有:

  • 右键后开始蓄力(蓄力完成需30秒)
  • 蓄力状态下不断增加蓄力进度(需未完全蓄力)
  • 蓄力状态下右键后取消蓄力(需未完全蓄力)
  • 左键后发射火球(需已完成蓄力第一阶段)
  • 火球的攻击段数、最大移动距离、球体特效半径受 蓄力阶段影响(每完成一阶段蓄力, 就额外造成1次伤害 特效半径额外扩大1格方块)
  • 切换手持物品后取消蓄力
  • 提示
  • 本教程所用机制占比:占位符 100%

https://i.ibb.co/jZqNMmy/Iteming.gif

原理 (无载体)

前置 Crucible 因要做到左右键
蓄力读数(增加蓄力进度)使用 占位符 (与计时器做法差不多)
蓄力阶段对抛射物的影响需要使用重复激活来做到(重复激活的值支持 占位符
蓄力提示涉及到 2个 占位符

注意

此教程用到的所有占位符(包括变量)全都位于施法者身上, 下文将忽略

涉及技能 / 条件

步骤1: 右键后开始蓄力

首先是物品配置叭..用到了触发器: ~onUse(右键后激活)

物品配置

蓄力物品:
  Id: iron_sword
  Display: '可蓄力物品'
  Skills:
  - skill:蓄力 @self ~onUse

技能组配置

蓄力:
  Conditions:
  - variableinrange{var=caster.蓄力开关;v=0.1to1} false
  Cooldown: 0.1
  Skills:
  - setvariable{var=caster.蓄力阶段提示;type=float;value="0"} @self
  - setvariable{var=caster.蓄力进度;type=float;value="0"} @self
  - setvariable{var=caster.蓄力开关;type=float;value="0"} @self
  - setvariable{var=caster.蓄力开关;type=float;value="<caster.var.蓄力开关> + 0.5";repeat=1;repeatInterval=1} @self

技能组: 蓄力 对自身的要求为: 位于自身的变量: 蓄力开关的值 小于0.1或大于1 技能组: 蓄力的内容为
设置变量: 蓄力阶段提示 值为 0
设置变量: 蓄力进度 值为 0
设置变量: 蓄力开关 值为 0
重复2次设置变量: 蓄力开关 值为 位于自身蓄力开关的值 - 0.5

为啥变量: 蓄力开关 涉及到俩行Setvariable, 甚至重复激活? 将在下一步的时候解释

这样 玩家右键物品后 这四行 Setvariable 就相当于将整个机制用到的 所有变量 设为 默认值

步骤2: 蓄力状态下不断增加蓄力进度 蓄力上限

物品配置叭..用到了触发器: ~onTimer:(右键后激活)

物品配置

蓄力物品:
  Id: iron_sword
  Display: '可蓄力物品'
  Skills:
  - skill:蓄力 @self ~onUse
  - skill:蓄力读数 @self ~onTimer:1
  - skill:蓄力上限 @self ~onTimer:1

每1tick 激活技能组: 蓄力读数(用于不断加值)

技能组配置

蓄力读数:
  Conditions:
  - variableinrange{var=caster.蓄力开关;v=>0.1}
  Skills:
  - setvariable{var=caster.蓄力进度;type=float;value="<caster.var.蓄力进度> + 0.05"} @self

技能组:蓄力读数 对自身的要求为: "变量: 蓄力开关 的值大于 0.1(注意步骤1的描述 相当于蓄力中)"
技能组:蓄力读数的内容为:
设置变量: 蓄力进度 值为 蓄力进度的值 + 0.05"
1tick + 0.05, 20tick + 1(也就是+1蓄力进度/秒)

  蓄力上限:
    Conditions:
    - variableinrange{var=caster.蓄力进度;v=>30.01}
    Skills:
    - setvariable{var=caster.蓄力进度;type=float;value="30.01"} @self
    - setvariable{var=caster.蓄力阶段提示;type=integer;value="<caster.var.蓄力进度> / 10"}

当位于自身的变量: 蓄力进度 的值 > 30.01 时(超过完全蓄力时的蓄力进度)
设置变量: 蓄力进度 值为 30.01
设置变量: 蓄力阶段提示 值为 变量: 蓄力进度的值 除以 10

蓄力进度为1相当于1秒,10就是10秒
11 / 10 = 1.1, 蓄力阶段提示的类型为 整数, 值取 1
25 / 10 = 2.5, 值取 2...

步骤3: 蓄力状态下右键后取消蓄力

物品配置

蓄力物品:
  Id: iron_sword
  Display: '可蓄力物品'
  Skills:
  - skill:蓄力 @self ~onUse
  - skill:蓄力读数 @self ~onTimer:1
  - skill:蓄力取消 @self ~onUse

与上文差异在, 右键可激活第二个技能组:取消蓄力

技能组配置

蓄力取消:
  Conditions:
  - variableinrange{var=caster.蓄力开关;v=>0.1}
  - variableinrange{var=caster.蓄力进度;v=>0}
  Skills:
  - sendtitle{title="&c蓄力取消";subtitle="请勿再次右键";d=40} @self
  - setvariable{var=caster.蓄力开关;type=float;value="<caster.var.蓄力开关> - 0.5";repeat=1;repeatInterval=1} @self
  - setvariable{var=caster.蓄力进度;type=float;value="0"} @self
  - setvariable{var=caster.蓄力阶段提示;type=float;value="0"} @self

技能组:蓄力读数 对自身的要求为:
变量: 蓄力开关 的值大于 0.1(相当于蓄力中)

技能组: 蓄力 对自身的要求为: 变量: 蓄力开关的值 ≠ 1
技能组: 蓄力的内容为
设置的变量: 蓄力进度 值为 0
设置的变量: 蓄力开关 值为 0
重复激活俩次,激活间隔1tick, 设置变量: 蓄力开关 值为 蓄力开关当前值 - 0.5

这样 玩家右键物品后再次右键 这三行 Setvariable 就相当于将整个机制用到的 3个变量(还有1个是自动计算的) 设为 默认值

为啥变量: 蓄力开关 涉及到俩行Setvariable 且重复激活, 与步骤1一样?只是加值变成了减值?
因为这里的重复激活相当于一个蓄力预热(也可以理解为前摇)

步骤1: 右键后开始蓄力 , 右键后首先将变量: 蓄力开关 值设为 0 随后进行预热(也就是重复激活)
预热结束后, 蓄力开关值为 1(先被设为0, 再连续2次+0.5)
步骤3: 开始蓄力后右键取消蓄力 , 右键后首先将变量: 蓄力开关 值设为 0 随后进行预热(也就是重复激活)
预热结束后, 蓄力开关值为 -1(先被设为0, 再连续2次-0.5)

因 步骤1 技能组条件为 变量: 蓄力开关的值不等于 1
而 步骤3 技能组条件为 变量: 蓄力开关的值等于 1
这就意味着, 当变量: 蓄力开关值在0到1之间时(也就是"蓄力预热")
只有技能组:(开始)蓄力 可以激活(技能组:蓄力取消后 蓄力开关的值变为-1 不符合取消蓄力的条件)

若 步骤3 技能组条件变更为变量: 蓄力开关的值等于 0 , 预热就跟没有一样
若 这俩步骤 设置变量: 蓄力开关 时没有重复(设置后的值直接为1 步骤3则为0), 就会导致右键后开始蓄力了又给你取消掉

步骤4: 左键后发射火球(需已完成蓄力第一阶段)

物品配置

蓄力物品:
  Id: iron_sword
  Display: '可蓄力物品'
  Skills:
  - skill:蓄力 @self ~onUse
  - skill:蓄力读数 @self ~onTimer:1
  - skill:蓄力上限 @self ~onTimer:1
  - skill:蓄力取消 @self ~onUse
  - skill:蓄力释放 @self ~onSwing

新增技能行: 左键可激活技能组:蓄力释放

技能组配置

蓄力释放:
  Conditions:
  - variableinrange{var=caster.蓄力进度;v=>10}
  - variableinrange{var=caster.蓄力开关;v=>0.1}
  Skills:
  - setvariable{var=target.受伤间隔;type=float;value="0"} @EIR{r=16}
  - sendtitle{title="&a激活技能";subtitle="OwOb";d=40} @self
  - setvariable{var=caster.蓄力开关;type=float;value="0"} @self
  - setvariable{var=caster.蓄力开关;type=float;value="<caster.var.蓄力开关> - 0.5";repeat=1;repeatInterval=1} @self
  - projectile{ot=蓄力释放-Tick;oe=蓄力释放-End;se=false;sb=false;hnp=true;md=100;v=4;i=1} @forward{f=2000}

技能组: 蓄力释放 对自身的要求为:
变量: 蓄力进度的值 > 10(蓄力完成需要30秒,>10相当于已完成蓄力第一阶段)
变量:蓄力开关的值 > 0.1(相当于蓄力中) 技能组: 蓄力释放 的内容为:
设置位于"16格方块半径范围内的所有实体"身上的变量: 受伤间隔 值为 0(因这个火球不会在命中实体后消失,若不这么做将造成多次伤害)
提示就不用说了..
设置位于自身身上的变量: 蓄力开关 值为 0
重复2次设置位于自身身上的变量: 蓄力开关 值为 蓄力开关的值(位于自身) - 0.5 (最终值为-1)
向视野正前方第2000格方块发射抛射物
(刷新后激活后激活技能组: 蓄力释放-Tick 结束后激活技能组: 蓄力释放-End 命中实体/方块后不消失, 可命中非玩家 最大持续时间为5秒 速度为4 刷新间隔为1)

步骤5: 蓄力阶段影响技能效果

技能组配置

蓄力释放-End:
  Skills:
  - setvariable{var=caster.蓄力进度;type=float;value="0"} @self
  - setvariable{var=caster.蓄力阶段提示;type=float;value="0"} @self
  - setvariable{var=caster.蓄力提示;type=float;value="0"} @self

设置变量: 蓄力进度 值为 0
设置变量: 蓄力阶段提示 值为0
设置变量: 蓄力提示 值为 0

技能组作用: 抛射物结束后将所有变量设为默认值(还有一个是自动计算的 会自动归为默认值)

蓄力释放-Tick:
  Skills:
  - skill:蓄力释放-Tick-伤害 @origin
  - skill:蓄力释放-Tick-特效-1 @origin
  - skill:蓄力释放-Tick-特效-2 @origin
  - skill:蓄力释放-Tick-特效-3 @origin
  - modifyProjectile{trait=VELOCITY;action=MULTIPLY;value=1.1;repeat='<caster.var.蓄力阶段提示> - 1';repeatInterval=1}

对抛射物激活技能组: 蓄力释放-Tick-伤害
对抛射物激活技能组: 蓄力释放-Tick-特效-1
对抛射物激活技能组: 蓄力释放-Tick-特效-2
对抛射物激活技能组: 蓄力释放-Tick-特效-3

技能组作用: 抛射物刷新后激活可造成伤害的技能组, 写3个特效技能组是因为 特效球体的半径范围选项不支持变量

蓄力释放-Tick-伤害:
  Skills:
  - skill:蓄力释放-伤害-效果 @ENO{r=3}

以抛射物坐标为中心, 对3格方块半径范围内的所有实体激活技能组: 蓄力释放-伤害-效果

蓄力释放-伤害-效果:
  TargetConditions:
  - isplayer false
  - variableinrange{var=target.受伤间隔;v=<0.05}
  Skills:
  - setvariable{var=target.受伤间隔;type=float;value="1"}
  - damage{a=3;pi=true;repeat='<caster.var.蓄力阶段提示> - 1';repeatInterval=10}

独立设置位于每个被@ENO所选取的实体身上的变量: 受伤间隔 值为 1 对 @ENO所选取的实体 造成 3 伤害, 无视受伤间隔, 重复次数为 位于施法者身上的变量: 蓄力阶段提示 的值, 重复间隔为 0.5 秒
注: 不会对拥有变量: 受伤间隔 且值小于0.05的实体 与 玩家 造成伤害

蓄力释放-Tick-特效-1:
  Conditions:
  - variableinrange{var=caster.蓄力进度;v=>10}
  Skills:
  - effect:particlesphere{p=flame;a=200;r=1} @origin

当位于自身的变量: 蓄力进度 值 ≥ 10 时 在抛射物坐标位置播放 半径为1 粒子数为200 的特效球体(第一阶段特效)

蓄力释放-Tick-特效-2:
  Conditions:
  - variableinrange{var=caster.蓄力进度;v=>20}
  Skills:
  - effect:particlesphere{p=flame;a=200;r=2} @origin

当位于自身的变量: 蓄力进度 值 ≥ 10 时 在抛射物坐标位置播放 半径为2 粒子数为200 的特效球体(第二阶段特效)

蓄力释放-Tick-特效-3:
  Conditions:
  - variableinrange{var=caster.蓄力进度;v=>30}
  Skills:
  - effect:particlesphere{p=flame;a=200;r=3} @origin

当位于自身的变量: 蓄力进度 值 ≥ 10 时 在抛射物坐标位置播放 半径为3 粒子数为200 的特效球体(完全蓄力特效)

三个特效技能组相似于 分类讨论 即分三种情况
这里所涉及到的变量: 蓄力阶段提示 需浏览步骤2: 蓄力上限

步骤6: 提示

物品配置

蓄力物品:
  Id: iron_sword
  Display: '可蓄力物品'
  Skills:
  - skill:蓄力 @self ~onUse
  - skill:蓄力读数 @self ~onTimer:1
  - skill:蓄力上限 @self ~onTimer:1
  - skill:蓄力取消 @self ~onUse
  - skill:蓄力提示 @self ~onTimer:1
  - skill:蓄力提示-允许 @self ~onTimer:1
  - skill:蓄力上限提示 @self ~onTimer:1

技能组配置

蓄力提示:
  Cooldown: 0.25
  Conditions:
  - variableinrange{var=caster.蓄力开关;v=>0.5}
  - variableinrange{var=caster.蓄力进度;v=<9.95}
  Skills:
  - setvariable{var=caster.蓄力提示;type=integer;value="<caster.var.蓄力进度> * 10 / 3"}
  - sendtitle{title="蓄力中...";subtitle="进度:&c<caster.var.蓄力提示>%";d=4} @self
  - skill:蓄力取消-物品切换{repeat=4;repeatInterval=1} @self

此技能组冷却为 0.25秒(5tick) 当位于自身的变量: 蓄力开关 值 > 0.5 且 变量: 蓄力进度 值 < 9.95 时(未完成蓄力第一阶段)
设置变量: 蓄力提示 值为 蓄力进度 * 1/3

蓄力进度 值为 9.5(也就是蓄力了9.5秒) 时, 蓄力提示 计算结果为 31.667%, 值取 31%
蓄力进度 值为 10(也就是蓄力了10秒) 时, 蓄力提示 计算结果为 33.33333%, 值取 33%

提示就不用解释了叭!
重复激活5次,重复间隔为1tick, 激活技能组: 蓄力取消-物品切换

蓄力提示-允许:
  Cooldown: 0.25
  Conditions:
  - variableinrange{var=caster.蓄力开关;v=>0.5}
  - variableinrange{var=caster.蓄力进度;v=9.95to29.95}
  Skills:
  - setvariable{var=caster.蓄力提示;type=integer;value="<caster.var.蓄力进度> * 10 / 3"}
  - setvariable{var=caster.蓄力阶段提示;type=integer;value="<caster.var.蓄力进度> / 10"}
  - sendtitle{title="蓄力中...&a(第<caster.var.蓄力阶段提示>阶段)";subtitle="进度:&c<caster.var.蓄力提示>%";d=4} @self
  - skill:蓄力取消-物品切换{repeat=4;repeatInterval=1} @self

此技能组冷却为 0.25秒(5tick)

当位于自身的变量: 蓄力开关 值 > 0.5 且 变量: 蓄力进度 值 > 9.95 时(已完成蓄力第一阶段)

设置变量: 蓄力提示 值为 蓄力进度 * 1/3
蓄力进度 值为 9.5(也就是蓄力了9.5秒) 时, 蓄力提示 计算结果为 31.667%, 值取 31%
蓄力进度 值为 10(也就是蓄力了10秒) 时, 蓄力提示 计算结果为 33.33333%, 值取 33%
提示就不用解释了叭!
重复激活5次,重复间隔为1tick, 激活技能组: 蓄力取消-物品切换

蓄力上限提示:
  Conditions:
  - variableinrange{var=caster.蓄力进度;v=30}
  Skills:
  - sendtitle{title="&a蓄力完成";subtitle="左键激活技能";d=40} @self

当位于自身的变量: 蓄力开关 值 > 0.5 且 变量: 蓄力进度 值 = 30(正好完全蓄力)时发送提示

最后一步: 切换物品取消蓄力

蓄力取消-物品切换:
  Conditions:
  - wearing{s=HAND;m=蓄力武器} false
  Cooldown: 0.5
  Skills:
  - sendtitle{title="&c蓄力中断";subtitle="请勿切换物品";d=40}
  - setvariable{var=caster.蓄力进度;type=float;value="0"} @self
  - setvariable{var=caster.蓄力开关;type=float;value="0"} @self

当自身未手持MM物品: 蓄力武器时
设置变量: 蓄力进度、蓄力开关 值为 0
怎么就一个条件呢? 因为它原本该写的条件已经写在了进度提示技能组 而它本身就是进度提示技能组所激活的
虽然进度提示技能组的冷却为0.25秒, 也就是 0.25秒检测1次, 但, 重复激活 让它几乎在蓄力全程检测施法者手持物品

关于自定义

进群获取 只需要修改2个变量值就可以调整整个机制的技能组配置
710180212

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