move ClientState instantiate from connect to valid login

This commit is contained in:
jake 2019-11-24 00:38:40 -08:00
parent 091bf7088e
commit f149bb4dea

View File

@ -70,20 +70,20 @@ impl SendServerPacket for SendShipPacket {
struct ClientState { struct ClientState {
user: Option<UserAccount>, user: UserAccount,
settings: Option<UserSettings>, settings: UserSettings,
character: Character, character: Character,
session: Session, session: Session,
block: u32, block: u32,
} }
impl ClientState { impl ClientState {
fn new() -> ClientState { fn new(user: UserAccount, settings: UserSettings, character: Character, session: Session) -> ClientState {
ClientState { ClientState {
user: None, user: user,
settings: None, settings: settings,
character: Character::default(), character: character,
session: Session::new(), session: session,
block: 0, block: 0,
} }
} }
@ -106,21 +106,20 @@ impl<EG: EntityGateway> ShipServerState<EG> {
} }
fn validate_login(&mut self, id: ClientId, pkt: &Login) -> Result<Vec<SendShipPacket>, ShipError> { fn validate_login(&mut self, id: ClientId, pkt: &Login) -> Result<Vec<SendShipPacket>, ShipError> {
let client = self.clients.get_mut(&id).ok_or(ShipError::ClientNotFound(id))?;
Ok(match get_login_status(&self.entity_gateway, pkt) { Ok(match get_login_status(&self.entity_gateway, pkt) {
Ok(user) => { Ok(user) => {
let mut response = LoginResponse::by_status(AccountStatus::Ok, Session::new()); let mut response = LoginResponse::by_status(AccountStatus::Ok, Session::new());
response.guildcard = user.guildcard.map_or(24, |gc| gc) as u32; response.guildcard = user.guildcard.map_or(24, |gc| gc) as u32;
response.team_id = user.team_id.map_or(31, |ti| ti) as u32; response.team_id = user.team_id.map_or(31, |ti| ti) as u32;
client.session = pkt.session;
let characters = self.entity_gateway.get_characters_by_user(&user); let characters = self.entity_gateway.get_characters_by_user(&user);
client.character = characters let character = characters
.get(pkt.session.character_slot as usize) .get(pkt.session.character_slot as usize)
.ok_or(ShipError::InvalidSlot(id, pkt.session.character_slot as u32))? .ok_or(ShipError::InvalidSlot(id, pkt.session.character_slot as u32))?
.ok_or(ShipError::NoCharacterInSlot(id, pkt.session.character_slot as u32))?; .ok_or(ShipError::NoCharacterInSlot(id, pkt.session.character_slot as u32))?;
client.user = Some(user); let settings = self.entity_gateway.get_user_settings_by_user(&user)
client.settings = Some(self.entity_gateway.get_user_settings_by_user(&client.user.as_ref().unwrap()) .ok_or(ShipError::ClientNotFound(id))?;
.ok_or(ShipError::ClientNotFound(id))?);
self.clients.insert(id, ClientState::new(user, settings, character, pkt.session));
vec![SendShipPacket::LoginResponse(response), SendShipPacket::ShipBlockList(ShipBlockList::new(3))] vec![SendShipPacket::LoginResponse(response), SendShipPacket::ShipBlockList(ShipBlockList::new(3))]
}, },
Err(err) => { Err(err) => {
@ -131,13 +130,12 @@ impl<EG: EntityGateway> ShipServerState<EG> {
fn block_selected(&mut self, id: ClientId, pkt: &MenuSelect) -> Result<Vec<SendShipPacket>, ShipError> { fn block_selected(&mut self, id: ClientId, pkt: &MenuSelect) -> Result<Vec<SendShipPacket>, ShipError> {
let client = self.clients.get_mut(&id).ok_or(ShipError::ClientNotFound(id))?; let client = self.clients.get_mut(&id).ok_or(ShipError::ClientNotFound(id))?;
let settings = client.settings.as_ref().ok_or(ShipError::ClientNotFound(id))?.settings;
client.block = pkt.item as u32; client.block = pkt.item as u32;
let mut fc = character::FullCharacter::default(); let mut fc = character::FullCharacter::default();
fc.character = client.character.character; fc.character = client.character.character;
fc.key_team_config.key_config = settings.key_config; fc.key_team_config.key_config = client.settings.settings.key_config;
fc.key_team_config.joystick_config = settings.joystick_config; fc.key_team_config.joystick_config = client.settings.settings.joystick_config;
Ok(vec![ Ok(vec![
SendShipPacket::FullCharacter(FullCharacter { SendShipPacket::FullCharacter(FullCharacter {
@ -193,8 +191,6 @@ impl<EG: EntityGateway> ServerState for ShipServerState<EG> {
type PacketError = ShipError; type PacketError = ShipError;
fn on_connect(&mut self, id: ClientId) -> Vec<OnConnect<Self::SendPacket>> { fn on_connect(&mut self, id: ClientId) -> Vec<OnConnect<Self::SendPacket>> {
self.clients.insert(id, ClientState::new());
let mut rng = rand::thread_rng(); let mut rng = rand::thread_rng();
let mut server_key = [0u8; 48]; let mut server_key = [0u8; 48];