1 /*
2 Copyright (C) 1997-2001 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 // g_local.h -- local definitions for game module
21 
22 #include "q_shared.h"
23 
24 // define GAME_INCLUDE so that game.h does not define the
25 // short, server-visible gclient_t and edict_t structures,
26 // because we define the full size ones in this file
27 #define	GAME_INCLUDE
28 #include "game.h"
29 
30 // the "gameversion" client command will print this plus compile date
31 #define	GAMEVERSION	"data1"
32 
33 // protocol bytes that can be directly added to messages
34 #define	svc_muzzleflash		1
35 #define	svc_muzzleflash2	2
36 #define	svc_temp_entity		3
37 #define	svc_layout			4
38 #define	svc_inventory		5
39 #define svc_nop				6
40 #define	svc_stufftext		11
41 
42 //==================================================================
43 
44 // view pitching times
45 #define DAMAGE_TIME		0.5
46 #define	FALL_TIME		0.3
47 
48 
49 // edict->spawnflags
50 // these are set with checkboxes on each entity in the map editor
51 #define	SPAWNFLAG_NOT_EASY			0x00000100
52 #define	SPAWNFLAG_NOT_MEDIUM		0x00000200
53 #define	SPAWNFLAG_NOT_HARD			0x00000400
54 #define	SPAWNFLAG_NOT_DEATHMATCH	0x00000800
55 
56 // edict->flags
57 #define	FL_FLY					0x00000001
58 #define	FL_SWIM					0x00000002	// implied immunity to drowining
59 #define FL_IMMUNE_LASER			0x00000004
60 #define	FL_INWATER				0x00000008
61 #define	FL_GODMODE				0x00000010
62 #define	FL_NOTARGET				0x00000020
63 #define FL_IMMUNE_SLIME			0x00000040
64 #define FL_IMMUNE_LAVA			0x00000080
65 #define	FL_PARTIALGROUND		0x00000100	// not all corners are valid
66 #define	FL_WATERJUMP			0x00000200	// player jumping out of water
67 #define	FL_TEAMSLAVE			0x00000400	// not the first on the team
68 #define FL_NO_KNOCKBACK			0x00000800
69 #define FL_POWER_ARMOR			0x00001000	// power armor (if any) is active
70 #define FL_RESPAWN				0x80000000	// used for item respawning
71 
72 
73 #define	FRAMETIME		0.1
74 
75 //unlagged - true ping
76 #define NUM_PING_SAMPLES 64
77 //unlagged - true ping
78 
79 // memory tags to allow dynamic memory to be cleaned up
80 #define	TAG_GAME	765		// clear when unloading the dll
81 #define	TAG_LEVEL	766		// clear when loading a new level
82 
83 
84 #define MELEE_DISTANCE	80
85 
86 // Anti-camp defaults
87 /** @brief Default anti-camp frames
88  *
89  * Default value for the ac_frames anti-camp CVar.
90  */
91 #define G_ANTICAMP_FRAMES	30
92 
93 /** @brief Default anti-camp threshold
94  *
95  * Default value for the ac_threshold anti-camp CVar.
96  */
97 #define G_ANTICAMP_THRESHOLD	100
98 
99 
100 #define BODY_QUEUE_SIZE		8
101 
102 typedef enum
103 {
104 	DAMAGE_NO,
105 	DAMAGE_YES,			// will take damage if hit
106 	DAMAGE_AIM			// auto targeting recognizes this
107 } damage_t;
108 
109 typedef enum
110 {
111 	WEAPON_READY,
112 	WEAPON_ACTIVATING,
113 	WEAPON_DROPPING,
114 	WEAPON_FIRING
115 } weaponstate_t;
116 
117 typedef enum
118 {
119 	AMMO_BULLETS,
120 	AMMO_SHELLS,
121 	AMMO_ROCKETS,
122 	AMMO_GRENADES,
123 	AMMO_CELLS,
124 	AMMO_SLUGS,
125 	AMMO_SEEKERS,
126 	AMMO_BOMBS
127 } ammo_t;
128 
129 //teams
130 typedef struct teamcensus_s
131 { // see p_client.c::TeamCensus()
132 	int total;
133 	int real;
134 	int bots;
135 	int red;
136 	int blue;
137 	int real_red;
138 	int real_blue;
139 	int bots_red;
140 	int bots_blue;
141 	int team_for_real;
142 	int team_for_bot;
143 } teamcensus_t;
144 
145 #define TEAM_GAME ( (dmflags->integer & (DF_SKINTEAMS)) \
146 		|| ctf->integer || tca->integer || cp->integer )
147 
148 //clientinfo origins
149 #define INGAME					0
150 #define SPAWN					1
151 #define CONNECT					2
152 
153 //deadflag
154 #define DEAD_NO					0
155 #define DEAD_DYING				1
156 #define DEAD_DEAD				2
157 #define DEAD_RESPAWNABLE		3
158 
159 //range
160 #define RANGE_MELEE				0
161 #define RANGE_NEAR				1
162 #define RANGE_MID				2
163 #define RANGE_FAR				3
164 
165 //gib types
166 #define GIB_ORGANIC				0
167 #define GIB_METALLIC			1
168 
169 //monster ai flags
170 #define AI_STAND_GROUND			0x00000001
171 #define AI_TEMP_STAND_GROUND	0x00000002
172 #define AI_SOUND_TARGET			0x00000004
173 #define AI_LOST_SIGHT			0x00000008
174 #define AI_PURSUIT_LAST_SEEN	0x00000010
175 #define AI_PURSUE_NEXT			0x00000020
176 #define AI_PURSUE_TEMP			0x00000040
177 #define AI_HOLD_FRAME			0x00000080
178 #define AI_GOOD_GUY				0x00000100
179 #define AI_BRUTAL				0x00000200
180 #define AI_NOSTEP				0x00000400
181 #define AI_DUCKED				0x00000800
182 #define AI_COMBAT_POINT			0x00001000
183 #define AI_MEDIC				0x00002000
184 #define AI_RESURRECTING			0x00004000
185 #define AI_NPC					0x00008000	// FIXME: use AI_GOOD_GUY instead?
186 
187 //monster attack state
188 #define AS_STRAIGHT				1
189 #define AS_SLIDING				2
190 #define	AS_MELEE				3
191 #define	AS_MISSILE				4
192 
193 // armor types
194 #define ARMOR_NONE				0
195 #define ARMOR_JACKET			1
196 #define ARMOR_COMBAT			2
197 #define ARMOR_BODY				3
198 #define ARMOR_SHARD				4
199 
200 // handedness values
201 #define RIGHT_HANDED			0
202 #define LEFT_HANDED				1
203 #define CENTER_HANDED			2
204 
205 
206 // game.serverflags values
207 #define SFL_CROSS_TRIGGER_1		0x00000001
208 #define SFL_CROSS_TRIGGER_2		0x00000002
209 #define SFL_CROSS_TRIGGER_3		0x00000004
210 #define SFL_CROSS_TRIGGER_4		0x00000008
211 #define SFL_CROSS_TRIGGER_5		0x00000010
212 #define SFL_CROSS_TRIGGER_6		0x00000020
213 #define SFL_CROSS_TRIGGER_7		0x00000040
214 #define SFL_CROSS_TRIGGER_8		0x00000080
215 #define SFL_CROSS_TRIGGER_MASK	0x000000ff
216 
217 
218 // noise types for PlayerNoise
219 #define PNOISE_SELF				0
220 #define PNOISE_WEAPON			1
221 #define PNOISE_IMPACT			2
222 
223 
224 // edict->movetype values
225 typedef enum
226 {
227 MOVETYPE_NONE,			// never moves
228 MOVETYPE_NOCLIP,		// origin and angles change with no interaction
229 MOVETYPE_PUSH,			// no clip to world, push on box contact
230 MOVETYPE_STOP,			// no clip to world, stops on box contact
231 
232 MOVETYPE_WALK,			// gravity
233 MOVETYPE_STEP,			// gravity, special edge handling
234 MOVETYPE_FLY,
235 MOVETYPE_TOSS,			// gravity
236 MOVETYPE_FLYMISSILE,	// extra size to monsters
237 MOVETYPE_BOUNCE
238 } movetype_t;
239 
240 
241 typedef struct
242 {
243 	char	command[128]; //limit to prevent malicious buffer overflows
244 	int		yay;
245 	int		nay;
246 	float	starttime;
247 	float	time;
248 	qboolean called;
249 } g_vote_t;
250 
251 typedef struct
252 {
253 	int		base_count;
254 	int		max_count;
255 	float	normal_protection;
256 	float	energy_protection;
257 	int		armor;
258 } gitem_armor_t;
259 
260 
261 // gitem_t->flags
262 #define	IT_WEAPON		1		// use makes active weapon
263 #define	IT_AMMO			2
264 #define IT_ARMOR		4
265 #define IT_KEY			8
266 #define IT_POWERUP		16
267 #define IT_HEALTH		32
268 
269 //to do - add alteria items - will require a number of other changes, particularly in bot code as well
270 // gitem_t->weapmodel for weapons indicates model index
271 #define WEAP_BLASTER			1
272 #define WEAP_SMARTGUN			2
273 #define WEAP_CHAINGUN			3
274 #define WEAP_GRAPPLE			4
275 #define WEAP_FLAMETHROWER		5
276 #define WEAP_ROCKETLAUNCHER		8
277 #define WEAP_DISRUPTOR			9
278 #define WEAP_BEAMGUN			10
279 #define WEAP_VAPORIZER			11
280 #define WEAP_VIOLATOR			12
281 #define WEAP_MINDERASER			13
282 #define WEAP_BOMBER				14
283 #define WEAP_STRAFER			15
284 #define WEAP_DEATHBALL			16
285 #define WEAP_HOVER				17
286 #define WEAP_ABOMB				18
287 #define WEAP_HBOMB				19
288 
289 typedef struct gitem_s
290 {
291 	char		*classname;	// spawning name
292 	qboolean	(*pickup)(struct edict_s *ent, struct edict_s *other);
293 	void		(*use)(struct edict_s *ent, struct gitem_s *item);
294 	void		(*drop)(struct edict_s *ent, struct gitem_s *item);
295 	void		(*weaponthink)(struct edict_s *ent);
296 	char		*pickup_sound;
297 	char		*world_model;
298 	int			world_model_flags;
299 	char		*view_model;
300 
301 	// client side info
302 	char		*icon;
303 	char		*pickup_name;	// for printing on pickup
304 	int			count_width;		// number of digits to display by icon
305 
306 	int			quantity;		// for ammo how much, for weapons how much is used per shot
307 	char		*ammo;			// for weapons
308 	int			flags;			// IT_* flags
309 
310 	int			weapmodel;		// weapon model index (for weapons)
311 
312 	void		*info;
313 	int			tag;
314 
315 	char		*precaches;		// string of all models, sounds, and images this item will use
316 } gitem_t;
317 
318 //
319 // this structure is left intact through an entire game
320 // it should be initialized at dll load time, and read/written to
321 // the server.ssv file for savegames
322 //
323 typedef struct
324 {
325 	char		helpmessage1[512];
326 	char		helpmessage2[512];
327 	int			helpchanged;	// flash F1 icon if non 0, play sound
328 								// and increment only if 1, 2, or 3
329 
330 	gclient_t	*clients;		// [maxclients]
331 
332 	// store latched cvars here that we want to get at often
333 	int			maxclients;
334 	int			maxentities;
335 
336 	// cross level triggers
337 	int			serverflags;
338 
339 	// items
340 	int			num_items;
341 
342 	qboolean	autosaved;
343 } game_locals_t;
344 
345 //
346 // this structure is cleared as each map is entered
347 // it is read/written to the level.sav file for savegames
348 //
349 typedef struct
350 {
351 	int			framenum;
352 	float		time;
353 	int			previousTime; //in milleseconds
354 
355 	char		level_name[MAX_QPATH];	// the descriptive name (Outer Base, etc)
356 	char		mapname[MAX_QPATH];		// the server name (base1, etc)
357 	char		nextmap[MAX_QPATH];		// go here when fraglimit is hit
358 
359 	// intermission state
360 	float		intermissiontime;		// time the intermission was started
361 	char		*changemap;
362 	int			exitintermission;
363 	vec3_t		intermission_origin;
364 	vec3_t		intermission_angle;
365 
366 	edict_t		*sight_client;	// changed once each frame for coop games
367 
368 	edict_t		*sight_entity;
369 	int			sight_entity_framenum;
370 	edict_t		*sound_entity;
371 	int			sound_entity_framenum;
372 	edict_t		*sound2_entity;
373 	int			sound2_entity_framenum;
374 
375 	int			pic_health;
376 
377 	int			total_secrets;
378 	int			found_secrets;
379 
380 	int			total_goals;
381 	int			found_goals;
382 
383 	int			total_monsters;
384 	int			killed_monsters;
385 
386 	edict_t		*current_entity;	// entity running from G_RunFrame
387 	int			body_que;			// dead bodies
388 
389 	//unlagged - backward reconciliation #4
390 	// actual time this server frame started
391 	float		frameStartTime;
392 	//unlagged - backward reconciliation #4
393 
394 } level_locals_t;
395 
396 // spawn_temp_t is only used to hold entity field values that
397 // can be set from the editor, but aren't actualy present
398 // in edict_t during gameplay
399 typedef struct
400 {
401 	// world vars
402 	char		*sky;
403 	float		skyrotate;
404 	vec3_t		skyaxis;
405 	char		*nextmap;
406 
407 	int			lip;
408 	int			distance;
409 	int			height;
410 	char		*noise;
411 	float		pausetime;
412 	char		*item;
413 	char		*gravity;
414 
415 	float		minyaw;
416 	float		maxyaw;
417 	float		minpitch;
418 	float		maxpitch;
419 } spawn_temp_t;
420 
421 typedef struct
422 {
423 	// fixed data
424 	vec3_t		start_origin;
425 	vec3_t		start_angles;
426 	vec3_t		end_origin;
427 	vec3_t		end_angles;
428 
429 	int			sound_start;
430 	int			sound_middle;
431 	int			sound_end;
432 
433 	float		accel;
434 	float		speed;
435 	float		decel;
436 	float		distance;
437 
438 	float		wait;
439 
440 	// state data
441 	int			state;
442 	vec3_t		dir;
443 	float		current_speed;
444 	float		move_speed;
445 	float		next_speed;
446 	float		remaining_distance;
447 	float		decel_distance;
448 	void		(*endfunc)(edict_t *);
449 } moveinfo_t;
450 
451 typedef struct
452 {
453 	void	(*aifunc)(edict_t *self, float dist);
454 	float	dist;
455 	void	(*thinkfunc)(edict_t *self);
456 } mframe_t;
457 
458 typedef struct
459 {
460 	int			firstframe;
461 	int			lastframe;
462 	mframe_t	*frame;
463 	void		(*endfunc)(edict_t *self);
464 } mmove_t;
465 
466 typedef struct
467 {
468 	mmove_t		*currentmove;
469 	int			aiflags;
470 	int			nextframe;
471 	float		scale;
472 
473 	void		(*stand)(edict_t *self);
474 	void		(*idle)(edict_t *self);
475 	void		(*search)(edict_t *self);
476 	void		(*walk)(edict_t *self);
477 	void		(*run)(edict_t *self);
478 	void		(*dodge)(edict_t *self, edict_t *other, float eta);
479 	void		(*attack)(edict_t *self);
480 	void		(*melee)(edict_t *self);
481 	void		(*sight)(edict_t *self, edict_t *other);
482 	qboolean	(*checkattack)(edict_t *self);
483 
484 	float		pausetime;
485 	float		attack_finished;
486 
487 	vec3_t		saved_goal;
488 	float		search_time;
489 	float		trail_time;
490 	vec3_t		last_sighting;
491 	int			attack_state;
492 	int			lefty;
493 	float		idle_time;
494 	int			linkcount;
495 
496 } monsterinfo_t;
497 
498 //tactical
499 typedef struct
500 {
501 	qboolean alienComputer;
502 	int		 alienComputerHealth;
503 	qboolean alienPowerSource;
504 	int		 alienPowerSourceHealth;
505 	qboolean alienAmmoDepot;
506 	int		 alienAmmoDepotHealth;
507 	qboolean alienBackupGen;
508 
509 	qboolean humanComputer;
510 	int		 humanComputerHealth;
511 	qboolean humanPowerSource;
512 	int		 humanPowerSourceHealth;
513 	qboolean humanAmmoDepot;
514 	int		 humanAmmoDepotHealth;
515 	qboolean humanBackupGen;
516 
517 } tactical_t;
518 
519 extern	game_locals_t	game;
520 extern	level_locals_t	level;
521 extern	game_import_t	gi;
522 extern	game_export_t	globals;
523 extern	spawn_temp_t	st;
524 extern	g_vote_t		playervote;
525 extern  tactical_t		tacticalScore;
526 
527 extern	int	sm_meat_index;
528 
529 extern  int red_team_score;
530 extern  int blue_team_score;
531 extern	int	red_team_matches; //for tca
532 extern	int	blue_team_matches; //for tca
533 extern  int reddiff;
534 extern	int bluediff;
535 extern	int redwinning;
536 extern	int print1;
537 extern  int print2;
538 extern  int print3;
539 
540 // means of death
541 #define MOD_UNKNOWN			0
542 #define MOD_BLASTER			1
543 #define MOD_VIOLATOR		2
544 #define MOD_CGALTFIRE		3
545 #define MOD_CHAINGUN		5
546 #define MOD_FLAME			6
547 #define MOD_ROCKET			8
548 #define MOD_R_SPLASH		9
549 #define MOD_BEAMGUN			10
550 #define MOD_DISRUPTOR		11
551 #define MOD_SMARTGUN		12
552 #define MOD_VAPORIZER		13
553 #define MOD_VAPORALTFIRE	14
554 #define MOD_PLASMA_SPLASH	16
555 #define MOD_WATER			17
556 #define MOD_SLIME			18
557 #define MOD_LAVA			19
558 #define MOD_CRUSH			20
559 #define MOD_TELEFRAG		21
560 #define MOD_FALLING			22
561 #define MOD_SUICIDE			23
562 #define MOD_CAMPING     	24
563 #define MOD_EXPLOSIVE		25
564 #define MOD_BARREL			26
565 #define MOD_BOMB			27
566 #define MOD_EXIT			28
567 #define MOD_SPLASH			29
568 #define MOD_TARGET_LASER	30
569 #define MOD_TRIGGER_HURT	31
570 #define MOD_DEATHRAY		32
571 #define MOD_TARGET_BLASTER	33
572 #define MOD_GRAPPLE			34
573 #define MOD_HEADSHOT		35
574 #define MOD_MINDERASER		36
575 #define MOD_SPIDER			37
576 #define MOD_FRIENDLY_FIRE   0x8000000
577 
578 extern	int	meansOfDeath;
579 
580 extern	edict_t			*g_edicts;
581 
582 #define FOFS(x)(ptrdiff_t)&(((edict_t *)0)->x)
583 #define STOFS(x)(ptrdiff_t)&(((spawn_temp_t *)0)->x)
584 #define LLOFS(x)(ptrdiff_t)&(((level_locals_t *)0)->x)
585 #define CLOFS(x)(ptrdiff_t)&(((gclient_t *)0)->x)
586 
587 #define random() ((rand() & 0x7fff) / ((float)0x7fff))
588 #define crandom() (2.0 * (random() - 0.5))
589 
590 extern	cvar_t	*maxentities;
591 extern	cvar_t	*deathmatch;
592 extern  cvar_t  *ctf;
593 extern  cvar_t  *tca;
594 extern  cvar_t  *cp;
595 extern	cvar_t	*dmflags;
596 extern	cvar_t	*skill;
597 extern	cvar_t	*fraglimit;
598 extern	cvar_t	*timelimit;
599 extern	cvar_t	*password;
600 extern	cvar_t	*spectator_password;
601 extern	cvar_t	*needpass;
602 extern	cvar_t	*g_select_empty;
603 extern	cvar_t	*g_dedicated;
604 extern	cvar_t	*motdfile;
605 extern	cvar_t	*motdforce;
606 
607 extern	cvar_t	*filterban;
608 
609 extern	cvar_t	*sv_gravity;
610 extern	cvar_t	*sv_maxvelocity;
611 
612 extern	cvar_t	*gun_x, *gun_y, *gun_z;
613 extern	cvar_t	*sv_rollspeed;
614 extern	cvar_t	*sv_rollangle;
615 
616 extern	cvar_t	*run_pitch;
617 extern	cvar_t	*run_roll;
618 extern	cvar_t	*bob_up;
619 extern	cvar_t	*bob_pitch;
620 extern	cvar_t	*bob_roll;
621 
622 extern	cvar_t	*sv_cheats;
623 extern	cvar_t	*g_maxclients;
624 extern	cvar_t	*maxspectators;
625 
626 extern	cvar_t	*flood_msgs;
627 extern	cvar_t	*flood_persecond;
628 extern	cvar_t	*flood_waitdelay;
629 
630 extern	cvar_t	*sv_maplist;
631 
632 extern  cvar_t  *g_background_music;
633 
634 extern  cvar_t  *sv_botkickthreshold;
635 extern  cvar_t	*sv_custombots;
636 
637 //mutators
638 extern  cvar_t  *instagib;
639 extern  cvar_t  *rocket_arena;
640 extern  cvar_t *insta_rockets;
641 extern  cvar_t  *low_grav;
642 extern  cvar_t  *regeneration;
643 extern  cvar_t  *vampire;
644 extern  cvar_t  *excessive;
645 extern  cvar_t  *grapple;
646 extern  cvar_t  *classbased;
647 
648 //duel mode
649 extern	cvar_t	*g_duel;
650 
651 //tactical mode
652 extern	cvar_t	*g_tactical;
653 
654 extern	cvar_t	*g_losehealth;
655 extern	cvar_t	*g_losehealth_num;
656 
657 //weapons
658 extern	cvar_t	*wep_selfdmgmulti;
659 
660 //health/max health/max ammo
661 extern	cvar_t	*g_spawnhealth;
662 extern	cvar_t	*g_maxhealth;
663 extern	cvar_t	*g_maxbullets;
664 extern	cvar_t	*g_maxshells;
665 extern	cvar_t	*g_maxrockets;
666 extern	cvar_t	*g_maxgrenades;
667 extern	cvar_t	*g_maxcells;
668 extern	cvar_t	*g_maxslugs;
669 extern	cvar_t	*g_maxseekers;
670 extern  cvar_t	*g_maxbombs;
671 
672 //quick weapon change
673 extern  cvar_t  *quickweap;
674 
675 //anti-camp
676 extern  cvar_t  *anticamp;
677 extern  cvar_t  *camptime;
678 extern  cvar_t	*ac_frames;
679 extern  cvar_t	*ac_threshold;
680 
681 extern	cvar_t  *g_randomquad;
682 
683 //warmup time
684 extern cvar_t   *warmuptime;
685 
686 //spawn protection
687 extern cvar_t   *g_spawnprotect;
688 
689 //jousting
690 extern cvar_t   *joustmode;
691 
692 //map voting
693 extern cvar_t	*g_mapvote;
694 extern cvar_t	*g_voterand;
695 extern cvar_t	*g_votemode;
696 extern cvar_t	*g_votesame;
697 
698 //call voting
699 extern cvar_t	*g_callvote;
700 
701 //forced autobalanced teams
702 extern cvar_t	*g_autobalance;
703 
704 //reward point threshold
705 extern cvar_t	*g_reward;
706 
707 //show player lights for visibility even in non-team games
708 extern cvar_t	*g_dmlights;
709 
710 #define world	(&g_edicts[0])
711 
712 // item spawnflags
713 #define ITEM_TRIGGER_SPAWN		0x00000001
714 #define ITEM_NO_TOUCH			0x00000002
715 // 6 bits reserved for editor flags
716 // 8 bits used as power cube id bits for coop games
717 #define DROPPED_ITEM			0x00010000
718 #define	DROPPED_PLAYER_ITEM		0x00020000
719 #define ITEM_TARGETS_USED		0x00040000
720 
721 //
722 // fields are needed for spawning from the entity string
723 // and saving / loading games
724 //
725 #define FFL_SPAWNTEMP		1
726 #define FFL_NOSPAWN			2
727 
728 typedef enum {
729 	F_INT,
730 	F_FLOAT,
731 	F_LSTRING,			// string on disk, pointer in memory, TAG_LEVEL
732 	F_GSTRING,			// string on disk, pointer in memory, TAG_GAME
733 	F_VECTOR,
734 	F_ANGLEHACK,
735 	F_EDICT,			// index on disk, pointer in memory
736 	F_ITEM,				// index on disk, pointer in memory
737 	F_CLIENT,			// index on disk, pointer in memory
738 	F_FUNCTION,
739 	F_MMOVE,
740 	F_IGNORE
741 } fieldtype_t;
742 
743 typedef struct
744 {
745 	char	*name;
746 	int		ofs;
747 	fieldtype_t	type;
748 	int		flags;
749 } field_t;
750 
751 
752 extern	field_t fields[];
753 extern	gitem_t	itemlist[];
754 
755 //mind eraser globals
756 extern float mindEraserTime;
757 
758 //
759 // g_cmds.c
760 //
761 void Cmd_Score_f (edict_t *ent);
762 void Cmd_VoiceTaunt_f (edict_t *ent);
763 
764 //
765 // g_items.c
766 //
767 void PrecacheItem (gitem_t *it);
768 void InitItems (void);
769 void SetItemNames (void);
770 gitem_t	*FindItem (char *pickup_name);
771 gitem_t	*FindItemByClassname (char *classname);
772 #define	ITEM_INDEX(x) ((x)-itemlist)
773 edict_t *Drop_Item (edict_t *ent, gitem_t *item);
774 void SetRespawn (edict_t *ent, float delay);
775 void ChangeWeapon (edict_t *ent);
776 void SpawnItem (edict_t *ent, gitem_t *item);
777 void DoRespawn (edict_t *ent);
778 void Think_Weapon (edict_t *ent);
779 int ArmorIndex (edict_t *ent);
780 gitem_t	*GetItemByIndex (int index);
781 qboolean Add_Ammo (edict_t *ent, gitem_t *item, int count, qboolean weapon, qboolean dropped);
782 void Touch_Item (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf);
783 
784 //CTF
785 void CTFDeadDropFlag(edict_t *self, edict_t *other);
786 void CTFResetFlag(int team);
787 void CTFEffects(edict_t *player);
788 void CTFScoreboardMessage (edict_t *ent, edict_t *killer, int mapvote);
789 void CTFPrecache(void);
790 void CTFFlagSetup (edict_t *ent);
791 qboolean CTFPickup_Flag (edict_t *ent, edict_t *other);
792 void CTFDrop_Flag(edict_t *ent, gitem_t *item);
793 
794 //Vehicles
795 void Reset_player(edict_t *ent);
796 void Jet_Explosion(edict_t *ent);
797 qboolean Jet_Active(edict_t *ent);
798 void Jet_ApplyJet( edict_t *ent, usercmd_t *ucmd );
799 qboolean Jet_AvoidGround( edict_t *ent );
800 void VehicleDeadDrop(edict_t *self);
801 void VehicleSetup (edict_t *ent);
802 qboolean Get_in_vehicle (edict_t *ent, edict_t *other);
803 void Leave_vehicle(edict_t *ent, gitem_t *item);
804 
805 //deathball
806 void ResetDeathball();
807 void DeadDropDeathball(edict_t *self);
808 void DeathballSetup (edict_t *ent);
809 qboolean Pickup_deathball (edict_t *ent, edict_t *other);
810 void DeathballDrop(edict_t *ent, gitem_t *item);
811 
812 //
813 // g_utils.c
814 //
815 qboolean	KillBox (edict_t *ent);
816 void	G_ProjectSource (vec3_t point, vec3_t distance, vec3_t forward, vec3_t right, vec3_t result);
817 edict_t *G_Find (edict_t *from, int fieldofs, char *match);
818 edict_t *findradius (edict_t *from, vec3_t org, float rad);
819 edict_t *G_PickTarget (char *targetname);
820 void	G_UseTargets (edict_t *ent, edict_t *activator);
821 void	G_SetMovedir (vec3_t angles, vec3_t movedir);
822 
823 void	G_InitEdict (edict_t *e);
824 edict_t	*G_Spawn (void);
825 void	G_FreeEdict (edict_t *e);
826 
827 void	G_TouchTriggers (edict_t *ent);
828 void	G_TouchSolids (edict_t *ent);
829 
830 char	*G_CopyString (const char *in);
831 void	G_CleanPlayerName ( const char *source, char *dest );
832 
833 float	*tv (float x, float y, float z);
834 char	*vtos (vec3_t v);
835 
836 float vectoyaw (vec3_t vec);
837 // void vectoangles (vec3_t vec, vec3_t angles);
838 
839 //
840 // g_combat.c
841 //
842 qboolean OnSameTeam (edict_t *ent1, edict_t *ent2);
843 qboolean CanDamage (edict_t *targ, edict_t *inflictor);
844 void T_Damage (edict_t *targ, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t normal, int damage, int knockback, int dflags, int mod);
845 void T_RadiusDamage (edict_t *inflictor, edict_t *attacker, float damage, edict_t *ignore, float radius, int mod, int weapon);
846 
847 // damage flags
848 #define DAMAGE_RADIUS			0x00000001	// damage was indirect
849 #define DAMAGE_NO_ARMOR			0x00000002	// armour does not protect from this damage
850 #define DAMAGE_ENERGY			0x00000004	// damage is from an energy based weapon
851 #define DAMAGE_NO_KNOCKBACK		0x00000008	// do not affect velocity, just view angles
852 #define DAMAGE_BULLET			0x00000010  // damage is from a bullet (used for ricochets)
853 #define DAMAGE_NO_PROTECTION	0x00000020  // armor, shields, invulnerability, and godmode have no effect
854 
855 #define DEFAULT_BULLET_HSPREAD	300
856 #define DEFAULT_BULLET_VSPREAD	300
857 #define DEFAULT_SHOTGUN_HSPREAD	1000
858 #define DEFAULT_SHOTGUN_VSPREAD	500
859 #define DEFAULT_DEATHMATCH_SHOTGUN_COUNT	12
860 #define DEFAULT_SHOTGUN_COUNT	12
861 #define DEFAULT_SSHOTGUN_COUNT	15
862 
863 //
864 // g_monster.c
865 //
866 void M_droptofloor (edict_t *ent);
867 void monster_think (edict_t *self);
868 void walkmonster_start (edict_t *self);
869 void swimmonster_start (edict_t *self);
870 void flymonster_start (edict_t *self);
871 void AttackFinished (edict_t *self, float time);
872 void monster_death_use (edict_t *self);
873 void M_CatagorizePosition (edict_t *ent);
874 qboolean M_CheckAttack (edict_t *self);
875 void M_FlyCheck (edict_t *self);
876 void M_CheckGround (edict_t *ent);
877 void M_SetEffects (edict_t *ent);
878 
879 //
880 // g_misc.c
881 //
882 void ThrowClientHead (edict_t *self, int damage);
883 void ThrowGib (edict_t *self, char *gibname, int damage, int type, int effects);
884 void BecomeExplosion1 (edict_t *self);
885 
886 //
887 // g_ai.c
888 //
889 void AI_SetSightClient (void);
890 
891 void ai_stand (edict_t *self, float dist);
892 void ai_move (edict_t *self, float dist);
893 void ai_walk (edict_t *self, float dist);
894 void ai_turn (edict_t *self, float dist);
895 void ai_still (edict_t *self, float dist);
896 void ai_run (edict_t *self, float dist);
897 void ai_charge (edict_t *self, float dist);
898 int range (edict_t *self, edict_t *other);
899 
900 void FoundTarget (edict_t *self);
901 qboolean infront (edict_t *self, edict_t *other);
902 qboolean visible (edict_t *self, edict_t *other);
903 qboolean FacingIdeal(edict_t *self);
904 
905 //
906 // g_weapon.c
907 //
908 void ThrowDebris (edict_t *self, char *modelname, float speed, vec3_t origin);
909 void ThrowDebris2 (edict_t *self, char *modelname, float speed, vec3_t origin);
910 
911 #ifdef ALTERIA
912 void fire_punch(edict_t *self, vec3_t start, vec3_t aimdir, int damage);
913 #else
914 void fire_bullet (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int mod);
915 void fire_shotgun (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int count, int mod);
916 void fire_blaster (edict_t *self, vec3_t start, vec3_t muzzle, vec3_t aimdir, int damage, int speed, int effect, qboolean hyper);
917 void fire_rocket (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius, int radius_damage);
918 void fire_homingrocket (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius, int radius_damage);
919 void fire_disruptor (edict_t *self, vec3_t start, vec3_t muzzle, vec3_t aimdir, int damage, int kick);
920 void fire_bomb (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius, int radius_damage, float timer);
921 void fire_blaster_beam (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, qboolean detonate, qboolean alien);
922 void fire_smartgrenade (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius, int radius_damage, float timer);
923 void fire_smartgrenade_alien (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius, int radius_damage, float timer);
924 void fire_flamethrower(edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius);
925 void fire_hover_beam (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, qboolean detonate);
926 void fire_minderaser (edict_t *self, vec3_t start, vec3_t dir, float timer);
927 void fire_spider (edict_t *self, vec3_t start, vec3_t aimdir, int speed);
928 void fire_vaporizer (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick);
929 void fire_blasterball (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int effect, qboolean hyper, qboolean alien);
930 void fire_prox (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius, int radius_damage, float timer);
931 void fire_fireball (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, float damage_radius, int radius_damage);
932 void fire_violator(edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int alt);
933 void fire_tacticalbomb (edict_t *self, vec3_t start, vec3_t aimdir, int speed);
934 #endif
935 
936 //deathball
937 void fire_deathball (edict_t *self, vec3_t start, vec3_t dir, int speed);
938 
939 //grapple
940 typedef enum {
941 	CTF_GRAPPLE_STATE_FLY,
942 	CTF_GRAPPLE_STATE_PULL,
943 	CTF_GRAPPLE_STATE_HANG
944 } ctfgrapplestate_t;
945 
946 #define CTF_GRAPPLE_SPEED					1650 // speed of grapple in flight
947 #define CTF_GRAPPLE_PULL_SPEED				1650	// speed player is pulled at
948 
949 // GRAPPLE
950 void CTFWeapon_Grapple (edict_t *ent);
951 void CTFPlayerResetGrapple(edict_t *ent);
952 void CTFGrapplePull(edict_t *self);
953 void CTFResetGrapple(edict_t *self);
954 
955 //
956 // g_ptrail.c
957 //
958 void PlayerTrail_Init (void);
959 void PlayerTrail_Add (vec3_t spot);
960 void PlayerTrail_New (vec3_t spot);
961 edict_t *PlayerTrail_PickFirst (edict_t *self);
962 edict_t *PlayerTrail_PickNext (edict_t *self);
963 edict_t	*PlayerTrail_LastSpot (void);
964 
965 //
966 // p_client.c
967 //
968 void respawn (edict_t *ent);
969 void BeginIntermission (edict_t *targ);
970 void EndIntermission (void);
971 void PutClientInServer (edict_t *ent);
972 void InitClientPersistant (gclient_t *client);
973 void InitClientResp (gclient_t *client);
974 void InitBodyQue (void);
975 void ClientBeginServerFrame (edict_t *ent);
976 void Q2_FindFile (char *filename, FILE **file);
977 void ClientPlaceInQueue(edict_t *ent);
978 void ClientCheckQueue(edict_t *ent);
979 void MoveClientsDownQueue(edict_t *ent);
980 void SaveClientData (void);
981 void FetchClientEntData (edict_t *ent);
982 void TeamCensus( teamcensus_t* team_census );
983 void ParseClassFile( char *config_file, edict_t *ent );
984 
985 //unlagged - g_unlagged.c
986 void G_ResetHistory( edict_t *ent );
987 void G_StoreHistory( edict_t *ent );
988 void G_TimeShiftAllClients( int time, edict_t *skip );
989 void G_UnTimeShiftAllClients( edict_t *skip );
990 void G_DoTimeShiftFor( edict_t *ent );
991 void G_UndoTimeShiftFor( edict_t *ent );
992 void G_UnTimeShiftClient( edict_t *ent );
993 void G_AntilagProjectile( edict_t *ent );
994 //unlagged - g_unlagged.c
995 
996 //
997 // g_player.c
998 //
999 void player_pain (edict_t *self, edict_t *other, float kick, int damage);
1000 void player_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point);
1001 
1002 //
1003 // g_svcmds.c
1004 //
1005 void	ServerCommand (void);
1006 qboolean SV_FilterPacket (char *from);
1007 
1008 //
1009 // p_view.c
1010 //
1011 void ClientEndServerFrame (edict_t *ent);
1012 
1013 //
1014 // p_hud.c
1015 //
1016 void MoveClientToIntermission (edict_t *client);
1017 void G_UpdateStats (edict_t *ent);
1018 void ValidateSelectedItem (edict_t *ent);
1019 void DeathmatchScoreboardMessage (edict_t *client, edict_t *killer, int mapvote);
1020 
1021 //
1022 // p_weapon.c
1023 //
1024 void P_ProjectSource (gclient_t *client, vec3_t point, vec3_t distance, vec3_t forward, vec3_t right, vec3_t result);
1025 void Weapon_Generic (edict_t *ent, int FRAME_ACTIVATE_LAST, int FRAME_FIRE_LAST, int FRAME_IDLE_LAST, int FRAME_DEACTIVATE_LAST, int *pause_frames, int *fire_frames, void (*fire)(edict_t *ent));
1026 void PlayerNoise(edict_t *who, vec3_t where, int type);
1027 
1028 //
1029 // m_move.c
1030 //
1031 qboolean M_CheckBottom (edict_t *ent);
1032 qboolean M_walkmove (edict_t *ent, float yaw, float dist);
1033 void M_MoveToGoal (edict_t *ent, float dist);
1034 void M_ChangeYaw (edict_t *ent);
1035 
1036 //
1037 // g_phys.c
1038 //
1039 void G_RunEntity (edict_t *ent, float timespan);
1040 void SV_CheckVelocity (edict_t *ent);
1041 
1042 //
1043 // g_chase.c
1044 //
1045 void UpdateChaseCam(edict_t *ent);
1046 void ChaseNext(edict_t *ent);
1047 void ChasePrev(edict_t *ent);
1048 void GetChaseTarget(edict_t *ent);
1049 
1050 //
1051 // g_main.c
1052 //
1053 qboolean G_NameMatch( const char* netname, const char *kickname );
1054 
1055 //
1056 // Spawn functions
1057 //
1058 extern void SP_item_health (edict_t *self);
1059 extern void SP_item_health_small (edict_t *self);
1060 extern void SP_item_health_large (edict_t *self);
1061 extern void SP_item_health_mega (edict_t *self);
1062 
1063 extern void SP_info_player_start (edict_t *ent);
1064 extern void SP_info_player_deathmatch (edict_t *ent);
1065 extern void SP_info_player_intermission (edict_t *ent);
1066 extern void SP_info_player_red (edict_t *ent);
1067 extern void SP_info_player_blue(edict_t *ent);
1068 
1069 extern void SP_func_plat (edict_t *ent);
1070 extern void SP_func_rotating (edict_t *ent);
1071 extern void SP_func_button (edict_t *ent);
1072 extern void SP_func_door (edict_t *ent);
1073 extern void SP_func_door_secret (edict_t *ent);
1074 extern void SP_func_door_rotating (edict_t *ent);
1075 extern void SP_func_water (edict_t *ent);
1076 extern void SP_func_train (edict_t *ent);
1077 extern void SP_func_conveyor (edict_t *self);
1078 extern void SP_func_wall (edict_t *self);
1079 extern void SP_func_object (edict_t *self);
1080 extern void SP_func_explosive (edict_t *self);
1081 extern void SP_func_timer (edict_t *self);
1082 extern void SP_func_areaportal (edict_t *ent);
1083 extern void SP_func_killbox (edict_t *ent);
1084 
1085 extern void SP_trigger_always (edict_t *ent);
1086 extern void SP_trigger_once (edict_t *ent);
1087 extern void SP_trigger_multiple (edict_t *ent);
1088 extern void SP_trigger_relay (edict_t *ent);
1089 extern void SP_trigger_push (edict_t *ent);
1090 extern void SP_trigger_hurt (edict_t *ent);
1091 extern void SP_trigger_key (edict_t *ent);
1092 extern void SP_trigger_counter (edict_t *ent);
1093 extern void SP_trigger_elevator (edict_t *ent);
1094 extern void SP_trigger_gravity (edict_t *ent);
1095 extern void SP_trigger_monsterjump (edict_t *ent);
1096 extern void SP_trigger_deathballtarget (edict_t *ent);
1097 extern void SP_trigger_reddeathballtarget (edict_t *ent);
1098 extern void SP_trigger_bluedeathballtarget (edict_t *ent);
1099 extern void SP_trigger_redcowtarget ( edict_t *ent);
1100 extern void SP_trigger_bluecowtarget (edict_t *ent);
1101 
1102 extern void SP_target_temp_entity (edict_t *ent);
1103 extern void SP_target_speaker (edict_t *ent);
1104 extern void SP_target_explosion (edict_t *ent);
1105 extern void SP_target_secret (edict_t *ent);
1106 extern void SP_target_splash (edict_t *ent);
1107 extern void SP_target_steam (edict_t *ent);
1108 extern void SP_target_spawner (edict_t *ent);
1109 extern void SP_target_blaster (edict_t *ent);
1110 extern void SP_target_laser (edict_t *self);
1111 extern void SP_target_lightramp (edict_t *self);
1112 extern void SP_target_earthquake (edict_t *ent);
1113 extern void SP_target_fire (edict_t *ent);
1114 extern void SP_target_changelevel (edict_t *ent);
1115 
1116 extern void SP_worldspawn (edict_t *ent);
1117 
1118 extern void SP_light (edict_t *self);
1119 extern void SP_info_null (edict_t *self);
1120 extern void SP_info_notnull (edict_t *self);
1121 extern void SP_path_corner (edict_t *self);
1122 extern void SP_point_combat (edict_t *self);
1123 
1124 extern void SP_misc_teleporter (edict_t *self);
1125 extern void SP_misc_teleporter_dest (edict_t *self);
1126 
1127 extern void SP_npc_cow (edict_t *self);
1128 extern void SP_npc_deathray(edict_t *self);
1129 
1130 //TCA
1131 extern void SP_misc_spiderpod (edict_t *self);
1132 extern void SP_misc_rednode (edict_t *self);
1133 extern void SP_misc_bluenode (edict_t *self);
1134 extern void SP_misc_bluespidernode (edict_t *self);
1135 extern void SP_misc_redspidernode (edict_t *self);
1136 
1137 //Tactical
1138 extern void SP_misc_aliencomputer (edict_t *self);
1139 extern void SP_misc_humancomputer (edict_t *self);
1140 extern void SP_misc_alienpowersrc (edict_t *self);
1141 extern void SP_misc_humanpowersrc (edict_t *self);
1142 extern void SP_misc_alienammodepot (edict_t *self);
1143 extern void SP_misc_humanammodepot (edict_t *self);
1144 extern void SP_misc_alienbackupgen (edict_t *self);
1145 extern void SP_misc_humanbackupgen (edict_t *self);
1146 extern void SP_misc_deathray (edict_t *self);
1147 extern void SP_misc_laser (edict_t *self);
1148 
1149 extern void SP_misc_mapmodel (edict_t *self);
1150 extern void SP_misc_watersplash (edict_t *ent);
1151 extern void SP_misc_electroflash (edict_t *ent);
1152 
1153 
1154 //============================================================================
1155 
1156 // client_t->anim_priority
1157 #define	ANIM_BASIC		0		// stand / run
1158 #define	ANIM_WAVE		1
1159 #define	ANIM_JUMP		2
1160 #define	ANIM_PAIN		3
1161 #define	ANIM_ATTACK		4
1162 #define	ANIM_DEATH		5
1163 #define	ANIM_REVERSE	6
1164 
1165 #define BASE_ROCKETS	10
1166 #define BASE_SHELLS		10
1167 #define BASE_CELLS		50
1168 #define BASE_SLUGS		10
1169 #define BASE_GRENADES	50
1170 #define BASE_BULLETS	50
1171 #define BASE_SEEKERS	1
1172 #define BASE_BOMBS		1
1173 
1174 
1175 // client data that stays across multiple level loads
1176 typedef struct
1177 {
1178 	char		userinfo[MAX_INFO_STRING];
1179 
1180 	char netname[(PLAYERNAME_GLYPHS*3)+1]; // name from cvar
1181 			// room for "rainbow" name, but is truncated to PLAYERNAME_SIZE
1182 
1183 	int			hand;
1184 
1185 	qboolean	connected;			// a loadgame will leave valid entities that
1186 									// just don't have a connection yet
1187 
1188 	// values saved and restored from edicts when changing levels
1189 	int			health;
1190 	int			max_health;
1191 	int			savedFlags;
1192 
1193 	int			selected_item;
1194 	int			inventory[MAX_ITEMS];
1195 
1196 	// ammo capacities
1197 	int			max_bullets;
1198 	int			max_shells;
1199 	int			max_rockets;
1200 	int			max_grenades;
1201 	int			max_cells;
1202 	int			max_slugs;
1203 	int			max_seekers;
1204 	int			max_bombs;
1205 
1206 	gitem_t		*weapon;
1207 	gitem_t		*lastweapon;
1208 	gitem_t     *lastfailedswitch;
1209 	float       failedswitch_framenum;
1210 
1211 	int			game_helpchanged;
1212 	int			helpchanged;
1213 
1214 	int			spectator;			// client is a spectator
1215 	int	queue;				// client queue position for duel mode
1216 
1217 	//unlagged - client options
1218 	// these correspond with variables in the userinfo string
1219 	int			delag;
1220 	int			debugDelag;
1221 	int			cmdTimeNudge;
1222 //unlagged - client options
1223 //unlagged - lag simulation #2
1224 	int			latentSnaps;
1225 	int			latentCmds;
1226 	int			plOut;
1227 	usercmd_t	cmdqueue[MAX_LATENT_CMDS];
1228 	int			cmdhead;
1229 //unlagged - lag simulation #2
1230 //unlagged - true ping
1231 	int			realPing;
1232 	int			pingsamples[NUM_PING_SAMPLES];
1233 	int			samplehead;
1234 //unlagged - true ping
1235 
1236 } client_persistant_t;
1237 
1238 //unlagged - backward reconciliation #1
1239 // the size of history we'll keep
1240 #define NUM_CLIENT_HISTORY 17
1241 
1242 // everything we need to know to backward reconcile
1243 typedef struct {
1244 	vec3_t		mins, maxs;
1245 	vec3_t		currentOrigin;
1246 	int			leveltime;
1247 } clientHistory_t;
1248 //unlagged - backward reconciliation #1
1249 
1250 // client data that stays across deathmatch respawns
1251 typedef struct
1252 {
1253 	int			enterframe;			// level.framenum the client entered the game
1254 	int			score;				// frags, etc
1255 	int			deaths;				// deaths, etc
1256 	vec3_t		cmd_angles;			// angles sent over in the last command
1257 
1258 	//bot score info
1259 	int botnum;
1260 	bot_t bots[100];
1261 
1262 	//weapon accuracy info
1263 	int weapon_shots[9];
1264 	int weapon_hits[9];
1265 
1266 	//reward points
1267 	int reward_pts;
1268 	qboolean powered;
1269 
1270 	//voting
1271 	qboolean voted;
1272 
1273 	int			spectator;			// client is a spectator
1274 } client_respawn_t;
1275 
1276 // this structure is cleared on each PutClientInServer(),
1277 // except for 'client->pers'
1278 struct gclient_s
1279 {
1280 	// known to server
1281 	player_state_t	ps;				// communicated by server to clients
1282 	int				ping;
1283 
1284 	// private to game
1285 	client_persistant_t	pers;
1286 	client_respawn_t	resp;
1287 	pmove_state_t		old_pmove;	// for detecting out-of-pmove changes
1288 
1289 	qboolean	showscores;			// set layout stat
1290 	qboolean	showinventory;		// set layout stat
1291 	qboolean	showhelp;
1292 	qboolean	showhelpicon;
1293 
1294 	/** @brief "Message of the day" frames left
1295 	 *
1296 	 * Prevent centerprinting until the MOTD has been displayed
1297 	 * for some time. This makes sure players can actually read
1298 	 * the MOTD.
1299 	 */
1300 	int		motd_frames;
1301 
1302 	//stuff for bots
1303 	qboolean	is_bot;
1304 	/* --------------------------*/
1305 	/*
1306 	 * this is identical to declarations in edict_t
1307 	 * it appears this data in gclient_s is not used.
1308 	 */
1309 	int			skill;
1310 	char		faveweap[64];
1311 	float		weapacc[10];
1312 	float		accuracy;
1313 	float		awareness;
1314 	char		chatmsg1[128];
1315 	char		chatmsg2[128];
1316 	char		chatmsg3[128];
1317 	char		chatmsg4[128];
1318 	char		chatmsg5[128];
1319 	char		chatmsg6[128];
1320 	char		chatmsg7[128];
1321 	char		chatmsg8[128];
1322 	/*----------------------------*/
1323 
1324 	int			ammo_index;
1325 
1326 	int			buttons;
1327 	int			oldbuttons;
1328 	int			latched_buttons;
1329 
1330 	qboolean	weapon_thunk;
1331 
1332 	gitem_t		*newweapon;
1333 
1334 	// sum up damage over an entire frame, so
1335 	// shotgun blasts give a single big kick
1336 	int			damage_armor;		// damage absorbed by armor
1337 	int			damage_blood;		// damage taken out of health
1338 	int			damage_knockback;	// impact damage
1339 	vec3_t		damage_from;		// origin for vector calculation
1340 
1341 	float		killer_yaw;			// when dead, look at killer
1342 
1343 	weaponstate_t	weaponstate;
1344 	vec3_t		kick_angles;	// weapon kicks
1345 	vec3_t		kick_origin;
1346 	float		v_dmg_roll, v_dmg_pitch, v_dmg_time;	// damage kicks
1347 	float		fall_time, fall_value;		// for view drop on fall
1348 	float		damage_alpha;
1349 	float		bonus_alpha;
1350 	vec3_t		damage_blend;
1351 	vec3_t		v_angle;			// aiming direction
1352 	float		bobtime;			// so off-ground doesn't change it
1353 	vec3_t		oldviewangles;
1354 	vec3_t		oldvelocity;
1355 
1356 	float		next_drown_time;
1357 	int			old_waterlevel;
1358 	int			breather_sound;
1359 
1360 	int			machinegun_shots;	// for weapon raising
1361 
1362 	// animation vars
1363 	int			anim_end;
1364 	int			anim_priority;
1365 	qboolean	anim_duck;
1366 	qboolean	anim_run;
1367 
1368 	// powerup timers
1369 	float		quad_framenum;
1370 	float		invincible_framenum;
1371 	float		haste_framenum;
1372 	float		sproing_framenum;
1373 	float		regen_framenum;
1374 	float		invis_framenum;
1375 
1376 	float		losehealth_framenum;
1377 
1378 	qboolean	grenade_blew_up;
1379 	float		grenade_time;
1380 	int			silencer_shots;
1381 	int			weapon_sound;
1382 
1383 	float		pickup_msg_time;
1384 
1385 	float		flood_locktill;		// locked from talking
1386 	float		flood_when[10];		// when messages were said
1387 	int			flood_whenhead;		// head pointer for when said
1388 
1389 	float		respawn_time;		// can respawn when time > this
1390 
1391 	edict_t		*chase_target;		// player we are chasing
1392 	qboolean	update_chase;		// need to update chase info?
1393 
1394 	//team
1395 	int			dmteam;
1396 
1397 	//chasecam
1398 	int             chasetoggle;
1399     edict_t         *chasecam;
1400     edict_t         *oldplayer;
1401 
1402 	//vehicles
1403 	qboolean in_vehicle;
1404 	float	Jet_framenum;   /*burn out time when jet is activated*/
1405     float	Jet_remaining;  /*remaining fuel time*/
1406     float	Jet_next_think;
1407 
1408 	//deathball
1409 	qboolean in_deathball;
1410 
1411 	//grapple
1412 	void		*ctf_grapple;		// entity of grapple
1413 	int			ctf_grapplestate;		// true if pulling
1414 	float		ctf_grapplereleasetime;	// time of grapple release
1415 
1416 	//kill streaks
1417 	int kill_streak; //obviously this *will* get cleared at each respawn in most cases
1418 
1419 	//joust attempts - for limiting how many times you can joust at a time
1420 	int joustattempts;
1421 
1422 	//homing rocket limits
1423 	int	homing_shots;
1424 
1425 	//movetime - used for special moves
1426 	float lastmovetime;
1427 	int lastsidemove;
1428 	int lastforwardmove;
1429 	int dodge;
1430 	int moved;
1431 	int keydown;
1432 	float lastdodge;
1433 
1434 	float spawnprotecttime;
1435 	qboolean spawnprotected;
1436 
1437 	//map voting
1438 	int mapvote;
1439 
1440 	//taunt message
1441 	float lasttaunttime;
1442 
1443 	//deathray immunity
1444 	qboolean rayImmunity;
1445 	float rayTime;
1446 
1447 	//unlagged - backward reconciliation #1
1448 	// the serverTime the button was pressed
1449 	// (stored before pmove_fixed changes serverTime)
1450 	int			attackTime;
1451 	// the head of the history queue
1452 	int			historyHead;
1453 	// the history queue
1454 	clientHistory_t	history[NUM_CLIENT_HISTORY];
1455 	// the client's saved position
1456 	clientHistory_t	saved;			// used to restore after time shift
1457 	// an approximation of the actual server time we received this
1458 	// command (not in 50ms increments)
1459 	int			frameOffset;
1460 //unlagged - backward reconciliation #1
1461 
1462 //unlagged - smooth clients #1
1463 	// the last frame number we got an update from this client
1464 	int			lastUpdateFrame;
1465 //unlagged - smooth clients #1
1466 
1467 };
1468 
1469 
1470 struct edict_s
1471 {
1472 	entity_state_t	s;
1473 	struct gclient_s	*client;	// NULL if not a player
1474 									// the server expects the first part
1475 									// of gclient_s to be a player_state_t
1476 									// but the rest of it is opaque
1477 
1478 	qboolean	inuse;
1479 	int			linkcount;
1480 
1481 	// FIXME: move these fields to a server private sv_entity_t
1482 	link_t		area;				// linked to a division node or leaf
1483 
1484 	int			num_clusters;		// if -1, use headnode instead
1485 	int			clusternums[MAX_ENT_CLUSTERS];
1486 	int			headnode;			// unused if num_clusters != -1
1487 	int			areanum, areanum2;
1488 
1489 	//================================
1490 
1491 	int			svflags;
1492 	vec3_t		mins, maxs;
1493 	vec3_t		absmin, absmax, size;
1494 	solid_t		solid;
1495 	int			clipmask;
1496 	edict_t		*owner;
1497 
1498 	int			redirect_number;	//for ghost mode
1499 
1500 	// must be accessible to server code for collision detection
1501 	int			dmteam;
1502 	int			teamset;
1503 #define RED_TEAM				0
1504 #define BLUE_TEAM				1
1505 #define NO_TEAM					2
1506 
1507 
1508 	// DO NOT MODIFY ANYTHING ABOVE THIS, THE SERVER
1509 	// EXPECTS THE FIELDS IN THAT ORDER!
1510 
1511 	//================================
1512 	int			movetype;
1513 	int			flags;
1514 
1515 	char		*model;
1516 	float		freetime;			// sv.time when the object was freed
1517 
1518 	//
1519 	// only used locally in game, not by server
1520 	//
1521 	char		*message;
1522 	char		*classname;
1523 	int			spawnflags;
1524 
1525 	float		timestamp;
1526 
1527 	float		angle;			// set in qe3, -1 = up, -2 = down
1528 	char		*target;
1529 	char		*targetname;
1530 	char		*killtarget;
1531 	char		*team;
1532 	char		*pathtarget;
1533 	char		*deathtarget;
1534 	char		*combattarget;
1535 	edict_t		*target_ent;
1536 
1537 	float		speed, accel, decel;
1538 	vec3_t		movedir;
1539 	vec3_t		pos1, pos2;
1540 
1541 	vec3_t		velocity;
1542 	vec3_t		avelocity;
1543 	int			mass;
1544 	float		air_finished;
1545 	float		gravity;		// per entity gravity multiplier (1.0 is normal)
1546 								// use for lowgrav artifact, flares
1547 
1548 	edict_t		*goalentity;
1549 	edict_t		*movetarget;
1550 	float		yaw_speed;
1551 	float		ideal_yaw;
1552 
1553 	float		nextthink;
1554 	void		(*prethink) (edict_t *ent);
1555 	void		(*think)(edict_t *self);
1556 	void		(*blocked)(edict_t *self, edict_t *other);	//move to moveinfo?
1557 	void		(*touch)(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf);
1558 	void		(*use)(edict_t *self, edict_t *other, edict_t *activator);
1559 	void		(*pain)(edict_t *self, edict_t *other, float kick, int damage);
1560 	void		(*die)(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point);
1561 
1562 	float		touch_debounce_time;		// are all these legit?  do we need more/less of them?
1563 	float		pain_debounce_time;
1564 	float		damage_debounce_time;
1565 	float		fly_sound_debounce_time;	//move to clientinfo
1566 	float		last_move_time;
1567 
1568 	int			health;
1569 	int			max_health;
1570 	int			gib_health;
1571 	int			deadflag;
1572 	qboolean	show_hostile;
1573 
1574 	char		*map;			// target_changelevel
1575 
1576 	int			viewheight;		// height above origin where eyesight is determined
1577 	int			takedamage;
1578 	int			dmg;
1579 	int			radius_dmg;
1580 	float		dmg_radius;
1581 	int			sounds;			//make this a spawntemp var?
1582 	int			count;
1583 
1584 	edict_t		*chain;
1585 	edict_t		*enemy;
1586 	edict_t		*oldenemy;
1587 	edict_t		*activator;
1588 	edict_t		*groundentity;
1589 	int			groundentity_linkcount;
1590 	edict_t		*teamchain;
1591 	edict_t		*teammaster;
1592 
1593 	edict_t		*mynoise;		// can go in client only
1594 	edict_t		*mynoise2;
1595 
1596 	int			noise_index;
1597 	int			noise_index2;
1598 	float		volume;
1599 	float		attenuation;
1600 
1601 	// timing variables
1602 	float		wait;
1603 	float		delay;			// before firing targets
1604 	float		random;
1605 
1606 	float		teleport_time;
1607 
1608 	int			watertype;
1609 	int			waterlevel;
1610 
1611 	vec3_t		move_origin;
1612 	vec3_t		move_angles;
1613 
1614 	// move this to clientinfo?
1615 	int			light_level;
1616 
1617 	int			style;			// also used as areaportal number
1618 
1619 	gitem_t		*item;			// for bonus items
1620 
1621 	// common data blocks
1622 	moveinfo_t		moveinfo;
1623 	monsterinfo_t	monsterinfo;
1624 
1625 	edict_t		*flashlight;
1626 
1627 	edict_t		*replaced_weapon;
1628 
1629 // ACEBOT_ADD
1630 	qboolean is_bot;
1631 	qboolean is_jumping;
1632 
1633 	// For movement
1634 	vec3_t move_vector;
1635 	float next_move_time;
1636 	float wander_timeout;
1637 	float suicide_timeout;
1638 
1639 	// For node code
1640 	int current_node; // current node
1641 	int goal_node; // current goal node
1642 	int next_node; // the node that will take us one step closer to our goal
1643 	int node_timeout;
1644 	int last_node;
1645 	int tries;
1646 	int state;
1647 
1648 	//for config
1649 	int skill;
1650 	char faveweap[64];
1651 	float weapacc[10];
1652 	float accuracy;
1653 	float awareness;
1654 	char		chatmsg1[128];
1655 	char		chatmsg2[128];
1656 	char		chatmsg3[128];
1657 	char		chatmsg4[128];
1658 	char		chatmsg5[128];
1659 	char		chatmsg6[128];
1660 	char		chatmsg7[128];
1661 	char		chatmsg8[128];
1662 
1663 // ACEBOT_END
1664 	//chasecam
1665 	int chasedist1;
1666 	int chasedist2;
1667 
1668 	// for deathcam to remember position of player's death
1669 	vec3_t death_origin;
1670 
1671 	//vehicles
1672 	qboolean in_vehicle;
1673 
1674 	//deathball
1675 	qboolean in_deathball;
1676 
1677 	//Flamethrower and fire vars
1678 	float	 FlameDelay;
1679 	int	 Flames;
1680 	int	 FlameDamage;
1681 	edict_t *orb;
1682 
1683 	//Prox mines and grenades
1684 	int		nade_timer;
1685 
1686 	//bombs
1687 	int		armed;
1688 
1689 	//alt-fires
1690 	qboolean altfire;
1691 
1692 	//power nodes
1693 	qboolean powered;
1694 
1695 	//class(human = 0; alien = 1; robot = 2;)
1696 	int ctype;
1697 
1698 	//tactical mode
1699 	qboolean has_bomb;
1700 	qboolean has_detonator;
1701 	qboolean has_vaporizor;
1702 	qboolean has_minderaser;
1703 	int armor_type;
1704 	char charModel[128];
1705 
1706 	//model specific gibs
1707 	int usegibs;
1708 	char head[64];
1709 	char leg[64];
1710 	char arm[64];
1711 	char body[64];
1712 
1713 	// Anti-camp velocity accumulation
1714 
1715 	/** @brief Velocities history
1716 	 *
1717 	 * At each server frame, a client's velocity will be stored inside
1718 	 * this array. While the array may contain up to 100 vectors, the
1719 	 * ac_frames CVar will determine how many of these vectors will be
1720 	 * used.
1721 	 */
1722 	vec3_t old_velocities[ 100 ];
1723 
1724 	/** @brief Velocity accumulator
1725 	 *
1726 	 * This vector contains the sum of velocities for the past frames.
1727 	 * The amount of frames that are indeed accumulated depends on the
1728 	 * value of the ac_frames CVar.
1729 	 */
1730 	vec3_t velocity_accum;
1731 
1732 	/** @brief Velocities history index
1733 	 *
1734 	 * The last updated vector in the old_velocities array.
1735 	 */
1736 	int old_velocities_current;
1737 
1738 	/** @brief Stored velocity vectors
1739 	 *
1740 	 * The actual amount of vectors currently stored in the old_velocities
1741 	 * array.
1742 	 */
1743 	int old_velocities_count;
1744 
1745 };
1746 
1747 struct gmapvote_s
1748 {
1749 	char	mapname[32]; //ugg, end the pointer madness
1750 	int		tally;
1751 } votedmap[4];
1752 
1753 extern char *winningmap;
1754 
1755 extern void CheckDeathcam_Viewent(edict_t *ent);
1756 extern void DeathcamRemove (edict_t *ent, char *opt);
1757 extern void DeathcamStart (edict_t *ent);
1758 extern void DeathcamTrack (edict_t *ent);
1759 
1760 //IP information
1761 typedef struct
1762 {
1763 	unsigned	mask;
1764 	unsigned	compare;
1765 } ipfilter_t;
1766 
1767 #define	MAX_IPFILTERS	1024
1768 
1769 ipfilter_t	ipfilters[MAX_IPFILTERS];
1770 int			numipfilters;
1771 extern qboolean StringToFilter (char *s, ipfilter_t *f);
1772 
1773 //unlagged
1774 extern	cvar_t	*g_antilag;
1775 extern  cvar_t	*g_antilagdebug;
1776 extern	cvar_t	*g_antilagprojectiles;
1777 
1778 // ACEBOT_ADD
1779 #include "acesrc/acebot.h"
1780 // ACEBOT_END
1781 
1782