0
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?

Minecraft CommandAdvent Calendar 2024

Day 16

マイクラのコマンドで作る「最強」について考える【後編】

Last updated at Posted at 2024-12-15

この記事は、Minecraft Command Advent Calendar 2024 十六日目の記事です。

はじめに:この記事について

題にもあるように、この記事は『マイクラのコマンドで作る「最強」について考える【前編】』の続きです。こちらを先に読んでいただいた方が内容を追いやすいでしょう。

さて、前回の記事では、アイテムのデータを編集をして攻撃力が法外に高い剣を作りました。バニラのMinecraftに登場するモブは全て一撃で倒せるはずです。

image.png
▲ 攻撃力を2048に設定したネザライトの剣

warden.gif
▲ 一撃で倒されるウォーデン


しかし、同じくコマンドで体力や防御力を編集したモブに対してはどうでしょう。

zombie.gif
▲ 耐性レベル5を持つゾンビ。与えられたダメージの100%を軽減している

例え相手が実質無敵に設定されていても、「殴れば倒せる最強の剣」を作っていきましょう。

0. 前提

まず大前提として、この記事はMinecraft Java Editionのバージョン1.21.3および1.21.4向けに書いています。この意味がわからない、という場合はこちらを読んでみてください。

また、前回の記事で紹介した、コマンドの基本的な考え方と書き方は把握している前提で話を進めていきます。

1. 考えをまとめる

絶対に倒すコマンド

最初に決めたように、これから作る剣は、敵の体力や防御力に関係なく、必ず一撃で倒せるようにしたいです。まずは、そのために必要なものは何か、考えてみましょう。
アイテムのデータで、攻撃力以外で攻撃時の処理に介入する設定はなさそうです。
では、逆に必ずモブを倒す処理から考えてみましょう。「モブを倒すコマンド」、ご存知なのではないでしょうか。

そう、/killです。モブに対して、Minecraftの「倒れる」処理を実行するので、どれだけゲームの設定で耐久力を高くしても、/killを使えば文字通りどのようなモブでも必ず一撃で倒せます。

ターゲットセレクターの拡張

/killの構文は単純に/kill<倒したい対象>となります。スポーンエッグなどでゾンビを出し、試してみましょう。

最寄りのゾンビを倒すコマンド
/kill @n[type=minecraft:zombie]

セレクターが@nになっていて、さらに[ ]が続いています。@nは、シンプルに「最寄りのエンティティ」を指定しています。[ ]は、アイテムコンポーネントと同じく、そのエンティティが持つ要素を細かく設定して、セレクター単体では絞り込み切れない条件を作ります。

無敵のゾンビ

ついでに、ゾンビを無敵にする方法も紹介します。もう一度ゾンビを出して、次のコマンドを実行してください。

耐性エフェクトレベル5
/effect give @n[type=minecraft:zombie] minecraft:resistance infinite 5

/effectコマンドです。このコマンドは、指定したモブステータスエフェクト、つまりポーション効果変更するコマンドです。サブコマンドにgiveclear、付与するか除去するかの二種類があります。対象を指定したあとには、付与するエフェクトのID効果時間、そしてエフェクトのレベルが続きます。効果時間の欄には「無限」を意味するinfiniteと書くことで、そのエフェクトが永続するようになります。

エンティティとは(読み飛ばし可)

簡単にいって「アイテムでも、ブロックでもない、データの集まり」です。つまりはモブのことなのですが、防具立てや額縁のようなブロックとモブの境界線上にあるものも含みます。
Minecraft Wikiによると、全てのエンティティは以下の性質を持っているようです。

  • (通常のニュートン力学に従った) 位置、速度、回転。
  • 決まった高さと幅をもつ3次元のボックスで表される、エンティティが占める固有の体積 (真上から見ると正方形であり、回転していない)。
  • 現在の体力。
  • 炎が着いているかどうか。炎は徐々に体力を減らし、エンティティを包むように火が表示される。

少し難解ですが、この定義に沿うと、ボートや地面に落ちているアイテム、エンドクリスタルなどもエンティティであることが分かります。

ここからは...

これで、どのようなモブでも条件を絞って倒せるようになりましたが、剣で攻撃したタイミングに、そして攻撃した相手に、この処理を実行するにはどうすればようでしょうか。

