はじめに
1.19.4よりMinecraftに追加された execute のサブコマンド on 。
「自分に何かをした誰か」という記述で、実行対象を他の人へ移すことができます。
これらの基礎知識と、ちょっとした活用方法をまとめていきます。
Java Edition 1.21.10時点のお話です。
基本情報
VERY わかりやすい動画
先に まっしゅ 様の動画を観るとあなたの理解は早くなります(断言)。
execute on ... コマンド一覧
-
attacker ...
自身を攻撃してきたエンティティに対象を移す。
タグは5秒間保持される。 -
controller ...
自身の上に乗って、操縦しているエンティティに対象を移す。
自身が操縦できないエンティティのときは機能しない。 -
leasher ...
リードの元になっているエンティティに対象を移す。
プレイヤーだけでなく、フェンスの結び目も対象になる。 -
origin ...
自身を発生させたエンティティに対象を移す。 -
owner ...
自身(狼、猫等)を飼い慣らしたエンティティ(プレイヤー等)に対象を移す。 -
passengers ...
自身に乗っているエンティティに対象を移す。
その上に更にエンティティが乗っていても、自身の上にいるエンティティだけを指す。
自身の上に複数体が重なって乗っているならその全員を指す。
自身が操縦できないエンティティでも機能する。 -
target ...
自身が攻撃対象としているエンティティに対象を移す。
攻撃したかではなく、攻撃しようとしている(例:ゾンビが村人を攻撃しようと両腕を上げている)状態を指す。 -
vehicle ...
自身が現在騎乗しているエンティティに対象を移す。
originの対象例
- 矢/雪玉/ポーション等の投擲物 ⇒ 投げたエンティティ
- AECを作った残留ポーション ⇒ 投げたエンティティ
- アイテム ⇒ 捨てたエンティティ
- TNT ⇒ 着火させたエンティティ
- エヴォーカーファング ⇒ 生成したエヴォーカー
- 釣竿の浮き ⇒ 投げたプレイヤー
origin非対象例
- ブロックを設置して召喚したゴーレム系統
- /summonで召喚したエンティティ
特性
実行対象を別のエンティティに移すという要素は execute as と似ていますね。
基本的にはプレイヤーから実行するものではなく、他のエンティティから実行した結果、プレイヤーに戻ってくるという使い方が大半になると思います。
位置が変化しない
本質は execute as と似ているため、実行者を移しても座標はもとの位置のままで実行されます。追加で at @s を挟めば新しい実行者に座標も移せるので、どちらにでも選択することができますね。
可読性が向上(?)
意味を持った単語が記述に乗るので、コマンドを読んだときにちょっとだけ分かりやすいかもしれません。
ちょっとした活用法
さて、これを利用して何かスマートにものを書けないか試してみましょう。
方向指定
execute as @e[type=fishing_bobber] at @s on origin facing entity @s eyes facing ^ ^ ^-1
こんな記述をしてみると、プレイヤーの視点から釣竿の浮きを向いたときの角度で実行することができます。この後に、例えば ひろばお 様の "PlayerMotion" なんかを入れると浮きへの方向を指定してジャンプすることができます。1行で互いの位置関係から方向を出せるんです。
エンティティの死亡を検知
execute on vehicle if data entity @s {Health:0.0f}
セレクターの @e は、「HPが0になって死亡するアニメーションが流れている状態のエンティティ」を検知することができません。ただし execute on なら検知することが可能なので、予めエンティティの上に何か乗せておくことで、死亡中のエンティティを {Health:0.0f} などで読み取ることができるようになります。
エンティティの逆探知
execute on attacker if entity @e[distance=0]
座標が実行元のエンティティと同じことを利用して、条件を満たすエンティティを指定したあとに、元の実行者に対象を戻すことができます。
後半2つの要素は、過去に記事として出しているので良かったらご覧ください。
そこ、去年の焼き直しとか言わない
こんなことができれば...
痒いところに手が届かないときもあります。
summon への origin 適用
召喚したエンティティに実行対象を移せる execute summon の後に on origin で召喚元へ戻せたら、生成したエンティティのデータセットがきっとやりやすくなると思います。
set from entity に使用
data modify コマンドの参照元を execute on で指定できたら、更にコマンドの数を減らせると思います。
execute summon minecraft:ender_pearl
run data modify entity @s Owner set from entity on origin UUID
この2つでこんな記述ができたら、自分がワープできるエンダーパールを簡単に召喚できるようになるんですよね。そんな妄想とぼやきです。
おわりに
どうもおはしあ。けいらぎっていいます。
今回は最近自分がちょっと気に入っている execute on について、基礎を書いてみました。
これ単体で破壊的イノベーションになるような革新的な要素ではありませんが、少しだけお使いのコマンドの記述がおしゃれになるツールとして知っていただければと思います。
質問や改善点などあればお気軽にどうぞ!できれば優しく、フランクな感じで。
それでは、ご覧いただきありがとうございました。
おつなも!