2016-02-24 21:26:16 +00:00
# include "hud.h"
# include "usercmd.h"
# include "cvardef.h"
# include "kbutton.h"
# include "keydefs.h"
2019-07-28 18:26:23 +05:00
# include "cl_util.h"
2017-12-03 23:52:35 +03:00
# include "input_mouse.h"
2019-07-28 18:26:23 +05:00
2017-12-03 23:52:35 +03:00
extern cvar_t * sensitivity ;
extern cvar_t * in_joystick ;
2016-02-24 21:26:16 +00:00
extern kbutton_t in_strafe ;
extern kbutton_t in_mlook ;
extern kbutton_t in_speed ;
extern kbutton_t in_jlook ;
extern kbutton_t in_forward ;
extern kbutton_t in_back ;
extern kbutton_t in_moveleft ;
extern kbutton_t in_moveright ;
2019-07-28 18:26:23 +05:00
extern float mouse_pos_extern [ 2 ] ;
extern int iVisibleMouse ;
2016-02-24 21:26:16 +00:00
extern cvar_t * m_pitch ;
extern cvar_t * m_yaw ;
extern cvar_t * m_forward ;
extern cvar_t * m_side ;
extern cvar_t * lookstrafe ;
extern cvar_t * lookspring ;
extern cvar_t * cl_pitchdown ;
extern cvar_t * cl_pitchup ;
extern cvar_t * cl_yawspeed ;
extern cvar_t * cl_sidespeed ;
extern cvar_t * cl_forwardspeed ;
extern cvar_t * cl_pitchspeed ;
extern cvar_t * cl_movespeedkey ;
cvar_t * cl_laddermode ;
2016-03-01 20:18:42 +00:00
# define F 1U<<0 // Forward
# define B 1U<<1 // Back
# define L 1U<<2 // Left
# define R 1U<<3 // Right
# define T 1U<<4 // Forward stop
# define S 1U<<5 // Side stop
2016-02-24 21:26:16 +00:00
# define BUTTON_DOWN 1
# define IMPULSE_DOWN 2
# define IMPULSE_UP 4
2017-01-10 16:45:52 +07:00
int CL_IsDead ( void ) ;
2017-12-03 23:52:35 +03:00
extern Vector dead_viewangles ;
2016-02-24 21:26:16 +00:00
void IN_ToggleButtons ( float forwardmove , float sidemove )
{
2016-03-01 20:18:42 +00:00
static unsigned int moveflags = T | S ;
2016-02-24 21:26:16 +00:00
if ( forwardmove )
moveflags & = ~ T ;
else
{
//if( in_forward.state || in_back.state ) gEngfuncs.Con_Printf("Buttons pressed f%d b%d\n", in_forward.state, in_back.state);
if ( ! ( moveflags & T ) )
{
//IN_ForwardUp();
//IN_BackUp();
//gEngfuncs.Con_Printf("Reset forwardmove state f%d b%d\n", in_forward.state, in_back.state);
in_forward . state & = ~ BUTTON_DOWN ;
in_back . state & = ~ BUTTON_DOWN ;
moveflags | = T ;
}
}
if ( sidemove )
moveflags & = ~ S ;
else
{
//gEngfuncs.Con_Printf("l%d r%d\n", in_moveleft.state, in_moveright.state);
//if( in_moveleft.state || in_moveright.state ) gEngfuncs.Con_Printf("Buttons pressed l%d r%d\n", in_moveleft.state, in_moveright.state);
if ( ! ( moveflags & S ) )
{
//IN_MoverightUp();
//IN_MoveleftUp();
//gEngfuncs.Con_Printf("Reset sidemove state f%d b%d\n", in_moveleft.state, in_moveright.state);
in_moveleft . state & = ~ BUTTON_DOWN ;
in_moveright . state & = ~ BUTTON_DOWN ;
moveflags | = S ;
}
}
2019-10-13 16:49:25 +05:00
if ( forwardmove > 0.7f & & ! ( moveflags & F ) )
2016-02-24 21:26:16 +00:00
{
moveflags | = F ;
in_forward . state | = BUTTON_DOWN ;
}
2019-10-13 16:49:25 +05:00
if ( forwardmove < 0.7f & & ( moveflags & F ) )
2016-02-24 21:26:16 +00:00
{
moveflags & = ~ F ;
in_forward . state & = ~ BUTTON_DOWN ;
}
2019-10-13 16:49:25 +05:00
if ( forwardmove < - 0.7f & & ! ( moveflags & B ) )
2016-02-24 21:26:16 +00:00
{
moveflags | = B ;
in_back . state | = BUTTON_DOWN ;
}
2019-10-13 16:49:25 +05:00
if ( forwardmove > - 0.7f & & ( moveflags & B ) )
2016-02-24 21:26:16 +00:00
{
moveflags & = ~ B ;
in_back . state & = ~ BUTTON_DOWN ;
}
2019-10-13 16:49:25 +05:00
if ( sidemove > 0.9f & & ! ( moveflags & R ) )
2016-02-24 21:26:16 +00:00
{
moveflags | = R ;
in_moveright . state | = BUTTON_DOWN ;
}
2019-10-13 16:49:25 +05:00
if ( sidemove < 0.9f & & ( moveflags & R ) )
2016-02-24 21:26:16 +00:00
{
moveflags & = ~ R ;
in_moveright . state & = ~ BUTTON_DOWN ;
}
2019-10-13 16:49:25 +05:00
if ( sidemove < - 0.9f & & ! ( moveflags & L ) )
2016-02-24 21:26:16 +00:00
{
moveflags | = L ;
in_moveleft . state | = BUTTON_DOWN ;
}
2019-10-13 16:49:25 +05:00
if ( sidemove > - 0.9f & & ( moveflags & L ) )
2016-02-24 21:26:16 +00:00
{
moveflags & = ~ L ;
in_moveleft . state & = ~ BUTTON_DOWN ;
}
}
2017-12-03 23:52:35 +03:00
void FWGSInput : : IN_ClientMoveEvent ( float forwardmove , float sidemove )
2016-02-24 21:26:16 +00:00
{
//gEngfuncs.Con_Printf("IN_MoveEvent\n");
ac_forwardmove + = forwardmove ;
ac_sidemove + = sidemove ;
ac_movecount + + ;
}
2017-12-03 23:52:35 +03:00
void FWGSInput : : IN_ClientLookEvent ( float relyaw , float relpitch )
2016-02-24 21:26:16 +00:00
{
rel_yaw + = relyaw ;
rel_pitch + = relpitch ;
}
2016-07-03 18:39:55 +05:00
2016-02-24 21:26:16 +00:00
// Rotate camera and add move values to usercmd
2017-12-03 23:52:35 +03:00
void FWGSInput : : IN_Move ( float frametime , usercmd_t * cmd )
2016-02-24 21:26:16 +00:00
{
Vector viewangles ;
bool fLadder = false ;
2016-07-31 19:33:34 +05:00
2016-07-28 22:46:39 +06:00
if ( gHUD . m_iIntermission )
return ; // we can't move during intermission
2016-07-31 19:33:34 +05:00
2016-07-03 18:39:55 +05:00
if ( cl_laddermode - > value ! = 2 )
2016-07-28 22:46:39 +06:00
{
cl_entity_t * pplayer = gEngfuncs . GetLocalPlayer ( ) ;
if ( pplayer )
fLadder = pplayer - > curstate . movetype = = MOVETYPE_FLY ;
}
2016-02-24 21:26:16 +00:00
//if(ac_forwardmove || ac_sidemove)
//gEngfuncs.Con_Printf("Move: %f %f %f %f\n", ac_forwardmove, ac_sidemove, rel_pitch, rel_yaw);
#if 0
if ( in_mlook . state & 1 )
{
V_StopPitchDrift ( ) ;
}
# endif
2016-07-28 22:46:39 +06:00
if ( CL_IsDead ( ) )
2016-02-24 21:26:16 +00:00
{
2016-07-28 22:46:39 +06:00
viewangles = dead_viewangles ; // HACKHACK: see below
}
else
{
gEngfuncs . GetViewAngles ( viewangles ) ;
}
2019-07-28 18:26:23 +05:00
if ( ! iVisibleMouse )
2016-07-28 22:46:39 +06:00
{
2019-07-28 18:26:23 +05:00
if ( gHUD . GetSensitivity ( ) ! = 0 )
{
rel_yaw * = gHUD . GetSensitivity ( ) ;
rel_pitch * = gHUD . GetSensitivity ( ) ;
}
else
{
rel_yaw * = sensitivity - > value ;
rel_pitch * = sensitivity - > value ;
}
viewangles [ YAW ] + = rel_yaw ;
if ( fLadder )
{
if ( cl_laddermode - > value = = 1 )
viewangles [ YAW ] - = ac_sidemove * 5 ;
ac_sidemove = 0 ;
}
2016-07-28 22:46:39 +06:00
}
else
{
2019-07-28 18:26:23 +05:00
// Get mouse pos and normalize it to be sent to view.cpp
// POINT mouse_pos;
int mx , my ;
gEngfuncs . GetMousePosition ( & mx , & my ) ;
// GetCursorPos(&mouse_pos);
mouse_pos_extern [ 0 ] = mx ; // mouse_pos.x;
mouse_pos_extern [ 1 ] = my ; // mouse_pos.y;
mouse_pos_extern [ 0 ] / = ScreenWidth / 2 ;
mouse_pos_extern [ 1 ] / = ScreenHeight / 2 ;
mouse_pos_extern [ 0 ] - = 1 ;
mouse_pos_extern [ 1 ] - = 1 ;
viewangles [ YAW ] = - atan2 ( double ( mouse_pos_extern [ 1 ] * ( M_PI / 180 ) ) , double ( mouse_pos_extern [ 0 ] * ( M_PI / 180 ) ) ) * ( 180 / M_PI ) - 90 ; // I don't know why I have to negate the value and subtract 90, it just works that way.
mouse_pos_extern [ 0 ] * = 27 ;
mouse_pos_extern [ 1 ] * = 27 ;
2016-07-28 22:46:39 +06:00
}
2019-07-28 18:26:23 +05:00
2016-07-31 19:33:34 +05:00
if ( gHUD . m_MOTD . m_bShow )
2016-07-28 22:46:39 +06:00
gHUD . m_MOTD . scroll + = rel_pitch ;
2019-07-28 18:26:23 +05:00
/*else
2016-02-24 21:26:16 +00:00
viewangles [ PITCH ] + = rel_pitch ;
2016-07-31 19:33:34 +05:00
if ( viewangles [ PITCH ] > cl_pitchdown - > value )
2016-07-28 22:46:39 +06:00
viewangles [ PITCH ] = cl_pitchdown - > value ;
2016-07-31 19:33:34 +05:00
if ( viewangles [ PITCH ] < - cl_pitchup - > value )
2016-07-28 22:46:39 +06:00
viewangles [ PITCH ] = - cl_pitchup - > value ;
2019-07-28 18:26:23 +05:00
*/
2016-07-28 22:46:39 +06:00
// HACKHACK: change viewangles directly in viewcode,
// so viewangles when player is dead will not be changed on server
if ( ! CL_IsDead ( ) )
{
gEngfuncs . SetViewAngles ( viewangles ) ;
2016-02-24 21:26:16 +00:00
}
2016-07-03 18:39:55 +05:00
2016-07-28 22:46:39 +06:00
dead_viewangles = viewangles ; // keep them actual
2016-02-24 21:26:16 +00:00
if ( ac_movecount )
{
IN_ToggleButtons ( ac_forwardmove / ac_movecount , ac_sidemove / ac_movecount ) ;
2016-08-04 22:48:49 +05:00
2016-07-03 18:39:55 +05:00
if ( ac_forwardmove )
2016-08-04 22:48:49 +05:00
cmd - > forwardmove = ac_forwardmove * cl_forwardspeed - > value / ac_movecount ;
2016-07-03 18:39:55 +05:00
if ( ac_sidemove )
cmd - > sidemove = ac_sidemove * cl_sidespeed - > value / ac_movecount ;
2016-08-04 22:48:49 +05:00
if ( ( in_speed . state & 1 ) & & ( ac_sidemove | | ac_forwardmove ) )
2016-04-17 14:31:24 +00:00
{
cmd - > forwardmove * = cl_movespeedkey - > value ;
cmd - > sidemove * = cl_movespeedkey - > value ;
}
2016-02-24 21:26:16 +00:00
}
2016-07-31 19:33:34 +05:00
2016-02-24 21:26:16 +00:00
ac_sidemove = ac_forwardmove = rel_pitch = rel_yaw = 0 ;
ac_movecount = 0 ;
}
2017-12-03 23:52:35 +03:00
void FWGSInput : : IN_MouseEvent ( int mstate )
2016-02-24 21:26:16 +00:00
{
static int mouse_oldbuttonstate ;
// perform button actions
for ( int i = 0 ; i < 5 ; i + + )
{
2016-07-03 18:39:55 +05:00
if ( ( mstate & ( 1 < < i ) ) & & ! ( mouse_oldbuttonstate & ( 1 < < i ) ) )
2016-02-24 21:26:16 +00:00
{
gEngfuncs . Key_Event ( K_MOUSE1 + i , 1 ) ;
}
2016-07-03 18:39:55 +05:00
if ( ! ( mstate & ( 1 < < i ) ) & & ( mouse_oldbuttonstate & ( 1 < < i ) ) )
2016-02-24 21:26:16 +00:00
{
gEngfuncs . Key_Event ( K_MOUSE1 + i , 0 ) ;
}
}
2016-07-03 18:39:55 +05:00
2016-02-24 21:26:16 +00:00
mouse_oldbuttonstate = mstate ;
}
// Stubs
2017-12-03 23:52:35 +03:00
void FWGSInput : : IN_ClearStates ( void )
2016-02-24 21:26:16 +00:00
{
2016-07-03 18:39:55 +05:00
//gEngfuncs.Con_Printf( "IN_ClearStates\n" );
2016-02-24 21:26:16 +00:00
}
2017-12-03 23:52:35 +03:00
void FWGSInput : : IN_ActivateMouse ( void )
2016-02-24 21:26:16 +00:00
{
2016-07-03 18:39:55 +05:00
//gEngfuncs.Con_Printf( "IN_ActivateMouse\n" );
2016-02-24 21:26:16 +00:00
}
2017-12-03 23:52:35 +03:00
void FWGSInput : : IN_DeactivateMouse ( void )
2016-02-24 21:26:16 +00:00
{
2016-07-03 18:39:55 +05:00
//gEngfuncs.Con_Printf( "IN_DeactivateMouse\n" );
2016-02-24 21:26:16 +00:00
}
2017-12-03 23:52:35 +03:00
void FWGSInput : : IN_Accumulate ( void )
2016-02-24 21:26:16 +00:00
{
2016-07-03 18:39:55 +05:00
//gEngfuncs.Con_Printf( "IN_Accumulate\n" );
2016-02-24 21:26:16 +00:00
}
2017-12-03 23:52:35 +03:00
void FWGSInput : : IN_Commands ( void )
2016-02-24 21:26:16 +00:00
{
2016-07-03 18:39:55 +05:00
//gEngfuncs.Con_Printf( "IN_Commands\n" );
2016-02-24 21:26:16 +00:00
}
2017-12-03 23:52:35 +03:00
void FWGSInput : : IN_Shutdown ( void )
2016-02-24 21:26:16 +00:00
{
}
2016-07-03 18:39:55 +05:00
2016-02-24 21:26:16 +00:00
// Register cvars and reset data
2017-12-03 23:52:35 +03:00
void FWGSInput : : IN_Init ( void )
2016-02-24 21:26:16 +00:00
{
2016-07-03 18:39:55 +05:00
sensitivity = gEngfuncs . pfnRegisterVariable ( " sensitivity " , " 3 " , FCVAR_ARCHIVE ) ;
in_joystick = gEngfuncs . pfnRegisterVariable ( " joystick " , " 0 " , FCVAR_ARCHIVE ) ;
cl_laddermode = gEngfuncs . pfnRegisterVariable ( " cl_laddermode " , " 2 " , FCVAR_ARCHIVE ) ;
2016-02-24 21:26:16 +00:00
ac_forwardmove = ac_sidemove = rel_yaw = rel_pitch = 0 ;
}