#pragma once #include #include "..\fnv1a\fnv1a.h" #include "..\memory\vfunc\vfunc.h" #include "..\math\utlmemory\utlmemory.h" #include "..\math\utlvector\utlvector.h" #include "..\..\..\cs2\datatypes\schema\ISchemaClass\ISchemaClass.h" #define SCHEMA_ADD_OFFSET(TYPE, NAME, OFFSET) \ [[nodiscard]] inline std::add_lvalue_reference_t NAME() \ { \ static const std::uint32_t uOffset = OFFSET; \ return *reinterpret_cast>(reinterpret_cast(this) + (uOffset)); \ } #define SCHEMA_ADD_POFFSET(TYPE, NAME, OFFSET) \ [[nodiscard]] inline std::add_pointer_t NAME() \ { \ const static std::uint32_t uOffset = OFFSET; \ return reinterpret_cast>(reinterpret_cast(this) + (uOffset)); \ } #define schema(TYPE, NAME, FIELD) SCHEMA_ADD_OFFSET(TYPE, NAME, SchemaFinder::Get(hash_32_fnv1a_const(FIELD)) + 0u) #define schema_pfield(TYPE, NAME, FIELD, ADDITIONAL) SCHEMA_ADD_POFFSET(TYPE, NAME, SchemaFinder::Get(hash_32_fnv1a_const(FIELD)) + ADDITIONAL) class Schema { public: bool init( const char* module_name, int module_type); ISchemaSystem* schema_system = nullptr; }; namespace SchemaFinder { [[nodiscard]] std::uint32_t Get(const uint32_t hashed); [[nodiscard]] std::uint32_t GetExternal(const char* moduleName, const uint32_t HashedClass, const uint32_t HashedFieldName); }