mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Get player count and calculate ping time
Former-commit-id: 99da086195e301f1e6cba3ebe7fa5b745b86502a
This commit is contained in:
parent
b5b61462ee
commit
3d21cd7402
@ -20,13 +20,20 @@ fn main() {
|
|||||||
|
|
||||||
client.register(comp::Player::new("test".to_string(), None));
|
client.register(comp::Player::new("test".to_string(), None));
|
||||||
|
|
||||||
|
println!("Players online: {:?}",
|
||||||
|
client.get_players()
|
||||||
|
.into_iter()
|
||||||
|
.map(|(e, p)| p)
|
||||||
|
.collect::<Vec<comp::Player>>()
|
||||||
|
);
|
||||||
|
|
||||||
client.send_chat("Hello!".to_string());
|
client.send_chat("Hello!".to_string());
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let events = match client.tick(comp::Control::default(), clock.get_last_delta()) {
|
let events = match client.tick(comp::Control::default(), clock.get_last_delta()) {
|
||||||
Ok(events) => events,
|
Ok(events) => events,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
println!("Error: {:?}", err);
|
error!("Error: {:?}", err);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -22,7 +22,7 @@ use std::{
|
|||||||
use threadpool::ThreadPool;
|
use threadpool::ThreadPool;
|
||||||
use vek::*;
|
use vek::*;
|
||||||
|
|
||||||
const SERVER_TIMEOUT: f64 = 20.0; // Seconds
|
const SERVER_TIMEOUT: Duration = Duration::from_secs(20);
|
||||||
|
|
||||||
pub enum Event {
|
pub enum Event {
|
||||||
Chat(String),
|
Chat(String),
|
||||||
@ -33,7 +33,6 @@ pub struct Client {
|
|||||||
client_state: ClientState,
|
client_state: ClientState,
|
||||||
thread_pool: ThreadPool,
|
thread_pool: ThreadPool,
|
||||||
|
|
||||||
last_ping: f64,
|
|
||||||
postbox: PostBox<ClientMsg, ServerMsg>,
|
postbox: PostBox<ClientMsg, ServerMsg>,
|
||||||
|
|
||||||
last_server_ping: Instant,
|
last_server_ping: Instant,
|
||||||
@ -70,13 +69,14 @@ impl Client {
|
|||||||
_ => return Err(Error::ServerWentMad),
|
_ => return Err(Error::ServerWentMad),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
postbox.send_message(ClientMsg::Ping);
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
client_state,
|
client_state,
|
||||||
thread_pool: threadpool::Builder::new()
|
thread_pool: threadpool::Builder::new()
|
||||||
.thread_name("veloren-worker".into())
|
.thread_name("veloren-worker".into())
|
||||||
.build(),
|
.build(),
|
||||||
|
|
||||||
last_ping: state.get_time(),
|
|
||||||
postbox,
|
postbox,
|
||||||
|
|
||||||
last_server_ping: Instant::now(),
|
last_server_ping: Instant::now(),
|
||||||
@ -91,7 +91,7 @@ impl Client {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Request a state transition to `ClientState::Registered`.
|
/// Ask the server to transition the player into the `Registered` state
|
||||||
pub fn register(&mut self, player: comp::Player) {
|
pub fn register(&mut self, player: comp::Player) {
|
||||||
self.postbox.send_message(ClientMsg::Register { player });
|
self.postbox.send_message(ClientMsg::Register { player });
|
||||||
self.client_state = ClientState::Pending;
|
self.client_state = ClientState::Pending;
|
||||||
@ -310,12 +310,9 @@ impl Client {
|
|||||||
fn handle_new_messages(&mut self) -> Result<Vec<Event>, Error> {
|
fn handle_new_messages(&mut self) -> Result<Vec<Event>, Error> {
|
||||||
let mut frontend_events = Vec::new();
|
let mut frontend_events = Vec::new();
|
||||||
|
|
||||||
// Step 1
|
|
||||||
let new_msgs = self.postbox.new_messages();
|
let new_msgs = self.postbox.new_messages();
|
||||||
|
|
||||||
if new_msgs.len() > 0 {
|
if new_msgs.len() > 0 {
|
||||||
self.last_ping = self.state.get_time();
|
|
||||||
|
|
||||||
for msg in new_msgs {
|
for msg in new_msgs {
|
||||||
match msg {
|
match msg {
|
||||||
ServerMsg::InitialSync { .. } => return Err(Error::ServerWentMad),
|
ServerMsg::InitialSync { .. } => return Err(Error::ServerWentMad),
|
||||||
@ -375,14 +372,10 @@ impl Client {
|
|||||||
}
|
}
|
||||||
} else if let Some(err) = self.postbox.error() {
|
} else if let Some(err) = self.postbox.error() {
|
||||||
return Err(err.into());
|
return Err(err.into());
|
||||||
} else if self.state.get_time() - self.last_ping > SERVER_TIMEOUT {
|
// We regularily ping in the tick method
|
||||||
|
} else if Instant::now().duration_since(self.last_server_ping) > SERVER_TIMEOUT {
|
||||||
return Err(Error::ServerTimeout);
|
return Err(Error::ServerTimeout);
|
||||||
} else if self.state.get_time() - self.last_ping > SERVER_TIMEOUT * 0.5 {
|
|
||||||
// Try pinging the server if the timeout is nearing.
|
|
||||||
self.postbox.send_message(ClientMsg::Ping);
|
|
||||||
self.last_server_ping = Instant::now();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(frontend_events)
|
Ok(frontend_events)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -428,6 +421,18 @@ impl Client {
|
|||||||
pub fn state_mut(&mut self) -> &mut State {
|
pub fn state_mut(&mut self) -> &mut State {
|
||||||
&mut self.state
|
&mut self.state
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get a vector of all the players on the server
|
||||||
|
pub fn get_players(&mut self) -> Vec<(EcsEntity, comp::Player)> {
|
||||||
|
(
|
||||||
|
&self.state.ecs().entities(),
|
||||||
|
&self.state.ecs().read_storage::<comp::Player>(),
|
||||||
|
)
|
||||||
|
.join()
|
||||||
|
.map(|(e, p)| (e, p.clone()))
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for Client {
|
impl Drop for Client {
|
||||||
|
@ -67,9 +67,7 @@ impl SessionState {
|
|||||||
client::Event::Chat(msg) => {
|
client::Event::Chat(msg) => {
|
||||||
self.hud.new_message(msg);
|
self.hud.new_message(msg);
|
||||||
}
|
}
|
||||||
client::Event::Disconnect => {
|
client::Event::Disconnect => {} // TODO
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user