Add hooks header
With macros for declaring hooks in header, in code, actually hooking and calling the originals Also with CL_CreateMove hooked
This commit is contained in:
parent
9b20d7e71f
commit
ef8504cdc9
|
@ -0,0 +1,65 @@
|
||||||
|
|
||||||
|
#ifndef _HOOKS_H
|
||||||
|
#define _HOOKS_H
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "sdk.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Table of prefixes:
|
||||||
|
* prefix | meaning
|
||||||
|
* -------+----------------------------
|
||||||
|
* *_t | typedef (function type)
|
||||||
|
* h_* | hook function (ours)
|
||||||
|
* ho_* | hook original (ptr to orig)
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* DECL_HOOK_EXTERN: Version for the header. typedef's the function pointer with
|
||||||
|
* the return type, name and args. Example:
|
||||||
|
*
|
||||||
|
* DECL_HOOK_EXTERN(int, test, double, double);
|
||||||
|
* typedef int (*test_t)(double, double);
|
||||||
|
* extern test_t ho_test; // Original
|
||||||
|
* int h_test(double, double); // Our func
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* DECL_HOOK: Macro for declaring the global function pointer for the original
|
||||||
|
* in the source file. Example:
|
||||||
|
*
|
||||||
|
* DECL_HOOK(test);
|
||||||
|
* test_t ho_test = NULL; // Original
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* HOOK: Macro for storing the original function ptr of an interface and hooking
|
||||||
|
* our own. Example:
|
||||||
|
*
|
||||||
|
* HOOK(gp_client, CL_CreateMove);
|
||||||
|
* ho_CL_CreateMove = gp_client->CL_CreateMove; // Original
|
||||||
|
* gp_client->CL_CreateMove = h_CL_CreateMove; // Our func
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* ORIGINAL: Macro for calling the original function. Example:
|
||||||
|
*
|
||||||
|
* ORIGINAL(CL_CreateMove, frametime, cmd, active);
|
||||||
|
* ho_CL_CreateMove(frametime, cmd, active); // Original
|
||||||
|
*/
|
||||||
|
#define DECL_HOOK_EXTERN(type, name, ...) \
|
||||||
|
typedef type (*name##_t)(__VA_ARGS__); \
|
||||||
|
extern name##_t ho_##name; \
|
||||||
|
type h_##name(__VA_ARGS__);
|
||||||
|
|
||||||
|
#define DECL_HOOK(name) name##_t ho_##name = NULL;
|
||||||
|
|
||||||
|
#define HOOK(interface, name) \
|
||||||
|
ho_##name = interface->name; \
|
||||||
|
interface->name = h_##name;
|
||||||
|
|
||||||
|
#define ORIGINAL(name, ...) ho_##name(__VA_ARGS__);
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
bool hooks_init(void);
|
||||||
|
DECL_HOOK_EXTERN(void, CL_CreateMove, float, usercmd_t*, int);
|
||||||
|
|
||||||
|
#endif /* _HOOKS_H */
|
Loading…
Reference in New Issue