You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
2.9 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. use libpso::packet::ship::*;
  2. use crate::common::serverstate::ClientId;
  3. use crate::common::leveltable::CharacterLevelTable;
  4. use crate::ship::ship::{ShipError, ClientState, Clients};
  5. use crate::ship::location::{ClientLocation, RoomId, AreaClient, ClientLocationError};
  6. use crate::ship::room::RoomState;
  7. use crate::ship::items::ItemManager;
  8. use crate::ship::packet::builder::{player_header, player_info};
  9. use std::convert::TryInto;
  10. pub fn join_room(id: ClientId,
  11. clients: &Clients,
  12. client_location: &ClientLocation,
  13. room_id: RoomId,
  14. room: &RoomState)
  15. -> Result<JoinRoom, ShipError> {
  16. let all_clients = client_location.get_clients_in_room(room_id).map_err(|err| -> ClientLocationError { err.into() })?;
  17. let players = all_clients.iter()
  18. .enumerate()
  19. .fold(Ok([PlayerHeader::default(); 4]), |acc, (i, c)| -> Result<_, ShipError> {
  20. let header_client = clients.get(&c.client).ok_or(ShipError::ClientNotFound(id))?;
  21. let header_area_client = client_location.get_local_client(id).map_err(|err| -> ClientLocationError { err.into() })?;
  22. acc.map(|mut a| {
  23. a[i] = player_header(0x10000, header_client, &header_area_client);
  24. a
  25. })
  26. })?;
  27. let area_client = client_location.get_local_client(id).map_err(|err| -> ClientLocationError { err.into() })?;
  28. let leader = client_location.get_room_leader(room_id).map_err(|err| -> ClientLocationError { err.into() })?;
  29. Ok(JoinRoom {
  30. flag: all_clients.len() as u32,
  31. maps: room.maps.map_headers(),
  32. players,
  33. client: area_client.local_client.id(),
  34. leader: leader.local_client.id(),
  35. one: 1,
  36. difficulty: room.mode.difficulty().into(),
  37. battle: room.mode.battle(),
  38. event: 0,
  39. section: room.section_id.into(),
  40. challenge: room.mode.challenge(),
  41. random_seed: room.random_seed,
  42. episode: room.mode.episode().into(),
  43. one2: 1,
  44. single_player: room.mode.single_player(),
  45. unknown: 0,
  46. })
  47. }
  48. pub fn add_to_room(_id: ClientId,
  49. client: &ClientState,
  50. area_client: &AreaClient,
  51. leader: &AreaClient,
  52. item_manager: &ItemManager,
  53. level_table: &CharacterLevelTable,
  54. _room_id: RoomId,
  55. )
  56. -> Result<AddToRoom, ShipError> {
  57. Ok(AddToRoom {
  58. flag: 1,
  59. client: area_client.local_client.id(),
  60. leader: leader.local_client.id(),
  61. one: 0, // TODO: ????????
  62. lobby: 0xFF,
  63. block: 0,
  64. event: 0,
  65. padding: 0,
  66. playerinfo: player_info(0x10000, client, area_client, item_manager, level_table),
  67. })
  68. }
  69. pub fn build_rare_monster_list(rare_monster_vec: Vec<u16>) -> RareMonsterList {
  70. RareMonsterList {
  71. ids: rare_monster_vec.try_into().unwrap_or([0xFFFFu16; 16]),
  72. }
  73. }