Ejemplo n.º 1
0
        /// <summary>
        /// Удаляет матч из памяти. Уведомляет игроков и матчмейкер о конце матча.
        /// </summary>
        private void DeleteMatch(int matchId)
        {
            Match match = matchStorage.DequeueMatch(matchId);

            if (match == null)
            {
                log.Error($"Матч уже был удалён. {nameof(matchId)} {matchId}");
                return;
            }

            playersMatchFinishNotifier.Notify(match);
            match.TearDown();
            matchmakerNotifier.MarkMatchAsFinished(matchId);

            Task.Run(async() =>
            {
                //todo вынести это в новый класс
                //задержка нужна для того, чтобы последние udp сообщения дошли до игроков
                await Task.Delay(10_000);
                log.Info($"Удаление rudp сообщений для матча {nameof(matchId)} {matchId}.");
                byteArrayRudpStorage.RemoveMatchMessages(matchId);
                List <ushort> playersIds = ipAddressesStorage.GetActivePlayersIds(matchId);
                if (playersIds != null)
                {
                    foreach (ushort playerId in playersIds)
                    {
                        messageIdFactory.RemovePlayer(matchId, playerId);
                        messagesPackIdFactory.RemovePlayer(matchId, playerId);
                    }
                }
            });
        }
Ejemplo n.º 2
0
        public void Notify(Match match)
        {
            List <ushort> activePlayersIds = ipAddressesStorage.GetActivePlayersIds(match.matchId);

            if (activePlayersIds == null || activePlayersIds.Count == 0)
            {
                log.Info("Список активных игроков пуст. Некого уведомлять о окончании матча.");
            }
            else
            {
                log.Info(" Старт уведомления игроков про окончание матча");
                foreach (ushort playerId in activePlayersIds)
                {
                    log.Info($"Отправка уведомления о завершении боя игроку {nameof(playerId)} {playerId}");
                    udpSendUtils.SendShowAchievementsMessage(match.matchId, playerId);
                }
                log.Info(" Конец уведомления игроков про окончание матча");
            }
        }
        public void SendAll()
        {
            List <(int matchId, ushort playerId)> pairs = new List <(int matchId, ushort playerId)>();

            //получить пары matchId playerId из хранилища матчей
            foreach (Match match in matchStorage.GetAllMatches())
            {
                int           matchId = match.matchId;
                List <ushort> players = ipAddressesStorage.GetActivePlayersIds(matchId);
                if (players != null)
                {
                    foreach (ushort playersId in players)
                    {
                        pairs.Add((matchId, playersId));
                    }
                }
            }

            //запросить и отправить сообщения для всех пар
            foreach (var(matchId, playerId) in pairs)
            {
                //messageId, model
                byte[][] messagesForPlayer = byteArrayRudpStorage.GetMessages(matchId, playerId);
                if (messagesForPlayer != null)
                {
                    if (ipAddressesStorage.TryGetIpEndPoint(matchId, playerId, out IPEndPoint ipEndPoint))
                    {
                        foreach (byte[] data in messagesForPlayer)
                        {
                            udpSendUtils.SendReadyMadeMessage(matchId, playerId, data);
                        }
                    }
                    else
                    {
                        //такого быть не должно. ведь id игрока был получен из списка активных игроков
                        log.Error("ip игрока не найден, хотя он в списке активных игроков.");
                    }
                }
            }
        }