public Header(BitStream bitStream) { this.FileType = bitStream.ReadString(); this.DemoProtocol = bitStream.ReadInt32(); this.NetworkProtocol = bitStream.ReadInt32(); this.ServerName = bitStream.ReadString(260); this.ClientName = bitStream.ReadString(260); this.MapName = bitStream.ReadString(260); this.GameDirectory = bitStream.ReadString(260); this.PlaybackTime = bitStream.ReadFloat(); this.PlaybackTicks = bitStream.ReadInt32(); this.PlaybackFrames = bitStream.ReadInt32(); this.SignOnLength = bitStream.ReadInt32(); }
public PlayerInfo(byte[] playerInfoData) { BitStream bitStream = new BitStream(playerInfoData); this.Version = bitStream.ReadBigEndianInt64(); this.XUID = bitStream.ReadBigEndianInt64(); this.Name = bitStream.ReadString(128); this.UserID = bitStream.ReadBigEndianInt32(); this.GUID = bitStream.ReadString(33); this.FriendsID = bitStream.ReadBigEndianInt32(); this.FriendsName = bitStream.ReadString(128); this.IsFakePlayer = bitStream.ReadBool(); this.IsHLTV = bitStream.ReadBool(); this.CustomFileCRCs = new int[4]; for (int i = 0; i < CustomFileCRCs.Length; i++) { this.CustomFileCRCs[i] = bitStream.ReadInt32(); } this.FilesDownloaded = bitStream.ReadChar(); }
private string ReadString(BitStream bitStream, DataTableProperty dataTableProperty) { int length = (int)bitStream.ReadBits(9); string result = bitStream.ReadString(length); return result; }
private void Update(BitStream bitStream, string tableName, int tableFlags, int numberOfEntries, int maxEntries, int userDataSize, int userDataSizeInBits, bool userDataIsFixedSize) { bool encodeUsingDictionaries = bitStream.ReadBit(); if (encodeUsingDictionaries) { Console.WriteLine("Cannot Decode StringTable Update"); return; } List<String> entryHistory = new List<String>(); int lastEntriesIndex = -1; for (int i = 0; i < numberOfEntries; i++) { int entryIndex = lastEntriesIndex + 1; int entryLength = (int)Math.Log(maxEntries, 2); if (!bitStream.ReadBit()) { entryIndex = (int)bitStream.ReadBits(entryLength); } lastEntriesIndex = entryIndex; if (entryIndex < 0 || entryIndex >= maxEntries) { Console.WriteLine("Invalid StringTableEntry Index"); return; } string entryName = ""; if (bitStream.ReadBit()) { bool substringCheck = bitStream.ReadBit(); if (substringCheck) { int index = (int)bitStream.ReadBits(5); int bytesToCopy = (int)bitStream.ReadBits(5); entryName = entryHistory[index].Substring(0, bytesToCopy); entryName += bitStream.ReadString(); } else { entryName = bitStream.ReadString(); } } if (entryHistory.Count > 31) { entryHistory.RemoveAt(0); } entryHistory.Add(entryName); byte[] entryData = null; if (bitStream.ReadBit()) { if (userDataIsFixedSize) { entryData = bitStream.ReadBitsToArray(userDataSizeInBits); } else { int bytesToRead = (int)bitStream.ReadBits(14); entryData = bitStream.ReadBytes(bytesToRead); } } StringTableEntry stringTableEntry = new StringTableEntry(entryName, entryIndex, entryData); Add(tableName, stringTableEntry); } }
private bool ProcessTick() { DemoCommand demoCommand = (DemoCommand)m_BitStream.ReadByte(); int tickNumber = m_BitStream.ReadInt32(); int playerSlot = m_BitStream.ReadByte(); switch (demoCommand) { case DemoCommand.DataTables: { int length = m_BitStream.ReadInt32(); byte[] data = m_BitStream.ReadBytes(length); BitStream bitStream = new BitStream(data); while (true) { int dataTableType = bitStream.ReadVarint32(); int dataTablelength = bitStream.ReadVarint32(); byte[] dataTableData = bitStream.ReadBytes(dataTablelength); DataTable dataTable = new DataTable(this.DataTables.Count, dataTableData); if (dataTable.IsEnd) { break; } else { this.DataTables.Add(dataTable); } } int count = bitStream.ReadShort(); for (int i = 0; i < count; i++) { int serverClassID = bitStream.ReadShort(); string serverClassName = bitStream.ReadString(); string dataTableName = bitStream.ReadString(); DataTable dataTable = this.DataTables.GetDataTable(dataTableName); ServerClass serverClass = new ServerClass(serverClassID, serverClassName, dataTable.ID, dataTable.Name); this.ServerClasses.Add(serverClass); } this.ServerClasses.ProcessAllServerClasses(); break; } case DemoCommand.Packet: case DemoCommand.SignOn: { m_BitStream.SeekBytes(160, SeekOrigin.Current); int length = m_BitStream.ReadInt32(); byte[] data = m_BitStream.ReadBytes(length); BitStream packetReader = new BitStream(data); while (packetReader.PositionInBytes < packetReader.LengthInBytes) { int packetID = packetReader.ReadVarint32(); int packetLength = packetReader.ReadVarint32(); byte[] packetData = packetReader.ReadBytes(packetLength); PacketType packetType; if (!Enum.TryParse<PacketType>(packetID.ToString(), out packetType)) { Console.WriteLine("Unknown Packet Type: {0}", packetID); break; } this.PacketHandlers.OnPacketReceived(packetType, packetData); } break; } case DemoCommand.Stop: { return true; } case DemoCommand.StringTables: { int length = m_BitStream.ReadInt32(); byte[] data = m_BitStream.ReadBytes(length); BitStream bitStream = new BitStream(data); int stringTableCount = bitStream.ReadByte(); for (int i = 0; i < stringTableCount; i++) { string stringTableName = bitStream.ReadString(); int entryCount = bitStream.ReadUShort(); for (int j = 0; j < entryCount; j++) { string entryName = bitStream.ReadString(); bool entryHasData = bitStream.ReadBit(); byte[] entryData = null; if (entryHasData) { int entryDataLength = bitStream.ReadShort(); entryData = bitStream.ReadBytes(entryDataLength); } StringTableEntry stringTableEntry = new StringTableEntry(entryName, entryData); this.StringTables.Add(stringTableName, stringTableEntry); } bool hasExtraTableData = bitStream.ReadBit(); if (hasExtraTableData) { int extraTableDataLength = bitStream.ReadShort(); byte[] extraTableData = bitStream.ReadBytes(extraTableDataLength); } } break; } case DemoCommand.SyncTick: { break; } default: { Console.WriteLine("Unknown Demo Command: {0}", demoCommand); break; } } return false; }