summaryrefslogtreecommitdiff
path: root/src/cs2/schema.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/cs2/schema.h')
-rw-r--r--src/cs2/schema.h71
1 files changed, 67 insertions, 4 deletions
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<type>( 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<type>( 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<type>( 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<type>( 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<NETVAR_ENTRY> 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<NETVAR_ENTRY> 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<NETVAR_ENTRY> 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 );