この記事は、Minecraft Command Advent Calendar 2024 一日目の記事です。
はじめに:この記事について
「コマンド」、Minecraftをプレイしている方なら何らかの形で耳にしたことのある言葉でしょう。しかし、そのコマンドが実際のところ、どういったものなのかを探しても、込み入った内容まで解説されているものは限られます。
そのため、コマンドに対する認識は非常に曖昧で「なんでもできるような何か」と捉えられていることが多いと思います。特に、インターネット上のコンテンツでよく目にするのは「最強」「チート」の言葉かと。
「最強の剣はどう出すのだろう」「チート武器はどう作るのだろう」
実際にこのような疑問を抱いた方もいるのではないでしょうか。コマンド自体もそうですが、どうすればいいのか、という手順は追えても、その手順の仕組み、実際に何をしているのかまでは分からずに終わることがしばしばあるのではないでしょうか。
この記事は「超・初心者向け」を銘打ち、コマンドの基礎の基礎をこの「最強の剣」の作り方とともに、ひとつひとつ順を追って解説していきます。
0. 前提
まず大前提として、この記事はMinecraft Java Editionのバージョン1.21.3および1.21.4向けに書いています。
この意味が100%理解できる、環境設定はばっちり、という方は次の項目まで飛ばしていただいてかまいません。
普通にMinecraftを遊ぶ場合はエディションやバージョンを気にする必要はさしてありません。特に、エディションは気にしない方も結構いると思います。ですが、コマンド観点からでは非常に重要な要素なので、Minecraftのエディションとその違いについて軽く説明します。
JavaとBedrock
Minecraftの名前を持つゲームは、Java EditionとBedrock Edition、いわゆる統合版の二種類が存在します。
この二つのエディションは、ゲームプレイの観点からはほとんど変わらず、ゲーム画面を見ただけでは見分けづらいです。しかし、内部的な作りは根底から完全な別物であり、様々な仕様が違います。特に、コマンドの実行やその周りの処理が大きく異なります。そのため、Java Editionのコマンドは統合版でそのままでは使えず、逆もまたできません。
しかし、実際のゲームプレイは大方同じであるため、この二つのMinecraftが混同され、話がすれ違ったり、通じなかったりすることがしばしば起こります。
この記事に限らず、Minecraftの技術的な話題において、使うエディションで生じる違いがあることは覚えておくと良いでしょう。
見分け方
ここで、手元にあるMinecraftのエディションを簡単に区別する方法を紹介します。二つのエディションのタイトル画面を比較してみましょう。
(出展:Minecraft Wiki - Java Edition, Bedrock Edition)
上がJava版、下が統合版です。一目見て違いが分かりますね。特に、Java版はタイトルにも"Java Edition"と書かれていることが分かると思います。この記事で取り扱うエディションはJava版なので、Minecraftを起動して上側の画面が表示されれば正しい環境です。
ゲームのバージョン
また、ゲームのバージョンは1.21.3に設定してください。他のバージョンでは、例え同じエディションでも、コマンドの記述方法や挙動が完全に異なったりするので、このバージョンのMinecraftを使用することを強く推奨します。
次に、ワールドの設定をしていきましょう。コマンドは、できることが多く、場合によってはワールドに不可逆的な影響を与えてしまう可能性があります。そのため、コマンドでものを作るときは、新しく専用のワールドを作ることをおすすめします。その際に、「コマンドの許可」はオンにしておきましょう。
前置きが長くなりましたが、ここからMinecraftのコマンドの基礎と、「最強の剣」の作り方について考えていきます。
1. コマンドの基本
「コマンド」とは?
Minecraftのコマンドは、本来ゲームの挙動を確かめるためのツールみたいなものです。"Command"を直訳すると、「命令」です。要はMinecraftに対し、色々な操作をすることを命令する手段というわけです。
好きな状態のアイテムを取得し、好きな状態のモブを召喚し、自由に組み合わせて少ない労力と時間でMinecraftの様々な現象を再現して検証することができます。
この機能を使い、ゲームを上手く操作すれば、カスタムアイテムやミニゲーム等、本来のMinecraftには無い内容を追加して遊ぶことができるのです。
コマンドの構造
そんな命令は基本的に、「誰が」「どこで」「誰もしくは何に」「何を」「する」の形で書かれます。それを踏まえて、次のコマンドを見てみましょう。
/give @s minecraft:netherite_sword 1
ネザライトの剣を与えるコマンドです。チャット欄に入力し、そのまま送信することで実行すると、インベントリにネザライトの剣が一つ追加されるはずです。
この例で、コマンドの基本の構造を見ていきましょう。
この場合は、「自分が」「その場で」「自分に」「ネザライトの剣を一つ」「与える」コマンドとなっています。これらの要素をひとつひとつ、詳しく説明していきます。
「する」- コマンドの種類
基本的に、/
のすぐ後に書かれるコマンドの名前が「全体でおおまかに何をするか」、を決めます。この場合はgive
、つまりアイテムを誰かに与えます。どのアイテムなのか、個数はいくらなのか、といったものはここでは指定せず、ただ「アイテムを与える」という合図になっています。
「誰に」- ターゲットセレクター
続く@s
は、「誰に」に該当する部分です。@
から始まるコマンドの要素は、「ターゲットセレクター」といい、コマンドで指定される「誰に」や「誰を」を管理する中心となります。ここで使われている@s
は、「コマンドを実行した者」が対象であり、必然的に自分にアイテムが与えられます。また、多くの場合は、ターゲットセレクターの代わりにプレイヤーのユーザー名を直接入力することもできます。
「誰が」「どこで」- 実行者と実行位置
先の項目でも触れた、「コマンドを実行した者」と「コマンドを実行した場所」の要素です。コマンドは直接実行位置や実行者の入力をせずとも、実行時に必ずそれらを参照します。
実行者が変わると、@s
のような対象との関係性が変化し、結果もそれにしたがって変わります。例にある/give
コマンドを他のプレイヤーが実行した場合、アイテムは「コマンドを実行したそのプレイヤー自身」に渡され、自分自身には何も起こりません。
実行位置に関しては、/give
の実行に居場所が影響しないので話が少しややこしくなってしまっていますが、実行者の時と同じ要領で、実行された座標を基点に、位置関係を参照する処理をするコマンドがあると考えていただくと、その役割が分かると思います。
「何を」- コマンド独自のパラメーター
最後は、コマンドのミソとなるパラメーターです。コマンドの最初に決めた、「すること」に、具体的に「何を」するかを指定し、ゲームへの命令を完成させます。/give
は、アイテムの種類と個数、二つのこのタイプのパラメーターを持っています。つまり、「ネザライトの剣一つを」は、「ネザライトの剣を」「一つ」に分けられ、実際のコマンドでも分けて入力します。
このコマンドごとのパラメーターは、/give
の場合は二つでしたが、コマンドによっては一つも無かったり、五つ必要だったりと、さまざまです。
名前空間とID
ここまで見ての通り、コマンドの記述は全て英単語で構成されています。Minecraftやコマンドに限らず、コンピューターにおける基本の言語は英語なので、それに沿ってコマンドも英語で構成されています。なので、minecraft:netherite_sword
も日本語やローマ字ではなく、半角の英語で入力する必要があります。また、スペースはコマンドの要素を区切るために使っているので、元のアイテム名が二単語以上からなっている場合、代わりに_
(アンダーバー)を使います。
ところで、アイテムを指定する際、minecraft:
とあります。これは「名前空間」といい、ゲームの要素が誰に定義された、つまり誰に作られたものであるかを宣言する印です。minecraft:netherite_sword
は「Minecraftが作ったネザライトの剣」ということになります。この「名前空間+英語のアイテム名」を、一般的にはIDと呼びます。
...と、ここまでコマンドの基本構造を解説しました。こう見ると、かなり複雑な印象を受けますが、上記のことは今すぐ完全に理解したり、覚えたりする必要はありません。ぼんやりと頭の隅に置いておいてください。
アイテムを強くする
今のコマンドで与えられた肝心のアイテムはただのネザライトの剣。これでは到底「最強」や「チート」とは称せないでしょう。もう一つ、コマンドを使って剣を強くします。
さきほど出したネザライトの剣を手に持ち、以下のコマンドを実行してみましょう。
/enchant @s minecraft:sharpness 5
/give
の時と同じ要領ですね。「自身が」「その場で」「自身に」「ダメージ増加Vを」「付与する」コマンドです。ここでも、ダメージ増加のエンチャントは英名の"sharpness"がIDに使われています。
法外なダメージ
これで剣のダメージが上がりましたが、「最強」を名乗るくらいなので、普通のサバイバルでも見受けられるレベル5なんて言わず、もっと大きいレベルも試してみましょう。
/enchant @s minecraft:sharpness 999
...何やら赤いメッセージが表示されますね。/enchant
はエンチャント台で付与できるエンチャントの最大レベルまでしか付与できません。コマンドといえど、できないことはあります。/enchant
に限らず、このような制限があることは少なくありません。そういう場合には、コマンドは実行されず、赤いエラーメッセージが表示されます。
しかし、このままでは強いエンチャントが付与できません。どう剣のダメージを増やしましょうか。
2. アイテムコンポーネント
アイテムの「構成要素」
そこで登場するのが、アイテムコンポーネントです。"Component"は直訳して「構成要素」。アイテムコンポーネントはアイテムの構成要素ということになります。性質や挙動など、そのアイテムの持つデータを保持してゲームに反映することを「構成」と称している感じですね。
これは、ネザライトの剣がデフォルトで持っているコンポーネントの一部です。アイテムの名前や表示するテクスチャ、耐久値を含む各種数値まであります。さらにはネザライトが素材のアイテム特有の、火に燃えない性質等もここで設定されています。
コンポーネントでカスタマイズ
コマンドを使えば、このアイテムコンポーネントを自由に編集してアイテムを好きな状態にさせることができます。次のコマンドを実行してみましょう。
/give @s minecraft:stick[minecraft:item_name="鋭い棒"] 1
コンポーネントの記述法
そして、コマンドはさきほどと同じ/give
ですが、minecraft:stick
の後ろに[ ]
で括られた箇所があります。これが、/give
でアイテムコンポーネントを指定や編集をする場所です。
アイテムの名前を編集するので、最初に"minecraft:item_name"と、コンポーネントのIDを書きます。続く=
は「後にくる内容を割り当てる」サインです。"鋭い棒"を囲む "
(ダブルクオーテーション)は、割り当てられるものが数字ではなく文字列であることと、その文字列がどこまで続くかをゲームに伝える役割を持っているので、忘れないようにしましょう。
このコンポーネントが加わったことにより、コマンドの「何を」の部分が「アイテム名が"鋭い棒"の棒を一つ」という、さらに細かい設定になります。
enchantmentsコンポーネント
コンポーネントの書き方を見たところで、「最強の剣」に戻りましょう。コンポーネントには、minecraft:enchantments
という、アイテムに付与されているエンチャントを管理する種類があります。/enchant
との違いは、エンチャントを付与する過程を飛ばし、「エンチャントが既に付与された状態」でアイテムを与えることができる点です。この性質により、/enchant
にはあった制約を無視してエンチャントを適用することができます。ではコマンドはどうなっているのでしょうか。
/give @s minecraft:netherite_sword[minecraft:enchantments={"minecraft:sharpness":999}] 1
また一段と複雑な見た目ですね。しかし、=
まではitem_name
と同じ構造です。[ ]
の中で編集するコンポーネントを挙げ、値を割り当てています。ただ、その割り当てられる値が{ }
にもう一層くくられています。これは、enchantments
のコンポーネントがさらに細かい設定を持っているからです。「このエンチャントが付与されている」ということだけでなく、「どれだけのエンチャントがどのレベルで付与されているか」、と複数の情報が一つのコンポーネントで管理されています。
また、レベルを割り当てる際、 :
(コロン)が使われています。実は、:
で割り当てることの方が主流で、=
はコマンドでコンポーネントを指定するときにしか使われません。{ }
が出てくる場合は、<指定する対象>: <指定する値>
が割り当ての基本と覚えておきましょう。
付与されているエンチャントの名前も、"minecraft:"がついていますね。ここでも指定に使うのはエンチャントの表示名ではなく、IDなのです。
もし、ダメージ増加999に加え、ノックバック999も付与するのならば、{ }
内の記述は以下のようになります。
{"minecraft:sharpness":999,"minecraft:knockback":999}
ゲームの限界
では、実行して剣を与えてみましょう。
またしてもエラーメッセージが表示されましたね。レベルに問題があるようです。どうやら、コンポーネントから直接指定をしても、エンチャントはレベル255までしか付与できないようです。
これは、そもそもこの値が255より大きい数字に対応していないことにあります。どこかで上限を設けなければ、数字だけで情報が多くなりすぎてコンピューターがまともに計算ができなくなる、と言った感じです。エンチャントはレベルが高くても5程度が関の山なので、設定できる範囲が255までに抑えられたのでしょう。
こればかりはどうしようもないので、素直にレベルを255に設定しなおしましょう。
/give @s minecraft:netherite_sword[minecraft:enchantments={"minecraft:sharpness":255}] 1
レベルの表示がおかしいですが、ちゃんと機能します。
少し試し斬りをしてみると、エンダーマンや、アイアンゴーレム等の体力が多いモブも一撃で倒せることが分かります。
...しかし、ウィザーほど体力が高くなるとそうはいきません。エンチャントではどう頑張ってもこれが限界なので、これ以上のダメージを出すのには、何か別の手段を考えなければなりません。
3. Attribute
エンチャントでダメージを上昇させるのが限界なら、値を上乗せする形ではなく、素の攻撃力を上げてみましょう。
さきほど紹介した、ネザライトの剣が持つコンポーネントをもう一度見てみましょう。
attirbute_modifiers
とありますね。これは、アイテムが装備時に与える攻撃力や防御力、"Attribute"を操作するコンポーネントです。
"Attribute"は直訳して「属性」。アイテムの数値的な性質、という意味です。
防具等のツールチップに見られるこういった表記は、そのアイテムの持つAttributeを表しています。Attributeは割り当てられる数値がエンチャントよりも高く設定されており、設定次第でウィザーでも一撃で倒せる攻撃力を作ることができそうです。
ですが、attribute_modifiers
コンポーネントを使う前に、Attributeそのものについて知っておきましょう。
コマンドでAttributeを変更する
このAttribute、実は専用のコマンドも持っています。次のコマンドを実行してみましょう。
/attribute @s minecraft:movement_speed base set 0.15
その後、移動してみると、足が速くなっていることが分かると思います。
/attribute
は、「プレイヤーやモブの持つAttributeを管理する」コマンドです。「自身」の「移動速度」を「管理」するわけですが、そこにbase set
と続きます。これはサブコマンドといい、一つのコマンドが複数の機能を持つとき、どの機能を使うか分岐する際に使われます。「base値の設定」を「管理」するように全体の指示を補完しています。
ところで、ターゲットセレクターが@s
ですが、なぜ対象がプレイヤーなのでしょうか。本来Attributeは、アイテムではなく、モブがデフォルトで持っている数値だからです。/attribute
にも出てきた、base
というのはモブが持つそのAttributeの基礎値です。
これは、プレイヤーが持っているAttributeの一部です。コンポーネントと同じく、多彩ですね。攻撃力や防御力、移動速度やジャンプの高さなどもAttributeで管理されています。
/attribute @s minecraft:movement_speed base set 0.1
さきほど変更した、移動速度のAttributeは元に戻しておきましょう。
Attribute Modifier
モブはこのようにAttributeの基礎値を持っていますが、アイテムは、attirbute_modifiers
コンポーネントを通し、その基礎値に"Attribute Modifier"を適用して、ゲームに反映される全体のAttributeを算出します。
アイテムはひとまず置いておき、Attribute Modifierを追加するコマンドは、以下のようになります。
/attribute @s minecraft:movement_speed modifier add minecraft:my_modifier 0.05 add_value
base値を変更したときと同じ効果が得られると思います。
/attribute @s minecraft:movement_speed modifier remove minecraft:my_modifier
"Attribute Modifier"は少々名前が長いので、ここからは"Modifier"と略します。正しい名称は"Attribute Modifier"なので間違えないようにしましょう。
Modifierの追加
先ほどはbase set
となっていたサブコマンド群がmodifier add
になっています。ここで、管理する対象が基礎値ではなく、Modiferであることを宣言しています。つまり、全体としては「AttributeにModifierを追加する」コマンドになります。
自身のID
追加するAttribute Modifierですが、minecraft:my_modifier
となっています。これは、モブが同じAttributeに対するModifierを複数持っているときに、どのModifierのことを指しているのか区別するIDです。IDは自作のものを追加できる場面もあります。「一つのAttribute Modifierを0から設定して作って追加する」ということは「もともとMinecraftには登録されていない要素を追加する」ことを意味するので、当然、Minecraftはその要素のIDは用意していないわけです。
値とModifierの型
続く0.05
はModifierが持つ値です。しかし、この値だけだと、Modifierは完結しません。Modifierは自身が持つ値を使って、どう対象の基礎値を編集するかをいくつかのパターンから指定できます。なので、さらにサブコマンドを派生させて、Modifierの型を示します。今回はadd_value
、単純な加算を使います。
attribute_modifiersコンポーネント
では、このAttribute Modifierをアイテムに持たせてみましょう。
/give @s minecraft:netherite_sword[minecraft:attribute_modifiers=[{type:"attack_damage",id:"my_modifier",amount:2048,operation:"add_value"}]]
しかし、コンポーネントがさらに複雑な構成になっています。[ ]
の中に{ }
で括られた複数の情報がまとめられています。
このままでは見にくいので、少し[ ]
の中身を整理してみましょう。
[
{
type: "attack_damage",
id: "my_modifier",
amount: 9999,
operation: "add_value"
}
]
見やすくなったのではないでしょうか。[ ]
の中に、それぞれが一つのAttribute Modifierを管理する{ }
があります。
実は...
値が割り当てられている四つの項目ですが、/attributeでAttribute Modifierを追加するときに指定する項目と全く同じものになっています。さきほどのコマンドをコンポーネントに落とし込んだ感じですね。それにあたって、Modifierのどの要素に値を割り当てるのかを示す、名前がそれぞれにつけられています。
試してみる
ウィザーより体力が高いウォーデンでも一撃です。これで、晴れて「最強の剣を出すコマンド」が完成しましたね。
4. 便利ツール
今回紹介したコマンドの構文、アイテムコンポーネント、Attributeはすでに言ったように、数ある中のほんの一部にすぎません。その全てをこの記事一つで網羅するのは不可能ですし、したところでその膨大な数は覚えきれません。こういう場合におすすめできるのは、情報をまとめたサイトや、外部の生成ツールを使うことです。ということで、コマンドの記述に役立つサイトを二つ、挙げておきます。
Minecraft Wiki
安心と信頼のWikiページです。ゲームプレイにとどまらず、技術的な情報もしっかりとまとめられています。特に、アイテムコンポーネントやAttributeが一覧としてまとめられているページもあり、手早く欲しい情報が得られます。
さらには、全てのコマンドの解説記事があり、書き方や仕様も全て確認できます。コンポーネントやAttributeと同じく一覧もあります。
MCStacker
要素を少し入力するだけで、一部のコマンドをまるごと自動生成できるツールです。コンポーネントが沢山ついていて、チャット欄に手動で入力するのには複雑すぎるアイテムを与える/give
コマンドでも、値を指定するだけでミスなく出力されます。サイトの言語が英語で、かつこの記事で解説をしていないものが多く含まれていますが、わりと直感的に扱える良サイトです。
おわりに
ここまでで、Minecraftのコマンドの基本の考え方と、アイテムが管理される仕組み、そしてモブが持つ数値を解説しました。
一度では理解できる情報の分量と内容ではないので、実際に自分で試しつつ、時間を空けてこの記事を読み返してみてください。言葉だけでは説明が難しい部分への理解が深まると思います。
足りない情報があれば上記のツールなどで補い、楽しくコマンドで創作していきましょう。
では、よきコマンドライフを。