void CPluginMngr::Finalize() { if (m_Finalized) return; pNatives = BuildNativeTable(); CPlugin *a = head; while (a) { if (a->getStatusCode() == ps_running) { amx_Register(a->getAMX(), pNatives, -1); a->Finalize(); } a = a->next; } m_Finalized = true; }
int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn) { char file[PLATFORM_MAX_PATH]; FILE *fp = fopen(build_pathname_r(file, sizeof(file), "%s", filename), "rt"); if (!fp) { if (warn) { AMXXLOG_Error("[AMXX] Plugins list not found (file \"%s\")", filename); } return 1; } // Find now folder char pluginName[256], error[256], debug[256]; int debugFlag = 0; const char *pluginsDir = get_localinfo("amxx_pluginsdir", "addons/amxmodx/plugins"); char line[512]; List<ke::AString *>::iterator block_iter; while (!feof(fp)) { pluginName[0] = '\0'; debug[0] = '\0'; debugFlag = 0; line[0] = '\0'; fgets(line, sizeof(line), fp); /** quick hack */ char *ptr = line; while (*ptr) { if (*ptr == ';') { *ptr = '\0'; } else { ptr++; } } sscanf(line, "%s %s", pluginName, debug); if (!isalnum(*pluginName)) { continue; } if (isalnum(*debug) && !strcmp(debug, "debug")) { debugFlag = 1; } bool skip = false; for (block_iter = m_BlockList.begin(); block_iter != m_BlockList.end(); block_iter++) { if ((*block_iter)->compare(pluginName) == 0) { skip = true; break; } } if (skip || !strcmp(debug, "disabled")) { continue; } if (findPlugin(pluginName) != NULL) { continue; } CPlugin* plugin = loadPlugin(pluginsDir, pluginName, error, sizeof(error), debugFlag); if (plugin->getStatusCode() == ps_bad_load) { char errorMsg[255]; sprintf(errorMsg, "%s (plugin \"%s\")", error, pluginName); plugin->setError(errorMsg); AMXXLOG_Error("[AMXX] %s", plugin->getError()); } else { cell addr; if (amx_FindPubVar(plugin->getAMX(), "MaxClients", &addr) != AMX_ERR_NOTFOUND) { *get_amxaddr(plugin->getAMX(), addr) = gpGlobals->maxClients; } if (amx_FindPubVar(plugin->getAMX(), "MapName", &addr) != AMX_ERR_NOTFOUND) { set_amxstring(plugin->getAMX(), addr, STRING(gpGlobals->mapname), MAX_MAPNAME_LENGTH - 1); } if (amx_FindPubVar(plugin->getAMX(), "NULL_STRING", &addr) != AMX_ERR_NOTFOUND) { plugin->m_pNullStringOfs = get_amxaddr(plugin->getAMX(), addr); } if (amx_FindPubVar(plugin->getAMX(), "NULL_VECTOR", &addr) != AMX_ERR_NOTFOUND) { plugin->m_pNullVectorOfs = get_amxaddr(plugin->getAMX(), addr); } } } fclose(fp); return pCounter; }