diff --git a/sourcemm/CPlugin.cpp b/sourcemm/CPlugin.cpp index decf89a..08298cb 100644 --- a/sourcemm/CPlugin.cpp +++ b/sourcemm/CPlugin.cpp @@ -24,6 +24,7 @@ CPluginManager g_PluginMngr; CPluginManager::CPluginManager() { m_LastId = Pl_MinId; + m_AllLoaded = false; } CPluginManager::~CPluginManager() @@ -84,6 +85,24 @@ CPluginManager::CPlugin *CPluginManager::FindById(PluginId id) return NULL; } +void CPluginManager::SetAllLoaded() +{ + m_AllLoaded = true; + PluginIter i; + + for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) + { + if ( (*i) && (*i)->m_Status == Pl_Running && (*i)->m_API ) + { + //004 is when we added this callback + if ( (*i)->m_API->GetApiVersion() < 004 ) + { + (*i)->m_API->AllPluginsLoaded(); + } + } + } +} + bool CPluginManager::Pause(PluginId id, char *error, size_t maxlen) { CPlugin *pl = FindById(id); @@ -179,6 +198,12 @@ CPluginManager::CPlugin *CPluginManager::_Load(const char *file, PluginId source if (pl->m_API->Load(pl->m_Id, static_cast(&g_SmmAPI), &(pl->fac_list), error, maxlen)) { pl->m_Status = Pl_Running; + if (m_AllLoaded) + { + //API 004 is when we added this callback + if (pl->m_API->GetApiVersion() >= 4) + pl->m_API->AllPluginsLoaded(); + } } else { pl->m_Status = Pl_Refused; } diff --git a/sourcemm/CPlugin.h b/sourcemm/CPlugin.h index 6471fff..24e6f17 100644 --- a/sourcemm/CPlugin.h +++ b/sourcemm/CPlugin.h @@ -47,6 +47,7 @@ namespace SourceMM public: CPluginManager(); ~CPluginManager(); + void SetAllLoaded(); public: PluginId Load(const char *file, PluginId source, bool &already, char *error, size_t maxlen); bool Unload(PluginId id, bool force, char *error, size_t maxlen); @@ -76,6 +77,7 @@ namespace SourceMM private: PluginId m_LastId; std::list m_Plugins; + bool m_AllLoaded; }; }; diff --git a/sourcemm/ISmmPlugin.h b/sourcemm/ISmmPlugin.h index c4cc2a9..23428b7 100644 --- a/sourcemm/ISmmPlugin.h +++ b/sourcemm/ISmmPlugin.h @@ -20,7 +20,7 @@ #include #include "ISmmAPI.h" -#define PLAPI_VERSION 003 +#define PLAPI_VERSION 004 #define PLAPI_NAME "ISmmPlugin" struct factories @@ -83,6 +83,11 @@ public: virtual const char *GetVersion() =0; virtual const char *GetDate() =0; virtual const char *GetLogTag() =0; +public: + /** + * @brief Called when all plugins have been loaded - API version 4 + */ + virtual void AllPluginsLoaded() =0; }; #define PL_EXPOSURE CreateInterface diff --git a/sourcemm/sourcemm.cpp b/sourcemm/sourcemm.cpp index f22c46d..8f619a1 100644 --- a/sourcemm/sourcemm.cpp +++ b/sourcemm/sourcemm.cpp @@ -229,6 +229,9 @@ bool CServerGameDLL::DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn LoadPluginsFromFile(full_path); + //All plugins are now loaded. + g_PluginMngr.SetAllLoaded(); + return true; } } @@ -251,7 +254,7 @@ bool CServerGameDLL::DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn if (fdwReason == DLL_PROCESS_DETACH) { if (g_GameDll.lib && g_GameDll.loaded) - //dlclose(g_GameDll.lib); + dlclose(g_GameDll.lib); memset(&g_GameDll, 0, sizeof(GameDllInfo)); } return TRUE;