Skip to content

Commit 994a09b

Browse files
authored
Fix NVSE listener registration in NVSEPlugin_Query (xNVSE#239)
1 parent c449cd1 commit 994a09b

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

nvse/nvse/PluginManager.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -629,12 +629,15 @@ bool PluginManager::InstallPlugins(const std::vector<std::string>& pluginPaths)
629629
pluginStatus.loadStatus = SafeCallQueryPlugin(&plugin, &g_NVSEInterface);
630630
if (pluginStatus.loadStatus.empty())
631631
pluginStatus.querySuccess = true;
632+
else
633+
UnregisterListener(s_currentPluginHandle);
632634
continue;
633635
}
634636
pluginStatus.loadStatus = "was not loaded as it does not appear to be an NVSE plugin (NVSE plugins must export NVSEPlugin_Query and NVSEPlugin_Load)";
635637
continue;
636638
}
637639
pluginStatus.loadStatus = FormatString("couldn't be loaded due to an error (win32 error code: %d message: \"%s\")", GetLastError(), GetLastErrorAsString().c_str());
640+
UnregisterListener(s_currentPluginHandle);
638641
}
639642

640643
Dispatch_Message(0, NVSEMessagingInterface::kMessage_PostQueryPlugins, NULL, 0, NULL);
@@ -839,7 +842,7 @@ bool PluginManager::RegisterListener(PluginHandle listener, const char* sender,
839842
_MESSAGE("registering plugin listener for %s at %u of %u", sender, listener, numPlugins);
840843

841844
// handle > num plugins = invalid
842-
if (listener > g_pluginManager.GetNumPlugins() || !handler)
845+
if (s_currentPluginHandle != listener && listener > g_pluginManager.GetNumPlugins())
843846
{
844847
return false;
845848
}
@@ -904,6 +907,19 @@ bool PluginManager::RegisterListener(PluginHandle listener, const char* sender,
904907
return true;
905908
}
906909

910+
void PluginManager::UnregisterListener(PluginHandle listener) {
911+
912+
_MESSAGE("unregistering plugin listener at %u", listener);
913+
914+
for (auto& senderListeners : s_pluginListeners) {
915+
senderListeners.erase(
916+
std::remove_if(senderListeners.begin(), senderListeners.end(),
917+
[listener](const PluginListener& pl) { return pl.listener == listener; }),
918+
senderListeners.end());
919+
}
920+
s_pluginListeners.shrink_to_fit();
921+
}
922+
907923
bool PluginManager::Dispatch_Message(PluginHandle sender, UInt32 messageType, void * data, UInt32 dataLen, const char* receiver)
908924
{
909925
#ifdef RUNTIME

nvse/nvse/PluginManager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class PluginManager
3838

3939
static bool Dispatch_Message(PluginHandle sender, UInt32 messageType, void * data, UInt32 dataLen, const char* receiver);
4040
static bool RegisterListener(PluginHandle listener, const char* sender, NVSEMessagingInterface::EventCallback handler);
41+
static void UnregisterListener(PluginHandle listener);
4142

4243
static void * GetSingleton(UInt32 singletonID);
4344
static void * GetFunc(UInt32 funcID);

0 commit comments

Comments
 (0)