Пример #1
0
        private static int GetRankValue(HearthstoneImage image, dynamic medalInfo)
        {
            var leagueId         = medalInfo["leagueId"];
            var starLevel        = medalInfo["starLevel"];
            var leagueRankRecord = MatchInfoReader.GetLeagueRankRecord(image, leagueId, starLevel);

            if (leagueRankRecord == null)
            {
                return(0);
            }

            var locValues = leagueRankRecord["m_medalText"]["m_locValues"]["_items"];

            foreach (var value in locValues)
            {
                if (value == null)
                {
                    continue;
                }

                if (int.TryParse(value, out int rank))
                {
                    return(rank);
                }
            }

            return(0);
        }
Пример #2
0
        public static IMatchInfo ReadMatchInfo(HearthstoneImage image)
        {
            var matchInfo = new MatchInfo();
            var gameState = image["GameState"]["s_instance"];

            image.GetService("NetCache");
            var netCacheValues = image.GetService("NetCache")?["m_netCache"]?["valueSlots"];

            if (gameState != null)
            {
                var playerIds = gameState["m_playerMap"]["keySlots"];
                var players   = gameState["m_playerMap"]["valueSlots"];
                for (var i = 0; i < playerIds.Length; i++)
                {
                    if (players[i]?.TypeDefinition.Name != "Player")
                    {
                        continue;
                    }

                    var medalInfo         = players[i]["m_medalInfo"];
                    var standardMedalInfo = medalInfo?["m_currMedalInfo"];
                    var wildMedalInfo     = medalInfo?["m_currWildMedalInfo"];
                    var playerName        = players[i]["m_name"];
                    var standardRank      = standardMedalInfo != null?MatchInfoReader.GetRankValue(image, standardMedalInfo) : 0;

                    var standardLegendRank = standardMedalInfo?["legendIndex"] ?? 0;
                    var wildRank           = wildMedalInfo != null?MatchInfoReader.GetRankValue(image, wildMedalInfo) : 0;

                    var wildLegendRank = wildMedalInfo?["legendIndex"] ?? 0;
                    var cardBack       = players[i]["m_cardBackId"];
                    var playerId       = playerIds[i];
                    var side           = (Side)players[i]["m_side"];
                    var accountId      = players[i]["m_gameAccountId"];
                    var account        = new Account {
                        Hi = accountId?["m_hi"] ?? 0, Lo = accountId?["m_lo"] ?? 0
                    };
                    var battleTag = MatchInfoReader.GetBattleTag(image, account);

                    switch (side)
                    {
                    case Side.FRIENDLY:
                        {
                            dynamic netCacheMedalInfo = null;
                            if (netCacheValues != null)
                            {
                                foreach (var netCache in netCacheValues)
                                {
                                    if (netCache?.TypeDefinition.Name != "NetCacheMedalInfo")
                                    {
                                        continue;
                                    }

                                    netCacheMedalInfo = netCache;
                                    break;
                                }
                            }

                            var standardStars = netCacheMedalInfo?["<Standard>k__BackingField"]["<Stars>k__BackingField"];
                            var wildStars     = netCacheMedalInfo?["<Wild>k__BackingField"]["<Stars>k__BackingField"];
                            matchInfo.LocalPlayer = new Player
                            {
                                Id                 = playerId,
                                Name               = playerName,
                                StandardRank       = standardRank,
                                StandardLegendRank = standardLegendRank,
                                StandardStars      = standardStars,
                                WildRank           = wildRank,
                                WildLegendRank     = wildLegendRank,
                                WildStars          = wildStars,
                                CardBackId         = cardBack,
                                Account            = account,
                                BattleTag          = battleTag,
                            };

                            break;
                        }

                    case Side.OPPOSING:
                        matchInfo.OpposingPlayer = new Player
                        {
                            Id                 = playerId,
                            Name               = playerName,
                            StandardRank       = standardRank,
                            StandardLegendRank = standardLegendRank,
                            StandardStars      = 0,
                            WildRank           = wildRank,
                            WildLegendRank     = wildLegendRank,
                            WildStars          = 0,
                            CardBackId         = cardBack,
                            Account            = account,
                            BattleTag          = battleTag,
                        };

                        break;

                    case Side.NEUTRAL:
                        break;

                    default:
                        throw new InvalidOperationException($"Unknown side {side}.");
                    }
                }
            }

            if ((matchInfo.LocalPlayer == null) || (matchInfo.OpposingPlayer == null))
            {
                return(null);
            }

            var gameMgr = image.GetService("GameMgr");

            if (gameMgr != null)
            {
                matchInfo.MissionId  = gameMgr["m_missionId"];
                matchInfo.GameType   = gameMgr["m_gameType"];
                matchInfo.FormatType = gameMgr["m_formatType"];
            }

            if (netCacheValues != null)
            {
                foreach (var netCache in netCacheValues)
                {
                    if (netCache?.TypeDefinition.Name != "NetCacheRewardProgress")
                    {
                        continue;
                    }

                    matchInfo.RankedSeasonId = netCache["<Season>k__BackingField"];
                    break;
                }
            }

            return(matchInfo);
        }