Exemplo n.º 1
0
        private string GetSignOnState(SignOnState state)
        {
            switch (state)
            {
            case SignOnState.SIGNONSTATE_CHALLENGE:
                return("Connection");

            case SignOnState.SIGNONSTATE_CHANGELEVEL:
                return("Mapchange");

            case SignOnState.SIGNONSTATE_CONNECTED:
                return("Connected");

            case SignOnState.SIGNONSTATE_FULL:
                return("Playing");

            case SignOnState.SIGNONSTATE_NEW:
                return("New");

            case SignOnState.SIGNONSTATE_NONE:
                return("Menu");

            case SignOnState.SIGNONSTATE_PRESPAWN:
                return("Prespawn");

            case SignOnState.SIGNONSTATE_SPAWN:
                return("Spawn");

            default:
                return("none");
            }
        }
Exemplo n.º 2
0
 public SignOnStateChangeEventArgs(SignOnState state, SignOnState prevState, string newMap, string prevMap, float gameTime)
 {
     this.SignOnState     = state;
     this.PrevSignOnState = prevState;
     this.NewMap          = newMap;
     this.PrevMap         = prevMap;
     this.GameTime        = gameTime;
 }
Exemplo n.º 3
0
        public static SignOnState GetSignonType(SourceDemoInfo info, byte[] data)
        {
            PacketReader reader = new PacketReader(info, data);
            SignOnState  state  = SignOnState.None;

            reader.MessageRead += (s, e) =>
            {
                if (e.Type == 26)
                {
                    reader.Stop();
                    BitBuffer bb = new BitBuffer(e.WithoutType);
                    state = GetSignonState(bb);
                }
            };

            reader.Parse();
            return(state);
        }
Exemplo n.º 4
0
 protected override void Parse(ref BitStreamReader bsr)
 {
     SignOnState = (SignOnState)bsr.ReadByte();
     SpawnCount  = bsr.ReadSInt();
     if (DemoInfo.NewDemoProtocol)
     {
         NumServerPlayers = bsr.ReadUInt();
         int length = (int)bsr.ReadUInt();
         if (length > 0)
         {
             PlayerNetworkIds = bsr.ReadBytes(length);
         }
         length = (int)bsr.ReadUInt();
         if (length > 0)                 // the string still seams to be null terminated (sometimes?)
         {
             MapName = bsr.ReadStringOfLength(length).Split(new char[] { '\0' }, 2)[0];
         }
     }
     if (SignOnState == SignOnState.PreSpawn)
     {
         DemoRef.ClientSoundSequence = 1;                 // reset sound sequence number after receiving SignOn sounds
     }
 }
