]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - clvm_cmds.c
added DP_QC_CVAR_DEFSTRING extension
[xonotic/darkplaces.git] / clvm_cmds.c
index 43ca54ad9203899025b7d21636c881516d4d28bf..4110baa5704bf12d8c88f23a7c77ddf16c028768 100644 (file)
@@ -234,7 +234,6 @@ static void VM_CL_tracebox (void)
        VM_SetTraceGlobals(&trace);
 }
 
-extern cvar_t cl_gravity;
 trace_t CL_Trace_Toss (prvm_edict_t *tossent, prvm_edict_t *ignore)
 {
        int i;
@@ -257,7 +256,7 @@ trace_t CL_Trace_Toss (prvm_edict_t *tossent, prvm_edict_t *ignore)
                gravity = val->_float;
        else
                gravity = 1.0;
-       gravity *= cl_gravity.value * 0.05;
+       gravity *= cl.movevars_gravity * 0.05;
 
        for (i = 0;i < 200;i++) // LordHavoc: sanity check; never trace more than 10 seconds
        {
@@ -351,8 +350,6 @@ int CSQC_EntitiesInBox (vec3_t mins, vec3_t maxs, int maxlist, prvm_edict_t **li
        {
                if (ent->priv.required->free)
                        continue;
-//             VectorAdd(ent->fields.client->origin, ent->fields.client->mins, ent->fields.client->absmin);
-//             VectorAdd(ent->fields.client->origin, ent->fields.client->maxs, ent->fields.client->absmax);
                if(BoxesOverlap(mins, maxs, ent->fields.client->absmin, ent->fields.client->absmax))
                        list[k++] = ent;
        }
@@ -606,14 +603,11 @@ static void VM_CL_getlight (void)
 //[515]: SCENE MANAGER builtins
 extern qboolean CSQC_AddRenderEdict (prvm_edict_t *ed);//csprogs.c
 
-matrix4x4_t csqc_listenermatrix;
-qboolean csqc_usecsqclistener = false;//[515]: per-frame
-
 static void CSQC_R_RecalcView (void)
 {
        extern matrix4x4_t viewmodelmatrix;
-       Matrix4x4_CreateFromQuakeEntity(&r_view.matrix, csqc_origin[0], csqc_origin[1], csqc_origin[2], csqc_angles[0], csqc_angles[1], csqc_angles[2], 1);
-       Matrix4x4_CreateFromQuakeEntity(&viewmodelmatrix, csqc_origin[0], csqc_origin[1], csqc_origin[2], csqc_angles[0], csqc_angles[1], csqc_angles[2], cl_viewmodel_scale.value);
+       Matrix4x4_CreateFromQuakeEntity(&r_view.matrix, cl.csqc_origin[0], cl.csqc_origin[1], cl.csqc_origin[2], cl.csqc_angles[0], cl.csqc_angles[1], cl.csqc_angles[2], 1);
+       Matrix4x4_CreateFromQuakeEntity(&viewmodelmatrix, cl.csqc_origin[0], cl.csqc_origin[1], cl.csqc_origin[2], cl.csqc_angles[0], cl.csqc_angles[1], cl.csqc_angles[2], cl_viewmodel_scale.value);
 }
 
 void CL_RelinkLightFlashes(void);
@@ -644,8 +638,6 @@ static void VM_CL_R_AddEntities (void)
                ed = &prog->edicts[i];
                if(ed->priv.required->free)
                        continue;
-               VectorAdd(ed->fields.client->origin, ed->fields.client->mins, ed->fields.client->absmin);
-               VectorAdd(ed->fields.client->origin, ed->fields.client->maxs, ed->fields.client->absmax);
                CSQC_Think(ed);
                if(ed->priv.required->free)
                        continue;
@@ -711,28 +703,28 @@ static void VM_CL_R_SetView (void)
                                                        break;
        case VF_FOVY:                   //r_refdef.fov_y = k; // FIXME!
                                                        break;
-       case VF_ORIGIN:                 VectorCopy(f, csqc_origin);
+       case VF_ORIGIN:                 VectorCopy(f, cl.csqc_origin);
                                                        CSQC_R_RecalcView();
                                                        break;
-       case VF_ORIGIN_X:               csqc_origin[0] = k;
+       case VF_ORIGIN_X:               cl.csqc_origin[0] = k;
                                                        CSQC_R_RecalcView();
                                                        break;
-       case VF_ORIGIN_Y:               csqc_origin[1] = k;
+       case VF_ORIGIN_Y:               cl.csqc_origin[1] = k;
                                                        CSQC_R_RecalcView();
                                                        break;
-       case VF_ORIGIN_Z:               csqc_origin[2] = k;
+       case VF_ORIGIN_Z:               cl.csqc_origin[2] = k;
                                                        CSQC_R_RecalcView();
                                                        break;
-       case VF_ANGLES:                 VectorCopy(f, csqc_angles);
+       case VF_ANGLES:                 VectorCopy(f, cl.csqc_angles);
                                                        CSQC_R_RecalcView();
                                                        break;
-       case VF_ANGLES_X:               csqc_angles[0] = k;
+       case VF_ANGLES_X:               cl.csqc_angles[0] = k;
                                                        CSQC_R_RecalcView();
                                                        break;
-       case VF_ANGLES_Y:               csqc_angles[1] = k;
+       case VF_ANGLES_Y:               cl.csqc_angles[1] = k;
                                                        CSQC_R_RecalcView();
                                                        break;
-       case VF_ANGLES_Z:               csqc_angles[2] = k;
+       case VF_ANGLES_Z:               cl.csqc_angles[2] = k;
                                                        CSQC_R_RecalcView();
                                                        break;
        case VF_DRAWWORLD:              cl.csqc_vidvars.drawworld = k;
@@ -758,25 +750,13 @@ static void VM_CL_R_SetView (void)
        PRVM_G_FLOAT(OFS_RETURN) = 1;
 }
 
-extern void CL_UpdateNetworkEntity(entity_t *e, int recursionlimit);
 //#304 void() renderscene (EXT_CSQC)
 static void VM_CL_R_RenderScene (void)
 {
-       int i;
        VM_SAFEPARMCOUNT(0, VM_CL_R_RenderScene);
        // we need to update any RENDER_VIEWMODEL entities at this point because
        // csqc supplies its own view matrix
-       for (i = 1;i < cl.num_entities;i++)
-       {
-               if (cl.entities_active[i])
-               {
-                       entity_t *ent = cl.entities + i;
-                       if ((ent->render.flags & RENDER_VIEWMODEL) || ent->state_current.tagentity)
-                               CL_UpdateNetworkEntity(ent, 32);
-               }
-       }
-       // and of course the engine viewmodel needs updating as well
-       CL_UpdateNetworkEntity(&cl.viewent, 32);
+       CL_UpdateViewEntities();
        // now draw stuff!
        R_RenderView();
 }
@@ -1072,8 +1052,8 @@ static void VM_CL_isdemo (void)
 static void VM_CL_setlistener (void)
 {
        VM_SAFEPARMCOUNT(4, VM_CL_setlistener);
-       Matrix4x4_FromVectors(&csqc_listenermatrix, PRVM_G_VECTOR(OFS_PARM1), PRVM_G_VECTOR(OFS_PARM2), PRVM_G_VECTOR(OFS_PARM3), PRVM_G_VECTOR(OFS_PARM0));
-       csqc_usecsqclistener = true;    //use csqc listener at this frame
+       Matrix4x4_FromVectors(&cl.csqc_listenermatrix, PRVM_G_VECTOR(OFS_PARM1), PRVM_G_VECTOR(OFS_PARM2), PRVM_G_VECTOR(OFS_PARM3), PRVM_G_VECTOR(OFS_PARM0));
+       cl.csqc_usecsqclistener = true; //use csqc listener at this frame
 }
 
 //#352 void(string cmdname) registercommand (EXT_CSQC)
@@ -1205,19 +1185,11 @@ static void VM_CL_makestatic (void)
                        Matrix4x4_CreateFromQuakeEntity(&staticent->render.matrix, ent->fields.client->origin[0], ent->fields.client->origin[1], ent->fields.client->origin[2], ent->fields.client->angles[0], ent->fields.client->angles[1], ent->fields.client->angles[2], staticent->render.scale);
                CL_UpdateRenderEntity(&staticent->render);
 
-               // transparent stuff can't be lit during the opaque stage
-               if (staticent->render.effects & (EF_ADDITIVE | EF_NODEPTHTEST) || staticent->render.alpha < 1)
-                       staticent->render.flags |= RENDER_TRANSPARENT;
-               // double sided rendering mode causes backfaces to be visible
-               // (mostly useful on transparent stuff)
-               if (staticent->render.effects & EF_DOUBLESIDED)
-                       staticent->render.flags |= RENDER_NOCULLFACE;
                // either fullbright or lit
                if (!(staticent->render.effects & EF_FULLBRIGHT) && !r_fullbright.integer)
                        staticent->render.flags |= RENDER_LIGHT;
                // turn off shadows from transparent objects
-               if (!(staticent->render.effects & EF_NOSHADOW)
-                && !(staticent->render.flags & RENDER_TRANSPARENT))
+               if (!(staticent->render.effects & (EF_NOSHADOW | EF_ADDITIVE | EF_NODEPTHTEST)) && (staticent->render.alpha >= 1))
                        staticent->render.flags |= RENDER_SHADOW;
        }
        else
@@ -1355,16 +1327,29 @@ static void VM_CL_te_spark (void)
        CL_ParticleEffect(EFFECT_TE_SPARK, PRVM_G_FLOAT(OFS_PARM2), pos2, pos2, PRVM_G_VECTOR(OFS_PARM1), PRVM_G_VECTOR(OFS_PARM1), NULL, 0);
 }
 
