gameServer2/src/server/actions.rs
changeset 13523 8c5dd562c9f7
parent 13520 1ee192f13456
child 13524 5359ff75da3a
equal deleted inserted replaced
13522:282e5e54386f 13523:8c5dd562c9f7
     3     iter::once,
     3     iter::once,
     4     mem::replace
     4     mem::replace
     5 };
     5 };
     6 use super::{
     6 use super::{
     7     server::HWServer,
     7     server::HWServer,
     8     room::GameInfo,
     8     room::{GameInfo, RoomFlags},
     9     client::HWClient,
     9     client::HWClient,
    10     coretypes::{ClientId, RoomId, GameCfg, VoteType},
    10     coretypes::{ClientId, RoomId, GameCfg, VoteType},
    11     room::HWRoom,
    11     room::HWRoom,
    12     handlers
    12     handlers
    13 };
    13 };
   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             }