【Minecraft JE 1.15.1】攻撃を受けたことを検知する方法

minecraft

「ダメージを受けたら何か処理をしたい」場合に、プレイヤーがダメージを受けたときと、Mobがダメージを受けたときで、検知する方法が違ったので忘れないように自分用のメモです。

プレイヤーがダメージを受けたときに何か処理をしたい場合

プレイヤーがダメージを受けたときに「あいたた!」と自動でいうようにします。
プレイヤーがダメージを受けたかどうかは、 minecraft.custom:minecraft.damage_taken という統計情報をつかいます。

damage_takenをscoreboadにメモする

まずはscoreboadを作成します。

/scoreboard objectives add playerdamage minecraft.custom:minecraft.damage_taken

ちゃんと設定されているか確認します。このときにクリエイティブモードにしていると表示されないので、サバイバルモードにしてから確認してください。

/scoreboard objectives setdisplay sidebar

サイドバーに先ほど作成したscoreboadが表示されました。
自分にダメージを与えてみます。

/effect give @p minecraft:instant_damage

playerdamageの数値が大きくなっていることがわかります。

ダメージを受けたかどうかを判定

まず、ひとつ前の状態をメモするscoreboadを作成します。

/scoreboard objectives add predamage dummy

使うコマンドブロックはふたつ。こんな感じで連結します。


①リピートブロック

execute as @a if score @s predamage < @s playerdamage run say いたたたた

predamage(少し前のダメージ)とplayerdamage (現在のダメージ) を比較して、playerdamageのほうが大きければ「いたたたた」というように設定。

②チェーンブロック

execute as @a store result score @s predamage run scoreboard players get @s playerdamage

playerdamageの値をpredamageに代入。

実験してみましょう。ダメージを受けると…

「いたたたた」と言うようになりました!

Mobがダメージを受けたときに何か処理をしたい場合

minecraft.damage_takenはプレイヤーにしかないようなので、Mobのダメージを検知したい場合は、Healthを使います。

hpとprehpのscoreboadを用意

まず、healthを取得するためのscoreboad、hpを準備

/scoreboard objectives add hp health

次に、ひとつ前のhealthをいれておくためのscoreboad、prehpを作成。こちらはdummyで。

/scoreboard objectives add prehp dummy

コマンドブロックを用意

用意するコマンドブロックはこんな感じ。

①リピートコマンドブロック

execute as @e store result score @s hp run data get entity @s Health 1

②-1 リピートコマンドブロック

/execute as @e if score @s prehp > @s hp run say ぼく悪い@sじゃないよ

②-2 チェーンコマンドブロック

execute as @e store result score @s prehp run scoreboard players get @s hp

これでMobに攻撃してみると・・

しかし@eで指定しているので、これだとエンティティすべてが話すようになってしまいます。こんな感じ。

セレクターで指定するなどして工夫してください。

コメント

タイトルとURLをコピーしました