]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - sv_phys.c
make csqc entity sounds follow their entity
[xonotic/darkplaces.git] / sv_phys.c
index aed6049af5acfaa3ed12dcb6263eb1163bfa2a7f..bcd461dc41bcd0511d657d23bd7073c78c2c2f60 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)
@@ -1055,6 +1055,7 @@ SV_PushMove
 void SV_PushMove (prvm_edict_t *pusher, float movetime)
 {
        int i, e, index;
+       int pusherowner, pusherprog;
        int checkcontents;
        qboolean rotated;
        float savesolid, movetime2, pushltime;
@@ -1062,7 +1063,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];
@@ -1103,6 +1104,8 @@ void SV_PushMove (prvm_edict_t *pusher, float movetime)
                return;
        }
        pushermodel = sv.models[index];
+       pusherowner = pusher->fields.server->owner;
+       pusherprog = PRVM_EDICT_TO_PROG(pusher);
 
        rotated = VectorLength2(pusher->fields.server->angles) + VectorLength2(pusher->fields.server->avelocity) > 0;
 
@@ -1194,6 +1197,12 @@ void SV_PushMove (prvm_edict_t *pusher, float movetime)
                 || check->fields.server->movetype == MOVETYPE_FAKEPUSH)
                        continue;
 
+               if (check->fields.server->owner == pusherprog)
+                       continue;
+
+               if (pusherowner == PRVM_EDICT_TO_PROG(check))
+                       continue;
+
                //Con_Printf("%i %s ", PRVM_NUM_FOR_EDICT(check), PRVM_GetString(check->fields.server->classname));
 
                // tell any MOVETYPE_STEP entity that it may need to check for water transitions
@@ -1991,6 +2000,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)))
        {
@@ -2019,8 +2035,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;
                }
        }
@@ -2163,7 +2199,10 @@ void SV_Physics_ClientEntity(prvm_edict_t *ent)
 
        // don't run physics here if running asynchronously
        if (host_client->clmovement_skipphysicsframes <= 0)
+       {
                SV_ClientThink();
+               //host_client->cmd.time = max(host_client->cmd.time, sv.time);
+       }
 
        // make sure the velocity is sane (not a NaN)
        SV_CheckVelocity(ent);