ルッキーのコマンドメモ

主にマイクラのコマンドやデータパックに関することを書いていきます。

(マイクラ コマンド・データパック) 複数の種類のエンティティを対象にしてコマンドを実行する

複数の種類のエンティティを指定してコマンドを実行する

今回は、複数の種類のエンティティを対象にしてコマンドを実行する方法について書いていきます。

目次

セレクタのtype引数は一度に複数回使えない......

複数の種類のエンティティを対象として実行しようとすると、まずは以下のようなコマンドが思い浮かぶと思います。

# エラーになる例
kill @e[type=cow,type=pig]

このようなコマンドはエラーになってしまいます。
セレクターの引数であるtypeは1度に複数回使えないからです。
(そもそも、このような文では牛であり豚でもあるエンティティという訳のわからないエンティティを指定することになるため、実行できたとしても思った通りには動作しないと思われます。)

どうやって複数のエンティティを対象にするか

上記のように、単にtype引数を複数並べるだけではエラーとなってしまい、複数のエンティティを指定することはできません。

最も簡単な解決策

シンプルな解決策として、コマンドの数を増やすというものがあります。

kill @e[type=cow]
kill @e[type=pig]

このように一度に使うtype引数を1つにして、同じコマンドを複数回実行すれば、複数のエンティティを対象に実行できます。

何度も同じ対象を呼び出す場合

何度も同じ対象にコマンドを実行する場合、あらかじめタグをつけておくをつけておくことで以降の呼び出しを簡単にできます。

#対象に同じタグをつけておく
tag @e[type=cow] add cow_or_pig
tag @e[type=pig] add cow_or_pig

# 先にタグをつけておけば1コマンドで指定できる
execute @e[tag=cow_or_pig] say yes
kill @e[tag=cow_or_pig]

1コマンドで対象を指定する方法

上記のような方法では指定したいエンティティの種類が増えてくるとコマンドの数がとても多くなってしまうため、書くのがとても大変になります。
そこで、1コマンドだけで複数のエンティティを対象にする方法を紹介します。

execute as @e unless entity @s[type=!cow,type=!pig] run kill @s

このように書くことで、1コマンドだけで豚と牛の両方をkillすることができます。
先ほど、type引数は一度に1回しか使えないと言いましたが、実は、type=!<エンティティ>という形でそのエンティティ以外を対象にしたい場合には一度に何度も使うことができます。

この性質を利用して、牛でも豚でもないエンティティ以外のエンティティを対象としてコマンドを実行することで、牛と豚のみを対象にとることができます。

entity_typesを利用する方法

最後に、データパックでのみ使える方法ですが、entity_typesを用いて複数の対象を指定する方法を紹介します。

データパックのdata/<名前空間>/tags/entity_typesに、<好きな名前>.jsonというファイルを作り、以下のように記述します。

{
  "values": [
    "pig",
    "cow"
  ]
}

こうすることにより、以下のようにしてこのファイルに書いたエンティティを対象にコマンドを実行できます。

kill @e[type=#<名前空間>:<指定した名前>]

一見、これはとても面倒な方法に思えますが、対象にとるエンティティを後から変えたくなった場合に、先ほど記述したjsonファイルの中身を変えるだけで全てのコマンドの対象が変化するため、管理がとても楽になるという利点があります。

まとめ

複数種類のエンティティを対象にコマンドを実行したい場合には以下の要な方法があります。

  • コマンドの数自体を増やす
  • execute unlessを利用する
  • entity_typesを利用する

それぞれの方法に利点と欠点があると思うので用途に合わせて使い分けていきましょう。