サーバー待受 (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