remove player from lobby before sending to another ship/block
This commit is contained in:
parent
fe03515871
commit
ae696888e9
@ -15,7 +15,7 @@ pub fn block_selected(id: ClientId,
|
||||
clients: &mut Clients,
|
||||
item_manager: &ItemManager,
|
||||
level_table: &CharacterLevelTable)
|
||||
-> Result<Vec<SendShipPacket>, anyhow::Error> {
|
||||
-> Result<Vec<(ClientId, SendShipPacket)>, anyhow::Error> {
|
||||
let client = clients.get_mut(&id).ok_or(ShipError::ClientNotFound(id))?;
|
||||
client.block = pkt.item as usize - 1;
|
||||
|
||||
@ -38,11 +38,11 @@ pub fn block_selected(id: ClientId,
|
||||
.build();
|
||||
|
||||
Ok(vec![
|
||||
SendShipPacket::FullCharacter(Box::new(FullCharacter {
|
||||
(id, SendShipPacket::FullCharacter(Box::new(FullCharacter {
|
||||
character: fc,
|
||||
})),
|
||||
SendShipPacket::CharDataRequest(CharDataRequest {}),
|
||||
SendShipPacket::LobbyList(LobbyList::new()),
|
||||
}))),
|
||||
(id, SendShipPacket::CharDataRequest(CharDataRequest {})),
|
||||
(id, SendShipPacket::LobbyList(LobbyList::new())),
|
||||
])
|
||||
}
|
||||
|
||||
@ -113,3 +113,17 @@ pub async fn change_lobby<EG: EntityGateway>(id: ClientId,
|
||||
.map(|c| (c.client, SendShipPacket::LeaveLobby(leave_lobby.clone()))))
|
||||
.collect())
|
||||
}
|
||||
|
||||
pub fn remove_from_lobby(id: ClientId,
|
||||
client_location: &mut ClientLocation)
|
||||
-> Result<Vec<(ClientId, SendShipPacket)>, anyhow::Error> {
|
||||
let area_client = client_location.get_local_client(id)?;
|
||||
let neighbors = client_location.get_client_neighbors(id)?;
|
||||
let leader = client_location.get_leader_by_client(id)?;
|
||||
let leave_lobby_pkt = SendShipPacket::LeaveLobby(LeaveLobby::new(area_client.local_client.id(), leader.local_client.id()));
|
||||
|
||||
client_location.remove_client_from_area(id)?;
|
||||
Ok(neighbors.into_iter().map(|n| {
|
||||
(n.client, leave_lobby_pkt.clone())
|
||||
}).collect())
|
||||
}
|
||||
|
@ -571,8 +571,16 @@ impl<EG: EntityGateway> ServerState for ShipServerState<EG> {
|
||||
RecvShipPacket::MenuSelect(menuselect) => {
|
||||
let block = self.blocks.with_client(id, &self.clients)?;
|
||||
match menuselect.menu {
|
||||
SHIP_MENU_ID => handler::ship::selected_ship(id, menuselect, &self.ship_list)?,
|
||||
BLOCK_MENU_ID => Box::new(handler::lobby::block_selected(id, menuselect, &mut self.clients, &self.item_manager, &self.level_table)?.into_iter().map(move |pkt| (id, pkt))),
|
||||
SHIP_MENU_ID => {
|
||||
let leave_lobby = handler::lobby::remove_from_lobby(id, &mut block.client_location).into_iter().into_iter().flatten();
|
||||
let select_ship = handler::ship::selected_ship(id, menuselect, &self.ship_list)?;
|
||||
Box::new(leave_lobby.chain(select_ship))
|
||||
}
|
||||
BLOCK_MENU_ID => {
|
||||
let leave_lobby = handler::lobby::remove_from_lobby(id, &mut block.client_location).into_iter().into_iter().flatten();
|
||||
let select_block = handler::lobby::block_selected(id, menuselect, &mut self.clients, &self.item_manager, &self.level_table)?.into_iter();
|
||||
Box::new(leave_lobby.chain(select_block))
|
||||
}
|
||||
ROOM_MENU_ID => handler::room::join_room(id, menuselect, &mut block.client_location, &mut self.clients, &mut self.item_manager, &self.level_table, &mut block.rooms)?,
|
||||
QUEST_CATEGORY_MENU_ID => handler::quest::select_quest_category(id, menuselect, &self.quests)?,
|
||||
_ => unreachable!(),
|
||||
@ -680,7 +688,7 @@ impl<EG: EntityGateway> ServerState for ShipServerState<EG> {
|
||||
handler::ship::ship_list(id, &self.ship_list)
|
||||
},
|
||||
RecvShipPacket::RequestShipBlockList(_) => {
|
||||
handler::ship::block_list(id, &self.name, 1)
|
||||
handler::ship::block_list(id, &self.name, self.blocks.0.len())
|
||||
}
|
||||
})
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user