// *** Map Restart *** int G_MapRestart_v(gentity_t *ent, unsigned int dwVoteIndex, char *arg, char *arg2, qboolean fRefereeCmd) { char serverinfo[MAX_INFO_STRING]; trap_GetServerinfo(serverinfo, sizeof (serverinfo)); // Vote request (vote is being initiated) if (arg) { // suburb, if map voting disabled, also disable maprestart if (!vote_allow_map.integer && ent && !ent->client->sess.referee) { G_voteDisableMessage(ent, arg); G_voteCurrentSetting(ent, arg, Info_ValueForKey(serverinfo, "mapname")); return G_INVALID; } if (trap_Argc() > 2) { if (!Q_stricmp(arg2, "?")) { G_refPrintf(ent, "Usage: ^3%s %s%s\n", ((fRefereeCmd) ? "\\ref" : "\\callvote"), arg, aVoteInfo[dwVoteIndex].pszVoteHelp); return(G_INVALID); } } } else { // Restart the map G_delay_map_change(Info_ValueForKey(serverinfo, "mapname"), 0); } return(G_OK); }
// *** Map - simpleton: we dont verify map is allowed/exists *** int G_Map_v(gentity_t *ent, unsigned int dwVoteIndex, char *arg, char *arg2, qboolean fRefereeCmd) { // Vote request (vote is being initiated) if (arg) { char serverinfo[MAX_INFO_STRING]; trap_GetServerinfo(serverinfo, sizeof (serverinfo)); if (!vote_allow_map.integer && ent && !ent->client->sess.referee) { G_voteDisableMessage(ent, arg); G_voteCurrentSetting(ent, arg, Info_ValueForKey(serverinfo, "mapname")); return G_INVALID; } else if (G_voteDescription(ent, fRefereeCmd, dwVoteIndex)) { G_voteCurrentSetting(ent, arg, Info_ValueForKey(serverinfo, "mapname")); return G_INVALID; } Com_sprintf(level.voteInfo.vote_value, VOTE_MAXSTRING, "%s", arg2); // Vote action (vote has passed) } else { // Nico, delay the map change G_delay_map_change(level.voteInfo.vote_value, 0); } return G_OK; }
// *** Campaign - simpleton: we dont verify map is allowed/exists *** int G_Campaign_v(gentity_t *ent, unsigned int dwVoteIndex, char *arg, char *arg2, qboolean fRefereeCmd) { // Vote request (vote is being initiated) if(arg) { char serverinfo[MAX_INFO_STRING]; trap_GetServerinfo(serverinfo, sizeof(serverinfo)); if(!vote_allow_map.integer && ent && !ent->client->sess.referee) { G_voteDisableMessage(ent, arg); if( g_gametype.integer == GT_WOLF_CAMPAIGN ) { G_voteCurrentSetting(ent, arg, g_campaigns[level.currentCampaign].shortname ); } return(G_INVALID); } else if(G_voteDescription(ent, fRefereeCmd, dwVoteIndex)) { if( g_gametype.integer == GT_WOLF_CAMPAIGN ) { G_voteCurrentSetting(ent, arg, g_campaigns[level.currentCampaign].shortname ); } return(G_INVALID); } Com_sprintf(level.voteInfo.vote_value, VOTE_MAXSTRING, "%s", arg2); // Vote action (vote has passed) } else { char s[MAX_STRING_CHARS]; trap_Cvar_VariableStringBuffer("nextcampaign", s, sizeof(s)); trap_SendConsoleCommand(EXEC_APPEND, va("campaign %s%s\n", level.voteInfo.vote_value, ((*s) ? va("; set nextcampaign \"%s\"", s) : ""))); } return(G_OK); }
/* ================== G_WriteSessionData ================== */ void G_WriteSessionData(qboolean restart) { int i; char strServerInfo[MAX_INFO_STRING]; int j; trap_GetServerinfo(strServerInfo, sizeof(strServerInfo)); trap_Cvar_Set("session", va("%i %i %s", g_gametype.integer, (teamInfo[TEAM_AXIS].spec_lock * TEAM_AXIS | teamInfo[TEAM_ALLIES].spec_lock * TEAM_ALLIES), Info_ValueForKey(strServerInfo, "mapname"))); // Keep stats for all players in sync for (i = 0; !level.fResetStats && i < level.numConnectedClients; i++) { if ((g_gamestate.integer == GS_WARMUP_COUNTDOWN && ((g_gametype.integer == GT_WOLF_STOPWATCH && level.clients[level.sortedClients[i]].sess.rounds >= 2) || (g_gametype.integer != GT_WOLF_STOPWATCH && level.clients[level.sortedClients[i]].sess.rounds >= 1)))) { level.fResetStats = qtrue; } } for (i = 0; i < level.numConnectedClients; i++) { if (level.clients[level.sortedClients[i]].pers.connected == CON_CONNECTED) { G_WriteClientSessionData(&level.clients[level.sortedClients[i]], restart); // For slow connecters and a short warmup } else if (level.fResetStats) { G_deleteStats(level.sortedClients[i]); } } for (i = 0; i < MAX_FIRETEAMS; i++) { char buffer[MAX_STRING_CHARS]; if (!level.fireTeams[i].inuse) { Com_sprintf(buffer, MAX_STRING_CHARS, "\\id\\-1"); } else { char buffer2[MAX_STRING_CHARS]; char p[8]; *buffer2 = '\0'; for (j = 0; j < MAX_CLIENTS; j++) { Com_sprintf(p, 8, " %i", level.fireTeams[i].joinOrder[j]); Q_strcat(buffer2, MAX_STRING_CHARS, p); } Com_sprintf(buffer, MAX_STRING_CHARS, "\\id\\%i\\i\\%s\\p\\%i", level.fireTeams[i].ident - 1, buffer2, level.fireTeams[i].priv ? 1 : 0); } trap_Cvar_Set(va("fireteam%i", i), buffer); } }
/* =============== G_InitBots =============== */ void G_InitBots( qboolean restart ) { int fragLimit; int timeLimit; const char *arenainfo; char *strValue; int basedelay; char map[MAX_QPATH]; char serverinfo[MAX_INFO_STRING]; G_LoadBots(); G_LoadArenas(); trap_Cvar_Register( &bot_minplayers, "bot_minplayers", "0", CVAR_SERVERINFO ); // leilei - additional ones trap_Cvar_Register( &bot_minplayersTime, "bot_minplayersTime", "10", CVAR_SERVERINFO ); if( g_gametype.integer == GT_SINGLE_PLAYER ) { trap_GetServerinfo( serverinfo, sizeof(serverinfo) ); Q_strncpyz( map, Info_ValueForKey( serverinfo, "mapname" ), sizeof(map) ); arenainfo = G_GetArenaInfoByMap( map ); if ( !arenainfo ) { return; } strValue = Info_ValueForKey( arenainfo, "fraglimit" ); fragLimit = atoi( strValue ); if ( fragLimit ) { trap_Cvar_Set( "fraglimit", strValue ); } else { trap_Cvar_Set( "fraglimit", "0" ); } strValue = Info_ValueForKey( arenainfo, "timelimit" ); timeLimit = atoi( strValue ); if ( timeLimit ) { trap_Cvar_Set( "timelimit", strValue ); } else { trap_Cvar_Set( "timelimit", "0" ); } if ( !fragLimit && !timeLimit ) { trap_Cvar_Set( "fraglimit", "10" ); trap_Cvar_Set( "timelimit", "0" ); } basedelay = BOT_BEGIN_DELAY_BASE; strValue = Info_ValueForKey( arenainfo, "special" ); if( Q_stricmp( strValue, "training" ) == 0 ) { basedelay += 10000; } if( !restart ) { G_SpawnBots( Info_ValueForKey( arenainfo, "bots" ), basedelay ); } } }
// TAT - create the server entities for the current map static void CreateMapServerEntities() { char info[1024]; char mapname[128]; trap_GetServerinfo(info, sizeof (info)); Q_strncpyz(mapname, Info_ValueForKey(info, "mapname"), sizeof (mapname)); }
/* ======================================================================================================================================= BotMapTitle ======================================================================================================================================= */ char *BotMapTitle(void) { char info[1024]; static char mapname[128]; trap_GetServerinfo(info, sizeof(info)); strncpy(mapname, Info_ValueForKey(info, "mapname"), sizeof(mapname) - 1); mapname[sizeof(mapname) - 1] = '\0'; return mapname; }
// *** Map - simpleton: we dont verify map is allowed/exists *** int G_Map_v(gentity_t *ent, unsigned int dwVoteIndex, char *arg, char *arg2, qboolean fRefereeCmd) { // Vote request (vote is being initiated) if(arg) { char serverinfo[MAX_INFO_STRING]; trap_GetServerinfo(serverinfo, sizeof(serverinfo)); if(!vote_allow_map.integer && ent && !ent->client->sess.referee) { G_voteDisableMessage(ent, arg); G_voteCurrentSetting(ent, arg, Info_ValueForKey(serverinfo, "mapname")); return(G_INVALID); } else if(G_voteDescription(ent, fRefereeCmd, dwVoteIndex)) { G_voteCurrentSetting(ent, arg, Info_ValueForKey(serverinfo, "mapname")); return(G_INVALID); } Com_sprintf(level.voteInfo.vote_value, VOTE_MAXSTRING, "%s", arg2); // Vote action (vote has passed) } else { int i; char s[MAX_STRING_CHARS]; if(!level.intermissiontime){ if(g_XPSave.integer & XPSF_STORE_AT_RESTART){ for( i = 0; i < level.numConnectedClients; i++ ) { G_xpsave_add(&g_entities[level.sortedClients[i]],qfalse); } if(g_spreeOptions.integer & SPREE_SAVE_RECORD_RESTART){ G_AddSpreeRecord(); } G_xpsave_writeconfig(); }else if(g_spreeOptions.integer & SPREE_SAVE_RECORD_RESTART){ G_xpsave_readconfig(); G_AddSpreeRecord(); G_xpsave_writeconfig(); } } G_reset_disconnects(); if( g_gametype.integer == GT_WOLF_CAMPAIGN ) { trap_Cvar_VariableStringBuffer("nextcampaign", s, sizeof(s)); trap_SendConsoleCommand(EXEC_APPEND, va("campaign %s%s\n", level.voteInfo.vote_value, ((*s) ? va("; set nextcampaign \"%s\"", s) : ""))); } else { Svcmd_ResetMatch_f(qtrue, qfalse); trap_Cvar_VariableStringBuffer("nextmap", s, sizeof(s)); trap_SendConsoleCommand(EXEC_APPEND, va("map %s%s\n", level.voteInfo.vote_value, ((*s) ? va("; set nextmap \"%s\"", s) : ""))); } } return(G_OK); }
void Svcmd_StartCam( void ) { char map[MAX_QPATH]; char serverinfo[MAX_INFO_STRING]; char path[MAX_QPATH]; trap_GetServerinfo( serverinfo, sizeof(serverinfo) ); Q_strncpyz( map, Info_ValueForKey( serverinfo, "mapname" ), sizeof(map) ); Com_sprintf( path, sizeof(path), "cutscenes\\%s\\scene.cfg", map); if( !FileExists(path) ) { G_Printf("%s does not exist\n", path); return; } trap_SendConsoleCommand( EXEC_APPEND, va("exec \"%s\"\n",path) ); level.cammode = qtrue; }
/* ================== G_WriteSessionData ================== */ void G_WriteSessionData(qboolean restart) { int i; char strServerInfo[MAX_INFO_STRING]; int j; trap_GetServerinfo(strServerInfo, sizeof (strServerInfo)); trap_Cvar_Set("session", va("%s", Info_ValueForKey(strServerInfo, "mapname"))); for (i = 0; i < level.numConnectedClients; ++i) { if (level.clients[level.sortedClients[i]].pers.connected == CON_CONNECTED) { G_WriteClientSessionData(&level.clients[level.sortedClients[i]], restart); // For slow connecters and a short warmup } } for (i = 0; i < MAX_FIRETEAMS; ++i) { char buffer[MAX_STRING_CHARS]; if (!level.fireTeams[i].inuse) { Com_sprintf(buffer, MAX_STRING_CHARS, "\\id\\-1"); } else { char buffer2[MAX_STRING_CHARS]; *buffer2 = '\0'; for (j = 0; j < MAX_CLIENTS; ++j) { char p[8]; Com_sprintf(p, 8, " %i", level.fireTeams[i].joinOrder[j]); Q_strcat(buffer2, MAX_STRING_CHARS, p); } Com_sprintf(buffer, MAX_STRING_CHARS, "\\id\\%i\\i\\%s\\p\\%i", level.fireTeams[i].ident - 1, buffer2, level.fireTeams[i].priv ? 1 : 0); } trap_Cvar_Set(va("fireteam%i", i), buffer); } }
/* ================== G_InitWorldSession ================== */ void G_InitWorldSession(void) { char s[MAX_STRING_CHARS]; int gt; int i, j; trap_Cvar_VariableStringBuffer("session", s, sizeof(s)); gt = atoi(s); // if the gametype changed since the last session, don't use any // client sessions if (g_gametype.integer != gt) { level.fResetStats = qtrue; G_Printf("Gametype changed, clearing session data.\n"); } else { char *tmp = s; qboolean test = (g_altStopwatchMode.integer != 0 || g_currentRound.integer == 1); #define GETVAL(x) if ((tmp = strchr(tmp, ' ')) == NULL) { return; \ } x = atoi(++tmp); // Get team lock stuff GETVAL(gt); teamInfo[TEAM_AXIS].spec_lock = (gt & TEAM_AXIS) ? qtrue : qfalse; teamInfo[TEAM_ALLIES].spec_lock = (gt & TEAM_ALLIES) ? qtrue : qfalse; // See if we need to clear player stats // FIXME: deal with the multi-map missions if (g_gametype.integer != GT_WOLF_CAMPAIGN) { if ((tmp = strchr(va("%s", tmp), ' ')) != NULL) { tmp++; trap_GetServerinfo(s, sizeof(s)); if (Q_stricmp(tmp, Info_ValueForKey(s, "mapname"))) { level.fResetStats = qtrue; G_Printf("Map changed, clearing player stats.\n"); } } } // have to make sure spec locks follow the right teams if (g_gametype.integer == GT_WOLF_STOPWATCH && g_gamestate.integer != GS_PLAYING && test) { G_swapTeamLocks(); } if (g_swapteams.integer) { G_swapTeamLocks(); } } for (i = 0; i < MAX_FIRETEAMS; i++) { char *p, *c; trap_Cvar_VariableStringBuffer(va("fireteam%i", i), s, sizeof(s)); /* p = Info_ValueForKey( s, "n" ); if(p && *p) { Q_strncpyz( level.fireTeams[i].name, p, 32 ); level.fireTeams[i].inuse = qtrue; } else { *level.fireTeams[i].name = '\0'; level.fireTeams[i].inuse = qfalse; }*/ p = Info_ValueForKey(s, "id"); j = atoi(p); if (!*p || j == -1) { level.fireTeams[i].inuse = qfalse; } else { level.fireTeams[i].inuse = qtrue; } level.fireTeams[i].ident = j + 1; p = Info_ValueForKey(s, "p"); level.fireTeams[i].priv = !atoi(p) ? qfalse : qtrue; p = Info_ValueForKey(s, "i"); j = 0; if (p && *p) { c = p; for (c = strchr(c, ' ') + 1; c && *c; ) { char str[8]; char *l = strchr(c, ' '); if (!l) { break; } Q_strncpyz(str, c, l - c + 1); str[l - c] = '\0'; level.fireTeams[i].joinOrder[j++] = atoi(str); c = l + 1; } } for ( ; j < MAX_CLIENTS; j++) { level.fireTeams[i].joinOrder[j] = -1; } G_UpdateFireteamConfigString(&level.fireTeams[i]); } }
/* ============ G_InitGame ============ */ void G_InitGame( int levelTime, int randomSeed, int restart ) { int i; G_Printf ("------- Game Initialization -------\n"); G_Printf ("gamename: %s\n", GAMEVERSION); G_Printf ("gamedate: %s\n", __DATE__); srand( randomSeed ); G_RegisterCvars(); G_ProcessIPBans(); G_InitMemory(); // set some level globals memset( &level, 0, sizeof( level ) ); level.time = levelTime; level.startTime = levelTime; level.snd_fry = G_SoundIndex("sound/player/fry.wav"); // FIXME standing in lava / slime if ( g_gametype.integer != GT_SINGLE_PLAYER && g_logfile.string[0] ) { if ( g_logfileSync.integer ) { trap_FS_FOpenFile( g_logfile.string, &level.logFile, FS_APPEND_SYNC ); } else { trap_FS_FOpenFile( g_logfile.string, &level.logFile, FS_APPEND ); } if ( !level.logFile ) { G_Printf( "WARNING: Couldn't open logfile: %s\n", g_logfile.string ); } else { char serverinfo[MAX_INFO_STRING]; trap_GetServerinfo( serverinfo, sizeof( serverinfo ) ); G_LogPrintf("------------------------------------------------------------\n" ); G_LogPrintf("InitGame: %s\n", serverinfo ); } } else { G_Printf( "Not logging to disk.\n" ); } G_InitWorldSession(); // initialize all entities for this game memset( g_entities, 0, MAX_GENTITIES * sizeof(g_entities[0]) ); level.gentities = g_entities; // initialize all clients for this game level.maxclients = g_maxclients.integer; memset( g_clients, 0, MAX_CLIENTS * sizeof(g_clients[0]) ); level.clients = g_clients; // set client fields on player ents for ( i=0 ; i<level.maxclients ; i++ ) { g_entities[i].client = level.clients + i; } // always leave room for the max number of clients, // even if they aren't all used, so numbers inside that // range are NEVER anything but clients level.num_entities = MAX_CLIENTS; for ( i=0 ; i<MAX_CLIENTS ; i++ ) { g_entities[i].classname = "clientslot"; } // let the server system know where the entites are trap_LocateGameData( level.gentities, level.num_entities, sizeof( gentity_t ), &level.clients[0].ps, sizeof( level.clients[0] ) ); // reserve some spots for dead player bodies InitBodyQue(); ClearRegisteredItems(); // parse the key/value pairs and spawn gentities G_SpawnEntitiesFromString(); // general initialization G_FindTeams(); // make sure we have flags for CTF, etc if( g_gametype.integer >= GT_TEAM ) { G_CheckTeamItems(); } SaveRegisteredItems(); G_Printf ("-----------------------------------\n"); if( g_gametype.integer == GT_SINGLE_PLAYER || trap_Cvar_VariableIntegerValue( "com_buildScript" ) ) { G_ModelIndex( SP_PODIUM_MODEL ); } if ( trap_Cvar_VariableIntegerValue( "bot_enable" ) ) { BotAISetup( restart ); BotAILoadMap( restart ); G_InitBots( restart ); } G_RemapTeamShaders(); }
/* =============== G_InitBots =============== */ void G_InitBots( qbool restart ) { int fragLimit; int timeLimit; const char *arenainfo; char *strValue; int basedelay; char map[MAX_QPATH]; char serverinfo[MAX_INFO_STRING]; G_LoadBots(); G_LoadArenas(); trap_Cvar_Register( &bot_minplayers, "bot_minplayers", "0", CVAR_SERVERINFO ); // smokinguns trap_Cvar_Register( &bot_noBR, "bot_noBR", "0", CVAR_ARCHIVE ); trap_Cvar_Register( &bot_noDuel, "bot_noDuel", "0", CVAR_ARCHIVE ); if ((g_gametype.integer == GT_BR && bot_noBR.integer) || (g_gametype.integer == GT_DUEL && bot_noDuel.integer) ) { trap_SendConsoleCommand( EXEC_INSERT, "kickbots\n"); } if( g_gametype.integer == GT_SINGLE_PLAYER ) { trap_GetServerinfo( serverinfo, sizeof(serverinfo) ); Q_strncpyz( map, Info_ValueForKey( serverinfo, "mapname" ), sizeof(map) ); arenainfo = G_GetArenaInfoByMap( map ); if ( !arenainfo ) { return; } strValue = Info_ValueForKey( arenainfo, "fraglimit" ); fragLimit = atoi( strValue ); if ( fragLimit ) { trap_Cvar_Set( "fraglimit", strValue ); } else { trap_Cvar_Set( "fraglimit", "0" ); } strValue = Info_ValueForKey( arenainfo, "timelimit" ); timeLimit = atoi( strValue ); if ( timeLimit ) { trap_Cvar_Set( "timelimit", strValue ); } else { trap_Cvar_Set( "timelimit", "0" ); } if ( !fragLimit && !timeLimit ) { trap_Cvar_Set( "fraglimit", "10" ); trap_Cvar_Set( "timelimit", "0" ); } basedelay = BOT_BEGIN_DELAY_BASE; strValue = Info_ValueForKey( arenainfo, "special" ); if( Q_stricmp( strValue, "training" ) == 0 ) { basedelay += 10000; } if( !restart ) { G_SpawnBots( Info_ValueForKey( arenainfo, "bots" ), basedelay ); } } }
/* =============== G_InitBots =============== */ void G_InitBots( qboolean restart ) { int fragLimit; int timeLimit; const char *arenainfo; char *strValue; int basedelay; char map[MAX_QPATH]; char serverinfo[MAX_INFO_STRING]; G_LoadBots(); G_LoadArenas(); trap_Cvar_Register( &bot_minplayers, "bot_minplayers", "0", CVAR_SERVERINFO ); if( g_gametype.integer == GT_SINGLE_PLAYER ) { trap_GetServerinfo( serverinfo, sizeof(serverinfo) ); Q_strncpyz( map, Info_ValueForKey( serverinfo, "mapname" ), sizeof(map) ); arenainfo = G_GetArenaInfoByMap( map ); if ( !arenainfo ) { return; } strValue = Info_ValueForKey( arenainfo, "fraglimit" ); fragLimit = atoi( strValue ); if ( fragLimit ) { trap_Cvar_Set( "fraglimit", strValue ); } else { trap_Cvar_Set( "fraglimit", "0" ); } strValue = Info_ValueForKey( arenainfo, "timelimit" ); timeLimit = atoi( strValue ); if ( timeLimit ) { trap_Cvar_Set( "timelimit", strValue ); } else { trap_Cvar_Set( "timelimit", "0" ); } if ( !fragLimit && !timeLimit ) { trap_Cvar_Set( "fraglimit", "10" ); trap_Cvar_Set( "timelimit", "0" ); } if (g_holoIntro.integer) { // The player will be looking at the holodeck doors for the first five seconds, so take that into account. basedelay = BOT_BEGIN_DELAY_BASE + TIME_INTRO; } else { basedelay = BOT_BEGIN_DELAY_BASE; } strValue = Info_ValueForKey( arenainfo, "special" ); if( Q_stricmp( strValue, "training" ) == 0 ) { basedelay += 10000; } if( !restart ) { G_SpawnBots( Info_ValueForKey( arenainfo, "bots" ), basedelay ); } } }
void G_LogWeaponOutput(void) { #ifdef LOGGING_WEAPONS int i,j,curwp; float pershot; fileHandle_t weaponfile; char string[1024]; int totalpickups[WP_NUM_WEAPONS]; int totaltime[WP_NUM_WEAPONS]; int totaldeaths[WP_NUM_WEAPONS]; int totaldamageMOD[MOD_MAX]; int totalkillsMOD[MOD_MAX]; int totaldamage[WP_NUM_WEAPONS]; int totalkills[WP_NUM_WEAPONS]; int totalshots[WP_NUM_WEAPONS]; int percharacter[WP_NUM_WEAPONS]; char info[1024]; char mapname[128]; char *nameptr, *unknownname="<Unknown>"; if (!g_statLog.integer) { return; } G_LogPrintf("*****************************Weapon Log:\n" ); memset(totalpickups, 0, sizeof(totalpickups)); memset(totaltime, 0, sizeof(totaltime)); memset(totaldeaths, 0, sizeof(totaldeaths)); memset(totaldamageMOD, 0, sizeof(totaldamageMOD)); memset(totalkillsMOD, 0, sizeof(totalkillsMOD)); memset(totaldamage, 0, sizeof(totaldamage)); memset(totalkills, 0, sizeof(totalkills)); memset(totalshots, 0, sizeof(totalshots)); for (i=0; i<MAX_CLIENTS; i++) { if (G_WeaponLogClientTouch[i]) { // Ignore any entity/clients we don't care about! for (j=0;j<WP_NUM_WEAPONS;j++) { totalpickups[j] += G_WeaponLogPickups[i][j]; totaltime[j] += G_WeaponLogTime[i][j]; totaldeaths[j] += G_WeaponLogDeaths[i][j]; totalshots[j] += G_WeaponLogFired[i][j]; } for (j=0;j<MOD_MAX;j++) { totaldamageMOD[j] += G_WeaponLogDamage[i][j]; totalkillsMOD[j] += G_WeaponLogKills[i][j]; } } } // Now total the weapon data from the MOD data. for (j=0; j<MOD_MAX; j++) { if (j <= MOD_SENTRY) { curwp = weaponFromMOD[j]; totaldamage[curwp] += totaldamageMOD[j]; totalkills[curwp] += totalkillsMOD[j]; } } G_LogPrintf( "\n****Data by Weapon:\n" ); for (j=0; j<WP_NUM_WEAPONS; j++) { G_LogPrintf("%15s: Pickups: %4d, Time: %5d, Deaths: %5d\n", weaponNameFromIndex[j], totalpickups[j], (int)(totaltime[j]/1000), totaldeaths[j]); } G_LogPrintf( "\n****Combat Data by Weapon:\n" ); for (j=0; j<WP_NUM_WEAPONS; j++) { if (totalshots[j] > 0) { pershot = (float)(totaldamage[j])/(float)(totalshots[j]); } else { pershot = 0; } G_LogPrintf("%15s: Damage: %6d, Kills: %5d, Dmg per Shot: %f\n", weaponNameFromIndex[j], totaldamage[j], totalkills[j], pershot); } G_LogPrintf( "\n****Combat Data By Damage Type:\n" ); for (j=0; j<MOD_MAX; j++) { G_LogPrintf("%25s: Damage: %6d, Kills: %5d\n", modNames[j], totaldamageMOD[j], totalkillsMOD[j]); } G_LogPrintf("\n"); // Write the whole weapon statistic log out to a file. trap_FS_FOpenFile( g_statLogFile.string, &weaponfile, FS_APPEND ); if (!weaponfile) { //failed to open file, let's not crash, shall we? return; } // Write out the level name trap_GetServerinfo(info, sizeof(info)); strncpy(mapname, Info_ValueForKey( info, "mapname" ), sizeof(mapname)-1); mapname[sizeof(mapname)-1] = '\0'; Com_sprintf(string, sizeof(string), "\n\n\nLevel:\t%s\n\n\n", mapname); trap_FS_Write( string, strlen( string ), weaponfile); // Combat data per character // Start with Pickups per character Com_sprintf(string, sizeof(string), "Weapon Pickups per Player:\n\n"); trap_FS_Write( string, strlen( string ), weaponfile); Com_sprintf(string, sizeof(string), "Player"); trap_FS_Write(string, strlen(string), weaponfile); for (j=0; j<WP_NUM_WEAPONS; j++) { Com_sprintf(string, sizeof(string), "\t%s", weaponNameFromIndex[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n"); trap_FS_Write(string, strlen(string), weaponfile); // Cycle through each player, give their name and the number of times they picked up each weapon. for (i=0; i<MAX_CLIENTS; i++) { if (G_WeaponLogClientTouch[i]) { // Ignore any entity/clients we don't care about! if ( g_entities[i].client ) { nameptr = g_entities[i].client->pers.netname; } else { nameptr = unknownname; } trap_FS_Write(nameptr, strlen(nameptr), weaponfile); for (j=0;j<WP_NUM_WEAPONS;j++) { Com_sprintf(string, sizeof(string), "\t%d", G_WeaponLogPickups[i][j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n"); trap_FS_Write(string, strlen(string), weaponfile); } } // Sum up the totals. Com_sprintf(string, sizeof(string), "\n***TOTAL:"); trap_FS_Write(string, strlen(string), weaponfile); for (j=0;j<WP_NUM_WEAPONS;j++) { Com_sprintf(string, sizeof(string), "\t%d", totalpickups[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n\n\n"); trap_FS_Write(string, strlen(string), weaponfile); // Weapon fires per character Com_sprintf(string, sizeof(string), "Weapon Shots per Player:\n\n"); trap_FS_Write( string, strlen( string ), weaponfile); Com_sprintf(string, sizeof(string), "Player"); trap_FS_Write(string, strlen(string), weaponfile); for (j=0; j<WP_NUM_WEAPONS; j++) { Com_sprintf(string, sizeof(string), "\t%s", weaponNameFromIndex[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n"); trap_FS_Write(string, strlen(string), weaponfile); // Cycle through each player, give their name and the number of times they picked up each weapon. for (i=0; i<MAX_CLIENTS; i++) { if (G_WeaponLogClientTouch[i]) { // Ignore any entity/clients we don't care about! if ( g_entities[i].client ) { nameptr = g_entities[i].client->pers.netname; } else { nameptr = unknownname; } trap_FS_Write(nameptr, strlen(nameptr), weaponfile); for (j=0;j<WP_NUM_WEAPONS;j++) { Com_sprintf(string, sizeof(string), "\t%d", G_WeaponLogFired[i][j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n"); trap_FS_Write(string, strlen(string), weaponfile); } } // Sum up the totals. Com_sprintf(string, sizeof(string), "\n***TOTAL:"); trap_FS_Write(string, strlen(string), weaponfile); for (j=0;j<WP_NUM_WEAPONS;j++) { Com_sprintf(string, sizeof(string), "\t%d", totalshots[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n\n\n"); trap_FS_Write(string, strlen(string), weaponfile); // Weapon time per character Com_sprintf(string, sizeof(string), "Weapon Use Time per Player:\n\n"); trap_FS_Write( string, strlen( string ), weaponfile); Com_sprintf(string, sizeof(string), "Player"); trap_FS_Write(string, strlen(string), weaponfile); for (j=0; j<WP_NUM_WEAPONS; j++) { Com_sprintf(string, sizeof(string), "\t%s", weaponNameFromIndex[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n"); trap_FS_Write(string, strlen(string), weaponfile); // Cycle through each player, give their name and the number of times they picked up each weapon. for (i=0; i<MAX_CLIENTS; i++) { if (G_WeaponLogClientTouch[i]) { // Ignore any entity/clients we don't care about! if ( g_entities[i].client ) { nameptr = g_entities[i].client->pers.netname; } else { nameptr = unknownname; } trap_FS_Write(nameptr, strlen(nameptr), weaponfile); for (j=0;j<WP_NUM_WEAPONS;j++) { Com_sprintf(string, sizeof(string), "\t%d", G_WeaponLogTime[i][j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n"); trap_FS_Write(string, strlen(string), weaponfile); } } // Sum up the totals. Com_sprintf(string, sizeof(string), "\n***TOTAL:"); trap_FS_Write(string, strlen(string), weaponfile); for (j=0;j<WP_NUM_WEAPONS;j++) { Com_sprintf(string, sizeof(string), "\t%d", totaltime[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n\n\n"); trap_FS_Write(string, strlen(string), weaponfile); // Weapon deaths per character Com_sprintf(string, sizeof(string), "Weapon Deaths per Player:\n\n"); trap_FS_Write( string, strlen( string ), weaponfile); Com_sprintf(string, sizeof(string), "Player"); trap_FS_Write(string, strlen(string), weaponfile); for (j=0; j<WP_NUM_WEAPONS; j++) { Com_sprintf(string, sizeof(string), "\t%s", weaponNameFromIndex[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n"); trap_FS_Write(string, strlen(string), weaponfile); // Cycle through each player, give their name and the number of times they picked up each weapon. for (i=0; i<MAX_CLIENTS; i++) { if (G_WeaponLogClientTouch[i]) { // Ignore any entity/clients we don't care about! if ( g_entities[i].client ) { nameptr = g_entities[i].client->pers.netname; } else { nameptr = unknownname; } trap_FS_Write(nameptr, strlen(nameptr), weaponfile); for (j=0;j<WP_NUM_WEAPONS;j++) { Com_sprintf(string, sizeof(string), "\t%d", G_WeaponLogDeaths[i][j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n"); trap_FS_Write(string, strlen(string), weaponfile); } } // Sum up the totals. Com_sprintf(string, sizeof(string), "\n***TOTAL:"); trap_FS_Write(string, strlen(string), weaponfile); for (j=0;j<WP_NUM_WEAPONS;j++) { Com_sprintf(string, sizeof(string), "\t%d", totaldeaths[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n\n\n"); trap_FS_Write(string, strlen(string), weaponfile); // Weapon damage per character Com_sprintf(string, sizeof(string), "Weapon Damage per Player:\n\n"); trap_FS_Write( string, strlen( string ), weaponfile); Com_sprintf(string, sizeof(string), "Player"); trap_FS_Write(string, strlen(string), weaponfile); for (j=0; j<WP_NUM_WEAPONS; j++) { Com_sprintf(string, sizeof(string), "\t%s", weaponNameFromIndex[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n"); trap_FS_Write(string, strlen(string), weaponfile); // Cycle through each player, give their name and the number of times they picked up each weapon. for (i=0; i<MAX_CLIENTS; i++) { if (G_WeaponLogClientTouch[i]) { // Ignore any entity/clients we don't care about! // We must grab the totals from the damage types for the player and map them to the weapons. memset(percharacter, 0, sizeof(percharacter)); for (j=0; j<MOD_MAX; j++) { if (j <= MOD_SENTRY) { curwp = weaponFromMOD[j]; percharacter[curwp] += G_WeaponLogDamage[i][j]; } } if ( g_entities[i].client ) { nameptr = g_entities[i].client->pers.netname; } else { nameptr = unknownname; } trap_FS_Write(nameptr, strlen(nameptr), weaponfile); for (j=0;j<WP_NUM_WEAPONS;j++) { Com_sprintf(string, sizeof(string), "\t%d", percharacter[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n"); trap_FS_Write(string, strlen(string), weaponfile); } } // Sum up the totals. Com_sprintf(string, sizeof(string), "\n***TOTAL:"); trap_FS_Write(string, strlen(string), weaponfile); for (j=0;j<WP_NUM_WEAPONS;j++) { Com_sprintf(string, sizeof(string), "\t%d", totaldamage[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n\n\n"); trap_FS_Write(string, strlen(string), weaponfile); // Weapon kills per character Com_sprintf(string, sizeof(string), "Weapon Kills per Player:\n\n"); trap_FS_Write( string, strlen( string ), weaponfile); Com_sprintf(string, sizeof(string), "Player"); trap_FS_Write(string, strlen(string), weaponfile); for (j=0; j<WP_NUM_WEAPONS; j++) { Com_sprintf(string, sizeof(string), "\t%s", weaponNameFromIndex[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n"); trap_FS_Write(string, strlen(string), weaponfile); // Cycle through each player, give their name and the number of times they picked up each weapon. for (i=0; i<MAX_CLIENTS; i++) { if (G_WeaponLogClientTouch[i]) { // Ignore any entity/clients we don't care about! // We must grab the totals from the damage types for the player and map them to the weapons. memset(percharacter, 0, sizeof(percharacter)); for (j=0; j<MOD_MAX; j++) { if (j <= MOD_SENTRY) { curwp = weaponFromMOD[j]; percharacter[curwp] += G_WeaponLogKills[i][j]; } } if ( g_entities[i].client ) { nameptr = g_entities[i].client->pers.netname; } else { nameptr = unknownname; } trap_FS_Write(nameptr, strlen(nameptr), weaponfile); for (j=0;j<WP_NUM_WEAPONS;j++) { Com_sprintf(string, sizeof(string), "\t%d", percharacter[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n"); trap_FS_Write(string, strlen(string), weaponfile); } } // Sum up the totals. Com_sprintf(string, sizeof(string), "\n***TOTAL:"); trap_FS_Write(string, strlen(string), weaponfile); for (j=0;j<WP_NUM_WEAPONS;j++) { Com_sprintf(string, sizeof(string), "\t%d", totalkills[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n\n\n"); trap_FS_Write(string, strlen(string), weaponfile); // Damage type damage per character Com_sprintf(string, sizeof(string), "Typed Damage per Player:\n\n"); trap_FS_Write( string, strlen( string ), weaponfile); Com_sprintf(string, sizeof(string), "Player"); trap_FS_Write(string, strlen(string), weaponfile); for (j=0; j<MOD_MAX; j++) { Com_sprintf(string, sizeof(string), "\t%s", modNames[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n"); trap_FS_Write(string, strlen(string), weaponfile); // Cycle through each player, give their name and the number of times they picked up each weapon. for (i=0; i<MAX_CLIENTS; i++) { if (G_WeaponLogClientTouch[i]) { // Ignore any entity/clients we don't care about! if ( g_entities[i].client ) { nameptr = g_entities[i].client->pers.netname; } else { nameptr = unknownname; } trap_FS_Write(nameptr, strlen(nameptr), weaponfile); for (j=0;j<MOD_MAX;j++) { Com_sprintf(string, sizeof(string), "\t%d", G_WeaponLogDamage[i][j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n"); trap_FS_Write(string, strlen(string), weaponfile); } } // Sum up the totals. Com_sprintf(string, sizeof(string), "\n***TOTAL:"); trap_FS_Write(string, strlen(string), weaponfile); for (j=0;j<MOD_MAX;j++) { Com_sprintf(string, sizeof(string), "\t%d", totaldamageMOD[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n\n\n"); trap_FS_Write(string, strlen(string), weaponfile); // Damage type kills per character Com_sprintf(string, sizeof(string), "Damage-Typed Kills per Player:\n\n"); trap_FS_Write( string, strlen( string ), weaponfile); Com_sprintf(string, sizeof(string), "Player"); trap_FS_Write(string, strlen(string), weaponfile); for (j=0; j<MOD_MAX; j++) { Com_sprintf(string, sizeof(string), "\t%s", modNames[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n"); trap_FS_Write(string, strlen(string), weaponfile); // Cycle through each player, give their name and the number of times they picked up each weapon. for (i=0; i<MAX_CLIENTS; i++) { if (G_WeaponLogClientTouch[i]) { // Ignore any entity/clients we don't care about! if ( g_entities[i].client ) { nameptr = g_entities[i].client->pers.netname; } else { nameptr = unknownname; } trap_FS_Write(nameptr, strlen(nameptr), weaponfile); for (j=0;j<MOD_MAX;j++) { Com_sprintf(string, sizeof(string), "\t%d", G_WeaponLogKills[i][j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n"); trap_FS_Write(string, strlen(string), weaponfile); } } // Sum up the totals. Com_sprintf(string, sizeof(string), "\n***TOTAL:"); trap_FS_Write(string, strlen(string), weaponfile); for (j=0;j<MOD_MAX;j++) { Com_sprintf(string, sizeof(string), "\t%d", totalkillsMOD[j]); trap_FS_Write(string, strlen(string), weaponfile); } Com_sprintf(string, sizeof(string), "\n\n\n"); trap_FS_Write(string, strlen(string), weaponfile); trap_FS_FCloseFile(weaponfile); #endif //LOGGING_WEAPONS }
qboolean G_ParseMapSettings(int handle, config_t *config) { pc_token_t token; char serverinfo[MAX_INFO_STRING]; char *mapname; trap_GetServerinfo(serverinfo, sizeof(serverinfo)); mapname = Info_ValueForKey(serverinfo, "mapname"); if (!trap_PC_ReadToken(handle, &token)) { G_Printf("Malformed map config\n"); } G_Printf("Map settings for: %s\n", token.string); G_Printf("Current map: %s\n", mapname); if (!Q_stricmp(token.string, "default")) { G_Printf("Setting rules for map: %s\n", token.string); return G_ParseSettings(handle, qtrue, config); } else if (!Q_stricmp(token.string, mapname)) { fileHandle_t f; char *code, *signature; qboolean res; G_Printf("Setting rules for map: %s\n", token.string); res = G_ParseSettings(handle, qtrue, config); if (res && strlen(config->mapscripthash)) { char sdir[MAX_QPATH]; int flen = 0; trap_Cvar_VariableStringBuffer("g_mapScriptDirectory", sdir, sizeof(sdir)); flen = trap_FS_FOpenFile(va("%s/%s.script", sdir, mapname), &f, FS_READ); if (flen < 0) { // FIXME: handle this properly.. //return G_ConfigError(handle, "Cannot open mapscript file for hash verification: %s/%s.script", sdir, mapname); G_Printf("Cannot open mapscript file for hash verification: %s/%s.script", sdir, mapname); return res; } code = malloc(flen + 1); trap_FS_Read(code, flen, f); *(code + flen) = '\0'; trap_FS_FCloseFile(f); signature = G_SHA1(code); free(code); if (Q_stricmp(config->mapscripthash, signature)) { return G_ConfigError(handle, "Invalid mapscript hash for map: %s hash given in config: \"%s\" scripts actual hash \"%s\"", mapname, config->mapscripthash, signature); } G_Printf("Hash is valid for map: %s\n", mapname); } return res; } else { G_Printf("Ignoring rules for map: %s\n", token.string); return G_ParseSettings(handle, qfalse, config); } }
static int GLua_Sys_MapName(lua_State *L) { char cs[1024]; trap_GetServerinfo( cs, sizeof( cs ) ); lua_pushstring(L, Info_ValueForKey( cs, "mapname" )); return 1; }