2023-02-19 21:54:53 +01:00
# pragma once
# include "../defines.hpp"
# include <unordered_map>
# include <any>
2023-02-27 13:32:38 +01:00
# include <array>
2023-02-19 21:54:53 +01:00
# include <list>
2023-02-27 13:32:38 +01:00
# include <csetjmp>
# include "../plugins/PluginAPI.hpp"
2023-02-19 21:54:53 +01:00
// global typedef for hooked functions. Passes itself as a ptr when called, and `data` additionally.
2023-10-21 15:52:43 +02:00
typedef std : : function < void ( void * , SCallbackInfo & info , std : : any data ) > HOOK_CALLBACK_FN ;
2023-02-19 21:54:53 +01:00
2023-02-27 13:32:38 +01:00
struct SCallbackFNPtr {
2024-04-20 21:16:42 +02:00
std : : weak_ptr < HOOK_CALLBACK_FN > fn ;
HANDLE handle = nullptr ;
2023-02-27 13:32:38 +01:00
} ;
2023-02-19 21:54:53 +01:00
# define EMIT_HOOK_EVENT(name, param) \
{ \
static auto * const PEVENTVEC = g_pHookSystem - > getVecForEvent ( name ) ; \
2023-10-21 15:52:43 +02:00
SCallbackInfo info ; \
g_pHookSystem - > emit ( PEVENTVEC , info , param ) ; \
}
# define EMIT_HOOK_EVENT_CANCELLABLE(name, param) \
{ \
static auto * const PEVENTVEC = g_pHookSystem - > getVecForEvent ( name ) ; \
SCallbackInfo info ; \
g_pHookSystem - > emit ( PEVENTVEC , info , param ) ; \
if ( info . cancelled ) \
return ; \
2023-02-19 21:54:53 +01:00
}
class CHookSystemManager {
public :
CHookSystemManager ( ) ;
2024-04-20 21:16:42 +02:00
// returns the pointer to the function.
// losing this pointer (letting it get destroyed)
// will equal to unregistering the callback.
[[nodiscard("Losing this pointer instantly unregisters the callback")]] std : : shared_ptr < HOOK_CALLBACK_FN > hookDynamic ( const std : : string & event , HOOK_CALLBACK_FN fn ,
HANDLE handle = nullptr ) ;
void unhook ( std : : shared_ptr < HOOK_CALLBACK_FN > fn ) ;
2023-02-27 13:32:38 +01:00
2024-04-20 21:16:42 +02:00
void emit ( std : : vector < SCallbackFNPtr > * const callbacks , SCallbackInfo & info , std : : any data = 0 ) ;
2023-02-27 13:32:38 +01:00
std : : vector < SCallbackFNPtr > * getVecForEvent ( const std : : string & event ) ;
2023-02-19 21:54:53 +01:00
2023-02-27 13:32:38 +01:00
bool m_bCurrentEventPlugin = false ;
jmp_buf m_jbHookFaultJumpBuf ;
2023-02-19 21:54:53 +01:00
private :
2024-04-20 21:16:42 +02:00
std : : unordered_map < std : : string , std : : vector < SCallbackFNPtr > > m_mRegisteredHooks ;
2023-02-19 21:54:53 +01:00
} ;
inline std : : unique_ptr < CHookSystemManager > g_pHookSystem ;