//-----------------------------------------------------------------------------
//
// $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 "../renderer/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);

// 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_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);

// 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);
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);

// 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);

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);
