VM_SetTraceGlobals(&trace);
}
-extern cvar_t cl_gravity;
trace_t CL_Trace_Toss (prvm_edict_t *tossent, prvm_edict_t *ignore)
{
int i;
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
{
{
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;
}
//[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);
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;
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;
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();
}
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)
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
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)
{
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)
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);
/*
// 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);
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
+VM_tokenizebyseparator, // #479 float(string s) tokenizebyseparator (DP_QC_TOKENIZEBYSEPARATOR)
+VM_strtolower, // #480 string(string s) VM_strtolower : DRESK - Return string as lowercase
+VM_strtoupper, // #481 string(string s) VM_strtoupper : DRESK - Return string as uppercase
NULL, // #482
NULL, // #483
NULL, // #484