diff --git a/core/PlayerManager.cpp b/core/PlayerManager.cpp index 3feb79478e..1d541daa36 100644 --- a/core/PlayerManager.cpp +++ b/core/PlayerManager.cpp @@ -59,6 +59,8 @@ bool g_OnMapStarted = false; IForward *PreAdminCheck = NULL; IForward *PostAdminCheck = NULL; IForward *PostAdminFilter = NULL; +IForward *ServerEnterHibernation = NULL; +IForward *ServerExitHibernation = NULL; const unsigned int *g_NumPlayersToAuth = NULL; int lifestate_offset = -1; @@ -203,6 +205,8 @@ void PlayerManager::OnSourceModAllInitialized() PreAdminCheck = forwardsys->CreateForward("OnClientPreAdminCheck", ET_Event, 1, p1); PostAdminCheck = forwardsys->CreateForward("OnClientPostAdminCheck", ET_Ignore, 1, p1); PostAdminFilter = forwardsys->CreateForward("OnClientPostAdminFilter", ET_Ignore, 1, p1); + ServerEnterHibernation = forwardsys->CreateForward("OnServerEnterHibernation", ET_Ignore, 0, NULL); + ServerExitHibernation = forwardsys->CreateForward("OnServerExitHibernation", ET_Ignore, 0, NULL); m_bIsListenServer = !engine->IsDedicatedServer(); m_ListenClient = 0; @@ -254,6 +258,8 @@ void PlayerManager::OnSourceModShutdown() forwardsys->ReleaseForward(PreAdminCheck); forwardsys->ReleaseForward(PostAdminCheck); forwardsys->ReleaseForward(PostAdminFilter); + forwardsys->ReleaseForward(ServerEnterHibernation); + forwardsys->ReleaseForward(ServerExitHibernation); delete [] m_Players; @@ -778,6 +784,11 @@ void PlayerManager::OnSourceModLevelEnd() void PlayerManager::OnServerHibernationUpdate(bool bHibernating) { + cell_t res; + if (bHibernating) + ServerEnterHibernation->Execute(&res); + else + ServerExitHibernation->Execute(&res); /* If bots were added at map start, but not fully inited before hibernation, there will * be no OnClientDisconnect for them, despite them getting booted right before this. */ diff --git a/plugins/include/clients.inc b/plugins/include/clients.inc index d88262f1c1..51ed0bb1ef 100644 --- a/plugins/include/clients.inc +++ b/plugins/include/clients.inc @@ -215,6 +215,18 @@ forward Action OnClientPreAdminCheck(int client); */ forward void OnClientPostAdminFilter(int client); +/** + * Called directly before the server enters hibernation. + * This is your last chance to do anything in the plugin before + * hibernation occurs, as SV_Frame will no longer be called. + */ +forward void OnServerEnterHibernation(); + +/** + * Called directly before the server leaves hibernation. + */ +forward void OnServerExitHibernation(); + /** * Called once a client is authorized and fully in-game, and * after all post-connection authorizations have been performed.