diff options
author | Haru <haru@dotalux.com> | 2014-10-28 21:13:21 +0100 |
---|---|---|
committer | Haru <haru@dotalux.com> | 2014-10-28 21:43:39 +0100 |
commit | 60becfc70e65ba7920079f990bfaa11851369f0c (patch) | |
tree | fd53b78cefae7fae6b01784f8ce3fbd58b31f302 /src/common | |
parent | d18235cae43500d68210b09514b76506fc831014 (diff) | |
download | hercules-60becfc70e65ba7920079f990bfaa11851369f0c.tar.gz hercules-60becfc70e65ba7920079f990bfaa11851369f0c.tar.bz2 hercules-60becfc70e65ba7920079f990bfaa11851369f0c.tar.xz hercules-60becfc70e65ba7920079f990bfaa11851369f0c.zip |
Added preliminary support for char and login server to HPMHooking
- Special thanks to Ind
Signed-off-by: Haru <haru@dotalux.com>
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/HPM.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/src/common/HPM.c b/src/common/HPM.c index 641d84c68..7a875d1c4 100644 --- a/src/common/HPM.c +++ b/src/common/HPM.c @@ -318,27 +318,40 @@ void hplugins_config_read(const char * const *extra_plugins, int extra_plugins_c if (plist != NULL) { int length = libconfig->setting_length(plist); char filename[60]; - for(i = 0; i < length; i++) { - if( !strcmpi(libconfig->setting_get_string_elem(plist,i),"HPMHooking") ) {//must load it first + char hooking_plugin_name[32]; + const char *plugin_name_suffix = ""; + if (SERVER_TYPE == SERVER_TYPE_LOGIN) + plugin_name_suffix = "_login"; + else if (SERVER_TYPE == SERVER_TYPE_CHAR) + plugin_name_suffix = "_char"; + else if (SERVER_TYPE == SERVER_TYPE_MAP) + plugin_name_suffix = "_map"; + snprintf(hooking_plugin_name, sizeof(hooking_plugin_name), "HPMHooking%s", plugin_name_suffix); + + for (i = 0; i < length; i++) { + const char *plugin_name = libconfig->setting_get_string_elem(plist,i); + if (strcmpi(plugin_name, "HPMHooking") == 0 || strcmpi(plugin_name, hooking_plugin_name) == 0) { //must load it first struct hplugin *plugin; - snprintf(filename, 60, "plugins/%s%s", libconfig->setting_get_string_elem(plist,i), DLL_EXT); - if( ( plugin = HPM->load(filename) ) ) { + snprintf(filename, 60, "plugins/%s%s", hooking_plugin_name, DLL_EXT); + if ((plugin = HPM->load(filename))) { bool (*func)(bool *fr); bool (*addhook_sub) (enum HPluginHookType type, const char *target, void *hook, unsigned int pID); - if( ( func = plugin_import(plugin->dll, "Hooked",bool (*)(bool *)) ) && ( addhook_sub = plugin_import(plugin->dll, "HPM_Plugin_AddHook",bool (*)(enum HPluginHookType, const char *, void *, unsigned int)) ) ) { - if( func(&HPM->force_return) ) { + if ((func = plugin_import(plugin->dll, "Hooked",bool (*)(bool *))) + && (addhook_sub = plugin_import(plugin->dll, "HPM_Plugin_AddHook",bool (*)(enum HPluginHookType, const char *, void *, unsigned int)))) { + if (func(&HPM->force_return)) { HPM->hooking = true; HPM->addhook_sub = addhook_sub; } } } + break; } } - for(i = 0; i < length; i++) { - if( strcmpi(libconfig->setting_get_string_elem(plist,i),"HPMHooking") ) {//now all others - snprintf(filename, 60, "plugins/%s%s", libconfig->setting_get_string_elem(plist,i), DLL_EXT); - HPM->load(filename); - } + for (i = 0; i < length; i++) { + if (strncmpi(libconfig->setting_get_string_elem(plist,i),"HPMHooking", 10) == 0) // Already loaded, skip + continue; + snprintf(filename, 60, "plugins/%s%s", libconfig->setting_get_string_elem(plist,i), DLL_EXT); + HPM->load(filename); } libconfig->destroy(&plugins_conf); } |