注目キーワード

「CustomCommand」に引数を設定する方法を解説! – 1.21.80で変わったScriptAPI

はじめに

本記事は、以下の自分でコマンドを作ることができるシステム、CustomCommandについての記事の続編です。まだご覧になっていない方は、先にこちらからご覧になることをおススメします:

環境構築やCustomCommandの概要については上記の記事で解説しています。

さて、本記事ではこのCustomCommandにおいて引数を設定する方法について説明していきます。

Character
引数を設定できるとだいぶできることが増えます

引数とは?

簡単に言えば、コマンドを実行する際に、そのコマンドに与える値のことを引数といいます。分かりやすく言うとターゲットセレクターの「@a」とか場所を表す「~ ~ ~」がそうですね。

Character
元はプログラミング・数学の用語です

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

スクリプト

以下では変数serverが突拍子もなく出てきますが、これは以下のimport文で定義されています:

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

さて、引数を設定するにあたって必要となるのが、前回も軽く触れましたがmandatoryParametersとoptionalParametersです。前者は必須となる引数(ないとエラーを吐く)であり、後者は任意の引数(なくてもいい)をそれぞれ定義します。ともに配列形式で引数を設定することとなっており、nameとtypeのプロパティが必要です。

以下は具体的に引数を設定した例です:

mandatoryParameters:[
    {name:"test",type:server.CustomCommandParamType.String}
 ],
Copied!

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))
Copied!

すると文字列なら”abc”と、座標なら{“x”:0,”y”:0,”z”:0}のようにそれぞれ表示されると思います。これは先ほど指定したtypeによって異なります。あとはこの形式に従ってargを解析し、必要な情報を抽出するだけですね。例えばtypeが文字列の場合、

origin.sourceEntity.sendMessage(arg)
Copied!

といったスクリプトでその文字列の出力ができます。

なぜか複数出力されない問題

これ、やってみると分かりますが、複数の引数を設定してもargはなぜか最初の1つの情報しか含みません。関数「registerCommand」についての公式ドキュメントを見ると、「args : any[]」となっているのでおそらくバグだと思うのですが…。

この問題については公式の対処を待つしかありません。この問題が致命的となるようなケースにおいては、scripteventを使うという方法も考えられます:

おしまい

ということで、全2回にわたってコマンドを自作できる機能、CustomCommandについて解説してきました。ここまで言っておいて何なのですが、たぶんscripteventのほうが使い勝手がいいと思います。というのも、「自由に引数を設定できる」点と「ベータ版の機能ではない」点は今回紹介したCustomCommandにはないメリットです。

ただ、何のコマンドにも依存することなく、チャット欄などで簡単にコマンドを実行できるという簡便さは、他に代えがたいメリットです。新しい物好きの方は、是非試してみるといいのではないでしょうか。

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