Fixed the bugs in the settings tab and the character button in the escape menu and unpause when there is more than 1 player

This commit is contained in:
Capucho 2020-03-04 20:42:22 +00:00
parent 6f6b8986b6
commit a3479f6a49
3 changed files with 33 additions and 15 deletions

View File

@ -578,6 +578,8 @@ impl Server {
.get(entity) .get(entity)
.is_some() .is_some()
} }
pub fn number_of_players(&self) -> i64 { self.metrics.player_online.get() }
} }
impl Drop for Server { impl Drop for Server {

View File

@ -1735,7 +1735,14 @@ impl Hud {
settings_window::Event::ToggleHelp => self.show.help = !self.show.help, settings_window::Event::ToggleHelp => self.show.help = !self.show.help,
settings_window::Event::ToggleDebug => self.show.debug = !self.show.debug, settings_window::Event::ToggleDebug => self.show.debug = !self.show.debug,
settings_window::Event::ChangeTab(tab) => self.show.open_setting_tab(tab), settings_window::Event::ChangeTab(tab) => self.show.open_setting_tab(tab),
settings_window::Event::Close => self.show.settings(false), settings_window::Event::Close => {
// Unpause the game if we are on singleplayer so that we can logout
if let Some(singleplayer) = global_state.singleplayer.as_ref() {
singleplayer.pause(false);
};
self.show.settings(false)
},
settings_window::Event::AdjustMousePan(sensitivity) => { settings_window::Event::AdjustMousePan(sensitivity) => {
events.push(Event::AdjustMousePan(sensitivity)); events.push(Event::AdjustMousePan(sensitivity));
}, },
@ -1942,7 +1949,14 @@ impl Hud {
events.push(Event::Logout); events.push(Event::Logout);
}, },
Some(esc_menu::Event::Quit) => events.push(Event::Quit), Some(esc_menu::Event::Quit) => events.push(Event::Quit),
Some(esc_menu::Event::CharacterSelection) => events.push(Event::CharacterSelection), Some(esc_menu::Event::CharacterSelection) => {
// Unpause the game if we are on singleplayer so that we can logout
if let Some(singleplayer) = global_state.singleplayer.as_ref() {
singleplayer.pause(false);
};
events.push(Event::CharacterSelection)
},
None => {}, None => {},
} }
} }

View File

@ -4,7 +4,10 @@ use crossbeam::channel::{unbounded, Receiver, Sender, TryRecvError};
use log::info; use log::info;
use server::{Event, Input, Server, ServerSettings}; use server::{Event, Input, Server, ServerSettings};
use std::{ use std::{
sync::atomic::{AtomicBool, Ordering}, sync::{
atomic::{AtomicBool, Ordering},
Arc,
},
thread::{self, JoinHandle}, thread::{self, JoinHandle},
time::Duration, time::Duration,
}; };
@ -13,7 +16,6 @@ const TPS: u64 = 30;
enum Msg { enum Msg {
Stop, Stop,
Pause(bool),
} }
/// Used to start and stop the background thread running the server /// Used to start and stop the background thread running the server
@ -22,7 +24,7 @@ pub struct Singleplayer {
_server_thread: JoinHandle<()>, _server_thread: JoinHandle<()>,
sender: Sender<Msg>, sender: Sender<Msg>,
// Wether the server is stopped or not // Wether the server is stopped or not
paused: AtomicBool, paused: Arc<AtomicBool>,
} }
impl Singleplayer { impl Singleplayer {
@ -35,6 +37,9 @@ impl Singleplayer {
let thread_pool = client.map(|c| c.thread_pool().clone()); let thread_pool = client.map(|c| c.thread_pool().clone());
let settings2 = settings.clone(); let settings2 = settings.clone();
let paused = Arc::new(AtomicBool::new(false));
let paused1 = paused.clone();
let thread = thread::spawn(move || { let thread = thread::spawn(move || {
let server = Server::new(settings2).expect("Failed to create server instance!"); let server = Server::new(settings2).expect("Failed to create server instance!");
@ -43,14 +48,14 @@ impl Singleplayer {
None => server, None => server,
}; };
run_server(server, receiver); run_server(server, receiver, paused1);
}); });
( (
Singleplayer { Singleplayer {
_server_thread: thread, _server_thread: thread,
sender, sender,
paused: AtomicBool::new(false), paused,
}, },
settings, settings,
) )
@ -61,10 +66,7 @@ impl Singleplayer {
/// Pauses if true is passed and unpauses if false (Does nothing if in that /// Pauses if true is passed and unpauses if false (Does nothing if in that
/// state already) /// state already)
pub fn pause(&self, state: bool) { pub fn pause(&self, state: bool) { self.paused.store(state, Ordering::SeqCst); }
self.paused.store(state, Ordering::SeqCst);
let _ = self.sender.send(Msg::Pause(state));
}
} }
impl Drop for Singleplayer { impl Drop for Singleplayer {
@ -74,19 +76,17 @@ impl Drop for Singleplayer {
} }
} }
fn run_server(mut server: Server, rec: Receiver<Msg>) { fn run_server(mut server: Server, rec: Receiver<Msg>, paused: Arc<AtomicBool>) {
info!("Starting server-cli..."); info!("Starting server-cli...");
// Set up an fps clock // Set up an fps clock
let mut clock = Clock::start(); let mut clock = Clock::start();
let mut paused = false;
loop { loop {
// Check any event such as stopping and pausing // Check any event such as stopping and pausing
match rec.try_recv() { match rec.try_recv() {
Ok(msg) => match msg { Ok(msg) => match msg {
Msg::Stop => break, Msg::Stop => break,
Msg::Pause(val) => paused = val,
}, },
Err(err) => match err { Err(err) => match err {
TryRecvError::Empty => (), TryRecvError::Empty => (),
@ -98,8 +98,10 @@ fn run_server(mut server: Server, rec: Receiver<Msg>) {
clock.tick(Duration::from_millis(1000 / TPS)); clock.tick(Duration::from_millis(1000 / TPS));
// Skip updating the server if it's paused // Skip updating the server if it's paused
if paused { if paused.load(Ordering::SeqCst) && server.number_of_players() < 2 {
continue; continue;
} else if server.number_of_players() > 1 {
paused.store(false, Ordering::SeqCst);
} }
let events = server let events = server