@@ -1985,7 +1985,7 @@ void ServerLobby::asynchronousUpdate()
1985
1985
if (areKartFiltersIgnoringKarts ())
1986
1986
current_kart = " " ;
1987
1987
std::string name = StringUtils::wideToUtf8 (players[i]->getName ());
1988
- players[i]->setKartName (getKartForBadKartChoice (name, current_kart));
1988
+ players[i]->setKartName (getKartForBadKartChoice (players[i]-> getPeer (). get (), name, current_kart));
1989
1989
}
1990
1990
1991
1991
NetworkString* load_world_message = getLoadWorldMessage (players,
@@ -3192,7 +3192,7 @@ void ServerLobby::startSelection(const Event *event)
3192
3192
.addUInt8 (ServerConfig::m_track_voting ? 1 : 0 );
3193
3193
3194
3194
3195
- std::set<std::string> all_k = m_available_kts .first ;
3195
+ std::set<std::string> all_k = peer-> getClientAssets () .first ;
3196
3196
std::string username = StringUtils::wideToUtf8 (peer->getPlayerProfiles ()[0 ]->getName ());
3197
3197
// std::string username = StringUtils::wideToUtf8(profile->getName());
3198
3198
applyAllKartFilters (username, all_k);
@@ -6345,7 +6345,7 @@ void ServerLobby::setPlayerKarts(const NetworkString& ns, STKPeer* peer) const
6345
6345
if (areKartFiltersIgnoringKarts ())
6346
6346
current_kart = " " ;
6347
6347
std::string name = StringUtils::wideToUtf8 (peer->getPlayerProfiles ()[i]->getName ());
6348
- peer->getPlayerProfiles ()[i]->setKartName (getKartForBadKartChoice (name, current_kart));
6348
+ peer->getPlayerProfiles ()[i]->setKartName (getKartForBadKartChoice (peer, name, current_kart));
6349
6349
}
6350
6350
if (peer->getClientCapabilities ().find (" real_addon_karts" ) ==
6351
6351
peer->getClientCapabilities ().end () || ns.size () == 0 )
@@ -6564,6 +6564,7 @@ std::set<STKPeer*>& ServerLobby::getSpectatorsByLimit(bool update)
6564
6564
if (!update)
6565
6565
return m_spectators_by_limit;
6566
6566
6567
+ m_peers_ability_to_play.clear ();
6567
6568
m_spectators_by_limit.clear ();
6568
6569
6569
6570
auto peers = STKHost::get ()->getPeers ();
@@ -6655,7 +6656,7 @@ bool ServerLobby::supportsAI()
6655
6656
} // supportsAI
6656
6657
6657
6658
// -----------------------------------------------------------------------------
6658
- bool ServerLobby::checkPeersReady (bool ignore_ai_peer) const
6659
+ bool ServerLobby::checkPeersReady (bool ignore_ai_peer)
6659
6660
{
6660
6661
bool all_ready = true ;
6661
6662
bool someone_races = false ;
@@ -7256,45 +7257,52 @@ void ServerLobby::sendStringToAllPeers(std::string& s)
7256
7257
delete chat;
7257
7258
} // sendStringToAllPeers
7258
7259
// -----------------------------------------------------------------------------
7259
- bool ServerLobby::canRace (std::shared_ptr<STKPeer>& peer) const
7260
+ bool ServerLobby::canRace (std::shared_ptr<STKPeer>& peer)
7260
7261
{
7261
7262
return canRace (peer.get ());
7262
7263
} // canRace
7263
7264
// -----------------------------------------------------------------------------
7264
- bool ServerLobby::canRace (STKPeer* peer) const
7265
+ bool ServerLobby::canRace (STKPeer* peer)
7265
7266
{
7267
+ auto it = m_peers_ability_to_play.find (peer);
7268
+ if (it != m_peers_ability_to_play.end ())
7269
+ return it->second ;
7270
+
7266
7271
if (!peer || peer->getPlayerProfiles ().empty ())
7267
- return false ;
7272
+ return m_peers_ability_to_play[peer] = false ;
7268
7273
std::string username = StringUtils::wideToUtf8 (
7269
7274
peer->getPlayerProfiles ()[0 ]->getName ());
7270
7275
if (ServerConfig::m_soccer_tournament)
7271
7276
{
7272
7277
if (m_tournament_red_players.count (username) == 0 &&
7273
7278
m_tournament_blue_players.count (username) == 0 )
7274
- return false ;
7279
+ return m_peers_ability_to_play[peer] = false ;
7275
7280
}
7276
7281
else if (m_spectators_by_limit.find (peer) != m_spectators_by_limit.end ())
7277
- return false ;
7282
+ return m_peers_ability_to_play[peer] = false ;
7278
7283
7279
7284
std::set<std::string> maps = peer->getClientAssets ().second ;
7280
7285
std::set<std::string> karts = peer->getClientAssets ().first ;
7281
7286
7282
7287
applyAllFilters (maps, true );
7283
7288
applyAllKartFilters (username, karts, false );
7284
7289
7290
+ if (maps.empty () || karts.empty ())
7291
+ return m_peers_ability_to_play[peer] = false ;
7292
+
7285
7293
if (!m_play_requirement_tracks.empty ())
7286
7294
for (const std::string& track: m_play_requirement_tracks)
7287
7295
if (peer->getClientAssets ().second .count (track) == 0 )
7288
- return false ;
7296
+ return m_peers_ability_to_play[peer] = false ;
7289
7297
if (peer->addon_karts_count < ServerConfig::m_addon_karts_play_threshold)
7290
- return false ;
7298
+ return m_peers_ability_to_play[peer] = false ;
7291
7299
if (peer->addon_tracks_count < ServerConfig::m_addon_tracks_play_threshold)
7292
- return false ;
7300
+ return m_peers_ability_to_play[peer] = false ;
7293
7301
if (peer->addon_arenas_count < ServerConfig::m_addon_arenas_play_threshold)
7294
- return false ;
7302
+ return m_peers_ability_to_play[peer] = false ;
7295
7303
if (peer->addon_soccers_count < ServerConfig::m_addon_soccers_play_threshold)
7296
- return false ;
7297
- return true ;
7304
+ return m_peers_ability_to_play[peer] = false ;
7305
+ return m_peers_ability_to_play[peer] = true ;
7298
7306
} // canRace
7299
7307
// -----------------------------------------------------------------------------
7300
7308
bool ServerLobby::canVote (std::shared_ptr<STKPeer>& peer) const
@@ -8218,9 +8226,13 @@ void ServerLobby::applyAllFilters(std::set<std::string>& maps, bool use_history)
8218
8226
}
8219
8227
track_context.wildcards = m_map_history;
8220
8228
if (!m_onetime_tracks_queue.empty ())
8229
+ {
8221
8230
m_onetime_tracks_queue.front ()->apply (track_context);
8231
+ }
8222
8232
if (!m_cyclic_tracks_queue.empty ())
8233
+ {
8223
8234
m_cyclic_tracks_queue.front ()->apply (track_context);
8235
+ }
8224
8236
}
8225
8237
swap (maps, track_context.elements );
8226
8238
} // applyAllFilters
@@ -8257,9 +8269,9 @@ bool ServerLobby::areKartFiltersIgnoringKarts() const
8257
8269
return false ;
8258
8270
} // applyAllKartFilters
8259
8271
// -----------------------------------------------------------------------------
8260
- std::string ServerLobby::getKartForBadKartChoice (const std::string& username, const std::string& check_choice) const
8272
+ std::string ServerLobby::getKartForBadKartChoice (STKPeer* peer, const std::string& username, const std::string& check_choice) const
8261
8273
{
8262
- std::set<std::string> karts = m_available_kts .first ;
8274
+ std::set<std::string> karts = peer-> getClientAssets () .first ;
8263
8275
applyAllKartFilters (username, karts, true );
8264
8276
if (m_kart_elimination.isEliminated (username)
8265
8277
&& karts.count (m_kart_elimination.getKart ()))
0 commit comments