2. コマンドブロック

お待ちかねの

要は、チャット欄を開かずとも、各手順のコマンドを連続して実行したいわけです。そのために作られたブロック、ありましたよね。

満を持して登場、コマンドブロックを出す方法
/give @s minecraft:command_block 1

/giveを使いましたが、実はコマンドブロック、クリエイティブモードのインベントリにもあります。メニュー画面から操作設定を開きましょう。

▲ 操作設定のタブ

なぜ操作設定なのかは謎ですが、管理者用アイテムタブとあります。オンにして、インベントリを開いてみてください。

image.png
このようなタブがあるでしょう。ここから、コマンドブロックを含む各種開発用アイテムいつでもが取り出せます。覚えておきましょう。

コマンドブロックのつかいかた

では、コマンドブロックを使っていきましょう。設置して、UIを開いてみると、このような画面になりますね。
command_block.png
なにやら複雑そうな見た目です。しかし、とりあえず気にする必要があるのは一番上のコンソールコマンドの欄のみです。ここにコマンドを入力すれば、コマンドブロックがそのコマンドを保存して、レッドストーン信号を与えればいつでも実行できる状態になります。試しに、前回の記事で取り扱ったコマンドを入力して実行してみましょう。

「最強の剣」を与えるコマンド
/give @s minecraft:netherite_sword[minecraft:attribute_modifiers=[{type:"attack_damage",id:"my_modifier",amount:2048,operation:"add_value"}]]

selector.gif

...何も起きません。コマンドブロックをもう一度開くと、前回の実行結果が表示されています。

image.png

コマンドブロックによる実行

色はついていませんが、どうやらエラーメッセージのようです。
プレイヤーが見つかりませんでした」ということは、アイテムを与える対象、つまりターゲットセレクターに問題があるということになります。@sと指定しましたが、その意味は「コマンドを実行したエンティティ」。
対して、コマンドブロックから実行するコマンドの実行者は、「レッドストーン信号を与えたプレイヤー」ではなく、「コマンドブロック自身」なのです。@sでは、コマンドを実行したエンティティが見つからず、実行に失敗してしまいます。
なので、セレクターを「最寄りのプレイヤー」を意味する@pに変えましょう。

selector_1.gif

今度はちゃんと手に入りましたね。

チェーンとリピート

ここまでなら、チャット欄からコマンドを実行するのとほとんど違いはありません。コマンドブロックの強みは他にあります。それは、「連結」と「反復」ができること。管理者用アイテムタブを開いてみましょう。

image.png

チェーンコマンドブロック」「リピートコマンドブロック」とあります。取り出して設置してみましょう。

UIを開いてもあまり違いがありません。どう使うのでしょう。

ひとことに「コマンドブロック」といっても、三種類あることがわかります。チェーン、リピートに対して普通のコマンドブロックはインパルスコマンドブロックと呼ばれます。

チェーンコマンドブロックのつかいかた

"Chain"は直訳すると「」。
チェーンコマンドブロックは、鎖のようにコマンドを連結をするコマンドブロックです。
もう少し厳密にいうと、「他のコマンドブロックに続いてコマンドを実行する」ブロックなので、単体では何もできません。インパルスコマンドブロックやリピートコマンドブロックと組み合わせて使います。

chained.png

このように、根本のコマンドブロックに向きを合わせてチェーンコマンドブロックを二つ設置して、以下のコマンドを入力してみましょう。

インパルスコマンドブロックの中身
/say 1
一つ目のチェーンコマンドブロックの中身
/say 2
二つ目のチェーンコマンドブロックの中身
/say 3

/sayは、単純に指定した文字列をチャット欄に出力するコマンドです。
ここで、インパルスコマンドブロックにレッドストーン信号を与えると、順番に123と出力されます。

image.png

リピートコマンドブロックのつかいかた

"Repeat"は直訳すると「反復」。
その名のとおり、リピートコマンドブロックはレッドストーン信号が与えられている限り、入力されたコマンドを繰り返して実行し続けます
リピートコマンドブロックに、/say Hiと入力して、ボタンで信号を与えてみましょう。

repeat.gif

