見出し画像

【Minecraft統合版】新executeのまとめ

最終更新 : 2024/1/21


はじめに


アップデートされて構文がわけわかめになったexecuteコマンド、新executeについて雑に解説。
そもそも新executeって?
何ができるの?
旧executeと何が違うの?
新executeの(ほぼ)全てをここにまとめていきます。
この記事では主に基礎的な部分を解説しますが、よければこちらから応用編もどうぞ。

理解に必要となる前提知識


  • 今までのexecuteコマンド

  • testfor系のコマンド

これらはここでは解説しません。
調べればいくらでもわっかりやすい解説が見つかると思います。
新executeの機能の一つ、「if|unless score」を理解したいならscoreboardコマンドに関する知識も必要ですね。

新executeとは?


新executeとは、マイクラ統合版1.19.10になり試験的に実装された、今までとは全く異なる構文のexecuteコマンド。
1.19.50ではついに旧executeが使えなくなり、functionと既に書かれたコマンドを除き新executeへ完全移行となりました。

そしてその構文や挙動はJava版のexecuteコマンドと"ほとんど"同じです。
…ほとんど。
つまり、「Java版の解説サイト見ればええやん!!」みたいなことができそうでできないわけです。

このexecute、統合版特有の仕様やバグがあったりします。ここではそういったBE限定の細かい仕様にも触れつつ、なるべく分かりやすく解説していきたいです(願望)

今までのexecuteと何が違うのか?


まずは構文から見ていきます。

旧execute(今までのexecute)

execute (セレクター) (実行座標) (コマンド)

or

execute (セレクター) (実行座標) detect (調べる座標) (ブロックID) (データ値|ブロックステート) (コマンド)


新execute

execute (サブコマンド)

こうして並べてみると随分とシンプルになったように感じますが、この「サブコマンド」が厄介なのです。
大量に種類がある、構文が一つ一つに存在する、新しい概念の登場…

目が痛くなりそうな量ですが、このサブコマンドについては後々詳しく解説します。

次に「何ができるのか」について見ていきます。

まず、いわゆる「実行者と実行座標の分離」について。

例えばこのコマンド。

#旧execute
execute @p ~ ~ ~ playsound random.click @s

「@p」が「@p」の位置で、「自身に向けて音を再生する」コマンドとなっています。
"@pが"
"@pの位置で"
これら2つは"execute"の直後に位置する「@p」によって決定されています。

では例えば、"@pが"、"@rの位置で"、音を再生したいときはどうすればいいのでしょうか?

#旧execute
execute @p ~ ~ ~ execute @r ~ ~ ~ playsound ...

このコマンドでは、execute @r ~ ~ ~ ... と記述したのと全く同じ結果になってしまいます。

ではどうしたら?

…そう、旧executeでは、このような場合、execute以外のコマンドに頼り出力が同じになるように組んでいくしかないのです。

もっと言ってしまうと、旧executeではこの操作をexecute内で完結させることは「できない」のです。

しかし、新executeならば

#新execute
execute as @p at @r run playsound ...

これだけで可能です。
また、新executeを用いることでコマンド数の大幅削減を行うことができます。

あともう一つほど新executeでできることを紹介しておきます。

例えば、自分オリジナルの飛び道具を作ったとします。銃とかにしておきます。
この銃から出てくる弾丸は、ブロックにぶつかったら消滅しなければいけません。
では、今弾丸がいる座標が空気ではないことを条件として、弾丸を消すコマンドを実行します。

#旧execute
execute (弾丸) ~ ~ ~ detect ~ ~ ~ air -1 kill

しかしこれでは、空気のときに弾丸を消してしまいます。
空気「ではないこと」を指定するのは、旧executeでは1つのコマンドでは不可能です。
空気ではないこと検知からの弾丸削除までを書こうとすると、3コマンドが必要となります。

しかし新executeならば、

#新execute
execute as (弾丸) at @s unless block ~ ~ ~ air run kill

これ1コマンドで全てが完結します。

つまり、

  • 実行者と実行座標の分離

  • "条件を満たしていなかった場合"を指定する機能

  • 実行方向の指定

などなど複雑になった分細かいところまで指定できるようになったり、今まで複数のコマンドで行っていたものを1つのコマンドで完結させられるようになったのです。

試験的実装当初はバグが数多く見つかりましたが、現在は殆どのバグは修正され旧executeが勝っているような点はなくなりました。
新executeがわかるならば確実に新executeを使った方がいいというような状況になっています。

新executeの構文と基礎的なサブコマンド


新executeの構文についてより詳しく見ていきます。

