]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_collision.c
removed crash parameter from Host_ShudownServer, eliminated NetConn_SendToAll and...
[xonotic/darkplaces.git] / cl_collision.c
index 8920a5edbf6b1263d3aa053b1a81e2635e82a3e6..fdaed38b4c7a6ca2f2815c32255e5b7579448f5e 100644 (file)
@@ -6,7 +6,7 @@
 // not yet used
 typedef struct physentity_s
 {
-       // this may be a entity_t, or a edict_t, or whatever
+       // this may be a entity_t, or a prvm_edict_t, or whatever
        void *realentity;
 
        // can be NULL if it is a bbox object
@@ -35,6 +35,7 @@ trace_t CL_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co
        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;
@@ -48,7 +49,6 @@ trace_t CL_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co
        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);
 
@@ -131,8 +131,9 @@ trace_t CL_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co
                                // 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;
 
@@ -180,10 +181,12 @@ trace_t CL_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co
        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;
@@ -196,7 +199,6 @@ float CL_SelectTraceLine(const vec3_t start, const vec3_t end, vec3_t impact, ve
 
        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);
 
@@ -213,18 +215,33 @@ float CL_SelectTraceLine(const vec3_t start, const vec3_t end, vec3_t impact, ve
        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;