3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Damageコマンド、Damage Type/Tagを使ったダメージ処理とその活用例

Last updated at Posted at 2025-12-13

これは Minecraft Command Advent Calendar 2025 14日目の参加記事です。

自己紹介

今回初めてこのようなイベントに参加させていただきました、Chikuwaと申します。普段はTrip and Magicと言うデータパックを作っていて、その様子をYoutubeに上げたりしています。人への説明がまだ不慣れなので読みにくいかもしれませんが、できるだけわかりやすく説明しますのでよろしくお願いします!

はじめに

マイクラでコマンドを始めると必ず通る道であろう武器、魔法、ボスの作成。
その大抵が夢で終わってしまいますが、世の中には何としてでも完成させたいという人もいます。
もちろん私はそういう人を応援しますし、すごいと思います。しかし、そんな中でぶつかる大きな壁がいくつかあります。
演出、見た目、内部処理、クールダウン、ダメージ処理やらなんやら...
ということで、そんな壁の中でも多分一番解説が少ないであろうダメージ処理について初級編、中級編、上級編に分けて説明していきます。

記事の最後に今回使用したデータパックとリソースパックを置いておきます。参考にしてください。

Damageコマンドとはなんぞや

知っている方も多いかと思いますが、Damageコマンドとはエンティティにダメージを与えるコマンドです。構文としては、

/damage <ダメージを与える対象> <ダメージの値> <ダメージの種類>

これが基本形です。
例えば、

damage @s 10 minecraft:generic

の場合だと、

このように実行したプレイヤーに10ダメージが与えられます。

minecraft:genericminecraft:は省略しても問題ないです。

このDamageコマンドが無かった頃は、エフェクトの一つである即時ダメージ(データ名:instant_damage)や、attributeなどを使ってダメージを与えていました。大変だったなぁ…

使い方:初級編

さて、昔話は置いておいて初級の使い方です。
ここでは2種類の引数を紹介します。
byとatです。

byはどうやって使うの?

使用方法をお教えしましょう。
byは、エンティティからのダメージとして対象にダメージを与えます。例えば、

damage @n[type=zombie] 1 minecraft:mob_attack by @n[type=skeleton]

を実行すれば、最寄りのゾンビが最寄りのスケルトンに攻撃を受けたことになり、ゾンビが罪なきスケルトンに対して敵対的になります。

可哀想なスケルトン...

この時の最寄りのゾンビ、スケルトンは実行者(プレイヤー)から見ての最寄りになります。

さらに、byの後にはfromも使えます。いつ使うのかと言うと、例えば、スケルトンがゾンビに誤射するとします。よく見る光景ですよね。そうすると、ゾンビは矢が飛んできた方向の反対方向にノックバックします。
ノックバック.png
これは、Damageコマンドに変換すると、

damage @n[type=zombie] 5 minecraft:arrow by @n[type=arrow]

となります。ここで思い出してほしいことは、ゾンビは攻撃された相手に攻撃を仕掛けに行くことです。もしこのコマンドの構文がマインクラフトの処理に入っていた場合、ゾンビは矢に攻撃を仕掛けに行くはずです。
しかし、ゾンビは矢ではなくスケルトンに攻撃を仕掛けに行きます。
ノックバック2.png
ここで注意しておいてほしいところは、この動作はただby @n[type=arrow]
by @n[type=skeleton]に変更しただけではダメなところです。
もしそうすると、ノックバックがスケルトンのいる方向の反対方向になってしまいます。

ノックバック3.png
ではどうすればいいのか。そういう時にfromを使いましょう。
まず、矢とゾンビとスケルトンの順番にエンティティを用意します。その状態でチャット欄に

damage @n[type=zombie] 1 arrow by @n[type=arrow] from @n[type=skeleton]

と入力して実行してみましょう。
矢のある方向と反対方向にノックバックしますがスケルトンに敵対するはずです。

またしても可哀想なスケルトン...

atはどうやって使うの?

atは、ダメージとノックバックは発生させたいけど誰かに敵対させることはしたくない...そんな時に使います。
例えば、ブロックから攻撃判定を出したり、ただ意味もなくノックバックを使いたい時などです。
あ!今「だったらmob_attack_no_aggrono_anger使えばいいじゃん」とか思った奴ら!
例え使い道なくてもあるものはあるの!すぐ代替案持ってくるんじゃない!
...と、説明しておいてなんですが、この引数に出番はそうそう回ってきません。なんなら私はさっき初めて使いました。
ですが使おうと思えば使えます。例えば、「持つと見ている方向にぴょんぴょん跳ねる剣」を無理やり作るとします。
剣.png