先程も言いましたが、新executeの構文はこのようになります。

execute (サブコマンド)

これだけ見ればなんともシンプルですね。
…"これだけ見れば"。

この「サブコマンド」が厄介なので、サブコマンドとは何なのか、何のために使うのか、どうやって使うのかについて詳しく解説していきます。

新executeは、「execute」を書いたのち、幾つかあるサブコマンドのうちから一種類を選び、サブコマンド一つ一つに存在する"構文"に則って記述していきます。
サブコマンドは書いた順に実行されていきます。

コマンドを実行するエンティティ、つまり実行者を指定するサブコマンド「as」というのがあります。これを使って新executeのコマンドを書いてみます。

このサブコマンドの構文は「as (セレクター) (サブコマンド)」なので…

execute as @p

こういうことでしょうか?
…いいえ、最後の「サブコマンド」がまだ書けていません。つまり…

execute as @p run

こうなります。適当にサブコマンドの一つである「run」を入れて、サブコマンド「as」の構文を全て書けました。

ならこれで実行できる?

答えはNoです。よく見てください。
「run」もサブコマンドです。すなわち、runの構文も最後まで書かなければなりません。
runの構文は
「run (コマンド)」になります。runの前に書かれたサブコマンドたちが指定していった実行者や実行位置、実行する条件などを参照して指定したコマンドを実行するサブコマンドです。
では書いてみます。

execute as @p run say a

実行するコマンドは適当にsayコマンドにしておきました。これでようやくコマンドが実行できます。実際に実行してみると…

できました。
as @p、つまりここでいうSteveが実行しているので、Steveが「a」と発言しています。

サブコマンドの構文に(サブコマンド)が入っているものについてはこのようにしなければならないことに注意してください。

では、試しにsayではなくsetblockに変えてみます。

execute as @p run setblock ~ ~1 ~ stone

「@pが」石を1ブロック上に設置するコマンドです。
実行すると…

プレイヤーの場所から1ブロック上ではなく、コマンドブロックの1ブロック上に設置されてしまいました。

…それもそのはず。

「@pが」石を1ブロック上に設置するコマンド

あくまでもコマンドを実行するのが@pなだけであって、@pの位置でコマンドを実行するとはどこにも書いてありません。
サブコマンドasは、それ以降の実行者(=@sが指し示すもの)を変えるだけです。

書いていなかった場合はどうなるのか。
コマンドブロックの位置で実行される、が答えです。
これはexecuteコマンドに限った話ではなく、どんなコマンドでも実行する位置についての記述がなければコマンドブロックの位置を基準にコマンドが実行されます。
(例外はあります)

ではSteveの位置でsetblockを実行したいときは?
しっかり専用のサブコマンドがあります。
at(またはpositioned as)です。
atの構文は
「at (セレクター) (サブコマンド)」
となります。asとほぼ書き方は変わりません。

execute at @p run setblock ~ ~ ~ stone

これを実行すると、

しっかりプレイヤーの位置に設置されました。

サブコマンドasを使用すると、コマンドを実行するエンティティを指定することができます。ただし、位置は変わりません。
サブコマンドatを使用すると、コマンドを実行する位置となるエンティティを指定することができます。ただし、実行者となるエンティティは変わりません。
サブコマンドrunを使用すると、それまでに様々なサブコマンドで指定した条件や実行者、位置などを基準に任意のコマンドを実行することができます。

また、asで指定できるのは「コマンドを実行するエンティティ」ですが、「コマンド」というのはサブコマンドも含まれています。つまり以下のコマンドで、

execute as @a at @s run playsound random.click @s

全プレイヤーが、それぞれ自分自身の位置を基準に、自分に向けて音を再生する。
なんてことができたりします。
この 「execute as 〜 at 〜 run ...」はよく使う形なので覚えたほうがいいです。

先程サブコマンドは書いた順に実行されると言いました。
つまり、

execute at @s as @a run playsound random.click @s ~ ~ ~ 1 1

例えばついさっきのコマンドの「as @a」と「at @s」を上のように入れ替えると実行されません。
書き換える前は、
「全プレイヤーが、自分自身の位置で実行」
でしたが、書き換えることにより
「自分自身の位置で、全プレイヤーが実行」
というようなコマンドになっています。
後者の方で言う「自分自身」とは実行者がこの時点では記述されていないためコマンドブロックになります。
しかし@sはコマンドブロック、ブロック。つまりエンティティではないのでコマンドブロックが実行者では実行できません。
例え実行できるような仕様であったとしても実行位置はコマンドブロックなのでコマンドブロックの位置で音が再生されてしまいます。
つまりサブコマンドを記述する順番も重要であるという訳です。

