MinecraftJE1.13で/executeを使おう
※Snapshot17w45b時の情報です。最新版では変更点があるので次の記事をどうぞ。
https://skyblock.jp/2018/01/10/mcje-1-13-execute-2/
突然ですが皆さんは「/executeコマンド」を使用したことがありますか?
これまでにコマンドで何かギミックを作ったことがある、という人であれば恐らく使ったことがあるのでは無いでしょうか?
では、/executeコマンドでは何が出来ていたでしょう?
1.12.2まではエンティティを通してのコマンド実行のみ(座標変更も可能)が出来ていました。
しかし!1.13での大幅なコマンド関連の変更に伴い、/executeに幾つかのコマンドが吸収され、また元の/executeの機能も幾つかに分かれ、さらにこれまでになかった機能まで追加されました。
構文も変更され、もしかしたら、全てのコマンドの中で最も難しいコマンドになってしまったのでは無いでしょうか?
ですが、難しくなった分、出来ることも格段に増加しました。この記事では、私クマが現在の情報を元に/executeを出来る限り細かく説明させていただきたいと思います。
目次
〈具体的にどう変わったの?〉
まず、そもそもの構文が変わりました。
1.12.2まで:
/execute <セレクタ> <pos> <実行したいコマンド>
1.13から:
/execute [<at | as | offset | align | if | unless | store> ...] [...] [run <command>]
ʕ ・ _・ʔ
ʕ ・ _・ʔ<・・・?
無理やり一行のコマンドで表そうとするとややこしいので、まず次のことを覚えてください。
- /executeの後には at as offset align if unless store run のいずれかが来る(ここではrun以外でこれらの引数を含めたものをサブコマンドと呼びます)
- サブコマンドをすべて書き終わったらrunで実行したいコマンドを書く
- サブコマンドの設定後、更にサブコマンドを設定できる
- サブコマンドを一切書かず、runのみを指定しても動作する
- サブコマンドによってはrunを指定しなくても動作する
つまり、サブコマンドさえ理解してしまえば大して難しくありません。
また、1.12.2以前との変更点として、以下のコマンドが/executeに吸収されました。
- /stats
- /testfor
- /testforblock
- /testforblocks
そしてサブコマンドをざっくりとまとめたものが次の表です。
名称 | 引数 | ざっくりとした説明 |
---|---|---|
at | <selector> | 指定したエンティティの座標を実行点にする |
as | <selector> | 指定したエンティティを実行者にする |
offset | <pos> | 指定した座標を実行点にする |
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・offset・align〉
これらは「実行点・実行者変更」のサブコマンドです。
・at | as
<at | as> <セレクタ>
at・asの引数はセレクタ一つです。
atは「executeの実行者」が「セレクタのエンティティの座標」でコマンドを実行するように、
asは「セレクタのエンティティ」が「executeの実行点」でコマンドを実行するようになります。
例えば、
/execute at @e[type=villager] run summon creeper ~ ~ ~ {Fuse:0}
で全ての村人の座標に即爆クリーパーが召喚されます。
また、
/execute as @e[type=villager] run say アッフゥン
で全ての村人が「アッフゥン」と発言します。
・offset
offset <座標>
offsetの引数はx,y,zの座標です。
指定した座標でコマンドを実行します。
つまり、先のat・asと組み合わせて
/execute as <セレクタ> at @s offset <座標> run <コマンド>
とすることで、1.12.2までの
/execute <セレクタ> <座標> <コマンド>
と同じ動作になります。
座標指定だけですので例は省きます。
・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>
「比較元のプレイヤーのスコアと比較先のプレイヤーのスコアを比べたときに等号不等号を満たしているか」の条件です。
/execute if score <セレクタ1> <オブジェクト1> (< | <= | = | >= | >) <セレクタ2> <オブジェクト2>
で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側で元の値に戻るように割る(定数の逆数を掛ける)ことである程度の精度で小数点以下も得ることが可能です。
如何でしたか?実際に私が試して分かった事なども盛り込んでみました。
1.13でのコマンド変更は、それまでのコマンド回路をほぼ全て動かなくするものでした。また、コマンド構文等の知識もほぼ全て身につけ直すことになりました。
しかし、決して今回のコマンドの仕様変更は良くない物だけではありませんでした。例えば、NBTの値の代入・読み取りは非常に有意義なものでしょう。
「これまでのコマンドが全部使えなくなった」と後ろ向きに考えるのではなく、「これからはこんなことが出来るようになった」と前向きに考えてみてはどうでしょうか?
それでは長くなってしまいましたが今回はこの辺で。
ここまで読んで頂きありがとうございました!
(もしかしたらセレクタについても書くかも…?)
どうでもいいけど5600文字超えてます…
4 Comments
masac225
エンティティの数をプレイヤーのアイテムスロットの一番左にあるアイテムの数として表示したい場合はどうすれば良いでしょうか?
kuma1008
現時点(18w11a)では出来ません。今後実装されるであろう/modifyitemコマンドを使用することで可能になるはずです。
masac225
エンティティの数をプレイヤーのアイテムスロットの一番左にあるアイテムの数として表示したい場合はどうすれば良いでしょうか?
kuma1008
現時点(18w11a)では出来ません。今後実装されるであろう/modifyitemコマンドを使用することで可能になるはずです。