Exemplo n.º 5
0
        void MemoryReadThread()
        {
            while (!_cancelSource.IsCancellationRequested)
            {
                try
                {
                    Process gameProcess;
                    //IntPtr serverStatePtr;
                    IntPtr curTimePtr;
                    IntPtr signOnStatePtr;
                    IntPtr curMapPtr;

                    Debug.WriteLine("Waiting for process");

                    // wait for game process
                    while ((gameProcess = this.GetGameProcess(out curMapPtr, out curTimePtr, out signOnStatePtr)) == null)
                    {
                        Thread.Sleep(750);

                        if (_cancelSource.IsCancellationRequested)
                        {
                            return;
                        }
                    }



                    var sb = new StringBuilder(64);
                    for (int j = 0; j < gameProcess.PrivateMemorySize64; j++)
                    {
                        //IntPtr addr = new IntPtr(260769048);
                        IntPtr addr  = new IntPtr(j);
                        byte[] bytes = new byte[sb.Capacity];
                        int    read;
                        sb.Clear();
                        if (!SafeNativeMethods.ReadProcessMemory(gameProcess.Handle, addr, bytes, bytes.Length, out read) || read != bytes.Length)
                        {
                        }
                        else
                        {
                            sb.Append(Encoding.ASCII.GetString(bytes));

                            for (int i = 0; i < sb.Length; i++)
                            {
                                if (sb[i] == '\0')
                                {
                                    sb.Remove(i, sb.Length - i);
                                    break;
                                }
                            }
                            if (sb.ToString() == "testchmb_a_00")
                            {
                                Console.WriteLine(sb.ToString());
                                Console.WriteLine(j);
                            }
                        }

                        if (j % 1048576 == 0)
                        {
                            Console.WriteLine("processed megabyte of memory");
                        }
                    }


                    Console.WriteLine("done!");


                    Debug.WriteLine("Got process " + gameProcess.ProcessName);

                    Debug.Assert(gameProcess != null && curMapPtr != IntPtr.Zero && curTimePtr != IntPtr.Zero && signOnStatePtr != IntPtr.Zero);

                    //IntPtr curMapNamePtr = IntPtr.Add(serverStatePtr, 13);
                    IntPtr tickCountPtr       = IntPtr.Add(curTimePtr, 12);
                    IntPtr intervalPerTickPtr = IntPtr.Add(tickCountPtr, 4);
                    var    mapName            = new StringBuilder(64);
                    //GameState prevState = GameState.Dead;
                    SignOnState prevSignOnState = SignOnState.None;
                    float       startTime       = 0;
                    float       prevTime        = 0;
                    string      prevMapName     = String.Empty;
                    while (!gameProcess.HasExited)
                    {
                        //int st;
                        //float time;
                        int   tickCount;
                        float intervalPerTick;
                        int   sos;
                        //ReadProcessInt32(gameProcess, serverStatePtr, out st);
                        //ReadProcessFloat(gameProcess, curTimePtr, out time);
                        ReadProcessString(gameProcess, curMapPtr, mapName);
                        ReadProcessInt32(gameProcess, tickCountPtr, out tickCount);
                        ReadProcessFloat(gameProcess, intervalPerTickPtr, out intervalPerTick);
                        ReadProcessInt32(gameProcess, signOnStatePtr, out sos);
                        //GameState state = (GameState)st;
                        SignOnState signOnState = (SignOnState)sos;

                        float tickTime = tickCount * intervalPerTick;

                        if (signOnState != prevSignOnState)
                        {
                            if (signOnState == SignOnState.Full)
                            {
                                Debug.WriteLine("startTime set to " + tickTime);
                                startTime = tickTime;
                            }
                            else if (signOnState == SignOnState.None)
                            {
                                tickTime = prevTime;
                            }

                            // invoke on main thread
                            SignOnState prevStateClosure   = prevSignOnState;
                            float       startTimeClosure   = startTime;
                            string      prevMapNameClosure = prevMapName;
                            _uiThread.Post(s => {
                                if (this.OnSignOnStateChange != null)
                                {
                                    this.OnSignOnStateChange(this, new SignOnStateChangeEventArgs(signOnState, prevStateClosure,
                                                                                                  mapName.ToString(), prevMapNameClosure,
                                                                                                  tickTime - startTimeClosure));
                                }
                            }, null);

                            //Debug.WriteLine("state=" + signOnState + " " + tickTime + " " + mapName);
                        }

                        if (signOnState == SignOnState.Connected)
                        {
                            Debug.WriteLine("state=" + signOnState + " " + tickTime + " " + mapName);
                        }

                        if (signOnState == SignOnState.Full)
                        {
                            float startTimeClosure = startTime;
                            _uiThread.Post(d => {
                                if (this.OnGameTimeUpdate != null)
                                {
                                    this.OnGameTimeUpdate(this, tickTime - startTimeClosure);
                                }
                            }, null);
                        }

                        lock (_lock)
                            _curMap = mapName.ToString();
                        //prevState = state;
                        prevSignOnState = signOnState;
                        prevTime        = tickTime;
                        prevMapName     = mapName.ToString();

                        Thread.Sleep(15); // 66 tickrate
                        if (_cancelSource.IsCancellationRequested)
                        {
                            return;
                        }
                    }
                }
                catch (Exception ex) // probably a Win32Exception on access denied to a process
                {
                    Trace.WriteLine(ex.ToString());
                    Thread.Sleep(1000);
                }
            }
        }
