diff --git a/src/entity/character.rs b/src/entity/character.rs index ab84014..2436d13 100644 --- a/src/entity/character.rs +++ b/src/entity/character.rs @@ -236,7 +236,7 @@ impl CharacterInfoboard { } } - pub fn as_bytes(&mut self) -> [u16; 172] { + pub fn as_bytes(&self) -> [u16; 172] { self.board } diff --git a/src/ship/character.rs b/src/ship/character.rs index 7aa71ad..f6334bc 100644 --- a/src/ship/character.rs +++ b/src/ship/character.rs @@ -82,7 +82,6 @@ pub struct FullCharacterBytesBuilder<'a> { inventory: Option<&'a Inventory>, key_config: Option<&'a [u8; 0x16C]>, joystick_config: Option<&'a [u8; 0x38]>, - info_board: Option<&'a [u16; 172]>, } @@ -95,7 +94,6 @@ impl<'a> FullCharacterBytesBuilder<'a> { inventory: None, key_config: None, joystick_config: None, - info_board: None, } } @@ -141,12 +139,6 @@ impl<'a> FullCharacterBytesBuilder<'a> { } } - pub fn info_board(self, info_board: &'a [u16; 172]) -> FullCharacterBytesBuilder<'a> { - FullCharacterBytesBuilder { - info_board: Some(info_board), - ..self - } - } pub fn build(self) -> character::FullCharacter { let character = self.character.unwrap(); @@ -155,7 +147,6 @@ impl<'a> FullCharacterBytesBuilder<'a> { let inventory = self.inventory.unwrap(); let key_config = self.key_config.unwrap(); let joystick_config = self.joystick_config.unwrap(); - let info_board = self.info_board.unwrap(); character::FullCharacter { character: CharacterBytesBuilder::new() @@ -173,7 +164,7 @@ impl<'a> FullCharacterBytesBuilder<'a> { joystick_config: *joystick_config, ..character::KeyTeamConfig::default() }, - info_board: *info_board, + info_board: character.info_board.as_bytes(), ..character::FullCharacter::default() } } diff --git a/src/ship/ship.rs b/src/ship/ship.rs index dbed40a..29069dc 100644 --- a/src/ship/ship.rs +++ b/src/ship/ship.rs @@ -44,6 +44,7 @@ pub enum RecvShipPacket { CreateRoom(CreateRoom), RoomNameRequest(RoomNameRequest), UpdateConfig(UpdateConfig), + ViewInfoboardRequest(ViewInfoboardRequest), WriteInfoboard(WriteInfoboard), } @@ -59,6 +60,7 @@ impl RecvServerPacket for RecvShipPacket { 0xC1 => Ok(RecvShipPacket::CreateRoom(CreateRoom::from_bytes(data)?)), 0x8A => Ok(RecvShipPacket::RoomNameRequest(RoomNameRequest::from_bytes(data)?)), 0x7ED => Ok(RecvShipPacket::UpdateConfig(UpdateConfig::from_bytes(data)?)), + 0xD8 => Ok(RecvShipPacket::ViewInfoboardRequest(ViewInfoboardRequest::from_bytes(data)?)), 0xD9 => Ok(RecvShipPacket::WriteInfoboard(WriteInfoboard::from_bytes(data)?)), _ => Err(PacketParseError::WrongPacketForServerType(u16::from_le_bytes([data[2], data[3]]), data.to_vec())) } @@ -83,6 +85,7 @@ pub enum SendShipPacket { LeaveLobby(LeaveLobby), LeaveRoom(LeaveRoom), RoomNameResponse(RoomNameResponse), + ViewInfoboardResponse(ViewInfoboardResponse), } impl SendServerPacket for SendShipPacket { @@ -104,6 +107,7 @@ impl SendServerPacket for SendShipPacket { SendShipPacket::LeaveLobby(pkt) => pkt.as_bytes(), SendShipPacket::LeaveRoom(pkt) => pkt.as_bytes(), SendShipPacket::RoomNameResponse(pkt) => pkt.as_bytes(), + SendShipPacket::ViewInfoboardResponse(pkt) => pkt.as_bytes(), } } } @@ -199,13 +203,12 @@ impl ShipServerState { let (level, stats) = self.level_table.get_stats_from_exp(client.character.char_class, client.character.exp); let fc = FullCharacterBytesBuilder::new() - .character(&client.character.clone()) + .character(&client.character) .stats(&stats) .level(level) .inventory(&client.inventory) .key_config(&client.settings.settings.key_config) .joystick_config(&client.settings.settings.joystick_config) - .info_board(&client.character.info_board.as_bytes()) .build(); Ok(vec![ @@ -411,6 +414,29 @@ impl ShipServerState { Box::new(None.into_iter()) } + fn request_infoboard(&mut self, id: ClientId, request_infoboard: &ViewInfoboardRequest) -> Box + Send> { + let lobby = self.client_location.get_area_by_user(id); + let clients = lobby.clients(); + let r = clients + .iter() + .filter(|c| c.client_id != id) + .filter_map(|c| { + self.clients.get(&c.client_id) + }) + .map(|c| { + InfoboardResponse { + name: libpso::utf8_to_utf16_array!(c.character.name, 16), + message: c.character.info_board.as_bytes(), + } + }) + .collect(); + + // Box::new(vec![(id, ViewInfoboardResponse { + // response: r + // }].into_iter()) + Box::new(vec![(id, SendShipPacket::ViewInfoboardResponse(ViewInfoboardResponse {response: r}))].into_iter()) + } + fn write_infoboard(&mut self, id: ClientId, new_infoboard: &WriteInfoboard) -> Box + Send> { let client = self.clients.get_mut(&id).ok_or(ShipError::ClientNotFound(id)).unwrap(); client.character.info_board.update_infoboard(new_infoboard); @@ -474,6 +500,10 @@ impl ServerState for ShipServerState { self.update_config(id, pkt) }, + RecvShipPacket::ViewInfoboardRequest(pkt) => { + self.request_infoboard(id, pkt) + }, + RecvShipPacket::WriteInfoboard(pkt) => { self.write_infoboard(id, pkt) },