ClientLocation struct
This commit is contained in:
parent
a3e90516d7
commit
d1dbd8d043
@ -1,4 +1,6 @@
|
||||
#![allow(incomplete_features)]
|
||||
#![feature(const_generics)]
|
||||
#![feature(maybe_uninit_extra)]
|
||||
|
||||
|
||||
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::character::Character;
|
||||
use crate::login::login::get_login_status;
|
||||
use crate::ship::location::ClientLocation;
|
||||
|
||||
pub const SHIP_PORT: u16 = 23423;
|
||||
|
||||
@ -73,6 +74,7 @@ struct ClientState {
|
||||
character: Character,
|
||||
session: Session,
|
||||
block: u32,
|
||||
client_location: ClientLocation,
|
||||
}
|
||||
|
||||
impl ClientState {
|
||||
@ -82,6 +84,7 @@ impl ClientState {
|
||||
character: Character::default(),
|
||||
session: Session::new(),
|
||||
block: 0,
|
||||
client_location: ClientLocation::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user