| 948 | } |
| 949 | |
| 950 | bool GameEventHandler::CreateServer(ServerInitialization&& serverInit) |
| 951 | { |
| 952 | # if defined(DEATH_TARGET_EMSCRIPTEN) |
| 953 | // Creating a server is not supported on Emscripten |
| 954 | return false; |
| 955 | # else |
| 956 | _networkManager = std::make_unique<NetworkManager>(); |
| 957 | |
| 958 | if (serverInit.Configuration.ServerName.empty()) { |
| 959 | serverInit.Configuration.ServerName = _("Unnamed server"); |
| 960 | } |
| 961 | |
| 962 | if (serverInit.Configuration.PlaylistIndex >= 0 && serverInit.Configuration.PlaylistIndex < serverInit.Configuration.Playlist.size()) { |
| 963 | auto& playlistEntry = serverInit.Configuration.Playlist[serverInit.Configuration.PlaylistIndex]; |
| 964 | |
| 965 | auto level = playlistEntry.LevelName.partition('/'); |
| 966 | if (playlistEntry.LevelName.contains('/')) { |
| 967 | serverInit.InitialLevel.LevelName = playlistEntry.LevelName; |
| 968 | } else { |
| 969 | serverInit.InitialLevel.LevelName = "unknown/"_s + playlistEntry.LevelName; |
| 970 | } |
| 971 | |
| 972 | // Override properties |
| 973 | serverInit.Configuration.ReforgedGameplay = playlistEntry.ReforgedGameplay; |
| 974 | serverInit.Configuration.Elimination = playlistEntry.Elimination; |
| 975 | serverInit.Configuration.InitialPlayerHealth = playlistEntry.InitialPlayerHealth; |
| 976 | serverInit.Configuration.MaxGameTimeSecs = playlistEntry.MaxGameTimeSecs; |
| 977 | serverInit.Configuration.PreGameSecs = playlistEntry.PreGameSecs; |
| 978 | serverInit.Configuration.TotalKills = playlistEntry.TotalKills; |
| 979 | serverInit.Configuration.TotalLaps = playlistEntry.TotalLaps; |
| 980 | serverInit.Configuration.TotalTreasureCollected = playlistEntry.TotalTreasureCollected; |
| 981 | serverInit.Configuration.GameMode = playlistEntry.GameMode; |
| 982 | } |
| 983 | |
| 984 | if (serverInit.InitialLevel.LevelName.empty()) { |
| 985 | LOGE("Initial level is not specified"); |
| 986 | return false; |
| 987 | } else if (!ContentResolver::Get().LevelExists(serverInit.InitialLevel.LevelName)) { |
| 988 | LOGE("Cannot find initial level \"{}\"", serverInit.InitialLevel.LevelName); |
| 989 | return false; |
| 990 | } |
| 991 | |
| 992 | serverInit.InitialLevel.IsReforged = serverInit.Configuration.ReforgedGameplay; |
| 993 | |
| 994 | if (!_networkManager->CreateServer(this, std::move(serverInit.Configuration))) { |
| 995 | return false; |
| 996 | } |
| 997 | |
| 998 | auto& serverConfig = _networkManager->GetServerConfiguration(); |
| 999 | LOGI("[MP] Creating {} server \"{}\" on port {}...", serverConfig.IsPrivate ? "private"_s : "public"_s, serverConfig.ServerName, serverConfig.ServerPort); |
| 1000 | |
| 1001 | InvokeAsync([this, serverInit = std::move(serverInit)]() mutable { |
| 1002 | auto levelHandler = std::make_shared<MpLevelHandler>(this, |
| 1003 | _networkManager.get(), MpLevelHandler::LevelState::InitialUpdatePending, true); |
| 1004 | if (!levelHandler->Initialize(serverInit.InitialLevel)) { |
| 1005 | LOGE("[MP] Failed to load initial level \"{}\", shutting down server", serverInit.InitialLevel.LevelName); |
| 1006 | theApplication().Quit(); |
| 1007 | return; |
nothing calls this directly
no test coverage detected