+extern cvar_t cl_sound_ric_gunshot;
 // #412 void(vector org) te_gunshotquad (DP_QUADEFFECTS1)
 static void VM_CL_te_gunshotquad (void)
 {
        float           *pos;
        vec3_t          pos2;
+       int                     rnd;
        VM_SAFEPARMCOUNT(1, VM_CL_te_gunshotquad);
 
        pos = PRVM_G_VECTOR(OFS_PARM0);
        CL_FindNonSolidLocation(pos, pos2, 4);
        CL_ParticleEffect(EFFECT_TE_GUNSHOTQUAD, 1, pos2, pos2, vec3_origin, vec3_origin, NULL, 0);
+       if(cl_sound_ric_gunshot.integer >= 2)
+       {
+               if (rand() % 5)                 S_StartSound(-1, 0, cl.sfx_tink1, pos2, 1, 1);
+               else
+               {
+                       rnd = rand() & 3;
+                       if (rnd == 1)           S_StartSound(-1, 0, cl.sfx_ric1, pos2, 1, 1);
+                       else if (rnd == 2)      S_StartSound(-1, 0, cl.sfx_ric2, pos2, 1, 1);
+                       else                            S_StartSound(-1, 0, cl.sfx_ric3, pos2, 1, 1);
+               }
+       }
 }
 
 // #413 void(vector org) te_spikequad (DP_QUADEFFECTS1)
