public static void Info(ServerCommon.GameResult result, int win_medal, int lose_medal, int draw_medal, int mvp_medal, int rankup_medal)
        {
            using (var context = new Lobby.Models.LogContext(0))
            {
                try
                {
                    context.match_log.Add(new Lobby.Models.MatchLog()
                    {
                        match_id     = result.match_id,
                        map_id       = result.statistics.map_id,
                        leave_player = result.statistics.leave_player,
                        result       = result.is_draw?1:0,
                        clear        = result.statistics.clear,

                        fall_death     = result.statistics.fall_death,
                        attacked_death = result.statistics.attacked_death,
                        train_death    = result.statistics.train_death,
                        other_death    = result.statistics.other_death,

                        normal_item = result.statistics.normal_item,
                        tactic_item = result.statistics.tactic_item,

                        play_time = result.statistics.play_time,

                        win_medal    = win_medal,
                        lose_medal   = lose_medal,
                        draw_medal   = draw_medal,
                        mvp_medal    = mvp_medal,
                        rankup_medal = rankup_medal,

                        submit_time = DateTime.UtcNow,
                    });

                    context.SaveChangesAsync().ConfigureAwait(false);
                }
                catch (Exception e)
                {
                    Log.Error($"{e.ToString()}");
                }
            }
        }
        /// <summary>
        /// 매칭 조건이 맞지 않아 대기
        /// </summary>
        /// <param name="session"></param>
        /// <param name="request"></param>
        /// <param name="responseStream"></param>
        /// <returns></returns>
        public static async Task WaitGameResult(string channel_id)
        {
            string key = $"game_result:{channel_id}";

            Log.Information($"WaitGameResult {key}");
            var queue = Cache.Instance.GetSubscriber().Subscribe(key);

            var cts = new CancellationTokenSource();

            cts.CancelAfter((int)game_result_expire.TotalMilliseconds);
            try
            {
                var ret = await queue.ReadAsync(cts.Token);

                ServerCommon.GameResult reply = JsonConvert.DeserializeObject <ServerCommon.GameResult>(ret.Message);

                Log.Information($"game result {ret.Message.ToString()}");
            }
            catch (OperationCanceledException ex)
            {
                Log.Information($"game result timeout {ex.ToString()}");
            }
        }
