Ejemplo n.º 1
0
        private Events?Handle(CSVCMsg_CreateStringTable message)
        {
            var table = StringTable.Create(message);

            state.StringsIndex[message.name] = state.Strings.Count;
            state.Strings.Add(table);

            stringTableUpdater.Update(table, message.num_entries, message.string_data);

            return(null);
        }
Ejemplo n.º 2
0
        private Event?Process(CSVCMsg_CreateStringTable message)
        {
            var table = StringTable.Create(message);

            client.StringsIndex[message.name] = client.Strings.Count;
            client.Strings.Add(table);

            stringTableUpdater.Update(table, message.num_entries, message.string_data);

            log.Debug(String.Format(
                          "CSVCMsg_CreateStringTable: name {0} with {1} bytes of data",
                          message.name, message.string_data.Length));
            return(null);
        }
        public bool TryApplyMessage(ProtoBuf.IExtensible message, DemoParser parser)
        {
            var stringTableUpdate = message as CSVCMsg_UpdateStringTable;

            if ((stringTableUpdate == null) || (parser.StringTablesParser.stringTables[stringTableUpdate.table_id].name != "userinfo"))
            {
                return(false);
            }

            CSVCMsg_CreateStringTable stringTableCreate = parser.StringTablesParser.stringTables[stringTableUpdate.table_id];

            stringTableCreate.num_entries = stringTableUpdate.num_changed_entries;
            stringTableCreate.string_data = stringTableUpdate.string_data;

            parser.StringTablesParser.ParseStringTableMessage(stringTableCreate, parser);

            return(true);
        }
Ejemplo n.º 4
0
        public static StringTable Create(CSVCMsg_CreateStringTable proto)
        {
            var flags = MultiFlag.None;

            if ((proto.flags & (uint)MultiFlag.Precache) > 0)
            {
                flags |= MultiFlag.Precache;
            }

            if ((proto.flags & (uint)MultiFlag.What) > 0)
            {
                flags |= MultiFlag.What;
            }

            if ((proto.flags & (uint)MultiFlag.FixedLength) > 0)
            {
                flags |= MultiFlag.FixedLength;
            }

            return(new StringTable(proto.name, (uint)proto.max_entries,
                                   proto.user_data_fixed_size, (uint)proto.user_data_size,
                                   (uint)proto.user_data_size_bits, flags));
        }
Ejemplo n.º 5
0
        public void ParseStringTableMessage(CSVCMsg_CreateStringTable table, DemoParser parser)
        {
            using (IBitStream reader = BitStreamUtil.Create(table.string_data))
            {
                if (reader.ReadBit())
                {
                    throw new NotImplementedException("Encoded with dictionaries, unable to decode");
                }

                int nTemp      = table.max_entries;
                int nEntryBits = 0;
                while ((nTemp >>= 1) != 0)
                {
                    ++nEntryBits;
                }


                List <string> history = new List <string>();

                int lastEntry = -1;

                for (int i = 0; i < table.num_entries; i++)
                {
                    int entryIndex = lastEntry + 1;
                    // read in the entity-index
                    if (!reader.ReadBit())
                    {
                        entryIndex = (int)reader.ReadInt(nEntryBits);
                    }

                    lastEntry = entryIndex;

                    // Read the name of the string into entry.
                    string entry = "";
                    if (entryIndex < 0 || entryIndex >= table.max_entries)
                    {
                        throw new InvalidDataException("bogus string index");
                    }

                    if (reader.ReadBit())
                    {
                        bool substringcheck = reader.ReadBit();

                        if (substringcheck)
                        {
                            int index       = (int)reader.ReadInt(5);
                            int bytestocopy = (int)reader.ReadInt(5);

                            entry = history[index].Substring(0, bytestocopy);

                            entry += reader.ReadString(1024);
                        }
                        else
                        {
                            entry = reader.ReadString(1024);
                        }
                    }

                    if (entry == null)
                    {
                        entry = "";
                    }

                    if (history.Count > 31)
                    {
                        history.RemoveAt(0);
                    }

                    // Read in the user data.
                    byte[] userdata = new byte[0];
                    if (reader.ReadBit())
                    {
                        if (table.user_data_fixed_size)
                        {
                            userdata = reader.ReadBits(table.user_data_size_bits);
                        }
                        else
                        {
                            int bytesToRead = (int)reader.ReadInt(14);

                            userdata = reader.ReadBytes(bytesToRead);
                        }
                    }

                    if (userdata.Length == 0)
                    {
                        break;
                    }

                    // Now we'll parse the players out of it.
                    BinaryReader playerReader = new BinaryReader(new MemoryStream(userdata));
                    PlayerInfo   info         = PlayerInfo.ParseFrom(playerReader);

                    UpdatePlayer(info, parser);
                }
            }
        }