/// <inheritdoc/>>
        public bool IsGameInLoadingScreen()
        {
            int  loadingScreenFlagAddress   = _addressFinder.GetLoadingScreenFlagAddress();
            int  isInLoadingScreenFlagValue = _processFunctionsService.ReadMemoryInt(_processHandle, loadingScreenFlagAddress);
            bool isLoadingScreen            = (isInLoadingScreenFlagValue & 1) == 1;

            return(isLoadingScreen);
        }
        private async Task WaitUntilSaveGameLoaded(Process gameProcess, IAddressFinder addressFinder)
        {
            int saveGameLoadedFlagAddress = addressFinder.GetSaveGameLoadedFlagAddress();

            while (true)
            {
                int  saveGameLoadedFlag = _processFunctionsService.ReadMemoryInt(gameProcess.Handle, saveGameLoadedFlagAddress);
                bool isSaveGameLoaded   = (saveGameLoadedFlag & 1) == 1;
                if (isSaveGameLoaded)
                {
                    break;
                }

                await Task.Delay(1000).ConfigureAwait(false);
            }
        }
示例#3
0
        /// <summary>
        /// Since the addresses of values in memory are usually not constant we need to retrieve them
        /// every time based on pointers. This allows us to quickly follow multiple pointers
        /// in order to find a specific address
        /// </summary>
        /// <param name="basePointerAddress">Constant address of the first pointer</param>
        /// <param name="offsets">Offsets for each pointer</param>
        /// <returns>Address retrieved by following the pointers</returns>
        private int GetAddressFromOffsets(int basePointerAddress, int[] offsets)
        {
            int address = basePointerAddress;

            foreach (int offset in offsets)
            {
                address = _processFunctionsService.ReadMemoryInt(_processHandle, address) + offset;
            }

            return(address);
        }