Exemple #3
0
        /// <summary>
        /// 게임 결과 기다림
        /// </summary>
        /// <param name="session"></param>
        /// <param name="request"></param>
        /// <param name="responseStream"></param>
        /// <returns></returns>
        public static async Task WaitGameResult(Session session, string channel_id, JMapData map_data, JGameModeData game_mode)
        {
            string key = $"game_result:{channel_id}";

            Log.Information($"WaitGameResult {key}");

            Interlocked.Increment(ref RankMatchmaking.MatchCount);

            var queue = Cache.Instance.GetSubscriber().Subscribe(key);

            var cts = new CancellationTokenSource();

            cts.CancelAfter((int)game_result_expire.TotalMilliseconds);
            try
            {
                var ret = await queue.ReadAsync(cts.Token);

                Interlocked.Decrement(ref RankMatchmaking.MatchCount);

                ServerCommon.GameResult reply = JsonConvert.DeserializeObject <ServerCommon.GameResult>(ret.Message);

                Log.Information($"game result {ret.Message.ToString()}");

                int total_win_medal    = 0;
                int total_lose_medal   = 0;
                int total_draw_medal   = 0;
                int total_mvp_medal    = 0;
                int total_rankup_medal = 0;
                await Match.RemoveMatch(reply.match_id);

                var characterNames  = new List <string>();
                var characterLevels = new List <int>();


                foreach (var player in reply.player_result)
                {
                    if (player.Value.IsLeave)
                    {
                        continue;
                    }

                    var last_session = await Session.GetSession(player.Key, false);

                    if (last_session != null)
                    {
                        bool is_changed_character_rank_level = false;
                        await using (var mylock = await RedLock.CreateLockAsync($"lock:session:{last_session.session_id}"))
                        {
                            await using (var user = await UserCache.GetUser(last_session.member_no, last_session.user_no, true, true, true))
                                await using (var character = await CharacterCache.Instance.GetEntity(last_session.member_no, last_session.character_no, true, true, true))
                                {
                                    user.play_point += player.Value.play_point;
                                    var last_account_battle_score = user.battle_score;
                                    UserGrowth.IncreaseBattleScore(user, player.Value.battle_point);
                                    var last_battle_score = character.battle_score;
                                    var last_rank_level   = character.rank_level;
                                    CharacterGrowth.IncreaseBattleScore(character, player.Value.battle_point);

                                    var(abs, cbs, wc) = await Ranking.Update(last_session, reply.season_no, player.Value.battle_point, player.Value.IsWin);

                                    bool is_character_rank_level_up = false;
                                    if (last_rank_level != character.rank_level)
                                    {
                                        if (last_rank_level < character.rank_level)
                                        {
                                            is_character_rank_level_up = true;
                                        }
                                    }

                                    if (last_battle_score != character.battle_score)
                                    {
                                        var rankData = ACDC.RankData.GetRank(character.battle_score);
                                        if (rankData != null)
                                        {
                                            if (last_session.rank != rankData.Rank)
                                            {
                                                is_changed_character_rank_level = true;
                                                last_session.rank = rankData.Rank;
                                            }
                                        }
                                    }

                                    var last_medal  = user.medal;
                                    var medal_count = Medal.CalcMedal(user, last_session, reply.is_draw, player.Value, is_character_rank_level_up, game_mode, ref total_win_medal, ref total_lose_medal, ref total_draw_medal, ref total_mvp_medal, ref total_rankup_medal);
                                    await Inventory.Insert(last_session, user, character, (int)GameItemId.Medal, medal_count, null);


                                    // 배틀에서 넘어온 미션 데이터가 없는 경우 초기화
                                    if (player.Value.missions == null)
                                    {
                                        player.Value.missions = new Dictionary <int, int>();
                                    }
                                    player.Value.missions.Increment((int)MissionType.Mission_GetMedal, medal_count);

                                    await MissionManager.Progress(last_session, player.Value.missions);

                                    History.Info(last_session.member_no, last_session.user_no, last_session.character_no, HistoryLogAction.GainAccountBattleScore, (byte)HistoryLogReason.GameResultReward, (int)user.battle_score, (int)last_account_battle_score, reply.match_id.ToString(), "");
                                    History.Info(last_session.member_no, last_session.user_no, last_session.character_no, HistoryLogAction.GainCharacterBattleScore, (byte)HistoryLogReason.GameResultReward, (int)character.battle_score, (int)last_battle_score, reply.match_id.ToString(), "");

                                    characterNames.Add(last_session.user_name);
                                    characterLevels.Add(character.rank_level);
                                }
                        }

                        //Log.Information($"session:{last_session.session_id}, rank:{last_session.rank}");
                        if (is_changed_character_rank_level)
                        {
                            await Session.UpdateSessionLock(last_session.session_id, delegate(Session s) { s.rank = last_session.rank; });
                        }


                        // 게임 종료 이후 매칭 정보 삭제
                        await MatchUser.RemoveMatchUser(last_session.user_no);
                    }
                    else
                    {
                        Log.Warning($"game result lost session:{player.Key}, msg:{ret.Message}");
                    }
                }

                MatchLog.Info(reply, total_win_medal, total_lose_medal, total_draw_medal, total_mvp_medal, total_rankup_medal);

                string resultTp;
                if (reply.is_draw)
                {
                    resultTp = "26";
                    _        = LogProxy.writeActionLog(session, "플레이", "무승부", map_data.ID.ToString()).ConfigureAwait(false);
                }
                else if (reply.statistics.clear == 1)
                {
                    resultTp = "21";
                    _        = LogProxy.writeActionLog(session, "플레이", "클리어", map_data.ID.ToString()).ConfigureAwait(false);
                }
                else
                {
                    resultTp = "22";
                }

                _ = LogProxy.writeRoundLog(session, game_mode.Name, "", "", resultTp, 0, reply.statistics.start_time, reply.statistics.end_time, characterNames, characterLevels, "").ConfigureAwait(false);


                if (reply.statistics.leave_player > 0)
                {
                    _ = LogProxy.writeActionLog(session, "플레이", "이탈", map_data.ID.ToString(), reply.statistics.leave_player.ToString()).ConfigureAwait(false);
                }

                if (reply.statistics.normal_item > 0)
                {
                    _ = LogProxy.writeActionLog(session, "플레이", "일반아이템획득", map_data.ID.ToString(), reply.statistics.normal_item.ToString()).ConfigureAwait(false);
                }

                if (reply.statistics.tactic_item > 0)
                {
                    _ = LogProxy.writeActionLog(session, "플레이", "전략아이템획득", map_data.ID.ToString(), reply.statistics.tactic_item.ToString()).ConfigureAwait(false);
                }
            }
            catch (OperationCanceledException ex)
            {
                Log.Information($"game result timeout {ex.ToString()}");
            }
        }
