diff -r d9f1b239b6d7 -r 8ba2b5007c29 rust/hedgewars-server/src/core/server.rs --- a/rust/hedgewars-server/src/core/server.rs Mon Mar 25 16:05:11 2024 +0300 +++ b/rust/hedgewars-server/src/core/server.rs Wed Mar 27 02:19:44 2024 +0300 @@ -345,7 +345,7 @@ client_id: ClientId, room_id: RoomId, room_password: Option<&str>, - ) -> Result<(&HwClient, &HwRoom, impl Iterator + Clone), JoinRoomError> { + ) -> Result<(&HwClient, Option<&HwClient>, &HwRoom, impl Iterator + Clone), JoinRoomError> { use JoinRoomError::*; let room = &mut self.rooms[room_id]; let client = &mut self.clients[client_id]; @@ -359,7 +359,7 @@ Err(WrongPassword) } else if room.is_join_restricted() { Err(Restricted) - } else if room.is_registration_required() { + } else if room.is_registration_required() && !client.is_registered() { Err(RegistrationRequired) } else if room.players_number == u8::MAX { Err(Full) @@ -368,6 +368,7 @@ let room_id = room.id; Ok(( &self.clients[client_id], + room.master_id.map(|id| &self.clients[id]), &self.rooms[room_id], self.iter_clients() .filter(move |c| c.room_id == Some(room_id)), @@ -381,7 +382,7 @@ client_id: ClientId, room_name: &str, room_password: Option<&str>, - ) -> Result<(&HwClient, &HwRoom, impl Iterator + Clone), JoinRoomError> { + ) -> Result<(&HwClient, Option<&HwClient>, &HwRoom, impl Iterator + Clone), JoinRoomError> { use JoinRoomError::*; let room = self.rooms.iter().find(|(_, r)| r.name == room_name); if let Some((_, room)) = room { @@ -633,7 +634,9 @@ let was_in_game = client.is_in_game(); let mut removed_teams = vec![]; - if is_empty && !is_fixed { + self.is_room_removed = is_empty && !is_fixed; + + if !self.is_room_removed { if client.is_ready() && room.ready_players_number > 0 { room.ready_players_number -= 1; } @@ -663,33 +666,29 @@ client.set_is_ready(false); client.set_is_in_game(false); - if !is_fixed { - if room.players_number == 0 { - self.is_room_removed = true - } else if room.master_id == None { - let protocol_number = room.protocol_number; - let new_master_id = self.server.room_client_ids(self.room_id).next(); + if !self.is_room_removed && room.master_id == None { + let protocol_number = room.protocol_number; + let new_master_id = self.server.room_client_ids(self.room_id).next(); + + if let Some(new_master_id) = new_master_id { + let room = self.room_mut(); + room.master_id = Some(new_master_id); + let new_master = &mut self.server.clients[new_master_id]; + new_master.set_is_master(true); - if let Some(new_master_id) = new_master_id { - let room = self.room_mut(); - room.master_id = Some(new_master_id); - let new_master = &mut self.server.clients[new_master_id]; - new_master.set_is_master(true); + if protocol_number < 42 { + let nick = new_master.nick.clone(); + self.room_mut().name = nick; + } - if protocol_number < 42 { - let nick = new_master.nick.clone(); - self.room_mut().name = nick; - } - - let room = self.room_mut(); - room.set_join_restriction(false); - room.set_team_add_restriction(false); - room.set_unregistered_players_restriction(true); - } + let room = self.room_mut(); + room.set_join_restriction(false); + room.set_team_add_restriction(false); + room.set_unregistered_players_restriction(false); } } - if is_empty && !is_fixed { + if self.is_room_removed { LeaveRoomResult::RoomRemoved } else { LeaveRoomResult::RoomRemains {