// 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];
// 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
*/
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)
void SV_PushMove (prvm_edict_t *pusher, float movetime)
{
int i, e, index;
+ int pusherowner, pusherprog;
int checkcontents;
qboolean rotated;
float savesolid, movetime2, pushltime;
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];
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;
|| 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
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)))
{
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;
}
}
// 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);