Skip to content

クライアント接続 (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パケットのシーケンスをデバッグできます。

Released under the MIT License.