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