サーバー
createServer(options) は Server インスタンスを返し、クライアントの待ち受けを開始します。offline: true を指定しない限り、接続してきたクライアントは Xbox Live 認証で検証されます。
最小のサンプル
const bedrock = require('bedrock-protocol')
const server = bedrock.createServer({
host: '0.0.0.0', // 全 IPv4 アドレスで待ち受け
port: 19132,
version: '1.21.50', // これ未満のクライアントはキック
motd: {
motd: 'Funtime Server', // サーバー一覧の上部に表示
levelName: 'Wonderland' // 下部(サブヘッダ)
}
})
server.on('connect', client => {
client.on('join', () => {
// 認証・暗号化が完了した直後。ここからゲームパケットを送れる
client.queue('text', {
type: 'system',
needs_translation: false,
source_name: 'Server',
xuid: '',
platform_chat_id: '',
filtered_message: '',
message: `${client.profile.name} さんが参加しました!`
})
})
})ローカル接続について(Windows)
Windows 版 Minecraft からローカルサーバーへ接続できない場合は UWP のループバック制限が原因です。対処法は FAQ を参照してください。
接続オプション
主要なオプションの一覧です。完全な一覧は サーバーオプション を参照してください。
| オプション | 必須 | 説明 |
|---|---|---|
host | 必須 | バインドするホスト。全 IPv4 なら 0.0.0.0 |
port | 省略可 | バインドするポート。デフォルト 19132 |
version | 省略可 | サーバーとして動作させるバージョン。この値より古い・新しいクライアントはどちらもキック対象(下記注意参照) |
offline | 省略可 | true で XBL 認証の検証を無効化。デフォルト false |
maxPlayers | 省略可 | 同時接続の最大人数。デフォルト 3 |
motd | 省略可 | サーバー一覧に表示する MOTD(motd / levelName) |
advertisementFn | 省略可 | RakNet の PONG データを返すカスタム関数。motd より優先 |
conLog | 省略可 | 接続ログの出力先。デフォルトは DEBUG 時のみ出力 |
raknetBackend | 省略可 | 'raknet-native'(既定)/ 'jsp-raknet' / 'raknet-node' |
バージョン検証の実際の挙動
公式 docs/API.md には「version 以上のクライアントは許可される」とありますが、現在の実装(src/serverPlayer.js の handleClientProtocolVersion)では、指定バージョンより新しいクライアントも failed_spawn(「サーバーが古い」画面)で切断されます。 正確には「指定バージョン以下のクライアントのみ接続可」です。
イベント
Server レベル
server.on('connect', player => { /* ... */ })| イベント | 発火タイミング |
|---|---|
connect | 新しいクライアントが接続を開始し、ハンドシェイク中になったとき。引数は Player インスタンス |
error | クライアントに関する捕捉可能な例外(例: 不正な暗号化パケットの受信) |
Player レベル
connect で受け取る Player インスタンスもイベントを発火します。
| イベント | 発火タイミング |
|---|---|
loggingIn | ログインパケット受信直後(検証開始前) |
login | ID とクライアントデータの検証後。引数は { user, authentication } |
join | ハンドシェイク / 暗号化が成功し、ゲームパケットを受け取れる状態になったとき |
spawn | クライアントのスポーン完了通知後 |
close | クライアントが退出したとき |
packet | すべての 受信パケットに対して発火 |
authentication オブジェクト
login イベントの authentication は次の構造です。
{
authenticated: boolean, // 正規アカウントかどうか
method: 'oidc' | 'legacy' | 'offline',
issuer: string | null // 検証済みの発行者
}オフライン接続では必ず authenticated: false になり、自己申告の XUID は 0 に正規化されます。信頼の判断は XUID ではなく必ず authenticated で行ってください。
スポーンシーケンス
Bedrock プロトコルでは、join 後にサーバーがワールド初期化パケット群(StartGame、チャンクなど)を送り、最後に play_status(player_spawn)→ SetPlayerInitialized と進めてプレイヤーがワールドに出現します。完全な実装例はリポジトリの examples/server/server.js を参照してください。
プレイヤーの操作
// 理由を表示して切断
player.disconnect('メンテナンス中です')
// 理由を非表示で切断
player.disconnect('', true)
// ログイン前に PlayStatus で切断
player.sendDisconnectStatus('failed_server_full')
// ユーザーデータ(XUID / UUID / 表示名など)の取得
const userData = player.getUserData()player.profile には { xuid, uuid, name } が入ります。
server.on('connect', player => {
player.on('join', () => {
console.log(`${player.profile?.name} (xuid=${player.profile?.xuid}) が参加`)
})
player.on('close', reason => {
console.log('退出:', reason)
})
})userData / skinData
検証済みのログイン JWT ペイロードには profile 以外の情報も入っています。
player.userData— identity ペイロード全体(displayName、XUID、identity(UUID)など)。getUserData()の戻り値と同一です。player.skinData— clientData ペイロード(スキン ID・ジオメトリ・テクスチャデータなど)。
player.on('login', ({ user }) => {
console.log(user.displayName, user.XUID)
})サーバーの停止
await server.close('シャットダウンします') // 全員に切断理由を通知して終了