2020-04-22 22:59:01 -06:00
|
|
|
use libpso::packet::ship::*;
|
|
|
|
use crate::common::serverstate::ClientId;
|
2023-01-28 20:12:20 -07:00
|
|
|
use crate::ship::ship::{Clients, ShipEvent};
|
2020-05-02 22:08:37 -03:00
|
|
|
use crate::ship::location::{ClientLocation, LobbyId, ClientLocationError};
|
|
|
|
use crate::ship::packet::builder::{player_info};
|
2022-05-14 13:06:40 -06:00
|
|
|
use crate::ship::items::state::ItemState;
|
2020-04-22 22:59:01 -06:00
|
|
|
|
2022-10-18 04:46:21 -06:00
|
|
|
use futures::future::join_all;
|
2020-04-22 22:59:01 -06:00
|
|
|
|
2022-09-18 21:01:32 -06:00
|
|
|
pub async fn join_lobby(id: ClientId,
|
|
|
|
lobby: LobbyId,
|
|
|
|
client_location: &ClientLocation,
|
|
|
|
clients: &Clients,
|
2022-10-19 19:10:15 -06:00
|
|
|
item_state: &ItemState,
|
|
|
|
event: ShipEvent)
|
2023-01-28 20:12:20 -07:00
|
|
|
-> Result<JoinLobby, anyhow::Error> {
|
2022-09-18 21:01:32 -06:00
|
|
|
let lobby_clients = client_location.get_clients_in_lobby(lobby).await.map_err(|err| -> ClientLocationError { err.into() })?;
|
2022-08-02 00:08:55 -06:00
|
|
|
|
2022-10-18 04:46:21 -06:00
|
|
|
let playerinfo = join_all(
|
|
|
|
lobby_clients.into_iter()
|
|
|
|
.map(|area_client| {
|
|
|
|
let item_state = item_state.clone();
|
|
|
|
async move {
|
|
|
|
clients.with(area_client.client, |client| Box::pin(async move {
|
|
|
|
let inventory = item_state.get_character_inventory(&client.character).await?;
|
|
|
|
Ok(player_info(0x100, client, &area_client, &inventory).await)
|
|
|
|
})).await?
|
|
|
|
}}))
|
|
|
|
.await
|
|
|
|
.into_iter()
|
2023-01-28 20:12:20 -07:00
|
|
|
.collect::<Result<Vec<_>, anyhow::Error>>()?;
|
2022-10-18 04:46:21 -06:00
|
|
|
|
|
|
|
let client_block = clients.with(id, |client| Box::pin(async move {
|
|
|
|
client.block as u16
|
|
|
|
})).await?;
|
2022-09-18 21:01:32 -06:00
|
|
|
let area_client = client_location.get_local_client(id).await.map_err(|err| -> ClientLocationError { err.into() })?;
|
|
|
|
let leader = client_location.get_lobby_leader(lobby).await.map_err(|err| -> ClientLocationError { err.into() })?;
|
2020-04-22 22:59:01 -06:00
|
|
|
Ok(JoinLobby {
|
|
|
|
client: area_client.local_client.id(),
|
|
|
|
leader: leader.local_client.id(),
|
|
|
|
one: 1,
|
|
|
|
lobby: lobby.id(),
|
2022-10-18 04:46:21 -06:00
|
|
|
block: client_block,
|
2022-10-19 19:10:15 -06:00
|
|
|
event: event.into(),
|
2020-04-22 22:59:01 -06:00
|
|
|
padding: 0,
|
2022-10-18 17:55:47 -06:00
|
|
|
playerinfo,
|
2020-04-22 22:59:01 -06:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2022-09-18 21:01:32 -06:00
|
|
|
pub async fn add_to_lobby(id: ClientId,
|
|
|
|
lobby: LobbyId,
|
|
|
|
client_location: &ClientLocation,
|
|
|
|
clients: &Clients,
|
2022-10-19 19:10:15 -06:00
|
|
|
item_state: &ItemState,
|
|
|
|
event: ShipEvent)
|
2023-01-28 20:12:20 -07:00
|
|
|
-> Result<AddToLobby, anyhow::Error> {
|
2022-09-18 21:01:32 -06:00
|
|
|
let area_client = client_location.get_local_client(id).await.map_err(|err| -> ClientLocationError { err.into() })?;
|
|
|
|
let leader = client_location.get_lobby_leader(lobby).await.map_err(|err| -> ClientLocationError { err.into() })?;
|
2022-10-18 04:46:21 -06:00
|
|
|
clients.with(id, |client| {
|
|
|
|
let item_state = item_state.clone();
|
|
|
|
Box::pin(async move {
|
|
|
|
let inventory = item_state.get_character_inventory(&client.character).await?;
|
|
|
|
Ok(AddToLobby {
|
|
|
|
flag: 1,
|
|
|
|
client: area_client.local_client.id(),
|
|
|
|
leader: leader.local_client.id(),
|
|
|
|
one: 1,
|
|
|
|
lobby: lobby.id(),
|
|
|
|
block: client.block as u16,
|
2022-10-19 19:10:15 -06:00
|
|
|
event: event.into(),
|
2022-10-18 04:46:21 -06:00
|
|
|
padding: 0,
|
|
|
|
playerinfo: player_info(0x100, client, &area_client, &inventory).await,
|
|
|
|
})
|
|
|
|
})}).await?
|
2020-04-22 22:59:01 -06:00
|
|
|
}
|
2020-04-27 20:17:35 -04:00
|
|
|
|
2022-09-18 21:01:32 -06:00
|
|
|
pub async fn remove_from_lobby(id: ClientId,
|
|
|
|
client_location: &ClientLocation)
|
2023-01-28 20:12:20 -07:00
|
|
|
-> Result<LeaveLobby, anyhow::Error> {
|
2022-09-18 21:01:32 -06:00
|
|
|
let prev_area_index = client_location.get_local_client(id).await.map_err(|err| -> ClientLocationError { err.into() })?.local_client.id();
|
|
|
|
let prev_area_leader_index = client_location
|
|
|
|
.get_area_leader(client_location
|
|
|
|
.get_area(id)
|
|
|
|
.await
|
|
|
|
.map_err(|err| -> ClientLocationError { err.into() })?)
|
|
|
|
.await
|
2020-04-28 01:25:50 -04:00
|
|
|
.map_err(|err| -> ClientLocationError { err.into() })?.local_client.id();
|
2020-04-27 20:17:35 -04:00
|
|
|
Ok(LeaveLobby {
|
|
|
|
client: prev_area_index,
|
|
|
|
leader: prev_area_leader_index,
|
|
|
|
_padding: 0,
|
|
|
|
})
|
2020-05-13 22:32:30 -06:00
|
|
|
}
|