1.19.50アップデートで大幅に変更となった”execute”コマンドの構文に関する解釈。
executeの旧構文と新構文の違い
executeはコマンドの実行者、実行場所、実行条件などを指定して実行するコマンド。
旧構文と新構文の違いは以下のようになる。
executeの旧構文
/execute <ターゲット> <座標> <実行コマンド>
→<ターゲット>を実行者、<座標>を実行場所として<実行コマンド>を実行する。
補足1)
ターゲットセレクターで指定する条件によって成功失敗の分岐として使用できる。
・ターゲットに適合するエンティティが存在する場合にコマンド実行を成功。
・ターゲットに適合するエンティティが存在しない場合にコマンド実行を失敗。
補足2)
<座標>の後に”detect <座標> <ブロック> <データ値>”を指定することでブロックの有無を成功失敗の条件分岐に使用できる。
・指定座標に指定するブロックが存在する場合にコマンド実行を成功。
・指定座標に指定するブロックが存在しない場合にコマンド実行を失敗。
executeの新構文
/execute <サブコマンド> <サブコマンドに係るセレクターや座標など> run <実行コマンド>
→実行者、実行場所、その他条件をサブコマンドで指定したうえで<実行コマンド>を実行する。
サブコマンドは複数書き入れることが出来る。
またサブコマンドで指定が無い場合は以下がデフォルトの実行条件となる。
・実行者…コマンドを発行するプレイヤーもしくはコマンドブロック。
・実行場所…コマンドを発行するプレイヤーもしくはコマンドブロックの座標。
・その他条件…無条件。
このデフォルト条件をサブコマンドで書き換えていくイメージをすると覚えやすい。
サブコマンドの種類
サブコマンド | 意味 |
as <ターゲット> | <ターゲット>を実行者とする。 ※実行場所は変更されない。 |
at <ターゲット> | <ターゲット>を実行場所とする。 ※実行者は変更されない。 |
positioned as <ターゲット> | <ターゲット>を実行場所とする。 ※実行者は変更されない。 |
positioned <座標> | <座標>を実行場所とする。 ※実行者は変更されない。 |
facing <座標> | <座標>を向いたこととして。 ※実際に向くわけではない。 |
facing entity <ターゲット> <eyes/feet> | <ターゲット>の<頭/足>を向いたこととして。 ※実際に向くわけではない。 |
rotated <水平角> <垂直角> | <水平角><垂直角>を向いたこととして。 ※実際に向くわけではない。 |
rotated as <ターゲット > | <ターゲット>と同じ方向を向いたこととして。 ※実際に向くわけではない。 |
anchored eyes | 判定基準を実行者の頭の高さとする。 |
anchored feet | 判定基準を実行者の足の高さとする。 |
if entity <ターゲット> | <ターゲット>がいたら。 |
unless entity <ターゲット> | <ターゲット>がいなかったら。 |
if block <座標> <ブロック> <データ値/ステータス> | <座標>に<データ値/ステータス>が一致する<ブロック>があったら。 |
unless block <座標> <ブロック> <データ値/ステータス> | <座標>に<データ値/ステータス>が一致する<ブロック>がなかったら。 |
if blocks <座標始点> <座標終点> <チェック座標始点> <scanmode:all/masked> | <座標始点>から<座標終点>の範囲のブロックが<チェック座標始点>から始まる同範囲のブロックと一致したら。 |
unless blocks <座標始点> <座標終点> <チェック座標始点> <scanmode:all/masked> | <座標始点>から<座標終点>の範囲のブロックが<チェック座標始点>から始まる同範囲のブロックと一致しなかったら。 |
if score <ターゲット> <スコア> matches <数値> | <ターゲット>の<スコア>の値が<数値>と一致したら。 |
unless score <ターゲット> <スコア> matches <数値> | <ターゲット>の<スコア>の値が<数値>と一致しなかったら。 |
if score <ターゲット> <スコア> <符号(>,>=,=,<=,<)> <参照ターゲット> <参照スコア> | <ターゲット>の<スコア>の値が<参照ターゲット>の<参照スコア>の値と比較して<符号>だったら。 |
unless score <ターゲット> <スコア> <符号(>,>=,=,<=,<)> <参照ターゲット> <参照スコア> | <ターゲット>の<スコア>の値が<参照ターゲット>の<参照スコア>の値と比較して<符号>じゃなかったら。 |
align <指定軸(x/y/z/xy/xz/yz/xyz)> | 実行座標の<指定軸>をブロック座標に揃える。 |
in <ディメンション(overworld/nether/the_end)> | 実行するディメンションを指定する。 |
run <実行コマンド> | executeサブコマンドと実行コマンドの間を区切る。 |
動画で解説
動画でもexecuteコマンドの使い方をザックリ解説しています。
execute新構文の雑感
(ここからは筆者の個人的な新構文を使った感想です。)
新構文は旧構文よりも具体的かつ詳細な内容を記述する方式に変わった。
実際に使ってみると”unless”で否定形の条件を加えられる点は完全な新機能であり、これまでコマンドブロックを複数個チェインしなければ書けなかった動作を1個のコマブロに短縮できたり、反転のトーチを省略できることで物理的に発生してしまうtick遅延を省くことが出来る点で優れている。
unlessを使用してこれまでのコマブロの記述を省略、簡略化する使い方を見つけるのはとても楽しい。
facing、rotated、anchored、alignも旧構文のexecuteのみでは出来なかった指定だと思うが、そもそも使いたい場面がかなり限定されるため恩恵は今のところ感じずらい。
これらの新機能を除けば、executeとしてよく使う機能としては基本的に変わりなく、慣れるまではただ記述が”めんどくさくなった”と感じる場面も多い。