aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/client/in_main.cpp
diff options
context:
space:
mode:
authorJørgen P. Tjernø <[email protected]>2013-12-02 19:31:46 -0800
committerJørgen P. Tjernø <[email protected]>2013-12-02 19:46:31 -0800
commitf56bb35301836e56582a575a75864392a0177875 (patch)
treede61ddd39de3e7df52759711950b4c288592f0dc /mp/src/game/client/in_main.cpp
parentMark some more files as text. (diff)
downloadsource-sdk-2013-f56bb35301836e56582a575a75864392a0177875.tar.xz
source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.zip
Fix line endings. WHAMMY.
Diffstat (limited to 'mp/src/game/client/in_main.cpp')
-rw-r--r--mp/src/game/client/in_main.cpp3400
1 files changed, 1700 insertions, 1700 deletions
diff --git a/mp/src/game/client/in_main.cpp b/mp/src/game/client/in_main.cpp
index a82fe17e..9cb7cd31 100644
--- a/mp/src/game/client/in_main.cpp
+++ b/mp/src/game/client/in_main.cpp
@@ -1,1700 +1,1700 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose: builds an intended movement command to send to the server
-//
-// $Workfile: $
-// $Date: $
-// $NoKeywords: $
-//=============================================================================//
-
-
-#include "cbase.h"
-#include "kbutton.h"
-#include "usercmd.h"
-#include "in_buttons.h"
-#include "input.h"
-#include "iviewrender.h"
-#include "iclientmode.h"
-#include "prediction.h"
-#include "bitbuf.h"
-#include "checksum_md5.h"
-#include "hltvcamera.h"
-#if defined( REPLAY_ENABLED )
-#include "replay/replaycamera.h"
-#endif
-#include <ctype.h> // isalnum()
-#include <voice_status.h>
-#include "cam_thirdperson.h"
-
-#ifdef SIXENSE
-#include "sixense/in_sixense.h"
-#endif
-
-#include "client_virtualreality.h"
-#include "headtrack/isourcevirtualreality.h"
-
-// NVNT Include
-#include "haptics/haptic_utils.h"
-#include <vgui/ISurface.h>
-
-extern ConVar in_joystick;
-extern ConVar cam_idealpitch;
-extern ConVar cam_idealyaw;
-
-// For showing/hiding the scoreboard
-#include <game/client/iviewport.h>
-
-// memdbgon must be the last include file in a .cpp file!!!
-#include "tier0/memdbgon.h"
-
-// FIXME, tie to entity state parsing for player!!!
-int g_iAlive = 1;
-
-static int s_ClearInputState = 0;
-
-// Defined in pm_math.c
-float anglemod( float a );
-
-// FIXME void V_Init( void );
-static int in_impulse = 0;
-static int in_cancel = 0;
-
-ConVar cl_anglespeedkey( "cl_anglespeedkey", "0.67", 0 );
-ConVar cl_yawspeed( "cl_yawspeed", "210", FCVAR_NONE, "Client yaw speed.", true, -100000, true, 100000 );
-ConVar cl_pitchspeed( "cl_pitchspeed", "225", FCVAR_NONE, "Client pitch speed.", true, -100000, true, 100000 );
-ConVar cl_pitchdown( "cl_pitchdown", "89", FCVAR_CHEAT );
-ConVar cl_pitchup( "cl_pitchup", "89", FCVAR_CHEAT );
-#if defined( CSTRIKE_DLL )
-ConVar cl_sidespeed( "cl_sidespeed", "400", FCVAR_CHEAT );
-ConVar cl_upspeed( "cl_upspeed", "320", FCVAR_ARCHIVE|FCVAR_CHEAT );
-ConVar cl_forwardspeed( "cl_forwardspeed", "400", FCVAR_ARCHIVE|FCVAR_CHEAT );
-ConVar cl_backspeed( "cl_backspeed", "400", FCVAR_ARCHIVE|FCVAR_CHEAT );
-#else
-ConVar cl_sidespeed( "cl_sidespeed", "450", FCVAR_REPLICATED | FCVAR_CHEAT );
-ConVar cl_upspeed( "cl_upspeed", "320", FCVAR_REPLICATED | FCVAR_CHEAT );
-ConVar cl_forwardspeed( "cl_forwardspeed", "450", FCVAR_REPLICATED | FCVAR_CHEAT );
-ConVar cl_backspeed( "cl_backspeed", "450", FCVAR_REPLICATED | FCVAR_CHEAT );
-#endif // CSTRIKE_DLL
-ConVar lookspring( "lookspring", "0", FCVAR_ARCHIVE );
-ConVar lookstrafe( "lookstrafe", "0", FCVAR_ARCHIVE );
-ConVar in_joystick( "joystick","0", FCVAR_ARCHIVE );
-
-ConVar thirdperson_platformer( "thirdperson_platformer", "0", 0, "Player will aim in the direction they are moving." );
-ConVar thirdperson_screenspace( "thirdperson_screenspace", "0", 0, "Movement will be relative to the camera, eg: left means screen-left" );
-
-ConVar sv_noclipduringpause( "sv_noclipduringpause", "0", FCVAR_REPLICATED | FCVAR_CHEAT, "If cheats are enabled, then you can noclip with the game paused (for doing screenshots, etc.)." );
-
-extern ConVar cl_mouselook;
-
-#define UsingMouselook() cl_mouselook.GetBool()
-
-/*
-===============================================================================
-
-KEY BUTTONS
-
-Continuous button event tracking is complicated by the fact that two different
-input sources (say, mouse button 1 and the control key) can both press the
-same button, but the button should only be released when both of the
-pressing key have been released.
-
-When a key event issues a button command (+forward, +attack, etc), it appends
-its key number as a parameter to the command so it can be matched up with
-the release.
-
-state bit 0 is the current state of the key
-state bit 1 is edge triggered on the up to down transition
-state bit 2 is edge triggered on the down to up transition
-
-===============================================================================
-*/
-
-kbutton_t in_speed;
-kbutton_t in_walk;
-kbutton_t in_jlook;
-kbutton_t in_strafe;
-kbutton_t in_commandermousemove;
-kbutton_t in_forward;
-kbutton_t in_back;
-kbutton_t in_moveleft;
-kbutton_t in_moveright;
-// Display the netgraph
-kbutton_t in_graph;
-kbutton_t in_joyspeed; // auto-speed key from the joystick (only works for player movement, not vehicles)
-
-static kbutton_t in_klook;
-kbutton_t in_left;
-kbutton_t in_right;
-static kbutton_t in_lookup;
-static kbutton_t in_lookdown;
-static kbutton_t in_use;
-static kbutton_t in_jump;
-static kbutton_t in_attack;
-static kbutton_t in_attack2;
-static kbutton_t in_up;
-static kbutton_t in_down;
-static kbutton_t in_duck;
-static kbutton_t in_reload;
-static kbutton_t in_alt1;
-static kbutton_t in_alt2;
-static kbutton_t in_score;
-static kbutton_t in_break;
-static kbutton_t in_zoom;
-static kbutton_t in_grenade1;
-static kbutton_t in_grenade2;
-static kbutton_t in_attack3;
-kbutton_t in_ducktoggle;
-
-/*
-===========
-IN_CenterView_f
-===========
-*/
-void IN_CenterView_f (void)
-{
- QAngle viewangles;
-
- if ( UsingMouselook() == false )
- {
- if ( !::input->CAM_InterceptingMouse() )
- {
- engine->GetViewAngles( viewangles );
- viewangles[PITCH] = 0;
- engine->SetViewAngles( viewangles );
- }
- }
-}
-
-/*
-===========
-IN_Joystick_Advanced_f
-===========
-*/
-void IN_Joystick_Advanced_f (void)
-{
- ::input->Joystick_Advanced();
-}
-
-/*
-============
-KB_ConvertString
-
-Removes references to +use and replaces them with the keyname in the output string. If
- a binding is unfound, then the original text is retained.
-NOTE: Only works for text with +word in it.
-============
-*/
-int KB_ConvertString( char *in, char **ppout )
-{
- char sz[ 4096 ];
- char binding[ 64 ];
- char *p;
- char *pOut;
- char *pEnd;
- const char *pBinding;
-
- if ( !ppout )
- return 0;
-
- *ppout = NULL;
- p = in;
- pOut = sz;
- while ( *p )
- {
- if ( *p == '+' )
- {
- pEnd = binding;
- while ( *p && ( V_isalnum( *p ) || ( pEnd == binding ) ) && ( ( pEnd - binding ) < 63 ) )
- {
- *pEnd++ = *p++;
- }
-
- *pEnd = '\0';
-
- pBinding = NULL;
- if ( strlen( binding + 1 ) > 0 )
- {
- // See if there is a binding for binding?
- pBinding = engine->Key_LookupBinding( binding + 1 );
- }
-
- if ( pBinding )
- {
- *pOut++ = '[';
- pEnd = (char *)pBinding;
- }
- else
- {
- pEnd = binding;
- }
-
- while ( *pEnd )
- {
- *pOut++ = *pEnd++;
- }
-
- if ( pBinding )
- {
- *pOut++ = ']';
- }
- }
- else
- {
- *pOut++ = *p++;
- }
- }
-
- *pOut = '\0';
-
- int maxlen = strlen( sz ) + 1;
- pOut = ( char * )malloc( maxlen );
- Q_strncpy( pOut, sz, maxlen );
- *ppout = pOut;
-
- return 1;
-}
-
-/*
-==============================
-FindKey
-
-Allows the engine to request a kbutton handler by name, if the key exists.
-==============================
-*/
-kbutton_t *CInput::FindKey( const char *name )
-{
- CKeyboardKey *p;
- p = m_pKeys;
- while ( p )
- {
- if ( !Q_stricmp( name, p->name ) )
- {
- return p->pkey;
- }
-
- p = p->next;
- }
- return NULL;
-}
-
-/*
-============
-AddKeyButton
-
-Add a kbutton_t * to the list of pointers the engine can retrieve via KB_Find
-============
-*/
-void CInput::AddKeyButton( const char *name, kbutton_t *pkb )
-{
- CKeyboardKey *p;
- kbutton_t *kb;
-
- kb = FindKey( name );
-
- if ( kb )
- return;
-
- p = new CKeyboardKey;
-
- Q_strncpy( p->name, name, sizeof( p->name ) );
- p->pkey = pkb;
-
- p->next = m_pKeys;
- m_pKeys = p;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-CInput::CInput( void )
-{
- m_pCommands = NULL;
- m_pCameraThirdData = NULL;
- m_pVerifiedCommands = NULL;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-CInput::~CInput( void )
-{
-}
-
-/*
-============
-Init_Keyboard
-
-Add kbutton_t definitions that the engine can query if needed
-============
-*/
-void CInput::Init_Keyboard( void )
-{
- m_pKeys = NULL;
-
- AddKeyButton( "in_graph", &in_graph );
- AddKeyButton( "in_jlook", &in_jlook );
-}
-
-/*
-============
-Shutdown_Keyboard
-
-Clear kblist
-============
-*/
-void CInput::Shutdown_Keyboard( void )
-{
- CKeyboardKey *p, *n;
- p = m_pKeys;
- while ( p )
- {
- n = p->next;
- delete p;
- p = n;
- }
- m_pKeys = NULL;
-}
-
-/*
-============
-KeyDown
-============
-*/
-void KeyDown( kbutton_t *b, const char *c )
-{
- int k = -1;
- if ( c && c[0] )
- {
- k = atoi(c);
- }
-
- if (k == b->down[0] || k == b->down[1])
- return; // repeating key
-
- if (!b->down[0])
- b->down[0] = k;
- else if (!b->down[1])
- b->down[1] = k;
- else
- {
- if ( c[0] )
- {
- DevMsg( 1,"Three keys down for a button '%c' '%c' '%c'!\n", b->down[0], b->down[1], c[0]);
- }
- return;
- }
-
- if (b->state & 1)
- return; // still down
- b->state |= 1 + 2; // down + impulse down
-}
-
-/*
-============
-KeyUp
-============
-*/
-void KeyUp( kbutton_t *b, const char *c )
-{
- if ( !c || !c[0] )
- {
- b->down[0] = b->down[1] = 0;
- b->state = 4; // impulse up
- return;
- }
-
- int k = atoi(c);
-
- if (b->down[0] == k)
- b->down[0] = 0;
- else if (b->down[1] == k)
- b->down[1] = 0;
- else
- return; // key up without coresponding down (menu pass through)
-
- if (b->down[0] || b->down[1])
- {
- //Msg ("Keys down for button: '%c' '%c' '%c' (%d,%d,%d)!\n", b->down[0], b->down[1], c, b->down[0], b->down[1], c);
- return; // some other key is still holding it down
- }
-
- if (!(b->state & 1))
- return; // still up (this should not happen)
-
- b->state &= ~1; // now up
- b->state |= 4; // impulse up
-}
-
-void IN_CommanderMouseMoveDown( const CCommand &args ) {KeyDown(&in_commandermousemove, args[1] );}
-void IN_CommanderMouseMoveUp( const CCommand &args ) {KeyUp(&in_commandermousemove, args[1] );}
-void IN_BreakDown( const CCommand &args ) { KeyDown( &in_break , args[1] );}
-void IN_BreakUp( const CCommand &args )
-{
- KeyUp( &in_break, args[1] );
-#if defined( _DEBUG )
- DebuggerBreak();
-#endif
-};
-void IN_KLookDown ( const CCommand &args ) {KeyDown(&in_klook, args[1] );}
-void IN_KLookUp ( const CCommand &args ) {KeyUp(&in_klook, args[1] );}
-void IN_JLookDown ( const CCommand &args ) {KeyDown(&in_jlook, args[1] );}
-void IN_JLookUp ( const CCommand &args ) {KeyUp(&in_jlook, args[1] );}
-void IN_UpDown( const CCommand &args ) {KeyDown(&in_up, args[1] );}
-void IN_UpUp( const CCommand &args ) {KeyUp(&in_up, args[1] );}
-void IN_DownDown( const CCommand &args ) {KeyDown(&in_down, args[1] );}
-void IN_DownUp( const CCommand &args ) {KeyUp(&in_down, args[1] );}
-void IN_LeftDown( const CCommand &args ) {KeyDown(&in_left, args[1] );}
-void IN_LeftUp( const CCommand &args ) {KeyUp(&in_left, args[1] );}
-void IN_RightDown( const CCommand &args ) {KeyDown(&in_right, args[1] );}
-void IN_RightUp( const CCommand &args ) {KeyUp(&in_right, args[1] );}
-void IN_ForwardDown( const CCommand &args ) {KeyDown(&in_forward, args[1] );}
-void IN_ForwardUp( const CCommand &args ) {KeyUp(&in_forward, args[1] );}
-void IN_BackDown( const CCommand &args ) {KeyDown(&in_back, args[1] );}
-void IN_BackUp( const CCommand &args ) {KeyUp(&in_back, args[1] );}
-void IN_LookupDown( const CCommand &args ) {KeyDown(&in_lookup, args[1] );}
-void IN_LookupUp( const CCommand &args ) {KeyUp(&in_lookup, args[1] );}
-void IN_LookdownDown( const CCommand &args ) {KeyDown(&in_lookdown, args[1] );}
-void IN_LookdownUp( const CCommand &args ) {KeyUp(&in_lookdown, args[1] );}
-void IN_MoveleftDown( const CCommand &args ) {KeyDown(&in_moveleft, args[1] );}
-void IN_MoveleftUp( const CCommand &args ) {KeyUp(&in_moveleft, args[1] );}
-void IN_MoverightDown( const CCommand &args ) {KeyDown(&in_moveright, args[1] );}
-void IN_MoverightUp( const CCommand &args ) {KeyUp(&in_moveright, args[1] );}
-void IN_WalkDown( const CCommand &args ) {KeyDown(&in_walk, args[1] );}
-void IN_WalkUp( const CCommand &args ) {KeyUp(&in_walk, args[1] );}
-void IN_SpeedDown( const CCommand &args ) {KeyDown(&in_speed, args[1] );}
-void IN_SpeedUp( const CCommand &args ) {KeyUp(&in_speed, args[1] );}
-void IN_StrafeDown( const CCommand &args ) {KeyDown(&in_strafe, args[1] );}
-void IN_StrafeUp( const CCommand &args ) {KeyUp(&in_strafe, args[1] );}
-void IN_Attack2Down( const CCommand &args ) { KeyDown(&in_attack2, args[1] );}
-void IN_Attack2Up( const CCommand &args ) {KeyUp(&in_attack2, args[1] );}
-void IN_UseDown ( const CCommand &args ) {KeyDown(&in_use, args[1] );}
-void IN_UseUp ( const CCommand &args ) {KeyUp(&in_use, args[1] );}
-void IN_JumpDown ( const CCommand &args ) {KeyDown(&in_jump, args[1] );}
-void IN_JumpUp ( const CCommand &args ) {KeyUp(&in_jump, args[1] );}
-void IN_DuckDown( const CCommand &args ) {KeyDown(&in_duck, args[1] );}
-void IN_DuckUp( const CCommand &args ) {KeyUp(&in_duck, args[1] );}
-void IN_ReloadDown( const CCommand &args ) {KeyDown(&in_reload, args[1] );}
-void IN_ReloadUp( const CCommand &args ) {KeyUp(&in_reload, args[1] );}
-void IN_Alt1Down( const CCommand &args ) {KeyDown(&in_alt1, args[1] );}
-void IN_Alt1Up( const CCommand &args ) {KeyUp(&in_alt1, args[1] );}
-void IN_Alt2Down( const CCommand &args ) {KeyDown(&in_alt2, args[1] );}
-void IN_Alt2Up( const CCommand &args ) {KeyUp(&in_alt2, args[1] );}
-void IN_GraphDown( const CCommand &args ) {KeyDown(&in_graph, args[1] );}
-void IN_GraphUp( const CCommand &args ) {KeyUp(&in_graph, args[1] );}
-void IN_ZoomDown( const CCommand &args ) {KeyDown(&in_zoom, args[1] );}
-void IN_ZoomUp( const CCommand &args ) {KeyUp(&in_zoom, args[1] );}
-void IN_Grenade1Up( const CCommand &args ) { KeyUp( &in_grenade1, args[1] ); }
-void IN_Grenade1Down( const CCommand &args ) { KeyDown( &in_grenade1, args[1] ); }
-void IN_Grenade2Up( const CCommand &args ) { KeyUp( &in_grenade2, args[1] ); }
-void IN_Grenade2Down( const CCommand &args ) { KeyDown( &in_grenade2, args[1] ); }
-void IN_XboxStub( const CCommand &args ) { /*do nothing*/ }
-void IN_Attack3Down( const CCommand &args ) { KeyDown(&in_attack3, args[1] );}
-void IN_Attack3Up( const CCommand &args ) { KeyUp(&in_attack3, args[1] );}
-
-void IN_DuckToggle( const CCommand &args )
-{
- if ( ::input->KeyState(&in_ducktoggle) )
- {
- KeyUp( &in_ducktoggle, args[1] );
- }
- else
- {
- KeyDown( &in_ducktoggle, args[1] );
- }
-}
-
-void IN_AttackDown( const CCommand &args )
-{
- KeyDown( &in_attack, args[1] );
-}
-
-void IN_AttackUp( const CCommand &args )
-{
- KeyUp( &in_attack, args[1] );
- in_cancel = 0;
-}
-
-// Special handling
-void IN_Cancel( const CCommand &args )
-{
- in_cancel = 1;
-}
-
-void IN_Impulse( const CCommand &args )
-{
- in_impulse = atoi( args[1] );
-}
-
-void IN_ScoreDown( const CCommand &args )
-{
- KeyDown( &in_score, args[1] );
- if ( gViewPortInterface )
- {
- gViewPortInterface->ShowPanel( PANEL_SCOREBOARD, true );
- }
-}
-
-void IN_ScoreUp( const CCommand &args )
-{
- KeyUp( &in_score, args[1] );
- if ( gViewPortInterface )
- {
- gViewPortInterface->ShowPanel( PANEL_SCOREBOARD, false );
- GetClientVoiceMgr()->StopSquelchMode();
- }
-}
-
-
-/*
-============
-KeyEvent
-
-Return 1 to allow engine to process the key, otherwise, act on it as needed
-============
-*/
-int CInput::KeyEvent( int down, ButtonCode_t code, const char *pszCurrentBinding )
-{
- // Deal with camera intercepting the mouse
- if ( ( code == MOUSE_LEFT ) || ( code == MOUSE_RIGHT ) )
- {
- if ( m_fCameraInterceptingMouse )
- return 0;
- }
-
- if ( g_pClientMode )
- return g_pClientMode->KeyInput(down, code, pszCurrentBinding);
-
- return 1;
-}
-
-
-
-/*
-===============
-KeyState
-
-Returns 0.25 if a key was pressed and released during the frame,
-0.5 if it was pressed and held
-0 if held then released, and
-1.0 if held for the entire time
-===============
-*/
-float CInput::KeyState ( kbutton_t *key )
-{
- float val = 0.0;
- int impulsedown, impulseup, down;
-
- impulsedown = key->state & 2;
- impulseup = key->state & 4;
- down = key->state & 1;
-
- if ( impulsedown && !impulseup )
- {
- // pressed and held this frame?
- val = down ? 0.5 : 0.0;
- }
-
- if ( impulseup && !impulsedown )
- {
- // released this frame?
- val = down ? 0.0 : 0.0;
- }
-
- if ( !impulsedown && !impulseup )
- {
- // held the entire frame?
- val = down ? 1.0 : 0.0;
- }
-
- if ( impulsedown && impulseup )
- {
- if ( down )
- {
- // released and re-pressed this frame
- val = 0.75;
- }
- else
- {
- // pressed and released this frame
- val = 0.25;
- }
- }
-
- // clear impulses
- key->state &= 1;
- return val;
-}
-
-void CInput::IN_SetSampleTime( float frametime )
-{
- m_flKeyboardSampleTime = frametime;
-}
-
-/*
-==============================
-DetermineKeySpeed
-
-==============================
-*/
-static ConVar in_usekeyboardsampletime( "in_usekeyboardsampletime", "1", 0, "Use keyboard sample time smoothing." );
-
-float CInput::DetermineKeySpeed( float frametime )
-{
-
- if ( in_usekeyboardsampletime.GetBool() )
- {
- if ( m_flKeyboardSampleTime <= 0 )
- return 0.0f;
-
- frametime = MIN( m_flKeyboardSampleTime, frametime );
- m_flKeyboardSampleTime -= frametime;
- }
-
- float speed;
-
- speed = frametime;
-
- if ( in_speed.state & 1 )
- {
- speed *= cl_anglespeedkey.GetFloat();
- }
-
- return speed;
-}
-
-/*
-==============================
-AdjustYaw
-
-==============================
-*/
-void CInput::AdjustYaw( float speed, QAngle& viewangles )
-{
- if ( !(in_strafe.state & 1) )
- {
- viewangles[YAW] -= speed*cl_yawspeed.GetFloat() * KeyState (&in_right);
- viewangles[YAW] += speed*cl_yawspeed.GetFloat() * KeyState (&in_left);
- }
-
- // thirdperson platformer mode
- // use movement keys to aim the player relative to the thirdperson camera
- if ( CAM_IsThirdPerson() && 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 ] );
- }
- }
-}
-
-/*
-==============================
-AdjustPitch
-
-==============================
-*/
-void CInput::AdjustPitch( float speed, QAngle& viewangles )
-{
- // only allow keyboard looking if mouse look is disabled
- if ( UsingMouselook() == false )
- {
- float up, down;
-
- if ( in_klook.state & 1 )
- {
- view->StopPitchDrift ();
- viewangles[PITCH] -= speed*cl_pitchspeed.GetFloat() * KeyState (&in_forward);
- viewangles[PITCH] += speed*cl_pitchspeed.GetFloat() * KeyState (&in_back);
- }
-
- up = KeyState ( &in_lookup );
- down = KeyState ( &in_lookdown );
-
- viewangles[PITCH] -= speed*cl_pitchspeed.GetFloat() * up;
- viewangles[PITCH] += speed*cl_pitchspeed.GetFloat() * down;
-
- if ( up || down )
- {
- view->StopPitchDrift ();
- }
- }
-}
-
-/*
-==============================
-ClampAngles
-
-==============================
-*/
-void CInput::ClampAngles( QAngle& viewangles )
-{
- if ( viewangles[PITCH] > cl_pitchdown.GetFloat() )
- {
- viewangles[PITCH] = cl_pitchdown.GetFloat();
- }
- if ( viewangles[PITCH] < -cl_pitchup.GetFloat() )
- {
- viewangles[PITCH] = -cl_pitchup.GetFloat();
- }
-
-#ifndef PORTAL // Don't constrain Roll in Portal because the player can be upside down! -Jeep
- if ( viewangles[ROLL] > 50 )
- {
- viewangles[ROLL] = 50;
- }
- if ( viewangles[ROLL] < -50 )
- {
- viewangles[ROLL] = -50;
- }
-#endif
-}
-
-/*
-================
-AdjustAngles
-
-Moves the local angle positions
-================
-*/
-void CInput::AdjustAngles ( float frametime )
-{
- float speed;
- QAngle viewangles;
-
- // Determine control scaling factor ( multiplies time )
- speed = DetermineKeySpeed( frametime );
- if ( speed <= 0.0f )
- {
- return;
- }
-
- // Retrieve latest view direction from engine
- engine->GetViewAngles( viewangles );
-
- // Adjust YAW
- AdjustYaw( speed, viewangles );
-
- // Adjust PITCH if keyboard looking
- AdjustPitch( speed, viewangles );
-
- // Make sure values are legitimate
- ClampAngles( viewangles );
-
- // Store new view angles into engine view direction
- engine->SetViewAngles( viewangles );
-}
-
-/*
-==============================
-ComputeSideMove
-
-==============================
-*/
-void CInput::ComputeSideMove( CUserCmd *cmd )
-{
- // thirdperson platformer movement
- if ( CAM_IsThirdPerson() && thirdperson_platformer.GetInt() )
- {
- // no sideways movement in this mode
- return;
- }
-
- // thirdperson screenspace movement
- 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 movement = ideal_cos*KeyState(&in_moveright)
- + ideal_sin*KeyState(&in_back)
- + -ideal_cos*KeyState(&in_moveleft)
- + -ideal_sin*KeyState(&in_forward);
-
- cmd->sidemove += cl_sidespeed.GetFloat() * movement;
-
- return;
- }
-
- // If strafing, check left and right keys and act like moveleft and moveright keys
- if ( in_strafe.state & 1 )
- {
- cmd->sidemove += cl_sidespeed.GetFloat() * KeyState (&in_right);
- cmd->sidemove -= cl_sidespeed.GetFloat() * KeyState (&in_left);
- }
-
- // Otherwise, check strafe keys
- cmd->sidemove += cl_sidespeed.GetFloat() * KeyState (&in_moveright);
- cmd->sidemove -= cl_sidespeed.GetFloat() * KeyState (&in_moveleft);
-}
-
-/*
-==============================
-ComputeUpwardMove
-
-==============================
-*/
-void CInput::ComputeUpwardMove( CUserCmd *cmd )
-{
- cmd->upmove += cl_upspeed.GetFloat() * KeyState (&in_up);
- cmd->upmove -= cl_upspeed.GetFloat() * KeyState (&in_down);
-}
-
-/*
-==============================
-ComputeForwardMove
-
-==============================
-*/
-void CInput::ComputeForwardMove( CUserCmd *cmd )
-{
- // thirdperson platformer movement
- if ( CAM_IsThirdPerson() && thirdperson_platformer.GetInt() )
- {
- // movement is always forward in this mode
- float movement = KeyState(&in_forward)
- || KeyState(&in_moveright)
- || KeyState(&in_back)
- || KeyState(&in_moveleft);
-
- cmd->forwardmove += cl_forwardspeed.GetFloat() * movement;
-
- return;
- }
-
- // thirdperson screenspace movement
- 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 movement = ideal_cos*KeyState(&in_forward)
- + ideal_sin*KeyState(&in_moveright)
- + -ideal_cos*KeyState(&in_back)
- + -ideal_sin*KeyState(&in_moveleft);
-
- cmd->forwardmove += cl_forwardspeed.GetFloat() * movement;
-
- return;
- }
-
- if ( !(in_klook.state & 1 ) )
- {
- cmd->forwardmove += cl_forwardspeed.GetFloat() * KeyState (&in_forward);
- cmd->forwardmove -= cl_backspeed.GetFloat() * KeyState (&in_back);
- }
-}
-
-/*
-==============================
-ScaleMovements
-
-==============================
-*/
-void CInput::ScaleMovements( CUserCmd *cmd )
-{
- // float spd;
-
- // clip to maxspeed
- // FIXME FIXME: This doesn't work
- return;
-
- /*
- spd = engine->GetClientMaxspeed();
- if ( spd == 0.0 )
- return;
-
- // Scale the speed so that the total velocity is not > spd
- float fmov = sqrt( (cmd->forwardmove*cmd->forwardmove) + (cmd->sidemove*cmd->sidemove) + (cmd->upmove*cmd->upmove) );
-
- if ( fmov > spd && fmov > 0.0 )
- {
- float fratio = spd / fmov;
-
- if ( !IsNoClipping() )
- {
- cmd->forwardmove *= fratio;
- cmd->sidemove *= fratio;
- cmd->upmove *= fratio;
- }
- }
- */
-}
-
-
-/*
-===========
-ControllerMove
-===========
-*/
-void CInput::ControllerMove( float frametime, CUserCmd *cmd )
-{
- if ( IsPC() )
- {
- if ( !m_fCameraInterceptingMouse && m_fMouseActive )
- {
- MouseMove( cmd);
- }
- }
-
- JoyStickMove( frametime, cmd);
-
- // NVNT if we have a haptic device..
- if(haptics && haptics->HasDevice())
- {
- if(engine->IsPaused() || engine->IsLevelMainMenuBackground() || vgui::surface()->IsCursorVisible() || !engine->IsInGame())
- {
- // NVNT send a menu process to the haptics system.
- haptics->MenuProcess();
- return;
- }
-#ifdef CSTRIKE_DLL
- // NVNT cstrike fov grabing.
- C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();
- if(player){
- haptics->UpdatePlayerFOV(player->GetFOV());
- }
-#endif
- // NVNT calculate move with the navigation on the haptics system.
- haptics->CalculateMove(cmd->forwardmove, cmd->sidemove, frametime);
- // NVNT send a game process to the haptics system.
- haptics->GameProcess();
-#if defined( WIN32 ) && !defined( _X360 )
- // NVNT update our avatar effect.
- UpdateAvatarEffect();
-#endif
- }
-
-
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Input : *weapon -
-//-----------------------------------------------------------------------------
-void CInput::MakeWeaponSelection( C_BaseCombatWeapon *weapon )
-{
- m_hSelectedWeapon = weapon;
-}
-
-/*
-================
-CreateMove
-
-Send the intended movement message to the server
-if active == 1 then we are 1) not playing back demos ( where our commands are ignored ) and
-2 ) we have finished signing on to server
-================
-*/
-
-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 );
- }
- }
-
-}
-
-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();
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Input : buf -
-// buffersize -
-// slot -
-//-----------------------------------------------------------------------------
-void CInput::EncodeUserCmdToBuffer( bf_write& buf, int sequence_number )
-{
- CUserCmd nullcmd;
- CUserCmd *cmd = GetUserCmd( sequence_number);
-
- WriteUsercmd( &buf, cmd, &nullcmd );
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Input : buf -
-// buffersize -
-// slot -
-//-----------------------------------------------------------------------------
-void CInput::DecodeUserCmdFromBuffer( bf_read& buf, int sequence_number )
-{
- CUserCmd nullcmd;
- CUserCmd *cmd = &m_pCommands[ sequence_number % MULTIPLAYER_BACKUP];
-
- ReadUsercmd( &buf, cmd, &nullcmd );
-}
-
-void CInput::ValidateUserCmd( CUserCmd *usercmd, int sequence_number )
-{
- // Validate that the usercmd hasn't been changed
- CRC32_t crc = usercmd->GetChecksum();
- if ( crc != m_pVerifiedCommands[ sequence_number % MULTIPLAYER_BACKUP ].m_crc )
- {
- *usercmd = m_pVerifiedCommands[ sequence_number % MULTIPLAYER_BACKUP ].m_cmd;
- }
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Input : *buf -
-// from -
-// to -
-//-----------------------------------------------------------------------------
-bool CInput::WriteUsercmdDeltaToBuffer( bf_write *buf, int from, int to, bool isnewcommand )
-{
- Assert( m_pCommands );
-
- CUserCmd nullcmd;
-
- CUserCmd *f, *t;
-
- int startbit = buf->GetNumBitsWritten();
-
- if ( from == -1 )
- {
- f = &nullcmd;
- }
- else
- {
- f = GetUserCmd( from );
-
- if ( !f )
- {
- // DevMsg( "WARNING! User command delta too old (from %i, to %i)\n", from, to );
- f = &nullcmd;
- }
- else
- {
- ValidateUserCmd( f, from );
- }
- }
-
- t = GetUserCmd( to );
-
- if ( !t )
- {
- // DevMsg( "WARNING! User command too old (from %i, to %i)\n", from, to );
- t = &nullcmd;
- }
- else
- {
- ValidateUserCmd( t, to );
- }
-
- // Write it into the buffer
- WriteUsercmd( buf, t, f );
-
- if ( buf->IsOverflowed() )
- {
- int endbit = buf->GetNumBitsWritten();
-
- Msg( "WARNING! User command buffer overflow(%i %i), last cmd was %i bits long\n",
- from, to, endbit - startbit );
-
- return false;
- }
-
- return true;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Input : slot -
-// Output : CUserCmd
-//-----------------------------------------------------------------------------
-CUserCmd *CInput::GetUserCmd( int sequence_number )
-{
- Assert( m_pCommands );
-
- CUserCmd *usercmd = &m_pCommands[ sequence_number % MULTIPLAYER_BACKUP ];
-
- if ( usercmd->command_number != sequence_number )
- {
- return NULL; // usercmd was overwritten by newer command
- }
-
- return usercmd;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Input : bits -
-// in_button -
-// in_ignore -
-// *button -
-// reset -
-// Output : static void
-//-----------------------------------------------------------------------------
-static void CalcButtonBits( int& bits, int in_button, int in_ignore, kbutton_t *button, bool reset )
-{
- // Down or still down?
- if ( button->state & 3 )
- {
- bits |= in_button;
- }
-
- int clearmask = ~2;
- if ( in_ignore & in_button )
- {
- // This gets taken care of below in the GetButtonBits code
- //bits &= ~in_button;
- // Remove "still down" as well as "just down"
- clearmask = ~3;
- }
-
- if ( reset )
- {
- button->state &= clearmask;
- }
-}
-
-/*
-============
-GetButtonBits
-
-Returns appropriate button info for keyboard and mouse state
-Set bResetState to 1 to clear old state info
-============
-*/
-int CInput::GetButtonBits( int bResetState )
-{
- int bits = 0;
-
- CalcButtonBits( bits, IN_SPEED, s_ClearInputState, &in_speed, bResetState );
- CalcButtonBits( bits, IN_WALK, s_ClearInputState, &in_walk, bResetState );
- CalcButtonBits( bits, IN_ATTACK, s_ClearInputState, &in_attack, bResetState );
- CalcButtonBits( bits, IN_DUCK, s_ClearInputState, &in_duck, bResetState );
- CalcButtonBits( bits, IN_JUMP, s_ClearInputState, &in_jump, bResetState );
- CalcButtonBits( bits, IN_FORWARD, s_ClearInputState, &in_forward, bResetState );
- CalcButtonBits( bits, IN_BACK, s_ClearInputState, &in_back, bResetState );
- CalcButtonBits( bits, IN_USE, s_ClearInputState, &in_use, bResetState );
- CalcButtonBits( bits, IN_LEFT, s_ClearInputState, &in_left, bResetState );
- CalcButtonBits( bits, IN_RIGHT, s_ClearInputState, &in_right, bResetState );
- CalcButtonBits( bits, IN_MOVELEFT, s_ClearInputState, &in_moveleft, bResetState );
- CalcButtonBits( bits, IN_MOVERIGHT, s_ClearInputState, &in_moveright, bResetState );
- CalcButtonBits( bits, IN_ATTACK2, s_ClearInputState, &in_attack2, bResetState );
- CalcButtonBits( bits, IN_RELOAD, s_ClearInputState, &in_reload, bResetState );
- CalcButtonBits( bits, IN_ALT1, s_ClearInputState, &in_alt1, bResetState );
- CalcButtonBits( bits, IN_ALT2, s_ClearInputState, &in_alt2, bResetState );
- CalcButtonBits( bits, IN_SCORE, s_ClearInputState, &in_score, bResetState );
- CalcButtonBits( bits, IN_ZOOM, s_ClearInputState, &in_zoom, bResetState );
- CalcButtonBits( bits, IN_GRENADE1, s_ClearInputState, &in_grenade1, bResetState );
- CalcButtonBits( bits, IN_GRENADE2, s_ClearInputState, &in_grenade2, bResetState );
- CalcButtonBits( bits, IN_ATTACK3, s_ClearInputState, &in_attack3, bResetState );
-
- if ( KeyState(&in_ducktoggle) )
- {
- bits |= IN_DUCK;
- }
-
- // Cancel is a special flag
- if (in_cancel)
- {
- bits |= IN_CANCEL;
- }
-
- if ( gHUD.m_iKeyBits & IN_WEAPON1 )
- {
- bits |= IN_WEAPON1;
- }
-
- if ( gHUD.m_iKeyBits & IN_WEAPON2 )
- {
- bits |= IN_WEAPON2;
- }
-
- // Clear out any residual
- bits &= ~s_ClearInputState;
-
- if ( bResetState )
- {
- s_ClearInputState = 0;
- }
-
- return bits;
-}
-
-
-//-----------------------------------------------------------------------------
-// Causes an input to have to be re-pressed to become active
-//-----------------------------------------------------------------------------
-void CInput::ClearInputButton( int bits )
-{
- s_ClearInputState |= bits;
-}
-
-
-/*
-==============================
-GetLookSpring
-
-==============================
-*/
-float CInput::GetLookSpring( void )
-{
- return lookspring.GetInt();
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Output : float
-//-----------------------------------------------------------------------------
-float CInput::GetLastForwardMove( void )
-{
- return m_flLastForwardMove;
-}
-
-
-#if defined( HL2_CLIENT_DLL )
-//-----------------------------------------------------------------------------
-// Purpose: back channel contact info for ground contact
-// Output :
-//-----------------------------------------------------------------------------
-
-void CInput::AddIKGroundContactInfo( int entindex, float minheight, float maxheight )
-{
- CEntityGroundContact data;
- data.entindex = entindex;
- data.minheight = minheight;
- data.maxheight = maxheight;
-
- if (m_EntityGroundContact.Count() >= MAX_EDICTS)
- {
- // some overflow here, probably bogus anyway
- Assert(0);
- m_EntityGroundContact.RemoveAll();
- return;
- }
-
- m_EntityGroundContact.AddToTail( data );
-}
-#endif
-
-
-static ConCommand startcommandermousemove("+commandermousemove", IN_CommanderMouseMoveDown);
-static ConCommand endcommandermousemove("-commandermousemove", IN_CommanderMouseMoveUp);
-static ConCommand startmoveup("+moveup",IN_UpDown);
-static ConCommand endmoveup("-moveup",IN_UpUp);
-static ConCommand startmovedown("+movedown",IN_DownDown);
-static ConCommand endmovedown("-movedown",IN_DownUp);
-static ConCommand startleft("+left",IN_LeftDown);
-static ConCommand endleft("-left",IN_LeftUp);
-static ConCommand startright("+right",IN_RightDown);
-static ConCommand endright("-right",IN_RightUp);
-static ConCommand startforward("+forward",IN_ForwardDown);
-static ConCommand endforward("-forward",IN_ForwardUp);
-static ConCommand startback("+back",IN_BackDown);
-static ConCommand endback("-back",IN_BackUp);
-static ConCommand startlookup("+lookup", IN_LookupDown);
-static ConCommand endlookup("-lookup", IN_LookupUp);
-static ConCommand startlookdown("+lookdown", IN_LookdownDown);
-static ConCommand lookdown("-lookdown", IN_LookdownUp);
-static ConCommand startstrafe("+strafe", IN_StrafeDown);
-static ConCommand endstrafe("-strafe", IN_StrafeUp);
-static ConCommand startmoveleft("+moveleft", IN_MoveleftDown);
-static ConCommand endmoveleft("-moveleft", IN_MoveleftUp);
-static ConCommand startmoveright("+moveright", IN_MoverightDown);
-static ConCommand endmoveright("-moveright", IN_MoverightUp);
-static ConCommand startspeed("+speed", IN_SpeedDown);
-static ConCommand endspeed("-speed", IN_SpeedUp);
-static ConCommand startwalk("+walk", IN_WalkDown);
-static ConCommand endwalk("-walk", IN_WalkUp);
-static ConCommand startattack("+attack", IN_AttackDown);
-static ConCommand endattack("-attack", IN_AttackUp);
-static ConCommand startattack2("+attack2", IN_Attack2Down);
-static ConCommand endattack2("-attack2", IN_Attack2Up);
-static ConCommand startuse("+use", IN_UseDown);
-static ConCommand enduse("-use", IN_UseUp);
-static ConCommand startjump("+jump", IN_JumpDown);
-static ConCommand endjump("-jump", IN_JumpUp);
-static ConCommand impulse("impulse", IN_Impulse);
-static ConCommand startklook("+klook", IN_KLookDown);
-static ConCommand endklook("-klook", IN_KLookUp);
-static ConCommand startjlook("+jlook", IN_JLookDown);
-static ConCommand endjlook("-jlook", IN_JLookUp);
-static ConCommand startduck("+duck", IN_DuckDown);
-static ConCommand endduck("-duck", IN_DuckUp);
-static ConCommand startreload("+reload", IN_ReloadDown);
-static ConCommand endreload("-reload", IN_ReloadUp);
-static ConCommand startalt1("+alt1", IN_Alt1Down);
-static ConCommand endalt1("-alt1", IN_Alt1Up);
-static ConCommand startalt2("+alt2", IN_Alt2Down);
-static ConCommand endalt2("-alt2", IN_Alt2Up);
-static ConCommand startscore("+score", IN_ScoreDown);
-static ConCommand endscore("-score", IN_ScoreUp);
-static ConCommand startshowscores("+showscores", IN_ScoreDown);
-static ConCommand endshowscores("-showscores", IN_ScoreUp);
-static ConCommand startgraph("+graph", IN_GraphDown);
-static ConCommand endgraph("-graph", IN_GraphUp);
-static ConCommand startbreak("+break",IN_BreakDown);
-static ConCommand endbreak("-break",IN_BreakUp);
-static ConCommand force_centerview("force_centerview", IN_CenterView_f);
-static ConCommand joyadvancedupdate("joyadvancedupdate", IN_Joystick_Advanced_f, "", FCVAR_CLIENTCMD_CAN_EXECUTE);
-static ConCommand startzoom("+zoom", IN_ZoomDown);
-static ConCommand endzoom("-zoom", IN_ZoomUp);
-static ConCommand endgrenade1( "-grenade1", IN_Grenade1Up );
-static ConCommand startgrenade1( "+grenade1", IN_Grenade1Down );
-static ConCommand endgrenade2( "-grenade2", IN_Grenade2Up );
-static ConCommand startgrenade2( "+grenade2", IN_Grenade2Down );
-static ConCommand startattack3("+attack3", IN_Attack3Down);
-static ConCommand endattack3("-attack3", IN_Attack3Up);
-
-#ifdef TF_CLIENT_DLL
-static ConCommand toggle_duck( "toggle_duck", IN_DuckToggle );
-#endif
-
-// Xbox 360 stub commands
-static ConCommand xboxmove("xmove", IN_XboxStub);
-static ConCommand xboxlook("xlook", IN_XboxStub);
-
-/*
-============
-Init_All
-============
-*/
-void CInput::Init_All (void)
-{
- Assert( !m_pCommands );
- m_pCommands = new CUserCmd[ MULTIPLAYER_BACKUP ];
- m_pVerifiedCommands = new CVerifiedUserCmd[ MULTIPLAYER_BACKUP ];
-
- m_fMouseInitialized = false;
- m_fRestoreSPI = false;
- m_fMouseActive = false;
- Q_memset( m_rgOrigMouseParms, 0, sizeof( m_rgOrigMouseParms ) );
- Q_memset( m_rgNewMouseParms, 0, sizeof( m_rgNewMouseParms ) );
- Q_memset( m_rgCheckMouseParam, 0, sizeof( m_rgCheckMouseParam ) );
-
- m_rgNewMouseParms[ MOUSE_ACCEL_THRESHHOLD1 ] = 0; // no 2x
- m_rgNewMouseParms[ MOUSE_ACCEL_THRESHHOLD2 ] = 0; // no 4x
- m_rgNewMouseParms[ MOUSE_SPEED_FACTOR ] = 1; // 0 = disabled, 1 = threshold 1 enabled, 2 = threshold 2 enabled
-
- m_fMouseParmsValid = false;
- m_fJoystickAdvancedInit = false;
- m_fHadJoysticks = false;
- m_flLastForwardMove = 0.0;
-
- // Initialize inputs
- if ( IsPC() )
- {
- Init_Mouse ();
- Init_Keyboard();
- }
-
- // Initialize third person camera controls.
- Init_Camera();
-}
-
-/*
-============
-Shutdown_All
-============
-*/
-void CInput::Shutdown_All(void)
-{
- DeactivateMouse();
- Shutdown_Keyboard();
-
- delete[] m_pCommands;
- m_pCommands = NULL;
-
- delete[] m_pVerifiedCommands;
- m_pVerifiedCommands = NULL;
-}
-
-void CInput::LevelInit( void )
-{
-#if defined( HL2_CLIENT_DLL )
- // Remove any IK information
- m_EntityGroundContact.RemoveAll();
-#endif
-}
-
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: builds an intended movement command to send to the server
+//
+// $Workfile: $
+// $Date: $
+// $NoKeywords: $
+//=============================================================================//
+
+
+#include "cbase.h"
+#include "kbutton.h"
+#include "usercmd.h"
+#include "in_buttons.h"
+#include "input.h"
+#include "iviewrender.h"
+#include "iclientmode.h"
+#include "prediction.h"
+#include "bitbuf.h"
+#include "checksum_md5.h"
+#include "hltvcamera.h"
+#if defined( REPLAY_ENABLED )
+#include "replay/replaycamera.h"
+#endif
+#include <ctype.h> // isalnum()
+#include <voice_status.h>
+#include "cam_thirdperson.h"
+
+#ifdef SIXENSE
+#include "sixense/in_sixense.h"
+#endif
+
+#include "client_virtualreality.h"
+#include "headtrack/isourcevirtualreality.h"
+
+// NVNT Include
+#include "haptics/haptic_utils.h"
+#include <vgui/ISurface.h>
+
+extern ConVar in_joystick;
+extern ConVar cam_idealpitch;
+extern ConVar cam_idealyaw;
+
+// For showing/hiding the scoreboard
+#include <game/client/iviewport.h>
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+// FIXME, tie to entity state parsing for player!!!
+int g_iAlive = 1;
+
+static int s_ClearInputState = 0;
+
+// Defined in pm_math.c
+float anglemod( float a );
+
+// FIXME void V_Init( void );
+static int in_impulse = 0;
+static int in_cancel = 0;
+
+ConVar cl_anglespeedkey( "cl_anglespeedkey", "0.67", 0 );
+ConVar cl_yawspeed( "cl_yawspeed", "210", FCVAR_NONE, "Client yaw speed.", true, -100000, true, 100000 );
+ConVar cl_pitchspeed( "cl_pitchspeed", "225", FCVAR_NONE, "Client pitch speed.", true, -100000, true, 100000 );
+ConVar cl_pitchdown( "cl_pitchdown", "89", FCVAR_CHEAT );
+ConVar cl_pitchup( "cl_pitchup", "89", FCVAR_CHEAT );
+#if defined( CSTRIKE_DLL )
+ConVar cl_sidespeed( "cl_sidespeed", "400", FCVAR_CHEAT );
+ConVar cl_upspeed( "cl_upspeed", "320", FCVAR_ARCHIVE|FCVAR_CHEAT );
+ConVar cl_forwardspeed( "cl_forwardspeed", "400", FCVAR_ARCHIVE|FCVAR_CHEAT );
+ConVar cl_backspeed( "cl_backspeed", "400", FCVAR_ARCHIVE|FCVAR_CHEAT );
+#else
+ConVar cl_sidespeed( "cl_sidespeed", "450", FCVAR_REPLICATED | FCVAR_CHEAT );
+ConVar cl_upspeed( "cl_upspeed", "320", FCVAR_REPLICATED | FCVAR_CHEAT );
+ConVar cl_forwardspeed( "cl_forwardspeed", "450", FCVAR_REPLICATED | FCVAR_CHEAT );
+ConVar cl_backspeed( "cl_backspeed", "450", FCVAR_REPLICATED | FCVAR_CHEAT );
+#endif // CSTRIKE_DLL
+ConVar lookspring( "lookspring", "0", FCVAR_ARCHIVE );
+ConVar lookstrafe( "lookstrafe", "0", FCVAR_ARCHIVE );
+ConVar in_joystick( "joystick","0", FCVAR_ARCHIVE );
+
+ConVar thirdperson_platformer( "thirdperson_platformer", "0", 0, "Player will aim in the direction they are moving." );
+ConVar thirdperson_screenspace( "thirdperson_screenspace", "0", 0, "Movement will be relative to the camera, eg: left means screen-left" );
+
+ConVar sv_noclipduringpause( "sv_noclipduringpause", "0", FCVAR_REPLICATED | FCVAR_CHEAT, "If cheats are enabled, then you can noclip with the game paused (for doing screenshots, etc.)." );
+
+extern ConVar cl_mouselook;
+
+#define UsingMouselook() cl_mouselook.GetBool()
+
+/*
+===============================================================================
+
+KEY BUTTONS
+
+Continuous button event tracking is complicated by the fact that two different
+input sources (say, mouse button 1 and the control key) can both press the
+same button, but the button should only be released when both of the
+pressing key have been released.
+
+When a key event issues a button command (+forward, +attack, etc), it appends
+its key number as a parameter to the command so it can be matched up with
+the release.
+
+state bit 0 is the current state of the key
+state bit 1 is edge triggered on the up to down transition
+state bit 2 is edge triggered on the down to up transition
+
+===============================================================================
+*/
+
+kbutton_t in_speed;
+kbutton_t in_walk;
+kbutton_t in_jlook;
+kbutton_t in_strafe;
+kbutton_t in_commandermousemove;
+kbutton_t in_forward;
+kbutton_t in_back;
+kbutton_t in_moveleft;
+kbutton_t in_moveright;
+// Display the netgraph
+kbutton_t in_graph;
+kbutton_t in_joyspeed; // auto-speed key from the joystick (only works for player movement, not vehicles)
+
+static kbutton_t in_klook;
+kbutton_t in_left;
+kbutton_t in_right;
+static kbutton_t in_lookup;
+static kbutton_t in_lookdown;
+static kbutton_t in_use;
+static kbutton_t in_jump;
+static kbutton_t in_attack;
+static kbutton_t in_attack2;
+static kbutton_t in_up;
+static kbutton_t in_down;
+static kbutton_t in_duck;
+static kbutton_t in_reload;
+static kbutton_t in_alt1;
+static kbutton_t in_alt2;
+static kbutton_t in_score;
+static kbutton_t in_break;
+static kbutton_t in_zoom;
+static kbutton_t in_grenade1;
+static kbutton_t in_grenade2;
+static kbutton_t in_attack3;
+kbutton_t in_ducktoggle;
+
+/*
+===========
+IN_CenterView_f
+===========
+*/
+void IN_CenterView_f (void)
+{
+ QAngle viewangles;
+
+ if ( UsingMouselook() == false )
+ {
+ if ( !::input->CAM_InterceptingMouse() )
+ {
+ engine->GetViewAngles( viewangles );
+ viewangles[PITCH] = 0;
+ engine->SetViewAngles( viewangles );
+ }
+ }
+}
+
+/*
+===========
+IN_Joystick_Advanced_f
+===========
+*/
+void IN_Joystick_Advanced_f (void)
+{
+ ::input->Joystick_Advanced();
+}
+
+/*
+============
+KB_ConvertString
+
+Removes references to +use and replaces them with the keyname in the output string. If
+ a binding is unfound, then the original text is retained.
+NOTE: Only works for text with +word in it.
+============
+*/
+int KB_ConvertString( char *in, char **ppout )
+{
+ char sz[ 4096 ];
+ char binding[ 64 ];
+ char *p;
+ char *pOut;
+ char *pEnd;
+ const char *pBinding;
+
+ if ( !ppout )
+ return 0;
+
+ *ppout = NULL;
+ p = in;
+ pOut = sz;
+ while ( *p )
+ {
+ if ( *p == '+' )
+ {
+ pEnd = binding;
+ while ( *p && ( V_isalnum( *p ) || ( pEnd == binding ) ) && ( ( pEnd - binding ) < 63 ) )
+ {
+ *pEnd++ = *p++;
+ }
+
+ *pEnd = '\0';
+
+ pBinding = NULL;
+ if ( strlen( binding + 1 ) > 0 )
+ {
+ // See if there is a binding for binding?
+ pBinding = engine->Key_LookupBinding( binding + 1 );
+ }
+
+ if ( pBinding )
+ {
+ *pOut++ = '[';
+ pEnd = (char *)pBinding;
+ }
+ else
+ {
+ pEnd = binding;
+ }
+
+ while ( *pEnd )
+ {
+ *pOut++ = *pEnd++;
+ }
+
+ if ( pBinding )
+ {
+ *pOut++ = ']';
+ }
+ }
+ else
+ {
+ *pOut++ = *p++;
+ }
+ }
+
+ *pOut = '\0';
+
+ int maxlen = strlen( sz ) + 1;
+ pOut = ( char * )malloc( maxlen );
+ Q_strncpy( pOut, sz, maxlen );
+ *ppout = pOut;
+
+ return 1;
+}
+
+/*
+==============================
+FindKey
+
+Allows the engine to request a kbutton handler by name, if the key exists.
+==============================
+*/
+kbutton_t *CInput::FindKey( const char *name )
+{
+ CKeyboardKey *p;
+ p = m_pKeys;
+ while ( p )
+ {
+ if ( !Q_stricmp( name, p->name ) )
+ {
+ return p->pkey;
+ }
+
+ p = p->next;
+ }
+ return NULL;
+}
+
+/*
+============
+AddKeyButton
+
+Add a kbutton_t * to the list of pointers the engine can retrieve via KB_Find
+============
+*/
+void CInput::AddKeyButton( const char *name, kbutton_t *pkb )
+{
+ CKeyboardKey *p;
+ kbutton_t *kb;
+
+ kb = FindKey( name );
+
+ if ( kb )
+ return;
+
+ p = new CKeyboardKey;
+
+ Q_strncpy( p->name, name, sizeof( p->name ) );
+ p->pkey = pkb;
+
+ p->next = m_pKeys;
+ m_pKeys = p;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CInput::CInput( void )
+{
+ m_pCommands = NULL;
+ m_pCameraThirdData = NULL;
+ m_pVerifiedCommands = NULL;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CInput::~CInput( void )
+{
+}
+
+/*
+============
+Init_Keyboard
+
+Add kbutton_t definitions that the engine can query if needed
+============
+*/
+void CInput::Init_Keyboard( void )
+{
+ m_pKeys = NULL;
+
+ AddKeyButton( "in_graph", &in_graph );
+ AddKeyButton( "in_jlook", &in_jlook );
+}
+
+/*
+============
+Shutdown_Keyboard
+
+Clear kblist
+============
+*/
+void CInput::Shutdown_Keyboard( void )
+{
+ CKeyboardKey *p, *n;
+ p = m_pKeys;
+ while ( p )
+ {
+ n = p->next;
+ delete p;
+ p = n;
+ }
+ m_pKeys = NULL;
+}
+
+/*
+============
+KeyDown
+============
+*/
+void KeyDown( kbutton_t *b, const char *c )
+{
+ int k = -1;
+ if ( c && c[0] )
+ {
+ k = atoi(c);
+ }
+
+ if (k == b->down[0] || k == b->down[1])
+ return; // repeating key
+
+ if (!b->down[0])
+ b->down[0] = k;
+ else if (!b->down[1])
+ b->down[1] = k;
+ else
+ {
+ if ( c[0] )
+ {
+ DevMsg( 1,"Three keys down for a button '%c' '%c' '%c'!\n", b->down[0], b->down[1], c[0]);
+ }
+ return;
+ }
+
+ if (b->state & 1)
+ return; // still down
+ b->state |= 1 + 2; // down + impulse down
+}
+
+/*
+============
+KeyUp
+============
+*/
+void KeyUp( kbutton_t *b, const char *c )
+{
+ if ( !c || !c[0] )
+ {
+ b->down[0] = b->down[1] = 0;
+ b->state = 4; // impulse up
+ return;
+ }
+
+ int k = atoi(c);
+
+ if (b->down[0] == k)
+ b->down[0] = 0;
+ else if (b->down[1] == k)
+ b->down[1] = 0;
+ else
+ return; // key up without coresponding down (menu pass through)
+
+ if (b->down[0] || b->down[1])
+ {
+ //Msg ("Keys down for button: '%c' '%c' '%c' (%d,%d,%d)!\n", b->down[0], b->down[1], c, b->down[0], b->down[1], c);
+ return; // some other key is still holding it down
+ }
+
+ if (!(b->state & 1))
+ return; // still up (this should not happen)
+
+ b->state &= ~1; // now up
+ b->state |= 4; // impulse up
+}
+
+void IN_CommanderMouseMoveDown( const CCommand &args ) {KeyDown(&in_commandermousemove, args[1] );}
+void IN_CommanderMouseMoveUp( const CCommand &args ) {KeyUp(&in_commandermousemove, args[1] );}
+void IN_BreakDown( const CCommand &args ) { KeyDown( &in_break , args[1] );}
+void IN_BreakUp( const CCommand &args )
+{
+ KeyUp( &in_break, args[1] );
+#if defined( _DEBUG )
+ DebuggerBreak();
+#endif
+};
+void IN_KLookDown ( const CCommand &args ) {KeyDown(&in_klook, args[1] );}
+void IN_KLookUp ( const CCommand &args ) {KeyUp(&in_klook, args[1] );}
+void IN_JLookDown ( const CCommand &args ) {KeyDown(&in_jlook, args[1] );}
+void IN_JLookUp ( const CCommand &args ) {KeyUp(&in_jlook, args[1] );}
+void IN_UpDown( const CCommand &args ) {KeyDown(&in_up, args[1] );}
+void IN_UpUp( const CCommand &args ) {KeyUp(&in_up, args[1] );}
+void IN_DownDown( const CCommand &args ) {KeyDown(&in_down, args[1] );}
+void IN_DownUp( const CCommand &args ) {KeyUp(&in_down, args[1] );}
+void IN_LeftDown( const CCommand &args ) {KeyDown(&in_left, args[1] );}
+void IN_LeftUp( const CCommand &args ) {KeyUp(&in_left, args[1] );}
+void IN_RightDown( const CCommand &args ) {KeyDown(&in_right, args[1] );}
+void IN_RightUp( const CCommand &args ) {KeyUp(&in_right, args[1] );}
+void IN_ForwardDown( const CCommand &args ) {KeyDown(&in_forward, args[1] );}
+void IN_ForwardUp( const CCommand &args ) {KeyUp(&in_forward, args[1] );}
+void IN_BackDown( const CCommand &args ) {KeyDown(&in_back, args[1] );}
+void IN_BackUp( const CCommand &args ) {KeyUp(&in_back, args[1] );}
+void IN_LookupDown( const CCommand &args ) {KeyDown(&in_lookup, args[1] );}
+void IN_LookupUp( const CCommand &args ) {KeyUp(&in_lookup, args[1] );}
+void IN_LookdownDown( const CCommand &args ) {KeyDown(&in_lookdown, args[1] );}
+void IN_LookdownUp( const CCommand &args ) {KeyUp(&in_lookdown, args[1] );}
+void IN_MoveleftDown( const CCommand &args ) {KeyDown(&in_moveleft, args[1] );}
+void IN_MoveleftUp( const CCommand &args ) {KeyUp(&in_moveleft, args[1] );}
+void IN_MoverightDown( const CCommand &args ) {KeyDown(&in_moveright, args[1] );}
+void IN_MoverightUp( const CCommand &args ) {KeyUp(&in_moveright, args[1] );}
+void IN_WalkDown( const CCommand &args ) {KeyDown(&in_walk, args[1] );}
+void IN_WalkUp( const CCommand &args ) {KeyUp(&in_walk, args[1] );}
+void IN_SpeedDown( const CCommand &args ) {KeyDown(&in_speed, args[1] );}
+void IN_SpeedUp( const CCommand &args ) {KeyUp(&in_speed, args[1] );}
+void IN_StrafeDown( const CCommand &args ) {KeyDown(&in_strafe, args[1] );}
+void IN_StrafeUp( const CCommand &args ) {KeyUp(&in_strafe, args[1] );}
+void IN_Attack2Down( const CCommand &args ) { KeyDown(&in_attack2, args[1] );}
+void IN_Attack2Up( const CCommand &args ) {KeyUp(&in_attack2, args[1] );}
+void IN_UseDown ( const CCommand &args ) {KeyDown(&in_use, args[1] );}
+void IN_UseUp ( const CCommand &args ) {KeyUp(&in_use, args[1] );}
+void IN_JumpDown ( const CCommand &args ) {KeyDown(&in_jump, args[1] );}
+void IN_JumpUp ( const CCommand &args ) {KeyUp(&in_jump, args[1] );}
+void IN_DuckDown( const CCommand &args ) {KeyDown(&in_duck, args[1] );}
+void IN_DuckUp( const CCommand &args ) {KeyUp(&in_duck, args[1] );}
+void IN_ReloadDown( const CCommand &args ) {KeyDown(&in_reload, args[1] );}
+void IN_ReloadUp( const CCommand &args ) {KeyUp(&in_reload, args[1] );}
+void IN_Alt1Down( const CCommand &args ) {KeyDown(&in_alt1, args[1] );}
+void IN_Alt1Up( const CCommand &args ) {KeyUp(&in_alt1, args[1] );}
+void IN_Alt2Down( const CCommand &args ) {KeyDown(&in_alt2, args[1] );}
+void IN_Alt2Up( const CCommand &args ) {KeyUp(&in_alt2, args[1] );}
+void IN_GraphDown( const CCommand &args ) {KeyDown(&in_graph, args[1] );}
+void IN_GraphUp( const CCommand &args ) {KeyUp(&in_graph, args[1] );}
+void IN_ZoomDown( const CCommand &args ) {KeyDown(&in_zoom, args[1] );}
+void IN_ZoomUp( const CCommand &args ) {KeyUp(&in_zoom, args[1] );}
+void IN_Grenade1Up( const CCommand &args ) { KeyUp( &in_grenade1, args[1] ); }
+void IN_Grenade1Down( const CCommand &args ) { KeyDown( &in_grenade1, args[1] ); }
+void IN_Grenade2Up( const CCommand &args ) { KeyUp( &in_grenade2, args[1] ); }
+void IN_Grenade2Down( const CCommand &args ) { KeyDown( &in_grenade2, args[1] ); }
+void IN_XboxStub( const CCommand &args ) { /*do nothing*/ }
+void IN_Attack3Down( const CCommand &args ) { KeyDown(&in_attack3, args[1] );}
+void IN_Attack3Up( const CCommand &args ) { KeyUp(&in_attack3, args[1] );}
+
+void IN_DuckToggle( const CCommand &args )
+{
+ if ( ::input->KeyState(&in_ducktoggle) )
+ {
+ KeyUp( &in_ducktoggle, args[1] );
+ }
+ else
+ {
+ KeyDown( &in_ducktoggle, args[1] );
+ }
+}
+
+void IN_AttackDown( const CCommand &args )
+{
+ KeyDown( &in_attack, args[1] );
+}
+
+void IN_AttackUp( const CCommand &args )
+{
+ KeyUp( &in_attack, args[1] );
+ in_cancel = 0;
+}
+
+// Special handling
+void IN_Cancel( const CCommand &args )
+{
+ in_cancel = 1;
+}
+
+void IN_Impulse( const CCommand &args )
+{
+ in_impulse = atoi( args[1] );
+}
+
+void IN_ScoreDown( const CCommand &args )
+{
+ KeyDown( &in_score, args[1] );
+ if ( gViewPortInterface )
+ {
+ gViewPortInterface->ShowPanel( PANEL_SCOREBOARD, true );
+ }
+}
+
+void IN_ScoreUp( const CCommand &args )
+{
+ KeyUp( &in_score, args[1] );
+ if ( gViewPortInterface )
+ {
+ gViewPortInterface->ShowPanel( PANEL_SCOREBOARD, false );
+ GetClientVoiceMgr()->StopSquelchMode();
+ }
+}
+
+
+/*
+============
+KeyEvent
+
+Return 1 to allow engine to process the key, otherwise, act on it as needed
+============
+*/
+int CInput::KeyEvent( int down, ButtonCode_t code, const char *pszCurrentBinding )
+{
+ // Deal with camera intercepting the mouse
+ if ( ( code == MOUSE_LEFT ) || ( code == MOUSE_RIGHT ) )
+ {
+ if ( m_fCameraInterceptingMouse )
+ return 0;
+ }
+
+ if ( g_pClientMode )
+ return g_pClientMode->KeyInput(down, code, pszCurrentBinding);
+
+ return 1;
+}
+
+
+
+/*
+===============
+KeyState
+
+Returns 0.25 if a key was pressed and released during the frame,
+0.5 if it was pressed and held
+0 if held then released, and
+1.0 if held for the entire time
+===============
+*/
+float CInput::KeyState ( kbutton_t *key )
+{
+ float val = 0.0;
+ int impulsedown, impulseup, down;
+
+ impulsedown = key->state & 2;
+ impulseup = key->state & 4;
+ down = key->state & 1;
+
+ if ( impulsedown && !impulseup )
+ {
+ // pressed and held this frame?
+ val = down ? 0.5 : 0.0;
+ }
+
+ if ( impulseup && !impulsedown )
+ {
+ // released this frame?
+ val = down ? 0.0 : 0.0;
+ }
+
+ if ( !impulsedown && !impulseup )
+ {
+ // held the entire frame?
+ val = down ? 1.0 : 0.0;
+ }
+
+ if ( impulsedown && impulseup )
+ {
+ if ( down )
+ {
+ // released and re-pressed this frame
+ val = 0.75;
+ }
+ else
+ {
+ // pressed and released this frame
+ val = 0.25;
+ }
+ }
+
+ // clear impulses
+ key->state &= 1;
+ return val;
+}
+
+void CInput::IN_SetSampleTime( float frametime )
+{
+ m_flKeyboardSampleTime = frametime;
+}
+
+/*
+==============================
+DetermineKeySpeed
+
+==============================
+*/
+static ConVar in_usekeyboardsampletime( "in_usekeyboardsampletime", "1", 0, "Use keyboard sample time smoothing." );
+
+float CInput::DetermineKeySpeed( float frametime )
+{
+
+ if ( in_usekeyboardsampletime.GetBool() )
+ {
+ if ( m_flKeyboardSampleTime <= 0 )
+ return 0.0f;
+
+ frametime = MIN( m_flKeyboardSampleTime, frametime );
+ m_flKeyboardSampleTime -= frametime;
+ }
+
+ float speed;
+
+ speed = frametime;
+
+ if ( in_speed.state & 1 )
+ {
+ speed *= cl_anglespeedkey.GetFloat();
+ }
+
+ return speed;
+}
+
+/*
+==============================
+AdjustYaw
+
+==============================
+*/
+void CInput::AdjustYaw( float speed, QAngle& viewangles )
+{
+ if ( !(in_strafe.state & 1) )
+ {
+ viewangles[YAW] -= speed*cl_yawspeed.GetFloat() * KeyState (&in_right);
+ viewangles[YAW] += speed*cl_yawspeed.GetFloat() * KeyState (&in_left);
+ }
+
+ // thirdperson platformer mode
+ // use movement keys to aim the player relative to the thirdperson camera
+ if ( CAM_IsThirdPerson() && 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 ] );
+ }
+ }
+}
+
+/*
+==============================
+AdjustPitch
+
+==============================
+*/
+void CInput::AdjustPitch( float speed, QAngle& viewangles )
+{
+ // only allow keyboard looking if mouse look is disabled
+ if ( UsingMouselook() == false )
+ {
+ float up, down;
+
+ if ( in_klook.state & 1 )
+ {
+ view->StopPitchDrift ();
+ viewangles[PITCH] -= speed*cl_pitchspeed.GetFloat() * KeyState (&in_forward);
+ viewangles[PITCH] += speed*cl_pitchspeed.GetFloat() * KeyState (&in_back);
+ }
+
+ up = KeyState ( &in_lookup );
+ down = KeyState ( &in_lookdown );
+
+ viewangles[PITCH] -= speed*cl_pitchspeed.GetFloat() * up;
+ viewangles[PITCH] += speed*cl_pitchspeed.GetFloat() * down;
+
+ if ( up || down )
+ {
+ view->StopPitchDrift ();
+ }
+ }
+}
+
+/*
+==============================
+ClampAngles
+
+==============================
+*/
+void CInput::ClampAngles( QAngle& viewangles )
+{
+ if ( viewangles[PITCH] > cl_pitchdown.GetFloat() )
+ {
+ viewangles[PITCH] = cl_pitchdown.GetFloat();
+ }
+ if ( viewangles[PITCH] < -cl_pitchup.GetFloat() )
+ {
+ viewangles[PITCH] = -cl_pitchup.GetFloat();
+ }
+
+#ifndef PORTAL // Don't constrain Roll in Portal because the player can be upside down! -Jeep
+ if ( viewangles[ROLL] > 50 )
+ {
+ viewangles[ROLL] = 50;
+ }
+ if ( viewangles[ROLL] < -50 )
+ {
+ viewangles[ROLL] = -50;
+ }
+#endif
+}
+
+/*
+================
+AdjustAngles
+
+Moves the local angle positions
+================
+*/
+void CInput::AdjustAngles ( float frametime )
+{
+ float speed;
+ QAngle viewangles;
+
+ // Determine control scaling factor ( multiplies time )
+ speed = DetermineKeySpeed( frametime );
+ if ( speed <= 0.0f )
+ {
+ return;
+ }
+
+ // Retrieve latest view direction from engine
+ engine->GetViewAngles( viewangles );
+
+ // Adjust YAW
+ AdjustYaw( speed, viewangles );
+
+ // Adjust PITCH if keyboard looking
+ AdjustPitch( speed, viewangles );
+
+ // Make sure values are legitimate
+ ClampAngles( viewangles );
+
+ // Store new view angles into engine view direction
+ engine->SetViewAngles( viewangles );
+}
+
+/*
+==============================
+ComputeSideMove
+
+==============================
+*/
+void CInput::ComputeSideMove( CUserCmd *cmd )
+{
+ // thirdperson platformer movement
+ if ( CAM_IsThirdPerson() && thirdperson_platformer.GetInt() )
+ {
+ // no sideways movement in this mode
+ return;
+ }
+
+ // thirdperson screenspace movement
+ 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 movement = ideal_cos*KeyState(&in_moveright)
+ + ideal_sin*KeyState(&in_back)
+ + -ideal_cos*KeyState(&in_moveleft)
+ + -ideal_sin*KeyState(&in_forward);
+
+ cmd->sidemove += cl_sidespeed.GetFloat() * movement;
+
+ return;
+ }
+
+ // If strafing, check left and right keys and act like moveleft and moveright keys
+ if ( in_strafe.state & 1 )
+ {
+ cmd->sidemove += cl_sidespeed.GetFloat() * KeyState (&in_right);
+ cmd->sidemove -= cl_sidespeed.GetFloat() * KeyState (&in_left);
+ }
+
+ // Otherwise, check strafe keys
+ cmd->sidemove += cl_sidespeed.GetFloat() * KeyState (&in_moveright);
+ cmd->sidemove -= cl_sidespeed.GetFloat() * KeyState (&in_moveleft);
+}
+
+/*
+==============================
+ComputeUpwardMove
+
+==============================
+*/
+void CInput::ComputeUpwardMove( CUserCmd *cmd )
+{
+ cmd->upmove += cl_upspeed.GetFloat() * KeyState (&in_up);
+ cmd->upmove -= cl_upspeed.GetFloat() * KeyState (&in_down);
+}
+
+/*
+==============================
+ComputeForwardMove
+
+==============================
+*/
+void CInput::ComputeForwardMove( CUserCmd *cmd )
+{
+ // thirdperson platformer movement
+ if ( CAM_IsThirdPerson() && thirdperson_platformer.GetInt() )
+ {
+ // movement is always forward in this mode
+ float movement = KeyState(&in_forward)
+ || KeyState(&in_moveright)
+ || KeyState(&in_back)
+ || KeyState(&in_moveleft);
+
+ cmd->forwardmove += cl_forwardspeed.GetFloat() * movement;
+
+ return;
+ }
+
+ // thirdperson screenspace movement
+ 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 movement = ideal_cos*KeyState(&in_forward)
+ + ideal_sin*KeyState(&in_moveright)
+ + -ideal_cos*KeyState(&in_back)
+ + -ideal_sin*KeyState(&in_moveleft);
+
+ cmd->forwardmove += cl_forwardspeed.GetFloat() * movement;
+
+ return;
+ }
+
+ if ( !(in_klook.state & 1 ) )
+ {
+ cmd->forwardmove += cl_forwardspeed.GetFloat() * KeyState (&in_forward);
+ cmd->forwardmove -= cl_backspeed.GetFloat() * KeyState (&in_back);
+ }
+}
+
+/*
+==============================
+ScaleMovements
+
+==============================
+*/
+void CInput::ScaleMovements( CUserCmd *cmd )
+{
+ // float spd;
+
+ // clip to maxspeed
+ // FIXME FIXME: This doesn't work
+ return;
+
+ /*
+ spd = engine->GetClientMaxspeed();
+ if ( spd == 0.0 )
+ return;
+
+ // Scale the speed so that the total velocity is not > spd
+ float fmov = sqrt( (cmd->forwardmove*cmd->forwardmove) + (cmd->sidemove*cmd->sidemove) + (cmd->upmove*cmd->upmove) );
+
+ if ( fmov > spd && fmov > 0.0 )
+ {
+ float fratio = spd / fmov;
+
+ if ( !IsNoClipping() )
+ {
+ cmd->forwardmove *= fratio;
+ cmd->sidemove *= fratio;
+ cmd->upmove *= fratio;
+ }
+ }
+ */
+}
+
+
+/*
+===========
+ControllerMove
+===========
+*/
+void CInput::ControllerMove( float frametime, CUserCmd *cmd )
+{
+ if ( IsPC() )
+ {
+ if ( !m_fCameraInterceptingMouse && m_fMouseActive )
+ {
+ MouseMove( cmd);
+ }
+ }
+
+ JoyStickMove( frametime, cmd);
+
+ // NVNT if we have a haptic device..
+ if(haptics && haptics->HasDevice())
+ {
+ if(engine->IsPaused() || engine->IsLevelMainMenuBackground() || vgui::surface()->IsCursorVisible() || !engine->IsInGame())
+ {
+ // NVNT send a menu process to the haptics system.
+ haptics->MenuProcess();
+ return;
+ }
+#ifdef CSTRIKE_DLL
+ // NVNT cstrike fov grabing.
+ C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();
+ if(player){
+ haptics->UpdatePlayerFOV(player->GetFOV());
+ }
+#endif
+ // NVNT calculate move with the navigation on the haptics system.
+ haptics->CalculateMove(cmd->forwardmove, cmd->sidemove, frametime);
+ // NVNT send a game process to the haptics system.
+ haptics->GameProcess();
+#if defined( WIN32 ) && !defined( _X360 )
+ // NVNT update our avatar effect.
+ UpdateAvatarEffect();
+#endif
+ }
+
+
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *weapon -
+//-----------------------------------------------------------------------------
+void CInput::MakeWeaponSelection( C_BaseCombatWeapon *weapon )
+{
+ m_hSelectedWeapon = weapon;
+}
+
+/*
+================
+CreateMove
+
+Send the intended movement message to the server
+if active == 1 then we are 1) not playing back demos ( where our commands are ignored ) and
+2 ) we have finished signing on to server
+================
+*/
+
+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 );
+ }
+ }
+
+}
+
+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();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : buf -
+// buffersize -
+// slot -
+//-----------------------------------------------------------------------------
+void CInput::EncodeUserCmdToBuffer( bf_write& buf, int sequence_number )
+{
+ CUserCmd nullcmd;
+ CUserCmd *cmd = GetUserCmd( sequence_number);
+
+ WriteUsercmd( &buf, cmd, &nullcmd );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : buf -
+// buffersize -
+// slot -
+//-----------------------------------------------------------------------------
+void CInput::DecodeUserCmdFromBuffer( bf_read& buf, int sequence_number )
+{
+ CUserCmd nullcmd;
+ CUserCmd *cmd = &m_pCommands[ sequence_number % MULTIPLAYER_BACKUP];
+
+ ReadUsercmd( &buf, cmd, &nullcmd );
+}
+
+void CInput::ValidateUserCmd( CUserCmd *usercmd, int sequence_number )
+{
+ // Validate that the usercmd hasn't been changed
+ CRC32_t crc = usercmd->GetChecksum();
+ if ( crc != m_pVerifiedCommands[ sequence_number % MULTIPLAYER_BACKUP ].m_crc )
+ {
+ *usercmd = m_pVerifiedCommands[ sequence_number % MULTIPLAYER_BACKUP ].m_cmd;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *buf -
+// from -
+// to -
+//-----------------------------------------------------------------------------
+bool CInput::WriteUsercmdDeltaToBuffer( bf_write *buf, int from, int to, bool isnewcommand )
+{
+ Assert( m_pCommands );
+
+ CUserCmd nullcmd;
+
+ CUserCmd *f, *t;
+
+ int startbit = buf->GetNumBitsWritten();
+
+ if ( from == -1 )
+ {
+ f = &nullcmd;
+ }
+ else
+ {
+ f = GetUserCmd( from );
+
+ if ( !f )
+ {
+ // DevMsg( "WARNING! User command delta too old (from %i, to %i)\n", from, to );
+ f = &nullcmd;
+ }
+ else
+ {
+ ValidateUserCmd( f, from );
+ }
+ }
+
+ t = GetUserCmd( to );
+
+ if ( !t )
+ {
+ // DevMsg( "WARNING! User command too old (from %i, to %i)\n", from, to );
+ t = &nullcmd;
+ }
+ else
+ {
+ ValidateUserCmd( t, to );
+ }
+
+ // Write it into the buffer
+ WriteUsercmd( buf, t, f );
+
+ if ( buf->IsOverflowed() )
+ {
+ int endbit = buf->GetNumBitsWritten();
+
+ Msg( "WARNING! User command buffer overflow(%i %i), last cmd was %i bits long\n",
+ from, to, endbit - startbit );
+
+ return false;
+ }
+
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : slot -
+// Output : CUserCmd
+//-----------------------------------------------------------------------------
+CUserCmd *CInput::GetUserCmd( int sequence_number )
+{
+ Assert( m_pCommands );
+
+ CUserCmd *usercmd = &m_pCommands[ sequence_number % MULTIPLAYER_BACKUP ];
+
+ if ( usercmd->command_number != sequence_number )
+ {
+ return NULL; // usercmd was overwritten by newer command
+ }
+
+ return usercmd;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : bits -
+// in_button -
+// in_ignore -
+// *button -
+// reset -
+// Output : static void
+//-----------------------------------------------------------------------------
+static void CalcButtonBits( int& bits, int in_button, int in_ignore, kbutton_t *button, bool reset )
+{
+ // Down or still down?
+ if ( button->state & 3 )
+ {
+ bits |= in_button;
+ }
+
+ int clearmask = ~2;
+ if ( in_ignore & in_button )
+ {
+ // This gets taken care of below in the GetButtonBits code
+ //bits &= ~in_button;
+ // Remove "still down" as well as "just down"
+ clearmask = ~3;
+ }
+
+ if ( reset )
+ {
+ button->state &= clearmask;
+ }
+}
+
+/*
+============
+GetButtonBits
+
+Returns appropriate button info for keyboard and mouse state
+Set bResetState to 1 to clear old state info
+============
+*/
+int CInput::GetButtonBits( int bResetState )
+{
+ int bits = 0;
+
+ CalcButtonBits( bits, IN_SPEED, s_ClearInputState, &in_speed, bResetState );
+ CalcButtonBits( bits, IN_WALK, s_ClearInputState, &in_walk, bResetState );
+ CalcButtonBits( bits, IN_ATTACK, s_ClearInputState, &in_attack, bResetState );
+ CalcButtonBits( bits, IN_DUCK, s_ClearInputState, &in_duck, bResetState );
+ CalcButtonBits( bits, IN_JUMP, s_ClearInputState, &in_jump, bResetState );
+ CalcButtonBits( bits, IN_FORWARD, s_ClearInputState, &in_forward, bResetState );
+ CalcButtonBits( bits, IN_BACK, s_ClearInputState, &in_back, bResetState );
+ CalcButtonBits( bits, IN_USE, s_ClearInputState, &in_use, bResetState );
+ CalcButtonBits( bits, IN_LEFT, s_ClearInputState, &in_left, bResetState );
+ CalcButtonBits( bits, IN_RIGHT, s_ClearInputState, &in_right, bResetState );
+ CalcButtonBits( bits, IN_MOVELEFT, s_ClearInputState, &in_moveleft, bResetState );
+ CalcButtonBits( bits, IN_MOVERIGHT, s_ClearInputState, &in_moveright, bResetState );
+ CalcButtonBits( bits, IN_ATTACK2, s_ClearInputState, &in_attack2, bResetState );
+ CalcButtonBits( bits, IN_RELOAD, s_ClearInputState, &in_reload, bResetState );
+ CalcButtonBits( bits, IN_ALT1, s_ClearInputState, &in_alt1, bResetState );
+ CalcButtonBits( bits, IN_ALT2, s_ClearInputState, &in_alt2, bResetState );
+ CalcButtonBits( bits, IN_SCORE, s_ClearInputState, &in_score, bResetState );
+ CalcButtonBits( bits, IN_ZOOM, s_ClearInputState, &in_zoom, bResetState );
+ CalcButtonBits( bits, IN_GRENADE1, s_ClearInputState, &in_grenade1, bResetState );
+ CalcButtonBits( bits, IN_GRENADE2, s_ClearInputState, &in_grenade2, bResetState );
+ CalcButtonBits( bits, IN_ATTACK3, s_ClearInputState, &in_attack3, bResetState );
+
+ if ( KeyState(&in_ducktoggle) )
+ {
+ bits |= IN_DUCK;
+ }
+
+ // Cancel is a special flag
+ if (in_cancel)
+ {
+ bits |= IN_CANCEL;
+ }
+
+ if ( gHUD.m_iKeyBits & IN_WEAPON1 )
+ {
+ bits |= IN_WEAPON1;
+ }
+
+ if ( gHUD.m_iKeyBits & IN_WEAPON2 )
+ {
+ bits |= IN_WEAPON2;
+ }
+
+ // Clear out any residual
+ bits &= ~s_ClearInputState;
+
+ if ( bResetState )
+ {
+ s_ClearInputState = 0;
+ }
+
+ return bits;
+}
+
+
+//-----------------------------------------------------------------------------
+// Causes an input to have to be re-pressed to become active
+//-----------------------------------------------------------------------------
+void CInput::ClearInputButton( int bits )
+{
+ s_ClearInputState |= bits;
+}
+
+
+/*
+==============================
+GetLookSpring
+
+==============================
+*/
+float CInput::GetLookSpring( void )
+{
+ return lookspring.GetInt();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : float
+//-----------------------------------------------------------------------------
+float CInput::GetLastForwardMove( void )
+{
+ return m_flLastForwardMove;
+}
+
+
+#if defined( HL2_CLIENT_DLL )
+//-----------------------------------------------------------------------------
+// Purpose: back channel contact info for ground contact
+// Output :
+//-----------------------------------------------------------------------------
+
+void CInput::AddIKGroundContactInfo( int entindex, float minheight, float maxheight )
+{
+ CEntityGroundContact data;
+ data.entindex = entindex;
+ data.minheight = minheight;
+ data.maxheight = maxheight;
+
+ if (m_EntityGroundContact.Count() >= MAX_EDICTS)
+ {
+ // some overflow here, probably bogus anyway
+ Assert(0);
+ m_EntityGroundContact.RemoveAll();
+ return;
+ }
+
+ m_EntityGroundContact.AddToTail( data );
+}
+#endif
+
+
+static ConCommand startcommandermousemove("+commandermousemove", IN_CommanderMouseMoveDown);
+static ConCommand endcommandermousemove("-commandermousemove", IN_CommanderMouseMoveUp);
+static ConCommand startmoveup("+moveup",IN_UpDown);
+static ConCommand endmoveup("-moveup",IN_UpUp);
+static ConCommand startmovedown("+movedown",IN_DownDown);
+static ConCommand endmovedown("-movedown",IN_DownUp);
+static ConCommand startleft("+left",IN_LeftDown);
+static ConCommand endleft("-left",IN_LeftUp);
+static ConCommand startright("+right",IN_RightDown);
+static ConCommand endright("-right",IN_RightUp);
+static ConCommand startforward("+forward",IN_ForwardDown);
+static ConCommand endforward("-forward",IN_ForwardUp);
+static ConCommand startback("+back",IN_BackDown);
+static ConCommand endback("-back",IN_BackUp);
+static ConCommand startlookup("+lookup", IN_LookupDown);
+static ConCommand endlookup("-lookup", IN_LookupUp);
+static ConCommand startlookdown("+lookdown", IN_LookdownDown);
+static ConCommand lookdown("-lookdown", IN_LookdownUp);
+static ConCommand startstrafe("+strafe", IN_StrafeDown);
+static ConCommand endstrafe("-strafe", IN_StrafeUp);
+static ConCommand startmoveleft("+moveleft", IN_MoveleftDown);
+static ConCommand endmoveleft("-moveleft", IN_MoveleftUp);
+static ConCommand startmoveright("+moveright", IN_MoverightDown);
+static ConCommand endmoveright("-moveright", IN_MoverightUp);
+static ConCommand startspeed("+speed", IN_SpeedDown);
+static ConCommand endspeed("-speed", IN_SpeedUp);
+static ConCommand startwalk("+walk", IN_WalkDown);
+static ConCommand endwalk("-walk", IN_WalkUp);
+static ConCommand startattack("+attack", IN_AttackDown);
+static ConCommand endattack("-attack", IN_AttackUp);
+static ConCommand startattack2("+attack2", IN_Attack2Down);
+static ConCommand endattack2("-attack2", IN_Attack2Up);
+static ConCommand startuse("+use", IN_UseDown);
+static ConCommand enduse("-use", IN_UseUp);
+static ConCommand startjump("+jump", IN_JumpDown);
+static ConCommand endjump("-jump", IN_JumpUp);
+static ConCommand impulse("impulse", IN_Impulse);
+static ConCommand startklook("+klook", IN_KLookDown);
+static ConCommand endklook("-klook", IN_KLookUp);
+static ConCommand startjlook("+jlook", IN_JLookDown);
+static ConCommand endjlook("-jlook", IN_JLookUp);
+static ConCommand startduck("+duck", IN_DuckDown);
+static ConCommand endduck("-duck", IN_DuckUp);
+static ConCommand startreload("+reload", IN_ReloadDown);
+static ConCommand endreload("-reload", IN_ReloadUp);
+static ConCommand startalt1("+alt1", IN_Alt1Down);
+static ConCommand endalt1("-alt1", IN_Alt1Up);
+static ConCommand startalt2("+alt2", IN_Alt2Down);
+static ConCommand endalt2("-alt2", IN_Alt2Up);
+static ConCommand startscore("+score", IN_ScoreDown);
+static ConCommand endscore("-score", IN_ScoreUp);
+static ConCommand startshowscores("+showscores", IN_ScoreDown);
+static ConCommand endshowscores("-showscores", IN_ScoreUp);
+static ConCommand startgraph("+graph", IN_GraphDown);
+static ConCommand endgraph("-graph", IN_GraphUp);
+static ConCommand startbreak("+break",IN_BreakDown);
+static ConCommand endbreak("-break",IN_BreakUp);
+static ConCommand force_centerview("force_centerview", IN_CenterView_f);
+static ConCommand joyadvancedupdate("joyadvancedupdate", IN_Joystick_Advanced_f, "", FCVAR_CLIENTCMD_CAN_EXECUTE);
+static ConCommand startzoom("+zoom", IN_ZoomDown);
+static ConCommand endzoom("-zoom", IN_ZoomUp);
+static ConCommand endgrenade1( "-grenade1", IN_Grenade1Up );
+static ConCommand startgrenade1( "+grenade1", IN_Grenade1Down );
+static ConCommand endgrenade2( "-grenade2", IN_Grenade2Up );
+static ConCommand startgrenade2( "+grenade2", IN_Grenade2Down );
+static ConCommand startattack3("+attack3", IN_Attack3Down);
+static ConCommand endattack3("-attack3", IN_Attack3Up);
+
+#ifdef TF_CLIENT_DLL
+static ConCommand toggle_duck( "toggle_duck", IN_DuckToggle );
+#endif
+
+// Xbox 360 stub commands
+static ConCommand xboxmove("xmove", IN_XboxStub);
+static ConCommand xboxlook("xlook", IN_XboxStub);
+
+/*
+============
+Init_All
+============
+*/
+void CInput::Init_All (void)
+{
+ Assert( !m_pCommands );
+ m_pCommands = new CUserCmd[ MULTIPLAYER_BACKUP ];
+ m_pVerifiedCommands = new CVerifiedUserCmd[ MULTIPLAYER_BACKUP ];
+
+ m_fMouseInitialized = false;
+ m_fRestoreSPI = false;
+ m_fMouseActive = false;
+ Q_memset( m_rgOrigMouseParms, 0, sizeof( m_rgOrigMouseParms ) );
+ Q_memset( m_rgNewMouseParms, 0, sizeof( m_rgNewMouseParms ) );
+ Q_memset( m_rgCheckMouseParam, 0, sizeof( m_rgCheckMouseParam ) );
+
+ m_rgNewMouseParms[ MOUSE_ACCEL_THRESHHOLD1 ] = 0; // no 2x
+ m_rgNewMouseParms[ MOUSE_ACCEL_THRESHHOLD2 ] = 0; // no 4x
+ m_rgNewMouseParms[ MOUSE_SPEED_FACTOR ] = 1; // 0 = disabled, 1 = threshold 1 enabled, 2 = threshold 2 enabled
+
+ m_fMouseParmsValid = false;
+ m_fJoystickAdvancedInit = false;
+ m_fHadJoysticks = false;
+ m_flLastForwardMove = 0.0;
+
+ // Initialize inputs
+ if ( IsPC() )
+ {
+ Init_Mouse ();
+ Init_Keyboard();
+ }
+
+ // Initialize third person camera controls.
+ Init_Camera();
+}
+
+/*
+============
+Shutdown_All
+============
+*/
+void CInput::Shutdown_All(void)
+{
+ DeactivateMouse();
+ Shutdown_Keyboard();
+
+ delete[] m_pCommands;
+ m_pCommands = NULL;
+
+ delete[] m_pVerifiedCommands;
+ m_pVerifiedCommands = NULL;
+}
+
+void CInput::LevelInit( void )
+{
+#if defined( HL2_CLIENT_DLL )
+ // Remove any IK information
+ m_EntityGroundContact.RemoveAll();
+#endif
+}
+