これは無理やり作ったイメージ画像。楽しいそうな剣でしょ?

普通に作るなら、DeltaやらPlayer Motionやらなんやらを使ってきれいに吹き飛ぶようにしますが、今回は無理やりです。使用感なんざ気にしません。動きゃいいんです、動きゃ。今回使うコマンドはたった2つです。

execute as @a[nbt={SelectedItem:{id:"minecraft:iron_sword",count:1,components:{"minecraft:custom_data":{"sugoi":1b}}}}] at @s run damage @s 0.001 minecraft:mob_attack at ^ ^ ^-0.5

これを常時実行してください。
そしてその後にこのコマンドで剣を入手してください。

give @p iron_sword[item_name="すごい剣",rarity="epic",custom_data={"sugoi":1b}]

はい、後はサバイバルモードでその剣を手に持つだけです。

一応画面酔いに気を付けておいてください。

心が...跳ね...る?

はい、これで「サバイバルでのみ使える持つと見ている方向に痛々しい音を上げながら凄まじい画面揺れとともにぴちぴちと微妙に跳ねる剣」の完成です。私にはこれぐらいしか利用方法を思いつけませんでした。だれか、頼んだ...

追記

飛び道具系のエンティティの攻撃処理を作るときに敵対化ができなくなる代わりとしてすり抜けずに盾で防ぐことができるようになるっぽいです。
まぁ少しコマンド組んだら敵対化できて盾でも防げるやつがbyで作れるようになるんですけどもね…

扱い方:中級編

ということで中級編です。
ここまではダメージの与え方でしたが、中級編ではDamage Typelangをいじくって死亡メッセージを変更していきましょう。

死亡メッセージってなんだっけ

死亡メッセージとは、プレイヤーが死亡した時に出てくる死因を簡潔に伝えてくれるメッセージのことです。

これはマイクラバニラで一切使われていない死亡メッセージ。

ちなみにスコアは死亡時に持っていた経験値の量です。
死に方の面白さじゃないからね。

Damage Typeを作ってみよう

死亡メッセージを作るにはDamage Typeなるものを作る必要があります。
と言ってもそこまで難しくはありません。
まずはVisual Studio Codeを開き、空のデータパックを作るか既にあるデータパックを開きます。

Descriptionこんなんでいいのかね...

では、data/<名前空間>damage_typeフォルダを作成します。
image.png
そしてそのフォルダの中に<名前>.jsonを作ります。
そして、<名前>.jsonにはこのように書きます

<名前>.json
{
    "death_message_type":"default"/"fall_variants"/"intentional_game_design",
    "effects": "hurt"/"thorns"/"drowning"/"burning"/"poking"/"freezing",
	"exhaustion": 0.0~,
    "message_id": "<好きな名前(半角小文字のみスペース不可)>",
    "scaling":"always"/"when_caused_by_living_non_player"/"never"
}

上から順に死亡メッセージのタイプ、ダメージ音、満腹度疲労レベル、死亡メッセージのid、難易度変更によるダメージ量の増減の有効化という意味です。もう少し詳しく話しますね。

death_message_type

こいつは死亡メッセージの種類を決めます。defaultではmessage_idにあるメッセージが、fall_variantsでは落下ダメージによる死亡メッセージが、intentional_game_designでは「ゲームの使用に殺された」と表示されます。省略されるとdefaultになります。今回はここを変えたいわけではないのでdefaultでいいです。

effects

こいつはダメージを受けた時の音を変更します。hurtは通常のダメージ音、thornsは棘の鎧を殴った時のダメージ音、drowningは溺水のダメージ音、burningは燃えている時のダメージ音、pokingはスイートベリーに入った時のダメージ音、freezingは凍結のダメージ音です。これはお好みでどうぞ。

exhaustion

こいつはダメージを受けた時の満腹度の疲労レベルを決めます。詳しくはこちらをご覧ください。

ここは妥当な範囲内で決めてください。

message_id

こいつは死亡メッセージを決めます。一番重要です。
ここにはstring型で識別詞を書きます。
わかりやすい名前で書きましょう。

基本的に半角小英数字_を使います。

scaling

