use std::collections::HashMap; use libpso::packet::ship::*; use crate::common::serverstate::ClientId; use crate::common::leveltable::CharacterLevelTable; use crate::ship::ship::{SendShipPacket, ShipError, ClientState, Clients}; use crate::ship::character::{CharacterBytesBuilder, FullCharacterBytesBuilder}; use crate::ship::location::{ClientLocation, LobbyId, AreaClient, ClientLocationError}; use crate::entity::character::CharacterEntity; use crate::ship::items::ActiveInventory; use crate::ship::packet::builder::{player_header, player_info}; use libpso::character::character::{Inventory, InventoryItem}; use libpso::utf8_to_utf16_array; pub fn join_lobby(id: ClientId, lobby: LobbyId, client_location: &ClientLocation, clients: &Clients, level_table: &CharacterLevelTable) -> Result { let lobby_clients = client_location.get_clients_in_lobby(lobby).map_err(|err| -> ClientLocationError { err.into() })?; let playerinfo = lobby_clients.iter() .map(|area_client| { let client = clients.get(&area_client.client).ok_or(ShipError::ClientNotFound(area_client.client)).unwrap(); player_info(0x100, &client, area_client, level_table) }); let client = clients.get(&id).ok_or(ShipError::ClientNotFound(id)).unwrap(); let area_client = client_location.get_local_client(id).map_err(|err| -> ClientLocationError { err.into() })?; let leader = client_location.get_lobby_leader(lobby).map_err(|err| -> ClientLocationError { err.into() })?; Ok(JoinLobby { client: area_client.local_client.id(), leader: leader.local_client.id(), one: 1, lobby: lobby.id(), block: client.block as u16, event: 0, padding: 0, playerinfo: playerinfo.collect(), }) } pub fn add_to_lobby(id: ClientId, lobby: LobbyId, client_location: &ClientLocation, clients: &Clients, level_table: &CharacterLevelTable) -> Result { let client = clients.get(&id).ok_or(ShipError::ClientNotFound(id)).unwrap(); let area_client = client_location.get_local_client(id).map_err(|err| -> ClientLocationError { err.into() })?; let leader = client_location.get_lobby_leader(lobby).map_err(|err| -> ClientLocationError { err.into() })?; 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, event: 0, padding: 0, playerinfo: player_info(0x100, &client, &area_client, level_table), }) }