#pragma once #include "../defines.hpp" #include #include #include #include #include #include "../plugins/PluginAPI.hpp" // global typedef for hooked functions. Passes itself as a ptr when called, and `data` additionally. typedef std::function HOOK_CALLBACK_FN; struct SCallbackFNPtr { std::weak_ptr fn; HANDLE handle = nullptr; }; #define EMIT_HOOK_EVENT(name, param) \ { \ static auto* const PEVENTVEC = g_pHookSystem->getVecForEvent(name); \ 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; \ } class CHookSystemManager { public: CHookSystemManager(); // 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 hookDynamic(const std::string& event, HOOK_CALLBACK_FN fn, HANDLE handle = nullptr); void unhook(std::shared_ptr fn); void emit(std::vector* const callbacks, SCallbackInfo& info, std::any data = 0); std::vector* getVecForEvent(const std::string& event); bool m_bCurrentEventPlugin = false; jmp_buf m_jbHookFaultJumpBuf; private: std::unordered_map> m_mRegisteredHooks; }; inline std::unique_ptr g_pHookSystem;