たくさんHiと表示されました。チャット欄を開いて数えてみると、20回。ボタンが信号を発するのはちょうど1秒間なので、リピートコマンドブロックは1秒に同じコマンドを20回実行する、ということになります。
なお、リピートコマンドブロックにチェーンコマンドブロックをつなげた場合、続くチェーンコマンドブロックに設定されているコマンドも1秒に20回実行されます。

この「1秒に20回」は、Minecraftの(ほどんど)あらゆる処理のループが1秒に20回行われることからきています。この1/20秒に1回の処理のループをtickと呼びます。

3. 条件の取得

統計

次に、「剣で攻撃したこと」を検知していきます。この、プレイヤーが行った行動の検知には、全く新しいシステムを使います。
もう一度メニュー画面を開いて、今度は「統計」のページを見てみましょう。

stats.png
▲ 統計のページ

なにやら色々な数字がまとめられています。

stats_item.png
▲ 統計のアイテムのページ

アイテムの欄に移ってみると、「使用した回数」なる項目があります。コマンドを使えば、この統計のページにある、全ての数値を取得して使うことができます。

スコアボードの概念

統計にアクセスするコマンドとは、/scoreboard。「スコア」と呼ばれる数値を管理したり、計算したりするコマンドです。しかし、スコアは最初から存在しているわけではなく、自分で適宜追加していく必要があります。早速スコアを追加してみましょう。

スコア "used_sword" を追加する
/scoreboard objectives add used_sword minecraft.used:minecraft.netherite_sword

スコア自体はコマンドの上ではobjective、つまり「対象」と呼ばれます。今回はスコア自体を操作するので、一つ目のサブコマンドはobjectivesになります。行う操作は「追加」、なのでaddですね。名前は比較的自由に決めて構いませんが、混乱を避けるため、MinecraftのIDの書き方に則って名付けることをおすすめします。

最後に、追加するスコアの種類を指定しますが、IDの記述がずいぶんと複雑です。minecraftがなぜか二回含まれていたりします。どういうことかというと、usedも、netherite_swordも名前空間minecraftのもの、と決まっているからです。

ついでに、スコアの表示設定も変えましょう。

サイドバーにスコアを表示
/scoreboard objectives setdisplay sidebar used_sword

scoreboard.png

画面の右端にused_swordと表示されました。今度は、剣を使って攻撃してみましょう。

used_sword.gif

スコアが1になりました。さきほどの統計に示されたものとは別の値ですが、これはスコアボードの仕様です。「統計を参照する」といっても、「統計が計測する値と同じ値を保存する」だけです。なので、スコアが作成された時点での値は存在しません。剣を使って初めて、1が加算されます。

また、プレイヤー名も表示されていますね。スコアは、エンティティが各自に持っているものだからです。他のプレイヤーがネザライトの剣を使えば、そのプレイヤーには個別にused_swordの値が保存されます。

統計の値に依存しないということは、自分で好きにスコアを編集できることも意味します。

"used_sword" を100に設定する
/scoreboard players set @s used_sword 100
"used_sword" の値をリセットする
/scoreboard players reset @s used_sword

/scoreboardのもう一つのサブコマンド、playersです。すでに存在するスコアを設定するコマンドになります。@sとあるのは、自分が持っているused_swordの値を編集したいからですね。
/scoreboard playersは、他にも四則計算や表示設定の変更などもできますが、今回はこの二つだけを紹介します。

スコアused_sword1になったタイミングで/killを実行して、値をリセットする、という流れが作れそうです。
これで、剣で攻撃したことを計測できるようになりましたが、肝心のスコアが変動したことの検知はまだできませんし、攻撃されたモブを特定することもできません。

4. コマンド開発の大黒柱

われらが万能コマンド

条件の検知、そして実行者の変更。この二つの事象は、なんとたった一種類のコマンドで制御できます。
そのコマンドの名は/execute。コマンドを使って何らかしらのアルゴリズムを組む際には、必ずといっていいほど使われるコマンドです。/executeは、上記二つのことができる唯一のコマンドである上、その自由度もとてつもなく高いです。そのサブコマンドの数はなんと15。全ては紹介しきれないので、今回必要になるものだけを軽く解説します。

この説明で、何が何やら分からない、となるかもしれませんが、あまり気にしないようにしましょう。/executeは構造が複雑であるだけでなく、挙動自体も想像がしにくいコマンドです。分からなくても、立ち止まらず進んでください。実際に使ってみると理解がしやすくなるはずです。

