void CGameStats::RemovePlayer(int plr, bool keep) { SGetTime time(m_roundStart); if(DEBUG_VERBOSE) CryLog("CGameStats::RemovePlayer %08X %s", plr, keep?"keep":""); PlayerStatsMap::iterator it = m_playerMap.find(plr); if(it == m_playerMap.end()) return; if(m_statsTrack && m_playing) { SubmitPlayerStats(it->second, gEnv->bServer, false); m_statsTrack->PlayerDisconnected(it->second.id); } it->second.stats.push_back( new SPlayerStats(time) ); if(!keep) { m_stateChanged = true; int num_players = m_playerMap.size(); m_playerMap.erase(it); Report(); if(m_serverReport && num_players == gEnv->pConsole->GetCVar("sv_maxplayers")->GetIVal())//if server was full, report now { m_serverReport->Update(); m_stateChanged = false; } } }
void SMOnlineStats::SendStats() { unsigned int ID; GameStats* stats; while (!m_gamesSend.empty()) { stats = m_gamesSend.front(); m_gamesSend.pop(); if (stats->m_pStats.size() > 0) { if (!GetSongID(stats->m_song.m_song, ID)) SubmitNewSong(stats->m_song.m_song); if (!GetSongID(stats->m_song.m_song, ID)) { m_gamesResend.push(stats); continue; } stats->m_song.ID = ID; IncrementSongPlayCount(ID, 1); if (SubmitNewRound(*stats)) SubmitPlayerStats(*stats); SubmitPlayerTotals(*stats); } SAFE_DELETE(stats); } }
void CGameStats::EndGame(bool server) { if(!server && gEnv->bServer)//we simply ignore client events on server return; if(m_statsTrack && m_playing) { SGetTime time(m_roundStart); if(gEnv->bServer) SubmitServerStats(); for(PlayerStatsMap::iterator it = m_playerMap.begin(), eit = m_playerMap.end();it!=eit; ++it) { SubmitPlayerStats(it->second, gEnv->bServer, it->first == CCryAction::GetCryAction()->GetClientActorId()); it->second.stats.push_back( new SPlayerStats(time) ); } m_statsTrack->EndGame(); } m_playing = false; ReportGame(); if(m_serverReport) m_serverReport->Update(); }