CEntity.cpp
PHP Code:
DECLARE_DETOUR(SetAbsOrigin, CEntity);
DECLARE_DEFAULTHANDLER_DETOUR_void(CEntity, SetAbsOrigin, (const Vector& absOrigin), (absOrigin));
CEntity.h
PHP Code:
void SetAbsOrigin(const Vector& absOrigin);
DECLARE_DEFAULTHEADER_DETOUR(SetAbsOrigin, void, (const Vector& absOrigin));
-----------------------------------------------------------------------------------------------
DECLARE_DETOUR:
PHP Code:
#define DECLARE_DETOUR(name, cl) \
class name##cl##DetourTracker : public IDetourTracker \
{ \
public: \
void AddHook() \
{ \
void *callback = (void *)GetCodeAddress(&cl::Internal##name); \
void **trampoline = (void **)(&cl::name##_Actual); \
m_Detour = CDetourManager::CreateDetour(callback, trampoline, #name); \
if (m_Detour) \
{ \
m_Detour->EnableDetour(); \
} \
} \
void RemoveHook() \
{ \
if (m_Detour) \
{ \
m_Detour->Destroy(); \
m_Detour = NULL; \
} \
} \
}; \
name##cl##DetourTracker name##cl##DetourTrackerObj;
DECLARE_DEFAULTHANDLER_DETOUR_void:
PHP Code:
#define DECLARE_DEFAULTHANDLER_DETOUR_void(type, name, params, paramscall) \
void type::name params \
{ \
(((type *)BaseEntity())->*name##_Actual) paramscall; \
} \
void type::Internal##name params \
{ \
type *pEnt = (type *)CEntity::Instance((CBaseEntity *)this); \
if (pEnt) \
pEnt->name paramscall; \
else \
DETOUR_MEMBER_CALL(name) paramscall; \
} \
void (type::* type::name##_Actual) params = NULL; \
DECLARE_DEFAULTHEADER_DETOUR:
PHP Code:
#define DECLARE_DEFAULTHEADER_DETOUR(name, ret, params) \
ret Internal##name params; \
static ret (ThisClass::* name##_Actual) params;
I'm looking for implementation of this macroses for static functions, like:
PHP Code:
static int PrecacheModel( const char *name );