room list req/resp functions
This commit is contained in:
		
							parent
							
								
									f11ee7f53f
								
							
						
					
					
						commit
						7f95f7e793
					
				| @ -76,7 +76,7 @@ impl Into<u8> for Difficulty { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| #[derive(Debug, Copy, Clone)] | ||||
| pub enum RoomMode { | ||||
|     Single { | ||||
|         episode: Episode, | ||||
| @ -114,14 +114,6 @@ impl RoomMode { | ||||
|             RoomMode::Challenge {episode, ..} => *episode, | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn get_flags(&self) -> u8 { | ||||
|         match self { | ||||
|             RoomMode::Battle {..} => 0x10, | ||||
|             RoomMode::Challenge {..} => 0x20, | ||||
|             _ => 0x0, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| @ -135,7 +127,10 @@ pub struct RoomState { | ||||
|     // drop_table
 | ||||
|     // items on ground
 | ||||
|     // enemy info
 | ||||
|     pub difficulty: u8, | ||||
|     pub players: u8, | ||||
|     pub episode: u8, | ||||
|     pub flags: u8, | ||||
| } | ||||
| 
 | ||||
| impl RoomState { | ||||
| @ -145,6 +140,34 @@ impl RoomState { | ||||
|         } | ||||
|     }*/ | ||||
| 
 | ||||
|     pub fn get_flags(mode: &RoomMode, password: [u16; 16]) -> u8 { | ||||
|         let mut flags = 0u8; | ||||
|         
 | ||||
|         match mode { | ||||
|             RoomMode::Single {..} => {flags += 0x04} | ||||
|             RoomMode::Battle {..} => {flags += 0x10}, | ||||
|             RoomMode::Challenge {..} => {flags += 0x20}, | ||||
|             _ => {flags += 0x40}, | ||||
|         }; | ||||
|         
 | ||||
|         if password[0] > 0 { | ||||
|             flags += 0x02; | ||||
|         } | ||||
|         flags | ||||
|     } | ||||
| 
 | ||||
|     pub fn get_episode(mode: &RoomMode) -> u8 { | ||||
|         let mut episode = 0u8; | ||||
| 
 | ||||
|         episode = mode.episode().into(); | ||||
| 
 | ||||
|         match mode { | ||||
|             RoomMode::Single {..} => {episode += 0x10}, | ||||
|             _ => {episode += 0x40}, | ||||
|         } | ||||
|         episode | ||||
|     } | ||||
| 
 | ||||
|     pub fn from_create_room(create_room: &libpso::packet::ship::CreateRoom) -> Result<RoomState, RoomCreationError> { | ||||
|         if [create_room.battle, create_room.challenge, create_room.single_player].iter().sum::<u8>() > 1 { | ||||
|             return Err(RoomCreationError::InvalidMode) | ||||
| @ -174,14 +197,16 @@ impl RoomState { | ||||
|             } | ||||
|         }; | ||||
| 
 | ||||
|         let ep = room_mode.episode(); | ||||
|         Ok(RoomState { | ||||
|             mode: room_mode, | ||||
|             name: String::from_utf16_lossy(&create_room.name).trim_matches(char::from(0)).into(), | ||||
|             password: create_room.password, | ||||
|             //maps: [0; 0x20],
 | ||||
|             maps: Maps::new(ep), | ||||
|             players: 1, | ||||
|             maps: Maps::new(room_mode.episode()), | ||||
|             difficulty: create_room.difficulty + 0x22, | ||||
|             players: 0, | ||||
|             episode: RoomState::get_episode(&room_mode), | ||||
|             flags: RoomState::get_flags(&room_mode, create_room.password), | ||||
|         }) | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -9,6 +9,7 @@ use libpso::packet::messages::*; | ||||
| use libpso::{PacketParseError, PSOPacket}; | ||||
| use libpso::crypto::bb::PSOBBCipher; | ||||
| use libpso::character::character; | ||||
| use libpso::packet::ship::{ROOM_MENU_ID}; | ||||
| 
 | ||||
| use crate::common::cipherkeys::{ELSEWHERE_PRIVATE_KEY, ELSEWHERE_PARRAY}; | ||||
| use crate::common::serverstate::{SendServerPacket, RecvServerPacket, ServerState, OnConnect, ClientId}; | ||||
| @ -443,22 +444,26 @@ impl<EG: EntityGateway> ShipServerState<EG> { | ||||
|             .filter_map(|(i, r)| { | ||||
|                 r.as_ref().map(|room| { | ||||
|                     RoomList { | ||||
|                         menu_id: 1, | ||||
|                         menu_id: ROOM_MENU_ID, | ||||
|                         item_id: i as u32, | ||||
|                         difficulty: 0x22,//room.mode.difficulty().into(),
 | ||||
|                         difficulty: room.difficulty, | ||||
|                         players: room.players, | ||||
|                         name: libpso::utf8_to_utf16_array!(room.name, 16), | ||||
|                         episode: 0x40,//room.mode.episode().into(),
 | ||||
|                         flags: room.mode.get_flags(), | ||||
|                         episode: room.episode, | ||||
|                         flags: room.flags, | ||||
|                     } | ||||
|                 }) | ||||
|             }); | ||||
|         let baseroom: BaseRoom = BaseRoom { | ||||
|             menu_id: ROOM_MENU_ID, | ||||
|             title_id: ROOM_MENU_ID, | ||||
|             zero: 0x0000, | ||||
|             menu_title: libpso::utf8_to_utf16_array!("Room list menu", 17), | ||||
|         }; | ||||
| 
 | ||||
|         Box::new(vec![(id, SendShipPacket::RoomListResponse(RoomListResponse { | ||||
|             menu_id: 1, | ||||
|             title_id: 1, | ||||
|             zero: 0, | ||||
|             menu_title: libpso::utf8_to_utf16_array!("base_room", 17), | ||||
|             room_list: active_room_list.collect() | ||||
|             baseroom, | ||||
|             rooms: active_room_list.collect() | ||||
|         }))].into_iter()) | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user