@@ -1200,6 +1200,9 @@ void ServerLobby::asynchronousUpdate()
1200
1200
m_item_seed = (uint32_t)StkTime::getTimeSinceEpoch();
1201
1201
ItemManager::updateRandomSeed(m_item_seed);
1202
1202
m_game_setup->setRace(winner_vote, m_extra_seconds);
1203
+
1204
+ // For spectators that don't have the track, remember their
1205
+ // spectate mode and don't load the track
1203
1206
std::string track_name = winner_vote.m_track_name;
1204
1207
if (ServerConfig::m_soccer_tournament)
1205
1208
{
@@ -1208,13 +1211,14 @@ void ServerLobby::asynchronousUpdate()
1208
1211
m_tournament_arenas[m_tournament_game] = track_name;
1209
1212
}
1210
1213
auto peers = STKHost::get()->getPeers();
1211
- std::map<std::shared_ptr<STKPeer>, AlwaysSpectateMode> bad_spectators;
1214
+ std::map<std::shared_ptr<STKPeer>,
1215
+ AlwaysSpectateMode> previous_spectate_mode;
1212
1216
for (auto peer : peers)
1213
1217
{
1214
1218
if (peer->alwaysSpectate() &&
1215
1219
peer->getClientAssets().second.count(track_name) == 0)
1216
1220
{
1217
- bad_spectators [peer] = peer->getAlwaysSpectate();
1221
+ previous_spectate_mode [peer] = peer->getAlwaysSpectate();
1218
1222
peer->setAlwaysSpectate(ASM_NONE);
1219
1223
peer->setWaitingForGame(true);
1220
1224
m_peers_ready.erase(peer);
@@ -1223,8 +1227,9 @@ void ServerLobby::asynchronousUpdate()
1223
1227
bool has_always_on_spectators = false;
1224
1228
auto players = STKHost::get()
1225
1229
->getPlayersForNewGame(&has_always_on_spectators);
1226
- for (auto& p: bad_spectators)
1227
- p.first->setAlwaysSpectate(p.second);
1230
+ for (auto& p: previous_spectate_mode)
1231
+ if (p.first)
1232
+ p.first->setAlwaysSpectate(p.second);
1228
1233
auto ai_instance = m_ai_peer.lock();
1229
1234
if (supportsAI())
1230
1235
{
@@ -1315,7 +1320,7 @@ void ServerLobby::asynchronousUpdate()
1315
1320
sendMessageToPeers(load_world_message);
1316
1321
// updatePlayerList so the in lobby players (if any) can see always
1317
1322
// spectators join the game
1318
- if (has_always_on_spectators || !bad_spectators .empty())
1323
+ if (has_always_on_spectators || !previous_spectate_mode .empty())
1319
1324
updatePlayerList();
1320
1325
delete load_world_message;
1321
1326
@@ -3994,7 +3999,12 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr<STKPeer> peer,
3994
3999
unsigned max_players = ServerConfig::m_server_max_players;
3995
4000
// We need to reserve at least 1 slot for new player
3996
4001
if (player_count + ai_add + 1 > max_players)
3997
- ai_add = max_players - player_count - 1;
4002
+ {
4003
+ if (max_players >= player_count + 1)
4004
+ ai_add = max_players - player_count - 1;
4005
+ else
4006
+ ai_add = 0;
4007
+ }
3998
4008
for (unsigned i = 0; i < ai_add; i++)
3999
4009
{
4000
4010
#ifdef SERVER_ONLY
0 commit comments