/* * G_RunEntity * */ void G_RunEntity( edict_t *ent ) { edict_t *part; if( !level.canSpawnEntities ) { // don't try to think before map entities are spawned return; } if( ISEVENTENTITY( &ent->s ) ) { // events do not think return; } if( ent->timeDelta && !( ent->r.svflags & SVF_PROJECTILE ) ) { G_Printf( "Warning: G_RunEntity 'Fixing timeDelta on non projectile entity\n" ); ent->timeDelta = 0; } // only team captains decide the think, and they make think their team members when they do if( !( ent->flags & FL_TEAMSLAVE ) ) { for( part = ent; part; part = part->teamchain ) { SV_RunThink( part ); } } switch( (int)ent->movetype ) { case MOVETYPE_NONE: case MOVETYPE_NOCLIP: // only used for clients, that use pmove SV_Physics_None( ent ); break; case MOVETYPE_PLAYER: SV_Physics_None( ent ); break; case MOVETYPE_PUSH: case MOVETYPE_STOP: SV_Physics_Pusher( ent ); break; case MOVETYPE_BOUNCE: case MOVETYPE_BOUNCEGRENADE: SV_Physics_Toss( ent ); break; case MOVETYPE_TOSS: SV_Physics_Toss( ent ); break; case MOVETYPE_FLY: SV_Physics_Toss( ent ); break; case MOVETYPE_LINEARPROJECTILE: SV_Physics_LinearProjectile( ent ); break; case MOVETYPE_TOSSSLIDE: G_BoxSlideMove( ent, ent->r.clipmask ? ent->r.clipmask : MASK_PLAYERSOLID, 1.01f, 10 ); break; case MOVETYPE_STEP: SV_Physics_Step( ent ); break; default: G_Error( "SV_Physics: bad movetype %i", (int)ent->movetype ); } }
/* * G_ProjectileTimePrestep */ static void G_ProjectileTimePrestep( edict_t *projectile, int timeOffset ) { if( projectile->movetype != MOVETYPE_TOSS && projectile->movetype != MOVETYPE_LINEARPROJECTILE && projectile->movetype != MOVETYPE_BOUNCE && projectile->movetype != MOVETYPE_BOUNCEGRENADE ) return; if( timeOffset <= 0 ) return; if( projectile->movetype != MOVETYPE_LINEARPROJECTILE ) { vec3_t distVec; VectorScale( projectile->velocity, (float)timeOffset * 0.001f, distVec ); G_ProjectileDistancePrestep( projectile, VectorLength( distVec ) ); return; } projectile->s.linearProjectileTimeStamp -= timeOffset; SV_Physics_LinearProjectile( projectile ); }