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); }
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); }