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	"baseq2"
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_stufftext		11
40 
41 //==================================================================
42 
43 // view pitching times
44 #define DAMAGE_TIME		0.5
45 #define	FALL_TIME		0.3
46 
47 
48 // edict->spawnflags
49 // these are set with checkboxes on each entity in the map editor
50 #define	SPAWNFLAG_NOT_EASY			0x00000100
51 #define	SPAWNFLAG_NOT_MEDIUM		0x00000200
52 #define	SPAWNFLAG_NOT_HARD			0x00000400
53 #define	SPAWNFLAG_NOT_DEATHMATCH	0x00000800
54 #define	SPAWNFLAG_NOT_COOP			0x00001000
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.1f
74 
75 // memory tags to allow dynamic memory to be cleaned up
76 #define	TAG_GAME	765		// clear when unloading the dll
77 #define	TAG_LEVEL	766		// clear when loading a new level
78 
79 
80 #define MELEE_DISTANCE	80
81 
82 #define BODY_QUEUE_SIZE		8
83 
84 typedef enum
85 {
86 	DAMAGE_NO,
87 	DAMAGE_YES,			// will take damage if hit
88 	DAMAGE_AIM			// auto targeting recognizes this
89 } damage_t;
90 
91 typedef enum
92 {
93 	WEAPON_READY,
94 	WEAPON_ACTIVATING,
95 	WEAPON_DROPPING,
96 	WEAPON_FIRING
97 } weaponstate_t;
98 
99 typedef enum
100 {
101 	AMMO_BULLETS,
102 	AMMO_SHELLS,
103 	AMMO_ROCKETS,
104 	AMMO_GRENADES,
105 	AMMO_CELLS,
106 	AMMO_SLUGS
107 } ammo_t;
108 
109 
110 //deadflag
111 #define DEAD_NO					0
112 #define DEAD_DYING				1
113 #define DEAD_DEAD				2
114 #define DEAD_RESPAWNABLE		3
115 
116 //range
117 #define RANGE_MELEE				0
118 #define RANGE_NEAR				1
119 #define RANGE_MID				2
120 #define RANGE_FAR				3
121 
122 //gib types
123 #define GIB_ORGANIC				0
124 #define GIB_METALLIC			1
125 
126 //monster ai flags
127 #define AI_STAND_GROUND			0x00000001
128 #define AI_TEMP_STAND_GROUND	0x00000002
129 #define AI_SOUND_TARGET			0x00000004
130 #define AI_LOST_SIGHT			0x00000008
131 #define AI_PURSUIT_LAST_SEEN	0x00000010
132 #define AI_PURSUE_NEXT			0x00000020
133 #define AI_PURSUE_TEMP			0x00000040
134 #define AI_HOLD_FRAME			0x00000080
135 #define AI_GOOD_GUY				0x00000100
136 #define AI_BRUTAL				0x00000200
137 #define AI_NOSTEP				0x00000400
138 #define AI_DUCKED				0x00000800
139 #define AI_COMBAT_POINT			0x00001000
140 #define AI_MEDIC				0x00002000
141 #define AI_RESURRECTING			0x00004000
142 
143 //monster attack state
144 #define AS_STRAIGHT				1
145 #define AS_SLIDING				2
146 #define	AS_MELEE				3
147 #define	AS_MISSILE				4
148 
149 // armor types
150 #define ARMOR_NONE				0
151 #define ARMOR_JACKET			1
152 #define ARMOR_COMBAT			2
153 #define ARMOR_BODY				3
154 #define ARMOR_SHARD				4
155 
156 // power armor types
157 #define POWER_ARMOR_NONE		0
158 #define POWER_ARMOR_SCREEN		1
159 #define POWER_ARMOR_SHIELD		2
160 
161 // handedness values
162 #define RIGHT_HANDED			0
163 #define LEFT_HANDED				1
164 #define CENTER_HANDED			2
165 
166 
167 // game.serverflags values
168 #define SFL_CROSS_TRIGGER_1		0x00000001
169 #define SFL_CROSS_TRIGGER_2		0x00000002
170 #define SFL_CROSS_TRIGGER_3		0x00000004
171 #define SFL_CROSS_TRIGGER_4		0x00000008
172 #define SFL_CROSS_TRIGGER_5		0x00000010
173 #define SFL_CROSS_TRIGGER_6		0x00000020
174 #define SFL_CROSS_TRIGGER_7		0x00000040
175 #define SFL_CROSS_TRIGGER_8		0x00000080
176 #define SFL_CROSS_TRIGGER_MASK	0x000000ff
177 
178 
179 // noise types for PlayerNoise
180 #define PNOISE_SELF				0
181 #define PNOISE_WEAPON			1
182 #define PNOISE_IMPACT			2
183 
184 
185 // edict->movetype values
186 typedef enum
187 {
188 MOVETYPE_NONE,			// never moves
189 MOVETYPE_NOCLIP,		// origin and angles change with no interaction
190 MOVETYPE_PUSH,			// no clip to world, push on box contact
191 MOVETYPE_STOP,			// no clip to world, stops on box contact
192 
193 MOVETYPE_WALK,			// gravity
194 MOVETYPE_STEP,			// gravity, special edge handling
195 MOVETYPE_FLY,
196 MOVETYPE_TOSS,			// gravity
197 MOVETYPE_FLYMISSILE,	// extra size to monsters
198 MOVETYPE_BOUNCE
199 } movetype_t;
200 
201 
202 
203 typedef struct
204 {
205 	int		base_count;
206 	int		max_count;
207 	float	normal_protection;
208 	float	energy_protection;
209 	int		armor;
210 } gitem_armor_t;
211 
212 
213 // gitem_t->flags
214 #define	IT_WEAPON		1		// use makes active weapon
215 #define	IT_AMMO			2
216 #define IT_ARMOR		4
217 #define IT_STAY_COOP	8
218 #define IT_KEY			16
219 #define IT_POWERUP		32
220 
221 // gitem_t->weapmodel for weapons indicates model index
222 #define WEAP_BLASTER			1
223 #define WEAP_SHOTGUN			2
224 #define WEAP_SUPERSHOTGUN		3
225 #define WEAP_MACHINEGUN			4
226 #define WEAP_CHAINGUN			5
227 #define WEAP_GRENADES			6
228 #define WEAP_GRENADELAUNCHER	7
229 #define WEAP_ROCKETLAUNCHER		8
230 #define WEAP_HYPERBLASTER		9
231 #define WEAP_RAILGUN			10
232 #define WEAP_BFG				11
233 
234 typedef struct gitem_s
235 {
236 	char		*classname;	// spawning name
237 	qboolean	(*pickup)(struct edict_s *ent, struct edict_s *other);
238 	void		(*use)(struct edict_s *ent, struct gitem_s *item);
239 	void		(*drop)(struct edict_s *ent, struct gitem_s *item);
240 	void		(*weaponthink)(struct edict_s *ent);
241 	char		*pickup_sound;
242 	char		*world_model;
243 	int			world_model_flags;
244 	char		*view_model;
245 
246 	// client side info
247 	char		*icon;
248 	char		*pickup_name;	// for printing on pickup
249 	int			count_width;		// number of digits to display by icon
250 
251 	int			quantity;		// for ammo how much, for weapons how much is used per shot
252 	char		*ammo;			// for weapons
253 	int			flags;			// IT_* flags
254 
255 	int			weapmodel;		// weapon model index (for weapons)
256 
257 	void		*info;
258 	int			tag;
259 
260 	char		*precaches;		// string of all models, sounds, and images this item will use
261 } gitem_t;
262 
263 
264 
265 //
266 // this structure is left intact through an entire game
267 // it should be initialized at dll load time, and read/written to
268 // the server.ssv file for savegames
269 //
270 typedef struct
271 {
272 	char		helpmessage1[512];
273 	char		helpmessage2[512];
274 	int			helpchanged;	// flash F1 icon if non 0, play sound
275 								// and increment only if 1, 2, or 3
276 
277 	gclient_t	*clients;		// [maxclients]
278 
279 	// can't store spawnpoint in level, because
280 	// it would get overwritten by the savegame restore
281 	char		spawnpoint[512];	// needed for coop respawns
282 
283 	// store latched cvars here that we want to get at often
284 	int			maxclients;
285 	int			maxentities;
286 
287 	// cross level triggers
288 	int			serverflags;
289 
290 	// items
291 	int			num_items;
292 
293 	qboolean	autosaved;
294 } game_locals_t;
295 
296 
297 //
298 // this structure is cleared as each map is entered
299 // it is read/written to the level.sav file for savegames
300 //
301 typedef struct
302 {
303 	int			framenum;
304 	float		time;
305 
306 	char		level_name[MAX_QPATH];	// the descriptive name (Outer Base, etc)
307 	char		mapname[MAX_QPATH];		// the server name (base1, etc)
308 	char		nextmap[MAX_QPATH];		// go here when fraglimit is hit
309 
310 	// intermission state
311 	float		intermissiontime;		// time the intermission was started
312 	char		*changemap;
313 	int			exitintermission;
314 	vec3_t		intermission_origin;
315 	vec3_t		intermission_angle;
316 
317 	edict_t		*sight_client;	// changed once each frame for coop games
318 
319 	edict_t		*sight_entity;
320 	int			sight_entity_framenum;
321 	edict_t		*sound_entity;
322 	int			sound_entity_framenum;
323 	edict_t		*sound2_entity;
324 	int			sound2_entity_framenum;
325 
326 	int			pic_health;
327 
328 	int			total_secrets;
329 	int			found_secrets;
330 
331 	int			total_goals;
332 	int			found_goals;
333 
334 	int			total_monsters;
335 	int			killed_monsters;
336 
337 	edict_t		*current_entity;	// entity running from G_RunFrame
338 	int			body_que;			// dead bodies
339 
340 	int			power_cubes;		// ugly necessity for coop
341 } level_locals_t;
342 
343 
344 // spawn_temp_t is only used to hold entity field values that
345 // can be set from the editor, but aren't actualy present
346 // in edict_t during gameplay
347 typedef struct
348 {
349 	// world vars
350 	char		*sky;
351 	float		skyrotate;
352 	vec3_t		skyaxis;
353 	char		*nextmap;
354 
355 	int			lip;
356 	int			distance;
357 	int			height;
358 	char		*noise;
359 	float		pausetime;
360 	char		*item;
361 	char		*gravity;
362 
363 	float		minyaw;
364 	float		maxyaw;
365 	float		minpitch;
366 	float		maxpitch;
367 } spawn_temp_t;
368 
369 
370 typedef struct
371 {
372 	// fixed data
373 	vec3_t		start_origin;
374 	vec3_t		start_angles;
375 	vec3_t		end_origin;
376 	vec3_t		end_angles;
377 
378 	int			sound_start;
379 	int			sound_middle;
380 	int			sound_end;
381 
382 	float		accel;
383 	float		speed;
384 	float		decel;
385 	float		distance;
386 
387 	float		wait;
388 
389 	// state data
390 	int			state;
391 	vec3_t		dir;
392 	float		current_speed;
393 	float		move_speed;
394 	float		next_speed;
395 	float		remaining_distance;
396 	float		decel_distance;
397 	void		(*endfunc)(edict_t *);
398 } moveinfo_t;
399 
400 
401 typedef struct
402 {
403 	void	(*aifunc)(edict_t *self, float dist);
404 	float	dist;
405 	void	(*thinkfunc)(edict_t *self);
406 } mframe_t;
407 
408 typedef struct
409 {
410 	int			firstframe;
411 	int			lastframe;
412 	mframe_t	*frame;
413 	void		(*endfunc)(edict_t *self);
414 } mmove_t;
415 
416 typedef struct
417 {
418 	mmove_t		*currentmove;
419 	int			aiflags;
420 	int			nextframe;
421 	float		scale;
422 
423 	void		(*stand)(edict_t *self);
424 	void		(*idle)(edict_t *self);
425 	void		(*search)(edict_t *self);
426 	void		(*walk)(edict_t *self);
427 	void		(*run)(edict_t *self);
428 	void		(*dodge)(edict_t *self, edict_t *other, float eta);
429 	void		(*attack)(edict_t *self);
430 	void		(*melee)(edict_t *self);
431 	void		(*sight)(edict_t *self, edict_t *other);
432 	qboolean	(*checkattack)(edict_t *self);
433 
434 	float		pausetime;
435 	float		attack_finished;
436 
437 	vec3_t		saved_goal;
438 	float		search_time;
439 	float		trail_time;
440 	vec3_t		last_sighting;
441 	int			attack_state;
442 	int			lefty;
443 	float		idle_time;
444 	int			linkcount;
445 
446 	int			power_armor_type;
447 	int			power_armor_power;
448 } monsterinfo_t;
449 
450 
451 
452 extern	game_locals_t	game;
453 extern	level_locals_t	level;
454 extern	game_import_t	gi;
455 extern	game_export_t	globals;
456 extern	spawn_temp_t	st;
457 
458 extern	int	sm_meat_index;
459 extern	int	snd_fry;
460 
461 extern	int	jacket_armor_index;
462 extern	int	combat_armor_index;
463 extern	int	body_armor_index;
464 
465 
466 // means of death
467 #define MOD_UNKNOWN			0
468 #define MOD_BLASTER			1
469 #define MOD_SHOTGUN			2
470 #define MOD_SSHOTGUN		3
471 #define MOD_MACHINEGUN		4
472 #define MOD_CHAINGUN		5
473 #define MOD_GRENADE			6
474 #define MOD_G_SPLASH		7
475 #define MOD_ROCKET			8
476 #define MOD_R_SPLASH		9
477 #define MOD_HYPERBLASTER	10
478 #define MOD_RAILGUN			11
479 #define MOD_BFG_LASER		12
480 #define MOD_BFG_BLAST		13
481 #define MOD_BFG_EFFECT		14
482 #define MOD_HANDGRENADE		15
483 #define MOD_HG_SPLASH		16
484 #define MOD_WATER			17
485 #define MOD_SLIME			18
486 #define MOD_LAVA			19
487 #define MOD_CRUSH			20
488 #define MOD_TELEFRAG		21
489 #define MOD_FALLING			22
490 #define MOD_SUICIDE			23
491 #define MOD_HELD_GRENADE	24
492 #define MOD_EXPLOSIVE		25
493 #define MOD_BARREL			26
494 #define MOD_BOMB			27
495 #define MOD_EXIT			28
496 #define MOD_SPLASH			29
497 #define MOD_TARGET_LASER	30
498 #define MOD_TRIGGER_HURT	31
499 #define MOD_HIT				32
500 #define MOD_TARGET_BLASTER	33
501 #define MOD_FRIENDLY_FIRE	0x8000000
502 
503 extern	int	meansOfDeath;
504 
505 
506 extern	edict_t			*g_edicts;
507 
508 #define	FOFS(x) (int)&(((edict_t *)0)->x)
509 #define	STOFS(x) (int)&(((spawn_temp_t *)0)->x)
510 #define	LLOFS(x) (int)&(((level_locals_t *)0)->x)
511 #define	CLOFS(x) (int)&(((gclient_t *)0)->x)
512 
513 #ifdef random
514 #undef random
515 #endif
516 
517 #define random()	((rand () & 0x7fff) / ((float)0x7fff))
518 #define crandom()	(2.0f * (random() - 0.5f))
519 
520 extern	cvar_t	*maxentities;
521 extern	cvar_t	*deathmatch;
522 extern	cvar_t	*coop;
523 extern	cvar_t	*dmflags;
524 extern	cvar_t	*skill;
525 extern	cvar_t	*fraglimit;
526 extern	cvar_t	*timelimit;
527 extern	cvar_t	*password;
528 extern	cvar_t	*spectator_password;
529 extern	cvar_t	*g_select_empty;
530 extern	cvar_t	*dedicated;
531 
532 extern	cvar_t	*filterban;
533 
534 extern	cvar_t	*sv_gravity;
535 extern	cvar_t	*sv_maxvelocity;
536 
537 extern	cvar_t	*gun_x, *gun_y, *gun_z;
538 extern	cvar_t	*sv_rollspeed;
539 extern	cvar_t	*sv_rollangle;
540 
541 extern	cvar_t	*run_pitch;
542 extern	cvar_t	*run_roll;
543 extern	cvar_t	*bob_up;
544 extern	cvar_t	*bob_pitch;
545 extern	cvar_t	*bob_roll;
546 
547 extern	cvar_t	*sv_cheats;
548 extern	cvar_t	*maxclients;
549 extern	cvar_t	*maxspectators;
550 
551 extern	cvar_t	*flood_msgs;
552 extern	cvar_t	*flood_persecond;
553 extern	cvar_t	*flood_waitdelay;
554 
555 extern	cvar_t	*sv_maplist;
556 
557 #define world	(&g_edicts[0])
558 
559 // item spawnflags
560 #define ITEM_TRIGGER_SPAWN		0x00000001
561 #define ITEM_NO_TOUCH			0x00000002
562 // 6 bits reserved for editor flags
563 // 8 bits used as power cube id bits for coop games
564 #define DROPPED_ITEM			0x00010000
565 #define	DROPPED_PLAYER_ITEM		0x00020000
566 #define ITEM_TARGETS_USED		0x00040000
567 
568 //
569 // fields are needed for spawning from the entity string
570 // and saving / loading games
571 //
572 #define FFL_SPAWNTEMP		1
573 #define FFL_NOSPAWN			2
574 
575 typedef enum {
576 	F_INT,
577 	F_FLOAT,
578 	F_LSTRING,			// string on disk, pointer in memory, TAG_LEVEL
579 	F_GSTRING,			// string on disk, pointer in memory, TAG_GAME
580 	F_VECTOR,
581 	F_ANGLEHACK,
582 	F_EDICT,			// index on disk, pointer in memory
583 	F_ITEM,				// index on disk, pointer in memory
584 	F_CLIENT,			// index on disk, pointer in memory
585 	F_FUNCTION,
586 	F_MMOVE,
587 	F_IGNORE
588 } fieldtype_t;
589 
590 typedef struct
591 {
592 	char	*name;
593 	int		ofs;
594 	fieldtype_t	type;
595 	int		flags;
596 } field_t;
597 
598 
599 extern	field_t fields[];
600 extern	gitem_t	itemlist[];
601 
602 
603 //
604 // g_cmds.c
605 //
606 void Cmd_Help_f (edict_t *ent);
607 void Cmd_Score_f (edict_t *ent);
608 
609 //
610 // g_items.c
611 //
612 void PrecacheItem (gitem_t *it);
613 void InitItems (void);
614 void SetItemNames (void);
615 gitem_t	*FindItem (char *pickup_name);
616 gitem_t	*FindItemByClassname (char *classname);
617 #define	ITEM_INDEX(x) ((int)((x)-itemlist))
618 edict_t *Drop_Item (edict_t *ent, gitem_t *item);
619 void SetRespawn (edict_t *ent, float delay);
620 void ChangeWeapon (edict_t *ent);
621 void SpawnItem (edict_t *ent, gitem_t *item);
622 void Think_Weapon (edict_t *ent);
623 int ArmorIndex (edict_t *ent);
624 int PowerArmorType (edict_t *ent);
625 gitem_t	*GetItemByIndex (int index);
626 qboolean Add_Ammo (edict_t *ent, gitem_t *item, int count);
627 void Touch_Item (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf);
628 
629 //
630 // g_utils.c
631 //
632 qboolean	KillBox (edict_t *ent);
633 void	G_ProjectSource (vec3_t point, vec3_t distance, vec3_t forward, vec3_t right, vec3_t result);
634 edict_t *G_Find (edict_t *from, int fieldofs, char *match);
635 edict_t *findradius (edict_t *from, vec3_t org, float rad);
636 edict_t *G_PickTarget (char *targetname);
637 void	G_UseTargets (edict_t *ent, edict_t *activator);
638 void	G_SetMovedir (vec3_t angles, vec3_t movedir);
639 
640 void	G_InitEdict (edict_t *e);
641 edict_t	*G_Spawn (void);
642 void	G_FreeEdict (edict_t *e);
643 
644 void	G_TouchTriggers (edict_t *ent);
645 void	G_TouchSolids (edict_t *ent);
646 
647 char	*G_CopyString (char *in);
648 
649 float	*tv (float x, float y, float z);
650 char	*vtos (vec3_t v);
651 
652 float vectoyaw (vec3_t vec);
653 void vectoangles (vec3_t vec, vec3_t angles);
654 
655 //
656 // g_combat.c
657 //
658 qboolean OnSameTeam (edict_t *ent1, edict_t *ent2);
659 qboolean CanDamage (edict_t *targ, edict_t *inflictor);
660 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);
661 void T_RadiusDamage (edict_t *inflictor, edict_t *attacker, float damage, edict_t *ignore, float radius, int mod);
662 
663 // damage flags
664 #define DAMAGE_RADIUS			0x00000001	// damage was indirect
665 #define DAMAGE_NO_ARMOR			0x00000002	// armour does not protect from this damage
666 #define DAMAGE_ENERGY			0x00000004	// damage is from an energy based weapon
667 #define DAMAGE_NO_KNOCKBACK		0x00000008	// do not affect velocity, just view angles
668 #define DAMAGE_BULLET			0x00000010  // damage is from a bullet (used for ricochets)
669 #define DAMAGE_NO_PROTECTION	0x00000020  // armor, shields, invulnerability, and godmode have no effect
670 
671 #define DEFAULT_BULLET_HSPREAD	300
672 #define DEFAULT_BULLET_VSPREAD	500
673 #define DEFAULT_SHOTGUN_HSPREAD	1000
674 #define DEFAULT_SHOTGUN_VSPREAD	500
675 #define DEFAULT_DEATHMATCH_SHOTGUN_COUNT	12
676 #define DEFAULT_SHOTGUN_COUNT	12
677 #define DEFAULT_SSHOTGUN_COUNT	20
678 
679 //
680 // g_monster.c
681 //
682 void monster_fire_bullet (edict_t *self, vec3_t start, vec3_t dir, int damage, int kick, int hspread, int vspread, int flashtype);
683 void monster_fire_shotgun (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int count, int flashtype);
684 void monster_fire_blaster (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype, int effect);
685 void monster_fire_grenade (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int flashtype);
686 void monster_fire_rocket (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype);
687 void monster_fire_railgun (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int flashtype);
688 void monster_fire_bfg (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int kick, float damage_radius, int flashtype);
689 void M_droptofloor (edict_t *ent);
690 void monster_think (edict_t *self);
691 void walkmonster_start (edict_t *self);
692 void swimmonster_start (edict_t *self);
693 void flymonster_start (edict_t *self);
694 void AttackFinished (edict_t *self, float time);
695 void monster_death_use (edict_t *self);
696 void M_CatagorizePosition (edict_t *ent);
697 qboolean M_CheckAttack (edict_t *self);
698 void M_FlyCheck (edict_t *self);
699 void M_CheckGround (edict_t *ent);
700 
701 //
702 // g_misc.c
703 //
704 void ThrowHead (edict_t *self, char *gibname, int damage, int type);
705 void ThrowClientHead (edict_t *self, int damage);
706 void ThrowGib (edict_t *self, char *gibname, int damage, int type);
707 void BecomeExplosion1(edict_t *self);
708 
709 //
710 // g_ai.c
711 //
712 void AI_SetSightClient (void);
713 
714 void ai_stand (edict_t *self, float dist);
715 void ai_move (edict_t *self, float dist);
716 void ai_walk (edict_t *self, float dist);
717 void ai_turn (edict_t *self, float dist);
718 void ai_run (edict_t *self, float dist);
719 void ai_charge (edict_t *self, float dist);
720 int range (edict_t *self, edict_t *other);
721 
722 void FoundTarget (edict_t *self);
723 qboolean infront (edict_t *self, edict_t *other);
724 qboolean visible (edict_t *self, edict_t *other);
725 qboolean FacingIdeal(edict_t *self);
726 
727 //
728 // g_weapon.c
729 //
730 void ThrowDebris (edict_t *self, char *modelname, float speed, vec3_t origin);
731 qboolean fire_hit (edict_t *self, vec3_t aim, int damage, int kick);
732 void fire_bullet (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int mod);
733 void fire_shotgun (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int count, int mod);
734 void fire_blaster (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int effect, qboolean hyper);
735 void fire_grenade (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, float timer, float damage_radius);
736 void fire_grenade2 (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, float timer, float damage_radius, qboolean held);
737 void fire_rocket (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius, int radius_damage);
738 void fire_rail (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick);
739 void fire_bfg (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius);
740 
741 //
742 // g_ptrail.c
743 //
744 void PlayerTrail_Init (void);
745 void PlayerTrail_Add (vec3_t spot);
746 void PlayerTrail_New (vec3_t spot);
747 edict_t *PlayerTrail_PickFirst (edict_t *self);
748 edict_t *PlayerTrail_PickNext (edict_t *self);
749 edict_t	*PlayerTrail_LastSpot (void);
750 
751 //
752 // g_client.c
753 //
754 void respawn (edict_t *ent);
755 void BeginIntermission (edict_t *targ);
756 void PutClientInServer (edict_t *ent);
757 void InitClientPersistant (gclient_t *client);
758 void InitClientResp (gclient_t *client);
759 void InitBodyQue (void);
760 void ClientBeginServerFrame (edict_t *ent);
761 
762 //
763 // g_player.c
764 //
765 void player_pain (edict_t *self, edict_t *other, float kick, int damage);
766 void player_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point);
767 
768 //
769 // g_svcmds.c
770 //
771 void	ServerCommand (void);
772 qboolean SV_FilterPacket (char *from);
773 
774 //
775 // p_view.c
776 //
777 void ClientEndServerFrame (edict_t *ent);
778 
779 //
780 // p_hud.c
781 //
782 void MoveClientToIntermission (edict_t *client);
783 void G_SetStats (edict_t *ent);
784 void G_SetSpectatorStats (edict_t *ent);
785 void G_CheckChaseStats (edict_t *ent);
786 void ValidateSelectedItem (edict_t *ent);
787 void DeathmatchScoreboardMessage (edict_t *client, edict_t *killer);
788 
789 //
790 // g_pweapon.c
791 //
792 void PlayerNoise(edict_t *who, vec3_t where, int type);
793 
794 //
795 // m_move.c
796 //
797 qboolean M_CheckBottom (edict_t *ent);
798 qboolean M_walkmove (edict_t *ent, float yaw, float dist);
799 void M_MoveToGoal (edict_t *ent, float dist);
800 void M_ChangeYaw (edict_t *ent);
801 
802 //
803 // g_phys.c
804 //
805 void G_RunEntity (edict_t *ent);
806 
807 //
808 // g_main.c
809 //
810 void SaveClientData (void);
811 void FetchClientEntData (edict_t *ent);
812 
813 //
814 // g_chase.c
815 //
816 void UpdateChaseCam(edict_t *ent);
817 void ChaseNext(edict_t *ent);
818 void ChasePrev(edict_t *ent);
819 void GetChaseTarget(edict_t *ent);
820 
821 //============================================================================
822 
823 // client_t->anim_priority
824 #define	ANIM_BASIC		0		// stand / run
825 #define	ANIM_WAVE		1
826 #define	ANIM_JUMP		2
827 #define	ANIM_PAIN		3
828 #define	ANIM_ATTACK		4
829 #define	ANIM_DEATH		5
830 #define	ANIM_REVERSE	6
831 
832 
833 // client data that stays across multiple level loads
834 typedef struct
835 {
836 	char		userinfo[MAX_INFO_STRING];
837 	char		netname[16];
838 	int			hand;
839 
840 	qboolean	connected;			// a loadgame will leave valid entities that
841 									// just don't have a connection yet
842 
843 	// values saved and restored from edicts when changing levels
844 	int			health;
845 	int			max_health;
846 	int			savedFlags;
847 
848 	int			selected_item;
849 	int			inventory[MAX_ITEMS];
850 
851 	// ammo capacities
852 	int			max_bullets;
853 	int			max_shells;
854 	int			max_rockets;
855 	int			max_grenades;
856 	int			max_cells;
857 	int			max_slugs;
858 
859 	gitem_t		*weapon;
860 	gitem_t		*lastweapon;
861 
862 	int			power_cubes;	// used for tracking the cubes in coop games
863 	int			score;			// for calculating total unit score in coop games
864 
865 	int			game_helpchanged;
866 	int			helpchanged;
867 
868 	qboolean	spectator;			// client is a spectator
869 } client_persistant_t;
870 
871 // client data that stays across deathmatch respawns
872 typedef struct
873 {
874 	client_persistant_t	coop_respawn;	// what to set client->pers to on a respawn
875 	int			enterframe;			// level.framenum the client entered the game
876 	int			score;				// frags, etc
877 	vec3_t		cmd_angles;			// angles sent over in the last command
878 
879 	qboolean	spectator;			// client is a spectator
880 } client_respawn_t;
881 
882 // this structure is cleared on each PutClientInServer(),
883 // except for 'client->pers'
884 struct gclient_s
885 {
886 	// known to server
887 	player_state_t	ps;				// communicated by server to clients
888 	int				ping;
889 
890 	// private to game
891 	client_persistant_t	pers;
892 	client_respawn_t	resp;
893 	pmove_state_t		old_pmove;	// for detecting out-of-pmove changes
894 
895 	qboolean	showscores;			// set layout stat
896 	qboolean	showinventory;		// set layout stat
897 	qboolean	showhelp;
898 	qboolean	showhelpicon;
899 
900 	int			ammo_index;
901 
902 	int			buttons;
903 	int			oldbuttons;
904 	int			latched_buttons;
905 
906 	qboolean	weapon_thunk;
907 
908 	gitem_t		*newweapon;
909 
910 	// sum up damage over an entire frame, so
911 	// shotgun blasts give a single big kick
912 	int			damage_armor;		// damage absorbed by armor
913 	int			damage_parmor;		// damage absorbed by power armor
914 	int			damage_blood;		// damage taken out of health
915 	int			damage_knockback;	// impact damage
916 	vec3_t		damage_from;		// origin for vector calculation
917 
918 	float		killer_yaw;			// when dead, look at killer
919 
920 	weaponstate_t	weaponstate;
921 	vec3_t		kick_angles;	// weapon kicks
922 	vec3_t		kick_origin;
923 	float		v_dmg_roll, v_dmg_pitch, v_dmg_time;	// damage kicks
924 	float		fall_time, fall_value;		// for view drop on fall
925 	float		damage_alpha;
926 	float		bonus_alpha;
927 	vec3_t		damage_blend;
928 	vec3_t		v_angle;			// aiming direction
929 	float		bobtime;			// so off-ground doesn't change it
930 	vec3_t		oldviewangles;
931 	vec3_t		oldvelocity;
932 
933 	float		next_drown_time;
934 	int			old_waterlevel;
935 	int			breather_sound;
936 
937 	int			machinegun_shots;	// for weapon raising
938 
939 	// animation vars
940 	int			anim_end;
941 	int			anim_priority;
942 	qboolean	anim_duck;
943 	qboolean	anim_run;
944 
945 	// powerup timers
946 	float		quad_framenum;
947 	float		invincible_framenum;
948 	float		breather_framenum;
949 	float		enviro_framenum;
950 
951 	qboolean	grenade_blew_up;
952 	float		grenade_time;
953 	int			silencer_shots;
954 	int			weapon_sound;
955 
956 	float		pickup_msg_time;
957 
958 	float		flood_locktill;		// locked from talking
959 	float		flood_when[10];		// when messages were said
960 	int			flood_whenhead;		// head pointer for when said
961 
962 	float		respawn_time;		// can respawn when time > this
963 
964 	edict_t		*chase_target;		// player we are chasing
965 	qboolean	update_chase;		// need to update chase info?
966 };
967 
968 
969 struct edict_s
970 {
971 	entity_state_t	s;
972 	struct gclient_s	*client;	// NULL if not a player
973 									// the server expects the first part
974 									// of gclient_s to be a player_state_t
975 									// but the rest of it is opaque
976 
977 	qboolean	inuse;
978 	int			linkcount;
979 
980 	// FIXME: move these fields to a server private sv_entity_t
981 	link_t		area;				// linked to a division node or leaf
982 
983 	int			num_clusters;		// if -1, use headnode instead
984 	int			clusternums[MAX_ENT_CLUSTERS];
985 	int			headnode;			// unused if num_clusters != -1
986 	int			areanum, areanum2;
987 
988 	//================================
989 
990 	int			svflags;
991 	vec3_t		mins, maxs;
992 	vec3_t		absmin, absmax, size;
993 	solid_t		solid;
994 	int			clipmask;
995 	edict_t		*owner;
996 
997 
998 	// DO NOT MODIFY ANYTHING ABOVE THIS, THE SERVER
999 	// EXPECTS THE FIELDS IN THAT ORDER!
1000 
1001 	//================================
1002 	int			movetype;
1003 	int			flags;
1004 
1005 	char		*model;
1006 	float		freetime;			// sv.time when the object was freed
1007 
1008 	//
1009 	// only used locally in game, not by server
1010 	//
1011 	char		*message;
1012 	char		*classname;
1013 	int			spawnflags;
1014 
1015 	float		timestamp;
1016 
1017 	float		angle;			// set in qe3, -1 = up, -2 = down
1018 	char		*target;
1019 	char		*targetname;
1020 	char		*killtarget;
1021 	char		*team;
1022 	char		*pathtarget;
1023 	char		*deathtarget;
1024 	char		*combattarget;
1025 	edict_t		*target_ent;
1026 
1027 	float		speed, accel, decel;
1028 	vec3_t		movedir;
1029 	vec3_t		pos1, pos2;
1030 
1031 	vec3_t		velocity;
1032 	vec3_t		avelocity;
1033 	int			mass;
1034 	float		air_finished;
1035 	float		gravity;		// per entity gravity multiplier (1.0 is normal)
1036 								// use for lowgrav artifact, flares
1037 
1038 	edict_t		*goalentity;
1039 	edict_t		*movetarget;
1040 	float		yaw_speed;
1041 	float		ideal_yaw;
1042 
1043 	float		nextthink;
1044 	void		(*prethink) (edict_t *ent);
1045 	void		(*think)(edict_t *self);
1046 	void		(*blocked)(edict_t *self, edict_t *other);	//move to moveinfo?
1047 	void		(*touch)(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf);
1048 	void		(*use)(edict_t *self, edict_t *other, edict_t *activator);
1049 	void		(*pain)(edict_t *self, edict_t *other, float kick, int damage);
1050 	void		(*die)(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point);
1051 
1052 	float		touch_debounce_time;		// are all these legit?  do we need more/less of them?
1053 	float		pain_debounce_time;
1054 	float		damage_debounce_time;
1055 	float		fly_sound_debounce_time;	//move to clientinfo
1056 	float		last_move_time;
1057 
1058 	int			health;
1059 	int			max_health;
1060 	int			gib_health;
1061 	int			deadflag;
1062 	qboolean	show_hostile;
1063 
1064 	float		powerarmor_time;
1065 
1066 	char		*map;			// target_changelevel
1067 
1068 	int			viewheight;		// height above origin where eyesight is determined
1069 	int			takedamage;
1070 	int			dmg;
1071 	int			radius_dmg;
1072 	float		dmg_radius;
1073 	int			sounds;			//make this a spawntemp var?
1074 	int			count;
1075 
1076 	edict_t		*chain;
1077 	edict_t		*enemy;
1078 	edict_t		*oldenemy;
1079 	edict_t		*activator;
1080 	edict_t		*groundentity;
1081 	int			groundentity_linkcount;
1082 	edict_t		*teamchain;
1083 	edict_t		*teammaster;
1084 
1085 	edict_t		*mynoise;		// can go in client only
1086 	edict_t		*mynoise2;
1087 
1088 	int			noise_index;
1089 	int			noise_index2;
1090 	float		volume;
1091 	float		attenuation;
1092 
1093 	// timing variables
1094 	float		wait;
1095 	float		delay;			// before firing targets
1096 	float		random;
1097 
1098 	float		teleport_time;
1099 
1100 	int			watertype;
1101 	int			waterlevel;
1102 
1103 	vec3_t		move_origin;
1104 	vec3_t		move_angles;
1105 
1106 	// move this to clientinfo?
1107 	int			light_level;
1108 
1109 	int			style;			// also used as areaportal number
1110 
1111 	gitem_t		*item;			// for bonus items
1112 
1113 	// common data blocks
1114 	moveinfo_t		moveinfo;
1115 	monsterinfo_t	monsterinfo;
1116 };
1117 
1118