/// <summary> /// /// </summary> internal void UpdatePointers() { PointerEventActionType.UpdatePointers(); PointerIsMotionPlay.UpdatePointers(); PointerEventActionTask.UpdatePointers(); PointerPlayerStatus.UpdatePointers(); PointerPlayerHP.UpdatePointers(); PointerPlayerPosition.UpdatePointers(); PointerRankManager.UpdatePointers(); PointerInventory.UpdatePointers(); try { PointerEnemyCount.UpdatePointers(); PointerEnemyEntryList.UpdatePointers(); GenerateEnemyEntries(); PointerInventoryCount.UpdatePointers(); PointerInventoryEntryList.UpdatePointers(); GenerateItemEntries(); } catch { // May fail in main menu } }
/// <summary> /// /// </summary> internal void UpdatePointers() { if (Process.GetProcessesByName("re7").FirstOrDefault() == null) { return; } if (!connected) { Initialize(Process.GetProcessesByName("re7").FirstOrDefault().Id); return; } else { PointerMrEverythingCount.UpdatePointers(); PointerDA.UpdatePointers(); PointerMapName.UpdatePointers(); PointerHP.UpdatePointers(); PointerBagCount.UpdatePointers(); PointerInventoryCount.UpdatePointers(); PointerInventorySlotSelected.UpdatePointers(); PointerEnemyEntryCount.UpdatePointers(); GenerateEnemyEntries(); // This has to be here for the next part. for (int i = 0; i < PointerEnemyEntries.Length; ++i) { PointerEnemyEntries[i].UpdatePointers(); } } }
private unsafe void GenerateItemEntries() { bool success; fixed(int *p = &InventoryTableCount) success = PointerInventoryCount.TryDerefInt(0x1C, p); PointerInventoryEntries = new MultilevelPointer[MAX_ITEMS]; PointerInventoryEntriesCustom = new MultilevelPointer[MAX_ITEMS]; // Skip the first 28 bytes and read the rest as a byte array // This can be done because the pointers are stored sequentially in an array byte[] inventoryEntriesPtrByteArr = PointerInventoryEntryList.DerefByteArray(0x20, MAX_ITEMS * sizeof(IntPtr)); // Do a block copy to convert the byte array to an IntPtr array IntPtr[] inventoryEntriesPtrArr = new IntPtr[MAX_ITEMS]; Buffer.BlockCopy(inventoryEntriesPtrByteArr, 0, inventoryEntriesPtrArr, 0, inventoryEntriesPtrByteArr.Length); for (int i = 0; i < PointerInventoryEntries.Length; ++i) { PointerInventoryEntries[i] = new MultilevelPointer(memoryAccess, IntPtr.Add(inventoryEntriesPtrArr[i], 0x58)); PointerInventoryEntriesCustom[i] = new MultilevelPointer(memoryAccess, IntPtr.Add(inventoryEntriesPtrArr[i], 0x58), 0x90); } }
internal IGameMemoryRE7 Refresh() { if (PointerMapName.BaseAddress != IntPtr.Zero) { var bytes = PointerMapName.DerefByteArray(0x0, 48); gameMemoryValues.MapName = System.Text.Encoding.Unicode.GetString(bytes); } else { gameMemoryValues.MapName = "Menu"; } gameMemoryValues.MrEverything = PointerMrEverythingCount.DerefInt(0x28); gameMemoryValues.CurrentDA = PointerDA.DerefFloat(0xF8); gameMemoryValues.CurrentHP = PointerHP.DerefFloat(0x24); gameMemoryValues.MaxHP = PointerHP.DerefFloat(0x20); if (gameMemoryValues.CurrentHP == 1000 && !isReset) { isReset = true; memoryAccess.SetFloatAt(IntPtr.Add(PointerHP.Address, 0x20), 1500); } if (PointerBagCount.Address != IntPtr.Zero) { gameMemoryValues.PlayerInventorySlots = (PointerBagCount.DerefInt(0x78) * 4) + 12; } else { gameMemoryValues.PlayerInventorySlots = 12; } gameMemoryValues.PlayerInventoryCount = PointerInventoryCount.DerefInt(0x28); // Enemy HP GenerateEnemyEntries(); if (gameMemoryValues.EnemyHealth == null || gameMemoryValues.EnemyHealth.Length < EnemyTableCount) { gameMemoryValues.EnemyHealth = new EnemyHP[EnemyTableCount]; gameMemoryValues.EnemyCount = gameMemoryValues.EnemyHealth.Length; for (int i = 0; i < gameMemoryValues.EnemyHealth.Length; ++i) { gameMemoryValues.EnemyHealth[i] = new EnemyHP(); } } for (int i = 0; i < gameMemoryValues.EnemyHealth.Length; ++i) { if (i < PointerEnemyEntries.Length && PointerEnemyEntries[i].Address != IntPtr.Zero) { // While we're within the size of the enemy table, set the values. gameMemoryValues.EnemyHealth[i].ID = PointerEnemyEntries[i].DerefUShort(0x48); gameMemoryValues.EnemyHealth[i].MaximumHP = PointerEnemyEntries[i].DerefFloat(0x20); gameMemoryValues.EnemyHealth[i].CurrentHP = PointerEnemyEntries[i].DerefFloat(0x24); } else { // We're beyond the current size of the enemy table. It must have shrunk because it was larger before but for the sake of performance, we're not going to constantly recreate the array any time the size doesn't match. Just blank out the remaining array values. gameMemoryValues.EnemyHealth[i].ID = 0; gameMemoryValues.EnemyHealth[i].MaximumHP = 0; gameMemoryValues.EnemyHealth[i].CurrentHP = 0; } } gameMemoryValues.PlayerCurrentSelectedInventorySlots = PointerInventorySlotSelected.DerefInt(0x24); GetItems(); HasScanned = true; return(gameMemoryValues); }