use thiserror
This commit is contained in:
parent
008e8ebebc
commit
9f4a9a4f2c
@ -38,4 +38,5 @@ fern = { version = "0.5", features = ["colored"] }
|
|||||||
byteorder = "1"
|
byteorder = "1"
|
||||||
enum-utils = "0.1.2"
|
enum-utils = "0.1.2"
|
||||||
derive_more = { version = "0.99.3", features = ["display"]}
|
derive_more = { version = "0.99.3", features = ["display"]}
|
||||||
|
thiserror = "1.0.15"
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
use std::convert::Into;
|
use std::convert::Into;
|
||||||
|
|
||||||
use std::time::SystemTime;
|
use std::time::SystemTime;
|
||||||
|
use thiserror::Error;
|
||||||
use crate::common::serverstate::ClientId;
|
use crate::common::serverstate::ClientId;
|
||||||
|
|
||||||
pub const MAX_ROOMS: usize = 128;
|
pub const MAX_ROOMS: usize = 128;
|
||||||
@ -25,27 +25,79 @@ impl LobbyId {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Error, Debug, PartialEq)]
|
||||||
|
#[error("")]
|
||||||
pub enum CreateRoomError {
|
pub enum CreateRoomError {
|
||||||
NoOpenSlots,
|
NoOpenSlots,
|
||||||
ClientInAreaAlready,
|
ClientInAreaAlready,
|
||||||
JoinError,
|
JoinError,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Error, Debug, PartialEq)]
|
||||||
|
#[error("")]
|
||||||
pub enum JoinRoomError {
|
pub enum JoinRoomError {
|
||||||
RoomDoesNotExist,
|
RoomDoesNotExist,
|
||||||
RoomFull,
|
RoomFull,
|
||||||
ClientInAreaAlready,
|
ClientInAreaAlready,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Error, Debug, PartialEq)]
|
||||||
|
#[error("")]
|
||||||
pub enum JoinLobbyError {
|
pub enum JoinLobbyError {
|
||||||
LobbyDoesNotExist,
|
LobbyDoesNotExist,
|
||||||
LobbyFull,
|
LobbyFull,
|
||||||
ClientInAreaAlready,
|
ClientInAreaAlready,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Error, Debug, PartialEq)]
|
||||||
|
#[error("")]
|
||||||
|
pub enum GetAreaError {
|
||||||
|
InvalidClient,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Error, Debug, PartialEq)]
|
||||||
|
#[error("")]
|
||||||
|
pub enum ClientRemovalError {
|
||||||
|
ClientNotInArea,
|
||||||
|
InvalidArea,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Error, Debug, PartialEq)]
|
||||||
|
#[error("")]
|
||||||
|
pub enum GetClientsError {
|
||||||
|
InvalidClient,
|
||||||
|
InvalidArea,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Error, Debug, PartialEq)]
|
||||||
|
#[error("")]
|
||||||
|
pub enum GetNeighborError {
|
||||||
|
InvalidClient,
|
||||||
|
InvalidArea,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Error, Debug, PartialEq)]
|
||||||
|
#[error("")]
|
||||||
|
pub enum GetLeaderError {
|
||||||
|
InvalidClient,
|
||||||
|
InvalidArea,
|
||||||
|
NoClientInArea,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Error, Debug, PartialEq)]
|
||||||
|
#[error("")]
|
||||||
|
pub enum ClientLocationError {
|
||||||
|
CreateRoomError(#[from] CreateRoomError),
|
||||||
|
JoinRoomError(#[from] JoinRoomError),
|
||||||
|
JoinLobbyError(#[from] JoinLobbyError),
|
||||||
|
GetAreaError(#[from] GetAreaError),
|
||||||
|
ClientRemovalError(#[from] ClientRemovalError),
|
||||||
|
GetClientsError(#[from] GetClientsError),
|
||||||
|
GetNeighborError(#[from] GetNeighborError),
|
||||||
|
GetLeaderError(#[from] GetLeaderError)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone, PartialEq)]
|
#[derive(Debug, Copy, Clone, PartialEq)]
|
||||||
pub struct LocalClientId(usize);
|
pub struct LocalClientId(usize);
|
||||||
|
|
||||||
@ -73,36 +125,6 @@ pub enum RoomLobby {
|
|||||||
Lobby(LobbyId),
|
Lobby(LobbyId),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
|
||||||
pub enum GetAreaError {
|
|
||||||
InvalidClient,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
|
||||||
pub enum ClientRemovalError {
|
|
||||||
ClientNotInArea,
|
|
||||||
InvalidArea,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
|
||||||
pub enum GetClientsError {
|
|
||||||
InvalidClient,
|
|
||||||
InvalidArea,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
|
||||||
pub enum GetNeighborError {
|
|
||||||
InvalidClient,
|
|
||||||
InvalidArea,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
|
||||||
pub enum GetLeaderError {
|
|
||||||
InvalidClient,
|
|
||||||
InvalidArea,
|
|
||||||
NoClientInArea,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct ClientLocation {
|
pub struct ClientLocation {
|
||||||
lobbies: [Lobby; 15],
|
lobbies: [Lobby; 15],
|
||||||
rooms: [Option<Room>; MAX_ROOMS],
|
rooms: [Option<Room>; MAX_ROOMS],
|
||||||
|
@ -4,7 +4,7 @@ use crate::common::serverstate::ClientId;
|
|||||||
use crate::common::leveltable::CharacterLevelTable;
|
use crate::common::leveltable::CharacterLevelTable;
|
||||||
use crate::ship::ship::{SendShipPacket, ShipError, ClientState, Clients};
|
use crate::ship::ship::{SendShipPacket, ShipError, ClientState, Clients};
|
||||||
use crate::ship::character::{CharacterBytesBuilder, FullCharacterBytesBuilder};
|
use crate::ship::character::{CharacterBytesBuilder, FullCharacterBytesBuilder};
|
||||||
use crate::ship::location::{ClientLocation, LobbyId, AreaClient};
|
use crate::ship::location::{ClientLocation, LobbyId, AreaClient, ClientLocationError};
|
||||||
use crate::entity::character::CharacterEntity;
|
use crate::entity::character::CharacterEntity;
|
||||||
use crate::ship::items::ActiveInventory;
|
use crate::ship::items::ActiveInventory;
|
||||||
use crate::ship::packet::builder::{player_header, player_info};
|
use crate::ship::packet::builder::{player_header, player_info};
|
||||||
@ -18,7 +18,7 @@ pub fn join_lobby(id: ClientId,
|
|||||||
clients: &Clients,
|
clients: &Clients,
|
||||||
level_table: &CharacterLevelTable)
|
level_table: &CharacterLevelTable)
|
||||||
-> Result<JoinLobby, ShipError> {
|
-> Result<JoinLobby, ShipError> {
|
||||||
let lobby_clients = client_location.get_clients_in_lobby(lobby).map_err(|err| ShipError::ClientError(format!("{:?}", err)))?;
|
let lobby_clients = client_location.get_clients_in_lobby(lobby).map_err(|err| -> ClientLocationError { err.into() })?;
|
||||||
let playerinfo = lobby_clients.iter()
|
let playerinfo = lobby_clients.iter()
|
||||||
.map(|area_client| {
|
.map(|area_client| {
|
||||||
let client = clients.get(&area_client.client).ok_or(ShipError::ClientNotFound(area_client.client)).unwrap();
|
let client = clients.get(&area_client.client).ok_or(ShipError::ClientNotFound(area_client.client)).unwrap();
|
||||||
@ -26,8 +26,8 @@ pub fn join_lobby(id: ClientId,
|
|||||||
});
|
});
|
||||||
|
|
||||||
let client = clients.get(&id).ok_or(ShipError::ClientNotFound(id)).unwrap();
|
let client = clients.get(&id).ok_or(ShipError::ClientNotFound(id)).unwrap();
|
||||||
let area_client = client_location.get_local_client(id).map_err(|err| ShipError::ClientError(format!("{:?}", err)))?;
|
let area_client = client_location.get_local_client(id).map_err(|err| -> ClientLocationError { err.into() })?;
|
||||||
let leader = client_location.get_lobby_leader(lobby).map_err(|err| ShipError::ClientError(format!("{:?}", err)))?;
|
let leader = client_location.get_lobby_leader(lobby).map_err(|err| -> ClientLocationError { err.into() })?;
|
||||||
Ok(JoinLobby {
|
Ok(JoinLobby {
|
||||||
client: area_client.local_client.id(),
|
client: area_client.local_client.id(),
|
||||||
leader: leader.local_client.id(),
|
leader: leader.local_client.id(),
|
||||||
@ -47,8 +47,8 @@ pub fn add_to_lobby(id: ClientId,
|
|||||||
level_table: &CharacterLevelTable)
|
level_table: &CharacterLevelTable)
|
||||||
-> Result<AddToLobby, ShipError> {
|
-> Result<AddToLobby, ShipError> {
|
||||||
let client = clients.get(&id).ok_or(ShipError::ClientNotFound(id)).unwrap();
|
let client = clients.get(&id).ok_or(ShipError::ClientNotFound(id)).unwrap();
|
||||||
let area_client = client_location.get_local_client(id).map_err(|err| ShipError::ClientError(format!("{:?}", err)))?;
|
let area_client = client_location.get_local_client(id).map_err(|err| -> ClientLocationError { err.into() })?;
|
||||||
let leader = client_location.get_lobby_leader(lobby).map_err(|err| ShipError::ClientError(format!("{:?}", err)))?;
|
let leader = client_location.get_lobby_leader(lobby).map_err(|err| -> ClientLocationError { err.into() })?;
|
||||||
Ok(AddToLobby {
|
Ok(AddToLobby {
|
||||||
flag: 1,
|
flag: 1,
|
||||||
client: area_client.local_client.id(),
|
client: area_client.local_client.id(),
|
||||||
|
@ -4,7 +4,7 @@ use crate::common::serverstate::ClientId;
|
|||||||
use crate::common::leveltable::CharacterLevelTable;
|
use crate::common::leveltable::CharacterLevelTable;
|
||||||
use crate::ship::ship::{SendShipPacket, ShipError, ClientState, Clients};
|
use crate::ship::ship::{SendShipPacket, ShipError, ClientState, Clients};
|
||||||
use crate::ship::character::{CharacterBytesBuilder, FullCharacterBytesBuilder};
|
use crate::ship::character::{CharacterBytesBuilder, FullCharacterBytesBuilder};
|
||||||
use crate::ship::location::{ClientLocation, RoomId, AreaClient};
|
use crate::ship::location::{ClientLocation, RoomId, AreaClient, ClientLocationError};
|
||||||
use crate::entity::character::CharacterEntity;
|
use crate::entity::character::CharacterEntity;
|
||||||
use crate::ship::items::ActiveInventory;
|
use crate::ship::items::ActiveInventory;
|
||||||
use crate::ship::room::RoomState;
|
use crate::ship::room::RoomState;
|
||||||
@ -18,20 +18,20 @@ pub fn join_room(id: ClientId,
|
|||||||
room_id: RoomId,
|
room_id: RoomId,
|
||||||
room: &RoomState)
|
room: &RoomState)
|
||||||
-> Result<JoinRoom, ShipError> {
|
-> Result<JoinRoom, ShipError> {
|
||||||
let all_clients = client_location.get_clients_in_room(room_id).map_err(|err| ShipError::ClientError(format!("{:?}", err)))?;
|
let all_clients = client_location.get_clients_in_room(room_id).map_err(|err| -> ClientLocationError { err.into() })?;
|
||||||
let players = all_clients.iter()
|
let players = all_clients.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.fold(Ok([PlayerHeader::default(); 4]), |acc, (i, c)| {
|
.fold(Ok([PlayerHeader::default(); 4]), |acc, (i, c)| -> Result<_, ShipError> {
|
||||||
let header_client = clients.get(&c.client).ok_or(ShipError::ClientNotFound(id))?;
|
let header_client = clients.get(&c.client).ok_or(ShipError::ClientNotFound(id))?;
|
||||||
let header_area_client = client_location.get_local_client(id).map_err(|err| ShipError::ClientError(format!("{:?}", err)))?;
|
let header_area_client = client_location.get_local_client(id).map_err(|err| -> ClientLocationError { err.into() })?;
|
||||||
acc.map(|mut a| {
|
acc.map(|mut a| {
|
||||||
a[i] = player_header(0x10000, &header_client, &header_area_client);
|
a[i] = player_header(0x10000, &header_client, &header_area_client);
|
||||||
a
|
a
|
||||||
})
|
})
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
let area_client = client_location.get_local_client(id).map_err(|err| ShipError::ClientError(format!("{:?}", err)))?;
|
let area_client = client_location.get_local_client(id).map_err(|err| -> ClientLocationError { err.into() })?;
|
||||||
let leader = client_location.get_room_leader(room_id).map_err(|err| ShipError::ClientError(format!("{:?}", err)))?;
|
let leader = client_location.get_room_leader(room_id).map_err(|err| -> ClientLocationError { err.into() })?;
|
||||||
Ok(JoinRoom {
|
Ok(JoinRoom {
|
||||||
flag: all_clients.len() as u32,
|
flag: all_clients.len() as u32,
|
||||||
maps: room.maps.map_headers(),
|
maps: room.maps.map_headers(),
|
||||||
|
@ -4,7 +4,7 @@ use crate::common::serverstate::ClientId;
|
|||||||
use crate::common::leveltable::CharacterLevelTable;
|
use crate::common::leveltable::CharacterLevelTable;
|
||||||
use crate::ship::ship::{SendShipPacket, ShipError, ClientState, Rooms, Clients};
|
use crate::ship::ship::{SendShipPacket, ShipError, ClientState, Rooms, Clients};
|
||||||
use crate::ship::character::{CharacterBytesBuilder, FullCharacterBytesBuilder};
|
use crate::ship::character::{CharacterBytesBuilder, FullCharacterBytesBuilder};
|
||||||
use crate::ship::location::{ClientLocation, LobbyId, RoomId, RoomLobby, MAX_ROOMS};
|
use crate::ship::location::{ClientLocation, LobbyId, RoomId, RoomLobby, MAX_ROOMS, ClientLocationError};
|
||||||
use crate::ship::packet::builder;
|
use crate::ship::packet::builder;
|
||||||
use libpso::character::character;
|
use libpso::character::character;
|
||||||
use crate::ship::room;
|
use crate::ship::room;
|
||||||
@ -69,12 +69,12 @@ pub fn join_room(id: ClientId,
|
|||||||
return Ok(Box::new(vec![(id, SendShipPacket::SmallDialog(SmallDialog::new("player is bursting\nplease wait".into())))].into_iter()))
|
return Ok(Box::new(vec![(id, SendShipPacket::SmallDialog(SmallDialog::new("player is bursting\nplease wait".into())))].into_iter()))
|
||||||
}
|
}
|
||||||
let room_id = RoomId(pkt.item as usize);
|
let room_id = RoomId(pkt.item as usize);
|
||||||
let original_room_clients = client_location.get_clients_in_room(room_id).map_err(|err| ShipError::ClientError(format!("{:?}", err)))?;
|
let original_room_clients = client_location.get_clients_in_room(room_id).map_err(|err| -> ClientLocationError { err.into() })?;
|
||||||
client_location.add_client_to_room(id, room_id).unwrap(); // TODO: show room full error or whatever
|
client_location.add_client_to_room(id, room_id).unwrap(); // TODO: show room full error or whatever
|
||||||
|
|
||||||
let client = clients.get(&id).ok_or(ShipError::ClientNotFound(id))?;
|
let client = clients.get(&id).ok_or(ShipError::ClientNotFound(id))?;
|
||||||
let area_client = client_location.get_local_client(id).map_err(|err| ShipError::ClientError(format!("{:?}", err)))?;
|
let area_client = client_location.get_local_client(id).map_err(|err| -> ClientLocationError { err.into() })?;
|
||||||
let leader = client_location.get_room_leader(room_id).map_err(|err| ShipError::ClientError(format!("{:?}", err)))?;
|
let leader = client_location.get_room_leader(room_id).map_err(|err| -> ClientLocationError { err.into() })?;
|
||||||
let join_room = builder::room::join_room(id, clients, client_location, room_id, &room)?;
|
let join_room = builder::room::join_room(id, clients, client_location, room_id, &room)?;
|
||||||
let add_to = builder::room::add_to_room(id, &client, &area_client, &leader, level_table, room_id)?;
|
let add_to = builder::room::add_to_room(id, &client, &area_client, &leader, level_table, room_id)?;
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ use std::collections::HashMap;
|
|||||||
use log::warn;
|
use log::warn;
|
||||||
|
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
use libpso::packet::ship::*;
|
use libpso::packet::ship::*;
|
||||||
use libpso::packet::login::{Login, LoginResponse, AccountStatus, Session};
|
use libpso::packet::login::{Login, LoginResponse, AccountStatus, Session};
|
||||||
@ -20,7 +21,7 @@ use crate::entity::gateway::EntityGateway;
|
|||||||
use crate::entity::account::{UserAccountEntity, UserSettingsEntity, USERFLAG_NEWCHAR, USERFLAG_DRESSINGROOM};
|
use crate::entity::account::{UserAccountEntity, UserSettingsEntity, USERFLAG_NEWCHAR, USERFLAG_DRESSINGROOM};
|
||||||
use crate::entity::character::CharacterEntity;
|
use crate::entity::character::CharacterEntity;
|
||||||
use crate::entity::item::{ItemLocation, ItemEntity};
|
use crate::entity::item::{ItemLocation, ItemEntity};
|
||||||
use crate::ship::location::{ClientLocation, LobbyId, RoomId, RoomLobby, MAX_ROOMS};
|
use crate::ship::location::{ClientLocation, LobbyId, RoomId, RoomLobby, MAX_ROOMS, ClientLocationError};
|
||||||
use crate::ship::character::{CharacterBytesBuilder, FullCharacterBytesBuilder};
|
use crate::ship::character::{CharacterBytesBuilder, FullCharacterBytesBuilder};
|
||||||
use crate::ship::items;
|
use crate::ship::items;
|
||||||
use crate::ship::room;
|
use crate::ship::room;
|
||||||
@ -30,13 +31,14 @@ pub const SHIP_PORT: u16 = 23423;
|
|||||||
pub type Rooms = [Option<room::RoomState>; MAX_ROOMS];
|
pub type Rooms = [Option<room::RoomState>; MAX_ROOMS];
|
||||||
pub type Clients = HashMap<ClientId, ClientState>;
|
pub type Clients = HashMap<ClientId, ClientState>;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Error, Debug)]
|
||||||
|
#[error("")]
|
||||||
pub enum ShipError {
|
pub enum ShipError {
|
||||||
ClientNotFound(ClientId),
|
ClientNotFound(ClientId),
|
||||||
NoCharacterInSlot(ClientId, u32),
|
NoCharacterInSlot(ClientId, u32),
|
||||||
InvalidSlot(ClientId, u32),
|
InvalidSlot(ClientId, u32),
|
||||||
TooManyClients,
|
TooManyClients,
|
||||||
ClientError(String),
|
ClientLocationError(#[from] ClientLocationError),
|
||||||
InvalidRoom(u32),
|
InvalidRoom(u32),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user