diff --git a/core/logic/smn_core.cpp b/core/logic/smn_core.cpp index 6db6e766dc..6c68a118dd 100644 --- a/core/logic/smn_core.cpp +++ b/core/logic/smn_core.cpp @@ -151,6 +151,8 @@ class CMMPluginIterator } virtual IPlugin *GetPlugin() override { + if (m_current == m_list.end()) + return nullptr; return *m_current; } virtual void NextPlugin() override @@ -161,7 +163,8 @@ class CMMPluginIterator return; } - m_current++; + if (m_current != m_list.end()) + m_current++; } virtual void Release() override { @@ -171,7 +174,7 @@ class CMMPluginIterator public: virtual void OnPluginDestroyed(IPlugin *plugin) override { - if (*m_current == plugin) + if (m_current != m_list.end() && *m_current == plugin) m_current = m_list.erase(m_current); else m_list.remove(static_cast(plugin)); @@ -401,12 +404,13 @@ static cell_t PluginIterator_Next(IPluginContext *pContext, const cell_t *params { return pContext->ThrowNativeError("Could not read Handle %x (error %d)", hndl, err); } - + if(!pIter->MorePlugins()) - return 0; - + return pContext->ThrowNativeError("PluginIterator %x is exhausted.", hndl); + pIter->NextPlugin(); - return 1; + + return pIter->MorePlugins() ? 1 : 0; } static cell_t PluginIterator_Plugin_get(IPluginContext *pContext, const cell_t *params) diff --git a/plugins/include/sourcemod.inc b/plugins/include/sourcemod.inc index 8e748c853a..d8c93313e0 100644 --- a/plugins/include/sourcemod.inc +++ b/plugins/include/sourcemod.inc @@ -262,7 +262,7 @@ methodmap PluginIterator < Handle // Advances the iterator. Returns whether there are more plugins available in the iterator. // // @return True on more plugins, false otherwise. - // @error Invalid Handle. + // @error Invalid Handle, or called when the iterator is already exhausted. public native bool Next(); // Returns the current plugin in the iterator.