improve error handling in new character
This commit is contained in:
parent
cf7be2e5d0
commit
75260c40a0
@ -17,7 +17,7 @@ use crate::common::interserver::{ServerId, InterserverActor, LoginMessage, ShipM
|
||||
use crate::common::leveltable::CharacterLevelTable;
|
||||
use libpso::{utf8_to_array, utf8_to_utf16_array};
|
||||
|
||||
use crate::entity::gateway::EntityGateway;
|
||||
use crate::entity::gateway::{EntityGateway, GatewayError};
|
||||
use crate::entity::account::{UserAccountEntity, NewUserSettingsEntity, USERFLAG_NEWCHAR, USERFLAG_DRESSINGROOM};
|
||||
use crate::entity::item::{NewItemEntity, ItemDetail, ItemLocation, InventoryItemEntity, InventoryEntity, BankEntity, BankName, EquippedEntity};
|
||||
use crate::entity::item::weapon::Weapon;
|
||||
@ -41,7 +41,7 @@ pub enum CharacterError {
|
||||
CouldNotLoadSettings,
|
||||
CouldNotLoadCharacters,
|
||||
CouldNotLoadGuildcard,
|
||||
DbError,
|
||||
GatewayError(#[from] GatewayError),
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
@ -181,7 +181,7 @@ pub struct CharacterServerState<EG: EntityGateway> {
|
||||
}
|
||||
|
||||
|
||||
async fn new_character<EG: EntityGateway>(entity_gateway: &mut EG, user: &UserAccountEntity, preview: &CharacterPreview) {
|
||||
async fn new_character<EG: EntityGateway>(entity_gateway: &mut EG, user: &UserAccountEntity, preview: &CharacterPreview) -> Result<(), anyhow::Error> {
|
||||
let mut character = new_character_from_preview(user, preview);
|
||||
match character.char_class {
|
||||
CharacterClass::FOmar | CharacterClass::FOmarl| CharacterClass::FOnewm | CharacterClass::FOnewearl => character.techs.set_tech(Technique::Foie, TechLevel(1)),
|
||||
@ -189,7 +189,7 @@ async fn new_character<EG: EntityGateway>(entity_gateway: &mut EG, user: &UserAc
|
||||
}
|
||||
|
||||
character.meseta = 300;
|
||||
let character = entity_gateway.create_character(character).await.unwrap();
|
||||
let character = entity_gateway.create_character(character).await?;
|
||||
|
||||
let new_weapon = match character.char_class {
|
||||
CharacterClass::HUmar | CharacterClass::HUnewearl | CharacterClass::HUcast | CharacterClass::HUcaseal => item::weapon::WeaponType::Saber,
|
||||
@ -211,7 +211,7 @@ async fn new_character<EG: EntityGateway>(entity_gateway: &mut EG, user: &UserAc
|
||||
}),
|
||||
location: ItemLocation::Inventory {
|
||||
character_id: character.id,
|
||||
}}).await.unwrap();
|
||||
}}).await?;
|
||||
|
||||
let armor = entity_gateway.create_item(
|
||||
NewItemEntity {
|
||||
@ -225,7 +225,7 @@ async fn new_character<EG: EntityGateway>(entity_gateway: &mut EG, user: &UserAc
|
||||
}),
|
||||
location: ItemLocation::Inventory {
|
||||
character_id: character.id,
|
||||
}}).await.unwrap();
|
||||
}}).await?;
|
||||
|
||||
let mut mag = {
|
||||
if character.char_class.is_android() {
|
||||
@ -240,7 +240,7 @@ async fn new_character<EG: EntityGateway>(entity_gateway: &mut EG, user: &UserAc
|
||||
item: ItemDetail::Mag(mag),
|
||||
location: ItemLocation::Inventory {
|
||||
character_id: character.id,
|
||||
}}).await.unwrap();
|
||||
}}).await?;
|
||||
|
||||
let mut monomates = Vec::new();
|
||||
for _ in 0..4usize {
|
||||
@ -252,7 +252,7 @@ async fn new_character<EG: EntityGateway>(entity_gateway: &mut EG, user: &UserAc
|
||||
}),
|
||||
location: ItemLocation::Inventory {
|
||||
character_id: character.id,
|
||||
}}).await.unwrap())
|
||||
}}).await?)
|
||||
}
|
||||
|
||||
let mut monofluids = Vec::new();
|
||||
@ -265,20 +265,21 @@ async fn new_character<EG: EntityGateway>(entity_gateway: &mut EG, user: &UserAc
|
||||
}),
|
||||
location: ItemLocation::Inventory {
|
||||
character_id: character.id,
|
||||
}}).await.unwrap())
|
||||
}}).await?)
|
||||
}
|
||||
|
||||
let inventory = InventoryEntity {
|
||||
items: vec![InventoryItemEntity::Individual(weapon.clone()), InventoryItemEntity::Individual(armor.clone()), InventoryItemEntity::Individual(mag.clone()),
|
||||
InventoryItemEntity::Stacked(monomates), InventoryItemEntity::Stacked(monofluids)],
|
||||
};
|
||||
entity_gateway.set_character_inventory(&character.id, &inventory).await;
|
||||
entity_gateway.set_character_bank(&character.id, &BankEntity::default(), BankName("".into())).await;
|
||||
entity_gateway.set_character_inventory(&character.id, &inventory).await?;
|
||||
entity_gateway.set_character_bank(&character.id, &BankEntity::default(), BankName("".into())).await?;
|
||||
let mut equipped = EquippedEntity::default();
|
||||
equipped.weapon = Some(weapon.id);
|
||||
equipped.armor = Some(armor.id);
|
||||
equipped.mag = Some(mag.id);
|
||||
entity_gateway.set_character_equips(&character.id, &equipped).await;
|
||||
entity_gateway.set_character_equips(&character.id, &equipped).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
@ -303,7 +304,7 @@ impl<EG: EntityGateway> CharacterServerState<EG> {
|
||||
Ok(match get_login_status(&self.entity_gateway, pkt).await.and_then(check_if_already_online) {
|
||||
Ok(mut user) => {
|
||||
user.at_character = true;
|
||||
self.entity_gateway.save_user(&user).await.map_err(|_| CharacterError::DbError)?;
|
||||
self.entity_gateway.save_user(&user).await?;
|
||||
|
||||
let mut response = LoginResponse::by_status(AccountStatus::Ok, Session::new());
|
||||
response.guildcard = user.guildcard;
|
||||
@ -457,7 +458,7 @@ impl<EG: EntityGateway> CharacterServerState<EG> {
|
||||
let client = self.clients.get_mut(&id).ok_or(CharacterError::ClientNotFound(id))?;
|
||||
let mut user = client.user.as_mut().unwrap();
|
||||
if user.flags == USERFLAG_NEWCHAR {
|
||||
new_character(&mut self.entity_gateway, &user, preview).await
|
||||
new_character(&mut self.entity_gateway, &user, preview).await?
|
||||
}
|
||||
if user.flags == USERFLAG_DRESSINGROOM {
|
||||
// TODO: dressing room stuff
|
||||
|
Loading…
x
Reference in New Issue
Block a user