Go back to char selection on death

Former-commit-id: a8b5ee42f432ff2da8385225b17be654420f17d1
This commit is contained in:
timokoesters 2019-05-19 19:22:35 +02:00
parent b26f00ddfb
commit 449b717777
4 changed files with 26 additions and 4 deletions

View File

@ -35,6 +35,7 @@ pub enum Event {
pub struct Client { pub struct Client {
client_state: Option<ClientState>, client_state: Option<ClientState>,
pending_state_request: bool,
thread_pool: ThreadPool, thread_pool: ThreadPool,
last_ping: f64, last_ping: f64,
@ -79,6 +80,7 @@ impl Client {
Ok(Self { Ok(Self {
client_state, client_state,
pending_state_request: false,
thread_pool: threadpool::Builder::new() thread_pool: threadpool::Builder::new()
.thread_name("veloren-worker".into()) .thread_name("veloren-worker".into())
.build(), .build(),
@ -105,6 +107,7 @@ impl Client {
pub fn request_character(&mut self, name: String, body: comp::Body) { pub fn request_character(&mut self, name: String, body: comp::Body) {
self.postbox self.postbox
.send_message(ClientMsg::Character { name, body }); .send_message(ClientMsg::Character { name, body });
self.pending_state_request = true;
} }
pub fn set_view_distance(&mut self, view_distance: u32) { pub fn set_view_distance(&mut self, view_distance: u32) {
@ -139,6 +142,17 @@ impl Client {
self.entity self.entity
} }
/// Get the client state
#[allow(dead_code)]
pub fn get_client_state(&self) -> Option<ClientState> {
self.client_state
}
/// Get the pending state request bool
pub fn is_request_pending(&self) -> bool {
self.pending_state_request
}
/// Get the current tick number. /// Get the current tick number.
#[allow(dead_code)] #[allow(dead_code)]
pub fn get_tick(&self) -> u64 { pub fn get_tick(&self) -> u64 {
@ -372,12 +386,14 @@ impl Client {
} }
ServerMsg::StateAnswer(Ok(state)) => { ServerMsg::StateAnswer(Ok(state)) => {
self.client_state = Some(state); self.client_state = Some(state);
self.pending_state_request = false;
} }
ServerMsg::StateAnswer(Err((error, state))) => { ServerMsg::StateAnswer(Err((error, state))) => {
self.client_state = Some(state); self.client_state = Some(state);
self.pending_state_request = false;
} }
ServerMsg::ForceState(state) => { ServerMsg::ForceState(state) => {
self.client_state = Some(state); self.client_state = Some(dbg!(state));
} }
ServerMsg::Disconnect => { ServerMsg::Disconnect => {
self.client_state = None; self.client_state = None;

View File

@ -586,6 +586,8 @@ impl Server {
for entity in todo_remove { for entity in todo_remove {
self.state.ecs_mut().delete_entity_synced(entity); self.state.ecs_mut().delete_entity_synced(entity);
self.clients
.notify(entity, ServerMsg::ForceState(ClientState::Registered));
} }
// Remove all force flags. // Remove all force flags.

View File

@ -78,7 +78,7 @@ impl PlayState for CharSelectionState {
self.char_selection_ui.character_name.clone(), self.char_selection_ui.character_name.clone(),
comp::Body::Humanoid(self.char_selection_ui.character_body), comp::Body::Humanoid(self.char_selection_ui.character_body),
); );
return PlayStateResult::Switch(Box::new(SessionState::new( return PlayStateResult::Push(Box::new(SessionState::new(
&mut global_state.window, &mut global_state.window,
self.client.clone(), self.client.clone(),
global_state.settings.clone(), global_state.settings.clone(),

View File

@ -8,7 +8,7 @@ use crate::{
Direction, Error, GlobalState, PlayState, PlayStateResult, Direction, Error, GlobalState, PlayState, PlayStateResult,
}; };
use client::{self, Client, Input, InputEvent}; use client::{self, Client, Input, InputEvent};
use common::clock::Clock; use common::{clock::Clock, msg::ClientState};
use glutin::MouseButton; use glutin::MouseButton;
use std::{cell::RefCell, mem, rc::Rc, time::Duration}; use std::{cell::RefCell, mem, rc::Rc, time::Duration};
use vek::*; use vek::*;
@ -128,7 +128,9 @@ impl PlayState for SessionState {
*/ */
// Game loop // Game loop
loop { while self.client.borrow().is_request_pending()
|| self.client.borrow().get_client_state() == Some(ClientState::Character)
{
// Handle window events. // Handle window events.
for event in global_state.window.fetch_events() { for event in global_state.window.fetch_events() {
// Pass all events to the ui first. // Pass all events to the ui first.
@ -237,6 +239,8 @@ impl PlayState for SessionState {
// Clean things up after the tick. // Clean things up after the tick.
self.cleanup(); self.cleanup();
} }
PlayStateResult::Pop
} }
fn name(&self) -> &'static str { fn name(&self) -> &'static str {