412 if let (c, Some(r)) = server.client_and_room(client_id) { |
412 if let (c, Some(r)) = server.client_and_room(client_id) { |
413 r.players_number -= 1; |
413 r.players_number -= 1; |
414 if c.is_ready() && r.ready_players_number > 0 { |
414 if c.is_ready() && r.ready_players_number > 0 { |
415 r.ready_players_number -= 1; |
415 r.ready_players_number -= 1; |
416 } |
416 } |
417 if c.is_master() && (r.players_number > 0 || r.is_fixed) { |
417 if c.is_master() && (r.players_number > 0 || r.is_fixed()) { |
418 actions.push(ChangeMaster(r.id, None)); |
418 actions.push(ChangeMaster(r.id, None)); |
419 } |
419 } |
420 actions.push(ClientFlags("-i".to_string(), vec![c.nick.clone()]) |
420 actions.push(ClientFlags("-i".to_string(), vec![c.nick.clone()]) |
421 .send_all().action()); |
421 .send_all().action()); |
422 } |
422 } |
423 server.react(client_id, actions); |
423 server.react(client_id, actions); |
424 actions = Vec::new(); |
424 actions = Vec::new(); |
425 |
425 |
426 if let (c, Some(r)) = server.client_and_room(client_id) { |
426 if let (c, Some(r)) = server.client_and_room(client_id) { |
427 c.room_id = Some(lobby_id); |
427 c.room_id = Some(lobby_id); |
428 if r.players_number == 0 && !r.is_fixed { |
428 if r.players_number == 0 && !r.is_fixed() { |
429 actions.push(RemoveRoom(r.id)); |
429 actions.push(RemoveRoom(r.id)); |
430 } else { |
430 } else { |
431 actions.push(RemoveClientTeams); |
431 actions.push(RemoveClientTeams); |
432 actions.push(RoomLeft(c.nick.clone(), msg) |
432 actions.push(RoomLeft(c.nick.clone(), msg) |
433 .send_all().in_room(r.id).but_self().action()); |
433 .send_all().in_room(r.id).but_self().action()); |
437 server.react(client_id, actions) |
437 server.react(client_id, actions) |
438 } |
438 } |
439 ChangeMaster(room_id, new_id) => { |
439 ChangeMaster(room_id, new_id) => { |
440 let mut actions = Vec::new(); |
440 let mut actions = Vec::new(); |
441 let room_client_ids = server.room_clients(room_id); |
441 let room_client_ids = server.room_clients(room_id); |
442 let new_id = if server.room(client_id).map(|r| r.is_fixed).unwrap_or(false) { |
442 let new_id = if server.room(client_id).map(|r| r.is_fixed()).unwrap_or(false) { |
443 new_id |
443 new_id |
444 } else { |
444 } else { |
445 new_id.or_else(|| |
445 new_id.or_else(|| |
446 room_client_ids.iter().find(|id| **id != client_id).map(|id| *id)) |
446 room_client_ids.iter().find(|id| **id != client_id).map(|id| *id)) |
447 }; |
447 }; |
457 } |
457 } |
458 Some(_) => unreachable!(), |
458 Some(_) => unreachable!(), |
459 None => {} |
459 None => {} |
460 } |
460 } |
461 r.master_id = new_id; |
461 r.master_id = new_id; |
|
462 r.set_join_restriction(false); |
|
463 r.set_team_add_restriction(false); |
|
464 let is_fixed = r.is_fixed(); |
|
465 r.set_unregistered_players_restriction(is_fixed); |
462 if let Some(nick) = new_nick { |
466 if let Some(nick) = new_nick { |
463 actions.push(ClientFlags("+h".to_string(), vec![nick]) |
467 actions.push(ClientFlags("+h".to_string(), vec![nick]) |
464 .send_all().in_room(r.id).action()); |
468 .send_all().in_room(r.id).action()); |
465 } |
469 } |
466 } |
470 } |