]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - mvm_cmds.c
Fix engine not starting on Windows if linked against SDL > 2.0.5
[xonotic/darkplaces.git] / mvm_cmds.c
index 79edacfb2fa365c1c414912d482281f22fb8fac9..00759e0985882206aca3712fa60ffbf63bd53aa8 100644 (file)
@@ -13,8 +13,9 @@
 const char *vm_m_extensions =
 "BX_WAL_SUPPORT "
 "DP_CINEMATIC_DPV "
-"DP_CSQC_BINDMAPS "
+"DP_COVERAGE "
 "DP_CRYPTO "
+"DP_CSQC_BINDMAPS "
 "DP_GFX_FONTS "
 "DP_GFX_FONTS_FREETYPE "
 "DP_UTF8 "
@@ -36,6 +37,7 @@ const char *vm_m_extensions =
 "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 "
@@ -175,12 +177,28 @@ static void VM_M_getresolution(prvm_prog_t *prog)
 
        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]);
@@ -300,9 +318,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
        {
@@ -362,9 +380,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
        {
@@ -397,6 +415,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;
@@ -432,7 +453,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);
@@ -441,12 +462,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 );
@@ -490,7 +518,7 @@ 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);
@@ -499,12 +527,19 @@ static void VM_M_getserverlistnumber(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_MAXPLAYERS:
                        PRVM_G_FLOAT( OFS_RETURN ) = cache->info.maxplayers;
@@ -527,6 +562,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;
@@ -559,8 +597,11 @@ refreshserverlist()
 */
 static void VM_M_refreshserverlist(prvm_prog_t *prog)
 {
-       VM_SAFEPARMCOUNT( 0, VM_M_refreshserverlist );
-       ServerList_QueryList(false, true, false, false);
+       qboolean 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);
 }
 
 /*
@@ -606,6 +647,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
@@ -739,7 +782,7 @@ static void VM_M_copyentity (prvm_prog_t *prog)
        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->entityfields * 4);
+       memcpy(out->fields.fp, in->fields.fp, prog->entityfields * sizeof(prvm_vec_t));
 }
 
 //#66 vector() getmousepos (EXT_CSQC)
@@ -766,7 +809,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;
@@ -782,11 +825,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;
+       qboolean 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;
@@ -799,7 +858,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;
@@ -1395,11 +1454,11 @@ VM_gecko_resize,                                        // #492 void gecko_resize( string name, float w, float h )
 VM_gecko_get_texture_extent,   // #493 vector gecko_get_texture_extent( string name )
 VM_crc16,                                              // #494 float(float caseinsensitive, string s, ...) crc16 = #494 (DP_QC_CRC16)
 VM_cvar_type,                                  // #495 float(string name) cvar_type = #495; (DP_QC_CVAR_TYPE)
-NULL,                                                                  // #496
-NULL,                                                                  // #497
-NULL,                                                                  // #498
-NULL,                                                                  // #499
-NULL,                                                                  // #500
+VM_numentityfields,                            // #496 float() numentityfields = #496; (QP_QC_ENTITYDATA)
+VM_entityfieldname,                            // #497 string(float fieldnum) entityfieldname = #497; (DP_QC_ENTITYDATA)
+VM_entityfieldtype,                            // #498 float(float fieldnum) entityfieldtype = #498; (DP_QC_ENTITYDATA)
+VM_getentityfieldstring,               // #499 string(float fieldnum, entity ent) getentityfieldstring = #499; (DP_QC_ENTITYDATA)
+VM_putentityfieldstring,               // #500 float(float fieldnum, entity ent, string s) putentityfieldstring = #500; (DP_QC_ENTITYDATA)
 NULL,                                                                  // #501
 NULL,                                                                  // #502
 VM_whichpack,                                  // #503 string(string) whichpack = #503;
@@ -1434,10 +1493,10 @@ NULL,                                                                   // #531
 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
-NULL,                                                                  // #538
+VM_buf_loadfile,                        // #535 float(string filename, float bufhandle) buf_loadfile (DP_QC_STRINGBUFFERS_EXT_WIP)
+VM_buf_writefile,                       // #536 float(float filehandle, float bufhandle, float startpos, float numstrings) buf_writefile (DP_QC_STRINGBUFFERS_EXT_WIP)
+VM_bufstr_find,                         // #537 float(float bufhandle, string match, float matchrule, float startpos) bufstr_find (DP_QC_STRINGBUFFERS_EXT_WIP)
+VM_matchpattern,                        // #538 float(string s, string pattern, float matchrule) matchpattern (DP_QC_STRINGBUFFERS_EXT_WIP)
 NULL,                                                                  // #539
 NULL,                                                                  // #540
 NULL,                                                                  // #541
@@ -1541,6 +1600,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
 };
 
@@ -1551,7 +1612,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 );
 
@@ -1563,7 +1625,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)
@@ -1572,5 +1635,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;
 }