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() );
		}
	}
}
Example #2
0
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;
}