Skip to content

サーバー

createServer(options)Server インスタンスを返し、クライアントの待ち受けを開始します。offline: true を指定しない限り、接続してきたクライアントは Xbox Live 認証で検証されます。

最小のサンプル

js
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.jshandleClientProtocolVersion)では、指定バージョンより新しいクライアントも failed_spawn(「サーバーが古い」画面)で切断されます。 正確には「指定バージョン以下のクライアントのみ接続可」です。

イベント

Server レベル

js
server.on('connect', player => { /* ... */ })
イベント発火タイミング
connect新しいクライアントが接続を開始し、ハンドシェイク中になったとき。引数は Player インスタンス
errorクライアントに関する捕捉可能な例外(例: 不正な暗号化パケットの受信)

Player レベル

connect で受け取る Player インスタンスもイベントを発火します。

イベント発火タイミング
loggingInログインパケット受信直後(検証開始前)
loginID とクライアントデータの検証後。引数は { user, authentication }
joinハンドシェイク / 暗号化が成功し、ゲームパケットを受け取れる状態になったとき
spawnクライアントのスポーン完了通知後
closeクライアントが退出したとき
packetすべての 受信パケットに対して発火

authentication オブジェクト

login イベントの authentication は次の構造です。

js
{
  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 を参照してください。

プレイヤーの操作

js
// 理由を表示して切断
player.disconnect('メンテナンス中です')

// 理由を非表示で切断
player.disconnect('', true)

// ログイン前に PlayStatus で切断
player.sendDisconnectStatus('failed_server_full')

// ユーザーデータ(XUID / UUID / 表示名など)の取得
const userData = player.getUserData()

player.profile には { xuid, uuid, name } が入ります。

js
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 ペイロード全体(displayNameXUIDidentity(UUID)など)。getUserData() の戻り値と同一です。
  • player.skinData — clientData ペイロード(スキン ID・ジオメトリ・テクスチャデータなど)。
js
player.on('login', ({ user }) => {
  console.log(user.displayName, user.XUID)
})

サーバーの停止

js
await server.close('シャットダウンします') // 全員に切断理由を通知して終了