cell AMX_NATIVE_CALL pawn_regex_set(AMX* amx, cell* params) { const char *rexp = NULL; amx_StrParam(amx, params[1], rexp); if(rexp) { int aidi=(int)params[2]; //logprintf("aidi %d", aidi); if(aidi>=0 && aidi<TotalExpressions) { onig_free(rexpression[aidi].RegExpr); onig_region_free(rexpression[aidi].zreg, 1); UChar* pattern = (UChar* )rexp; OnigErrorInfo einfo; rexpression[aidi].id = onig_new(&rexpression[aidi].RegExpr, pattern, pattern + strlen(rexp), ONIG_OPTION_NONE, ONIG_ENCODING_UTF8, ONIG_SYNTAX_DEFAULT, &einfo); if(rexpression[aidi].id != ONIG_NORMAL) { UChar s[ONIG_MAX_ERROR_MESSAGE_LEN]; onig_error_code_to_str(s, rexpression[aidi].id, &einfo); logprintf("[REGEX ERROR]: %s | at index %d. regex_set aborted.", s, aidi); onig_free(rexpression[aidi].RegExpr); return -1; } rexpression[aidi].zreg = onig_region_new(); //logprintf("aidi %d", aidi); return 1; } logprintf("[REGEX ERROR]: Call regex_set with undefined parameter at index %d", aidi); return -1; } return -1337; }
//native TSC_SetChannelDescription(channelname[], desc[]); cell AMX_NATIVE_CALL native_TSC_SetChannelDescription(AMX* amx, cell* params) { char *TmpParam = NULL; amx_StrParam(amx, params[1], TmpParam); string ChannelName(TmpParam); TSServer.EscapeString(ChannelName); amx_StrParam(amx, params[2], TmpParam); string Desc(TmpParam); TSServer.EscapeString(Desc); CommandList *cmds = new CommandList; string CmdStr("channelfind pattern="); CmdStr.append(ChannelName); cmds->push(new CCommand(CmdStr, "cid")); CmdStr.assign("channeledit cid=<1> channel_description="); CmdStr.append(Desc); cmds->push(new CCommand(CmdStr)); TSServer.AddCommandListToQueue(cmds); return 1; }
cell AMX_NATIVE_CALL pawn_regex_match(AMX* amx, cell* params) { regex_t* RegExpr; const char *rexp = NULL, *string = NULL; amx_StrParam(amx, params[1], string); amx_StrParam(amx, params[2], rexp); if(string && rexp) { int r=NULL; UChar* pattern = (UChar* )rexp; OnigErrorInfo einfo; r = onig_new(&RegExpr, pattern, pattern + strlen((char* )pattern), ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, ONIG_SYNTAX_PERL, &einfo); //logprintf("[REGEX DEBUG]: rexp %s",pattern); if(r != ONIG_NORMAL) { UChar s[ONIG_MAX_ERROR_MESSAGE_LEN]; onig_error_code_to_str(s, r, &einfo); logprintf("[REGEX ERROR]: %s", s); onig_free(RegExpr); return -1; } UChar* str = (UChar* )string; OnigRegion *region; region = onig_region_new(); r = onig_match(RegExpr, str, str+strlen((char*) str), str, region, ONIG_OPTION_NONE); //logprintf("[REGEX DEBUG]: string %s",str); onig_region_free(region, 1); onig_free(RegExpr); //logprintf("[REGEX DEBUG]: return %d",r); return r; } return -1337; }
//native TSC_SetClientChannelGroup(uid[], groupid, channelname[]); cell AMX_NATIVE_CALL native_TSC_SetClientChannelGroup(AMX* amx, cell* params) { char *TmpParam = NULL; amx_StrParam(amx, params[1], TmpParam); string UID(TmpParam); TSServer.EscapeString(UID); amx_StrParam(amx, params[3], TmpParam); string ChannelName(TmpParam); TSServer.EscapeString(ChannelName); CommandList *cmds = new CommandList; string CmdStr("channelfind pattern="); CmdStr.append(ChannelName); cmds->push(new CCommand(CmdStr, "cid")); char FormatTmp[256]; sprintf(FormatTmp, "clientdbfind pattern=%s -uid", UID.c_str()); cmds->push(new CCommand(FormatTmp, "cldbid")); sprintf(FormatTmp, "setclientchannelgroup cgid=%d cid=<1> cldbid=<2>", (int)params[2]); cmds->push(new CCommand(FormatTmp)); TSServer.AddCommandListToQueue(cmds); return 1; }
//native TSC_MoveClient(uid[], channelname[]); cell AMX_NATIVE_CALL native_TSC_MoveClient(AMX* amx, cell* params) { char *TmpParam = NULL; amx_StrParam(amx, params[1], TmpParam); string UID(TmpParam); TSServer.EscapeString(UID); amx_StrParam(amx, params[2], TmpParam); string ChannelName(TmpParam); TSServer.EscapeString(ChannelName); CommandList *cmds = new CommandList; CCommand *cmd1 = new CCommand("clientlist -uid", "clid"); cmd1->MFind = "client_unique_identifier="; cmd1->MFind.append(UID); cmds->push(cmd1); char FormatTmp[128]; sprintf(FormatTmp, "channelfind pattern=%s", ChannelName.c_str()); cmds->push(new CCommand(FormatTmp, "cid")); cmds->push(new CCommand("clientmove clid=<1> cid=<2>")); TSServer.AddCommandListToQueue(cmds); return 1; }
//native TSC_MoveChannelBelowChannel(channelname[], parentchannelname[]); cell AMX_NATIVE_CALL native_TSC_MoveChannelBelowChannel(AMX* amx, cell* params) { char *TmpParam = NULL; amx_StrParam(amx, params[1], TmpParam); string ChannelName(TmpParam); TSServer.EscapeString(ChannelName); amx_StrParam(amx, params[2], TmpParam); string ParentChannelName(TmpParam); TSServer.EscapeString(ParentChannelName); CommandList *cmds = new CommandList; string CmdStr("channelfind pattern="); CmdStr.append(ChannelName); cmds->push(new CCommand(CmdStr, "cid")); CmdStr.assign("channelfind pattern="); CmdStr.append(ParentChannelName); cmds->push(new CCommand(CmdStr, "cid")); cmds->push(new CCommand("channeledit cid=<1> channel_order=<2>")); TSServer.AddCommandListToQueue(cmds); return 1; }
//native TSC_SendClientMessage(uid[], msg[]); cell AMX_NATIVE_CALL native_TSC_SendClientMessage(AMX* amx, cell* params) { char *TmpParam = NULL; amx_StrParam(amx, params[1], TmpParam); string UID(TmpParam); TSServer.EscapeString(UID); amx_StrParam(amx, params[2], TmpParam); string Msg(TmpParam); TSServer.EscapeString(Msg); CommandList *cmds = new CommandList; CCommand *cmd1 = new CCommand("clientlist -uid", "clid"); cmd1->MFind = "client_unique_identifier="; cmd1->MFind.append(UID); cmds->push(cmd1); char FormatTmp[256]; sprintf(FormatTmp, "sendtextmessage targetmode=1 target=<1> msg=%s", Msg.c_str()); cmds->push(new CCommand(FormatTmp, "cid")); TSServer.AddCommandListToQueue(cmds); return 1; }
//native TSC_SendChannelMessage(channelname[], msg[]); cell AMX_NATIVE_CALL native_TSC_SendChannelMessage(AMX* amx, cell* params) { char *TmpParam = NULL; amx_StrParam(amx, params[1], TmpParam); string ChannelName(TmpParam); TSServer.EscapeString(ChannelName); amx_StrParam(amx, params[2], TmpParam); string Msg(TmpParam); TSServer.EscapeString(Msg); CommandList *cmds = new CommandList; string CmdStr("channelfind pattern="); CmdStr.append(ChannelName); cmds->push(new CCommand(CmdStr, "cid")); char FormatTmp[256]; sprintf(FormatTmp, "sendtextmessage targetmode=2 target=<1> msg=%s", Msg.c_str()); cmds->push(new CCommand(FormatTmp)); TSServer.AddCommandListToQueue(cmds); return 1; }
cell AMX_NATIVE_CALL native_TSC_Connect(AMX* amx, cell* params) { char *IP = NULL, *VPort = NULL; amx_StrParam(amx, params[1], IP); amx_StrParam(amx, params[2], VPort); return TSServer.Connect(IP, VPort); }
cell AMX_NATIVE_CALL native_TSC_Login(AMX* amx, cell* params) { char *Login = NULL, *Pass = NULL, *Nick = NULL; amx_StrParam(amx, params[1], Login); amx_StrParam(amx, params[2], Pass); amx_StrParam(amx, params[3], Nick); return TSServer.Login(Login, Pass, Nick); }
static cell AMX_NATIVE_CALL n_SetQueryVar(AMX *amx, const cell *params) { engineModule *engine = new engineModule; char *var = NULL; char *vardesc = NULL; amx_StrParam(amx, params[1], var); amx_StrParam(amx, params[2], vardesc); engine->SetQueryVar(var, vardesc); delete engine; return 1; }
cell AMX_NATIVE_CALL pawn_regex_search(AMX* amx, cell* params) { regex_t* RegExpr; const char *rexp = NULL, *string = NULL; cell* addr[2] = {NULL, NULL}; amx_GetAddr(amx, params[3], &addr[0]); amx_GetAddr(amx, params[4], &addr[1]); amx_StrParam(amx, params[1], string); amx_StrParam(amx, params[2], rexp); if(string && rexp) { int r=NULL; UChar* pattern = (UChar* )rexp; OnigErrorInfo einfo; r = onig_new(&RegExpr, pattern, pattern + strlen((char* )pattern), ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, ONIG_SYNTAX_PERL, &einfo); //logprintf("[REGEX DEBUG]: rexp %s",pattern); if(r != ONIG_NORMAL) { UChar s[ONIG_MAX_ERROR_MESSAGE_LEN]; onig_error_code_to_str(s, r, &einfo); logprintf("[REGEX ERROR]: %s", s); onig_free(RegExpr); return -1; } UChar* str = (UChar* )string; OnigRegion *region; region = onig_region_new(); r = onig_search(RegExpr, str, str+strlen((char*) str), str, str+strlen((char*) str), region, ONIG_OPTION_NONE); if(r>=0) { *addr[0]=r; *addr[1]=region->end[region->num_regs-1]-1; } else if(r==ONIG_MISMATCH) { *addr[0]=-1; *addr[1]=-1; } else { UChar s[ONIG_MAX_ERROR_MESSAGE_LEN]; onig_error_code_to_str(s, r); logprintf("[REGEX ERROR]: %s\n", s); onig_region_free(region, 1); onig_free(RegExpr); return -1; } //logprintf("[REGEX DEBUG]: string %s",str); onig_region_free(region, 1); onig_free(RegExpr); //logprintf("[REGEX DEBUG]: return %d",r); return 1; } return -1337; }
static cell AMX_NATIVE_CALL amx_draw_menubar(AMX *amx, const cell *params) { char *b1, *b2, *b3, *b4; amx_StrParam(amx, params[1], b1); amx_StrParam(amx, params[2], b2); amx_StrParam(amx, params[3], b3); amx_StrParam(amx, params[4], b4); draw_menubar(b1, b2, b3, b4); return 0; }
// native mysql_statement_prepare(query[], parameters[]); static cell AMX_NATIVE_CALL n_mysql_statement_prepare(AMX* amx, cell* params) { CHECK_PARAMS(2); char* query, *parameters; amx_StrParam(amx, params[1], query); amx_StrParam(amx, params[2], parameters); if (strlen(query) == 0) return -1; return statementRegistry->Create(query, parameters); }
// native LoadAllMTAMap(flags); cell AMX_NATIVE_CALL n_LoadAllMTAMap(AMX* amx, cell* params) { char *szName; amx_StrParam(amx, params[1], szName); return pConverter->LoadAllMTAMap(static_cast<int>(params[2]) != 0); }
// native aat_NetStats(stats[]); cell AMX_NATIVE_CALL amxNatives::NetStats(AMX *amx, cell *params) { if(!arguments(1)) { aat_Debug("Number of arguments in native 'aat_NetStats' does not conform to definition"); logprintf("Anti-Attack Warning: Number of arguments in native 'aat_NetStats' does not conform to definition"); return NULL; } char *stats = NULL; amx_StrParam(amx, params[1], stats); if(stats == NULL) { aat_Debug("NULL network stats passed to native 'aat_NetStats'"); logprintf("Anti-Attack warning: NULL network stats passed to native 'aat_NetStats'"); return NULL; } std::string netStats; netStats.assign(stats); netStats.erase(NULL, (netStats.find("Inst. KBits per second: ") + 25)); netStats.erase(netStats.find('\n')); float ret = atof(netStats.c_str()); return amx_ftoc(ret); }
// GetMapIDFromName(const mapname[]); cell AMX_NATIVE_CALL n_GetMapIDFromName(AMX* amx, cell* params) { char *szName; amx_StrParam(amx, params[1], szName); return pConverter->GetMapIDFromName(std::string(szName)); }
/* sendstring(const message[], const destination[]="") * destination has the format "127.0.0.1:9930"; when set to an empty string, * a broadcast is sent. * To mark the text as a "string", the function inserts a "byte order mark" in * front of it. It does this for Extended ASCII strings too, although this is * not entirely correct. * Returns true on success, false on failure. */ static cell AMX_NATIVE_CALL n_sendstring(AMX *amx, const cell *params) { int r = 0, length; cell *cstr; char *host, *message, *ptr; short port=AMX_DGRAMPORT; cstr = amx_Address(amx, params[1]); amx_UTF8Len(cstr, &length); if ((message = alloca(length + 3 + 1)) != NULL) { /* insert the byte order mark (BOM) */ message[0]='\xef'; message[1]='\xbb'; message[2]='\xbf'; /* if this is a wide string, convert it to UTF-8 */ if ((ucell)*cstr<=UNPACKEDMAX) { ptr=message+3; while (*cstr!=0) amx_UTF8Put(ptr, &ptr, length - (ptr-message), *cstr++); *ptr='\0'; } else { amx_GetString(message+3, cstr, 0, UNLIMITED); } /* if */ amx_StrParam(amx, params[2], host); if (host != NULL && (ptr=strchr(host,':'))!=NULL && isdigit(ptr[1])) { *ptr++='\0'; port=(short)atoi(ptr); } /* if */ r= (udp_Send(host,port,message,strlen(message)+1) > 0); } /* if */ return r; }
static cell AMX_NATIVE_CALL amx_fpga_load(AMX *amx, const cell *params) { set_port_directions(0); // All as inputs char *fname; amx_StrParam(amx, params[1], fname); uint8_t *buffer; if (amx_Allot(amx, 1024/sizeof(cell), (cell**)&buffer) != 0) return false; bool status = false; if (!fname[0]) { have_custom_image = false; status = fpga_configure(NULL, buffer); set_port_directions(default_pins); } else { have_custom_image = true; FIL file; if (f_open(&file, fname, FA_READ) != FR_OK) return false; status = fpga_configure(&file, buffer); f_close(&file); } amx_Release(amx, (cell*)buffer); return status; }
// native mysql_connect(const hostname[], const username[], const password[], const database[], port = 3306); // returns: connectionHandle. static cell AMX_NATIVE_CALL n_mysql_connect(AMX* amx, cell* params) { CHECK_PARAMS(5); char* hostname, * username, * password, * database; amx_StrParam(amx, params[1], hostname); amx_StrParam(amx, params[2], username); amx_StrParam(amx, params[3], password); amx_StrParam(amx, params[4], database); unsigned int port = params[5]; if (!hostname || !username || !password || !database) return 0; Script script(amx); return connectionController->connect(script, hostname, username, password, database, port); }
void CCallback::FillCallbackParams(AMX* amx, cell* params, const int ConstParamCount) { unsigned int ParamIdx = 1; cell *AddressPtr; for(string::iterator c = ParamFormat.begin(), end = ParamFormat.end(); c != end; ++c) { if ( (*c) == 'd' || (*c) == 'i') { amx_GetAddr(amx, params[ConstParamCount + ParamIdx], &AddressPtr); char IntBuf[12]; //12 -> strlen of (-2^31) + '\0' ConvertIntToStr<10>((*AddressPtr), IntBuf); Parameters.push(IntBuf); } else if ( (*c) == 's' || (*c) == 'z') { char *StrBuf = NULL; amx_StrParam(amx, params[ConstParamCount + ParamIdx], StrBuf); Parameters.push(StrBuf == NULL ? string() : StrBuf); } else if ( (*c) == 'f') { amx_GetAddr(amx, params[ConstParamCount + ParamIdx], &AddressPtr); char FloatBuf[84]; //84 -> strlen of (2^(2^7)) + '\0' ConvertFloatToStr(amx_ctof(*AddressPtr), FloatBuf); Parameters.push(FloatBuf); } else Parameters.push("NULL"); ParamIdx++; } }
jobject makeObjectFromReturnType(JNIEnv *env, jint returnType, AMX *amx, cell retval) { if (returnType == 0) //If returnType == Integer { auto cls = env->FindClass("java/lang/Integer"); auto methodID = env->GetMethodID(cls, "<init>", "(I)V"); return env->NewObject(cls, methodID, retval); } else if (returnType == 1) //If returnType == Float { auto cls = env->FindClass("java/lang/Float"); auto methodID = env->GetMethodID(cls, "<init>", "(F)V"); return env->NewObject(cls, methodID, amx_ctof(retval)); } else if (returnType == 2) //If returnType == String { char* result = NULL; amx_StrParam(amx, retval, result); auto cls = env->FindClass("java/lang/String"); auto methodID = env->GetMethodID(cls, "<init>", "(Ljava/lang/String;)V"); //TODO: fix return env->NewObject(cls, methodID, result); } return nullptr; }
// native mysql_fetch_field_string(resultId, field[], buffer[], bufferSize = sizeof(buffer)); static cell AMX_NATIVE_CALL n_mysql_fetch_field_string(AMX* amx, cell* params) { CHECK_PARAMS(4); ResultEntry* entry = resultController->at(static_cast<unsigned int>(params[1])); if (entry == nullptr) return 0; char* fieldName; amx_StrParam(amx, params[2], fieldName); if (!fieldName || !strlen(fieldName)) return 0; cell* bufferCell; amx_GetAddr(amx, params[3], &bufferCell); ColumnInfo::ColumnType fieldType = ColumnInfo::UnknownColumnType; const RowInfo::FieldValue* fieldValue = entry->fetch_field(fieldName, fieldType); if (fieldType != ColumnInfo::StringColumnType) { DebugPrinter::Print("[MySQL] Tried to get column \"%s\" with the wrong data-type, ignored.", fieldName); return 0; } amx_SetString(bufferCell, fieldValue->string_val, 0, 0, static_cast<size_t>(params[4])); return strlen(fieldValue->string_val); }
//Wrapper functions (These are defined so we can use them on the script later) static cell AMX_NATIVE_CALL n_print(AMX* amx, const cell *params) { char *ret = NULL; amx_StrParam(amx, params[1], ret); printf("%s\n", ret); return 0; }
static cell AMX_NATIVE_CALL n_FindEntityByClassname(AMX *amx, const cell *params) { CBaseEntity *entity = new CBaseEntity; char *ret = NULL; amx_StrParam(amx, params[2], ret); int id = entity->FindEntityByClassname(params[1], ret); delete entity; return id; }
static cell AMX_NATIVE_CALL n_ConsoleCommand(AMX* amx, const cell *params) { char *ret = NULL; amx_StrParam(amx, params[1], ret); engineModule *engine = new engineModule; engine->ConsoleCommand(ret); delete engine; return 0; }
static cell AMX_NATIVE_CALL amx_draw_flowtext(AMX *amx, const cell *params) { char *text; amx_StrParam(amx, params[1], text); draw_flowtext(text, params[2], params[3], params[4], params[5], params[6], params[7], params[8]); return 0; }
static cell AMX_NATIVE_CALL n_PrecacheUnmodified(AMX* amx, const cell *params) { char *ret = NULL; amx_StrParam(amx, params[1], ret); engineModule *engine = new engineModule; engine->Precache(TYPE_UNMODIFIED, ret); delete engine; return 0; }
static cell AMX_NATIVE_CALL n_PrecacheEvent(AMX* amx, const cell *params) { char *ret = NULL; amx_StrParam(amx, params[1], ret); engineModule *engine = new engineModule; engine->Precache(TYPE_EVENT, ret); delete engine; return 0; }
static cell AMX_NATIVE_CALL n_PrecacheModel(AMX* amx, const cell *params) { char *ret = NULL; amx_StrParam(amx, params[1], ret); engineModule *engine = new engineModule; int m_Index = engine->Precache(TYPE_MDL, ret); delete engine; return m_Index; }