UnpackResult transactionProtocolUnpackObjectResourceCreate(bitstream_t * bitstream, TransactionObjectResourceCreate * resourceObject)
{
	UnpackResult unpackResult = UnpackValid;
	
	bitstream_read_uint64(bitstream, &resourceObject->rid); // huid_t
	bitstream_read_uint64(bitstream, &resourceObject->uid); // huid_t
	bitstream_read_uint8(bitstream, &resourceObject->length); // data length
	int read_length = bitstream_read_bytes(bitstream, resourceObject->data, resourceObject->length); // data bytes
	
	if(read_length != resourceObject->length)
		unpackResult = UnpackInvalid;
	
	return unpackResult;
}
Exemplo n.º 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;
}