この記事では、Minecraft Java Edition(バージョン1.17.1)の情報をもとに執筆しています。
そのほかのバージョンや機種などでの動作は保証できません。
コマンドでブロックを検知したいマインクラフター
「特定の位置に指定したブロックがあるときだけ、コマンドを実行したい。どうすればできるのかな? 立体的な配置を検知することもできたら嬉しいな。ディスペンサーのようなアイテムを入れられるアイテムは中身も判断されちゃう?」
こんな疑問を解決します!
- if blockでブロックの有無を判断する
- 立体的なブロックの配置にはif blocks
- ディスペンサーなどの中身までは判断できない
こんにちは! マインクラフターのなつめ(@natsume_717b)です。
マイクラ歴は5年程で、最近は脱出マップを配布・制作しています!
→配布マップ・ダウンロードページ
今回は特定のブロックが決まった位置にある時にコマンドを実行されるようにする方法について解説していきます。
1つのブロックだけを検知する方法と、特定の範囲のブロックを検知する方法の2つを紹介するほか、ディスペンサーなどのアイテムを仕舞うことのできるブロックの中身は判定に含まれるのかということについても解説していきます。
それでは、さっそく見ていきましょう!
if blockでブロックの有無を判断する
特定の位置にブロックがあるかどうかを判定するには、executeコマンドでif blockを使う必要があります。
if blockを使うことで、「どこそこに○○ブロックがあるときに、コマンドを実行する」という仮定文にすることができるからですね。
例えば、「座標xyz10の地点にダイヤモンドブロックがあるときに、体が光る」といったコマンドを組む場合は
/execute if block 10 10 10 minecraft:diamond_block run effect give @a minecraft:glowing 1 0 true
となります。
常にダイヤモンドブロックがあるかどうかを判定する必要があるので、リピートコマンドブロックに無条件、常時実行で打ち込む必要があります。
if blockに続く”10 10 10”が座標を示しており、その後に何のブロックが置いてある場合なのかを指示しています。
今回はダイヤモンドブロックなので、”minecraft:diamond_block”とダイヤモンドブロックのIDが打ち込まれているわけですね。
run以降はeffectコマンドが記述されているだけですので、説明は割愛します。
もしeffectコマンドについて詳しく知りたいという方は、【Java版】コマンドでエフェクトを付与する方法【消し方も解説】を参考にしてくださいね。
if blockでは特定の場所に指定したブロックがある場合に、コマンドが実行されました。
しかし、○○ブロックではないときにコマンドを実行したいという場合も時としてあり得ます。
その場合は、if blockではなくunless blockを使います。
unlessはifの逆で、「どこそこに○○ブロックがない場合」といった使い方をします。
単純にifの逆と思えばOKです。
使い方も変わらず、先ほど記載したコマンドを使って書き起こしてみると、
/execute unless block 10 10 10 minecraft:diamond_block run effect give @a minecraft:glowing 1 0 true
となります。
ifでは「座標xyz10の地点にダイヤモンドブロックがある時」という判定でしたが、unlessにしたことで「座標xyzの地点にダイヤモンドブロックがない時」という判定になっています。
というわけで、ブロックの検知をするにはif blockを使います。
状況によってはunlessを使う場合もありますが、まずはifを覚えておけばOKです。
立体的なブロックの配置にはif blocks
if blockでは特定の座標に指定したブロックがあるかどうかを判定していました。
しかし広範囲のブロックを判定させたい場合に、いちいち座標を変えながらif blockを何度も打っていくのは阿保らしいです。
そこで、if blockではなくif blocksを使っていきます。
sが付いただけですが、特定の範囲にあるブロックと同じようにブロックが配置された場合にコマンドが実行できるようになります。
if blocksを使う場合は、見本となるブロックの始点と終点。比較先のブロックの始点を指定する必要があります。
言葉だけでは分かりづらいと思いますので、画像を用意しましたのでそれを見ながら実際のコマンドを解説していきます。
今回は以下の画像の状況を想定してコマンドを打っていきます。
if blocksを使う場合は、
/execute if blocks 始点 終点 比較先の始点 all/masked run 実行したいコマンド
と打ち込むのが基本です。
そこで、上記の画像通りに打ち込むと
execute if blocks 11 4 9 12 5 11 7 4 9 all run effect give @a minecraft:glowing 1 0 true
となります。
比較先の始点の後に書かれているallについては、空気ブロックを含めるかどうかを指示しています。
allにすると空気ブロックも含めて完全に一致させる必要がありますが、maskedにすると空気ブロックの場所に何かブロックがあったとしてもコマンドが実行されます。
基本的に完全に一致させた方が楽なので、allを使うことが多いですね。
このif blocksで気をつけることは、始点と終点の設定方法です。
始点と終点ともにxyzの値を設定するわけですが、終点の値の方が大きくならないといけません。
なぜか始点の値よりも終点の値の方が小さくなっていると上手く検知してくれません。
上記のコマンドでは始点、終点ともにプラスの値なので分かりやすいですが、マイナスの座標が絡んでくると少しややこしいので気をつけてください。
ともあれ、広範囲のブロックを検知するにはif blocksを使うというお話でした。
ディスペンサーなどの中身までは判断できない
if blockやif blocksでブロックの検知を行えるようになりましたが、ディスペンサーやチェストといったアイテムを仕舞えるブロックの場合は、中身も検知するのかということについて話していきます。
結論を言うと、中身までは検知しません。
中身を検知する場合もif blockを使うのですが、アイテムが収納されているブロックを指定しつつtagによって何のアイテムが入っているのかも指定しなければなりません。
if blocksでは特定のブロックを指定する項目がないので、tagの指定しようがありません。
なので、if blockに限った話になります。
詳しくは【Java版】ディスペンサーの中身を検知してコマンドを作動させる方法【解説】にて解説しているので、ディスペンサーやチェストといったブロックの中身を検知したい場合は参考にしてみてください。
というわけで、tagを指定しないif blockやif blocksではアイテムを収納しているブロックの中身を検知しないという話でした。
まとめ
というわけで、今回のまとめです。
今回使ったコマンドはこちら。
- 1つのブロックを検知する場合(if block)
/execute if block 座標 ブロックのID run 実行したいコマンド
- 特定の範囲のブロックを検知する場合(if blocks)
/execute if blocks 始点の座標 終点の座標 比較先の始点の座標 all/masked run 実行したいコマンド
- if blocksを使う際は、始点よりも終点の値が大きくなるように指定します。(xyz全て)
- if blocksを使う際、allを選択すると空気ブロックの位置も一致するようにする必要があり、maskedを指定すると空気ブロックの部分にブロックがあってもコマンドが実行するようになります。
- ディスペンサーのような中にアイテムを入れることのできるアイテムは、中身の判定までは行われません。
この記事は以上になります。