diff -r 5664650befcd -r 09f4a30e50cc gameServer2/src/server/actions.rs --- 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() {