Remove WasRestartRequested Hook when pGameServer is destroyed.

This commit is contained in:
KyleSanderson
2014-01-29 02:34:13 -07:00
parent 9b9e3d98f2
commit aef58bb214
3 changed files with 32 additions and 15 deletions
+7 -3
View File
@@ -21,15 +21,19 @@
DETOUR_DECL_STATIC0(SteamAPIShutdown, void) DETOUR_DECL_STATIC0(SteamAPIShutdown, void)
{ {
DETOUR_STATIC_CALL(SteamAPIShutdown)(); /* We're not a monster. */ if (g_SteamWorks.pSWGameServer != NULL)
if (g_SteamWorks.pSWGameServer == NULL)
{ {
return; if (g_SteamWorks.pGSHooks != NULL)
{
g_SteamWorks.pGSHooks->RemoveHooks(g_SteamWorks.pSWGameServer->GetGameServer(), false);
} }
g_SteamWorks.pSWGameServer->Reset(); g_SteamWorks.pSWGameServer->Reset();
} }
DETOUR_STATIC_CALL(SteamAPIShutdown)(); /* We're not a monster. */
}
SteamWorksGSDetours::SteamWorksGSDetours() SteamWorksGSDetours::SteamWorksGSDetours()
{ {
#if defined POSIX #if defined POSIX
+21 -8
View File
@@ -19,6 +19,13 @@
#include "swgshooks.h" #include "swgshooks.h"
enum
{
eUnhooked = 0,
eHooking,
eHooked
};
SH_DECL_HOOK0(ISteamGameServer, WasRestartRequested, SH_NOATTRIB, 0, bool); /* From SteamTools. */ SH_DECL_HOOK0(ISteamGameServer, WasRestartRequested, SH_NOATTRIB, 0, bool); /* From SteamTools. */
static ISteamGameServer *GetGameServerPointer() static ISteamGameServer *GetGameServerPointer()
@@ -28,7 +35,7 @@ static ISteamGameServer *GetGameServerPointer()
SteamWorksGSHooks::SteamWorksGSHooks() SteamWorksGSHooks::SteamWorksGSHooks()
{ {
this->bHooked = false; this->uHooked = eHooking;
this->pFORR = forwards->CreateForward("SteamWorks_RestartRequested", ET_Hook, 0, NULL); this->pFORR = forwards->CreateForward("SteamWorks_RestartRequested", ET_Hook, 0, NULL);
smutils->AddGameFrameHook(OurGameFrameHook); smutils->AddGameFrameHook(OurGameFrameHook);
@@ -36,9 +43,8 @@ SteamWorksGSHooks::SteamWorksGSHooks()
SteamWorksGSHooks::~SteamWorksGSHooks() SteamWorksGSHooks::~SteamWorksGSHooks()
{ {
this->RemoveHooks(GetGameServerPointer(), true);
smutils->RemoveGameFrameHook(OurGameFrameHook); smutils->RemoveGameFrameHook(OurGameFrameHook);
this->RemoveHooks(GetGameServerPointer());
forwards->ReleaseForward(this->pFORR); forwards->ReleaseForward(this->pFORR);
} }
@@ -58,24 +64,31 @@ bool SteamWorksGSHooks::WasRestartRequested(void) /* Mimic SteamTools. */
void SteamWorksGSHooks::AddHooks(ISteamGameServer *pGameServer) void SteamWorksGSHooks::AddHooks(ISteamGameServer *pGameServer)
{ {
if (this->bHooked == true || pGameServer == NULL) if (this->uHooked == eHooked || pGameServer == NULL)
{ {
return; return;
} }
this->bHooked = true; this->uHooked = eHooked;
SH_ADD_HOOK(ISteamGameServer, WasRestartRequested, pGameServer, SH_MEMBER(this, &SteamWorksGSHooks::WasRestartRequested), false); SH_ADD_HOOK(ISteamGameServer, WasRestartRequested, pGameServer, SH_MEMBER(this, &SteamWorksGSHooks::WasRestartRequested), false);
} }
void SteamWorksGSHooks::RemoveHooks(ISteamGameServer *pGameServer) void SteamWorksGSHooks::RemoveHooks(ISteamGameServer *pGameServer, bool destroyed)
{ {
if (this->bHooked == false || pGameServer == NULL) if (this->uHooked != eHooked || pGameServer == NULL)
{ {
return; return;
} }
this->bHooked = false;
SH_REMOVE_HOOK(ISteamGameServer, WasRestartRequested, pGameServer, SH_MEMBER(this, &SteamWorksGSHooks::WasRestartRequested), false); SH_REMOVE_HOOK(ISteamGameServer, WasRestartRequested, pGameServer, SH_MEMBER(this, &SteamWorksGSHooks::WasRestartRequested), false);
if (destroyed)
{
this->uHooked = eUnhooked;
return;
}
this->uHooked = eHooking;
smutils->AddGameFrameHook(OurGameFrameHook);
} }
void OurGameFrameHook(bool simulating) /* What we do for SDK independence. */ void OurGameFrameHook(bool simulating) /* What we do for SDK independence. */
+2 -2
View File
@@ -31,14 +31,14 @@ class SteamWorksGSHooks
public: public:
void AddHooks(ISteamGameServer *pGameServer); void AddHooks(ISteamGameServer *pGameServer);
void RemoveHooks(ISteamGameServer *pGameServer); void RemoveHooks(ISteamGameServer *pGameServer, bool destroyed = false);
public: public:
bool WasRestartRequested(void); bool WasRestartRequested(void);
private: private:
IForward *pFORR; /* On Restart Requested. */ IForward *pFORR; /* On Restart Requested. */
bool bHooked; unsigned char uHooked;
}; };
void OurGameFrameHook(bool simulating); void OurGameFrameHook(bool simulating);