1
0
mirror of https://github.com/alliedmodders/metamod-source.git synced 2025-02-26 19:54:14 +01:00

fixed bugs related to vsplistener and vsp loading mechanism

--HG--
branch : sourcemm-1.4.3
extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/sourcemm-1.4.3%40599
This commit is contained in:
David Anderson 2007-12-23 09:07:48 +00:00
parent bcc08f184b
commit 90fb451242
6 changed files with 78 additions and 36 deletions

View File

@ -12,6 +12,7 @@
#include "CSmmAPI.h" #include "CSmmAPI.h"
#include "sourcemm.h" #include "sourcemm.h"
#include "concommands.h" #include "concommands.h"
#include "vsp_listener.h"
/** /**
* @brief Implements functions from CPlugin.h * @brief Implements functions from CPlugin.h
@ -22,14 +23,14 @@ using namespace SourceMM;
#define ITER_PLEVENT(evn, plid) \ #define ITER_PLEVENT(evn, plid) \
CPluginManager::CPlugin *_Xpl; \ CPluginManager::CPlugin *_Xpl; \
SourceHook::List<IMetamodListener *>::iterator event; \ SourceHook::List<CPluginEventHandler>::iterator event; \
IMetamodListener *api; \ IMetamodListener *api; \
for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \
_Xpl = (*iter); \ _Xpl = (*iter); \
if (_Xpl->m_Id == plid) \ if (_Xpl->m_Id == plid) \
continue; \ continue; \
for (event=_Xpl->m_Events.begin(); event!=_Xpl->m_Events.end(); event++) { \ for (event=_Xpl->m_Events.begin(); event!=_Xpl->m_Events.end(); event++) { \
api = (*event); \ api = (*event).event; \
api->evn(plid); \ api->evn(plid); \
} \ } \
} }
@ -182,6 +183,38 @@ void CPluginManager::SetAllLoaded()
} }
} }
void CPluginManager::SetVSPAsLoaded()
{
PluginIter i;
CPlugin *pPlugin;
SourceHook::List<CPluginEventHandler>::iterator event;
for (i = m_Plugins.begin(); i != m_Plugins.end(); i++)
{
pPlugin = (*i);
if (pPlugin->m_Status < Pl_Paused)
{
continue;
}
/* Only valid for plugins >= 10 (v1:5, SourceMM 1.4) */
if (pPlugin->m_API->GetApiVersion() < 10)
{
continue;
}
for (event = pPlugin->m_Events.begin();
event != pPlugin->m_Events.end();
event++)
{
if (!(*event).got_vsp)
{
continue;
}
(*event).got_vsp = true;
(*event).event->OnVSPListening(&g_VspListener);
}
}
}
bool CPluginManager::Pause(PluginId id, char *error, size_t maxlen) bool CPluginManager::Pause(PluginId id, char *error, size_t maxlen)
{ {
CPlugin *pl = FindById(id); CPlugin *pl = FindById(id);
@ -373,6 +406,21 @@ CPluginManager::CPlugin *CPluginManager::_Load(const char *file, PluginId source
//if (pl->m_API->GetApiVersion() >= 4) //if (pl->m_API->GetApiVersion() >= 4)
pl->m_API->AllPluginsLoaded(); pl->m_API->AllPluginsLoaded();
} }
if (g_VspListener.IsRootLoadMethod())
{
SourceHook::List<CPluginEventHandler>::iterator event;
for (event = pl->m_Events.begin();
event != pl->m_Events.end();
event++)
{
if ((*event).got_vsp)
{
continue;
}
(*event).got_vsp = true;
(*event).event->OnVSPListening(&g_VspListener);
}
}
} else { } else {
pl->m_Status = Pl_Refused; pl->m_Status = Pl_Refused;
} }

View File

@ -50,6 +50,13 @@ namespace SourceMM
SourceHook::String alias; SourceHook::String alias;
SourceHook::String value; SourceHook::String value;
}; };
struct CPluginEventHandler
{
bool got_vsp;
IMetamodListener *event;
};
/** /**
* @brief Implements Plugin Manager API * @brief Implements Plugin Manager API
*/ */
@ -72,7 +79,7 @@ namespace SourceMM
HINSTANCE m_Lib; HINSTANCE m_Lib;
SourceHook::List<ConCommandBase *> m_Cvars; SourceHook::List<ConCommandBase *> m_Cvars;
SourceHook::List<ConCommandBase *> m_Cmds; SourceHook::List<ConCommandBase *> m_Cmds;
SourceHook::List<IMetamodListener *> m_Events; SourceHook::List<CPluginEventHandler> m_Events;
}; };
public: public:
CPluginManager(); CPluginManager();
@ -123,6 +130,8 @@ namespace SourceMM
//Internal iterators //Internal iterators
SourceHook::List<SourceMM::CPluginManager::CPlugin *>::iterator _begin(); SourceHook::List<SourceMM::CPluginManager::CPlugin *>::iterator _begin();
SourceHook::List<SourceMM::CPluginManager::CPlugin *>::iterator _end(); SourceHook::List<SourceMM::CPluginManager::CPlugin *>::iterator _end();
void SetVSPAsLoaded();
private: private:
//These are identical internal functions for the wrappers above. //These are identical internal functions for the wrappers above.
CPlugin *_Load(const char *file, PluginId source, char *error, size_t maxlen); CPlugin *_Load(const char *file, PluginId source, char *error, size_t maxlen);

View File

