# HG changeset patch # User alfadur # Date 1531500739 -10800 # Node ID 1ee192f134567810af01f15b8ba029312e027af8 # Parent c85b324c4c2d94ed2988b090aaa4bfea90781f44 Better packing for clients diff -r c85b324c4c2d -r 1ee192f13456 gameServer2/src/protocol/messages.rs --- a/gameServer2/src/protocol/messages.rs Thu Jul 12 14:46:16 2018 +0200 +++ b/gameServer2/src/protocol/messages.rs Fri Jul 13 19:52:19 2018 +0300 @@ -18,7 +18,7 @@ Info(String), // not entered state Nick(String), - Proto(u32), + Proto(u16), Password(String, String), Checker(u32, String, String), // lobby @@ -76,7 +76,7 @@ Pong, Bye(String), Nick(String), - Proto(u32), + Proto(u16), LobbyLeft(String, String), LobbyJoined(Vec), ChatMsg {nick: String, msg: String}, diff -r c85b324c4c2d -r 1ee192f13456 gameServer2/src/protocol/parser.rs --- a/gameServer2/src/protocol/parser.rs Thu Jul 12 14:46:16 2018 +0200 +++ b/gameServer2/src/protocol/parser.rs Fri Jul 13 19:52:19 2018 +0300 @@ -25,6 +25,7 @@ named!(str_line<&[u8], &str>, map_res!(not_line_ending, str::from_utf8)); named!( a_line<&[u8], String>, map!(str_line, String::from)); named!( u8_line<&[u8], u8>, map_res!(str_line, FromStr::from_str)); +named!(u16_line<&[u8], u16>, map_res!(str_line, FromStr::from_str)); named!(u32_line<&[u8], u32>, map_res!(str_line, FromStr::from_str)); named!(yes_no_line<&[u8], bool>, alt!( do_parse!(tag_no_case!("YES") >> (true)) @@ -87,7 +88,7 @@ | do_parse!(tag!("ROOM_NAME") >> eol >> n: a_line >> (RoomName(n))) | do_parse!(tag!("REMOVE_TEAM") >> eol >> n: a_line >> (RemoveTeam(n))) - | do_parse!(tag!("PROTO") >> eol >> d: u32_line >> (Proto(d))) + | do_parse!(tag!("PROTO") >> eol >> d: u16_line >> (Proto(d))) | do_parse!(tag!("QUIT") >> msg: opt_param >> (Quit(msg))) )); diff -r c85b324c4c2d -r 1ee192f13456 gameServer2/src/protocol/test.rs --- a/gameServer2/src/protocol/test.rs Thu Jul 12 14:46:16 2018 +0200 +++ b/gameServer2/src/protocol/test.rs Fri Jul 13 19:52:19 2018 +0300 @@ -118,7 +118,7 @@ 7 => SuperPower(), 8 => Info(Ascii), 9 => Nick(Ascii), - 10 => Proto(u32), + 10 => Proto(u16), 11 => Password(Ascii, Ascii), 12 => Checker(u32, Ascii, Ascii), 13 => List(), diff -r c85b324c4c2d -r 1ee192f13456 gameServer2/src/server/actions.rs --- a/gameServer2/src/server/actions.rs Thu Jul 12 14:46:16 2018 +0200 +++ b/gameServer2/src/server/actions.rs Fri Jul 13 19:52:19 2018 +0300 @@ -5,7 +5,7 @@ }; use super::{ server::HWServer, - room::{GameInfo}, + room::GameInfo, client::HWClient, coretypes::{ClientId, RoomId, GameCfg, VoteType}, room::HWRoom, @@ -25,7 +25,7 @@ ToSelf, ToAll { room_id: Option, - protocol: Option, + protocol: Option, skip_self: bool } } @@ -60,7 +60,7 @@ self } - pub fn with_protocol(mut self, protocol_number: u32) -> PendingMessage { + pub fn with_protocol(mut self, protocol_number: u16) -> PendingMessage { if let Destination::ToAll {ref mut protocol, ..} = self.destination { *protocol = Some(protocol_number) } @@ -218,14 +218,14 @@ let c = &mut server.clients[client_id]; r.players_number += 1; c.room_id = Some(room_id); - c.is_joined_mid_game = false; - if r.master_id == Some(c.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; - c.is_master = true; - c.is_ready = true; - } else { - c.is_ready = false; - c.is_master = false; } let mut v = vec![ @@ -236,11 +236,11 @@ v.push(ChatMsg {nick: "[greeting]".to_string(), msg: r.greeting.clone()} .send_self().action()); } - if !c.is_master { + if !c.is_master() { let team_names: Vec<_>; if let Some(ref mut info) = r.game_info { - c.is_in_game = true; - c.is_joined_mid_game = true; + c.set_is_in_game(true); + c.set_is_joined_mid_game(true); { let teams = info.client_teams(c.id); @@ -319,7 +319,7 @@ .send(to).action()); } let nicks: Vec<_> = server.clients.iter() - .filter(|(_, c)| c.room_id == Some(r.id) && c.is_ready) + .filter(|(_, c)| c.room_id == Some(r.id) && c.is_ready()) .map(|(_, c)| c.nick.clone()).collect(); if !nicks.is_empty() { actions.push(ClientFlags("+r".to_string(), nicks) @@ -411,10 +411,10 @@ let lobby_id = server.lobby_id; if let (c, Some(r)) = server.client_and_room(client_id) { r.players_number -= 1; - if c.is_ready && r.ready_players_number > 0 { + if c.is_ready() && r.ready_players_number > 0 { r.ready_players_number -= 1; } - if c.is_master && (r.players_number > 0 || r.is_fixed) { + if c.is_master() && (r.players_number > 0 || r.is_fixed) { actions.push(ChangeMaster(r.id, None)); } actions.push(ClientFlags("-i".to_string(), vec![c.nick.clone()]) @@ -450,7 +450,7 @@ if let (c, Some(r)) = server.client_and_room(client_id) { match r.master_id { Some(id) if id == c.id => { - c.is_master = false; + c.set_is_master(false); r.master_id = None; actions.push(ClientFlags("-h".to_string(), vec![c.nick.clone()]) .send_all().in_room(r.id).action()); @@ -464,7 +464,7 @@ .send_all().in_room(r.id).action()); } } - new_id.map(|id| server.clients[id].is_master = true); + new_id.map(|id| server.clients[id].set_is_master(true)); server.react(client_id, actions); } RemoveTeam(name) => { @@ -476,7 +476,7 @@ } actions.push(TeamRemove(name.clone()).send_all().in_room(r.id).action()); actions.push(SendRoomUpdate(None)); - if r.game_info.is_some() && c.is_in_game { + if r.game_info.is_some() && c.is_in_game() { actions.push(SendTeamRemovalMessage(name)); } } @@ -514,7 +514,7 @@ room.start_round(); for id in room_clients { let c = &mut server.clients[id]; - c.is_in_game = true; + c.set_is_in_game(false); c.team_indices = room.client_team_indices(c.id); } vec![RunGame.send_all().in_room(room.id).action(), @@ -564,7 +564,7 @@ if let Some(info) = old_info { for (_, c) in server.clients.iter() { - if c.room_id == Some(room_id) && c.is_joined_mid_game { + if c.room_id == Some(room_id) && c.is_joined_mid_game() { actions.push(SendRoomData{ to: c.id, teams: false, config: true, flags: false}); @@ -579,10 +579,11 @@ let nicks: Vec<_> = server.clients.iter_mut() .filter(|(_, c)| c.room_id == Some(room_id)) .map(|(_, c)| { - c.is_ready = c.is_master; - c.is_joined_mid_game = false; + let is_master = c.is_master(); + c.set_is_ready(is_master); + c.set_is_joined_mid_game(false); c - }).filter_map(|c| if !c.is_master { + }).filter_map(|c| if !c.is_master() { Some(c.nick.clone()) } else { None diff -r c85b324c4c2d -r 1ee192f13456 gameServer2/src/server/client.rs --- a/gameServer2/src/server/client.rs Thu Jul 12 14:46:16 2018 +0200 +++ b/gameServer2/src/server/client.rs Fri Jul 13 19:52:19 2018 +0300 @@ -1,18 +1,20 @@ use super::coretypes::ClientId; +const IS_ADMIN: u8 = 0b0000_0001; +const IS_MASTER: u8 = 0b0000_0010; +const IS_READY: u8 = 0b0000_0100; +const IS_IN_GAME: u8 = 0b0000_1000; +const IS_JOINED_MID_GAME: u8 = 0b0001_0000; + pub struct HWClient { pub id: ClientId, pub room_id: Option, pub nick: String, - pub protocol_number: u32, - pub is_admin: bool, - pub is_master: bool, - pub is_ready: bool, - pub is_in_game: bool, + pub protocol_number: u16, + flags: u8, pub teams_in_game: u8, pub team_indices: Vec, - pub clan: Option, - pub is_joined_mid_game: bool, + pub clan: Option } impl HWClient { @@ -22,14 +24,26 @@ room_id: None, nick: String::new(), protocol_number: 0, - is_admin: false, - is_master: false, - is_ready: false, - is_in_game: false, + flags: 0, teams_in_game: 0, team_indices: Vec::new(), clan: None, - is_joined_mid_game: false, } } + + fn set(&mut self, mask: u8, value: bool) { + if value { self.flags |= mask } else { self.flags &= !mask } + } + + pub fn is_admin(&self)-> bool { self.flags & IS_ADMIN != 0 } + pub fn is_master(&self)-> bool { self.flags & IS_MASTER != 0 } + pub fn is_ready(&self)-> bool { self.flags & IS_READY != 0 } + pub fn is_in_game(&self)-> bool { self.flags & IS_IN_GAME != 0 } + pub fn is_joined_mid_game(&self)-> bool { self.flags & IS_JOINED_MID_GAME != 0 } + + pub fn set_is_admin(&mut self, value: bool) { self.set(IS_ADMIN, value) } + pub fn set_is_master(&mut self, value: bool) { self.set(IS_MASTER, value) } + pub fn set_is_ready(&mut self, value: bool) { self.set(IS_READY, value) } + pub fn set_is_in_game(&mut self, value: bool) { self.set(IS_IN_GAME, value) } + pub fn set_is_joined_mid_game(&mut self, value: bool) { self.set(IS_JOINED_MID_GAME, value) } } \ No newline at end of file diff -r c85b324c4c2d -r 1ee192f13456 gameServer2/src/server/handlers/inroom.rs --- a/gameServer2/src/server/handlers/inroom.rs Thu Jul 12 14:46:16 2018 +0200 +++ b/gameServer2/src/server/handlers/inroom.rs Fri Jul 13 19:52:19 2018 +0300 @@ -102,17 +102,17 @@ }, Fix => { if let (c, Some(r)) = server.client_and_room(client_id) { - if c.is_admin { r.is_fixed = true } + if c.is_admin() { r.is_fixed = true } } } Unfix => { if let (c, Some(r)) = server.client_and_room(client_id) { - if c.is_admin { r.is_fixed = false } + if c.is_admin() { r.is_fixed = false } } } Greeting(text) => { if let (c, Some(r)) = server.client_and_room(client_id) { - if c.is_admin || c.is_master && !r.is_fixed { + if c.is_admin() || c.is_master() && !r.is_fixed { r.greeting = text } } @@ -138,14 +138,15 @@ }, ToggleReady => { let actions = if let (c, Some(r)) = server.client_and_room(client_id) { - let flags = if c.is_ready { + let flags = if c.is_ready() { r.ready_players_number -= 1; "-r" } else { r.ready_players_number += 1; "+r" }; - c.is_ready = !c.is_ready; + let is_ready = !c.is_ready(); + c.set_is_ready(is_ready); let mut v = vec![ClientFlags(flags.to_string(), vec![c.nick.clone()]) .send_all().in_room(r.id).action()]; @@ -209,7 +210,7 @@ let room_id = r.id; let addable_hedgehogs = r.addable_hedgehogs(); if let Some((_, mut team)) = r.find_team_and_owner_mut(|t| t.name == team_name) { - if !c.is_master { + if !c.is_master() { vec![ProtocolError("You're not the room master!".to_string())] } else if number < 1 || number > 8 || number > addable_hedgehogs + team.hedgehogs_number { @@ -233,7 +234,7 @@ let actions = if let (c, Some(r)) = server.client_and_room(client_id) { let room_id = r.id; if let Some((owner, mut team)) = r.find_team_and_owner_mut(|t| t.name == team_name) { - if !c.is_master { + if !c.is_master() { vec![ProtocolError("You're not the room master!".to_string())] } else if false { Vec::new() @@ -260,7 +261,7 @@ let actions = if let (c, Some(r)) = server.client_and_room(client_id) { if r.is_fixed { vec![Warn("Access denied.".to_string())] - } else if !c.is_master { + } else if !c.is_master() { vec![ProtocolError("You're not the room master!".to_string())] } else { let v = vec![cfg.to_server_msg() @@ -337,7 +338,7 @@ } ForceVote(vote) => { let actions = if let (c, Some(r)) = server.client_and_room(client_id) { - vec![AddVote{ vote, is_forced: c.is_admin} ] + vec![AddVote{ vote, is_forced: c.is_admin()} ] } else { Vec::new() }; @@ -383,8 +384,8 @@ RoundFinished => { let mut actions = Vec::new(); if let (c, Some(r)) = server.client_and_room(client_id) { - if c.is_in_game { - c.is_in_game = false; + if c.is_in_game() { + c.set_is_in_game(false); actions.push(ClientFlags("-g".to_string(), vec![c.nick.clone()]). send_all().in_room(r.id).action()); if r.game_info.is_some() { diff -r c85b324c4c2d -r 1ee192f13456 gameServer2/src/server/room.rs --- a/gameServer2/src/server/room.rs Thu Jul 12 14:46:16 2018 +0200 +++ b/gameServer2/src/server/room.rs Fri Jul 13 19:52:19 2018 +0300 @@ -111,7 +111,7 @@ pub master_id: Option, pub name: String, pub password: Option, - pub protocol_number: u32, + pub protocol_number: u16, pub greeting: String, pub is_fixed: bool, diff -r c85b324c4c2d -r 1ee192f13456 gameServer2/src/server/server.rs --- a/gameServer2/src/server/server.rs Thu Jul 12 14:46:16 2018 +0200 +++ b/gameServer2/src/server/server.rs Fri Jul 13 19:52:19 2018 +0300 @@ -124,7 +124,7 @@ self.select_clients(|(_, c)| c.room_id == Some(room_id)) } - pub fn protocol_clients(&self, protocol: u32) -> Vec { + pub fn protocol_clients(&self, protocol: u16) -> Vec { self.select_clients(|(_, c)| c.protocol_number == protocol) }