/* * G_Client_DeadView */ static void G_Client_DeadView( edict_t *ent ) { edict_t *body; gclient_t *client; trace_t trace; client = ent->r.client; // find the body for( body = game.edicts + gs.maxclients; ENTNUM( body ) < gs.maxclients + BODY_QUEUE_SIZE + 1; body++ ) { if( !body->r.inuse || body->r.svflags & SVF_NOCLIENT ) continue; if( body->activator == ent ) // this is our body break; } if( body->activator != ent ) { // ran all the list and didn't find our body return; } // move us to body position VectorCopy( body->s.origin, ent->s.origin ); VectorCopy( body->s.origin, ent->s.old_origin ); ent->s.teleported = qtrue; client->ps.viewangles[ROLL] = 0; client->ps.viewangles[PITCH] = 0; // see if our killer is still in view if( body->enemy && ( body->enemy != ent ) ) { G_Trace( &trace, ent->s.origin, vec3_origin, vec3_origin, body->enemy->s.origin, body, MASK_OPAQUE ); if( trace.fraction != 1.0f ) { body->enemy = NULL; } else { client->ps.viewangles[YAW] = LookAtKillerYAW( ent, NULL, body->enemy ); } } else { // nobody killed us, so just circle around the body ? } G_ProjectThirdPersonView( ent->s.origin, client->ps.viewangles, body ); VectorCopy( client->ps.viewangles, ent->s.angles ); VectorCopy( ent->s.origin, client->ps.pmove.origin ); VectorClear( client->ps.pmove.velocity ); GS_SnapPosition( client->ps.pmove.origin, ent->r.mins, ent->r.maxs, ENTNUM( ent ), 0 ); }
/* * player_die */ void player_die( edict_t *ent, edict_t *inflictor, edict_t *attacker, int damage, const vec3_t point ) { snap_edict_t snap_backup = ent->snap; client_snapreset_t resp_snap_backup = ent->r.client->resp.snap; VectorClear( ent->avelocity ); ent->s.angles[0] = 0; ent->s.angles[2] = 0; ent->s.sound = 0; ent->r.solid = SOLID_NOT; ent->r.client->teamstate.last_killer = attacker; // player death ent->s.angles[YAW] = ent->r.client->ps.viewangles[YAW] = LookAtKillerYAW( ent, inflictor, attacker ); ClientObituary( ent, inflictor, attacker ); // create a body CopyToBodyQue( ent, attacker, damage ); ent->enemy = NULL; // clear his combo stats G_AwardResetPlayerComboStats( ent ); // go ghost (also resets snap) G_GhostClient( ent ); ent->deathTimeStamp = level.time; VectorClear( ent->velocity ); VectorClear( ent->avelocity ); ent->snap = snap_backup; ent->r.client->resp.snap = resp_snap_backup; ent->r.client->resp.snap.buttons = 0; GClip_LinkEntity( ent ); }