From 9dd5ab4ebdc84b25f15b4c617ee9f52def938203 Mon Sep 17 00:00:00 2001 From: Fyren Date: Wed, 20 Oct 2010 05:10:13 -0700 Subject: [PATCH] Fix Windows entity output hooks (bug 4644, r=dvander) --- extensions/sdktools/CDetour/detours.h | 10 ++++++++++ extensions/sdktools/output.cpp | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/extensions/sdktools/CDetour/detours.h b/extensions/sdktools/CDetour/detours.h index e518502c..db42462e 100644 --- a/extensions/sdktools/CDetour/detours.h +++ b/extensions/sdktools/CDetour/detours.h @@ -110,6 +110,16 @@ public: \ ret (name##Class::* name##Class::name##_Actual)(p1type, p2type, p3type, p4type) = NULL; \ ret name##Class::name(p1type p1name, p2type p2name, p3type p3name, p4type p4name) +#define DETOUR_DECL_MEMBER8(name, ret, p1type, p1name, p2type, p2name, p3type, p3name, p4type, p4name, p5type, p5name, p6type, p6name, p7type, p7name, p8type, p8name) \ +class name##Class \ +{ \ +public: \ + ret name(p1type p1name, p2type p2name, p3type p3name, p4type p4name, p5type p5name, p6type p6name, p7type p7name, p8type p8name); \ + static ret (name##Class::* name##_Actual)(p1type, p2type, p3type, p4type, p5type, p6type, p7type, p8type); \ +}; \ +ret (name##Class::* name##Class::name##_Actual)(p1type, p2type, p3type, p4type, p5type, p6type, p7type, p8type) = NULL; \ +ret name##Class::name(p1type p1name, p2type p2name, p3type p3name, p4type p4name, p5type p5name, p6type p6name, p7type p7name, p8type p8name) + #define GET_MEMBER_CALLBACK(name) (void *)GetCodeAddress(&name##Class::name) #define GET_MEMBER_TRAMPOLINE(name) (void **)(&name##Class::name##_Actual) diff --git a/extensions/sdktools/output.cpp b/extensions/sdktools/output.cpp index 0aa55c3b..c5308550 100644 --- a/extensions/sdktools/output.cpp +++ b/extensions/sdktools/output.cpp @@ -74,11 +74,19 @@ bool EntityOutputManager::IsEnabled() return enabled; } +#ifdef PLATFORM_WINDOWS +DETOUR_DECL_MEMBER8(FireOutput, void, int, what, int, the, int, hell, int, msvc, void *, variant_t, CBaseEntity *, pActivator, CBaseEntity *, pCaller, float, fDelay) +{ + g_OutputManager.FireEventDetour((void *)this, pActivator, pCaller, fDelay); + DETOUR_MEMBER_CALL(FireOutput)(what, the, hell, msvc, variant_t, pActivator, pCaller, fDelay); +} +#else DETOUR_DECL_MEMBER4(FireOutput, void, void *, variant_t, CBaseEntity *, pActivator, CBaseEntity *, pCaller, float, fDelay) { g_OutputManager.FireEventDetour((void *)this, pActivator, pCaller, fDelay); DETOUR_MEMBER_CALL(FireOutput)(variant_t, pActivator, pCaller, fDelay); } +#endif bool EntityOutputManager::CreateFireEventDetour() {