/* ================ G_InitSessionData Called on a first-time connect ================ */ void G_InitSessionData( gclient_t *client, char *userinfo ) { clientSession_t *sess; const char *value; sess = &client->sess; // initial team determination value = Info_ValueForKey( userinfo, "team" ); if( value[ 0 ] == 's' ) { // a willing spectator, not a waiting-in-line sess->sessionTeam = TEAM_SPECTATOR; } else { if( g_maxGameClients.integer > 0 && level.numNonSpectatorClients >= g_maxGameClients.integer ) sess->sessionTeam = TEAM_SPECTATOR; else sess->sessionTeam = TEAM_FREE; } sess->restartTeam = PTE_NONE; sess->spectatorState = SPECTATOR_FREE; sess->spectatorTime = level.time; sess->spectatorClient = -1; memset( &sess->ignoreList, 0, sizeof( sess->ignoreList ) ); G_WriteClientSessionData( client ); }
/* ================== G_WriteSessionData ================== */ void G_WriteSessionData(void) { char map[ MAX_STRING_CHARS ]; int i; //int record = 0; int gameid = 0; char data[ 255 ]; trap_Cvar_VariableStringBuffer("mapname", map, sizeof ( map)); //TA: ? trap_Cvar_Set("session", va("%i", 0)); if(g_survival.integer && level.survivalRecordsBroke[0] > 0 && level.survivalRecordTime > 0 && !level.mysqlupdated) { if(trap_mysql_runquery(va("INSERT HIGH_PRIORITY INTO games (map,time) VALUES (\"%s\",\"%d\")", map, level.survivalRecordTime)) == qtrue) { trap_mysql_finishquery(); if(trap_mysql_runquery("SELECT id FROM games ORDER BY id desc LIMIT 1") == qtrue) { if(trap_mysql_fetchrow() == qtrue) { trap_mysql_fetchfieldbyName("id", data, sizeof(data)); gameid = atoi(data); } } } trap_mysql_finishquery(); } //trap_SendServerCommand( -1, va("print \"^5Game id: %d\n\"",gameid) ); for (i = 0; i < level.maxclients; i++) { if (level.clients[ i ].pers.connected == CON_CONNECTED) G_WriteClientSessionData(&level.clients[ i ]); if(!g_survival.integer) continue; if(level.clients[i].pers.mysqlid > 0 && gameid > 0 && !level.mysqlupdated) { if(trap_mysql_runquery(va("UPDATE players set lasttime=NOW() WHERE id = \"%d\" LIMIT 1", level.clients[i].pers.mysqlid)) == qtrue) { // trap_SendServerCommand( -1, va("print \"^5Update player date %d\n\"",gameid) ); trap_mysql_finishquery(); } if(trap_mysql_runquery(va("INSERT HIGH_PRIORITY INTO players_game (idgame,idplayer,timealive) VALUES (%d,%d,%d)", gameid, level.clients[i].pers.mysqlid, level.clients[i].pers.lastdeadtime)) == qtrue) { //trap_SendServerCommand( -1, va("print \"^5Insert players_game relation %d\n\"",gameid) ); trap_mysql_finishquery(); } } } if(g_survival.integer && level.survivalRecordTime > 0 && !level.mysqlupdated) { trap_SendServerCommand( -1, "print \"^5Records stored on the server.\n\"" ); } level.mysqlupdated = 1; }
/* ================ G_InitSessionData Called on a first-time connect ================ */ void G_InitSessionData(gclient_t *client) { clientSession_t *sess; sess = &client->sess; // initial team determination sess->sessionTeam = TEAM_SPECTATOR; sess->spectatorState = SPECTATOR_FREE; sess->spectatorTime = level.time; // DHM - Nerve sess->latchPlayerType = sess->playerType = 0; sess->latchPlayerWeapon = sess->playerWeapon = 0; sess->latchPlayerWeapon2 = sess->playerWeapon2 = 0; sess->spawnObjectiveIndex = 0; // dhm - end memset(sess->ignoreClients, 0, sizeof (sess->ignoreClients)); sess->muted = qfalse; // OSP sess->referee = (client->pers.localClient) ? RL_REFEREE : RL_NONE; sess->spec_team = 0; // OSP // Nico, init GeoIP client->sess.countryCode = 0; G_WriteClientSessionData(client, qfalse); }
/* ================== 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_InitSessionData Called on a first-time connect ================ */ void G_InitSessionData( gclient_t *client, char *userinfo ) { clientSession_t *sess; // const char *value; sess = &client->sess; // initial team determination sess->sessionTeam = TEAM_SPECTATOR; sess->spectatorState = SPECTATOR_FREE; sess->spectatorTime = level.time; // DHM - Nerve sess->latchPlayerType = sess->playerType = 0; sess->latchPlayerWeapon = sess->playerWeapon = 0; sess->latchPlayerWeapon2 = sess->playerWeapon2 = 0; sess->spawnObjectiveIndex = 0; // dhm - end memset( sess->ignoreClients, 0, sizeof(sess->ignoreClients) ); // sess->experience = 0; sess->auto_unmute_time = 0; memset( sess->skill, 0, sizeof(sess->skill) ); memset( sess->skillpoints, 0, sizeof(sess->skillpoints) ); // CHRUKER: b017 - startskillpoints didn't get reset memset( sess->startskillpoints, 0, sizeof(sess->startskillpoints) ); memset( sess->medals, 0, sizeof(sess->medals) ); sess->rank = 0; // CHRUKER: b017 - startxptotal didn't get reset sess->startxptotal = 0; // OSP sess->coach_team = 0; sess->referee = (client->pers.localClient) ? RL_REFEREE : RL_NONE; sess->spec_invite = 0; sess->spec_team = 0; G_deleteStats(client - level.clients); // OSP // josh: sess->overall_killrating = 0.0f; sess->overall_killvariance = SIGMA2_DELTA; // rating = player rating now sess->rating = 0.0; sess->rating_variance = SIGMA2_THETA; sess->uci = 0;//mcwf GeoIP sess->need_greeting = qtrue; // redeye - moved greeting message to ClientBegin // quad - shoutcaster & ettv sess->ettv = ( atoi( Info_ValueForKey( userinfo, "protocol" ) ) == 284 ); // pheno: grant shoutcaster status to ettv slave sess->shoutcaster = ( sess->ettv && ( g_ettvFlags.integer & ETTV_SHOUTCASTER ) ); G_WriteClientSessionData( client, qfalse ); }
/* ================ G_InitSessionData Called on a first-time connect ================ */ void G_InitSessionData( gclient_t *client, char *userinfo ) { clientSession_t *sess; sess = &client->sess; sess->sessionTeam = TEAM_FREE; G_WriteClientSessionData( client ); }
/* ================== G_WriteSessionData ================== */ void G_WriteSessionData( void ) { unsigned int i; Cvar_Set( "session", va("%i", g_gametype->integer) ); for ( i = 0 ; i < level.maxclients ; i++ ) if ( level.clients[i].pers.connected == CON_CONNECTED ) G_WriteClientSessionData( &level.clients[i] ); }
/* ================ G_InitSessionData Called on a first-time connect ================ */ void G_InitSessionData( gclient_t *client, char *userinfo ) { clientSession_t *sess; const char *value; sess = &client->sess; // initial team determination if ( g_gametype.integer >= GT_TEAM ) { if ( g_teamAutoJoin.integer && !(g_entities[ client - level.clients ].r.svFlags & SVF_BOT) ) { sess->sessionTeam = PickTeam( -1 ); BroadcastTeamChange( client, -1 ); } else { // always spawn as spectator in team games sess->sessionTeam = TEAM_SPECTATOR; } } else { value = Info_ValueForKey( userinfo, "team" ); if ( value[0] == 's' ) { // a willing spectator, not a waiting-in-line sess->sessionTeam = TEAM_SPECTATOR; } else { switch ( g_gametype.integer ) { default: case GT_FFA: case GT_SINGLE_PLAYER: if ( g_maxGameClients.integer > 0 && level.numNonSpectatorClients >= g_maxGameClients.integer ) { sess->sessionTeam = TEAM_SPECTATOR; } else { sess->sessionTeam = TEAM_FREE; } break; case GT_TOURNAMENT: // if the game is full, go into a waiting mode if ( level.numNonSpectatorClients >= 2 ) { sess->sessionTeam = TEAM_SPECTATOR; } else { sess->sessionTeam = TEAM_FREE; } break; } } } sess->spectatorState = SPECTATOR_FREE; AddTournamentQueue(client); if (crandom() > 0) client->sess.weapon = WP_RAILGUN; else client->sess.weapon = WP_ROCKET_LAUNCHER; G_WriteClientSessionData( client ); }
/* ================== G_WriteSessionData ================== */ void G_WriteSessionData( void ) { int i; trap_Cvar_Set( "session", va("%i", g_gametype.integer) ); for ( i = 0 ; i < level.maxclients ; i++ ) { if ( level.clients[i].pers.connected == CON_CONNECTED ) { G_WriteClientSessionData( &level.clients[i] ); } } }
/* ================== G_WriteSessionData ================== */ void G_WriteSessionData( void ) { int i; gi.cvar_set( "session", 0) ; for ( i = 0 ; i < level.maxclients ; i++ ) { if ( level.clients[i].pers.connected == CON_CONNECTED ) { G_WriteClientSessionData( &level.clients[i] ); } } }
/* ================ G_InitSessionData Called on a first-time connect ================ */ void G_InitSessionData( gclient_t *client, char *userinfo ) { clientSession_t *sess; const char *value; sess = &client->sess; // initial team determination if ( g_gametype.integer >= GT_TEAM ) { // always spawn as spectator in team games sess->sessionTeam = TEAM_SPECTATOR; } else { value = Info_ValueForKey( userinfo, "team" ); if ( value[0] == 's' ) { // a willing spectator, not a waiting-in-line sess->sessionTeam = TEAM_SPECTATOR; } else { switch ( g_gametype.integer ) { default: case GT_FFA: case GT_SINGLE_PLAYER: if ( g_maxGameClients.integer > 0 && level.numNonSpectatorClients >= g_maxGameClients.integer ) { sess->sessionTeam = TEAM_SPECTATOR; } else { sess->sessionTeam = TEAM_FREE; } break; case GT_TOURNAMENT: // if the game is full, go into a waiting mode if ( level.numNonSpectatorClients >= 2 ) { sess->sessionTeam = TEAM_SPECTATOR; } else { sess->sessionTeam = TEAM_FREE; } break; } } } sess->spectatorState = SPECTATOR_FREE; sess->spectatorTime = level.time; // DHM - Nerve sess->latchPlayerType = sess->playerType = 0; sess->latchPlayerWeapon = sess->playerWeapon = 0; sess->latchPlayerItem = sess->playerItem = 0; sess->latchPlayerSkin = sess->playerSkin = 0; sess->spawnObjectiveIndex = 0; // dhm - end G_WriteClientSessionData( client ); }
/* ================== G_WriteSessionData ================== */ void G_WriteSessionData() { Cvar_Set( "session", va("%i", g_gametype.integer) ); for( int i = 1 ; i <= theLevel.maxclients_ ; i++ ) { GameClient* cl = theLevel.getClient(i); if( cl && cl->pers_.connected_ == GameClient::ClientPersistant::CON_CONNECTED ) { G_WriteClientSessionData( cl ); } } }
/* ================== G_WriteSessionData ================== */ void G_WriteSessionData( void ) { int i; //TA: ? trap_Cvar_Set( "session", va( "%i", 0 ) ); for( i = 0 ; i < level.maxclients ; i++ ) { if( level.clients[ i ].pers.connected == CON_CONNECTED ) G_WriteClientSessionData( &level.clients[ i ] ); } }
/* ================ G_InitSessionData Called on a first-time connect ================ */ void G_InitSessionData( gclient_t *client, char *userinfo ) { clientSession_t *sess; const char *value; sess = &client->sess; // initial team determination if ( g_gametype.integer >= GT_TEAM ) { if ( g_teamAutoJoin.integer ) { sess->sessionTeam = PickTeam( -1 ); BroadcastTeamChange( client, -1 ); } else { // always spawn as spectator in team games sess->sessionTeam = TEAM_SPECTATOR; } } else { value = Info_ValueForKey( userinfo, "team" ); if ( value[0] == 's' ) { // a willing spectator, not a waiting-in-line sess->sessionTeam = TEAM_SPECTATOR; } else { switch ( g_gametype.integer ) { default: case GT_FFA: case GT_SINGLE_PLAYER: if ( g_maxGameClients.integer > 0 && level.numNonSpectatorClients >= g_maxGameClients.integer ) { sess->sessionTeam = TEAM_SPECTATOR; } else { sess->sessionTeam = TEAM_FREE; } break; case GT_TOURNAMENT: // if the game is full, go into a waiting mode if ( level.numNonSpectatorClients >= 2 ) { sess->sessionTeam = TEAM_SPECTATOR; } else { sess->sessionTeam = TEAM_FREE; } break; } } } sess->spectatorState = SPECTATOR_FREE; sess->spectatorTime = level.time; G_WriteClientSessionData( client ); }
/* ================== G_WriteSessionData ================== */ void G_WriteSessionData( void ) { int i; trap_Cvar_Set( "session", va("%i", g_gametype.integer) ); for ( i = 0 ; i < level.maxclients ; i++ ) { if ( level.clients[i].pers.connected == CON_CONNECTED ) { G_WriteClientSessionData( &level.clients[i] ); } } //trap_Cvar_Set( "sessionNPC", va("%i", g_gametype.integer) ); // for ( i = 0 ; i < 15; i++ ) { // if ( npcTypesArray[i].NPCTypes[0] ) // G_WriteNPCSessionData(); // } }
/* ================ G_InitSessionData Called on a first-time connect ================ */ void G_InitSessionData( gclient_t *client, char *userinfo ) { clientSession_t *sess; // const char *value; sess = &client->sess; // initial team determination sess->sessionTeam = TEAM_SPECTATOR; sess->spectatorState = SPECTATOR_FREE; sess->spectatorTime = level.time; // DHM - Nerve sess->latchPlayerType = sess->playerType = 0; sess->latchPlayerWeapon = sess->playerWeapon = 0; sess->latchPlayerWeapon2 = sess->playerWeapon2 = 0; sess->spawnObjectiveIndex = 0; // dhm - end memset( sess->ignoreClients, 0, sizeof(sess->ignoreClients) ); // sess->experience = 0; sess->muted = qfalse; memset( sess->skill, 0, sizeof(sess->skill) ); memset( sess->skillpoints, 0, sizeof(sess->skillpoints) ); // sta acqu-sdk (issue 2): CHRUKER: b017 - startskillpoints didn't get reset memset( sess->startskillpoints, 0, sizeof(sess->startskillpoints) ); // end acqu-sdk (issue 2): CHRUKER: b017 memset( sess->medals, 0, sizeof(sess->medals) ); sess->rank = 0; // sta acqu-sdk (issue 2): CHRUKER: b017 - startxptotal didn't get reset sess->startxptotal = 0; // end acqu-sdk (issue 2): CHRUKER: b017 // OSP sess->coach_team = 0; sess->referee = (client->pers.localClient) ? RL_REFEREE : RL_NONE; sess->spec_invite = 0; sess->spec_team = 0; G_deleteStats(client - level.clients); // OSP G_WriteClientSessionData( client, qfalse ); }
/* ================ G_InitSessionData Called on a first-time connect ================ */ void G_InitSessionData( gclient_t *client, char *userinfo ) { clientSession_t *sess; const char *value; sess = &client->sess; // initial team determination if ( level.gametypeData->teams ) { if ( g_teamAutoJoin.integer ) { sess->team = PickTeam( -1 ); BroadcastTeamChange( client, -1 ); } else { // always spawn as spectator in team games sess->team = TEAM_SPECTATOR; } } else { value = Info_ValueForKey( userinfo, "team" ); if ( value[0] == 's' ) { // a willing spectator, not a waiting-in-line sess->team = TEAM_SPECTATOR; } else { if ( g_maxGameClients.integer > 0 && level.numNonSpectatorClients >= g_maxGameClients.integer ) { sess->team = TEAM_SPECTATOR; } else { sess->team = TEAM_FREE; } } } sess->spectatorState = SPECTATOR_FREE; sess->spectatorTime = level.time; G_WriteClientSessionData( client ); }
/* ================== G_WriteSessionData ================== */ void G_WriteSessionData( void ) { int i; //TA: ? trap_Cvar_Set( "session", va( "%i", 0 ) ); for( i = 0 ; i < level.maxclients ; i++ ) { if( level.clients[ i ].pers.connected == CON_CONNECTED ) G_WriteClientSessionData( &level.clients[ i ] ); } // write values for sv_maxclients and sv_democlients because they invalidate session data trap_Cvar_Set( "session", va( "%i %i", trap_Cvar_VariableIntegerValue( "sv_maxclients" ), trap_Cvar_VariableIntegerValue( "sv_democlients" ) ) ); }
/* ================== G_WriteSessionData ================== */ void G_WriteSessionData( void ) { int i; fileHandle_t tmpfile; trap_Cvar_Set( "session", va("%i", g_gametype.integer) ); for ( i = 0 ; i < level.maxclients ; i++ ) { if ( level.clients[i].pers.connected == CON_CONNECTED ) { G_WriteClientSessionData( &level.clients[i] ); } } //save2file //PLS2DO!!!! trap_FS_FOpenFile( "sess.dat", &tmpfile, FS_WRITE ); trap_FS_Write( g_sess, g_maxclients.integer * sizeof( clientSession_t ), tmpfile ); trap_FS_FCloseFile( tmpfile ); //plskthx //free( g_sess ); }
void G_WriteSessionData( void ) { int i; fileHandle_t f; const gclient_t *client = NULL; cJSON *root = cJSON_CreateObject(); cJSON_AddIntegerToObject( root, "gametype", level.gametype ); trap->Print( "G_WriteSessionData: writing %s...", metaFileName ); trap->FS_Open( metaFileName, &f, FS_WRITE ); Q_FSWriteJSON( root, f ); for ( i = 0, client = level.clients; i < level.maxclients; i++, client++ ) { if ( client->pers.connected == CON_CONNECTED ) { G_WriteClientSessionData( client ); } } trap->Print( "done\n" ); }
/* ================ G_InitSessionData Called on a first-time connect ================ */ void G_InitSessionData(gclient_t *client, char *userinfo) { clientSession_t *sess = &client->sess; // initial team determination sess->sessionTeam = TEAM_SPECTATOR; sess->spectatorState = SPECTATOR_FREE; sess->spectatorTime = level.time; sess->latchPlayerType = sess->playerType = 0; sess->latchPlayerWeapon = sess->playerWeapon = 0; sess->latchPlayerWeapon2 = sess->playerWeapon2 = 0; sess->spawnObjectiveIndex = 0; memset(sess->ignoreClients, 0, sizeof(sess->ignoreClients)); sess->muted = qfalse; memset(sess->skill, 0, sizeof(sess->skill)); memset(sess->skillpoints, 0, sizeof(sess->skillpoints)); memset(sess->startskillpoints, 0, sizeof(sess->startskillpoints)); memset(sess->medals, 0, sizeof(sess->medals)); sess->rank = 0; sess->startxptotal = 0; sess->coach_team = 0; // we set ref in ClientUserinfoChanged sess->referee = RL_NONE; // (client->pers.localClient) ? RL_REFEREE : RL_NONE; sess->spec_invite = 0; sess->spec_team = 0; // G_WriteClientSessionData calls this //G_deleteStats(client - level.clients); sess->uci = 0; // GeoIP G_WriteClientSessionData(client, qfalse); }
/* ================== 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); } }
void G_InitSessionData( gclient_t *client, char *userinfo ) { clientSession_t *sess; const char *value; sess = &client->sess; value = Info_ValueForKey( userinfo, "team" ); if ( value[0] == 's' ) { // a willing spectator, not a waiting-in-line sess->sessionTeam = TEAM_SPECTATOR; } else { switch ( g_gametype.integer ) { default: case GT_FFA: sess->sessionTeam = TEAM_FREE; break; case GT_SINGLE_PLAYER: sess->sessionTeam = TEAM_FREE; break; case GT_TOURNAMENT: // if the game is full, go into a waiting mode if ( level.numNonSpectatorClients >= 2 ) { sess->sessionTeam = TEAM_SPECTATOR; } else { sess->sessionTeam = TEAM_FREE; } break; } } sess->sessionClass = 0; //PC_NOCLASS; //TiM: Default Class sess->spectatorState = SPECTATOR_FREE; sess->spectatorTime = level.time; G_WriteClientSessionData( client ); }
// Called on a first-time connect void G_InitClientSessionData( gclient_t *client, char *userinfo, qboolean isBot ) { clientSession_t *sess = &client->sess; const char *value; client->sess.siegeDesiredTeam = TEAM_FREE; // initial team determination if ( level.gametype >= GT_TEAM ) { if ( g_teamAutoJoin.integer && !(g_entities[client-level.clients].r.svFlags & SVF_BOT) ) { sess->sessionTeam = PickTeam( -1 ); client->ps.fd.forceDoInit = 1; //every time we change teams make sure our force powers are set right } else { // always spawn as spectator in team games if (!isBot) { sess->sessionTeam = TEAM_SPECTATOR; } else { //Bots choose their team on creation value = Info_ValueForKey( userinfo, "team" ); if (value[0] == 'r' || value[0] == 'R') { sess->sessionTeam = TEAM_RED; } else if (value[0] == 'b' || value[0] == 'B') { sess->sessionTeam = TEAM_BLUE; } else { sess->sessionTeam = PickTeam( -1 ); } client->ps.fd.forceDoInit = 1; //every time we change teams make sure our force powers are set right } } } else { value = Info_ValueForKey( userinfo, "team" ); if ( value[0] == 's' ) { // a willing spectator, not a waiting-in-line sess->sessionTeam = TEAM_SPECTATOR; } else { switch ( level.gametype ) { default: case GT_FFA: case GT_SINGLE_PLAYER: if ( g_maxGameClients.integer > 0 && level.numNonSpectatorClients >= g_maxGameClients.integer ) { sess->sessionTeam = TEAM_SPECTATOR; } else { sess->sessionTeam = TEAM_FREE; } break; case GT_DUEL: // if the game is full, go into a waiting mode if ( level.numNonSpectatorClients >= 2 ) { sess->sessionTeam = TEAM_SPECTATOR; } else { sess->sessionTeam = TEAM_FREE; } break; case GT_POWERDUEL: //sess->duelTeam = DUELTEAM_LONE; //default { int loners = 0; int doubles = 0; G_PowerDuelCount(&loners, &doubles, qtrue); if (!doubles || loners > (doubles/2)) { sess->duelTeam = DUELTEAM_DOUBLE; } else { sess->duelTeam = DUELTEAM_LONE; } } sess->sessionTeam = TEAM_SPECTATOR; break; } } } sess->spectatorState = SPECTATOR_FREE; AddTournamentQueue(client); G_WriteClientSessionData( client ); }
/* ================== G_WriteSessionData ================== */ void G_WriteSessionData(void) { char map[ MAX_STRING_CHARS ]; int i; //int record = 0; int gameid = 0; int j; char data[ 255 ]; trap_Cvar_VariableStringBuffer("mapname", map, sizeof ( map)); //TA: ? trap_Cvar_Set("session", va("%i", 0)); trap_SendServerCommand( -1, "print \"^2Syncing with database\n\"" ); for( i = 0 ; i < level.maxclients ; i++ ) { if( level.clients[ i ].pers.connected == CON_CONNECTED ) { G_WriteClientSessionData( &level.clients[ i ] ); //Update mysql stuff here to. if(level.clients[ i ].pers.mysqlid > 1) { //level.clients[ i ].pers.playerlevel = G_EvalPlayerLevel( (level.clients[ i ].pers.statscounters.kills + level.clients[ i ].pers.totalkills), (level.clients[ i ].pers.statscounters.deaths + level.clients[ i ].pers.totaldeaths)); if (!level.clients[ i ].pers.playerlevel) level.clients[ i ].pers.playerlevel= 0; level.clients[ i ].pers.timeplayed += (level.time - level.clients[ i ].pers.enterTime) / 60000; //Minutes played level.clients[ i ].pers.structsbuilt += level.clients[ i ].pers.statscounters.structsbuilt; //level.clients[ i ].pers.structskilled += level.clients[ i ].pers.statscounters.structskilled; don't count anything but nodes if(level.clients[ i ].pers.teamSelection == PTE_HUMANS) { level.clients[ i ].pers.credits+=level.clients[ i ].ps.persistant[ PERS_CREDIT ]; } if(level.clients[ i ].pers.teamSelection == PTE_ALIENS) { level.clients[ i ].pers.evos = 0; } /* Badge related stuff */ if(level.clients[ i ].pers.teamSelection == level.lastWin) { level.clients[ i ].pers.gameswin += 1; } /************************IF MAZE for BADGES************************************/ //16 Zombie Bait Die 200 times if ( (level.clients[ i ].pers.badges[ 16 ] != 1) && ((level.clients[ i ].pers.totaldeaths + level.clients[ i ].pers.statscounters.deaths) >= 200) ) { level.clients[ i ].pers.badgeupdate[16] = 1; level.clients[ i ].pers.badges[16] = 1; } //17 Champion Win 500 games if ( (level.clients[ i ].pers.badges[ 17 ] != 1) && (level.clients[ i ].pers.gameswin >= 500) ) { level.clients[ i ].pers.badgeupdate[17] = 1; level.clients[ i ].pers.badges[17] = 1; } //19 Axe Me a Question Only get axe kills for an entire round if ( (level.clients[ i ].pers.badges[ 19 ] != 1) && (level.clients[ i ].pers.statscounters.kills > 0) && (level.clients[ i ].pers.statscounters.kills == level.clients[ i ].pers.axekills) ) { level.clients[ i ].pers.badgeupdate[19] = 1; level.clients[ i ].pers.badges[19] = 1; } //26 Eradication Kill 200 zombie nodes if ( (level.clients[ i ].pers.badges[ 26 ] != 1) && (level.clients[ i ].pers.structskilled >= 200) ) { level.clients[ i ].pers.badgeupdate[26] = 1; level.clients[ i ].pers.badges[26] = 1; } //30 Wingman Get 200 assists in one round if ( (level.clients[ i ].pers.badges[ 30 ] != 1) && (level.clients[ i ].pers.statscounters.assists >= 200) ) { level.clients[ i ].pers.badgeupdate[30] = 1; level.clients[ i ].pers.badges[30] = 1; } //31 Humanitarian Make it the first 10 minutes in a survival round without killing a single zombie if ( (level.clients[ i ].pers.badges[ 31 ] != 1) && (level.time >= 600000) && (level.clients[ i ].pers.statscounters.kills = 0)) { level.clients[ i ].pers.badgeupdate[31] = 1; level.clients[ i ].pers.badges[31] = 1; } //38 Flawless Make it an entire round without being hurt, and get at least 20 kills (so we know you aren't just hanging around base. =]) if ((level.clients[ i ].pers.badges[ 38 ] != 1) && (level.clients[ i ].pers.statscounters.kills >= 20) && !level.clients[ i ].pers.lastDamaged) { level.clients[ i ].pers.badgeupdate[38] = 1; level.clients[ i ].pers.badges[38] = 1; } /*************************************************************/ //Would be better if i runquery just one time instead of one per client. if( trap_mysql_runquery( va("UPDATE zplayers SET kills=\"%d\",deaths=\"%d\",pistolkills=\"%d\",timeplayed=\"%d\",adminlevel=\"%d\",playerlevel=\"%d\",lasttime=NOW(),gameswin=\"%d\",structsbuilt=\"%d\",structskilled=\"%d\" WHERE id=\"%d\" LIMIT 1",(level.clients[ i ].pers.statscounters.kills + level.clients[ i ].pers.totalkills), (level.clients[ i ].pers.statscounters.deaths + level.clients[ i ].pers.totaldeaths), level.clients[ i ].pers.pistolkills, level.clients[ i ].pers.timeplayed, level.clients[ i ].pers.adminlevel, level.clients[ i ].pers.playerlevel, level.clients[ i ].pers.gameswin, level.clients[ i ].pers.structsbuilt, level.clients[ i ].pers.structskilled, level.clients[ i ].pers.mysqlid ) ) == qtrue ) { trap_mysql_finishquery(); //Lets update the badges. //FIX ME: WTF LOL DOUBLE LOOPED UNECESARY for(j=1;j<49;j++) { if(level.clients[ i ].pers.badgeupdate[j] == 1) { if(trap_mysql_runquery( va("INSERT HIGH_PRIORITY INTO zbadges_player (idplayer,idbadge) VALUES (\"%d\",\"%d\")", level.clients[ i ].pers.mysqlid, j ) ) == qtrue) { trap_mysql_finishquery(); } else { trap_mysql_finishquery(); } } } } else { trap_mysql_finishquery(); } } } } trap_SendServerCommand( -1, "print \"^5Data updated\n\"" ); if(g_survival.integer && level.survivalRecordsBroke[0] > 0 && level.survivalRecordTime > 0 && !level.mysqlupdated) { if(trap_mysql_runquery(va("INSERT HIGH_PRIORITY INTO zgames (map,time) VALUES (\"%s\",\"%d\")", map, level.survivalRecordTime)) == qtrue) { trap_mysql_finishquery(); if(trap_mysql_runquery("SELECT id FROM zgames ORDER BY id desc LIMIT 1") == qtrue) { if(trap_mysql_fetchrow() == qtrue) { trap_mysql_fetchfieldbyName("id", data, sizeof(data)); gameid = atoi(data); } } } trap_mysql_finishquery(); } //trap_SendServerCommand( -1, va("print \"^5Game id: %d\n\"",gameid) ); for (i = 0; i < level.maxclients; i++) { if (level.clients[ i ].pers.connected == CON_CONNECTED) G_WriteClientSessionData(&level.clients[ i ]); if(!g_survival.integer) continue; if(level.clients[i].pers.mysqlid > 0 && gameid > 0 && !level.mysqlupdated) { if(trap_mysql_runquery(va("UPDATE zplayers set lasttime=NOW() WHERE id = \"%d\" LIMIT 1", level.clients[i].pers.mysqlid)) == qtrue) { // trap_SendServerCommand( -1, va("print \"^5Update player date %d\n\"",gameid) ); trap_mysql_finishquery(); } if(trap_mysql_runquery(va("INSERT HIGH_PRIORITY INTO zplayers_game (idgame,idplayer,timealive) VALUES (%d,%d,%d)", gameid, level.clients[i].pers.mysqlid, level.clients[i].pers.lastdeadtime)) == qtrue) { //trap_SendServerCommand( -1, va("print \"^5Insert players_game relation %d\n\"",gameid) ); trap_mysql_finishquery(); } } } if(g_survival.integer && level.survivalRecordTime > 0 && !level.mysqlupdated) { trap_SendServerCommand( -1, "print \"^5Records stored on the server.\n\"" ); } level.mysqlupdated = 1; }
/* ================ G_InitSessionData Called on a first-time connect ================ */ void G_InitSessionData( gclient_t *client, char *userinfo, qboolean isBot ) { clientSession_t *sess; const char *value; sess = &client->sess; client->sess.siegeDesiredTeam = TEAM_FREE; // initial team determination if ( level.gametype >= GT_TEAM ) { if ( g_teamAutoJoin.integer && !(g_entities[client-level.clients].r.svFlags & SVF_BOT) ) { sess->sessionTeam = PickTeam( -1 ); BroadcastTeamChange( client, -1 ); } else { // always spawn as spectator in team games if (!isBot) { sess->sessionTeam = TEAM_SPECTATOR; } else { //Bots choose their team on creation value = Info_ValueForKey( userinfo, "team" ); if (value[0] == 'r' || value[0] == 'R') { sess->sessionTeam = TEAM_RED; } else if (value[0] == 'b' || value[0] == 'B') { sess->sessionTeam = TEAM_BLUE; } else { sess->sessionTeam = PickTeam( -1 ); } BroadcastTeamChange( client, -1 ); } } } else { value = Info_ValueForKey( userinfo, "team" ); if ( value[0] == 's' ) { // a willing spectator, not a waiting-in-line sess->sessionTeam = TEAM_SPECTATOR; } else { switch ( level.gametype ) { default: case GT_FFA: case GT_HOLOCRON: case GT_JEDIMASTER: case GT_SINGLE_PLAYER: if (!isBot && (!g_maxGameClients.integer || (g_maxGameClients.integer > 0 && //loda fixme - this should fix clients showing ingame when they really arnt , when first connect? level.numNonSpectatorClients >= g_maxGameClients.integer))) { sess->sessionTeam = TEAM_SPECTATOR; } else { sess->sessionTeam = TEAM_FREE; } break; case GT_DUEL: // if the game is full, go into a waiting mode if ( level.numNonSpectatorClients >= 2 ) { sess->sessionTeam = TEAM_SPECTATOR; } else { sess->sessionTeam = TEAM_FREE; } break; case GT_POWERDUEL: //sess->duelTeam = DUELTEAM_LONE; //default { int loners = 0; int doubles = 0; G_PowerDuelCount(&loners, &doubles, qtrue); if (!doubles || loners > (doubles/2)) { sess->duelTeam = DUELTEAM_DOUBLE; } else { sess->duelTeam = DUELTEAM_LONE; } } sess->sessionTeam = TEAM_SPECTATOR; break; } } } sess->spectatorState = SPECTATOR_FREE; AddTournamentQueue(client); sess->siegeClass[0] = 0; sess->ignore = 0;//[JAPRO - Serverside - All - Ignore] G_WriteClientSessionData( client ); }
/** LQ3A: Changed return from void to qboolean. This function initilises the session data and assigns a team to the client, if we cannot assign a team it returns qfalse and the client should be dropped from the server. @see ClientConnect(). */ qboolean G_InitSessionData( gclient_t *client, char *userinfo ) { clientSession_t *sess; /* LQ3A */ // const char *value; qboolean bCanClientSpectate; int iVacantPlayerSlots; /* LQ3A */ UNREFERENCED_PARAMETER(userinfo); sess = &client->sess; /* LQ3A */ bCanClientSpectate = LQ3A_CanClientSpectate(LQ3A_ClientToEntity(client)); iVacantPlayerSlots = LQ3A_GetVacantPlayerSlots(); // initial team determination if (g_gametype.integer >= GT_TEAM) { /* LQ3A: Added support for g_maxGameClients in team games. Force auto join when the client cannot spectate. */ if (iVacantPlayerSlots && (g_teamAutoJoin.integer || !bCanClientSpectate)) { sess->sessionTeam = PickTeam( -1 ); BroadcastTeamChange( client, -1 ); } else if (bCanClientSpectate) { sess->sessionTeam = TEAM_SPECTATOR; } else { /* No vacant player slots and we cannot spectate. */ return qfalse; } } else { /* LQ3A: Place clients into spectator mode by default where possible. */ if (bCanClientSpectate) { sess->sessionTeam = TEAM_SPECTATOR; } /* If we cannot spectate, place the client in the game when there are vacant slots. */ else if (iVacantPlayerSlots) { sess->sessionTeam = TEAM_FREE; } else { /* No vacant player slots and we cannot spectate. */ return qfalse; } } sess->spectatorState = SPECTATOR_FREE; sess->spectatorTime = level.time; /* LQ3A */ if (sess->sessionTeam == TEAM_SPECTATOR) { LQ3A_CompleteClientMoveToSpectatorTeam(LQ3A_ClientToEntity(client)); } G_WriteClientSessionData( client ); /* LQ3A */ return qtrue; }
/* =========== ClientBegin called when a client has finished connecting, and is ready to be placed into the level. This will happen every level load, and on transition between teams, but doesn't happen on respawns ============ */ void ClientBegin( int clientNum, qboolean allowTeamReset ) { gentity_t *ent; gclient_t *client; gentity_t *tent; int flags, i; char userinfo[MAX_INFO_VALUE], *modelname; ent = g_entities + clientNum; if ((ent->r.svFlags & SVF_BOT) && g_gametype.integer >= GT_TEAM) { if (allowTeamReset) { const char *team = "Red"; int preSess; //SetTeam(ent, ""); ent->client->sess.sessionTeam = PickTeam(-1); trap_GetUserinfo(clientNum, userinfo, MAX_INFO_STRING); if (ent->client->sess.sessionTeam == TEAM_SPECTATOR) { ent->client->sess.sessionTeam = TEAM_RED; } if (ent->client->sess.sessionTeam == TEAM_RED) { team = "Red"; } else { team = "Blue"; } Info_SetValueForKey( userinfo, "team", team ); trap_SetUserinfo( clientNum, userinfo ); ent->client->ps.persistant[ PERS_TEAM ] = ent->client->sess.sessionTeam; preSess = ent->client->sess.sessionTeam; G_ReadSessionData( ent->client ); ent->client->sess.sessionTeam = preSess; G_WriteClientSessionData(ent->client); ClientUserinfoChanged( clientNum ); ClientBegin(clientNum, qfalse); return; } } client = level.clients + clientNum; if ( ent->r.linked ) { trap_UnlinkEntity( ent ); } G_InitGentity( ent ); ent->touch = 0; ent->pain = 0; ent->client = client; client->pers.connected = CON_CONNECTED; client->pers.enterTime = level.time; client->pers.teamState.state = TEAM_BEGIN; // save eflags around this, because changing teams will // cause this to happen with a valid entity, and we // want to make sure the teleport bit is set right // so the viewpoint doesn't interpolate through the // world to the new position flags = client->ps.eFlags; i = 0; while (i < NUM_FORCE_POWERS) { if (ent->client->ps.fd.forcePowersActive & (1 << i)) { WP_ForcePowerStop(ent, i); } i++; } i = TRACK_CHANNEL_1; while (i < NUM_TRACK_CHANNELS) { if (ent->client->ps.fd.killSoundEntIndex[i-50] && ent->client->ps.fd.killSoundEntIndex[i-50] < MAX_GENTITIES && ent->client->ps.fd.killSoundEntIndex[i-50] > 0) { G_MuteSound(ent->client->ps.fd.killSoundEntIndex[i-50], CHAN_VOICE); } i++; } i = 0; memset( &client->ps, 0, sizeof( client->ps ) ); client->ps.eFlags = flags; client->ps.hasDetPackPlanted = qfalse; //first-time force power initialization WP_InitForcePowers( ent ); //init saber ent WP_SaberInitBladeData( ent ); // First time model setup for that player. trap_GetUserinfo( clientNum, userinfo, sizeof(userinfo) ); modelname = Info_ValueForKey (userinfo, "model"); SetupGameGhoul2Model(client, modelname); if (ent->client->ghoul2) { ent->bolt_Head = trap_G2API_AddBolt(ent->client->ghoul2, 0, "cranium"); ent->bolt_Waist = trap_G2API_AddBolt(ent->client->ghoul2, 0, "thoracic"); ent->bolt_LArm = trap_G2API_AddBolt(ent->client->ghoul2, 0, "lradius"); ent->bolt_RArm = trap_G2API_AddBolt(ent->client->ghoul2, 0, "rradius"); ent->bolt_LLeg = trap_G2API_AddBolt(ent->client->ghoul2, 0, "ltibia"); ent->bolt_RLeg = trap_G2API_AddBolt(ent->client->ghoul2, 0, "rtibia"); ent->bolt_Motion = trap_G2API_AddBolt(ent->client->ghoul2, 0, "Motion"); } // locate ent at a spawn point ClientSpawn( ent ); if ( client->sess.sessionTeam != TEAM_SPECTATOR ) { // send event tent = G_TempEntity( ent->client->ps.origin, EV_PLAYER_TELEPORT_IN ); tent->s.clientNum = ent->s.clientNum; if ( g_gametype.integer != GT_TOURNAMENT ) { trap_SendServerCommand( -1, va("print \"%s" S_COLOR_WHITE " %s\n\"", client->pers.netname, G_GetStripEdString("SVINGAME", "PLENTER")) ); } } G_LogPrintf( "ClientBegin: %i\n", clientNum ); // count current clients and rank for scoreboard CalculateRanks(); G_ClearClientLog(clientNum); }
/* ================ G_InitSessionData Called on a first-time connect ================ */ void G_InitSessionData( gclient_t *client, char *userinfo, qboolean isBot ) { clientSession_t *sess; const char *value; int clientNum; sess = &client->sess; clientNum = client - level.clients; // initial team determination if ( GT_Team(g_gametype.integer) ) { if ( g_teamAutoJoin.integer ) { sess->sessionTeam = PickTeam( -1 ); } else { // always spawn as spectator in team games if (!isBot) { sess->sessionTeam = TEAM_SPECTATOR; } else { //Bots choose their team on creation value = Info_ValueForKey( userinfo, "team" ); if (value[0] == 'r' || value[0] == 'R') { sess->sessionTeam = ValidateTeam( -1, TEAM_RED ) ? TEAM_RED : TEAM_SPECTATOR; } else if (value[0] == 'b' || value[0] == 'B') { sess->sessionTeam = ValidateTeam( -1, TEAM_BLUE ) ? TEAM_BLUE : TEAM_SPECTATOR; } else { sess->sessionTeam = PickTeam( -1 ); } } } } else { value = Info_ValueForKey( userinfo, "team" ); if ( value[0] == 's' ) { // a willing spectator, not a waiting-in-line sess->sessionTeam = TEAM_SPECTATOR; } else { switch ( g_gametype.integer ) { default: case GT_FFA: case GT_HOLOCRON: case GT_JEDIMASTER: case GT_SINGLE_PLAYER: sess->sessionTeam = ValidateTeam( clientNum, TEAM_FREE ) ? TEAM_FREE : TEAM_SPECTATOR; break; case GT_TOURNAMENT: // if the game is full, go into a waiting mode if ( level.numNonSpectatorClients >= 2 ) { sess->sessionTeam = TEAM_SPECTATOR; } else { sess->sessionTeam = TEAM_FREE; } break; } } } if ( sess->sessionTeam == TEAM_SPECTATOR ) sess->spectatorState = SPECTATOR_FREE; else if ( level.round > 0 && g_gametype.integer != GT_REDROVER ) sess->spectatorState = SPECTATOR_FREE; else sess->spectatorState = SPECTATOR_NOT; sess->spectatorTime = level.time; G_WriteClientSessionData( client ); }
/* ================ G_InitSessionData Called on a first-time connect ================ */ void G_InitSessionData( gclient_t *client, char *userinfo, qboolean isBot ) { clientSession_t *sess; const char *value; sess = &client->sess; client->sess.siegeDesiredTeam = TEAM_FREE; // initial team determination if ( g_gametype.integer >= GT_TEAM ) { if ( g_teamAutoJoin.integer ) { sess->sessionTeam = PickTeam( -1 ); BroadcastTeamChange( client, -1 ); } else { // always spawn as spectator in team games if (!isBot) { sess->sessionTeam = TEAM_SPECTATOR; } else { //Bots choose their team on creation value = Info_ValueForKey( userinfo, "team" ); if (value[0] == 'r' || value[0] == 'R') { sess->sessionTeam = TEAM_RED; } else if (value[0] == 'b' || value[0] == 'B') { sess->sessionTeam = TEAM_BLUE; } else { sess->sessionTeam = PickTeam( -1 ); } BroadcastTeamChange( client, -1 ); } } } else { value = Info_ValueForKey( userinfo, "team" ); if ( value[0] == 's' ) { // a willing spectator, not a waiting-in-line sess->sessionTeam = TEAM_SPECTATOR; } else { switch ( g_gametype.integer ) { default: case GT_FFA: case GT_HOLOCRON: case GT_JEDIMASTER: case GT_SINGLE_PLAYER: if ( g_maxGameClients.integer > 0 && level.numNonSpectatorClients >= g_maxGameClients.integer ) { sess->sessionTeam = TEAM_SPECTATOR; } else { sess->sessionTeam = TEAM_FREE; } break; case GT_DUEL: // if the game is full, go into a waiting mode if ( level.numNonSpectatorClients >= 2 ) { sess->sessionTeam = TEAM_SPECTATOR; } else { sess->sessionTeam = TEAM_FREE; } break; case GT_POWERDUEL: //sess->duelTeam = DUELTEAM_LONE; //default { int loners = 0; int doubles = 0; G_PowerDuelCount(&loners, &doubles, qtrue); if (!doubles || loners > (doubles/2)) { sess->duelTeam = DUELTEAM_DOUBLE; } else { sess->duelTeam = DUELTEAM_LONE; } } sess->sessionTeam = TEAM_SPECTATOR; break; } } } sess->spectatorState = SPECTATOR_FREE; sess->spectatorTime = level.time; sess->siegeClass[0] = 0; sess->saberType[0] = 0; sess->saber2Type[0] = 0; G_WriteClientSessionData( client ); }