Skip to content

クライアント

createClient(options)Client インスタンスを返し、サーバーへの接続を開始します。

最小のサンプル

js
const bedrock = require('bedrock-protocol')

const client = bedrock.createClient({
  host: '127.0.0.1',
  port: 19132,
  username: 'Notch',
  offline: true // Xbox Live 認証をスキップ
})

client.on('join', () => console.log('参加しました'))
client.on('spawn', () => console.log('ワールドに出現しました'))

// チャット(text パケット)を受信
client.on('text', packet => {
  console.log(`${packet.source_name}: ${packet.message}`)
})

オンラインモード(デフォルト)では、初回接続時に Microsoft アカウントでのサインインが求められます。onMsaCode を指定するとデバイスコード認証の URL / コードを受け取れます。

js
const client = bedrock.createClient({
  username: 'Notch',
  onMsaCode: data => {
    console.log(`ブラウザで ${data.verification_uri} を開き、コード ${data.user_code} を入力してください`)
  }
})

接続オプション

主要なオプションの一覧です。完全な一覧は クライアントオプション を参照してください。

オプション必須説明
host条件付き接続先ホスト。realms 指定時は不要
port省略可接続先ポート。デフォルト 19132
version省略可接続時に装うバージョン。未指定ならサーバーに自動一致
offline省略可true で Microsoft/Xbox 認証を無効化。デフォルト false
username必須接続時のプロファイル名。オフラインモードでは表示名になる
connectTimeout省略可接続試行のタイムアウト(ms)。デフォルト 9000
onMsaCode省略可デバイスコード認証開始時に呼ばれるコールバック
profilesFolder省略可認証トークンのキャッシュ先。デフォルトは .minecraft
skipPing省略可サーバーへの事前 ping(バージョン確認)をスキップ
followPort省略可ping 応答で告知されたポートに接続先を合わせる(realms 未指定時デフォルト true)
autoInitPlayer省略可spawn 後に SetPlayerInitialized を自動送信するか。デフォルト true
conLog省略可接続ログの出力先。null で無効化
compressionLevel省略可zlib 圧縮レベル。デフォルト 7
batchingInterval省略可送信キューのフラッシュ間隔(ms)。デフォルト 20
realms省略可Realm への接続に使用

イベントの発火順序

クライアントはライフサイクルに沿って次の順でイベントを発火します。

connect → (login) → join → spawn
イベント発火タイミング
connect_allowedサーバーへ ping し、バージョン情報を取得した後
statusログインシーケンスの状態が変化したとき
session認証と接続が完了したとき
join認証が完了し、ゲームパケットの受信準備ができたとき
spawnチャンク受信などが済み、ワールドに出現したとき
kickサーバーからキックされたとき
close接続が閉じたとき
error回復可能な例外。捕捉しない場合はスローされる
heartbeattick_sync(keepalive)が双方向で成功した後
packetすべての 受信パケットに対して発火

'packet' イベントで全部を見る

js
client.on('packet', ({ name, params }) => {
  console.log('受信:', name, params)
})

パケットダンプやプロトコル解析に便利です。

チャットの送信

text パケットでチャットを送れます。必須フィールドはすべて指定します。

js
client.queue('text', {
  type: 'chat',
  needs_translation: false,
  source_name: client.username,
  xuid: '',
  platform_chat_id: '',
  filtered_message: '',
  message: 'こんにちは!'
})

プレイヤーの参加を検知して挨拶する例:

js
client.on('add_player', packet => {
  client.queue('text', {
    type: 'chat',
    needs_translation: false,
    source_name: client.username,
    xuid: '',
    platform_chat_id: '',
    filtered_message: '',
    message: `ようこそ、${packet.username}!`
  })
})

コマンドの実行

command_request を送り、サーバーからの command_output をリクエスト時に生成した UUID で突き合わせて受け取ります。

js
const { randomUUID } = require('crypto')

const uuid = randomUUID()
client.on('command_output', packet => {
  if (packet.origin.uuid === uuid) console.log(packet.output)
})

client.queue('command_request', {
  command: '/list',
  origin: {
    type: 'player',
    uuid,
    request_id: '',
    player_entity_id: 0n // 1.26.x 以降では必須(下記参照)
  },
  internal: false,
  version: 'latest' // 1.26.x では文字列 'latest'(下記参照)
})

バージョン依存の注意点(1.26.x)

次の 2 フィールドはバージョン依存で、どちらかを誤ると 1.26.x では接続切断レベルの packet_violation_warning が発生します。警告文は実際の原因にかかわらず常に Command exceeds maximum size of 512 characters. という定型文なので、文字数制限の問題と誤解しないでください。

  • version: 1.21.x 以下は varint(数値)、1.21.130 以降は文字列。1.26.x では 'latest' を渡す('52' のような数値風文字列は拒否されます)
  • origin.player_entity_id: 1.21.x 以下では条件付き(省略可)、1.21.130 以降は無条件の li64(必須)。省略すると送信前のシリアライズ段階で例外が発生します

また、/say など一部のコマンドは 送信者自身には command_output が返らない ため、出力を待つ実装にしないでください。

切断

js
client.close()     // 接続を閉じてサーバーから退出
client.disconnect() // disconnect パケットを送ってから切断