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"); } }
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; }
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); }
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 } }
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); } } }
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); } } }
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"; } }