You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
318 lines
7.5 KiB
318 lines
7.5 KiB
#include "hud.h" |
|
#include "usercmd.h" |
|
#include "cvardef.h" |
|
#include "kbutton.h" |
|
#include "keydefs.h" |
|
#include "cl_util.h" |
|
#include "input_mouse.h" |
|
#include "view.h" |
|
|
|
extern cvar_t *sensitivity; |
|
extern cvar_t *in_joystick; |
|
|
|
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; |
|
|
|
extern float mouse_pos_extern[2]; |
|
extern int iVisibleMouse; |
|
|
|
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; |
|
|
|
|
|
#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 |
|
|
|
#define BUTTON_DOWN 1 |
|
#define IMPULSE_DOWN 2 |
|
#define IMPULSE_UP 4 |
|
|
|
int CL_IsDead( void ); |
|
extern Vector dead_viewangles; |
|
|
|
void IN_ToggleButtons( float forwardmove, float sidemove ) |
|
{ |
|
static unsigned int moveflags = T | S; |
|
|
|
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; |
|
} |
|
} |
|
|
|
if( forwardmove > 0.7f && !( moveflags & F ) ) |
|
{ |
|
moveflags |= F; |
|
in_forward.state |= BUTTON_DOWN; |
|
} |
|
if( forwardmove < 0.7f && ( moveflags & F ) ) |
|
{ |
|
moveflags &= ~F; |
|
in_forward.state &= ~BUTTON_DOWN; |
|
} |
|
if( forwardmove < -0.7f && !( moveflags & B ) ) |
|
{ |
|
moveflags |= B; |
|
in_back.state |= BUTTON_DOWN; |
|
} |
|
if( forwardmove > -0.7f && ( moveflags & B ) ) |
|
{ |
|
moveflags &= ~B; |
|
in_back.state &= ~BUTTON_DOWN; |
|
} |
|
if( sidemove > 0.9f && !( moveflags & R ) ) |
|
{ |
|
moveflags |= R; |
|
in_moveright.state |= BUTTON_DOWN; |
|
} |
|
if( sidemove < 0.9f && ( moveflags & R ) ) |
|
{ |
|
moveflags &= ~R; |
|
in_moveright.state &= ~BUTTON_DOWN; |
|
} |
|
if( sidemove < -0.9f && !( moveflags & L ) ) |
|
{ |
|
moveflags |= L; |
|
in_moveleft.state |= BUTTON_DOWN; |
|
} |
|
if( sidemove > -0.9f && ( moveflags & L ) ) |
|
{ |
|
moveflags &= ~L; |
|
in_moveleft.state &= ~BUTTON_DOWN; |
|
} |
|
} |
|
|
|
void FWGSInput::IN_ClientMoveEvent( float forwardmove, float sidemove ) |
|
{ |
|
//gEngfuncs.Con_Printf("IN_MoveEvent\n"); |
|
|
|
ac_forwardmove += forwardmove; |
|
ac_sidemove += sidemove; |
|
ac_movecount++; |
|
} |
|
|
|
void FWGSInput::IN_ClientLookEvent( float relyaw, float relpitch ) |
|
{ |
|
rel_yaw += relyaw; |
|
rel_pitch += relpitch; |
|
} |
|
|
|
// Rotate camera and add move values to usercmd |
|
void FWGSInput::IN_Move( float frametime, usercmd_t *cmd ) |
|
{ |
|
Vector viewangles; |
|
bool fLadder = false; |
|
|
|
if( gHUD.m_iIntermission ) |
|
return; // we can't move during intermission |
|
|
|
if( cl_laddermode->value != 2 ) |
|
{ |
|
cl_entity_t *pplayer = gEngfuncs.GetLocalPlayer(); |
|
if( pplayer ) |
|
fLadder = pplayer->curstate.movetype == MOVETYPE_FLY; |
|
} |
|
//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 |
|
if( CL_IsDead() ) |
|
{ |
|
viewangles = dead_viewangles; // HACKHACK: see below |
|
} |
|
else |
|
{ |
|
gEngfuncs.GetViewAngles( viewangles ); |
|
} |
|
|
|
if( !iVisibleMouse ) |
|
{ |
|
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; |
|
} |
|
} |
|
else |
|
{ |
|
// 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; |
|
} |
|
|
|
if( gHUD.m_MOTD.m_bShow ) |
|
gHUD.m_MOTD.scroll += rel_pitch; |
|
/*else |
|
viewangles[PITCH] += rel_pitch; |
|
|
|
if( viewangles[PITCH] > cl_pitchdown->value ) |
|
viewangles[PITCH] = cl_pitchdown->value; |
|
if( viewangles[PITCH] < -cl_pitchup->value ) |
|
viewangles[PITCH] = -cl_pitchup->value; |
|
*/ |
|
// HACKHACK: change viewangles directly in viewcode, |
|
// so viewangles when player is dead will not be changed on server |
|
if( !CL_IsDead() ) |
|
{ |
|
gEngfuncs.SetViewAngles( viewangles ); |
|
} |
|
|
|
dead_viewangles = viewangles; // keep them actual |
|
if( ac_movecount ) |
|
{ |
|
IN_ToggleButtons( ac_forwardmove / ac_movecount, ac_sidemove / ac_movecount ); |
|
|
|
if( ac_forwardmove ) |
|
cmd->forwardmove = ac_forwardmove * cl_forwardspeed->value / ac_movecount; |
|
if( ac_sidemove ) |
|
cmd->sidemove = ac_sidemove * cl_sidespeed->value / ac_movecount; |
|
if( ( in_speed.state & 1 ) && ( ac_sidemove || ac_forwardmove ) ) |
|
{ |
|
cmd->forwardmove *= cl_movespeedkey->value; |
|
cmd->sidemove *= cl_movespeedkey->value; |
|
} |
|
} |
|
|
|
ac_sidemove = ac_forwardmove = rel_pitch = rel_yaw = 0; |
|
ac_movecount = 0; |
|
} |
|
|
|
void FWGSInput::IN_MouseEvent( int mstate ) |
|
{ |
|
static int mouse_oldbuttonstate; |
|
// perform button actions |
|
for( int i = 0; i < 5; i++ ) |
|
{ |
|
if( ( mstate & ( 1 << i ) ) && !( mouse_oldbuttonstate & ( 1 << i ) ) ) |
|
{ |
|
gEngfuncs.Key_Event( K_MOUSE1 + i, 1 ); |
|
} |
|
|
|
if( !( mstate & ( 1 << i ) ) && ( mouse_oldbuttonstate & ( 1 << i ) ) ) |
|
{ |
|
gEngfuncs.Key_Event( K_MOUSE1 + i, 0 ); |
|
} |
|
} |
|
|
|
mouse_oldbuttonstate = mstate; |
|
} |
|
|
|
// Stubs |
|
|
|
void FWGSInput::IN_ClearStates( void ) |
|
{ |
|
//gEngfuncs.Con_Printf( "IN_ClearStates\n" ); |
|
} |
|
|
|
void FWGSInput::IN_ActivateMouse( void ) |
|
{ |
|
//gEngfuncs.Con_Printf( "IN_ActivateMouse\n" ); |
|
} |
|
|
|
void FWGSInput::IN_DeactivateMouse( void ) |
|
{ |
|
//gEngfuncs.Con_Printf( "IN_DeactivateMouse\n" ); |
|
} |
|
|
|
void FWGSInput::IN_Accumulate( void ) |
|
{ |
|
//gEngfuncs.Con_Printf( "IN_Accumulate\n" ); |
|
} |
|
|
|
void FWGSInput::IN_Commands( void ) |
|
{ |
|
//gEngfuncs.Con_Printf( "IN_Commands\n" ); |
|
} |
|
|
|
void FWGSInput::IN_Shutdown( void ) |
|
{ |
|
} |
|
|
|
// Register cvars and reset data |
|
void FWGSInput::IN_Init( void ) |
|
{ |
|
sensitivity = gEngfuncs.pfnRegisterVariable( "sensitivity", "3", FCVAR_ARCHIVE ); |
|
in_joystick = gEngfuncs.pfnRegisterVariable( "joystick", "0", FCVAR_ARCHIVE ); |
|
cl_laddermode = gEngfuncs.pfnRegisterVariable( "cl_laddermode", "2", FCVAR_ARCHIVE ); |
|
ac_forwardmove = ac_sidemove = rel_yaw = rel_pitch = 0; |
|
}
|
|
|