X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=mvm_cmds.c;h=69801a04a7078fa7d4916f0da00277f1fb69983e;hp=9a23640177f038636f3b38109af6426bd6e656fa;hb=f16954a9d40168253ac5d9890dabcf7dbd266cd9;hpb=d48703fd0002f113325b57069536476558fff282 diff --git a/mvm_cmds.c b/mvm_cmds.c index 9a236401..69801a04 100644 --- a/mvm_cmds.c +++ b/mvm_cmds.c @@ -10,45 +10,54 @@ //============================================================================ // Menu -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_MENU_EXTRESPONSEPACKET " -"DP_QC_ASINACOSATANATAN2TAN " -"DP_QC_AUTOCVARS " -"DP_QC_CMD " -"DP_QC_CRC16 " -"DP_QC_CVAR_TYPE " -"DP_QC_CVAR_DESCRIPTION " -"DP_QC_DIGEST " -"DP_QC_DIGEST_SHA256 " -"DP_QC_FINDCHAIN_TOFIELD " -"DP_QC_I18N " -"DP_QC_LOG " -"DP_QC_RENDER_SCENE " -"DP_QC_SPRINTF " -"DP_QC_STRFTIME " -"DP_QC_STRINGBUFFERS " -"DP_QC_STRINGBUFFERS_CVARLIST " -"DP_QC_STRINGBUFFERS_EXT_WIP " -"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 " -; +const char *vm_m_extensions[] = { +"BX_WAL_SUPPORT", +"DP_CINEMATIC_DPV", +"DP_COVERAGE", +"DP_CRYPTO", +"DP_CSQC_BINDMAPS", +"DP_GFX_FONTS", +"DP_GFX_FONTS_FREETYPE", +"DP_UTF8", +"DP_FONT_VARIABLEWIDTH", +"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_DIGEST", +"DP_QC_DIGEST_SHA256", +"DP_QC_FINDCHAIN_TOFIELD", +"DP_QC_I18N", +"DP_QC_LOG", +"DP_QC_RENDER_SCENE", +"DP_QC_SPRINTF", +"DP_QC_STRFTIME", +"DP_QC_STRINGBUFFERS", +"DP_QC_STRINGBUFFERS_CVARLIST", +"DP_QC_STRINGBUFFERS_EXT_WIP", +"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", +"DP_QC_FS_SEARCH_PACKFILE", +NULL +}; + +qbool MP_ConsoleCommand(const char *text) +{ + prvm_prog_t *prog = MVM_prog; + return PRVM_ConsoleCommand(prog, text, &prog->funcoffsets.GameCommand, false, -1, 0, prog->loaded, "QC function GameCommand is missing"); +} /* ========= @@ -170,18 +179,34 @@ vector getresolution(float number) static void VM_M_getresolution(prvm_prog_t *prog) { int nr, fs; - VM_SAFEPARMCOUNTRANGE(1, 2, VM_getresolution); + VM_SAFEPARMCOUNTRANGE(1, 2, VM_M_getresolution); nr = (int)PRVM_G_FLOAT(OFS_PARM0); fs = ((prog->argc <= 1) || ((int)PRVM_G_FLOAT(OFS_PARM1))); - if(nr < 0 || nr >= (fs ? video_resolutions_count : video_resolutions_hardcoded_count)) + if(nr < -1 || nr >= (fs ? video_resolutions_count : video_resolutions_hardcoded_count)) { PRVM_G_VECTOR(OFS_RETURN)[0] = 0; PRVM_G_VECTOR(OFS_RETURN)[1] = 0; PRVM_G_VECTOR(OFS_RETURN)[2] = 0; } + else if(nr == -1) + { + vid_mode_t *m = VID_GetDesktopMode(); + if (m) + { + PRVM_G_VECTOR(OFS_RETURN)[0] = m->width; + PRVM_G_VECTOR(OFS_RETURN)[1] = m->height; + PRVM_G_VECTOR(OFS_RETURN)[2] = m->pixelheight_num / (prvm_vec_t) m->pixelheight_denom; + } + else + { + PRVM_G_VECTOR(OFS_RETURN)[0] = 0; + PRVM_G_VECTOR(OFS_RETURN)[1] = 0; + PRVM_G_VECTOR(OFS_RETURN)[2] = 0; + } + } else { video_resolution_t *r = &((fs ? video_resolutions : video_resolutions_hardcoded)[nr]); @@ -301,9 +326,9 @@ static void VM_M_setserverlistmaskstring(prvm_prog_t *prog) str = PRVM_G_STRING( OFS_PARM2 ); masknr = (int)PRVM_G_FLOAT( OFS_PARM0 ); - if( masknr >= 0 && masknr <= SERVERLIST_ANDMASKCOUNT ) + if( masknr >= 0 && masknr < SERVERLIST_ANDMASKCOUNT ) mask = &serverlist_andmasks[masknr]; - else if( masknr >= 512 && masknr - 512 <= SERVERLIST_ORMASKCOUNT ) + else if( masknr >= 512 && masknr - 512 < SERVERLIST_ORMASKCOUNT ) mask = &serverlist_ormasks[masknr - 512 ]; else { @@ -363,9 +388,9 @@ static void VM_M_setserverlistmasknumber(prvm_prog_t *prog) VM_SAFEPARMCOUNT( 4, VM_M_setserverlistmasknumber ); masknr = (int)PRVM_G_FLOAT( OFS_PARM0 ); - if( masknr >= 0 && masknr <= SERVERLIST_ANDMASKCOUNT ) + if( masknr >= 0 && masknr < SERVERLIST_ANDMASKCOUNT ) mask = &serverlist_andmasks[masknr]; - else if( masknr >= 512 && masknr - 512 <= SERVERLIST_ORMASKCOUNT ) + else if( masknr >= 512 && masknr - 512 < SERVERLIST_ORMASKCOUNT ) mask = &serverlist_ormasks[masknr - 512 ]; else { @@ -398,6 +423,9 @@ static void VM_M_setserverlistmasknumber(prvm_prog_t *prog) case SLIF_FREESLOTS: mask->info.freeslots = number; break; + case SLIF_CATEGORY: + mask->info.category = number; + break; case SLIF_ISFAVORITE: mask->info.isfavorite = number != 0; break; @@ -433,7 +461,7 @@ string getserverliststring(float field, float hostnr) */ static void VM_M_getserverliststring(prvm_prog_t *prog) { - serverlist_entry_t *cache; + const serverlist_entry_t *cache; int hostnr; VM_SAFEPARMCOUNT(2, VM_M_getserverliststring); @@ -442,12 +470,19 @@ static void VM_M_getserverliststring(prvm_prog_t *prog) hostnr = (int)PRVM_G_FLOAT(OFS_PARM1); - if(hostnr < 0 || hostnr >= serverlist_viewcount) + if(hostnr == -1 && serverlist_callbackentry) { - Con_Print("VM_M_getserverliststring: bad hostnr passed!\n"); - return; + cache = serverlist_callbackentry; + } + else + { + if(hostnr < 0 || hostnr >= serverlist_viewcount) + { + Con_Print("VM_M_getserverliststring: bad hostnr passed!\n"); + return; + } + cache = ServerList_GetViewEntry(hostnr); } - cache = ServerList_GetViewEntry(hostnr); switch( (int) PRVM_G_FLOAT(OFS_PARM0) ) { case SLIF_CNAME: PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, cache->info.cname ); @@ -491,21 +526,28 @@ float getserverlistnumber(float field, float hostnr) */ static void VM_M_getserverlistnumber(prvm_prog_t *prog) { - serverlist_entry_t *cache; + const serverlist_entry_t *cache; int hostnr; - VM_SAFEPARMCOUNT(2, VM_M_getserverliststring); + VM_SAFEPARMCOUNT(2, VM_M_getserverlistnumber); PRVM_G_INT(OFS_RETURN) = OFS_NULL; hostnr = (int)PRVM_G_FLOAT(OFS_PARM1); - if(hostnr < 0 || hostnr >= serverlist_viewcount) + if(hostnr == -1 && serverlist_callbackentry) { - Con_Print("VM_M_getserverliststring: bad hostnr passed!\n"); - return; + cache = serverlist_callbackentry; + } + else + { + if(hostnr < 0 || hostnr >= serverlist_viewcount) + { + Con_Print("VM_M_getserverliststring: bad hostnr passed!\n"); + return; + } + cache = ServerList_GetViewEntry(hostnr); } - cache = ServerList_GetViewEntry(hostnr); switch( (int) PRVM_G_FLOAT(OFS_PARM0) ) { case SLIF_MAXPLAYERS: PRVM_G_FLOAT( OFS_RETURN ) = cache->info.maxplayers; @@ -528,6 +570,9 @@ static void VM_M_getserverlistnumber(prvm_prog_t *prog) case SLIF_PROTOCOL: PRVM_G_FLOAT( OFS_RETURN ) = cache->info.protocol; break; + case SLIF_CATEGORY: + PRVM_G_FLOAT( OFS_RETURN ) = cache->info.category; + break; case SLIF_ISFAVORITE: PRVM_G_FLOAT( OFS_RETURN ) = cache->info.isfavorite; break; @@ -560,8 +605,11 @@ refreshserverlist() */ static void VM_M_refreshserverlist(prvm_prog_t *prog) { - VM_SAFEPARMCOUNT( 0, VM_M_refreshserverlist ); - ServerList_QueryList(false, true, false, false); + qbool do_reset = false; + VM_SAFEPARMCOUNTRANGE( 0, 1, VM_M_refreshserverlist ); + if (prog->argc >= 1 && PRVM_G_FLOAT(OFS_PARM0)) + do_reset = true; + ServerList_QueryList(do_reset, true, false, false); } /* @@ -607,6 +655,8 @@ static void VM_M_getserverlistindexforkey(prvm_prog_t *prog) PRVM_G_FLOAT( OFS_RETURN ) = SLIF_FREESLOTS; else if( !strcmp( key, "protocol" ) ) PRVM_G_FLOAT( OFS_RETURN ) = SLIF_PROTOCOL; + else if( !strcmp( key, "category" ) ) + PRVM_G_FLOAT( OFS_RETURN ) = SLIF_CATEGORY; else if( !strcmp( key, "isfavorite" ) ) PRVM_G_FLOAT( OFS_RETURN ) = SLIF_ISFAVORITE; else @@ -767,7 +817,7 @@ static void VM_M_crypto_getkeyfp(prvm_prog_t *prog) s = PRVM_G_STRING( OFS_PARM0 ); VM_CheckEmptyString( prog, s ); - if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, keyfp, sizeof(keyfp), NULL, 0, NULL)) + if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, keyfp, sizeof(keyfp), NULL, 0, NULL, NULL)) PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, keyfp ); else PRVM_G_INT( OFS_RETURN ) = OFS_NULL; @@ -783,11 +833,27 @@ static void VM_M_crypto_getidfp(prvm_prog_t *prog) s = PRVM_G_STRING( OFS_PARM0 ); VM_CheckEmptyString( prog, s ); - if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, NULL, 0, idfp, sizeof(idfp), NULL)) + if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, NULL, 0, idfp, sizeof(idfp), NULL, NULL)) PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, idfp ); else PRVM_G_INT( OFS_RETURN ) = OFS_NULL; } +static void VM_M_crypto_getidstatus(prvm_prog_t *prog) +{ + lhnetaddress_t addr; + const char *s; + qbool issigned; + + VM_SAFEPARMCOUNT(1,VM_M_crypto_getidstatus); + + s = PRVM_G_STRING( OFS_PARM0 ); + VM_CheckEmptyString( prog, s ); + + if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, NULL, 0, NULL, 0, NULL, &issigned)) + PRVM_G_FLOAT( OFS_RETURN ) = issigned ? 2 : 1; + else + PRVM_G_FLOAT( OFS_RETURN ) = 0; +} static void VM_M_crypto_getencryptlevel(prvm_prog_t *prog) { lhnetaddress_t addr; @@ -800,7 +866,7 @@ static void VM_M_crypto_getencryptlevel(prvm_prog_t *prog) s = PRVM_G_STRING( OFS_PARM0 ); VM_CheckEmptyString( prog, s ); - if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, NULL, 0, NULL, 0, &aeslevel)) + if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, NULL, 0, NULL, 0, &aeslevel, NULL)) PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, aeslevel ? va(vabuf, sizeof(vabuf), "%d AES128", aeslevel) : "0"); else PRVM_G_INT( OFS_RETURN ) = OFS_NULL; @@ -810,7 +876,7 @@ static void VM_M_crypto_getmykeyfp(prvm_prog_t *prog) int i; char keyfp[FP64_SIZE + 1]; - VM_SAFEPARMCOUNT(1,VM_M_crypto_getmykey); + VM_SAFEPARMCOUNT(1, VM_M_crypto_getmykeyfp); i = PRVM_G_FLOAT( OFS_PARM0 ); switch(Crypto_RetrieveLocalKey(i, keyfp, sizeof(keyfp), NULL, 0, NULL)) @@ -832,7 +898,7 @@ static void VM_M_crypto_getmyidfp(prvm_prog_t *prog) int i; char idfp[FP64_SIZE + 1]; - VM_SAFEPARMCOUNT(1,VM_M_crypto_getmykey); + VM_SAFEPARMCOUNT(1, VM_M_crypto_getmyidfp); i = PRVM_G_FLOAT( OFS_PARM0 ); switch(Crypto_RetrieveLocalKey(i, NULL, 0, idfp, sizeof(idfp), NULL)) @@ -852,9 +918,9 @@ static void VM_M_crypto_getmyidfp(prvm_prog_t *prog) static void VM_M_crypto_getmyidstatus(prvm_prog_t *prog) { int i; - qboolean issigned; + qbool issigned; - VM_SAFEPARMCOUNT(1,VM_M_crypto_getmykey); + VM_SAFEPARMCOUNT(1, VM_M_crypto_getmyidstatus); i = PRVM_G_FLOAT( OFS_PARM0 ); switch(Crypto_RetrieveLocalKey(i, NULL, 0, NULL, 0, &issigned)) @@ -872,6 +938,130 @@ static void VM_M_crypto_getmyidstatus(prvm_prog_t *prog) } } +// CL_Video interface functions + +/* +======================== +VM_cin_open + +float cin_open(string file, string name) +======================== +*/ +void VM_cin_open(prvm_prog_t *prog) +{ + const char *file; + const char *name; + + VM_SAFEPARMCOUNT( 2, VM_cin_open ); + + file = PRVM_G_STRING( OFS_PARM0 ); + name = PRVM_G_STRING( OFS_PARM1 ); + + VM_CheckEmptyString(prog, file ); + VM_CheckEmptyString(prog, name ); + + if( CL_OpenVideo( file, name, MENUOWNER, "" ) ) + PRVM_G_FLOAT( OFS_RETURN ) = 1; + else + PRVM_G_FLOAT( OFS_RETURN ) = 0; +} + +/* +======================== +VM_cin_close + +void cin_close(string name) +======================== +*/ +void VM_cin_close(prvm_prog_t *prog) +{ + const char *name; + + VM_SAFEPARMCOUNT( 1, VM_cin_close ); + + name = PRVM_G_STRING( OFS_PARM0 ); + VM_CheckEmptyString(prog, name ); + + CL_CloseVideo( CL_GetVideoByName( name ) ); +} + +/* +======================== +VM_cin_setstate +void cin_setstate(string name, float type) +======================== +*/ +void VM_cin_setstate(prvm_prog_t *prog) +{ + const char *name; + clvideostate_t state; + clvideo_t *video; + + VM_SAFEPARMCOUNT( 2, VM_cin_setstate ); + + name = PRVM_G_STRING( OFS_PARM0 ); + VM_CheckEmptyString(prog, name ); + + state = (clvideostate_t)((int)PRVM_G_FLOAT( OFS_PARM1 )); + + video = CL_GetVideoByName( name ); + if( video && state > CLVIDEO_UNUSED && state < CLVIDEO_STATECOUNT ) + CL_SetVideoState( video, state ); +} + +/* +======================== +VM_cin_getstate + +float cin_getstate(string name) +======================== +*/ +void VM_cin_getstate(prvm_prog_t *prog) +{ + const char *name; + clvideo_t *video; + + VM_SAFEPARMCOUNT( 1, VM_cin_getstate ); + + name = PRVM_G_STRING( OFS_PARM0 ); + VM_CheckEmptyString(prog, name ); + + video = CL_GetVideoByName( name ); + if( video ) + PRVM_G_FLOAT( OFS_RETURN ) = (int)video->state; + else + PRVM_G_FLOAT( OFS_RETURN ) = 0; +} + +/* +======================== +VM_cin_restart + +void cin_restart(string name) +======================== +*/ +void VM_cin_restart(prvm_prog_t *prog) +{ + const char *name; + clvideo_t *video; + + VM_SAFEPARMCOUNT( 1, VM_cin_restart ); + + name = PRVM_G_STRING( OFS_PARM0 ); + VM_CheckEmptyString(prog, name ); + + video = CL_GetVideoByName( name ); + if( video ) + CL_RestartVideo( video ); +} + +static void VM_M_registercommand(prvm_prog_t *prog) +{ + VM_SAFEPARMCOUNT(1, VM_M_registercommand); + if(!Cmd_Exists(cmd_local, PRVM_G_STRING(OFS_PARM0))) + Cmd_AddCommand(CF_CLIENT, PRVM_G_STRING(OFS_PARM0), NULL, "console command created by QuakeC"); +} + prvm_builtin_t vm_m_builtins[] = { NULL, // #0 NULL function (not callable) VM_checkextension, // #1 @@ -886,7 +1076,7 @@ VM_vlen, // #9 VM_vectoyaw, // #10 VM_vectoangles, // #11 VM_random, // #12 -VM_localcmd, // #13 +VM_localcmd_local, // #13 VM_cvar, // #14 VM_cvar_set, // #15 VM_dprint, // #16 @@ -936,7 +1126,7 @@ VM_argv, // #59 VM_isserver, // #60 VM_clientcount, // #61 VM_clientstate, // #62 -VM_clcommand, // #63 +NULL, // #63 FIXME VM_changelevel, // #64 VM_localsound, // #65 VM_M_getmousepos, // #66 @@ -1252,7 +1442,7 @@ NULL, // #348 VM_CL_isdemo, // #349 NULL, // #350 NULL, // #351 -NULL, // #352 +VM_M_registercommand, // #352 void(string cmdname) VM_wasfreed, // #353 float(entity ent) wasfreed NULL, // #354 VM_CL_videoplaying, // #355 @@ -1542,6 +1732,8 @@ NULL, // #638 VM_digest_hex, // #639 NULL, // #640 VM_M_crypto_getmyidstatus, // #641 float(float i) crypto_getmyidstatus +VM_coverage, // #642 +VM_M_crypto_getidstatus, // #643 float(string addr) crypto_getidstatus NULL }; @@ -1552,7 +1744,8 @@ void MVM_init_cmd(prvm_prog_t *prog) r_refdef_scene_t *scene; VM_Cmd_Init(prog); - VM_Polygons_Reset(prog); + prog->polygonbegin_model = NULL; + prog->polygonbegin_guess2d = 0; scene = R_GetScenePointer( RST_MENU ); @@ -1564,7 +1757,8 @@ void MVM_init_cmd(prvm_prog_t *prog) scene->maxentities = MAX_EDICTS + 256 + 512; scene->entities = (entity_render_t **)Mem_Alloc(prog->progs_mempool, sizeof(entity_render_t *) * scene->maxentities); - scene->ambient = 32.0f; + // LadyHavoc: what is this for? + scene->ambientintensity = 32.0f; } void MVM_reset_cmd(prvm_prog_t *prog) @@ -1573,5 +1767,6 @@ void MVM_reset_cmd(prvm_prog_t *prog) //VM_Cmd_Init(); VM_Cmd_Reset(prog); - VM_Polygons_Reset(prog); + prog->polygonbegin_model = NULL; + prog->polygonbegin_guess2d = 0; }