ルッキーのコマンドメモ

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

(マイクラ コマンド・データパック) 地表にいるプレイヤーを検知する

プレイヤーが地表にいるかを検知したい

データパックを作っているとたまにプレイヤが地表にいるかどうかを検知したくなる時があります。
プレイヤが雨に当たっている時にエフェクトをつけたり、日光に当たるとダメージを受けるようにする時がそうですね。
そんな時、簡単に地表にいることが判定できるコマンドを紹介します。

目次

地表にいることを検知するコマンド

実は1コマンドだけでできます。こんな感じ。

execute at @s positioned over world_surface if entity @s[dy=0] run say yes

このコマンドの内容を簡単に説明すると、

  • このコマンドを実行したエンティティの座標を基準にして(execute at @s)、
  • 空気を除く一番上にあるブロックの座標から(positioned over world_surface)、
  • 1×1×1の立方体の中に実行したエンティティの当たり判定があれば
    (if entity @s[dy=0])、
  • yesとチャットに表示する(run say yes)。

と、なります。

雨に当たっているプレイヤを検知する

雨が当たっているプレイヤを検知する例を紹介します。
通常のfunctionファイルの他にpredicateファイルを使用します。
predicateファイルの中身はこんな感じ。

[
  {
    "condition": "minecraft:weather_check",
    "raining": true
  }
]

そして、functionファイルの中身はこんな感じ

execute as @a at @s positioned over world_surface if entity @s[dy=0] if predicate test:rain run say yes

testという名前空間内のpredicatesフォルダにrain.jsonという名前で上記のpredicateファイルを入れているとします。

内容としては、雨が降っている時にプレイヤが地表にいればyesとチャットに表示する、というものです。

日光に当たっているプレイヤを検知する

次に日光に当たっているプレイヤを検知するコマンドの例を紹介します。
今度はfunctionファイルだけでできます。

execute store result score #daytime test run time query daytime
execute unless score #daytime test matches 12000..23000 as @a at @s positioned over world_surface if entity @s[dy=0] run say yes

内容としては、まずtestというスコアに現在の時刻を代入して、その結果が12000から23000の間でなく、プレイヤが地表にいればチャットにyes と表示する、というものです。
ちなみに、12000から23000というのはマイクラ内の日没から日の出までの時間です。

まとめ

地表にいるプレイヤを検知したいときは、以下のコマンドを使うだけで簡単にできます。

execute at @s positioned over world_surface if entity @s[dy=0] run say yes