「ダメージを受けたら何か処理をしたい」場合に、プレイヤーがダメージを受けたときと、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で指定しているので、これだとエンティティすべてが話すようになってしまいます。こんな感じ。
セレクターで指定するなどして工夫してください。
コメント