int BG_GetUIPortrait(const int team, const short classIndex, const short cntIndex) { int count = 0,i; siegeTeam_t *stm; stm = BG_SiegeFindThemeForTeam(team); if (!stm) { return(0); } // Loop through all the classes for this team for (i=0;i<stm->numClasses;i++) { // does it match the base class? if (stm->classes[i]->playerClass == classIndex) { if (count==cntIndex) { return(stm->classes[i]->uiPortraitShader); } ++count; } } return(0); }
void CG_PrecachePlayersForSiegeTeam( int team ) { siegeTeam_t *stm; int i; stm = BG_SiegeFindThemeForTeam( team ); if ( !stm ) return; for ( i = 0; i < stm->numClasses; i++ ) { siegeClass_t *scl = stm->classes[i]; if ( scl->forcedModel[0] ) { clientInfo_t fake; memset( &fake, 0, sizeof(fake) ); Q_strncpyz( fake.modelName, scl->forcedModel, sizeof(fake.modelName) ); trap->R_RegisterModel( va( "models/players/%s/model.glm", scl->forcedModel ) ); if ( scl->forcedSkin[0] ) { trap->R_RegisterSkin( va( "models/players/%s/model_%s.skin", scl->forcedModel, scl->forcedSkin ) ); Q_strncpyz( fake.skinName, scl->forcedSkin, sizeof(fake.skinName) ); } else Q_strncpyz( fake.skinName, "default", sizeof(fake.skinName) ); //precache the sounds for the model... CG_LoadCISounds( &fake, qtrue ); } } }
void CG_PrecachePlayersForSiegeTeam(int team) { siegeTeam_t *stm; int i = 0; stm = BG_SiegeFindThemeForTeam(team); if (!stm) { //invalid team/no theme for team? return; } while (i < stm->numClasses) { siegeClass_t *scl = stm->classes[i]; if (scl->forcedModel[0]) { clientInfo_t fake; memset(&fake, 0, sizeof(fake)); strcpy(fake.modelName, scl->forcedModel); trap->R_RegisterModel(va("models/players/%s/model.glm", scl->forcedModel)); //precache the sounds for the model... CG_LoadCISounds(&fake, qtrue); } i++; } }
//go through all classes on a team and register their //weapons and items for precaching. void G_SiegeRegisterWeaponsAndHoldables( int team ) { siegeTeam_t *stm = BG_SiegeFindThemeForTeam( team ); if ( stm ) { int i = 0; siegeClass_t *scl; while ( i < stm->numClasses ) { scl = stm->classes[i]; if ( scl ) { int j = 0; while ( j < WP_NUM_WEAPONS ) { if ( scl->weapons & (1 << j) ) { //we use this weapon so register it. RegisterItem( BG_FindItemForWeapon( j ) ); } j++; } j = 0; while ( j < HI_NUM_HOLDABLE ) { if ( scl->invenItems & (1 << j) ) { //we use this item so register it. RegisterItem( BG_FindItemForHoldable( j ) ); } j++; } } i++; } } }
void BG_PrecacheSabersForSiegeTeam(int team) { siegeTeam_t *t; saberInfo_t saber; char *saberName; int sNum; t = BG_SiegeFindThemeForTeam(team); if (t) { int i = 0; while (i < t->numClasses) { sNum = 0; while (sNum < MAX_SABERS) { switch (sNum) { case 0: saberName = &t->classes[i]->saber1[0]; break; case 1: saberName = &t->classes[i]->saber2[0]; break; default: saberName = NULL; break; } if (saberName && saberName[0]) { WP_SaberParseParms(saberName, &saber); if (!Q_stricmp(saberName, saber.name)) { //found the matching saber if (saber.model[0]) { BG_ModelCache(saber.model, NULL); } } } sNum++; } i++; } } }
// Count the number of like base classes int BG_SiegeCountBaseClass( const int team, const short classIndex ) { int count = 0, i; siegeTeam_t *stm; stm = BG_SiegeFindThemeForTeam( team ); if ( !stm ) { return(0); } for ( i = 0; i < stm->numClasses; i++ ) { if ( stm->classes[i]->playerClass == classIndex ) { count++; } } return(count); }
void CG_InitSiegeMode(void) { char levelname[MAX_QPATH]; char btime[1024]; char teams[2048]; char teamInfo[MAX_SIEGE_INFO_SIZE]; int len = 0; int i = 0; int j = 0; siegeClass_t *cl; siegeTeam_t *sTeam; fileHandle_t f; char teamIcon[128]; if (cgs.gametype != GT_SIEGE) { goto failure; } Com_sprintf(levelname, sizeof(levelname), "%s\0", cgs.mapname); i = strlen(levelname)-1; while (i > 0 && levelname[i] && levelname[i] != '.') { i--; } if (!i) { goto failure; } levelname[i] = '\0'; //kill the ".bsp" Com_sprintf(levelname, sizeof(levelname), "%s.siege\0", levelname); if (!levelname || !levelname[0]) { goto failure; } len = trap_FS_FOpenFile(levelname, &f, FS_READ); if (!f || len >= MAX_SIEGE_INFO_SIZE) { goto failure; } trap_FS_Read(siege_info, len, f); trap_FS_FCloseFile(f); siege_valid = 1; if (BG_SiegeGetValueGroup(siege_info, "Teams", teams)) { char buf[1024]; //[SIEGECVARFIX] siege_Cvar_VariableStringBuffer("cg_siegeTeam1", buf, 1024); //trap_Cvar_VariableStringBuffer("cg_siegeTeam1", buf, 1024); //[SIEGECVARFIX] if (buf[0] && Q_stricmp(buf, "none")) { strcpy(team1, buf); } else { BG_SiegeGetPairedValue(teams, "team1", team1); } if (team1[0] == '@') { //it's a damn stringed reference. char b[256]; trap_SP_GetStringTextString(team1+1, b, 256); trap_Cvar_Set("cg_siegeTeam1Name", b); } else { trap_Cvar_Set("cg_siegeTeam1Name", team1); } //[SIEGECVARFIX] siege_Cvar_VariableStringBuffer("cg_siegeTeam2", buf, 1024); //trap_Cvar_VariableStringBuffer("cg_siegeTeam2", buf, 1024); //[/SIEGECVARFIX] if (buf[0] && Q_stricmp(buf, "none")) { strcpy(team2, buf); } else { BG_SiegeGetPairedValue(teams, "team2", team2); } if (team2[0] == '@') { //it's a damn stringed reference. char b[256]; trap_SP_GetStringTextString(team2+1, b, 256); trap_Cvar_Set("cg_siegeTeam2Name", b); } else { trap_Cvar_Set("cg_siegeTeam2Name", team2); } } else { CG_Error("Siege teams not defined"); } if (BG_SiegeGetValueGroup(siege_info, team1, teamInfo)) { if (BG_SiegeGetPairedValue(teamInfo, "TeamIcon", teamIcon)) { trap_Cvar_Set( "team1_icon", teamIcon); } if (BG_SiegeGetPairedValue(teamInfo, "Timed", btime)) { team1Timed = atoi(btime)*1000; CG_SetSiegeTimerCvar ( team1Timed ); } else { team1Timed = 0; } } else { CG_Error("No team entry for '%s'\n", team1); } if (BG_SiegeGetPairedValue(siege_info, "mapgraphic", teamInfo)) { trap_Cvar_Set("siege_mapgraphic", teamInfo); } else { trap_Cvar_Set("siege_mapgraphic", "gfx/mplevels/siege1_hoth"); } if (BG_SiegeGetPairedValue(siege_info, "missionname", teamInfo)) { trap_Cvar_Set("siege_missionname", teamInfo); } else { trap_Cvar_Set("siege_missionname", " "); } if (BG_SiegeGetValueGroup(siege_info, team2, teamInfo)) { if (BG_SiegeGetPairedValue(teamInfo, "TeamIcon", teamIcon)) { trap_Cvar_Set( "team2_icon", teamIcon); } if (BG_SiegeGetPairedValue(teamInfo, "Timed", btime)) { team2Timed = atoi(btime)*1000; CG_SetSiegeTimerCvar ( team2Timed ); } else { team2Timed = 0; } } else { CG_Error("No team entry for '%s'\n", team2); } //Load the player class types BG_SiegeLoadClasses(NULL); if (!bgNumSiegeClasses) { //We didn't find any?! CG_Error("Couldn't find any player classes for Siege"); } //Now load the teams since we have class data. BG_SiegeLoadTeams(); if (!bgNumSiegeTeams) { //React same as with classes. CG_Error("Couldn't find any player teams for Siege"); } //Get and set the team themes for each team. This will control which classes can be //used on each team. if (BG_SiegeGetValueGroup(siege_info, team1, teamInfo)) { if (BG_SiegeGetPairedValue(teamInfo, "UseTeam", btime)) { BG_SiegeSetTeamTheme(SIEGETEAM_TEAM1, btime); } if (BG_SiegeGetPairedValue(teamInfo, "FriendlyShader", btime)) { cgSiegeTeam1PlShader = trap_R_RegisterShaderNoMip(btime); } else { cgSiegeTeam1PlShader = 0; } } if (BG_SiegeGetValueGroup(siege_info, team2, teamInfo)) { if (BG_SiegeGetPairedValue(teamInfo, "UseTeam", btime)) { BG_SiegeSetTeamTheme(SIEGETEAM_TEAM2, btime); } if (BG_SiegeGetPairedValue(teamInfo, "FriendlyShader", btime)) { cgSiegeTeam2PlShader = trap_R_RegisterShaderNoMip(btime); } else { cgSiegeTeam2PlShader = 0; } } //Now go through the classes used by the loaded teams and try to precache //any forced models or forced skins. i = SIEGETEAM_TEAM1; while (i <= SIEGETEAM_TEAM2) { j = 0; sTeam = BG_SiegeFindThemeForTeam(i); if (!sTeam) { i++; continue; } //Get custom team shaders while we're at it. if (i == SIEGETEAM_TEAM1) { cgSiegeTeam1PlShader = sTeam->friendlyShader; } else if (i == SIEGETEAM_TEAM2) { cgSiegeTeam2PlShader = sTeam->friendlyShader; } while (j < sTeam->numClasses) { cl = sTeam->classes[j]; if (cl->forcedModel[0]) { //This class has a forced model, so precache it. trap_R_RegisterModel(va("models/players/%s/model.glm", cl->forcedModel)); if (cl->forcedSkin[0]) { //also has a forced skin, precache it. char *useSkinName; if (strchr(cl->forcedSkin, '|')) {//three part skin useSkinName = va("models/players/%s/|%s", cl->forcedModel, cl->forcedSkin); } else { useSkinName = va("models/players/%s/model_%s.skin", cl->forcedModel, cl->forcedSkin); } trap_R_RegisterSkin(useSkinName); } } j++; } i++; } //precache saber data for classes that use sabers on both teams BG_PrecacheSabersForSiegeTeam(SIEGETEAM_TEAM1); BG_PrecacheSabersForSiegeTeam(SIEGETEAM_TEAM2); CG_PrecachePlayersForSiegeTeam(SIEGETEAM_TEAM1); CG_PrecachePlayersForSiegeTeam(SIEGETEAM_TEAM2); CG_PrecachePlayersForSiegeTeam(SIEGETEAM_TEAM1); CG_PrecachePlayersForSiegeTeam(SIEGETEAM_TEAM2); CG_PrecacheSiegeObjectiveAssetsForTeam(SIEGETEAM_TEAM1); CG_PrecacheSiegeObjectiveAssetsForTeam(SIEGETEAM_TEAM2); return; failure: siege_valid = 0; }
void CG_InitSiegeMode( void ) { char levelname[MAX_QPATH] = {}; char btime[1024] = {}; char teams[2048] = {}; char teamIcon[MAX_QPATH] = {}; const char *s; int len = 0, i = 0, j = 0; siegeClass_t *cl; siegeTeam_t *sTeam; fileHandle_t f; s = CG_ConfigString( CS_SIEGE_STATE ); if ( s[0] ) { CG_ParseSiegeState( s ); } s = CG_ConfigString( CS_SIEGE_WINTEAM ); if ( s[0] ) { cg_siegeWinTeam = atoi( s ); } if ( cgs.gametype == GT_SIEGE ) { CG_ParseSiegeObjectiveStatus( CG_ConfigString( CS_SIEGE_OBJECTIVES ) ); cg_beatingSiegeTime = atoi( CG_ConfigString( CS_SIEGE_TIMEOVERRIDE ) ); if ( cg_beatingSiegeTime ) { CG_SetSiegeTimerCvar( cg_beatingSiegeTime ); } } if ( cgs.gametype != GT_SIEGE ) { goto failure; } // grab the .siege file Com_sprintf( levelname, sizeof(levelname), "maps/%s.siege", cgs.mapnameClean ); len = trap->FS_Open( levelname, &f, FS_READ ); if ( !f || len <= 0 || len >= MAX_SIEGE_INFO_SIZE ) { goto failure; } trap->FS_Read( siege_info, len, f ); trap->FS_Close( f ); siege_valid = qtrue; if ( BG_SiegeGetValueGroup( siege_info, "Teams", teams ) ) { char buf[1024]; trap->Cvar_VariableStringBuffer( "cg_siegeTeam1", buf, sizeof(buf) ); if ( buf[0] && Q_stricmp( buf, "none" ) ) { Q_strncpyz( team1, buf, sizeof(team1) ); } else { BG_SiegeGetPairedValue( teams, "team1", team1 ); } if ( team1[0] == '@' ) { // it's a damn stringed reference. char b[256]; trap->SE_GetStringTextString( team1 + 1, b, sizeof(b) ); trap->Cvar_Set( "cg_siegeTeam1Name", b ); } else { trap->Cvar_Set( "cg_siegeTeam1Name", team1 ); } trap->Cvar_VariableStringBuffer( "cg_siegeTeam2", buf, sizeof(buf) ); if ( buf[0] && Q_stricmp( buf, "none" ) ) { Q_strncpyz( team2, buf, sizeof(team2) ); } else { BG_SiegeGetPairedValue( teams, "team2", team2 ); } if ( team2[0] == '@' ) { // it's a damn stringed reference. char b[256]; trap->SE_GetStringTextString( team2 + 1, b, sizeof(b) ); trap->Cvar_Set( "cg_siegeTeam2Name", b ); } else { trap->Cvar_Set( "cg_siegeTeam2Name", team2 ); } } else { trap->Error( ERR_DROP, "Siege teams not defined" ); } static char teamInfo[MAX_SIEGE_INFO_SIZE] = {}; teamInfo[0] = '\0'; if ( BG_SiegeGetValueGroup( siege_info, team1, teamInfo ) ) { if ( BG_SiegeGetPairedValue( teamInfo, "TeamIcon", teamIcon ) ) trap->Cvar_Set( "team1_icon", teamIcon ); if ( BG_SiegeGetPairedValue( teamInfo, "Timed", btime ) ) { team1Timed = atoi( btime ) * 1000; CG_SetSiegeTimerCvar( team1Timed ); } else { team1Timed = 0; } } else { trap->Error( ERR_DROP, "No team entry for '%s'\n", team1 ); } if ( BG_SiegeGetPairedValue( siege_info, "mapgraphic", teamInfo ) ) { trap->Cvar_Set( "siege_mapgraphic", teamInfo ); } else { trap->Cvar_Set( "siege_mapgraphic", "gfx/mplevels/siege1_hoth" ); } if ( BG_SiegeGetPairedValue( siege_info, "missionname", teamInfo ) ) { trap->Cvar_Set( "siege_missionname", teamInfo ); } else { trap->Cvar_Set( "siege_missionname", " " ); } if ( BG_SiegeGetValueGroup( siege_info, team2, teamInfo ) ) { if ( BG_SiegeGetPairedValue( teamInfo, "TeamIcon", teamIcon ) ) { trap->Cvar_Set( "team2_icon", teamIcon ); } if ( BG_SiegeGetPairedValue( teamInfo, "Timed", btime ) ) { team2Timed = atoi( btime ) * 1000; CG_SetSiegeTimerCvar( team2Timed ); } else { team2Timed = 0; } } else { trap->Error( ERR_DROP, "No team entry for '%s'\n", team2 ); } //Load the player class types BG_SiegeLoadClasses( NULL ); if ( !bgNumSiegeClasses ) { trap->Error( ERR_DROP, "Couldn't find any player classes for Siege" ); } //Now load the teams since we have class data. BG_SiegeLoadTeams(); if ( !bgNumSiegeTeams ) { trap->Error( ERR_DROP, "Couldn't find any player teams for Siege" ); } // Get and set the team themes for each team. This will control which classes can be used on each team. if ( BG_SiegeGetValueGroup( siege_info, team1, teamInfo ) ) { if ( BG_SiegeGetPairedValue( teamInfo, "UseTeam", btime ) ) { BG_SiegeSetTeamTheme( SIEGETEAM_TEAM1, btime ); } if ( BG_SiegeGetPairedValue( teamInfo, "FriendlyShader", btime ) ) { cgSiegeTeam1PlShader = trap->R_RegisterShaderNoMip( btime ); } else { cgSiegeTeam1PlShader = 0; } } if ( BG_SiegeGetValueGroup( siege_info, team2, teamInfo ) ) { if ( BG_SiegeGetPairedValue( teamInfo, "UseTeam", btime ) ) { BG_SiegeSetTeamTheme( SIEGETEAM_TEAM2, btime ); } if ( BG_SiegeGetPairedValue( teamInfo, "FriendlyShader", btime ) ) { cgSiegeTeam2PlShader = trap->R_RegisterShaderNoMip( btime ); } else { cgSiegeTeam2PlShader = 0; } } //Now go through the classes used by the loaded teams and try to precache any forced models or forced skins. for ( i = SIEGETEAM_TEAM1; i <= SIEGETEAM_TEAM2; i++ ) { sTeam = BG_SiegeFindThemeForTeam( i ); if ( !sTeam ) { continue; } //Get custom team shaders while we're at it. if ( i == SIEGETEAM_TEAM1 ) cgSiegeTeam1PlShader = sTeam->friendlyShader; else if ( i == SIEGETEAM_TEAM2 ) cgSiegeTeam2PlShader = sTeam->friendlyShader; for ( j = 0; j < sTeam->numClasses; j++ ) { cl = sTeam->classes[j]; if ( cl->forcedModel[0] ) { // This class has a forced model, so precache it. trap->R_RegisterModel( va( "models/players/%s/model.glm", cl->forcedModel ) ); if ( cl->forcedSkin[0] ) { // also has a forced skin, precache it. char useSkinName[MAX_QPATH]; if ( strchr( cl->forcedSkin, '|' ) ) { Com_sprintf( useSkinName, sizeof(useSkinName), "models/players/%s/|%s", cl->forcedModel, cl->forcedSkin ); } else { Com_sprintf( useSkinName, sizeof(useSkinName), "models/players/%s/model_%s.skin", cl->forcedModel, cl->forcedSkin ); } trap->R_RegisterSkin( useSkinName ); } } } } //precache saber data for classes that use sabers on both teams BG_PrecacheSabersForSiegeTeam( SIEGETEAM_TEAM1 ); BG_PrecacheSabersForSiegeTeam( SIEGETEAM_TEAM2 ); CG_PrecachePlayersForSiegeTeam( SIEGETEAM_TEAM1 ); CG_PrecachePlayersForSiegeTeam( SIEGETEAM_TEAM2 ); CG_PrecachePlayersForSiegeTeam( SIEGETEAM_TEAM1 ); CG_PrecachePlayersForSiegeTeam( SIEGETEAM_TEAM2 ); CG_PrecacheSiegeObjectiveAssetsForTeam( SIEGETEAM_TEAM1 ); CG_PrecacheSiegeObjectiveAssetsForTeam( SIEGETEAM_TEAM2 ); return; failure: siege_valid = qfalse; }