Minecraft.Server/docs/DEVELOPMENT.ja.md
この文書は、Minecraft.Server に新しく入る開発者が、安全に機能追加や改修を行うための実践的な地図として使うことを想定しています
Minecraft.Server は、このコードベースにおける専用サーバー実行ファイルのエントリーポイントです
主な責務:
server.properties を読み込み、正規化し、不足や不正値を補完するlevel-id を整合させるbanned-players.json や banned-ips.json など運用向けファイルを維持するWindows64/ServerMain.cpp
PrintUsage() と ParseCommandLine()SetExeWorkingDirectory()WorldManager.hWorldManager.cpp
level-id 優先、その後 world 名フォールバックでセーブ探索ServerProperties.hServerProperties.cpp
server.properties の読込/補修/書込ServerPropertiesConfig の提供SaveServerPropertiesConfig() は level-name / level-id / white-list を書き換えるAccess/Access.hAccess/Access.cpp
Access/BanManager.hAccess/BanManager.cpp
banned-players.json と banned-ips.json の読込/書込Access/WhitelistManager.hAccess/WhitelistManager.cpp
whitelist.json の読込/書込ServerLogger.hServerLogger.cpp
startup, world-io, console, access, network, shutdown などのカテゴリServerLogManager.hServerLogManager.cpp
ban-ip <player> が使う remote IP キャッシュConsole/ServerCli.cpp (facade)Console/ServerCliInput.cpp (linenoise 入力スレッド + completion bridge)Console/ServerCliParser.cpp (トークン分解、クォート、補完コンテキスト)Console/ServerCliEngine.cpp (実行ディスパッチ、補完、共通ヘルパー)Console/ServerCliRegistry.cpp (登録と名前解決)Console/commands/* (各コマンド実装)Windows64/ServerMain.cpp の主な流れ:
SetExeWorkingDirectory() でカレントディレクトリを実行ファイルのフォルダへ切り替えるLoadServerPropertiesConfig() で server.properties を読み込み、正規化するDedicatedServerConfig へ反映したあと、CLI 引数で上書きする (-port, -ip/-bind, -name, -maxplayers, -seed, -loglevel, -help/--help/-h)ServerLogManager、Access::Initialize(".") を初期化するServerPropertiesConfig をゲームホスト設定へ反映するBootstrapWorldForServer(...) でワールドを決定するSaveServerPropertiesConfig() で書き戻すRunNetworkGameThreadProc でホストゲームスレッドを起動するTickCoreSystems()HandleXuiActions()serverCli.Poll()-port <1-65535>-ip <addr> または -bind <addr>-name <name> (実行時上限 16 文字)-maxplayers <1-8>-seed <int64>-loglevel <debug|info|warn|error>-help, --help, -h補足:
level-name と level-id だけで、ワールド解決時に識別情報が変わった場合に限られますhelp / ?stoplistban <player> [reason ...]
ban-ip <address|player> [reason ...]
pardon <player>pardon-ip <address>
banlisttp <player> <target> / teleportgamemode <survival|creative|0|1> [player] / gmCLI 挙動の補足:
cmd と /cmd の両方を受け付けますServerCliParser により引用符付き引数を扱えますComplete(...) で実装しますserver.propertiesbanned-players.jsonbanned-ips.jsonこれは SetExeWorkingDirectory() による挙動ですつまり、これらのファイルはシェル上の起動場所ではなく Minecraft.Server.exe 基準で解決されます
/kick や /time のようなコマンド追加時の基本手順:
Console/commands/ にファイルを追加
CliCommandYourCommand.hCliCommandYourCommand.cppIServerCliCommand を実装
Name(), Usage(), Description(), Execute(...)Aliases() と Complete(...)ServerCliEngine::RegisterDefaultCommands() に登録するCMakeLists.txt (MINECRAFT_SERVER_SOURCES)Minecraft.Server/Minecraft.Server.vcxproj (<ClCompile> / <ClInclude>)help に表示されるcmd と /cmd の両方で動く参考実装:
CliCommandHelp.cpp (単純コマンド)CliCommandTp.cpp (複数引数 + 補完 + 実行時チェック)CliCommandGamemode.cpp (引数解釈 + エイリアス)CliCommandBanIp.cpp (接続メタデータを使うアクセス制御系コマンド)server.properties キーを追加/変更するServerProperties.h の ServerPropertiesConfig にフィールドを追加/更新するServerProperties.cpp の kServerPropertyDefaults に既定値を追加するLoadServerPropertiesConfig() で読み込みと正規化を実装する
SaveServerPropertiesConfig() を更新する
ApplyServerPropertiesToDedicatedConfig(...)ServerMain.cpp の app.SetGameHostOption(...)PrintUsage() / ParseCommandLine()覚えておくと良い正規化ポイント
level-id は安全な save ID に正規化され、長さ制限も掛かるserver-name は実行時 16 文字までmax-players は 1..8 に clamp される(あとで増やす必要あり)autosave-interval は 5..3600 に clamp されるlevel-type は default または flat に正規化される主な実装は Access/Access.cpp, Access/BanManager.cpp, ServerLogManager.cpp にあります
変更時の注意:
BanManager は storage/caching に責務を寄せ、 live-network policy を持ち込みすぎないAccess.cpp の clone-and-publish スナップショット方式を保ち、読取側がディスク I/O で止まらないようにするban-ip <player> は ServerLogManager::TryGetConnectionRemoteIp(...) に依存することを忘れないSnapshotBannedPlayers() / SnapshotBannedIps() には期限切れエントリを混ぜないban, ban-ip, pardon, pardon-ip, banlist が動く主な実装は WorldManager.cpp にあります
現在の探索ポリシー:
level-id (UTF8SaveFilename) 完全一致を優先変更時の注意:
ApplyWorldStorageTarget(...) で title と save ID を常にセットで扱うtickProc を回し続ける
ServerMain.cpp から維持されているかServerLogger の API を利用:
LogDebug, LogInfo, LogWarn, LogErrorLogDebugf, LogInfof などtransport/login/disconnect ライフサイクルに属するイベントなら ServerLogManager 側を使います
推奨カテゴリ:
startup: 起動ライフサイクルshutdown: 停止ライフサイクルworld-io: ワールド/保存処理console: CLI コマンド処理access: BAN/アクセス制御状態network: 接続/ログイン監査リポジトリルートで実行:
cmake -S . -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Debug --target MinecraftServer
cd .\build\Debug
.\Minecraft.Server.exe -port 25565 -bind 0.0.0.0 -name DedicatedServer
補足:
server.properties, banned-players.json, banned-ips.json はそのため実行ファイル横に読み書きされますCOMPILE.md を参照してくださいserver.properties が欠損または疎でもクラッシュせず起動できるlevel-id でロードされるbanlist 出力が BAN 追加/解除後も破綻しないTickCoreSystems() など busy-wait 防止用ティックを消していない.vcxproj の両方に入っているRegisterDefaultCommands() とビルド定義を確認するserver.properties や BAN ファイルの読込先が想定と違う:
SetExeWorkingDirectory() により実行ファイルのフォルダへ移動していることを確認するTickCoreSystems() と HandleXuiActions() を回しているか確認するlevel-id の正規化と WorldManager.cpp の一致判定を確認するban-ip <player> で IP を解決できない:
ServerLogManager に接続 IP がキャッシュされているか確認するServerPropertiesConfig にロードされ、必要なら DedicatedServerConfig にコピーされ、その後 ServerMain.cpp で反映されているか確認する