codemp/cgame/cg_main.c

Go to the documentation of this file.
00001 // Copyright (C) 1999-2000 Id Software, Inc.
00002 //
00003 // cg_main.c -- initialization and primary entry point for cgame
00004 #include "cg_local.h"
00005 
00006 #include "../ui/ui_shared.h"
00007 // display context for new ui stuff
00008 displayContextDef_t cgDC;
00009 
00010 #if !defined(CL_LIGHT_H_INC)
00011         #include "cg_lights.h"
00012 #endif
00013 
00014 extern int cgSiegeRoundState;
00015 extern int cgSiegeRoundTime;
00016 /*
00017 Ghoul2 Insert Start
00018 */
00019 void CG_InitItems(void);
00020 /*
00021 Ghoul2 Insert End
00022 */
00023 
00024 void CG_InitJetpackGhoul2(void);
00025 void CG_CleanJetpackGhoul2(void);
00026 
00027 vec4_t colorTable[CT_MAX] = 
00028 {
00029 {0, 0, 0, 0},                   // CT_NONE
00030 {0, 0, 0, 1},                   // CT_BLACK
00031 {1, 0, 0, 1},                   // CT_RED
00032 {0, 1, 0, 1},                   // CT_GREEN
00033 {0, 0, 1, 1},                   // CT_BLUE
00034 {1, 1, 0, 1},                   // CT_YELLOW
00035 {1, 0, 1, 1},                   // CT_MAGENTA
00036 {0, 1, 1, 1},                   // CT_CYAN
00037 {1, 1, 1, 1},                   // CT_WHITE
00038 {0.75f, 0.75f, 0.75f, 1},       // CT_LTGREY
00039 {0.50f, 0.50f, 0.50f, 1},       // CT_MDGREY
00040 {0.25f, 0.25f, 0.25f, 1},       // CT_DKGREY
00041 {0.15f, 0.15f, 0.15f, 1},       // CT_DKGREY2
00042 
00043 {0.810f, 0.530f, 0.0f,  1},     // CT_VLTORANGE -- needs values
00044 {0.810f, 0.530f, 0.0f,  1},     // CT_LTORANGE
00045 {0.610f, 0.330f, 0.0f,  1},     // CT_DKORANGE
00046 {0.402f, 0.265f, 0.0f,  1},     // CT_VDKORANGE
00047 
00048 {0.503f, 0.375f, 0.996f, 1},    // CT_VLTBLUE1
00049 {0.367f, 0.261f, 0.722f, 1},    // CT_LTBLUE1
00050 {0.199f, 0.0f,   0.398f, 1},    // CT_DKBLUE1
00051 {0.160f, 0.117f, 0.324f, 1},    // CT_VDKBLUE1
00052 
00053 {0.300f, 0.628f, 0.816f, 1},    // CT_VLTBLUE2 -- needs values
00054 {0.300f, 0.628f, 0.816f, 1},    // CT_LTBLUE2
00055 {0.191f, 0.289f, 0.457f, 1},    // CT_DKBLUE2
00056 {0.125f, 0.250f, 0.324f, 1},    // CT_VDKBLUE2
00057 
00058 {0.796f, 0.398f, 0.199f, 1},    // CT_VLTBROWN1 -- needs values
00059 {0.796f, 0.398f, 0.199f, 1},    // CT_LTBROWN1
00060 {0.558f, 0.207f, 0.027f, 1},    // CT_DKBROWN1
00061 {0.328f, 0.125f, 0.035f, 1},    // CT_VDKBROWN1
00062 
00063 {0.996f, 0.796f, 0.398f, 1},    // CT_VLTGOLD1 -- needs values
00064 {0.996f, 0.796f, 0.398f, 1},    // CT_LTGOLD1
00065 {0.605f, 0.441f, 0.113f, 1},    // CT_DKGOLD1
00066 {0.386f, 0.308f, 0.148f, 1},    // CT_VDKGOLD1
00067 
00068 {0.648f, 0.562f, 0.784f, 1},    // CT_VLTPURPLE1 -- needs values
00069 {0.648f, 0.562f, 0.784f, 1},    // CT_LTPURPLE1
00070 {0.437f, 0.335f, 0.597f, 1},    // CT_DKPURPLE1
00071 {0.308f, 0.269f, 0.375f, 1},    // CT_VDKPURPLE1
00072 
00073 {0.816f, 0.531f, 0.710f, 1},    // CT_VLTPURPLE2 -- needs values
00074 {0.816f, 0.531f, 0.710f, 1},    // CT_LTPURPLE2
00075 {0.566f, 0.269f, 0.457f, 1},    // CT_DKPURPLE2
00076 {0.343f, 0.226f, 0.316f, 1},    // CT_VDKPURPLE2
00077 
00078 {0.929f, 0.597f, 0.929f, 1},    // CT_VLTPURPLE3
00079 {0.570f, 0.371f, 0.570f, 1},    // CT_LTPURPLE3
00080 {0.355f, 0.199f, 0.355f, 1},    // CT_DKPURPLE3
00081 {0.285f, 0.136f, 0.230f, 1},    // CT_VDKPURPLE3
00082 
00083 {0.953f, 0.378f, 0.250f, 1},    // CT_VLTRED1
00084 {0.953f, 0.378f, 0.250f, 1},    // CT_LTRED1
00085 {0.593f, 0.121f, 0.109f, 1},    // CT_DKRED1
00086 {0.429f, 0.171f, 0.113f, 1},    // CT_VDKRED1
00087 {.25f, 0, 0, 1},                                        // CT_VDKRED
00088 {.70f, 0, 0, 1},                                        // CT_DKRED
00089         
00090 {0.717f, 0.902f, 1.0f,   1},            // CT_VLTAQUA
00091 {0.574f, 0.722f, 0.804f, 1},            // CT_LTAQUA
00092 {0.287f, 0.361f, 0.402f, 1},            // CT_DKAQUA
00093 {0.143f, 0.180f, 0.201f, 1},            // CT_VDKAQUA
00094 
00095 {0.871f, 0.386f, 0.375f, 1},            // CT_LTPINK
00096 {0.435f, 0.193f, 0.187f, 1},            // CT_DKPINK
00097 {         0,    .5f,    .5f, 1},                // CT_LTCYAN
00098 {         0,   .25f,   .25f, 1},                // CT_DKCYAN
00099 {   .179f, .51f,   .92f, 1},            // CT_LTBLUE3
00100 {   .199f, .71f,   .92f, 1},            // CT_LTBLUE3
00101 {   .5f,   .05f,    .4f, 1},            // CT_DKBLUE3
00102 
00103 {   0.0f,   .613f,  .097f, 1},          // CT_HUD_GREEN
00104 {   0.835f, .015f,  .015f, 1},          // CT_HUD_RED
00105 {       .567f,  .685f,  1.0f,   .75f},  // CT_ICON_BLUE
00106 {       .515f,  .406f,  .507f,  1},             // CT_NO_AMMO_RED
00107 {   1.0f,   .658f,  .062f, 1},          // CT_HUD_ORANGE
00108 
00109 };
00110 
00111 #include "holocronicons.h"
00112 
00113 int cgWeatherOverride = 0;
00114 
00115 int forceModelModificationCount = -1;
00116 
00117 void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum );
00118 void CG_Shutdown( void );
00119 
00120 void CG_CalcEntityLerpPositions( centity_t *cent );
00121 void CG_ROFF_NotetrackCallback( centity_t *cent, const char *notetrack);
00122 
00123 #include "../namespace_begin.h"
00124 void UI_CleanupGhoul2(void);
00125 #include "../namespace_end.h"
00126 
00127 static int      C_PointContents(void);
00128 static void C_GetLerpOrigin(void);
00129 static void C_GetLerpData(void);
00130 static void C_Trace(void);
00131 static void C_G2Trace(void);
00132 static void C_G2Mark(void);
00133 static int      CG_RagCallback(int callType);
00134 static void C_GetBoltPos(void);
00135 static void C_ImpactMark(void);
00136 
00137 #ifdef _XBOX
00138 #define MAX_MISC_ENTS   500
00139 #else
00140 #define MAX_MISC_ENTS   4000
00141 #endif
00142 
00143 //static refEntity_t    *MiscEnts = 0;
00144 //static float          *Radius = 0;
00145 static refEntity_t      MiscEnts[MAX_MISC_ENTS]; //statically allocated for now.
00146 static float            Radius[MAX_MISC_ENTS];
00147 static float            zOffset[MAX_MISC_ENTS]; //some models need a z offset for culling, because of stupid wrong model origins
00148 
00149 static int                      NumMiscEnts = 0;
00150 
00151 extern autoMapInput_t cg_autoMapInput; //cg_view.c
00152 extern int cg_autoMapInputTime;
00153 extern vec3_t cg_autoMapAngle;
00154 
00155 void CG_MiscEnt(void);
00156 void CG_DoCameraShake( vec3_t origin, float intensity, int radius, int time );
00157 
00158 //do we have any force powers that we would normally need to cycle to?
00159 qboolean CG_NoUseableForce(void)
00160 {
00161         int i = FP_HEAL;
00162         while (i < NUM_FORCE_POWERS)
00163         {
00164                 if (i != FP_SABERTHROW &&
00165                         i != FP_SABER_OFFENSE &&
00166                         i != FP_SABER_DEFENSE &&
00167                         i != FP_LEVITATION)
00168                 { //valid selectable power
00169                         if (cg.predictedPlayerState.fd.forcePowersKnown & (1 << i))
00170                         { //we have it
00171                                 return qfalse;
00172                         }
00173                 }
00174                 i++;
00175         }
00176 
00177         //no useable force powers, I guess.
00178         return qtrue;
00179 }
00180 
00181 /*
00182 ================
00183 vmMain
00184 
00185 This is the only way control passes into the module.
00186 This must be the very first function compiled into the .q3vm file
00187 ================
00188 */
00189 #include "../namespace_begin.h"
00190 int vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8, int arg9, int arg10, int arg11  ) {
00191 
00192         switch ( command ) {
00193         case CG_INIT:
00194                 CG_Init( arg0, arg1, arg2 );
00195                 return 0;
00196         case CG_SHUTDOWN:
00197                 CG_Shutdown();
00198                 return 0;
00199         case CG_CONSOLE_COMMAND:
00200                 return CG_ConsoleCommand();
00201         case CG_DRAW_ACTIVE_FRAME:
00202                 CG_DrawActiveFrame( arg0, arg1, arg2 );
00203                 return 0;
00204         case CG_CROSSHAIR_PLAYER:
00205                 return CG_CrosshairPlayer();
00206         case CG_LAST_ATTACKER:
00207                 return CG_LastAttacker();
00208         case CG_KEY_EVENT:
00209                 CG_KeyEvent(arg0, arg1);
00210                 return 0;
00211         case CG_MOUSE_EVENT:
00212                 cgDC.cursorx = cgs.cursorX;
00213                 cgDC.cursory = cgs.cursorY;
00214                 CG_MouseEvent(arg0, arg1);
00215                 return 0;
00216         case CG_EVENT_HANDLING:
00217                 CG_EventHandling(arg0);
00218                 return 0;
00219 
00220         case CG_POINT_CONTENTS:
00221                 return C_PointContents();
00222 
00223         case CG_GET_LERP_ORIGIN:
00224                 C_GetLerpOrigin();
00225                 return 0;
00226 
00227         case CG_GET_LERP_DATA:
00228                 C_GetLerpData();
00229                 return 0;
00230 
00231         case CG_GET_GHOUL2:
00232                 return (int)cg_entities[arg0].ghoul2; //NOTE: This is used by the effect bolting which is actually not used at all.
00233                                                                                           //I'm fairly sure if you try to use it with vm's it will just give you total
00234                                                                                           //garbage. In other words, use at your own risk.
00235 
00236         case CG_GET_MODEL_LIST:
00237                 return (int)cgs.gameModels;
00238 
00239         case CG_CALC_LERP_POSITIONS:
00240                 CG_CalcEntityLerpPositions( &cg_entities[arg0] );
00241                 return 0;
00242 
00243         case CG_TRACE:
00244                 C_Trace();
00245                 return 0;
00246         case CG_GET_SORTED_FORCE_POWER:
00247                 return forcePowerSorted[arg0];
00248         case CG_G2TRACE:
00249                 C_G2Trace();
00250                 return 0;
00251 
00252         case CG_G2MARK:
00253                 C_G2Mark();
00254                 return 0;
00255 
00256         case CG_RAG_CALLBACK:
00257                 return CG_RagCallback(arg0);
00258 
00259         case CG_INCOMING_CONSOLE_COMMAND:
00260                 //rww - let mod authors filter client console messages so they can cut them off if they want.
00261                 //return 1 if the command is ok. Otherwise, you can set char 0 on the command str to 0 and return
00262                 //0 to not execute anything, or you can fill conCommand in with something valid and return 0
00263                 //in order to have that string executed in place. Some example code:
00264 #if 0
00265                 {
00266                         TCGIncomingConsoleCommand       *icc = (TCGIncomingConsoleCommand *)cg.sharedBuffer;
00267                         if (strstr(icc->conCommand, "wait"))
00268                         { //filter out commands contaning wait
00269                                 Com_Printf("You can't use commands containing the string wait with MyMod v1.0\n");
00270                                 icc->conCommand[0] = 0;
00271                                 return 0;
00272                         }
00273                         else if (strstr(icc->conCommand, "blah"))
00274                         { //any command containing the string "blah" is redirected to "quit"
00275                                 strcpy(icc->conCommand, "quit");
00276                                 return 0;
00277                         }
00278                 }
00279 #endif
00280                 return 1;
00281 
00282         case CG_GET_USEABLE_FORCE:
00283                 return CG_NoUseableForce();
00284 
00285         case CG_GET_ORIGIN:
00286                 VectorCopy(cg_entities[arg0].currentState.pos.trBase, (float *)arg1);
00287                 return 0;
00288 
00289         case CG_GET_ANGLES:
00290                 VectorCopy(cg_entities[arg0].currentState.apos.trBase, (float *)arg1);
00291                 return 0;
00292 
00293         case CG_GET_ORIGIN_TRAJECTORY:
00294                 return (int)&cg_entities[arg0].nextState.pos;
00295 
00296         case CG_GET_ANGLE_TRAJECTORY:
00297                 return (int)&cg_entities[arg0].nextState.apos;
00298 
00299         case CG_ROFF_NOTETRACK_CALLBACK:
00300                 CG_ROFF_NotetrackCallback( &cg_entities[arg0], (const char *)arg1 );
00301                 return 0;
00302 
00303         case CG_IMPACT_MARK:
00304                 C_ImpactMark();
00305                 return 0;
00306 
00307         case CG_MAP_CHANGE:
00308                 // this trap map be called more than once for a given map change, as the
00309                 // server is going to attempt to send out multiple broadcasts in hopes that
00310                 // the client will receive one of them
00311                 cg.mMapChange = qtrue;
00312                 return 0;
00313 
00314         case CG_AUTOMAP_INPUT:
00315                 //special input during automap mode -rww
00316                 {
00317                         autoMapInput_t *autoInput = (autoMapInput_t *)cg.sharedBuffer;
00318 
00319                         memcpy(&cg_autoMapInput, autoInput, sizeof(autoMapInput_t));
00320 
00321                         if (!arg0)
00322                         { //if this is non-0, it's actually a one-frame mouse event
00323                                 cg_autoMapInputTime = cg.time + 1000;
00324                         }
00325                         else
00326                         {
00327                                 if (cg_autoMapInput.yaw)
00328                                 {
00329                                         cg_autoMapAngle[YAW] += cg_autoMapInput.yaw;
00330                                 }
00331 
00332                                 if (cg_autoMapInput.pitch)
00333                                 {
00334                                         cg_autoMapAngle[PITCH] += cg_autoMapInput.pitch;
00335                                 }
00336                                 cg_autoMapInput.yaw = 0.0f;
00337                                 cg_autoMapInput.pitch = 0.0f;
00338                         }
00339                 }
00340                 return 0;
00341 
00342         case CG_MISC_ENT:
00343                 CG_MiscEnt();
00344                 return 0;
00345 
00346         case CG_FX_CAMERASHAKE:
00347                 {
00348                         TCGCameraShake  *data = (TCGCameraShake *)cg.sharedBuffer;
00349                         
00350                         CG_DoCameraShake( data->mOrigin, data->mIntensity, data->mRadius, data->mTime );
00351                 }
00352                 return 0;
00353 
00354         default:
00355                 CG_Error( "vmMain: unknown command %i", command );
00356                 break;
00357         }
00358         return -1;
00359 }
00360 #include "../namespace_end.h"
00361 
00362 static int C_PointContents(void)
00363 {
00364         TCGPointContents        *data = (TCGPointContents *)cg.sharedBuffer;
00365 
00366         return CG_PointContents( data->mPoint, data->mPassEntityNum );
00367 }
00368 
00369 static void C_GetLerpOrigin(void)
00370 {
00371         TCGVectorData           *data = (TCGVectorData *)cg.sharedBuffer;
00372 
00373         VectorCopy(cg_entities[data->mEntityNum].lerpOrigin, data->mPoint);
00374 }
00375 
00376 static void C_GetLerpData(void)
00377 {//only used by FX system to pass to getboltmat
00378         TCGGetBoltData          *data = (TCGGetBoltData *)cg.sharedBuffer;
00379 
00380         VectorCopy(cg_entities[data->mEntityNum].lerpOrigin, data->mOrigin);
00381         VectorCopy(cg_entities[data->mEntityNum].modelScale, data->mScale);
00382         VectorCopy(cg_entities[data->mEntityNum].lerpAngles, data->mAngles);
00383         if (cg_entities[data->mEntityNum].currentState.eType == ET_PLAYER)
00384         { //normal player
00385                 data->mAngles[PITCH] = 0.0f;
00386                 data->mAngles[ROLL] = 0.0f;
00387         }
00388         else if (cg_entities[data->mEntityNum].currentState.eType == ET_NPC)
00389         { //an NPC
00390                 Vehicle_t *pVeh = cg_entities[data->mEntityNum].m_pVehicle;
00391                 if (!pVeh)
00392                 { //for vehicles, we may or may not want to 0 out pitch and roll
00393                         data->mAngles[PITCH] = 0.0f;
00394                         data->mAngles[ROLL] = 0.0f;
00395                 }
00396                 else if (pVeh->m_pVehicleInfo->type == VH_SPEEDER)
00397                 { //speeder wants no pitch but a roll
00398                         data->mAngles[PITCH] = 0.0f;
00399                 }
00400                 else if (pVeh->m_pVehicleInfo->type != VH_FIGHTER)
00401                 { //fighters want all angles
00402                         data->mAngles[PITCH] = 0.0f;
00403                         data->mAngles[ROLL] = 0.0f;
00404                 }
00405         }
00406 }
00407 
00408 static void C_Trace(void)
00409 {
00410         TCGTrace        *td = (TCGTrace *)cg.sharedBuffer;
00411 
00412         CG_Trace(&td->mResult, td->mStart, td->mMins, td->mMaxs, td->mEnd, td->mSkipNumber, td->mMask);
00413 }
00414 
00415 static void C_G2Trace(void)
00416 {
00417         TCGTrace        *td = (TCGTrace *)cg.sharedBuffer;
00418 
00419         CG_G2Trace(&td->mResult, td->mStart, td->mMins, td->mMaxs, td->mEnd, td->mSkipNumber, td->mMask);
00420 }
00421 
00422 static void C_G2Mark(void)
00423 {
00424         TCGG2Mark       *td = (TCGG2Mark *)cg.sharedBuffer;
00425         trace_t         tr;
00426         vec3_t          end;
00427 
00428         VectorMA(td->start, 64, td->dir, end);
00429         CG_G2Trace(&tr, td->start, NULL, NULL, end, ENTITYNUM_NONE, MASK_PLAYERSOLID);
00430 
00431         if (tr.entityNum < ENTITYNUM_WORLD &&
00432                 cg_entities[tr.entityNum].ghoul2)
00433         { //hit someone with a ghoul2 instance, let's project the decal on them then.
00434                 centity_t *cent = &cg_entities[tr.entityNum];
00435 
00436                 //CG_TestLine(tr.endpos, end, 2000, 0x0000ff, 1);
00437 
00438                 CG_AddGhoul2Mark(td->shader, td->size, tr.endpos, end, tr.entityNum,
00439                         cent->lerpOrigin, cent->lerpAngles[YAW], cent->ghoul2, cent->modelScale,
00440                         Q_irand(2000, 4000));
00441                 //I'm making fx system decals have a very short lifetime.
00442         }
00443 }
00444 
00445 static void CG_DebugBoxLines(vec3_t mins, vec3_t maxs, int duration)
00446 {
00447         vec3_t start;
00448         vec3_t end;
00449         vec3_t vert;
00450 
00451         float x = maxs[0] - mins[0];
00452         float y = maxs[1] - mins[1];
00453 
00454         start[2] = maxs[2];
00455         vert[2] = mins[2];
00456 
00457         vert[0] = mins[0];
00458         vert[1] = mins[1];
00459         start[0] = vert[0];
00460         start[1] = vert[1];
00461         CG_TestLine(start, vert, duration, 0x00000ff, 1);
00462 
00463         vert[0] = mins[0];
00464         vert[1] = maxs[1];
00465         start[0] = vert[0];
00466         start[1] = vert[1];
00467         CG_TestLine(start, vert, duration, 0x00000ff, 1);
00468 
00469         vert[0] = maxs[0];
00470         vert[1] = mins[1];
00471         start[0] = vert[0];
00472         start[1] = vert[1];
00473         CG_TestLine(start, vert, duration, 0x00000ff, 1);
00474 
00475         vert[0] = maxs[0];
00476         vert[1] = maxs[1];
00477         start[0] = vert[0];
00478         start[1] = vert[1];
00479         CG_TestLine(start, vert, duration, 0x00000ff, 1);
00480 
00481         // top of box
00482         VectorCopy(maxs, start);
00483         VectorCopy(maxs, end);
00484         start[0] -= x;
00485         CG_TestLine(start, end, duration, 0x00000ff, 1);
00486         end[0] = start[0];
00487         end[1] -= y;
00488         CG_TestLine(start, end, duration, 0x00000ff, 1);
00489         start[1] = end[1];
00490         start[0] += x;
00491         CG_TestLine(start, end, duration, 0x00000ff, 1);
00492         CG_TestLine(start, maxs, duration, 0x00000ff, 1);
00493         // bottom of box
00494         VectorCopy(mins, start);
00495         VectorCopy(mins, end);
00496         start[0] += x;
00497         CG_TestLine(start, end, duration, 0x00000ff, 1);
00498         end[0] = start[0];
00499         end[1] += y;
00500         CG_TestLine(start, end, duration, 0x00000ff, 1);
00501         start[1] = end[1];
00502         start[0] -= x;
00503         CG_TestLine(start, end, duration, 0x00000ff, 1);
00504         CG_TestLine(start, mins, duration, 0x00000ff, 1);
00505 }
00506 
00507 //handle ragdoll callbacks, for events and debugging -rww
00508 static int CG_RagCallback(int callType)
00509 {
00510         switch(callType)
00511         {
00512         case RAG_CALLBACK_DEBUGBOX:
00513                 {
00514                         ragCallbackDebugBox_t *callData = (ragCallbackDebugBox_t *)cg.sharedBuffer;
00515 
00516                         CG_DebugBoxLines(callData->mins, callData->maxs, callData->duration);
00517                 }
00518                 break;
00519         case RAG_CALLBACK_DEBUGLINE:
00520                 {
00521                         ragCallbackDebugLine_t *callData = (ragCallbackDebugLine_t *)cg.sharedBuffer;
00522 
00523                         CG_TestLine(callData->start, callData->end, callData->time, callData->color, callData->radius);
00524                 }
00525                 break;
00526         case RAG_CALLBACK_BONESNAP:
00527                 {
00528                         ragCallbackBoneSnap_t *callData = (ragCallbackBoneSnap_t *)cg.sharedBuffer;
00529                         centity_t *cent = &cg_entities[callData->entNum];
00530                         int snapSound = trap_S_RegisterSound(va("sound/player/bodyfall_human%i.wav", Q_irand(1, 3)));
00531 
00532                         trap_S_StartSound(cent->lerpOrigin, callData->entNum, CHAN_AUTO, snapSound);
00533                 }
00534         case RAG_CALLBACK_BONEIMPACT:
00535                 break;
00536         case RAG_CALLBACK_BONEINSOLID:
00537 #if 0
00538                 {
00539                         ragCallbackBoneInSolid_t *callData = (ragCallbackBoneInSolid_t *)cg.sharedBuffer;
00540 
00541                         if (callData->solidCount > 16)
00542                         { //don't bother if we're just tapping into solidity, we'll probably recover on our own
00543                                 centity_t *cent = &cg_entities[callData->entNum];
00544                                 vec3_t slideDir;
00545 
00546                                 VectorSubtract(cent->lerpOrigin, callData->bonePos, slideDir);
00547                                 VectorAdd(cent->ragOffsets, slideDir, cent->ragOffsets);
00548 
00549                                 cent->hasRagOffset = qtrue;
00550                         }
00551                 }
00552 #endif
00553                 break;
00554         case RAG_CALLBACK_TRACELINE:
00555                 {
00556                         ragCallbackTraceLine_t *callData = (ragCallbackTraceLine_t *)cg.sharedBuffer;
00557 
00558                         CG_Trace(&callData->tr, callData->start, callData->mins, callData->maxs,
00559                                 callData->end, callData->ignore, callData->mask);
00560                 }
00561                 break;
00562         default:
00563                 Com_Error(ERR_DROP, "Invalid callType in CG_RagCallback");
00564                 break;
00565         }
00566 
00567         return 0;
00568 }
00569 
00570 static void C_ImpactMark(void)
00571 {
00572         TCGImpactMark   *data = (TCGImpactMark *)cg.sharedBuffer;
00573 
00574         /*
00575         CG_ImpactMark((int)arg0, (const float *)arg1, (const float *)arg2, (float)arg3,
00576                 (float)arg4, (float)arg5, (float)arg6, (float)arg7, qtrue, (float)arg8, qfalse);
00577         */
00578         CG_ImpactMark(data->mHandle, data->mPoint, data->mAngle, data->mRotation,
00579                 data->mRed, data->mGreen, data->mBlue, data->mAlphaStart, qtrue, data->mSizeStart, qfalse);
00580 }
00581 
00582 void CG_MiscEnt(void)
00583 {
00584         int                     modelIndex;
00585         refEntity_t     *RefEnt;
00586         TCGMiscEnt      *data = (TCGMiscEnt *)cg.sharedBuffer;
00587         vec3_t          mins, maxs;
00588         float           *radius, *zOff;
00589 
00590         if (NumMiscEnts >= MAX_MISC_ENTS)
00591         {
00592                 return;
00593         }
00594         
00595         radius = &Radius[NumMiscEnts];
00596         zOff = &zOffset[NumMiscEnts];
00597         RefEnt = &MiscEnts[NumMiscEnts++];
00598 
00599         modelIndex = trap_R_RegisterModel(data->mModel);
00600         if (modelIndex == 0)
00601         {
00602                 Com_Error(ERR_DROP, "client_model has invalid model definition");
00603                 return;
00604         }
00605 
00606         *zOff = 0;
00607 
00608         memset(RefEnt, 0, sizeof(refEntity_t));
00609         RefEnt->reType = RT_MODEL;
00610         RefEnt->hModel = modelIndex;
00611         RefEnt->frame = 0;
00612         trap_R_ModelBounds(modelIndex, mins, maxs);
00613         VectorCopy(data->mScale, RefEnt->modelScale);
00614         VectorCopy(data->mOrigin, RefEnt->origin);
00615 
00616         VectorScaleVector(mins, data->mScale, mins);
00617         VectorScaleVector(maxs, data->mScale, maxs);
00618         *radius = Distance(mins, maxs);
00619 
00620         AnglesToAxis( data->mAngles, RefEnt->axis );
00621         ScaleModelAxis(RefEnt);
00622 }
00623 
00624 void CG_DrawMiscEnts(void)
00625 {
00626         int                     i;
00627         refEntity_t     *RefEnt;
00628         float           *radius, *zOff;
00629         vec3_t          difference;
00630         vec3_t          cullOrigin;
00631 
00632         RefEnt = MiscEnts;
00633         radius = Radius;
00634         zOff = zOffset;
00635         for(i=0;i<NumMiscEnts;i++)
00636         {
00637                 VectorCopy(RefEnt->origin, cullOrigin);
00638                 cullOrigin[2] += 1.0f;
00639 
00640                 if (*zOff)
00641                 {
00642                         cullOrigin[2] += *zOff;
00643                 }
00644 
00645                 if (cg.snap && trap_R_inPVS(cg.refdef.vieworg, cullOrigin, cg.snap->areamask))
00646                 {
00647                         VectorSubtract(RefEnt->origin, cg.refdef.vieworg, difference);
00648                         if (VectorLength(difference)-(*radius) <= cg.distanceCull)
00649                         {
00650                                 trap_R_AddRefEntityToScene(RefEnt);
00651                         }
00652                 }
00653                 RefEnt++;
00654                 radius++;
00655                 zOff++;
00656         }
00657 }
00658 
00659 /*
00660 Ghoul2 Insert Start
00661 */
00662 /*
00663 void CG_ResizeG2Bolt(boltInfo_v *bolt, int newCount)
00664 {
00665         bolt->resize(newCount);
00666 }
00667 
00668 void CG_ResizeG2Surface(surfaceInfo_v *surface, int newCount)
00669 {
00670         surface->resize(newCount);
00671 }
00672 
00673 void CG_ResizeG2Bone(boneInfo_v *bone, int newCount)
00674 {
00675         bone->resize(newCount);
00676 }
00677 
00678 void CG_ResizeG2(CGhoul2Info_v *ghoul2, int newCount)
00679 {
00680         ghoul2->resize(newCount);
00681 }
00682 
00683 void CG_ResizeG2TempBone(mdxaBone_v *tempBone, int newCount)
00684 {
00685         tempBone->resize(newCount);
00686 }
00687 */
00688 /*
00689 Ghoul2 Insert End
00690 */
00691 cg_t                            cg;
00692 cgs_t                           cgs;
00693 centity_t                       cg_entities[MAX_GENTITIES];
00694 
00695 centity_t                       *cg_permanents[MAX_GENTITIES]; //rwwRMG - added
00696 int                                     cg_numpermanents = 0;
00697 
00698 weaponInfo_t            cg_weapons[MAX_WEAPONS];
00699 itemInfo_t                      cg_items[MAX_ITEMS];
00700 
00701 
00702 vmCvar_t        cg_centertime;
00703 vmCvar_t        cg_runpitch;
00704 vmCvar_t        cg_runroll;
00705 vmCvar_t        cg_bobup;
00706 vmCvar_t        cg_bobpitch;
00707 vmCvar_t        cg_bobroll;
00708 //vmCvar_t      cg_swingSpeed;
00709 vmCvar_t        cg_shadows;
00710 vmCvar_t        cg_renderToTextureFX;
00711 vmCvar_t        cg_drawTimer;
00712 vmCvar_t        cg_drawFPS;
00713 vmCvar_t        cg_drawSnapshot;
00714 vmCvar_t        cg_draw3dIcons;
00715 vmCvar_t        cg_drawIcons;
00716 vmCvar_t        cg_drawAmmoWarning;
00717 vmCvar_t        cg_drawCrosshair;
00718 vmCvar_t        cg_drawCrosshairNames;
00719 vmCvar_t        cg_drawRadar;
00720 vmCvar_t        cg_drawVehLeadIndicator;
00721 vmCvar_t        cg_dynamicCrosshair;
00722 vmCvar_t        cg_dynamicCrosshairPrecision;
00723 vmCvar_t        cg_drawRewards;
00724 vmCvar_t        cg_drawScores;
00725 vmCvar_t        cg_crosshairSize;
00726 vmCvar_t        cg_crosshairX;
00727 vmCvar_t        cg_crosshairY;
00728 vmCvar_t        cg_crosshairHealth;
00729 vmCvar_t        cg_draw2D;
00730 vmCvar_t        cg_drawStatus;
00731 vmCvar_t        cg_animSpeed;
00732 vmCvar_t        cg_debugAnim;
00733 vmCvar_t        cg_debugSaber;
00734 vmCvar_t        cg_debugPosition;
00735 vmCvar_t        cg_debugEvents;
00736 vmCvar_t        cg_errorDecay;
00737 vmCvar_t        cg_nopredict;
00738 vmCvar_t        cg_noPlayerAnims;
00739 vmCvar_t        cg_showmiss;
00740 vmCvar_t        cg_showVehMiss;
00741 vmCvar_t        cg_footsteps;
00742 vmCvar_t        cg_addMarks;
00743 vmCvar_t        cg_viewsize;
00744 vmCvar_t        cg_drawGun;
00745 vmCvar_t        cg_gun_frame;
00746 vmCvar_t        cg_gun_x;
00747 vmCvar_t        cg_gun_y;
00748 vmCvar_t        cg_gun_z;
00749 vmCvar_t        cg_autoswitch;
00750 vmCvar_t        cg_ignore;
00751 vmCvar_t        cg_simpleItems;
00752 vmCvar_t        cg_fov;
00753 vmCvar_t        cg_zoomFov;
00754 
00755 vmCvar_t        cg_swingAngles;
00756 
00757 vmCvar_t        cg_oldPainSounds;
00758 
00759 vmCvar_t        cg_ragDoll;
00760 
00761 vmCvar_t        cg_jumpSounds;
00762 
00763 vmCvar_t        cg_autoMap;
00764 vmCvar_t        cg_autoMapX;
00765 vmCvar_t        cg_autoMapY;
00766 vmCvar_t        cg_autoMapW;
00767 vmCvar_t        cg_autoMapH;
00768 
00769 #ifndef _XBOX   // Hmmm. This is also in game. I think this is safe.
00770 vmCvar_t        bg_fighterAltControl;
00771 #endif
00772 
00773 vmCvar_t        cg_chatBox;
00774 vmCvar_t        cg_chatBoxHeight;
00775 
00776 vmCvar_t        cg_saberModelTraceEffect;
00777 
00778 vmCvar_t        cg_saberClientVisualCompensation;
00779 
00780 vmCvar_t        cg_g2TraceLod;
00781 
00782 vmCvar_t        cg_fpls;
00783 
00784 vmCvar_t        cg_ghoul2Marks;
00785 
00786 vmCvar_t        cg_optvehtrace;
00787 
00788 vmCvar_t        cg_saberDynamicMarks;
00789 vmCvar_t        cg_saberDynamicMarkTime;
00790 
00791 vmCvar_t        cg_saberContact;
00792 vmCvar_t        cg_saberTrail;
00793 
00794 vmCvar_t        cg_duelHeadAngles;
00795 
00796 vmCvar_t        cg_speedTrail;
00797 vmCvar_t        cg_auraShell;
00798 
00799 vmCvar_t        cg_repeaterOrb;
00800 
00801 vmCvar_t        cg_animBlend;
00802 
00803 vmCvar_t        cg_dismember;
00804 
00805 vmCvar_t        cg_thirdPersonSpecialCam;
00806 
00807 vmCvar_t        cg_thirdPerson;
00808 vmCvar_t        cg_thirdPersonRange;
00809 vmCvar_t        cg_thirdPersonAngle;
00810 vmCvar_t        cg_thirdPersonPitchOffset;
00811 vmCvar_t        cg_thirdPersonVertOffset;
00812 vmCvar_t        cg_thirdPersonCameraDamp;
00813 vmCvar_t        cg_thirdPersonTargetDamp;
00814 
00815 vmCvar_t        cg_thirdPersonAlpha;
00816 vmCvar_t        cg_thirdPersonHorzOffset;
00817 
00818 vmCvar_t        cg_stereoSeparation;
00819 vmCvar_t        cg_lagometer;
00820 vmCvar_t        cg_drawEnemyInfo;
00821 vmCvar_t        cg_synchronousClients;
00822 vmCvar_t        cg_stats;
00823 vmCvar_t        cg_buildScript;
00824 vmCvar_t        cg_forceModel;
00825 vmCvar_t        cg_paused;
00826 vmCvar_t        cg_blood;
00827 vmCvar_t        cg_predictItems;
00828 vmCvar_t        cg_deferPlayers;
00829 vmCvar_t        cg_drawTeamOverlay;
00830 vmCvar_t        cg_teamOverlayUserinfo;
00831 vmCvar_t        cg_drawFriend;
00832 vmCvar_t        cg_teamChatsOnly;
00833 vmCvar_t        cg_hudFiles;
00834 vmCvar_t        cg_scorePlum;
00835 vmCvar_t        cg_smoothClients;
00836 
00837 #include "../namespace_begin.h"
00838 vmCvar_t        pmove_fixed;
00839 //vmCvar_t      cg_pmove_fixed;
00840 vmCvar_t        pmove_msec;
00841 // nmckenzie: DUEL_HEALTH
00842 vmCvar_t        g_showDuelHealths;
00843 #include "../namespace_end.h"
00844 
00845 vmCvar_t        cg_pmove_msec;
00846 vmCvar_t        cg_cameraMode;
00847 vmCvar_t        cg_cameraOrbit;
00848 vmCvar_t        cg_cameraOrbitDelay;
00849 vmCvar_t        cg_timescaleFadeEnd;
00850 vmCvar_t        cg_timescaleFadeSpeed;
00851 vmCvar_t        cg_timescale;
00852 vmCvar_t        cg_noTaunt;
00853 vmCvar_t        cg_noProjectileTrail;
00854 //vmCvar_t      cg_trueLightning;
00855 /*
00856 Ghoul2 Insert Start
00857 */
00858 vmCvar_t        cg_debugBB;
00859 /*
00860 Ghoul2 Insert End
00861 */
00862 //vmCvar_t      cg_redTeamName;
00863 //vmCvar_t      cg_blueTeamName;
00864 vmCvar_t        cg_currentSelectedPlayer;
00865 vmCvar_t        cg_currentSelectedPlayerName;
00866 //vmCvar_t      cg_singlePlayerActive;
00867 vmCvar_t        cg_recordSPDemo;
00868 vmCvar_t        cg_recordSPDemoName;
00869 vmCvar_t        cg_showVehBounds;
00870 
00871 vmCvar_t        ui_myteam;
00872 
00873 vmCvar_t        cg_snapshotTimeout;
00874 
00875 typedef struct {
00876         vmCvar_t        *vmCvar;
00877         char            *cvarName;
00878         char            *defaultString;
00879         int                     cvarFlags;
00880 } cvarTable_t;
00881 
00882 static cvarTable_t cvarTable[] = { // bk001129
00883         { &cg_ignore, "cg_ignore", "0", 0 },    // used for debugging
00884         { &cg_autoswitch, "cg_autoswitch", "1", CVAR_ARCHIVE },
00885         { &cg_drawGun, "cg_drawGun", "1", CVAR_ARCHIVE },
00886         { &cg_zoomFov, "cg_zoomfov", "40.0", CVAR_ARCHIVE },
00887         { &cg_fov, "cg_fov", "80", CVAR_ARCHIVE },
00888         { &cg_viewsize, "cg_viewsize", "100", CVAR_ARCHIVE },
00889         { &cg_stereoSeparation, "cg_stereoSeparation", "0.4", CVAR_ARCHIVE  },
00890         { &cg_shadows, "cg_shadows", "1", CVAR_ARCHIVE  },
00891         { &cg_renderToTextureFX, "cg_renderToTextureFX", "1", CVAR_ARCHIVE  },
00892         { &cg_draw2D, "cg_draw2D", "1", CVAR_ARCHIVE  },
00893         { &cg_drawStatus, "cg_drawStatus", "1", CVAR_ARCHIVE  },
00894         { &cg_drawTimer, "cg_drawTimer", "0", CVAR_ARCHIVE  },
00895         { &cg_drawFPS, "cg_drawFPS", "0", CVAR_ARCHIVE  },
00896         { &cg_drawSnapshot, "cg_drawSnapshot", "0", CVAR_ARCHIVE  },
00897         { &cg_draw3dIcons, "cg_draw3dIcons", "1", CVAR_ARCHIVE  },
00898         { &cg_drawIcons, "cg_drawIcons", "1", CVAR_ARCHIVE  },
00899         { &cg_drawAmmoWarning, "cg_drawAmmoWarning", "0", CVAR_ARCHIVE  },
00900         { &cg_drawEnemyInfo, "cg_drawEnemyInfo", "1", CVAR_ARCHIVE  },
00901         { &cg_drawCrosshair, "cg_drawCrosshair", "1", CVAR_ARCHIVE },
00902         { &cg_drawCrosshairNames, "cg_drawCrosshairNames", "1", CVAR_ARCHIVE },
00903         { &cg_drawRadar, "cg_drawRadar", "1", CVAR_ARCHIVE },
00904         { &cg_drawVehLeadIndicator, "cg_drawVehLeadIndicator", "1", CVAR_ARCHIVE },
00905         { &cg_drawScores,                 "cg_drawScores", "1", CVAR_ARCHIVE },
00906         { &cg_dynamicCrosshair, "cg_dynamicCrosshair", "1", CVAR_ARCHIVE },
00907         //Enables ghoul2 traces for crosshair traces.. more precise when pointing at others, but slower.
00908         //And if the server doesn't have g2 col enabled, it won't match up the same.
00909         { &cg_dynamicCrosshairPrecision, "cg_dynamicCrosshairPrecision", "1", CVAR_ARCHIVE },
00910         { &cg_drawRewards, "cg_drawRewards", "1", CVAR_ARCHIVE },
00911         { &cg_crosshairSize, "cg_crosshairSize", "24", CVAR_ARCHIVE },
00912         { &cg_crosshairHealth, "cg_crosshairHealth", "0", CVAR_ARCHIVE },
00913         { &cg_crosshairX, "cg_crosshairX", "0", CVAR_ARCHIVE },
00914         { &cg_crosshairY, "cg_crosshairY", "0", CVAR_ARCHIVE },
00915         { &cg_simpleItems, "cg_simpleItems", "0", CVAR_ARCHIVE },
00916         { &cg_addMarks, "cg_marks", "1", CVAR_ARCHIVE },
00917         { &cg_lagometer, "cg_lagometer", "0", CVAR_ARCHIVE },
00918         { &cg_gun_x, "cg_gunX", "0", CVAR_CHEAT },
00919         { &cg_gun_y, "cg_gunY", "0", CVAR_CHEAT },
00920         { &cg_gun_z, "cg_gunZ", "0", CVAR_CHEAT },
00921         { &cg_centertime, "cg_centertime", "3", CVAR_CHEAT },
00922         { &cg_runpitch, "cg_runpitch", "0.002", CVAR_ARCHIVE},
00923         { &cg_runroll, "cg_runroll", "0.005", CVAR_ARCHIVE },
00924         { &cg_bobup , "cg_bobup", "0.005", CVAR_ARCHIVE },
00925         { &cg_bobpitch, "cg_bobpitch", "0.002", CVAR_ARCHIVE },
00926         { &cg_bobroll, "cg_bobroll", "0.002", CVAR_ARCHIVE },
00927         //{ &cg_swingSpeed, "cg_swingSpeed", "0.3", CVAR_CHEAT },
00928         { &cg_animSpeed, "cg_animspeed", "1", CVAR_CHEAT },
00929         { &cg_debugAnim, "cg_debuganim", "0", CVAR_CHEAT },
00930         { &cg_debugSaber, "cg_debugsaber", "0", CVAR_CHEAT },
00931         { &cg_debugPosition, "cg_debugposition", "0", CVAR_CHEAT },
00932         { &cg_debugEvents, "cg_debugevents", "0", CVAR_CHEAT },
00933         { &cg_errorDecay, "cg_errordecay", "100", 0 },
00934         { &cg_nopredict, "cg_nopredict", "0", 0 },
00935         { &cg_noPlayerAnims, "cg_noplayeranims", "0", CVAR_CHEAT },
00936         { &cg_showmiss, "cg_showmiss", "0", 0 },
00937         { &cg_showVehMiss, "cg_showVehMiss", "0", 0 },
00938         { &cg_footsteps, "cg_footsteps", "3", CVAR_ARCHIVE },
00939         { &cg_swingAngles, "cg_swingAngles", "1", 0 },
00940 
00941         { &cg_oldPainSounds, "cg_oldPainSounds", "0", 0 },
00942 
00943         { &cg_ragDoll, "broadsword", "0", 0 },
00944 
00945         { &cg_jumpSounds, "cg_jumpSounds", "0", 0 },
00946 
00947         { &cg_autoMap, "r_autoMap", "0", CVAR_ARCHIVE },
00948         { &cg_autoMapX, "r_autoMapX", "496", CVAR_ARCHIVE },
00949         { &cg_autoMapY, "r_autoMapY", "32", CVAR_ARCHIVE },
00950         { &cg_autoMapW, "r_autoMapW", "128", CVAR_ARCHIVE },
00951         { &cg_autoMapH, "r_autoMapH", "128", CVAR_ARCHIVE },
00952 
00953         { &bg_fighterAltControl, "bg_fighterAltControl", "0", CVAR_SERVERINFO },
00954 
00955         { &cg_chatBox, "cg_chatBox", "10000", CVAR_ARCHIVE },
00956         { &cg_chatBoxHeight, "cg_chatBoxHeight", "350", CVAR_ARCHIVE },
00957 
00958         { &cg_saberModelTraceEffect, "cg_saberModelTraceEffect", "0", 0 },
00959 
00960         //allows us to trace between server frames on the client to see if we're visually
00961         //hitting the last entity we detected a hit on from the server.
00962         { &cg_saberClientVisualCompensation, "cg_saberClientVisualCompensation", "1", 0 },
00963 
00964         { &cg_g2TraceLod, "cg_g2TraceLod", "2", 0 },
00965 
00966         { &cg_fpls, "cg_fpls", "0", 0 },
00967 
00968         { &cg_ghoul2Marks, "cg_ghoul2Marks", "16", 0 },
00969 
00970         { &cg_optvehtrace, "com_optvehtrace", "0", 0 },
00971 
00972         { &cg_saberDynamicMarks, "cg_saberDynamicMarks", "0", 0 },
00973         { &cg_saberDynamicMarkTime, "cg_saberDynamicMarkTime", "60000", 0 },
00974 
00975         { &cg_saberContact, "cg_saberContact", "1", 0 },
00976         { &cg_saberTrail, "cg_saberTrail", "1", 0 },
00977 
00978         { &cg_duelHeadAngles, "cg_duelHeadAngles", "0", 0 },
00979 
00980         { &cg_speedTrail, "cg_speedTrail", "1", 0 },
00981         { &cg_auraShell, "cg_auraShell", "1", 0 },
00982 
00983         { &cg_repeaterOrb, "cg_repeaterOrb", "0", 0 },
00984 
00985         { &cg_animBlend, "cg_animBlend", "1", 0 },
00986 
00987         { &cg_dismember, "cg_dismember", "0", CVAR_ARCHIVE },
00988 
00989         { &cg_thirdPersonSpecialCam, "cg_thirdPersonSpecialCam", "0", 0 },
00990 
00991         { &cg_thirdPerson, "cg_thirdPerson", "0", CVAR_ARCHIVE },
00992         { &cg_thirdPersonRange, "cg_thirdPersonRange", "80", CVAR_CHEAT },
00993         { &cg_thirdPersonAngle, "cg_thirdPersonAngle", "0", CVAR_CHEAT },
00994         { &cg_thirdPersonPitchOffset, "cg_thirdPersonPitchOffset", "0", CVAR_CHEAT },
00995         { &cg_thirdPersonVertOffset, "cg_thirdPersonVertOffset", "16", CVAR_CHEAT },
00996         { &cg_thirdPersonCameraDamp, "cg_thirdPersonCameraDamp", "0.3", 0 },
00997         { &cg_thirdPersonTargetDamp, "cg_thirdPersonTargetDamp", "0.5", CVAR_CHEAT },
00998         
00999         { &cg_thirdPersonHorzOffset, "cg_thirdPersonHorzOffset", "0", CVAR_CHEAT },
01000         { &cg_thirdPersonAlpha, "cg_thirdPersonAlpha",  "1.0", CVAR_CHEAT },
01001 
01002         { &cg_forceModel, "cg_forceModel", "0", CVAR_ARCHIVE  },
01003         { &cg_predictItems, "cg_predictItems", "1", CVAR_ARCHIVE },
01004         { &cg_deferPlayers, "cg_deferPlayers", "1", CVAR_ARCHIVE },
01005         { &cg_drawTeamOverlay, "cg_drawTeamOverlay", "0", CVAR_ARCHIVE },
01006         { &cg_teamOverlayUserinfo, "teamoverlay", "0", CVAR_ROM | CVAR_USERINFO },
01007         { &cg_stats, "cg_stats", "0", 0 },
01008         { &cg_drawFriend, "cg_drawFriend", "1", CVAR_ARCHIVE },
01009         { &cg_teamChatsOnly, "cg_teamChatsOnly", "0", CVAR_ARCHIVE },
01010         // the following variables are created in other parts of the system,
01011         // but we also reference them here
01012         { &cg_buildScript, "com_buildScript", "0", 0 }, // force loading of all possible data amd error on failures
01013         { &cg_paused, "cl_paused", "0", CVAR_ROM },
01014         { &cg_blood, "com_blood", "1", CVAR_ARCHIVE },
01015         { &cg_synchronousClients, "g_synchronousClients", "0", 0 },     // communicated by systeminfo
01016 
01017 //      { &cg_redTeamName, "g_redteam", DEFAULT_REDTEAM_NAME, CVAR_ARCHIVE | CVAR_SERVERINFO | CVAR_USERINFO },
01018 //      { &cg_blueTeamName, "g_blueteam", DEFAULT_BLUETEAM_NAME, CVAR_ARCHIVE | CVAR_SERVERINFO | CVAR_USERINFO },
01019         { &cg_currentSelectedPlayer, "cg_currentSelectedPlayer", "0", CVAR_ARCHIVE},
01020         { &cg_currentSelectedPlayerName, "cg_currentSelectedPlayerName", "", CVAR_ARCHIVE},
01021 //      { &cg_singlePlayerActive, "ui_singlePlayerActive", "0", CVAR_USERINFO},
01022         { &cg_recordSPDemo, "ui_recordSPDemo", "0", CVAR_ARCHIVE},
01023         { &cg_recordSPDemoName, "ui_recordSPDemoName", "", CVAR_ARCHIVE},
01024 
01025         { &cg_cameraOrbit, "cg_cameraOrbit", "0", CVAR_CHEAT},
01026         { &cg_cameraOrbitDelay, "cg_cameraOrbitDelay", "50", CVAR_ARCHIVE},
01027         { &cg_timescaleFadeEnd, "cg_timescaleFadeEnd", "1", 0},
01028         { &cg_timescaleFadeSpeed, "cg_timescaleFadeSpeed", "0", 0},
01029         { &cg_timescale, "timescale", "1", 0},
01030         { &cg_scorePlum, "cg_scorePlums", "1",  CVAR_ARCHIVE},
01031         { &cg_hudFiles, "cg_hudFiles", "ui/jahud.txt", CVAR_ARCHIVE},
01032         { &cg_smoothClients, "cg_smoothClients", "1",  CVAR_ARCHIVE},
01033         { &cg_cameraMode, "com_cameraMode", "0", CVAR_CHEAT},
01034 
01035         { &pmove_fixed, "pmove_fixed", "0", 0},
01036         { &pmove_msec, "pmove_msec", "8", 0},
01037         { &cg_noTaunt, "cg_noTaunt", "0", CVAR_ARCHIVE},
01038         { &cg_noProjectileTrail, "cg_noProjectileTrail", "0", CVAR_ARCHIVE},
01039 //      { &cg_trueLightning, "cg_trueLightning", "0.0", CVAR_ARCHIVE},
01040         { &cg_showVehBounds, "cg_showVehBounds", "0", 0},
01041 
01042         { &ui_myteam, "ui_myteam", "0", CVAR_ROM|CVAR_INTERNAL},
01043         { &cg_snapshotTimeout, "cg_snapshotTimeout", "10", CVAR_ARCHIVE },
01044 
01045 //      { &cg_pmove_fixed, "cg_pmove_fixed", "0", CVAR_USERINFO | CVAR_ARCHIVE }
01046 /*
01047 Ghoul2 Insert Start
01048 */
01049         { &cg_debugBB, "debugBB", "0", 0},
01050 /*
01051 Ghoul2 Insert End
01052 */
01053 };
01054 
01055 static int  cvarTableSize = sizeof( cvarTable ) / sizeof( cvarTable[0] );
01056 
01057 /*
01058 =================
01059 CG_RegisterCvars
01060 =================
01061 */
01062 void CG_RegisterCvars( void ) {
01063         int                     i;
01064         cvarTable_t     *cv;
01065         char            var[MAX_TOKEN_CHARS];
01066 
01067         for ( i = 0, cv = cvarTable ; i < cvarTableSize ; i++, cv++ ) {
01068                 trap_Cvar_Register( cv->vmCvar, cv->cvarName,
01069                         cv->defaultString, cv->cvarFlags );
01070         }
01071 
01072         // see if we are also running the server on this machine
01073         trap_Cvar_VariableStringBuffer( "sv_running", var, sizeof( var ) );
01074         cgs.localServer = atoi( var );
01075 
01076         forceModelModificationCount = cg_forceModel.modificationCount;
01077 
01078         trap_Cvar_Register(NULL, "model", DEFAULT_MODEL, CVAR_USERINFO | CVAR_ARCHIVE );
01079         trap_Cvar_Register(NULL, "forcepowers", DEFAULT_FORCEPOWERS, CVAR_USERINFO | CVAR_ARCHIVE );
01080 
01081         // Cvars uses for transferring data between client and server
01082         trap_Cvar_Register(NULL, "ui_about_gametype",           "0", CVAR_ROM|CVAR_INTERNAL );
01083