こいつは難易度を変更したときにダメージ量を増減させるかを決めます。alwaysでは常にダメージ量を増減させ、when_caused_by_living_non_playerではダメージの原因がプレイヤーではない場合にのみダメージ量を増減させ、neverではダメージ量を増減させません。これもお好みでどうぞ。

話を戻そう

今回はこのように書きました

break_block.json
{
	"exhaustion": 0.25,
 	"message_id": "break_block",
	"scaling": "always"
}

意味としては、「これは満腹度疲労レベルを+0.25して、難易度によってダメージを常に増減できる、死亡メッセージidがbreak_blockのダメージタイプ」となります。省略しているものは全てデフォルトのものとなります。
ダメージタイプについて詳しくはこちらをご覧ください。

死亡メッセージを登録する

死亡メッセージidの名前を書いたので、そのidで表示される文字を指定しましょう。
まずリソースパックを作るか既にあるリソースパックを開きます。

説明がTrip and Magic用のままだ!手抜きだとばれちゃう!

そして、asset/<名前空間>にlangフォルダを作り、その中にja_jp.jsonを作ります。

image.png

en_uses_mxなどを追加して多言語化もできます。

そしてそこにこのように書きます。

ja_jp.json
{
	"death.attack.死亡メッセージid": "%1$sを使った死亡メッセージ",
    "death.attack.死亡メッセージid.player": "%1$s %2$sを使った死亡メッセージ",
    "death.attack.死亡メッセージid.item": "%1$s %2$s %3$sを使った死亡メッセージ",
}

この中の%1$sはダメージを受けたエンティティ、%2$sはダメージを与えたエンティティ、%3$sはダメージを与えたエンティティが持っていたアイテム名です。
定義用の文の最後にあるplayeritemはそれぞれ「死亡要因にエンティティの加害者がいる場合」と「死亡要因にアイテムを持ったエンティティの加害者がいる場合」となります。1

例:

最後に何も付いていない時
|%1$sはJapanease Harakiriした

最後にplayerが付いている時
|%1$sは%2$sに脅されてJapanease Harakiriした

最後にitemが付いている時
|%1$sは%2$sの%3$sで脅されてJapanease Harakiriした

腹切の読みは「せっぷく」または「はらきり」です。
(何の注意だこれ)

話を戻そう(2回目)

ということでこれらを組み合わせて死亡メッセージを作ります。
今回はこのように書きました。

ja_jp.json
{
    "death.attack.break_block": "%1$sは飛んできたブロックにぶつかった",
    "death.attack.break_block.player": "%1$sは%2$sから逃げようとして飛んできたブロックにぶつかった",
    "death.attack.break_block.item": "%1$sは%2$sの%3$sから逃げようとして飛んできたブロックにぶつかった",
}

確認してみよう

これで死亡メッセージの設定が完了しました。
ワールドに入りなおして、
リソースパックを読み込み、

/reloadで再読み込みはせず、ワールドに入りなおしてください。
そうしないとダメージタイプは適用されません。

damage @s 100 <データパックの名前>:<Damage Typeのファイル名>

とサバイバルで入力しましょう。

どうでしょうか、しっかりと死亡メッセージが表示されているでしょうか。
これで中級編は終わりです。

従え方:上級編

では上級編へ行きましょう。
上級編ではDamage Type Tagを使ってオリジナルダメージを作りましょう。

Damage Type Tagってなんだよ

Dagame Type Tagとは、Damage Typeの属性を決めるタグのことです。
ここで言う属性というものはis_projectileis_firebypasses_invulnerabilityなどを指し、例えばis_projectileなら飛び道具耐性でダメージを軽減できたり、is_fireなら火炎耐性持ちのモブがそれを食らわなかったり、bypasses_invulnerabilityでは無敵(クリエイティブモードなど)貫通だったりと様々な事を決めることができます。

Damage Type Tag一覧

かなり長いので見たい人だけ見てください

開く

参照サイト
https://minecraft.wiki/w/Damage_type_tag_(Java_Edition)

