entity_render_t *ent;
vec3_t tracemins, tracemaxs;
trace_t cliptrace, trace;
+ vec3_t origin;
vec3_t starttransformed, endtransformed, starttransformedmins, endtransformedmins, starttransformedmaxs, endtransformedmaxs;
vec3_t startmins, startmaxs, endmins, endmaxs, entmins, entmaxs;
vec_t *playermins, *playermaxs;
cliptrace.fraction = 1;
cliptrace.realfraction = 1;
- Mod_CheckLoaded(cl.worldmodel);
if (cl.worldmodel && cl.worldmodel->TraceBox)
cl.worldmodel->TraceBox(cl.worldmodel, 0, &cliptrace, startmins, startmaxs, endmins, endmaxs, hitsupercontentsmask);
// FIXME: crouch
playermins = cl_playerstandmins;
playermaxs = cl_playerstandmaxs;
- VectorAdd(ent->origin, playermins, entmins);
- VectorAdd(ent->origin, playermaxs, entmaxs);
+ Matrix4x4_OriginFromMatrix(&ent->matrix, origin);
+ VectorAdd(origin, playermins, entmins);
+ VectorAdd(origin, playermaxs, entmaxs);
if (!BoxesOverlap(tracemins, tracemaxs, entmins, entmaxs))
continue;
return cliptrace;
}
-float CL_SelectTraceLine(const vec3_t start, const vec3_t end, vec3_t impact, vec3_t normal, int *hitent, entity_render_t *ignoreent)
+float CL_SelectTraceLine(const vec3_t start, const vec3_t end, vec3_t impact, vec3_t normal, int *hitent, entity_render_t *ignoreent, qboolean csqcents)
{
float maxfrac, maxrealfrac;
- int n;
+ int n, entsnum;
+ entity_t *entlist;
+ unsigned char *entactivelist;
entity_render_t *ent;
float tracemins[3], tracemaxs[3];
trace_t trace;
if (hitent)
*hitent = 0;
- Mod_CheckLoaded(cl.worldmodel);
if (cl.worldmodel && cl.worldmodel->TraceBox)
cl.worldmodel->TraceBox(cl.worldmodel, 0, &trace, start, start, end, end, SUPERCONTENTS_SOLID);
tracemins[2] = min(start[2], end[2]);
tracemaxs[2] = max(start[2], end[2]);
+ if(csqcents)
+ {
+ entlist = cl_csqcentities;
+ entactivelist = cl_csqcentities_active;
+ entsnum = cl_num_csqcentities;
+ }
+ else
+ {
+ entlist = cl_entities;
+ entactivelist = cl_entities_active;
+ entsnum = cl_num_entities;
+ }
+
// look for embedded bmodels
- for (n = 0;n < cl_num_entities;n++)
+ for (n = 0;n < entsnum;n++)
{
- if (!cl_entities_active[n])
+ if (!entactivelist[n])
continue;
- ent = &cl_entities[n].render;
+ ent = &entlist[n].render;
if (!BoxesOverlap(ent->mins, ent->maxs, tracemins, tracemaxs))
continue;
if (!ent->model || !ent->model->TraceBox)
continue;
+ if ((ent->flags & RENDER_EXTERIORMODEL) && !chase_active.integer)
+ continue;
// if transparent and not selectable, skip entity
- if (!(cl_entities[n].state_current.effects & EF_SELECTABLE) && (ent->alpha < 1 || (ent->effects & (EF_ADDITIVE | EF_NODEPTHTEST))))
+ if (!(entlist[n].state_current.effects & EF_SELECTABLE) && (ent->alpha < 1 || (ent->effects & (EF_ADDITIVE | EF_NODEPTHTEST))))
continue;
if (ent == ignoreent)
continue;