【統合版】ScriptAPI #5 モーダルフォーム

スポンサーリンク

解説

今回は三つのフォームのうち、ModalFormの解説をしていきます。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-03-27-180910-4.png

早速次のようなフォームを作ってみましょう。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-03-000140.png
import { world } from "@minecraft/server";
import { ModalFormData } from "@minecraft/server-ui";

world.afterEvents.itemUse.subscribe(ev => {
    const player = ev.source;
    const itemStack = ev.itemStack;

    // アイテムの種類がダイヤモンドの場合
    if (itemStack.typeId === "minecraft:diamond") {

        // モーダルフォームを定義
        const form = new ModalFormData();
        // タイトル
        form.title("タイトル");
        // トグル (ラベル,初期値)
        form.toggle("トグル", false);
        // スライダー (ラベル,最小値,最大値,刻み,初期値)
        form.slider("スライダー", 0, 100, 1, 0);
        // ドロップダウン (ラベル,配列,初期値)
        form.dropdown("ドロップダウン", ["選択肢0", "選択肢1", "選択肢2"], 0);
        // テキストフィールド (ラベル,プレースホルダ,初期値);
        form.textField("テキストフィールド", "プレースホルダ", "");

        // フォームの表示
        form.show(player).then(res => {

            // ここから下はフォームが送信される または フォームが閉じられると処理が始まる

            // res.canceled - フォームをキャンセルしたかどうか
            // res.formValues[] - フォームの入力の配列 (0から始まる)

            if (res.canceled) { // フォームをキャンセルした場合
                player.runCommand("say キャンセルしました");

            } else { // キャンセルされなかった場合
                // フォームの結果をsayする
                player.runCommand("say トグル: " + res.formValues[0]);
                player.runCommand("say スライダー: " + res.formValues[1]);
                player.runCommand("say ドロップダウン: " + res.formValues[2]);
                player.runCommand("say テキストフィールド: " + res.formValues[3]);
            }
        });
    }
});

サンプルコード:メッセージフォーム

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-03-011805.png
import { world } from "@minecraft/server";
import { ModalFormData } from "@minecraft/server-ui";

world.afterEvents.itemUse.subscribe(ev => {
    const player = ev.source;
    const itemStack = ev.itemStack;

    if (itemStack.typeId === "minecraft:iron_ingot" && itemStack.nameTag === "メッセージを送る") {
        // 全てのプレイヤーの配列
        const players = world.getPlayers();
        // 名前の配列
        const names = players.map(player => player.name);

        // フォームの定義
        const form = new ModalFormData()
            .title("メッセージフォーム")
            .dropdown("どのプレイヤーに送りますか?", names)
            .textField("メッセージ", "", "")
            .toggle("匿名にする", false);

        // フォームの表示
        form.show(player).then(res => {
            if (res.canceled) return;

            // 送信先のプレイヤー
            const toPlayer = players[res.formValues[0]];
            // メッセージ
            const message = res.formValues[1];
            // 匿名かどうか
            const isAnonymous = res.formValues[2];

            if (message === "") return player.sendMessage("§cメッセージがありません");
            
            // 三項演算子で匿名の場合、"匿名"と表示する
            toPlayer.sendMessage(`§e${isAnonymous ? "匿名" : toPlayer.name}§f => ${message}`);
        });
    }
});

参考URL

公式リファレンス
minecraft/server Module | Microsoft Learn

ディスコードサーバー
Script API 開発初心者コミュニティ

参考にしたサイト
マイクラの泉

備忘録ブログ
さば2号のgametest(scriptAPI)備忘録

※投稿記事に含まれるファイルやリンクにより発生した被害についてクラフターズコロニーは責任を取りません
投稿通報

コメント

  1. トグルがONの時にplayer.runCommandAsyncを使う方法ってありますか?

    • トグルのフォームの結果がtrueなら、player.runCommandAsync()を実行する、というプログラムを書けばできます。

コメント通報