@ -141,8 +141,12 @@ void CSmmAPI::ConPrintf(const char *fmt, ...)
void CSmmAPI::AddListener(ISmmPlugin *plugin, IMetamodListener *pListener) void CSmmAPI::AddListener(ISmmPlugin *plugin, IMetamodListener *pListener)
{ {
CPluginManager::CPlugin *pl = g_PluginMngr.FindByAPI(plugin); CPluginManager::CPlugin *pl = g_PluginMngr.FindByAPI(plugin);
CPluginEventHandler cpeh;
pl->m_Events.push_back(pListener); cpeh.event = pListener;
cpeh.got_vsp = false;
pl->m_Events.push_back(cpeh);
} }
void *CSmmAPI::MetaFactory(const char *iface, int *_ret, PluginId *id) void *CSmmAPI::MetaFactory(const char *iface, int *_ret, PluginId *id)
@ -174,7 +178,7 @@ void *CSmmAPI::MetaFactory(const char *iface, int *_ret, PluginId *id)
} }
CPluginManager::CPlugin *pl; CPluginManager::CPlugin *pl;
SourceHook::List<IMetamodListener *>::iterator event; SourceHook::List<CPluginEventHandler>::iterator event;
IMetamodListener *api; IMetamodListener *api;
int ret = 0; int ret = 0;
void *val = NULL; void *val = NULL;
@ -184,7 +188,7 @@ void *CSmmAPI::MetaFactory(const char *iface, int *_ret, PluginId *id)
pl = (*iter); pl = (*iter);
for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++)
{ {
api = (*event); api = (*event).event;
ret = IFACE_FAILED; ret = IFACE_FAILED;
if ( (val=api->OnMetamodQuery(iface, &ret)) != NULL ) if ( (val=api->OnMetamodQuery(iface, &ret)) != NULL )
{ {

View File

@ -73,14 +73,14 @@ void ClearGamedllList();
/* Helper Macro */ /* Helper Macro */
#define IFACE_MACRO(orig,nam) \ #define IFACE_MACRO(orig,nam) \
CPluginManager::CPlugin *pl; \ CPluginManager::CPlugin *pl; \
SourceHook::List<IMetamodListener *>::iterator event; \ SourceHook::List<CPluginEventHandler>::iterator event; \
IMetamodListener *api; \ IMetamodListener *api; \
int mret = 0; \ int mret = 0; \
void *val = NULL; \ void *val = NULL; \
for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \
pl = (*iter); \ pl = (*iter); \
for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) { \ for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) { \
api = (*event); \ api = (*event).event; \
mret = IFACE_FAILED; \ mret = IFACE_FAILED; \
if ( (val=api->On##nam##Query(iface, &mret)) != NULL ) { \ if ( (val=api->On##nam##Query(iface, &mret)) != NULL ) { \
if (ret) *ret = mret; \ if (ret) *ret = mret; \
@ -92,12 +92,12 @@ void ClearGamedllList();
#define ITER_EVENT(evn, args) \ #define ITER_EVENT(evn, args) \
CPluginManager::CPlugin *pl; \ CPluginManager::CPlugin *pl; \
SourceHook::List<IMetamodListener *>::iterator event; \ SourceHook::List<CPluginEventHandler>::iterator event; \
IMetamodListener *api; \ IMetamodListener *api; \
for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \
pl = (*iter); \ pl = (*iter); \
for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) { \ for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) { \
api = (*event); \ api = (*event).event; \
api->evn args; \ api->evn args; \
} \ } \
} }
@ -308,6 +308,7 @@ bool GameInit_handler()
if (g_VspListener.IsRootLoadMethod()) if (g_VspListener.IsRootLoadMethod())
{ {
DoInitialPluginLoads(); DoInitialPluginLoads();
//gaben
} }
bGameInit = true; bGameInit = true;

View File

@ -5,9 +5,9 @@
#define SVN_PRODUCT_VERSION "1.4.3" #define SVN_PRODUCT_VERSION "1.4.3"
#define SVN_REVISION 590 #define SVN_REVISION 599
#define SVN_REVISION_STRING "590" #define SVN_REVISION_STRING "599"
#define SVN_FILE_VERSION 1,4,3,590 #define SVN_FILE_VERSION 1,4,3,599
#define SVN_FILE_VERSION_STRING "1.4.3.590" #define SVN_FILE_VERSION_STRING "1.4.3.599"
#endif //_INCLUDE_SVN_VERSION_H_ #endif //_INCLUDE_SVN_VERSION_H_

View File

@ -178,29 +178,9 @@ bool VSPListener::Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gam
m_Loaded = true; m_Loaded = true;
SetLoadable(false); SetLoadable(false);
PluginIter iter; if (!m_bIsRootLoadMethod)
CPluginManager::CPlugin *pPlugin;
SourceHook::List<IMetamodListener *>::iterator event;
IMetamodListener *pML;
for (iter=g_PluginMngr._begin(); iter!=g_PluginMngr._end(); iter++)
{ {
pPlugin = (*iter); g_PluginMngr.SetVSPAsLoaded();
if (pPlugin->m_Status < Pl_Paused)
{
continue;
}
/* Only valid for plugins >= 10 (v1:5, SourceMM 1.4) */
if (pPlugin->m_API->GetApiVersion() < 10)
{
continue;
}
for (event=pPlugin->m_Events.begin();
event!=pPlugin->m_Events.end();
event++)
{
pML = (*event);
pML->OnVSPListening(this);
}
} }
return true; return true;