はじめに
注意:バージョンはjava版1.21.1をベースに解説しています。
どうも皆さまこんにちは。
初めてこうして記事を書くもので緊張しながらキーボードを叩いております。
突然ですが皆さま
『マイクラにおいてプレイヤーを焼きたい』と思ったことはありませんか?
私がマイクラでデータパックをいじり始めた際
一番最初に作ったのは炎魔法を使うことができる魔法の杖でした。
作りこそ粗雑なものですが、最初期の作品ということで愛着がある武器です。
マイクラ以外でも、炎の攻撃、能力、魔法というのは
あらゆるアニメやゲームなどの作品で多く登場する、強力で王道的存在。
マイクラでもブレイズやガストの攻撃とか、エンチャントのフレイムや火属性などが挙げられるでしょう。
このように初心者の方がマイクラで炎攻撃を作っていく上で
とある重要な問題が発生します。
それは当たった相手の炎上。
『炎』魔法とする以上、相手にヒットした際、ただダメージを与えるだけではなく
ド派手に燃やしたいと思い立つのは人間の性でしょう。
しかしまぁ、一度この問題に触れたことのある方はなんとなく分かるかもしれませんが
MOBではなくプレイヤーの着火というのは、それはそれは難しく
面倒臭い問題となっていくのです。
目次
はじめに
MOBの着火
なぜプレイヤーは燃やしづらい?
火属性エンチャントを使おう
構文(説明いらない、構文だけ知りたい人はここ見て)
プレイヤー着火(没案)
おわりに
MOBの着火
MOBを着火させるコマンドについてはこんな感じで解決するはずです。(構文雑ですが)
execute as @e[type=!minecraft:player,distance=..6] run data merge entity @s {Fire:100s}
この構文では『発動地点から6ブロック以内にいるプレイヤー以外のエンティティを5秒間発火』させます。
dataコマンドを使い、FireというNBTを書き換えて発火させます。
ちなみにですがFireは燃えていなくても存在しているNBTで
普段は0とか-20とかになっています。
燃えると数字が燃える時間分増えます。
今回のコマンドではこのFireの数値を100にして燃やしています。
単位はtick。
1秒=20tickなので、100÷20で5秒間燃え盛ります。
なぜプレイヤーは燃やしづらい?
さて、これでMOBの炎上はサクセス。問題はプレイヤーの着火です。
コマンダーの皆さまならばご存知の通り、dataコマンドはなぜか
プレイヤーのデータの書き換えができません。まじでなんで?
故に先ほどの方法ではFireNBTをいじれず、プレイヤーは燃やせません。
ではどうやってプレイヤーを燃やせばいいのでしょうか?
火属性エンチャントを使おう
私はこの方法を使っています。
例えば手に火属性がついたアイテムを持ち
攻撃力とノックバックを0にした敵対MOBを召喚。
プレイヤーと同じ場所に呼び出して殴らせ、すぐに消去する、というもの。
エンチャントレベルをいじることで炎上時間の調整も可能ですし
燃える以外でのノックバックやダメージを受けず、環境に左右されることも少なそうです。
問題が2点あるのですが、解決策はあります。
まず1点は『召喚後直ぐに敵MOBがこちらを殴ってくれない』こと。
基本MOBは召喚されて直ぐはフリーズしすぐに相手を殴りにかからない為
発動から着火までタイムラグが発生する恐れがあります。
あんま遅いとプレイヤーが動いて殴れないかもですし。
こちらは敵対MOBにヴィンディケーターを使用することで解決します。
ヴィンディケーターのNBTには「Johnny」というものがあり
これをいじることによって一部例外を除くほとんどのMOBに無差別に襲いかかります。
名札の裏技で有名なあれですね。
そしてこのNBT、召喚とほぼ同時に最寄りの相手に攻撃を叩き込むという特徴があるらしく
これを使えばすぐにプレイヤーをなぐらせる処理が出来上がります。
もう1点は『敵MOBの姿が一瞬見えちゃう』こと。
燃やす相手の近くでサブリミナルおっさん(ヴィンディケーター)が
発生することへの対処法です。
透明化エフェクトは召喚後数tickの間透明にならず見えちゃう仕様があるらしく使えません。
リソースパックでヴィンディケーターのテクスチャを無くせば完全に消せますが
これだとリソースパックが必要になる上、他のヴィンディケーターも全員見えなくなっちゃいます。
対処法としては召喚場所を数ブロック下げることで目立たなくさせる
または最近追加されたattributeの項目generic.scaleを使い極限まで小さくさせることで
見辛くするというものがあります。小さくてもちゃんと機能はしますので問題ありません。
構文(説明いらない、構文だけ知りたい人はここ見て)
summon minecraft:vindicator ~ ~-0.5 ~
{Silent:1b,Invulnerable:1b,DeathTime:19,Johnny:1b,Tags:[“fire”],
HandItems:[{id:"minecraft:stick",count:1,components:{"minecraft:enchantments":{levels:{"minecraft:fire_aspect":3}}}},{}],
attributes:[{id:"minecraft:generic.attack_damage",base:0.01},
{id:"minecraft:generic.attack_knockback",base:0},
{id:"minecraft:generic.scale",base:0}]}
要は
声を出さず(Silent)
無敵(Invulnerable)
死亡アニメーションが極限まで短く(DeathTime)
周囲に即時敵対(Johnny)
手に火属性エンチャントのアイテムを持ち(HandItems)
攻撃力とノックバック0で体が小さい(Attributes)
ヴィンディケーターです。
こやつには『fire』というタグを仮でつけている為
『fire』タグを持つエンティティのみ増加するスコアボードを作り
数tick後に奈落等に落としkill。
これでプレイヤーを無事上手に焼くことができるはずです。
バージョンによって構文が違う可能性があるので
MCスタッカーなどでの構文自作を推奨します。
この方法でのデメリットは思いつく限り
『難易度ピースフルだと使用できない』
『プレイヤー以外のMOBに使用すると略奪者などの一部MOBに効かなくなる』
『ダメージを受けた後の無敵時間中だと殴れず着火されない』
って感じでしょうか(解決法思いついた方いらっしゃいましたら教えてください)。
プレイヤー着火(没案)
fillやsetblockを使って足元を炎ブロックなどに変換し、燃やす方法。
地形破壊の危険性がある、足元が空気や水だった場合燃やせない
炎上時間の調整ができない等で不安定すぎます。論外。
ファイアーボールを使う方法は?
ブレイズが打ってくる小さな火の玉を対象の上空に召喚し高速で落下させ
下にいる相手にヒットさせれば炎上させられないか?
まずファイアーボールは当たった時点でノックバックと弾そのものの
ダメージを受けます。
喰らった際の見た目がノックバックで変になっちゃいますし、炎上時間の調整も不可。
さらに当たる時と当たらない時の差が激しかったり
スニーク時に足元を着火させてしまう可能性があったりとやはり扱いにくいです。
同じ要領で燃えた矢は?
先ほどと違いダメージは0に調整でき、足元を燃やす心配もありません。
…なんですが、こんな感じで召喚すると謎に頭でタップダンスを踊り始めるんですよ。
全然当たりません。
昔はこれで着火できたらしいのですが…(未検証)
おわりに
初めて描いたコマンド記事。ちゃんとできているんでしょうか。
そしてこの記事をわざわざ見てくださる
コマンダーの皆さまがご満足いただける内容になってるんでしょうか。
感想いただければ嬉しいです。
今回の内容は以前自分が投稿した動画の内容を再編集、加筆したものとなっています。
参考にさせていただいた動画、記事もこちらに記載されています。
よければ動画の方もぜひ。