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