From 4c8b52fc94c04c4b3d338c2501971ae348f5b3e5 Mon Sep 17 00:00:00 2001 From: navewindre Date: Tue, 16 Jul 2024 07:19:43 +0200 Subject: =?UTF-8?q?=E3=82=84=E3=83=BC=E3=83=BC=E3=83=BC=E3=83=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cs2/schema.h | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 67 insertions(+), 4 deletions(-) (limited to 'src/cs2/schema.h') diff --git a/src/cs2/schema.h b/src/cs2/schema.h index f99683d..1c55906 100644 --- a/src/cs2/schema.h +++ b/src/cs2/schema.h @@ -3,6 +3,54 @@ #include "../util.h" #include "sdk.h" +#define NETVAR(type, name, classn) \ +type name() { \ + static I32 off = schema_get_offset( cs, classn, #name ); \ + assert( !!off ); \ + return cs->read( ptr + off ); \ +} \ +void name( type val ) { \ + static I32 off = schema_get_offset( cs, classn, #name ); \ + assert( !!off ); \ + cs->write( ptr + off, val ); \ +} \ + +#define NETVARO(type, name, classn, off1) \ +type name() { \ + static I32 off = schema_get_offset( cs, classn, #name ); \ + assert( !!off ); \ + return cs->read( ptr + off + off1 ); \ +} \ +void name( type val ) { \ + static I32 off = schema_get_offset( cs, classn, #name ); \ + cs->write( ptr + off + off1, val ); \ +} \ + +#define NETVAR_MOD(type, name, classn, mod) \ +type name() { \ + static I32 off = schema_get_offset( cs, classn, #name, mod ); \ + assert( !!off ); \ + return cs->read( ptr + off ); \ +} \ +void name( type val ) { \ + static I32 off = schema_get_offset( cs, classn, #name, mod ); \ + assert( !!off ); \ + cs->write( ptr + off, val ); \ +} \ + +#define NETVARO_MOD(type, name, classn, off1, mod) \ +type name() { \ + static I32 off = schema_get_offset( cs, classn, #name, mod ); \ + assert( !!off ); \ + return cs->read( ptr + off + off1 ) mod; \ +} \ +void name( type val ) { \ + static I32 off = schema_get_offset( cs, classn, #name, mod ); \ + assert( !!off ); \ + cs->write( ptr + off + off1, val mod ); \ +} \ + + inline CS2_SCHEMA_FIELD* schema_class_get_fields( CS2* p, CS2_SCHEMA_CLASS* schclass ) { if( !schclass->fields || !schclass->num_fields ) @@ -75,8 +123,8 @@ static VECTOR schema_get_all( CS2* p ) { for( U32 j = 0; j < scope->num_classes; ++j ) { CS2_SCHEMA_CLASS* schclass = &classes[j]; - STR<128> classname{}; - p->read( schclass->name, classname.data, 128 ); + STR<256> classname{}; + p->read( schclass->name, classname.data, 256 ); if( classname.data[0] == 0 || !strlen( classname ) ) continue; @@ -93,8 +141,9 @@ static VECTOR schema_get_all( CS2* p ) { STR<256> buf; p->read( field->name, buf.data, 256 ); entry.prop = buf; - entry.clientclass = buf; - entry.scope = scope->name; + entry.clientclass = classname; + entry.scope = scope->name; + entry.offset = (I32)field->offset; entries.push_back( entry ); } @@ -108,6 +157,20 @@ static VECTOR schema_get_all( CS2* p ) { return entries; } +static I32 schema_get_offset( CS2* p, const char* classname, const char* prop, const char* scope = nullptr ) { + if( p->netvars.empty() ) + p->netvars = schema_get_all( p ); + + for( auto& it : p->netvars ) { + if( !strcmp( it.clientclass, classname ) && !strcmp( it.prop, prop ) ) { + if( !scope || !strcmp( it.scope, scope ) ) + return it.offset; + } + } + + return -1; +} + static void schema_dump_to_file( CS2* p ) { CS2_SCHEMA schema = schema_read_iface( p, p->iface.schema.ptr ); -- cgit v1.2.3