また、「run execute」
この形は全く意味がありません。
run executeとはどういうこっちゃとなる方のために具体例を置いておきます。

execute as @a run execute at @s run playsound ...

runは除きますが、1つのexecuteにつき同じ種類のサブコマンドは一度しか使えないなんてことは全くありません。そのためこんな文を書くことも可能です。

execute as @a at @s positioned ~ ~1.625 ~ facing entity @e[type=armor_stand] eyes positioned as @s positioned ^ ^ ^-10 rotated as @s positioned ^ ^ ^10 if entity @s[r=0.1] run say a

防具立ての目の位置にカーソルを合わせるとsayが実行されるコマンドになります。

ここでは詳しいことは言いませんが、このような新executeを用いて幾何学的操作をする分野をexecute幾何学と呼んだりします。
新executeに慣れてきたら挑んでみるのも良いと思います。

現存する全てのサブコマンドについて


統合版には現在11のサブコマンドがあります。

  • as

  • at

  • positioned

  • run

  • if

  • unless

  • rotated

  • facing

  • align

  • anchored

  • in

「多すぎやろ」と思うかもしれませんが、全て覚えておくべきです。
as・at・runは先程ざっと説明しましたが…
1つ1つ解説していきます。

1.「run」


このサブコマンドを一番最初に解説している所は少ないのではないでしょうか。

runは、指定したコマンドを実行するサブコマンドです。それ以外の機能は持ちません。
構文はこちら。

run (コマンド)

これだけです。

コマンドの例 :

execute run say a


このコマンドは「say a」を実行した際と出力は全く変わりません。つまり、runの前に一つもサブコマンドを記述せずにコマンドを記述するのは無駄でしかありません。
「run」は他のサブコマンドありきなのです。

2.「as」


簡単に言えばこれより後に記述された"@s"が指し示すエンティティを指定します。
つまり実行者を変えます。
※sayなどの一部のコマンドでは、@sを変えるだけではなく「sayで発言するエンティティを指定するサブコマンド」としても使えるようになったりします。
構文はこちら。

as (セレクター) (サブコマンド)

このサブコマンドはあくまでも実行者を指定するだけです。そのため、実行する位置は変更しません。

コマンドの例 :

execute as @a run effect @s speed 1



この場合の実行者と実行座標

全プレイヤーが、実行する位置はそのままに、レベル1のspeedを1秒間自身に与えます。
しかしこの場合、executeを使う必要はそもそもありません。

effect @a speed 1

これでも全く同じ結果になります。
下のほうがシンプルです。今回の例の場合は使う必要はありませんね。

上のexecuteを使ったほうのコマンドは、
「全プレイヤーが自身にspeedを与える。」
下のexecuteを使用していないコマンドは、
「全プレイヤーにspeedを与える。」

ならばasはどういうときに使うのか。

→「@sをどこかで使いたいときに使う」
これが一番わかりやすいと思います。

@sを使いたい状況をあまり想像できない方のために具体例を。

  • 足元に特定のブロックがあるときだけスピードを付与したい。

execute at @a if block ~ ~-1 ~ diamond_block run effect ...


※if blockはまだ紹介していませんでしたが、「if block (座標) (ブロックの種類)」で、特定の座標に指定のブロックがあるかどうかを確かめられます。

全プレイヤーの位置で、1ブロック下にダイヤモンドブロックがあれば、effectを…
あれ?誰につければいいの?
…ってなりません?
@sにつけようとしても、実行者はこのコマンドにおいてずっとコマンドブロックのままから変わっていないので、コマンドブロックにeffectをつけるというよくわからないコマンドができてしまいますね。
@aにしてしまうと、「全プレイヤーの位置で、1ブロック下にダイヤモンドブロックがあれば、effectを全プレイヤーにつけるコマンド」になってしまいます。
どういうことかというと、誰か一人でもダイヤモンドブロックを踏んでいるプレイヤーがいれば、全員にeffectが付いちゃうんです。
…なんとなくわかりますか?

そこでこうしてみます。

execute as @a at @s if block ~ ~-1 ~ diamond_block run effect @s ...

全プレイヤーが、それぞれ自分の位置で、1ブロック下にダイヤモンドブロックがあれば、effectを”自分自身に”付与します。

これでうまく動きそうですよね。実際動きます。

3.「at」


atは、これ以降のサブコマンドを実行する座標・視線角度・ディメンションを指定したエンティティのものにします。
要は"どこで"実行するかをセレクターを使って決めます。
構文はこちら。