Exemplo n.º 6
0
        void MemoryReadThread()
        {
            while (!_cancelSource.IsCancellationRequested)
            {
                try
                {
                    Process gameProcess;
                    //IntPtr serverStatePtr;
                    IntPtr curTimePtr;
                    IntPtr signOnStatePtr;
                    IntPtr curMapPtr;

                    Debug.WriteLine("Waiting for process");

                    // wait for game process
                    while ((gameProcess = this.GetGameProcess(out curMapPtr, out curTimePtr, out signOnStatePtr)) == null)
                    {
                        Thread.Sleep(750);

                        if (_cancelSource.IsCancellationRequested)
                        {
                            return;
                        }
                    }

                    Debug.WriteLine("Got process " + gameProcess.ProcessName);

                    Debug.Assert(gameProcess != null && curMapPtr != IntPtr.Zero && curTimePtr != IntPtr.Zero && signOnStatePtr != IntPtr.Zero);

                    //IntPtr curMapNamePtr = IntPtr.Add(serverStatePtr, 13);
                    IntPtr tickCountPtr       = IntPtr.Add(curTimePtr, 12);
                    IntPtr intervalPerTickPtr = IntPtr.Add(tickCountPtr, 4);
                    var    mapName            = new StringBuilder(64);
                    //GameState prevState = GameState.Dead;
                    SignOnState prevSignOnState = SignOnState.None;
                    float       startTime       = 0;
                    float       prevTime        = 0;
                    string      prevMapName     = String.Empty;
                    while (!gameProcess.HasExited)
                    {
                        //int st;
                        //float time;
                        int   tickCount;
                        float intervalPerTick;
                        int   sos;
                        //ReadProcessInt32(gameProcess, serverStatePtr, out st);
                        //ReadProcessFloat(gameProcess, curTimePtr, out time);
                        ReadProcessString(gameProcess, curMapPtr, mapName);
                        ReadProcessInt32(gameProcess, tickCountPtr, out tickCount);
                        ReadProcessFloat(gameProcess, intervalPerTickPtr, out intervalPerTick);
                        ReadProcessInt32(gameProcess, signOnStatePtr, out sos);
                        //GameState state = (GameState)st;
                        SignOnState signOnState = (SignOnState)sos;

                        float tickTime = tickCount * intervalPerTick;

                        if (signOnState != prevSignOnState)
                        {
                            if (signOnState == SignOnState.Full)
                            {
                                Debug.WriteLine("startTime set to " + tickTime);
                                startTime = tickTime;
                            }
                            else if (signOnState == SignOnState.None)
                            {
                                tickTime = prevTime;
                            }

                            // invoke on main thread
                            SignOnState prevStateClosure   = prevSignOnState;
                            float       startTimeClosure   = startTime;
                            string      prevMapNameClosure = prevMapName;
                            _uiThread.Post(s => {
                                if (this.OnSignOnStateChange != null)
                                {
                                    this.OnSignOnStateChange(this, new SignOnStateChangeEventArgs(signOnState, prevStateClosure,
                                                                                                  mapName.ToString(), prevMapNameClosure,
                                                                                                  tickTime - startTimeClosure));
                                }
                            }, null);

                            //Debug.WriteLine("state=" + signOnState + " " + tickTime + " " + mapName);
                        }

                        if (signOnState == SignOnState.Connected)
                        {
                            Debug.WriteLine("state=" + signOnState + " " + tickTime + " " + mapName);
                        }

                        if (signOnState == SignOnState.Full)
                        {
                            float startTimeClosure = startTime;
                            _uiThread.Post(d => {
                                if (this.OnGameTimeUpdate != null)
                                {
                                    this.OnGameTimeUpdate(this, tickTime - startTimeClosure);
                                }
                            }, null);
                        }

                        lock (_lock)
                            _curMap = mapName.ToString();
                        //prevState = state;
                        prevSignOnState = signOnState;
                        prevTime        = tickTime;
                        prevMapName     = mapName.ToString();

                        Thread.Sleep(15); // 66 tickrate
                        if (_cancelSource.IsCancellationRequested)
                        {
                            return;
                        }
                    }
                }
                catch (Exception ex) // probably a Win32Exception on access denied to a process
                {
                    Trace.WriteLine(ex.ToString());
                    Thread.Sleep(1000);
                }
            }
        }
Exemplo n.º 7
0
 public SignOnStateChangeEventArgs(SignOnState state, SignOnState prevState, string newMap, string prevMap, float gameTime)
 {
     this.SignOnState = state;
     this.PrevSignOnState = prevState;
     this.NewMap = newMap;
     this.PrevMap = prevMap;
     this.GameTime = gameTime;
 }
 private string GetSignOnState(SignOnState state)
 {
     switch (state)
     {
         case SignOnState.SIGNONSTATE_CHALLENGE:
             return "Connection";
         case SignOnState.SIGNONSTATE_CHANGELEVEL:
             return "Mapchange";
         case SignOnState.SIGNONSTATE_CONNECTED:
             return "Connected";
         case SignOnState.SIGNONSTATE_FULL:
             return "Playing";
         case SignOnState.SIGNONSTATE_NEW:
             return "New";
         case SignOnState.SIGNONSTATE_NONE:
             return "Menu";
         case SignOnState.SIGNONSTATE_PRESPAWN:
             return "Prespawn";
         case SignOnState.SIGNONSTATE_SPAWN:
             return "Spawn";
         default:
             return "none";
     }
 }