You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
2.6 KiB
C++

//====== Copyright <20>, Valve Corporation, All rights reserved. =======
//
// Purpose: Additional shared object cache functionality for the GC
//
//=============================================================================
#ifndef SCHEMASYSTEM_H
#define SCHEMASYSTEM_H
#ifdef _WIN32
#pragma once
#endif
#include <cstdint>
#include <type_traits>
#if defined(_WIN32)
#define FASTCALL __fastcall
#define THISCALL __thiscall
#else
#define FASTCALL __attribute__((fastcall))
#define THISCALL
#define strtok_s strtok_r
#endif
#define CALL_VIRTUAL(retType, idx, ...) \
vmt::CallVirtual<retType>(idx, __VA_ARGS__)
namespace vmt {
template <typename T = void*>
inline T GetVMethod(uint32_t uIndex, void* pClass) {
void** pVTable = *static_cast<void***>(pClass);
return reinterpret_cast<T>(pVTable[uIndex]);
}
template <typename T, typename... Args>
inline T CallVirtual(uint32_t uIndex, void* pClass, Args... args) {
auto pFunc = GetVMethod<T(THISCALL*)(void*, Args...)>(uIndex, pClass);
return pFunc(pClass, args...);
}
} // namespace vmt
struct SchemaClassFieldData_t
{
const char* m_pszName; // 0x0000
void* m_pSchemaType; // 0x0008
int32_t m_iOffset; // 0x0010
int32_t m_iMetaDataSize; // 0x0014
void* m_pMetaData; // 0x0018
};
struct SchemaClassInfoData_t
{
char pad_0x0000[0x8]; // 0x0000
const char* m_pszName; // 0x0008
const char* m_pszModule; // 0x0010
int m_iSize; // 0x0018
int16_t m_iFieldsCount; // 0x001C
int16_t m_iStaticSize; // 0x001E
int16_t m_iMetadataSize; // 0x0020
int16_t m_iUnk1; // 0x0022
int16_t m_iUnk2; // 0x0024
int16_t m_iUnk3; // 0x0026
SchemaClassFieldData_t* m_pFieldsData; // 0x0028
};
class CSchemaSystemTypeScope
{
public:
void FindDeclaredClass(SchemaClassInfoData_t*& pClassInfo, const char* pszClassName);
};
class CSchemaSystem
{
public:
CSchemaSystemTypeScope* FindTypeScopeForModule(const char* szpModuleName);
CSchemaSystemTypeScope* GetServerTypeScope();
int32_t GetServerOffset(const char* pszClassName, const char* pszPropName);
};
extern CSchemaSystem* g_pCSchemaSystem;
#define SCHEMA_FIELD(type, className, propName) \
std::add_lvalue_reference_t<type> propName() \
{ \
static const int32_t offset = g_pCSchemaSystem->GetServerOffset(#className, #propName); \
return *reinterpret_cast<std::add_pointer_t<type>>(reinterpret_cast<intptr_t>(this) + offset); \
}
#endif //SCHEMASYSTEM_H