カスタムコマンドを作ってScript APIの基本を知る【マイクラのアドオンの作り方】

すべてのマインクラフターがアドオンを作れるようになることを夢見ています。こんにちは、管理人のぽっちーです。

今回はカスタムコマンドを作りながらScript APIによるMinecraft(マインクラフト、以下マイクラ)のアドオン作成の基本を紹介したいと思います。

この記事でわかること

  • Script APIでアドオンを作る方法
  • 簡単なカスタムコマンドの作り方

なお、この記事は以前の記事で作成した「何もしない」アドオンをベースに解説を進めていきます。まだご覧になっていない方は先にこちらをご覧ください↓

また、Visual Studio Code(以下、VSCode)のセットアップや開発用の拡張機能の導入も済んでいる前提で解説しますので、まだVSCodeの拡張機能がインストールできていない方はこちらの記事に記載の拡張機能をインストールしておいてください↓

カスタムコマンドを作るための道筋

まずはアドオンを作り始めたい気持ちを抑えて、作りたいアドオンがどんなものかを考えてみましょう。

ここ重要です。作りたいものを言葉にできないとプログラムも作れませんからね。カスタムコマンドを作るにあたってどんなことが必要になるかを考えましょう。

といっても初めはそんなの思いつかないと思いますので、ざっくりと必要なものをリストアップしてみます。

ここではコマンド一つでプレイヤー以外のすべてのエンティティをキルする!killallコマンドを作る想定で考えてみます。

カスタムコマンドに必要なこと
  1. アドオンのフォルダを作成する
  2. manifest.jsonを作成する
  3. JavaScriptファイルを用意する
  4. プレイヤーのチャットを監視する
  5. チャットに!killallと入力されたら、入力したプレイヤーがkillコマンド(kill @e[type=!player])を発動する

細かい点はあるにせよ、大体こんな感じになるでしょう。

流れが決まったところで次はアドオンの外側、フォルダとmanifest.jsonの作成です。

何もしないアドオンの準備とmanifest.jsonの書き換え

以前の記事で作成した「何もしない」アドオンを、マイクラのデータフォルダのdevelopment_behavior_packsフォルダにコピーします。そして貼り付けたフォルダの名前を「killall」に変更します。

ベースとなるフォルダの作成

作成済みのマイクラデータフォルダへのショートカット

作成済みのbaseフォルダをコピー

そのまま貼り付け

貼り付けた後

名前の変更を選ぶ

killallという名前のフォルダに変更

フォルダのコピー&ペーストが終わったらベースとなるフォルダの作成は完了です。

Visual Studio Codeでフォルダを開き、manifest.jsonを開く

今作成した「killall」というフォルダをVSCodeで開き、manifest.jsonを修正していきます。

killallフォルダを右クリックし、「その他オプションを表示」→「Codeで開く」を選択します(Windows 10 の場合はフォルダを右クリック→「Codeで開く」でOK)。
VSCodeでkillallフォルダを開いた図
manifest.jsonをダブルクリックで開きます。
manifest.jsonを開いた図

manifest.jsonの書き換え

manifest.jsonを開いたら、中身を書き換えます。

まずは既存の項目を書き換えましょう。以下のように書き換えてみてください。

{
    "format_version": 2,
    "header": {
        "name": "キルオールコマンドアドオン",
        "description": "プレイヤー以外の全てのエンティティをキルする「!killall」コマンドを追加します。",
        "uuid": "b1ef9620-c58e-4fa3-bdcc-f6f1d3c72c36",
        "version": [ 1, 0, 0 ],
        "min_engine_version": [ 1, 19, 71 ]
    },
    "modules": [
        {
            "description": "data",
            "type": "data",
            "uuid": "2c8f62a5-4a5d-440c-a85e-76ee493c9161",
            "version": [1, 0, 0]
        }
    ],
    "dependencies": [

    ]
}

ほとんどすべての項目を書き換えています。ベースがあるから楽ですね。

