Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.

170 lines
5.2 KiB

5 years ago
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: TF2 specific input handling
//
// $NoKeywords: $
//=============================================================================
#include "cbase.h"
#include "kbutton.h"
#include "input.h"
#include "c_tf_player.h"
#include "cam_thirdperson.h"
extern ConVar thirdperson_platformer;
extern ConVar cam_idealyaw;
extern ConVar cl_yawspeed;
extern kbutton_t in_left;
extern kbutton_t in_right;
extern CThirdPersonManager g_ThirdPersonManager;
//-----------------------------------------------------------------------------
// Purpose: TF Input interface
//-----------------------------------------------------------------------------
class CTFInput : public CInput
{
public:
CTFInput()
: m_angThirdPersonOffset( 0.f, 0.f, 0.f )
{}
virtual float CAM_CapYaw( float fVal ) const OVERRIDE;
virtual float CAM_CapPitch( float fVal ) const OVERRIDE;
virtual void AdjustYaw( float speed, QAngle& viewangles );
virtual float JoyStickAdjustYaw( float flSpeed ) OVERRIDE;
virtual void ApplyMouse( QAngle& viewangles, CUserCmd *cmd, float mouse_x, float mouse_y ) OVERRIDE;
private:
QAngle m_angThirdPersonOffset;
};
static CTFInput g_Input;
// Expose this interface
IInput *input = ( IInput * )&g_Input;
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
float CTFInput::CAM_CapYaw( float fVal ) const
{
CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( !pPlayer )
return fVal;
if ( pPlayer->m_Shared.InCond( TF_COND_SHIELD_CHARGE ) )
{
float flChargeYawCap = pPlayer->m_Shared.CalculateChargeCap();
if ( fVal > flChargeYawCap )
return flChargeYawCap;
else if ( fVal < -flChargeYawCap )
return -flChargeYawCap;
}
return fVal;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
float CTFInput::CAM_CapPitch( float fVal ) const
{
CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( !pPlayer )
return fVal;
return fVal;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTFInput::AdjustYaw( float speed, QAngle& viewangles )
{
if ( !(in_strafe.state & 1) )
{
float yaw_right = speed*cl_yawspeed.GetFloat() * KeyState (&in_right);
float yaw_left = speed*cl_yawspeed.GetFloat() * KeyState (&in_left);
CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( pPlayer && pPlayer->m_Shared.InCond( TF_COND_SHIELD_CHARGE ) )
{
float flChargeYawCap = pPlayer->m_Shared.CalculateChargeCap();
if ( yaw_right > flChargeYawCap )
yaw_right = flChargeYawCap;
else if ( yaw_right < -flChargeYawCap )
yaw_right = -flChargeYawCap;
if ( yaw_left > flChargeYawCap )
yaw_left = flChargeYawCap;
else if ( yaw_left < -flChargeYawCap )
yaw_left = -flChargeYawCap;
}
viewangles[YAW] -= yaw_right;
viewangles[YAW] += yaw_left;
}
if ( CAM_IsThirdPerson() )
{
if ( thirdperson_platformer.GetInt() )
{
float side = KeyState(&in_moveleft) - KeyState(&in_moveright);
float forward = KeyState(&in_forward) - KeyState(&in_back);
if ( side || forward )
{
viewangles[YAW] = RAD2DEG(atan2(side, forward)) + g_ThirdPersonManager.GetCameraOffsetAngles()[ YAW ];
}
if ( side || forward || KeyState (&in_right) || KeyState (&in_left) )
{
cam_idealyaw.SetValue( g_ThirdPersonManager.GetCameraOffsetAngles()[ YAW ] - viewangles[ YAW ] );
}
}
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
float CTFInput::JoyStickAdjustYaw( float flSpeed )
{
// Make sure we're not strafing
if ( flSpeed && !(in_strafe.state & 1) )
{
CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( pPlayer && pPlayer->m_Shared.InCond( TF_COND_SHIELD_CHARGE ) )
{
float flChargeYawCap = pPlayer->m_Shared.CalculateChargeCap();
if ( flSpeed > 0.f && flSpeed > flChargeYawCap )
flSpeed = flChargeYawCap;
else if ( flSpeed < 0.f && flSpeed < -flChargeYawCap )
flSpeed = -flChargeYawCap;
}
}
return flSpeed;
}
ConVar tf_halloween_kart_cam_follow( "tf_halloween_kart_cam_follow", "0.3f", FCVAR_CHEAT );
void CTFInput::ApplyMouse( QAngle& viewangles, CUserCmd *cmd, float mouse_x, float mouse_y )
{
CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( pPlayer && pPlayer->m_Shared.InCond( TF_COND_HALLOWEEN_KART ) )
{
// Make the camera drift a little behind the car
float flDelta = pPlayer->GetTauntYaw() - m_angThirdPersonOffset[YAW];
float flSign = Sign( flDelta );
flDelta = Max( 2.f , (float)fabs(flDelta) ) * flSign;
float flSpeed = gpGlobals->frametime * flDelta * flDelta * tf_halloween_kart_cam_follow.GetFloat();
m_angThirdPersonOffset[YAW] = Approach( pPlayer->GetTauntYaw(), m_angThirdPersonOffset[YAW], flSpeed );
viewangles[YAW] = m_angThirdPersonOffset[YAW];
}
else
{
CInput::ApplyMouse( viewangles, cmd, mouse_x, mouse_y );
}
}