at (セレクター) (サブコマンド)

このサブコマンドはあくまでもコマンドを実行する位置を指定するだけであり、コマンドの実行者はそのままです。
つまり「execute at @p run say a」とコマンドブロックに入力して実行してもコマンドブロックが喋ってしまうわけです。

また、セレクターで@aや@eなどの複数のエンティティを指定した場合、セレクターに合う対象の数だけ実行されます。
要はセレクターで指定したやつら全部の場所で実行されます。
これはかなーり重要なので覚えておいてください。

コマンドの例 :

execute at @e[type=armor_stand] run setblock ^ ^ ^1 stone 


この場合の実行者と実行座標

全ての防具立ての位置から、それぞれの防具立ての向いている方向1ブロック先に石を設置します。
見逃されがちですが、atは視線角度とディメンションも取得することをお忘れなく。
「at」は、指定したエンティティの「向き」も取得するので、^ ^ ^1でそれぞれのエンティティの目の前が指定できています。

4.「positioned」


positionedは、コマンドを実行する座標を指定します。
視線角度やディメンションは取得しません。
atとは違い、セレクターだけでなく座標の入力でも実行する位置を決めることができます。
※atの上位互換という訳ではありません
構文はこちら。

positioned (座標) (サブコマンド)

or

positioned as (セレクター) (サブコマンド)

「positioned 10 20 30」とすると座標 x=10,y=20,z=30を基準にコマンドを実行し、「positioned as @e」とすると全エンティティの位置でコマンドを実行します。

コマンドの例 :

execute positioned ~ ~4 ~ run say @e[c=1]
この場合の実行者と実行座標

コマンドブロックの4ブロック上から最も近いエンティティをsayします。
positionedは実行座標をずらす際によく使うのでそっちの覚え方のほうがいいかもしれません。

また、atとは異なりpositioned asは座標のみを取得します。視線角度、ディメンションは取得しません。
そのため、例えば防具立ての目の前に石を設置するようなコマンドをpositioned asを使って書き、オーバーワールドで実行してみると、

execute positioned as @e[type=armor_stand] run setblock ^ ^ ^1 stone

もしこの防具立てがネザーにいた場合、座標だけが防具立ての位置に合わせられ、石が置かれるのはオーバーワールドです。
しかも、防具立ての向いている方向も正しく適用されず、コマンドブロックが向いている向き(統合版では常に真北向き)に向かって1ブロック進んだ場所に石が置かれます。

これを防ぎたいのであれば、サブコマンド「at」を使用することで解決します。
逆に、新executeに慣れてくるとこのatとpositioned asの仕様の違いを利用してコマンドを書いたりします。
バグではありません。決して。

5.「if」


ifは、もしも指定した条件を満たしていればそれ以降のコマンドを実行するサブコマンドとなります。条件を満たしていなければそこで実行は失敗。打ち切りになります。
旧executeで言うdetectの機能もここに統合されています。
構文はこちら。

if (条件) (サブコマンド)

or

if (条件)

上の書き方では、条件を満たしていた場合に後続のサブコマンドを実行してくれます。
下の書き方では、条件を満たしているかどうかを調べて、チャットやコマンドブロックの実行ログとかに満たしているかを出力してくれます。

この「条件」ですが、ちゃんと書き方は決まっています。
この「条件」について一つ一つ見ていきます。

1.「entity」


「もしも指定したエンティティが存在した場合…」という条件です。
構文はこちら。

entity (セレクター)

コマンドの例 :

execute if entity @e[r=3] run say a

コマンドブロックから離れて実行しても何も起こりませんが…

コマンドブロックに近付いて実行するとメッセージが送信されました。

もしも「コマンドブロックから半径3m内のエンティティ」がいたらsayを実行するコマンドになっています。

if entity @e[type=creeper]とかにすると、ワールド(読み込まれている場所)のどこかにクリーパーがいればaというメッセージを出力してくれるコマンドになりますね。

2.「block」


「もしも指定した座標にあるブロックが特定のものだった場合…」という条件です。
構文はこちら。

block (座標) (ブロックID) (ブロックステート)

なお、ブロックステートは記述しなくても問題ありません。その場合ブロックステートが何であれ、ブロックIDさえ合っていれば条件を満たしたことになります。

コマンドの例 :

execute if block ~ ~1 ~ wool ["color"="black"] run say a

コマンドブロックの1ブロック上に黒い羊毛があるときだけsayを実行します。

また、if blockではチェストの中身等のNBTまで確かめることはできません。
ブロックのIDと、色や向きとかのブロック状態だけですね。

3.「blocks」


