]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_collision.c
rename VM_hash to VM_crc16, and the extension to DP_QC_CRC16. That way, it is specifi...
[xonotic/darkplaces.git] / cl_collision.c
index e4f0c36fdcb5d7269aa6f4d0f5d03dffb464b8a1..45acfefa13cc5a42fb1d415d80e0cf99a855e596 100644 (file)
@@ -52,6 +52,9 @@ float CL_SelectTraceLine(const vec3_t start, const vec3_t end, vec3_t impact, ve
                        continue;
                Matrix4x4_Transform(&ent->inversematrix, start, starttransformed);
                Matrix4x4_Transform(&ent->inversematrix, end, endtransformed);
+               Collision_ClipTrace_Box(&trace, ent->model->normalmins, ent->model->normalmaxs, starttransformed, vec3_origin, vec3_origin, endtransformed, SUPERCONTENTS_SOLID, SUPERCONTENTS_SOLID, 0, NULL);
+               if (maxrealfrac < trace.realfraction)
+                       continue;
 
                //if (ent->model && ent->model->TraceBox)
                        ent->model->TraceBox(ent->model, ent->frameblend[0].frame, &trace, starttransformed, vec3_origin, vec3_origin, endtransformed, SUPERCONTENTS_SOLID);
@@ -111,14 +114,62 @@ model_t *CL_GetModelFromEdict(prvm_edict_t *ed)
 
 void CL_LinkEdict(prvm_edict_t *ent)
 {
+       vec3_t mins, maxs;
+
        if (ent == prog->edicts)
                return;         // don't add the world
 
        if (ent->priv.server->free)
                return;
 
-       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);
+       // set the abs box
+
+       if (ent->fields.client->solid == SOLID_BSP)
+       {
+               model_t *model = CL_GetModelByIndex( (int)ent->fields.client->modelindex );
+               if (model == NULL)
+               {
+                       Con_Printf("edict %i: SOLID_BSP with invalid modelindex!\n", PRVM_NUM_FOR_EDICT(ent));
+
+                       model = CL_GetModelByIndex( 0 );
+               }
+
+               if( model != NULL )
+               {
+                       if (!model->TraceBox && developer.integer >= 1)
+                               Con_Printf("edict %i: SOLID_BSP with non-collidable model\n", PRVM_NUM_FOR_EDICT(ent));
+
+                       if (ent->fields.client->angles[0] || ent->fields.client->angles[2] || ent->fields.client->avelocity[0] || ent->fields.client->avelocity[2])
+                       {
+                               VectorAdd(ent->fields.client->origin, model->rotatedmins, mins);
+                               VectorAdd(ent->fields.client->origin, model->rotatedmaxs, maxs);
+                       }
+                       else if (ent->fields.client->angles[1] || ent->fields.client->avelocity[1])
+                       {
+                               VectorAdd(ent->fields.client->origin, model->yawmins, mins);
+                               VectorAdd(ent->fields.client->origin, model->yawmaxs, maxs);
+                       }
+                       else
+                       {
+                               VectorAdd(ent->fields.client->origin, model->normalmins, mins);
+                               VectorAdd(ent->fields.client->origin, model->normalmaxs, maxs);
+                       }
+               }
+               else
+               {
+                       // SOLID_BSP with no model is valid, mainly because some QC setup code does so temporarily
+                       VectorAdd(ent->fields.client->origin, ent->fields.client->mins, mins);
+                       VectorAdd(ent->fields.client->origin, ent->fields.client->maxs, maxs);
+               }
+       }
+       else
+       {
+               VectorAdd(ent->fields.client->origin, ent->fields.client->mins, mins);
+               VectorAdd(ent->fields.client->origin, ent->fields.client->maxs, maxs);
+       }
+
+       VectorCopy(mins, ent->fields.client->absmin);
+       VectorCopy(maxs, ent->fields.client->absmax);
 
        World_LinkEdict(&cl.world, ent, ent->fields.client->absmin, ent->fields.client->absmax);
 }