はじめに
本記事は、以下の自分でコマンドを作ることができるシステム、CustomCommandについての記事の続編です。まだご覧になっていない方は、先にこちらからご覧になることをおススメします:
環境構築やCustomCommandの概要については上記の記事で解説しています。
さて、本記事ではこのCustomCommandにおいて引数を設定する方法について説明していきます。
引数とは?
簡単に言えば、コマンドを実行する際に、そのコマンドに与える値のことを引数といいます。分かりやすく言うとターゲットセレクターの「@a」とか場所を表す「~ ~ ~」がそうですね。

本記事は、カスタムコマンドにこの「引数」を設定してより自由度を上げよう、という趣旨です。

スクリプト
以下では変数serverが突拍子もなく出てきますが、これは以下のimport文で定義されています:
import * as server from "@minecraft/server";
さて、引数を設定するにあたって必要となるのが、前回も軽く触れましたがmandatoryParametersとoptionalParametersです。前者は必須となる引数(ないとエラーを吐く)であり、後者は任意の引数(なくてもいい)をそれぞれ定義します。ともに配列形式で引数を設定することとなっており、nameとtypeのプロパティが必要です。
以下は具体的に引数を設定した例です:
mandatoryParameters:[
{name:"test",type:server.CustomCommandParamType.String}
],
nameはこの引数の名前です。String形式で指定すること以外は特に留意することはないでしょう。問題は次のtypeです。これはこの引数の種類であり、予め決められたCustomCommandParamTypeの中から選ぶ必要があります。主要なものを挙げると以下:
種類 | 意味 | 例 |
server.CustomCommandParamType.String | 任意の文字列 | abc |
server.CustomCommandParamType.PlayerSelector | ターゲットセレクター | @a |
server.CustomCommandParamType.Location | 座標 | ~ ~1 ~ |
server.CustomCommandParamType.ItemType | アイテムの種類 | minecraft:diamond |
server.CustomCommandParamType.Integer | 整数値 | 3 |
server.CustomCommandParamType.Boolean | 真偽値 | true |
詳細は公式ドキュメントが詳しいです。
optionalParametersも同様の形式で指定します。
実行関数
続いて、この引数を受けて実行する関数を定義しましょう。前回「origin.sourceEntity.sendMessage(“test”)」とした部分ですね。
まず、この引数を受けて格納される変数argの中身を確認してみましょう。以下のスクリプトで確認できます:
origin.sourceEntity.sendMessage(JSON.stringify(arg))
すると文字列なら”abc”と、座標なら{“x”:0,”y”:0,”z”:0}のようにそれぞれ表示されると思います。これは先ほど指定したtypeによって異なります。あとはこの形式に従ってargを解析し、必要な情報を抽出するだけですね。例えばtypeが文字列の場合、
origin.sourceEntity.sendMessage(arg)
といったスクリプトでその文字列の出力ができます。
なぜか複数出力されない問題
これ、やってみると分かりますが、複数の引数を設定してもargはなぜか最初の1つの情報しか含みません。関数「registerCommand」についての公式ドキュメントを見ると、「args : any[]」となっているのでおそらくバグだと思うのですが…。
この問題については公式の対処を待つしかありません。この問題が致命的となるようなケースにおいては、scripteventを使うという方法も考えられます:
おしまい
ということで、全2回にわたってコマンドを自作できる機能、CustomCommandについて解説してきました。ここまで言っておいて何なのですが、たぶんscripteventのほうが使い勝手がいいと思います。というのも、「自由に引数を設定できる」点と「ベータ版の機能ではない」点は今回紹介したCustomCommandにはないメリットです。
ただ、何のコマンドにも依存することなく、チャット欄などで簡単にコマンドを実行できるという簡便さは、他に代えがたいメリットです。新しい物好きの方は、是非試してみるといいのではないでしょうか。