「もしも指定した2つの範囲のブロックが一致していた場合…」という条件です。
構文はこちら。

blocks (比較元の始点座標) (比較元の終点座標) (比較先の始点座標) (all|masked)

比較元の始点座標から終点座標までの範囲を比較先の始点座標を基点とした範囲と比較します。
比較先座標には指定したい範囲内の最小の座標を入力します。
最小の座標というのはcloneやtestforblocksの指定の仕方と同じ感じです。
これに関しては前提知識なので解説は控えます。

all、maskedは比較のモードです。
allは空気ブロックも含めて完全に一致させる必要があります。
しかしmaskedでは、比較元の範囲で空気ブロックである場所が、比較先の範囲で何かしらのブロックで埋まってしまっていても条件を満たしたことになります。

コマンドの例 :

execute if blocks ~ ~1 ~ ~ ~2 ~ ~ ~1 ~-2 all run say a

2つが一致しているとsayが実行されますが、

少しでも一致していなければ実行はされません。
また、条件「block」とは異なり、チェストの中身などのNBTまで一致させる必要があります。

4.「score」


「もしも指定したもののスコアが特定の値だった場合…」という条件です。
構文はこちら。

score (ターゲット) (オブジェクト) (スコアの条件)

何故「セレクター」や「エンティティ」ではなくわざわざ「ターゲット」と書いたのか。
それはこの「if score」がエンティティのスコアだけでなくダミープレイヤーが持つスコアの値も条件にできるからです。

ダミープレイヤーについては…前提知識ですね。ここでは解説しません。

また、if scoreのターゲットは単体のエンティティを指定しなければいけません。
アップデートにより、複数の対象を指定すると構文エラーになるよう変更が加えられました。
if score @sとかはokですが、if score @aとかはダメってことですね。

「スコアの条件」についてですが、いくつかから一つを選択して使用します。
早速全て紹介します。

・「 < 」
こちらはスコアの値が指定したもう一つのスコアの値より小さかった場合を指定します。
構文はこちら。

< (ターゲット2) (オブジェクト2)

ターゲット1のスコアがターゲット2より小さかった場合です。
オブジェクト2とか書いてありますが勿論ターゲット1で使用したオブジェクトと同じものを記述しても問題ありません。

・「>」
こちらは先程の逆、スコアの値が指定したもう一つのスコアの値より大きかった場合を指定します。
構文はこちら。

> (ターゲット2) (オブジェクト2)

ターゲット1のスコアがターゲット2より大きかった場合になります。

・「<=」
こちらはスコアの値が指定したもう一つのスコアの値以下だった場合を指定します。
構文はこちら。

<= (ターゲット2) (オブジェクト2)

ターゲット1のスコアがターゲット2以下であった場合になります。

・「>=」
こちらはスコアの値が指定したもう一つのスコアの値以上だった場合を指定します。
構文はこちら。

>= (ターゲット2) (オブジェクト2)

ターゲット1のスコアがターゲット2以上であった場合になります。

・「=」
こちらはスコアの値が指定したもう一つのスコアの値と等しかった場合を指定します。
構文はこちら。

= (ターゲット2) (オブジェクト2)

ターゲット1のスコアがターゲット2と一致した場合になります。

・matches
こちらはスコアの値が指定した範囲の中にあった場合を指定します。
この範囲というのは直接数値を指定する形です。
構文はこちら。

#指定した数値だった場合
matches (数値)

#指定した数値以下だった場合
matches ..(数値)

#指定した数値以上だった場合
matches (数値)..

#数値A以上数値B以下だった場合
matches (数値A)..(数値B)

セレクター引数scores=と同じような指定方法になります。
このmatchesのお陰でダミープレイヤーのスコアをテストする際にscoreboard players testを使う必要はなくなりました。

コマンドの例 :

execute if score "$A" test = "$B" test run say a

ダミープレイヤー$Aの、オブジェクト名「test」の値が、ダミープレイヤー$Bの、オブジェクト名「test」の値と等しかった場合のみsayを実行します。

6.「unless」


unlessは、もしも指定した条件を満たしていなければそれ以降のコマンドを実行するサブコマンドとなります。条件を満たしていればそこで実行は失敗です。
構文はこちら。

unless (条件) (サブコマンド)

or

unless (条件)

この構文、ifにそっくりだと思いませんか?
…そう、つまりunlessはifの真逆に位置するサブコマンドです。指定可能な条件等も全てifと同様になります。

