public Player(Pointer playerTarget) { activePtr = playerTarget.Clone(); Pointer playerEntity = playerTarget.Adjust(4); switch (GameHook.CurrentVersion) { case GameVersion.TFE: { namePtr = playerEntity.AddOffsets(0x310, 0x0); startTimeUnixPtr = playerEntity.AddOffsets(0xAC0); levelStartTimePtr = playerEntity.AddOffsets(0xAC8); LevelStats = new PlayerStats(playerEntity.AddOffsets(0x1240)); GameStats = new PlayerStats(playerEntity.AddOffsets(0x1268)); break; } case GameVersion.TSE: { namePtr = playerEntity.AddOffsets(0x310, 0x0); startTimeUnixPtr = playerEntity.AddOffsets(0xC38); levelStartTimePtr = playerEntity.AddOffsets(0xC40); LevelStats = new PlayerStats(playerEntity.AddOffsets(0x2584)); GameStats = new PlayerStats(playerEntity.AddOffsets(0x25AC)); break; } case GameVersion.REVOLUTION: { namePtr = playerEntity.AddOffsets(0x368, 0x0); startTimeUnixPtr = playerEntity.AddOffsets(0xC2C); levelStartTimePtr = playerEntity.AddOffsets(0xC34); LevelStats = new PlayerStats(playerEntity.AddOffsets(0x2B20)); GameStats = new PlayerStats(playerEntity.AddOffsets(0x2B90)); break; } } }
public PlayerStats(Pointer basePtr) { if (GameHook.CurrentVersion == GameVersion.REVOLUTION) { scorePtr = basePtr.Adjust(0x0); killsPtr = basePtr.Adjust(0x8); deathsPtr = basePtr.Adjust(0x10); secretsPtr = basePtr.Adjust(0x20); totalKillsPtr = basePtr.Adjust(0x40); totalSecretsPtr = basePtr.Adjust(0x58); } else { scorePtr = basePtr.Adjust(0x0); killsPtr = basePtr.Adjust(0x4); deathsPtr = basePtr.Adjust(0x8); secretsPtr = basePtr.Adjust(0xC); totalKillsPtr = basePtr.Adjust(0x18); totalSecretsPtr = basePtr.Adjust(0x20); } }
public static void TryHookGame() { foreach (Process p in Process.GetProcessesByName("SeriousSam")) { Manager = new MemManager(p); Engine = Manager.HookedProcess.Modules.Cast <ProcessModule>().Where(m => m.ModuleName == "Engine.dll").FirstOrDefault(); if (Engine == null) { continue; } CurrentVersion = CheckGameVersion(); if (CurrentVersion != GameVersion.NONE) { break; } } if (CurrentVersion == GameVersion.NONE) { return; } IntPtr _pNetwork = Manager.Read <IntPtr>(Manager.Read <IntPtr>(Manager.SigScan( Engine.BaseAddress, Engine.ModuleMemorySize, 2, "8B 0D ????????", // mov ecx,[Engine._pNetwork] "83 C4 08", // add esp,08 "E8 ????????", // call Engine.CNetworkLibrary::IsPaused "85 C0" // test eax,eax ))); if (_pNetwork == IntPtr.Zero) { CurrentVersion = GameVersion.NONE; return; } if (CurrentVersion == GameVersion.REVOLUTION) { difficultyPtr = new Pointer(_pNetwork, 0x9C); currentIGTPtr = new Pointer(_pNetwork, 0x20, 0x58); levelNamePtr = new Pointer(_pNetwork, 0x12EC, 0x0); } else { difficultyPtr = new Pointer(_pNetwork, 0x988); currentIGTPtr = new Pointer(_pNetwork, 0x20, 0x38); levelNamePtr = new Pointer(_pNetwork, (CurrentVersion == GameVersion.TFE) ? 0x1284 : 0x1288, 0x0); } int playerCount = Manager.Read <Int32>(new Pointer(_pNetwork, 0x20, 0x0)); Pointer firstPlayer = new Pointer(_pNetwork, 0x20, 0x4, 0x0); AllPlayers = new Player[playerCount]; for (int i = 0; i < playerCount; i++) { AllPlayers[i] = new Player(firstPlayer); firstPlayer = firstPlayer.Adjust(PLAYER_TARGET_SIZE); } }