min_engine_versionに関しては特にこだわりがない場合は最新のマイクラのバージョンにしておいた方がいいです。一般に配布するときに昔のバージョンもサポートしたいって場合もあるかと思いますが、統合版は基本的に自動アップデートで最新になってしまうので、ここも最新で問題ないと思います。

UUIDを入力する部分がありますが、「マイクラ統合版のアドオンを作る上で便利なVSCode拡張機能の紹介」で紹介した「UUID Generator」をインストールしてあれば簡単にUUIDを生成できます。

UUIDを入力したいところでF1キーを押し、「Generate UUID At Cursor」をクリックするだけでOK。

UUID Generatorの使い方

uuidを入力した部分(ダブルクォーテーションの中)にカーソルを移動する

uuidのダブルクォーテーション内にカーソルを移動

F1キーを押して「Generate UUID At Cursor」を選択

generateまで文字を入力すると「Generate UUID At Cursor」コマンドが出てくる

するとUUIDが自動で生成されます。

自動で生成されたUUID

ここまでで、Script API以外の部分の設定が終わりました。

manifest.jsonにScript API特有の項目を追加する

さてここからはScript API特有の設定をmanifest.jsonに追加していきます。

追加するのは以下の2項目です。

minefest.jsonに追加するScript API特有の項目
  1. dependenciesに利用するモジュール名とそのバージョンを追加
  2. modulesにJavaScriptタイプを追加し、マイクラが最初に実行するjsファイルを指定する

dependencies、modulesとは何か

Script APIに特有の項目を記述する際に、そもそもdependenciesとmodulesとは何かを簡単に説明します。

まずdependenciesですが、こちらは今作成しているアドオン(ビヘイビアーパック)が依存するものを記述します。

例えば、今作っているビヘイビアーパックが特定のリソースパックを使うことを前提としている場合、ここにリソースパックの名前とuuidを記述します。そうすればマイクラはこのビヘイビアーパックに必要なリソースパックを判断することができるようになります。

次にmodulesですが、こちらは作成中のアドオンが含んでいるものを記述していく場所になります。

例えばこれから作成するカスタムコマンドは、JavaScriptで作成したスクリプトを組み込むことになるので、modulesの場所に「JavaScriptのモジュールが含まれます」と宣言する必要があります。

dependenciesに@minecraft/serverモジュールを追加する

では早速Script APIに特有の項目を追加していきますが、ここでScript APIを構成するモジュールについてざっと解説します。

Script APIにはモジュールが複数あり、それぞれ用途が異なります。

モジュール名用途
@minecraft/serverScript APIの基本的なAPIが含まれるモジュール
@minecraft/server-uiアクションフォーム、メッセージフォーム、モーダルフォームなど
プレイヤーが操作できるフォーム(UI)を作成・表示するためのモジュール
@minecraft/server-netHTTPベースのリクエストを外部に投げることができるモジュール。
Minecraft Dedicated Serverでのみ利用可能。
@minecraft/server-admin主に@minecraft/server-netで利用する、暗号化に関する機能を含むモジュール。
こちらもMinecraft Dedicated Serverでのみ利用可能。
@minecraft/server-gametest作成したアドオンをテストするためのモジュール。
Script APIのモジュール群

このうち、すべてのモジュールが依存するのが@minecraft/serverモジュールです。Script APIを利用したアドオンを開発する場合、この@minecraft/serverモジュールは必須になります。

今回作成するカスタムコマンドも、この@minecraft/serverモジュールを利用するため、dependenciesに追加していきます。

dependenciesの中に以下書き込んでください。

{
    "module_name": "@minecraft/server",
    "version": "1.1.0-beta"
}

実際にmanifest.json書き込んだものは以下になります。

{
    "format_version": 2,
    "header": {
        "name": "キルオールコマンドアドオン",
        "description": "プレイヤー以外の全てのエンティティをキルする「!killall」コマンドを追加します。",
        "uuid": "b1ef9620-c58e-4fa3-bdcc-f6f1d3c72c36",
        "version": [ 1, 0, 0 ],
        "min_engine_version": [ 1, 19, 71 ]
    },
    "modules": [
        {
            "description": "data",
            "type": "data",
            "uuid": "2c8f62a5-4a5d-440c-a85e-76ee493c9161",
            "version": [1, 0, 0]
        }
    ],
    "dependencies": [
        {
            "module_name": "@minecraft/server",
            "version": "1.1.0-beta"
        }
    ]
}

modules_nameに@minecraft/server、versionに1.1.0-betaを指定しました。(おそらく次期アップデートの1.19.80ではversionとして1.2.0-betaを指定する必要があります)。

これでこのアドオンで@minecraft/serverモジュールを利用できるようになりました。

@minecraft/serverモジュールのバージョンについて

上記では、@minecraft/serverモジュールのバージョンとして1.1.0-betaを指定しましたが、2023/03/24時点では以下のバージョンが利用可能です。

  • 1.0.0
  • 1.1.0-beta

また、次期アップデートである1.19.80(ひょっとしたら1.20.xx)では1.1.0-betaが廃止されて1.2.0-betaを利用することになります。

Script APIはアップデートが激しく、モジュールのバージョンも今後ちょいちょい変わっていきそうです。

最新のモジュールバージョンに関してはマイクラ公式のRelease Changlogを読むと分かります。

https://feedback.minecraft.net/hc/en-us/sections/360001186971-Release-Changelogs

modulesにJavaScriptに関する項目を追加する

manifest.jsonへの追加項目もいよいよ大詰めです。がんばってください!

最後はmodulesにJavaScriptに関する項目を追加します。

以下の内容をmodulesに追加しましょう。

{
    "description": "javascriptモジュール(ここは任意)",
    "type": "script",
    "language": "javascript",
    "uuid": "50f6eaa4-adb7-4b93-9ee8-9bb780a7337c",
    "entry": "scripts/main.js",
    "version": [ 1, 0, 0 ]
}

descriptionは任意の文字列でOK。typeに”script”、languageに”javascript”と記載することで、このアドオンにはJavaScriptで書かれたスクリプトが含まれていることを示します。

uuidは先ほどと同様にVSCodeの拡張機能で新しく生成したものを書き込みます。

entryには、このアドオンが最初に読み込むJavaScriptファイルの場所を指定します。今回の場合はscriptsフォルダ内のmain.jsファイルからスタートするため、”scripts/main.js”と記載しています。

この記述をmanifest.jsonのmodulesの中に追加してください(追加する際はもともと記述されていた”data”の後ろにカンマを付けることを忘れないように)。

完成したmanifest.json

お疲れさまでした。やっとmanifest.jsonが完成しました。完成したmanifest.jsonは以下の通りです。

{
    "format_version": 2,
    "header": {
        "name": "キルオールコマンドアドオン",
        "description": "プレイヤー以外の全てのエンティティをキルする「!killall」コマンドを追加します。",
        "uuid": "b1ef9620-c58e-4fa3-bdcc-f6f1d3c72c36",
        "version": [ 1, 0, 0 ],
        "min_engine_version": [ 1, 19, 71 ]
    },
    "modules": [
        {
            "description": "data",
            "type": "data",
            "uuid": "2c8f62a5-4a5d-440c-a85e-76ee493c9161",
            "version": [1, 0, 0]
        },
        {
            "description": "javascriptモジュール(ここは任意)",
            "type": "script",
            "language": "javascript",
            "uuid": "50f6eaa4-adb7-4b93-9ee8-9bb780a7337c",
            "entry": "scripts/main.js",
            "version": [ 1, 0, 0 ]
        }
    ],
    "dependencies": [
        {
            "module_name": "@minecraft/server",
            "version": "1.1.0-beta"
        }
    ]
}

長かったですね。これでやっと処理本体の記述に入れます。

なお、新規にScript APIを使ったアドオンを開発する場合はこのmanifest.jsonをコピーしてuuidやnameを変更すればいいので、苦労するのは今回だけです。

