// native INI_SetReaders(INIParser:smc, const kvFunc[], const nsFunc[] = "" ); static cell AMX_NATIVE_CALL INI_SetReaders(AMX *amx, cell *params) { ParseInfo *p = g_TextParsersHandles.lookup(params[1]); if (p == NULL) { LogError(amx, AMX_ERR_NATIVE, "Invalid INI parse handle (%d)", params[1]); return 0; } int kvLength = 0, nsLength = 0; const char *funcName = NULL; if ((funcName = get_amxstring(amx, params[2], 0, kvLength)) && kvLength) { p->key_value = registerSPForwardByName(amx, funcName, FP_CELL, FP_STRING, FP_STRING, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE); } if (kvLength && (funcName = get_amxstring(amx, params[3], 1, nsLength)) && nsLength) { p->new_section = registerSPForwardByName(amx, funcName, FP_CELL, FP_STRING, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE); } if (p->key_value == -1 || (nsLength && p->new_section == -1)) { LogError(amx, AMX_ERR_NATIVE, "Function is not present (function \"%s\") (plugin \"%s\")", funcName, g_plugins.findPluginFast(amx)->getName()); return 0; } return 1; }
// native SMC_SetParseEnd(SMCParser:handle, const func[]); static cell AMX_NATIVE_CALL SMC_SetParseEnd(AMX *amx, cell *params) { ParseInfo *p = g_TextParsersHandles.lookup(params[1]); if (p == NULL) { LogError(amx, AMX_ERR_NATIVE, "Invalid SMC parse handle (%d)", params[1]); return 0; } int length = 0; const char *funcName = NULL; if ((funcName = get_amxstring(amx, params[2], 0, length)) && length) { p->parse_end = registerSPForwardByName(amx, funcName, FP_CELL, FP_CELL, FP_CELL, FP_DONE); } if (p->parse_end == -1) { LogError(amx, AMX_ERR_NATIVE, "Function is not present (function \"%s\") (plugin \"%s\")", funcName, g_plugins.findPluginFast(amx)->getName()); return 0; } return 1; }
//Makes a new menu handle (-1 for failure) //native csdm_makemenu(title[]); static cell AMX_NATIVE_CALL menu_create(AMX *amx, cell *params) { int len; char *title = get_amxstring(amx, params[1], 0, len); validate_menu_text(title); char *handler = get_amxstring(amx, params[2], 1, len); int func = registerSPForwardByName(amx, handler, FP_CELL, FP_CELL, FP_CELL, FP_DONE); if (func == -1) { LogError(amx, AMX_ERR_NOTFOUND, "Invalid function \"%s\"", handler); return 0; } Menu *pMenu = new Menu(title, amx, func); if (g_MenuFreeStack.empty()) { g_NewMenus.append(pMenu); pMenu->thisId = (int)g_NewMenus.length() - 1; } else { int pos = g_MenuFreeStack.front(); g_MenuFreeStack.pop(); g_NewMenus[pos] = pMenu; pMenu->thisId = pos; } return pMenu->thisId; }
// native INI_SetRawLine(INIParser:handle, const func[]); static cell AMX_NATIVE_CALL INI_SetRawLine(AMX *amx, cell *params) { ParseInfo *p = TextParsersHandles.lookup(params[1]); if (!p) { LogError(amx, AMX_ERR_NATIVE, "Invalid INI parse handle (%d)", params[1]); return 0; } int length = 0; const char *funcName = nullptr; if ((funcName = get_amxstring(amx, params[2], 0, length)) && length) { p->raw_line = registerSPForwardByName(amx, funcName, FP_CELL, FP_STRING, FP_CELL, FP_CELL, FP_DONE); } if (p->raw_line == -1) { LogError(amx, AMX_ERR_NATIVE, "Function is not present (function \"%s\") (plugin \"%s\")", funcName, g_plugins.findPluginFast(amx)->getName()); return 0; } return 1; }
CPluginMngr::CPlugin::CPlugin(int i, const char* p, const char* n, char* e, int d , const char * shortName ) : name(n), title(n) { const char* unk = "unknown"; failcounter = 0; title.assign(unk); author.assign(unk); version.assign(unk); char file[256]; char* path = build_pathname_r(file, sizeof(file) - 1, "%s/%s", p, n); code = 0; memset(&amx, 0, sizeof(AMX)); int err = load_amxscript(&amx, &code, path, e, d , shortName ); if (err == AMX_ERR_NONE) { status = ps_running; } else { status = ps_bad_load; } amx.userdata[UD_FINDPLUGIN] = this; paused_fun = 0; next = 0; id = i; if (status == ps_running) { m_PauseFwd = registerSPForwardByName(&amx, "plugin_pause", FP_DONE); m_UnpauseFwd = registerSPForwardByName(&amx, "plugin_unpause", FP_DONE); if (amx.flags & AMX_FLAG_DEBUG) { m_Debug = true; } else { m_Debug = false; } } }
CPluginMngr::CPlugin::CPlugin(int i, const char* p, const char* n, char* e, size_t m, int d) : name(n), title(n), m_pNullStringOfs(nullptr), m_pNullVectorOfs(nullptr) { const char* unk = "unknown"; failcounter = 0; title = unk; author = unk; version = unk; char file[PLATFORM_MAX_PATH]; char* path = build_pathname_r(file, sizeof(file), "%s/%s", p, n); code = 0; memset(&amx, 0, sizeof(AMX)); int err = load_amxscript_ex(&amx, &code, path, e, m, d); if (err == AMX_ERR_NONE) { status = ps_running; } else { status = ps_bad_load; } amx.userdata[UD_FINDPLUGIN] = this; paused_fun = 0; next = 0; id = i; if (status == ps_running) { m_PauseFwd = registerSPForwardByName(&amx, "plugin_pause", FP_DONE); m_UnpauseFwd = registerSPForwardByName(&amx, "plugin_unpause", FP_DONE); if (amx.flags & AMX_FLAG_DEBUG) { m_Debug = true; } else { m_Debug = false; } } }
static cell AMX_NATIVE_CALL menu_makecallback(AMX *amx, cell *params) { int len; char *name = get_amxstring(amx, params[1], 0, len); int id = registerSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_CELL, FP_DONE); if (id == -1) { LogError(amx, AMX_ERR_NOTFOUND, "Invalid function %s", name); return -1; } return id; }
// native ArraySort(Array:array, const comparefunc[], data[]="", data_size=0); static cell AMX_NATIVE_CALL ArraySort(AMX* amx, cell* params) { cell handle = params[1]; CellArray* vec = ArrayHandles.lookup(handle); if (!vec) { LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", handle); return 0; } int len; char* funcName = get_amxstring(amx, params[2], 0, len); // MySortFunc(Array:array, item1, item2, const data[], data_size) int func = registerSPForwardByName(amx, funcName, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE); if (func < 0) { LogError(amx, AMX_ERR_NATIVE, "The public function \"%s\" was not found.", funcName); return 0; } size_t arraysize = vec->size(); size_t blocksize = vec->blocksize(); cell *array = vec->base(); ArraySort_s oldinfo = SortInfo; SortInfo.func = func; SortInfo.array_base = array; SortInfo.array_bsize = static_cast<cell>(blocksize); SortInfo.array_hndl = handle; SortInfo.data = params[3]; SortInfo.size = params[4]; qsort(array, arraysize, blocksize * sizeof(cell), SortArrayList); SortInfo = oldinfo; unregisterSPForward(func); return 1; }
AutoForward* CvarManager::HookCvarChange(cvar_t* var, AMX* amx, cell param, const char** callback) { CvarInfo* info = nullptr; // A cvar is guaranteed to be in cache if pointer is got from // get_cvar_pointer and register_cvar natives. Though it might be // provided by another way. If by any chance we run in such // situation, we create a new entry right now. if (!CacheLookup(var->name, &info)) { // Create a new entry. info = new CvarInfo(var->name); info->var = var; // Add entry in the caches. m_Cvars.append(info); m_Cache.insert(info->name.chars(), info); } int length; *callback = get_amxstring(amx, param, 0, length); int forwardId = registerSPForwardByName(amx, *callback, FP_CELL, FP_STRING, FP_STRING, FP_DONE); // Invalid callback, it could be: not a public function, wrongly named, or simply missing. if (forwardId == -1) { return nullptr; } // Detour is disabled on map change. if (m_HookDetour) { m_HookDetour->EnableDetour(); } AutoForward* forward = new AutoForward(forwardId, *callback); info->hooks.append(new CvarHook(g_plugins.findPlugin(amx)->getId(), forward)); return forward; }
static cell AMX_NATIVE_CALL register_message(AMX *amx, cell *params) { int len; char *name = get_amxstring(amx, params[2], 0, len); if (!Msg.Ready()) Msg.Init(); if (params[1]>0 && params[1] < 256) { int id = registerSPForwardByName(amx, name, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE); if (id != -1) { msgHooks[params[1]].AddHook(id); return id; } else { LogError(amx, AMX_ERR_NOTFOUND, "Could not find function \"%s\"", name); return -1; } } return 0; }
// native ArraySortEx(Array:array, const comparefunc[], data[]="", data_size=0); static cell AMX_NATIVE_CALL ArraySortEx(AMX* amx, cell* params) { CellArray* vec = ArrayHandles.lookup(params[1]); if (!vec) { LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]); return 0; } int len; char* funcName = get_amxstring(amx, params[2], 0, len); int func = registerSPForwardByName(amx, funcName, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE); if (!func) { LogError(amx, AMX_ERR_NATIVE, "The public function \"%s\" was not found.", funcName); return 0; } size_t arraysize = vec->size(); size_t blocksize = vec->blocksize(); cell *array = vec->base(); cell amx_addr1 = 0, amx_addr2 = 0, *phys_addr = NULL; if (blocksize > 1) { int err; if ((err = amx_Allot(amx, blocksize, &amx_addr1, &phys_addr)) != AMX_ERR_NONE || ( err = amx_Allot(amx, blocksize, &amx_addr2, &phys_addr)) != AMX_ERR_NONE) { LogError(amx, err, "Ran out of memory"); return 0; } } ArraySort_s oldinfo = SortInfo; SortInfo.func = func; SortInfo.array_base = array; SortInfo.array_bsize = static_cast<cell>(blocksize); SortInfo.array_hndl = params[1]; SortInfo.data = params[3]; SortInfo.size = params[4]; SortInfo.amx = amx; SortInfo.addr1 = amx_addr1; SortInfo.addr2 = amx_addr2; qsort(array, arraysize, blocksize * sizeof(cell), blocksize > 1 ? SortArrayListExArray : SortArrayListExCell); SortInfo = oldinfo; if (blocksize > 1) { amx_Release(amx, amx_addr1); amx_Release(amx, amx_addr2); } unregisterSPForward(func); return 1; }