void CSDKPlayer::State_Enter_DEATH_ANIM() { if ( HasWeapons() ) { // we drop the guns here because weapons that have an area effect and can kill their user // will sometimes crash coming back from CBasePlayer::Killed() if they kill their owner because the // player class sometimes is freed. It's safer to manipulate the weapons once we know // we aren't calling into any of their code anymore through the player pointer. PackDeadPlayerItems(); } // Used for a timer. m_flDeathTime = gpGlobals->curtime; StartObserverMode( OBS_MODE_DEATHCAM ); // go to observer mode RemoveEffects( EF_NODRAW ); // still draw player body }
void CBasePlayer::PlayerDeathThink() { if( GetFlags().Any( FL_ONGROUND ) ) { const float flForward = GetAbsVelocity().Length() - 20; if( flForward <= 0 ) SetAbsVelocity( g_vecZero ); else SetAbsVelocity( flForward * GetAbsVelocity().Normalize() ); } if( HasWeapons() ) { // we drop the guns here because weapons that have an area effect and can kill their user // will sometimes crash coming back from CBasePlayer::Killed() if they kill their owner because the // player class sometimes is freed. It's safer to manipulate the weapons once we know // we aren't calling into any of their code anymore through the player pointer. PackDeadPlayerItems(); } if( GetModelIndex() && ( !m_fSequenceFinished ) && ( GetDeadFlag() == DEAD_DYING ) ) { StudioFrameAdvance(); m_iRespawnFrames++; // Note, these aren't necessarily real "frames", so behavior is dependent on # of client movement commands if( m_iRespawnFrames < 120 ) // Animations should be no longer than this return; } // once we're done animating our death and we're on the ground, we want to set movetype to None so our dead body won't do collisions and stuff anymore // this prevents a bug where the dead body would go to a player's head if he walked over it while the dead player was clicking their button to respawn if( GetMoveType() != MOVETYPE_NONE && GetFlags().Any( FL_ONGROUND ) ) SetMoveType( MOVETYPE_NONE ); if( GetDeadFlag() == DEAD_DYING ) SetDeadFlag( DEAD_DEAD ); StopAnimation(); GetEffects() |= EF_NOINTERP; SetFrameRate( 0.0 ); const bool fAnyButtonDown = ( GetButtons().Any( ~IN_SCORE ) ) != 0; // wait for all buttons released if( GetDeadFlag() == DEAD_DEAD ) { if( fAnyButtonDown ) return; if( g_pGameRules->FPlayerCanRespawn( this ) ) { m_fDeadTime = gpGlobals->time; SetDeadFlag( DEAD_RESPAWNABLE ); } return; } // if the player has been dead for one second longer than allowed by forcerespawn, // forcerespawn isn't on. Send the player off to an intermission camera until they // choose to respawn. if( g_pGameRules->IsMultiplayer() && ( gpGlobals->time > ( m_fDeadTime + 6 ) ) && !( m_afPhysicsFlags & PFLAG_OBSERVER ) ) { // go to dead camera. StartDeathCam(); } if( IsObserver() ) // player is in spectator mode return; // wait for any button down, or mp_forcerespawn is set and the respawn time is up if( !fAnyButtonDown && !( g_pGameRules->IsMultiplayer() && forcerespawn.value > 0 && ( gpGlobals->time > ( m_fDeadTime + 5 ) ) ) ) return; GetButtons().ClearAll(); m_iRespawnFrames = 0; //ALERT(at_console, "Respawn\n"); g_pGameRules->PlayerRespawn( this, !( m_afPhysicsFlags & PFLAG_OBSERVER ) );// don't copy a corpse if we're in deathcam. SetNextThink( -1 ); }