//----------------------------------------------------------------------------- // Purpose: Returns the eye position and angle vectors. //----------------------------------------------------------------------------- void CBasePlayer::EyePositionAndVectors( Vector *pPosition, Vector *pForward, Vector *pRight, Vector *pUp ) { #ifdef CLIENT_DLL IClientVehicle *pVehicle = GetVehicle(); #else IServerVehicle *pVehicle = GetVehicle(); #endif if ( pVehicle ) { Assert( pVehicle ); int nRole = pVehicle->GetPassengerRole( this ); Vector vecEyeOrigin; QAngle angEyeAngles; pVehicle->GetVehicleViewPosition( nRole, pPosition, &angEyeAngles ); AngleVectors( angEyeAngles, pForward, pRight, pUp ); } else { VectorCopy( BaseClass::EyePosition(), *pPosition ); AngleVectors( EyeAngles(), pForward, pRight, pUp ); } }
//----------------------------------------------------------------------------- // Actual Eye position + angles //----------------------------------------------------------------------------- Vector CBasePlayer::EyePosition( ) { #ifdef CLIENT_DLL IClientVehicle *pVehicle = GetVehicle(); #else IServerVehicle *pVehicle = GetVehicle(); #endif if ( pVehicle ) { Assert( pVehicle ); int nRole = pVehicle->GetPassengerRole( this ); Vector vecEyeOrigin; QAngle angEyeAngles; pVehicle->GetVehicleViewPosition( nRole, &vecEyeOrigin, &angEyeAngles ); return vecEyeOrigin; } else { #ifdef CLIENT_DLL if ( IsObserver() ) { if ( m_iObserverMode == OBS_MODE_CHASE ) { if ( IsLocalPlayer() ) { return MainViewOrigin(); } } } #endif return BaseClass::EyePosition(); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CHudVehicle::Paint( void ) { IClientVehicle *v = GetLocalPlayerVehicle(); if ( !v ) return; // Vehicle-based hud... v->DrawHudElements(); }
//----------------------------------------------------------------------------- // Purpose: Update the vehicle view, or simply return the cached position and angles //----------------------------------------------------------------------------- void CBasePlayer::CacheVehicleView( void ) { // If we've calculated the view this frame, then there's no need to recalculate it if ( m_nVehicleViewSavedFrame == gpGlobals->framecount ) return; #ifdef CLIENT_DLL IClientVehicle *pVehicle = GetVehicle(); #else IServerVehicle *pVehicle = GetVehicle(); #endif if ( pVehicle != NULL ) { int nRole = pVehicle->GetPassengerRole( this ); // Get our view for this frame pVehicle->GetVehicleViewPosition( nRole, &m_vecVehicleViewOrigin, &m_vecVehicleViewAngles, &m_flVehicleViewFOV ); m_nVehicleViewSavedFrame = gpGlobals->framecount; } }
//----------------------------------------------------------------------------- // Purpose: Called every usercmd by the player PostThink //----------------------------------------------------------------------------- void CBasePlayer::ItemPostFrame() { VPROF( "CBasePlayer::ItemPostFrame" ); // Put viewmodels into basically correct place based on new player origin CalcViewModelView( EyePosition(), EyeAngles() ); // Don't process items while in a vehicle. if ( GetVehicle() ) { #if defined( CLIENT_DLL ) IClientVehicle *pVehicle = GetVehicle(); #else IServerVehicle *pVehicle = GetVehicle(); #endif bool bUsingStandardWeapons = UsingStandardWeaponsInVehicle(); #if defined( CLIENT_DLL ) if ( pVehicle->IsPredicted() ) #endif { pVehicle->ItemPostFrame( this ); } if (!bUsingStandardWeapons || !GetVehicle()) return; } // check if the player is using something if ( m_hUseEntity != NULL ) { #if !defined( CLIENT_DLL ) Assert( !IsInAVehicle() ); ImpulseCommands();// this will call playerUse #endif return; } if ( gpGlobals->curtime < m_flNextAttack ) { if ( GetActiveWeapon() ) { GetActiveWeapon()->ItemBusyFrame(); } } else { if ( GetActiveWeapon() && (!IsInAVehicle() || UsingStandardWeaponsInVehicle()) ) { #if defined( CLIENT_DLL ) // Not predicting this weapon if ( GetActiveWeapon()->IsPredicted() ) #endif { GetActiveWeapon()->ItemPostFrame( ); } } } #if !defined( CLIENT_DLL ) ImpulseCommands(); #else // NOTE: If we ever support full impulse commands on the client, // remove this line and call ImpulseCommands instead. m_nImpulse = 0; #endif }
//----------------------------------------------------------------------------- // Purpose: Predicts a single movement command for player // Input : *moveHelper - // *player - // *u - //----------------------------------------------------------------------------- void CASW_Prediction::RunCommand( C_BasePlayer *player, CUserCmd *ucmd, IMoveHelper *moveHelper ) { #if !defined( NO_ENTITY_PREDICTION ) VPROF( "CPrediction::RunCommand" ); #if defined( _DEBUG ) char sz[ 32 ]; Q_snprintf( sz, sizeof( sz ), "runcommand%04d", ucmd->command_number ); PREDICTION_TRACKVALUECHANGESCOPE( sz ); #endif C_ASW_Player *pASWPlayer = (C_ASW_Player*)player; Assert( pASWPlayer ); StartCommand( player, ucmd ); pASWPlayer->SetHighlightEntity( C_BaseEntity::Instance( ucmd->crosshair_entity ) ); // Set globals appropriately gpGlobals->curtime = player->m_nTickBase * TICK_INTERVAL; gpGlobals->frametime = TICK_INTERVAL; g_pGameMovement->StartTrackPredictionErrors( player ); // TODO // TODO: Check for impulse predicted? // Do weapon selection if ( ucmd->weaponselect != 0 ) { C_BaseCombatWeapon *weapon = dynamic_cast< C_BaseCombatWeapon * >( CBaseEntity::Instance( ucmd->weaponselect ) ); if (weapon) { pASWPlayer->ASWSelectWeapon(weapon, 0); //ucmd->weaponsubtype); // asw - subtype var used for sending marine profile index instead } } // Latch in impulse. IClientVehicle *pVehicle = player->GetVehicle(); if ( ucmd->impulse ) { // Discard impulse commands unless the vehicle allows them. // FIXME: UsingStandardWeapons seems like a bad filter for this. // The flashlight is an impulse command, for example. if ( !pVehicle || player->UsingStandardWeaponsInVehicle() ) { player->m_nImpulse = ucmd->impulse; } } // Get button states player->UpdateButtonState( ucmd->buttons ); // TODO // CheckMovingGround( player, ucmd->frametime ); // TODO // g_pMoveData->m_vecOldAngles = player->pl.v_angle; // Copy from command to player unless game .dll has set angle using fixangle // if ( !player->pl.fixangle ) { player->SetLocalViewAngles( ucmd->viewangles ); } // Call standard client pre-think RunPreThink( player ); // Call Think if one is set RunThink( player, TICK_INTERVAL ); // Setup input. { SetupMove( player, ucmd, moveHelper, g_pMoveData ); } // Run regular player movement if we're not controlling a marine if ( asw_allow_detach.GetBool() ) { if ( !pVehicle ) { Assert( g_pGameMovement ); g_pGameMovement->ProcessMovement( player, g_pMoveData ); } else { pVehicle->ProcessMovement( player, g_pMoveData ); } } // if ( !asw_allow_detach.GetBool() && pASWPlayer->GetMarine() ) // { // g_pMoveData->SetAbsOrigin( pASWPlayer->GetMarine()->GetAbsOrigin() ); // } pASWPlayer->SetCrosshairTracePos( ucmd->crosshairtrace ); FinishMove( player, ucmd, g_pMoveData ); RunPostThink( player ); // let the player drive marine movement here pASWPlayer->DriveMarineMovement( ucmd, moveHelper ); g_pGameMovement->FinishTrackPredictionErrors( player ); FinishCommand( player ); player->m_nTickBase++; #endif }