diff -r 8cdfcff5ee73 -r b668cbd49c35 core/sourcemod.cpp --- a/core/sourcemod.cpp Fri Jan 19 23:30:22 2007 +0000 +++ b/core/sourcemod.cpp Sat Jan 20 02:12:53 2007 +0000 @@ -10,6 +10,7 @@ #include "ExtensionSys.h" SH_DECL_HOOK6(IServerGameDLL, LevelInit, SH_NOATTRIB, false, bool, const char *, const char *, const char *, const char *, bool, bool); +SH_DECL_HOOK0_void(IServerGameDLL, LevelShutdown, SH_NOATTRIB, false); SourcePawnEngine g_SourcePawn; SourceModBase g_SourceMod; @@ -39,6 +40,7 @@ SourceModBase::SourceModBase() { m_IsMapLoading = false; + m_ExecPluginReload = false; } bool SourceModBase::InitializeSourceMod(char *error, size_t err_max, bool late) @@ -131,6 +133,7 @@ { /* First initialize the global hooks we need */ SH_ADD_HOOK_MEMFUNC(IServerGameDLL, LevelInit, gamedll, this, &SourceModBase::LevelInit, false); + SH_ADD_HOOK_MEMFUNC(IServerGameDLL, LevelShutdown, gamedll, this, &SourceModBase::LevelShutdown, false); /* Notify! */ SMGlobalClass *pBase = SMGlobalClass::head; @@ -158,6 +161,7 @@ bool SourceModBase::LevelInit(char const *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background) { m_IsMapLoading = true; + m_ExecPluginReload = true; g_Logger.MapChange(pMapName); @@ -168,6 +172,15 @@ RETURN_META_VALUE(MRES_IGNORED, true); } +void SourceModBase::LevelShutdown() +{ + if (m_ExecPluginReload) + { + g_PluginSys.ReloadOrUnloadPlugins(); + m_ExecPluginReload = false; + } +} + bool SourceModBase::IsMapLoading() { return m_IsMapLoading; @@ -241,6 +254,9 @@ pBase = pBase->m_pGlobalClassNext; } + SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, LevelInit, gamedll, this, &SourceModBase::LevelInit, false); + SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, LevelShutdown, gamedll, this, &SourceModBase::LevelShutdown, false); + /* Rest In Peace */ ShutdownJIT(); }