int gsc_mysql_real_connect() { int mysql; char *host; char *user; char *pass; char *db; int port; int helper = 0; helper += stackGetParamInt(1, &mysql); helper += stackGetParamString(2, &host); helper += stackGetParamString(3, &user); helper += stackGetParamString(4, &pass); helper += stackGetParamString(5, &db); helper += stackGetParamInt(6, &port); #if DEBUG_MYSQL printf_hide("gsc_mysql_real_connect(mysql=%d, host=\"%s\", user=\"%s\", pass=\"%s\", db=\"%s\", port=%d)\n", mysql, host, user, pass, db, port); #endif if (helper != 6) { printf_hide("scriptengine> wrongs args for mysql_real_connect(...);\n"); return stackPushUndefined(); } mysql = (int) mysql_real_connect((MYSQL *)mysql, host, user, pass, db, port, NULL, 0); return stackReturnInt(mysql); }
int gsc_mysql_real_escape_string() { int mysql; char *str; int helper = 0; helper += stackGetParamInt(1, &mysql); helper += stackGetParamString(2, &str); #if DEBUG_MYSQL printf_hide("gsc_mysql_real_escape_string(%d, \"%s\")\n", mysql, str); #endif if (helper != 2) { printf_hide("scriptengine> wrongs args for mysql_real_escape_string(...);\n"); return stackPushUndefined(); } char *to = (char *) malloc(strlen(str) * 2 + 1); int ret = mysql_real_escape_string((MYSQL *)mysql, to, str, strlen(str)); int retString = stackPushString(to); free(to); return retString; }
void gsc_set_userinfo(int id) { char* key; char* value; if(!stackGetParamString(0, &key)) { printf("First param needs to be a string for get_userinfo\n"); stackPushUndefined(); return; } if(!stackGetParamString(1, &value)) { printf("second param needs to be a string for get_userinfo\n"); stackPushUndefined(); return; } int entity = PLAYERBASE(id); Info_SetValueForKey((char*)entity + 12, key, value); stackPushUndefined(); }
void gsc_exec() { char *command; if (!stackGetParamString(0, &command)) { stackError("gsc_exec() argument is undefined or has wrong type"); stackPushUndefined(); return; } Com_DPrintf("gsc_exec() executing: %s\n", command); FILE *fp; fp = popen(command, "r"); if (fp == NULL) { stackPushUndefined(); return; } char c; int curpos = 0; char content[COD2_MAX_STRINGLENGTH]; stackPushArray(); while ((c = getc(fp)) != EOF) { if (c == '\n' || curpos == COD2_MAX_STRINGLENGTH - 1) { content[curpos] = '\0'; stackPushString(content); stackPushArrayLast(); curpos = 0; } else { content[curpos] = c; curpos++; } } content[curpos] = '\0'; stackPushString(content); stackPushArrayLast(); pclose(fp); }
void gsc_kick_slot() { int id; char* msg; char* reason; if ( ! stackGetParams("is", &id, &msg)) { printf("scriptengine> ERROR: gsc_kick_slot(): param \"id\"[1] has to be an int!\n"); printf("scriptengine> ERROR: gsc_kick_slot(): param \"msg\"[2] has to be an string!\n"); stackPushUndefined(); return; } if(getAddressType(id) == NA_LOOPBACK) { stackReturnInt(0); return; // host } #if COD_VERSION == COD2_1_0 int guid_offset = 0x765F4; #elif COD_VERSION == COD2_1_2 int guid_offset = 0x76704; #elif COD_VERSION == COD2_1_3 int guid_offset = 0xAE704; #else #warning gsc_kick_slot() got no working addresses for guid_offset int guid_offset = 0x0; #endif int entity = PLAYERBASE(id); char* name = Info_ValueForKey((char*)entity+12, "name"); // read before drop client resets the userinfo int guid = *(int*)(entity + guid_offset); SV_DropClient(entity, msg); int * lastPacketTime = (int*)getLastPacketTime(id); *lastPacketTime = getSVSTime(); // in case there is a funny zombie (copied from Q3) if(!stackGetParamString(2, &reason)) { Com_Printf("%s (guid %i) was kicked\n", name, guid); stackReturnInt(1); return; } Com_Printf("%s (guid %i) was kicked for %s\n", name, guid, reason); stackReturnInt(1); }
void gsc_get_userinfo(int id) { char* key; char* val; if(!stackGetParamString(0, &key)) { printf("First param needs to be a string for get_userinfo\n"); stackPushUndefined(); return; } int entity = PLAYERBASE(id); val = Info_ValueForKey((char*)entity+12, key); if(strlen(val)) stackPushString(val); else stackPushUndefined(); }
int gsc_mysql_query() { int mysql; char *sql; int helper = 0; helper += stackGetParamInt(1, &mysql); helper += stackGetParamString(2, &sql); #if DEBUG_MYSQL printf_hide("gsc_mysql_query(%d, \"%s\")\n", mysql, sql); #endif if (helper != 2) { printf_hide("scriptengine> wrongs args for mysql_query(...);\n"); return stackPushUndefined(); } int ret = mysql_query((MYSQL *)mysql, sql); return stackReturnInt(ret); }
int gsc_mysql_stmt_prepare() { int mysql_stmt; char *sql; int len; int helper = 0; helper += stackGetParamInt(1, &mysql_stmt); helper += stackGetParamString(2, &sql); helper += stackGetParamInt(3, &len); #if DEBUG_MYSQL printf_hide("gsc_mysql_stmt_prepare(mysql_stmt=%d, sql=%s)\n", mysql_stmt, sql); #endif if (helper != 3) { printf_hide("scriptengine> wrongs args for gsc_mysql_stmt_prepare(mysql_stmt);\n"); return stackReturnInt(0); } int ret = mysql_stmt_prepare((MYSQL_STMT*)mysql_stmt, sql, len); return stackReturnInt(ret); }
void gsc_exec_async_create_nosave() { char *command; int callback; if (!stackGetParamString(0, &command)) { stackError("gsc_exec_async_create_nosave() argument is undefined or has wrong type"); stackPushUndefined(); return; } Com_DPrintf("gsc_exec_async_create_nosave() executing: %s\n", command); exec_async_task *current = first_exec_async_task; while (current != NULL && current->next != NULL) current = current->next; exec_async_task *newtask = new exec_async_task; strncpy(newtask->command, command, COD2_MAX_STRINGLENGTH - 1); newtask->command[COD2_MAX_STRINGLENGTH - 1] = '\0'; newtask->output = NULL; newtask->prev = current; newtask->next = NULL; if (!stackGetParamFunction(1, &callback)) newtask->callback = 0; else newtask->callback = callback; newtask->done = false; newtask->save = false; newtask->error = false; newtask->levelId = scrVarPub.levelId; newtask->hasargument = true; int valueInt; float valueFloat; char *valueString; vec3_t valueVector; unsigned int valueObject; if (stackGetParamInt(2, &valueInt)) { newtask->valueType = INT_VALUE; newtask->intValue = valueInt; } else if (stackGetParamFloat(2, &valueFloat)) { newtask->valueType = FLOAT_VALUE; newtask->floatValue = valueFloat; } else if (stackGetParamString(2, &valueString)) { newtask->valueType = STRING_VALUE; strcpy(newtask->stringValue, valueString); } else if (stackGetParamVector(2, valueVector)) { newtask->valueType = VECTOR_VALUE; newtask->vectorValue[0] = valueVector[0]; newtask->vectorValue[1] = valueVector[1]; newtask->vectorValue[2] = valueVector[2]; } else if (stackGetParamObject(2, &valueObject)) { newtask->valueType = OBJECT_VALUE; newtask->objectValue = valueObject; } else newtask->hasargument = false; if (current != NULL) current->next = newtask; else first_exec_async_task = newtask; pthread_t exec_doer; if (pthread_create(&exec_doer, NULL, exec_async, newtask) != 0) { stackError("gsc_exec_async_create_nosave() error creating exec async handler thread!"); stackPushUndefined(); return; } if (pthread_detach(exec_doer) != 0) { stackError("gsc_exec_async_create_nosave() error detaching exec async handler thread!"); stackPushUndefined(); return; } stackPushInt(1); }