Пример #1
0
        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);
            }
        }
Пример #2
0
        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()
                });
            }
        }
Пример #3
0
 public string GetPlayerName()
 {
     return(ProcessMemory.ReadString((IntPtr)PlayerName));
 }