fixed amb951 - te hooking did not auto-remove hooks from plugins
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401436
This commit is contained in:
parent
82108a7fcd
commit
95c46b781e
@ -70,5 +70,6 @@
|
||||
#define SMEXT_ENABLE_GAMEHELPERS
|
||||
//#define SMEXT_ENABLE_TIMERSYS
|
||||
#define SMEXT_ENABLE_ADTFACTORY
|
||||
#define SMEXT_ENABLE_PLUGINSYS
|
||||
|
||||
#endif // _INCLUDE_SOURCEMOD_EXTENSION_CONFIG_H_
|
||||
|
@ -79,6 +79,9 @@ IThreader *threader = NULL;
|
||||
#if defined SMEXT_ENABLE_LIBSYS
|
||||
ILibrarySys *libsys = NULL;
|
||||
#endif
|
||||
#if defined SMEXT_ENABLE_PLUGINSYS
|
||||
SourceMod::IPluginManager *plsys;
|
||||
#endif
|
||||
|
||||
/** Exports the main interface */
|
||||
PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
|
||||
@ -149,6 +152,9 @@ bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error,
|
||||
#if defined SMEXT_ENABLE_LIBSYS
|
||||
SM_GET_IFACE(LIBRARYSYS, libsys);
|
||||
#endif
|
||||
#if defined SMEXT_ENABLE_PLUGINSYS
|
||||
SM_GET_IFACE(PLUGINSYSTEM, plsys);
|
||||
#endif
|
||||
|
||||
if (SDK_OnLoad(error, maxlength, late))
|
||||
{
|
||||
|
@ -73,6 +73,9 @@
|
||||
#if defined SMEXT_ENABLE_LIBSYS
|
||||
#include <ILibrarySys.h>
|
||||
#endif
|
||||
#if defined SMEXT_ENABLE_PLUGINSYS
|
||||
#include <IPluginSys.h>
|
||||
#endif
|
||||
|
||||
#if defined SMEXT_CONF_METAMOD
|
||||
#include <ISmmPlugin.h>
|
||||
@ -256,6 +259,9 @@ extern IThreader *threader;
|
||||
#if defined SMEXT_ENABLE_LIBSYS
|
||||
extern ILibrarySys *libsys;
|
||||
#endif
|
||||
#if defined SMEXT_ENABLE_PLUGINSYS
|
||||
extern SourceMod::IPluginManager *plsys;
|
||||
#endif
|
||||
|
||||
#if defined SMEXT_CONF_METAMOD
|
||||
PLUGIN_GLOBALVARS();
|
||||
|
@ -94,8 +94,10 @@ struct TEHookInfo
|
||||
List<IPluginFunction *> lst;
|
||||
};
|
||||
|
||||
class TempEntHooks
|
||||
class TempEntHooks : public IPluginsListener
|
||||
{
|
||||
public: //IPluginsListener
|
||||
void OnPluginUnloaded(IPlugin *plugin);
|
||||
public:
|
||||
void Initialize();
|
||||
void Shutdown();
|
||||
|
@ -48,10 +48,12 @@ int g_TEPlayers[256];
|
||||
void TempEntHooks::Initialize()
|
||||
{
|
||||
m_TEHooks = adtfactory->CreateBasicTrie();
|
||||
plsys->AddPluginsListener(this);
|
||||
}
|
||||
|
||||
void TempEntHooks::Shutdown()
|
||||
{
|
||||
plsys->RemovePluginsListener(this);
|
||||
List<TEHookInfo *>::iterator iter;
|
||||
for (iter=m_HookInfo.begin(); iter!=m_HookInfo.end(); iter++)
|
||||
{
|
||||
@ -65,6 +67,47 @@ void TempEntHooks::Shutdown()
|
||||
m_TEHooks->Destroy();
|
||||
}
|
||||
|
||||
void TempEntHooks::OnPluginUnloaded(IPlugin *plugin)
|
||||
{
|
||||
List<TEHookInfo *>::iterator iter = m_HookInfo.begin();
|
||||
IPluginContext *pContext = plugin->GetBaseContext();
|
||||
|
||||
/* For each hook list... */
|
||||
while (iter != m_HookInfo.end())
|
||||
{
|
||||
List<IPluginFunction *>::iterator f_iter = (*iter)->lst.begin();
|
||||
|
||||
/* Find the hooks on the given temp entity */
|
||||
while (f_iter != (*iter)->lst.end())
|
||||
{
|
||||
/* If it matches, remove it and dec the ref count */
|
||||
if ((*f_iter)->GetParentContext() == pContext)
|
||||
{
|
||||
f_iter = (*iter)->lst.erase(f_iter);
|
||||
_DecRefCounter();
|
||||
}
|
||||
else
|
||||
{
|
||||
f_iter++;
|
||||
}
|
||||
}
|
||||
|
||||
/* If there are no more hooks left, we can safely
|
||||
* remove it from the cache and remove its list.
|
||||
*/
|
||||
if ((*iter)->lst.size() == 0)
|
||||
{
|
||||
m_TEHooks->Delete((*iter)->te->GetName());
|
||||
delete (*iter);
|
||||
iter = m_HookInfo.erase(iter);
|
||||
}
|
||||
else
|
||||
{
|
||||
iter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TempEntHooks::_IncRefCounter()
|
||||
{
|
||||
if (m_HookCount++ == 0)
|
||||
|
Loading…
Reference in New Issue
Block a user