]> git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
Added server QC function "movetypesteplandevent". This function, if assigned to...
authordresk <dresk@d7cf8633-e32d-0410-b094-e92efae38249>
Sun, 23 Mar 2008 03:20:49 +0000 (03:20 +0000)
committerdresk <dresk@d7cf8633-e32d-0410-b094-e92efae38249>
Sun, 23 Mar 2008 03:20:49 +0000 (03:20 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8222 d7cf8633-e32d-0410-b094-e92efae38249

progsvm.h
prvm_edict.c
sv_main.c
sv_phys.c
svvm_cmds.c

index 2de5ca7893842c3cb3720d2e27088b606dd42de7..e88fb09292a29451a81cfc8cc814953dce25af7d 100644 (file)
--- a/progsvm.h
+++ b/progsvm.h
@@ -192,8 +192,9 @@ typedef struct prvm_prog_fieldoffsets_s
        int message; // csqc
        int modelflags; // ssqc
        int movement; // ssqc
-       int nextthink; // common - used by OP_STATE
+       int movetypesteplandevent; // ssqc
        int netaddress; // ssqc
+       int nextthink; // common - used by OP_STATE
        int nodrawtoclient; // ssqc
        int pflags; // ssqc
        int ping; // ssqc
index 1dc7024a2d4d82374d4d04a891ce6f303b5575c2..72d8d3945050dcb6c70875ac2e2d420161d79709 100644 (file)
@@ -1405,6 +1405,7 @@ void PRVM_FindOffsets(void)
        prog->fieldoffsets.message                        = PRVM_ED_FindFieldOffset("message");
        prog->fieldoffsets.modelflags                     = PRVM_ED_FindFieldOffset("modelflags");
        prog->fieldoffsets.movement                       = PRVM_ED_FindFieldOffset("movement");
+       prog->fieldoffsets.movetypesteplandevent          = PRVM_ED_FindFieldOffset("movetypesteplandevent");
        prog->fieldoffsets.netaddress                     = PRVM_ED_FindFieldOffset("netaddress");
        prog->fieldoffsets.nextthink                      = PRVM_ED_FindFieldOffset("nextthink");
        prog->fieldoffsets.nodrawtoclient                 = PRVM_ED_FindFieldOffset("nodrawtoclient");
index 99096341c397974dfad8a572a6173266ea5e9060..ed61256dc3aa5a3253b212d916ca8e9c34572533 100644 (file)
--- a/sv_main.c
+++ b/sv_main.c
@@ -262,6 +262,7 @@ prvm_required_field_t reqfields[] =
        {ev_function, "SendEntity"},
        {ev_function, "contentstransition"}, // DRESK - Support for Entity Contents Transition Event
        {ev_function, "customizeentityforclient"},
+       {ev_function, "movetypesteplandevent"}, // DRESK - Support for MOVETYPE_STEP Entity Land Event
        {ev_string, "netaddress"},
        {ev_string, "playermodel"},
        {ev_string, "playerskin"},
index aed6049af5acfaa3ed12dcb6263eb1163bfa2a7f..70369c9b2a9449807617e2459d8c9aba9c7e7609 100644 (file)
--- a/sv_phys.c
+++ b/sv_phys.c
@@ -1991,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)))
        {
@@ -2019,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;
                }
        }
index 53e4c20bd509cd3c25b1d37e9396c2abb21e102d..6f800eb3e8e4c8f8d4e1e8188f5706f33055eeee 100644 (file)
@@ -113,6 +113,7 @@ char *vm_sv_extensions =
 "DP_SV_EFFECT "
 "DP_SV_ENTITYCONTENTSTRANSITION "
 "DP_SV_MODELFLAGS_AS_EFFECTS "
+"DP_SV_MOVETYPESTEP_LANDEVENT "
 "DP_SV_NETADDRESS "
 "DP_SV_NODRAWTOCLIENT "
 "DP_SV_ONENTITYNOSPAWNFUNCTION "