/executeのつくり

/executeはサブコマンドが多いだけでなく、構文の観点からでも異質です。
他のコマンドは、サブコマンドを一つ指定した場合、そのままコマンド全体が完結します。しかし、/executeはサブコマンドを指定するだけでは何もできません。ほとんどの場合では、サブコマンドで指定した事象を踏まえ、別のコマンドを最後に実行します。
そのために用意されているサブコマンドはrun。あとに続くコマンドを実行するだけです。

実行するだけ
/execute run say Hi

runにより、/executeはいったん完結します。ただ、runのあとのコマンドは、/executeで指定した諸々の設定を基準に実行されます。

/executeで設定を指定する、とはどういうことでしょうか。runサブコマンドだけでは、「コマンドを実行するだけのコマンド」になってしまいますよね。しかし、/executerunの間に、条件や実行者の変更が好きなだけ挟むことができるとなればどうでしょう。色々な提示をした上で、コマンドが実行できそうです。

つまり、/executeは、サブコマンドに続いて、他のサブコマンドを複数連ねることが可能だということです。これにより、/execute一つで複雑な条件分岐などが作れてしまいます。
これだけでは具体的な想像がしにくいと思うので、とりあえず他のサブコマンドの例をいくつか紹介します。

条件の確認

「攻撃したかどうか」のような条件は、if、もしくはunlessサブコマンドを使って検知します。「もし、条件を満たしている(いない)なら実行する」という形になります。

半径5ブロック以内にゾンビがいるならHiと出力する
/execute if entity @n[type=minecraft:zombie,distance=..5] run say Hi

if entityとありますが、これはifをさらに細かく決めたもの。どういった分野の条件を確認するかをいくつかの項目から選びます。entityと書いた場合は、ターゲットセレクターにあるエンティティが存在しているかを確認します。この場合は、「種類がゾンビ」で「実行位置から半径5ブロック以内」の「最寄りのエンティティ」が存在するなら、チャット欄にHiと出力されます。
他にも、対象が所持しているアイテムや、スコアボードを参照するものがあります。これらについては、また後ほど。

実行者の変更

もう一つ紹介する/executeの機能は、実行者にまつわるものです。ターゲットセレクターにおける、@sの部分に関わります。

直接指定する

直接エンティティを決め、実行者にする方法です。
構文は、/execute as <ターゲットセレクター>です。そのまま続くコマンドでの実行者が<ターゲットセレクター>で指定したエンティティとなります。
さきほどコマンドブロックに入力した/giveも、execute as @pと前に付ければ、元のコマンドのセレクターを変える必要がなくなります。

実行者との関係から絞り込む

ターゲットセレクターといえど、攻撃してきた相手など、状況によって変わる実行者との関係からエンティティを検出することはできません。
そういった場合は、onサブコマンドを使います。/execute on <関係>とすると、続くコマンドの実行者が<関係>に対応するエンティティに変更されます。このサブコマンドを上手く使えば、自分が攻撃した相手を実行者にすることができます。

5. 繋げて実装する

つくっていく

これで、剣で攻撃したことを検知して、対象を倒す、という全体の流れが見えたでしょうか。ここからは、紹介したコマンドの要素と技術を使い、実際に「最強の剣」のアルゴリズムを作ります。

まだ紹介していない仕様もいくつか登場しますが、その都度解説していきます。

常時実行コマンド

いつ剣で攻撃をするかは決まったタイミングではありませんし、攻撃をした瞬間に一度だけ処理を実行すればよい、というわけでもありません。つまり、常に条件の確認をしていたいわけです。
常に実行するコマンドブロックはリピートコマンドブロック。最初に設置しましょう。

攻撃したことは最初に検知したいので、/execute ifがリピートコマンドブロックの中身に適しているでしょう。

スコア"used_sword"が1以上であるなら"Hi"と出力する
/execute if score @p used_sword matches 1.. run say Hi

Hi.gif

実行してみると、延々とHiと出力されます。条件は「used_swordが1以上であること」だけなので、スコアを編集しなければ常に満たされてしまいます。なので、処理の最後にスコアをリセットしましょう。チェーンコマンドブロックを列に付け足して、処理を書き込みましょう。

スコア"used_sword"の値をリセット
/scoreboard players reset @p used_sword

Hi_once.gif

