diff -r d73e6cb37f83 -r d9f1b239b6d7 rust/hedgewars-server/src/core/server.rs --- a/rust/hedgewars-server/src/core/server.rs Mon Mar 25 15:59:14 2024 +0300 +++ b/rust/hedgewars-server/src/core/server.rs Mon Mar 25 16:05:11 2024 +0300 @@ -361,7 +361,7 @@ Err(Restricted) } else if room.is_registration_required() { Err(RegistrationRequired) - } else if room.players_number == u8::max_value() { + } else if room.players_number == u8::MAX { Err(Full) } else { move_to_room(client, room); @@ -620,7 +620,10 @@ } fn remove_from_room(&mut self, client_id: ClientId) -> LeaveRoomResult { - let (client, room) = self.server.client_and_room_mut(client_id).expect("Caller should have ensured the client is in this room"); + let (client, room) = self + .server + .client_and_room_mut(client_id) + .expect("Caller should have ensured the client is in this room"); room.players_number -= 1; client.room_id = None; @@ -937,7 +940,7 @@ Err(Restricted) } else { info.owner = client.nick.clone(); - let team = room.add_team(client.id, *info, client.protocol_number < 42); + let team = room.add_team(&client, *info, client.protocol_number < 42); client.teams_in_game += 1; client.clan = Some(team.color); Ok(team) @@ -949,7 +952,7 @@ let (client, room) = self.get_mut(); match room.find_team_owner(team_name) { None => Err(NoTeam), - Some((id, _)) if id != client.id => Err(RemoveTeamError::TeamNotOwned), + Some((id, _)) if id != client.id => Err(TeamNotOwned), Some(_) => { client.teams_in_game -= 1; client.clan = room.find_team_color(client.id); @@ -1171,14 +1174,22 @@ client.room_id = Some(room.id); client.set_is_in_game(room.game_info.is_some()); - if let Some(ref mut info) = room.game_info { - let teams = info.client_teams(client.id); - client.teams_in_game = teams.clone().count() as u8; - client.clan = teams.clone().next().map(|t| t.color); - let team_names: Vec<_> = teams.map(|t| t.name.clone()).collect(); + #[cfg(feature = "official-server")] + let can_rejoin = client.is_registered(); + + #[cfg(not(feature = "official-server"))] + let can_rejoin = true; - if !team_names.is_empty() { - info.left_teams.retain(|name| !team_names.contains(&name)); + if can_rejoin { + if let Some(ref mut info) = room.game_info { + let teams = info.client_teams_by_nick(&client.nick); + client.teams_in_game = teams.clone().count() as u8; + client.clan = teams.clone().next().map(|t| t.color); + let team_names: Vec<_> = teams.map(|t| t.name.clone()).collect(); + + if !team_names.is_empty() { + info.left_teams.retain(|name| !team_names.contains(&name)); + } } } }