diff options
Diffstat (limited to 'src/csgo/netvar.h')
| -rw-r--r-- | src/csgo/netvar.h | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/src/csgo/netvar.h b/src/csgo/netvar.h new file mode 100644 index 0000000..cd5c702 --- /dev/null +++ b/src/csgo/netvar.h @@ -0,0 +1,142 @@ +//|_ _ _. _ ._ |_ _. _ | +//| | (/_ (_| \/ (/_ | | | | (_| (_ |< + +#pragma once + +#include "csgo.h" +#include "sdk.h" +#include "../conout.h" + +struct NETVAR_TABLE { + U32 ptr; + STR<64> name; +}; + +inline U32 netvar_get_classes( CSGO* csgo ) { + IFACE_ENTRY chl = u_vector_search<IFACE_ENTRY>( + csgo->interfaces, + []( IFACE_ENTRY* in ) { + return !!strstr( in->name, "VClient0" ); + } + ); + + if( !chl.ptr ) + return 0; + + U32 chl_vtable = csgo->read<U32>( chl.ptr ); + U32 vtable_8 = chl_vtable + 8 * sizeof(U32); + + U32 get_allclasses = csgo->read<U32>( vtable_8 ); + U32 class_ptr = csgo->read<U32>( csgo->read<U32>( get_allclasses + 0x1 ) ); + + return class_ptr; +} + +inline VECTOR<NETVAR_TABLE> netvar_get_tables( CSGO* csgo, U32 list ) { + static VECTOR<NETVAR_TABLE> tables{}; + if( !tables.empty() ) + return tables; + + U32 ptr = list; + STR<64> net_name; + do { + CSGO_CLIENT_CLASS cclass = csgo->read<CSGO_CLIENT_CLASS>( ptr ); + RECV_TABLE table = csgo->read<RECV_TABLE>( (U32)cclass.recv ); + csgo->read( (U32)table.table_name, net_name.data, 64 ); + + tables.push_back( { (U32)cclass.recv, net_name } ); + ptr = (U32)cclass.next; + } while( ptr && ptr != list ); + + return tables; +} + +inline U32 netvar_get_table( CSGO* csgo, const char* table_name ) { + static U32 list_ptr = netvar_get_classes( csgo ); + static VECTOR<NETVAR_TABLE> tables = netvar_get_tables( csgo, list_ptr ); + + for( auto& it : tables ) { + if( !strcmp( it.name.data, table_name ) ) + return it.ptr; + } + + return 0; +} + +inline I32 netvar_get_entry( CSGO* csgo, const char* name, U32 table_ptr ) { + I32 ret{}; + RECV_TABLE table = csgo->read<RECV_TABLE>( table_ptr ); + + RECV_PROP* props = (RECV_PROP*)malloc( table.prop_count * sizeof( RECV_PROP ) ); + csgo->read( (U32)table.props, props, sizeof( RECV_PROP ) * table.prop_count ); + + for( I32 i = 0; i < table.prop_count; ++i ) { + RECV_PROP* prop = &props[i]; + + if( prop->table ) { + RECV_TABLE child = csgo->read<RECV_TABLE>( (U32)prop->table ); + if( child.prop_count ) { + U32 tmp = netvar_get_entry( csgo, name, (U32)prop->table ); + if( tmp ) ret += prop->offset + tmp; + } + } + + STR<64> prop_name; + csgo->read( (U32)prop->varname, prop_name.data, 64 ); + + if( !!strcmp( prop_name.data, name ) ) + continue; + + ret += prop->offset; + break; + } + + free( props ); + return ret; +} + +inline I32 netvar_find( CSGO* csgo, const char* table_name, const char* prop ) { + I32 ret; + U32 table = netvar_get_table( csgo, table_name ); + + if( !table ) + return 0; + + ret = netvar_get_entry( csgo, prop, table ); + return ret; +} + +static void csgo_dump_classes( CSGO* csgo ) { + U32 allclasses = netvar_get_classes( csgo ); + + if( !allclasses ) + return; + + char* dump = (char*)malloc( 99999 ); + memset( dump, 0, 99999 ); + strcat( dump, "enum CSGO_CLIENT_CLASS {\n" ); + + U32 ptr = allclasses; + STR<64> net_name; + do { + CSGO_CLIENT_CLASS cclass = csgo->read<CSGO_CLIENT_CLASS>( ptr ); + csgo->read( (U64)cclass.network_name, net_name.data, 64 ); + + strcat( dump, " " ); + strcat( dump, net_name ); + strcat( dump, " = " ); + strcat( dump, "0x" ); + strcat( dump, u_num_to_string_hex( cclass.index ) ); + strcat( dump, ",\n" ); + + ptr = (U32)cclass.next; + } while( ptr && ptr != allclasses ); + + strcat( dump, "};" ); + + FILE* f = fopen( "./classes.dump", "w" ); + fwrite( dump, strlen( dump ), 1, f ); + fclose( f ); + + free( dump ); +}
\ No newline at end of file |
