File: game\g_local.h
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.1
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 #define random() ((rand () & 0x7fff) / ((float)0x7fff))
514 #define crandom() (2.0 * (random() - 0.5))
515
516 extern cvar_t *maxentities;
517 extern cvar_t *deathmatch;
518 extern cvar_t *coop;
519 extern cvar_t *dmflags;
520 extern cvar_t *skill;
521 extern cvar_t *fraglimit;
522 extern cvar_t *timelimit;
523 extern cvar_t *password;
524 extern cvar_t *spectator_password;
525 extern cvar_t *needpass;
526 extern cvar_t *g_select_empty;
527 extern cvar_t *dedicated;
528
529 extern cvar_t *filterban;
530
531 extern cvar_t *sv_gravity;
532 extern cvar_t *sv_maxvelocity;
533
534 extern cvar_t *gun_x, *gun_y, *gun_z;
535 extern cvar_t *sv_rollspeed;
536 extern cvar_t *sv_rollangle;
537
538 extern cvar_t *run_pitch;
539 extern cvar_t *run_roll;
540 extern cvar_t *bob_up;
541 extern cvar_t *bob_pitch;
542 extern cvar_t *bob_roll;
543
544 extern cvar_t *sv_cheats;
545 extern cvar_t *maxclients;
546 extern cvar_t *maxspectators;
547
548 extern cvar_t *flood_msgs;
549 extern cvar_t *flood_persecond;
550 extern cvar_t *flood_waitdelay;
551
552 extern cvar_t *sv_maplist;
553
554 #define world (&g_edicts[0])
555
556 // item spawnflags
557 #define ITEM_TRIGGER_SPAWN 0x00000001
558 #define ITEM_NO_TOUCH 0x00000002
559 // 6 bits reserved for editor flags
560 // 8 bits used as power cube id bits for coop games
561 #define DROPPED_ITEM 0x00010000
562 #define DROPPED_PLAYER_ITEM 0x00020000
563 #define ITEM_TARGETS_USED 0x00040000
564
565 //
566 // fields are needed for spawning from the entity string
567 // and saving / loading games
568 //
569 #define FFL_SPAWNTEMP 1
570 #define FFL_NOSPAWN 2
571
572 typedef enum {
573 F_INT,
574 F_FLOAT,
575 F_LSTRING, // string on disk, pointer in memory, TAG_LEVEL
576 F_GSTRING, // string on disk, pointer in memory, TAG_GAME
577 F_VECTOR,
578 F_ANGLEHACK,
579 F_EDICT, // index on disk, pointer in memory
580 F_ITEM, // index on disk, pointer in memory
581 F_CLIENT, // index on disk, pointer in memory
582 F_FUNCTION,
583 F_MMOVE,
584 F_IGNORE
585 } fieldtype_t;
586
587 typedef struct
588 {
589 char *name;
590 int ofs;
591 fieldtype_t type;
592 int flags;
593 } field_t;
594
595
596 extern field_t fields[];
597 extern gitem_t itemlist[];
598
599
600 //
601 // g_cmds.c
602 //
603 void Cmd_Help_f (edict_t *ent);
604 void Cmd_Score_f (edict_t *ent);
605
606 //
607 // g_items.c
608 //
609 void PrecacheItem (gitem_t *it);
610 void InitItems (void);
611 void SetItemNames (void);
612 gitem_t *FindItem (char *pickup_name);
613 gitem_t *FindItemByClassname (char *classname);
614 #define ITEM_INDEX(x) ((x)-itemlist)
615 edict_t *Drop_Item (edict_t *ent, gitem_t *item);
616 void SetRespawn (edict_t *ent, float delay);
617 void ChangeWeapon (edict_t *ent);
618 void SpawnItem (edict_t *ent, gitem_t *item);
619 void Think_Weapon (edict_t *ent);
620 int ArmorIndex (edict_t *ent);
621 int PowerArmorType (edict_t *ent);
622 gitem_t *GetItemByIndex (int index);
623 qboolean Add_Ammo (edict_t *ent, gitem_t *item, int count);
624 void Touch_Item (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf);
625
626 //
627 // g_utils.c
628 //
629 qboolean KillBox (edict_t *ent);
630 void G_ProjectSource (vec3_t point, vec3_t distance, vec3_t forward, vec3_t right, vec3_t result);
631 edict_t *G_Find (edict_t *from, int fieldofs, char *match);
632 edict_t *findradius (edict_t *from, vec3_t org, float rad);
633 edict_t *G_PickTarget (char *targetname);
634 void G_UseTargets (edict_t *ent, edict_t *activator);
635 void G_SetMovedir (vec3_t angles, vec3_t movedir);
636
637 void G_InitEdict (edict_t *e);
638 edict_t *G_Spawn (void);
639 void G_FreeEdict (edict_t *e);
640
641 void G_TouchTriggers (edict_t *ent);
642 void G_TouchSolids (edict_t *ent);
643
644 char *G_CopyString (char *in);
645
646 float *tv (float x, float y, float z);
647 char *vtos (vec3_t v);
648
649 float vectoyaw (vec3_t vec);
650 void vectoangles (vec3_t vec, vec3_t angles);
651
652 //
653 // g_combat.c
654 //
655 qboolean OnSameTeam (edict_t *ent1, edict_t *ent2);
656 qboolean CanDamage (edict_t *targ, edict_t *inflictor);
657 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);
658 void T_RadiusDamage (edict_t *inflictor, edict_t *attacker, float damage, edict_t *ignore, float radius, int mod);
659
660 // damage flags
661 #define DAMAGE_RADIUS 0x00000001 // damage was indirect
662 #define DAMAGE_NO_ARMOR 0x00000002 // armour does not protect from this damage
663 #define DAMAGE_ENERGY 0x00000004 // damage is from an energy based weapon
664 #define DAMAGE_NO_KNOCKBACK 0x00000008 // do not affect velocity, just view angles
665 #define DAMAGE_BULLET 0x00000010 // damage is from a bullet (used for ricochets)
666 #define DAMAGE_NO_PROTECTION 0x00000020 // armor, shields, invulnerability, and godmode have no effect
667
668 #define DEFAULT_BULLET_HSPREAD 300
669 #define DEFAULT_BULLET_VSPREAD 500
670 #define DEFAULT_SHOTGUN_HSPREAD 1000
671 #define DEFAULT_SHOTGUN_VSPREAD 500
672 #define DEFAULT_DEATHMATCH_SHOTGUN_COUNT 12
673 #define DEFAULT_SHOTGUN_COUNT 12
674 #define DEFAULT_SSHOTGUN_COUNT 20
675
676 //
677 // g_monster.c
678 //
679 void monster_fire_bullet (edict_t *self, vec3_t start, vec3_t dir, int damage, int kick, int hspread, int vspread, int flashtype);
680 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);
681 void monster_fire_blaster (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype, int effect);
682 void monster_fire_grenade (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int flashtype);
683 void monster_fire_rocket (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype);
684 void monster_fire_railgun (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int flashtype);
685 void monster_fire_bfg (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int kick, float damage_radius, int flashtype);
686 void M_droptofloor (edict_t *ent);
687 void monster_think (edict_t *self);
688 void walkmonster_start (edict_t *self);
689 void swimmonster_start (edict_t *self);
690 void flymonster_start (edict_t *self);
691 void AttackFinished (edict_t *self, float time);
692 void monster_death_use (edict_t *self);
693 void M_CatagorizePosition (edict_t *ent);
694 qboolean M_CheckAttack (edict_t *self);
695 void M_FlyCheck (edict_t *self);
696 void M_CheckGround (edict_t *ent);
697
698 //
699 // g_misc.c
700 //
701 void ThrowHead (edict_t *self, char *gibname, int damage, int type);
702 void ThrowClientHead (edict_t *self, int damage);
703 void ThrowGib (edict_t *self, char *gibname, int damage, int type);
704 void BecomeExplosion1(edict_t *self);
705
706 //
707 // g_ai.c
708 //
709 void AI_SetSightClient (void);
710
711 void ai_stand (edict_t *self, float dist);
712 void ai_move (edict_t *self, float dist);
713 void ai_walk (edict_t *self, float dist);
714 void ai_turn (edict_t *self, float dist);
715 void ai_run (edict_t *self, float dist);
716 void ai_charge (edict_t *self, float dist);
717 int range (edict_t *self, edict_t *other);
718
719 void FoundTarget (edict_t *self);
720 qboolean infront (edict_t *self, edict_t *other);
721 qboolean visible (edict_t *self, edict_t *other);
722 qboolean FacingIdeal(edict_t *self);
723
724 //
725 // g_weapon.c
726 //
727 void ThrowDebris (edict_t *self, char *modelname, float speed, vec3_t origin);
728 qboolean fire_hit (edict_t *self, vec3_t aim, int damage, int kick);
729 void fire_bullet (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int mod);
730 void fire_shotgun (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int count, int mod);
731 void fire_blaster (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int effect, qboolean hyper);
732 void fire_grenade (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, float timer, float damage_radius);
733 void fire_grenade2 (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, float timer, float damage_radius, qboolean held);
734 void fire_rocket (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius, int radius_damage);
735 void fire_rail (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick);
736 void fire_bfg (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius);
737
738 //
739 // g_ptrail.c
740 //
741 void PlayerTrail_Init (void);
742 void PlayerTrail_Add (vec3_t spot);
743 void PlayerTrail_New (vec3_t spot);
744 edict_t *PlayerTrail_PickFirst (edict_t *self);
745 edict_t *PlayerTrail_PickNext (edict_t *self);
746 edict_t *PlayerTrail_LastSpot (void);
747
748 //
749 // g_client.c
750 //
751 void respawn (edict_t *ent);
752 void BeginIntermission (edict_t *targ);
753 void PutClientInServer (edict_t *ent);
754 void InitClientPersistant (gclient_t *client);
755 void InitClientResp (gclient_t *client);
756 void InitBodyQue (void);
757 void ClientBeginServerFrame (edict_t *ent);
758
759 //
760 // g_player.c
761 //
762 void player_pain (edict_t *self, edict_t *other, float kick, int damage);
763 void player_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point);
764
765 //
766 // g_svcmds.c
767 //
768 void ServerCommand (void);
769 qboolean SV_FilterPacket (char *from);
770
771 //
772 // p_view.c
773 //
774 void ClientEndServerFrame (edict_t *ent);
775
776 //
777 // p_hud.c
778 //
779 void MoveClientToIntermission (edict_t *client);
780 void G_SetStats (edict_t *ent);
781 void G_SetSpectatorStats (edict_t *ent);
782 void G_CheckChaseStats (edict_t *ent);
783 void ValidateSelectedItem (edict_t *ent);
784 void DeathmatchScoreboardMessage (edict_t *client, edict_t *killer);
785
786 //
787 // g_pweapon.c
788 //
789 void PlayerNoise(edict_t *who, vec3_t where, int type);
790
791 //
792 // m_move.c
793 //
794 qboolean M_CheckBottom (edict_t *ent);
795 qboolean M_walkmove (edict_t *ent, float yaw, float dist);
796 void M_MoveToGoal (edict_t *ent, float dist);
797 void M_ChangeYaw (edict_t *ent);
798
799 //
800 // g_phys.c
801 //
802 void G_RunEntity (edict_t *ent);
803
804 //
805 // g_main.c
806 //
807 void SaveClientData (void);
808 void FetchClientEntData (edict_t *ent);
809
810 //
811 // g_chase.c
812 //
813 void UpdateChaseCam(edict_t *ent);
814 void ChaseNext(edict_t *ent);
815 void ChasePrev(edict_t *ent);
816 void GetChaseTarget(edict_t *ent);
817
818 //============================================================================
819
820 // client_t->anim_priority
821 #define ANIM_BASIC 0 // stand / run
822 #define ANIM_WAVE 1
823 #define ANIM_JUMP 2
824 #define ANIM_PAIN 3
825 #define ANIM_ATTACK 4
826 #define ANIM_DEATH 5
827 #define ANIM_REVERSE 6
828
829
830 // client data that stays across multiple level loads
831 typedef struct
832 {
833 char userinfo[MAX_INFO_STRING];
834 char netname[16];
835 int hand;
836
837 qboolean connected; // a loadgame will leave valid entities that
838 // just don't have a connection yet
839
840 // values saved and restored from edicts when changing levels
841 int health;
842 int max_health;
843 int savedFlags;
844
845 int selected_item;
846 int inventory[MAX_ITEMS];
847
848 // ammo capacities
849 int max_bullets;
850 int max_shells;
851 int max_rockets;
852 int max_grenades;
853 int max_cells;
854 int max_slugs;
855
856 gitem_t *weapon;
857 gitem_t *lastweapon;
858
859 int power_cubes; // used for tracking the cubes in coop games
860 int score; // for calculating total unit score in coop games
861
862 int game_helpchanged;
863 int helpchanged;
864
865 qboolean spectator; // client is a spectator
866 } client_persistant_t;
867
868 // client data that stays across deathmatch respawns
869 typedef struct
870 {
871 client_persistant_t coop_respawn; // what to set client->pers to on a respawn
872 int enterframe; // level.framenum the client entered the game
873 int score; // frags, etc
874 vec3_t cmd_angles; // angles sent over in the last command
875
876 qboolean spectator; // client is a spectator
877 } client_respawn_t;
878
879 // this structure is cleared on each PutClientInServer(),
880 // except for 'client->pers'
881 struct gclient_s
882 {
883 // known to server
884 player_state_t ps; // communicated by server to clients
885 int ping;
886
887 // private to game
888 client_persistant_t pers;
889 client_respawn_t resp;
890 pmove_state_t old_pmove; // for detecting out-of-pmove changes
891
892 qboolean showscores; // set layout stat
893 qboolean showinventory; // set layout stat
894 qboolean showhelp;
895 qboolean showhelpicon;
896
897 int ammo_index;
898
899 int buttons;
900 int oldbuttons;
901 int latched_buttons;
902
903 qboolean weapon_thunk;
904
905 gitem_t *newweapon;
906
907 // sum up damage over an entire frame, so
908 // shotgun blasts give a single big kick
909 int damage_armor; // damage absorbed by armor
910 int damage_parmor; // damage absorbed by power armor
911 int damage_blood; // damage taken out of health
912 int damage_knockback; // impact damage
913 vec3_t damage_from; // origin for vector calculation
914
915 float killer_yaw; // when dead, look at killer
916
917 weaponstate_t weaponstate;
918 vec3_t kick_angles; // weapon kicks
919 vec3_t kick_origin;
920 float v_dmg_roll, v_dmg_pitch, v_dmg_time; // damage kicks
921 float fall_time, fall_value; // for view drop on fall
922 float damage_alpha;
923 float bonus_alpha;
924 vec3_t damage_blend;
925 vec3_t v_angle; // aiming direction
926 float bobtime; // so off-ground doesn't change it
927 vec3_t oldviewangles;
928 vec3_t oldvelocity;
929
930 float next_drown_time;
931 int old_waterlevel;
932 int breather_sound;
933
934 int machinegun_shots; // for weapon raising
935
936 // animation vars
937 int anim_end;
938 int anim_priority;
939 qboolean anim_duck;
940 qboolean anim_run;
941
942 // powerup timers
943 float quad_framenum;
944 float invincible_framenum;
945 float breather_framenum;
946 float enviro_framenum;
947
948 qboolean grenade_blew_up;
949 float grenade_time;
950 int silencer_shots;
951 int weapon_sound;
952
953 float pickup_msg_time;
954
955 float flood_locktill; // locked from talking
956 float flood_when[10]; // when messages were said
957 int flood_whenhead; // head pointer for when said
958
959 float respawn_time; // can respawn when time > this
960
961 edict_t *chase_target; // player we are chasing
962 qboolean update_chase; // need to update chase info?
963 };
964
965
966 struct edict_s
967 {
968 entity_state_t s;
969 struct gclient_s *client; // NULL if not a player
970 // the server expects the first part
971 // of gclient_s to be a player_state_t
972 // but the rest of it is opaque
973
974 qboolean inuse;
975 int linkcount;
976
977 // FIXME: move these fields to a server private sv_entity_t
978 link_t area; // linked to a division node or leaf
979
980 int num_clusters; // if -1, use headnode instead
981 int clusternums[MAX_ENT_CLUSTERS];
982 int headnode; // unused if num_clusters != -1
983 int areanum, areanum2;
984
985 //================================
986
987 int svflags;
988 vec3_t mins, maxs;
989 vec3_t absmin, absmax, size;
990 solid_t solid;
991 int clipmask;
992 edict_t *owner;
993
994
995 // DO NOT MODIFY ANYTHING ABOVE THIS, THE SERVER
996 // EXPECTS THE FIELDS IN THAT ORDER!
997
998 //================================
999 int movetype;
1000 int flags;
1001
1002 char *model;
1003 float freetime; // sv.time when the object was freed
1004
1005 //
1006 // only used locally in game, not by server
1007 //
1008 char *message;
1009 char *classname;
1010 int spawnflags;
1011
1012 float timestamp;
1013
1014 float angle; // set in qe3, -1 = up, -2 = down
1015 char *target;
1016 char *targetname;
1017 char *killtarget;
1018 char *team;
1019 char *pathtarget;
1020 char *deathtarget;
1021 char *combattarget;
1022 edict_t *target_ent;
1023
1024 float speed, accel, decel;
1025 vec3_t movedir;
1026 vec3_t pos1, pos2;
1027
1028 vec3_t velocity;
1029 vec3_t avelocity;
1030 int mass;
1031 float air_finished;
1032 float gravity; // per entity gravity multiplier (1.0 is normal)
1033 // use for lowgrav artifact, flares
1034
1035 edict_t *goalentity;
1036 edict_t *movetarget;
1037 float yaw_speed;
1038 float ideal_yaw;
1039
1040 float nextthink;
1041 void (*prethink) (edict_t *ent);
1042 void (*think)(edict_t *self);
1043 void (*blocked)(edict_t *self, edict_t *other); //move to moveinfo?
1044 void (*touch)(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf);
1045 void (*use)(edict_t *self, edict_t *other, edict_t *activator);
1046 void (*pain)(edict_t *self, edict_t *other, float kick, int damage);
1047 void (*die)(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point);
1048
1049 float touch_debounce_time; // are all these legit? do we need more/less of them?
1050 float pain_debounce_time;
1051 float damage_debounce_time;
1052 float fly_sound_debounce_time; //move to clientinfo
1053 float last_move_time;
1054
1055 int health;
1056 int max_health;
1057 int gib_health;
1058 int deadflag;
1059 qboolean show_hostile;
1060
1061 float powerarmor_time;
1062
1063 char *map; // target_changelevel
1064
1065 int viewheight; // height above origin where eyesight is determined
1066 int takedamage;
1067 int dmg;
1068 int radius_dmg;
1069 float dmg_radius;
1070 int sounds; //make this a spawntemp var?
1071 int count;
1072
1073 edict_t *chain;
1074 edict_t *enemy;
1075 edict_t *oldenemy;
1076 edict_t *activator;
1077 edict_t *groundentity;
1078 int groundentity_linkcount;
1079 edict_t *teamchain;
1080 edict_t *teammaster;
1081
1082 edict_t *mynoise; // can go in client only
1083 edict_t *mynoise2;
1084
1085 int noise_index;
1086 int noise_index2;
1087 float volume;
1088 float attenuation;
1089
1090 // timing variables
1091 float wait;
1092 float delay; // before firing targets
1093 float random;
1094
1095 float teleport_time;
1096
1097 int watertype;
1098 int waterlevel;
1099
1100 vec3_t move_origin;
1101 vec3_t move_angles;
1102
1103 // move this to clientinfo?
1104 int light_level;
1105
1106 int style; // also used as areaportal number
1107
1108 gitem_t *item; // for bonus items
1109
1110 // common data blocks
1111 moveinfo_t moveinfo;
1112 monsterinfo_t monsterinfo;
1113 };
1114
1115