クライアント接続 (Dialer)
minecraft.Dialer 構造体を使用することで、外部の Minecraft: Bedrock Edition サーバー(BDS、PocketMine-MP、GeyserMC、Dragonfly 等)や Realms にクライアントとして接続できます。
基本的な接続方法
最も単純な接続は、認証を行わないローカルまたはホワイトリスト・認証無効サーバーへの接続です。
go
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/sandertv/gophertunnel/minecraft"
)
func main() {
// Dialer インスタンスを作成
dialer := minecraft.Dialer{}
// コンテキスト付きで接続(タイムアウト設定可能)
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
defer cancel()
conn, err := dialer.DialContext(ctx, "raknet", "192.168.11.10:19132")
if err != nil {
log.Fatalf("サーバー接続失敗: %v", err)
}
defer conn.Close()
fmt.Printf("接続完了!\n")
fmt.Printf("リモートアドレス: %s\n", conn.RemoteAddr())
fmt.Printf("プロトコルバージョン: %d\n", conn.Proto().ID())
}Dialer の主要フィールド
Dialer にはクライアントの振る舞いや認証、リソースパック取得を細かく制御するためのフィールドが用意されています。
go
type Dialer struct {
// エラーログの出力先 (*slog.Logger)
ErrorLog *slog.Logger
// Microsoft / Xbox Live 認証用の TokenSource (oauth2.TokenSource)
TokenSource oauth2.TokenSource
// クライアントの固有データ(スキン、端末情報、言語など)
ClientData login.ClientData
// プレイヤーの身元データ(プレイヤー名、UUID、XUID)
IdentityData login.IdentityData
// パケット送受信時の生データをフックするコールバック関数
PacketFunc func(header packet.Header, payload []byte, src, dst net.Addr)
// リソースパックのダウンロードを行うか否かを判定するフィルタ関数
DownloadResourcePack func(id uuid.UUID, version string, current, total int) bool
// ダウンロード済みリソースパックのキャッシュ保存
ResourcePackCache ResourcePackCache
// 未知のパケットを受信したときに切断するかどうか (デフォルト: false)
DisconnectOnUnknownPackets bool
// パケット長が不正な場合に切断するかどうか
DisconnectOnInvalidPackets bool
}プレイヤー名とスキンのカスタマイズ
認証を行わない場合、任意のプレイヤー名やUUID、スキンデータを指定してログインすることができます。
go
package main
import (
"log"
"github.com/google/uuid"
"github.com/sandertv/gophertunnel/minecraft"
"github.com/sandertv/gophertunnel/minecraft/protocol/login"
)
func main() {
dialer := minecraft.Dialer{
IdentityData: login.IdentityData{
DisplayName: "GopherBot",
Identity: uuid.New().String(),
},
}
conn, err := dialer.Dial("raknet", "127.0.0.1:19132")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
log.Printf("GopherBot としてサーバーに参加しました!")
}パケット送受信の監視 (PacketFunc)
接続が完全に確立する前(ログイン中)のパケットも含め、すべての生パケットを監視したい場合は PacketFunc を登録します。
go
dialer := minecraft.Dialer{
PacketFunc: func(header packet.Header, payload []byte, src, dst net.Addr) {
log.Printf("[RAW PACKET] ID: 0x%02x (%d bytes) %s -> %s",
header.PacketID, len(payload), src, dst)
},
}パケット解析での利点
PacketFunc は暗号化・復号後の生ペイロードが渡されるため、Wireshark 等で暗号化されたUDP通信を見るよりも手軽にBedrockパケットのシーケンスをデバッグできます。