コンテンツにスキップ

カスタムスクリプト

カスタムスクリプト機能は、discord-mcbeの機能をJavaScript/TypeScriptで拡張するための仕組みです。Botの起動時にスクリプトを読み込み、イベントを受け取ったり、ワールドやプレイヤーを操作できます。

起動時にconfig.jsonのscript.entryで指定したファイルが読み込まれ、default exportした関数が呼び出されます。関数の引数には、discord-mcbe本体のApplicationインスタンスが渡されます。

JavaScript/TypeScriptの両方に対応しています。

scripts/main.ts
import type { Application } from '@discord-mcbe/server';
export default function main(app: Application) {
app.logger.info('Custom script loaded');
}

BDSのserver-net接続は、初期状態では認証されません。Bearer認証を使う場合は、.envへ任意のトークンを追加し、カスタムスクリプトから認証処理を設定します。

.env
BRIDGE_TOKEN=トークン
scripts/main.ts
import { bearerAuth, type Application } from '@discord-mcbe/server';
export default function main(app: Application) {
const token = process.env.BRIDGE_TOKEN;
if (!token) throw new Error('BRIDGE_TOKEN is not set');
app.minecraft.script.setAuthenticator(bearerAuth(token));
}

BDS側のvariables.jsonにも同じトークンを設定します。

variables.json
{
"BRIDGE_URL": "ws://localhost:23191",
"BRIDGE_TOKEN": "トークン"
}

独自の認証を使う場合は、setAuthenticatorへリクエストを受け取る関数を渡してください。関数はbooleanまたはPromise<boolean>を返します。認証に失敗した接続は、ワールドセッションが作られる前に拒否されます。

scripts/main.ts
import type { Application } from '@discord-mcbe/server';
export default function main(app: Application) {
app.on('worldConnect', async (event) => {
app.logger.info('Connected:', event.world.name);
await event.world.sendMessage('§aDiscord bridge connected');
});
app.on('playerJoin', async (event) => {
const location = await event.player.getLocation();
app.logger.info(
`${event.player.name}がログインしました。座標: [${location.x}, ${location.y}, ${location.z}]`,
);
});
app.on('minecraftMessage', (event) => {
app.logger.info('Chat:', event.world.name, event.sender.name, event.message);
});
}

主なイベントは次のとおりです。詳しくはAPIリファレンスを参照してください。

イベント 主な値 タイミング
startup app Bot、接続サーバー、スクリプトが起動したあと
discordReady client Discordへのログインが完了したとき
discordMessage message 対象チャンネルでユーザーのメッセージを受信したとき
discordSend channel, message discord-mcbeがDiscordへ送信する直前
worldConnect world ワールドの初期化が完了したとき
worldDisconnect world ワールドのセッションが終了したとき
minecraftMessage world, sender, message Minecraftのチャットを受信したとき
playerJoin / playerLeave world, player プレイヤーが参加・退出したとき
scripts/main.ts
import type { Application } from '@discord-mcbe/server';
export default function main(app: Application) {
app.on('worldConnect', async ({ world }) => {
const result = await world.runCommand('weather clear');
const tps = await world.getTPS();
app.logger.info(world.name, result, 'TPS:', tps);
});
}

ScriptWorldからメッセージ送信、コマンド、TPS、Script Event、プレイヤー、スコアボードを操作できます。ScriptPlayerでは個別メッセージ、座標・ディメンション・ゲームモード取得、ゲームモード変更、キック、画面表示を扱えます。

全メソッドと型はAPIリファレンスを参照してください。

カスタムスクリプトでは、npmで公開されているパッケージを自由に利用できます。ランチャーと同じディレクトリにあるpackage.jsonへ、使いたいパッケージを追加してください。パッケージマネージャーはnpm、pnpm、Bunなどから自由に選べます。

追加したパッケージは、scripts/内のファイルから通常どおりimportできます。@discord-mcbe/serverと@discord-mcbe/sharedはdiscord-mcbe本体が提供するため、別途インストールする必要はありません。