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