ifを用いて書いた条件A(仮)が真であった場合、これをunlessに書き換えると偽、つまり条件を満たしていませんよ~と言われてしまいます。
逆に、ifを用いて書いた条件B(仮)が偽であった場合、これをunlessに書き換えると真になります。
真とか偽とかよくわかんねぇ!という方はとりあえず「ifの逆」であることを理解しておけばいいです。

条件はifを参照してください。

7.「rotated」


rotatedは、指定した方向を向いていると仮定してそれ以降のコマンドを実行します。
構文はこちら。

rotated (横角度) (縦角度) (サブコマンド)

or

rotated as (セレクター) (サブコマンド)

上の方の指定方法では、縦と横の角度をそれぞれ入力し、その方向を向いていると仮定してコマンドを実行していきます。相対的な角度を~を使って指定することも可能です。

下の指定方法では、指定したセレクターが実際に向いている方向と同じ方向を向いていると仮定してコマンドを実行していきます。

なお、セレクターはif scoreのように単体である必要はありません。セレクターに合う対象の数だけコマンドは実行されます。

コマンドの例 :

execute rotated as @p run setblock ^ ^ ^5 stone

実行すると、コマンドブロックの位置から@pの視線角度が適用された位置に石が設置されました。
もしこれが@eなどになると実行数は増加し、同時に複数の方向を向いているとして実行することになります。つまり石が複数個設置されます。

8.「facing」


facingは、指定した位置に「視線を合わせている」と仮定しそれ以降のコマンドを実行します。
構文はこちら。

facing (座標) (サブコマンド)

or

facing entity (セレクター) (eyes|feet) (サブコマンド)

entityモードの場合、eyes|feetのどちらかを選択する必要があります。eyesは指定したセレクターのエンティティの目に視線を合わせていると仮定、feetは足先に視線を合わせていると仮定します。
とりあえず困ったらfeet選んどけば良いと思います。feetの場合、tpのfacingで向く方向と同じになります。

コマンドの例 :

execute facing ~10 ~5 ~5 run setblock ^ ^ ^2 stone

コマンドブロックを基準にx=+10,y=+5,z=+5の座標の方を向いていると仮定して2ブロック先に石が設置されます。

またentityモードのセレクターは、tpのfacingとは違い単体である必要はありません。セレクターに合う対象の数だけコマンドは実行されます。
要はrotatedと同じく同時に複数の方向を向いているとして実行することができます。

またこのサブコマンドはrotatedと役割が混同されやすいです。
どちらも特定の方向を向いていると”仮定”するサブコマンドですが、
rotatedは直接「向き」を決めるのに対して、
facingは現在の位置から特定の位置への方向を「向き」としてそのまま使います。

9.「align」


alignは、実行座標の小数点以下を切り捨てます。x軸、y軸、z軸のうちいずれかを切り捨てることも可能です。
構文はこちら。

align (x|y|z|xy|yz|xz|xyz) (サブコマンド)

切り捨てたい軸を選択することが可能です。
またx、y、zの文字の順番は問いません。yzをzyにしても、xyzをyzxにしても大丈夫です。

コマンドの例 :

execute align xyz run tp @p ~ ~1 ~

コマンドブロックがある座標の小数点以下を切り捨てした座標、つまりコマンドブロックの端の1ブロック上にテレポートしました。

もし~ ~1 ~ではなく~0.5 ~1 ~0.5とした場合、コマンドブロックの中心の1ブロック上にテレポートします。

また、

align xyz positioned ~0.5 ~0.5 ~0.5

を使うことでブロックの中心の座標を取得できるのは覚えておいたほうがいいです。何かと使うし…

10.「anchored」


anchoredは、サブコマンドfacingやローカル座標の基準位置として、実行者として指定されているエンティティの目または足先を使うよう指定するためのサブコマンド

…とか何か難しいこと言おうとしましたが、
統合版のanchoredはJava版のanchoredとは仕様がかなり違います。それはもはやバグと言ってもいい程に。

とりあえず構文はこちら。

anchored (eyes|feet) (サブコマンド)

サブコマンドatもしくはサブコマンドpositioned asを用いてセレクターで指定したエンティティの、目の位置もしくは足先の位置を実行座標にします。

コマンドの例 :

execute at @a anchored eyes run particle minecraft:basic_flame_particle ^ ^ ^2

十字のカーソルがないのでわかりにくいですが、プレイヤーの視線の先にパーティクルが出ています。
つまり実行座標がプレイヤーの目の位置になりました。

このサブコマンドは、Java版との仕様の違いとしてある程度許容するにしても、明らかにバグと呼べるものが存在するため使用を推奨しません。
いつかJava版と同じになるように修正されて、今までに作ったコマンドの中にanchoredがあったら壊れるかもしれませんから。

