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