handle rooms that close after downloading the room list in the lobby
Some checks failed
continuous-integration/drone/push Build is failing
Some checks failed
continuous-integration/drone/push Build is failing
This commit is contained in:
parent
e349a41b16
commit
4202ef8ff7
@ -134,21 +134,26 @@ pub fn remove_from_lobby(id: ClientId,
|
|||||||
pub fn get_room_tab_info(id: ClientId,
|
pub fn get_room_tab_info(id: ClientId,
|
||||||
pkt: &MenuDetail,
|
pkt: &MenuDetail,
|
||||||
client_location: &mut ClientLocation,
|
client_location: &mut ClientLocation,
|
||||||
clients: &Clients)
|
clients: &Clients,
|
||||||
|
rooms: &mut Rooms)
|
||||||
-> Result<Vec<(ClientId, SendShipPacket)>, anyhow::Error> {
|
-> Result<Vec<(ClientId, SendShipPacket)>, anyhow::Error> {
|
||||||
let room_id = RoomId(pkt.item as usize);
|
let room_id = RoomId(pkt.item as usize);
|
||||||
let clients_in_room = client_location.get_clients_in_room(room_id).map_err(|err| -> ClientLocationError { err.into() })?;
|
if let Some(_room) = rooms.get(pkt.item as usize).ok_or(ShipError::InvalidRoom(pkt.item))? {
|
||||||
let mut room_info = String::new();
|
let mut room_info = String::new();
|
||||||
for client in clients_in_room {
|
let clients_in_room = client_location.get_clients_in_room(room_id).map_err(|err| -> ClientLocationError { err.into() })?;
|
||||||
let cs = clients.get(&client.client).ok_or(ShipError::ClientNotFound(client.client))?;
|
for client in clients_in_room {
|
||||||
let gc = cs.user.guildcard;
|
let cs = clients.get(&client.client).ok_or(ShipError::ClientNotFound(client.client))?;
|
||||||
let name = &cs.character.name;
|
let gc = cs.user.guildcard;
|
||||||
let cls = cs.character.char_class;
|
let name = &cs.character.name;
|
||||||
let leveltable = CharacterLevelTable::default();
|
let cc = cs.character.char_class;
|
||||||
let lv = leveltable.get_level_from_exp(cls, cs.character.exp);
|
let leveltable = CharacterLevelTable::default();
|
||||||
let floor = cs.area.unwrap_or(MapArea::Pioneer2Ep1);
|
let lv = leveltable.get_level_from_exp(cc, cs.character.exp);
|
||||||
|
let floor = cs.area.unwrap_or(MapArea::Pioneer2Ep1);
|
||||||
|
|
||||||
room_info += format!("{} Lv{} {}\n{} {}\n", gc,lv,name,cls,floor).as_str();
|
room_info += format!("{} Lv{} {}\n{} {}\n", gc,lv,name,cc,floor).as_str();
|
||||||
|
}
|
||||||
|
Ok(vec![(id, SendShipPacket::SmallLeftDialog(SmallLeftDialog::new(room_info)))])
|
||||||
|
} else {
|
||||||
|
Ok(vec![(id, SendShipPacket::SmallLeftDialog(SmallLeftDialog::new("Game is no longer active".into())))])
|
||||||
}
|
}
|
||||||
Ok(vec![(id, SendShipPacket::SmallLeftDialog(SmallLeftDialog::new(room_info)))])
|
|
||||||
}
|
}
|
@ -86,62 +86,66 @@ pub fn join_room(id: ClientId,
|
|||||||
-> Result<Box<dyn Iterator<Item=(ClientId, SendShipPacket)> + Send>, ShipError> {
|
-> Result<Box<dyn Iterator<Item=(ClientId, SendShipPacket)> + Send>, ShipError> {
|
||||||
let client = clients.get(&id).ok_or(ShipError::ClientNotFound(id))?;
|
let client = clients.get(&id).ok_or(ShipError::ClientNotFound(id))?;
|
||||||
let level = level_table.get_level_from_exp(client.character.char_class, client.character.exp);
|
let level = level_table.get_level_from_exp(client.character.char_class, client.character.exp);
|
||||||
let room = rooms.get(pkt.item as usize).ok_or(ShipError::InvalidRoom(pkt.item))?.as_ref().unwrap(); // clippy look what you made me do
|
// let room = rooms.get(pkt.item as usize).ok_or(ShipError::InvalidRoom(pkt.item))?.as_ref().unwrap(); // clippy look what you made me do
|
||||||
|
if let Some(room) = rooms.get(pkt.item as usize).ok_or(ShipError::InvalidRoom(pkt.item))? {
|
||||||
|
|
||||||
match room.mode.difficulty() {
|
match room.mode.difficulty() {
|
||||||
room::Difficulty::Ultimate => {
|
room::Difficulty::Ultimate => {
|
||||||
if level < 80 {
|
if level < 80 {
|
||||||
return Ok(Box::new(vec![(id, SendShipPacket::SmallDialog(SmallDialog::new("You must be at least level 80 \nto join Ultimate rooms.".into())))].into_iter()))
|
return Ok(Box::new(vec![(id, SendShipPacket::SmallDialog(SmallDialog::new("You must be at least level 80 \nto join Ultimate rooms.".into())))].into_iter()))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
room::Difficulty::VeryHard => {
|
room::Difficulty::VeryHard => {
|
||||||
if level < 40 {
|
if level < 40 {
|
||||||
return Ok(Box::new(vec![(id, SendShipPacket::SmallDialog(SmallDialog::new("You must be at least level 40 \nto join Very Hard rooms.".into())))].into_iter()))
|
return Ok(Box::new(vec![(id, SendShipPacket::SmallDialog(SmallDialog::new("You must be at least level 40 \nto join Very Hard rooms.".into())))].into_iter()))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
room::Difficulty::Hard => {
|
room::Difficulty::Hard => {
|
||||||
if level < 20 {
|
if level < 20 {
|
||||||
return Ok(Box::new(vec![(id, SendShipPacket::SmallDialog(SmallDialog::new("You must be at least level 20 \nto join Hard rooms.".into())))].into_iter()))
|
return Ok(Box::new(vec![(id, SendShipPacket::SmallDialog(SmallDialog::new("You must be at least level 20 \nto join Hard rooms.".into())))].into_iter()))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
_ => {},
|
_ => {},
|
||||||
};
|
};
|
||||||
|
|
||||||
let original_area = client_location.get_area(id).unwrap();
|
let original_area = client_location.get_area(id).unwrap();
|
||||||
let original_neighbors = client_location.get_client_neighbors(id).unwrap();
|
let original_neighbors = client_location.get_client_neighbors(id).unwrap();
|
||||||
if room.bursting {
|
if room.bursting {
|
||||||
return Ok(Box::new(vec![(id, SendShipPacket::SmallDialog(SmallDialog::new("player is bursting\nplease wait".into())))].into_iter()))
|
return Ok(Box::new(vec![(id, SendShipPacket::SmallDialog(SmallDialog::new("player is bursting\nplease wait".into())))].into_iter()))
|
||||||
|
}
|
||||||
|
let room_id = RoomId(pkt.item as usize);
|
||||||
|
let original_room_clients = client_location.get_clients_in_room(room_id).map_err(|err| -> ClientLocationError { err.into() })?;
|
||||||
|
client_location.add_client_to_room(id, room_id).unwrap(); // TODO: show room full error or whatever
|
||||||
|
|
||||||
|
let client = clients.get(&id).ok_or(ShipError::ClientNotFound(id))?;
|
||||||
|
let area_client = client_location.get_local_client(id).map_err(|err| -> ClientLocationError { err.into() })?;
|
||||||
|
|
||||||
|
item_manager.add_character_to_room(room_id, &client.character, area_client);
|
||||||
|
|
||||||
|
let leader = client_location.get_room_leader(room_id).map_err(|err| -> ClientLocationError { err.into() })?;
|
||||||
|
let join_room = builder::room::join_room(id, clients, client_location, room_id, room)?;
|
||||||
|
let add_to = builder::room::add_to_room(id, client, &area_client, &leader, item_manager, level_table, room_id)?;
|
||||||
|
|
||||||
|
let room = rooms.get_mut(room_id.0).unwrap().as_mut().unwrap();
|
||||||
|
room.bursting = true;
|
||||||
|
|
||||||
|
let mut result: Box<dyn Iterator<Item=(ClientId, SendShipPacket)> + Send> = Box::new(
|
||||||
|
vec![(id, SendShipPacket::JoinRoom(join_room))]
|
||||||
|
.into_iter()
|
||||||
|
.chain(original_room_clients.into_iter()
|
||||||
|
.map(move |c| (c.client, SendShipPacket::AddToRoom(add_to.clone())))
|
||||||
|
));
|
||||||
|
|
||||||
|
if let Ok(leader) = client_location.get_area_leader(original_area) {
|
||||||
|
let leave_lobby = SendShipPacket::LeaveLobby(LeaveLobby::new(area_client.local_client.id(), leader.local_client.id()));
|
||||||
|
result = Box::new(result.chain(original_neighbors.into_iter()
|
||||||
|
.map(move |c| (c.client, leave_lobby.clone()))))
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(result)
|
||||||
|
} else {
|
||||||
|
Ok(Box::new(vec![(id, SendShipPacket::SmallDialog(SmallDialog::new("Game is no longer active".into())))].into_iter()))
|
||||||
}
|
}
|
||||||
let room_id = RoomId(pkt.item as usize);
|
|
||||||
let original_room_clients = client_location.get_clients_in_room(room_id).map_err(|err| -> ClientLocationError { err.into() })?;
|
|
||||||
client_location.add_client_to_room(id, room_id).unwrap(); // TODO: show room full error or whatever
|
|
||||||
|
|
||||||
let client = clients.get(&id).ok_or(ShipError::ClientNotFound(id))?;
|
|
||||||
let area_client = client_location.get_local_client(id).map_err(|err| -> ClientLocationError { err.into() })?;
|
|
||||||
|
|
||||||
item_manager.add_character_to_room(room_id, &client.character, area_client);
|
|
||||||
|
|
||||||
let leader = client_location.get_room_leader(room_id).map_err(|err| -> ClientLocationError { err.into() })?;
|
|
||||||
let join_room = builder::room::join_room(id, clients, client_location, room_id, room)?;
|
|
||||||
let add_to = builder::room::add_to_room(id, client, &area_client, &leader, item_manager, level_table, room_id)?;
|
|
||||||
|
|
||||||
let room = rooms.get_mut(room_id.0).unwrap().as_mut().unwrap();
|
|
||||||
room.bursting = true;
|
|
||||||
|
|
||||||
let mut result: Box<dyn Iterator<Item=(ClientId, SendShipPacket)> + Send> = Box::new(
|
|
||||||
vec![(id, SendShipPacket::JoinRoom(join_room))]
|
|
||||||
.into_iter()
|
|
||||||
.chain(original_room_clients.into_iter()
|
|
||||||
.map(move |c| (c.client, SendShipPacket::AddToRoom(add_to.clone())))
|
|
||||||
));
|
|
||||||
|
|
||||||
if let Ok(leader) = client_location.get_area_leader(original_area) {
|
|
||||||
let leave_lobby = SendShipPacket::LeaveLobby(LeaveLobby::new(area_client.local_client.id(), leader.local_client.id()));
|
|
||||||
result = Box::new(result.chain(original_neighbors.into_iter()
|
|
||||||
.map(move |c| (c.client, leave_lobby.clone()))))
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(result)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn done_bursting(id: ClientId,
|
pub fn done_bursting(id: ClientId,
|
||||||
|
@ -640,7 +640,7 @@ impl<EG: EntityGateway> ServerState for ShipServerState<EG> {
|
|||||||
},
|
},
|
||||||
RecvShipPacket::MenuDetail(menudetail) => {
|
RecvShipPacket::MenuDetail(menudetail) => {
|
||||||
let block = self.blocks.with_client(id, &self.clients)?;
|
let block = self.blocks.with_client(id, &self.clients)?;
|
||||||
Box::new(handler::lobby::get_room_tab_info(id, menudetail, &mut block.client_location, &mut self.clients)?.into_iter())
|
Box::new(handler::lobby::get_room_tab_info(id, menudetail, &mut block.client_location, &mut self.clients, &mut block.rooms)?.into_iter())
|
||||||
},
|
},
|
||||||
RecvShipPacket::RoomPasswordReq(room_password_req) => {
|
RecvShipPacket::RoomPasswordReq(room_password_req) => {
|
||||||
let block = self.blocks.with_client(id, &self.clients)?;
|
let block = self.blocks.with_client(id, &self.clients)?;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user