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