マインクラフト統合版のScript APIでは、scripteventコマンドをきっかけにしてプレイヤーへフォームを表示したり、ボタン選択後に別のフォームへ移動させたりする仕組みを作ることができます。
この記事では、main.jsへ記述する基本的な構文から、scripteventの受け取り方、フォーム表示、ボタンを押した後に次のフォームを表示する方法まで、実際に使える形で解説します。
マイクラ統合版Script APIでscripteventを利用する流れ
統合版のScript APIでは、ゲーム内コマンドのscripteventを利用すると、JavaScript側でイベントを受け取って処理を実行できます。
基本的な流れは「プレイヤーがscripteventコマンドを実行する」→「main.jsでイベントを取得する」→「フォームを表示する」という形になります。
例えば、以下のようなコマンドを実行します。
/scriptevent sample:menu
このイベントIDをmain.js側で監視し、対象のプレイヤーにフォームを表示します。
main.jsでscripteventを取得する基本構文
まずはScript APIでscripteventを受け取る処理を書きます。Minecraft統合版ではsystem.afterEvents.scriptEventReceiveを利用します。
基本的なコード例は以下のようになります。
import { system } from "@minecraft/server";
import { ActionFormData } from "@minecraft/server-ui";
system.afterEvents.scriptEventReceive.subscribe((event) => {
if (event.id === "sample:menu") {
const player = event.sourceEntity;
if (player) {
showMainForm(player);
}
}
});
event.idにはscripteventで指定したIDが入ります。そのため、コマンド側とJavaScript側で同じIDを指定する必要があります。
また、フォームを表示するには対象となるプレイヤーの情報が必要になるため、event.sourceEntityから実行者を取得します。
ActionFormDataで最初のフォームを表示する方法
プレイヤーへ選択肢を表示する場合は、@minecraft/server-uiのActionFormDataを利用します。
例えばメニュー画面を作成する場合は、以下のような関数を用意します。
function showMainForm(player) {
const form = new ActionFormData()
.title("メインメニュー")
.body("操作を選択してください")
.button("次のフォームを開く")
.button("閉じる");
form.show(player).then(response => {
if (response.canceled) return;
if (response.selection === 0) {
showSecondForm(player);
}
});
}
button()で作成したボタンは上から順番に番号が割り当てられます。最初のボタンはselectionが0、2番目のボタンはselectionが1になります。
ボタンを押した後に別のフォームを表示する方法
フォームのボタン選択後に別画面を表示したい場合は、選択結果を確認して別のフォーム表示関数を呼び出します。
例えば、最初のフォームで「次へ」を押した場合に詳細メニューを表示する場合は以下のように書けます。
function showSecondForm(player) {
const form = new ActionFormData()
.title("詳細メニュー")
.body("次の操作を選択してください")
.button("設定")
.button("戻る");
form.show(player).then(response => {
if (response.canceled) return;
if (response.selection === 0) {
player.sendMessage("設定を選択しました");
}
});
}
このようにフォームごとに関数を分けることで、メニューが増えても管理しやすい構造になります。
scripteventでフォームを呼び出す際の注意点
scripteventを利用してフォームを表示する場合、いくつか注意するポイントがあります。
- ビヘイビアパックのscriptモジュール設定が正しいか確認する
- @minecraft/server-uiを依存関係へ追加する
- scripteventのIDをコマンドとJavaScriptで一致させる
- フォーム表示対象がプレイヤーであることを確認する
特にevent.sourceEntityが存在しない場合、フォーム表示処理を実行するとエラーになる可能性があります。
また、フォームはプレイヤー操作が必要なため、サーバー全体イベントなどから直接表示する場合は対象プレイヤーを指定する処理が必要です。
実際に使えるメニュー型アドオンの構成例
scripteventとフォームを組み合わせると、ワールド内に管理メニューやショップ画面、テレポートメニューなどを作成できます。
例えば「/scriptevent shop:open」と入力するとショップ画面が開き、商品ボタンを押すと購入確認フォームへ移動する、といった仕組みも同じ考え方で実装できます。
大規模なアドオンを作る場合は、フォームごとにファイルや関数を分割するとコードの管理がしやすくなります。
まとめ
マイクラ統合版Script APIでは、scripteventを利用することでコマンドをきっかけにフォームを表示できます。
基本的にはscriptEventReceiveでイベントを取得し、ActionFormDataでフォームを作成、buttonの選択結果によって次のフォーム関数を呼び出す構成にすると分かりやすく管理できます。
最初は1つのフォームから作成し、動作確認しながらメニューを追加していくことで、複雑なアドオンでも扱いやすいScript API構成を作ることができます。

コメント