aboutsummaryrefslogtreecommitdiffstats
path: root/code/cgame/cg_local.h
diff options
context:
space:
mode:
authorzakk <zakk@edf5b092-35ff-0310-97b2-ce42778d08ea>2005-08-26 17:39:27 +0000
committerzakk <zakk@edf5b092-35ff-0310-97b2-ce42778d08ea>2005-08-26 17:39:27 +0000
commit6bf20c78f5b69d40bcc4931df93d29198435ab67 (patch)
treee3eda937a05d7db42de725b7013bd0344b987f34 /code/cgame/cg_local.h
parent872d4d7f55af706737ffb361bb76ad13e7496770 (diff)
downloadioquake3-aero-6bf20c78f5b69d40bcc4931df93d29198435ab67.tar.gz
ioquake3-aero-6bf20c78f5b69d40bcc4931df93d29198435ab67.zip
newlines fixed
git-svn-id: svn://svn.icculus.org/quake3/trunk@6 edf5b092-35ff-0310-97b2-ce42778d08ea
Diffstat (limited to 'code/cgame/cg_local.h')
-rwxr-xr-xcode/cgame/cg_local.h3338
1 files changed, 1669 insertions, 1669 deletions
diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h
index 4dd5c9d..a23f715 100755
--- a/code/cgame/cg_local.h
+++ b/code/cgame/cg_local.h
@@ -1,1669 +1,1669 @@
-/*
-===========================================================================
-Copyright (C) 1999-2005 Id Software, Inc.
-
-This file is part of Quake III Arena source code.
-
-Quake III Arena source code is free software; you can redistribute it
-and/or modify it under the terms of the GNU General Public License as
-published by the Free Software Foundation; either version 2 of the License,
-or (at your option) any later version.
-
-Quake III Arena source code is distributed in the hope that it will be
-useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with Foobar; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-===========================================================================
-*/
-//
-#include "../game/q_shared.h"
-#include "tr_types.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.
-
-#ifdef MISSIONPACK
-#define CG_FONT_THRESHOLD 0.1
-#endif
-
-#define POWERUP_BLINKS 5
-
-#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 ITEM_SCALEUP_TIME 1000
-#define ZOOM_TIME 150
-#define ITEM_BLOB_TIME 200
-#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
-#define CHAR_WIDTH 32
-#define CHAR_HEIGHT 48
-#define TEXT_ICON_SPACE 4
-
-#define TEAMCHAT_WIDTH 80
-#define TEAMCHAT_HEIGHT 8
-
-// very large characters
-#define GIANT_WIDTH 32
-#define GIANT_HEIGHT 48
-
-#define NUM_CROSSHAIRS 10
-
-#define TEAM_OVERLAY_MAXNAME_WIDTH 12
-#define TEAM_OVERLAY_MAXLOCATION_WIDTH 16
-
-#define DEFAULT_MODEL "sarge"
-#ifdef MISSIONPACK
-#define DEFAULT_TEAM_MODEL "james"
-#define DEFAULT_TEAM_HEAD "*james"
-#else
-#define DEFAULT_TEAM_MODEL "sarge"
-#define DEFAULT_TEAM_HEAD "sarge"
-#endif
-
-#define DEFAULT_REDTEAM_NAME "Stroggs"
-#define DEFAULT_BLUETEAM_NAME "Pagans"
-
-typedef enum {
- FOOTSTEP_NORMAL,
- FOOTSTEP_BOOT,
- FOOTSTEP_FLESH,
- FOOTSTEP_MECH,
- FOOTSTEP_ENERGY,
- FOOTSTEP_METAL,
- FOOTSTEP_SPLASH,
-
- FOOTSTEP_TOTAL
-} footstep_t;
-
-typedef enum {
- IMPACTSOUND_DEFAULT,
- IMPACTSOUND_METAL,
- IMPACTSOUND_FLESH
-} impactSound_t;
-
-//=================================================
-
-// 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;
-} 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 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,
-#ifdef MISSIONPACK
- LE_KAMIKAZE,
- LE_INVULIMPACT,
- LE_INVULJUICED,
- LE_SHOWREFENTITY
-#endif
-} 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
-} 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;
-} localEntity_t;
-
-//======================================================================
-
-
-typedef struct {
- int client;
- int score;
- int ping;
- int time;
- int scoreFlags;
- int powerUps;
- int accuracy;
- int impressiveCount;
- int excellentCount;
- int guantletCount;
- int defendCount;
- int assistCount;
- int captures;
- qboolean perfect;
- int team;
-} score_t;
-
-// 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;
-
-
-// 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;
- qhandle_t barrelModel;
- qhandle_t flashModel;
-
- 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 missileModel;
- sfxHandle_t missileSound;
- void (*missileTrailFunc)( centity_t *, const struct weaponInfo_s *wi );
- float missileDlight;
- vec3_t missileDlightColor;
- int missileRenderfx;
-
- void (*ejectBrassFunc)( centity_t * );
-
- float trailRadius;
- float wiTrailTime;
-
- sfxHandle_t readySound;
- sfxHandle_t firingSound;
- 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;
-} 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
-
-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 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;
- vec3_t refdefViewAngles; // will be converted to refdef.viewaxis
-
- // zoom key
- qboolean zoomed;
- 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;
- 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
-
- // skull trails
- skulltrail_t skulltrails[MAX_CLIENTS];
-
- // centerprinting
- int centerPrintTime;
- int centerPrintCharWidth;
- int centerPrintY;
- char centerPrint[1024];
- int centerPrintLines;
-
- // 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;
-
- // 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;
-
- // 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;
-
-} cg_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 redCubeModel;
- qhandle_t blueCubeModel;
- qhandle_t redCubeIcon;
- qhandle_t blueCubeIcon;
- 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;
-
-#ifdef MISSIONPACK
- qhandle_t overloadBaseModel;
- qhandle_t overloadTargetModel;
- qhandle_t overloadLightsModel;
- qhandle_t overloadEnergyModel;
-
- qhandle_t harvesterModel;
- qhandle_t harvesterRedSkin;
- qhandle_t harvesterBlueSkin;
- qhandle_t harvesterNeutralModel;
-#endif
-
- 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 smoke2;
-
- qhandle_t machinegunBrassModel;
- qhandle_t shotgunBrassModel;
-
- 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;
-
- qhandle_t smokePuffShader;
- qhandle_t smokePuffRageProShader;
- qhandle_t shotgunSmokePuffShader;
- qhandle_t plasmaBallShader;
- qhandle_t waterBubbleShader;
- qhandle_t bloodTrailShader;
-#ifdef MISSIONPACK
- qhandle_t nailPuffShader;
- qhandle_t blueProxMine;
-#endif
-
- qhandle_t numberShaders[11];
-
- qhandle_t shadowMarkShader;
-
- qhandle_t botSkillShaders[5];
-
- // wall mark shaders
- qhandle_t wakeMarkShader;
- qhandle_t bloodMarkShader;
- qhandle_t bulletMarkShader;
- qhandle_t burnMarkShader;
- qhandle_t holeMarkShader;
- qhandle_t energyMarkShader;
-
- // 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;
-
- // weapon effect models
- qhandle_t bulletFlashModel;
- qhandle_t ringFlashModel;
- qhandle_t dishFlashModel;
- qhandle_t lightningExplosionModel;
-
- // 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
- qhandle_t teleportEffectModel;
- qhandle_t teleportEffectShader;
-#ifdef MISSIONPACK
- qhandle_t kamikazeEffectModel;
- qhandle_t kamikazeShockWave;
- qhandle_t kamikazeHeadModel;
- qhandle_t kamikazeHeadTrail;
- qhandle_t guardPowerupModel;
- qhandle_t scoutPowerupModel;
- qhandle_t doublerPowerupModel;
- qhandle_t ammoRegenPowerupModel;
- qhandle_t invulnerabilityImpactModel;
- qhandle_t invulnerabilityJuicedModel;
- qhandle_t medkitUsageModel;
- qhandle_t dustPuffShader;
- qhandle_t heartShader;
-#endif
- qhandle_t invulnerabilityPowerupModel;
-
- // scoreboard headers
- qhandle_t scoreboardName;
- qhandle_t scoreboardPing;
- qhandle_t scoreboardScore;
- qhandle_t scoreboardTime;
-
- // medals shown during gameplay
- qhandle_t medalImpressive;
- qhandle_t medalExcellent;
- qhandle_t medalGauntlet;
- qhandle_t medalDefend;
- qhandle_t medalAssist;
- qhandle_t medalCapture;
-
- // sounds
- 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;
- sfxHandle_t sfx_railg;
- sfxHandle_t sfx_rockexp;
- sfxHandle_t sfx_plasmaexp;
-#ifdef MISSIONPACK
- sfxHandle_t sfx_proxexp;
- sfxHandle_t sfx_nghit;
- sfxHandle_t sfx_nghitflesh;
- sfxHandle_t sfx_nghitmetal;
- sfxHandle_t sfx_chghit;
- sfxHandle_t sfx_chghitflesh;
- sfxHandle_t sfx_chghitmetal;
- sfxHandle_t kamikazeExplodeSound;
- sfxHandle_t kamikazeImplodeSound;
- sfxHandle_t kamikazeFarSound;
- sfxHandle_t useInvulnerabilitySound;
- sfxHandle_t invulnerabilityImpactSound1;
- sfxHandle_t invulnerabilityImpactSound2;
- sfxHandle_t invulnerabilityImpactSound3;
- sfxHandle_t invulnerabilityJuicedSound;
- sfxHandle_t obeliskHitSound1;
- sfxHandle_t obeliskHitSound2;
- sfxHandle_t obeliskHitSound3;
- sfxHandle_t obeliskRespawnSound;
- sfxHandle_t winnerSound;
- sfxHandle_t loserSound;
- sfxHandle_t youSuckSound;
-#endif
- sfxHandle_t gibSound;
- 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;
-
-#ifdef MISSIONPACK
- // new stuff
- qhandle_t patrolShader;
- qhandle_t assaultShader;
- qhandle_t campShader;
- qhandle_t followShader;
- qhandle_t defendShader;
- qhandle_t teamLeaderShader;
- qhandle_t retrieveShader;
- qhandle_t escortShader;
- qhandle_t flagShaders[3];
- sfxHandle_t countPrepareTeamSound;
-
- sfxHandle_t ammoregenSound;
- sfxHandle_t doublerSound;
- sfxHandle_t guardSound;
- sfxHandle_t scoutSound;
-#endif
- 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;
- sfxHandle_t wstbimplSound;
- sfxHandle_t wstbimpmSound;
- sfxHandle_t wstbimpdSound;
- sfxHandle_t wstbactvSound;
-
-} 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;
-
- 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];
-
- 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[TEAMCHAT_HEIGHT][TEAMCHAT_WIDTH*3+1];
- int teamChatMsgTimes[TEAMCHAT_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;
-
-} 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];
-
-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_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_zoomFov;
-extern vmCvar_t cg_thirdPersonRange;
-extern vmCvar_t cg_thirdPersonAngle;
-extern vmCvar_t cg_thirdPerson;
-extern vmCvar_t cg_stereoSeparation;
-extern vmCvar_t cg_lagometer;
-extern vmCvar_t cg_drawAttacker;
-extern vmCvar_t cg_synchronousClients;
-extern vmCvar_t cg_teamChatTime;
-extern vmCvar_t cg_teamChatHeight;
-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;
-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;
-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;
-#ifdef MISSIONPACK
-extern vmCvar_t cg_redTeamName;
-extern vmCvar_t cg_blueTeamName;
-extern vmCvar_t cg_currentSelectedPlayer;
-extern vmCvar_t cg_currentSelectedPlayerName;
-extern vmCvar_t cg_singlePlayer;
-extern vmCvar_t cg_enableDust;
-extern vmCvar_t cg_enableBreath;
-extern vmCvar_t cg_singlePlayerActive;
-extern vmCvar_t cg_recordSPDemo;
-extern vmCvar_t cg_recordSPDemoName;
-extern vmCvar_t cg_obeliskRespawnDelay;
-#endif
-
-//
-// cg_main.c
-//
-const char *CG_ConfigString( int index );
-const char *CG_Argv( int arg );
-
-void QDECL CG_Printf( const char *msg, ... );
-void QDECL CG_Error( const char *msg, ... );
-
-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 CG_BuildSpectatorString();
-
-
-//
-// 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 );
-
-int CG_DrawStrlen( const char *str );
-
-float *CG_FadeColor( int startMsec, int totalMsec );
-float *CG_TeamColor( int team );
-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 );
-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);
-
-
-//
-// 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 CG_SelectNextPlayer();
-float CG_GetValue(int ownerDraw);
-qboolean CG_OwnerDrawVisible(int flags);
-void CG_RunMenuScript(char **args);
-void CG_ShowResponseHead();
-void CG_SetPrintString(int type, const char *p);
-void CG_InitTeamChat();
-void CG_GetTeamColor(vec4_t *color);
-const char *CG_GetGameStatusText();
-const char *CG_GetKillerText();
-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();
-const char *CG_GameTypeString();
-qboolean CG_YourTeamHasFlag();
-qboolean CG_OtherTeamHasFlag();
-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 );
-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_PredictPlayerState( void );
-void CG_LoadDeferredPlayers( void );
-
-
-//
-// 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 );
-void CG_AddPacketEntities( void );
-void CG_Beam( centity_t *cent );
-void CG_AdjustPositionForMover( const vec3_t in, int moverNum, int fromTime, int toTime, vec3_t out );
-
-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 );
-
-
-
-//
-// cg_weapons.c
-//
-void CG_NextWeapon_f( void );
-void CG_PrevWeapon_f( void );
-void CG_Weapon_f( void );
-
-void CG_RegisterWeapon( int weaponNum );
-void CG_RegisterItemVisuals( int itemNum );
-
-void CG_FireWeapon( centity_t *cent );
-void CG_MissileHitWall( int weapon, int clientNum, vec3_t origin, vec3_t dir, impactSound_t soundType );
-void CG_MissileHitPlayer( int weapon, vec3_t origin, vec3_t dir, int entityNum );
-void CG_ShotgunFire( entityState_t *es );
-void CG_Bullet( vec3_t origin, int sourceEntityNum, vec3_t normal, qboolean flesh, int fleshEntityNum );
-
-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_OutOfAmmoChange( void ); // should this be in pmove?
-
-//
-// 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 );
-
-//
-// 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_SpawnEffect( vec3_t org );
-#ifdef MISSIONPACK
-void CG_KamikazeEffect( vec3_t org );
-void CG_ObeliskExplode( vec3_t org, int entityNum );
-void CG_ObeliskPain( vec3_t org );
-void CG_InvulnerabilityImpact( vec3_t org, vec3_t angles );
-void CG_InvulnerabilityJuiced( vec3_t org );
-void CG_LightningBoltBeam( vec3_t start, vec3_t end );
-#endif
-void CG_ScorePlum( int client, vec3_t org, int score );
-
-void CG_GibPlayer( vec3_t playerOrigin );
-void CG_BigExplode( vec3_t playerOrigin );
-
-void CG_Bleed( vec3_t origin, int entityNum );
-
-localEntity_t *CG_MakeExplosion( vec3_t origin, vec3_t dir,
- qhandle_t hModel, qhandle_t shader, int msec,
- qboolean isSprite );
-
-//
-// cg_snapshot.c
-//
-void CG_ProcessSnapshots( void );
-
-//
-// 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_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 );
-
-// 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 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);
-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);
-extern qboolean initparticles;
-int CG_NewParticleArea ( int num );
-
-
+/*
+===========================================================================
+Copyright (C) 1999-2005 Id Software, Inc.
+
+This file is part of Quake III Arena source code.
+
+Quake III Arena source code is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Quake III Arena source code is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+//
+#include "../game/q_shared.h"
+#include "tr_types.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.
+
+#ifdef MISSIONPACK
+#define CG_FONT_THRESHOLD 0.1
+#endif
+
+#define POWERUP_BLINKS 5
+
+#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 ITEM_SCALEUP_TIME 1000
+#define ZOOM_TIME 150
+#define ITEM_BLOB_TIME 200
+#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
+#define CHAR_WIDTH 32
+#define CHAR_HEIGHT 48
+#define TEXT_ICON_SPACE 4
+
+#define TEAMCHAT_WIDTH 80
+#define TEAMCHAT_HEIGHT 8
+
+// very large characters
+#define GIANT_WIDTH 32
+#define GIANT_HEIGHT 48
+
+#define NUM_CROSSHAIRS 10
+
+#define TEAM_OVERLAY_MAXNAME_WIDTH 12
+#define TEAM_OVERLAY_MAXLOCATION_WIDTH 16
+
+#define DEFAULT_MODEL "sarge"
+#ifdef MISSIONPACK
+#define DEFAULT_TEAM_MODEL "james"
+#define DEFAULT_TEAM_HEAD "*james"
+#else
+#define DEFAULT_TEAM_MODEL "sarge"
+#define DEFAULT_TEAM_HEAD "sarge"
+#endif
+
+#define DEFAULT_REDTEAM_NAME "Stroggs"
+#define DEFAULT_BLUETEAM_NAME "Pagans"
+
+typedef enum {
+ FOOTSTEP_NORMAL,
+ FOOTSTEP_BOOT,
+ FOOTSTEP_FLESH,
+ FOOTSTEP_MECH,
+ FOOTSTEP_ENERGY,
+ FOOTSTEP_METAL,
+ FOOTSTEP_SPLASH,
+
+ FOOTSTEP_TOTAL
+} footstep_t;
+
+typedef enum {
+ IMPACTSOUND_DEFAULT,
+ IMPACTSOUND_METAL,
+ IMPACTSOUND_FLESH
+} impactSound_t;
+
+//=================================================
+
+// 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;
+} 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 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,
+#ifdef MISSIONPACK
+ LE_KAMIKAZE,
+ LE_INVULIMPACT,
+ LE_INVULJUICED,
+ LE_SHOWREFENTITY
+#endif
+} 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
+} 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;
+} localEntity_t;
+
+//======================================================================
+
+
+typedef struct {
+ int client;
+ int score;
+ int ping;
+ int time;
+ int scoreFlags;
+ int powerUps;
+ int accuracy;
+ int impressiveCount;
+ int excellentCount;
+ int guantletCount;
+ int defendCount;
+ int assistCount;
+ int captures;
+ qboolean perfect;
+ int team;
+} score_t;
+
+// 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;
+
+
+// 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;
+ qhandle_t barrelModel;
+ qhandle_t flashModel;
+
+ 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 missileModel;
+ sfxHandle_t missileSound;
+ void (*missileTrailFunc)( centity_t *, const struct weaponInfo_s *wi );
+ float missileDlight;
+ vec3_t missileDlightColor;
+ int missileRenderfx;
+
+ void (*ejectBrassFunc)( centity_t * );
+
+ float trailRadius;
+ float wiTrailTime;
+
+ sfxHandle_t readySound;
+ sfxHandle_t firingSound;
+ 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;
+} 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
+
+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 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;
+ vec3_t refdefViewAngles; // will be converted to refdef.viewaxis
+
+ // zoom key
+ qboolean zoomed;
+ 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;
+ 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
+
+ // skull trails
+ skulltrail_t skulltrails[MAX_CLIENTS];
+
+ // centerprinting
+ int centerPrintTime;
+ int centerPrintCharWidth;
+ int centerPrintY;
+ char centerPrint[1024];
+ int centerPrintLines;
+
+ // 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;
+
+ // 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;
+
+ // 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;
+
+} cg_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 redCubeModel;
+ qhandle_t blueCubeModel;
+ qhandle_t redCubeIcon;
+ qhandle_t blueCubeIcon;
+ 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;
+
+#ifdef MISSIONPACK
+ qhandle_t overloadBaseModel;
+ qhandle_t overloadTargetModel;
+ qhandle_t overloadLightsModel;
+ qhandle_t overloadEnergyModel;
+
+ qhandle_t harvesterModel;
+ qhandle_t harvesterRedSkin;
+ qhandle_t harvesterBlueSkin;
+ qhandle_t harvesterNeutralModel;
+#endif
+
+ 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 smoke2;
+
+ qhandle_t machinegunBrassModel;
+ qhandle_t shotgunBrassModel;
+
+ 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;
+
+ qhandle_t smokePuffShader;
+ qhandle_t smokePuffRageProShader;
+ qhandle_t shotgunSmokePuffShader;
+ qhandle_t plasmaBallShader;
+ qhandle_t waterBubbleShader;
+ qhandle_t bloodTrailShader;
+#ifdef MISSIONPACK
+ qhandle_t nailPuffShader;
+ qhandle_t blueProxMine;
+#endif
+
+ qhandle_t numberShaders[11];
+
+ qhandle_t shadowMarkShader;
+
+ qhandle_t botSkillShaders[5];
+
+ // wall mark shaders
+ qhandle_t wakeMarkShader;
+ qhandle_t bloodMarkShader;
+ qhandle_t bulletMarkShader;
+ qhandle_t burnMarkShader;
+ qhandle_t holeMarkShader;
+ qhandle_t energyMarkShader;
+
+ // 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;
+
+ // weapon effect models
+ qhandle_t bulletFlashModel;
+ qhandle_t ringFlashModel;
+ qhandle_t dishFlashModel;
+ qhandle_t lightningExplosionModel;
+
+ // 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
+ qhandle_t teleportEffectModel;
+ qhandle_t teleportEffectShader;
+#ifdef MISSIONPACK
+ qhandle_t kamikazeEffectModel;
+ qhandle_t kamikazeShockWave;
+ qhandle_t kamikazeHeadModel;
+ qhandle_t kamikazeHeadTrail;
+ qhandle_t guardPowerupModel;
+ qhandle_t scoutPowerupModel;
+ qhandle_t doublerPowerupModel;
+ qhandle_t ammoRegenPowerupModel;
+ qhandle_t invulnerabilityImpactModel;
+ qhandle_t invulnerabilityJuicedModel;
+ qhandle_t medkitUsageModel;
+ qhandle_t dustPuffShader;
+ qhandle_t heartShader;
+#endif
+ qhandle_t invulnerabilityPowerupModel;
+
+ // scoreboard headers
+ qhandle_t scoreboardName;
+ qhandle_t scoreboardPing;
+ qhandle_t scoreboardScore;
+ qhandle_t scoreboardTime;
+
+ // medals shown during gameplay
+ qhandle_t medalImpressive;
+ qhandle_t medalExcellent;
+ qhandle_t medalGauntlet;
+ qhandle_t medalDefend;
+ qhandle_t medalAssist;
+ qhandle_t medalCapture;
+
+ // sounds
+ 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;
+ sfxHandle_t sfx_railg;
+ sfxHandle_t sfx_rockexp;
+ sfxHandle_t sfx_plasmaexp;
+#ifdef MISSIONPACK
+ sfxHandle_t sfx_proxexp;
+ sfxHandle_t sfx_nghit;
+ sfxHandle_t sfx_nghitflesh;
+ sfxHandle_t sfx_nghitmetal;
+ sfxHandle_t sfx_chghit;
+ sfxHandle_t sfx_chghitflesh;
+ sfxHandle_t sfx_chghitmetal;
+ sfxHandle_t kamikazeExplodeSound;
+ sfxHandle_t kamikazeImplodeSound;
+ sfxHandle_t kamikazeFarSound;
+ sfxHandle_t useInvulnerabilitySound;
+ sfxHandle_t invulnerabilityImpactSound1;
+ sfxHandle_t invulnerabilityImpactSound2;
+ sfxHandle_t invulnerabilityImpactSound3;
+ sfxHandle_t invulnerabilityJuicedSound;
+ sfxHandle_t obeliskHitSound1;
+ sfxHandle_t obeliskHitSound2;
+ sfxHandle_t obeliskHitSound3;
+ sfxHandle_t obeliskRespawnSound;
+ sfxHandle_t winnerSound;
+ sfxHandle_t loserSound;
+ sfxHandle_t youSuckSound;
+#endif
+ sfxHandle_t gibSound;
+ 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;
+
+#ifdef MISSIONPACK
+ // new stuff
+ qhandle_t patrolShader;
+ qhandle_t assaultShader;
+ qhandle_t campShader;
+ qhandle_t followShader;
+ qhandle_t defendShader;
+ qhandle_t teamLeaderShader;
+ qhandle_t retrieveShader;
+ qhandle_t escortShader;
+ qhandle_t flagShaders[3];
+ sfxHandle_t countPrepareTeamSound;
+
+ sfxHandle_t ammoregenSound;
+ sfxHandle_t doublerSound;
+ sfxHandle_t guardSound;
+ sfxHandle_t scoutSound;
+#endif
+ 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;
+ sfxHandle_t wstbimplSound;
+ sfxHandle_t wstbimpmSound;
+ sfxHandle_t wstbimpdSound;
+ sfxHandle_t wstbactvSound;
+
+} 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;
+
+ 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];
+
+ 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[TEAMCHAT_HEIGHT][TEAMCHAT_WIDTH*3+1];
+ int teamChatMsgTimes[TEAMCHAT_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;
+
+} 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];
+
+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_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_zoomFov;
+extern vmCvar_t cg_thirdPersonRange;
+extern vmCvar_t cg_thirdPersonAngle;
+extern vmCvar_t cg_thirdPerson;
+extern vmCvar_t cg_stereoSeparation;
+extern vmCvar_t cg_lagometer;
+extern vmCvar_t cg_drawAttacker;
+extern vmCvar_t cg_synchronousClients;
+extern vmCvar_t cg_teamChatTime;
+extern vmCvar_t cg_teamChatHeight;
+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;
+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;
+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;
+#ifdef MISSIONPACK
+extern vmCvar_t cg_redTeamName;
+extern vmCvar_t cg_blueTeamName;
+extern vmCvar_t cg_currentSelectedPlayer;
+extern vmCvar_t cg_currentSelectedPlayerName;
+extern vmCvar_t cg_singlePlayer;
+extern vmCvar_t cg_enableDust;
+extern vmCvar_t cg_enableBreath;
+extern vmCvar_t cg_singlePlayerActive;
+extern vmCvar_t cg_recordSPDemo;
+extern vmCvar_t cg_recordSPDemoName;
+extern vmCvar_t cg_obeliskRespawnDelay;
+#endif
+
+//
+// cg_main.c
+//
+const char *CG_ConfigString( int index );
+const char *CG_Argv( int arg );
+
+void QDECL CG_Printf( const char *msg, ... );
+void QDECL CG_Error( const char *msg, ... );
+
+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 CG_BuildSpectatorString();
+
+
+//
+// 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 );
+
+int CG_DrawStrlen( const char *str );
+
+float *CG_FadeColor( int startMsec, int totalMsec );
+float *CG_TeamColor( int team );
+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 );
+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);
+
+
+//
+// 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 CG_SelectNextPlayer();
+float CG_GetValue(int ownerDraw);
+qboolean CG_OwnerDrawVisible(int flags);
+void CG_RunMenuScript(char **args);
+void CG_ShowResponseHead();
+void CG_SetPrintString(int type, const char *p);
+void CG_InitTeamChat();
+void CG_GetTeamColor(vec4_t *color);
+const char *CG_GetGameStatusText();
+const char *CG_GetKillerText();
+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();
+const char *CG_GameTypeString();
+qboolean CG_YourTeamHasFlag();
+qboolean CG_OtherTeamHasFlag();
+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 );
+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_PredictPlayerState( void );
+void CG_LoadDeferredPlayers( void );
+
+
+//
+// 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 );
+void CG_AddPacketEntities( void );
+void CG_Beam( centity_t *cent );
+void CG_AdjustPositionForMover( const vec3_t in, int moverNum, int fromTime, int toTime, vec3_t out );
+
+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 );
+
+
+
+//
+// cg_weapons.c
+//
+void CG_NextWeapon_f( void );
+void CG_PrevWeapon_f( void );
+void CG_Weapon_f( void );
+
+void CG_RegisterWeapon( int weaponNum );
+void CG_RegisterItemVisuals( int itemNum );
+
+void CG_FireWeapon( centity_t *cent );
+void CG_MissileHitWall( int weapon, int clientNum, vec3_t origin, vec3_t dir, impactSound_t soundType );
+void CG_MissileHitPlayer( int weapon, vec3_t origin, vec3_t dir, int entityNum );
+void CG_ShotgunFire( entityState_t *es );
+void CG_Bullet( vec3_t origin, int sourceEntityNum, vec3_t normal, qboolean flesh, int fleshEntityNum );
+
+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_OutOfAmmoChange( void ); // should this be in pmove?
+
+//
+// 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 );
+
+//
+// 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_SpawnEffect( vec3_t org );
+#ifdef MISSIONPACK
+void CG_KamikazeEffect( vec3_t org );
+void CG_ObeliskExplode( vec3_t org, int entityNum );
+void CG_ObeliskPain( vec3_t org );
+void CG_InvulnerabilityImpact( vec3_t org, vec3_t angles );
+void CG_InvulnerabilityJuiced( vec3_t org );
+void CG_LightningBoltBeam( vec3_t start, vec3_t end );
+#endif
+void CG_ScorePlum( int client, vec3_t org, int score );
+
+void CG_GibPlayer( vec3_t playerOrigin );
+void CG_BigExplode( vec3_t playerOrigin );
+
+void CG_Bleed( vec3_t origin, int entityNum );
+
+localEntity_t *CG_MakeExplosion( vec3_t origin, vec3_t dir,
+ qhandle_t hModel, qhandle_t shader, int msec,
+ qboolean isSprite );
+
+//
+// cg_snapshot.c
+//
+void CG_ProcessSnapshots( void );
+
+//
+// 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_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 );
+
+// 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 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);
+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);
+extern qboolean initparticles;
+int CG_NewParticleArea ( int num );
+
+