11.「in」


inは、コマンドを実行するディメンションを指定します。
構文はこちら。

in <ディメンションID> <サブコマンド>

ディメンションIDにはバニラでは

  • overworld

  • nether

  • the_end

の3つのうちいずれかが入ります。
そこまで難しいサブコマンドではないですね。

コマンド例 :

execute in nether run say @e[rm=0]

rm=0でそのディメンション内にいるエンティティをsayしようとしましたが、ネザーは読み込まれていないので何も出ませんでした。

別のディメンション行くの面倒だったからこれで許して

これでサブコマンドは全てになります。

各サブコマンドのまとめ的な


as ・・・これ以降の@sが指し示すものを変える。

at・・・これ以降のコマンド・サブコマンドを実行する位置・向き・ディメンションを、セレクターを用いて指定する。

positioned・・・これ以降のコマンド・サブコマンドを実行する位置を、絶対座標・相対座標・ローカル座標またはセレクターを用いて指定する。

if・・・これ以降のコマンドを実行する条件を、entity・block・blocks・scoreのいずれかから指定する。

unless・・・ifの反対。構文もifと同じだが、ifとは異なり条件を"満たしていなかった"場合に成功する。

rotated・・・これ以降のコマンド・サブコマンドを実行する向きを、角度の直接指定・現在の角度との相対的な角度での指定、もしくはセレクターでそのエンティティの向きを実行する向きとして使うことで指定する。

facing・・・これ以降のコマンド・サブコマンドを、このサブコマンドが実行された位置から、指定された絶対座標・相対座標・ローカル座標、またはセレクターを満たすエンティティが存在する方向を向いているとして実行する。

anchored・・・これ以降のコマンド・サブコマンドを実行する位置を、実行者の目の位置または足先の位置に設定する。
(現在使用非推奨)

in・・・これ以降のコマンド・サブコマンドを実行するディメンションを、overworld・nether・the_endのいずれか一つから指定する。

となります。忘れたときにでも見てください…

新executeのバグについて


現在新executeには幾つかのバグが存在します。
この時点で既に修正されているバグについては書きません。

1.「anchored4つのバグ」


anchoredはJava版との仕様の差が激しいサブコマンドです。
ここではその仕様の違いをバグとして紹介します。

4つのバグとは、

  1. 実行者ではなく実行座標として指定されたエンティティの目または足先を使ってしまっている

  2. 相対座標の基準位置になってしまっている

  3. セレクター探索の基準座標になってしまっている

  4. positionedやanchoredを使って変更した実行座標をさらにanchoredで上書きできない

…です。
1つ目のバグは本当に謎です。
atまたはpositioned asで指定されたセレクターを基準に実行位置を動かしてしまっています。

2つ目3つ目のバグは同一の要因が引き起こしています。
統合版に実行アンカーという概念がないことです。
本来anchoredは実行座標ではなく実行アンカーという特殊なものを動かすものなのですが、どうやら代わりに実行座標を動かしているようです…

4つ目のバグは少し複雑です。
例えば、

execute as @a at @s positioned ~ ~ ~ anchored eyes

とすると、実行座標は何故か足先になります。
また、

execute as @a at @s anchored eyes anchored feet

こうすると実行座標は目の位置です。

この仕様をうまく説明した文章を、Discordサーバー「コマンダーの集い」より引用させていただきます。

# 実行座標と「目線の高さ」による説明

- `at ~`, `positioned ~`, `anchored ~` は実行座標と同時に目線の高さを取得・更新する
- 実行アンカーはない
- `at XX`, `positioned as XX` は実行座標をXXの座標、目線の高さをXXによるものにする
- `positioned X Y Z` は実行座標を(X,Y,Z)、目線の高さを0にする
- `anchored feet` は実行座標はそのまま、目線の高さを0にする
- `anchored eyes` は実行座標は目線の高さの分だけ上げ、目線の高さを0にする
- `positioned X Y Z`, `anchored XX` は目線の高さが0なので`anchored ~`が効かない
- セレクターの基準座標、相対座標、ローカル座標は実行座標のみが使われる

