93 RemoveClientTeams, |
93 RemoveClientTeams, |
94 SendRoomUpdate(Option<String>), |
94 SendRoomUpdate(Option<String>), |
95 StartRoomGame(RoomId), |
95 StartRoomGame(RoomId), |
96 SendTeamRemovalMessage(String), |
96 SendTeamRemovalMessage(String), |
97 FinishRoomGame(RoomId), |
97 FinishRoomGame(RoomId), |
|
98 SendRoomData{teams: bool, config: bool, flags: bool}, |
98 Warn(String), |
99 Warn(String), |
99 ProtocolError(String) |
100 ProtocolError(String) |
100 } |
101 } |
101 |
102 |
102 use self::Action::*; |
103 use self::Action::*; |
219 let mut v = vec![ |
220 let mut v = vec![ |
220 RoomJoined(vec![c.nick.clone()]).send_all().in_room(room_id).action(), |
221 RoomJoined(vec![c.nick.clone()]).send_all().in_room(room_id).action(), |
221 flags_msg.send_all().action(), |
222 flags_msg.send_all().action(), |
222 SendRoomUpdate(None)]; |
223 SendRoomUpdate(None)]; |
223 if !c.is_master { |
224 if !c.is_master { |
224 v.push(ConfigEntry("FULLMAPCONFIG".to_string(), r.map_config()) |
225 v.push(SendRoomData{ teams: true, config: true, flags: true}); |
|
226 } |
|
227 v |
|
228 }; |
|
229 server.react(client_id, actions); |
|
230 } |
|
231 SendRoomData {teams, config, flags} => { |
|
232 let mut actions = Vec::new(); |
|
233 let room_id = server.clients[client_id].room_id; |
|
234 if let Some(r) = room_id.and_then(|id| server.rooms.get(id)) { |
|
235 if config { |
|
236 actions.push(ConfigEntry("FULLMAPCONFIG".to_string(), r.map_config()) |
225 .send_self().action()); |
237 .send_self().action()); |
226 for cfg in r.game_config().into_iter() { |
238 for cfg in r.game_config().into_iter() { |
227 v.push(cfg.into_server_msg().send_self().action()); |
239 actions.push(cfg.into_server_msg().send_self().action()); |
228 } |
240 } |
229 } |
241 } |
230 v |
242 if teams { |
231 }; |
243 for (owner_id, team) in r.teams.iter() { |
232 server.react(client_id, actions); |
244 actions.push(TeamAdd(HWRoom::team_info(&server.clients[*owner_id], &team)) |
233 }, |
245 .send_self().action()); |
|
246 } |
|
247 } |
|
248 if flags { |
|
249 if let Some(id) = r.master_id { |
|
250 actions.push(ClientFlags("+h".to_string(), vec![server.clients[id].nick.clone()]) |
|
251 .send_self().action()); |
|
252 } |
|
253 let nicks: Vec<_> = server.clients.iter() |
|
254 .filter(|(_, c)| c.room_id == Some(r.id) && c.is_ready) |
|
255 .map(|(_, c)| c.nick.clone()).collect(); |
|
256 if !nicks.is_empty() { |
|
257 actions.push(ClientFlags("+r".to_string(), nicks) |
|
258 .send_self().action()); |
|
259 } |
|
260 } |
|
261 } |
|
262 server.react(client_id, actions); |
|
263 } |
234 MoveToLobby(msg) => { |
264 MoveToLobby(msg) => { |
235 let mut actions = Vec::new(); |
265 let mut actions = Vec::new(); |
236 let lobby_id = server.lobby_id; |
266 let lobby_id = server.lobby_id; |
237 if let (c, Some(r)) = server.client_and_room(client_id) { |
267 if let (c, Some(r)) = server.client_and_room(client_id) { |
238 r.players_number -= 1; |
268 r.players_number -= 1; |
239 if c.is_ready { |
269 if c.is_ready && r.ready_players_number > 0 { |
240 r.ready_players_number -= 1; |
270 r.ready_players_number -= 1; |
241 } |
271 } |
242 if r.players_number > 0 && c.is_master { |
272 if r.players_number > 0 && c.is_master { |
243 actions.push(ChangeMaster(r.id, None)); |
273 actions.push(ChangeMaster(r.id, None)); |
244 } |
274 } |