データパック作成中#3 ノックバックとダメージ

コマンドで飛び道具やボスを作っているとある問題に直面すると思います。
ノックバックとダメージをどうするか。
私も直面したので考えてみます。

ダメージ

敵やプレイヤーにダメージを与える方法は多分Effectを使うのが一般的です。
一番最初に思いつくのは即時ダメージですが、レベル0でも6ダメージも与えてしまします。
effect give @s minecraft:instant_damage 1 0
これは銃など小さなダメージをたくさん与えたいときに不便です。

ウィザー効果だとどうでしょう。
effect give @s minecraft:wither 1 1
これはレベル1で1ダメージだけ与えられます。
しかし、HPバーが黒くなるほか、高レベルだと1秒間に受けるダメージの量ではなく数が増えるので、見た目が悪い。

そこで使うのはArea Effect Cloud。これはエフェクトの効果時間をtick単位で指定できます。
この性質を使って一瞬だけウィザー効果を与えることで、HPバーが黒くならずダメージを与えることができます。
/summon area_effect_cloud ~ ~ ~ {Duration:6,Effects:[{Id:20b,Amplifier:31b,Duration:1,ShowParticles:0b}]}
しかし、これにも欠点があります。なんと1ダメージしか与えられません。まさかの。

というわけで次。即時ダメージに耐性を重ね掛けしてダメージ量をコントロールする方法。
耐性は、効果レベル×20%ダメージを軽減し、
即時ダメージは 3×2^効果レベル のダメージを与えます。
例えば1.2ダメージを与えたいときは、
effect give @s instant_damage 1 0
effect give @s resistance 1 3
とします。
この方法の欠点は、整数ぴったりのダメージを与えるのが難しい点と、耐性が他のダメージも軽減してしまう点ですね。
まぁその辺は妥協してもいいかもしれません。

追記:即時ダメージを使うときに注意があります。
  1. アンデットには代わりに即時回復を使わないとダメージが入らない
  2. ウィッチは魔法ダメージを軽減するので4倍のダメージを与えないといけない
追記その2 : /attributeを使えば解決と思っていた時期が私にもありました。
もやんちゃんplayerのデータいじれるようにしてくれ...

ノックバック

ノックバックで一番簡単に実装できそうなのは雪玉ですよね。
※コマンド実行者はゾンビ
execute at @s run summon minecraft:snowball ~ ~-0.4 ~ {Owner:[I;126,126,126,126],Motion:[0.0,10.0,0.0],Tags:["ckenja_warp_dash_knockback"]}
execute as @e[tag=ckenja_warp_dash_knockback] run data modify entity @s Owner[0] set from entity @p UUID[0]
execute as @e[tag=ckenja_warp_dash_knockback] run data modify entity @s Owner[1] set from entity @p UUID[1]
execute as @e[tag=ckenja_warp_dash_knockback] run data modify entity @s Owner[2] set from entity @p UUID[2]
execute as @e[tag=ckenja_warp_dash_knockback] run data modify entity @s Owner[3] set from entity @p UUID[3]
この方法は、ノックバックを与えるだけならいいのですが、無敵時間の関係でダメージを与えられません。
ダメージがないので、指定したUUIDのエンティティにそのモブは敵対する性質は使えるかもしれません。

次、Motion。大抵のデータパックはおそらくこの方法で実装しています。
攻撃者と攻撃を受けるエンティティの座標差をMotionに代入することでノックバックを再現できます。しかもダメージエフェクトが出ないです。
この方法の欠点は、エンティティの距離が離れるとノックバックも大きくなる点ですが、近距離なら誤魔化しがききます。
コマンド組むのが面倒なので例はなしで。

で、今回採用したのは矢。これはMinecraft Japan Command Discordサーバーで検索したら出てきたやつです。作った人はCobwebbyPiano58氏。
execute at @e[type=minecraft:villager] anchored eyes facing entity @s eyes positioned ^ ^ ^0.1 run summon minecraft:arrow ~ ~1 ~ {Motion:[0.0d,-1.0d,0.0d],damage:0}
多分これが一番早いと思います。ダメージも調整できるし。

コメント