• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 typedef struct
23 {
24 	vec3_t	viewangles;
25 
26 // intended velocities
27 	float	forwardmove;
28 	float	sidemove;
29 	float	upmove;
30 #ifdef QUAKE2
31 	byte	lightlevel;
32 #endif
33 } usercmd_t;
34 
35 typedef struct
36 {
37 	int		length;
38 	char	map[MAX_STYLESTRING];
39 } lightstyle_t;
40 
41 typedef struct
42 {
43 	char	name[MAX_SCOREBOARDNAME];
44 	float	entertime;
45 	int		frags;
46 	int		colors;			// two 4 bit fields
47 	byte	translations[VID_GRADES*256];
48 } scoreboard_t;
49 
50 typedef struct
51 {
52 	int		destcolor[3];
53 	int		percent;		// 0-256
54 } cshift_t;
55 
56 #define	CSHIFT_CONTENTS	0
57 #define	CSHIFT_DAMAGE	1
58 #define	CSHIFT_BONUS	2
59 #define	CSHIFT_POWERUP	3
60 #define	NUM_CSHIFTS		4
61 
62 #define	NAME_LENGTH	64
63 
64 
65 //
66 // client_state_t should hold all pieces of the client state
67 //
68 
69 #define	SIGNONS		4			// signon messages to receive before connected
70 
71 #define	MAX_DLIGHTS		32
72 typedef struct
73 {
74 	vec3_t	origin;
75 	float	radius;
76 	float	die;				// stop lighting after this time
77 	float	decay;				// drop this each second
78 	float	minlight;			// don't add when contributing less
79 	int		key;
80 #ifdef QUAKE2
81 	qboolean	dark;			// subtracts light instead of adding
82 #endif
83 } dlight_t;
84 
85 
86 #define	MAX_BEAMS	24
87 typedef struct
88 {
89 	int		entity;
90 	struct model_s	*model;
91 	float	endtime;
92 	vec3_t	start, end;
93 } beam_t;
94 
95 #define	MAX_EFRAGS		640
96 
97 #define	MAX_MAPSTRING	2048
98 #define	MAX_DEMOS		8
99 #define	MAX_DEMONAME	16
100 
101 typedef enum {
102 ca_dedicated, 		// a dedicated server with no ability to start a client
103 ca_disconnected, 	// full screen console with no connection
104 ca_connected,		// valid netcon, talking to a server
105 cactive_t_max = 1 << 30
106 } cactive_t;
107 
108 //
109 // the client_static_t structure is persistant through an arbitrary number
110 // of server connections
111 //
112 typedef struct
113 {
114 	cactive_t	state;
115 
116 // personalization data sent to server
117 	char		mapstring[MAX_QPATH];
118 	char		spawnparms[MAX_MAPSTRING];	// to restart a level
119 
120 // demo loop control
121 	int			demonum;		// -1 = don't play demos
122 	char		demos[MAX_DEMOS][MAX_DEMONAME];		// when not playing
123 
124 // demo recording info must be here, because record is started before
125 // entering a map (and clearing client_state_t)
126 	qboolean	demorecording;
127 	qboolean	demoplayback;
128 	qboolean	timedemo;
129 	int			forcetrack;			// -1 = use normal cd track
130 	FILE		*demofile;
131 	int			td_lastframe;		// to meter out one message a frame
132 	int			td_startframe;		// host_framecount at start
133 	float		td_starttime;		// realtime at second frame of timedemo
134 
135 
136 // connection information
137 	int			signon;			// 0 to SIGNONS
138 	struct qsocket_s	*netcon;
139 	sizebuf_t	message;		// writing buffer to send to server
140 
141 } client_static_t;
142 
143 extern client_static_t	cls;
144 
145 //
146 // the client_state_t structure is wiped completely at every
147 // server signon
148 //
149 typedef struct
150 {
151 	int			movemessages;	// since connecting to this server
152 								// throw out the first couple, so the player
153 								// doesn't accidentally do something the
154 								// first frame
155 	usercmd_t	cmd;			// last command sent to the server
156 
157 // information for local display
158 	int			stats[MAX_CL_STATS];	// health, etc
159 	int			items;			// inventory bit flags
160 	float	item_gettime[32];	// cl.time of aquiring item, for blinking
161 	float		faceanimtime;	// use anim frame if cl.time < this
162 
163 	cshift_t	cshifts[NUM_CSHIFTS];	// color shifts for damage, powerups
164 	cshift_t	prev_cshifts[NUM_CSHIFTS];	// and content types
165 
166 // the client maintains its own idea of view angles, which are
167 // sent to the server each frame.  The server sets punchangle when
168 // the view is temporarliy offset, and an angle reset commands at the start
169 // of each level and after teleporting.
170 	vec3_t		mviewangles[2];	// during demo playback viewangles is lerped
171 								// between these
172 	vec3_t		viewangles;
173 
174 	vec3_t		mvelocity[2];	// update by server, used for lean+bob
175 								// (0 is newest)
176 	vec3_t		velocity;		// lerped between mvelocity[0] and [1]
177 
178 	vec3_t		punchangle;		// temporary offset
179 
180 // pitch drifting vars
181 	float		idealpitch;
182 	float		pitchvel;
183 	qboolean	nodrift;
184 	float		driftmove;
185 	double		laststop;
186 
187 	float		viewheight;
188 	float		crouch;			// local amount for smoothing stepups
189 
190 	qboolean	paused;			// send over by server
191 	qboolean	onground;
192 	qboolean	inwater;
193 
194 	int			intermission;	// don't change view angle, full screen, etc
195 	int			completed_time;	// latched at intermission start
196 
197 	double		mtime[2];		// the timestamp of last two messages
198 	double		time;			// clients view of time, should be between
199 								// servertime and oldservertime to generate
200 								// a lerp point for other data
201 	double		oldtime;		// previous cl.time, time-oldtime is used
202 								// to decay light values and smooth step ups
203 
204 
205 	float		last_received_message;	// (realtime) for net trouble icon
206 
207 //
208 // information that is static for the entire time connected to a server
209 //
210 	struct model_s		*model_precache[MAX_MODELS];
211 	struct sfx_s		*sound_precache[MAX_SOUNDS];
212 
213 	char		levelname[40];	// for display on solo scoreboard
214 	int			viewentity;		// cl_entitites[cl.viewentity] = player
215 	int			maxclients;
216 	int			gametype;
217 
218 // refresh related state
219 	struct model_s	*worldmodel;	// cl_entitites[0].model
220 	struct efrag_s	*free_efrags;
221 	int			num_entities;	// held in cl_entities array
222 	int			num_statics;	// held in cl_staticentities array
223 	entity_t	viewent;			// the gun model
224 
225 	int			cdtrack, looptrack;	// cd audio
226 
227 // frag scoreboard
228 	scoreboard_t	*scores;		// [cl.maxclients]
229 
230 #ifdef QUAKE2
231 // light level at player's position including dlights
232 // this is sent back to the server each frame
233 // architectually ugly but it works
234 	int			light_level;
235 #endif
236 } client_state_t;
237 
238 
239 //
240 // cvars
241 //
242 extern	cvar_t	cl_name;
243 extern	cvar_t	cl_color;
244 
245 extern	cvar_t	cl_upspeed;
246 extern	cvar_t	cl_forwardspeed;
247 extern	cvar_t	cl_backspeed;
248 extern	cvar_t	cl_sidespeed;
249 
250 extern	cvar_t	cl_movespeedkey;
251 
252 extern	cvar_t	cl_yawspeed;
253 extern	cvar_t	cl_pitchspeed;
254 
255 extern	cvar_t	cl_anglespeedkey;
256 
257 extern	cvar_t	cl_autofire;
258 
259 extern	cvar_t	cl_shownet;
260 extern	cvar_t	cl_nolerp;
261 
262 extern	cvar_t	cl_pitchdriftspeed;
263 extern	cvar_t	lookspring;
264 extern	cvar_t	lookstrafe;
265 extern	cvar_t	sensitivity;
266 
267 extern	cvar_t	m_pitch;
268 extern	cvar_t	m_yaw;
269 extern	cvar_t	m_forward;
270 extern	cvar_t	m_side;
271 
272 
273 #define	MAX_TEMP_ENTITIES	64			// lightning bolts, etc
274 #define	MAX_STATIC_ENTITIES	128			// torches, etc
275 
276 extern	client_state_t	cl;
277 
278 // FIXME, allocate dynamically
279 extern	efrag_t			cl_efrags[MAX_EFRAGS];
280 extern	entity_t		cl_entities[MAX_EDICTS];
281 extern	entity_t		cl_static_entities[MAX_STATIC_ENTITIES];
282 extern	lightstyle_t	cl_lightstyle[MAX_LIGHTSTYLES];
283 extern	dlight_t		cl_dlights[MAX_DLIGHTS];
284 extern	entity_t		cl_temp_entities[MAX_TEMP_ENTITIES];
285 extern	beam_t			cl_beams[MAX_BEAMS];
286 
287 //=============================================================================
288 
289 //
290 // cl_main
291 //
292 dlight_t *CL_AllocDlight (int key);
293 void	CL_DecayLights (void);
294 
295 void CL_Init (void);
296 
297 void CL_EstablishConnection (const char *host);
298 void CL_Signon1 (void);
299 void CL_Signon2 (void);
300 void CL_Signon3 (void);
301 void CL_Signon4 (void);
302 
303 void CL_Disconnect (void);
304 void CL_Disconnect_f (void);
305 void CL_NextDemo (void);
306 
307 #define			MAX_VISEDICTS	256
308 extern	int				cl_numvisedicts;
309 extern	entity_t		*cl_visedicts[MAX_VISEDICTS];
310 
311 //
312 // cl_input
313 //
314 typedef struct
315 {
316 	int		down[2];		// key nums holding it down
317 	int		state;			// low bit is down state
318 } kbutton_t;
319 
320 extern	kbutton_t	in_mlook, in_klook;
321 extern 	kbutton_t 	in_strafe;
322 extern 	kbutton_t 	in_speed;
323 
324 void CL_InitInput (void);
325 void CL_SendCmd (void);
326 void CL_SendMove (usercmd_t *cmd);
327 
328 void CL_ParseTEnt (void);
329 void CL_UpdateTEnts (void);
330 
331 void CL_ClearState (void);
332 
333 
334 int  CL_ReadFromServer (void);
335 void CL_WriteToServer (usercmd_t *cmd);
336 void CL_BaseMove (usercmd_t *cmd);
337 
338 
339 float CL_KeyState (kbutton_t *key);
340 const char *Key_KeynumToString (int keynum);
341 
342 //
343 // cl_demo.c
344 //
345 void CL_StopPlayback (void);
346 int CL_GetMessage (void);
347 
348 void CL_Stop_f (void);
349 void CL_Record_f (void);
350 void CL_PlayDemo_f (void);
351 void CL_TimeDemo_f (void);
352 
353 //
354 // cl_parse.c
355 //
356 void CL_ParseServerMessage (void);
357 void CL_NewTranslation (int slot);
358 
359 //
360 // view
361 //
362 void V_StartPitchDrift (void);
363 void V_StopPitchDrift (void);
364 
365 void V_RenderView (void);
366 void V_UpdatePalette (void);
367 void V_Register (void);
368 void V_ParseDamage (void);
369 void V_SetContentsColor (int contents);
370 
371 
372 //
373 // cl_tent
374 //
375 void CL_InitTEnts (void);
376 void CL_SignonReply (void);
377