Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
5.2 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose: TF2 specific input handling
  4. //
  5. // $NoKeywords: $
  6. //=============================================================================
  7. #include "cbase.h"
  8. #include "kbutton.h"
  9. #include "input.h"
  10. #include "c_tf_player.h"
  11. #include "cam_thirdperson.h"
  12. extern ConVar thirdperson_platformer;
  13. extern ConVar cam_idealyaw;
  14. extern ConVar cl_yawspeed;
  15. extern kbutton_t in_left;
  16. extern kbutton_t in_right;
  17. extern CThirdPersonManager g_ThirdPersonManager;
  18. //-----------------------------------------------------------------------------
  19. // Purpose: TF Input interface
  20. //-----------------------------------------------------------------------------
  21. class CTFInput : public CInput
  22. {
  23. public:
  24. CTFInput()
  25. : m_angThirdPersonOffset( 0.f, 0.f, 0.f )
  26. {}
  27. virtual float CAM_CapYaw( float fVal ) const OVERRIDE;
  28. virtual float CAM_CapPitch( float fVal ) const OVERRIDE;
  29. virtual void AdjustYaw( float speed, QAngle& viewangles );
  30. virtual float JoyStickAdjustYaw( float flSpeed ) OVERRIDE;
  31. virtual void ApplyMouse( QAngle& viewangles, CUserCmd *cmd, float mouse_x, float mouse_y ) OVERRIDE;
  32. private:
  33. QAngle m_angThirdPersonOffset;
  34. };
  35. static CTFInput g_Input;
  36. // Expose this interface
  37. IInput *input = ( IInput * )&g_Input;
  38. //-----------------------------------------------------------------------------
  39. // Purpose:
  40. //-----------------------------------------------------------------------------
  41. float CTFInput::CAM_CapYaw( float fVal ) const
  42. {
  43. CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
  44. if ( !pPlayer )
  45. return fVal;
  46. if ( pPlayer->m_Shared.InCond( TF_COND_SHIELD_CHARGE ) )
  47. {
  48. float flChargeYawCap = pPlayer->m_Shared.CalculateChargeCap();
  49. if ( fVal > flChargeYawCap )
  50. return flChargeYawCap;
  51. else if ( fVal < -flChargeYawCap )
  52. return -flChargeYawCap;
  53. }
  54. return fVal;
  55. }
  56. //-----------------------------------------------------------------------------
  57. // Purpose:
  58. //-----------------------------------------------------------------------------
  59. float CTFInput::CAM_CapPitch( float fVal ) const
  60. {
  61. CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
  62. if ( !pPlayer )
  63. return fVal;
  64. return fVal;
  65. }
  66. //-----------------------------------------------------------------------------
  67. // Purpose:
  68. //-----------------------------------------------------------------------------
  69. void CTFInput::AdjustYaw( float speed, QAngle& viewangles )
  70. {
  71. if ( !(in_strafe.state & 1) )
  72. {
  73. float yaw_right = speed*cl_yawspeed.GetFloat() * KeyState (&in_right);
  74. float yaw_left = speed*cl_yawspeed.GetFloat() * KeyState (&in_left);
  75. CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
  76. if ( pPlayer && pPlayer->m_Shared.InCond( TF_COND_SHIELD_CHARGE ) )
  77. {
  78. float flChargeYawCap = pPlayer->m_Shared.CalculateChargeCap();
  79. if ( yaw_right > flChargeYawCap )
  80. yaw_right = flChargeYawCap;
  81. else if ( yaw_right < -flChargeYawCap )
  82. yaw_right = -flChargeYawCap;
  83. if ( yaw_left > flChargeYawCap )
  84. yaw_left = flChargeYawCap;
  85. else if ( yaw_left < -flChargeYawCap )
  86. yaw_left = -flChargeYawCap;
  87. }
  88. viewangles[YAW] -= yaw_right;
  89. viewangles[YAW] += yaw_left;
  90. }
  91. if ( CAM_IsThirdPerson() )
  92. {
  93. if ( thirdperson_platformer.GetInt() )
  94. {
  95. float side = KeyState(&in_moveleft) - KeyState(&in_moveright);
  96. float forward = KeyState(&in_forward) - KeyState(&in_back);
  97. if ( side || forward )
  98. {
  99. viewangles[YAW] = RAD2DEG(atan2(side, forward)) + g_ThirdPersonManager.GetCameraOffsetAngles()[ YAW ];
  100. }
  101. if ( side || forward || KeyState (&in_right) || KeyState (&in_left) )
  102. {
  103. cam_idealyaw.SetValue( g_ThirdPersonManager.GetCameraOffsetAngles()[ YAW ] - viewangles[ YAW ] );
  104. }
  105. }
  106. }
  107. }
  108. //-----------------------------------------------------------------------------
  109. // Purpose:
  110. //-----------------------------------------------------------------------------
  111. float CTFInput::JoyStickAdjustYaw( float flSpeed )
  112. {
  113. // Make sure we're not strafing
  114. if ( flSpeed && !(in_strafe.state & 1) )
  115. {
  116. CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
  117. if ( pPlayer && pPlayer->m_Shared.InCond( TF_COND_SHIELD_CHARGE ) )
  118. {
  119. float flChargeYawCap = pPlayer->m_Shared.CalculateChargeCap();
  120. if ( flSpeed > 0.f && flSpeed > flChargeYawCap )
  121. flSpeed = flChargeYawCap;
  122. else if ( flSpeed < 0.f && flSpeed < -flChargeYawCap )
  123. flSpeed = -flChargeYawCap;
  124. }
  125. }
  126. return flSpeed;
  127. }
  128. ConVar tf_halloween_kart_cam_follow( "tf_halloween_kart_cam_follow", "0.3f", FCVAR_CHEAT );
  129. void CTFInput::ApplyMouse( QAngle& viewangles, CUserCmd *cmd, float mouse_x, float mouse_y )
  130. {
  131. CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
  132. if ( pPlayer && pPlayer->m_Shared.InCond( TF_COND_HALLOWEEN_KART ) )
  133. {
  134. // Make the camera drift a little behind the car
  135. float flDelta = pPlayer->GetTauntYaw() - m_angThirdPersonOffset[YAW];
  136. float flSign = Sign( flDelta );
  137. flDelta = Max( 2.f , (float)fabs(flDelta) ) * flSign;
  138. float flSpeed = gpGlobals->frametime * flDelta * flDelta * tf_halloween_kart_cam_follow.GetFloat();
  139. m_angThirdPersonOffset[YAW] = Approach( pPlayer->GetTauntYaw(), m_angThirdPersonOffset[YAW], flSpeed );
  140. viewangles[YAW] = m_angThirdPersonOffset[YAW];
  141. }
  142. else
  143. {
  144. CInput::ApplyMouse( viewangles, cmd, mouse_x, mouse_y );
  145. }
  146. }