diff --git a/library/PluginManager.cpp b/library/PluginManager.cpp index 86bab66cd..d5636109b 100644 --- a/library/PluginManager.cpp +++ b/library/PluginManager.cpp @@ -212,9 +212,10 @@ bool Plugin::load(color_ostream &con) } const char ** plug_name =(const char ** ) LookupPlugin(plug, "name"); const char ** plug_version =(const char ** ) LookupPlugin(plug, "version"); - if(!plug_name || !plug_version) + Plugin **plug_self = (Plugin**)LookupPlugin(plug, "plugin_self"); + if(!plug_name || !plug_version || !plug_self) { - con.printerr("Plugin %s has no name or version.\n", filename.c_str()); + con.printerr("Plugin %s has no name, version or self pointer.\n", filename.c_str()); ClosePlugin(plug); RefAutolock lock(access); state = PS_BROKEN; @@ -229,6 +230,7 @@ bool Plugin::load(color_ostream &con) state = PS_BROKEN; return false; } + *plug_self = this; RefAutolock lock(access); plugin_init = (command_result (*)(color_ostream &, std::vector &)) LookupPlugin(plug, "plugin_init"); if(!plugin_init) diff --git a/library/include/PluginManager.h b/library/include/PluginManager.h index 62a195867..46a46f2df 100644 --- a/library/include/PluginManager.h +++ b/library/include/PluginManager.h @@ -247,7 +247,8 @@ namespace DFHack /// You have to have this in every plugin you write - just once. Ideally on top of the main file. #define DFHACK_PLUGIN(plugin_name) \ DFhackDataExport const char * version = DFHACK_VERSION;\ - DFhackDataExport const char * name = plugin_name; + DFhackDataExport const char * name = plugin_name;\ + DFhackDataExport Plugin *plugin_self = NULL; #define DFHACK_PLUGIN_LUA_COMMANDS \ DFhackCExport const DFHack::CommandReg plugin_lua_commands[] = diff --git a/plugins/autoSyndrome.cpp b/plugins/autoSyndrome.cpp index 79e8b35ec..3cee68589 100644 --- a/plugins/autoSyndrome.cpp +++ b/plugins/autoSyndrome.cpp @@ -126,9 +126,8 @@ DFhackCExport command_result plugin_init(color_ostream& out, vectorgetPluginByName("autoSyndrome"); EventManager::EventHandler handle(processJob, 5); - EventManager::registerListener(EventManager::EventType::JOB_COMPLETED, handle, me); + EventManager::registerListener(EventManager::EventType::JOB_COMPLETED, handle, plugin_self); return CR_OK; } diff --git a/plugins/trueTransformation.cpp b/plugins/trueTransformation.cpp index 6c4245da8..1e3403fc5 100644 --- a/plugins/trueTransformation.cpp +++ b/plugins/trueTransformation.cpp @@ -26,8 +26,7 @@ void syndromeHandler(color_ostream& out, void* ptr); DFhackCExport command_result plugin_init ( color_ostream &out, std::vector &commands) { EventManager::EventHandler syndrome(syndromeHandler, 1); - Plugin* me = Core::getInstance().getPluginManager()->getPluginByName("trueTransformation"); - EventManager::registerListener(EventManager::EventType::SYNDROME, syndrome, me); + EventManager::registerListener(EventManager::EventType::SYNDROME, syndrome, plugin_self); return CR_OK; }