@@ -1453,11 +1438,23 @@ static void VM_CL_te_gunshot (void)
 {
        float           *pos;
        vec3_t          pos2;
+       int                     rnd;
        VM_SAFEPARMCOUNT(1, VM_CL_te_gunshot);
 
        pos = PRVM_G_VECTOR(OFS_PARM0);
        CL_FindNonSolidLocation(pos, pos2, 4);
        CL_ParticleEffect(EFFECT_TE_GUNSHOT, 1, pos2, pos2, vec3_origin, vec3_origin, NULL, 0);
+       if(cl_sound_ric_gunshot.integer == 1 || cl_sound_ric_gunshot.integer == 3)
+       {
+               if (rand() % 5)                 S_StartSound(-1, 0, cl.sfx_tink1, pos2, 1, 1);
+               else
+               {
+                       rnd = rand() & 3;
+                       if (rnd == 1)           S_StartSound(-1, 0, cl.sfx_ric1, pos2, 1, 1);
+                       else if (rnd == 2)      S_StartSound(-1, 0, cl.sfx_ric2, pos2, 1, 1);
+                       else                            S_StartSound(-1, 0, cl.sfx_ric3, pos2, 1, 1);
+               }
+       }
 }
 
 // #419 void(vector org) te_spike (DP_TE_STANDARDEFFECTBUILTINS)
@@ -1951,7 +1948,7 @@ int CL_GetTagMatrix (matrix4x4_t *out, prvm_edict_t *ent, int tagindex)
                if (val->_float == 0)
                        val->_float = 1;
 
-               Matrix4x4_CreateFromQuakeEntity(&entitymatrix, csqc_origin[0], csqc_origin[1], csqc_origin[2], csqc_angles[0], csqc_angles[1], csqc_angles[2], val->_float);
+               Matrix4x4_CreateFromQuakeEntity(&entitymatrix, cl.csqc_origin[0], cl.csqc_origin[1], cl.csqc_origin[2], cl.csqc_angles[0], cl.csqc_angles[1], cl.csqc_angles[2], val->_float);
                Matrix4x4_Concat(out, &entitymatrix, &tagmatrix);
 
                /*
@@ -1963,7 +1960,7 @@ int CL_GetTagMatrix (matrix4x4_t *out, prvm_edict_t *ent, int tagindex)
                        // should be done in QC on the server, but oh well, quake is quake)
                        // LordHavoc: figured out bobup: the time at which the sin is at 180
                        // degrees (which allows lengthening or squishing the peak or valley)
-                       cycle = sv.time/cl_bobcycle.value;
+                       cycle = cl.time/cl_bobcycle.value;
                        cycle -= (int)cycle;
                        if (cycle < cl_bobup.value)
                                cycle = sin(M_PI * cycle / cl_bobup.value);
@@ -3160,10 +3157,10 @@ VM_tan,                                                 // #475 float(float a) VM_tan (DP_QC_ASINACOSATANATAN2TAN)
 VM_strlennocol,                                        // #476 float(string s) : DRESK - String Length (not counting color codes) (DP_QC_STRINGCOLORFUNCTIONS)
 VM_strdecolorize,                              // #477 string(string s) : DRESK - Decolorized String (DP_QC_STRINGCOLORFUNCTIONS)
 VM_strftime,                                   // #478 string(float uselocaltime, string format, ...) (DP_QC_STRFTIME)
-NULL,                                                  // #479
-NULL,                                                  // #480
-NULL,                                                  // #481
-NULL,                                                  // #482
+VM_tokenizebyseparator,                        // #479 float(string s) tokenizebyseparator (DP_QC_TOKENIZEBYSEPARATOR)
+VM_strtolower,                                 // #480 string(string s) VM_strtolower (DP_QC_STRING_CASE_FUNCTIONS)
+VM_strtoupper,                                 // #481 string(string s) VM_strtoupper (DP_QC_STRING_CASE_FUNCTIONS)
+VM_cvar_defstring,                             // #482 string(string s) cvar_defstring (DP_QC_CVAR_DEFSTRING)
 NULL,                                                  // #483
 NULL,                                                  // #484
 NULL,                                                  // #485