public void Run() { while (true) { if (!ProcessMemory.IsHooked) { if (!ProcessMemory.HookProcess("Among Us")) { Thread.Sleep(1000); continue; } Console.WriteLine("GameMemReader", $"Connected to Among Us process ({ProcessMemory.process.Id}))"); // Register handlers for game-state change events. //GameMemReader.getInstance().GameStateChanged += GameStateChangedHandler; //GameMemReader.getInstance().PlayerChanged += PlayerChangedHandler; //GameMemReader.getInstance().JoinedLobby += JoinedLobbyHandler; loadModules(); } GameState state = getGameState(); handlePlayers(state); readChat(); if (shouldReadLobby) { var gameCode = ProcessMemory.ReadString(ProcessMemory.Read <IntPtr>(GameAssemblyPtr, GameOffsets.GameStartManagerOffset, 0x5c, 0, 0x20, 0x28)); string[] split; if (gameCode != null && gameCode.Length > 0 && (split = gameCode.Split('\n')).Length == 2) { PlayRegion region = (PlayRegion)((4 - (ProcessMemory.Read <int>(GameAssemblyPtr, GameOffsets.ServerManagerOffset, 0x5c, 0, 0x10, 0x8, 0x8) & 0b11)) % 3); this.latestLobbyEventArgs = new LobbyEventArgs() { LobbyCode = split[1], Region = region }; shouldReadLobby = false; shouldTransmitLobby = true; // since this is probably new info } } if (shouldTransmitLobby) { if (this.latestLobbyEventArgs != null) { JoinedLobby?.Invoke(this, this.latestLobbyEventArgs); } shouldTransmitLobby = false; } Thread.Sleep(250); } }
private void readChat() { var chatBubblesPtr = ProcessMemory.Read <IntPtr>(GameAssemblyPtr, GameOffsets.HudManagerOffset, 0x5C, 0, 0x28, 0xC, 0x14); prevChatBubsVersion = ProcessMemory.Read <int>(GameAssemblyPtr, GameOffsets.HudManagerOffset, 0x5C, 0, 0x28, 0xC, 0x14, 0x10); var poolSize = 20; // = ProcessMemory.Read<int>(GameAssemblyPtr, 0xD0B25C, 0x5C, 0, 0x28, 0xC, 0xC) var numChatBubbles = ProcessMemory.Read <int>(chatBubblesPtr, 0xC); var chatBubsVersion = ProcessMemory.Read <int>(chatBubblesPtr, 0x10); var chatBubblesAddr = ProcessMemory.Read <IntPtr>(chatBubblesPtr, 0x8) + 0x10; var chatBubblePtrs = ProcessMemory.ReadArray(chatBubblesAddr, numChatBubbles); var newMsgs = 0; if (chatBubsVersion > prevChatBubsVersion) // new message has been sent { if (chatBubsVersion > poolSize) // increments are twofold (push to and pop from pool) { if (prevChatBubsVersion > poolSize) { newMsgs = (chatBubsVersion - prevChatBubsVersion) >> 1; } else { newMsgs = poolSize - prevChatBubsVersion + ((chatBubsVersion - poolSize) >> 1); } } else { newMsgs = chatBubsVersion - prevChatBubsVersion; } } else if (chatBubsVersion < prevChatBubsVersion) // reset { if (chatBubsVersion > poolSize) // increments are twofold (push to and pop from pool) { newMsgs = poolSize + ((chatBubsVersion - poolSize) >> 1); } else // single increments { newMsgs = chatBubsVersion; } } prevChatBubsVersion = chatBubsVersion; for (var i = numChatBubbles - newMsgs; i < numChatBubbles; i++) { var msgText = ProcessMemory.ReadString(ProcessMemory.Read <IntPtr>(chatBubblePtrs[i], 0x20, 0x28)); if (msgText.Length == 0) { continue; } var msgSender = ProcessMemory.ReadString(ProcessMemory.Read <IntPtr>(chatBubblePtrs[i], 0x1C, 0x28)); var oldPlayerInfo = oldPlayerInfos[msgSender]; ChatMessageAdded?.Invoke(this, new ChatMessageEventArgs { Sender = msgSender, Message = msgText, Color = oldPlayerInfo.GetPlayerColor() }); } }
public string GetPlayerName() { return(ProcessMemory.ReadString((IntPtr)PlayerName)); }