この記事では、Minecraft Java Edition(バージョン1.18.1)の情報をもとに執筆しています。
そのほかのバージョンや機種などでの動作は保証できません。
プレイヤーを攻撃したことをコマンドで検知したいマインクラフター
「殴ったことを検知したいんだけど、どういうコマンドを使えば出来るのかな? 剣で殴った時だけとか条件の指定もしたい。あと、逆に殴られたことを検知することもできる?」
こんな疑問を解決します!
- スコアボードで与ダメージを検知する
- 剣で攻撃したことは、ターゲットセレクターに条件を付与して差別化する
- 被ダメージもスコアボードで検知できる
こんにちは! マインクラフターのなつめ(@natsume_717b)です。
マイクラ歴は5年程で、最近は脱出マップを配布・制作しています!
→配布マップ・ダウンロードページ
この記事では殴ったこと、要は攻撃したことを検知するためのコマンドを解説。
攻撃をした場合、当然ではありますがその相手に対してダメージを与えます。
なので、ダメージを与えた=殴ったということになりますので、実質的に殴ったかどうかを判断することができるわけです。
今回紹介するコマンドはこの仕組みを利用して、与えたダメージ量を検知する方法を使っていきます。
また、武器を持っている場合にダメージを与えた場合や、ダメージを受けたことを検知する方法についても触れています。
なので、攻撃をする側、ダメージを受ける側のどちらの立場に対してでも、対応できるようになりますよ。
PVPのミニゲームなどではダメージの応酬が発生しがちなので、ミニゲームを作ってみたいという方は必見です!
スコアボードで与ダメージを検知する
ダメージを与えたことを検知するには、scoreboardコマンドを使います。
scoreboardコマンドは様々なものをカウントすることができ、ダメージを与えたことを感知するにはminecraft.damage_dealtという項目を利用します。
minecraft.damage_dealtは与えたダメージがそのままスコアとして加算されるので、4ダメージ与えた場合にはスコアは4という値が足されます。
コマンドを組んでいく
実際に使用するコマンドとしては以下の通りです。
まずはスコアボードの作成をします。
/scoreboard objectives add Damage minecraft.custom:minecraft.damage_dealt
Damageの部分はスコアボードの名称となりますので、分かりやすいように好きな文字に変更していただいて構いません。
今回はダメージを与えることに関係することから、愚直にDamageと名付けました。
スコアボードの名称を別の名前にした場合は、これから紹介するコマンドのDamageの部分を変更したものに変えてコマンドを入力する必要があります。
Scoreboardコマンドはスコアボードを作成するだけでは使えないので、次は今作成したスコアボードの値を参照としてコマンドを実行するコマンドを紹介します。
execute as @a[scores={Damage=1}] run give @s diamond 1
上記のコマンドでは、与えたダメージが1のプレイヤーに対して、ダイヤモンドを1つ付与するコマンドにしてみました。
run以降のコマンドを実行させたいコマンドに差し替えれば、1ダメージ与えたプレイヤーに対してコマンドを実行させることができます。
ただし、上記のコマンドのままではスコアボードの値が永遠に1(ないし1以上の値)のままです。
要するに上記のコマンドが永遠に動作し続けてしまうということですね。
なので、スコアボードの値をリセットするコマンドをチェーンコマンドブロックとして繋げます。
チェーンブロックに入力されているコマンドはこちら。
scoreboard players reset @a Damage
これで1ダメージ与えたらダイヤモンドが1つ付与され、その後1ダメージ与えたことを無かったことにしてくれるので、ダイヤモンドが永遠に付与され続けることが無くなります。
特定の数字以上のダメージを検知したい場合
先ほど紹介したコマンドはDamageの値が1であることが条件になっているので、1ダメージを与えた場合にしか機能しません。
1よりも多いダメージを与えた場合には、スコアが2以上の値を示してしまい機能しないというわけですね。
なので、1以上のダメージを与えた場合にコマンドが機能するようにする方法を解説していきます。
といっても、難しいことをするわけではありません。
ただスコアを指定する場所に.(ドット)を打ちこみます。
execute as @a[scores={Damage=1..}] run give @s diamond 1
スコアの値を「1..」にすることで、1以上のスコアを持っている場合を指定することができます。
もし「2ダメージ以上与えた場合」という条件にしたければ、「2..」と打ちこめばいいわけですね。
このドットの使い方はまだあり、〇~◇の間の場合や〇以下のスコアを持っている場合と指定をすることも可能です。
それぞれ「1..5」、「..5」という打ち方を行うと、1~5のダメージを与えた場合、5以下のダメージを与えた場合という条件にすることができます。
剣で攻撃したことは、ターゲットセレクターに条件を付与して差別化する
ダメージを与えたことによってコマンドを実行する方法は分かりましたが、剣で攻撃した場合だけにコマンドを実行させたいといった場合は、ターゲットセレクターを弄る必要があります。
要するに、「剣を持っているプレイヤー」という条件を付け加えるわけですね。
まずは先ほども紹介したコマンドを再掲します。
execute as @a[scores={Damage=1}] run give @s diamond 1
このコマンドに剣を持っているかどうかを設定していきます。
剣を持っているかどうかは、NBTタグのSelectedItemを使用します。
「手に持っているアイテムは○○」と指定するわけです。
実際にSelectedItemを設定してみると以下のようになります。
execute as @a[scores={Damage=1..},nbt={SelectedItem:{id:"minecraft:diamond_sword"}}] run give @s diamond 1
これで、手にダイヤの剣を持っているプレイヤーかつダメージを与えたプレイヤーを対象に、ダイヤモンドを1つ付与するようになります。
先述した解説と同じように、チェーンコマンドブロックを繋いでスコアボードのリセットも忘れずに!
また、id:”minecraft:diamond_sword”の「minecraft:diamond_sword」部分を別のアイテムIDを変更すれば、そのアイテムを持っている時にコマンドを実行するように変更できます。
必要に応じて、別のアイテムIDを入力しましょう。
ただし、このままではダメージを与えたプレイヤーが指定しているアイテムに持ち替えた場合にも反応してしまいます。
今回の場合は、既にダメージを与えているプレイヤーがダイヤの剣に持ち替えてしまうとコマンドが機能してしまうということです。
なので、以下のコマンドを入力した別のコマンドブロックを用意しておきましょう。
リピート、無条件、常時実行にしておく必要があります。
execute as @a[scores={Damage=1..}] run scoreboard players reset @a Damage
このコマンドはダメージを与えたプレイヤーのスコアをすぐにリセットするものです。
なので、ダイヤの剣を持っていない状態でダメージを与えてもすぐにスコアは0になり、ダイヤの剣に持ち替えても既にスコアは0になっているため、ダイヤモンドが付与されないようになります。
オフハンドに持っているアイテムを検知する場合
上記で紹介したコマンドはメインハンドに持っているアイテムを検知する方法でしたが、オフハンドに持っているアイテムを検知するにはまた違ったNBTタグを使う必要があります。
大まかな使い方は同じなので、さっそく見ていきましょう。
execute as @a[scores={Damage=1..},nbt={Inventory:[{Slot:-106b,id:"minecraft:diamond_sword"}]}] run give @s diamond 1
先ほどはNBTタグにSelectedItemを指定しましたが、今回はInventoryを指定しています。
Inventoryとは、インベントリや装備欄にあるアイテムを指定する場合に使うNBTタグです。
今回は-106b、つまりはオフハンドを指定しつつ、その場所にあるアイテムがダイヤの剣である場合を指定しています。
SelectedItemと同様に別のアイテムIDを指定すれば、そのアイテムを持っている時に変更できますので、ランタンをオフハンドに持っている時にだけ暗視効果が付与されるといったことも可能です。
被ダメージもスコアボードで検知できる
ここまでダメージを与えた場合について解説してきましたが、ダメージを受けた場合もscoreboardコマンドで検知することができます。
ダメージを受けたことを検知したい場合は、minecraft.damage_takenでスコアボードを作成します。
入力するコマンドとしては以下の通り。
/scoreboard objectives add Damage2 minecraft.custom:minecraft.damage_taken
なので、ダメージを受けたことを検知してコマンドを実行する場合には
execute as @a[scores={Damage2=1..}] run give @s diamond 1
とリピートコマンドブロックに打ちこめばOKです。
(無条件、常時実行にすること)
これでダメージを受けるたびにダイヤモンドを1つ付与されます。
ダメージを与えた時と同様に、チェーンコマンドブロックでスコアボードを0にリセットするようにしておくこと。
まとめ
というわけで、今回のまとめです。
今回使ったコマンドはこちら。
- ダメージを与えたことを検知するスコアボードの作成と、検知するコマンド
(ダメージを与えた場合にダイヤモンドを1つ得る)
/scoreboard objectives add Damage minecraft.custom:minecraft.damage_dealt
execute as @a[scores={Damage=1..}] run give @s diamond 1
- ダメージを受けたことを検知するスコアボードの作成と、検知するコマンド
(ダメージを受けた場合にダイヤモンドを1つ得る)
/scoreboard objectives add Damage2 minecraft.custom:minecraft.damage_taken
execute as @a[scores={Damage2=1..}] run give @s diamond 1
- スコアの値を数字だけにすると、その数字分のダメージを検知します。
- .(ドット)を使うことで、〇以上のダメ―ジ、〇以下のダメージ、〇~◇のダメージを検知することができるようになります。
この記事は以上になります。