攻撃した瞬間にコマンドを実行する仕組みができました。

攻撃対象の検知

さて、次に剣で攻撃した相手を求めます。さきほど、実行者との関係性から新しく別の実行者を設定する/execute onを紹介しましたが、これを使って検知できるのは実行者を攻撃した対象であり、攻撃した相手ではありません。しかし、攻撃者を検知できるのなら、そこから逆算できそうです。

まず、どのエンティティが攻撃されたのか最初の時点では分からないので、攻撃をたった今受けた、全てのエンティティを実行者にします。

ステップ1:ここから絞り込む
/execute as @e[nbt={HurtTime:10s}]

nbtとありますが、これはエンティティが持つ情報をまとめたデータです。似たものにAttributeがありますが、nbtはモブのステータス値以外にもさまざまな情報を保持しています。HurtTimeは、モブの無敵時間の長さ。無敵時間は、全てのモブに共通で0.5秒に設定されており、それをtickになおした10の値を持っている場合、「攻撃された瞬間のエンティティ」を検知できます。

このエンティティのうち、どれかが攻撃されたモブのはずです。ということは、on attackerで攻撃したエンティティを特定できます。

ステップ2:攻撃されていないエンティティを省く
/execute as @e[nbt={HurtTime:10s}] on attacker

ここで、攻撃者が剣で攻撃したということが分かれば、最初の実行者が攻撃されたエンティティということが断定できます。今の実行者は攻撃した側のエンティティなので、そのままused_swordスコアを確認します。

ステップ3:プレイヤーに攻撃されたか
/execute as @e[nbt={HurtTime:10s}] on attacker if score @s used_sword matches 1..

ifは、runにつなげなくても/executeコマンドの処理を完結させることができます。

...と、簡単にいいましたが、これだけでは何も起こりませんし、条件確認の結果もどこにも残りません。

スコア"has_attacker"を追加
/scoreboard objectives add has_attacker dummy

保存するためのスコアです。スコアの種類はdummy。統計のデータを参照しない、自由に計算ができるただの数値として扱うことができます。

ステップ4:コマンドの結果をスコアに保存する
/execute as @e[nbt={HurtTime:10s}] store success score @s has_attacker on attacker if score @s used_sword matches 1..

/execute storeは、コマンドの実行結果を指定した値に代入するサブコマンドです。今回使うのはstore success score。任意のスコアに、コマンドが成功したら1、失敗したら0を代入します。
/execute ifは、条件が満たされていなかったら失敗という処理になるので、この一連の流れのあとにhas_attackerが1となっているエンティティが攻撃された対象です。

コマンドは、構文や入力値が間違っていたり不完全だと、処理が行われず、エラーメッセージが出力されていました。結果的にコマンドは実行に失敗したわけです。

on_attacker.png
▲ 攻撃対象検知の図解

本番の処理を実行するまえに

さて、このコマンドをさきほどの検知の機構と組み合わせ、/killを実行...する前に

もし、何かの手違いがあったことを考えてみます。プレイヤーのhas_attackerスコアが1になってしまったらどうでしょう。プレイヤーに対して/killが実行されます。スコアのリセットを忘れていようものなら、1秒に20回、常にプレイヤーが倒されてしまい、ワールド全体の取り返しがつかなくなります。

/killのような危険性があるコマンドを使ったアルゴリズムは、実際に試す前に、/sayなどのコマンドで置き換えてデバッグすることをおすすめします。

では、コマンドブロックを並べて機構を作りましょう。

algorithm.png

使うコマンドブロックは全部で四つ。コマンドも入力します。

リピートコマンドブロックの中身
/execute as @e[nbt={HurtTime:10s}] store success score @s has_attacker on attacker if score @s used_sword matches 1..
一つ目のチェーンコマンドブロックの中身
/execute as @e if score @s has_attacker matches 1 run say Hi
二つ目のチェーンコマンドブロックの中身
/scoreboard players reset @a used_sword
三つ目のチェーンコマンドブロックの中身
/scoreboard players reset @e has_attacker

実行して試してみます。

attack.gif

しっかり、対応した番号のゾンビからHiと送信されています。挙動の確認ができたので、/say/killで置き換えて、敵にどれだけ防御力や耐性があっても一撃で必ず倒す、正真正銘の最強の剣の完成です。

