From 22249b9c3863d57d01eddf792d3ccb32f0301fda Mon Sep 17 00:00:00 2001 From: dresk Date: Sun, 23 Mar 2008 03:20:49 +0000 Subject: [PATCH] Added server QC function "movetypesteplandevent". This function, if assigned to a MOVETYPE_STEP (ie. monster) entity in QC, is called when the entity experiences a "land event" wherein normally the sound sv_sound_land is played. If this function is assigned, the standard server sound is suppressed, allowing for full configuration by the QC. git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8222 d7cf8633-e32d-0410-b094-e92efae38249 --- progsvm.h | 3 ++- prvm_edict.c | 1 + sv_main.c | 1 + sv_phys.c | 31 +++++++++++++++++++++++++++++-- svvm_cmds.c | 1 + 5 files changed, 34 insertions(+), 3 deletions(-) diff --git a/progsvm.h b/progsvm.h index 2de5ca78..e88fb092 100644 --- 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 diff --git a/prvm_edict.c b/prvm_edict.c index 1dc7024a..72d8d394 100644 --- a/prvm_edict.c +++ b/prvm_edict.c @@ -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"); diff --git a/sv_main.c b/sv_main.c index 99096341..ed61256d 100644 --- 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"}, diff --git a/sv_phys.c b/sv_phys.c index aed6049a..70369c9b 100644 --- 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; } } diff --git a/svvm_cmds.c b/svvm_cmds.c index 53e4c20b..6f800eb3 100644 --- a/svvm_cmds.c +++ b/svvm_cmds.c @@ -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 " -- 2.39.2