]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - sv_phys.c
implemented PointSuperContents model function as a lower-overhead
[xonotic/darkplaces.git] / sv_phys.c
index 978768fe907c13f954da50f14300cf2cfe70009a..6c6fd13aa29487a5f9370b481bece079d61b85d0 100644 (file)
--- a/sv_phys.c
+++ b/sv_phys.c
@@ -255,6 +255,63 @@ trace_t SV_Move(const vec3_t start, const vec3_t mins, const vec3_t maxs, const
 }
 #endif
 
+int SV_PointSuperContents(const vec3_t point)
+{
+       int supercontents = 0;
+       int i;
+       prvm_edict_t *touch;
+       vec3_t transformed;
+       // matrices to transform into/out of other entity's space
+       matrix4x4_t matrix, imatrix;
+       // model of other entity
+       model_t *model;
+       unsigned int modelindex;
+       int frame;
+       // list of entities to test for collisions
+       int numtouchedicts;
+       prvm_edict_t *touchedicts[MAX_EDICTS];
+
+       // get world supercontents at this point
+       if (sv.worldmodel && sv.worldmodel->PointSuperContents)
+               supercontents = sv.worldmodel->PointSuperContents(sv.worldmodel, 0, point);
+
+       // if sv_gameplayfix_swiminbmodels is off we're done
+       if (!sv_gameplayfix_swiminbmodels.integer)
+               return supercontents;
+
+       // get list of entities at this point
+       numtouchedicts = World_EntitiesInBox(&sv.world, point, point, MAX_EDICTS, touchedicts);
+       if (numtouchedicts > MAX_EDICTS)
+       {
+               // this never happens
+               Con_Printf("SV_EntitiesInBox returned %i edicts, max was %i\n", numtouchedicts, MAX_EDICTS);
+               numtouchedicts = MAX_EDICTS;
+       }
+       for (i = 0;i < numtouchedicts;i++)
+       {
+               touch = touchedicts[i];
+
+               // we only care about SOLID_BSP for pointcontents
+               if (touch->fields.server->solid != SOLID_BSP)
+                       continue;
+
+               // might interact, so do an exact clip
+               modelindex = (unsigned int)touch->fields.server->modelindex;
+               if (modelindex >= MAX_MODELS)
+                       continue;
+               model = sv.models[(int)touch->fields.server->modelindex];
+               if (!model || !model->PointSuperContents)
+                       continue;
+               Matrix4x4_CreateFromQuakeEntity(&matrix, touch->fields.server->origin[0], touch->fields.server->origin[1], touch->fields.server->origin[2], touch->fields.server->angles[0], touch->fields.server->angles[1], touch->fields.server->angles[2], 1);
+               Matrix4x4_Invert_Simple(&imatrix, &matrix);
+               Matrix4x4_Transform(&imatrix, point, transformed);
+               frame = (int)touch->fields.server->frame;
+               supercontents |= model->PointSuperContents(model, bound(0, frame, (model->numframes - 1)), transformed);
+       }
+
+       return supercontents;
+}
+
 /*
 ===============================================================================
 
@@ -552,12 +609,12 @@ void SV_CheckVelocity (prvm_edict_t *ent)
        {
                if (IS_NAN(ent->fields.server->velocity[i]))
                {
-                       Con_Printf("Got a NaN velocity on %s\n", PRVM_GetString(ent->fields.server->classname));
+                       Con_Printf("Got a NaN velocity on entity #%i (%s)\n", PRVM_NUM_FOR_EDICT(ent), PRVM_GetString(ent->fields.server->classname));
                        ent->fields.server->velocity[i] = 0;
                }
                if (IS_NAN(ent->fields.server->origin[i]))
                {
-                       Con_Printf("Got a NaN origin on %s\n", PRVM_GetString(ent->fields.server->classname));
+                       Con_Printf("Got a NaN origin on entity #%i (%s)\n", PRVM_NUM_FOR_EDICT(ent), PRVM_GetString(ent->fields.server->classname));
                        ent->fields.server->origin[i] = 0;
                }
        }
@@ -921,7 +978,7 @@ int SV_FlyMove (prvm_edict_t *ent, float time, float *stepnormal, int hitsuperco
        */
 
        // LordHavoc: this came from QW and allows you to get out of water more easily
-       if (sv_gameplayfix_qwplayerphysics.integer && ((int)ent->fields.server->flags & FL_WATERJUMP))
+       if (sv_gameplayfix_easierwaterjump.integer && ((int)ent->fields.server->flags & FL_WATERJUMP))
                VectorCopy(primal_velocity, ent->fields.server->velocity);
        return blocked;
 }
@@ -2115,6 +2172,7 @@ void SV_Physics_ClientEntity(prvm_edict_t *ent)
                                SV_AddGravity (ent);
                        SV_CheckStuck (ent);
                        SV_WalkMove (ent);
+                       host_client->cmd.time = max(host_client->cmd.time, sv.time); // ignore client movement data for anything before NOW
                }
                break;
        case MOVETYPE_TOSS: