gameServer2/src/server/actions.rs
changeset 13666 09f4a30e50cc
parent 13527 e3ae9eea0689
child 13801 5fb40c8e5542
--- a/gameServer2/src/server/actions.rs	Tue Aug 14 15:25:05 2018 +0200
+++ b/gameServer2/src/server/actions.rs	Thu Aug 16 19:33:03 2018 +0300
@@ -11,13 +11,15 @@
     room::HWRoom,
     handlers
 };
-use protocol::messages::{
-    HWProtocolMessage,
-    HWServerMessage,
-    HWServerMessage::*,
-    server_chat
+use crate::{
+    protocol::messages::{
+        HWProtocolMessage,
+        HWServerMessage,
+        HWServerMessage::*,
+        server_chat
+    },
+    utils::to_engine_msg
 };
-use utils::to_engine_msg;
 use rand::{thread_rng, Rng, distributions::Uniform};
 
 pub enum Destination {
@@ -118,15 +120,10 @@
     match action {
         Send(msg) => server.send(client_id, &msg.destination, msg.message),
         ByeClient(msg) => {
-            let room_id;
-            let nick;
-            {
-                let c = &server.clients[client_id];
-                room_id = c.room_id;
-                nick = c.nick.clone();
-            }
+            let c = &server.clients[client_id];
+            let nick = c.nick.clone();
 
-            if let Some(id) = room_id{
+            if let Some(id) = c.room_id{
                 if id != server.lobby_id {
                     server.react(client_id, vec![
                         MoveToLobby(format!("quit: {}", msg.clone()))]);
@@ -155,16 +152,14 @@
         JoinLobby => {
             server.clients[client_id].room_id = Some(server.lobby_id);
 
-            let joined_msg;
-            {
-                let mut lobby_nicks = Vec::new();
-                for (_, c) in server.clients.iter() {
-                    if c.room_id.is_some() {
-                        lobby_nicks.push(c.nick.clone());
-                    }
+            let mut lobby_nicks = Vec::new();
+            for (_, c) in server.clients.iter() {
+                if c.room_id.is_some() {
+                    lobby_nicks.push(c.nick.clone());
                 }
-                joined_msg = LobbyJoined(lobby_nicks);
             }
+            let joined_msg = LobbyJoined(lobby_nicks);
+
             let everyone_msg = LobbyJoined(vec![server.clients[client_id].nick.clone()]);
             let flags_msg = ClientFlags(
                 "+i".to_string(),
@@ -188,105 +183,102 @@
         },
         AddRoom(name, password) => {
             let room_id = server.add_room();;
-            let actions = {
-                let r = &mut server.rooms[room_id];
-                let c = &mut server.clients[client_id];
-                r.master_id = Some(c.id);
-                r.name = name;
-                r.password = password;
-                r.protocol_number = c.protocol_number;
 
-                vec![
-                    RoomAdd(r.info(Some(&c))).send_all()
-                        .with_protocol(r.protocol_number).action(),
-                    MoveToRoom(room_id)]
-            };
+            let r = &mut server.rooms[room_id];
+            let c = &mut server.clients[client_id];
+            r.master_id = Some(c.id);
+            r.name = name;
+            r.password = password;
+            r.protocol_number = c.protocol_number;
+
+            let actions = vec![
+                RoomAdd(r.info(Some(&c))).send_all()
+                    .with_protocol(r.protocol_number).action(),
+                MoveToRoom(room_id)];
+
             server.react(client_id, actions);
         },
         RemoveRoom(room_id) => {
-            let actions = {
-                let r = &mut server.rooms[room_id];
-                vec![RoomRemove(r.name.clone()).send_all()
-                        .with_protocol(r.protocol_number).action()]
-            };
+            let r = &mut server.rooms[room_id];
+            let actions = vec![RoomRemove(r.name.clone()).send_all()
+                .with_protocol(r.protocol_number).action()];
             server.rooms.remove(room_id);
             server.react(client_id, actions);
         }
         MoveToRoom(room_id) => {
-            let actions = {
-                let r = &mut server.rooms[room_id];
-                let c = &mut server.clients[client_id];
-                r.players_number += 1;
-                c.room_id = Some(room_id);
+            let r = &mut server.rooms[room_id];
+            let c = &mut server.clients[client_id];
+            r.players_number += 1;
+            c.room_id = Some(room_id);
+
+            let is_master = r.master_id == Some(c.id);
+            c.set_is_master(is_master);
+            c.set_is_ready(is_master);
+            c.set_is_joined_mid_game(false);
+
+            if is_master {
+                r.ready_players_number += 1;
+            }
+
+            let mut v = vec![
+                RoomJoined(vec![c.nick.clone()]).send_all().in_room(room_id).action(),
+                ClientFlags("+i".to_string(), vec![c.nick.clone()]).send_all().action(),
+                SendRoomUpdate(None)];
+
+            if !r.greeting.is_empty() {
+                v.push(ChatMsg {nick: "[greeting]".to_string(), msg: r.greeting.clone()}
+                    .send_self().action());
+            }
 
-                let is_master = r.master_id == Some(c.id);
-                c.set_is_master(is_master);
-                c.set_is_ready(is_master);
-                c.set_is_joined_mid_game(false);
+            if !c.is_master() {
+                let team_names: Vec<_>;
+                if let Some(ref mut info) = r.game_info {
+                    c.set_is_in_game(true);
+                    c.set_is_joined_mid_game(true);
 
-                if is_master {
-                    r.ready_players_number += 1;
+                    {
+                        let teams = info.client_teams(c.id);
+                        c.teams_in_game = teams.clone().count() as u8;
+                        c.clan = teams.clone().next().map(|t| t.color);
+                        team_names = teams.map(|t| t.name.clone()).collect();
+                    }
+
+                    if !team_names.is_empty() {
+                        info.left_teams.retain(|name|
+                            !team_names.contains(&name));
+                        info.teams_in_game += team_names.len() as u8;
+                        r.teams = info.teams_at_start.iter()
+                            .filter(|(_, t)| !team_names.contains(&t.name))
+                            .cloned().collect();
+                    }
+                } else {
+                    team_names = Vec::new();
                 }
 
-                let mut v = vec![
-                    RoomJoined(vec![c.nick.clone()]).send_all().in_room(room_id).action(),
-                    ClientFlags("+i".to_string(), vec![c.nick.clone()]).send_all().action(),
-                    SendRoomUpdate(None)];
-                if !r.greeting.is_empty() {
-                    v.push(ChatMsg {nick: "[greeting]".to_string(), msg: r.greeting.clone()}
-                        .send_self().action());
-                }
-                if !c.is_master() {
-                    let team_names: Vec<_>;
-                    if let Some(ref mut info) = r.game_info {
-                        c.set_is_in_game(true);
-                        c.set_is_joined_mid_game(true);
-
-                        {
-                            let teams = info.client_teams(c.id);
-                            c.teams_in_game = teams.clone().count() as u8;
-                            c.clan = teams.clone().next().map(|t| t.color);
-                            team_names = teams.map(|t| t.name.clone()).collect();
-                        }
+                v.push(SendRoomData{ to: client_id, teams: true, config: true, flags: true});
 
-                        if !team_names.is_empty() {
-                            info.left_teams.retain(|name|
-                                !team_names.contains(&name));
-                            info.teams_in_game += team_names.len() as u8;
-                            r.teams = info.teams_at_start.iter()
-                                .filter(|(_, t)| !team_names.contains(&t.name))
-                                .cloned().collect();
-                        }
-                    } else {
-                        team_names = Vec::new();
-                    }
-
-                    v.push(SendRoomData{ to: client_id, teams: true, config: true, flags: true});
+                if let Some(ref info) = r.game_info {
+                    v.push(RunGame.send_self().action());
+                    v.push(ClientFlags("+g".to_string(), vec![c.nick.clone()])
+                        .send_all().in_room(r.id).action());
+                    v.push(ForwardEngineMessage(
+                        vec![to_engine_msg("e$spectate 1".bytes())])
+                        .send_self().action());
+                    v.push(ForwardEngineMessage(info.msg_log.clone())
+                        .send_self().action());
 
-                    if let Some(ref info) = r.game_info {
-                        v.push(RunGame.send_self().action());
-                        v.push(ClientFlags("+g".to_string(), vec![c.nick.clone()])
-                            .send_all().in_room(r.id).action());
+                    for name in &team_names {
                         v.push(ForwardEngineMessage(
-                            vec![to_engine_msg("e$spectate 1".bytes())])
-                            .send_self().action());
-                        v.push(ForwardEngineMessage(info.msg_log.clone())
-                            .send_self().action());
-
-                        for name in &team_names {
-                            v.push(ForwardEngineMessage(
-                                vec![to_engine_msg(once(b'G').chain(name.bytes()))])
-                                .send_all().in_room(r.id).action());
-                        }
-                        if info.is_paused {
-                            v.push(ForwardEngineMessage(vec![to_engine_msg(once(b'I'))])
-                                .send_all().in_room(r.id).action())
-                        }
+                            vec![to_engine_msg(once(b'G').chain(name.bytes()))])
+                            .send_all().in_room(r.id).action());
+                    }
+                    if info.is_paused {
+                        v.push(ForwardEngineMessage(vec![to_engine_msg(once(b'I'))])
+                            .send_all().in_room(r.id).action())
                     }
                 }
-                v
-            };
-            server.react(client_id, actions);
+            }
+            server.react(client_id, v);
         }
         SendRoomData {to, teams, config, flags} => {
             let mut actions = Vec::new();
@@ -483,7 +475,9 @@
                         .send_all().in_room(r.id).action());
                 }
             }
-            if let Some(id) = new_id { server.clients[id].set_is_master(true) }
+            if let Some(id) = new_id {
+                server.clients[id].set_is_master(true)
+            }
             server.react(client_id, actions);
         }
         RemoveTeam(name) => {
@@ -502,22 +496,18 @@
             server.react(client_id, actions);
         },
         RemoveClientTeams => {
-            let actions = if let (c, Some(r)) = server.client_and_room(client_id) {
-                r.client_teams(c.id).map(|t| RemoveTeam(t.name.clone())).collect()
-            } else {
-                Vec::new()
-            };
-            server.react(client_id, actions);
+            if let (c, Some(r)) = server.client_and_room(client_id) {
+                let actions = r.client_teams(c.id).map(|t| RemoveTeam(t.name.clone())).collect();
+                server.react(client_id, actions);
+            }
         }
         SendRoomUpdate(old_name) => {
-            let actions = if let (c, Some(r)) = server.client_and_room(client_id) {
+            if let (c, Some(r)) = server.client_and_room(client_id) {
                 let name = old_name.unwrap_or_else(|| r.name.clone());
-                vec![RoomUpdated(name, r.info(Some(&c)))
-                    .send_all().with_protocol(r.protocol_number).action()]
-            } else {
-                Vec::new()
-            };
-            server.react(client_id, actions);
+                let actions = vec![RoomUpdated(name, r.info(Some(&c)))
+                    .send_all().with_protocol(r.protocol_number).action()];
+                server.react(client_id, actions);
+            }
         },
         StartRoomGame(room_id) => {
             let actions = {
@@ -598,8 +588,7 @@
             let nicks: Vec<_> = server.clients.iter_mut()
                 .filter(|(_, c)| c.room_id == Some(room_id))
                 .map(|(_, c)| {
-                    let is_master = c.is_master();
-                    c.set_is_ready(is_master);
+                    c.set_is_ready(c.is_master());
                     c.set_is_joined_mid_game(false);
                     c
                 }).filter_map(|c| if !c.is_master() {