ref: 1c9d770ddfc094a0f4d41843cb94d9649fb83544
dir: /crbot/game.h/
// game.h -- game dll information visible to server #define GAME_API_VERSION 3 // edict->svflags #define SVF_NOCLIENT 0x00000001 // don't send entity to clients, even if it has effects #define SVF_DEADMONSTER 0x00000002 // treat as CONTENTS_DEADMONSTER for collision #define SVF_MONSTER 0x00000004 // treat as CONTENTS_MONSTER for collision // edict->solid values typedef enum { SOLID_NOT, // no interaction with other objects SOLID_TRIGGER, // only touch when inside, after moving SOLID_BBOX, // touch on edge SOLID_BSP // bsp clip, touch on edge } solid_t; //=============================================================== // link_t is only used for entity area links now typedef struct link_s { struct link_s *prev, *next; } link_t; #define MAX_ENT_CLUSTERS 16 typedef struct edict_t edict_t; typedef struct gclient_s gclient_t; //=============================================================== // // functions provided by the main engine // typedef struct { // special messages void (*bprintf) (int printlevel, char *fmt, ...); void (*dprintf) (char *fmt, ...); void (*cprintf) (edict_t *ent, int printlevel, char *fmt, ...); void (*centerprintf) (edict_t *ent, char *fmt, ...); void (*sound) (edict_t *ent, int channel, int soundindex, float volume, float attenuation, float timeofs); void (*positioned_sound) (vec3_t origin, edict_t *ent, int channel, int soundinedex, float volume, float attenuation, float timeofs); // config strings hold all the index strings, the lightstyles, // and misc data like the sky definition and cdtrack. // All of the current configstrings are sent to clients when // they connect, and changes are sent to all connected clients. void (*configstring) (int num, char *string); void (*error) (char *fmt, ...); // the *index functions create configstrings and some internal server state int (*modelindex) (char *name); int (*soundindex) (char *name); int (*imageindex) (char *name); void (*setmodel) (edict_t *ent, char *name); // collision detection trace_t (*trace) (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, edict_t *passent, int contentmask); int (*pointcontents) (vec3_t point); qboolean (*inPVS) (vec3_t p1, vec3_t p2); qboolean (*inPHS) (vec3_t p1, vec3_t p2); void (*SetAreaPortalState) (int portalnum, qboolean open); qboolean (*AreasConnected) (int area1, int area2); // an entity will never be sent to a client or used for collision // if it is not passed to linkentity. If the size, position, or // solidity changes, it must be relinked. void (*linkentity) (edict_t *ent); void (*unlinkentity) (edict_t *ent); // call before removing an interactive edict int (*BoxEdicts) (vec3_t mins, vec3_t maxs, edict_t **list, int maxcount, int areatype); void (*Pmove) (pmove_t *pmove); // player movement code common with client prediction // network messaging void (*multicast) (vec3_t origin, multicast_t to); void (*unicast) (edict_t *ent, qboolean reliable); void (*WriteChar) (int c); void (*WriteByte) (int c); void (*WriteShort) (int c); void (*WriteLong) (int c); void (*WriteFloat) (float f); void (*WriteString) (char *s); void (*WritePosition) (vec3_t pos); // some fractional bits void (*WriteDir) (vec3_t pos); // single byte encoded, very coarse void (*WriteAngle) (float f); // managed memory allocation void *(*TagMalloc) (int size, int tag); void (*TagFree) (void *block); void (*FreeTags) (int tag); // console variable interaction cvar_t *(*cvar) (char *var_name, char *value, int flags); cvar_t *(*cvar_set) (char *var_name, char *value); cvar_t *(*cvar_forceset) (char *var_name, char *value); // ClientCommand and ServerCommand parameter access int (*argc) (void); char *(*argv) (int n); char *(*args) (void); // concatenation of all argv >= 1 // add commands to the server console as if they were typed in // for map changing, etc void (*AddCommandString) (char *text); void (*DebugGraph) (float value, int color); } game_import_t; // // functions exported by the game subsystem // typedef struct { int apiversion; // the init function will only be called when a game starts, // not each time a level is loaded. Persistant data for clients // and the server can be allocated in init void (*Init) (void); void (*Shutdown) (void); // each new level entered will cause a call to SpawnEntities void (*SpawnEntities) (char *mapname, char *entstring, char *spawnpoint); // Read/Write Game is for storing persistant cross level information // about the world state and the clients. // WriteGame is called every time a level is exited. // ReadGame is called on a loadgame. void (*WriteGame) (char *filename, qboolean autosave); void (*ReadGame) (char *filename); // ReadLevel is called after the default map information has been // loaded with SpawnEntities void (*WriteLevel) (char *filename); void (*ReadLevel) (char *filename); qboolean (*ClientConnect) (edict_t *ent, char *userinfo); void (*ClientBegin) (edict_t *ent); void (*ClientUserinfoChanged) (edict_t *ent, char *userinfo); void (*ClientDisconnect) (edict_t *ent); void (*ClientCommand) (edict_t *ent); void (*ClientThink) (edict_t *ent, usercmd_t *cmd); void (*RunFrame) (void); // ServerCommand will be called when an "sv <command>" command is issued on the // server console. // The game can issue gi.argc() / gi.argv() commands to get the rest // of the parameters void (*ServerCommand) (void); // // global variables shared between game and server // // The edict array is allocated in the game dll so it // can vary in size from one game to another. // // The size will be fixed when ge->Init() is called edict_t *edicts; int edict_size; int num_edicts; // current number, <= max_edicts int max_edicts; } game_export_t; game_export_t *GetGameAPI (game_import_t *import); // g_local.h -- local definitions for game module // the "gameversion" client command will print this plus compile date #define GAMEVERSION "baseq2" // view pitching times #define DAMAGE_TIME 0.5 #define FALL_TIME 0.3 // edict->spawnflags // these are set with checkboxes on each entity in the map editor #define SPAWNFLAG_NOT_EASY 0x00000100 #define SPAWNFLAG_NOT_MEDIUM 0x00000200 #define SPAWNFLAG_NOT_HARD 0x00000400 #define SPAWNFLAG_NOT_DEATHMATCH 0x00000800 #define SPAWNFLAG_NOT_COOP 0x00001000 // edict->flags #define FL_FLY 0x00000001 #define FL_SWIM 0x00000002 // implied immunity to drowining #define FL_IMMUNE_LASER 0x00000004 #define FL_INWATER 0x00000008 #define FL_GODMODE 0x00000010 #define FL_NOTARGET 0x00000020 #define FL_IMMUNE_SLIME 0x00000040 #define FL_IMMUNE_LAVA 0x00000080 #define FL_PARTIALGROUND 0x00000100 // not all corners are valid #define FL_WATERJUMP 0x00000200 // player jumping out of water #define FL_TEAMSLAVE 0x00000400 // not the first on the team #define FL_NO_KNOCKBACK 0x00000800 #define FL_POWER_ARMOR 0x00001000 // power armor (if any) is active #define FL_RESPAWN 0x80000000 // used for item respawning #define FRAMETIME 0.1 // memory tags to allow dynamic memory to be cleaned up #define TAG_GAME 765 // clear when unloading the dll #define TAG_LEVEL 766 // clear when loading a new level #define MELEE_DISTANCE 80 #define BODY_QUEUE_SIZE 5 //8 typedef enum { DAMAGE_NO, DAMAGE_YES, // will take damage if hit DAMAGE_AIM // auto targeting recognizes this } damage_t; typedef enum { WEAPON_READY, WEAPON_ACTIVATING, WEAPON_DROPPING, WEAPON_FIRING } weaponstate_t; typedef enum { AMMO_BULLETS, AMMO_SHELLS, AMMO_ROCKETS, AMMO_GRENADES, AMMO_CELLS, AMMO_SLUGS } ammo_t; //deadflag #define DEAD_NO 0 #define DEAD_DYING 1 #define DEAD_DEAD 2 #define DEAD_RESPAWNABLE 3 //range #define RANGE_MELEE 0 #define RANGE_NEAR 1 #define RANGE_MID 2 #define RANGE_FAR 3 //gib types #define GIB_ORGANIC 0 #define GIB_METALLIC 1 //monster ai flags #define AI_STAND_GROUND 0x00000001 #define AI_TEMP_STAND_GROUND 0x00000002 #define AI_SOUND_TARGET 0x00000004 #define AI_LOST_SIGHT 0x00000008 #define AI_PURSUIT_LAST_SEEN 0x00000010 #define AI_PURSUE_NEXT 0x00000020 #define AI_PURSUE_TEMP 0x00000040 #define AI_HOLD_FRAME 0x00000080 #define AI_GOOD_GUY 0x00000100 #define AI_BRUTAL 0x00000200 #define AI_NOSTEP 0x00000400 #define AI_DUCKED 0x00000800 #define AI_COMBAT_POINT 0x00001000 #define AI_MEDIC 0x00002000 #define AI_RESURRECTING 0x00004000 //monster attack state #define AS_STRAIGHT 1 #define AS_SLIDING 2 #define AS_MELEE 3 #define AS_MISSILE 4 // armor types #define ARMOR_NONE 0 #define ARMOR_JACKET 1 #define ARMOR_COMBAT 2 #define ARMOR_BODY 3 #define ARMOR_SHARD 4 // power armor types #define POWER_ARMOR_NONE 0 #define POWER_ARMOR_SCREEN 1 #define POWER_ARMOR_SHIELD 2 // handedness values #define RIGHT_HANDED 0 #define LEFT_HANDED 1 #define CENTER_HANDED 2 // game.serverflags values #define SFL_CROSS_TRIGGER_1 0x00000001 #define SFL_CROSS_TRIGGER_2 0x00000002 #define SFL_CROSS_TRIGGER_3 0x00000004 #define SFL_CROSS_TRIGGER_4 0x00000008 #define SFL_CROSS_TRIGGER_5 0x00000010 #define SFL_CROSS_TRIGGER_6 0x00000020 #define SFL_CROSS_TRIGGER_7 0x00000040 #define SFL_CROSS_TRIGGER_8 0x00000080 #define SFL_CROSS_TRIGGER_MASK 0x000000ff // noise types for PlayerNoise #define PNOISE_SELF 0 #define PNOISE_WEAPON 1 #define PNOISE_IMPACT 2 // edict->movetype values typedef enum { MOVETYPE_NONE, // never moves MOVETYPE_NOCLIP, // origin and angles change with no interaction MOVETYPE_PUSH, // no clip to world, push on box contact MOVETYPE_STOP, // no clip to world, stops on box contact MOVETYPE_WALK, // gravity MOVETYPE_STEP, // gravity, special edge handling MOVETYPE_FLY, MOVETYPE_TOSS, // gravity MOVETYPE_FLYMISSILE, // extra size to monsters MOVETYPE_BOUNCE } movetype_t; typedef struct { int base_count; int max_count; float normal_protection; float energy_protection; int armor; } gitem_armor_t; // gitem_t->flags #define IT_WEAPON 1 // use makes active weapon #define IT_AMMO 2 #define IT_ARMOR 4 #define IT_STAY_COOP 8 #define IT_KEY 16 #define IT_POWERUP 32 //ZOID #define IT_TECH 64 //ZOID // gitem_t->weapmodel for weapons indicates model index #define WEAP_BLASTER 1 #define WEAP_SHOTGUN 2 #define WEAP_SUPERSHOTGUN 3 #define WEAP_MACHINEGUN 4 #define WEAP_CHAINGUN 5 #define WEAP_GRENADES 6 #define WEAP_GRENADELAUNCHER 7 #define WEAP_ROCKETLAUNCHER 8 #define WEAP_HYPERBLASTER 9 #define WEAP_RAILGUN 10 #define WEAP_BFG 11 #define WEAP_GRAPPLE 12 typedef struct gitem_s { char *classname; // spawning name qboolean (*pickup)(edict_t *ent, edict_t *other); void (*use)(edict_t *ent, struct gitem_s *item); void (*drop)(edict_t *ent, struct gitem_s *item); void (*weaponthink)(edict_t *ent); char *pickup_sound; char *world_model; int world_model_flags; char *view_model; // client side info char *icon; char *pickup_name; // for printing on pickup int count_width; // number of digits to display by icon int quantity; // for ammo how much, for weapons how much is used per shot char *ammo; // for weapons int flags; // IT_* flags int weapmodel; // weapon model index (for weapons) void *info; int tag; char *precaches; // string of all models, sounds, and images this item will use } gitem_t; // // this structure is left intact through an entire game // it should be initialized at dll load time, and read/written to // the server.ssv file for savegames // typedef struct { char helpmessage1[512]; char helpmessage2[512]; int helpchanged; // flash F1 icon if non 0, play sound // and increment only if 1, 2, or 3 gclient_t *clients; // [maxclients] // can't store spawnpoint in level, because // it would get overwritten by the savegame restore char spawnpoint[512]; // needed for coop respawns // store latched cvars here that we want to get at often int maxclients; int maxentities; // cross level triggers int serverflags; // items int num_items; qboolean autosaved; } game_locals_t; // // this structure is cleared as each map is entered // it is read/written to the level.sav file for savegames // typedef struct { int framenum; float time; char level_name[MAX_QPATH]; // the descriptive name (Outer Base, etc) char mapname[MAX_QPATH]; // the server name (base1, etc) char nextmap[MAX_QPATH]; // go here when fraglimit is hit char forcemap[MAX_QPATH]; // go here // intermission state float intermissiontime; // time the intermission was started char *changemap; int exitintermission; vec3_t intermission_origin; vec3_t intermission_angle; edict_t *sight_client; // changed once each frame for coop games edict_t *sight_entity; int sight_entity_framenum; edict_t *sound_entity; int sound_entity_framenum; edict_t *sound2_entity; int sound2_entity_framenum; int pic_health; int total_secrets; int found_secrets; int total_goals; int found_goals; int total_monsters; int killed_monsters; edict_t *current_entity; // entity running from G_RunFrame int body_que; // dead bodies int power_cubes; // ugly necessity for coop } level_locals_t; // spawn_temp_t is only used to hold entity field values that // can be set from the editor, but aren't actualy present // in edict_t during gameplay typedef struct { // world vars char *sky; float skyrotate; vec3_t skyaxis; char *nextmap; int lip; int distance; int height; char *noise; float pausetime; char *item; char *gravity; float minyaw; float maxyaw; float minpitch; float maxpitch; } spawn_temp_t; typedef struct { // fixed data vec3_t start_origin; vec3_t start_angles; vec3_t end_origin; vec3_t end_angles; int sound_start; int sound_middle; int sound_end; float accel; float speed; float decel; float distance; float wait; // state data int state; vec3_t dir; float current_speed; float move_speed; float next_speed; float remaining_distance; float decel_distance; void (*endfunc)(edict_t *); } moveinfo_t; typedef struct { void (*aifunc)(edict_t *self, float dist); float dist; void (*thinkfunc)(edict_t *self); } mframe_t; typedef struct { int firstframe; int lastframe; mframe_t *frame; void (*endfunc)(edict_t *self); } mmove_t; typedef struct { mmove_t *currentmove; int aiflags; int nextframe; float scale; void (*stand)(edict_t *self); void (*idle)(edict_t *self); void (*search)(edict_t *self); void (*walk)(edict_t *self); void (*run)(edict_t *self); void (*dodge)(edict_t *self, edict_t *other, float eta); void (*attack)(edict_t *self); void (*melee)(edict_t *self); void (*sight)(edict_t *self, edict_t *other); qboolean (*checkattack)(edict_t *self); float pausetime; float attack_finished; vec3_t saved_goal; float search_time; float trail_time; vec3_t last_sighting; int attack_state; int lefty; float idle_time; int linkcount; int power_armor_type; int power_armor_power; } monsterinfo_t; extern game_locals_t game; extern level_locals_t level; extern game_import_t gi; extern game_export_t globals; extern spawn_temp_t st; extern int sm_meat_index; extern int snd_fry; // means of death #define MOD_UNKNOWN 0 #define MOD_BLASTER 1 #define MOD_SHOTGUN 2 #define MOD_SSHOTGUN 3 #define MOD_MACHINEGUN 4 #define MOD_CHAINGUN 5 #define MOD_GRENADE 6 #define MOD_G_SPLASH 7 #define MOD_ROCKET 8 #define MOD_R_SPLASH 9 #define MOD_HYPERBLASTER 10 #define MOD_RAILGUN 11 #define MOD_BFG_LASER 12 #define MOD_BFG_BLAST 13 #define MOD_BFG_EFFECT 14 #define MOD_HANDGRENADE 15 #define MOD_HG_SPLASH 16 #define MOD_WATER 17 #define MOD_SLIME 18 #define MOD_LAVA 19 #define MOD_CRUSH 20 #define MOD_TELEFRAG 21 #define MOD_FALLING 22 #define MOD_SUICIDE 23 #define MOD_HELD_GRENADE 24 #define MOD_EXPLOSIVE 25 #define MOD_BARREL 26 #define MOD_BOMB 27 #define MOD_EXIT 28 #define MOD_SPLASH 29 #define MOD_TARGET_LASER 30 #define MOD_TRIGGER_HURT 31 #define MOD_HIT 32 #define MOD_TARGET_BLASTER 33 #define MOD_GRAPPLE 34 #define MOD_FRIENDLY_FIRE 0x8000000 extern int meansOfDeath; extern edict_t *g_edicts; #define FOFS(x) (int)&(((edict_t *)0)->x) #define STOFS(x) (int)&(((spawn_temp_t *)0)->x) #define LLOFS(x) (int)&(((level_locals_t *)0)->x) #define CLOFS(x) (int)&(((gclient_t *)0)->x) #define qrandom() ((rand () & 0x7fff) / ((float)0x7fff)) #define crandom() (2.0 * (qrandom() - 0.5)) extern cvar_t *maxentities; extern cvar_t *deathmatch; extern cvar_t *coop; extern cvar_t *dmflags; extern cvar_t *skill; extern cvar_t *fraglimit; extern cvar_t *timelimit; //ZOID extern cvar_t *capturelimit; //ZOID extern cvar_t *password; extern cvar_t *g_select_empty; extern cvar_t *dedicated; extern cvar_t *sv_gravity; extern cvar_t *sv_maxvelocity; extern cvar_t *gun_x, *gun_y, *gun_z; extern cvar_t *sv_rollspeed; extern cvar_t *sv_rollangle; extern cvar_t *run_pitch; extern cvar_t *run_roll; extern cvar_t *bob_up; extern cvar_t *bob_pitch; extern cvar_t *bob_roll; extern cvar_t *sv_cheats; extern cvar_t *maxclients; #define WORLD (&g_edicts[0]) // item spawnflags #define ITEM_TRIGGER_SPAWN 0x00000001 #define ITEM_NO_TOUCH 0x00000002 // 6 bits reserved for editor flags // 8 bits used as power cube id bits for coop games #define DROPPED_ITEM 0x00010000 #define DROPPED_PLAYER_ITEM 0x00020000 #define ITEM_TARGETS_USED 0x00040000 // // fields are needed for spawning from the entity string // and saving / loading games // #define FFL_SPAWNTEMP 1 typedef enum { F_INT, F_FLOAT, F_LSTRING, // string on disk, pointer in memory, TAG_LEVEL F_GSTRING, // string on disk, pointer in memory, TAG_GAME F_VECTOR, F_ANGLEHACK, F_EDICT, // index on disk, pointer in memory F_ITEM, // index on disk, pointer in memory F_CLIENT, // index on disk, pointer in memory F_IGNORE } fieldtype_t; typedef struct { char *name; int ofs; fieldtype_t type; int flags; } field_t; extern field_t fields[]; extern gitem_t itemlist[]; // // g_cmds.c // void Cmd_Help_f (edict_t *ent); void Cmd_Score_f (edict_t *ent); // // g_items.c // void PrecacheItem (gitem_t *it); void InitItems (void); void SetItemNames (void); gitem_t *FindItem (char *pickup_name); gitem_t *FindItemByClassname (char *classname); #define ITEM_INDEX(x) ((x)-itemlist) edict_t *Drop_Item (edict_t *ent, gitem_t *item); void SetRespawn (edict_t *ent, float delay); void ChangeWeapon (edict_t *ent); void SpawnItem (edict_t *ent, gitem_t *item); void Think_Weapon (edict_t *ent); int ArmorIndex (edict_t *ent); int PowerArmorType (edict_t *ent); gitem_t *GetItemByIndex (int index); qboolean Add_Ammo (edict_t *ent, gitem_t *item, int count); void Touch_Item (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf); // // g_utils.c // qboolean KillBox (edict_t *ent); void G_ProjectSource (vec3_t point, vec3_t distance, vec3_t forward, vec3_t right, vec3_t result); edict_t *G_Find (edict_t *from, int fieldofs, char *match); edict_t *findradius (edict_t *from, vec3_t org, float rad); edict_t *G_PickTarget (char *targetname); void G_UseTargets (edict_t *ent, edict_t *activator); void G_SetMovedir (vec3_t angles, vec3_t movedir); void G_InitEdict (edict_t *e); edict_t *G_Spawn (void); void G_FreeEdict (edict_t *e); void G_TouchTriggers (edict_t *ent); void G_TouchSolids (edict_t *ent); char *G_CopyString (char *in); float *tv (float x, float y, float z); char *vtos (vec3_t v); float vectoyaw (vec3_t vec); void vectoangles (vec3_t vec, vec3_t angles); // // g_combat.c // qboolean OnSameTeam (edict_t *ent1, edict_t *ent2); qboolean CanDamage (edict_t *targ, edict_t *inflictor); qboolean CheckTeamDamage (edict_t *targ, edict_t *attacker); 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); void T_RadiusDamage (edict_t *inflictor, edict_t *attacker, float damage, edict_t *ignore, float radius, int mod); // damage flags #define DAMAGE_RADIUS 0x00000001 // damage was indirect #define DAMAGE_NO_ARMOR 0x00000002 // armour does not protect from this damage #define DAMAGE_ENERGY 0x00000004 // damage is from an energy based weapon #define DAMAGE_NO_KNOCKBACK 0x00000008 // do not affect velocity, just view angles #define DAMAGE_BULLET 0x00000010 // damage is from a bullet (used for ricochets) #define DAMAGE_NO_PROTECTION 0x00000020 // armor, shields, invulnerability, and godmode have no effect #define DEFAULT_BULLET_HSPREAD 300 #define DEFAULT_BULLET_VSPREAD 500 #define DEFAULT_SHOTGUN_HSPREAD 1000 #define DEFAULT_SHOTGUN_VSPREAD 500 #define DEFAULT_DEATHMATCH_SHOTGUN_COUNT 12 #define DEFAULT_SHOTGUN_COUNT 12 #define DEFAULT_SSHOTGUN_COUNT 20 // // g_monster.c // void monster_fire_bullet (edict_t *self, vec3_t start, vec3_t dir, int damage, int kick, int hspread, int vspread, int flashtype); 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); void monster_fire_blaster (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype, int effect); void monster_fire_grenade (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int flashtype); void monster_fire_rocket (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype); void monster_fire_railgun (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int flashtype); void monster_fire_bfg (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int kick, float damage_radius, int flashtype); void M_droptofloor (edict_t *ent); void monster_think (edict_t *self); void walkmonster_start (edict_t *self); void swimmonster_start (edict_t *self); void flymonster_start (edict_t *self); void AttackFinished (edict_t *self, float time); void monster_death_use (edict_t *self); void M_CatagorizePosition (edict_t *ent); qboolean M_CheckAttack (edict_t *self); void M_FlyCheck (edict_t *self); void M_CheckGround (edict_t *ent); // // g_misc.c // void ThrowHead (edict_t *self, char *gibname, int damage, int type); void ThrowClientHead (edict_t *self, int damage); void ThrowGib (edict_t *self, char *gibname, int damage, int type); void BecomeExplosion1(edict_t *self); // // g_ai.c // void AI_SetSightClient (void); void ai_stand (edict_t *self, float dist); void ai_move (edict_t *self, float dist); void ai_walk (edict_t *self, float dist); void ai_turn (edict_t *self, float dist); void ai_run (edict_t *self, float dist); void ai_charge (edict_t *self, float dist); int range (edict_t *self, edict_t *other); void FoundTarget (edict_t *self); qboolean infront (edict_t *self, edict_t *other); qboolean visible (edict_t *self, edict_t *other); qboolean FacingIdeal(edict_t *self); // // g_weapon.c // void ThrowDebris (edict_t *self, char *modelname, float speed, vec3_t origin); qboolean fire_hit (edict_t *self, vec3_t aim, int damage, int kick); void fire_bullet (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int mod); void fire_shotgun (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int count, int mod); void fire_blaster (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int effect, qboolean hyper); void fire_grenade (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, float timer, float damage_radius); void fire_grenade2 (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, float timer, float damage_radius, qboolean held); void fire_rocket (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius, int radius_damage); void fire_rail (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick); void fire_bfg (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius); // // g_ptrail.c // void PlayerTrail_Init (void); void PlayerTrail_Add (vec3_t spot); void PlayerTrail_New (vec3_t spot); edict_t *PlayerTrail_PickFirst (edict_t *self); edict_t *PlayerTrail_PickNext (edict_t *self); edict_t *PlayerTrail_LastSpot (void); // // g_client.c // void respawn (edict_t *ent); void BeginIntermission (edict_t *targ); void PutClientInServer (edict_t *ent); void InitClientPersistant (gclient_t *client); void InitClientResp (gclient_t *client); void InitBodyQue (void); void ClientBeginServerFrame (edict_t *ent); // // g_player.c // void player_pain (edict_t *self, edict_t *other, float kick, int damage); void player_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); // // g_svcmds.c // void ServerCommand (void); // // p_view.c // void ClientEndServerFrame (edict_t *ent); // // p_hud.c // void MoveClientToIntermission (edict_t *client); void G_SetStats (edict_t *ent); void ValidateSelectedItem (edict_t *ent); void DeathmatchScoreboardMessage (edict_t *client, edict_t *killer); // // g_pweapon.c // void PlayerNoise(edict_t *who, vec3_t where, int type); void P_ProjectSource (gclient_t *client, vec3_t point, vec3_t distance, vec3_t forward, vec3_t right, vec3_t result); void Weapon_Generic (edict_t *ent, int FRAME_ACTIVATE_LAST, int FRAME_FIRE_LAST, int FRAME_IDLE_LAST, int FRAME_DEACTIVATE_LAST, int *pause_frames, int *fire_frames, void (*fire)(edict_t *ent)); // // m_move.c // qboolean M_CheckBottom (edict_t *ent); qboolean M_walkmove (edict_t *ent, float yaw, float dist); void M_MoveToGoal (edict_t *ent, float dist); void M_ChangeYaw (edict_t *ent); // // g_phys.c // void G_RunEntity (edict_t *ent); // // g_main.c // void SaveClientData (void); void FetchClientEntData (edict_t *ent); //============================================================================ // client_t->anim_priority #define ANIM_BASIC 0 // stand / run #define ANIM_WAVE 1 #define ANIM_JUMP 2 #define ANIM_PAIN 3 #define ANIM_ATTACK 4 #define ANIM_DEATH 5 // client data that stays across multiple level loads typedef struct { char userinfo[MAX_INFO_STRING]; char netname[16]; int hand; qboolean connected; // a loadgame will leave valid entities that // just don't have a connection yet // values saved and restored from edicts when changing levels int health; int max_health; qboolean powerArmorActive; int selected_item; int inventory[MAX_ITEMS]; // ammo capacities int max_bullets; int max_shells; int max_rockets; int max_grenades; int max_cells; int max_slugs; gitem_t *weapon; gitem_t *lastweapon; int power_cubes; // used for tracking the cubes in coop games int score; // for calculating total unit score in coop games //=== int team_no; } client_persistant_t; // client data that stays across deathmatch respawns typedef struct { client_persistant_t coop_respawn; // what to set client->pers to on a respawn int enterframe; // level.framenum the client entered the game int score; // frags, etc //ZOID int ctf_team; // CTF team int ctf_state; float ctf_lasthurtcarrier; float ctf_lastreturnedflag; float ctf_flagsince; float ctf_lastfraggedcarrier; qboolean id_state; //ZOID vec3_t cmd_angles; // angles sent over in the last command int game_helpchanged; int helpchanged; } client_respawn_t; enum { PMENU_ALIGN_LEFT, PMENU_ALIGN_CENTER, PMENU_ALIGN_RIGHT }; typedef struct pmenuhnd_s { struct pmenu_s *entries; int cur; int num; } pmenuhnd_t; typedef struct pmenu_s { char *text; int align; void *arg; void (*SelectFunc)(edict_t *ent, struct pmenu_s *entry); } pmenu_t; void PMenu_Open(edict_t *ent, pmenu_t *entries, int cur, int num); void PMenu_Close(edict_t *ent); void PMenu_Update(edict_t *ent); void PMenu_Next(edict_t *ent); void PMenu_Prev(edict_t *ent); void PMenu_Select(edict_t *ent); // this structure is cleared on each PutClientInServer(), // except for 'client->pers' struct gclient_s { // known to server player_state_t ps; // communicated by server to clients int ping; // private to game client_persistant_t pers; client_respawn_t resp; pmove_state_t old_pmove; // for detecting out-of-pmove changes qboolean showscores; // set layout stat //ZOID qboolean inmenu; // in menu pmenuhnd_t *menu; // current menu //ZOID qboolean showinventory; // set layout stat qboolean showhelp; qboolean showhelpicon; int ammo_index; int buttons; int oldbuttons; int latched_buttons; qboolean weapon_thunk; gitem_t *newweapon; // sum up damage over an entire frame, so // shotgun blasts give a single big kick int damage_armor; // damage absorbed by armor int damage_parmor; // damage absorbed by power armor int damage_blood; // damage taken out of health int damage_knockback; // impact damage vec3_t damage_from; // origin for vector calculation float killer_yaw; // when dead, look at killer weaponstate_t weaponstate; vec3_t kick_angles; // weapon kicks vec3_t kick_origin; float v_dmg_roll, v_dmg_pitch, v_dmg_time; // damage kicks float fall_time, fall_value; // for view drop on fall float damage_alpha; float bonus_alpha; vec3_t damage_blend; vec3_t v_angle; // aiming direction float bobtime; // so off-ground doesn't change it vec3_t oldviewangles; vec3_t oldvelocity; float next_drown_time; int old_waterlevel; int breather_sound; int machinegun_shots; // for weapon raising // animation vars int anim_end; int anim_priority; qboolean anim_duck; qboolean anim_run; // powerup timers float quad_framenum; float invincible_framenum; float breather_framenum; float enviro_framenum; qboolean grenade_blew_up; float grenade_time; int silencer_shots; int weapon_sound; float pickup_msg_time; float respawn_time; // can respawn when time > this //ZOID void *ctf_grapple; // entity of grapple int ctf_grapplestate; // true if pulling float ctf_grapplereleasetime; // time of grapple release float ctf_regentime; // regen tech float ctf_techsndtime; float ctf_lasttechmsg; edict_t *chase_target; qboolean update_chase; //ZOID //=== cr_menu data int menu_no, menu_item_no; qboolean inuse; }; #define MAX_NODE_LINKS 6 #define NF_ELEVATOR 0x0001 #define NF_TELEPORT 0x0002 #define NF_DOOR 0x0004 #define NF_BUTTON 0x0008 #define NF_LADDER 0x0010 typedef struct path_node_s path_node_t; struct path_node_s { vec3_t position; path_node_t *next; path_node_t* link_to[MAX_NODE_LINKS]; path_node_t* link_from[MAX_NODE_LINKS]; float link_dist[MAX_NODE_LINKS]; edict_t *item; float time; int flags; // used in finding routes float route_dist; }; typedef struct bot_info_pers_s bot_info_pers_t; struct bot_info_pers_s { int skill; int team_no, adapt_count; char skin[64], model[64], name[16]; float speed, rot_speed, attack_range, engage_range; qboolean b_inuse, b_adapting; int playernum; }; #define MAX_UNREACHABLES 12 #define MAX_PATH_NODES 256 #define ASSN_NONE 0 #define ASSN_HELP 1 #define ASSN_GUARD 3 #define ASSN_AMBUSH 4 #define ASSN_GROUP 5 #define ASSN_PATROL 6 typedef struct bot_info_s bot_info_t; struct bot_info_s { float time_last_stuck, time_next_enemy, time_next_pickup, time_last_strafe_switch, time_next_shot, time_stop_shoting, time_chase, time_next_chase_update, time_next_assignment_check, time_next_roam_dir_change, time_stuck_check, time_next_crouch, time_last_message, time_next_fight_message, time_next_jump, time_next_weapon_change, time_next_rocket_avoid, time_weapon_spin_up, time_weapon_spin_down, time_next_special_assignment, time_next_solid, time_next_callforhelp, time_next_salute, time_last_move_target; float strafe_dir; vec3_t move_target, old_origin, shoot_last_target, last_move_target; edict_t *pickup_target; float pickup_target_score; path_node_t *last_node, *next_node, *target_node; void (*old_think)(edict_t *self); qboolean b_crouch, b_on_slope, b_airborn, b_shot_this_frame, b_on_platform, b_on_ladder; vec3_t ladder_dir; int stuck_count, move_block_count; edict_t *unreachable[MAX_UNREACHABLES]; float time_unreachable[MAX_UNREACHABLES]; path_node_t* path[MAX_PATH_NODES]; int path_nodes; int bot_assignment; vec3_t bot_anchor; edict_t* team_leader; void (*postthink) (edict_t *self); }; struct edict_t { entity_state_t s; struct gclient_s *client; // NULL if not a player // the server expects the first part // of gclient_s to be a player_state_t // but the rest of it is opaque qboolean inuse; int linkcount; // FIXME: move these fields to a server private sv_entity_t link_t area; // linked to a division node or leaf int num_clusters; // if -1, use headnode instead int clusternums[MAX_ENT_CLUSTERS]; int headnode; // unused if num_clusters != -1 int areanum, areanum2; //================================ int svflags; vec3_t mins, maxs; vec3_t absmin, absmax, size; solid_t solid; int clipmask; edict_t *owner; // DO NOT MODIFY ANYTHING ABOVE THIS, THE SERVER // EXPECTS THE FIELDS IN THAT ORDER! //================================ int movetype; int flags; char *model; float freetime; // sv.time when the object was freed // // only used locally in game, not by server // char *message; char *classname; int spawnflags; float timestamp; float angle; // set in qe3, -1 = up, -2 = down char *target; char *targetname; char *killtarget; char *team; char *pathtarget; char *deathtarget; char *combattarget; edict_t *target_ent; float speed, accel, decel; vec3_t movedir; vec3_t pos1, pos2; vec3_t velocity; vec3_t avelocity; int mass; float air_finished; float gravity; // per entity gravity multiplier (1.0 is normal) // use for lowgrav artifact, flares edict_t *goalentity; edict_t *movetarget; float yaw_speed; float ideal_yaw; float nextthink; void (*prethink) (edict_t *ent); void (*think)(edict_t *self); void (*blocked)(edict_t *self, edict_t *other); //move to moveinfo? void (*touch)(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf); void (*use)(edict_t *self, edict_t *other, edict_t *activator); void (*pain)(edict_t *self, edict_t *other, float kick, int damage); void (*die)(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); float touch_debounce_time; // are all these legit? do we need more/less of them? float pain_debounce_time; float damage_debounce_time; float fly_sound_debounce_time; //move to clientinfo float last_move_time; int health; int max_health; int gib_health; int deadflag; qboolean show_hostile; float powerarmor_time; char *map; // target_changelevel int viewheight; // height above origin where eyesight is determined int takedamage; int dmg; int radius_dmg; float dmg_radius; int sounds; //make this a spawntemp var? int count; edict_t *chain; edict_t *enemy; edict_t *oldenemy; edict_t *activator; edict_t *groundentity; int groundentity_linkcount; edict_t *teamchain; edict_t *teammaster; edict_t *mynoise; // can go in client only edict_t *mynoise2; int noise_index; int noise_index2; float volume; float attenuation; // timing variables float wait; float delay; // before firing targets float random; float teleport_time; int watertype; int waterlevel; vec3_t move_origin; vec3_t move_angles; // move this to clientinfo? int light_level; int style; // also used as areaportal number gitem_t *item; // for bonus items //== CRbot specific bot_info_t* bot_info; bot_info_pers_t* bot_pers; path_node_t* prev_node; //== // common data blocks moveinfo_t moveinfo; monsterinfo_t monsterinfo; }; #define CTF_STRING_VERSION "1.02" #define STAT_CTF_TEAM1_PIC 17 #define STAT_CTF_TEAM1_CAPS 18 #define STAT_CTF_TEAM2_PIC 19 #define STAT_CTF_TEAM2_CAPS 20 #define STAT_CTF_FLAG_PIC 21 #define STAT_CTF_JOINED_TEAM1_PIC 22 #define STAT_CTF_JOINED_TEAM2_PIC 23 #define STAT_CTF_TEAM1_HEADER 24 #define STAT_CTF_TEAM2_HEADER 25 #define STAT_CTF_TECH 26 #define STAT_CTF_ID_VIEW 27 typedef enum { CTF_NOTEAM, CTF_TEAM1, CTF_TEAM2 } ctfteam_t; typedef enum { CTF_STATE_START, CTF_STATE_PLAYING } ctfstate_t; typedef enum { CTF_GRAPPLE_STATE_FLY, CTF_GRAPPLE_STATE_PULL, CTF_GRAPPLE_STATE_HANG } ctfgrapplestate_t; extern cvar_t *ctf; #define CTF_TEAM1_SKIN "ctf_r" #define CTF_TEAM2_SKIN "ctf_b" #define DF_CTF_FORCEJOIN 131072 #define DF_ARMOR_PROTECT 262144 #define DF_CTF_NO_TECH 524288 #define CTF_CAPTURE_BONUS 15 // what you get for capture #define CTF_TEAM_BONUS 10 // what your team gets for capture #define CTF_RECOVERY_BONUS 1 // what you get for recovery #define CTF_FLAG_BONUS 0 // what you get for picking up enemy flag #define CTF_FRAG_CARRIER_BONUS 2 // what you get for fragging enemy flag carrier #define CTF_FLAG_RETURN_TIME 40 // seconds until auto return #define CTF_CARRIER_DANGER_PROTECT_BONUS 2 // bonus for fraggin someone who has recently hurt your flag carrier #define CTF_CARRIER_PROTECT_BONUS 1 // bonus for fraggin someone while either you or your target are near your flag carrier #define CTF_FLAG_DEFENSE_BONUS 1 // bonus for fraggin someone while either you or your target are near your flag #define CTF_RETURN_FLAG_ASSIST_BONUS 1 // awarded for returning a flag that causes a capture to happen almost immediately #define CTF_FRAG_CARRIER_ASSIST_BONUS 2 // award for fragging a flag carrier if a capture happens almost immediately #define CTF_TARGET_PROTECT_RADIUS 400 // the radius around an object being defended where a target will be worth extra frags #define CTF_ATTACKER_PROTECT_RADIUS 400 // the radius around an object being defended where an attacker will get extra frags when making kills #define CTF_CARRIER_DANGER_PROTECT_TIMEOUT 8 #define CTF_FRAG_CARRIER_ASSIST_TIMEOUT 10 #define CTF_RETURN_FLAG_ASSIST_TIMEOUT 10 #define CTF_AUTO_FLAG_RETURN_TIMEOUT 30 // number of seconds before dropped flag auto-returns #define CTF_TECH_TIMEOUT 60 // seconds before techs spawn again #define CTF_GRAPPLE_SPEED 650 // speed of grapple in flight #define CTF_GRAPPLE_PULL_SPEED 650 // speed player is pulled at void CTFInit(void); void SP_info_player_team1(edict_t *self); void SP_info_player_team2(edict_t *self); char *CTFTeamName(int team); char *CTFOtherTeamName(int team); void CTFAssignSkin(edict_t *ent, char *s); void CTFAssignTeam(gclient_t *who); edict_t *SelectCTFSpawnPoint (edict_t *ent); qboolean CTFPickup_Flag(edict_t *ent, edict_t *other); void CTFDrop_Flag(edict_t *ent, gitem_t *item); void CTFEffects(edict_t *player); void CTFCalcScores(void); void SetCTFStats(edict_t *ent); void CTFDeadDropFlag(edict_t *self); void CTFScoreboardMessage (edict_t *ent, edict_t *killer); void CTFTeam_f (edict_t *ent); void CTFID_f (edict_t *ent); void CTFSay_Team(edict_t *who, char *msg); void CTFFlagSetup (edict_t *ent); void CTFResetFlag(int ctf_team); void CTFFragBonuses(edict_t *targ, edict_t *inflictor, edict_t *attacker); void CTFCheckHurtCarrier(edict_t *targ, edict_t *attacker); // GRAPPLE void CTFWeapon_Grapple (edict_t *ent); void CTFPlayerResetGrapple(edict_t *ent); void CTFGrapplePull(edict_t *self); void CTFResetGrapple(edict_t *self); //TECH gitem_t *CTFWhat_Tech(edict_t *ent); qboolean CTFPickup_Tech (edict_t *ent, edict_t *other); void CTFDrop_Tech(edict_t *ent, gitem_t *item); void CTFDeadDropTech(edict_t *ent); void CTFSetupTechSpawn(void); int CTFApplyResistance(edict_t *ent, int dmg); int CTFApplyStrength(edict_t *ent, int dmg); qboolean CTFApplyStrengthSound(edict_t *ent); qboolean CTFApplyHaste(edict_t *ent); void CTFApplyHasteSound(edict_t *ent); void CTFApplyRegeneration(edict_t *ent); qboolean CTFHasRegeneration(edict_t *ent); void CTFRespawnTech(edict_t *ent); void CTFOpenJoinMenu(edict_t *ent); qboolean CTFStartClient(edict_t *ent); qboolean CTFCheckRules(void); void SP_misc_ctf_banner (edict_t *ent); void SP_misc_ctf_small_banner (edict_t *ent); extern char *ctf_statusbar; void UpdateChaseCam(edict_t *ent); void ChaseNext(edict_t *ent); void ChasePrev(edict_t *ent); void SP_trigger_teleport (edict_t *ent); void SP_info_teleport_destination (edict_t *ent); void CTFJoinTeam(edict_t *ent, int desired_team); // G:\quake2\baseq2\models/player_x/frames // This file generated by qdata - Do NOT Modify #define FRAME_stand01 0 #define FRAME_stand02 1 #define FRAME_stand03 2 #define FRAME_stand04 3 #define FRAME_stand05 4 #define FRAME_stand06 5 #define FRAME_stand07 6 #define FRAME_stand08 7 #define FRAME_stand09 8 #define FRAME_stand10 9 #define FRAME_stand11 10 #define FRAME_stand12 11 #define FRAME_stand13 12 #define FRAME_stand14 13 #define FRAME_stand15 14 #define FRAME_stand16 15 #define FRAME_stand17 16 #define FRAME_stand18 17 #define FRAME_stand19 18 #define FRAME_stand20 19 #define FRAME_stand21 20 #define FRAME_stand22 21 #define FRAME_stand23 22 #define FRAME_stand24 23 #define FRAME_stand25 24 #define FRAME_stand26 25 #define FRAME_stand27 26 #define FRAME_stand28 27 #define FRAME_stand29 28 #define FRAME_stand30 29 #define FRAME_stand31 30 #define FRAME_stand32 31 #define FRAME_stand33 32 #define FRAME_stand34 33 #define FRAME_stand35 34 #define FRAME_stand36 35 #define FRAME_stand37 36 #define FRAME_stand38 37 #define FRAME_stand39 38 #define FRAME_stand40 39 #define FRAME_run1 40 #define FRAME_run2 41 #define FRAME_run3 42 #define FRAME_run4 43 #define FRAME_run5 44 #define FRAME_run6 45 #define FRAME_attack1 46 #define FRAME_attack2 47 #define FRAME_attack3 48 #define FRAME_attack4 49 #define FRAME_attack5 50 #define FRAME_attack6 51 #define FRAME_attack7 52 #define FRAME_attack8 53 #define FRAME_pain101 54 #define FRAME_pain102 55 #define FRAME_pain103 56 #define FRAME_pain104 57 #define FRAME_pain201 58 #define FRAME_pain202 59 #define FRAME_pain203 60 #define FRAME_pain204 61 #define FRAME_pain301 62 #define FRAME_pain302 63 #define FRAME_pain303 64 #define FRAME_pain304 65 #define FRAME_jump1 66 #define FRAME_jump2 67 #define FRAME_jump3 68 #define FRAME_jump4 69 #define FRAME_jump5 70 #define FRAME_jump6 71 #define FRAME_flip01 72 #define FRAME_flip02 73 #define FRAME_flip03 74 #define FRAME_flip04 75 #define FRAME_flip05 76 #define FRAME_flip06 77 #define FRAME_flip07 78 #define FRAME_flip08 79 #define FRAME_flip09 80 #define FRAME_flip10 81 #define FRAME_flip11 82 #define FRAME_flip12 83 #define FRAME_salute01 84 #define FRAME_salute02 85 #define FRAME_salute03 86 #define FRAME_salute04 87 #define FRAME_salute05 88 #define FRAME_salute06 89 #define FRAME_salute07 90 #define FRAME_salute08 91 #define FRAME_salute09 92 #define FRAME_salute10 93 #define FRAME_salute11 94 #define FRAME_taunt01 95 #define FRAME_taunt02 96 #define FRAME_taunt03 97 #define FRAME_taunt04 98 #define FRAME_taunt05 99 #define FRAME_taunt06 100 #define FRAME_taunt07 101 #define FRAME_taunt08 102 #define FRAME_taunt09 103 #define FRAME_taunt10 104 #define FRAME_taunt11 105 #define FRAME_taunt12 106 #define FRAME_taunt13 107 #define FRAME_taunt14 108 #define FRAME_taunt15 109 #define FRAME_taunt16 110 #define FRAME_taunt17 111 #define FRAME_wave01 112 #define FRAME_wave02 113 #define FRAME_wave03 114 #define FRAME_wave04 115 #define FRAME_wave05 116 #define FRAME_wave06 117 #define FRAME_wave07 118 #define FRAME_wave08 119 #define FRAME_wave09 120 #define FRAME_wave10 121 #define FRAME_wave11 122 #define FRAME_point01 123 #define FRAME_point02 124 #define FRAME_point03 125 #define FRAME_point04 126 #define FRAME_point05 127 #define FRAME_point06 128 #define FRAME_point07 129 #define FRAME_point08 130 #define FRAME_point09 131 #define FRAME_point10 132 #define FRAME_point11 133 #define FRAME_point12 134 #define FRAME_crstnd01 135 #define FRAME_crstnd02 136 #define FRAME_crstnd03 137 #define FRAME_crstnd04 138 #define FRAME_crstnd05 139 #define FRAME_crstnd06 140 #define FRAME_crstnd07 141 #define FRAME_crstnd08 142 #define FRAME_crstnd09 143 #define FRAME_crstnd10 144 #define FRAME_crstnd11 145 #define FRAME_crstnd12 146 #define FRAME_crstnd13 147 #define FRAME_crstnd14 148 #define FRAME_crstnd15 149 #define FRAME_crstnd16 150 #define FRAME_crstnd17 151 #define FRAME_crstnd18 152 #define FRAME_crstnd19 153 #define FRAME_crwalk1 154 #define FRAME_crwalk2 155 #define FRAME_crwalk3 156 #define FRAME_crwalk4 157 #define FRAME_crwalk5 158 #define FRAME_crwalk6 159 #define FRAME_crattak1 160 #define FRAME_crattak2 161 #define FRAME_crattak3 162 #define FRAME_crattak4 163 #define FRAME_crattak5 164 #define FRAME_crattak6 165 #define FRAME_crattak7 166 #define FRAME_crattak8 167 #define FRAME_crattak9 168 #define FRAME_crpain1 169 #define FRAME_crpain2 170 #define FRAME_crpain3 171 #define FRAME_crpain4 172 #define FRAME_crdeath1 173 #define FRAME_crdeath2 174 #define FRAME_crdeath3 175 #define FRAME_crdeath4 176 #define FRAME_crdeath5 177 #define FRAME_death101 178 #define FRAME_death102 179 #define FRAME_death103 180 #define FRAME_death104 181 #define FRAME_death105 182 #define FRAME_death106 183 #define FRAME_death201 184 #define FRAME_death202 185 #define FRAME_death203 186 #define FRAME_death204 187 #define FRAME_death205 188 #define FRAME_death206 189 #define FRAME_death301 190 #define FRAME_death302 191 #define FRAME_death303 192 #define FRAME_death304 193 #define FRAME_death305 194 #define FRAME_death306 195 #define FRAME_death307 196 #define FRAME_death308 197 #define MODEL_SCALE 1.000000 #define CRBOT_VER "v1.14" #define CRBOT_INFO "CRBot " CRBOT_VER ", coded by Mike Malakhov\nwith CTF support\nhttp://www.pobox.com/~ww/bot.html \n\nUse inventory keys to access bot's menu\n\nTo add bots type 'sv addbots 0 <amount>'\nin the console window" void SP_crbot( char* name, int skill_level, char* skin, int team, char* model ); void cr_kill_bot( char* bot_name ); void cr_team_help( edict_t* self ); void cr_team_group( edict_t* self ); void cr_team_guard( edict_t* self, char* name ); void cr_team_patrol( edict_t* self, char* name ); void cr_team_free( edict_t* self, char* name ); void cr_menu_init(void); void cr_menu_draw( edict_t *self ); void cr_menu_select( edict_t *self, int ds ); void cr_menu_down( edict_t *self ); void cr_menu_up( edict_t *self ); void cr_init(void); void cr_init_globals(void); void cr_client_connect(edict_t *ent); void cr_exit_level(void); void cr_routes_save( edict_t *self ); // void cr_scoreboard_message( char* string, edict_t *self ); void cr_show_stats( edict_t *self ); void cr_show_team_stats( edict_t *self ); extern cvar_t *bot_skill; extern cvar_t *bot_skin; extern cvar_t *bot_model; extern cvar_t *bot_team; extern cvar_t *bot_chat; extern cvar_t *bot_taunt; extern cvar_t *obituary_msgs; extern cvar_t *bot_menu; extern cvar_t *game_path; extern cvar_t *base_path; extern cvar_t *map_cycle; extern cvar_t *no_tech; extern cvar_t *no_hook; extern cvar_t *bot_debug; void cr_get_full_pathname( char* fullname, char* name ); void ShowGun( edict_t *ent ); qboolean cr_map_cycle(void); extern char next_map_name[64];