ClientLocation struct
This commit is contained in:
		
							parent
							
								
									a3e90516d7
								
							
						
					
					
						commit
						d1dbd8d043
					
				@ -1,4 +1,6 @@
 | 
				
			|||||||
 | 
					#![allow(incomplete_features)]
 | 
				
			||||||
#![feature(const_generics)]
 | 
					#![feature(const_generics)]
 | 
				
			||||||
 | 
					#![feature(maybe_uninit_extra)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mod common;
 | 
					mod common;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										106
									
								
								src/ship/location.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								src/ship/location.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,106 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					use crate::common::serverstate::ClientId;
 | 
				
			||||||
 | 
					// TODO: room passwords?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Copy, Clone)]
 | 
				
			||||||
 | 
					pub struct ClientArea<const N: usize> {
 | 
				
			||||||
 | 
					    clients: [Option<ClientId>; N],
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl<const N: usize> ClientArea<{N}> {
 | 
				
			||||||
 | 
					    pub fn new() -> ClientArea<{N}> {
 | 
				
			||||||
 | 
					        let mut clients: [std::mem::MaybeUninit<Option<ClientId>>; N] = unsafe {
 | 
				
			||||||
 | 
					            std::mem::MaybeUninit::uninit().assume_init()
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        for i in clients.iter_mut() {
 | 
				
			||||||
 | 
					            i.write(None);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ClientArea {
 | 
				
			||||||
 | 
					            clients: unsafe { (&clients as *const _ as *const [Option<ClientId>; N]).read()}
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    fn add(&mut self, id: ClientId) -> Option<usize> {
 | 
				
			||||||
 | 
					        for (i, client) in self.clients.iter_mut().enumerate() {
 | 
				
			||||||
 | 
					            if client.is_none() {
 | 
				
			||||||
 | 
					                *client = Some(id);
 | 
				
			||||||
 | 
					                return Some(i);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return None;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    fn remove(&mut self, id: ClientId) {
 | 
				
			||||||
 | 
					        for client in self.clients.iter_mut() {
 | 
				
			||||||
 | 
					            if *client == Some(id) {
 | 
				
			||||||
 | 
					                *client = None
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub type Lobby = ClientArea<12>;
 | 
				
			||||||
 | 
					pub type Room = ClientArea<4>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub type LobbyId = usize;
 | 
				
			||||||
 | 
					pub type RoomId = usize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub struct ClientLocation {
 | 
				
			||||||
 | 
					    lobbies: [Lobby; 15],
 | 
				
			||||||
 | 
					    rooms: [Option<Room>; 128],
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum JoinRoomError {
 | 
				
			||||||
 | 
					    RoomDoesNotExist,
 | 
				
			||||||
 | 
					    RoomFull,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum JoinLobbyError {
 | 
				
			||||||
 | 
					    LobbyDoesNotExist,
 | 
				
			||||||
 | 
					    LobbyFull,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl ClientLocation {
 | 
				
			||||||
 | 
					    pub fn new() -> ClientLocation {
 | 
				
			||||||
 | 
					        ClientLocation {
 | 
				
			||||||
 | 
					            lobbies: [Lobby::new(); 15],
 | 
				
			||||||
 | 
					            rooms: [None; 128],
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn add_to_lobby(&mut self, id: ClientId, lobby: LobbyId) -> Result<usize, JoinLobbyError> {
 | 
				
			||||||
 | 
					        self.lobbies.get_mut(lobby)
 | 
				
			||||||
 | 
					            .ok_or(JoinLobbyError::LobbyDoesNotExist)?
 | 
				
			||||||
 | 
					            .add(id)
 | 
				
			||||||
 | 
					            .ok_or(JoinLobbyError::LobbyFull)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn add_to_room(&mut self, id: ClientId, room: RoomId) -> Result<usize, JoinRoomError> {
 | 
				
			||||||
 | 
					        self.rooms.get_mut(room)
 | 
				
			||||||
 | 
					            .ok_or(JoinRoomError::RoomDoesNotExist)?
 | 
				
			||||||
 | 
					            .as_mut()
 | 
				
			||||||
 | 
					            .ok_or(JoinRoomError::RoomDoesNotExist)?
 | 
				
			||||||
 | 
					            .add(id)
 | 
				
			||||||
 | 
					            .ok_or(JoinRoomError::RoomFull)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn get_client_neighbors(&self, id: ClientId) -> Vec<ClientId> {
 | 
				
			||||||
 | 
					        for lobby in self.lobbies.iter() {
 | 
				
			||||||
 | 
					            if lobby.clients.contains(&Some(id)) {
 | 
				
			||||||
 | 
					                return lobby.clients.iter().filter(|c| c.is_some()).map(|c| c.unwrap()).collect();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for room in self.rooms.iter() {
 | 
				
			||||||
 | 
					            if let Some(room) = room {
 | 
				
			||||||
 | 
					                if room.clients.contains(&Some(id)) {
 | 
				
			||||||
 | 
					                    return room.clients.iter().filter(|c| c.is_some()).map(|c| c.unwrap()).collect();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        panic!()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1 +1,2 @@
 | 
				
			|||||||
pub mod ship;
 | 
					pub mod ship;
 | 
				
			||||||
 | 
					pub mod location;
 | 
				
			||||||
 | 
				
			|||||||
@ -16,6 +16,7 @@ use crate::entity::gateway::EntityGateway;
 | 
				
			|||||||
use crate::entity::account::{UserAccount, USERFLAG_NEWCHAR, USERFLAG_DRESSINGROOM};
 | 
					use crate::entity::account::{UserAccount, USERFLAG_NEWCHAR, USERFLAG_DRESSINGROOM};
 | 
				
			||||||
use crate::entity::character::Character;
 | 
					use crate::entity::character::Character;
 | 
				
			||||||
use crate::login::login::get_login_status;
 | 
					use crate::login::login::get_login_status;
 | 
				
			||||||
 | 
					use crate::ship::location::ClientLocation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub const SHIP_PORT: u16 = 23423;
 | 
					pub const SHIP_PORT: u16 = 23423;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -73,6 +74,7 @@ struct ClientState {
 | 
				
			|||||||
    character: Character,
 | 
					    character: Character,
 | 
				
			||||||
    session: Session,
 | 
					    session: Session,
 | 
				
			||||||
    block: u32,
 | 
					    block: u32,
 | 
				
			||||||
 | 
					    client_location: ClientLocation,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl ClientState {
 | 
					impl ClientState {
 | 
				
			||||||
@ -82,6 +84,7 @@ impl ClientState {
 | 
				
			|||||||
            character: Character::default(),
 | 
					            character: Character::default(),
 | 
				
			||||||
            session: Session::new(),
 | 
					            session: Session::new(),
 | 
				
			||||||
            block: 0,
 | 
					            block: 0,
 | 
				
			||||||
 | 
					            client_location: ClientLocation::new(),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user