X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=clvm_cmds.c;h=57868da535595da5c03e7d787b4c2846b2ecc6e4;hb=2f70889e776978ab1746211afc7723e04140fe4b;hp=6e35193ae39de8937a208a2a8e0b2906129999a4;hpb=c0b28902ae728d6089484e8f205aa118cd5b525b;p=xonotic%2Fdarkplaces.git diff --git a/clvm_cmds.c b/clvm_cmds.c index 6e35193a..57868da5 100644 --- a/clvm_cmds.c +++ b/clvm_cmds.c @@ -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 { @@ -405,7 +404,7 @@ static void VM_CL_findradius (void) eorg[2] -= bound(ent->fields.client->mins[2], eorg[2], ent->fields.client->maxs[2]); } else - VectorMAMAM(1, eorg, 0.5f, ent->fields.client->mins, 0.5f, ent->fields.client->maxs, eorg); + VectorMAMAM(1, eorg, -0.5f, ent->fields.client->mins, -0.5f, ent->fields.client->maxs, eorg); if (DotProduct(eorg, eorg) < radius2) { ent->fields.client->chain = PRVM_EDICT_TO_PROG(chain); @@ -604,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); @@ -622,6 +618,26 @@ static void VM_CL_R_ClearScene (void) // clear renderable entity and light lists r_refdef.numentities = 0; r_refdef.numlights = 0; + // FIXME: restore these to the values from VM_CL_UpdateView + r_view.x = 0; + r_view.y = 0; + r_view.z = 0; + r_view.width = vid.width; + r_view.height = vid.height; + r_view.depth = 1; + // FIXME: restore frustum_x/frustum_y + r_view.useperspective = true; + r_view.frustum_y = tan(scr_fov.value * M_PI / 360.0) * (3.0/4.0) * cl.viewzoom; + r_view.frustum_x = r_view.frustum_y * (float)r_view.width / (float)r_view.height / vid_pixelheight.value; + r_view.frustum_x *= r_refdef.frustumscale_x; + r_view.frustum_y *= r_refdef.frustumscale_y; + r_view.ortho_x = scr_fov.value * (3.0 / 4.0) * (float)r_view.width / (float)r_view.height / vid_pixelheight.value; + r_view.ortho_y = scr_fov.value * (3.0 / 4.0); + // FIXME: restore cl.csqc_origin + // FIXME: restore cl.csqc_angles + cl.csqc_vidvars.drawworld = true; + cl.csqc_vidvars.drawenginesbar = false; + cl.csqc_vidvars.drawcrosshair = false; } //#301 void(float mask) addentities (EXT_CSQC) @@ -677,58 +693,55 @@ static void VM_CL_R_SetView (void) switch(c) { - case VF_MIN: r_view.x = (int)f[0]; - r_view.y = (int)f[1]; + case VF_MIN: r_view.x = (int)(f[0] * vid.width / vid_conwidth.value); + r_view.y = (int)(f[1] * vid.height / vid_conheight.value); break; - case VF_MIN_X: r_view.x = (int)k; + case VF_MIN_X: r_view.x = (int)(k * vid.width / vid_conwidth.value); break; - case VF_MIN_Y: r_view.y = (int)k; + case VF_MIN_Y: r_view.y = (int)(k * vid.height / vid_conheight.value); break; - case VF_SIZE: r_view.width = (int)f[0]; - r_view.height = (int)f[1]; + case VF_SIZE: r_view.width = (int)(f[0] * vid.width / vid_conwidth.value); + r_view.height = (int)(f[1] * vid.height / vid_conheight.value); break; - case VF_SIZE_Y: r_view.width = (int)k; + case VF_SIZE_Y: r_view.width = (int)(k * vid.width / vid_conwidth.value); break; - case VF_SIZE_X: r_view.height = (int)k; + case VF_SIZE_X: r_view.height = (int)(k * vid.height / vid_conheight.value); break; - case VF_VIEWPORT: r_view.x = (int)f[0]; - r_view.y = (int)f[1]; - r_view.z = 0; - // TODO: make sure that view_z and view_depth are set properly even if csqc does not set them! + case VF_VIEWPORT: r_view.x = (int)(f[0] * vid.width / vid_conwidth.value); + r_view.y = (int)(f[1] * vid.height / vid_conheight.value); f = PRVM_G_VECTOR(OFS_PARM2); - r_view.width = (int)f[0]; - r_view.height = (int)f[1]; - r_view.depth = 1; + r_view.width = (int)(f[0] * vid.width / vid_conwidth.value); + r_view.height = (int)(f[1] * vid.height / vid_conheight.value); break; - case VF_FOV: //r_refdef.fov_x = f[0]; // FIXME! - //r_refdef.fov_y = f[1]; // FIXME! + case VF_FOV: r_view.frustum_x = tan(f[0] * M_PI / 360.0);r_view.ortho_x = f[0]; + r_view.frustum_y = tan(f[1] * M_PI / 360.0);r_view.ortho_y = f[1]; break; - case VF_FOVX: //r_refdef.fov_x = k; // FIXME! + case VF_FOVX: r_view.frustum_x = tan(k * M_PI / 360.0);r_view.ortho_x = k; break; - case VF_FOVY: //r_refdef.fov_y = k; // FIXME! + case VF_FOVY: r_view.frustum_y = tan(k * M_PI / 360.0);r_view.ortho_y = k; 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; @@ -747,6 +760,9 @@ static void VM_CL_R_SetView (void) case VF_CL_VIEWANGLES_Z:cl.viewangles[2] = k; break; + case VF_PERSPECTIVE: r_view.useperspective = k != 0; + break; + default: PRVM_G_FLOAT(OFS_RETURN) = 0; VM_Warning("VM_CL_R_SetView : unknown parm %i\n", c); return; @@ -834,8 +850,24 @@ static void VM_CL_getstatf (void) static void VM_CL_getstati (void) { int i, index; - VM_SAFEPARMCOUNT(1, VM_CL_getstati); + int firstbit, bitcount; + + VM_SAFEPARMCOUNTRANGE(1, 3, VM_CL_getstati); + index = (int)PRVM_G_FLOAT(OFS_PARM0); + if (prog->argc > 1) + { + firstbit = (int)PRVM_G_FLOAT(OFS_PARM1); + if (prog->argc > 2) + bitcount = (int)PRVM_G_FLOAT(OFS_PARM2); + else + bitcount = 1; + } + else + { + firstbit = 0; + bitcount = 32; + } if(index < 0 || index >= MAX_CL_STATS) { @@ -843,6 +875,8 @@ static void VM_CL_getstati (void) return; } i = cl.stats[index]; + if (bitcount != 32) //32 causes the mask to overflow, so there's nothing to subtract from. + i = (((unsigned int)i)&(((1<>firstbit; PRVM_G_FLOAT(OFS_RETURN) = i; } @@ -1056,8 +1090,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) @@ -1163,7 +1197,7 @@ static void VM_CL_makestatic (void) // copy it to the current state staticent->render.model = CL_GetModelByIndex((int)ent->fields.client->modelindex); - staticent->render.frame = staticent->render.frame1 = staticent->render.frame2 = (int)ent->fields.client->frame; + staticent->render.frame1 = staticent->render.frame2 = (int)ent->fields.client->frame; staticent->render.framelerp = 0; // make torchs play out of sync staticent->render.frame1time = staticent->render.frame2time = lhrandom(-10, -1); @@ -1331,16 +1365,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) @@ -1429,11 +1476,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) @@ -1927,7 +1986,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); /* @@ -1939,7 +1998,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); @@ -3101,10 +3160,10 @@ NULL, // #440 void(entity e, string s) clientcommand (KRIMZON_SV_PARSECLIE VM_tokenize, // #441 float(string s) tokenize (KRIMZON_SV_PARSECLIENTCOMMAND) VM_argv, // #442 string(float n) argv (KRIMZON_SV_PARSECLIENTCOMMAND) VM_CL_setattachment, // #443 void(entity e, entity tagentity, string tagname) setattachment (DP_GFX_QUAKE3MODELTAGS) -VM_search_begin, // #444 float(string pattern, float caseinsensitive, float quiet) search_begin (DP_FS_SEARCH) -VM_search_end, // #445 void(float handle) search_end (DP_FS_SEARCH) -VM_search_getsize, // #446 float(float handle) search_getsize (DP_FS_SEARCH) -VM_search_getfilename, // #447 string(float handle, float num) search_getfilename (DP_FS_SEARCH) +VM_search_begin, // #444 float(string pattern, float caseinsensitive, float quiet) search_begin (DP_QC_FS_SEARCH) +VM_search_end, // #445 void(float handle) search_end (DP_QC_FS_SEARCH) +VM_search_getsize, // #446 float(float handle) search_getsize (DP_QC_FS_SEARCH) +VM_search_getfilename, // #447 string(float handle, float num) search_getfilename (DP_QC_FS_SEARCH) VM_cvar_string, // #448 string(string s) cvar_string (DP_QC_CVAR_STRING) VM_findflags, // #449 entity(entity start, .float fld, float match) findflags (DP_QC_FINDFLAGS) VM_findchainflags, // #450 entity(.float fld, float match) findchainflags (DP_QC_FINDCHAINFLAGS) @@ -3137,9 +3196,9 @@ VM_strlennocol, // #476 float(string s) : DRESK - String Length (not countin VM_strdecolorize, // #477 string(string s) : DRESK - Decolorized String (DP_QC_STRINGCOLORFUNCTIONS) VM_strftime, // #478 string(float uselocaltime, string format, ...) (DP_QC_STRFTIME) VM_tokenizebyseparator, // #479 float(string s) tokenizebyseparator (DP_QC_TOKENIZEBYSEPARATOR) -NULL, // #480 -NULL, // #481 -NULL, // #482 +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