/* * CG_ClearEffects */ void CG_ClearEffects( void ) { CG_ClearFragmentedDecals(); CG_ClearParticles(); CG_ClearDlights(); CG_ClearShadeBoxes(); }
/* =============== CG_MapRestart The server has issued a map_restart, so the next snapshot is completely new and should not be interpolated to. A tournement restart will clear everything, but doesn't require a reload of all the media =============== */ static void CG_MapRestart( void ) { if ( cg_showmiss.integer ) { CG_Printf( "CG_MapRestart\n" ); } CG_InitLocalEntities(); CG_InitMarkPolys(); CG_ClearParticles (); // make sure the "3 frags left" warnings play again cg.fraglimitWarnings = 0; cg.timelimitWarnings = 0; cg.rewardTime = 0; cg.rewardStack = 0; cg.intermissionStarted = qfalse; cg.levelShot = qfalse; cgs.voteTime = 0; cg.mapRestart = qtrue; CG_StartMusic(); trap_S_ClearLoopingSounds(qtrue); // we really should clear more parts of cg here and stop sounds // play the "fight" sound if this is a restart without warmup if ( cg.warmup == 0 /* && cgs.gametype == GT_TOURNAMENT */) { trap_S_StartLocalSound( cgs.media.countFightSound, CHAN_ANNOUNCER ); CG_CenterPrint( "FIGHT!", 120, GIANTCHAR_WIDTH*2 ); } if (cg_singlePlayer.integer) { trap_Cvar_Set("ui_matchStartTime", va("%i", cg.time)); // eser - tweaks // if (cg_recordSPDemo.integer && *cg_recordSPDemoName.string) { // trap_SendConsoleCommand(va("set g_synchronousclients 1 ; record %s \n", cg_recordSPDemoName.string)); // } // eser - tweaks } trap_Cvar_Set("cg_thirdPerson", "0"); }
/* =============== CG_MapRestart The server has issued a map_restart, so the next snapshot is completely new and should not be interpolated to. A tournement restart will clear everything, but doesn't require a reload of all the media =============== */ static void CG_MapRestart( void ) { if ( cg_showMiss.integer ) { trap->Print( "CG_MapRestart\n" ); } trap->R_ClearDecals ( ); //FIXME: trap->FX_Reset? CG_InitLocalEntities(); CG_InitMarkPolys(); CG_ClearParticles (); CG_KillCEntityInstances(); // make sure the "3 frags left" warnings play again cg.fraglimitWarnings = 0; cg.timelimitWarnings = 0; cg.intermissionStarted = qfalse; cgs.voteTime = 0; cg.mapRestart = qtrue; CG_StartMusic(qtrue); trap->S_ClearLoopingSounds(); // we really should clear more parts of cg here and stop sounds // play the "fight" sound if this is a restart without warmup if ( cg.warmup == 0 && cgs.gametype != GT_SIEGE && cgs.gametype != GT_POWERDUEL/* && cgs.gametype == GT_DUEL */) { trap->S_StartLocalSound( cgs.media.countFightSound, CHAN_ANNOUNCER ); CG_CenterPrint( CG_GetStringEdString("MP_SVGAME", "BEGIN_DUEL"), 120, GIANTCHAR_WIDTH*2 ); } /* if (cg_singlePlayerActive.integer) { trap->Cvar_Set("ui_matchStartTime", va("%i", cg.time)); if (cg_recordSPDemo.integer && cg_recordSPDemoName.string && *cg_recordSPDemoName.string) { trap->SendConsoleCommand(va("set g_synchronousclients 1 ; record %s \n", cg_recordSPDemoName.string)); } } */ // trap->Cvar_Set("cg_thirdPerson", "0"); }
/** The server has issued a map_restart, so the next snapshot is completely new and should not be interpolated to. A tournament restart will clear everything, but doesn't require a reload of all the media */ static void CG_MapRestart(void) { if (cg_showmiss.integer) { CG_Printf("CG_MapRestart\n"); } CG_InitLocalEntities(); CG_InitMarkPolys(); CG_ClearParticles(); // make sure the "3 frags left" warnings play again cg.fraglimitWarnings = 0; cg.timelimitWarnings = 0; cg.rewardTime = 0; cg.rewardStack = 0; cg.intermissionStarted = qfalse; cg.levelShot = qfalse; memset(&cg.statsOwn, 0, sizeof cg.statsOwn); memset(&cg.statsFollow, 0, sizeof cg.statsFollow); memset(&cg.statsEnemy, 0, sizeof cg.statsEnemy); cgs.voteTime = 0; cg.mapRestart = qtrue; trap_S_ClearLoopingSounds(qtrue); // we really should clear more parts of cg here and stop sounds // play the "fight" sound if this is a restart without warmup if (cgs.warmup == 0) { trap_S_StartLocalSound(cgs.media.countFightSound, CHAN_ANNOUNCER); CG_CenterPrint("Fight!"); } trap_Cvar_Set("cg_thirdPerson", "0"); }
/* ================= CG_RegisterGraphics This function may execute for a couple of minutes with a slow disk. ================= */ static void CG_RegisterGraphics( void ) { int i; static char *sb_nums[11] = { "interface/fonts/numbers/0", "interface/fonts/numbers/1", "interface/fonts/numbers/2", "interface/fonts/numbers/3", "interface/fonts/numbers/4", "interface/fonts/numbers/5", "interface/fonts/numbers/6", "interface/fonts/numbers/7", "interface/fonts/numbers/8", "interface/fonts/numbers/9", "interface/fonts/numbers/-", }; // clear any references to old media memset( &cg.refdef, 0, sizeof( cg.refdef ) ); trap_R_ClearScene(); CG_LoadingString( cgs.mapname ); trap_R_LoadWorldMap( cgs.mapname ); CG_LoadingString( "game media" ); for ( i=0 ; i<11 ; i++) { cgs.media.numberShaders[i] = trap_R_RegisterShader( sb_nums[i] ); } cgs.media.waterBubbleLargeShader = trap_R_RegisterShader( "waterBubbleLarge" ); cgs.media.waterBubbleMediumShader = trap_R_RegisterShader( "waterBubbleMedium" ); cgs.media.waterBubbleSmallShader = trap_R_RegisterShader( "waterBubbleSmall" ); cgs.media.waterBubbleTinyShader = trap_R_RegisterShader( "waterBubbleTiny" ); cgs.media.selectShader = trap_R_RegisterShader( "interface/hud/select.png" ); cgs.media.chatBubble = trap_R_RegisterShader( "chatBubble"); for ( i = 0 ; i < NUM_CROSSHAIRS ; i++ ) { cgs.media.crosshairShader[i] = trap_R_RegisterShader( va("crosshair%c", 'a'+i) ); } cgs.media.speedLineShader = trap_R_RegisterShaderNoMip("speedLines"); cgs.media.speedLineSpinShader = trap_R_RegisterShaderNoMip("speedLinesSpin"); cgs.media.globalCelLighting = trap_R_RegisterShader("GlobalCelLighting"); cgs.media.waterSplashSkin = trap_R_RegisterSkin( "effects/water/waterSplash.skin" ); cgs.media.waterSplashModel = trap_R_RegisterModel( "effects/water/waterSplash.md3" ); cgs.media.waterRippleSkin = trap_R_RegisterSkin( "effects/water/waterRipple.skin" ); cgs.media.waterRippleModel = trap_R_RegisterModel( "effects/water/waterRipple.md3" ); cgs.media.waterRippleSingleSkin = trap_R_RegisterSkin( "effects/water/waterRippleSingle.skin" ); cgs.media.waterRippleSingleModel = trap_R_RegisterModel( "effects/water/waterRippleSingle.md3" ); cgs.media.meleeSpeedEffectShader = trap_R_RegisterShader( "skills/energyBlast" ); cgs.media.meleePowerEffectShader = trap_R_RegisterShader( "shockwave" ); cgs.media.teleportEffectShader = trap_R_RegisterShader( "teleportEffect" ); cgs.media.boltEffectShader = trap_R_RegisterShader( "boltEffect" ); cgs.media.auraLightningSparks1 = trap_R_RegisterShader( "AuraLightningSparks1" ); cgs.media.auraLightningSparks2 = trap_R_RegisterShader( "AuraLightningSparks2" ); cgs.media.powerStruggleRaysEffectShader = trap_R_RegisterShader( "PowerStruggleRays" ); cgs.media.powerStruggleShockwaveEffectShader = trap_R_RegisterShader( "PowerStruggleShockwave" ); cgs.media.bfgLFGlare = trap_R_RegisterShader("bfgLFGlare"); cgs.media.bfgLFDisc = trap_R_RegisterShader("bfgLFDisc"); cgs.media.bfgLFRing = trap_R_RegisterShader("bfgLFRing"); cgs.media.bfgLFStar = trap_R_RegisterShader("bfgLFStar"); cgs.media.bfgLFLine = trap_R_RegisterShader("bfgLFLine"); memset( cg_weapons, 0, sizeof( cg_weapons ) ); cgs.media.wakeMarkShader = trap_R_RegisterShader( "wake" ); cgs.media.dirtPushShader = trap_R_RegisterShader( "DirtPush" ); cgs.media.dirtPushSkin = trap_R_RegisterSkin( "effects/shockwave/dirtPush.skin" ); cgs.media.dirtPushModel = trap_R_RegisterModel( "effects/shockwave/dirtPush.md3" ); cgs.media.hudShader = trap_R_RegisterShaderNoMip( "interface/hud/main.png" ); cgs.media.chatBackgroundShader = trap_R_RegisterShaderNoMip("chatBox"); cgs.media.markerAscendShader = trap_R_RegisterShaderNoMip( "interface/hud/markerAscend.png" ); cgs.media.markerDescendShader = trap_R_RegisterShaderNoMip( "interface/hud/markerDescend.png" ); cgs.media.breakLimitShader = trap_R_RegisterShaderNoMip( "breakLimit" ); cgs.media.RadarBlipShader = trap_R_RegisterShaderNoMip( "interface/sense/blip.png" ); cgs.media.RadarBlipTeamShader = trap_R_RegisterShaderNoMip( "interface/sense/blipteam.png" ); cgs.media.RadarBurstShader = trap_R_RegisterShaderNoMip( "interface/sense/burst.png" ); cgs.media.RadarWarningShader = trap_R_RegisterShaderNoMip( "interface/sense/warning.png" ); cgs.media.RadarMidpointShader = trap_R_RegisterShaderNoMip( "interface/sense/midpoint.png" ); // END ADDING // register the inline models cgs.numInlineModels = trap_CM_NumInlineModels(); for ( i = 1 ; i < cgs.numInlineModels ; i++ ) { char name[10]; vec3_t mins, maxs; int j; Com_sprintf( name, sizeof(name), "*%i", i ); cgs.inlineDrawModel[i] = trap_R_RegisterModel( name ); trap_R_ModelBounds( cgs.inlineDrawModel[i], mins, maxs, 0 ); for ( j = 0 ; j < 3 ; j++ ) { cgs.inlineModelMidpoints[i][j] = mins[j] + 0.5 * ( maxs[j] - mins[j] ); } } // register all the server specified models for (i=1 ; i<MAX_MODELS ; i++) { const char *modelName; modelName = CG_ConfigString( CS_MODELS+i ); if ( !modelName[0] ) { break; } cgs.gameModels[i] = trap_R_RegisterModel( modelName ); } CG_ClearParticles (); }
/* =============== CG_AddParticles =============== */ void CG_AddParticles(void) { cparticle_t *p, *next; float alpha; float time, time2; vec3_t org; cparticle_t *active, *tail; vec3_t rotate_ang; if (!initparticles) { CG_ClearParticles(); } VectorCopy(cg.refdef_current->viewaxis[0], vforward); VectorCopy(cg.refdef_current->viewaxis[1], vright); VectorCopy(cg.refdef_current->viewaxis[2], vup); vectoangles(cg.refdef_current->viewaxis[0], rotate_ang); roll += ((cg.time - oldtime) * 0.1) ; rotate_ang[ROLL] += (roll * 0.9); AngleVectors(rotate_ang, rforward, rright, rup); oldtime = cg.time; active = NULL; tail = NULL; for (p = active_particles ; p ; p = next) { next = p->next; time = (cg.time - p->time) * 0.001; alpha = p->alpha + time * p->alphavel; if (alpha <= 0) { // faded out p->next = free_particles; free_particles = p; p->type = 0; p->color = 0; p->alpha = 0; continue; } if ((p->type == P_SMOKE || p->type == P_ANIM || p->type == P_DLIGHT_ANIM || p->type == P_SMOKE_IMPACT) && cg.time > p->endtime) { p->next = free_particles; free_particles = p; p->type = 0; p->color = 0; p->alpha = 0; continue; } if (p->type == P_WEATHER_FLURRY && cg.time > p->endtime) { p->next = free_particles; free_particles = p; p->type = 0; p->color = 0; p->alpha = 0; continue; } if (p->type == P_FLAT_SCALEUP_FADE && cg.time > p->endtime) { p->next = free_particles; free_particles = p; p->type = 0; p->color = 0; p->alpha = 0; continue; } if (p->type == P_SPRITE && p->endtime < 0) { // temporary sprite CG_AddParticleToScene(p, p->org); p->next = free_particles; free_particles = p; p->type = 0; p->color = 0; p->alpha = 0; continue; } p->next = NULL; if (!tail) { active = tail = p; } else { tail->next = p; tail = p; } if (alpha > 1.0) { alpha = 1; } time2 = time * time; org[0] = p->org[0] + p->vel[0] * time + p->accel[0] * time2; org[1] = p->org[1] + p->vel[1] * time + p->accel[1] * time2; org[2] = p->org[2] + p->vel[2] * time + p->accel[2] * time2; CG_AddParticleToScene(p, org); } active_particles = active; }
/** * @brief CG_AddParticles */ void CG_AddParticles(void) { cparticle_t *p, *next; float alpha; float time, time2; vec3_t org; cparticle_t *active = NULL, *tail = NULL; vec3_t rotate_ang; if (!initparticles) { CG_ClearParticles(); } VectorCopy(cg.refdef_current->viewaxis[0], vforward); VectorCopy(cg.refdef_current->viewaxis[1], vright); VectorCopy(cg.refdef_current->viewaxis[2], vup); vectoangles(cg.refdef_current->viewaxis[0], rotate_ang); roll += ((cg.time - oldtime) * 0.1f) ; rotate_ang[ROLL] += (roll * 0.9f); AngleVectors(rotate_ang, rforward, rright, rup); oldtime = cg.time; for (p = active_particles ; p ; p = next) { next = p->next; time = (cg.time - p->time) * 0.001f; alpha = p->alpha + time * p->alphavel; if (alpha <= 0) // faded out { p->next = free_particles; free_particles = p; p->type = 0; p->color = 0; p->alpha = 0; continue; } switch (p->type) { case P_SMOKE: case P_ANIM: case P_DLIGHT_ANIM: case P_BLEED: case P_SMOKE_IMPACT: case P_WEATHER_FLURRY: case P_FLAT_SCALEUP_FADE: if (cg.time > p->endtime) { p->next = free_particles; free_particles = p; p->type = 0; p->color = 0; p->alpha = 0; continue; } break; case P_SPRITE: if (p->endtime < 0) { // temporary sprite CG_AddParticleToScene(p, p->org, alpha); p->next = free_particles; free_particles = p; p->type = 0; p->color = 0; p->alpha = 0; continue; } break; default: // P_NONE // P_WEATHER // P_FLAT // P_ROTATE // P_WEATHER_TURBULENT // P_FLAT_SCALEUP // P_BUBBLE // P_BUBBLE_TURBULENT break; } p->next = NULL; if (!tail) { active = tail = p; } else { tail->next = p; tail = p; } if (alpha > 1.0f) { alpha = 1; } time2 = time * time; org[0] = p->org[0] + p->vel[0] * time + p->accel[0] * time2; org[1] = p->org[1] + p->vel[1] * time + p->accel[1] * time2; org[2] = p->org[2] + p->vel[2] * time + p->accel[2] * time2; CG_AddParticleToScene(p, org, alpha); } active_particles = active; }
/* ================= CG_RegisterGraphics This function may execute for a couple of minutes with a slow disk. ================= */ static void CG_RegisterGraphics( void ) { gitem_t *backpack; int i; char items[MAX_ITEMS+1]; static char *sb_nums[11] = { "gfx/2d/numbers/zero_32b", "gfx/2d/numbers/one_32b", "gfx/2d/numbers/two_32b", "gfx/2d/numbers/three_32b", "gfx/2d/numbers/four_32b", "gfx/2d/numbers/five_32b", "gfx/2d/numbers/six_32b", "gfx/2d/numbers/seven_32b", "gfx/2d/numbers/eight_32b", "gfx/2d/numbers/nine_32b", "gfx/2d/numbers/minus_32b", }; // clear any references to old media memset( &cg.refdef, 0, sizeof( cg.refdef ) ); trap_R_ClearScene(); CG_LoadingString( cgs.mapname ); trap_R_LoadWorldMap( cgs.mapname ); // precache status bar pics CG_LoadingString( "game media" ); for ( i=0 ; i<11 ; i++) { cgs.media.numberShaders[i] = trap_R_RegisterShader( sb_nums[i] ); } cgs.media.botSkillShaders[0] = trap_R_RegisterShader( "menu/art/skill1.tga" ); cgs.media.botSkillShaders[1] = trap_R_RegisterShader( "menu/art/skill2.tga" ); cgs.media.botSkillShaders[2] = trap_R_RegisterShader( "menu/art/skill3.tga" ); cgs.media.botSkillShaders[3] = trap_R_RegisterShader( "menu/art/skill4.tga" ); cgs.media.botSkillShaders[4] = trap_R_RegisterShader( "menu/art/skill5.tga" ); cgs.media.viewBloodShader = trap_R_RegisterShader( "viewBloodBlend" ); cgs.media.deferShader = trap_R_RegisterShaderNoMip( "gfx/2d/defer.tga" ); cgs.media.scoreboardName = trap_R_RegisterShaderNoMip( "menu/tab/name.tga" ); cgs.media.scoreboardPing = trap_R_RegisterShaderNoMip( "menu/tab/ping.tga" ); cgs.media.scoreboardScore = trap_R_RegisterShaderNoMip( "menu/tab/score.tga" ); cgs.media.scoreboardTime = trap_R_RegisterShaderNoMip( "menu/tab/time.tga" ); cgs.media.objectivesOverlay = trap_R_RegisterShaderNoMip( CG_ConfigString(CS_OBJECTIVESOVERLAY) ); cgs.media.objectivesUpdated = trap_R_RegisterShaderNoMip( "menu/objectives/updated.tga" ); cgs.media.objectivesUpdatedSound = trap_S_RegisterSound( "sound/misc/objective_update_01.wav", qfalse ); cgs.media.deathImage = trap_R_RegisterShaderNoMip( "menu/art/level_complete5" ); cgs.media.scoreShow = trap_S_RegisterSound( "sound/weapons/rocket/rocklx1a.wav", qfalse ); cgs.media.finalScoreShow = trap_S_RegisterSound( "sound/weapons/rocket/rocklx1a.wav", qfalse ); cgs.media.smokePuffShader = trap_R_RegisterShader( "smokePuff" ); cgs.media.smokePuffRageProShader = trap_R_RegisterShader( "smokePuffRagePro" ); cgs.media.shotgunSmokePuffShader = trap_R_RegisterShader( "shotgunSmokePuff" ); cgs.media.plasmaBallShader = trap_R_RegisterShader( "sprites/plasma1" ); cgs.media.bloodTrailShader = trap_R_RegisterShader( "bloodTrail" ); cgs.media.lagometerShader = trap_R_RegisterShader("lagometer" ); cgs.media.connectionShader = trap_R_RegisterShader( "disconnected" ); cgs.media.waterBubbleShader = trap_R_RegisterShader( "waterBubble" ); cgs.media.tracerShader = trap_R_RegisterShader( "gfx/misc/tracer" ); cgs.media.selectShader = trap_R_RegisterShader( "gfx/2d/select" ); for ( i = 0 ; i < NUM_CROSSHAIRS ; i++ ) { cgs.media.crosshairShader[i] = trap_R_RegisterShader( va("gfx/2d/crosshair%c", 'a'+i) ); } cgs.media.backTileShader = trap_R_RegisterShader( "gfx/2d/backtile" ); cgs.media.noammoShader = trap_R_RegisterShader( "icons/noammo" ); // powerup shaders cgs.media.quadShader = trap_R_RegisterShader("powerups/quad" ); cgs.media.quadWeaponShader = trap_R_RegisterShader("powerups/quadWeapon" ); cgs.media.battleSuitShader = trap_R_RegisterShader("powerups/battleSuit" ); cgs.media.battleWeaponShader = trap_R_RegisterShader("powerups/battleWeapon" ); cgs.media.invisShader = trap_R_RegisterShader("powerups/invisibility" ); cgs.media.regenShader = trap_R_RegisterShader("powerups/regen" ); cgs.media.hastePuffShader = trap_R_RegisterShader("hasteSmokePuff" ); if ( cg_buildScript.integer ) { cgs.media.redCubeModel = trap_R_RegisterModel( "models/powerups/orb/r_orb.md3" ); cgs.media.blueCubeModel = trap_R_RegisterModel( "models/powerups/orb/b_orb.md3" ); cgs.media.redCubeIcon = trap_R_RegisterShader( "icons/skull_red" ); cgs.media.blueCubeIcon = trap_R_RegisterShader( "icons/skull_blue" ); } if ( cg_buildScript.integer ) { cgs.media.redFlagModel = trap_R_RegisterModel( "models/flags/r_flag.md3" ); cgs.media.blueFlagModel = trap_R_RegisterModel( "models/flags/b_flag.md3" ); cgs.media.redFlagShader[0] = trap_R_RegisterShaderNoMip( "icons/iconf_red1" ); cgs.media.redFlagShader[1] = trap_R_RegisterShaderNoMip( "icons/iconf_red2" ); cgs.media.redFlagShader[2] = trap_R_RegisterShaderNoMip( "icons/iconf_red3" ); cgs.media.blueFlagShader[0] = trap_R_RegisterShaderNoMip( "icons/iconf_blu1" ); cgs.media.blueFlagShader[1] = trap_R_RegisterShaderNoMip( "icons/iconf_blu2" ); cgs.media.blueFlagShader[2] = trap_R_RegisterShaderNoMip( "icons/iconf_blu3" ); } cgs.media.dustPuffShader = trap_R_RegisterShader("hasteSmokePuff" ); if ( CG_IsTeamGame() || cg_buildScript.integer ) { cgs.media.friendShader = trap_R_RegisterShader( "sprites/foe" ); cgs.media.redQuadShader = trap_R_RegisterShader("powerups/blueflag" ); cgs.media.teamStatusBar = trap_R_RegisterShader( "gfx/2d/colorbar.tga" ); } cgs.media.armorModel = trap_R_RegisterModel( "models/powerups/armor/armor_yel.md3" ); cgs.media.armorIcon = trap_R_RegisterShaderNoMip( "icons/iconr_yellow" ); cgs.media.machinegunBrassModel = trap_R_RegisterModel( "models/weapons2/shells/m_shell.md3" ); cgs.media.shotgunBrassModel = trap_R_RegisterModel( "models/weapons2/shells/s_shell.md3" ); cgs.media.gibAbdomen = trap_R_RegisterModel( "models/gibs/abdomen.md3" ); cgs.media.gibArm = trap_R_RegisterModel( "models/gibs/arm.md3" ); cgs.media.gibChest = trap_R_RegisterModel( "models/gibs/chest.md3" ); cgs.media.gibFist = trap_R_RegisterModel( "models/gibs/fist.md3" ); cgs.media.gibFoot = trap_R_RegisterModel( "models/gibs/foot.md3" ); cgs.media.gibForearm = trap_R_RegisterModel( "models/gibs/forearm.md3" ); cgs.media.gibIntestine = trap_R_RegisterModel( "models/gibs/intestine.md3" ); cgs.media.gibLeg = trap_R_RegisterModel( "models/gibs/leg.md3" ); cgs.media.gibSkull = trap_R_RegisterModel( "models/gibs/skull.md3" ); cgs.media.gibBrain = trap_R_RegisterModel( "models/gibs/brain.md3" ); cgs.media.debrislight1 = trap_R_RegisterModel( "models/debris/concrete_b1.md3" ); cgs.media.debrislight2 = trap_R_RegisterModel( "models/debris/concrete_b2.md3" ); cgs.media.debrislight3 = trap_R_RegisterModel( "models/debris/concrete_b3.md3" ); cgs.media.debrislight4 = trap_R_RegisterModel( "models/debris/concrete_b4.md3" ); cgs.media.debrislight5 = trap_R_RegisterModel( "models/debris/concrete_b5.md3" ); cgs.media.debrislight6 = trap_R_RegisterModel( "models/debris/concrete_b6.md3" ); cgs.media.debrislight7 = trap_R_RegisterModel( "models/debris/concrete_b7.md3" ); cgs.media.debrislight8 = trap_R_RegisterModel( "models/debris/concrete_b8.md3" ); cgs.media.debrisdark1 = trap_R_RegisterModel( "models/debris/concrete_d1.md3" ); cgs.media.debrisdark2 = trap_R_RegisterModel( "models/debris/concrete_d2.md3" ); cgs.media.debrisdark3 = trap_R_RegisterModel( "models/debris/concrete_d3.md3" ); cgs.media.debrisdark4 = trap_R_RegisterModel( "models/debris/concrete_d4.md3" ); cgs.media.debrisdark5 = trap_R_RegisterModel( "models/debris/concrete_d5.md3" ); cgs.media.debrisdark6 = trap_R_RegisterModel( "models/debris/concrete_d6.md3" ); cgs.media.debrisdark7 = trap_R_RegisterModel( "models/debris/concrete_d7.md3" ); cgs.media.debrisdark8 = trap_R_RegisterModel( "models/debris/concrete_d8.md3" ); cgs.media.debrislightlarge1 = trap_R_RegisterModel( "models/debris/concrete_b1_large.md3" ); cgs.media.debrislightlarge2 = trap_R_RegisterModel( "models/debris/concrete_b2_large.md3" ); cgs.media.debrislightlarge3 = trap_R_RegisterModel( "models/debris/concrete_b3_large.md3" ); cgs.media.debrisdarklarge1 = trap_R_RegisterModel( "models/debris/wood_b1.md3" ); cgs.media.debrisdarklarge2 = trap_R_RegisterModel( "models/debris/wood_b1.md3" ); cgs.media.debrisdarklarge3 = trap_R_RegisterModel( "models/debris/wood_b1.md3" ); cgs.media.debriswood1 = trap_R_RegisterModel( "models/debris/wood_b1.md3" ); cgs.media.debriswood2 = trap_R_RegisterModel( "models/debris/wood_b2.md3" ); cgs.media.debriswood3 = trap_R_RegisterModel( "models/debris/wood_b3.md3" ); cgs.media.debriswood4 = trap_R_RegisterModel( "models/debris/wood_b4.md3" ); cgs.media.debriswood5 = trap_R_RegisterModel( "models/debris/wood_b5.md3" ); cgs.media.debrisglass1 = trap_R_RegisterModel( "models/debris/glass_1.md3" ); cgs.media.debrisglass2 = trap_R_RegisterModel( "models/debris/glass_2.md3" ); cgs.media.debrisglass3 = trap_R_RegisterModel( "models/debris/glass_3.md3" ); cgs.media.debrisglass4 = trap_R_RegisterModel( "models/debris/glass_4.md3" ); cgs.media.debrisglass5 = trap_R_RegisterModel( "models/debris/glass_5.md3" ); cgs.media.debrisglasslarge1 = trap_R_RegisterModel( "models/debris/glass_1_large.md3" ); cgs.media.debrisglasslarge2 = trap_R_RegisterModel( "models/debris/glass_2_large.md3" ); cgs.media.debrisglasslarge3 = trap_R_RegisterModel( "models/debris/glass_3_large.md3" ); cgs.media.debrisglasslarge4 = trap_R_RegisterModel( "models/debris/glass_4_large.md3" ); cgs.media.debrisglasslarge5 = trap_R_RegisterModel( "models/debris/glass_5_large.md3" ); cgs.media.debrisstone1 = trap_R_RegisterModel( "models/debris/stone_1.md3" ); cgs.media.debrisstone2 = trap_R_RegisterModel( "models/debris/stone_2.md3" ); cgs.media.debrisstone3 = trap_R_RegisterModel( "models/debris/stone_3.md3" ); cgs.media.debrisstone4 = trap_R_RegisterModel( "models/debris/stone_4.md3" ); cgs.media.debrisstone5 = trap_R_RegisterModel( "models/debris/stone_5.md3" ); cgs.media.sparkShader = trap_R_RegisterShaderNoMip("spark"); cgs.media.smoke2 = trap_R_RegisterModel( "models/weapons2/shells/s_shell.md3" ); cgs.media.balloonShader = trap_R_RegisterShader( "sprites/balloon3" ); cgs.media.bloodExplosionShader = trap_R_RegisterShader( "bloodExplosion" ); cgs.media.bulletFlashModel = trap_R_RegisterModel("models/weaphits/bullet.md3"); cgs.media.ringFlashModel = trap_R_RegisterModel("models/weaphits/ring02.md3"); cgs.media.dishFlashModel = trap_R_RegisterModel("models/weaphits/boom01.md3"); cgs.media.teleportEffectModel = trap_R_RegisterModel( "models/misc/telep.md3" ); cgs.media.teleportEffectShader = trap_R_RegisterShader( "teleportEffect" ); cgs.media.invulnerabilityPowerupModel = trap_R_RegisterModel( "models/powerups/shield/shield.md3" ); cgs.media.medalImpressive = trap_R_RegisterShaderNoMip( "medal_impressive" ); cgs.media.medalExcellent = trap_R_RegisterShaderNoMip( "medal_excellent" ); cgs.media.medalGauntlet = trap_R_RegisterShaderNoMip( "medal_gauntlet" ); cgs.media.medalDefend = trap_R_RegisterShaderNoMip( "medal_defend" ); cgs.media.medalAssist = trap_R_RegisterShaderNoMip( "medal_assist" ); cgs.media.medalCapture = trap_R_RegisterShaderNoMip( "medal_capture" ); memset( cg_items, 0, sizeof( cg_items ) ); memset( cg_weapons, 0, sizeof( cg_weapons ) ); // only register the items that the server says we need strcpy( items, CG_ConfigString( CS_ITEMS) ); for ( i = 1 ; i < bg_numItems ; i++ ) { if ( items[ i ] == '1' || cg_buildScript.integer ) { CG_LoadingItem( i ); CG_RegisterItemVisuals( i ); } } // wall marks cgs.media.bulletMarkShader = trap_R_RegisterShader( "gfx/damage/bullet_mrk" ); cgs.media.burnMarkShader = trap_R_RegisterShader( "gfx/damage/burn_med_mrk" ); cgs.media.holeMarkShader = trap_R_RegisterShader( "gfx/damage/hole_lg_mrk" ); cgs.media.energyMarkShader = trap_R_RegisterShader( "gfx/damage/plasma_mrk" ); cgs.media.shadowMarkShader = trap_R_RegisterShader( "markShadow" ); cgs.media.wakeMarkShader = trap_R_RegisterShader( "wake" ); cgs.media.bloodMarkShader = trap_R_RegisterShader( "bloodMark" ); // paintball mode marks cgs.media.bulletMarkPaintShader = trap_R_RegisterShader( "gfx/damage/bullet_mrk_paint" ); cgs.media.burnMarkPaintShader = trap_R_RegisterShader( "gfx/damage/burn_med_mrk_paint" ); cgs.media.holeMarkPaintShader = trap_R_RegisterShader( "gfx/damage/hole_lg_mrk_paint" ); cgs.media.energyMarkPaintShader = trap_R_RegisterShader( "gfx/damage/plasma_mrk_paint" ); // register the inline models cgs.numInlineModels = trap_CM_NumInlineModels(); for ( i = 1 ; i < cgs.numInlineModels ; i++ ) { char name[10]; vec3_t mins, maxs; int j; Com_sprintf( name, sizeof(name), "*%i", i ); cgs.inlineDrawModel[i] = trap_R_RegisterModel( name ); trap_R_ModelBounds( cgs.inlineDrawModel[i], mins, maxs ); for ( j = 0 ; j < 3 ; j++ ) { cgs.inlineModelMidpoints[i][j] = mins[j] + 0.5 * ( maxs[j] - mins[j] ); } } // register all the server specified models for (i=1 ; i<MAX_MODELS ; i++) { const char *modelName; modelName = CG_ConfigString( CS_MODELS+i ); if ( !modelName[0] ) { break; } cgs.gameModels[i] = trap_R_RegisterModel( modelName ); } CG_ClearParticles (); /* for (i=1; i<MAX_PARTICLES_AREAS; i++) { { int rval; rval = CG_NewParticleArea ( CS_PARTICLES + i); if (!rval) break; } } */ }
/* =============== CG_AddParticles =============== */ void CG_AddParticles (void) { cparticle_t *p, *next; float alpha; float time, time2; vector3 org; int color; cparticle_t *active, *tail; int type; vector3 rotate_ang; refdef_t *refdef = CG_GetRefdef(); if (!initparticles) CG_ClearParticles (); VectorCopy( &refdef->viewaxis[0], &pvforward ); VectorCopy( &refdef->viewaxis[1], &pvright ); VectorCopy( &refdef->viewaxis[2], &pvup ); vectoangles( &refdef->viewaxis[0], &rotate_ang ); roll += ((cg.time - oldtime) * 0.1) ; rotate_ang.roll += (roll*0.9); AngleVectors ( &rotate_ang, &rforward, &rright, &rup); oldtime = cg.time; active = NULL; tail = NULL; for (p=active_particles ; p ; p=next) { next = p->next; time = (cg.time - p->time)*0.001; alpha = p->alpha + time*p->alphavel; if (alpha <= 0) { // faded out p->next = free_particles; free_particles = p; p->type = 0; p->color = 0; p->alpha = 0; continue; } if (p->type == P_SMOKE || p->type == P_ANIM || p->type == P_BLEED || p->type == P_SMOKE_IMPACT) { if (cg.time > p->endtime) { p->next = free_particles; free_particles = p; p->type = 0; p->color = 0; p->alpha = 0; continue; } } if (p->type == P_WEATHER_FLURRY) { if (cg.time > p->endtime) { p->next = free_particles; free_particles = p; p->type = 0; p->color = 0; p->alpha = 0; continue; } } if (p->type == P_FLAT_SCALEUP_FADE) { if (cg.time > p->endtime) { p->next = free_particles; free_particles = p; p->type = 0; p->color = 0; p->alpha = 0; continue; } } if ((p->type == P_BAT || p->type == P_SPRITE) && p->endtime < 0) { // temporary sprite CG_AddParticleToScene (p, &p->org, alpha); p->next = free_particles; free_particles = p; p->type = 0; p->color = 0; p->alpha = 0; continue; } p->next = NULL; if (!tail) active = tail = p; else { tail->next = p; tail = p; } if (alpha > 1.0) alpha = 1; color = p->color; time2 = time*time; org.x = p->org.x + p->vel.x*time + p->accel.x*time2; org.y = p->org.y + p->vel.y*time + p->accel.y*time2; org.z = p->org.z + p->vel.z*time + p->accel.z*time2; type = p->type; CG_AddParticleToScene (p, &org, alpha); } active_particles = active; }
void CG_DemosDrawActiveFrame( int serverTime, stereoFrame_t stereoView ) { int deltaTime; qboolean hadSkip; qboolean captureFrame; float captureFPS; float frameSpeed; int blurTotal, blurIndex; float blurFraction; float stereoSep = CG_Cvar_Get( "r_stereoSeparation" ); int inwater, entityNum; if (!demo.initDone) { if ( !cg.snap ) { demoProcessSnapShots( qtrue ); } if ( !cg.snap ) { CG_Error( "No Initial demo snapshot found" ); } demoPlaybackInit(); } cg.demoPlayback = 2; // update cvars CG_UpdateCvars(); // if we are only updating the screen as a loading // pacifier, don't even try to read snapshots if ( cg.loading ) { CG_DrawInformation(); return; } captureFrame = demo.capture.active && !demo.play.paused; if ( captureFrame ) { trap_MME_BlurInfo( &blurTotal, &blurIndex ); captureFPS = mov_captureFPS.value; if ( blurTotal > 0) { captureFPS *= blurTotal; blurFraction = blurIndex / (float)blurTotal; } else { blurFraction = 0; } } else { } /* Forward the demo */ deltaTime = serverTime - demo.serverTime; if (deltaTime > 50) deltaTime = 50; demo.serverTime = serverTime; demo.serverDeltaTime = 0.001 * deltaTime; cg.oldTime = cg.time; cg.oldTimeFraction = cg.timeFraction; if (demo.play.time < 0) { demo.play.time = demo.play.fraction = 0; } demo.play.oldTime = demo.play.time; /* Handle the music */ if ( demo.play.paused ) { if ( lastMusicStart >= 0) demoSynchMusic( -1, 0 ); } else { int musicStart = (demo.play.time - mov_musicStart.value * 1000 ); if ( musicStart <= 0 ) { if (lastMusicStart >= 0 ) demoSynchMusic( -1, 0 ); } else { if ( demo.play.time != demo.play.lastTime || lastMusicStart < 0) demoSynchMusic( musicStart, 0 ); } } /* forward the time a bit till the moment of capture */ if ( captureFrame && demo.capture.locked && demo.play.time < demo.capture.start ) { int left = demo.capture.start - demo.play.time; if ( left > 2000) { left -= 1000; captureFrame = qfalse; } else if (left > 5) { captureFrame = qfalse; left = 5; } demo.play.time += left; } else if ( captureFrame && demo.loop.total && blurTotal ) { float loopFraction = demo.loop.index / (float)demo.loop.total; demo.play.time = demo.loop.start; demo.play.fraction = demo.loop.range * loopFraction; demo.play.time += (int)demo.play.fraction; demo.play.fraction -= (int)demo.play.fraction; } else if (captureFrame) { float frameDelay = 1000.0f / captureFPS; demo.play.fraction += frameDelay * demo.play.speed; demo.play.time += (int)demo.play.fraction; demo.play.fraction -= (int)demo.play.fraction; } else if ( demo.find ) { demo.play.time = demo.play.oldTime + 20; demo.play.fraction = 0; if ( demo.play.paused ) demo.find = findNone; } else if (!demo.play.paused) { float delta = demo.play.fraction + deltaTime * demo.play.speed; demo.play.time += (int)delta; demo.play.fraction = delta - (int)delta; } demo.play.lastTime = demo.play.time; if ( demo.loop.total && captureFrame && blurTotal ) { //Delay till we hit the right part at the start int time; float timeFraction; if ( demo.loop.lineDelay && !blurIndex ) { time = demo.loop.start - demo.loop.lineDelay; timeFraction = 0; if ( demo.loop.lineDelay > 8 ) demo.loop.lineDelay -= 8; else demo.loop.lineDelay = 0; captureFrame = qfalse; } else { if ( blurIndex == blurTotal - 1 ) { //We'll restart back to the start again demo.loop.lineDelay = 2000; if ( ++demo.loop.index >= demo.loop.total ) { demo.loop.total = 0; } } time = demo.loop.start; timeFraction = demo.loop.range * blurFraction; } time += (int)timeFraction; timeFraction -= (int)timeFraction; lineAt( time, timeFraction, &demo.line.time, &cg.timeFraction, &frameSpeed ); } else { lineAt( demo.play.time, demo.play.fraction, &demo.line.time, &cg.timeFraction, &frameSpeed ); } /* Set the correct time */ cg.time = trap_MME_SeekTime( demo.line.time ); /* cg.time is shifted ahead a bit to correct some issues.. */ frameSpeed *= demo.play.speed; cg.frametime = (cg.time - cg.oldTime) + (cg.timeFraction - cg.oldTimeFraction); if (cg.frametime < 0) { int i; cg.frametime = 0; hadSkip = qtrue; cg.oldTime = cg.time; cg.oldTimeFraction = cg.timeFraction; CG_InitLocalEntities(); CG_InitMarkPolys(); CG_ClearParticles (); trap_FX_Reset( ); trap_R_DecalReset(); cg.centerPrintTime = 0; cg.damageTime = 0; cg.powerupTime = 0; cg.rewardTime = 0; cg.scoreFadeTime = 0; cg.lastKillTime = 0; cg.attackerTime = 0; cg.soundTime = 0; cg.itemPickupTime = 0; cg.itemPickupBlendTime = 0; cg.weaponSelectTime = 0; cg.headEndTime = 0; cg.headStartTime = 0; cg.v_dmg_time = 0; cg.rewardCount[0] = 0; cg.rewardStack = 0; cg.rewardTime = 0; trap_S_ClearLoopingSounds(qtrue); for (i = 0; i < MAX_CHATBOX_ITEMS; i++) cg.chatItems[i].time = 0; } else if (cg.frametime > 100) { hadSkip = qtrue; } else { hadSkip = qfalse; } /* Make sure the random seed is the same each time we hit this frame */ srand( (cg.time % 10000000) + cg.timeFraction * 1000); /* Prepare to render the screen */ trap_S_ClearLoopingSounds(qfalse); trap_R_ClearScene(); /* Update demo related information */ trap_SetUserCmdValue( cg.weaponSelect, 1 ); demoProcessSnapShots( hadSkip ); if ( !cg.snap ) { CG_DrawInformation(); return; } CG_PreparePacketEntities( ); CG_DemosUpdatePlayer( ); chaseUpdate( demo.play.time, demo.play.fraction ); cameraUpdate( demo.play.time, demo.play.fraction ); dofUpdate( demo.play.time, demo.play.fraction ); demoEffectUpdate( demo.play.time, demo.play.fraction ); cg.clientFrame++; // update cg.predictedPlayerState CG_InterpolatePlayerState( qfalse ); BG_PlayerStateToEntityState( &cg.predictedPlayerState, &cg.predictedPlayerEntity.currentState, qfalse ); if ( cg.cpma.detected ) { if ( cg.predictedPlayerState.pm_type >= 4 ) cg.predictedPlayerEntity.currentState.eType = ET_INVISIBLE; } cg.predictedPlayerEntity.currentValid = qtrue; VectorCopy( cg.predictedPlayerEntity.currentState.pos.trBase, cg.predictedPlayerEntity.lerpOrigin ); VectorCopy( cg.predictedPlayerEntity.currentState.apos.trBase, cg.predictedPlayerEntity.lerpAngles ); inwater = demoSetupView(); CG_TileClear(); trap_FX_Begin( cg.time, cg.timeFraction ); scriptRun( hadSkip ); CG_AddPacketEntities(); CG_AddMarks(); CG_AddParticles (); CG_AddLocalEntities(); if ( cg.playerCent == &cg.predictedPlayerEntity ) { // warning sounds when powerup is wearing off CG_PowerupTimerSounds(); CG_AddViewWeapon( &cg.predictedPlayerState ); } else if ( cg.playerCent && cg.playerCent->currentState.number < MAX_CLIENTS ) { CG_AddViewWeaponDirect( cg.playerCent ); } trap_S_UpdateEntityPosition(ENTITYNUM_NONE, cg.refdef.vieworg); CG_PlayBufferedSounds(); CG_PlayBufferedVoiceChats(); cg.refdef.time = cg.time; memcpy( cg.refdef.areamask, cg.snap->areamask, sizeof( cg.refdef.areamask ) ); /* Render some extra demo related stuff */ if (!captureFrame) { switch (demo.editType) { case editCamera: cameraDraw( demo.play.time, demo.play.fraction ); break; case editChase: chaseDraw( demo.play.time, demo.play.fraction ); break; case editDof: dofDraw( demo.play.time, demo.play.fraction ); break; case editEffect: demoEffectDraw( demo.play.time, demo.play.fraction ); break; } /* Add bounding boxes for easy aiming */ if ( demo.editType && ( demo.cmd.buttons & BUTTON_ATTACK) && ( demo.cmd.buttons & BUTTON_AFFIRMATIVE) ) { int i; centity_t *targetCent; for (i = 0;i<MAX_GENTITIES;i++) { targetCent = demoTargetEntity( i ); if (targetCent) { vec3_t container, traceStart, traceImpact, forward; const float *color; demoCentityBoxSize( targetCent, container ); VectorSubtract( demo.viewOrigin, targetCent->lerpOrigin, traceStart ); AngleVectors( demo.viewAngles, forward, 0, 0 ); if (BoxTraceImpact( traceStart, forward, container, traceImpact )) { color = colorRed; } else { color = colorYellow; } demoDrawBox( targetCent->lerpOrigin, container, color ); } } } if ( mov_gridStep.value > 0 && mov_gridRange.value > 0) { vec4_t color; vec3_t offset; qhandle_t shader = trap_R_RegisterShader( "mme/gridline" ); color[0] = color[1] = color[2] = 1; color[3] = 0; offset[0] = offset[1] = offset[2] = 0; Q_parseColor( mov_gridColor.string, ospColors, color ); demoDrawGrid( demo.viewOrigin, color, offset, mov_gridWidth.value, mov_gridStep.value, mov_gridRange.value, shader ); } } if (frameSpeed > 5) frameSpeed = 5; trap_S_UpdateScale( frameSpeed ); if (cg.playerCent && cg.predictedPlayerState.pm_type == PM_INTERMISSION) { entityNum = cg.snap->ps.clientNum; } else if (cg.playerCent) { entityNum = cg.playerCent->currentState.number; } else { entityNum = ENTITYNUM_NONE; } trap_S_Respatialize( entityNum, cg.refdef.vieworg, cg.refdef.viewaxis, inwater); trap_FX_End(); if (captureFrame && stereoSep > 0.0f) trap_Cvar_Set("r_stereoSeparation", va("%f", -stereoSep)); trap_MME_TimeFraction(cg.timeFraction); trap_R_RenderScene( &cg.refdef ); if ( demo.viewType == viewChase && cg.playerCent && ( cg.playerCent->currentState.number < MAX_CLIENTS ) ) CG_Draw2D(); // CG_DrawSmallString( 0, 0, va( "height %d", cg.playerCent->pe.viewHeight ), 1 ); if (captureFrame) { char fileName[MAX_OSPATH]; Com_sprintf( fileName, sizeof( fileName ), "capture/%s/%s", mme_demoFileName.string, mov_captureName.string ); trap_MME_Capture( fileName, captureFPS, demo.viewFocus, demo.viewRadius ); if ( mov_captureCamera.integer ) demoAddViewPos( fileName, demo.viewOrigin, demo.viewAngles, demo.viewFov ); } else { if (demo.editType && !cg.playerCent) demoDrawCrosshair(); hudDraw(); if (demo.editType) { demoDrawProgress(trap_MME_ProgressTime()); } } //checkCaptureEnd: if ( demo.capture.active && demo.capture.locked && demo.play.time > demo.capture.end ) { Com_Printf( "Capturing ended\n" ); if (demo.autoLoad) { trap_SendConsoleCommand( "disconnect\n" ); } demo.capture.active = qfalse; } }
/* =============== CG_MapRestart The server has issued a map_restart, so the next snapshot is completely new and should not be interpolated to. A tournement restart will clear everything, but doesn't require a reload of all the media =============== */ static void CG_MapRestart( void ) { // char buff[64]; int i; if ( cg_showmiss.integer ) { CG_Printf( "CG_MapRestart\n" ); } memset( &cg.lastWeapSelInBank[0], 0, MAX_WEAP_BANKS * sizeof( int ) ); // clear weapon bank selections cg.centerPrintTime = 0; // reset centerprint counter so previous messages don't re-appear cg.itemPickupTime = 0; // reset item pickup counter so previous messages don't re-appear cg.cursorHintFade = 0; // reset cursor hint timer cg.yougotmailTime = 0; // reset // (SA) clear zoom (so no warpies) cg.zoomedBinoc = qfalse; cg.zoomedBinoc = cg.zoomedScope = qfalse; cg.zoomTime = 0; cg.zoomval = 0; // reset fog to world fog (if present) // trap_R_SetFog(FOG_CMD_SWITCHFOG, FOG_MAP,20,0,0,0,0); // trap_Cvar_VariableStringBuffer("r_mapFogColor", buff, sizeof(buff)); // trap_SendClientCommand(va("fogswitch %s", buff) ); CG_InitLocalEntities(); CG_InitMarkPolys(); //Rafael particles CG_ClearParticles(); // done. for ( i = 1; i < MAX_PARTICLES_AREAS; i++ ) { { int rval; rval = CG_NewParticleArea( CS_PARTICLES + i ); if ( !rval ) { break; } } } // Ridah, trails CG_ClearTrails(); // done. // Ridah CG_ClearFlameChunks(); CG_SoundInit(); // done. // RF, init ZombieFX trap_RB_ZombieFXAddNewHit( -1, NULL, NULL ); // make sure the "3 frags left" warnings play again cg.fraglimitWarnings = 0; cg.timelimitWarnings = 0; cg.intermissionStarted = qfalse; cgs.voteTime = 0; cg.lightstylesInited = qfalse; cg.mapRestart = qtrue; CG_StartMusic(); trap_S_ClearLoopingSounds( qtrue ); // we really should clear more parts of cg here and stop sounds cg.v_dmg_time = 0; cg.v_noFireTime = 0; cg.v_fireTime = 0; // RF, clear out animScriptData so we recalc everything and get new pointers from server memset( cgs.animScriptData.modelInfo, 0, sizeof( cgs.animScriptData.modelInfo ) ); for ( i = 0; i < MAX_CLIENTS; i++ ) { if ( cgs.clientinfo[i].infoValid ) { CG_LoadClientInfo( &cgs.clientinfo[i] ); // re-register the valid clients } } // always clear the weapon selection cg.weaponSelect = WP_NONE; // clear out the player weapon info memset( &cg_entities[0].pe.weap, 0, sizeof( cg_entities[0].pe.weap ) ); // check for server set weapons we might not know about // (FIXME: this is a hack for the time being since a scripted "selectweapon" does // not hit the first snap, the server weapon set in cg_playerstate.c line 219 doesn't // do the trick) if ( !cg.weaponSelect ) { if ( cg_loadWeaponSelect.integer > 0 ) { cg.weaponSelect = cg_loadWeaponSelect.integer; cg.weaponSelectTime = cg.time; trap_Cvar_Set( "cg_loadWeaponSelect", "0" ); // turn it off } } // clear out rumble effects memset( cg.cameraShake, 0, sizeof( cg.cameraShake ) ); memset( cg.cameraShakeAngles, 0, sizeof( cg.cameraShakeAngles ) ); cg.rumbleScale = 0; // play the "fight" sound if this is a restart without warmup // if ( cg.warmup == 0 /* && cgs.gametype == GT_TOURNAMENT */) { // trap_S_StartLocalSound( cgs.media.countFightSound, CHAN_ANNOUNCER ); // CG_CenterPrint( "FIGHT!", 120, GIANTCHAR_WIDTH*2 ); // } #ifdef MISSIONPACK if ( cg_singlePlayerActive.integer ) { trap_Cvar_Set( "ui_matchStartTime", va( "%i", cg.time ) ); if ( cg_recordSPDemo.integer && cg_recordSPDemoName.string && *cg_recordSPDemoName.string ) { trap_SendConsoleCommand( va( "set g_synchronousclients 1 ; record %s \n", cg_recordSPDemoName.string ) ); } } #endif trap_Cvar_Set( "cg_thirdPerson", "0" ); }
/* ================= CG_RegisterGraphics This function may execute for a couple of minutes with a slow disk. ================= */ static void CG_RegisterGraphics( void ) { int i; const char *str; // clear any references to old media memset( &cg.refdef, 0, sizeof( cg.refdef ) ); trap_R_ClearScene(); CG_LoadingString( cgs.mapname ); trap_R_LoadWorldMap( cgs.mapname ); // precache status bar pics CG_LoadingString( "game media" ); cgs.media.crosshairShader[0] = trap_R_RegisterShader( "gfx/2d/BLANK" ); cgs.media.crosshairShader[1] = trap_R_RegisterShader( "textures/hud/crosshair" ); cgs.media.crosshairShader[2] = trap_R_RegisterShader( "gfx/2d/crosshair" ); cgs.media.backTileShader = trap_R_RegisterShader( "gfx/2d/backtile" ); cgs.media.shadowMarkShader = trap_R_RegisterShader( "markShadow" ); cgs.media.wakeMarkShader = trap_R_RegisterShader( "wake" ); // su44: MoHAA zoom overlays cgs.media.zoomOverlayShader = trap_R_RegisterShader("textures/hud/zoomoverlay"); cgs.media.kar98TopOverlayShader = trap_R_RegisterShader("textures/hud/kartop.tga"); cgs.media.kar98BottomOverlayShader = trap_R_RegisterShader("textures/hud/karbottom.tga"); cgs.media.binocularsOverlayShader = trap_R_RegisterShader("textures/hud/binocularsoverlay"); // register the inline models cgs.numInlineModels = trap_CM_NumInlineModels(); for ( i = 1 ; i < cgs.numInlineModels ; i++ ) { char name[10]; vec3_t mins, maxs; int j; Com_sprintf( name, sizeof(name), "*%i", i ); cgs.inlineDrawModel[i] = trap_R_RegisterModel( name ); trap_R_ModelBounds( cgs.inlineDrawModel[i], mins, maxs ); for ( j = 0 ; j < 3 ; j++ ) { cgs.inlineModelMidpoints[i][j] = mins[j] + 0.5 * ( maxs[j] - mins[j] ); } } // register all the server specified models for (i=1 ; i<MAX_MODELS ; i++) { const char *modelName; modelName = CG_ConfigString( CS_MODELS+i ); if ( !modelName[0] ) { break; } cgs.gameModels[i] = trap_R_RegisterModel( modelName ); if( modelName[0] != '*') { cgs.gameTIKIs[i] = trap_TIKI_RegisterModel( modelName ); if(cgs.gameTIKIs[i] == 0) { CG_Printf("CG_RegisterGraphics: failed to load tiki file %s (%i)\n",modelName,i); } } } for (i=0; i<64; i++) { const char *itemName; itemName = CG_ConfigString( CS_WEAPONS+i ); if(itemName[0]) { CG_RegisterItemName(i, itemName); } } for( i = CS_RAIN_DENSITY; i != (CS_RAIN_NUMSHADERS+1); i++) { str = CG_ConfigString( i ); CG_RainCSUpdated(i,str); } str = CG_ConfigString( CS_FOGINFO ); sscanf(str, "%d %f %f %f %f", &cg.farplane_cull, &cg.farplane_distance, &cg.farplane_color[0], &cg.farplane_color[1], &cg.farplane_color[2]); CG_ClearParticles (); }