]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - sv_phys.c
fix return value of FS_WhichPack to NOT include the -basedir
[xonotic/darkplaces.git] / sv_phys.c
index dd59d76eceec9b0ad23070f9cfc5130db4554965..39cb72ad9309ec8e5d70d4084a9444ede18d103b 100644 (file)
--- a/sv_phys.c
+++ b/sv_phys.c
@@ -107,7 +107,7 @@ trace_t SV_Move(const vec3_t start, const vec3_t mins, const vec3_t maxs, const
        // matrices to transform into/out of other entity's space
        matrix4x4_t matrix, imatrix;
        // model of other entity
-       model_t *model;
+       dp_model_t *model;
        // list of entities to test for collisions
        int numtouchedicts;
        prvm_edict_t *touchedicts[MAX_EDICTS];
@@ -264,7 +264,7 @@ int SV_PointSuperContents(const vec3_t point)
        // matrices to transform into/out of other entity's space
        matrix4x4_t matrix, imatrix;
        // model of other entity
-       model_t *model;
+       dp_model_t *model;
        unsigned int modelindex;
        int frame;
        // list of entities to test for collisions
@@ -378,7 +378,7 @@ SV_LinkEdict
 */
 void SV_LinkEdict (prvm_edict_t *ent, qboolean touch_triggers)
 {
-       model_t *model;
+       dp_model_t *model;
        vec3_t mins, maxs;
 
        if (ent == prog->edicts)
@@ -1062,7 +1062,7 @@ void SV_PushMove (prvm_edict_t *pusher, float movetime)
        int num_moved;
        int numcheckentities;
        static prvm_edict_t *checkentities[MAX_EDICTS];
-       model_t *pushermodel;
+       dp_model_t *pushermodel;
        trace_t trace;
        matrix4x4_t pusherfinalmatrix, pusherfinalimatrix;
        unsigned short moved_edicts[MAX_EDICTS];
@@ -1374,21 +1374,37 @@ static float unstickoffsets[] =
         1,  1,  0,
         0,  0,  -1,
         0,  0,  1,
+        0,  0,  -2,
         0,  0,  2,
+        0,  0,  -3,
         0,  0,  3,
+        0,  0,  -4,
         0,  0,  4,
+        0,  0,  -5,
         0,  0,  5,
+        0,  0,  -6,
         0,  0,  6,
+        0,  0,  -7,
         0,  0,  7,
+        0,  0,  -8,
         0,  0,  8,
+        0,  0,  -9,
         0,  0,  9,
+        0,  0,  -10,
         0,  0,  10,
+        0,  0,  -11,
         0,  0,  11,
+        0,  0,  -12,
         0,  0,  12,
+        0,  0,  -13,
         0,  0,  13,
+        0,  0,  -14,
         0,  0,  14,
+        0,  0,  -15,
         0,  0,  15,
+        0,  0,  -16,
         0,  0,  16,
+        0,  0,  -17,
         0,  0,  17,
 };
 
@@ -1432,13 +1448,13 @@ void SV_CheckStuck (prvm_edict_t *ent)
        Con_DPrintf("Stuck player entity %i (classname \"%s\").\n", (int)PRVM_EDICT_TO_PROG(ent), PRVM_GetString(ent->fields.server->classname));
 }
 
-static void SV_UnstickEntity (prvm_edict_t *ent)
+qboolean SV_UnstickEntity (prvm_edict_t *ent)
 {
        int i;
 
        // if not stuck in a bmodel, just return
        if (!SV_TestEntityPosition(ent, vec3_origin))
-               return;
+               return true;
 
        for (i = 0;i < (int)(sizeof(unstickoffsets) / sizeof(unstickoffsets[0]));i += 3)
        {
@@ -1446,12 +1462,13 @@ static void SV_UnstickEntity (prvm_edict_t *ent)
                {
                        Con_DPrintf("Unstuck entity %i (classname \"%s\") with offset %f %f %f.\n", (int)PRVM_EDICT_TO_PROG(ent), PRVM_GetString(ent->fields.server->classname), unstickoffsets[i+0], unstickoffsets[i+1], unstickoffsets[i+2]);
                        SV_LinkEdict (ent, true);
-                       return;
+                       return true;
                }
        }
 
        if (developer.integer >= 100)
                Con_Printf("Stuck entity %i (classname \"%s\").\n", (int)PRVM_EDICT_TO_PROG(ent), PRVM_GetString(ent->fields.server->classname));
+       return false;
 }
 
 
@@ -1974,6 +1991,13 @@ will fall if the floor is pulled out from under them.
 void SV_Physics_Step (prvm_edict_t *ent)
 {
        int flags = (int)ent->fields.server->flags;
+
+       // DRESK
+       // Backup Velocity in the event that movetypesteplandevent is called,
+       // to provide a parameter with the entity's velocity at impact.
+       prvm_eval_t *movetypesteplandevent;
+       vec3_t backupVelocity;
+       VectorCopy(ent->fields.server->velocity, backupVelocity);
        // don't fall at all if fly/swim
        if (!(flags & (FL_FLY | FL_SWIM)))
        {
@@ -2002,8 +2026,28 @@ void SV_Physics_Step (prvm_edict_t *ent)
                        SV_LinkEdict(ent, true);
 
                        // just hit ground
-                       if (hitsound && (int)ent->fields.server->flags & FL_ONGROUND && sv_sound_land.string)
-                               SV_StartSound(ent, 0, sv_sound_land.string, 255, 1);
+                       if (hitsound && (int)ent->fields.server->flags & FL_ONGROUND)
+                       {
+                               // DRESK - Check for Entity Land Event Function
+                               movetypesteplandevent = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.movetypesteplandevent);
+
+                               if(movetypesteplandevent->function)
+                               { // Valid Function; Execute
+                                       // Prepare Parameters
+                                               // Assign Velocity at Impact
+                                               PRVM_G_VECTOR(OFS_PARM0)[0] = backupVelocity[0];
+                                               PRVM_G_VECTOR(OFS_PARM0)[1] = backupVelocity[1];
+                                               PRVM_G_VECTOR(OFS_PARM0)[2] = backupVelocity[2];
+                                               // Assign Self
+                                               prog->globals.server->self = PRVM_EDICT_TO_PROG(ent);
+                                       // Execute VM Function
+                                       PRVM_ExecuteProgram(movetypesteplandevent->function, "movetypesteplandevent: NULL function");
+                               }
+                               else
+                               // Check for Engine Landing Sound
+                               if(sv_sound_land.string)
+                                       SV_StartSound(ent, 0, sv_sound_land.string, 255, 1);
+                       }
                        ent->priv.server->waterposition_forceupdate = true;
                }
        }