【マイクラ統合版】カスタムコマンドを「名前空間」なしで登録・実行する方法【ScriptAPI】

はじめに

マインクラフト統合版には、ScriptAPIを用いたカスタムコマンド(CustomCommand)システムが存在します。下の画像のように、完全にオリジナルのコマンドを定義してゲーム内で呼び出せるシステムのことですね:

Character
だいぶできることが増えて楽しい

オリジナルコマンドそのものの概要や作り方については、以下の記事を参考にしてください。本記事では割愛します:

「名前空間」という障壁

さて、このカスタムコマンドの名前ですが、上記の記事で説明している通り「名前空間」というものが必須です。例えば上記の画像の例でいうなら「lq:test」の「lq」の部分ですね。これはコマンド同士の重複・干渉を防ぐために不可欠である一方で、配布ワールド・アドオン等でカスタムコマンドを定義しようという場合、少々厄介な仕様です。

Character
入力事項がその分増えるということだもんね

しかしながら実は、公式では説明されていないのですが、Minecraft統合版において「名前空間」なしのカスタムコマンドを定義することは一応可能です。本記事では、その方法について説明していきます。

スクリプト

以下は、名前空間なしのコマンド、「test」を登録する例です:

Copied!
import * as server from "@minecraft/server";

server.system.beforeEvents.startup.subscribe(ev => {
    // 登録したいコマンドの情報を定義
    const namespace = "lq";
    const commandName = "test";
    const commandDescription = "これはテスト用のコマンドです";
    const commandParameters = [
        { name: "test", type: server.CustomCommandParamType.String },
    ];

    // コマンド実行時の処理を関数として定義
    const commandCallback = (origin, args) => {
        server.system.run(() => {
            const entity = origin.sourceEntity;
            if (!entity) {
                return;
            }
            
            const message = args.test;

            entity.runCommand("say test"); // 具体的な実行処理
            entity.sendMessage(message);
        });
    };

    // 名前空間付きの「正式なコマンド」を登録
    ev.customCommandRegistry.registerCommand({
        name: `${namespace}:${commandName}`,
        description: commandDescription,
        permissionLevel: server.CommandPermissionLevel.Any,
        mandatoryParameters: commandParameters,
    }, commandCallback);

    // 名前空間なしのコマンドも登録
    ev.customCommandRegistry.registerCommand({
        name: commandName,
        description: commandDescription,
        permissionLevel: server.CommandPermissionLevel.Any,
        mandatoryParameters: commandParameters,
    }, commandCallback);
});

スクリプトを見ていただくと分かると思うのですが、これは「名前空間付きの正式なコマンド」と、「名前空間のないコマンド」を両方定義・登録し、コマンドの実行処理(commandCallback)を1つにまとめて定義しています。このように定義することで、「名前空間のないコマンド」が実質的な短縮版コマンドとして、それ単体で実行することが可能です。

Character
配布ワールドとかだとよく見るのに解説記事はなぜかない

実行

さて、実際にこのプログラムを保存してマイクラ内で挙動を確認してみましょう:

このように、ゲーム内で名前空間なしのコマンド、「test」が正常に定義されていることが分かるでしょう。このようにしてcommandCallbackをまとめることで簡潔なコマンドを定義することができます。配布ワールドなどを作る際は、こういうものがあると非常に便利だと思います。

  • ちなみに、起動時に何やらエラーが表示されますが問題なく実行できます

おしまい

ということで、本記事では名前空間なしでコマンドを実行する方法について解説してみました。個人的にこのような設定は配布ワールドや配布アドオンなどでよく目にするのですが、なぜか解説している記事がないんですよね。不思議です。

最新情報をチェックしよう!