見出し画像

雪玉を投げて遊ぼう【Minecraft】

こんにちは。
山梨大学Minecraftサークルのちべたんです。

Minecraftの雪玉

皆さんは雪玉を知っているでしょうか。

雪玉は投げることができる

雪玉を投げることができるのはご存じかと思います。
ですがこれは投げることはできても、当ててダメージを与えたりはできません。
ここで先ほどの雪玉の画像を見てみましょう。

「戦闘」…????

「戦闘」と書いてあります。
そう、Mojangは雪玉で戦えと言っていますね。
そこで今回は雪玉を使って本物の雪合戦をしていきます。

とりあえず今回作るものを動画で紹介。


・今回使用するコマンド

今回はexecuteコマンドを中心に、ほかにgiveコマンドも使用します。

この記事はなるべく分かりやすく、かつコピペだけで作れるよう心掛けていますが、以上のコマンドの基本構文などが分かるとより一層理解が深まるかと思います。

参考:executeコマンドの解説(過去記事)

・雪玉に名前をつける

give @p snowball{display:{Name:'[{"text":"どくどくだま"}]'}} 1

giveコマンドではアイテムに名前を付けることができます。
通常アイテムに名前をつけるときは金床などを使いますが、アイテムとして配る際にはコマンドを使ったほうが便利です。
コマンドにあるように書くと名前付きのアイテムを最初から手に入れられます。名前は基本的に自由に設定が可能です。
今回は「どくどくだま」という名前をつけてみましょう。

金床を使ってアイテムに名前をつける

・名前をもとに雪玉を判別させる

execute as @e[type=minecraft:snowball,nbt={Item:{tag:{display:{Name:'[{"text":"どくどくだま"}]'}}}}] at @s unless block ~ ~-1 ~ air run summon minecraft:pufferfish ~ ~ ~

次にリピートコマンドブロックに上のコマンドを入力します。
まず見ていただきたいのは前半部分。@e以降のセレクターがやたら長いことになっていますが、ここで通常の雪玉と名前のついた雪玉を区別しています。
普通このような処理をする際はtagをつけるなどしますが、名前で区別することができるのでこちらのほうが楽そうです。

・雪玉の着弾を検知する

実戦で使用する際は、雪玉の着弾地点に何かしらのイベントを起こすのが一番汎用性が高そうです。
先ほどのコマンドのat @sの次、3つ目の部分にunlessから始まる部分があります。
具体的にはこの部分で、「雪玉の1ブロック下が空気ブロックではない(=何かしらのブロックが存在する)場合」という条件を指定しています。
ちなみにこのコマンドで指定できているのは雪玉の1ブロック下だけであるため、例えば雪玉が壁にぶつかって壊れた場合には何も起こりません。もしあらゆる面に対して動作させたい場合は、座標をx,y,z座標それぞれに対して+1,-1を指定してあげましょう。
(1 ~ ~)(-1 ~ ~)(~ 1 ~)(~ -1 ~)(~ ~ 1)(~ ~ -1)の6通りです。チェーンを使って6つのコマンドブロックを繋げましょう。

・着弾時にイベントを起こす

ここまではどのような処理をする際も同じことを書いておけばよいですが、ここからは着弾時にどのようなイベントを発生させるかを決めていきます。
先ほどのコマンドではrun以降の部分です。
今回は着弾地点にフグをばらまける、まきびしを作ってみましょう。
コマンド的には雪玉のある位置にsummonコマンドを使ってフグを出現させているだけです。

フグを撒ける

・複数回実行されるのを防ぐ

たくさんのフグが出てくる

ここで書いたコマンドを実際に実行してみると、フグが複数匹出てくることがあります。
というのも、コマンドでは雪玉の1つ下のブロックが空気ではない場合にフグを出現させていますが、雪玉が壊れるのは地面となっているブロックに接地したときなので、特に地面に水平に近い角度で投げたときなどは多くのフグが出現してしまいます。
これを防ぐためには、リピートコマンドブロックの次にチェーンコマンドブロックで以下のコマンドを追加しましょう。

execute as @e[type=minecraft:snowball,nbt={Item:{tag:{display:{Name:'[{"text":"どくどくだま"}]'}}}}] at @s unless block ~ ~-1 ~ air run kill @s

先ほどのコマンドと同じexecuteコマンド、もっと言うとrunより前はすべて同じです。この条件を満たした際に雪玉そのものをkillコマンドによって消去し、2匹目以降のフグのスポーンを防いでいます。
なおこれに関しては使ったほうがいい場面と使わなくてもいい場面が存在していると思います。
個人的にフグは沢山撒けたほうが嬉しいと思っているので今回はこのコマンドは追加していません。

・そのほかのアイデア案

executeコマンドのみを書いておきます。
ここまでの記事を参考にしながら実装してみてください。

・煙玉

execute as @e[type=minecraft:snowball,nbt={Item:{tag:{display:{Name:'[{"text":"煙玉"}]'}}}}] at @s unless block ~ ~-1 ~ air run particle minecraft:campfire_signal_smoke ^ ^ ^ 2 2 2 0.001 1000

・投擲できるグレネード

execute as @e[type=minecraft:snowball,nbt={Item:{tag:{display:{Name:'[{"text":"ただのグレネード"}]'}}}}] at @s unless block ~ ~-1 ~ air run summon minecraft:creeper ~ ~ ~ {NoAI:1b,ignited:1b,Fuse:60s,Tags:[chibegure]}

ヒント:summonコマンドの後半はNBTタグを指定している。Fuseはスポーンから爆発までのtick数。この場合は着弾から3秒後に爆発する。

effect give @e[tag=chibegure] minecraft:invisibility 1 1 true

クリーパーを透明化してみたり、

execute as @e[tag=chibegure] at @s run particle cloud ~ ~ ~ 0.3 0.1 0.3 0.05 10 force @a

パーティクルで装飾してみるとなおよい。

ご覧のように雪玉は無限の可能性を秘めています。
今回は着弾時の処理にフォーカスしましたが、滞空時間中にイベントが発生するみたいな処理も可能です。

それではまた次回。

いいなと思ったら応援しよう!