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: 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 ); }
void CHUDQuickInfo::Paint() { CHudTexture *icon_c = gHUD.GetIcon( "crosshair" ); CHudTexture *icon_rb = gHUD.GetIcon( "crosshair_right" ); CHudTexture *icon_lb = gHUD.GetIcon( "crosshair_left" ); if ( !icon_c || !icon_rb || !icon_lb ) return; int xCenter = ( ScreenWidth() / 2 ) - icon_c->Width() / 2; int yCenter = ( ScreenHeight() / 2 ) - icon_c->Height() / 2; int scalar; C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); if ( player == NULL ) return; C_BaseCombatWeapon *pWeapon = GetActiveWeapon(); if ( pWeapon == NULL ) return; //Get our values int health = player->GetHealth(); int ammo = pWeapon->Clip1(); if ( m_fDamageFade > 0.0f ) { m_fDamageFade -= (gpGlobals->frametime * 200.0f); } //Check our health for a warning if ( health != m_lastHealth ) { if ( health < m_lastHealth ) { m_fDamageFade = QINFO_FADE_TIME; } m_fFade = QINFO_FADE_TIME; m_lastHealth = health; if ( health <= HEALTH_WARNING_THRESHOLD ) { if ( m_warnHealth == false ) { m_healthFade = 255; m_warnHealth = true; CLocalPlayerFilter filter; C_BaseEntity::EmitSound( filter, SOUND_FROM_LOCAL_PLAYER, "HUDQuickInfo.LowHealth" ); } } else { m_warnHealth = false; } } // Check our ammo for a warning if ( ammo != m_lastAmmo ) { m_fFade = QINFO_FADE_TIME; m_lastAmmo = ammo; if ( ( (float) ammo / (float) pWeapon->GetMaxClip1() ) <= ( 1.0f - CLIP_PERC_THRESHOLD ) ) { if ( m_warnAmmo == false ) { m_ammoFade = 255; m_warnAmmo = true; CLocalPlayerFilter filter; C_BaseEntity::EmitSound( filter, SOUND_FROM_LOCAL_PLAYER, "HUDQuickInfo.LowAmmo" ); } } else { m_warnAmmo = false; } } //Get our crosshair intensity if ( m_fFade > 0.0f ) { m_fFade -= (gpGlobals->frametime * 50.0f); if ( m_fFade < 128.0f ) { scalar = (int) max( 16, (m_fFade) ); } else { scalar = 128; } } else { scalar = 16; } if ( player->IsInAVehicle() ) { scalar = 48; } Color clrNormal = gHUD.m_clrNormal; clrNormal[3] = 255 * scalar; icon_c->DrawSelf( xCenter, yCenter, clrNormal ); int sinScale = (int)( fabs(sin(gpGlobals->curtime*8.0f)) * 128.0f ); //Update our health if ( m_healthFade > 0.0f ) { DrawWarning( xCenter - 10, yCenter-5, icon_lb, m_healthFade ); } else { float healthPerc = (float) health / 100.0f; Color healthColor = m_warnHealth ? gHUD.m_clrCaution : gHUD.m_clrNormal; if ( m_warnHealth ) { healthColor[3] = 255 * sinScale; } else { healthColor[3] = 255 * scalar; } gHUD.DrawIconProgressBar( xCenter - 10, yCenter-5, icon_lb, ( 1.0f - healthPerc ), healthColor, CHud::HUDPB_VERTICAL ); } //Update our ammo if ( m_ammoFade > 0.0f ) { DrawWarning( xCenter + icon_rb->Width() - 6, yCenter-5, icon_rb, m_ammoFade ); } else { float ammoPerc = 1.0f - ( (float) ammo / (float) pWeapon->GetMaxClip1() ); Color ammoColor = m_warnAmmo ? gHUD.m_clrCaution : gHUD.m_clrNormal; if ( m_warnAmmo ) { ammoColor[3] = 255 * sinScale; } else { ammoColor[3] = 255 * scalar; } gHUD.DrawIconProgressBar( xCenter + icon_rb->Width() - 6, yCenter-5, icon_rb, ammoPerc, ammoColor, CHud::HUDPB_VERTICAL ); } }