public virtual bool StartGame() { if (IsDestroyed) { return(false); } string region = ""; propertiesList.Set(MstDictKeys.ROOM_IS_PUBLIC, false); // Extract the region if available if (propertiesList.Has(MstDictKeys.ROOM_REGION)) { region = propertiesList.AsString(MstDictKeys.ROOM_REGION); } var task = Module.SpawnersModule.Spawn(propertiesList, region, GenerateOptions()); if (task == null) { BroadcastChatMessage("Servers are busy", true); return(false); } State = LobbyState.StartingGameServer; SetGameSpawnTask(task); return(true); }
/// <summary> /// Start process on spawner side with given spawn <paramref name="options"/>, <paramref name="region"/> and <paramref name="customOptions"/> /// </summary> /// <param name="options"></param> /// <param name="region"></param> /// <param name="customOptions"></param> /// <returns></returns> public virtual SpawnTask Spawn(MstProperties options, string region, MstProperties customOptions) { // Get registered spawner by options and region var spawners = GetFilteredSpawners(options, region); if (spawners.Count == 0) { logger.Warn($"No spawner was returned after filtering. Region: {options.AsString(MstDictKeys.ROOM_REGION, "International")}"); return(null); } // Order from least busy server var orderedSpawners = spawners.OrderByDescending(s => s.CalculateFreeSlotsCount()); var availableSpawner = orderedSpawners.FirstOrDefault(s => s.CanSpawnAnotherProcess()); // Ignore, if all of the spawners are busy if (availableSpawner == null) { return(null); } return(Spawn(options, customOptions, availableSpawner)); }