reaction/code/cgame/cg_local.h
2013-07-21 23:15:13 +00:00

2639 lines
78 KiB
C

//-----------------------------------------------------------------------------
//
// $Id$
//
//-----------------------------------------------------------------------------
//
// $Log$
// Revision 1.164 2007/02/08 23:49:59 jbravo
// Removing cg_RQ3_avidemo
//
// Revision 1.163 2007/02/03 15:02:21 jbravo
// Renamed RQ3 to Reaction, Dropped loading of various baseq3 media, disabled the follow command, fixed grenades killing teammates and some cleanups
//
// Revision 1.162 2006/04/14 18:16:31 makro
// no message
//
// Revision 1.161 2005/09/07 22:19:15 makro
// Dead player view offset tweaks
//
// Revision 1.160 2005/09/07 20:29:05 makro
// Stuff I can't remember
//
// Revision 1.159 2005/02/15 16:33:38 makro
// Tons of updates (entity tree attachment system, UI vectors)
//
// Revision 1.158 2004/03/07 17:39:10 makro
// no message
//
// Revision 1.157 2004/01/26 21:26:08 makro
// no message
//
// Revision 1.156 2003/09/20 19:38:16 makro
// Lens flares, what else ?
//
// Revision 1.155 2003/09/18 19:05:10 makro
// Lens flares
//
// Revision 1.154 2003/09/17 23:49:29 makro
// Lens flares. Opendoor trigger_multiple fixes
//
// Revision 1.153 2003/09/10 21:40:35 makro
// Cooler breath puffs. Locked r_fastSky on maps with global fog.
// Some other things I can't remember.
//
// Revision 1.152 2003/09/07 19:51:40 makro
// no message
//
// Revision 1.151 2003/09/01 15:09:48 jbravo
// Cleanups, crashbug fix and version bumped to 3.2
//
// Revision 1.150 2003/08/31 14:48:33 jbravo
// Code not compiling under linux fixed and a warning silenced.
//
// Revision 1.149 2003/08/10 20:13:26 makro
// no message
//
// Revision 1.148 2003/07/30 16:05:46 makro
// no message
//
// Revision 1.147 2003/04/23 17:49:38 slicer
// Added new cvar cg_RQ3_ssgZoomSensLock
//
// Revision 1.146 2003/04/19 17:41:26 jbravo
// Applied changes that where in 1.29h -> 1.32b gamecode.
//
// Revision 1.145 2003/04/19 15:27:30 jbravo
// Backing out of most of unlagged. Only optimized prediction and smooth clients
// remains.
//
// Revision 1.144 2003/04/13 21:58:00 slicer
// Added a Zoom Sensitivity Lock during fire sequence of ssg; removed unnecessary code
//
// Revision 1.143 2003/04/07 18:21:34 niceass
// teamplay irvision
//
// Revision 1.142 2003/04/06 18:28:30 makro
// SSG crosshairs
//
// Revision 1.141 2003/04/02 22:23:51 jbravo
// More replacements tweaks. Added zcam_stfu
//
// Revision 1.140 2003/03/29 16:01:36 jbravo
// _skin cvars now fully removed. dlight code from Makro added. cvar
// defaults fixed.
//
// Revision 1.139 2003/03/28 22:25:10 makro
// no message
//
// Revision 1.138 2003/03/28 10:36:02 jbravo
// Tweaking the replacement system a bit. Reactionmale now the default model
//
// Revision 1.137 2003/03/09 21:30:38 jbravo
// Adding unlagged. Still needs work.
//
// Revision 1.136 2003/02/27 08:10:20 jbravo
// Added replacement model functionality for ammo
//
// Revision 1.135 2003/02/16 21:39:09 makro
// Fixed "timelimit is read only" on local servers error
//
// Revision 1.134 2003/02/05 20:21:38 jbravo
// Fixed the model replacement system. Its no longer an ugly hack.
//
// Revision 1.133 2003/02/01 02:15:31 jbravo
// Replacement models and items
//
// Revision 1.132 2002/12/05 23:11:29 blaze
// Added item replacement code
//
// Revision 1.131 2002/12/02 19:52:05 niceass
// water pressure & shell ejection stuff
//
// Revision 1.130 2002/11/18 04:39:47 jbravo
// Cleanup of cg_weapons.c
//
// Revision 1.129 2002/10/30 20:04:34 jbravo
// Adding helmet
//
// Revision 1.128 2002/10/21 21:01:09 niceass
// no ref ready code
//
// Revision 1.127 2002/10/20 21:24:32 blaze
// Added cg_RQ3_gunname cvars. These can be used to choose weapon replacements. You will need 3 icons that I will upload to the ftp. These should go in the next pk3
//
// Revision 1.126 2002/09/01 21:14:37 makro
// Sky portal tweaks
//
// Revision 1.125 2002/08/29 23:58:28 makro
// Sky portals
//
// Revision 1.124 2002/08/29 14:24:43 niceass
// new wallhack thing
//
// Revision 1.123 2002/08/29 04:42:40 blaze
// Anti OGC code
//
// Revision 1.122 2002/08/28 23:10:06 jbravo
// Added cg_RQ3_SuicideLikeARealMan, timestamping to server logs and
// fixed stats for non-TP modes.
//
// Revision 1.121 2002/08/28 18:52:09 jbravo
// Added the Keanu male radio sound set.
//
// Revision 1.120 2002/08/27 05:10:42 niceass
// new ctb marker shader names
//
// Revision 1.119 2002/08/25 07:08:41 niceass
// added "life" setting to func_pressure
//
// Revision 1.118 2002/08/25 00:45:24 niceass
// q3f atmosphere
//
// Revision 1.117 2002/08/24 08:01:11 niceass
// new ref system for scoreboard
//
// Revision 1.116 2002/08/22 03:30:20 niceass
// countdown code added
//
// Revision 1.115 2002/08/07 04:45:07 niceass
// ctb changes
//
// Revision 1.114 2002/08/07 03:35:57 jbravo
// Added dynamic radio and stopped all radio usage during lca
//
// Revision 1.113 2002/08/03 06:52:35 jbravo
// Fixed the plost3 sound in all radiopaks and now damage is only tracked for
// players you hit that are not on your team
//
// Revision 1.112 2002/07/26 22:28:38 jbravo
// Fixed the server about menu, made the UI handle illegal models and skins
// better.
//
// Revision 1.111 2002/07/26 06:21:43 jbravo
// Fixed the MM settings stuff so it works on remote servers also.
// Removed the MM_NAMES_COLOR since it broke on nicks with color in them.
//
// Revision 1.110 2002/07/21 18:46:32 niceass
// weaponprediction cvar added
//
// Revision 1.109 2002/07/20 02:25:53 jbravo
// Added the AQDT CTB sounds to the base radio paks
//
// Revision 1.108 2002/07/19 04:40:56 jbravo
// Added 2 new radio sets and ctb radio sound support
//
// Revision 1.107 2002/07/19 04:32:42 niceass
// added marker support for ctb
//
// Revision 1.106 2002/07/13 22:42:18 makro
// Semi-working fog hull, semi-working sky portals (cgame code commented out)
// Basically, semi-working stuff :P
//
// Revision 1.105 2002/07/08 04:25:29 niceass
// removed deaths
//
// Revision 1.104 2002/07/07 18:36:13 jbravo
// Added an AntiIdle system. Can play insane sounds for idle players, drop them
// from teams or kick them. Upped version to Beta 2.1
//
// Revision 1.103 2002/06/30 17:33:01 jbravo
// New radio sounds and the 0wned sound was added.
//
// Revision 1.102 2002/06/24 05:55:24 niceass
// drawping
//
// Revision 1.101 2002/06/23 04:36:02 niceass
// change to foglaser
//
// Revision 1.100 2002/06/21 23:20:34 blaze
// cg_RQ3_overlaycrosshair when set to 1 will draw your non zoomed crosshair overtop of your ssg crosshair
//
// Revision 1.99 2002/06/21 21:05:57 niceass
// laserfog stuff & removed unused cvar
//
// Revision 1.98 2002/06/21 04:10:59 niceass
// fog laser
//
// Revision 1.97 2002/06/19 05:17:57 niceass
// scoreboard stuff
//
// Revision 1.96 2002/06/16 23:26:23 blaze
// fixed to allow > 16 breakables
//
// Revision 1.95 2002/06/16 20:06:13 jbravo
// Reindented all the source files with "indent -kr -ut -i8 -l120 -lc120 -sob -bad -bap"
//
// Revision 1.94 2002/06/16 19:12:52 jbravo
// Removed the MISSIONPACK ifdefs and missionpack only code.
//
// Revision 1.93 2002/06/12 23:05:14 slicer
// SSG Zooming final tweak
//
// Revision 1.92 2002/06/12 22:31:59 slicer
// Even better way to improve the Cvar Anti-Cheat System
//
// Revision 1.91 2002/06/12 15:30:24 slicer
// Improved and fixed the Anti-Cheat System
//
// Revision 1.90 2002/06/11 22:49:42 niceass
// HC brass
//
// Revision 1.89 2002/06/10 14:02:31 slicer
// Removed rq3_cmd : ROUND , associated to cg_RQ3_team_round_going that wasn't being used
//
// Revision 1.88 2002/06/10 13:20:03 slicer
// RefID is now passed trought scoreboard, no more lca cvar, only cg.lca
//
// Revision 1.87 2002/06/09 05:16:17 niceass
// pressure change
//
// Revision 1.86 2002/06/06 01:54:26 niceass
// pressure change
//
// Revision 1.85 2002/06/05 23:36:07 niceass
// "ready" command lag fix
//
// Revision 1.84 2002/06/03 00:48:10 niceass
// match scoreboard changes
//
// Revision 1.83 2002/05/28 01:17:01 jbravo
// More gib fixes. g_RQ3_gib added
//
// Revision 1.82 2002/05/27 07:02:11 niceass
// reflection changes
//
// Revision 1.81 2002/05/26 05:13:08 niceass
// pressure and progress stuff
//
// Revision 1.80 2002/05/21 14:59:11 makro
// cg_RQ3_avidemo
//
// Revision 1.79 2002/05/19 21:27:51 blaze
// added force and buoyancy to breakables
//
// Revision 1.78 2002/05/19 21:04:37 jbravo
// Tkok popup system
//
// Revision 1.77 2002/05/19 18:32:11 jbravo
// Made new cvars for regular xhair colors.
//
// Revision 1.76 2002/05/18 21:58:53 blaze
// cg_RQ3_autoaction support
//
// Revision 1.75 2002/05/18 03:55:35 niceass
// many misc. changes
//
// Revision 1.74 2002/05/12 14:39:48 makro
// Wood, brick & ceramic impact sounds
//
// Revision 1.73 2002/05/11 19:55:20 slicer
// Added sub and captain to the scoreboard parser
//
// Revision 1.72 2002/05/11 19:13:42 makro
// Sand surfaceparm
//
// Revision 1.71 2002/05/11 15:40:41 slicer
// Changed cg_RQ3_<team count> cvars to ui_RQ3_ and added a synch system for these
//
// Revision 1.70 2002/05/09 06:45:14 niceass
// New tracers
//
// Revision 1.69 2002/04/30 11:20:12 jbravo
// Redid the teamcount cvars.
//
// Revision 1.68 2002/04/29 06:11:28 niceass
// centerprint, pressure and matchmode stuff
//
// Revision 1.67 2002/04/23 06:08:24 niceass
// scoreboard stuff
//
// Revision 1.66 2002/04/20 15:05:08 makro
// More footstep sounds, a few other things
//
// Revision 1.65 2002/04/18 16:13:23 jbravo
// Scoreboard now shows green for live players and white for dead.
// Time should not get reset on deaths any more.
//
// Revision 1.64 2002/04/07 12:49:53 slicer
// Added 'teamname' command for MM, and tweaked the cvar system.
//
// Revision 1.63 2002/04/03 03:13:48 blaze
// NEW BREAKABLE CODE - will break all old breakables(wont appear in maps)
//
// Revision 1.62 2002/03/31 02:03:13 niceass
// added tag declaration
//
// Revision 1.61 2002/03/30 23:20:10 jbravo
// Added damage in scoreboard.
//
// Revision 1.60 2002/03/30 21:51:42 jbravo
// Removed all those ifdefs for zcam.
//
// Revision 1.59 2002/03/24 22:48:29 niceass
// cg_draw change for scoreboard
//
// Revision 1.58 2002/03/23 05:50:47 jbravo
// Moved enableDust out of the missionpack
//
// Revision 1.57 2002/03/23 05:17:42 jbravo
// Major cleanup of game -> cgame communication with LCA vars.
//
// Revision 1.56 2002/03/21 15:02:05 jbravo
// More teamname cleanups and fix for fraglines.
//
// Revision 1.55 2002/03/21 02:17:39 blaze
// more func_explosive goodness
//
// Revision 1.54 2002/03/17 21:32:23 jbravo
// Fixed the dynamic teamnames system up a bit to reduce traffic
//
// Revision 1.53 2002/03/16 21:50:09 niceass
// All new shell ejection code
//
// Revision 1.52 2002/03/14 16:04:26 slicer
// Optimization on radio parsing
//
// Revision 1.51 2002/03/14 02:24:39 jbravo
// Adding radio :)
//
// Revision 1.50 2002/03/11 02:25:38 niceass
// client gravity fix/tag shell ejection
//
// Revision 1.49 2002/02/28 05:41:54 blaze
// weapons stats on client side
//
// Revision 1.48 2002/02/10 08:17:08 niceass
// many changes to scoreboard (deaths/second mode)
//
// Revision 1.47 2002/02/10 02:49:13 niceass
// re-added zcam #define
//
// Revision 1.46 2002/02/08 05:52:18 niceass
// cg_drawcleanrect declaration added.
//
// Revision 1.45 2002/02/05 23:42:06 slicer
// More on matchmode..
//
// Revision 1.44 2002/02/04 02:17:39 jbravo
// scoreStartTime definition missing
//
// Revision 1.43 2002/02/04 00:11:12 slicer
// Matchmode: Teams Ready/Not Ready goes by cvar MM_team1/2
//
// Revision 1.42 2002/01/30 07:37:25 niceass
// EnableBreath added for mappers (TA thing)
//
// Revision 1.41 2002/01/24 14:20:53 jbravo
// Adding func_explosive and a few new surfaceparms
//
// Revision 1.40 2002/01/14 01:19:23 niceass
// No more default 800 gravity on items - NiceAss
//
// Revision 1.39 2002/01/11 20:20:57 jbravo
// Adding TP to main branch
//
// Revision 1.38 2002/01/11 19:48:29 jbravo
// Formatted the source in non DOS format.
//
// Revision 1.37 2001/12/31 16:28:41 jbravo
// I made a Booboo with the Log tag.
//
//
//-----------------------------------------------------------------------------
// Copyright (C) 1999-2000 Id Software, Inc.
//
#include "../qcommon/q_shared.h"
#include "../renderercommon/tr_types.h"
#include "../renderergl2/tr_extratypes.h"
#include "../game/bg_public.h"
#include "cg_public.h"
// The entire cgame module is unloaded and reloaded on each level change,
// so there is NO persistant data between levels on the client side.
// If you absolutely need something stored, it can either be kept
// by the server in the server stored userinfos, or stashed in a cvar.
#define POWERUP_BLINKS 5
// NiceAss: Weapon scales
#define WEAPON_KNIFE_SCALE 1.5
#define WEAPON_GUN_SCALE 1.2
#define WEAPON_OTHER_SCALE 1.0
#define POWERUP_BLINK_TIME 1000
#define FADE_TIME 200
#define PULSE_TIME 200
#define DAMAGE_DEFLECT_TIME 100
#define DAMAGE_RETURN_TIME 400
#define DAMAGE_TIME 500
#define LAND_DEFLECT_TIME 150
#define LAND_RETURN_TIME 300
#define STEP_TIME 200
#define DUCK_TIME 100
#define PAIN_TWITCH_TIME 200
#define WEAPON_SELECT_TIME 1400
#define KICK_TIME 40 // Elder: default kick time, added for kick decay
// Elder: decreased from 1000
#define ITEM_SCALEUP_TIME 250
#define ZOOM_TIME 150
// Elder: increased from 200
#define ITEM_BLOB_TIME 300
#define MUZZLE_FLASH_TIME 20
#define SINK_TIME 1000 // time for fragments to sink into ground before going away
#define ATTACKER_HEAD_TIME 10000
#define REWARD_TIME 3000
#define PULSE_SCALE 1.5 // amount to scale up the icons when activating
#define MAX_STEP_CHANGE 32
#define MAX_VERTS_ON_POLY 10
#define MAX_MARK_POLYS 256
#define STAT_MINUS 10 // num frame for '-' stats digit
#define ICON_SIZE 48
//Elder: small icon size added
#define SMICON_SIZE 32
#define CHAR_WIDTH 32
#define CHAR_HEIGHT 48
#define TEXT_ICON_SPACE 4
#define MSGQUEUE_WIDTH 80
#define MSGQUEUE_HEIGHT 8
// very large characters
#define GIANT_WIDTH 32
#define GIANT_HEIGHT 48
//Makro - moved to bg_public.h
//#define NUM_CROSSHAIRS 10
#define TEAM_OVERLAY_MAXNAME_WIDTH 12
#define TEAM_OVERLAY_MAXLOCATION_WIDTH 16
// JBravo: used to store replacement models
#define MAX_MODEL_LEN 128
// Elder: changed to good ol' resdog
#define DEFAULT_MODEL "reactionmale"
// Elder: this is added
#define DEFAULT_SKIN "default"
#define DEFAULT_TEAM_MODEL "reactionmale"
#define DEFAULT_TEAM_HEAD "reactionmale"
// Elder: Changed
#define DEFAULT_REDTEAM_NAME "Reservoir Dogs"
#define DEFAULT_BLUETEAM_NAME "Psychos"
// Elder: Some ssg stuff
#define ZOOM_LEVELS 3
#define ZOOM_PREPTIME 10 //milliseconds
// Elder: Zoom status
#define ZOOM_OUTOFAMMO -1 // stay in current FOV even when firing
#define ZOOM_IDLE 0 // stay in current FOV if not firing or reloading
#define ZOOM_OUT 1 // switch to 90 degree FOV
// Elder: max number of "blood" marks when hitting a player w/ shell weapons
#define MAX_SHELL_HITS 6
typedef enum {
FOOTSTEP_NORMAL,
FOOTSTEP_BOOT,
FOOTSTEP_FLESH,
FOOTSTEP_MECH,
FOOTSTEP_ENERGY,
FOOTSTEP_METAL,
FOOTSTEP_SPLASH,
// Elder: new surface sounds
FOOTSTEP_GRAVEL,
FOOTSTEP_WOOD,
FOOTSTEP_CARPET,
FOOTSTEP_METAL2,
FOOTSTEP_GLASS,
FOOTSTEP_GRASS,
// JBravo: new surface sounds
FOOTSTEP_SNOW,
FOOTSTEP_MUD,
FOOTSTEP_WOOD2,
FOOTSTEP_HARDMETAL,
// Makro: more sounds
FOOTSTEP_LEAVES,
FOOTSTEP_CEMENT,
FOOTSTEP_MARBLE,
FOOTSTEP_SNOW2,
FOOTSTEP_HARDSTEPS,
FOOTSTEP_SAND,
FOOTSTEP_TOTAL
} footstep_t;
typedef enum {
IMPACTSOUND_DEFAULT,
IMPACTSOUND_METAL,
IMPACTSOUND_FLESH,
// rq3 onwards
IMPACTSOUND_GLASS,
//Makro - added
IMPACTSOUND_BRICK,
IMPACTSOUND_WOOD,
IMPACTSOUND_CERAMIC,
IMPACTSOUND_SNOW,
IMPACTSOUND_GRASS
} impactSound_t;
//Blaze: anti cheat stuff
typedef struct {
char cvar[40];
float low;
float high;
} cheat_cvar;
//=================================================
// player entities need to track more information
// than any other type of entity.
// note that not every player entity is a client entity,
// because corpses after respawn are outside the normal
// client numbering range
// when changing animation, set animationTime to frameTime + lerping time
// The current lerp will finish out, then it will lerp to the new animation
typedef struct {
int oldFrame;
int oldFrameTime; // time when ->oldFrame was exactly on
int frame;
int frameTime; // time when ->frame will be exactly on
float backlerp;
float yawAngle;
qboolean yawing;
float pitchAngle;
qboolean pitching;
int animationNumber; // may include ANIM_TOGGLEBIT
animation_t *animation;
int animationTime; // time when the first frame of the animation will be exact
} lerpFrame_t;
typedef struct {
lerpFrame_t legs, torso, flag;
int painTime;
int painDirection; // flip from 0 to 1
int lightningFiring;
// railgun trail spawning
// vec3_t railgunImpact;
qboolean railgunFlash;
// machinegun spinning
float barrelAngle;
int barrelTime;
qboolean barrelSpinning;
qboolean noHead;
//Blaze: for weapon animations
lerpFrame_t weapon;
} playerEntity_t;
//=================================================
// centity_t have a direct corespondence with gentity_t in the game, but
// only the entityState_t is directly communicated to the cgame
typedef struct centity_s {
entityState_t currentState; // from cg.frame
entityState_t nextState; // from cg.nextFrame, if available
qboolean interpolate; // true if next is valid to interpolate to
qboolean currentValid; // true if cg.frame holds this entity
int muzzleFlashTime; // move to playerEntity?
int ejectBrassTime; // NiceAss: set when the weapon should eject a shell
int previousEvent;
int teleportFlag;
int trailTime; // so missile trails can handle dropped initial packets
int dustTrailTime;
int miscTime;
int snapShotTime; // last time this entity was found in a snapshot
playerEntity_t pe;
int errorTime; // decay the error from this time
vec3_t errorOrigin;
vec3_t errorAngles;
qboolean extrapolated; // false if origin / angles is an interpolation
vec3_t rawOrigin;
vec3_t rawAngles;
vec3_t beamEnd;
// exact interpolated position of entity on this frame
vec3_t lerpOrigin;
vec3_t lerpAngles;
} centity_t;
//======================================================================
// local entities are created as a result of events or predicted actions,
// and live independantly from all server transmitted entities
typedef struct markPoly_s {
struct markPoly_s *prevMark, *nextMark;
int time;
qhandle_t markShader;
qboolean alphaFade; // fade alpha instead of rgb
float color[4];
poly_t poly;
polyVert_t verts[MAX_VERTS_ON_POLY];
} markPoly_t;
typedef enum {
LE_MARK,
LE_EXPLOSION,
LE_SPRITE_EXPLOSION,
LE_FRAGMENT,
LE_MOVE_SCALE_FADE,
LE_FALL_SCALE_FADE,
LE_FADE_RGB,
LE_SCALE_FADE,
LE_SCOREPLUM,
LE_PRESSURE,
LE_TRACER,
} leType_t;
typedef enum {
LEF_PUFF_DONT_SCALE = 0x0001, // do not scale size over time
LEF_TUMBLE = 0x0002, // tumble over time, used for ejecting shells
LEF_SOUND1 = 0x0004, // sound 1 for kamikaze
LEF_SOUND2 = 0x0008, // sound 2 for kamikaze
LEF_STEAM = 0x0010, // NiceAss: For pressure entities
LEF_FLAME = 0x0020,
LEF_AIR = 0x0040,
LEF_WATER = 0x0080
} leFlag_t;
typedef enum {
LEMT_NONE,
LEMT_BURN,
LEMT_BLOOD
} leMarkType_t; // fragment local entities can leave marks on walls
typedef enum {
LEBS_NONE,
LEBS_BLOOD,
LEBS_BRASS
} leBounceSoundType_t; // fragment local entities can make sounds on impacts
typedef struct localEntity_s {
struct localEntity_s *prev, *next;
leType_t leType;
int leFlags;
int startTime;
int endTime;
int fadeInTime;
float lifeRate; // 1.0 / (endTime - startTime)
trajectory_t pos;
trajectory_t angles;
float bounceFactor; // 0.0 = no bounce, 1.0 = perfect
float color[4];
float radius;
float light;
vec3_t lightColor;
leMarkType_t leMarkType; // mark to leave on fragment impact
leBounceSoundType_t leBounceSoundType;
refEntity_t refEntity;
// JBravo: for func_explosive
float size;
// NiceAss: for func_pressure
int life;
} localEntity_t;
//======================================================================
typedef struct {
int client;
int score;
int damage;
int alive;
int ping;
int time;
int scoreFlags;
int powerUps;
int accuracy;
int team;
//Slicer Matchmode
team_t captain;
team_t sub;
qboolean referee;
} score_t;
//Blaze: WeaponStats Struct
// each client has an associated clientInfo_t
// that contains media references necessary to present the
// client model and other color coded effects
// this is regenerated each time a client's configstring changes,
// usually as a result of a userinfo (name, model, etc) change
#define MAX_CUSTOM_SOUNDS 32
typedef struct {
qboolean infoValid;
char name[MAX_QPATH];
team_t team;
int botSkill; // 0 = not bot, 1-5 = bot
vec3_t color1;
vec3_t color2;
int score; // updated by score servercmds
int location; // location index for team mode
int health; // you only get this info about your teammates
int armor;
int curWeapon;
int handicap;
int wins, losses; // in tourney mode
int teamTask; // task in teamplay (offence/defence)
qboolean teamLeader; // true when this is a team leader
int powerups; // so can display quad/flag status
int medkitUsageTime;
int invulnerabilityStartTime;
int invulnerabilityStopTime;
int breathPuffTime;
// when clientinfo is changed, the loading of models/skins/sounds
// can be deferred until you are dead, to prevent hitches in
// gameplay
char modelName[MAX_QPATH];
char skinName[MAX_QPATH];
char headModelName[MAX_QPATH];
char headSkinName[MAX_QPATH];
char redTeam[MAX_TEAMNAME];
char blueTeam[MAX_TEAMNAME];
qboolean deferred;
qboolean newAnims; // true if using the new mission pack animations
qboolean fixedlegs; // true if legs yaw is always the same as torso yaw
qboolean fixedtorso; // true if torso never changes yaw
vec3_t headOffset; // move head in icon views
footstep_t footsteps;
gender_t gender; // from model
qhandle_t legsModel;
qhandle_t legsSkin;
qhandle_t torsoModel;
qhandle_t torsoSkin;
qhandle_t headModel;
qhandle_t headSkin;
qhandle_t modelIcon;
animation_t animations[MAX_TOTALANIMATIONS];
sfxHandle_t sounds[MAX_CUSTOM_SOUNDS];
} clientInfo_t;
// Elder: maximum sizes
#define MAX_RELOAD_SOUNDS 5
#define MAX_OTHER_SOUNDS 5
#define MAX_ANIM_SOUNDS 16
struct sfxSyncInfo_s {
int frame;
sfxHandle_t sound;
qboolean played;
};
typedef struct sfxSyncInfo_s sfxSyncInfo_t;
typedef struct {
int numFrames;
sfxSyncInfo_t sfxInfo[MAX_ANIM_SOUNDS];
} sfxWeapTiming_t;
// each WP_* weapon enum has an associated weaponInfo_t
// that contains media references necessary to present the
// weapon and its effects
typedef struct weaponInfo_s {
qboolean registered;
gitem_t *item;
qhandle_t handsModel; // the hands don't actually draw, they just position the weapon
qhandle_t weaponModel; // Third-person/world model
qhandle_t barrelModel;
qhandle_t flashModel;
qhandle_t customSkin; // JBravo: for custom skins
qhandle_t firstModel; //Elder: view model
qhandle_t animHandModel; //Blaze: for animations
animation_t animations[MAX_WEAPON_ANIMATIONS];
vec3_t weaponMidpoint; // so it will rotate centered instead of by tag
float flashDlight;
vec3_t flashDlightColor;
sfxHandle_t flashSound[4]; // fast firing weapons randomly choose
qhandle_t weaponIcon;
qhandle_t ammoIcon;
qhandle_t ammoModel;
qhandle_t ammocustomSkin;
qhandle_t missileModel;
sfxHandle_t missileSound;
void (*missileTrailFunc) (centity_t *, const struct weaponInfo_s * wi);
float missileDlight;
vec3_t missileDlightColor;
int missileRenderfx;
//void (*ejectBrassFunc)( centity_t *, vec3_t, vec3_t );
localEntity_t *(*ejectBrassFunc) (centity_t * cent);
float trailRadius;
float wiTrailTime;
sfxHandle_t readySound;
sfxHandle_t firingSound;
// Elder: sounds to queue
sfxWeapTiming_t animationSounds[MAX_ANIM_SOUNDS];
sfxHandle_t worldReloadSound[3];
// qboolean loopFireSound;
} weaponInfo_t;
// each IT_* item has an associated itemInfo_t
// that constains media references necessary to present the
// item and its effects
typedef struct {
qboolean registered;
qhandle_t models[MAX_ITEM_MODELS];
qhandle_t icon;
// JBravo: for customskins
qhandle_t customSkin;
} itemInfo_t;
typedef struct {
int itemNum;
} powerupInfo_t;
#define MAX_SKULLTRAIL 10
typedef struct {
vec3_t positions[MAX_SKULLTRAIL];
int numpositions;
} skulltrail_t;
#define MAX_REWARDSTACK 10
#define MAX_SOUNDBUFFER 20
//======================================================================
// all cg.stepTime, cg.duckTime, cg.landTime, etc are set to cg.time when the action
// occurs, and they will have visible effects for #define STEP_TIME or whatever msec after
#define MAX_PREDICTED_EVENTS 16
// JBravo: unlagged
#define NUM_SAVED_STATES (CMD_BACKUP + 2)
//Makro - lens flares
#define MAX_VISIBLE_FLARES 24
#define NUM_FLARE_SHADERS 3
// Makro - explosion screen shake (in msec)
#define EXPLOSION_SHAKE_TIME 500
typedef struct {
int clientFrame; // incremented each frame
int clientNum;
qboolean demoPlayback;
qboolean levelShot; // taking a level menu screenshot
int deferredPlayerLoading;
qboolean loading; // don't defer players at initial startup
qboolean intermissionStarted; // don't play voice rewards, because game will end shortly
// there are only one or two snapshot_t that are relevent at a time
int latestSnapshotNum; // the number of snapshots the client system has received
int latestSnapshotTime; // the time from latestSnapshotNum, so we don't need to read the snapshot yet
snapshot_t *snap; // cg.snap->serverTime <= cg.time
snapshot_t *nextSnap; // cg.nextSnap->serverTime > cg.time, or NULL
snapshot_t activeSnapshots[2];
float frameInterpolation; // (float)( cg.time - cg.frame->serverTime ) / (cg.nextFrame->serverTime - cg.frame->serverTime)
qboolean thisFrameTeleport;
qboolean nextFrameTeleport;
int frametime; // cg.time - cg.oldTime
int time; // this is the time value that the client
// is rendering at.
int oldTime; // time at last frame, used for missile trails and prediction checking
int cvarCheckTime; // Elder: used for cvar cheat interval cycling
int physicsTime; // either cg.snap->time or cg.nextSnap->time
int timelimitWarnings; // 5 min, 1 min, overtime
int fraglimitWarnings;
qboolean mapRestart; // set on a map restart to set back the weapon
qboolean renderingThirdPerson; // during deaths, chasecams, etc
// prediction state
qboolean hyperspace; // true if prediction has hit a trigger_teleport
playerState_t predictedPlayerState;
centity_t predictedPlayerEntity;
qboolean validPPS; // clear until the first call to CG_PredictPlayerState
int predictedErrorTime;
vec3_t predictedError;
int eventSequence;
int predictableEvents[MAX_PREDICTED_EVENTS];
float stepChange; // for stair up smoothing
int stepTime;
float duckChange; // for duck viewheight smoothing
int duckTime;
float landChange; // for landing hard
int landTime;
// input state sent to server
int weaponSelect;
// auto rotating items
vec3_t autoAngles;
vec3_t autoAxis[3];
vec3_t autoAnglesFast;
vec3_t autoAxisFast[3];
// view rendering
refdef_t refdef;
refdefex_t refdefex; // Makro - extra data to be sent to the renderer; it absolutely needs to follow refdef
vec3_t refdefViewAngles; // will be converted to refdef.viewaxis
// zoom key
qboolean zooming; //Slicer: flag to determine when to set zoomTime
qboolean zoomSensLock; //Slicer: to lock sensitivity when firing
qboolean zoomed; // Determines first-person weapon drawing
int zoomLevel; // Zoom LEVEL! -- uses zoom bits like STAT_RQ3
int lastZoomLevel; // Save last zoom state
int zoomFirstReturn; // Elder: switch for zooming in/out between shots
int zoomTime;
float zoomSensitivity;
// information screen text during loading
char infoScreenText[MAX_STRING_CHARS];
// scoreboard
int scoresRequestTime;
int numScores;
int selectedScore;
int teamScores[2];
score_t scores[MAX_CLIENTS];
qboolean showScores;
qboolean scoreBoardShowing;
int scoreFadeTime;
int scoreTPMode;
//Blaze: weapon stats stuff
qboolean showWStats;
int wstatsStartTime;
int wstatsRequestTime;
//end weapon stats stuff
char killerName[MAX_NAME_LENGTH];
char spectatorList[MAX_STRING_CHARS]; // list of names
int spectatorLen; // length of list
float spectatorWidth; // width in device units
int spectatorTime; // next time to offset
int spectatorPaintX; // current paint x
int spectatorPaintX2; // current paint x
int spectatorOffset; // current offset from start
int spectatorPaintLen; // current offset from start
#ifdef MISSIONPACK
// skull trails
skulltrail_t skulltrails[MAX_CLIENTS];
#endif
// centerprinting
int centerPrintTime;
int centerPrintCharWidth;
int centerPrintY;
char centerPrint[1024];
int centerPrintLines;
int centerPrintMaxLen;
// low ammo warning state
int lowAmmoWarning; // 1 = low, 2 = empty
// kill timers for carnage reward
int lastKillTime;
// crosshair client ID
int crosshairClientNum;
int crosshairClientTime;
// powerup active flashing
int powerupActive;
int powerupTime;
// attacking player
int attackerTime;
int voiceTime;
// reward medals
int rewardStack;
int rewardTime;
int rewardCount[MAX_REWARDSTACK];
qhandle_t rewardShader[MAX_REWARDSTACK];
qhandle_t rewardSound[MAX_REWARDSTACK];
// sound buffer mainly for announcer sounds
int soundBufferIn;
int soundBufferOut;
int soundTime;
qhandle_t soundBuffer[MAX_SOUNDBUFFER];
// for voice chat buffer
int voiceChatTime;
int voiceChatBufferIn;
int voiceChatBufferOut;
// warmup countdown
int warmup;
int warmupCount;
//==========================
int itemPickup;
int itemPickupTime;
int itemPickupBlendTime; // the pulse around the crosshair is timed seperately
int weaponSelectTime;
int weaponAnimation;
int weaponAnimationTime;
// blend blobs
float damageTime;
float damageX, damageY, damageValue;
//Elder: added for alpha pain blend
int rq3_trueDamage; //Q3 doesn't hold the actual damage amount in cg.damageValue
float rq3_blendTime; //How long we take to fade out
// status bar head
float headYaw;
float headEndPitch;
float headEndYaw;
int headEndTime;
float headStartPitch;
float headStartYaw;
int headStartTime;
// view movement
float v_dmg_time;
float v_dmg_pitch;
float v_dmg_roll;
vec3_t kick_angles; // weapon kicks
vec3_t kick_origin;
int kick_time; // Elder: added to decay the kicks more smoothly
int kick_duration; // Elder: some need more
// temp working variables for player view
float bobfracsin;
int bobcycle;
float xyspeed;
int nextOrbitTime;
//qboolean cameraMode; // if rendering from a loaded camera
// development tool
refEntity_t testModelEntity;
char testModelName[MAX_QPATH];
qboolean testGun;
// Elder: for message flooding protection
int sayTime;
int sayCount;
int shellHits; //Count number of successful shell hits
qboolean laserSight; //Whether to draw local laser sight
localEntity_t *laserEnt; //Local model -- NULL if not in-use
qboolean rq3_irvision; // Elder: enabled IR vision
int akimboFlash; // Alternate between two tags for flash (0 or 1)
sfxSyncInfo_t curSyncSound; // Shifts after a sound is played
// JBravo: adding scoreStartTime for NiceAss
int scoreStartTime;
int records[REC_NUM_RECORDS]; // Blaze: for our statistics tracking
float loadingMapPercent; // NiceAss: Ranges from 0 to 1. Used on map load.
//Slicer vars that are synched from GAME
int lca;
// NiceAss: Scoreboard MM stuff:
int refID;
int matchTime;
int team1ready;
int team2ready;
int refready;
int CTBcountdowntime;
// JBravo: unlagged
int lastPredictedCommand;
int lastServerTime;
playerState_t savedPmoveStates[NUM_SAVED_STATES];
int stateHead, stateTail;
//Makro - true if the user wants fastsky on. We'll force it to off for maps
//that have a _rq3_fog_color set
int wantsFastSky;
//Makro - used for flares
unsigned char flareShaderNum[MAX_VISIBLE_FLARES];
float flareShaderSize[MAX_VISIBLE_FLARES], flareColor[MAX_VISIBLE_FLARES][4];
//Makro - zcam lines
char zcamLine[2][256];
//Makro - head location and axis; used for dead players
vec3_t headPos;
vec3_t headAxis[3];
vec3_t oldHeadPos;
// Makro - time of death
int timeOfDeath;
// Makro - explosion screen shake
int explosionTime;
float explosionForce;
// Makro - water transitions
qboolean inWaterLastFrame;
int waterTransitionTime;
} cg_t;
//Blaze: struct to hold the func_breakable stuff
typedef struct {
qhandle_t model[3];
sfxHandle_t sound[3];
sfxHandle_t exp_sound;
qhandle_t shader;
int jump;
int velocity;
} breakable_t;
// all of the model, shader, and sound references that are
// loaded at gamestate time are stored in cgMedia_t
// Other media that can be tied to clients, weapons, or items are
// stored in the clientInfo_t, itemInfo_t, weaponInfo_t, and powerupInfo_t
typedef struct {
qhandle_t charsetShader;
qhandle_t charsetProp;
qhandle_t charsetPropGlow;
qhandle_t charsetPropB;
qhandle_t whiteShader;
qhandle_t blackHackShader;
qhandle_t fuzzyShadowShader;
qhandle_t fuzzyGlowShader;
#ifdef MISSIONPACK
qhandle_t redCubeModel;
qhandle_t blueCubeModel;
qhandle_t redCubeIcon;
qhandle_t blueCubeIcon;
#endif
qhandle_t redFlagModel;
qhandle_t blueFlagModel;
qhandle_t neutralFlagModel;
qhandle_t redFlagShader[3];
qhandle_t blueFlagShader[3];
qhandle_t flagShader[4];
qhandle_t flagPoleModel;
qhandle_t flagFlapModel;
qhandle_t redFlagFlapSkin;
qhandle_t blueFlagFlapSkin;
qhandle_t neutralFlagFlapSkin;
qhandle_t redFlagBaseModel;
qhandle_t blueFlagBaseModel;
qhandle_t neutralFlagBaseModel;
qhandle_t armorModel;
//qhandle_t armorIcon;
qhandle_t teamStatusBar;
qhandle_t deferShader;
// gib explosions
qhandle_t gibAbdomen;
qhandle_t gibArm;
qhandle_t gibChest;
qhandle_t gibFist;
qhandle_t gibFoot;
qhandle_t gibForearm;
qhandle_t gibIntestine;
qhandle_t gibLeg;
qhandle_t gibSkull;
qhandle_t gibBrain;
qhandle_t glass01; //Blaze: Breakable glass
qhandle_t glass02; //Blaze: Breakable glass
qhandle_t glass03; //Blaze: Breakable glass
//Elder: additional debris
qhandle_t metal01;
qhandle_t metal02;
qhandle_t metal03;
qhandle_t wood01;
qhandle_t wood02;
qhandle_t wood03;
qhandle_t ceramic01;
qhandle_t ceramic02;
qhandle_t ceramic03;
qhandle_t paper01;
qhandle_t paper02;
qhandle_t paper03;
qhandle_t brick01;
qhandle_t brick02;
qhandle_t brick03;
qhandle_t concrete01;
qhandle_t concrete02;
qhandle_t concrete03;
//Elder: akimbo stuff - since it's valid every game
qhandle_t akimboModel;
qhandle_t akimboFlashModel;
qhandle_t akimbo1stModel;
qhandle_t akimboHandModel;
// Blaze: func_explosive stuff
breakable_t breakables[RQ3_MAX_BREAKABLES];
qhandle_t smoke2;
qhandle_t machinegunBrassModel;
qhandle_t largeBrassModel;
qhandle_t shotgunBrassModel;
qhandle_t HCBrassModel;
qhandle_t railRingsShader;
qhandle_t railCoreShader;
qhandle_t lightningShader;
qhandle_t friendShader;
qhandle_t balloonShader;
qhandle_t connectionShader;
qhandle_t selectShader;
qhandle_t viewBloodShader;
qhandle_t tracerShader;
qhandle_t crosshairShader[NUM_CROSSHAIRS];
qhandle_t lagometerShader;
qhandle_t backTileShader;
qhandle_t noammoShader;
//Elder: item strobe to increase brightness
qhandle_t itemStrobeShader;
//Elder: C3A Laser tutorial
qhandle_t laserShader;
//Elder: sniper crosshairs
qhandle_t ssgCrosshair[ZOOM_LEVELS];
//Elder: RQ3 hud-related stuff
qhandle_t rq3_healthicon;
qhandle_t rq3_healthicon2;
qhandle_t smokePuffShader;
qhandle_t smokePuffAnimShader;
qhandle_t smokePuffRageProShader;
qhandle_t shotgunSmokePuffShader;
//qhandle_t plasmaBallShader;
qhandle_t waterBubbleShader;
// Pressure:
qhandle_t waterPressureModel;
qhandle_t flamePressureShader;
qhandle_t bloodTrailShader;
qhandle_t numberShaders[11];
qhandle_t shadowMarkShader;
qhandle_t botSkillShaders[5];
// wall mark shaders
qhandle_t wakeMarkShader;
qhandle_t bloodMarkShader;
qhandle_t ctbXMarkSilver;
qhandle_t ctbOMarkBlack;
qhandle_t bulletMarkShader;
qhandle_t burnMarkShader;
//qhandle_t holeMarkShader;
qhandle_t energyMarkShader;
// Elder: rq3 marks
qhandle_t slashMarkShader;
qhandle_t glassMarkShader;
qhandle_t metalMarkShader;
//Makro - new mark
qhandle_t snowMarkShader;
// powerup shaders
//qhandle_t quadShader;
qhandle_t redQuadShader;
//qhandle_t quadWeaponShader;
//qhandle_t invisShader;
//qhandle_t regenShader;
//qhandle_t battleSuitShader;
//qhandle_t battleWeaponShader;
qhandle_t hastePuffShader;
qhandle_t redKamikazeShader;
qhandle_t blueKamikazeShader;
// Elder: rq3 misc shaders
qhandle_t irPlayerShader;
qhandle_t irPlayerShaderFriendly;
// weapon effect models
qhandle_t bulletFlashModel;
qhandle_t ringFlashModel;
qhandle_t dishFlashModel;
qhandle_t lightningExplosionModel;
// Elder: hit spark to replace bulletFlash
qhandle_t hitSparkModel;
qhandle_t hitSparkShader;
// Elder: RQ3 item models
qhandle_t rq3_kevlarModel;
qhandle_t rq3_bandolierModel;
qhandle_t rq3_silencerModel;
qhandle_t rq3_laserModel;
qhandle_t rq3_slippersModel;
// JBravo: the helmet
qhandle_t rq3_helmetModel;
// weapon effect shaders
qhandle_t railExplosionShader;
qhandle_t plasmaExplosionShader;
qhandle_t bulletExplosionShader;
qhandle_t rocketExplosionShader;
qhandle_t grenadeExplosionShader;
qhandle_t bfgExplosionShader;
qhandle_t bloodExplosionShader;
// special effects models
// JBravo: moved out of MISSIONPACK
qhandle_t dustPuffShader;
qhandle_t invulnerabilityPowerupModel;
// scoreboard headers
qhandle_t scoreboardName;
qhandle_t scoreboardPing;
qhandle_t scoreboardScore;
qhandle_t scoreboardTime;
// medals shown during gameplay
// JBravo: no thanks
//qhandle_t medalImpressive;
//qhandle_t medalExcellent;
qhandle_t medalGauntlet;
//qhandle_t medalDefend;
//qhandle_t medalAssist;
//qhandle_t medalCapture;
qhandle_t zoomMask;
qhandle_t irvision_overlay;
// sounds
sfxHandle_t kickSound; //Elder: kick sound
sfxHandle_t headshotSound; //Elder: splat
//sfxHandle_t lcaSound; //Elder: lights, camera, action!
sfxHandle_t lensSound; //Elder: sniper lens zoom
sfxHandle_t silencerSound;
sfxHandle_t kevlarHitSound;
sfxHandle_t weapToggleSound;
sfxHandle_t knifeClankSound;
sfxHandle_t knifeDeathSound;
sfxHandle_t knifeHitSound;
//sfxHandle_t knifeThrowSound;
sfxHandle_t quadSound;
sfxHandle_t tracerSound;
// sfxHandle_t selectSound;
// sfxHandle_t useNothingSound;
// sfxHandle_t wearOffSound;
sfxHandle_t footsteps[FOOTSTEP_TOTAL][4];
sfxHandle_t sfx_lghit1;
sfxHandle_t sfx_lghit2;
sfxHandle_t sfx_lghit3;
sfxHandle_t sfx_ric1;
sfxHandle_t sfx_ric2;
sfxHandle_t sfx_ric3;
// Elder: Metal ricochet sounds
sfxHandle_t sfx_metalric1;
sfxHandle_t sfx_metalric2;
sfxHandle_t sfx_metalric3;
// Elder: Glass ricochet sounds
sfxHandle_t sfx_glassric1;
sfxHandle_t sfx_glassric2;
sfxHandle_t sfx_glassric3;
// Makro: brick ricochet sounds
sfxHandle_t sfx_brickric1;
sfxHandle_t sfx_brickric2;
sfxHandle_t sfx_brickric3;
// Makro: wood ricochet sounds
sfxHandle_t sfx_woodric1;
sfxHandle_t sfx_woodric2;
sfxHandle_t sfx_woodric3;
// Makro: ceramic ricochet sounds
sfxHandle_t sfx_ceramicric1;
sfxHandle_t sfx_ceramicric2;
sfxHandle_t sfx_ceramicric3;
// Elder: Shell tumble sound
sfxHandle_t sfx_shelltumble;
// sfxHandle_t sfx_railg;
sfxHandle_t sfx_rockexp;
// sfxHandle_t sfx_plasmaexp;
sfxHandle_t gibSound;
//Blaze: Dont need this any more
// sfxHandle_t glassSound; //Blaze: Reaction breakable glass
// sfxHandle_t glass2Sound;
sfxHandle_t gibBounce1Sound;
sfxHandle_t gibBounce2Sound;
sfxHandle_t gibBounce3Sound;
// sfxHandle_t teleInSound;
// sfxHandle_t teleOutSound;
sfxHandle_t noAmmoSound;
sfxHandle_t respawnSound;
sfxHandle_t talkSound;
sfxHandle_t landSound;
sfxHandle_t fallSound;
// sfxHandle_t jumpPadSound;
sfxHandle_t oneMinuteSound;
sfxHandle_t fiveMinuteSound;
sfxHandle_t suddenDeathSound;
sfxHandle_t threeFragSound;
sfxHandle_t twoFragSound;
sfxHandle_t oneFragSound;
sfxHandle_t hitSound;
sfxHandle_t hitSoundHighArmor;
sfxHandle_t hitSoundLowArmor;
sfxHandle_t hitTeamSound;
sfxHandle_t impressiveSound;
sfxHandle_t excellentSound;
sfxHandle_t deniedSound;
sfxHandle_t humiliationSound;
//sfxHandle_t assistSound;
//sfxHandle_t defendSound;
sfxHandle_t firstImpressiveSound;
sfxHandle_t firstExcellentSound;
sfxHandle_t firstHumiliationSound;
sfxHandle_t takenLeadSound;
sfxHandle_t tiedLeadSound;
sfxHandle_t lostLeadSound;
sfxHandle_t voteNow;
sfxHandle_t votePassed;
sfxHandle_t voteFailed;
sfxHandle_t watrInSound;
sfxHandle_t watrOutSound;
sfxHandle_t watrUnSound;
// sfxHandle_t flightSound;
// sfxHandle_t medkitSound;
sfxHandle_t weaponHoverSound;
// teamplay sounds
sfxHandle_t captureAwardSound;
sfxHandle_t redScoredSound;
sfxHandle_t blueScoredSound;
sfxHandle_t redLeadsSound;
sfxHandle_t blueLeadsSound;
sfxHandle_t teamsTiedSound;
sfxHandle_t captureYourTeamSound;
sfxHandle_t captureOpponentSound;
sfxHandle_t returnYourTeamSound;
sfxHandle_t returnOpponentSound;
sfxHandle_t takenYourTeamSound;
sfxHandle_t takenOpponentSound;
sfxHandle_t redFlagReturnedSound;
sfxHandle_t blueFlagReturnedSound;
sfxHandle_t neutralFlagReturnedSound;
sfxHandle_t enemyTookYourFlagSound;
sfxHandle_t enemyTookTheFlagSound;
sfxHandle_t yourTeamTookEnemyFlagSound;
sfxHandle_t yourTeamTookTheFlagSound;
sfxHandle_t youHaveFlagSound;
sfxHandle_t yourBaseIsUnderAttackSound;
sfxHandle_t holyShitSound;
// tournament sounds
sfxHandle_t count3Sound;
sfxHandle_t count2Sound;
sfxHandle_t count1Sound;
sfxHandle_t countFightSound;
sfxHandle_t countPrepareSound;
qhandle_t cursor;
qhandle_t selectCursor;
qhandle_t sizeCursor;
sfxHandle_t regenSound;
sfxHandle_t protectSound;
sfxHandle_t n_healthSound;
sfxHandle_t hgrenb1aSound;
sfxHandle_t hgrenb2aSound;
//Elder: removed
//sfxHandle_t wstbimplSound;
//sfxHandle_t wstbimpmSound;
//sfxHandle_t wstbimpdSound;
//sfxHandle_t wstbactvSound;
// JBravo: LCA sounds
sfxHandle_t lightsSound;
sfxHandle_t cameraSound;
sfxHandle_t actionSound;
sfxHandle_t lca10_0Sound;
sfxHandle_t insanesounds[9];
// JBravo: Radio sounds
//Slicer
sfxHandle_t male_sounds[56];
sfxHandle_t new_male_sounds[56];
sfxHandle_t pikey_male_sounds[56];
sfxHandle_t pirate_male_sounds[56];
sfxHandle_t keanu_male_sounds[56];
sfxHandle_t female_sounds[56];
sfxHandle_t steamSound;
sfxHandle_t male_1sound;
sfxHandle_t male_2sound;
sfxHandle_t male_3sound;
sfxHandle_t male_4sound;
sfxHandle_t male_5sound;
sfxHandle_t male_6sound;
sfxHandle_t male_7sound;
sfxHandle_t male_8sound;
sfxHandle_t male_9sound;
sfxHandle_t male_10sound;
sfxHandle_t male_backsound;
sfxHandle_t male_coversound;
sfxHandle_t male_downsound;
sfxHandle_t male_enemydsound;
sfxHandle_t male_enemyssound;
sfxHandle_t male_forwardsound;
sfxHandle_t male_gosound;
sfxHandle_t male_im_hitsound;
sfxHandle_t male_leftsound;
sfxHandle_t male_reportinsound;
sfxHandle_t male_rightsound;
sfxHandle_t male_taking_fsound;
sfxHandle_t male_teamdownsound;
sfxHandle_t male_treportsound;
sfxHandle_t male_upsound;
sfxHandle_t male_click;
sfxHandle_t female_1sound;
sfxHandle_t female_2sound;
sfxHandle_t female_3sound;
sfxHandle_t female_4sound;
sfxHandle_t female_5sound;
sfxHandle_t female_6sound;
sfxHandle_t female_7sound;
sfxHandle_t female_8sound;
sfxHandle_t female_9sound;
sfxHandle_t female_10sound;
sfxHandle_t female_backsound;
sfxHandle_t female_coversound;
sfxHandle_t female_downsound;
sfxHandle_t female_enemydsound;
sfxHandle_t female_enemyssound;
sfxHandle_t female_forwardsound;
sfxHandle_t female_gosound;
sfxHandle_t female_im_hitsound;
sfxHandle_t female_leftsound;
sfxHandle_t female_reportinsound;
sfxHandle_t female_rightsound;
sfxHandle_t female_taking_fsound;
sfxHandle_t female_teamdownsound;
sfxHandle_t female_treportsound;
sfxHandle_t female_upsound;
sfxHandle_t female_click;
//Makro - lens flare shaders
qhandle_t flareShader[NUM_FLARE_SHADERS], sunFlareShader, coronaShader;
//Makro - snow impact effects
qhandle_t snowImpactShader;
//Makro - generic particle impact shader
qhandle_t particleImpactShader;
// Makro - map preview
qhandle_t voteMapShader;
} cgMedia_t;
// The client game static (cgs) structure hold everything
// loaded or calculated from the gamestate. It will NOT
// be cleared when a tournement restart is done, allowing
// all clients to begin playing instantly
typedef struct {
gameState_t gameState; // gamestate from server
glconfig_t glconfig; // rendering configuration
float screenXScale; // derived from glconfig
float screenYScale;
float screenXBias;
float screenXMin; // Makro - derived from glconfig, used for wide-screens
float screenXMax;
float screenWidth;
int serverCommandSequence; // reliable command stream counter
int processedSnapshotNum; // the number of snapshots cgame has requested
qboolean localServer; // detected on startup by checking sv_running
// parsed from serverinfo
gametype_t gametype;
int dmflags;
int teamflags;
int fraglimit;
int capturelimit;
int timelimit;
int maxclients;
char mapname[MAX_QPATH];
char redTeam[MAX_QPATH];
char blueTeam[MAX_QPATH];
int voteTime;
int voteYes;
int voteNo;
qboolean voteModified; // beep whenever changed
char voteString[MAX_STRING_TOKENS];
char voteYesKey[32];
char voteNoKey[32];
int teamVoteTime[2];
int teamVoteYes[2];
int teamVoteNo[2];
qboolean teamVoteModified[2]; // beep whenever changed
char teamVoteString[2][MAX_STRING_TOKENS];
int levelStartTime;
int scores1, scores2; // from configstrings
int redflag, blueflag; // flag status from configstrings
int flagStatus;
qboolean newHud;
//
// locally derived information from gamestate
//
qhandle_t gameModels[MAX_MODELS];
sfxHandle_t gameSounds[MAX_SOUNDS];
int numInlineModels;
qhandle_t inlineDrawModel[MAX_MODELS];
vec3_t inlineModelMidpoints[MAX_MODELS];
clientInfo_t clientinfo[MAX_CLIENTS];
// teamchat width is *3 because of embedded color codes
char teamChatMsgs[MSGQUEUE_HEIGHT][MSGQUEUE_WIDTH * 3 + 1];
int teamChatMsgTimes[MSGQUEUE_HEIGHT];
int teamChatPos;
int teamLastChatPos;
int cursorX;
int cursorY;
qboolean eventHandling;
qboolean mouseCaptured;
qboolean sizingHud;
void *capturedItem;
qhandle_t activeCursor;
// orders
int currentOrder;
qboolean orderPending;
int orderTime;
int currentVoiceClient;
int acceptOrderTime;
int acceptTask;
int acceptLeader;
char acceptVoice[MAX_NAME_LENGTH];
// media
cgMedia_t media;
// JBravo: unlagged
int delagHitscan;
//Makro - sky portals
vec3_t skyPortalOrigin;
qboolean skyPortalSet;
//how much the portal moves with the player
vec3_t skyPortalMoveFactor;
//Makro - "clear" color
vec3_t clearColor;
qboolean clearColorSet;
//Makro - sun flares
int lastSunTime, lastSunX, lastSunY, numFlares, sunFlareSize;
float sunAlpha, flareFovFactor, flareFadeFactor, flareForwardFactor;
vec3_t sunDir;
} cgs_t;
//==============================================================================
extern cgs_t cgs;
extern cg_t cg;
extern centity_t cg_entities[MAX_GENTITIES];
extern weaponInfo_t cg_weapons[MAX_WEAPONS];
extern itemInfo_t cg_items[MAX_ITEMS];
extern markPoly_t cg_markPolys[MAX_MARK_POLYS];
//Makro - dlight styles
extern char dlightStyles[MAX_DLIGHT_STYLES][MAX_DLIGHT_STLE_LEN];
extern int dlightStyleCount;
//Makro - moveparent rank for each entity
extern int cg_moveParentRanks[MAX_GENTITIES];
extern int cg_snapEntityOrder[MAX_GENTITIES];
extern int cg_nextSnapEntityOrder[MAX_GENTITIES];
extern vmCvar_t cg_centertime;
extern vmCvar_t cg_runpitch;
extern vmCvar_t cg_runroll;
extern vmCvar_t cg_bobup;
extern vmCvar_t cg_bobpitch;
extern vmCvar_t cg_bobroll;
extern vmCvar_t cg_swingSpeed;
extern vmCvar_t cg_shadows;
extern vmCvar_t cg_gibs;
extern vmCvar_t cg_drawTimer;
extern vmCvar_t cg_drawFPS;
extern vmCvar_t cg_drawPing;
extern vmCvar_t cg_drawSnapshot;
extern vmCvar_t cg_draw3dIcons;
extern vmCvar_t cg_drawIcons;
extern vmCvar_t cg_drawAmmoWarning;
extern vmCvar_t cg_drawCrosshair;
extern vmCvar_t cg_drawCrosshairNames;
extern vmCvar_t cg_drawRewards;
extern vmCvar_t cg_drawTeamOverlay;
extern vmCvar_t cg_teamOverlayUserinfo;
extern vmCvar_t cg_crosshairX;
extern vmCvar_t cg_crosshairY;
extern vmCvar_t cg_crosshairSize;
extern vmCvar_t cg_crosshairHealth;
extern vmCvar_t cg_drawStatus;
extern vmCvar_t cg_draw2D;
extern vmCvar_t cg_animSpeed;
extern vmCvar_t cg_debugAnim;
extern vmCvar_t cg_debugPosition;
extern vmCvar_t cg_debugEvents;
extern vmCvar_t cg_railTrailTime;
extern vmCvar_t cg_errorDecay;
extern vmCvar_t cg_nopredict;
extern vmCvar_t cg_noPlayerAnims;
extern vmCvar_t cg_showmiss;
extern vmCvar_t cg_footsteps;
extern vmCvar_t cg_addMarks;
extern vmCvar_t cg_brassTime;
extern vmCvar_t cg_gun_frame;
extern vmCvar_t cg_gun_x;
extern vmCvar_t cg_gun_y;
extern vmCvar_t cg_gun_z;
extern vmCvar_t cg_drawGun;
extern vmCvar_t cg_viewsize;
extern vmCvar_t cg_tracerChance;
extern vmCvar_t cg_tracerWidth;
extern vmCvar_t cg_tracerLength;
extern vmCvar_t cg_autoswitch;
extern vmCvar_t cg_ignore;
extern vmCvar_t cg_simpleItems;
extern vmCvar_t cg_fov;
extern vmCvar_t cg_thirdPersonRange;
extern vmCvar_t cg_thirdPersonAngle;
extern vmCvar_t cg_thirdPerson;
extern vmCvar_t cg_lagometer;
extern vmCvar_t cg_drawAttacker;
extern vmCvar_t cg_synchronousClients;
extern vmCvar_t cg_gravity;
extern vmCvar_t cg_messageQueueTime;
extern vmCvar_t cg_messageQueue;
extern vmCvar_t cg_stats;
extern vmCvar_t cg_forceModel;
extern vmCvar_t cg_buildScript;
extern vmCvar_t cg_paused;
extern vmCvar_t cg_blood;
extern vmCvar_t cg_predictItems;
extern vmCvar_t cg_deferPlayers;
//Blaze: Anti OGC code
extern vmCvar_t ogc_islame;
//Blaze: replacement weapons
extern vmCvar_t cg_RQ3_knife;
extern vmCvar_t cg_RQ3_mk23;
extern vmCvar_t cg_RQ3_m4;
extern vmCvar_t cg_RQ3_ssg3000;
extern vmCvar_t cg_RQ3_mp5;
extern vmCvar_t cg_RQ3_handcannon;
extern vmCvar_t cg_RQ3_m3;
extern vmCvar_t cg_RQ3_akimbo;
extern vmCvar_t cg_RQ3_grenade;
//Blaze: replacement items
extern vmCvar_t cg_RQ3_bandolier;
extern vmCvar_t cg_RQ3_kevlar;
extern vmCvar_t cg_RQ3_silencer;
extern vmCvar_t cg_RQ3_laser;
extern vmCvar_t cg_RQ3_slippers;
extern vmCvar_t cg_RQ3_helmet;
// JBravo: replacement ammo
extern vmCvar_t cg_RQ3_ammo_mk23;
extern vmCvar_t cg_RQ3_ammo_m3;
extern vmCvar_t cg_RQ3_ammo_ssg3000;
extern vmCvar_t cg_RQ3_ammo_mp5;
extern vmCvar_t cg_RQ3_ammo_m4;
extern vmCvar_t cg_RQ3_drawSpeed;
extern vmCvar_t cg_RQ3_zcam_stfu;
//Blaze: Reaction weapon positions
//extern vmCvar_t cg_RQ3_drawWeapon;
//Blaze: how long the glass stays around for
extern vmCvar_t cg_RQ3_glasstime;
//Elder: muzzle flash toggle
extern vmCvar_t cg_RQ3_flash;
//Elder: toggle alpha blending
extern vmCvar_t cg_RQ3_painblend;
//Slicer: no longer being used
//Elder: toggle client-side zoom assist
//extern vmCvar_t cg_RQ3_ssgZoomAssist;
extern vmCvar_t cg_RQ3_ssgZoomSensLock;
//Elder: crosshair colours!
extern vmCvar_t cg_RQ3_ssgColorR;
extern vmCvar_t cg_RQ3_ssgColorG;
extern vmCvar_t cg_RQ3_ssgColorB;
extern vmCvar_t cg_RQ3_ssgColorA;
// JBravo: normal crosshair colors
extern vmCvar_t cg_RQ3_crosshairColorR;
extern vmCvar_t cg_RQ3_crosshairColorG;
extern vmCvar_t cg_RQ3_crosshairColorB;
extern vmCvar_t cg_RQ3_crosshairColorA;
//Blaze: allow regular crosshair to be overlaid ontop of the ssg crosshair
extern vmCvar_t cg_RQ3_overlaycrosshair;
// JBravo: cvar for tkok popups
extern vmCvar_t cg_RQ3_tkokAutoPopup;
extern vmCvar_t cg_RQ3_radiovoice_male;
extern vmCvar_t cg_RQ3_radiovoice_female;
extern vmCvar_t cg_RQ3_SuicideLikeARealMan;
extern vmCvar_t cg_RQ3_dynamicRadio;
// Slicer: for the Anti-Cheat System
//extern vmCvar_t cg_RQ3_Auth;
//Elder: SSG unique sensitivities
extern vmCvar_t cg_RQ3_ssgSensitivityAuto;
extern vmCvar_t cg_RQ3_ssgSensitivity2x;
extern vmCvar_t cg_RQ3_ssgSensitivity4x;
extern vmCvar_t cg_RQ3_ssgSensitivity6x;
//Blaze: Holds which crosshair to use for the ssg
extern vmCvar_t cg_RQ3_ssgCrosshair;
//Elder: smoke puffs, sparks, etc.
extern vmCvar_t cg_RQ3_impactEffects;
//Elder: toggle client-side laser drawing
extern vmCvar_t cg_RQ3_laserAssist;
//Blaze: anouncer sounds
extern vmCvar_t cg_RQ3_anouncer;
//Elder: different blood types
extern vmCvar_t cg_RQ3_bloodStyle;
//NiceAss: strobing weapons/items like quake 2
extern vmCvar_t cg_RQ3_strobe;
// Makro - added color
extern vmCvar_t cg_RQ3_strobeColor;
extern vmCvar_t cg_RQ3_predictWeapons;
//Makro - left-handed weapons
extern vmCvar_t cg_RQ3_leftHanded;
//Makro - sun flares
extern vmCvar_t cg_RQ3_flareIntensity;
//Makro - ssg crosshair size
extern vmCvar_t cg_RQ3_ssgCrosshairSize;
//Makro - temp!!!
extern vmCvar_t cg_RQ3_angle0;
extern vmCvar_t cg_RQ3_angle1;
extern vmCvar_t cg_RQ3_angle2;
extern vmCvar_t cg_drawFriend;
extern vmCvar_t cg_teamChatsOnly;
extern vmCvar_t cg_noVoiceChats;
extern vmCvar_t cg_noVoiceText;
extern vmCvar_t cg_scorePlum;
//Makro - fastsky
extern vmCvar_t cg_fastSky;
extern vmCvar_t cg_RQ3_wantFastSky;
//extern vmCvar_t cg_smoothClients;
extern vmCvar_t pmove_fixed;
extern vmCvar_t pmove_msec;
//extern vmCvar_t cg_pmove_fixed;
extern vmCvar_t cg_cameraOrbit;
extern vmCvar_t cg_cameraOrbitDelay;
extern vmCvar_t cg_timescaleFadeEnd;
extern vmCvar_t cg_timescaleFadeSpeed;
extern vmCvar_t cg_timescale;
extern vmCvar_t cg_cameraMode;
extern vmCvar_t cg_smallFont;
extern vmCvar_t cg_bigFont;
extern vmCvar_t cg_noTaunt;
extern vmCvar_t cg_noProjectileTrail;
extern vmCvar_t cg_oldRail;
extern vmCvar_t cg_oldRocket;
extern vmCvar_t cg_oldPlasma;
extern vmCvar_t cg_trueLightning;
// JBravo: unlagged
extern vmCvar_t cg_delag;
extern vmCvar_t cg_drawBBox;
extern vmCvar_t sv_fps;
extern vmCvar_t cg_optimizePrediction;
extern vmCvar_t cg_latentCmds;
extern vmCvar_t cl_timeNudge;
// NiceAss: No longer part of the MissionPack
extern vmCvar_t cg_enableBreath;
extern vmCvar_t cg_enableLaserFog;
// JBravo: ditto
extern vmCvar_t cg_enableDust;
//Blaze: to handle the auto actions
extern vmCvar_t cg_RQ3_autoAction;
//Blaze: Cheat cvars
extern cheat_cvar cheats[30];
// JBravo: Teamplay cvars synched from game
//Slicer: no longer needed.
//extern vmCvar_t cg_RQ3_lca;
//Slicer: apparently not being used
//extern vmCvar_t cg_RQ3_team_round_going;
extern vmCvar_t cg_RQ3_team1name;
extern vmCvar_t cg_RQ3_team2name;
extern vmCvar_t cg_RQ3_team1model;
extern vmCvar_t cg_RQ3_team2model;
extern vmCvar_t ui_RQ3_teamCount1;
extern vmCvar_t ui_RQ3_teamCount2;
extern vmCvar_t ui_RQ3_numSpectators;
// JBravo: MM ingame menu cvars.
//Makro - removed timelimit/fraglimit cvars - they were causing problems on local servers
//extern vmCvar_t cg_RQ3_timelimit;
extern vmCvar_t cg_RQ3_roundlimit;
extern vmCvar_t cg_RQ3_roundtimelimit;
//extern vmCvar_t cg_RQ3_fraglimit;
extern vmCvar_t cg_RQ3_maxplayers;
extern vmCvar_t cg_RQ3_forceteamtalk;
extern vmCvar_t cg_RQ3_limchasecam;
extern vmCvar_t cg_RQ3_tgren;
extern vmCvar_t cg_RQ3_friendlyFire;
// JBravo: cvars for the about menu
extern vmCvar_t cg_RQ3_hostname;
extern vmCvar_t cg_RQ3_needpass;
extern vmCvar_t cg_RQ3_capturelimit;
extern vmCvar_t cg_RQ3_dmflags;
extern vmCvar_t cg_RQ3_bot_minplayers;
extern vmCvar_t cg_RQ3_showOwnKills;
//Slicer: matchmode team status cvars
//extern vmCvar_t cg_RQ3_RefID;
extern vmCvar_t cg_RQ3_matchmode;
// q3f atmospheric stuff:
extern vmCvar_t cg_atmosphericEffects;
extern vmCvar_t cg_lowEffects;
//void CG_PredictWeaponEffects(centity_t *cent);
void CG_AddBoundingBox(centity_t *cent);
qboolean CG_Cvar_ClampInt(const char *name, vmCvar_t *vmCvar, int min, int max);
//
// cg_main.c
//
const char *CG_ConfigString(int index);
const char *CG_Argv(int arg);
void CG_InitMessageQueue(void);
void CG_UpdateMessageQueue(void);
void CG_AddMessage(const char* msg);
void QDECL CG_Printf( const char *msg, ... ) __attribute__ ((format (printf, 1, 2)));
void QDECL CG_Error( const char *msg, ... ) __attribute__ ((noreturn, format (printf, 1, 2)));
void CG_StartMusic(void);
void CG_UpdateCvars(void);
int CG_CrosshairPlayer(void);
int CG_LastAttacker(void);
void CG_LoadMenus(const char *menuFile);
void CG_KeyEvent(int key, qboolean down);
void CG_MouseEvent(int x, int y);
void CG_EventHandling(int type);
void CG_RankRunFrame(void);
void CG_SetScoreSelection(void *menu);
score_t *CG_GetSelectedScore( void );
void CG_BuildSpectatorString( void );
void CG_ReplaceModels(void);
//
// cg_atmospheric.c
//
void CG_EffectParse( const char *effectstr );
void CG_AddAtmosphericEffects( void );
qboolean CG_AtmosphericKludge( void );
//
// cg_view.c
//
void CG_TestModel_f(void);
void CG_TestGun_f(void);
void CG_TestModelNextFrame_f(void);
void CG_TestModelPrevFrame_f(void);
void CG_TestModelNextSkin_f(void);
void CG_TestModelPrevSkin_f(void);
void CG_ZoomDown_f(void);
void CG_ZoomUp_f(void);
void CG_AddBufferedSound(sfxHandle_t sfx);
void CG_DrawActiveFrame(int serverTime, stereoFrame_t stereoView, qboolean demoPlayback);
//
// cg_drawtools.c
//
void CG_AdjustFrom640(float *x, float *y, float *w, float *h);
void CG_FillRect(float x, float y, float width, float height, const float *color);
void CG_DrawPic(float x, float y, float width, float height, qhandle_t hShader);
void CG_DrawString(float x, float y, const char *string, float charWidth, float charHeight, const float *modulate);
void CG_DrawStringExt(int x, int y, const char *string, const float *setColor,
qboolean forceColor, qboolean shadow, int charWidth, int charHeight, int maxChars);
void CG_DrawBigString(int x, int y, const char *s, float alpha);
void CG_DrawBigStringColor(int x, int y, const char *s, vec4_t color);
void CG_DrawSmallString(int x, int y, const char *s, float alpha);
void CG_DrawSmallStringColor(int x, int y, const char *s, vec4_t color);
void CG_DrawFuzzyRect(float x, float y, float w, float h, float corner, vec4_t color, qhandle_t shader);
void CG_DrawFuzzyShadow(float x, float y, float w, float h, float corner, float alpha);
void CG_DrawFuzzyGlow(float x, float y, float w, float h, float corner, vec4_t color);
int CG_DrawStrlen(const char *str);
float *CG_FadeColor(int startMsec, int totalMsec);
void CG_TeamColor(int team, float *color);
void CG_TileClear(void);
void CG_ColorForHealth(vec4_t hcolor);
void CG_GetColorForHealth(int health, int armor, vec4_t hcolor);
void UI_DrawProportionalString(int x, int y, const char *str, int style, vec4_t color);
int UI_ProportionalStringWidth(const char *str);
float UI_ProportionalSizeScale(int style);
void CG_DrawRect(float x, float y, float width, float height, float size, const float *color);
void CG_DrawSides(float x, float y, float w, float h, float size);
void CG_DrawTopBottom(float x, float y, float w, float h, float size);
void CG_DrawCleanSides(float x, float y, float w, float h, float size, const float *color);
void CG_DrawCleanRect(float x, float y, float width, float height, float size, const float *color);
void CG_DrawCleanLine(float x, float y, float w, float size, const float *color);
//
// cg_draw.c, cg_newDraw.c
//
extern int sortedTeamPlayers[TEAM_MAXOVERLAY];
extern int numSortedTeamPlayers;
extern int drawTeamOverlayModificationCount;
extern char systemChat[256];
extern char teamChat1[256];
extern char teamChat2[256];
void CG_AddLagometerFrameInfo(void);
void CG_AddLagometerSnapshotInfo(snapshot_t * snap);
void CG_CenterPrint(const char *str, int y, int charWidth);
void CG_DrawHead(float x, float y, float w, float h, int clientNum, vec3_t headAngles);
void CG_DrawActive(stereoFrame_t stereoView);
void CG_DrawFlagModel(float x, float y, float w, float h, int team, qboolean force2D);
void CG_DrawTeamBackground(int x, int y, int w, int h, float alpha, int team);
void CG_OwnerDraw(float x, float y, float w, float h, float text_x, float text_y, int ownerDraw, int ownerDrawFlags,
int align, float special, float scale, vec4_t color, qhandle_t shader, int textStyle);
void CG_Text_Paint(float x, float y, float scale, vec4_t color, const char *text, float adjust, int limit, int style);
int CG_Text_Width(const char *text, float scale, int limit);
int CG_Text_Height(const char *text, float scale, int limit);
void CG_SelectPrevPlayer( void );
void CG_SelectNextPlayer( void );
float CG_GetValue(int ownerDraw);
qboolean CG_OwnerDrawVisible(int flags);
void CG_RunMenuScript(char **args);
void CG_ShowResponseHead( void );
void CG_SetPrintString(int type, const char *p);
void CG_InitTeamChat( void );
void CG_GetTeamColor(vec4_t * color);
const char *CG_GetGameStatusText( void );
const char *CG_GetKillerText( void );
void CG_Draw3DModel(float x, float y, float w, float h, qhandle_t model, qhandle_t skin, vec3_t origin, vec3_t angles);
void CG_Text_PaintChar(float x, float y, float width, float height, float scale, float s, float t, float s2, float t2,
qhandle_t hShader);
void CG_CheckOrderPending( void );
const char *CG_GameTypeString( void );
qboolean CG_YourTeamHasFlag( void );
qboolean CG_OtherTeamHasFlag( void );
qhandle_t CG_StatusHandle(int task);
//
// cg_player.c
//
void CG_Player(centity_t * cent);
void CG_ResetPlayerEntity(centity_t * cent);
void CG_AddRefEntityWithPowerups(refEntity_t * ent, entityState_t * state, int team);
void CG_NewClientInfo(int clientNum);
sfxHandle_t CG_CustomSound(int clientNum, const char *soundName);
//
// cg_predict.c
//
void CG_BuildSolidList(void);
int CG_PointContents(const vec3_t point, int passEntityNum);
//Elder: try this
void CG_Trace(trace_t * result, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end,
int skipNumber, int mask);
//void CG_Trace( trace_t *result, const vec3_t start, vec3_t mins, vec3_t maxs, const vec3_t end,
//int skipNumber, int mask );
void CG_PredictPlayerState(void);
void CG_LoadDeferredPlayers(void);
void CG_EvaluateTrajectory(const trajectory_t * tr, int atTime, vec3_t result);
void CG_EvaluateTrajectoryDelta(const trajectory_t * tr, int atTime, vec3_t result);
//Makro - added
void CG_EvaluateTrajectoryEx(centity_t *cent, int time, vec3_t origin, vec3_t angles);
//
// cg_events.c
//
void CG_CheckEvents(centity_t * cent);
const char *CG_PlaceString(int rank);
void CG_EntityEvent(centity_t * cent, vec3_t position);
void CG_PainEvent(centity_t * cent, int health);
//
// cg_ents.c
//
void CG_SetEntitySoundPosition(centity_t * cent);
//Makro - added skyportal param
//void CG_AddPacketEntities(void);
#define ADDENTS_NOSKYPORTAL -1
#define ADDENTS_NORMAL 0
#define ADDENTS_SKYPORTAL 1
//Makro - longest define in the history of mankind ?
#define GET_ZOOM_LEVEL ((cg.zoomLevel & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW && (cg.zoomLevel & RQ3_ZOOM_MED) == RQ3_ZOOM_MED) ? 6 : ((cg.zoomLevel & RQ3_ZOOM_MED) == RQ3_ZOOM_MED) ? 4 : ((cg.zoomLevel & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW) ? 2 : 1
void CG_AddPacketEntities(int mode);
void CG_Beam(centity_t * cent);
//void CG_AdjustPositionForMover(const vec3_t in, int moverNum, int fromTime, int toTime, vec3_t out);
//Makro - made it so that angles get adjusted, too
void CG_AdjustPositionForMover(const vec3_t in, int moverNum, int fromTime, int toTime, vec3_t out, vec3_t angleOut);
void CG_PositionEntityOnTag(refEntity_t * entity, const refEntity_t * parent, qhandle_t parentModel, char *tagName);
void CG_PositionRotatedEntityOnTag(refEntity_t * entity, const refEntity_t * parent,
qhandle_t parentModel, char *tagName);
//Blaze: for weapon animations
void CG_PositionWeaponOnTag(refEntity_t * entity, const refEntity_t * parent, qhandle_t parentModel, char *tagName);
void CG_PositionRotatedOffsetEntityOnTag(refEntity_t * entity, const refEntity_t * parent, qhandle_t parentModel,
char *tagName, vec3_t Offset);
//
// cg_weapons.c
//
void CG_NextWeapon_f(void);
//Elder: added?
void CG_Weapon_f(void);
void CG_PrevWeapon_f(void);
void CG_SpecialWeapon_f(void);
void CG_RQ3_SyncZoom(void);
void CG_RQ3_SaveZoomLevel( void );
//void CG_RQ3_Zoom(void); //Elder: just threw it in
//void CG_RQ3_Zoom1x( void );
int CG_RQ3_GetGrenadeMode( void );
void CG_RQ3_GrenadeMode( void );
void CG_RegisterWeapon(int weaponNum);
void CG_RegisterItemVisuals(int itemNum);
void CG_FireWeapon(centity_t * cent, int weapModification);
void CG_ReloadWeapon(centity_t * cent, int reloadStage); //Elder: added
void CG_MissileHitWall(int weapon, int clientNum, vec3_t origin, vec3_t dir, impactSound_t soundType, int weapModification); //Elder: added weapMod
void CG_MissileHitPlayer(int weapon, vec3_t origin, vec3_t dir, int entityNum);
void CG_ShotgunFire(entityState_t * es, qboolean ism3);
void CG_Bullet(vec3_t origin, int sourceEntityNum, vec3_t normal, qboolean flesh, int fleshEntityNum,
impactSound_t soundType);
void CG_RailTrail(clientInfo_t * ci, vec3_t start, vec3_t end);
void CG_GrappleTrail(centity_t * ent, const weaponInfo_t * wi);
void CG_AddViewWeapon(playerState_t * ps);
void CG_AddPlayerWeapon(refEntity_t * parent, playerState_t * ps, centity_t * cent, int team);
void CG_DrawWeaponSelect(void);
void CG_Tracer(vec3_t source, vec3_t dest);
void CG_OutOfAmmoChange(void); // should this be in pmove?
void CG_CheckLaser( void ); //Elder: check laser to see if it's our own
//
// cg_marks.c
//
void CG_InitMarkPolys(void);
void CG_AddMarks(void);
void CG_ImpactMark(qhandle_t markShader,
const vec3_t origin, const vec3_t dir,
float orientation,
float r, float g, float b, float a, qboolean alphaFade, float radius, qboolean temporary);
//
// cg_localents.c
//
void CG_InitLocalEntities(void);
localEntity_t *CG_AllocLocalEntity(void);
void CG_AddLocalEntities(void);
void CG_FreeLocalEntity(localEntity_t * le);
void CG_LE_EvaluateTrajectory(const trajectory_t * tr, int atTime, vec3_t result);
void CG_LE_EvaluateTrajectoryDelta(const trajectory_t * tr, int atTime, vec3_t result);
//
// cg_effects.c
//
localEntity_t *CG_SmokePuff(const vec3_t p,
const vec3_t vel,
float radius,
float r, float g, float b, float a,
float duration, int startTime, int fadeInTime, int leFlags, qhandle_t hShader);
void CG_BubbleTrail(vec3_t start, vec3_t end, float spacing);
void CG_ScorePlum(int client, vec3_t org, int score);
void CG_DrawVisibleLaser( vec3_t origin, int clientNum, vec3_t dir);
//Blaze: for explosions
void CG_Particle_Bleed(qhandle_t pshader, vec3_t start, vec3_t dir, int fleshEntityNum, int duration);
void CG_ShrapnelSpark(vec3_t source, vec3_t dest, float width, float length);
void CG_GibPlayer(vec3_t playerOrigin);
// JBravo: Sniperheadshots
void CG_GibPlayerHeadshot(vec3_t playerOrigin);
void CG_BigExplode(vec3_t playerOrigin);
// Blaze: Breakable glass Elder: modified
void CG_BreakGlass(vec3_t playerOrigin, int glassParm, int number, int type, int isChip);
void CG_Bleed(vec3_t origin, int entityNum);
//Elder: for SSG shots
void CG_BleedSpray(vec3_t start, vec3_t end, int entityNum, int numBursts);
void CG_BleedParticleSpray(vec3_t start, vec3_t dir, int fleshEntityNum, int amount, int duration);
void CG_EjectBloodSplat(vec3_t origin, vec3_t velocity, int amount, int duration);
localEntity_t *CG_MakeExplosion(vec3_t origin, vec3_t dir,
qhandle_t hModel, qhandle_t shader, int msec, qboolean isSprite);
void CG_Pressure(vec3_t origin, vec3_t dir, int type, int speed, int life);
//
// cg_snapshot.c
//
void CG_ProcessSnapshots(void);
void CG_TransitionEntity(centity_t *cent);
//
// cg_info.c
//
void CG_LoadingString(const char *s);
void CG_LoadingItem(int itemNum);
void CG_LoadingClient(int clientNum);
void CG_DrawInformation(void);
//
// cg_scoreboard.c
//
qboolean CG_DrawOldScoreboard(void);
void CG_DrawOldTourneyScoreboard(void);
//
// cg_players.c
//
void CG_WeaponAnimation(centity_t * cent, int *weaponOld, int *weapon, float *weaponBackLerp);
//
// cg_consolecmds.c
//
qboolean CG_ConsoleCommand(void);
void CG_InitConsoleCommands(void);
//
// cg_servercmds.c
//
void CG_ExecuteNewServerCommands(int latestSequence);
void CG_ParseServerinfo(void);
void CG_SetConfigValues(void);
void CG_LoadVoiceChats(void);
void CG_ShaderStateChanged(void);
void CG_VoiceChatLocal(int mode, qboolean voiceOnly, int clientNum, int color, const char *cmd);
void CG_PlayBufferedVoiceChats(void);
//
// cg_playerstate.c
//
void CG_Respawn(void);
void CG_TransitionPlayerState(playerState_t * ps, playerState_t * ops);
void CG_CheckChangedPredictableEvents(playerState_t * ps);
//===============================================
//
// system traps
// These functions are how the cgame communicates with the main game system
//
// print message on the local console
void trap_Print(const char *fmt);
// abort the game
void trap_Error(const char *fmt) __attribute__((noreturn));
// milliseconds should only be used for performance tuning, never
// for anything game related. Get time from the CG_DrawActiveFrame parameter
int trap_Milliseconds(void);
// console variable interaction
void trap_Cvar_Register(vmCvar_t * vmCvar, const char *varName, const char *defaultValue, int flags);
void trap_Cvar_Update(vmCvar_t * vmCvar);
void trap_Cvar_Set(const char *var_name, const char *value);
void trap_Cvar_VariableStringBuffer(const char *var_name, char *buffer, int bufsize);
// ServerCommand and ConsoleCommand parameter access
int trap_Argc(void);
void trap_Argv(int n, char *buffer, int bufferLength);
void trap_Args(char *buffer, int bufferLength);
// filesystem access
// returns length of file
int trap_FS_FOpenFile(const char *qpath, fileHandle_t * f, fsMode_t mode);
void trap_FS_Read(void *buffer, int len, fileHandle_t f);
void trap_FS_Write(const void *buffer, int len, fileHandle_t f);
void trap_FS_FCloseFile(fileHandle_t f);
int trap_FS_Seek(fileHandle_t f, long offset, int origin); // fsOrigin_t
// add commands to the local console as if they were typed in
// for map changing, etc. The command is not executed immediately,
// but will be executed in order the next time console commands
// are processed
void trap_SendConsoleCommand(const char *text);
// register a command name so the console can perform command completion.
// FIXME: replace this with a normal console command "defineCommand"?
void trap_AddCommand(const char *cmdName);
void trap_RemoveCommand(const char *cmdName);
// send a string to the server over the network
void trap_SendClientCommand(const char *s);
// force a screen update, only used during gamestate load
void trap_UpdateScreen(void);
// model collision
void trap_CM_LoadMap(const char *mapname);
int trap_CM_NumInlineModels(void);
clipHandle_t trap_CM_InlineModel(int index); // 0 = world, 1+ = bmodels
clipHandle_t trap_CM_TempBoxModel(const vec3_t mins, const vec3_t maxs);
int trap_CM_PointContents(const vec3_t p, clipHandle_t model);
int trap_CM_TransformedPointContents(const vec3_t p, clipHandle_t model, const vec3_t origin, const vec3_t angles);
void trap_CM_BoxTrace(trace_t * results, const vec3_t start, const vec3_t end,
const vec3_t mins, const vec3_t maxs, clipHandle_t model, int brushmask);
void trap_CM_CapsuleTrace( trace_t *results, const vec3_t start, const vec3_t end,
const vec3_t mins, const vec3_t maxs,
clipHandle_t model, int brushmask );
void trap_CM_TransformedBoxTrace(trace_t * results, const vec3_t start, const vec3_t end,
const vec3_t mins, const vec3_t maxs,
clipHandle_t model, int brushmask, const vec3_t origin, const vec3_t angles);
void trap_CM_TransformedCapsuleTrace( trace_t *results, const vec3_t start, const vec3_t end,
const vec3_t mins, const vec3_t maxs,
clipHandle_t model, int brushmask,
const vec3_t origin, const vec3_t angles );
// Returns the projection of a polygon onto the solid brushes in the world
int trap_CM_MarkFragments(int numPoints, const vec3_t * points,
const vec3_t projection,
int maxPoints, vec3_t pointBuffer, int maxFragments, markFragment_t * fragmentBuffer);
// normal sounds will have their volume dynamically changed as their entity
// moves and the listener moves
void trap_S_StartSound(vec3_t origin, int entityNum, int entchannel, sfxHandle_t sfx);
void trap_S_StopLoopingSound(int entnum);
// a local sound is always played full volume
void trap_S_StartLocalSound(sfxHandle_t sfx, int channelNum);
void trap_S_ClearLoopingSounds(qboolean killall);
void trap_S_AddLoopingSound(int entityNum, const vec3_t origin, const vec3_t velocity, sfxHandle_t sfx);
void trap_S_AddRealLoopingSound(int entityNum, const vec3_t origin, const vec3_t velocity, sfxHandle_t sfx);
void trap_S_UpdateEntityPosition(int entityNum, const vec3_t origin);
// respatialize recalculates the volumes of sound as they should be heard by the
// given entityNum and position
void trap_S_Respatialize(int entityNum, const vec3_t origin, vec3_t axis[3], int inwater);
sfxHandle_t trap_S_RegisterSound(const char *sample, qboolean compressed); // returns buzz if not found
void trap_S_StartBackgroundTrack(const char *intro, const char *loop); // empty name stops music
void trap_S_StopBackgroundTrack(void);
void trap_R_LoadWorldMap(const char *mapname);
// all media should be registered during level startup to prevent
// hitches during gameplay
qhandle_t trap_R_RegisterModel(const char *name); // returns rgb axis if not found
qhandle_t trap_R_RegisterSkin(const char *name); // returns all white if not found
qhandle_t trap_R_RegisterShader(const char *name); // returns all white if not found
qhandle_t trap_R_RegisterShaderNoMip(const char *name); // returns all white if not found
// a scene is built up by calls to R_ClearScene and the various R_Add functions.
// Nothing is drawn until R_RenderScene is called.
void trap_R_ClearScene(void);
void trap_R_AddRefEntityToScene(const refEntity_t * re);
// polys are intended for simple wall marks, not really for doing
// significant construction
void trap_R_AddPolyToScene(qhandle_t hShader, int numVerts, const polyVert_t * verts);
void trap_R_AddPolysToScene(qhandle_t hShader, int numVerts, const polyVert_t * verts, int numPolys);
void trap_R_AddLightToScene(const vec3_t org, float intensity, float r, float g, float b);
void trap_R_AddAdditiveLightToScene(const vec3_t org, float intensity, float r, float g, float b);
int trap_R_LightForPoint(vec3_t point, vec3_t ambientLight, vec3_t directedLight, vec3_t lightDir);
void trap_R_RenderScene(const refdef_t * fd);
void trap_R_SetColor(const float *rgba); // NULL = 1,1,1,1
void trap_R_DrawStretchPic(float x, float y, float w, float h,
float s1, float t1, float s2, float t2, qhandle_t hShader);
void trap_R_ModelBounds(clipHandle_t model, vec3_t mins, vec3_t maxs);
int trap_R_LerpTag(orientation_t * tag, clipHandle_t mod, int startFrame, int endFrame,
float frac, const char *tagName);
void trap_R_RemapShader(const char *oldShader, const char *newShader, const char *timeOffset);
qboolean trap_R_inPVS(const vec3_t p1, const vec3_t p2);
// The glconfig_t will not change during the life of a cgame.
// If it needs to change, the entire cgame will be restarted, because
// all the qhandle_t are then invalid.
void trap_GetGlconfig(glconfig_t * glconfig);
// the gamestate should be grabbed at startup, and whenever a
// configstring changes
void trap_GetGameState(gameState_t * gamestate);
// cgame will poll each frame to see if a newer snapshot has arrived
// that it is interested in. The time is returned seperately so that
// snapshot latency can be calculated.
void trap_GetCurrentSnapshotNumber(int *snapshotNumber, int *serverTime);
// a snapshot get can fail if the snapshot (or the entties it holds) is so
// old that it has fallen out of the client system queue
qboolean trap_GetSnapshot(int snapshotNumber, snapshot_t * snapshot);
// retrieve a text command from the server stream
// the current snapshot will hold the number of the most recent command
// qfalse can be returned if the client system handled the command
// argc() / argv() can be used to examine the parameters of the command
qboolean trap_GetServerCommand(int serverCommandNumber);
// returns the most recent command number that can be passed to GetUserCmd
// this will always be at least one higher than the number in the current
// snapshot, and it may be quite a few higher if it is a fast computer on
// a lagged connection
int trap_GetCurrentCmdNumber(void);
qboolean trap_GetUserCmd(int cmdNumber, usercmd_t * ucmd);
// used for the weapon select and zoom
void trap_SetUserCmdValue(int stateValue, float sensitivityScale);
// aids for VM testing
void testPrintInt(char *string, int i);
void testPrintFloat(char *string, float f);
int trap_MemoryRemaining(void);
void trap_R_RegisterFont(const char *fontName, int pointSize, fontInfo_t * font);
qboolean trap_Key_IsDown(int keynum);
int trap_Key_GetCatcher(void);
void trap_Key_SetCatcher(int catcher);
int trap_Key_GetKey(const char *binding);
typedef enum {
SYSTEM_PRINT,
CHAT_PRINT,
TEAMCHAT_PRINT
} q3print_t; // bk001201 - warning: useless keyword or type name in empty declaration
int trap_CIN_PlayCinematic(const char *arg0, int xpos, int ypos, int width, int height, int bits);
e_status trap_CIN_StopCinematic(int handle);
e_status trap_CIN_RunCinematic(int handle);
void trap_CIN_DrawCinematic(int handle);
void trap_CIN_SetExtents(int handle, int x, int y, int w, int h);
void trap_SnapVector(float *v);
int trap_RealTime(qtime_t *qtime);
qboolean trap_loadCamera(const char *name);
void trap_startCamera(int time);
qboolean trap_getCameraInfo(int time, vec3_t * origin, vec3_t * angles);
qboolean trap_GetEntityToken(char *buffer, int bufferSize);
void trap_RQ3_Key_KeynumToStringBuf(int keynum, char *buf, int buflen);
void CG_ClearParticles(void);
void CG_AddParticles(void);
void CG_ParticleSnow(qhandle_t pshader, vec3_t origin, vec3_t origin2, int turb, float range, int snum);
void CG_ParticleSmoke(qhandle_t pshader, centity_t * cent);
void CG_AddParticleShrapnel(localEntity_t * le);
void CG_ParticleSnowFlurry(qhandle_t pshader, centity_t * cent);
void CG_ParticleBulletDebris(vec3_t org, vec3_t vel, int duration);
void CG_ParticleSparks(vec3_t org, vec3_t vel, int duration, float x, float y, float speed, float scale);
void CG_ParticleDust(centity_t * cent, vec3_t origin, vec3_t dir);
void CG_ParticleMisc(qhandle_t pshader, vec3_t origin, int size, int duration, float alpha);
void CG_ParticleExplosion(char *animStr, vec3_t origin, vec3_t vel, int duration, int sizeStart, int sizeEnd);
void CG_ParticleAir(vec3_t org, vec3_t vel, int duration, float alpha, float speed, float scale);
void CG_ParticleSteam(vec3_t org, vec3_t vel, int duration, float alpha, float speed, float scale, int Shader);
void CG_ParticleWater(vec3_t org, vec3_t vel, int duration, float alpha, float speed, float scale);
extern qboolean initparticles;
int CG_NewParticleArea(int num);
//Makro - added
void CG_DrawBigPolygon(void);
void CG_ParticleHitSnow(vec3_t org, vec3_t vel, int duration, float x, float y, float speed, float scale);
void CG_ParticleHitGrass(vec3_t org, vec3_t vel, int duration, float x, float y, float speed, float scale);
void CG_ParticleHitWall(vec3_t org, vec3_t vel, int duration, float x, float y, float speed, float scale);
//void CG_AddLensFlare(qboolean sun);