public static bool IsDisplayingAchievementToast([NotNull] HearthstoneImage image) { if (image == null) { throw new ArgumentNullException(nameof(image)); } var manager = image.GetService("Hearthstone.Progression.AchievementManager"); //var debugState = manager["m_playerState"]; //debugState.TypeDefinition if (manager == null || manager["m_achievementToast"] == null) { return(false); } var toast = manager["m_achievementToast"]; if (toast != null) { //processing = true; //TypeDefinitionContentViewModel model = new TypeDefinitionContentViewModel(manager.TypeDefinition); //List<string> dump = new List<string>(); //var addresses = new List<uint>(); //model.DumpMemory("", dump, addresses, manager); return(true); } return(true); }
public static IRewardTrackInfo ReadRewardTrack([NotNull] HearthstoneImage image) { if (image == null) { throw new ArgumentNullException(nameof(image)); } var service = image.GetService("Hearthstone.Progression.RewardTrackManager"); if (service == null) { return(null); } var trackModel = service["<TrackDataModel>k__BackingField"]; if (trackModel == null) { return(null); } return(new RewardTrackInfo { Level = trackModel["m_Level"], Xp = trackModel["m_Xp"], XpNeeded = trackModel["m_XpNeeded"], XpBonusPercent = trackModel["m_XpBonusPercent"], }); }
public static IReadOnlyList <ICollectionCoin> ReadCollection([NotNull] HearthstoneImage image) { if (image == null) { throw new ArgumentNullException(nameof(image)); } var collectionCoins = new List <CollectionCoin>(); var netCache = image.GetService("NetCache"); if (netCache == null || netCache["m_netCache"] == null || netCache["m_netCache"]["valueSlots"] == null) { return(collectionCoins); } var coinDbf = image["GameDbf"]["Coin"]["m_records"]; var _size = coinDbf["_size"]; var _items = coinDbf["_items"]; var coinDic = new Dictionary <int, int>(); for (int i = 0; i < _size; i++) { var coin = _items[i]; coinDic.Add(coin["m_ID"], coin["m_cardId"]); } var netCacheValues = netCache["m_netCache"]["valueSlots"]; foreach (var value in netCacheValues) { if (value?.TypeDefinition?.Name == "NetCacheCoins") { var cardBacks = value["<Coins>k__BackingField"]; var slots = cardBacks["_slots"]; for (var i = 0; i < slots.Length; i++) { var coin = slots[i]; var coinId = coin["value"]; if (coinId != 0) { collectionCoins.Add(new CollectionCoin() { CoinId = coinDic[coinId], }); } } } } return(collectionCoins); }
public static IReadOnlyList <IXpChange> ReadXpChanges([NotNull] HearthstoneImage image) { if (image == null) { throw new ArgumentNullException(nameof(image)); } var result = new List <IXpChange>(); var service = image.GetService("Hearthstone.Progression.RewardXpNotificationManager"); if (service == null) { return(result); } dynamic xpChanges = null; try { xpChanges = service["m_xpChanges"]; if (xpChanges == null) { return(result); } } catch (Exception e) { return(result); } var size = xpChanges["_size"]; if (size == 0) { return(result); } for (var i = 0; i < size; i++) { var xpChange = xpChanges["_items"][i]; result.Add(new XpChange() { CurrentLevel = xpChange["_CurrLevel"], CurrentXp = xpChange["_CurrXp"], PreviousLevel = xpChange["_PrevLevel"], PreviousXp = xpChange["_PrevXp"], RewardSourceId = xpChange["_RewardSourceId"], RewardSourceType = xpChange["_RewardSourceType"], }); } return(result); }
public static IReadOnlyList <ICollectionCardBack> ReadCollection([NotNull] HearthstoneImage image) { //Logger.Log("Getting card backs"); if (image == null) { throw new ArgumentNullException(nameof(image)); } var collectionCardBacks = new List <CollectionCardBack>(); var netCache = image.GetService("NetCache"); if (netCache == null || netCache["m_netCache"] == null || netCache["m_netCache"]["valueSlots"] == null) { Logger.Log("Empty card backs"); return(collectionCardBacks); } var netCacheValues = netCache["m_netCache"]["valueSlots"]; foreach (var value in netCacheValues) { // Last time, was i == 12 if (value?.TypeDefinition?.Name == "NetCacheCardBacks") { var cardBacks = value["<CardBacks>k__BackingField"]; var slots = cardBacks["_slots"]; for (var i = 0; i < slots.Length; i++) { var cardBack = slots[i]; var cardBackId = cardBack["value"]; //Logger.Log("Card back id " + cardBackId); collectionCardBacks.Add(new CollectionCardBack() { CardBackId = cardBackId, }); } } } return(collectionCardBacks); }
public static IAchievementsInfo ReadInGameAchievementsProgressInfo([NotNull] HearthstoneImage image) { if (image == null) { throw new ArgumentNullException(nameof(image)); } var manager = image.GetService("Hearthstone.Progression.AchievementManager"); if (manager == null || manager["m_achievementInGameProgress"] == null) { return(null); } var progressInfo = manager["m_achievementInGameProgress"]; var count = progressInfo["count"]; var keys = progressInfo["keySlots"]; var values = progressInfo["valueSlots"]; var achievements = new List <IAchievementInfo>(); for (int i = 0; i < count; i++) { var achievementId = keys[i]; var progress = values[i]; var achievementInfo = new AchievementInfo() { AchievementId = achievementId, Progress = progress, }; achievements.Add(achievementInfo); } return(new AchievementsInfo() { Achievements = achievements, }); }
public static IArenaInfo ReadArenaInfo([NotNull] HearthstoneImage image) { if (image == null) { throw new ArgumentNullException(nameof(image)); } var draftManager = image.GetService("DraftManager"); if (draftManager == null) { return(null); } var heroCardId = draftManager["m_draftDeck"]?["HeroCardID"]; return(new ArenaInfo { Wins = draftManager["m_wins"] ?? -1, Losses = draftManager["m_losses"] ?? -1, HeroCardId = heroCardId, }); }
public static IAchievementsInfo ReadAchievementsInfo([NotNull] HearthstoneImage image) { if (image == null) { throw new ArgumentNullException(nameof(image)); } var manager = image.GetService("Hearthstone.Progression.AchievementManager"); if (manager == null || manager["m_playerState"] == null || manager["m_playerState"]["m_playerState"] == null) { return(null); } var playerState = manager["m_playerState"]["m_playerState"]; var count = playerState["count"]; var values = playerState["valueSlots"]; var achievements = new List <IAchievementInfo>(); for (int i = 0; i < count; i++) { var info = values[i]; var achievementInfo = new AchievementInfo() { AchievementId = info["_AchievementId"], Progress = info["_Progress"], Status = info["_Status"], }; achievements.Add(achievementInfo); } return(new AchievementsInfo() { Achievements = achievements, }); }
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); }
public static IBattlegroundsInfo ReadBattlegroundsInfo(HearthstoneImage image) { var battlegroundsInfo = new BattlegroundsInfo(); var playersList = new List <BattlegroundsPlayer>(); try { var leaderboardMgr = image["PlayerLeaderboardManager"]?["s_instance"]; var combatHistory = leaderboardMgr?["m_combatHistory"]; // Also m_incomingHistory var numberOfPlayerTiles = leaderboardMgr?["m_playerTiles"]?["_size"]; var playerTiles = leaderboardMgr?["m_playerTiles"]?["_items"]; for (int i = 0; i < numberOfPlayerTiles; i++) { var playerTile = playerTiles[i]; var playerIdTagIndex = -1; var numberOfTags = playerTile["m_entity"]?["m_tags"]?["m_values"]?["count"] ?? 0; var playerId = -1; for (int j = 0; j < numberOfTags; j++) { var tagId = playerTile["m_entity"]["m_tags"]["m_values"]["keySlots"][j]; if (tagId == 30) { playerId = playerTile["m_entity"]["m_tags"]["m_values"]["valueSlots"][j]; } } // Info not available until the player mouses over the tile in the leaderboard, and there is no other way to get it string playerName = playerTile["m_mainCardActor"]?["m_playerNameText"]?["m_Text"]; // Info not available until the player mouses over the tile in the leaderboard, and there is no other way to get it from memory //int triplesCount = playerTile["m_recentCombatsPanel"]?["m_triplesCount"] ?? -1; string playerCardId = playerTile?["m_entity"]?["m_cardIdInternal"]; int playerHealth = playerTile["m_entity"]?["m_realTimeHealth"] ?? -1; int playerDamage = playerTile["m_entity"]?["m_realTimeDamage"] ?? -1; int leaderboardPosition = playerTile["m_entity"]?["m_realTimePlayerLeaderboardPlace"] ?? -1; int linkedEntityId = playerTile["m_entity"]?["m_realTimeLinkedEntityId"] ?? -1; int techLevel = playerTile["m_entity"]?["m_realTimePlayerTechLevel"] ?? -1; //int winStreak = playerTile["m_recentCombatsPanel"]?["m_winStreakCount"] ?? -1; var playerCombatHistoryIndex = -1; for (var j = 0; j < combatHistory["count"]; j++) { if (combatHistory["keySlots"][j] == playerId) { playerCombatHistoryIndex = j; break; } } var currentWinStreak = 0; if (playerCombatHistoryIndex >= 0) { var playerCombatHistory = combatHistory["valueSlots"][playerCombatHistoryIndex]; var numberOfBattles = playerCombatHistory["_size"]; // Keep that for later to build hte full battle history //for (var j = 0; j < numberOfBattles; j++) //{ //} currentWinStreak = playerCombatHistory["_items"]?[numberOfBattles - 1]?["winStreak"]; } // m_raceCounts is dangerous: it gives the exact race count for the board, so more info than what is available in game var numberOfRaces = playerTile["m_raceCounts"]?["count"] ?? 0; var highestNumber = 0; int highestRace = 0; for (var j = 0; j < numberOfRaces; j++) { var race = playerTile["m_raceCounts"]["keySlots"][j]; var number = playerTile["m_raceCounts"]["valueSlots"][j]; if (number == highestNumber) { highestRace = 0; } else if (number > highestNumber) { highestNumber = number; highestRace = race; } } int boardCompositionRace = highestRace; // playerTile["m_recentCombatsPanel"]?["m_singleTribeWithCountName"]?["m_Text"]; int boardCompositionNumber = highestNumber; // int.Parse(playerTile["m_recentCombatsPanel"]?["m_singleTribeWithCountNumber"]?["m_Text"] ?? "-1"); //var recentCombatHistory = playerTile["m_recentCombatsPanel"]?["m_recentCombatEntries"]?["m_list"]; //var numberOfRecentCombatHistory = recentCombatHistory?["_size"] ?? 0; //for (var j = 0; j < numberOfRecentCombatHistory; j++) //{ // var combatEntry = recentCombatHistory["_items"]?[j]; // var opponentId = combatEntry["m_opponentId"]; // var ownerId = combatEntry["m_ownerId"]; // var damage = combatEntry["m_splatAmount"]; //} var player = new BattlegroundsPlayer { Id = playerId, EntityId = linkedEntityId, Name = playerName, CardId = playerCardId, MaxHealth = playerHealth, Damage = playerDamage, LeaderboardPosition = leaderboardPosition, BoardCompositionRace = boardCompositionRace, BoardCompositionCount = boardCompositionNumber, //TriplesCount = triplesCount, TechLevel = techLevel, WinStreak = currentWinStreak, }; playersList.Add(player); } } catch (Exception e) { Console.WriteLine("Could not get players list", e.Message); } var gameState = image["GameState"]?["s_instance"]; object[] races = gameState?["m_availableRacesInBattlegroundsExcludingAmalgam"]; battlegroundsInfo.Game = new BattlegroundsGame { Players = playersList, AvailableRaces = races?.Select(race => (int)race).ToList(), }; var netCacheValues = image.GetService("NetCache")?["m_netCache"]?["valueSlots"]; if (netCacheValues != null) { foreach (var netCache in netCacheValues) { if (netCache?.TypeDefinition.Name == "NetCacheBaconRatingInfo") { battlegroundsInfo.Rating = netCache["<Rating>k__BackingField"] ?? -1; } } } battlegroundsInfo.NewRating = ReadNewRating(gameState); return(battlegroundsInfo); }