随机分队 - woshiermuqwq/mythic-chinese GitHub Wiki

情景(基于MM 5.0 Paper 1.17.1)

现有一个实体,右键后将随机令每两个实体为一组队伍
为什么不做成玩家呢..? 因为咱本地服, 测试的话只能有一个人.

https://i.ibb.co/99zsNby/9month1.gif

原理 (无载体)

通过 变量 以及 变量值递推 来做到2个实体在1个队伍后
第3个实体进入第2个队伍.
通过条件: String Equals(变量值匹配)来检测其它玩家是否
为自己的队友.

注意

此教程用到的所有占位符(包括变量)全都位于施法者身上, 下文将忽略
实际上只有1个施法者,但整个机制让不少实体也充当了"施法者"

涉及技能 / 条件

完整的 实体配置

随机分队装置:
  Type: Shulker
  Display: '&a随机分队装置 - 右键激活'
  Disguise: Falling_Block COMMAND_BLOCK setDynamicName
  Options:
    NoAI: true
    Invisible: true
    AlwaysShowName: true
    PreventOtherDrops: true
  Skills:
  - skill:随机分队 @EIR{r=16} ~onInteract
  - skill:随机分队-已激活 @trigger ~onInteract
  - setvariable{var=global.dummy;type=float;value="1"} @self ~onSpawn
  - sudoskill{s=死亡给予队友伤害} @server ~onTimer:1

右键后对 16格半径范围内的所有实体激活 技能组: 随机分队
右键后对 右键自身的实体(玩家) 技能组: 随机分队
生成后 设置全局变量: dummy 值为 1

步骤1: 分队操作

随机分队:
  Cooldown: 1
  Conditions:
  - variableinrange{var=global.dummy;value=<1.1}
  Skills:
  - setvariable{var=target.dummy;type=float;value="0"}
  - setvariable{var=target.dummy;type=float;value="0"} @server
  - sudoskill{s=设置队分}
  - sudoskill{s=队友判定1}
  - sound{s=ui.stonecutter.select_recipe;repeat=5;repeatInterval=3} @self
  - sound{s=ui.toast.challenge_complete;p=0.1;delay=15} @self

该技能组的冷却为 1秒(用于防止重复右键)
该技能组的要求为 全局变量: dummy 值小于1.1(默认值为 1)
重设 位于范围内的所有实体以及全服玩家身上的变量: dummy 值为0(相当于重置)
令 位于范围内的所有实体以及全服玩家 作为施法者, 此技能组施法者作为触发者, 激活技能组: 设置队分(↓)
令 位于范围内的所有实体以及全服玩家 作为施法者, 此技能组施法者作为触发者, 激活技能组: 队友判定1(↓)
播放音效

设置队分:
  Skills:
  - setvariable{var=caster.dummy;type=integer;value="<global.var.dummy>"} @self
  - setvariable{var=global.dummy;type=float;value="<global.var.dummy> + 0.5"} @self
  - message{m="&6[分队装置]:&f<caster.name>, 您所在的队伍代数为:&a<caster.var.dummy>";delay=15} @self

设置位于自身(符合条件的实体)身上的变量: dummy 值为 全局变量: dummy 的值
设置全局变量: dummy 值为 全局变量: dummy 的值 + 0.5
发送提示OwO

范围目标选择器并不是对所有实体一次性激活技能..
所以实际上所有实体激活"设置队分"所耗的时间很短, 而不是一瞬间
这就意味着 全局变量值+0.5 会被激活很多次
为啥+0.5? 因为当您设置Integer类型的变量值为 Float类型的变量值 时
只会保留 Float类型的变量值 的整数位, 不会四舍五入(值为2.99仍取9)
这就完美的解决了 怎样做到每2实体在同一队伍, 且第3个实体在另一队伍
现在有村民 A B C 1个玩家
假设村民A率先激活 设置队分(激活顺序实际上是随机的)
那么此时位于它身上的变量: dummy 也就是 队伍代数 将为 1(也就是当前全局变量: dummy的值)
然后是玩家来激活, 位于玩家身上的变量:dummy值 将仍为 1(虽然全局变量: dummy值已为 1.5, 但设置integer变量时仅保留整数位)
接下来村民B来激活..位于它身上的变量: dummy值 变成了2(村民A给全局变量: dummy + 了 0.5, 玩家 又给全局变量 + 了 0.5)

步骤2: 同队判定

队友判定1:
  Conditions:
  - isPlayer
  Skills:
  - skill:队友判定 @EIR{r=16}

该技能组仅用于判断施法者是不是一个玩家
若是,则对16格方块半径范围内的所有实体激活技能组: 队友判定

队友判定:
  TargetConditions:
  - variableinrange{var=target.dummy;value=>0}
  Skills:
  - setvariable{var=target.判定;type=integer;value="<caster.var.dummy>"}
  - skill:队友判定成功

该技能组用于判断范围内的实体是否参与了分队, 以及传递施法者的队伍代数给参与分队的实体

队友判定成功:
  TargetConditions:
  - stringequals{val1="<target.var.dummy>";val2="<target.var.判定>"} true
  Skills:
  - sudoskill{s=队友判定提示;setcasterastrigger=true}
  - potion{t=GLOWING}
  - setvariable{var=target.判定;type=float;value="0"}

该技能组用于判断参与分队的实体所得到的 施法者的队伍代数 是否等于 自身的队伍代数
若相等则令其发光且以实体为施法者, 该技能组施法者为触发者, 激活技能组: 队友判定提示
效果不一定只能是发光, 这里只是举个例子

队友判定提示:
  Skills:
  - message{m=<caster.name>是你的队友} @trigger

提示施法者, 符合条件的实体 是你的队友

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