カスタムコマンドを実装する

いよいよアドオンの内側、カスタムコマンドの処理の作成に移ります。

scriptsフォルダの中にmain.jsファイルを作成

まずはmain.jsファイルを作成していきます。

さきほどのmanifest.jsonファイルでentryを”scripts/main.js”に設定しましたので、そのファイルを作りましょう。

VSCodeのエクスプローラーを右クリックし、scriptsフォルダを作成します。

scriptsフォルダにmain.jsファイルを作成

空のmain.jsファイルが出来上がったら、コードを書いていきます。

@minecraft/serverモジュールのインポート

カスタムコマンドを作るための道筋で整理した、必要なことを再掲します。

カスタムコマンドに必要なこと
  1. アドオンのフォルダを作成する
  2. manifest.jsonを作成する
  3. JavaScriptファイルを用意する
  4. プレイヤーのチャットを監視する
  5. チャットに!killallと入力されたら、入力したプレイヤーがkillコマンド(kill @e[type=!player])を発動する

1~3までは終わっていますので、次は4からですね。

プレイヤーのチャットを監視するには、@minecraft/serverモジュールのBeforeChatEventというイベントを使う必要があります。このイベントは@minecraft/serverモジュールのworldオブジェクトのeventsプロパティのbeforeChatプロパティのsubscribeメソッドを呼び出すことで使うことができます。

……長いですね。ここは書き方を覚えてしまいましょう。

まずはmain.jsの先頭に@minecraft/serverモジュールを使うためのimport文を記載します。

import文は以下の通りです。

import { world } from "@minecraft/server";

これで@minecraft/serverモジュールのworldオブジェクトを利用できるようになりました。このworldオブジェクトにアクセスし、beforeChatイベントを呼び出して処理を記載します。

beforeChatイベントの購読

importが終わったら、次はbeforeChatイベントを使うよ、という宣言をします。

宣言の仕方は次の通り。

world.events.beforeChat.subscribe(function (beforeChatEvent) {

});

subscribeメソッドの中に、チャットが送信されようとしたときに呼び出す関数を記載します。

この関数をコールバック関数と呼びますが、頭の片隅に入れておけばOK。

ここではfunctionを用いてコールバック関数を記載していますが、慣れてきたらアロー関数というものを使って次のように書くと簡潔に書くことができます。

world.events.beforeChat.subscribe(beforeChatEvent => {
  
});

また、beforeChatEventというパラメータはどんな名前でも構いません。たとえば次のようにevとしても問題ありません。

world.events.beforeChat.subscribe(ev => {

});

このevとは何者かというと、beforeChatイベントが発火したときにマイクラ側がチャットに関する情報を格納するものです。なので名前はなんでもよいです。ここではEventを短くしてevという名称でいきたいと思います。

これでカスタムコマンドに必要なことの4番目、「プレイヤーのチャットを監視する」の実装が終わりました。

beforeChatの中身を書く

いよいよ最後、5番目の「チャットに!killallと入力されたら、入力したプレイヤーがkillコマンド(kill @e[type=!player])を発動する」を実装していきましょう。

beforeChatイベントが発動すると、チャットに関する情報がBeforeChatEventクラスのインスタンスとしてevに入ってきます。

BeforeChatEventクラスには入力されたチャットメッセージを参照できるmessageプロパティがあるので、そのmessageプロパティに入ってる文字列が”!killall”だった場合にコマンドを実行してみましょう。

先に完成形を見せるとこんな感じになります。

// @minecraft/serverモジュールをインポートする
import { world } from "@minecraft/server";

// beforechatイベントを購読する
world.events.beforeChat.subscribe(ev => {
  if(ev.message === "!killall"){  // もしチャットの内容が !killall だった場合、
    // killコマンドを実行する
    ev.sender.runCommandAsync("kill @e[type=!player]");
  }
});

