Skip to content

サーバー待受 (ListenConfig)

minecraft.ListenConfig を使用することで、正規の Minecraft: Bedrock Edition クライアント(iOS、Android、Windows、Switch、PS等)からの接続を受け付けるサーバー(リスナー)を構築できます。


最小限のサーバー待受

go
package main

import (
	"fmt"
	"log"

	"github.com/sandertv/gophertunnel/minecraft"
)

func main() {
	lc := minecraft.ListenConfig{
		// サーバー一覧画面・LAN探索に表示されるMOTDを設定
		StatusProvider: minecraft.NewStatusProvider("Gopher Bedrock Server", "ようこそ!"),
		// 認証をオフにしてローカル接続を許可する場合
		AuthenticationDisabled: true,
	}

	listener, err := lc.Listen("raknet", "0.0.0.0:19132")
	if err != nil {
		log.Fatalf("ポート待受に失敗: %v", err)
	}
	defer listener.Close()

	fmt.Println("サーバーが起動しました: 0.0.0.0:19132")

	for {
		// クライアント接続を待ち受ける
		conn, err := listener.Accept()
		if err != nil {
			log.Printf("Accept エラー: %v", err)
			continue
		}

		go handleClient(conn.(*minecraft.Conn))
	}
}

func handleClient(conn *minecraft.Conn) {
	defer conn.Close()

	// ゲーム開始情報(StartGameパケット)を送信してワールドにスポーンさせる
	// ここで指定した設定がクライアント側のワールド環境になります
	err := conn.StartGame(minecraft.GameData{
		WorldName:       "Gopher World",
		PlayerGameMode:  1, // 0: Survival, 1: Creative, 2: Adventure
		PlayerPosition:  [3]float32{0, 100, 0},
	})
	if err != nil {
		log.Printf("StartGame失敗: %v", err)
		return
	}

	identity := conn.IdentityData()
	log.Printf("プレイヤーがログインしました: %s (XUID: %s)", identity.DisplayName, identity.XUID)

	// パケット受信ループ
	for {
		pk, err := conn.ReadPacket()
		if err != nil {
			log.Printf("クライアント切断: %v", err)
			break
		}
		_ = pk
	}
}

ListenConfig の設定項目

go
type ListenConfig struct {
    // エラーログ出力先
    ErrorLog *slog.Logger

    // Xbox Live 認証を無効化するか (デフォルト: false = 認証必須)
    AuthenticationDisabled bool

    // パケット暗号化を無効化するか (信頼できるLAN内等のみ推奨)
    DisablePacketEncryption bool

    // サーバーの最大参加人数 (0の場合は動的上限)
    MaximumPlayers int

    // サーバー情報 (MOTD / ポン応答) のプロバイダ
    StatusProvider ServerStatusProvider

    // パケット圧縮方式 (Snappy / Flate)
    Compression packet.Compression

    // 圧縮を発動するデータサイズのしきい値 (デフォルト: 256バイト, -1で無効)
    CompressionThreshold int

    // クライアントに配信・強制するリソースパックのリスト
    ResourcePacks []*resource.Pack
    TexturePacksRequired bool
}

MOTD と サーバー情報の動的更新

StatusProvider を差し替える、またはデフォルトの ListenerStatusProvider を操作することで、プレイヤー数やMOTDを動的に更新できます。

go
provider := minecraft.NewStatusProvider("マイクラサーバー", "サバイバル生活")
lc := minecraft.ListenConfig{
    StatusProvider: provider,
}

// 稼働中に動的に書き換える
provider.ServerName = "メンテナンス中"
provider.PlayerCount = 10
provider.MaxPlayers = 50

Released under the MIT License.