アーキテクチャ概要
gophertunnel がどのように Bedrock Edition のネットワーク通信・パケット処理を抽象化しているかを理解すると、クライアント・サーバー・プロキシの実装が非常にスムーズになります。
全体レイヤー構造
Minecraft Bedrock Edition の通信スタックと、gophertunnel の各モジュールの対応関係は下図のようになっています。
minecraft.Conn の役割
minecraft.Conn は net.Conn を実装した接続オブジェクトですが、バイトストリームではなくMinecraft パケット単位でのやり取りを前提として設計されています。
- パケットハンドシェイクの自動処理:
Dialer.DialやListener.Acceptを呼んだ時点で、ログインリクエスト、暗号化ハンドシェイク、リソースパックのダウンロード/合意、StartGameパケットの処理までが自動的に完了しています。
- パケットのシリアライズ & デシリアライズ:
ReadPacket()を呼ぶだけで、生のUDPパケットから復号・解凍され、対応するpacket.Packet型にパースされた構造体が返されます。WritePacket(pk)を呼ぶと、バッファリングされ、適切なタイミングで圧縮・暗号化されて送信されます。
- ゲームコンテキストの保持:
conn.GameData()によって、スポーン位置やエンティティランタイムID(RuntimeID)、ワールド名などをいつでも参照できます。
パケット処理のライフサイクル
gophertunnel の Dialer は上記の複雑なシーケンスをすべて内部で自動実行し、成功した段階で呼び出し元に *minecraft.Conn を渡却します。 そのため、ユーザーはゲーム内ロジックやパケットの解析だけに集中できます。