X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=mvm_cmds.c;h=69801a04a7078fa7d4916f0da00277f1fb69983e;hb=HEAD;hp=8b9df778066203967e1a3936dd59f4fe1dd2eed5;hpb=2112445828bdb79a823097272e326c5b65aba5dd;p=xonotic%2Fdarkplaces.git diff --git a/mvm_cmds.c b/mvm_cmds.c index 8b9df778..812930fd 100644 --- a/mvm_cmds.c +++ b/mvm_cmds.c @@ -53,6 +53,12 @@ const char *vm_m_extensions[] = { NULL }; +qbool MP_ConsoleCommand(const char *text, size_t textlen) +{ + prvm_prog_t *prog = MVM_prog; + return PRVM_ConsoleCommand(prog, text, textlen, &prog->funcoffsets.GameCommand, false, -1, 0, "QC function GameCommand is missing"); +} + /* ========= VM_M_setmousetarget @@ -187,19 +193,10 @@ static void VM_M_getresolution(prvm_prog_t *prog) } 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; - } + vid_mode_t m = VID_GetDesktopMode(); + 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 { @@ -223,9 +220,9 @@ static void VM_M_getgamedirinfo(prvm_prog_t *prog) if(nr >= 0 && nr < fs_all_gamedirs_count) { if(item == 0) - PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, fs_all_gamedirs[nr].name ); + PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, fs_all_gamedirs[nr].name, strlen(fs_all_gamedirs[nr].name)); else if(item == 1) - PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, fs_all_gamedirs[nr].description ); + PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, fs_all_gamedirs[nr].description, strlen(fs_all_gamedirs[nr].description)); } } @@ -334,25 +331,25 @@ static void VM_M_setserverlistmaskstring(prvm_prog_t *prog) switch( field ) { case SLIF_CNAME: - strlcpy( mask->info.cname, str, sizeof(mask->info.cname) ); + mask->info.cname_len = dp_strlcpy(mask->info.cname, str, sizeof(mask->info.cname)); break; case SLIF_NAME: - strlcpy( mask->info.name, str, sizeof(mask->info.name) ); + mask->info.name_len = dp_strlcpy(mask->info.name, str, sizeof(mask->info.name)); break; case SLIF_QCSTATUS: - strlcpy( mask->info.qcstatus, str, sizeof(mask->info.qcstatus) ); + mask->info.qcstatus_len = dp_strlcpy(mask->info.qcstatus, str, sizeof(mask->info.qcstatus)); break; case SLIF_PLAYERS: - strlcpy( mask->info.players, str, sizeof(mask->info.players) ); + mask->info.players_len = dp_strlcpy(mask->info.players, str, sizeof(mask->info.players)); break; case SLIF_MAP: - strlcpy( mask->info.map, str, sizeof(mask->info.map) ); + mask->info.map_len = dp_strlcpy(mask->info.map, str, sizeof(mask->info.map)); break; case SLIF_MOD: - strlcpy( mask->info.mod, str, sizeof(mask->info.mod) ); + mask->info.mod_len = dp_strlcpy(mask->info.mod, str, sizeof(mask->info.mod)); break; case SLIF_GAME: - strlcpy( mask->info.game, str, sizeof(mask->info.game) ); + mask->info.game_len = dp_strlcpy(mask->info.game, str, sizeof(mask->info.game)); break; default: VM_Warning(prog, "VM_M_setserverlistmaskstring: Bad field number %i passed!\n", field ); @@ -443,7 +440,7 @@ resortserverlist static void VM_M_resortserverlist(prvm_prog_t *prog) { VM_SAFEPARMCOUNT(0, VM_M_resortserverlist); - ServerList_RebuildViewList(); + ServerList_RebuildViewList(NULL); } /* @@ -470,7 +467,7 @@ static void VM_M_getserverliststring(prvm_prog_t *prog) } else { - if(hostnr < 0 || hostnr >= serverlist_viewcount) + if(hostnr < 0 || (unsigned)hostnr >= serverlist_viewcount) { Con_Print("VM_M_getserverliststring: bad hostnr passed!\n"); return; @@ -479,32 +476,32 @@ static void VM_M_getserverliststring(prvm_prog_t *prog) } switch( (int) PRVM_G_FLOAT(OFS_PARM0) ) { case SLIF_CNAME: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, cache->info.cname ); + PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, cache->info.cname, cache->info.cname_len); break; case SLIF_NAME: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, cache->info.name ); + PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, cache->info.name, cache->info.name_len); break; case SLIF_QCSTATUS: - PRVM_G_INT (OFS_RETURN ) = PRVM_SetTempString( prog, cache->info.qcstatus ); + PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, cache->info.qcstatus, cache->info.qcstatus_len); break; case SLIF_PLAYERS: - PRVM_G_INT (OFS_RETURN ) = PRVM_SetTempString( prog, cache->info.players ); + PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, cache->info.players, cache->info.players_len); break; case SLIF_GAME: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, cache->info.game ); + PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, cache->info.game, cache->info.game_len); break; case SLIF_MOD: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, cache->info.mod ); + PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, cache->info.mod, cache->info.mod_len); break; case SLIF_MAP: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, cache->info.map ); + PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, cache->info.map, cache->info.map_len); break; // TODO remove this again case 1024: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, cache->line1 ); + PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, cache->line1, cache->line1_len); break; case 1025: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, cache->line2 ); + PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, cache->line2, cache->line2_len); break; default: Con_Print("VM_M_getserverliststring: bad field number passed!\n"); @@ -535,7 +532,7 @@ static void VM_M_getserverlistnumber(prvm_prog_t *prog) } else { - if(hostnr < 0 || hostnr >= serverlist_viewcount) + if(hostnr < 0 || (unsigned)hostnr >= serverlist_viewcount) { Con_Print("VM_M_getserverliststring: bad hostnr passed!\n"); return; @@ -559,7 +556,8 @@ static void VM_M_getserverlistnumber(prvm_prog_t *prog) PRVM_G_FLOAT( OFS_RETURN ) = cache->info.freeslots; break; case SLIF_PING: - PRVM_G_FLOAT( OFS_RETURN ) = cache->info.ping; + // display inf when a listed server times out and net_slist_pause blocks its removal + PRVM_G_FLOAT( OFS_RETURN ) = cache->info.ping ? cache->info.ping : INFINITY; break; case SLIF_PROTOCOL: PRVM_G_FLOAT( OFS_RETURN ) = cache->info.protocol; @@ -599,7 +597,7 @@ refreshserverlist() */ static void VM_M_refreshserverlist(prvm_prog_t *prog) { - qboolean do_reset = false; + qbool do_reset = false; VM_SAFEPARMCOUNTRANGE( 0, 1, VM_M_refreshserverlist ); if (prog->argc >= 1 && PRVM_G_FLOAT(OFS_PARM0)) do_reset = true; @@ -795,9 +793,9 @@ static void VM_M_getmousepos(prvm_prog_t *prog) if (key_consoleactive || (key_dest != key_menu && key_dest != key_menu_grabbed)) VectorSet(PRVM_G_VECTOR(OFS_RETURN), 0, 0, 0); else if (in_client_mouse) - VectorSet(PRVM_G_VECTOR(OFS_RETURN), in_windowmouse_x * vid_conwidth.integer / vid.width, in_windowmouse_y * vid_conheight.integer / vid.height, 0); + VectorSet(PRVM_G_VECTOR(OFS_RETURN), in_windowmouse_x * vid_conwidth.integer / vid.mode.width, in_windowmouse_y * vid_conheight.integer / vid.mode.height, 0); else - VectorSet(PRVM_G_VECTOR(OFS_RETURN), in_mouse_x * vid_conwidth.integer / vid.width, in_mouse_y * vid_conheight.integer / vid.height, 0); + VectorSet(PRVM_G_VECTOR(OFS_RETURN), in_mouse_x * vid_conwidth.integer / vid.mode.width, in_mouse_y * vid_conheight.integer / vid.mode.height, 0); } static void VM_M_crypto_getkeyfp(prvm_prog_t *prog) @@ -812,7 +810,7 @@ static void VM_M_crypto_getkeyfp(prvm_prog_t *prog) VM_CheckEmptyString( prog, s ); 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 ); + PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, keyfp, strlen(keyfp)); else PRVM_G_INT( OFS_RETURN ) = OFS_NULL; } @@ -828,7 +826,7 @@ static void VM_M_crypto_getidfp(prvm_prog_t *prog) VM_CheckEmptyString( prog, s ); 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 ); + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, idfp, strlen(idfp)); else PRVM_G_INT( OFS_RETURN ) = OFS_NULL; } @@ -836,7 +834,7 @@ static void VM_M_crypto_getidstatus(prvm_prog_t *prog) { lhnetaddress_t addr; const char *s; - qboolean issigned; + qbool issigned; VM_SAFEPARMCOUNT(1,VM_M_crypto_getidstatus); @@ -861,7 +859,15 @@ static void VM_M_crypto_getencryptlevel(prvm_prog_t *prog) VM_CheckEmptyString( prog, s ); 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"); + { + if (aeslevel) + { + size_t vabuf_len = dpsnprintf(vabuf, sizeof(vabuf), "%d AES128", aeslevel); + PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, vabuf, vabuf_len); + } + else + PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, "0", 1); + } else PRVM_G_INT( OFS_RETURN ) = OFS_NULL; } @@ -876,14 +882,14 @@ static void VM_M_crypto_getmykeyfp(prvm_prog_t *prog) switch(Crypto_RetrieveLocalKey(i, keyfp, sizeof(keyfp), NULL, 0, NULL)) { case -1: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, ""); + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, "", 0); break; case 0: PRVM_G_INT( OFS_RETURN ) = OFS_NULL; break; default: case 1: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, keyfp); + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, keyfp, strlen(keyfp)); break; } } @@ -898,21 +904,21 @@ static void VM_M_crypto_getmyidfp(prvm_prog_t *prog) switch(Crypto_RetrieveLocalKey(i, NULL, 0, idfp, sizeof(idfp), NULL)) { case -1: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, ""); + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, "", 0); break; case 0: PRVM_G_INT( OFS_RETURN ) = OFS_NULL; break; default: case 1: - PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, idfp); + PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, idfp, strlen(idfp)); break; } } static void VM_M_crypto_getmyidstatus(prvm_prog_t *prog) { int i; - qboolean issigned; + qbool issigned; VM_SAFEPARMCOUNT(1, VM_M_crypto_getmyidstatus); @@ -932,6 +938,129 @@ 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); + 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 @@ -946,7 +1075,7 @@ VM_vlen, // #9 VM_vectoyaw, // #10 VM_vectoangles, // #11 VM_random, // #12 -VM_localcmd_client, // #13 +VM_localcmd, // #13 VM_cvar, // #14 VM_cvar_set, // #15 VM_dprint, // #16 @@ -996,7 +1125,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 @@ -1312,7 +1441,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