2010-02-15 23:26:55 +00:00
/*
Copyright ( C ) 1996 - 2001 Id Software , Inc .
Copyright ( C ) 2002 - 2009 John Fitzgibbons and others
2014-09-22 08:55:46 +00:00
Copyright ( C ) 2010 - 2014 QuakeSpasm developers
2010-02-15 23:26:55 +00:00
This program is free software ; you can redistribute it and / or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation ; either version 2
of the License , or ( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE .
See the GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
*/
// cl.input.c -- builds an intended movement command to send to the server
// Quake is a trademark of Id Software, Inc., (c) 1996 Id Software, Inc. All
// rights reserved.
# include "quakedef.h"
extern cvar_t cl_maxpitch ; //johnfitz -- variable pitch clamping
extern cvar_t cl_minpitch ; //johnfitz -- variable pitch clamping
/*
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
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_mlook , in_klook ;
kbutton_t in_left , in_right , in_forward , in_back ;
kbutton_t in_lookup , in_lookdown , in_moveleft , in_moveright ;
2017-09-17 02:12:53 +00:00
kbutton_t in_strafe , in_speed , in_jump , in_attack , in_button3 , in_button4 , in_button5 , in_button6 , in_button7 , in_button8 ;
2010-02-15 23:26:55 +00:00
kbutton_t in_up , in_down ;
int in_impulse ;
2021-06-30 22:15:49 +00:00
// JPG 1.05 - translate +jump to +moveup under water
//extern cvar_t pq_moveup;
2010-02-15 23:26:55 +00:00
void KeyDown ( kbutton_t * b )
{
int k ;
2010-08-29 02:22:55 +00:00
const char * c ;
2010-02-15 23:26:55 +00:00
c = Cmd_Argv ( 1 ) ;
if ( c [ 0 ] )
k = atoi ( c ) ;
else
k = - 1 ; // typed manually at the console for continuous down
2021-06-30 22:15:49 +00:00
// JPG 1.05 - if jump is pressed underwater, translate it to a moveup
if ( b = = & in_jump /*&& pq_moveup.value*/ & & cl . stats [ STAT_HEALTH ] > 0 & & cl . inwater )
b = & in_up ;
2010-02-15 23:26:55 +00:00
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
{
Con_Printf ( " Three keys down for a button! \n " ) ;
return ;
}
if ( b - > state & 1 )
return ; // still down
b - > state | = 1 + 2 ; // down + impulse down
}
void KeyUp ( kbutton_t * b )
{
int k ;
2010-08-29 02:22:55 +00:00
const char * c ;
2010-02-15 23:26:55 +00:00
c = Cmd_Argv ( 1 ) ;
if ( c [ 0 ] )
k = atoi ( c ) ;
else
{ // typed manually at the console, assume for unsticking, so clear all
b - > down [ 0 ] = b - > down [ 1 ] = 0 ;
b - > state = 4 ; // impulse up
return ;
}
2021-06-30 22:15:49 +00:00
// JPG 1.05 - check to see if we need to translate -jump to -moveup
if ( b = = & in_jump /* && pq_moveup.value*/ )
{
if ( k = = in_up . down [ 0 ] | | k = = in_up . down [ 1 ] )
b = & in_up ;
else
{
// in case a -moveup got lost somewhere
in_up . down [ 0 ] = in_up . down [ 1 ] = 0 ;
in_up . state = 4 ;
}
}
2010-02-15 23:26:55 +00:00
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 ] )
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_KLookDown ( void ) { KeyDown ( & in_klook ) ; }
void IN_KLookUp ( void ) { KeyUp ( & in_klook ) ; }
void IN_MLookDown ( void ) { KeyDown ( & in_mlook ) ; }
void IN_MLookUp ( void ) {
2014-09-22 08:55:46 +00:00
KeyUp ( & in_mlook ) ;
if ( ! ( in_mlook . state & 1 ) & & lookspring . value )
V_StartPitchDrift ( ) ;
2010-02-15 23:26:55 +00:00
}
void IN_UpDown ( void ) { KeyDown ( & in_up ) ; }
void IN_UpUp ( void ) { KeyUp ( & in_up ) ; }
void IN_DownDown ( void ) { KeyDown ( & in_down ) ; }
void IN_DownUp ( void ) { KeyUp ( & in_down ) ; }
void IN_LeftDown ( void ) { KeyDown ( & in_left ) ; }
void IN_LeftUp ( void ) { KeyUp ( & in_left ) ; }
void IN_RightDown ( void ) { KeyDown ( & in_right ) ; }
void IN_RightUp ( void ) { KeyUp ( & in_right ) ; }
void IN_ForwardDown ( void ) { KeyDown ( & in_forward ) ; }
void IN_ForwardUp ( void ) { KeyUp ( & in_forward ) ; }
void IN_BackDown ( void ) { KeyDown ( & in_back ) ; }
void IN_BackUp ( void ) { KeyUp ( & in_back ) ; }
void IN_LookupDown ( void ) { KeyDown ( & in_lookup ) ; }
void IN_LookupUp ( void ) { KeyUp ( & in_lookup ) ; }
void IN_LookdownDown ( void ) { KeyDown ( & in_lookdown ) ; }
void IN_LookdownUp ( void ) { KeyUp ( & in_lookdown ) ; }
void IN_MoveleftDown ( void ) { KeyDown ( & in_moveleft ) ; }
void IN_MoveleftUp ( void ) { KeyUp ( & in_moveleft ) ; }
void IN_MoverightDown ( void ) { KeyDown ( & in_moveright ) ; }
void IN_MoverightUp ( void ) { KeyUp ( & in_moveright ) ; }
void IN_SpeedDown ( void ) { KeyDown ( & in_speed ) ; }
void IN_SpeedUp ( void ) { KeyUp ( & in_speed ) ; }
void IN_StrafeDown ( void ) { KeyDown ( & in_strafe ) ; }
void IN_StrafeUp ( void ) { KeyUp ( & in_strafe ) ; }
void IN_AttackDown ( void ) { KeyDown ( & in_attack ) ; }
void IN_AttackUp ( void ) { KeyUp ( & in_attack ) ; }
2017-09-17 02:12:53 +00:00
void IN_UseDown ( void ) { KeyDown ( & in_button3 ) ; }
void IN_UseUp ( void ) { KeyUp ( & in_button3 ) ; }
2010-02-15 23:26:55 +00:00
void IN_JumpDown ( void ) { KeyDown ( & in_jump ) ; }
void IN_JumpUp ( void ) { KeyUp ( & in_jump ) ; }
2017-09-17 02:12:53 +00:00
void IN_Button3Down ( void ) { KeyDown ( & in_button3 ) ; }
void IN_Button3Up ( void ) { KeyUp ( & in_button3 ) ; }
void IN_Button4Down ( void ) { KeyDown ( & in_button4 ) ; }
void IN_Button4Up ( void ) { KeyUp ( & in_button4 ) ; }
void IN_Button5Down ( void ) { KeyDown ( & in_button5 ) ; }
void IN_Button5Up ( void ) { KeyUp ( & in_button5 ) ; }
void IN_Button6Down ( void ) { KeyDown ( & in_button6 ) ; }
void IN_Button6Up ( void ) { KeyUp ( & in_button6 ) ; }
void IN_Button7Down ( void ) { KeyDown ( & in_button7 ) ; }
void IN_Button7Up ( void ) { KeyUp ( & in_button7 ) ; }
void IN_Button8Down ( void ) { KeyDown ( & in_button8 ) ; }
void IN_Button8Up ( void ) { KeyUp ( & in_button8 ) ; }
2021-06-30 20:23:00 +00:00
// Tonik ...
void IN_Impulse ( void )
{
int best , i , imp ;
in_impulse = Q_atoi ( Cmd_Argv ( 1 ) ) ;
if ( Cmd_Argc ( ) < = 2 )
{
return ;
}
best = 0 ;
for ( i = Cmd_Argc ( ) - 1 ; i > 0 ; i - - )
{
imp = Q_atoi ( Cmd_Argv ( i ) ) ;
if ( imp < 1 | | imp > 8 )
continue ;
switch ( imp )
{
case 1 :
if ( cl . items & IT_AXE )
best = 1 ;
break ;
case 2 :
if ( cl . items & IT_SHOTGUN & & cl . stats [ STAT_SHELLS ] > = 1 )
best = 2 ;
break ;
case 3 :
if ( cl . items & IT_SUPER_SHOTGUN & & cl . stats [ STAT_SHELLS ] > = 2 )
best = 3 ;
break ;
case 4 :
if ( cl . items & IT_NAILGUN & & cl . stats [ STAT_NAILS ] > = 1 )
best = 4 ;
break ;
case 5 :
if ( cl . items & IT_SUPER_NAILGUN & & cl . stats [ STAT_NAILS ] > = 2 )
best = 5 ;
break ;
case 6 :
if ( cl . items & IT_GRENADE_LAUNCHER & & cl . stats [ STAT_ROCKETS ] > = 1 )
best = 6 ;
break ;
case 7 :
if ( cl . items & IT_ROCKET_LAUNCHER & & cl . stats [ STAT_ROCKETS ] > = 1 )
best = 7 ;
break ;
case 8 :
if ( cl . items & IT_LIGHTNING & & cl . stats [ STAT_CELLS ] > 0 )
best = 8 ;
}
}
if ( best )
{
in_impulse = best ;
}
}
//... Tonik
2010-02-15 23:26:55 +00:00
/*
= = = = = = = = = = = = = = =
CL_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
= = = = = = = = = = = = = = =
*/
2023-07-25 12:13:11 +00:00
float CL_KeyState ( kbutton_t * key , qboolean isfinal )
2010-02-15 23:26:55 +00:00
{
float val ;
qboolean impulsedown , impulseup , down ;
impulsedown = key - > state & 2 ;
impulseup = key - > state & 4 ;
down = key - > state & 1 ;
val = 0 ;
if ( impulsedown & & ! impulseup )
chase.c, cl_input.c, cl_parse.c, client.h, common.c, common.h, console.h,
cvar.h, draw.h, gl_draw.c, gl_fog.c, gl_mesh.c, gl_model.c, gl_model.h,
gl_rmain.c, gl_rmisc.c, gl_screen.c, gl_sky.c, gl_texmgr.c, glquake.h,
host.c, keys.c, keys.h, main.c, menu.c, menu.h, pr_cmds.c, quakedef.h,
r_alias.c, r_brush.c, r_part.c, r_sprite.c, r_world.c, sbar.c, sbar.h,
screen.h, snd_dma.c, snd_mem.c, snd_mix.c, sv_main.c, sys_sdl.c, vid.h,
view.h, world.c, world.h: Loads of warning fixes about missing function
prototypes, missing parens around &, missing braces leading to ambiguous
else statements and unused and uninitialized variables. There are still a
couple of unitialised variables here and there, but not much. The warnings
about strict aliasing violations need taking care of.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@21 af15c1b1-3010-417e-b628-4374ebc0bcbd
2010-02-16 12:01:07 +00:00
{
2010-02-15 23:26:55 +00:00
if ( down )
val = 0.5 ; // pressed and held this frame
else
val = 0 ; // I_Error ();
chase.c, cl_input.c, cl_parse.c, client.h, common.c, common.h, console.h,
cvar.h, draw.h, gl_draw.c, gl_fog.c, gl_mesh.c, gl_model.c, gl_model.h,
gl_rmain.c, gl_rmisc.c, gl_screen.c, gl_sky.c, gl_texmgr.c, glquake.h,
host.c, keys.c, keys.h, main.c, menu.c, menu.h, pr_cmds.c, quakedef.h,
r_alias.c, r_brush.c, r_part.c, r_sprite.c, r_world.c, sbar.c, sbar.h,
screen.h, snd_dma.c, snd_mem.c, snd_mix.c, sv_main.c, sys_sdl.c, vid.h,
view.h, world.c, world.h: Loads of warning fixes about missing function
prototypes, missing parens around &, missing braces leading to ambiguous
else statements and unused and uninitialized variables. There are still a
couple of unitialised variables here and there, but not much. The warnings
about strict aliasing violations need taking care of.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@21 af15c1b1-3010-417e-b628-4374ebc0bcbd
2010-02-16 12:01:07 +00:00
}
2010-02-15 23:26:55 +00:00
if ( impulseup & & ! impulsedown )
chase.c, cl_input.c, cl_parse.c, client.h, common.c, common.h, console.h,
cvar.h, draw.h, gl_draw.c, gl_fog.c, gl_mesh.c, gl_model.c, gl_model.h,
gl_rmain.c, gl_rmisc.c, gl_screen.c, gl_sky.c, gl_texmgr.c, glquake.h,
host.c, keys.c, keys.h, main.c, menu.c, menu.h, pr_cmds.c, quakedef.h,
r_alias.c, r_brush.c, r_part.c, r_sprite.c, r_world.c, sbar.c, sbar.h,
screen.h, snd_dma.c, snd_mem.c, snd_mix.c, sv_main.c, sys_sdl.c, vid.h,
view.h, world.c, world.h: Loads of warning fixes about missing function
prototypes, missing parens around &, missing braces leading to ambiguous
else statements and unused and uninitialized variables. There are still a
couple of unitialised variables here and there, but not much. The warnings
about strict aliasing violations need taking care of.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@21 af15c1b1-3010-417e-b628-4374ebc0bcbd
2010-02-16 12:01:07 +00:00
{
2010-02-15 23:26:55 +00:00
if ( down )
val = 0 ; // I_Error ();
else
val = 0 ; // released this frame
chase.c, cl_input.c, cl_parse.c, client.h, common.c, common.h, console.h,
cvar.h, draw.h, gl_draw.c, gl_fog.c, gl_mesh.c, gl_model.c, gl_model.h,
gl_rmain.c, gl_rmisc.c, gl_screen.c, gl_sky.c, gl_texmgr.c, glquake.h,
host.c, keys.c, keys.h, main.c, menu.c, menu.h, pr_cmds.c, quakedef.h,
r_alias.c, r_brush.c, r_part.c, r_sprite.c, r_world.c, sbar.c, sbar.h,
screen.h, snd_dma.c, snd_mem.c, snd_mix.c, sv_main.c, sys_sdl.c, vid.h,
view.h, world.c, world.h: Loads of warning fixes about missing function
prototypes, missing parens around &, missing braces leading to ambiguous
else statements and unused and uninitialized variables. There are still a
couple of unitialised variables here and there, but not much. The warnings
about strict aliasing violations need taking care of.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@21 af15c1b1-3010-417e-b628-4374ebc0bcbd
2010-02-16 12:01:07 +00:00
}
2010-02-15 23:26:55 +00:00
if ( ! impulsedown & & ! impulseup )
chase.c, cl_input.c, cl_parse.c, client.h, common.c, common.h, console.h,
cvar.h, draw.h, gl_draw.c, gl_fog.c, gl_mesh.c, gl_model.c, gl_model.h,
gl_rmain.c, gl_rmisc.c, gl_screen.c, gl_sky.c, gl_texmgr.c, glquake.h,
host.c, keys.c, keys.h, main.c, menu.c, menu.h, pr_cmds.c, quakedef.h,
r_alias.c, r_brush.c, r_part.c, r_sprite.c, r_world.c, sbar.c, sbar.h,
screen.h, snd_dma.c, snd_mem.c, snd_mix.c, sv_main.c, sys_sdl.c, vid.h,
view.h, world.c, world.h: Loads of warning fixes about missing function
prototypes, missing parens around &, missing braces leading to ambiguous
else statements and unused and uninitialized variables. There are still a
couple of unitialised variables here and there, but not much. The warnings
about strict aliasing violations need taking care of.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@21 af15c1b1-3010-417e-b628-4374ebc0bcbd
2010-02-16 12:01:07 +00:00
{
2010-02-15 23:26:55 +00:00
if ( down )
val = 1.0 ; // held the entire frame
else
val = 0 ; // up the entire frame
chase.c, cl_input.c, cl_parse.c, client.h, common.c, common.h, console.h,
cvar.h, draw.h, gl_draw.c, gl_fog.c, gl_mesh.c, gl_model.c, gl_model.h,
gl_rmain.c, gl_rmisc.c, gl_screen.c, gl_sky.c, gl_texmgr.c, glquake.h,
host.c, keys.c, keys.h, main.c, menu.c, menu.h, pr_cmds.c, quakedef.h,
r_alias.c, r_brush.c, r_part.c, r_sprite.c, r_world.c, sbar.c, sbar.h,
screen.h, snd_dma.c, snd_mem.c, snd_mix.c, sv_main.c, sys_sdl.c, vid.h,
view.h, world.c, world.h: Loads of warning fixes about missing function
prototypes, missing parens around &, missing braces leading to ambiguous
else statements and unused and uninitialized variables. There are still a
couple of unitialised variables here and there, but not much. The warnings
about strict aliasing violations need taking care of.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@21 af15c1b1-3010-417e-b628-4374ebc0bcbd
2010-02-16 12:01:07 +00:00
}
2010-02-15 23:26:55 +00:00
if ( impulsedown & & impulseup )
chase.c, cl_input.c, cl_parse.c, client.h, common.c, common.h, console.h,
cvar.h, draw.h, gl_draw.c, gl_fog.c, gl_mesh.c, gl_model.c, gl_model.h,
gl_rmain.c, gl_rmisc.c, gl_screen.c, gl_sky.c, gl_texmgr.c, glquake.h,
host.c, keys.c, keys.h, main.c, menu.c, menu.h, pr_cmds.c, quakedef.h,
r_alias.c, r_brush.c, r_part.c, r_sprite.c, r_world.c, sbar.c, sbar.h,
screen.h, snd_dma.c, snd_mem.c, snd_mix.c, sv_main.c, sys_sdl.c, vid.h,
view.h, world.c, world.h: Loads of warning fixes about missing function
prototypes, missing parens around &, missing braces leading to ambiguous
else statements and unused and uninitialized variables. There are still a
couple of unitialised variables here and there, but not much. The warnings
about strict aliasing violations need taking care of.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@21 af15c1b1-3010-417e-b628-4374ebc0bcbd
2010-02-16 12:01:07 +00:00
{
2010-02-15 23:26:55 +00:00
if ( down )
val = 0.75 ; // released and re-pressed this frame
else
val = 0.25 ; // pressed and released this frame
chase.c, cl_input.c, cl_parse.c, client.h, common.c, common.h, console.h,
cvar.h, draw.h, gl_draw.c, gl_fog.c, gl_mesh.c, gl_model.c, gl_model.h,
gl_rmain.c, gl_rmisc.c, gl_screen.c, gl_sky.c, gl_texmgr.c, glquake.h,
host.c, keys.c, keys.h, main.c, menu.c, menu.h, pr_cmds.c, quakedef.h,
r_alias.c, r_brush.c, r_part.c, r_sprite.c, r_world.c, sbar.c, sbar.h,
screen.h, snd_dma.c, snd_mem.c, snd_mix.c, sv_main.c, sys_sdl.c, vid.h,
view.h, world.c, world.h: Loads of warning fixes about missing function
prototypes, missing parens around &, missing braces leading to ambiguous
else statements and unused and uninitialized variables. There are still a
couple of unitialised variables here and there, but not much. The warnings
about strict aliasing violations need taking care of.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@21 af15c1b1-3010-417e-b628-4374ebc0bcbd
2010-02-16 12:01:07 +00:00
}
2010-02-15 23:26:55 +00:00
2023-07-25 12:13:11 +00:00
if ( isfinal )
key - > state & = 1 ; // clear impulses
2010-02-15 23:26:55 +00:00
return val ;
}
//==========================================================================
2011-12-28 22:01:33 +00:00
cvar_t cl_upspeed = { " cl_upspeed " , " 200 " , CVAR_NONE } ;
cvar_t cl_forwardspeed = { " cl_forwardspeed " , " 200 " , CVAR_ARCHIVE } ;
cvar_t cl_backspeed = { " cl_backspeed " , " 200 " , CVAR_ARCHIVE } ;
cvar_t cl_sidespeed = { " cl_sidespeed " , " 350 " , CVAR_NONE } ;
2010-02-15 23:26:55 +00:00
2011-12-28 22:01:33 +00:00
cvar_t cl_movespeedkey = { " cl_movespeedkey " , " 2.0 " , CVAR_NONE } ;
2010-02-15 23:26:55 +00:00
2011-12-28 22:01:33 +00:00
cvar_t cl_yawspeed = { " cl_yawspeed " , " 140 " , CVAR_NONE } ;
cvar_t cl_pitchspeed = { " cl_pitchspeed " , " 150 " , CVAR_NONE } ;
2010-02-15 23:26:55 +00:00
2011-12-28 22:01:33 +00:00
cvar_t cl_anglespeedkey = { " cl_anglespeedkey " , " 1.5 " , CVAR_NONE } ;
2010-02-15 23:26:55 +00:00
2017-08-23 06:00:20 +00:00
cvar_t cl_alwaysrun = { " cl_alwaysrun " , " 0 " , CVAR_ARCHIVE } ; // QuakeSpasm -- new always run
2010-02-15 23:26:55 +00:00
/*
= = = = = = = = = = = = = = = =
CL_AdjustAngles
Moves the local angle positions
= = = = = = = = = = = = = = = =
*/
void CL_AdjustAngles ( void )
{
float speed ;
float up , down ;
2017-08-23 06:00:20 +00:00
if ( ( in_speed . state & 1 ) ^ ( cl_alwaysrun . value ! = 0.0 ) )
2010-02-15 23:26:55 +00:00
speed = host_frametime * cl_anglespeedkey . value ;
else
speed = host_frametime ;
if ( ! ( in_strafe . state & 1 ) )
{
2023-07-25 12:13:11 +00:00
cl . viewangles [ YAW ] - = speed * cl_yawspeed . value * CL_KeyState ( & in_right , true ) ;
cl . viewangles [ YAW ] + = speed * cl_yawspeed . value * CL_KeyState ( & in_left , true ) ;
2010-02-15 23:26:55 +00:00
cl . viewangles [ YAW ] = anglemod ( cl . viewangles [ YAW ] ) ;
}
if ( in_klook . state & 1 )
{
V_StopPitchDrift ( ) ;
2023-07-25 12:13:11 +00:00
cl . viewangles [ PITCH ] - = speed * cl_pitchspeed . value * CL_KeyState ( & in_forward , true ) ;
cl . viewangles [ PITCH ] + = speed * cl_pitchspeed . value * CL_KeyState ( & in_back , true ) ;
2010-02-15 23:26:55 +00:00
}
2023-07-25 12:13:11 +00:00
up = CL_KeyState ( & in_lookup , true ) ;
down = CL_KeyState ( & in_lookdown , true ) ;
2010-02-15 23:26:55 +00:00
cl . viewangles [ PITCH ] - = speed * cl_pitchspeed . value * up ;
cl . viewangles [ PITCH ] + = speed * cl_pitchspeed . value * down ;
if ( up | | down )
V_StopPitchDrift ( ) ;
//johnfitz -- variable pitch clamping
if ( cl . viewangles [ PITCH ] > cl_maxpitch . value )
cl . viewangles [ PITCH ] = cl_maxpitch . value ;
if ( cl . viewangles [ PITCH ] < cl_minpitch . value )
cl . viewangles [ PITCH ] = cl_minpitch . value ;
//johnfitz
if ( cl . viewangles [ ROLL ] > 50 )
cl . viewangles [ ROLL ] = 50 ;
if ( cl . viewangles [ ROLL ] < - 50 )
cl . viewangles [ ROLL ] = - 50 ;
}
/*
= = = = = = = = = = = = = = = =
CL_BaseMove
Send the intended movement message to the server
= = = = = = = = = = = = = = = =
*/
2023-07-25 12:13:11 +00:00
void CL_BaseMove ( usercmd_t * cmd , qboolean isfinal )
2010-02-15 23:26:55 +00:00
{
2020-09-04 11:18:05 +00:00
Q_memset ( cmd , 0 , sizeof ( * cmd ) ) ;
VectorCopy ( cl . viewangles , cmd - > viewangles ) ;
2010-02-15 23:26:55 +00:00
if ( cls . signon ! = SIGNONS )
return ;
if ( in_strafe . state & 1 )
{
2023-07-25 12:13:11 +00:00
cmd - > sidemove + = cl_sidespeed . value * CL_KeyState ( & in_right , isfinal ) ;
cmd - > sidemove - = cl_sidespeed . value * CL_KeyState ( & in_left , isfinal ) ;
2010-02-15 23:26:55 +00:00
}
2023-07-25 12:13:11 +00:00
cmd - > sidemove + = cl_sidespeed . value * CL_KeyState ( & in_moveright , isfinal ) ;
cmd - > sidemove - = cl_sidespeed . value * CL_KeyState ( & in_moveleft , isfinal ) ;
2010-02-15 23:26:55 +00:00
2023-07-25 12:13:11 +00:00
cmd - > upmove + = cl_upspeed . value * CL_KeyState ( & in_up , isfinal ) ;
cmd - > upmove - = cl_upspeed . value * CL_KeyState ( & in_down , isfinal ) ;
2010-02-15 23:26:55 +00:00
if ( ! ( in_klook . state & 1 ) )
{
2023-07-25 12:13:11 +00:00
cmd - > forwardmove + = cl_forwardspeed . value * CL_KeyState ( & in_forward , isfinal ) ;
cmd - > forwardmove - = cl_backspeed . value * CL_KeyState ( & in_back , isfinal ) ;
2010-02-15 23:26:55 +00:00
}
//
// adjust for speed key
//
2017-08-23 06:00:20 +00:00
if ( ( in_speed . state & 1 ) ^ ( cl_alwaysrun . value ! = 0.0 ) )
2010-02-15 23:26:55 +00:00
{
cmd - > forwardmove * = cl_movespeedkey . value ;
cmd - > sidemove * = cl_movespeedkey . value ;
cmd - > upmove * = cl_movespeedkey . value ;
}
}
2023-07-25 12:13:11 +00:00
void CL_FinishMove ( usercmd_t * cmd , qboolean isfinal )
2020-09-04 11:18:05 +00:00
{
2023-07-25 12:13:11 +00:00
static kbutton_t * buttons [ ] = {
& in_attack ,
& in_jump ,
& in_button3 ,
& in_button4 ,
& in_button3 ,
& in_button6 ,
& in_button7 ,
& in_button8 ,
} ;
unsigned int bits , i ;
2020-09-04 11:18:05 +00:00
//
// send button bits
//
bits = 0 ;
2023-07-25 12:13:11 +00:00
for ( i = 0 ; i < countof ( buttons ) ; i + + )
{
if ( buttons [ i ] - > state & 3 )
{
bits | = 1 < < i ;
if ( isfinal )
buttons [ i ] - > state & = ~ 2 ;
}
}
2020-09-04 11:18:05 +00:00
cmd - > buttons = bits ;
cmd - > impulse = in_impulse ;
2023-07-25 12:13:11 +00:00
if ( isfinal )
in_impulse = 0 ;
cmd - > forwardmove + = cl . accummoves [ 0 ] ;
cmd - > sidemove + = cl . accummoves [ 1 ] ;
cmd - > upmove + = cl . accummoves [ 2 ] ;
if ( isfinal )
cl . accummoves [ 0 ] = cl . accummoves [ 1 ] = cl . accummoves [ 2 ] = 0 ;
cmd - > sequence = cl . movemessages ;
cmd - > servertime = cl . time ;
cmd - > seconds = cmd - > servertime - cl . lastcmdtime ;
2020-09-04 11:18:05 +00:00
}
2010-02-15 23:26:55 +00:00
/*
= = = = = = = = = = = = = =
CL_SendMove
= = = = = = = = = = = = = =
*/
2011-12-12 14:11:17 +00:00
void CL_SendMove ( const usercmd_t * cmd )
2010-02-15 23:26:55 +00:00
{
2017-09-17 02:12:53 +00:00
unsigned int i ;
sizebuf_t buf ;
byte data [ 1024 ] ;
2010-02-15 23:26:55 +00:00
2017-09-17 02:12:53 +00:00
buf . maxsize = sizeof ( data ) ;
2010-02-15 23:26:55 +00:00
buf . cursize = 0 ;
buf . data = data ;
2017-09-17 02:12:53 +00:00
for ( i = 0 ; i < cl . ackframes_count ; i + + )
{
MSG_WriteByte ( & buf , clcdp_ackframe ) ;
MSG_WriteLong ( & buf , cl . ackframes [ i ] ) ;
}
cl . ackframes_count = 0 ;
2010-02-15 23:26:55 +00:00
2017-09-17 02:12:53 +00:00
if ( cmd )
{
int dump = buf . cursize ;
2021-05-10 23:52:02 +00:00
unsigned int bits = cmd - > buttons ;
2017-09-17 02:12:53 +00:00
//
// send the movement message
//
MSG_WriteByte ( & buf , clc_move ) ;
if ( cl . protocol = = PROTOCOL_VERSION_DP7 )
{
2020-09-04 11:18:05 +00:00
if ( 0 )
{
2017-09-17 02:12:53 +00:00
MSG_WriteLong ( & buf , 0 ) ;
2020-09-04 11:18:05 +00:00
MSG_WriteFloat ( & buf , cl . mtime [ 0 ] ) ; // so server can get ping times
}
2017-09-17 02:12:53 +00:00
else
2020-09-04 11:18:05 +00:00
{
2017-09-17 02:12:53 +00:00
MSG_WriteLong ( & buf , cl . movemessages ) ;
2020-09-04 11:18:05 +00:00
MSG_WriteFloat ( & buf , cmd - > servertime ) ; // for input timing
}
2017-09-17 02:12:53 +00:00
}
else if ( cl . protocol_pext2 & PEXT2_PREDINFO )
2020-09-04 11:18:05 +00:00
{
2017-09-17 02:12:53 +00:00
MSG_WriteShort ( & buf , cl . movemessages & 0xffff ) ; //server will ack this once it has been applied to the player's entity state
2020-09-04 11:18:05 +00:00
MSG_WriteFloat ( & buf , cmd - > servertime ) ; // so server can get cmd timing (pings will be calculated by entframe acks).
}
else
MSG_WriteFloat ( & buf , cl . mtime [ 0 ] ) ; // so server can get ping times
2017-09-17 02:12:53 +00:00
for ( i = 0 ; i < 3 ; i + + )
//johnfitz -- 16-bit angles for PROTOCOL_FITZQUAKE
//spike -- nq+bjp3 use 8bit angles. all other supported protocols use 16bit ones.
//spike -- proquake servers bump client->server angles up to at least 16bit. this is safe because it only happens when both client+server advertise it, and because it never actually gets recorded into demos anyway.
//spike -- predinfo also always means 16bit angles, even if for some reason the server doesn't advertise proquake (like dp).
if ( ( cl . protocol = = PROTOCOL_NETQUAKE | | cl . protocol = = PROTOCOL_VERSION_BJP3 ) & & ! NET_QSocketGetProQuakeAngleHack ( cls . netcon ) & & ! ( cl . protocol_pext2 & PEXT2_PREDINFO ) )
MSG_WriteAngle ( & buf , cl . viewangles [ i ] , cl . protocolflags ) ;
else
MSG_WriteAngle16 ( & buf , cl . viewangles [ i ] , cl . protocolflags ) ;
//johnfitz
MSG_WriteShort ( & buf , cmd - > forwardmove ) ;
MSG_WriteShort ( & buf , cmd - > sidemove ) ;
MSG_WriteShort ( & buf , cmd - > upmove ) ;
2021-05-10 23:52:02 +00:00
if ( cl . protocol_pext2 & PEXT2_PRYDONCURSOR )
{
if ( cmd - > weapon )
bits | = ( 1u < < 30 ) ;
if ( cmd - > cursor_screen [ 0 ] | | cmd - > cursor_screen [ 1 ] | |
cmd - > cursor_start [ 0 ] | | cmd - > cursor_start [ 1 ] | | cmd - > cursor_start [ 2 ] | |
cmd - > cursor_impact [ 0 ] | | cmd - > cursor_impact [ 1 ] | | cmd - > cursor_impact [ 2 ] | |
cmd - > cursor_entitynumber )
bits | = ( 1u < < 31 ) ;
MSG_WriteLong ( & buf , bits ) ;
}
else if ( cl . protocol = = PROTOCOL_VERSION_DP7 )
2017-09-17 02:12:53 +00:00
{
2021-05-10 23:52:02 +00:00
MSG_WriteLong ( & buf , bits ) ;
bits | = ( 1u < < 31 ) ;
2017-09-17 02:12:53 +00:00
}
2010-02-15 23:26:55 +00:00
else
2021-05-10 23:52:02 +00:00
MSG_WriteByte ( & buf , bits ) ;
MSG_WriteByte ( & buf , cmd - > impulse ) ;
if ( bits & ( 1u < < 30 ) )
MSG_WriteLong ( & buf , cmd - > weapon ) ;
if ( bits & ( 1u < < 31 ) )
2017-09-17 02:12:53 +00:00
{
2021-05-10 23:52:02 +00:00
MSG_WriteShort ( & buf , cmd - > cursor_screen [ 0 ] * 32767 ) ;
MSG_WriteShort ( & buf , cmd - > cursor_screen [ 1 ] * 32767 ) ;
MSG_WriteFloat ( & buf , cmd - > cursor_start [ 0 ] ) ; //start (view pos)
MSG_WriteFloat ( & buf , cmd - > cursor_start [ 1 ] ) ;
MSG_WriteFloat ( & buf , cmd - > cursor_start [ 2 ] ) ;
MSG_WriteFloat ( & buf , cmd - > cursor_impact [ 0 ] ) ; //impact
MSG_WriteFloat ( & buf , cmd - > cursor_impact [ 1 ] ) ;
MSG_WriteFloat ( & buf , cmd - > cursor_impact [ 2 ] ) ;
MSG_WriteEntity ( & buf , cmd - > cursor_entitynumber , cl . protocol_pext2 ) ;
2017-09-17 02:12:53 +00:00
}
in_impulse = 0 ;
2023-07-25 12:13:11 +00:00
cl . movecmds [ ( cl . movemessages + + ) & MOVECMDS_MASK ] = * cmd ;
2020-09-04 11:18:05 +00:00
2017-09-17 02:12:53 +00:00
//
// allways dump the first two message, because it may contain leftover inputs
// from the last level
//
2023-07-25 12:13:11 +00:00
if ( cl . movemessages < = 2 )
{
buf . cursize = dump ; //don't actually send it...
cl . movecmds [ ( cl . movemessages - 1 ) & MOVECMDS_MASK ] . seconds = 0 ; //and don't predict forwards. should fix prediction going weird at the start of the map.
}
2017-09-17 02:12:53 +00:00
else
S_Voip_Transmit ( clcfte_voicechat , & buf ) ; /*Spike: Add voice data*/
}
else
S_Voip_Transmit ( clcfte_voicechat , NULL ) ; /*Spike: Add voice data (with cl_voip_test anyway)*/
2010-02-15 23:26:55 +00:00
2017-09-17 02:12:53 +00:00
//fixme: nops if we're still connecting, or something.
2010-02-15 23:26:55 +00:00
2017-09-17 02:12:53 +00:00
//
// deliver the message
//
if ( cls . demoplayback | | ! buf . cursize )
2010-02-15 23:26:55 +00:00
return ;
if ( NET_SendUnreliableMessage ( cls . netcon , & buf ) = = - 1 )
{
Con_Printf ( " CL_SendMove: lost server connection \n " ) ;
CL_Disconnect ( ) ;
}
}
/*
= = = = = = = = = = = =
CL_InitInput
= = = = = = = = = = = =
*/
void CL_InitInput ( void )
{
2021-08-31 02:36:55 +00:00
# undef Cmd_AddCommand
# define Cmd_AddCommand(cmd,fnc) Cmd_AddCommand2(cmd,fnc,src_command,true)
2010-02-15 23:26:55 +00:00
Cmd_AddCommand ( " +moveup " , IN_UpDown ) ;
Cmd_AddCommand ( " -moveup " , IN_UpUp ) ;
Cmd_AddCommand ( " +movedown " , IN_DownDown ) ;
Cmd_AddCommand ( " -movedown " , IN_DownUp ) ;
Cmd_AddCommand ( " +left " , IN_LeftDown ) ;
Cmd_AddCommand ( " -left " , IN_LeftUp ) ;
Cmd_AddCommand ( " +right " , IN_RightDown ) ;
Cmd_AddCommand ( " -right " , IN_RightUp ) ;
Cmd_AddCommand ( " +forward " , IN_ForwardDown ) ;
Cmd_AddCommand ( " -forward " , IN_ForwardUp ) ;
Cmd_AddCommand ( " +back " , IN_BackDown ) ;
Cmd_AddCommand ( " -back " , IN_BackUp ) ;
Cmd_AddCommand ( " +lookup " , IN_LookupDown ) ;
Cmd_AddCommand ( " -lookup " , IN_LookupUp ) ;
Cmd_AddCommand ( " +lookdown " , IN_LookdownDown ) ;
Cmd_AddCommand ( " -lookdown " , IN_LookdownUp ) ;
Cmd_AddCommand ( " +strafe " , IN_StrafeDown ) ;
Cmd_AddCommand ( " -strafe " , IN_StrafeUp ) ;
Cmd_AddCommand ( " +moveleft " , IN_MoveleftDown ) ;
Cmd_AddCommand ( " -moveleft " , IN_MoveleftUp ) ;
Cmd_AddCommand ( " +moveright " , IN_MoverightDown ) ;
Cmd_AddCommand ( " -moveright " , IN_MoverightUp ) ;
Cmd_AddCommand ( " +speed " , IN_SpeedDown ) ;
Cmd_AddCommand ( " -speed " , IN_SpeedUp ) ;
Cmd_AddCommand ( " +attack " , IN_AttackDown ) ;
Cmd_AddCommand ( " -attack " , IN_AttackUp ) ;
Cmd_AddCommand ( " +use " , IN_UseDown ) ;
Cmd_AddCommand ( " -use " , IN_UseUp ) ;
2017-09-17 02:12:53 +00:00
Cmd_AddCommand ( " +button3 " , IN_Button3Down ) ;
Cmd_AddCommand ( " -button3 " , IN_Button3Up ) ;
Cmd_AddCommand ( " +button4 " , IN_Button4Down ) ;
Cmd_AddCommand ( " -button4 " , IN_Button4Up ) ;
Cmd_AddCommand ( " +button5 " , IN_Button5Down ) ;
Cmd_AddCommand ( " -button5 " , IN_Button5Up ) ;
Cmd_AddCommand ( " +button6 " , IN_Button6Down ) ;
Cmd_AddCommand ( " -button6 " , IN_Button6Up ) ;
Cmd_AddCommand ( " +button7 " , IN_Button7Down ) ;
Cmd_AddCommand ( " -button7 " , IN_Button7Up ) ;
Cmd_AddCommand ( " +button8 " , IN_Button8Down ) ;
Cmd_AddCommand ( " -button8 " , IN_Button8Up ) ;
2010-02-15 23:26:55 +00:00
Cmd_AddCommand ( " +jump " , IN_JumpDown ) ;
Cmd_AddCommand ( " -jump " , IN_JumpUp ) ;
Cmd_AddCommand ( " impulse " , IN_Impulse ) ;
Cmd_AddCommand ( " +klook " , IN_KLookDown ) ;
Cmd_AddCommand ( " -klook " , IN_KLookUp ) ;
Cmd_AddCommand ( " +mlook " , IN_MLookDown ) ;
Cmd_AddCommand ( " -mlook " , IN_MLookUp ) ;
}