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まで:

1.13から:

ʕ ・ _・ʔ

 

ʕ ・ _・ʔ<・・・?

 

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

  • /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は「executeの実行者」が「セレクタのエンティティの座標」でコマンドを実行するように、

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

例えば、

で全ての村人の座標に即爆クリーパーが召喚されます。

また、

で全ての村人が「アッフゥン」と発言します。

・offset

offsetの引数はx,y,zの座標です。

指定した座標でコマンドを実行します。

つまり、先のat・asと組み合わせて

とすることで、1.12.2までの

と同じ動作になります。

座標指定だけですので例は省きます。

・align

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

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

例えば、

自身の今いるブロックの中心に、NoGravityアーマースタンドを召喚できます。

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


〈if・unless〉

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

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

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

・entity

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

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

また、

で1.12.2までの/testforコマンドと同じ動作になります。

・block

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

1.12.2までのdetectです。

また、

で1.12.2までの/testforblockコマンドと同じ動作になります。

・blocks

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

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

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

また、

で1.12.2までの/testforblocksコマンドと同じ動作になります。

・score

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

で1.12.2までの/scoreboard players testコマンドの比較版のようになります。


〈store〉

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

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

・success | result

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

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

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

 

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

・score

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

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

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

1.12.2までの下のコマンドと

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

・block | entity

block:

entity:

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

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

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

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

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

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

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


如何でしたか?実際に私が試して分かった事なども盛り込んでみました。

1.13でのコマンド変更は、それまでのコマンド回路をほぼ全て動かなくするものでした。また、コマンド構文等の知識もほぼ全て身につけ直すことになりました。

しかし、決して今回のコマンドの仕様変更は良くない物だけではありませんでした。例えば、NBTの値の代入・読み取りは非常に有意義なものでしょう。

「これまでのコマンドが全部使えなくなった」と後ろ向きに考えるのではなく、「これからはこんなことが出来るようになった」と前向きに考えてみてはどうでしょうか?

 

それでは長くなってしまいましたが今回はこの辺で。

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

(もしかしたらセレクタについても書くかも…?)

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

%d人のブロガーが「いいね」をつけました。