mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
fix voxygen state system. before we had a timing error that we did the next voxygen step before client set in_game which lead us to a disconnect.
now assume in_game is correct in client unless told by server in its answer
This commit is contained in:
parent
b1db5ef488
commit
d7a74c0cf1
@ -116,8 +116,8 @@ pub struct Client {
|
|||||||
singleton_stream: Stream,
|
singleton_stream: Stream,
|
||||||
ping_stream: Stream,
|
ping_stream: Stream,
|
||||||
register_stream: Stream,
|
register_stream: Stream,
|
||||||
not_in_game_stream: Stream,
|
|
||||||
in_game_stream: Stream,
|
in_game_stream: Stream,
|
||||||
|
not_in_game_stream: Stream,
|
||||||
|
|
||||||
client_timeout: Duration,
|
client_timeout: Duration,
|
||||||
last_server_ping: f64,
|
last_server_ping: f64,
|
||||||
@ -161,8 +161,8 @@ impl Client {
|
|||||||
let stream = block_on(participant.opened())?;
|
let stream = block_on(participant.opened())?;
|
||||||
let mut ping_stream = block_on(participant.opened())?;
|
let mut ping_stream = block_on(participant.opened())?;
|
||||||
let mut register_stream = block_on(participant.opened())?;
|
let mut register_stream = block_on(participant.opened())?;
|
||||||
let not_in_game_stream = block_on(participant.opened())?;
|
|
||||||
let in_game_stream = block_on(participant.opened())?;
|
let in_game_stream = block_on(participant.opened())?;
|
||||||
|
let not_in_game_stream = block_on(participant.opened())?;
|
||||||
|
|
||||||
register_stream.send(ClientType::Game)?;
|
register_stream.send(ClientType::Game)?;
|
||||||
let server_info: ServerInfo = block_on(register_stream.recv())?;
|
let server_info: ServerInfo = block_on(register_stream.recv())?;
|
||||||
@ -456,7 +456,10 @@ impl Client {
|
|||||||
Err(RegisterError::InvalidCharacter) => Err(Error::InvalidCharacter),
|
Err(RegisterError::InvalidCharacter) => Err(Error::InvalidCharacter),
|
||||||
Err(RegisterError::NotOnWhitelist) => Err(Error::NotOnWhitelist),
|
Err(RegisterError::NotOnWhitelist) => Err(Error::NotOnWhitelist),
|
||||||
Err(RegisterError::Banned(reason)) => Err(Error::Banned(reason)),
|
Err(RegisterError::Banned(reason)) => Err(Error::Banned(reason)),
|
||||||
Ok(()) => Ok(()),
|
Ok(()) => {
|
||||||
|
self.registered = true;
|
||||||
|
Ok(())
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -466,6 +469,9 @@ impl Client {
|
|||||||
.send(ClientNotInGameMsg::Character(character_id))
|
.send(ClientNotInGameMsg::Character(character_id))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
//Assume we are in_game unless server tells us otherwise
|
||||||
|
self.client_ingame = Some(ClientIngame::Character);
|
||||||
|
|
||||||
self.active_character_id = Some(character_id);
|
self.active_character_id = Some(character_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1351,6 +1357,7 @@ impl Client {
|
|||||||
},
|
},
|
||||||
// Cleanup for when the client goes back to the `in_game = None`
|
// Cleanup for when the client goes back to the `in_game = None`
|
||||||
ServerInGameMsg::ExitInGameSuccess => {
|
ServerInGameMsg::ExitInGameSuccess => {
|
||||||
|
self.client_ingame = None;
|
||||||
self.clean_state();
|
self.clean_state();
|
||||||
},
|
},
|
||||||
ServerInGameMsg::InventoryUpdate(mut inventory, event) => {
|
ServerInGameMsg::InventoryUpdate(mut inventory, event) => {
|
||||||
@ -1409,11 +1416,13 @@ impl Client {
|
|||||||
self.character_list.error = Some(error);
|
self.character_list.error = Some(error);
|
||||||
},
|
},
|
||||||
ServerNotInGameMsg::CharacterDataLoadError(error) => {
|
ServerNotInGameMsg::CharacterDataLoadError(error) => {
|
||||||
|
trace!("Handling join error by server");
|
||||||
|
self.client_ingame = None;
|
||||||
self.clean_state();
|
self.clean_state();
|
||||||
self.character_list.error = Some(error);
|
self.character_list.error = Some(error);
|
||||||
},
|
},
|
||||||
ServerNotInGameMsg::CharacterSuccess => {
|
ServerNotInGameMsg::CharacterSuccess => {
|
||||||
warn!("WOOP88u8yeah");
|
debug!("client is now in ingame state on server");
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -1447,23 +1456,23 @@ impl Client {
|
|||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
loop {
|
loop {
|
||||||
let (m1, m2, m3, m4) = select!(
|
let (m1, m2, m3, m4) = select!(
|
||||||
msg = self.singleton_stream.recv().fuse() => (Some(msg?), None, None, None),
|
msg = self.singleton_stream.recv().fuse() => (Some(msg), None, None, None),
|
||||||
msg = self.ping_stream.recv().fuse() => (None, Some(msg?), None, None),
|
msg = self.ping_stream.recv().fuse() => (None, Some(msg), None, None),
|
||||||
msg = self.not_in_game_stream.recv().fuse() => (None, None, Some(msg?), None),
|
msg = self.not_in_game_stream.recv().fuse() => (None, None, Some(msg), None),
|
||||||
msg = self.in_game_stream.recv().fuse() => (None, None, None, Some(msg?)),
|
msg = self.in_game_stream.recv().fuse() => (None, None, None, Some(msg)),
|
||||||
);
|
);
|
||||||
*cnt += 1;
|
*cnt += 1;
|
||||||
if let Some(msg) = m1 {
|
if let Some(msg) = m1 {
|
||||||
self.handle_server_msg(frontend_events, msg)?;
|
self.handle_server_msg(frontend_events, msg?)?;
|
||||||
}
|
}
|
||||||
if let Some(msg) = m2 {
|
if let Some(msg) = m2 {
|
||||||
self.handle_ping_msg(msg)?;
|
self.handle_ping_msg(msg?)?;
|
||||||
}
|
}
|
||||||
if let Some(msg) = m3 {
|
if let Some(msg) = m3 {
|
||||||
self.handle_server_not_in_game_msg(msg)?;
|
self.handle_server_not_in_game_msg(msg?)?;
|
||||||
}
|
}
|
||||||
if let Some(msg) = m4 {
|
if let Some(msg) = m4 {
|
||||||
self.handle_server_in_game_msg(frontend_events, msg)?;
|
self.handle_server_in_game_msg(frontend_events, msg?)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,8 +61,11 @@ impl PlayState for CharSelectionState {
|
|||||||
|
|
||||||
fn tick(&mut self, global_state: &mut GlobalState, events: Vec<WinEvent>) -> PlayStateResult {
|
fn tick(&mut self, global_state: &mut GlobalState, events: Vec<WinEvent>) -> PlayStateResult {
|
||||||
span!(_guard, "tick", "<CharSelectionState as PlayState>::tick");
|
span!(_guard, "tick", "<CharSelectionState as PlayState>::tick");
|
||||||
let client_in_game = self.client.borrow().get_in_game();
|
let (client_in_game, client_registered) = {
|
||||||
if client_in_game.is_none() {
|
let client = self.client.borrow();
|
||||||
|
(client.get_in_game(), client.get_registered())
|
||||||
|
};
|
||||||
|
if client_in_game.is_none() && client_registered {
|
||||||
// Handle window events
|
// Handle window events
|
||||||
for event in events {
|
for event in events {
|
||||||
if self.char_selection_ui.handle_event(event.clone()) {
|
if self.char_selection_ui.handle_event(event.clone()) {
|
||||||
|
@ -211,12 +211,11 @@ impl PlayState for SessionState {
|
|||||||
));
|
));
|
||||||
|
|
||||||
// TODO: can this be a method on the session or are there borrowcheck issues?
|
// TODO: can this be a method on the session or are there borrowcheck issues?
|
||||||
|
|
||||||
let (client_in_game, client_registered) = {
|
let (client_in_game, client_registered) = {
|
||||||
let client = self.client.borrow();
|
let client = self.client.borrow();
|
||||||
(client.get_in_game(), client.get_registered())
|
(client.get_in_game(), client.get_registered())
|
||||||
};
|
};
|
||||||
if client_in_game.is_none() {
|
if client_in_game.is_some() {
|
||||||
// Update MyEntity
|
// Update MyEntity
|
||||||
// Note: Alternatively, the client could emit an event when the entity changes
|
// Note: Alternatively, the client could emit an event when the entity changes
|
||||||
// which may or may not be more elegant
|
// which may or may not be more elegant
|
||||||
|
Loading…
Reference in New Issue
Block a user