94 lines
3.9 KiB
Rust
Raw Normal View History

use libpso::packet::ship::*;
use crate::common::serverstate::ClientId;
2023-01-28 20:12:20 -07:00
use crate::ship::ship::{Clients, ShipEvent};
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;
2022-10-18 04:46:21 -06:00
use futures::future::join_all;
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-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() })?;
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(),
padding: 0,
2022-10-18 17:55:47 -06:00
playerinfo,
})
}
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-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,
})
}