Home | History | Annotate | Download | only in client
      1 /*
      2 Copyright (C) 1996-1997 Id Software, Inc.
      3 
      4 This program is free software; you can redistribute it and/or
      5 modify it under the terms of the GNU General Public License
      6 as published by the Free Software Foundation; either version 2
      7 of the License, or (at your option) any later version.
      8 
      9 This program is distributed in the hope that it will be useful,
     10 but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     12 
     13 See the GNU General Public License for more details.
     14 
     15 You should have received a copy of the GNU General Public License
     16 along with this program; if not, write to the Free Software
     17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
     18 
     19 */
     20 // client.h
     21 
     22 
     23 typedef struct
     24 {
     25 	char		name[16];
     26 	qboolean	failedload;		// the name isn't a valid skin
     27 	cache_user_t	cache;
     28 } skin_t;
     29 
     30 // player_state_t is the information needed by a player entity
     31 // to do move prediction and to generate a drawable entity
     32 typedef struct
     33 {
     34 	int			messagenum;		// all player's won't be updated each frame
     35 
     36 	double		state_time;		// not the same as the packet time,
     37 								// because player commands come asyncronously
     38 	usercmd_t	command;		// last command for prediction
     39 
     40 	vec3_t		origin;
     41 	vec3_t		viewangles;		// only for demos, not from server
     42 	vec3_t		velocity;
     43 	int			weaponframe;
     44 
     45 	int			modelindex;
     46 	int			frame;
     47 	int			skinnum;
     48 	int			effects;
     49 
     50 	int			flags;			// dead, gib, etc
     51 
     52 	float		waterjumptime;
     53 	int			onground;		// -1 = in air, else pmove entity number
     54 	int			oldbuttons;
     55 } player_state_t;
     56 
     57 
     58 #define	MAX_SCOREBOARDNAME	16
     59 typedef struct player_info_s
     60 {
     61 	int		userid;
     62 	char	userinfo[MAX_INFO_STRING];
     63 
     64 	// scoreboard information
     65 	char	name[MAX_SCOREBOARDNAME];
     66 	float	entertime;
     67 	int		frags;
     68 	int		ping;
     69 	byte	pl;
     70 
     71 	// skin information
     72 	int		topcolor;
     73 	int		bottomcolor;
     74 
     75 	int		_topcolor;
     76 	int		_bottomcolor;
     77 
     78 	int		spectator;
     79 	byte	translations[VID_GRADES*256];
     80 	skin_t	*skin;
     81 } player_info_t;
     82 
     83 
     84 typedef struct
     85 {
     86 	// generated on client side
     87 	usercmd_t	cmd;		// cmd that generated the frame
     88 	double		senttime;	// time cmd was sent off
     89 	int			delta_sequence;		// sequence number to delta from, -1 = full update
     90 
     91 	// received from server
     92 	double		receivedtime;	// time message was received, or -1
     93 	player_state_t	playerstate[MAX_CLIENTS];	// message received that reflects performing
     94 							// the usercmd
     95 	packet_entities_t	packet_entities;
     96 	qboolean	invalid;		// true if the packet_entities delta was invalid
     97 } frame_t;
     98 
     99 
    100 typedef struct
    101 {
    102 	int		destcolor[3];
    103 	int		percent;		// 0-256
    104 } cshift_t;
    105 
    106 #define	CSHIFT_CONTENTS	0
    107 #define	CSHIFT_DAMAGE	1
    108 #define	CSHIFT_BONUS	2
    109 #define	CSHIFT_POWERUP	3
    110 #define	NUM_CSHIFTS		4
    111 
    112 
    113 //
    114 // client_state_t should hold all pieces of the client state
    115 //
    116 #define	MAX_DLIGHTS		32
    117 typedef struct
    118 {
    119 	int		key;				// so entities can reuse same entry
    120 	vec3_t	origin;
    121 	float	radius;
    122 	float	die;				// stop lighting after this time
    123 	float	decay;				// drop this each second
    124 	float	minlight;			// don't add when contributing less
    125 	float   color[4];
    126 } dlight_t;
    127 
    128 typedef struct
    129 {
    130 	int		length;
    131 	char	map[MAX_STYLESTRING];
    132 } lightstyle_t;
    133 
    134 
    135 
    136 #define	MAX_EFRAGS		512
    137 
    138 #define	MAX_DEMOS		8
    139 #define	MAX_DEMONAME	16
    140 
    141 typedef enum {
    142 ca_disconnected, 	// full screen console with no connection
    143 ca_demostart,		// starting up a demo
    144 ca_connected,		// netchan_t established, waiting for svc_serverdata
    145 ca_onserver,		// processing data lists, donwloading, etc
    146 ca_active			// everything is in, so frames can be rendered
    147 } cactive_t;
    148 
    149 typedef enum {
    150 	dl_none,
    151 	dl_model,
    152 	dl_sound,
    153 	dl_skin,
    154 	dl_single
    155 } dltype_t;		// download type
    156 
    157 //
    158 // the client_static_t structure is persistant through an arbitrary number
    159 // of server connections
    160 //
    161 typedef struct
    162 {
    163 // connection information
    164 	cactive_t	state;
    165 
    166 // network stuff
    167 	netchan_t	netchan;
    168 
    169 // private userinfo for sending to masterless servers
    170 	char		userinfo[MAX_INFO_STRING];
    171 
    172 	char		servername[MAX_OSPATH];	// name of server from original connect
    173 
    174 	int			qport;
    175 
    176 	FILE		*download;		// file transfer from server
    177 	char		downloadtempname[MAX_OSPATH];
    178 	char		downloadname[MAX_OSPATH];
    179 	int			downloadnumber;
    180 	dltype_t	downloadtype;
    181 	int			downloadpercent;
    182 
    183 // demo loop control
    184 	int			demonum;		// -1 = don't play demos
    185 	char		demos[MAX_DEMOS][MAX_DEMONAME];		// when not playing
    186 
    187 // demo recording info must be here, because record is started before
    188 // entering a map (and clearing client_state_t)
    189 	qboolean	demorecording;
    190 	qboolean	demoplayback;
    191 	qboolean	timedemo;
    192 	FILE		*demofile;
    193 	float		td_lastframe;		// to meter out one message a frame
    194 	int			td_startframe;		// host_framecount at start
    195 	float		td_starttime;		// realtime at second frame of timedemo
    196 
    197 	int			challenge;
    198 
    199 	float		latency;		// rolling average
    200 } client_static_t;
    201 
    202 extern client_static_t	cls;
    203 
    204 //
    205 // the client_state_t structure is wiped completely at every
    206 // server signon
    207 //
    208 typedef struct
    209 {
    210 	int			servercount;	// server identification for prespawns
    211 
    212 	char		serverinfo[MAX_SERVERINFO_STRING];
    213 
    214 	int			parsecount;		// server message counter
    215 	int			validsequence;	// this is the sequence number of the last good
    216 								// packetentity_t we got.  If this is 0, we can't
    217 								// render a frame yet
    218 	int			movemessages;	// since connecting to this server
    219 								// throw out the first couple, so the player
    220 								// doesn't accidentally do something the
    221 								// first frame
    222 
    223 	int			spectator;
    224 
    225 	double		last_ping_request;	// while showing scoreboard
    226 	double		last_servermessage;
    227 
    228 // sentcmds[cl.netchan.outgoing_sequence & UPDATE_MASK] = cmd
    229 	frame_t		frames[UPDATE_BACKUP];
    230 
    231 // information for local display
    232 	int			stats[MAX_CL_STATS];	// health, etc
    233 	float		item_gettime[32];	// cl.time of aquiring item, for blinking
    234 	float		faceanimtime;		// use anim frame if cl.time < this
    235 
    236 	cshift_t	cshifts[NUM_CSHIFTS];	// color shifts for damage, powerups
    237 	cshift_t	prev_cshifts[NUM_CSHIFTS];	// and content types
    238 
    239 // the client maintains its own idea of view angles, which are
    240 // sent to the server each frame.  And only reset at level change
    241 // and teleport times
    242 	vec3_t		viewangles;
    243 
    244 // the client simulates or interpolates movement to get these values
    245 	double		time;			// this is the time value that the client
    246 								// is rendering at.  allways <= realtime
    247 	vec3_t		simorg;
    248 	vec3_t		simvel;
    249 	vec3_t		simangles;
    250 
    251 // pitch drifting vars
    252 	float		pitchvel;
    253 	qboolean	nodrift;
    254 	float		driftmove;
    255 	double		laststop;
    256 
    257 
    258 	float		crouch;			// local amount for smoothing stepups
    259 
    260 	qboolean	paused;			// send over by server
    261 
    262 	float		punchangle;		// temporar yview kick from weapon firing
    263 
    264 	int			intermission;	// don't change view angle, full screen, etc
    265 	int			completed_time;	// latched ffrom time at intermission start
    266 
    267 //
    268 // information that is static for the entire time connected to a server
    269 //
    270 	char		model_name[MAX_MODELS][MAX_QPATH];
    271 	char		sound_name[MAX_SOUNDS][MAX_QPATH];
    272 
    273 	struct model_s		*model_precache[MAX_MODELS];
    274 	struct sfx_s		*sound_precache[MAX_SOUNDS];
    275 
    276 	char		levelname[40];	// for display on solo scoreboard
    277 	int			playernum;
    278 
    279 // refresh related state
    280 	struct model_s	*worldmodel;	// cl_entitites[0].model
    281 	struct efrag_s	*free_efrags;
    282 	int			num_entities;	// stored bottom up in cl_entities array
    283 	int			num_statics;	// stored top down in cl_entitiers
    284 
    285 	int			cdtrack;		// cd audio
    286 
    287 	entity_t	viewent;		// weapon model
    288 
    289 // all player information
    290 	player_info_t	players[MAX_CLIENTS];
    291 } client_state_t;
    292 
    293 
    294 //
    295 // cvars
    296 //
    297 extern  cvar_t	cl_warncmd;
    298 extern	cvar_t	cl_upspeed;
    299 extern	cvar_t	cl_forwardspeed;
    300 extern	cvar_t	cl_backspeed;
    301 extern	cvar_t	cl_sidespeed;
    302 
    303 extern	cvar_t	cl_movespeedkey;
    304 
    305 extern	cvar_t	cl_yawspeed;
    306 extern	cvar_t	cl_pitchspeed;
    307 
    308 extern	cvar_t	cl_anglespeedkey;
    309 
    310 extern	cvar_t	cl_shownet;
    311 extern	cvar_t	cl_sbar;
    312 extern	cvar_t	cl_hudswap;
    313 
    314 extern	cvar_t	cl_pitchdriftspeed;
    315 extern	cvar_t	lookspring;
    316 extern	cvar_t	lookstrafe;
    317 extern	cvar_t	sensitivity;
    318 
    319 extern	cvar_t	m_pitch;
    320 extern	cvar_t	m_yaw;
    321 extern	cvar_t	m_forward;
    322 extern	cvar_t	m_side;
    323 
    324 extern cvar_t		_windowed_mouse;
    325 
    326 extern	cvar_t	name;
    327 
    328 
    329 #define	MAX_STATIC_ENTITIES	128			// torches, etc
    330 
    331 extern	client_state_t	cl;
    332 
    333 // FIXME, allocate dynamically
    334 extern	entity_state_t	cl_baselines[MAX_EDICTS];
    335 extern	efrag_t			cl_efrags[MAX_EFRAGS];
    336 extern	entity_t		cl_static_entities[MAX_STATIC_ENTITIES];
    337 extern	lightstyle_t	cl_lightstyle[MAX_LIGHTSTYLES];
    338 extern	dlight_t		cl_dlights[MAX_DLIGHTS];
    339 
    340 extern	qboolean	nomaster;
    341 extern float	server_version;	// version of server we connected to
    342 
    343 //=============================================================================
    344 
    345 
    346 //
    347 // cl_main
    348 //
    349 dlight_t *CL_AllocDlight (int key);
    350 void	CL_DecayLights (void);
    351 
    352 void CL_Init (void);
    353 void Host_WriteConfiguration (void);
    354 
    355 void CL_EstablishConnection (char *host);
    356 
    357 void CL_Disconnect (void);
    358 void CL_Disconnect_f (void);
    359 void CL_NextDemo (void);
    360 qboolean CL_DemoBehind(void);
    361 
    362 void CL_BeginServerConnect(void);
    363 
    364 #define			MAX_VISEDICTS	256
    365 extern	int				cl_numvisedicts, cl_oldnumvisedicts;
    366 extern	entity_t		*cl_visedicts, *cl_oldvisedicts;
    367 extern	entity_t		cl_visedicts_list[2][MAX_VISEDICTS];
    368 
    369 extern char emodel_name[], pmodel_name[], prespawn_name[], modellist_name[], soundlist_name[];
    370 
    371 //
    372 // cl_input
    373 //
    374 typedef struct
    375 {
    376 	int		down[2];		// key nums holding it down
    377 	int		state;			// low bit is down state
    378 } kbutton_t;
    379 
    380 extern	kbutton_t	in_mlook, in_klook;
    381 extern 	kbutton_t 	in_strafe;
    382 extern 	kbutton_t 	in_speed;
    383 
    384 void CL_InitInput (void);
    385 void CL_SendCmd (void);
    386 void CL_SendMove (usercmd_t *cmd);
    387 
    388 void CL_ParseTEnt (void);
    389 void CL_UpdateTEnts (void);
    390 
    391 void CL_ClearState (void);
    392 
    393 void CL_ReadPackets (void);
    394 
    395 int  CL_ReadFromServer (void);
    396 void CL_WriteToServer (usercmd_t *cmd);
    397 void CL_BaseMove (usercmd_t *cmd);
    398 
    399 
    400 float CL_KeyState (kbutton_t *key);
    401 char *Key_KeynumToString (int keynum);
    402 
    403 //
    404 // cl_demo.c
    405 //
    406 void CL_StopPlayback (void);
    407 qboolean CL_GetMessage (void);
    408 void CL_WriteDemoCmd (usercmd_t *pcmd);
    409 
    410 void CL_Stop_f (void);
    411 void CL_Record_f (void);
    412 void CL_ReRecord_f (void);
    413 void CL_PlayDemo_f (void);
    414 void CL_TimeDemo_f (void);
    415 
    416 //
    417 // cl_parse.c
    418 //
    419 #define NET_TIMINGS 256
    420 #define NET_TIMINGSMASK 255
    421 extern int	packet_latency[NET_TIMINGS];
    422 int CL_CalcNet (void);
    423 void CL_ParseServerMessage (void);
    424 void CL_NewTranslation (int slot);
    425 qboolean	CL_CheckOrDownloadFile (char *filename);
    426 qboolean CL_IsUploading(void);
    427 void CL_NextUpload(void);
    428 void CL_StartUpload (byte *data, int size);
    429 void CL_StopUpload(void);
    430 
    431 //
    432 // view.c
    433 //
    434 void V_StartPitchDrift (void);
    435 void V_StopPitchDrift (void);
    436 
    437 void V_RenderView (void);
    438 void V_UpdatePalette (void);
    439 void V_Register (void);
    440 void V_ParseDamage (void);
    441 void V_SetContentsColor (int contents);
    442 void V_CalcBlend (void);
    443 
    444 
    445 //
    446 // cl_tent
    447 //
    448 void CL_InitTEnts (void);
    449 void CL_ClearTEnts (void);
    450 
    451 //
    452 // cl_ents.c
    453 //
    454 void CL_SetSolidPlayers (int playernum);
    455 void CL_SetUpPlayerPrediction(qboolean dopred);
    456 void CL_EmitEntities (void);
    457 void CL_ClearProjectiles (void);
    458 void CL_ParseProjectiles (void);
    459 void CL_ParsePacketEntities (qboolean delta);
    460 void CL_SetSolidEntities (void);
    461 void CL_ParsePlayerinfo (void);
    462 
    463 //
    464 // cl_pred.c
    465 //
    466 void CL_InitPrediction (void);
    467 void CL_PredictMove (void);
    468 void CL_PredictUsercmd (player_state_t *from, player_state_t *to, usercmd_t *u, qboolean spectator);
    469 
    470 //
    471 // cl_cam.c
    472 //
    473 #define CAM_NONE	0
    474 #define CAM_TRACK	1
    475 
    476 extern	int		autocam;
    477 extern int spec_track; // player# of who we are tracking
    478 
    479 qboolean Cam_DrawViewModel(void);
    480 qboolean Cam_DrawPlayer(int playernum);
    481 void Cam_Track(usercmd_t *cmd);
    482 void Cam_FinishMove(usercmd_t *cmd);
    483 void Cam_Reset(void);
    484 void CL_InitCam(void);
    485 
    486 //
    487 // skin.c
    488 //
    489 
    490 typedef struct
    491 {
    492     char	manufacturer;
    493     char	version;
    494     char	encoding;
    495     char	bits_per_pixel;
    496     unsigned short	xmin,ymin,xmax,ymax;
    497     unsigned short	hres,vres;
    498     unsigned char	palette[48];
    499     char	reserved;
    500     char	color_planes;
    501     unsigned short	bytes_per_line;
    502     unsigned short	palette_type;
    503     char	filler[58];
    504     unsigned char	data;			// unbounded
    505 } pcx_t;
    506 
    507 
    508 void	Skin_Find (player_info_t *sc);
    509 byte	*Skin_Cache (skin_t *skin);
    510 void	Skin_Skins_f (void);
    511 void	Skin_AllSkins_f (void);
    512 void	Skin_NextDownload (void);
    513 
    514 #define RSSHOT_WIDTH 320
    515 #define RSSHOT_HEIGHT 200
    516