示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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,
            });
        }
示例#7
0
        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,
            });
        }
示例#8
0
        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,
            });
        }
示例#9
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);
        }
        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);
        }