フォーラム > 「anchoredい〜感じに説明した〜〜〜い」 > szea_ll14様
(https://discord.com/channels/941651004884152380/1110606981523312670/1110608936266125442)


1.20.50現在もこのバグ(仕様)は修正されていません。

2.「階段ブロックやハーフブロックの上に登った際のバグ」


ハーフブロックや階段ブロックの上に登ったとき、r=などの範囲指定のセレクター引数の基準座標(=セレクター探索基準座標)とプレイヤーが実際に存在する座標との間でズレが発生するバグです。

これに関しては実際に実行してもらった方が早そうです…

execute as @a at @s run title @s[rm=0.1] title A

上記のコマンドを実行すると、通常は何も起こりませんが、ハーフブロックや階段を登ったときのみtitleが実行されてしまいます。

旧execute時代からあったものっぽいので、治るのはまだ先になりそう…?

JEとBEの処理順の違いについて


executeには「処理順」という概念があります。
例として次のようなコマンドを実行します。

#BEの場合
execute as @e[c=2] as @e[c=2] as @e[type=armor_stand] at @s run tp ^ ^ ^1

#JEの場合
execute as @e[limit=2,sort=nearest] as @e[limit=2,sort=nearest] as @e[type=armor_stand] at @s run tp ^ ^ ^1

BEではアマスタは4ブロック程前にtpしますが、JEではアマスタは1ブロック分しかtpしません。
これはBEとJEでサブコマンドの処理順が異なるためです。

            エンティティ1 as @e[type=armor_stand] at @s run tp…
     エンティティ1 as ━┻ エンティティ2 as @e[type=armor_stand] at @s run tp…
execute as ━┫ 
     エンティティ2 as ━┳ エンティティ1 as @e[type=armor_stand] at @s run tp…
            エンティティ2 as @e[type=armor_stand] at @s run tp…

実行者が複数指定されているためこのように分岐します。
BEでは、

BEの処理順

このようになります。
ちょっと見づらいですが、初めの実行者としてコマンドを実行し終えてから、また別の実行者としてコマンドが実行されていきます。

しかしJEでは、

JEの処理順

このようになります。
これまた見づらいですが、各サブコマンドの処理が全て終わってから、その後のサブコマンドの処理に移る形です。

よって、Java版では、atで実行座標が決定された段階でどこにテレポートするかは決まっているので、4ブロック分のtpはしないのです。

ちょっと難しいので、無理に理解する必要はないです。

Ver 1.19.50〜の新execute


1.19.50以降のexecuteは、
・旧executeは一文字たりとも書き換えなければ使える
・1.19.50以前にコマンドブロックに書かれた新executeは書き直す必要がある
というような状況になっています。

この「書き直す」とは最低限どこまでやる必要があるのかというと、コマンドを1文字でも書き換える、または書き加える、どこか一文字でも消す、というようにコマンドを更新すれば書き直した判定になるようです。

つまり、「a」と書き加えて一度コマブロを閉じ、再度開いて「a」を消せば書き直したことになります。
どこかにスペースを加えても大丈夫です。
ただしコマンドの最後に加えても意味はありません。

書き直した判定にさせる方法はいくつかあります。自分にとって効率的な書き換え方を探してみてください。

また、どうしても面倒な方は、pcやスマホ限定になりますがmcstructureを利用するのがオススメです。
コマンドブロックのNBTの一つ、「Version」を23にすると旧executeのコマンドブロックに、25にすると新executeのコマンドブロックになるようです。
つまり.mcstructureファイル内のコマブロのデータを書き換えることでも新executeの構文エラーを消すことができるようです。

旧executeから新executeへの変換


必要以上に書いてもわかりにくいだけだと思うので簡潔に。

###detect不使用の場合───────

旧execute
execute (セレクター) (座標) (コマンド)

⬇

新execute
execute as (セレクター) at @s positioned (座標) run (コマンド)

###detectを使用している場合───────

旧execute
execute (セレクター) (座標) detect (調べる座標) (ブロックID) (データ値orブロックステート) (コマンド)

⬇

新execute
execute as (セレクター) at @s positioned (座標) if block (調べる座標) (ブロックID) (ブロックステート) run (コマンド)

こうなります。
新executeが全くわからんという方はそのまま使ってください。
なお、ブロックステートは別に書かなくても問題ありません。

run executeやpositioned ~ ~ ~等省ける場合が多いですが無理に省く必要はありません。省いたところで動作が変わるわけでもないですし…

さいごに


新executeの解説は以上になります。
分かりやすく書くつもりでしたが途中から難しくなってしまいました()
さらに17000文字を超えている。たかが一つのコマンドの解説にしては長すぎる気が…

コマンド上級者の方々からすれば「ここ厳密には違うやろ」みたいな箇所があるかと思いますが敢えて解説用に分かりやすくしてるので許してくださいと言い訳しておきます。(

記事の一番上に最終更新出てますが、2023/12/13にさらにわかりやすく書き換えました。これで新executeを使いこなせる人がより増えることを願っています。

では。

いいなと思ったら応援しよう!