6. ふと、冷静になってみる

「最強」を考えなおす

ここまでで、「全てを一撃で倒す」というコンセプトのもとにコマンドを考え、書きましたが、果たしてこれは面白いのでしょうか。たしかに、一撃必殺の攻撃なので「最強」と称すことはできるでしょう。

しかし、「最強の剣」を想像したときのことを思い出してみてください。ただ殴っておわり、というような絵面ではなかったはずです。もっと派手に、かっこよく決まった攻撃を思い浮かべていたのではないでしょうか。
この点を踏まえて、「最強の剣」を少しばかり改善します。

見た目を作る

本来の処理には関係のない、「ガワ」を作りましょう。Minecraftで演出に使われているのはパーティクルです。エフェクト効果を付与したときや、ブロックを採掘するときに表示されるアレです。パーティクルにもまた、専用のコマンド/particleが用意されています。使用例を先に見てみましょう。

シンプルな爆発

/particle minecraft:explosion ~ ~ ~ 0 0 0 0 1

explosion.png

画像のように、足元に小さな爆発のパーティクルを表示します。

燃やす

/particle minecraft:flame ~ ~1.5 ~ 0.5 0.5 0.5 0 50

flame.png

自分の周囲に炎を出します。

謎の光

/particle minecraft:end_rod ~ ~1.5 ~ 0.5 0.5 0.5 0.1 50

end_rod.png

エンドロッドから発するパーティクルを、minecraft:flameと同じ要領で表示します。ただ、こちらには動きがついています。

汎用パーティクル

/particle minecraft:dust{color:[0.0,1.0,0.5],scale:1.0} ~ ~1.5 ~ 0.5 0.5 0.5 0 50

dust.png

レッドストーンダストに見られる粉のパーティクルを表示します。このminecraft:dustは追加で表示時の色や大きさまで指定することができ、自由度が一段と高いです。

では、この例たちをもとに構文も見てみます。

パーティクルの種類

表示されるパーティクルは、Minecraftに登場する全てのものが指定できます。ただ、dustのように、一部のパーティクルはIDの後ろに{}をつけ、コマンド内で表示設定を変更することができます。dustに適用できるオプションを見てみましょう。

color - パーティクルの色

[]内で、0.0から1.0の値を三つ入力することで表示色が設定できます。この値は、それぞれの三色の強さになっており、数字が大きいほどその色の成分が全体の色に強く反映されます。

scale - パーティクルの大きさ

こちらは単純な値で、表示されるパーティクルの大きさを変更します。0.01から4.0の数値に対応しています。

表示位置

対象のパーティクルが表示される座標を指定するフィールドです。数学のxyz座標と同じ要領です。
しかし、Minecraftでは、コマンドが実行された座標を起点に座標を記述する仕組み、相対座標があります。~と書き、そこに数値を続けて入力すると、対応した軸にその数値ぶんだけ移動した場所が設定できます。
さきほど多用した~ ~1.5 ~は例えば、実行場所(自分の足元)からx座標とz座標はそのままに、y軸に沿って1.5ブロックだけ移動した場所にパーティクルを表示するようにしています。

表示範囲

見てのとおり、パーティクルは決まった位置に固定されて表示されているのではなく、多少のばらつきを持っています。このパーティクルがばらつく範囲を偏差といい、これもまたxyz軸のばらつきを個々に指定できます。値が1増えるたびに偏差は8ブロックぶん広がるので、あまり大きな値は使われません。

表示速度と個数

パーティクルがアニメーションまたは動きを持つとき、その速度を設定できます。ただ、アニメーションなどがあっても、速度の値が影響を持つパーティクルと持たないパーティクルがあります。その都度、速度を色々変えて試しましょう。
個数は、単純にパーティクルをいくつ表示するかを決めます。

処理に演出を追加する

では、実際に/particleを最強の剣の処理に組み込んでみます。
攻撃されたエンティティが分かっていて、なおかつ倒されていないときにパーティクルを表示したいですね。つまり、エンティティを検知した直後です。
しかし、そうなると二つ目の処理以降を全て書き直さなければなりません。面倒ですね。

そこで役立つのがブロック選択です。コマンドブロックにカーソルを合わせ、マウスホイールをクリックしてみてください。

pick.gif

