はじめに
マインクラフトには、実に多種多様なコマンドが用意されています。その種類は多岐にわたり、giveやsummonといった一般的なものから、executeやfunctionといった少し専門的なものまで様々です。しかし、この多様さがマインクラフトのゲーム性や柔軟性を大きく高めているといっても過言ではないでしょう。これらのコマンドを使えば、凡そのことは達成できます。巷には、このコマンドに関して専門的に解説した動画や記事などが数多く存在することもあって、コマンドは今日も、多くのクリエイターに愛され、使われています。
これは、コマンドの一種、「giveコマンド」と呼ばれるものです。このように、コマンドはスラッシュから始まる一連の文字列を指します。このように簡単にコマンドの呼び出しが可能で、SwitchやPS4といった家庭用ゲーム機でも実行可能という容易さも、コマンドが愛用される理由の一つでしょう。
scripteventコマンド
その中で、時々見慣れないコマンドを目にします。その一つが、「scripteventコマンド」です。
説明を読むと「IDとメッセージを含むスクリプトイベントをトリガーします。」と書かれていますが、これを読んだだけではいったいどんなコマンドなのか見当が付きません。おそらく、多くの人はこのコマンドの存在を知ってか知らずかスルーしていることでしょう。
この記事では、この「scripteventコマンド」の使い方について、わかりやすく解説します。
本題
本記事は以下のような構成でお届けします。
Youtube動画
本記事の内容について解説したYoutube動画を作成しました。こちらより視聴できます。
scripteventコマンドとは?
結論を言いますと、この「scripteventコマンド」を使えば、コマンドを自作することができます。
通常、giveコマンドはアイテムを与えるコマンドであり、summonはエンティティを召喚するコマンドである、といった塩梅で各コマンドは、それぞれについてその役割が細かく定義されています。しかし、この「scripteventコマンド」はその役割が定義されておらず、プレイヤーが各々好きにその定義を決めることができるのです。この点で、非常に自由度が高く、クリエイターにとっては重宝するコマンドであることに間違いありません。
しかし、その割には、コマンド自体の知名度がやや低いように感じられます。その理由は、おそらくコマンドの扱いづらさにあるのではないかと考えられます。特に、このコマンドの使い方に関して、(ネット上・Youtube上などで)十分な周知がなされておらず、「どう使えばいいか分からない」と感じる方が多いように思われます。コマンドの有能さを考えると、これは非常に勿体ないことです。
前提知識
この「scripteventコマンド」を使用するにあたっては、「ScriptAPI」と呼ばれる拡張機能の使用が必須です。これは、プログラミング(Javascript)を用いてゲームシステムをカスタマイズする機能のことです。以下は、その一例です:
この「ScriptAPI」に関しては、以下の記事で詳しく解説しています。
さて、このページではScriptAPIを使用する上での環境構築を行っていくわけですが、まずは必要となる用語の説明から入ります。
用語の定義
用語 | 意味 |
関数 | ある入力に応じて一意の出力を行うプログラム |
モジュール | プログラムを動作させるための要素・部品 |
JavaScript | プログラミング言語の一種で、主にWebページ上で用いられる |
環境構築
次に、環境構築にあたって必要なものを提示します。以下のリンクよりそれぞれをダウンロードできます。
必要なソフト名 | ダウンロード先 | 備考 |
Minecraft | amazon | 言わずと知れたゲームソフト。Win10版が望ましい。 |
vscode | https://code.visualstudio.com/ | コードの記述に特化したテキストエディタ(無料)。既に別のテキストエディタを持っている場合は不要。 |
node.js | https://nodejs.org/ | javascriptをパソコン上で実行するためのツール(無料)。ダウンロード後、msiファイルを実行。 |
必要なソフトのうち、Minecraftのみ有料で、その他は無料です。テキストエディタ(vscode)はなくても最悪できますが、あったほうが断然望ましいです。また、ScriptAPIはjavascriptに依存するので、このjavascriptをPC上で実行するためのnode.jsは必須です。
以下では、これらのインストールを前提に、手順について説明します。
まず、com.mojangフォルダ内のdevelopment_behavior_packs内に移動し、新規にフォルダを作成します(名前は何でもいいです)。これがアドオンの作業フォルダとなります。com.mojangフォルダの場所については以下で説明します。既にご存じの場合は読み飛ばしてください。
com.mojangの場所
フォルダcom.mojangは
C:\Users\(ユーザー名)\AppData\Local\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang
に存在します。エクスプローラー上で、「AppData」というファイルは隠しファイルなので、これを選択するためには、エクスプローラーの「表示」設定から隠しファイルのチェックをオンにしてください。または、「ファイル名を指定して実行」というアプリを起動し、
「%LocalAppData%\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang」
と入力することでも開けます。
このcom.mojangの中にdevelopment_behavior_packsフォルダが存在するので、これを開いて新規にフォルダを作成してください。
manifest.jsonの作成
次に、新規に作成したアドオンのフォルダ内に移動し、「manifest.json」というjsonファイルを新規作成してください。右クリックして「新規作成」→「テキストドキュメント」を選択し、作成されるファイルの名前を「manifest.json」に変更すればOKです。
「manifest.json」はこのアドオンの要項(名前やidなど)を記述したファイルで、これによってマインクラフトがアドオンを認識できるようになります。
manifest.jsonの内容は以下の通りです。作成したmanifest.jsonを、先ほどダウンロードしたvscodeなどを用いて開き、以下をコピー&ペーストしてみましょう。
上のnameやdescriptionはこのアドオンの名前・説明文です。この部分をアレンジしてお使いください。また、2か所あるuuidはアドオン固有の文字列で、重複すると面倒なことになるので以下のジェネレーターを用いて生成・変更することをお勧めします。
「@minecraft/server」のインストール
続いて、本アドオンでお世話になる「@minecraft/server」モジュールのインストールを行います。タスクバーの検索欄に「cmd」と入力してコマンドプロンプトを起動するか、vscodeのターミナルを起動しましょう。そして、
というコマンドを入力します。cdコマンドは、ディレクトリを指定することでディレクトリを移動することができるコマンドです。例えば、アドオンのフォルダ(manifest.jsonがあるフォルダ)が、
C:\Users\User\AppData\Local\packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang\development_behavior_packs\test_pack
であった場合は、
となります。フォルダの場所(特にユーザー名)は各自異なるので、ご自身でパスを確認してください。エクスプローラーの上部欄より確認できます。
上記のコマンドの入力が完了したら、続いて以下のコマンドの入力を行いましょう。
コマンド「npm」に関してエラーが発生した場合、node.jsのインストールが完了していない可能性があります。エラーが発生している場合はこの点を確認してみることをお勧めします。
main.jsの作成
以上が完了したら、アドオンのフォルダ内で「scripts」というフォルダを作成しましょう。そしてその中に「main.js」というjavascriptのファイルを作成します。ここにスクリプトを記述することになります。このjsファイルは、vscodeを始めとするテキストエディタで開くことができます。
scripteventを定義
いよいよ準備が整いました。次に、scripteventを定義するスクリプトを書いていきます。
まずは以下のように記述し、minecraft/serverモジュールの呼び出しを行います。
コンセプト
まず、scripteventの構文について把握しておきましょう。構文については、以下のように表せます。
このように、「コマンド名」、「イベントのid」、「メッセージ」の3つの部分に分けることができます。コマンド名は「scriptevent」で固定のため、解説の必要はないとは思います。
イベントのidやメッセージの部分は、自分で決めることができます。例えば、予め「lq:killall」というidが入力されたらkillコマンドを発動する、とScriptAPI上で定義した上でこのコマンドを実行する、といった塩梅です。メッセージの部分も同様で、主にこれはコマンド実行時のオプション設定(引数)に用いられます。
なお、id部分にはminecraft以外の名前空間が必要です。これは任意の文字列であり、「:」記号によって名前空間(前半部)とそれ以外(後半部)が区別されます。eventのidの重複を防ぐために必要です。
さて、以下ではscripteventの定義について説明します。
基本的なスクリプト
以下は、「lq:killall」というidが入力されたらkillコマンドを実行するスクリプトの例です。
- server.system.afterEvents.scriptEventReceive.subscribe(ev => {
- if(ev.id == "lq:killall"){
- if(ev.sourceType == "Entity"){
- ev.sourceEntity.runCommand("kill @e[type=!player]");
- }else if(ev.sourceType == "Block"){
- ev.sourceBlock.dimension.runCommand("kill @e[type=!player]");
- }
- }
- })
スクリプト内のev.idで入力されたscripteventのidを取得します。もしこれが「lq:killall」であった場合は処理を行います。
また、ev.sourceTypeによってscripteventコマンドの実行元を取得します。この実行元に合わせてそれぞれについてrunCommand関数を実行し、エンティティ・コマンドブロックの両方からのコマンド実行を可能にしています。
これを保存してアドオンを有効化し、以下のようなコマンドを実行すると、すべてのエンティティが倒されることが確認できるでしょう。
引数を取得
また、ev.messageでメッセージ部分を取得することができ、実質的にこれは引数(オプション設定)として機能します。以下は、その一例です:
- server.system.afterEvents.scriptEventReceive.subscribe(ev => {
- if(ev.id == "lq:add"){
- let args = ev.message.split(" ");
- let message = `${args[0]} + ${args[1]} = ${Number(args[0])+Number(args[1])} です.`;
- if(ev.sourceType == "Entity"){
- ev.sourceEntity.sendMessage(message);
- }else if(ev.sourceType == "Block"){
- ev.sourceBlock.dimension.getPlayers().forEach(player => player.sendMessage(message));
- }
- }
- })
ここでは、ev.messageによってメッセージを取得し、それを空白で分割して配列argsに格納しています。その後、sendMessage関数を用いて、引数の数字を足し算した結果を出力します。
実際に、以下のようなコマンドを実行してみましょう。
すると、以下のような結果が返ってくることが確認できると思います。
これはコマンドブロックで実行した場合も同様です。コマンドブロックで実行した場合、そのディメンション内にいるすべてのプレイヤーに結果が返ってきます。
応用
これらを応用すると、scripteventコマンド内で別のコマンドを実行することもできます。executeコマンドをイメージすると分かりやすいかと思います。以下はその一例です:
- server.system.afterEvents.scriptEventReceive.subscribe(ev => {
- if(ev.id == "lq:chance"){
- let args = ev.message.split(" ");
- let command = "";
- for(let i=1; i<args.length; i++){
- command += args[i] + " ";
- }
- if (Math.random()*100 < args[0]){
- if(ev.sourceType == "Entity"){
- ev.sourceEntity.sendMessage(command);
- }else if(ev.sourceType == "Block"){
- ev.sourceBlock.dimension.runCommand(command);
- }
- }
- }
- })
これは、ある確率で任意のコマンドを発動するscripteventを定義(lq:chance)するものです。ここでも同様にev.messageでメッセージ部分を取得し、配列に格納します。その後、コマンド部分だけ文字列を合体し、変数commandに格納したのちにrunCommand関数でこれを用いています。
また、余談ですがランダムな処理を実行するにはMath.random()を用いると便利です。
使ってみたら案外便利だったので、これはこれでアドオン化するかもしれないです。
補足
このscripteventコマンドをコマンドブロックではなく、functionのtick.jsonなどを介してServer側で実行したいこともあるかもしれません。その場合は、
- if(ev.sourceType == "Server"){
- //ここに処理の内容を記述
- }
のように、条件分岐を行う必要がある点に注意しましょう。
functionをエンティティ・コマンドブロック側から実行する場合はこの処理は不要です。
scripteventの良いところ
以前、このような記事を投稿しました:
こちらの記事ではチャット欄を用いた「オリジナルのコマンド」を作成する方法についてお話ししましたが、この記事の内容とは異なり、本記事で紹介した方法はコマンドブロックを経由したコマンドの実行が可能なのが利点です。そのため、オリジナルコマンドの実行の自動化がはるかに容易なのが良いところです。
また隠された利点としては、ベータAPIに依存していないため、アップデートを機に急に使えなくなる危険がないところが挙げられます。良いことづくめですね。
おしまい
このように、scripteventを用いることで、マインクラフトではオリジナルのコマンドを作成することができます。オリジナルのコマンドが作れると非常に自由度が上がります。皆さんも、オリジナルのコマンドを作ってみてはいかがでしょうか?
実際に、これを応用すると、オリジナルのエンチャントを作成することができます。詳細は以下の記事をご覧ください。
こちらの記事もおススメです!