【最新版】MinecraftJE1.13で/executeを使おう【18w02a】

※Snapshot18w02a時の情報です。今後変更が加わる可能性もあります。また、一部誤字等誤りがある可能性もあります。ご了承ください。

 

以前この記事にて1.13の/executeの解説記事を書きました。https://skyblock.jp/2017/11/11/mcje-1-13-execute/

ですが、本日2018/01/10に公開されたSS18w02aにて先の記事から変更が加わったため今回新規に投稿し直すことにしました。

誤字脱字等あれば指摘して頂けると幸いです。


 

〈1.12までからどう変わったの?〉

そもそも構文が変わりました。

1.12.2まで:/execute <セレクタ> <座標> <実行したいコマンド>

1.13から:/execute [<at | as | anchored | align | facing | rotated | in | if | unless | positioned | store> ...] [...] [run <command>]

ʕ ・ _・ʔ

 

ʕ ・ _・ʔ<・・・?

 

無理やり一行のコマンドで表そうとするとややこしいので、まず次のことを覚えてください。

  • /executeの後には上記の引数のいずれかが来る(ここではrun以外でこれらの引数を含めたものをサブコマンドと呼びます)
  • サブコマンドをすべて書き終わったらrunで実行したいコマンドを書く
  • サブコマンドの設定後、更にサブコマンドを設定できる
  • サブコマンドを一切書かず、runのみを指定しても動作する
  • サブコマンドによってはrunを指定しなくても動作する

つまり、サブコマンドさえ理解してしまえば大して難しくありません。

また、1.12.2以前との変更点として、以下のコマンドが/executeに吸収されました。

  • /stats
  • /testfor
  • /testforblock
  • /testforblocks

そしてサブコマンドをざっくりとまとめたものが次の表です。

名称引数ざっくりとした説明
at<selector>指定したエンティティの座標・向き・ディメンション等を実行の基準にする
as<selector>指定したエンティティを実行者にする
positioned<pos> または as <selector>(前者)指定した座標を実行点にする (後者)指定したエンティティの座標を実行の基準点にする
rotated<y x> または as <selector>(前者)指定した角度分向きをずらす (後者)指定したエンティティの向きを実行の基準にする
facing<pos> または entity <selector> <eyes|feet>(前者)指定した座標に視点を合わせる (後者)指定したエンティティに視点を合わせる
anchored<eyes|feet>ローカル相対座標やfacingの基準位置をずらす
in<overworld|the_end|the_nether>実行ディメンションを変更する
align<x|y|z|xy|xz|yz|xyz>現在の実行点の指定した軸方向の座標の小数点以下を丸めたものを実行点にする
if<entity|block|blocks|score> …(runがある場合)引数で指定した物が存在すればrunを実行する
(runがない場合)引数で指定した物が存在すればコマンド実行に成功する
unless<entity|block|blocks|score> …ifの「存在しなければ」版
store<success|result> …runコマンドの結果を得て何かをする
(run)<command>実行したいコマンドの指定をする

 

ではサブコマンドの解説に入ります。


〈at・as・positioned・rotated・facing・anchored・in・align〉

これらは「実行点・実行者・向き変更」のサブコマンドです。

・at | as

<at | as> <セレクタ>

at・asの引数はセレクタ一つです。

atは「executeの実行者」が「セレクタのエンティティの座標・向き・ディメンション」でコマンドを実行するように、

asは「セレクタのエンティティ」が「executeの実行点」でコマンドを実行するようになります。

atは18w01aまでと仕様が異なっています。

「セレクタのエンティティの座標でコマンドを実行」(座標のみ変更)

→「セレクタのエンティティの座標・向き・ディメンションでコマンドを実行」(向き等も変更)

このため、ローカル相対座標等もatで指定したエンティティの向きが基準になるようになりました。

・positioned

positioned <座標>またはpositioned as <セレクタ>

positionedの引数の内、前者は「指定した座標でコマンドを実行」します。

つまり、先のat・asと組み合わせて/execute as <セレクタ> at @s offset <座標> run <コマンド>とすることで、1.12.2までの/execute <セレクタ> <座標> <コマンド>と同じ動作になります。

後者の引数は「指定したエンティティの座標でコマンドを実行」するはずですが、18w02a現在正常に動作していません。

後者は18w01aまでのatサブコマンドと同じ動作と予想されます。

・rotated

rotated <向き指定>またはrotated as <セレクタ>

rotatedの引数の内、前者は「指定した向きでコマンドを実行」します。ローカル相対座標等の挙動に影響します。

後者の引数は「指定したエンティティの向きでコマンドを実行」するはずですが、positioned同様18w02a現在正常に動作していません。

・facing

facing <座標>またはfacing entity <セレクタ> <eyes|feet>

facingの引数の内、前者は「指定した座標が視点の先に来るように実行する向きを設定」します。

後者は「指定したエンティティが視点の先に来るように実行する向きを設定」します。引数の<eyes|feet>は指定したエンティティのどこに視点を合わせるか指定します。

・anchored

anchored <eyes|feet>

ローカル相対座標などで基準となる点を実行対象の目にするか足にするか、を設定できます。

指定が無い場合はfeetと同じ挙動になります。

・in

in <overworld|the_end|the_nether>

コマンドを実行するディメンションを設定します。

・align

align <軸指定>

alignの引数にはx,y,zの内対象にしたい軸をまとめて書きます。

x,y,zの順番はどれが先でも大丈夫なので、例えばx,y,z軸全てを指定したい場合はxyzでもxzyでもyxzでもyzxでもzxyでもzyxでも問題ありません。

例えば、/execute align xyz run summon armor_stand ~0.5 ~0.5 ~0.5 {NoGravity:true}自身の今いるブロックの中心に、NoGravityアーマースタンドを召喚できます。

