rust/hedgewars-server/src/core/server.rs
changeset 16001 8ba2b5007c29
parent 16000 d9f1b239b6d7
child 16002 e915ed28726e
--- 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<Item = &HwClient> + Clone), JoinRoomError> {
+    ) -> Result<(&HwClient, Option<&HwClient>, &HwRoom, impl Iterator<Item = &HwClient> + 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<Item = &HwClient> + Clone), JoinRoomError> {
+    ) -> Result<(&HwClient, Option<&HwClient>, &HwRoom, impl Iterator<Item = &HwClient> + 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 {