/// <summary> /// Возвращает id матча после успешной записи в БД /// </summary> public async Task <Match> WriteAsync(MatchRoutingData matchRoutingData, List <int> warshipIds) { using (ApplicationDbContext dbContext = dbContextFactory.Create()) { //Создать объекты для результатов боя игроков List <MatchResult> matchResults = new List <MatchResult>(); foreach (int warshipId in warshipIds) { MatchResult matchResult = new MatchResult { WarshipId = warshipId, IsFinished = false }; Console.WriteLine($"{nameof(matchResult.WarshipId)} {matchResult.WarshipId}"); matchResults.Add(matchResult); } //Создать матч Match match = new Match { StartTime = DateTime.UtcNow, GameServerIp = matchRoutingData.GameServerIp, GameServerUdpPort = matchRoutingData.GameServerPort, MatchResults = matchResults, GameModeId = GameModeEnum.BattleRoyale }; await dbContext.Matches.AddAsync(match); await dbContext.SaveChangesAsync(); return(match); } }
public async Task <bool> TryCreateMatch(int numberOfPlayersInMatch, bool botsCanBeUsed) { GameUnits gameUnits = new GameUnits(); List <MatchEntryRequest> requests = battleRoyaleQueueSingletonService .TakeMatchEntryRequests(numberOfPlayersInMatch); //Достать игроков из очереди без извлечения gameUnits.Players = requests .Select(request => request.GetPlayerModel()) .ToList(); //Если нужно дополнить ботами if (0 < gameUnits.Players.Count && gameUnits.Players.Count < numberOfPlayersInMatch) { //и можно дополнить ботами if (botsCanBeUsed) { //дополнить int numberOfBots = numberOfPlayersInMatch - gameUnits.Players.Count; gameUnits.Bots = battleRoyaleBotFactoryService.CreateBotModels(numberOfBots); } } //Достаточно игроков? if (gameUnits.Players.Count + gameUnits.Bots?.Count != numberOfPlayersInMatch) { return(false); } // Присвоить временные id игрокам на один бой List <ushort> playerTmpIds = PlayerTemporaryIdsFactory.Create(gameUnits.Players.Count); for (int i = 0; i < gameUnits.Players.Count; i++) { PlayerModel playerModel = gameUnits.Players[i]; playerModel.TemporaryId = playerTmpIds[i]; } //На каком сервере будет запускаться матч? MatchRoutingData matchRoutingData = matchRoutingDataService.GetMatchRoutingData(); //Сделать запись об матче в БД Match match = await matchDbWriterService .WriteAsync(matchRoutingData, requests.Select(request => request.GetWarshipId()).ToList()); //Создать объект с информацией про бой BattleRoyaleMatchModel matchModel = BattleRoyaleMatchDataFactory.Create(gameUnits, match); //Добавить игроков в таблицу тех кто в бою unfinishedMatchesService.AddPlayersToMatch(matchModel); //Извлечь игроков из очереди battleRoyaleQueue.RemovePlayersFromQueue(matchModel.GameUnits.Players); //Сообщить на гейм сервер await gameServerNegotiatorService.SendRoomDataToGameServerAsync(matchModel); return(true); }