Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
        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);
        }