ev.senderというのは、チャットを送ったプレイヤーを指しています。そのプレイヤーがrunCommandAsyncメソッドを呼び出すことでkillコマンドを実行しています。

このコードに登場したクラスの公式リファレンスを掲載しておきます。

これで実装は全て完了です。長かったですね。お疲れさまでした!

動かしてみる

コードの実装が終わりましたので、いよいよ動かしてみましょう。

マイクラを起動して、ワールドを新規作成します。そして、ビヘイビアーパックから「キルオールコマンドアドオン」を有効化し、最後に「実験」の「ベータAPI」をオンにします。

そして、チャット欄を開き、「!killall」と入力してみましょう。モブたちがキルされるはずです。

爽快です。モブたちが全てキルされてます。

まとめ

この記事ではScript APIを使うためのmanifest.jsonの書き方と、実際にイベントを購読して動くアドオンの作成の仕方を解説しました。

実際に書いたJavaScriptはたった数行でした。たった数行でカスタムコマンドが作れるのってなかなかすごいと思います。

JavaScriptに慣れていないと難しく感じるかもしれませんが、JavaScriptも勉強しつつ、その勉強した内容をScript APIを使ったアドオン作りに生かせば勉強の効率も上がりそうです。是非試してみてください。

(おまけ)JavaScriptの習得について

Script APIはJavaScriptを使ってアドオンを作る仕組みです。JavaScriptの使い方に慣れていないと今回の内容もちんぷんかんぷんだったかもしれません。そこで、この記事の最後にJavaScriptの学習について書籍とスクールの両方を独自の観点で紹介します。

本を読んでJavaScriptの学習をする場合

JavaScriptはWebの世界で生まれて、HTMLやCSSと組み合わせることを前提として生まれた言語ですが、今ではマイクラのアドオンのようにWebに限らず利用されています。

しかし、もともとWeb用の言語であったために、書籍で勉強しようと思ってもHTML前提で書かれてしまっているものが多く、JavaScriptの勉強をしているのかHTMLの勉強をしているのか混乱してしまうことがあるようです。

私は普段プログラミングを布教しようと様々な本を買い漁っているのですが、HTMLを前提としないJavaScriptの書籍はあまりありません。

そのなかでも比較的JavaScriptに比重を置いている書籍を参考として掲載しておきます。

created by Rinker
¥1,320 (2025/04/16 08:55:49時点 Amazon調べ-詳細)

スクールの場合はJavaScriptをメインに扱っているところを。大人は独学でもOK。

スクールに関しては大人と小中高生で話が変わってきます。

まず大人に関してですが、プログラミングスクールに通うとなるとたいていはITエンジニアへの転職が前提になるため、アドオン作成のために、とか、趣味のために、などという理由では少々オーバースペックです。月謝も結構高いので、IT業界への転職を考えている場合以外は独学でも問題ないと思います。

それに対し小中高生、特に小中学生は先生と生徒という関係の中で学んでいる真っ最中であるため、スクールは比較的実を結びやすいと思います。また、マインクラフトを前提としているプログラミングスクールだったら興味も沸いて学習を継続できる可能性が高くなるでしょう。

といっても、そんなスクールって本当に少なくて、唯一存在するのがエデュケーショナル・デザイン株式会社が運営する「デジタネ」というオンラインプログラミングスクールです。

こちらのスクールではマインクラフトをメインに扱っているプログラミング講座が存在する上にJavaScriptのコースもありますので、子供向けプログラミングスクールとしては貴重な存在だと思います。自宅で学べる、というのもポイントが高いです。(送り迎えは大変ですから……)

30日間は無料で授業を受けられるので、まずは試してみて、お子さんの肌に合えば正式に申し込んでみるといいと思います。(いきなり本契約はやめといた方がいいと思います。お子さんが面白くないのに習わせてしまうとプログラミング自体を嫌いになってしまいますので)

デジタネの公式ページと無料体験は以下のバナーからどうぞ。

それでは、また別の記事でお会いしましょう。お疲れさまでした。