执行技术合集【包括执行几何学等】
首先
在组合execute的子命令技巧中,我们将介绍一些可能对于命令的轻量化和简化等方面有用的方法。
本文假设读者具备大致了解execute子命令功能的知识和高中水平的数学知识。
前提是命令示例
在命令示例中,用括号()括起来的部分请根据需要进行替换。
在命令示例的执行环境中,假设已定义了一个名为obj的计分目标,并且称它的伪分数容器为obj #数字,其数字为特定数值。
基础技术编 is the Chinese paraphrase for “basic technical compilation.”
将这些基础技术组合起来,可以实现各种不同的事情。
如果你想了解实用的应用,请跳到应用技巧部分。
几何学相关
这是使用几何坐标操作的技巧。
縱向角度翻轉
将执行方向的纵角度(x_rotation)反转。
execute (角度反転前のコマンド) rotated ~180 ~ (角度反転後のコマンド)
execute (角度反転前のコマンド) rotated ~180 ~ facing ^ ^ ^-1 (角度反転後のコマンド)
横向角度反转
将执行方向的水平角度(y_rotation)进行反转。
在水平角度反转中,使用绝对坐标进行操作。
由于移动到绝对坐标的原点位置,反转前的位置信息将会丢失。
execute (角度反転前のコマンド) positioned 0.0 0.0 0.0 positioned ^ ^ ^-1 positioned ~ ~ 0.0 positioned ^ ^ ^0.5 facing 0.0 0.0 0.0 (角度反転後のコマンド)
execute (角度反転前のコマンド) positioned 0.0 0.0 0.0 positioned ^ ^ ^-1 positioned 0.0 ~ ~ positioned ^ ^ ^0.5 facing 0.0 0.0 0.0 (角度反転後のコマンド)
绝对坐标的应用
通过使用原点(X=0,Y=0,Z=0)附近的绝对坐标,可以实现以下几点:
一是,在使用位置(positioned)时,使用(选择器)将改变XYZ轴的所有坐标,但对于绝对坐标位置,可以仅将特定轴与位置(positioned)~ ~ 0.0合并。
另一个是,可以使用facing 0.0 0.0 0.0来实现朝向(facing),而不需要使用实体(entity)。
需要注意的是,在使用绝对坐标时,如果以整数形式编写为0 0 0,则将被解释为0.5 0.0 0.5,因此需要写成0.0 0.0 0.0,包括小数点以下的部分。
向量的分量分解
从一个方向的向量移动相应轴(X轴,Y轴,Z轴,水平)的某个分量的距离。
先移动向量的一半的距离,然后翻转角度,接着再移动向量的一半的距离。
execute (元となる位置と方向でのコマンド) positioned ^ ^ ^(ベクトルの長さの半分) rotated ~180 ~ positioned ^ ^ ^(ベクトルの長さの半分) (ベクトルの成分分移動した位置でのコマンド)
execute (元となる位置と方向でのコマンド) positioned ^ ^ ^(ベクトルの長さの半分) rotated ~180 ~ facing ^ ^ ^-1 positioned ^ ^ ^(ベクトルの長さの半分) (ベクトルの成分分移動した位置でのコマンド)
在X轴和Y轴的情况下,由于使用了横向角度反转,所以需要将原来的位置和方向作为实施者的实体来使用。
execute as (元となる位置と向きのエンティティのセレクタ) at @s positioned 0.0 0.0 0.0 positioned ^ ^ ^-1 positioned 0.0 ~ ~ positioned ^ ^ ^0.5 facing 0.0 0.0 0.0 positioned as @s positioned ^ ^ ^-(ベクトルの長さの半分) rotated as @s positioned ^ ^ ^(ベクトルの長さの半分) (ベクトルの成分分移動した位置でのコマンド)
execute as (元となる位置と向きのエンティティのセレクタ) at @s positioned 0.0 0.0 0.0 positioned ^ ^ ^-1 positioned ~ ~ 0.0 positioned ^ ^ ^0.5 facing 0.0 0.0 0.0 positioned as @s positioned ^ ^ ^-(ベクトルの長さの半分) rotated as @s positioned ^ ^ ^(ベクトルの長さの半分) (ベクトルの成分分移動した位置でのコマンド)
将纵角度转换为横角度。
(重要度☆)
実行方向の縦角度に応じて横角度を変化させます。
execute (元となる向きでのコマンド) rotated 0 ~ positioned 0.0 0.0 0.0 positioned ^ ^ ^-1 rotated ~180 ~ positioned ^ ^ ^1 rotated ~-90 ~ positioned ^ ^-1 ^ rotated ~180 ~ positioned ^ ^1 ^ facing 0.0 0.0 0.0 (変換後の角度でのコマンド)
角度的一半转化成中文的方式是: 角度的一半化
将执行方向的垂直角度或水平角度减半。
在以下示例中,以x_rotation=0,y_rotation=0的方向(~ ~ ~1的方向)为基准进行减半。
通过在位置~ ~ ~-1处指定基准方向和反方向的单位向量,可以将任意方向作为基准。
需要注意的是,在与基准方向完全相反的方向上得到的角度将不正确。
execute (元となる方向でのコマンド) positioned 0.0 0.0 0.0 positioned ^ ^ ^-1 rotated ~ 0 positioned ^ ^ ^-1 facing 0.0 0.0 0.0 (半角化後の角度でのコマンド)
execute (元となる方向でのコマンド) positioned 0.0 0.0 0.0 rotated ~ 0 positioned ^ ^ ^-1 positioned ~ ~ ~-1 facing 0.0 0.0 0.0 (半角化後の角度でのコマンド)
三角形的判定形式
如果方向A与方向B之间的夹角小于固定的阈值,那么就执行一条命令的机制。由于利用了三角形的性质,我个人称之为三角式。以下是一个示例,如果实体A的方向与实体B的方向之间的夹角小于60°,则执行命令。利用了一个等腰三角形的两条等边与实体A、B的方向相同,并且两边夹角为60°的性质,这个三角形就是一个等边三角形,同时余下的一边的长度也相等。
execute at (エンティティAのセレクタ) positioned ^ ^ ^1 rotated as (エンティティBのセレクタ) positioned ^ ^ ^-1 if entity @s[distance=..1] (条件を満たした場合に実行するコマンド)
相近的相关
我会在以下页面上进行解释。
我要個人介紹一個我喜歡的東西。
相关的多点执行
执行执行分岐
(重要度☆☆☆)
executeサブコマンドのうちas at positioned as rotated as facing entityなどには、セレクタの対象となるエンティティが複数ある場合に、コマンドの実行を分岐させ、以降のコマンドの実行数を増やす効果があります。
乘客的执行分支
(重要度☆☆)
on passengersは実行者にライドしているエンティティを実行者に変更するサブコマンドですが、ライドしているエンティティが複数ある場合は、エンティティ毎にexecuteの実行を分岐させる効果があります。
その際に、実行者として呼び出されるエンティティの順番は、NBTのPassengersタグのリスト内での順番と同じです。
在中文中,可以将”多点実行”解释为”同时执行”。
当通过不同方向的实体来进行分支执行时,可以改变执行位置。
下面是一个使用两个实体,在一条直线上显示8个点粒子的示例。
# エンティティ召喚
summon minecraft:armor_stand ~ ~ ~ {Rotation:[0f,0f],Tags:["line"]}
summon minecraft:armor_stand ~ ~ ~ {Rotation:[180f,0f],Tags:["line"]}
# 線状に8点パーティクル表示
execute rotated as @e[tag=line] positioned ^ ^ ^2 rotated as @e[tag=line] positioned ^ ^ ^1 rotated as @e[tag=line] positioned ^ ^ ^0.5 run particle minecraft:composter ^ ^ ^ 0 0 0 0 0 force
以下是一个使用两个实体在立方体的顶点处显示粒子的示例。
# エンティティ召喚
summon minecraft:armor_stand ~ ~ ~ {Rotation:[0f,90f],Tags:["cube"]}
summon minecraft:armor_stand ~ ~ ~ {Rotation:[180f,-90f],Tags:["cube"]}
# 立方体の頂点状にパーティクル表示
execute rotated as @e[tag=cube] positioned ^ ^ ^1 rotated as @e[tag=cube] rotated ~ 0 positioned ^ ^ ^1 rotated as @e[tag=cube] run particle minecraft:composter ^1 ^ ^ 0 0 0 0 0 force
据说还可以显示各种其他图形。
商店・得分相关
向变更之前的执行者写入信息
(重要度☆☆☆)
@eセレクタは比較的負荷が重く、なるべく使用を減らす必要があります。
@sセレクタであれば負荷が軽く、また違うエンティティを選択してしまう恐れもないために便利であるものの、一度に実行者で居られるエンティティは一体のみです。
しかし、一度store success entity @sで代入先を設定してしまえば、asで実行者を変更した後でも代入対象は変わることはないため、変更前の実行者にコマンドの成否を代入することができます。
计分板玩家的返回值
(重要度☆☆)
在scoreboard players命令中的set、add、remove、operation等运算模式中,返回值(可通过store result指令获取的值)将被分配给分数。
如果有多个分配目标,则返回值将是所分配的值的总和。
因此,您可以使用以下命令来获取多个选择器目标的得分总和。
execute store result score #sum obj run scoreboard players add (対象のセレクタ) obj 0
店铺代入的时机
(重要度☆)
storeによる代入はコマンドが実行された直後に行われます。
executeが実行分岐していてコマンドが複数回実行される場合は、各実行の直後に代入が行われます。
複数回storeを書いた場合は書いた順番に代入が行われます。
セレクタの評価タイミング
(重要度☆)
executeサブコマンドの評価は全てrun以降のコマンドの実行の前に行われます。
そのため、run以降のコマンドやstoreなどによってエンティティの状態やスコアを変更したとしても、executeサブコマンド内でのセレクタの結果が変わることはありません。
しかし、run以降のコマンド内でのセレクタはコマンドの実行の度に評価されます。
未定义的动作相关
由于未来的更新可能会改变其行为,所以请使用时注意一下。
溢出
(较重要度☆☆☆)
分数以int类型进行管理,表示的值的范围最大为2147483647,最小为-2147483647。
如果试图将其超过最大值进行加法运算,则结果为最小值加上超出的部分;如果试图将其超过最小值进行减法运算,则结果为最大值减去超出的部分。
简单来说,最大值和最小值相连,可以将其视为数轴上的循环。
对齐方式采用了桁落方法。
(重要☆)这是利用浮点数舍入错误特性来进行类似对齐操作的技术。
与常规的对齐子命令相比,它具有可以在任意2的幂次单位下进行对齐,可以根据执行方向动态改变对齐轴等优点。
如果想要以(2^n)块单位进行对齐,首先将对齐轴方向向移动2^(52+n)+30000000,然后再向-(2^(52+n)+30000000)移动。
有关详细原理,请参考”浮点数 舍入错误”等相关资料。
以下是在X、Z轴方向以16块单位进行对齐(对齐到区块边缘)的示例。
execute (元となる位置でのコマンド) positioned ~-8 ~ ~-8 positioned ~72057594067927936 ~ ~72057594067927936 positioned ~-72057594067927936 ~ ~-72057594067927936 (align後の位置のコマンド)
其他
锚定眼睛式潜行状态检测/偷袭和游泳状态检测。
由锚定的目光控制执行位置的移动,还可以反映在悄悄走、趴下或者游泳状态下的目视高度的变化。因此,可以利用它来检测悄悄走、趴下或者游泳状态。
execute as @a at @s anchored eyes positioned ^ ^ ^ positioned ~ ~-1.27 ~ if entity @s[distance=..0.0001] (スニーク状態時に実行するコマンド)
execute as @a at @s anchored eyes positioned ^ ^ ^ positioned ~ ~-0.4 ~ if entity @s[distance=..0.0001] (伏せ・泳ぎ状態時に実行するコマンド)
execute as @a at @s anchored eyes positioned ^ ^ ^ positioned ~ ~-1.62 ~ if entity @s[distance=..0.0001] (立ち状態時に実行するコマンド)
横向对齐
将它水平定位到最接近的东西南北方向之一。
execute (元となる方向でのコマンド) positioned 0.0 0.0 0.0 rotated ~45 0 positioned ^ ^ ^-0.5 align xz facing -0.5 0.0 -0.5 rotated ~-45 0 (横角度align後のコマンド)
将高度得分化
如果你使用 if blocks,就可以将实体的 NBT 中的 Pos[1] 替换为高度的分数,而不需要取出它。通过将 if blocks 的比较源范围和比较目标范围设置为相同,我们可以确保成功并将比较范围的大小作为高度取出。需要注意的是结果会是整数值,即使在参考高度以下也会是正数,但在区块放置范围之外则无法使用。
execute (元となる位置でのコマンド) (代入先へのstore result) if blocks ~ (基準となる高さ) ~ ~ ~-1 ~ ~ (基準となる高さ) ~ all
应用技巧编
我会介绍一些基于结合基础技术的应用技巧的例子。
为分数添加连续编号
相关技术:分数板玩家的返回值
将多个实体按选择器的顺序分配从0开始的连续分数。
scoreboard players set #number obj -1
execute as (対象のセレクタ) store result score @s obj run scoreboard players add #number obj 1
逆序连续的编号如下所示。
execute store result score #number obj if entity (対象のセレクタ)
execute as (対象のセレクタ) store result score @s obj run scoreboard players remove #number obj 1
从第n个到第m个的限制
(相关技术:分数得分)
通常的limit=n参数会按照快速发现的顺序选择n个实体。
通过使用分数得分,您可以选择从第n到第m发现的实体,或者选择从倒数第n到倒数第m发现的实体。
scoreboard players set #number obj -1
execute as (対象のセレクタ) store result score @s obj run scoreboard players remove #number obj 1
# n番目からm番目に見つかったエンティティに実行
execute as @e[scores={obj=(n..m)}] (エンティティに実行するコマンド)
execute store result score #number obj if entity (対象のセレクタ)
execute as (対象のセレクタ) store result score @s obj run scoreboard players remove #number obj 1
# 最後からn番目からm番目に見つかったエンティティに実行
execute as @e[scores={obj=(n..m)}] (エンティティに実行するコマンド)
在第n个乘客实体上执行操作。
在乘客上执行分岐后,为其分配一个连续编号的得分,并将其应用于具有n分数的实体。
scoreboard players set (ライド元のセレクタ) obj 0
execute as (ライド元のセレクタ) on passengers store result score @s obj on vehicle run scoreboard players add @s obj 1
execute as @s[scores={obj=(「n番目」のn)}] (エンティティに実行するコマンド)
每隔两个实体执行一次
(相关技术:scoreboard players的返回值)
仅对选择器选定的实体按顺序执行奇数/偶数命令。
利用将-1与1交替切换的方法来实现。
scoreboard players set #number obj 1
execute as (対象のセレクタ) store result score @s obj run scoreboard players operation #number obj *= #-1 obj
# 奇数番目に実行
execute as @e[scores={obj=-1}] (奇数番目に実行したいコマンド)
# 偶数番目に実行
execute as @e[scores={obj=1}] (偶数番目に実行したいコマンド)
如果随机选择选择器,那么你可以进行1/2的抽选。
针对每个实体执行特定操作。
使用溢出而不是乘以-1可以在周期为2以外的情况下执行。
scoreboard players set #number obj 0
execute as (対象のセレクタ) store result score @s obj run scoreboard players add hoge obj 1431655765
execute store success score hoge obj as @e[scores={obj=0..1431655765}] at @s (3つごとに実行するコマンド)
scoreboard players set #number obj 0
execute as (対象のセレクタ) store result score @s obj run scoreboard players add hoge obj 1073741824
execute store success score hoge obj as @e[scores={obj=1073741824}] at @s (4つごとに実行するコマンド)
在总数为n的实体上执行操作。
用scoreboard players的返回值和选择器的评估时间相关的技术,从目标实体中选择其中n个实体并执行命令。
与每n个实体执行命令类似,但不同之处在于,这里选择的是从选择器找到的实体中按顺序选取总数除以n的实体数量,并且不需要考虑溢出的未定义行为。
execute as (対象のセレクタ) store success score @s obj run tag @e[(対象のセレクタの引数),tag=!chosen,limit=(「総数/n」のn)] add chosen
execute as @e[scores={obj=1..}] (総数/n体に実行するコマンド)
tag (対象のセレクタ) remove chosen
目光察覺
通过相关技术,包括三角求解和向之前的执行者写入信息,我们可以粗略地判断执行者是否在观察某实体。
当将@s[distance=..0.1]部分的距离增大时,阈值角度也会增大,反之减小。
因为我们只是简单地判断“执行者的朝向”和“执行者到目标的面向方向”之间的夹角是否小于阈值,所以这只是一个粗略的判断。
execute as (見る側のセレクタ) at @s anchored eyes facing entity (見られる側のセレクタ) eyes anchored feet positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^-1 if entity @s[distance=..0.1] (見ている場合に見る側を実行者として実行するコマンド)
如果想对正在被观看的一方执行命令,请使用store并按以下方式操作。
execute as (見られる側のセレクタ) store success score @s obj at @s anchored eyes positioned ^ ^ ^ anchored feet as (見る側のセレクタ) facing entity @s eyes positioned as @s positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^1 if entity @s[distance=..0.1]
execute as @e[scores={obj=1}] (見ている場合に見られる側を実行者として実行するコマンド)
判断在前面
(関連技術:三角式なす角判定)
エンティティAの位置を通りエンティティAの向きに直交する面に対して、エンティティBの位置がその面の前方にあるかを判定することができます。
なす角が直角の場合は、二等辺三角形ではなく、各辺の長さが3:4:5の直角三角形を利用すると、距離を整数で綺麗に書けます。
これを6面分行うことで回転可能な直方体範囲での判定も可能になります。
execute as (面を定義するエンティティのセレクタ) at @s facing entity (位置を判定するエンティティのセレクタ) feet positioned ^ ^ ^3 rotated as @s positioned ^ ^ ^-4 if entity @s[distance=..5] (前方にあった場合に実行するコマンド)
最後に
如果您有任何问题或建议,请在本页面的评论栏或 https://twitter.com/komaramune 上联系我们。