id 意味 使用されているダメージタイプの例
always_hurts_ender_dragons 常にエンダードラゴンにダメージを与える #is_explosion
always_kills_armor_stands 一発でアーマースタンドを壊す arrow,trident...
always_most_significant_fall 死亡メッセージがバグらない用 out_of_world
always_triggers_silverfish シルバーフィッシュが仲間を呼ぶ magic
avoids_guardian_thorns ガーディアン、エルダーガーディアンの棘を無視する magic,thorns...
burn_from_stepping スニークか氷上歩行のエンチャントで回避ができる campfire,hot_floor
burns_armor_stands アーマースタンドを燃やす on_fire
bypasses_armor 防具を貫通する on_fire,in_wall...
bypasses_cooldown 無敵時間を貫通する (無し)
bypasses_effects エフェクトを貫通する starve
bypasses_enchantments エンチャントを貫通する sonic_boom
bypasses_invulnerability 無敵を貫通する out_of_world,generic_kill
bypasses_resistance ダメージ軽減、耐性を貫通する out_of_world,generic_kill
bypasses_shield 盾を貫通する #bypasses_armor,cactus...
bypasses_wolf_armor オオカミの鎧を貫通する #bypasses_invulnerability,cramming
can_break_armor_stand アーマースタンドを破壊することができる player_explosion,#is_player_attack
damages_helmet ヘルメットに入る耐久値ダメージを増加させる falling_anvil,falling_block...
ignites_armor_stands アーマースタンドに火がつく in_fire,campfire
is_drowning 水中呼吸で無効化できる drown
is_explosion 爆発耐性でダメージ軽減できる fireworks,explosion...
is_fall 落下軽減でダメージ軽減または落下速度低下で無効化できる fall,ender_pearl...
is_fire 火炎耐性を持つエンティティが無効化できる in_fire,campfire...
is_freezing ストレイや革の防具で無効化できる freeze
is_lightning これで死ぬとカメがボウルをドロップする lightning_bolt
is_player_attack プレイヤーからの攻撃 player_attack,mace_smash
is_projectile 飛び道具耐性で軽減、エンダーマンが無効化でき、確定でワープする arrow,trident...
mace_smash メイスによる攻撃 mace_smash
no_anger ダメージを受けても友好モブはパニックにならず、敵、中立モブは敵対しない mob_attack_no_aggro
no_impact モブがマークされない drown
no_knockback ダメージを受けてもノックバックしない explosion,player_explosion...
panic_causes 動物がダメージ元から逃げる #panic_environmental_causes,arrow...
panic_environmental_causes ブロックからの攻撃で動物がパニックを起こす cactus,freeze...
witch_resistant_to ウィッチがダメージを軽減する magic,indirect_magic...
wither_immune_to ウィザーがダメージを無効化できる drown

参照サイトに書かれていない情報は極力実験してから書いていますが、間違えている可能性もありますので参考程度しておいてください。

Damage Type Tagを自作Damage Typeに適用する

では作ったDamage Typeの属性を決めましょう。
まずminecraft/tagsの中にdamage_typeフォルダを作ります。
そしてその中に<上のDamage Type Tagのid>.jsonを作成します。
image.png
その中に

<上のDamage Type Tagのid>.json
{
    "values": [
      "<名前空間>:<指定したいDamage Typeのファイル名>"
    ]
}

と入力しましょう。
今回はこのように書きました。

is_projectile.json
{
    "values": [
      "damage_test:break_block"
    ]
}

ではマインクラフトのワールドに入りなおして、

/reload`で再読み込みせずに、ワールドに入りなおしてください。

damage <検証したい対象> 10 <データパックの名前>:<Damage Typeのファイル名>

を実行しましょう。
私の場合は、

damage @n[type=enderman] 10 damage_test:break_block

を実行しました。
すると、

わお!エンダーマンダメージくらってない!

このようにDamage Type Tagで指定した属性が適用されるはずです。
お疲れ様でした
これであなたもDamageマスター!やったね!

応用例

ここではdamageコマンドやDamage Type、Damage Type Tagを使って私が作った作品を紹介します。

1.大爆発

複数のエンティティを巻き込む大爆発です。衝撃波、飛んできたブロックそれぞれにダメージタイプが設定されています。

2.石切台

石切台の上に乗ると無敵時間を無視してダメージが入ります。

3.ワカメソード

ワカメと言いながら材料に昆布を使う強い武器です。

最後に

さて、どうだったでしょうか。
こういう記事を書くのは初めてなのですが、この記事でデータパック界隈が少しでも栄えてくれたら幸いです。
気になった点や、動かないなどがあったら気軽にコメントしてほしいです。恐らくすぐに返信すると思います...恐らく。
ではまた!

今回使用したデータパック/リソースパック

  1. 腕がないエンティティはどうなるのかって?多分mainhandがあるエンティティは問題なく動くんじゃないですかね

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?