int Int_Decode( CBitRead &entityBitBuffer, const CSVCMsg_SendTable::sendprop_t *pSendProp ) { int flags = pSendProp->flags(); if ( flags & SPROP_VARINT ) { if ( flags & SPROP_UNSIGNED ) { return (int)entityBitBuffer.ReadVarInt32(); } else { return entityBitBuffer.ReadSignedVarInt32(); } } else { if ( flags & SPROP_UNSIGNED ) { return entityBitBuffer.ReadUBitLong( pSendProp->num_bits() ); } else { return entityBitBuffer.ReadSBitLong( pSendProp->num_bits() ); } } }
bool demo_csgo::parse_data_table(CBitRead& bs) { CSVCMsg_SendTable msg; while(true) { int32_t type = bs.ReadVarInt32(); // bs.nReadVarSInt32(); uint8_t* msg_buffer = 0; int32_t size = 0; if(!bitstream_read_bytes(&bs, &msg_buffer, &size)) { std::cerr << "demo_csgo::parse_data_table(): !bitstream_read_bytes(&bs, &msg_buffer, &size)" << std::endl; return false; } msg.ParseFromArray(msg_buffer, size); delete[] msg_buffer; if(msg.is_end()) { break; } m_data_tables.push_back(msg); } int16_t num_server_classes = bs.ReadShort(); // bs.nReadSInt(16); if(0 == num_server_classes) { std::cerr << "demo_csgo::parse_data_table(): 0 == num_server_classes" << std::endl; return false; } for(auto i = 0; i < num_server_classes; ++i) { ServerClass_t entry; entry.nClassID = bs.ReadShort(); // bs.nReadSInt(16); if(entry.nClassID >= num_server_classes) { std::cerr << "demo_csgo::parse_data_table(): entry.nClassID >= num_server_classes" << std::endl; return false; } bs.ReadString(entry.strName, sizeof(entry.strName), false, 0); // bs.nReadString(entry.strName, sizeof(entry.strName)); bs.ReadString(entry.strDTName, sizeof(entry.strDTName), false, 0); // bs.nReadString(entry.strDTName, sizeof(entry.strDTName)); entry.nDataTable = -1; for(unsigned int j = 0; j < m_data_tables.size(); ++j) { if(0 == m_data_tables[j].net_table_name().compare(entry.strDTName)) { entry.nDataTable = j; break; } } m_server_classes.push_back(entry); } for(auto i = 0; i < num_server_classes; ++i) { flatten_data_table(m_server_classes, m_data_tables, m_excludes, i); //flatten_data_table(i); } int32_t i = num_server_classes; m_server_classes_bits = 0; while (i >>= 1) m_server_classes_bits += 1; m_server_classes_bits += 1; return true; }