void UpdateAvatarEffect(void) { if(!haptics->HasDevice()) return; Vector vel; Vector vvel; Vector evel; QAngle eye; C_BasePlayer* pPlayer = C_BasePlayer::GetLocalPlayer(); if(!pPlayer) return; eye = pPlayer->GetAbsAngles(); if(pPlayer->IsInAVehicle() && pPlayer->GetVehicle()) { pPlayer->GetVehicle()->GetVehicleEnt()->EstimateAbsVelocity(vvel); eye = pPlayer->GetVehicle()->GetVehicleEnt()->EyeAngles(); if(!Q_stristr(pPlayer->GetVehicle()->GetVehicleEnt()->GetClassname(),"choreo")) { eye[YAW] += 90; } } else { vel = pPlayer->GetAbsVelocity(); } Vector PlayerVel = pPlayer->GetAbsVelocity(); //Choreo vehicles use player avatar and don't produce their own velocity if(!pPlayer->GetVehicle() || abs(vvel.Length()) == 0 ) { vel = PlayerVel; } else vel = vvel; VectorYawRotate(vel, -90 -eye[YAW], vel ); vel.y = -vel.y; vel.z = -vel.z; switch(pPlayer->GetMoveType()) { case MOVETYPE_NOCLIP: vel *= hap_noclip_avatar_scale.GetFloat(); break; default: break; } haptics->UpdateAvatarVelocity(vel); }
//----------------------------------------------------------------------------- // Purpose: // Output : IClientVehicle //----------------------------------------------------------------------------- IClientVehicle *CHudVehicle::GetLocalPlayerVehicle() { C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if ( !pPlayer || !pPlayer->IsInAVehicle() ) { return NULL; } return pPlayer->GetVehicle(); }
//----------------------------------------------------------------------------- // Purpose: updates the ammo display counts //----------------------------------------------------------------------------- void CHudAmmo::UpdateAmmoDisplays() { C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); IClientVehicle *pVehicle = player ? player->GetVehicle() : NULL; if ( !pVehicle ) { UpdatePlayerAmmo( player ); } else { UpdateVehicleAmmo( player, pVehicle ); } }
virtual void OnThink() { // set whether or not the panel draws based on if we have a weapon that supports secondary ammo C_BaseCombatWeapon *wpn = GetActiveWeapon(); C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); IClientVehicle *pVehicle = player ? player->GetVehicle() : NULL; if (!wpn || !player || pVehicle) { m_hCurrentActiveWeapon = NULL; SetPaintEnabled(false); SetPaintBackgroundEnabled(false); return; } else { SetPaintEnabled(true); SetPaintBackgroundEnabled(true); } UpdateAmmoState(); }
void CInput::CreateMove ( int sequence_number, float input_sample_frametime, bool active ) { CUserCmd *cmd = &m_pCommands[ sequence_number % MULTIPLAYER_BACKUP ]; CVerifiedUserCmd *pVerified = &m_pVerifiedCommands[ sequence_number % MULTIPLAYER_BACKUP ]; cmd->Reset(); cmd->command_number = sequence_number; cmd->tick_count = gpGlobals->tickcount; QAngle viewangles; engine->GetViewAngles( viewangles ); QAngle originalViewangles = viewangles; if ( active || sv_noclipduringpause.GetInt() ) { // Determine view angles AdjustAngles ( input_sample_frametime ); // Determine sideways movement ComputeSideMove( cmd ); // Determine vertical movement ComputeUpwardMove( cmd ); // Determine forward movement ComputeForwardMove( cmd ); // Scale based on holding speed key or having too fast of a velocity based on client maximum // speed. ScaleMovements( cmd ); // Allow mice and other controllers to add their inputs ControllerMove( input_sample_frametime, cmd ); #ifdef SIXENSE g_pSixenseInput->SixenseFrame( input_sample_frametime, cmd ); if( g_pSixenseInput->IsEnabled() ) { g_pSixenseInput->SetView( input_sample_frametime, cmd ); } #endif } else { // need to run and reset mouse input so that there is no view pop when unpausing if ( !m_fCameraInterceptingMouse && m_fMouseActive ) { float mx, my; GetAccumulatedMouseDeltasAndResetAccumulators( &mx, &my ); ResetMouse(); } } // Retreive view angles from engine ( could have been set in IN_AdjustAngles above ) engine->GetViewAngles( viewangles ); // Latch and clear impulse cmd->impulse = in_impulse; in_impulse = 0; // Latch and clear weapon selection if ( m_hSelectedWeapon != NULL ) { C_BaseCombatWeapon *weapon = m_hSelectedWeapon; cmd->weaponselect = weapon->entindex(); cmd->weaponsubtype = weapon->GetSubType(); // Always clear weapon selection m_hSelectedWeapon = NULL; } // Set button and flag bits #ifdef SIXENSE if( g_pSixenseInput->IsEnabled() ) { // Some buttons were set in SixenseUpdateKeys, so or in any real keypresses cmd->buttons |= GetButtonBits( 1 ); } else { cmd->buttons = GetButtonBits( 1 ); } #else // Set button and flag bits cmd->buttons = GetButtonBits( 1 ); #endif // Using joystick? #ifdef SIXENSE if ( in_joystick.GetInt() || g_pSixenseInput->IsEnabled() ) #else if ( in_joystick.GetInt() ) #endif { if ( cmd->forwardmove > 0 ) { cmd->buttons |= IN_FORWARD; } else if ( cmd->forwardmove < 0 ) { cmd->buttons |= IN_BACK; } } // Use new view angles if alive, otherwise user last angles we stored off. if ( g_iAlive ) { VectorCopy( viewangles, cmd->viewangles ); VectorCopy( viewangles, m_angPreviousViewAngles ); } else { VectorCopy( m_angPreviousViewAngles, cmd->viewangles ); } // Let the move manager override anything it wants to. if ( g_pClientMode->CreateMove( input_sample_frametime, cmd ) ) { // Get current view angles after the client mode tweaks with it #ifdef SIXENSE // Only set the engine angles if sixense is not enabled. It is done in SixenseInput::SetView otherwise. if( !g_pSixenseInput->IsEnabled() ) { engine->SetViewAngles( cmd->viewangles ); } #else engine->SetViewAngles( cmd->viewangles ); #endif if ( UseVR() ) { C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if( pPlayer && !pPlayer->GetVehicle() ) { QAngle curViewangles, newViewangles; Vector curMotion, newMotion; engine->GetViewAngles( curViewangles ); curMotion.Init ( cmd->forwardmove, cmd->sidemove, cmd->upmove ); g_ClientVirtualReality.OverridePlayerMotion ( input_sample_frametime, originalViewangles, curViewangles, curMotion, &newViewangles, &newMotion ); engine->SetViewAngles( newViewangles ); cmd->forwardmove = newMotion[0]; cmd->sidemove = newMotion[1]; cmd->upmove = newMotion[2]; cmd->viewangles = newViewangles; } else { Vector vPos; g_ClientVirtualReality.GetTorsoRelativeAim( &vPos, &cmd->viewangles ); engine->SetViewAngles( cmd->viewangles ); } } } m_flLastForwardMove = cmd->forwardmove; cmd->random_seed = MD5_PseudoRandom( sequence_number ) & 0x7fffffff; HLTVCamera()->CreateMove( cmd ); #if defined( REPLAY_ENABLED ) ReplayCamera()->CreateMove( cmd ); #endif #if defined( HL2_CLIENT_DLL ) // copy backchannel data int i; for (i = 0; i < m_EntityGroundContact.Count(); i++) { cmd->entitygroundcontact.AddToTail( m_EntityGroundContact[i] ); } m_EntityGroundContact.RemoveAll(); #endif pVerified->m_cmd = *cmd; pVerified->m_crc = cmd->GetChecksum(); }
void CInput::ExtraMouseSample( float frametime, bool active ) { CUserCmd dummy; CUserCmd *cmd = &dummy; cmd->Reset(); QAngle viewangles; engine->GetViewAngles( viewangles ); QAngle originalViewangles = viewangles; if ( active ) { // Determine view angles AdjustAngles ( frametime ); // Determine sideways movement ComputeSideMove( cmd ); // Determine vertical movement ComputeUpwardMove( cmd ); // Determine forward movement ComputeForwardMove( cmd ); // Scale based on holding speed key or having too fast of a velocity based on client maximum // speed. ScaleMovements( cmd ); // Allow mice and other controllers to add their inputs ControllerMove( frametime, cmd ); #ifdef SIXENSE g_pSixenseInput->SixenseFrame( frametime, cmd ); if( g_pSixenseInput->IsEnabled() ) { g_pSixenseInput->SetView( frametime, cmd ); } #endif } // Retreive view angles from engine ( could have been set in IN_AdjustAngles above ) engine->GetViewAngles( viewangles ); // Set button and flag bits, don't blow away state #ifdef SIXENSE if( g_pSixenseInput->IsEnabled() ) { // Some buttons were set in SixenseUpdateKeys, so or in any real keypresses cmd->buttons |= GetButtonBits( 0 ); } else { cmd->buttons = GetButtonBits( 0 ); } #else cmd->buttons = GetButtonBits( 0 ); #endif // Use new view angles if alive, otherwise user last angles we stored off. if ( g_iAlive ) { VectorCopy( viewangles, cmd->viewangles ); VectorCopy( viewangles, m_angPreviousViewAngles ); } else { VectorCopy( m_angPreviousViewAngles, cmd->viewangles ); } // Let the move manager override anything it wants to. if ( g_pClientMode->CreateMove( frametime, cmd ) ) { // Get current view angles after the client mode tweaks with it engine->SetViewAngles( cmd->viewangles ); prediction->SetLocalViewAngles( cmd->viewangles ); } // Let the headtracker override the view at the very end of the process so // that vehicles and other stuff in g_pClientMode->CreateMove can override // first if ( active && UseVR() ) { C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if( pPlayer && !pPlayer->GetVehicle() ) { QAngle curViewangles, newViewangles; Vector curMotion, newMotion; engine->GetViewAngles( curViewangles ); curMotion.Init ( cmd->forwardmove, cmd->sidemove, cmd->upmove ); g_ClientVirtualReality.OverridePlayerMotion ( frametime, originalViewangles, curViewangles, curMotion, &newViewangles, &newMotion ); engine->SetViewAngles( newViewangles ); cmd->forwardmove = newMotion[0]; cmd->sidemove = newMotion[1]; cmd->upmove = newMotion[2]; cmd->viewangles = newViewangles; prediction->SetLocalViewAngles( cmd->viewangles ); } } }
//----------------------------------------------------------------------------- // Purpose: Apply joystick to CUserCmd creation // Input : frametime - // *cmd - //----------------------------------------------------------------------------- void CInput::JoyStickMove( float frametime, CUserCmd *cmd ) { // complete initialization if first time in ( needed as cvars are not available at initialization time ) if ( !m_fJoystickAdvancedInit ) { Joystick_Advanced(); m_fJoystickAdvancedInit = true; } // verify joystick is available and that the user wants to use it if ( !in_joystick.GetInt() || 0 == inputsystem->GetJoystickCount() ) return; // Skip out if vgui is active if ( vgui::surface()->IsCursorVisible() ) return; if ( m_flRemainingJoystickSampleTime <= 0 ) return; frametime = MIN(m_flRemainingJoystickSampleTime, frametime); m_flRemainingJoystickSampleTime -= frametime; QAngle viewangles; // Get starting angles engine->GetViewAngles( viewangles ); struct axis_t { float value; int controlType; }; axis_t gameAxes[ MAX_GAME_AXES ]; memset( &gameAxes, 0, sizeof(gameAxes) ); // Get each joystick axis value, and normalize the range for ( int i = 0; i < MAX_JOYSTICK_AXES; ++i ) { if ( GAME_AXIS_NONE == m_rgAxes[i].AxisMap ) continue; float fAxisValue = inputsystem->GetAnalogValue( (AnalogCode_t)JOYSTICK_AXIS( 0, i ) ); if (joy_wwhack2.GetInt() != 0 ) { // this is a special formula for the Logitech WingMan Warrior // y=ax^b; where a = 300 and b = 1.3 // also x values are in increments of 800 (so this is factored out) // then bounds check result to level out excessively high spin rates float fTemp = 300.0 * pow(abs(fAxisValue) / 800.0, 1.3); if (fTemp > 14000.0) fTemp = 14000.0; // restore direction information fAxisValue = (fAxisValue > 0.0) ? fTemp : -fTemp; } unsigned int idx = m_rgAxes[i].AxisMap; gameAxes[idx].value = fAxisValue; gameAxes[idx].controlType = m_rgAxes[i].ControlMap; } // Re-map the axis values if necessary, based on the joystick configuration if ( (joy_advanced.GetInt() == 0) && (in_jlook.state & 1) ) { // user wants forward control to become pitch control gameAxes[GAME_AXIS_PITCH] = gameAxes[GAME_AXIS_FORWARD]; gameAxes[GAME_AXIS_FORWARD].value = 0; // if mouse invert is on, invert the joystick pitch value // Note: only absolute control support here - joy_advanced = 0 if ( m_pitch->GetFloat() < 0.0 ) { gameAxes[GAME_AXIS_PITCH].value *= -1; } } if ( (in_strafe.state & 1) || lookstrafe.GetFloat() && (in_jlook.state & 1) ) { // user wants yaw control to become side control gameAxes[GAME_AXIS_SIDE] = gameAxes[GAME_AXIS_YAW]; gameAxes[GAME_AXIS_YAW].value = 0; } float forward = ScaleAxisValue( gameAxes[GAME_AXIS_FORWARD].value, MAX_BUTTONSAMPLE * joy_forwardthreshold.GetFloat() ); float side = ScaleAxisValue( gameAxes[GAME_AXIS_SIDE].value, MAX_BUTTONSAMPLE * joy_sidethreshold.GetFloat() ); float pitch = ScaleAxisValue( gameAxes[GAME_AXIS_PITCH].value, MAX_BUTTONSAMPLE * joy_pitchthreshold.GetFloat() ); float yaw = ScaleAxisValue( gameAxes[GAME_AXIS_YAW].value, MAX_BUTTONSAMPLE * joy_yawthreshold.GetFloat() ); // If we're inverting our joystick, do so if ( joy_inverty.GetBool() ) { pitch *= -1.0f; } // drive yaw, pitch and move like a screen relative platformer game if ( CAM_IsThirdPerson() && thirdperson_platformer.GetInt() ) { if ( forward || side ) { // apply turn control [ YAW ] // factor in the camera offset, so that the move direction is relative to the thirdperson camera viewangles[ YAW ] = RAD2DEG(atan2(-side, -forward)) + m_vecCameraOffset[ YAW ]; engine->SetViewAngles( viewangles ); // apply movement Vector2D moveDir( forward, side ); cmd->forwardmove += moveDir.Length() * cl_forwardspeed.GetFloat(); } if ( pitch || yaw ) { // look around with the camera m_vecCameraOffset[ PITCH ] += pitch * joy_pitchsensitivity.GetFloat(); m_vecCameraOffset[ YAW ] += yaw * joy_yawsensitivity.GetFloat(); } if ( forward || side || pitch || yaw ) { // update the ideal pitch and yaw cam_idealpitch.SetValue( m_vecCameraOffset[ PITCH ] - viewangles[ PITCH ] ); cam_idealyaw.SetValue( m_vecCameraOffset[ YAW ] - viewangles[ YAW ] ); } return; } float joySideMove = 0.f; float joyForwardMove = 0.f; float aspeed = frametime * gHUD.GetFOVSensitivityAdjust(); // apply forward and side control C_BasePlayer *pLocalPlayer = C_BasePlayer::GetLocalPlayer(); int iResponseCurve = 0; if ( pLocalPlayer && pLocalPlayer->IsInAVehicle() ) { iResponseCurve = pLocalPlayer->GetVehicle() ? pLocalPlayer->GetVehicle()->GetJoystickResponseCurve() : joy_response_move_vehicle.GetInt(); } else { iResponseCurve = joy_response_move.GetInt(); } float val = ResponseCurve( iResponseCurve, forward, PITCH, joy_forwardsensitivity.GetFloat() ); joyForwardMove += val * cl_forwardspeed.GetFloat(); val = ResponseCurve( iResponseCurve, side, YAW, joy_sidesensitivity.GetFloat() ); joySideMove += val * cl_sidespeed.GetFloat(); Vector2D move( yaw, pitch ); float dist = move.Length(); // apply turn control float angle = 0.f; if ( JOY_ABSOLUTE_AXIS == gameAxes[GAME_AXIS_YAW].controlType ) { float fAxisValue = ResponseCurveLook( joy_response_look.GetInt(), yaw, YAW, pitch, dist, frametime ); angle = fAxisValue * joy_yawsensitivity.GetFloat() * aspeed * cl_yawspeed.GetFloat(); } else { angle = yaw * joy_yawsensitivity.GetFloat() * aspeed * 180.0; } viewangles[YAW] += angle; cmd->mousedx = angle; // apply look control if ( IsX360() || in_jlook.state & 1 ) { float angle = 0; if ( JOY_ABSOLUTE_AXIS == gameAxes[GAME_AXIS_PITCH].controlType ) { float fAxisValue = ResponseCurveLook( joy_response_look.GetInt(), pitch, PITCH, yaw, dist, frametime ); angle = fAxisValue * joy_pitchsensitivity.GetFloat() * aspeed * cl_pitchspeed.GetFloat(); } else { angle = pitch * joy_pitchsensitivity.GetFloat() * aspeed * 180.0; } viewangles[PITCH] += angle; cmd->mousedy = angle; view->StopPitchDrift(); if( pitch == 0.f && lookspring.GetFloat() == 0.f ) { // no pitch movement // disable pitch return-to-center unless requested by user // *** this code can be removed when the lookspring bug is fixed // *** the bug always has the lookspring feature on view->StopPitchDrift(); } } // apply player motion relative to screen space if ( CAM_IsThirdPerson() && thirdperson_screenspace.GetInt() ) { float ideal_yaw = cam_idealyaw.GetFloat(); float ideal_sin = sin(DEG2RAD(ideal_yaw)); float ideal_cos = cos(DEG2RAD(ideal_yaw)); float side_movement = ideal_cos*joySideMove - ideal_sin*joyForwardMove; float forward_movement = ideal_cos*joyForwardMove + ideal_sin*joySideMove; cmd->forwardmove += forward_movement; cmd->sidemove += side_movement; } else { cmd->forwardmove += joyForwardMove; cmd->sidemove += joySideMove; } if ( IsPC() ) { CCommand tmp; if ( FloatMakePositive(joyForwardMove) >= joy_autosprint.GetFloat() || FloatMakePositive(joySideMove) >= joy_autosprint.GetFloat() ) { KeyDown( &in_joyspeed, NULL ); } else { KeyUp( &in_joyspeed, NULL ); } } // Bound pitch viewangles[PITCH] = clamp( viewangles[ PITCH ], -cl_pitchup.GetFloat(), cl_pitchdown.GetFloat() ); engine->SetViewAngles( viewangles ); }