view info board
This commit is contained in:
		
							parent
							
								
									a55d3694d9
								
							
						
					
					
						commit
						37b892f5dc
					
				| @ -236,7 +236,7 @@ impl CharacterInfoboard { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn as_bytes(&mut self) -> [u16; 172] { | ||||
|     pub fn as_bytes(&self) -> [u16; 172] { | ||||
|         self.board | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -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() | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -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<EG: EntityGateway> ShipServerState<EG> { | ||||
|         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<EG: EntityGateway> ShipServerState<EG> { | ||||
|         Box::new(None.into_iter()) | ||||
|     } | ||||
| 
 | ||||
|     fn request_infoboard(&mut self, id: ClientId, request_infoboard: &ViewInfoboardRequest) -> Box<dyn Iterator<Item = (ClientId, SendShipPacket)> + 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<dyn Iterator<Item = (ClientId, SendShipPacket)> + 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<EG: EntityGateway> ServerState for ShipServerState<EG> { | ||||
|                 self.update_config(id, pkt) | ||||
|             }, | ||||
| 
 | ||||
|             RecvShipPacket::ViewInfoboardRequest(pkt) => { | ||||
|                 self.request_infoboard(id, pkt) | ||||
|             }, | ||||
| 
 | ||||
|             RecvShipPacket::WriteInfoboard(pkt) => { | ||||
|                 self.write_infoboard(id, pkt) | ||||
|             }, | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user