Exemple #4
0
        protected override void EndGameServerside(Team winTeam, bool isDraw, long matchId, CloseType closeType)
        {
            try
            {
                ServerCommon.GameResult gameResult = new ServerCommon.GameResult();
                gameResult.player_result = new Dictionary <string, ServerCommon.PlayerResult>();

                gameResult.win_team                = (int)winTeam;
                gameResult.is_draw                 = isDraw;
                gameResult.match_id                = matchId;
                gameResult.statistics              = statistics;
                gameResult.statistics.map_id       = mMapData.ID;
                gameResult.statistics.leave_player = GetEntries().Where(x => x.Leave).Count();
                gameResult.statistics.clear        = closeType == CloseType.Clear ? 1 : 0;
                gameResult.statistics.play_time    = (int)(Timing.sInstance.GetFrameStartTime() - StartTime);
                gameResult.statistics.start_time   = StartEpochTime;
                gameResult.statistics.end_time     = DateTime.UtcNow.ToEpochTime();

                foreach (var player in GetEntries())
                {
                    var playerResult = new ServerCommon.PlayerResult();
                    playerResult.play_point = player.GetScore();
                    if (isDraw)
                    {
                        playerResult.battle_point = mGameModeData.RewardBattleScoreDraw;
                    }
                    else if (player.GetTeam() == winTeam)
                    {
                        playerResult.IsWin        = true;
                        playerResult.battle_point = mGameModeData.RewardBattleScoreWin;
                        player.Missions.Increment((int)MissionType.Mission_Victory, 1);
                    }
                    else
                    {
                        playerResult.IsLose       = true;
                        playerResult.battle_point = mGameModeData.RewardBattleScoreLose;
                    }

                    if (player.GetPlayerId() == MVPPlayerId)
                    {
                        playerResult.IsMvp         = true;
                        playerResult.battle_point += mGameModeData.RewardBattleScoreMvp;
                    }

                    if (player.Pause)
                    {
                        playerResult.battle_point = mGameModeData.AbuseBattleScore;
                    }
                    else
                    {
                        // 어뷰징이 아닌 유저만 나감 처리
                        playerResult.IsLeave = player.Leave;
                    }

                    playerResult.missions = player.Missions;

                    gameResult.player_result.Add(player.GetSessionId(), playerResult);
                }

                if (channel_id != "")
                {
#if UNITY_EDITOR || UNITY_STANDALONE_WIN || UNITY_IOS || UNITY_ANDROID
#else
                    string key = $"game_result:{channel_id}";
                    Cache.sInstance.cache.GetSubscriber().PublishAsync(key, JsonConvert.SerializeObject(gameResult)).ConfigureAwait(false);
                    Log.Information($"PubGameRessult {key}");
#endif
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex.ToString());
            }
        }