Example #1
0
        internal void CreateTablesFromPacket(StringTables tablesPacket)
        {
            _privateTables.Clear();
            TableReadable.Clear();
            bool useCreationLookup = CreationLookup.Any();

            try {
                foreach (StringTable table in tablesPacket.Tables)
                {
                    MutableStringTable newTable;
                    if (useCreationLookup)
                    {
                        int tableId = CreationLookup.FindIndex(info => info.TableName == table.Name);
                        newTable = InitNewTable(tableId, CreationLookup[tableId]);
                    }
                    else
                    {
                        // create fake creation info
                        SvcCreateStringTable fakeInfo = new SvcCreateStringTable(null)
                        {
                            TableName         = table.Name,
                            MaxEntries        = -1,
                            Flags             = StringTableFlags.Fake,
                            UserDataFixedSize = false,
                            UserDataSize      = -1,
                            UserDataSizeBits  = -1
                        };
                        // SvcServerInfo wasn't parsed correctly, assume i is the proper table ID
                        newTable = CreateStringTable(fakeInfo);
                    }

                    table.MaxEntries = newTable.MaxEntries;

                    if (table.TableEntries != null)
                    {
                        foreach (StringTableEntry entry in table.TableEntries)
                        {
                            AddTableEntry(newTable, entry?.EntryData?.CreateCopy(), entry.Name);
                        }
                    }
                    if (table.Classes != null)
                    {
                        foreach (MutableStringTableClass tableClass in newTable.Classes)
                        {
                            AddTableClass(newTable, tableClass.Name, tableClass.Data);
                        }
                    }
                }
            } catch (Exception e) {
                _demoRef.LogError($"error while converting tables packet to c_tables: {e.Message}");
                TableReadable.Keys.ToList().ForEach(s => TableReadable[s] = false);
            }
        }
Example #2
0
 public static Task Write(this SourceDemo demo, StringTables frame)
 {
     throw new NotImplementedException();
 }
Example #3
0
        public static Task Read(this SourceDemo demo, StringTables frame)
        {
            var buf    = frame.Buffer;
            int tables = buf.ReadByte();

            for (int i = 0; i < tables; i++)
            {
                var name  = buf.ReadString();
                var table = new StringTable(name);

                var entries = buf.ReadInt16();
                for (int j = 0; j < entries; j++)
                {
                    var entry   = buf.ReadString();
                    var data    = default(byte[]);
                    var version = default(long);
                    var xuid    = default(long);
                    var info    = default(TableInfoBase);

                    if (buf.ReadBoolean())
                    {
                        var length = buf.ReadInt16();
                        data = buf.ReadBytes(length);

                        // TODO
                        if (name == Const.INSTANCE_BASELINE_TABLENAME)
                        {
                            info = new InstanceBaseline()
                            {
                                Id = int.Parse(entry)
                            };
                        }
                        else if (name == Const.LIGHT_STYLES_TABLENAME)
                        {
                        }
                        else if (name == Const.SERVER_STARTUP_DATA_TABLENAME)
                        {
                        }
                        else if (name == Const.USER_INFO_TABLENAME)
                        {
                            var buf2 = new SourceBufferReader(data);
                            if (demo.GameDirectory == "csgo")
                            {
                                // 8 bytes
                                version = BitConverter.ToInt64(buf2.ReadBytes(8), 0);
                                // 8 bytes
                                xuid = BitConverter.ToInt64(buf2.ReadBytes(8), 0);
                            }
                            else
                            {
                                // 4 bytes
                                version = buf2.ReadInt32();
                                // 4 bytes
                                xuid = buf2.ReadInt32();
                            }

                            info = new PlayerInfo()
                            {
                                // 32 bytes
                                Name = Encoding.ASCII.GetString(buf2.ReadBytes(Const.MAX_PLAYER_NAME_LENGTH)).TrimEnd('\0'),
                                // 4 bytes
                                UserId = buf2.ReadInt32(),
                                // 33 bytes
                                Guid = Encoding.ASCII.GetString(buf2.ReadBytes(Const.SIGNED_GUID_LEN + 1)).TrimEnd('\0'),
                                // 4 bytes
                                FriendsId = buf2.ReadInt32(),
                                // 32 bytes
                                FriendsName = Encoding.ASCII.GetString(buf2.ReadBytes(Const.MAX_PLAYER_NAME_LENGTH)).TrimEnd('\0'),
                                // 1 byte
                                Fakeplayer = buf2.ReadBoolean(),
                                // 1 byte
                                IsHltv = buf2.ReadBoolean(),
                                // 16 bytes
                                CustomFiles = new int[4]
                                {
                                    buf2.ReadInt32(),
                                        buf2.ReadInt32(),
                                        buf2.ReadInt32(),
                                        buf2.ReadInt32()
                                },
                                // 2 bytes
                                FilesDownloaded = buf2.ReadChar()
                            };
                        }
                    }
                    table.AddEntry(new StringTableEntry()
                    {
                        Name    = entry,
                        RawData = data,
                        Version = version,
                        Xuid    = xuid,
                        Info    = info
                    });
                }

                if (buf.ReadBoolean())
                {
                    var centries = buf.ReadInt16();
                    for (var j = 0; j < centries; j++)
                    {
                        var centry = buf.ReadString();
                        var ddata  = default(byte[]);
                        if (buf.ReadBoolean())
                        {
                            var length = buf.ReadInt16();
                            ddata = buf.ReadBytes(length);
                        }
                        table.AddClientEntry(new ClientEntry()
                        {
                            Name    = centry,
                            RawData = ddata
                        });
                    }
                }
                frame.Tables.Add(table);
            }
            return(Task.CompletedTask);
        }