ホットバーでコマンドブロックを選択できます。
この操作を、Ctrl(Macの場合はCmd)キーを押した状態で行うと、そのブロックのデータを保持したままインベントリに加えることができます。これでコマンドブロックを壊しても簡単に再設置ができます。

リピートコマンドブロックの一つ後ろに、チェーンコマンドブロックを追加しましょう。

新しいチェーンコマンドブロックの中身
/execute as @e if score @s has_attacker matches 1 at @s run particle minecraft:dust{color:[1.0, 1.0, 0.0],scale:1.5} ~ ~2 ~ 0.01 1 0.01 0 250

thunder.gif

これでモブを攻撃してみると、雷が落ちたかのようなパーティクルが表示されます。

コマンドにat @sとありますが、これは実行位置の変更です。/particleにて、~で座標を指定するときの基準を実行者、つまり攻撃されたエンティティの場所に移しています。

可能性は自分次第

今回は落雷のような演出を作りましたが、Minecraftにはまだまだたくさんのパーティクルが用意されています。さらには、dustのように細かく設定ができるものも少なくなく、自由度はとても高いです。色々試して、自分だけの「最強」を彩りましょう

7. わからないときは

ここまでで、コマンドで作るアルゴリズムやそれに不可欠なコマンドや仕様を紹介しました。前編と違い、エンティティ同士の関係や、プレイヤーの行動の記録など、いちコマンドでは完結しないものでしたね。
こういった、コマンドを複数繋げて作る機構はどこかに正解があるわけではありません。制作に行き詰まっても、Wikiに答えがあったり、専用の生成ツールがあるわけでもありません。

そういうときは、人を頼りましょう。「何がしたいのか」「どこに引っかかっているのか」という具体的な事項を説明できて、場所や状況をわきまえれば、きっとコマンドに詳しい先人たちが答えてくれるでしょう。

8. お役たちリンク集

最後に、前回と同じく、コマンド制作に役立つページへのリンクをいくつか紹介します。

Minecraft Command Advent Calendar 2023/2024

本記事も参加している、コマンド勢が記事を書いて技術を共有するイベントです。
今年はもちろん、昨年も開催しており、60もの記事が投稿されました。ここ一年でコマンドの仕様に数々の改革が入ったので、現在のMinecraftのバージョンでは使えない技術や情報も含まれていますが、バージョンに関係なく、役に立ったり興味深かったりする記事がたくさんあります。目を通してみてはいかがでしょうか。

Minecraft Wiki

今回の記事では、特に覚えることが盛りだくさんの要素を複数紹介しました。アルゴリズムに絶対的な答えはない、とは書きましたが、それでもやはりMinecraft Wikiにはそれらに関する情報が分かりやすくまとめられています。

各種SNS

コマンドでものづくりをしている人は、X/TwitterやYouTubeで活動していることも多いです。自分から活発に発言や質問をしたりせずとも、そういった人たちの行動を追っているだけで、自然と知識がついたり、インスピレーションが湧いたりするものです。

おわりに

今回は、コマンドで作るアルゴリズムとそれに必要な要素や考え方に加え、演出の作り方まで紹介ました。

全くわけが分からない、という方もいるのではないでしょうか。前回にまして、さらに理解の難しい内容と物量なので、無理もありません。到底、一朝一夕で把握できるものではないでしょう。
しかし、焦る必要はありません。自分がやりたいと思うこと、つくりたいと思うモノに素直に従ってコマンドを書いてみてください。実装に必要なのは何か、と実践しながら模索することが成長への一番の近道です。
期間を開けて、前回の記事この記事を読み返すと、見えてくるものもあるかもしれません。

また、この記事で作ったものも完璧ではありません。攻撃した対象の検知やにはまだ少し粗がありますし、今の実装だとネザライトの剣でさえあればどれであっても最強の剣と化します。こういった問題の解決を一つのきっかけとしてもよいのです。まずは手を動かしてみましょう。

それでもわからない、となった場合は思い切ってコマンドから少し離れてみるのも手です。こういった個人の趣味でやる創作は、作る本人が楽しいことがまず大事ですから、無理をしてやりたくないことをやる必要はありません。楽しく創作をしましょう。

本当に長くなってしまいましたが。ここまで読んでいただき、ありがとうございます。
よき、コマンドライフを。

0
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
0
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?