個人的には、地味ですが結構すごい仕様ではないかなと思っています。


〈if・unless〉

これらは「条件付き実行」のコマンドです。

ifは「条件が満たされた場合」、unlessは「条件が満たされなかった場合」にrunのコマンドを実行するか、runが指定されてなければコマンドの実行に成功します。

2つとも引数は同じなので引数毎に解説します。

<if | unless> <entity|block|blocks|score>

・entity

<if | unless> entity <セレクタ>

セレクタで指定したエンティティが存在するか」の条件です。

/functionコマンドのif・unlessと同じ仕様で、実行点や実行者は変化しません。

また、/execute if entity <セレクタ>で1.12.2までの/testforコマンドと同じ動作になります。

・block

<if | unless> block <座標> <ブロック>

指定した座標に指定したブロックが存在するか」の条件です。

1.12.2までのdetectです。

また、/execute if block <座標> <ブロック>で1.12.2までの/testforblockコマンドと同じ動作になります。

・blocks

<if | unless> blocks <始点座標> <終点座標> <比較先座標> <all | masked>

指定した範囲のブロックが比較先の同じ範囲のブロックに等しいか」の条件です。

allは「空気ブロックを含む全てのブロックが等しいか」、maskedは「比較元の空気ブロックを除いたブロックが比較先のブロックと等しいか」を条件にします。

maskedの場合、比較先の比較元では空気ブロックの場所にブロックが設置されていても、そのブロックは無視されます。

また、/execute if blocks <始点座標> <終点座標> <比較先座標> <all | masked>で1.12.2までの/testforblocksコマンドと同じ動作になります。

・score

<if | unless> score <セレクタ1> <オブジェクト1> (< | <= | = | >= | >) <セレクタ2> <オブジェクト2>または

<if | unless> score <セレクタ> <オブジェクト> matches <数値範囲指定>

前者は「比較元のプレイヤーのスコアと比較先のプレイヤーのスコアを比べたときに等号不等号を満たしているか」の条件です。

/execute if score <セレクタ1> <オブジェクト1> (< | <= | = | >= | >) <セレクタ2> <オブジェクト2>で1.12.2までの/scoreboard players testコマンドの比較版のようになります。

後者は「指定のプレイヤーのスコアが範囲内にあるか」の条件です。数値範囲指定は最小値a,最大値bの場合「a..b」のように指定します。

/execute if score <セレクタ> <オブジェクト> matches <数値範囲指定>で1.12.2までの/scoreboard players testコマンドと同じ事が可能です。


〈store〉

これは「runで実行したコマンドの結果を得る」コマンドです。1.12.2までの/statsが進化したような感じです。

store <success | result> <score | block | entity> ...

まず前側の引数2つから説明します。

・success | result

実行したコマンドの結果の形式」を指定します。

successは「実行したコマンドの成功した回数」を、resultは「実行したコマンドの返り値」を得ます。

/statsのSuccessCountがsuccess、その他がresultになった感じのようです。

 

次に後側の引数3つを説明します。

・score

store <success | result> score <セレクタ> <オブジェクト>

コマンドの結果を指定したエンティティの指定したスコアオブジェクトに代入します。

この時、statsとは違い代入先のスコアは値が設定されていなくても問題ありません。

また、セレクタには架空のプレイヤー名を設定することも可能です。

1.12.2までの下のコマンドと

/stats entity <セレクタ1> set <取得値形式> <セレクタ2> <オブジェクト>
/scoreboard players add <セレクタ2> <オブジェクト> 0
/execute <セレクタ1> ~ ~ ~ <値を得たいコマンド>

1.13からの下のコマンドの動作は同じです。

/execute as <セレクタ1> at @s store <success | result> score <セレクタ2> <オブジェクト> run <値を得たいコマンド>

・block | entity

block:store <success | result> block <座標> <NBTのパス> <NBTの型> <スケール>

entity:store <success | result> entity <セレクタ> <NBTのパス> <NBTの型> <スケール>

コマンドの結果を指定したブロック・エンティティの指定したNBTタグに代入します。

この時、スケールに指定した値を掛けて代入することも可能です。スケールには負数や小数も使用可能です。

NBTの指定方法は、例えば{A:{B:[{},{},{C:1b}]}}でCを指定したい場合、「A.B[2].C」になります。

NBTTagCompoundやNBTTagList、NBTTagStringなどの値の書き換えは出来ません。(CompoundとListは中身の書き換えは可能)

使用例として、座標にアイテムの入ったコンテナを指定して下のコマンドを実行することで、コンテナ内のアイテムの個数が実行点から半径50m以内に居るエンティティの数になります。

/execute store result block <座標> Items[0].Count byte 1 run execute if entity @e[distance=..50]

※/dataなどで小数の値を得てそれを代入したい際には、整数を扱う時と同じようにすると動かない場合があります。これはコマンドの返り値の小数点以下が失われて整数になるためです。

/data等の値を得るコマンド側で値を定数倍して、その後store側で元の値に戻るように割る(定数の逆数を掛ける)ことである程度の精度で小数点以下も得ることが可能です。


如何でしたでしょうか?前回の記事を少し推敲し情報を最新のものに変えただけですが…

今後もSnapshotで仕様変更はあるかもしれませんし、バグも生まれるかもしれません。

それでもついていくことを諦めず、強く生きていきましょう。

 

それでは今回はこの辺で。

ここまで読んで頂きありがとうございました!

(もしかしたら/teleportとかについても書くかも…?)

どうでもいいけど6700文字超えてます…

*名前・メールアドレス・ウェブサイトは必須項目ではありません。

read next

.NETCoreを使ってCentOSでC#を動かそう!