そらとぶけもの

こわくないよ

【備忘録】Minecraft(BE)のScript API

この記事はつばさが書いています。

公式ドキュメントを参考にマイクラのアドオンを作成したので備忘録を書く。

learn.microsoft.com

ビヘイビアパックのファイル構造

tbkm_BP
   |-scripts
   |     |-main.js
   |-manifest.json
   |-pack_icon.png

manifest.jsonの書き方

{
    "format_version": 2,
    "header": {
        "description": "§l§3つばくまのアドオン",
        "name": "つばくまあどおん",
        "uuid": "74770947-328e-4430-ae74-61b93de960dd",
        "version": [1, 0, 0],
        "min_engine_version": [ 1, 19, 0 ]
    },
    "modules": [
        {
            "description": "script",
            "type": "script",
            "language": "javascript",
            "uuid": "803dbda5-dce0-4617-a6ac-7ba1c6c004d9",
            "version": [1, 0, 0],
            "entry": "scripts/main.js"
        },
        {
          "description": "dummy",
          "type": "data",
          "uuid": "211e5691-771f-42a6-9365-a3e85c921374",
          "version": [1, 0, 0]
      }
    ],
    "dependencies": [
      {
        "module_name": "@minecraft/server",
        "version": "1.1.0-beta"
      },
      {
        "module_name": "@minecraft/server-ui",
        "version": "1.0.0-beta"
      }
    ]
}
mainfest.jsonは、description,name,uuidだけ変えればまあ大丈夫です。

dependenciesの中身は、apiを使うためのものなので使うapiに応じて変更する必要があります。

minecraft/server-admin Module | Microsoft Learn

↑必要なapiのページに情報があるのでちゃんと見てください。

それ以外の場所を変える必要はほぼないです。

main.jsの書き方

チャットでテスト

import * as server  from "@minecraft/server";
server.world.events.beforeChat.subscribe(ev => {
    ev.message = "§l§3" + ev.message;
});

解説
server.world.events.beforeChat.subscribe()

チャットが送信されたときに発火する関数。BeforeChatEventがコールバック関数の引数に入ります。

ev.message = "§l§3" + ev.message;
§l§3をメッセージの先頭につけることで、メッセージが緑色の太字になります。

§(セクション記号)と、特定の英数字を組み合わせることで文字をカスタマイズできるマイクラの仕様です。

バニラのワールドでも看板やチャットで使えるので調べて試してみてください。

↓参考にした動画↓(はっち&ぽっちーチャンネル様)

※少し前の動画なので書き方がところどころ違います。 www.youtube.com

uiの作り方

import * as server  from "@minecraft/server";
import * as ui from "@minecraft/server-ui";

function menu_00(player) { const form = new ui.ActionFormData(); form.title("タイトル"); form.body("もじ"); form.button("ボタン1"); form.button("ボタン2","textures/blocks/command_block"); form.show(player).then(response => { let selectButton = response.selection; if(selectButton === 0) menu_01(player); else if(selectButton === 1) menu_02(player); }); };

function menu_01(player) { const form = new ui.ModalFormData(); form.title("タイトル"); form.textField("テキストフィールド","ここに入力してください。","初期値"); form.dropdown("ドロップダウン",["要素1","要素2","要素3","要素4"],0); form.slider("スライダー",0,100,1,0); form.toggle("トグル",false); form.show(player).then(response => { player.runCommandAsync('say ${response.formValues[0]}');//※シングルクォートになっているので、コピペする場合はバッククォートに直してください。 }); }); };

server.world.events.beforeItemUse.subscribe(ev => { if(ev.item.typeId === rulerstone_id)ruler_menu(ev.source); });

解説
server.world.events.beforeItemUse.subscrib()

アイテムを右クリックすると発火する関数。 BeforeItemUseEventがコールバック関数の引数に入ります。

function menu_00(player) {
    const form = new ui.ActionFormData();
    form.title("タイトル");
    form.body("もじ");
    form.button("ボタン1");
    form.button("ボタン2","textures/blocks/command_block");
    form.show(player).then(response => {
        let selectButton = response.selection;
        if(selectButton === 0) menu_01(player);
        else if(selectButton === 1) menu_02(player);
    });
};
ActionFormDataはボタンと文字のみのフォームです。

メソッドでボタン、文字を追加します。

ボタンの第二引数には、ボタンの横に表示するテクスチャを設定することができます。これはなくても大丈夫です。

テクスチャのパスがわからない場合は、公式のサンプルを参考にしてください。 適当なバージョンを探してAssetsを開いてSource code(zip)ダウンロード。ダウンロードしたzipを回答して開くとresource_packがあるのでちゃんと確認することをお勧めします。

showで表示、thenで押されたボタンの処理などをかけます。

response.selectionで何番目のボタンが押されたかわかります。※0から始まるので注意。

function menu_01(player) {
    const form = new ui.ModalFormData();
    form.title("タイトル");
    form.textField("テキストフィールド","ここに入力してください。","初期値");
    form.dropdown("ドロップダウン",["要素1","要素2","要素3","要素4"],0);
    form.slider("スライダー",0,100,1,0);
    form.toggle("トグル",false);
    form.show(player).then(response => {
            player.runCommandAsync('say ${response.formValues[0]}'); //※シングルクォートになっているので、コピペする場合はバッククォートに直してください。
        });
    });
};
ModalFormDataは、テキストフィールド、ドロップダウン、スライダー、トグルのみのフォームです。

上のサンプルコードを見てもわからない場合は公式ドキュメントを参照してください。((めんどくさいので💦

response.formValuesにフォームの上から順番に結果が入っています。※resonse.formValuesは配列です。

MessageFormDataは、使用したことがないので省きます。