X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=mvm_cmds.c;h=9d154b4969510e8ac968bfac217618d382589925;hp=e0ae2bac4087f8cad25b8e53f84b4b628c16f729;hb=9e0b57e36ca8bb835c2f49901b4493b1f3b5625a;hpb=6344cb05f8d43318708d528da8deff3a73c9458f diff --git a/mvm_cmds.c b/mvm_cmds.c index e0ae2bac..9d154b49 100644 --- a/mvm_cmds.c +++ b/mvm_cmds.c @@ -4,29 +4,44 @@ #include "clvm_cmds.h" #include "menu.h" +// TODO check which strings really should be engine strings + //============================================================================ // Menu -char *vm_m_extensions = +const char *vm_m_extensions = "BX_WAL_SUPPORT " "DP_CINEMATIC_DPV " +"DP_CSQC_BINDMAPS " +"DP_CRYPTO " +"DP_GFX_FONTS " +"DP_GFX_FONTS_FREETYPE " +"DP_UTF8 " "DP_FONT_VARIABLEWIDTH " "DP_GECKO_SUPPORT " "DP_MENU_EXTRESPONSEPACKET " "DP_QC_ASINACOSATANATAN2TAN " +"DP_QC_AUTOCVARS " "DP_QC_CMD " "DP_QC_CRC16 " "DP_QC_CVAR_TYPE " +"DP_QC_CVAR_DESCRIPTION " +"DP_QC_FINDCHAIN_TOFIELD " +"DP_QC_LOG " "DP_QC_RENDER_SCENE " +"DP_QC_SPRINTF " "DP_QC_STRFTIME " "DP_QC_STRINGBUFFERS " +"DP_QC_STRINGBUFFERS_CVARLIST " "DP_QC_STRINGCOLORFUNCTIONS " "DP_QC_STRING_CASE_FUNCTIONS " "DP_QC_STRREPLACE " "DP_QC_TOKENIZEBYSEPARATOR " +"DP_QC_TOKENIZE_CONSOLE " "DP_QC_UNLIMITEDTEMPSTRINGS " "DP_QC_URI_ESCAPE " "DP_QC_URI_GET " +"DP_QC_URI_POST " "DP_QC_WHICHPACK " "FTE_STRINGS " ; @@ -140,93 +155,55 @@ void VM_M_getkeydest(void) } } + /* ========= -VM_M_callfunction +VM_M_getresolution - callfunction(...,string function_name) -Extension: pass +vector getresolution(float number) ========= */ -mfunction_t *PRVM_ED_FindFunction (const char *name); -void VM_M_callfunction(void) +void VM_M_getresolution(void) { - mfunction_t *func; - const char *s; + int nr, fs; + VM_SAFEPARMCOUNTRANGE(1, 2, VM_getresolution); - VM_SAFEPARMCOUNTRANGE(1, 8, VM_M_callfunction); - - s = PRVM_G_STRING(OFS_PARM0+(prog->argc - 1)*3); - - VM_CheckEmptyString(s); + nr = (int)PRVM_G_FLOAT(OFS_PARM0); - func = PRVM_ED_FindFunction(s); + fs = ((prog->argc <= 1) || ((int)PRVM_G_FLOAT(OFS_PARM1))); - if(!func) - PRVM_ERROR("VM_M_callfunciton: function %s not found !", s); - else if (func->first_statement < 0) + if(nr < 0 || nr >= (fs ? video_resolutions_count : video_resolutions_hardcoded_count)) { - // negative statements are built in functions - int builtinnumber = -func->first_statement; - prog->xfunction->builtinsprofile++; - if (builtinnumber < prog->numbuiltins && prog->builtins[builtinnumber]) - prog->builtins[builtinnumber](); - else - PRVM_ERROR("No such builtin #%i in %s; most likely cause: outdated engine build. Try updating!", builtinnumber, PRVM_NAME); + PRVM_G_VECTOR(OFS_RETURN)[0] = 0; + PRVM_G_VECTOR(OFS_RETURN)[1] = 0; + PRVM_G_VECTOR(OFS_RETURN)[2] = 0; } - else if(func - prog->functions > 0) + else { - prog->argc--; - PRVM_ExecuteProgram(func - prog->functions,""); - prog->argc++; + video_resolution_t *r = &((fs ? video_resolutions : video_resolutions_hardcoded)[nr]); + PRVM_G_VECTOR(OFS_RETURN)[0] = r->width; + PRVM_G_VECTOR(OFS_RETURN)[1] = r->height; + PRVM_G_VECTOR(OFS_RETURN)[2] = r->pixelheight; } } -/* -========= -VM_M_isfunction - -float isfunction(string function_name) -========= -*/ -mfunction_t *PRVM_ED_FindFunction (const char *name); -void VM_M_isfunction(void) +void VM_M_getgamedirinfo(void) { - mfunction_t *func; - const char *s; - - VM_SAFEPARMCOUNT(1, VM_M_isfunction); - - s = PRVM_G_STRING(OFS_PARM0); - - VM_CheckEmptyString(s); - - func = PRVM_ED_FindFunction(s); - - if(!func) - PRVM_G_FLOAT(OFS_RETURN) = false; - else - PRVM_G_FLOAT(OFS_RETURN) = true; -} - -/* -========= -VM_M_getresolution - -vector getresolution(float number) -========= -*/ -void VM_M_getresolution(void) -{ - int nr; - VM_SAFEPARMCOUNT(1, VM_getresolution); + int nr, item; + VM_SAFEPARMCOUNT(2, VM_getgamedirinfo); nr = (int)PRVM_G_FLOAT(OFS_PARM0); + item = (int)PRVM_G_FLOAT(OFS_PARM1); - // FIXME bounds check - PRVM_G_VECTOR(OFS_RETURN)[0] = video_resolutions[nr].width; - PRVM_G_VECTOR(OFS_RETURN)[1] = video_resolutions[nr].height; - PRVM_G_VECTOR(OFS_RETURN)[2] = 0; + PRVM_G_INT( OFS_RETURN ) = OFS_NULL; + + if(nr >= 0 && nr < fs_all_gamedirs_count) + { + if(item == 0) + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( fs_all_gamedirs[nr].name ); + else if(item == 1) + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( fs_all_gamedirs[nr].description ); + } } /* @@ -262,6 +239,7 @@ void VM_M_getserverliststat( void ) return; case 1: PRVM_G_FLOAT ( OFS_RETURN ) = serverlist_cachecount; + return; case 2: PRVM_G_FLOAT ( OFS_RETURN ) = masterquerycount; return; @@ -333,25 +311,25 @@ void VM_M_setserverlistmaskstring( void ) switch( field ) { case SLIF_CNAME: - strlcpy( mask->info.cname, PRVM_G_STRING( OFS_PARM2 ), sizeof(mask->info.cname) ); + strlcpy( mask->info.cname, str, sizeof(mask->info.cname) ); break; case SLIF_NAME: - strlcpy( mask->info.name, PRVM_G_STRING( OFS_PARM2 ), sizeof(mask->info.name) ); + strlcpy( mask->info.name, str, sizeof(mask->info.name) ); break; case SLIF_QCSTATUS: - strlcpy( mask->info.qcstatus, PRVM_G_STRING( OFS_PARM2 ), sizeof(mask->info.qcstatus) ); + strlcpy( mask->info.qcstatus, str, sizeof(mask->info.qcstatus) ); break; case SLIF_PLAYERS: - strlcpy( mask->info.players, PRVM_G_STRING( OFS_PARM2 ), sizeof(mask->info.players) ); + strlcpy( mask->info.players, str, sizeof(mask->info.players) ); break; case SLIF_MAP: - strlcpy( mask->info.map, PRVM_G_STRING( OFS_PARM2 ), sizeof(mask->info.map) ); + strlcpy( mask->info.map, str, sizeof(mask->info.map) ); break; case SLIF_MOD: - strlcpy( mask->info.mod, PRVM_G_STRING( OFS_PARM2 ), sizeof(mask->info.mod) ); + strlcpy( mask->info.mod, str, sizeof(mask->info.mod) ); break; case SLIF_GAME: - strlcpy( mask->info.game, PRVM_G_STRING( OFS_PARM2 ), sizeof(mask->info.game) ); + strlcpy( mask->info.game, str, sizeof(mask->info.game) ); break; default: VM_Warning( "VM_M_setserverlistmaskstring: Bad field number %i passed!\n", field ); @@ -417,7 +395,7 @@ void VM_M_setserverlistmasknumber( void ) mask->info.freeslots = number; break; case SLIF_ISFAVORITE: - mask->info.isfavorite = number; + mask->info.isfavorite = number != 0; break; default: VM_Warning( "VM_M_setserverlistmasknumber: Bad field number %i passed!\n", field ); @@ -465,35 +443,35 @@ void VM_M_getserverliststring(void) Con_Print("VM_M_getserverliststring: bad hostnr passed!\n"); return; } - cache = serverlist_viewlist[hostnr]; + cache = ServerList_GetViewEntry(hostnr); switch( (int) PRVM_G_FLOAT(OFS_PARM0) ) { case SLIF_CNAME: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetEngineString( cache->info.cname ); + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( cache->info.cname ); break; case SLIF_NAME: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetEngineString( cache->info.name ); + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( cache->info.name ); break; case SLIF_QCSTATUS: - PRVM_G_INT (OFS_RETURN ) = PRVM_SetEngineString (cache->info.qcstatus ); + PRVM_G_INT (OFS_RETURN ) = PRVM_SetTempString (cache->info.qcstatus ); break; case SLIF_PLAYERS: - PRVM_G_INT (OFS_RETURN ) = PRVM_SetEngineString (cache->info.players ); + PRVM_G_INT (OFS_RETURN ) = PRVM_SetTempString (cache->info.players ); break; case SLIF_GAME: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetEngineString( cache->info.game ); + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( cache->info.game ); break; case SLIF_MOD: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetEngineString( cache->info.mod ); + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( cache->info.mod ); break; case SLIF_MAP: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetEngineString( cache->info.map ); + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( cache->info.map ); break; // TODO remove this again case 1024: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetEngineString( cache->line1 ); + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( cache->line1 ); break; case 1025: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetEngineString( cache->line2 ); + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( cache->line2 ); break; default: Con_Print("VM_M_getserverliststring: bad field number passed!\n"); @@ -523,7 +501,7 @@ void VM_M_getserverlistnumber(void) Con_Print("VM_M_getserverliststring: bad hostnr passed!\n"); return; } - cache = serverlist_viewlist[hostnr]; + cache = ServerList_GetViewEntry(hostnr); switch( (int) PRVM_G_FLOAT(OFS_PARM0) ) { case SLIF_MAXPLAYERS: PRVM_G_FLOAT( OFS_RETURN ) = cache->info.maxplayers; @@ -566,7 +544,7 @@ void VM_M_setserverlistsort( void ) VM_SAFEPARMCOUNT( 2, VM_M_setserverlistsort ); serverlist_sortbyfield = (serverlist_infofield_t)((int)PRVM_G_FLOAT( OFS_PARM0 )); - serverlist_sortflags = (qboolean) PRVM_G_FLOAT( OFS_PARM1 ); + serverlist_sortflags = (int) PRVM_G_FLOAT( OFS_PARM1 ); } /* @@ -743,22 +721,6 @@ void VM_M_WriteEntity (void) MSG_WriteShort (VM_M_WriteDest(), PRVM_G_EDICTNUM(OFS_PARM0)); } -//string(void) getextresponse = #624; // returns the next extResponse packet that was sent to this client -void VM_M_getextresponse (void) -{ - VM_SAFEPARMCOUNT(0,VM_argv); - - if (net_extresponse_count <= 0) - PRVM_G_INT(OFS_RETURN) = OFS_NULL; - else - { - int first; - --net_extresponse_count; - first = (net_extresponse_last + NET_EXTRESPONSE_MAX - net_extresponse_count) % NET_EXTRESPONSE_MAX; - PRVM_G_INT(OFS_RETURN) = PRVM_SetEngineString(net_extresponse[first]); - } -} - /* ================= VM_M_copyentity @@ -774,7 +736,7 @@ static void VM_M_copyentity (void) VM_SAFEPARMCOUNT(2,VM_M_copyentity); in = PRVM_G_EDICT(OFS_PARM0); out = PRVM_G_EDICT(OFS_PARM1); - memcpy(out->fields.vp, in->fields.vp, prog->progs->entityfields * 4); + memcpy(out->fields.vp, in->fields.vp, prog->entityfields * 4); } //#66 vector() getmousepos (EXT_CSQC) @@ -790,6 +752,99 @@ static void VM_M_getmousepos(void) VectorSet(PRVM_G_VECTOR(OFS_RETURN), in_mouse_x * vid_conwidth.integer / vid.width, in_mouse_y * vid_conheight.integer / vid.height, 0); } +void VM_M_crypto_getkeyfp(void) +{ + lhnetaddress_t addr; + const char *s; + char keyfp[FP64_SIZE + 1]; + + VM_SAFEPARMCOUNT(1,VM_M_crypto_getkeyfp); + + s = PRVM_G_STRING( OFS_PARM0 ); + VM_CheckEmptyString( s ); + + if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, keyfp, sizeof(keyfp), NULL, 0, NULL)) + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( keyfp ); + else + PRVM_G_INT( OFS_RETURN ) = OFS_NULL; +} +void VM_M_crypto_getidfp(void) +{ + lhnetaddress_t addr; + const char *s; + char idfp[FP64_SIZE + 1]; + + VM_SAFEPARMCOUNT(1,VM_M_crypto_getidfp); + + s = PRVM_G_STRING( OFS_PARM0 ); + VM_CheckEmptyString( s ); + + if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, NULL, 0, idfp, sizeof(idfp), NULL)) + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( idfp ); + else + PRVM_G_INT( OFS_RETURN ) = OFS_NULL; +} +void VM_M_crypto_getencryptlevel(void) +{ + lhnetaddress_t addr; + const char *s; + int aeslevel; + + VM_SAFEPARMCOUNT(1,VM_M_crypto_getencryptlevel); + + s = PRVM_G_STRING( OFS_PARM0 ); + VM_CheckEmptyString( s ); + + if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, NULL, 0, NULL, 0, &aeslevel)) + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(aeslevel ? va("%d AES128", aeslevel) : "0"); + else + PRVM_G_INT( OFS_RETURN ) = OFS_NULL; +} +void VM_M_crypto_getmykeyfp(void) +{ + int i; + char keyfp[FP64_SIZE + 1]; + + VM_SAFEPARMCOUNT(1,VM_M_crypto_getmykey); + + i = PRVM_G_FLOAT( OFS_PARM0 ); + switch(Crypto_RetrieveLocalKey(i, keyfp, sizeof(keyfp), NULL, 0)) + { + case -1: + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(""); + break; + case 0: + PRVM_G_INT( OFS_RETURN ) = OFS_NULL; + break; + default: + case 1: + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(keyfp); + break; + } +} +void VM_M_crypto_getmyidfp(void) +{ + int i; + char idfp[FP64_SIZE + 1]; + + VM_SAFEPARMCOUNT(1,VM_M_crypto_getmykey); + + i = PRVM_G_FLOAT( OFS_PARM0 ); + switch(Crypto_RetrieveLocalKey(i, NULL, 0, idfp, sizeof(idfp))) + { + case -1: + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(""); + break; + case 0: + PRVM_G_INT( OFS_RETURN ) = OFS_NULL; + break; + default: + case 1: + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(idfp); + break; + } +} + prvm_builtin_t vm_m_builtins[] = { NULL, // #0 NULL function (not callable) VM_checkextension, // #1 @@ -1158,24 +1213,24 @@ NULL, // #336 NULL, // #337 NULL, // #338 NULL, // #339 -NULL, // #340 -NULL, // #341 -NULL, // #342 +VM_keynumtostring, // #340 string keynumtostring(float keynum) +VM_stringtokeynum, // #341 float stringtokeynum(string key) +VM_getkeybind, // #342 string(float keynum[, float bindmap]) getkeybind (EXT_CSQC) NULL, // #343 NULL, // #344 NULL, // #345 NULL, // #346 NULL, // #347 NULL, // #348 -NULL, // #349 +VM_CL_isdemo, // #349 NULL, // #350 NULL, // #351 NULL, // #352 -NULL, // #353 +VM_wasfreed, // #353 float(entity ent) wasfreed NULL, // #354 -NULL, // #355 -NULL, // #356 -NULL, // #357 +VM_CL_videoplaying, // #355 +VM_findfont, // #356 float(string fontname) loadfont (DP_GFX_FONTS) +VM_loadfont, // #357 float(string fontname, string fontmaps, string sizes, float slot) loadfont (DP_GFX_FONTS) NULL, // #358 NULL, // #359 NULL, // #360 @@ -1288,7 +1343,7 @@ VM_drawline, // #466 VM_drawcolorcodedstring, // #467 VM_stringwidth, // #468 VM_drawsubpic, // #469 -NULL, // #470 +VM_drawrotpic, // #470 VM_asin, // #471 float(float s) VM_asin (DP_QC_ASINACOSATANATAN2TAN) VM_acos, // #472 float(float c) VM_acos (DP_QC_ASINACOSATANATAN2TAN) VM_atan, // #473 float(float t) VM_atan (DP_QC_ASINACOSATANATAN2TAN) @@ -1331,12 +1386,12 @@ NULL, // #509 VM_uri_escape, // #510 string(string in) uri_escape = #510; VM_uri_unescape, // #511 string(string in) uri_unescape = #511; VM_etof, // #512 float(entity ent) num_for_edict = #512 (DP_QC_NUM_FOR_EDICT) -VM_uri_get, // #513 float(string uril, float id) uri_get = #513; (DP_QC_URI_GET) -NULL, // #514 -NULL, // #515 -NULL, // #516 -NULL, // #517 -NULL, // #518 +VM_uri_get, // #513 float(string uri, float id, [string post_contenttype, string post_delim, [float buf]]) uri_get = #513; (DP_QC_URI_GET, DP_QC_URI_POST) +VM_tokenize_console, // #514 float(string str) tokenize_console = #514; (DP_QC_TOKENIZE_CONSOLE) +VM_argv_start_index, // #515 float(float idx) argv_start_index = #515; (DP_QC_TOKENIZE_CONSOLE) +VM_argv_end_index, // #516 float(float idx) argv_end_index = #516; (DP_QC_TOKENIZE_CONSOLE) +VM_buf_cvarlist, // #517 void(float buf, string prefix, string antiprefix) buf_cvarlist = #517; (DP_QC_STRINGBUFFERS_CVARLIST) +VM_cvar_description, // #518 float(string name) cvar_description = #518; (DP_QC_CVAR_DESCRIPTION) NULL, // #519 NULL, // #520 NULL, // #521 @@ -1350,9 +1405,9 @@ NULL, // #528 NULL, // #529 NULL, // #530 NULL, // #531 -NULL, // #532 -NULL, // #533 -NULL, // #534 +VM_log, // #532 +VM_getsoundtime, // #533 float(entity e, float channel) getsoundtime = #533; (DP_SND_GETSOUNDTIME) +VM_soundlength, // #534 float(string sample) soundlength = #534; (DP_SND_GETSOUNDTIME) NULL, // #535 NULL, // #536 NULL, // #537 @@ -1423,12 +1478,12 @@ VM_M_setkeydest, // #601 void setkeydest(float dest) VM_M_getkeydest, // #602 float getkeydest(void) VM_M_setmousetarget, // #603 void setmousetarget(float trg) VM_M_getmousetarget, // #604 float getmousetarget(void) -VM_M_callfunction, // #605 void callfunction(...) +VM_callfunction, // #605 void callfunction(...) VM_writetofile, // #606 void writetofile(float fhandle, entity ent) -VM_M_isfunction, // #607 float isfunction(string function_name) -VM_M_getresolution, // #608 vector getresolution(float number) +VM_isfunction, // #607 float isfunction(string function_name) +VM_M_getresolution, // #608 vector getresolution(float number, [float forfullscreen]) VM_keynumtostring, // #609 string keynumtostring(float keynum) -VM_findkeysforcommand, // #610 string findkeysforcommand(string command) +VM_findkeysforcommand, // #610 string findkeysforcommand(string command[, float bindmap]) VM_M_getserverliststat, // #611 float gethostcachevalue(float type) VM_M_getserverliststring, // #612 string gethostcachestring(float type, float hostnr) VM_parseentitydata, // #613 void parseentitydata(entity ent, string data) @@ -1442,8 +1497,21 @@ VM_M_refreshserverlist, // #620 void refreshhostcache(void) VM_M_getserverlistnumber, // #621 float gethostcachenumber(float fld, float hostnr) VM_M_getserverlistindexforkey,// #622 float gethostcacheindexforkey(string key) VM_M_addwantedserverlistkey, // #623 void addwantedhostcachekey(string key) -VM_M_getextresponse, // #624 string getextresponse(void) -VM_netaddress_resolve // #625 string netaddress_resolve(string, float) +VM_CL_getextresponse, // #624 string getextresponse(void) +VM_netaddress_resolve, // #625 string netaddress_resolve(string, float) +VM_M_getgamedirinfo, // #626 string getgamedirinfo(float n, float prop) +VM_sprintf, // #627 string sprintf(string format, ...) +NULL, // #628 +NULL, // #629 +VM_setkeybind, // #630 float(float key, string bind[, float bindmap]) setkeybind +VM_getbindmaps, // #631 vector(void) getbindmap +VM_setbindmaps, // #632 float(vector bm) setbindmap +VM_M_crypto_getkeyfp, // #633 string(string addr) crypto_getkeyfp +VM_M_crypto_getidfp, // #634 string(string addr) crypto_getidfp +VM_M_crypto_getencryptlevel, // #635 string(string addr) crypto_getencryptlevel +VM_M_crypto_getmykeyfp, // #636 string(float addr) crypto_getmykeyfp +VM_M_crypto_getmyidfp, // #637 string(float addr) crypto_getmyidfp +NULL }; const int vm_m_numbuiltins = sizeof(vm_m_builtins) / sizeof(prvm_builtin_t);