use_item_jackolantern #124
| @ -147,7 +147,7 @@ pub enum RoomLobby { | |||||||
| #[derive(Clone, Debug)] | #[derive(Clone, Debug)] | ||||||
| pub struct ClientLocation { | pub struct ClientLocation { | ||||||
|     lobbies: [Arc<RwLock<Lobby>>; 15], |     lobbies: [Arc<RwLock<Lobby>>; 15], | ||||||
|     rooms: [Option<Arc<RwLock<Room>>>; MAX_ROOMS], |     rooms: [Arc<RwLock<Option<Room>>>; MAX_ROOMS], | ||||||
|     client_location: Arc<RwLock<HashMap<ClientId, RoomLobby>>>, |     client_location: Arc<RwLock<HashMap<ClientId, RoomLobby>>>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -155,7 +155,7 @@ impl Default for ClientLocation { | |||||||
|     fn default() -> ClientLocation { |     fn default() -> ClientLocation { | ||||||
|         ClientLocation { |         ClientLocation { | ||||||
|             lobbies: core::array::from_fn(|_| Arc::new(RwLock::new(Lobby([None; 12])))), |             lobbies: core::array::from_fn(|_| Arc::new(RwLock::new(Lobby([None; 12])))), | ||||||
|             rooms: core::array::from_fn(|_| None), |             rooms: core::array::from_fn(|_| Arc::new(RwLock::new(None))), | ||||||
|             client_location: Arc::new(RwLock::new(HashMap::new())), |             client_location: Arc::new(RwLock::new(HashMap::new())), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -210,15 +210,16 @@ impl ClientLocation { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub async fn create_new_room(&mut self, id: ClientId) -> Result<RoomId, CreateRoomError> { |     pub async fn create_new_room(&mut self, id: ClientId) -> Result<RoomId, CreateRoomError> { | ||||||
|         let (index, empty_slot) = self.rooms.iter_mut() |         let (index, empty_slot) = Box::pin(stream::iter(self.rooms.iter()) | ||||||
|             .enumerate() |             .enumerate() | ||||||
|             .find(|(_, r)| r.is_none()) |             .filter(|(_, r)| async {r.read().await.is_none()})) | ||||||
|  |             .next() | ||||||
|  |             .await | ||||||
|             .ok_or(CreateRoomError::NoOpenSlots)?; |             .ok_or(CreateRoomError::NoOpenSlots)?; | ||||||
|         *empty_slot = Some(Arc::new(RwLock::new(Room([None; 4])))); |         *empty_slot.write().await = Some(Room([None; 4])); | ||||||
|         self.add_client_to_room(id, RoomId(index)) |         self.add_client_to_room(id, RoomId(index)) | ||||||
|             .await |             .await | ||||||
|             .map_err(|_err| CreateRoomError::JoinError)?; |             .map_err(|_err| CreateRoomError::JoinError)?; | ||||||
| 
 |  | ||||||
|         Ok(RoomId(index)) |         Ok(RoomId(index)) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -226,9 +227,10 @@ impl ClientLocation { | |||||||
|         let mut r = self.rooms.get(room.0) |         let mut r = self.rooms.get(room.0) | ||||||
|             .ok_or(JoinRoomError::RoomDoesNotExist)? |             .ok_or(JoinRoomError::RoomDoesNotExist)? | ||||||
|             .as_ref() |             .as_ref() | ||||||
|             .ok_or(JoinRoomError::RoomDoesNotExist)? |  | ||||||
|             .write() |             .write() | ||||||
|             .await; |             .await; | ||||||
|  |         let r = r.as_mut() | ||||||
|  |             .ok_or(JoinRoomError::RoomDoesNotExist)?; | ||||||
|         let (index, empty_slot) = r.0.iter_mut() |         let (index, empty_slot) = r.0.iter_mut() | ||||||
|             .enumerate() |             .enumerate() | ||||||
|             .find(|(_, k)| k.is_none()) |             .find(|(_, k)| k.is_none()) | ||||||
| @ -293,9 +295,9 @@ impl ClientLocation { | |||||||
|     pub async fn get_room_leader(&self, room: RoomId) -> Result<AreaClient, GetLeaderError> { |     pub async fn get_room_leader(&self, room: RoomId) -> Result<AreaClient, GetLeaderError> { | ||||||
|         let r = self.rooms[room.0] |         let r = self.rooms[room.0] | ||||||
|             .as_ref() |             .as_ref() | ||||||
|             .ok_or(GetLeaderError::InvalidArea)? |  | ||||||
|             .read() |             .read() | ||||||
|             .await; |             .await | ||||||
|  |             .ok_or(GetLeaderError::InvalidArea)?; | ||||||
|         let mut r = r |         let mut r = r | ||||||
|             .0 |             .0 | ||||||
|             .iter() |             .iter() | ||||||
| @ -368,9 +370,9 @@ impl ClientLocation { | |||||||
|         Ok(self.rooms.get(room.0) |         Ok(self.rooms.get(room.0) | ||||||
|            .ok_or(GetClientsError::InvalidArea)? |            .ok_or(GetClientsError::InvalidArea)? | ||||||
|            .as_ref() |            .as_ref() | ||||||
|            .ok_or(GetClientsError::InvalidArea)? |  | ||||||
|            .read() |            .read() | ||||||
|            .await |            .await | ||||||
|  |            .ok_or(GetClientsError::InvalidArea)? | ||||||
|            .0 |            .0 | ||||||
|            .iter() |            .iter() | ||||||
|            .filter_map(|client| { |            .filter_map(|client| { | ||||||
| @ -456,9 +458,13 @@ impl ClientLocation { | |||||||
|             .ok_or(ClientRemovalError::ClientNotInArea)?; |             .ok_or(ClientRemovalError::ClientNotInArea)?; | ||||||
|         match area { |         match area { | ||||||
|             RoomLobby::Room(room) => { |             RoomLobby::Room(room) => { | ||||||
|                 let r = self.rooms.get(room.0).ok_or(ClientRemovalError::InvalidArea)?; |                 let mut r = self.rooms.get(room.0) | ||||||
|                 if let Some(r) = r { |                     .ok_or(ClientRemovalError::InvalidArea)? | ||||||
|                     remove_client(id, &mut r.write().await.0) |                     .as_ref() | ||||||
|  |                     .write() | ||||||
|  |                     .await; | ||||||
|  |                 if let Some(r) = r.as_mut() { | ||||||
|  |                     remove_client(id, &mut r.0) | ||||||
|                 } |                 } | ||||||
|                 else { |                 else { | ||||||
|                     return Err(ClientRemovalError::InvalidArea) |                     return Err(ClientRemovalError::InvalidArea) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user