static cell AMX_NATIVE_CALL SQL_QuoteStringFmt(AMX *amx, cell *params) { int len; char *str = MF_FormatAmxString(amx, params, 4, &len); size_t newsize; static char buffer[8192]; if (params[1] != 0) { IDatabase *pDb = (IDatabase *)GetHandle(params[1], Handle_Database); if (!pDb) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid database handle: %d", params[1]); return 0; } if (pDb->QuoteString(str, buffer, sizeof(buffer)-1, &newsize) == 0) { MF_SetAmxString(amx, params[2], buffer, params[3]); return newsize; } else { return -1; } } else { if (g_Sqlite.QuoteString(str, buffer, sizeof(buffer)-1, &newsize) == 0) { MF_SetAmxString(amx, params[2], buffer, params[3]); return newsize; } else { return -1; } } }
static cell AMX_NATIVE_CALL get_stats(AMX *amx, cell *params) /* 7 param */ { int index = params[1] + 1; RankSystem::iterator a; a.getEntryByRank(index); if (a) { cell *cpStats = MF_GetAmxAddr(amx,params[2]); cell *cpBodyHits = MF_GetAmxAddr(amx,params[3]); cpStats[0] = (*a).kills; cpStats[1] = (*a).deaths; cpStats[2] = (*a).hs; cpStats[3] = (*a).tks; cpStats[4] = (*a).shots; cpStats[5] = (*a).hits; cpStats[6] = (*a).damage; cpStats[7] = (*a).getPosition(); MF_SetAmxString(amx,params[4],(*a).getName(),params[5]); if (params[6] > 0) { MF_SetAmxString(amx, params[6], (*a).getUnique(), params[7]); } for (int i = 1; i < 8; ++i) { cpBodyHits[i] = (*a).bodyHits[i]; } return index; } return 0; }
static cell AMX_NATIVE_CALL get_stats(AMX *amx, cell *params) /* 7 param */ { int index = params[1] + 1; for(RankSystem::iterator a = g_rank.front(); a ;--a){ if ((*a).getPosition() == index) { cell *cpStats = MF_GetAmxAddr(amx,params[2]); cell *cpBodyHits = MF_GetAmxAddr(amx,params[3]); cpStats[0] = (*a).kills; cpStats[1] = (*a).deaths; cpStats[2] = (*a).hs; cpStats[3] = (*a).tks; cpStats[4] = (*a).shots; cpStats[5] = (*a).hits; cpStats[6] = (*a).damage; cpStats[7] = (*a).getPosition(); MF_SetAmxString(amx,params[4],(*a).getName(),params[5]); if (params[6] > 0) MF_SetAmxString(amx, params[6], (*a).getUnique(), params[7]); for(int i = 1; i < 8; ++i) cpBodyHits[i] = (*a).bodyHits[i]; return --a ? index : 0; } } return 0; }
static cell AMX_NATIVE_CALL get_kvd(AMX *amx, cell *params) { KVD_Wrapper *kvdw; KeyValueData *kvd; if (params[1] == 0) kvdw = &g_kvd_glb; else kvdw = reinterpret_cast<KVD_Wrapper *>(params[1]); kvd = kvdw->kvd; switch (params[2]) { case KV_fHandled: { return kvd->fHandled; break; } case KV_ClassName: { if (params[0] / sizeof(cell) != 4) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed"); return 0; } cell *ptr = MF_GetAmxAddr(amx, params[4]); return MF_SetAmxString(amx, params[3], kvd->szClassName, (int)*ptr); break; } case KV_KeyName: { if (params[0] / sizeof(cell) != 4) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed"); return 0; } cell *ptr = MF_GetAmxAddr(amx, params[4]); return MF_SetAmxString(amx, params[3], kvd->szKeyName, (int)*ptr); break; } case KV_Value: { if (params[0] / sizeof(cell) != 4) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed"); return 0; } cell *ptr = MF_GetAmxAddr(amx, params[4]); return MF_SetAmxString(amx, params[3], kvd->szValue, (int)*ptr); break; } } MF_LogError(amx, AMX_ERR_NATIVE, "Invalid KeyValueData member: %d", params[2]); return 0; }
static cell AMX_NATIVE_CALL copy_keyvalue(AMX *amx, cell *params) { if (!g_inKeyValue) return 0; if (g_pkvd->szClassName) MF_SetAmxString(amx, params[1], g_pkvd->szClassName, params[2]); if (g_pkvd->szKeyName) MF_SetAmxString(amx, params[3], g_pkvd->szKeyName, params[4]); if (g_pkvd->szValue) MF_SetAmxString(amx, params[5], g_pkvd->szValue, params[6]); return 1; }
static cell AMX_NATIVE_CALL SQL_Connect(AMX *amx, cell *params) { SQL_Connection *sql = (SQL_Connection *)GetHandle(params[1], Handle_Connection); if (!sql) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid handle: %d", params[1]); return 0; } DatabaseInfo nfo; nfo.database = sql->db; nfo.user = ""; nfo.pass = ""; nfo.port = 0; nfo.host = ""; char buffer[512]; int errcode; IDatabase *pDb = g_Sqlite.Connect(&nfo, &errcode, buffer, sizeof(buffer)-1); if (!pDb) { cell *c_err = MF_GetAmxAddr(amx, params[2]); *c_err = errcode; MF_SetAmxString(amx, params[3], buffer, params[4]); return 0; } return MakeHandle(pDb, Handle_Database, FreeDatabase); }
static cell AMX_NATIVE_CALL SQL_FieldNumToName(AMX *amx, cell *params) { AmxQueryInfo *qInfo = (AmxQueryInfo *)GetHandle(params[1], Handle_Query); if (!qInfo) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid query handle: %d", params[1]); return 0; } IResultSet *rs = qInfo->info.rs; if (!rs) { MF_LogError(amx, AMX_ERR_NATIVE, "No result set in this query!"); return 0; } unsigned int col = static_cast<unsigned int>(params[2]); const char *namewa = rs->FieldNumToName(col); if (!namewa) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid column: %d", col); return 0; } MF_SetAmxString(amx, params[3], namewa, params[4]); return 1; }
static cell AMX_NATIVE_CALL SQL_ReadResult(AMX *amx, cell *params) { AmxQueryInfo *qInfo = (AmxQueryInfo *)GetHandle(params[1], Handle_Query); if (!qInfo) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid query handle: %d", params[1]); return 0; } IResultSet *rs = qInfo->info.rs; if (!rs || rs->IsDone()) { MF_LogError(amx, AMX_ERR_NATIVE, "No result set in this query!"); return 0; } IResultRow *row = rs->GetRow(); unsigned int col = static_cast<unsigned int>(params[2]); if (col >= rs->FieldCount()) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid column: %d", col); return 0; } cell numparams = params[0] / sizeof(cell); switch (numparams) { case 4: { const char *str = row->GetString(col); if (!str) str = ""; cell *len = MF_GetAmxAddr(amx, params[4]); MF_SetAmxString(amx, params[3], str, (int)*len); break; } case 3: { REAL num = row->GetFloat(col); cell *addr = MF_GetAmxAddr(amx, params[3]); *addr = amx_ftoc(num); break; } case 2: { int num = row->GetInt(col); return num; break; } default: { MF_LogError(amx, AMX_ERR_NATIVE, "Bad number of arguments passed."); break; } } return 1; }
static cell AMX_NATIVE_CALL get_user_astats(AMX *amx, cell *params) /* 6 param */ { int index = params[1]; CHECK_PLAYERRANGE(index); int attacker = params[2]; CHECK_PLAYERRANGE(attacker); CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); if (pPlayer->attackers[attacker].hits){ cell *cpStats = MF_GetAmxAddr(amx,params[3]); cell *cpBodyHits = MF_GetAmxAddr(amx,params[4]); CPlayer::PlayerWeapon* stats = &pPlayer->attackers[attacker]; cpStats[0] = stats->kills; cpStats[1] = stats->deaths; cpStats[2] = stats->hs; cpStats[3] = stats->tks; cpStats[4] = stats->shots; cpStats[5] = stats->hits; cpStats[6] = stats->damage; for(int i = 1; i < 8; ++i) cpBodyHits[i] = stats->bodyHits[i]; if (params[6] && attacker && stats->name ) MF_SetAmxString(amx,params[5],stats->name,params[6]); return 1; } return 0; }
// native bool:geoip_code3_ex(const ip[], result[4]); static cell AMX_NATIVE_CALL amx_geoip_code3_ex(AMX *amx, cell *params) { int length; char *ip = stripPort(MF_GetAmxString(amx, params[1], 0, &length)); const char *path[] = { "country", "iso_code", NULL }; const char *code = lookupString(ip, path, &length); if (!code) { return 0; } for (size_t i = 0; i < ARRAYSIZE(GeoIPCountryCode); ++i) { if (!strncmp(code, GeoIPCountryCode[i], 2)) { code = GeoIPCountryCode3[i]; break; } } MF_SetAmxString(amx, params[2], code, 3); return 1; }
// player,wid static cell AMX_NATIVE_CALL get_user_team(AMX *amx, cell *params) { int index = params[1]; CHECK_PLAYER(index); CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); int iTeam = pPlayer->pEdict->v.team; if ( params[3] ) { const char *szTeam = ""; switch(iTeam) { case 1: szTeam = "Allies"; break; case 2: szTeam = "Axis"; break; } MF_SetAmxString(amx,params[2],szTeam,params[3]); } return iTeam; }
//native regex_replace(Regex:pattern, string[], maxLen, const replace[], flags = REGEX_FORMAT_DEFAULT, &errcode = 0); static cell AMX_NATIVE_CALL regex_replace(AMX *amx, cell *params) { int id = params[1] - 1; if (id >= (int)PEL.length() || id < 0 || PEL[id]->isFree()) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid regex handle %d", id); return 0; } int textLen, replaceLen; char *text = MF_GetAmxString(amx, params[2], 0, &textLen); const char *replace = MF_GetAmxString(amx, params[4], 1, &replaceLen); cell *erroCode = MF_GetAmxAddr(amx, params[6]); RegEx *x = PEL[id]; int e = x->Replace(text, params[3] + 1, replace, replaceLen, params[5]); if (e == -1) { *erroCode = x->mErrorOffset; x->ClearMatch(); return -2; } else if (e == 0) { *erroCode = 0; x->ClearMatch(); return 0; } MF_SetAmxString(amx, params[2], text, params[3]); return e; }
// native regex_substr(Regex:id, str_id, buffer[], maxLen); static cell AMX_NATIVE_CALL regex_substr(AMX *amx, cell *params) { int id = params[1]-1; if (id >= (int)PEL.length() || id < 0 || PEL[id]->isFree()) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid regex handle %d", id); return 0; } RegEx *x = PEL[id]; static char buffer[16384]; // Same as AMXX buffer. size_t length; size_t maxLength = ke::Min<size_t>(params[4], sizeof(buffer) - 1); const char *ret = x->GetSubstring(params[2], buffer, maxLength, &length); if (ret == NULL) { return 0; } if (length >= maxLength && ret[length - 1] & 1 << 7) { maxLength -= UTIL_CheckValidChar((char *)ret + length - 1); } MF_SetAmxString(amx, params[3], ret, maxLength); return 1; }
// native geoip_region_code(const ip[], result[], len); static cell AMX_NATIVE_CALL amx_geoip_region_code(AMX *amx, cell *params) { int length; int finalLength = 0; char code[12]; // This should be largely enough to hold xx-yyyy and more if needed. char *ip = stripPort(MF_GetAmxString(amx, params[1], 0, &length)); const char *pathCountry[] = { "country", "iso_code", NULL }; const char *countryCode = lookupString(ip, pathCountry, &length); if (countryCode) { finalLength = length + 1; // + 1 for dash. ke::SafeSprintf(code, finalLength + 1, "%s-", countryCode); // + EOS. const char *pathRegion[] = { "subdivisions", "0", "iso_code", NULL }; // First result. const char *regionCode = lookupString(ip, pathRegion, &length); if (regionCode) { finalLength += length; strncat(code, regionCode, length); } else { finalLength = 0; } } return MF_SetAmxString(amx, params[2], finalLength ? code : "", ke::Min(finalLength, params[3])); }
static cell AMX_NATIVE_CALL get_wpnlogname(AMX *amx, cell *params){ int id = params[1]; if (id<1 || id>=MAX_WEAPONS+MAX_CWEAPONS ){ MF_LogError(amx, AMX_ERR_NATIVE, "Invalid weapon id %d", id); return 0; } return MF_SetAmxString(amx,params[2],weaponData[id].logname,params[3]); }
static cell AMX_NATIVE_CALL get_keyvalue(AMX *amx, cell *params) { int idx = params[1]; CHECK_ENTITY(idx); edict_t *pEntity = INDEXENT2(idx); int iLength=0; char *char1 = MF_GetAmxString(amx, params[2], 1, &iLength); return MF_SetAmxString(amx, params[3], INFO_KEY_VALUE(INFO_KEY_BUFFER(pEntity),char1), params[4]); }
// native geoip_code2(const ip[], ccode[3]); // Deprecated. static cell AMX_NATIVE_CALL amx_geoip_code2(AMX *amx, cell *params) { int length; char *ip = stripPort(MF_GetAmxString(amx, params[1], 0, &length)); const char *path[] = { "country", "iso_code", NULL }; const char *code = lookupString(ip, path); return MF_SetAmxString(amx, params[2], code ? code : "error", 3); }
// native geoip_timezone(const ip[], result[], len); static cell AMX_NATIVE_CALL amx_geoip_timezone(AMX *amx, cell *params) { int length; char *ip = stripPort(MF_GetAmxString(amx, params[1], 0, &length)); const char *path[] = { "location", "time_zone", NULL }; const char *timezone = lookupString(ip, path, &length); return MF_SetAmxString(amx, params[2], timezone ? timezone : "", ke::Min(length, params[3])); }
static cell AMX_NATIVE_CALL csdm_styleinfo(AMX *amx, cell *params) { int method = params[1]; SpawnMethod *pMethod = g_SpawnMngr.GetSpawn(method); if (!pMethod) return 0; return MF_SetAmxString(amx, params[2], pMethod->GetName(), params[3]); }
cell Call_Str_Void(AMX *amx, cell *params) { SETUP(2); #if defined(_WIN32) char *v=reinterpret_cast<char *(__fastcall *)(void *, int)>(__func)(pv, 0); #elif defined(__linux__) || defined(__APPLE__) char *v=reinterpret_cast<char *(*)(void *)>(__func)(pv); #endif return MF_SetAmxString(amx, params[3], v == NULL ? "" : v, *MF_GetAmxAddr(amx, params[4])); }
// from log to name static cell AMX_NATIVE_CALL wpnlog_to_name(AMX *amx, cell *params) { int iLen; char *log = MF_GetAmxString(amx,params[1],0,&iLen); for(int i = 0; i < DODMAX_WEAPONS; i++) { if(strcmp(log,weaponData[i].logname ) == 0) return MF_SetAmxString(amx,params[2],weaponData[i].name,params[3]); } return 0; }
static cell AMX_NATIVE_CALL get_info_keybuffer(AMX *amx, cell *params) { int iEnt = params[1]; CHECK_ENTITY(iEnt); edict_t *e = INDEXENT2(iEnt); char *info = GETINFOKEYBUFFER(e); return MF_SetAmxString(amx, params[2], info, params[3]); }
// native Continent:geoip_continent_code(const ip[], result[3] = ""); static cell AMX_NATIVE_CALL amx_geoip_continent_code(AMX *amx, cell *params) { int length; char *ip = stripPort(MF_GetAmxString(amx, params[1], 0, &length)); const char *path[] = { "continent", "code", NULL }; const char *code = lookupString(ip, path, &length); MF_SetAmxString(amx, params[2], code ? code : "", code ? 2 : 0); return getContinentId(code); }
cell Call_Str_Str(AMX *amx, cell *params) { SETUP(3); char *sz3=MF_GetAmxString(amx, params[3], 0, NULL); #if defined(_WIN32) char *v=reinterpret_cast<char *(__fastcall *)(void *, int, const char*)>(__func)(pv, 0, sz3); #elif defined(__linux__) || defined(__APPLE__) char *v=reinterpret_cast<char *(*)(void *, const char *)>(__func)(pv, sz3); #endif return MF_SetAmxString(amx, params[4], v == NULL ? "" : v, *MF_GetAmxAddr(amx, params[5])); }
static cell AMX_NATIVE_CALL SQL_QueryError(AMX *amx, cell *params) { AmxQueryInfo *qInfo = (AmxQueryInfo *)GetHandle(params[1], Handle_Query); if (!qInfo) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid query handle: %d", params[1]); return 0; } MF_SetAmxString(amx, params[2], qInfo->error, params[3]); return qInfo->info.errorcode; }
static cell AMX_NATIVE_CALL SQL_GetQueryString(AMX *amx, cell *params) { AmxQueryInfo *qInfo = (AmxQueryInfo *)GetHandle(params[1], Handle_Query); if (!qInfo || (!qInfo->pQuery && !qInfo->opt_ptr)) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid query handle: %d", params[1]); return 0; } const char *ptr = qInfo->pQuery ? qInfo->pQuery->GetQueryString() : qInfo->opt_ptr; return MF_SetAmxString(amx, params[2], ptr, params[3]); }
// native geoip_country(const ip[], result[], len = 45); // Deprecated. static cell AMX_NATIVE_CALL amx_geoip_country(AMX *amx, cell *params) { int length; char *ip = stripPort(MF_GetAmxString(amx, params[1], 0, &length)); const char *path[] = { "country", "names", "en", NULL }; const char *country = lookupString(ip, path, &length); if (!country) { return MF_SetAmxString(amx, params[2], "error", params[3]); } return MF_SetAmxStringUTF8Char(amx, params[2], country, length, params[3]); }
// native bool:geoip_code2_ex(const ip[], result[3]); static cell AMX_NATIVE_CALL amx_geoip_code2_ex(AMX *amx, cell *params) { int length; char *ip = stripPort(MF_GetAmxString(amx, params[1], 0, &length)); const char *path[] = { "country", "iso_code", NULL }; const char *code = lookupString(ip, path); if (!code) { return 0; } MF_SetAmxString(amx, params[2], code, 2); return 1; }
// native Regex:regex_compile_ex(const pattern[], flags = 0, error[] = "", maxLen = 0, &errcode = 0); static cell AMX_NATIVE_CALL regex_compile_ex(AMX *amx, cell *params) { int len; const char *regex = MF_GetAmxString(amx, params[1], 0, &len); int id = GetPEL(); RegEx *x = PEL[id]; if (x->Compile(regex, params[2]) == 0) { const char *err = x->mError; *MF_GetAmxAddr(amx, params[5]) = x->mErrorOffset; MF_SetAmxString(amx, params[3], err ? err : "unknown", params[4]); return -1; } return id + 1; }
cell Call_Void_Int_Str_Bool(AMX *amx, cell *params) { SETUP(4); char* sz4 = new char[48]; int i3=*MF_GetAmxAddr(amx, params[3]); bool b5=*MF_GetAmxAddr(amx, params[5]) ? true : false; #if defined(_WIN32) reinterpret_cast<void(__fastcall *)(void*, int, int, char *, bool)>(__func)(pv, 0, i3, sz4, b5); #elif defined(__linux__) || defined(__APPLE__) reinterpret_cast<void (*)(void *, int, char *, bool)>(__func)(pv, i3, sz4, b5); #endif MF_SetAmxString(amx, params[4], sz4 ? sz4 : "", *MF_GetAmxAddr(amx, params[6])); delete [] sz4; return 1; }