diff --git a/server/src/client.rs b/server/src/client.rs index d4532d2966..61cdf9815a 100644 --- a/server/src/client.rs +++ b/server/src/client.rs @@ -47,6 +47,14 @@ impl Clients { self.clients.insert(entity, client); } + pub fn get<'a>(&'a self, entity: &EcsEntity) -> Option<&'a Client> { + self.clients.get(entity) + } + + pub fn get_mut<'a>(&'a mut self, entity: &EcsEntity) -> Option<&'a mut Client> { + self.clients.get_mut(entity) + } + pub fn remove_if bool>(&mut self, mut f: F) { self.clients.retain(|entity, client| !f(*entity, client)); } diff --git a/server/src/lib.rs b/server/src/lib.rs index 885637113d..b498c4e78a 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -162,8 +162,7 @@ impl Server { state.write_component(entity, comp::Actions::new()); // Tell the client its request was successful. - client.notify(ServerMsg::StateAnswer(Ok(ClientState::Character))); - client.client_state = ClientState::Character; + client.allow_state(ClientState::Character); } /// Execute a single server tick, handle input and update the game state by the given duration. @@ -584,16 +583,41 @@ impl Server { .collect::>(); for entity in todo_kill { - self.state.ecs_mut().write_storage::().remove(entity); - self.state.ecs_mut().write_storage::().remove(entity); - self.state.ecs_mut().write_storage::().remove(entity); - self.state.ecs_mut().write_storage::().remove(entity); - self.state.ecs_mut().write_storage::().remove(entity); - self.state.ecs_mut().write_storage::().remove(entity); - self.state.ecs_mut().write_storage::().remove(entity); - self.state.ecs_mut().write_storage::().remove(entity); - self.clients - .notify(entity, ServerMsg::ForceState(ClientState::Registered)); + self.state + .ecs_mut() + .write_storage::() + .remove(entity); + self.state + .ecs_mut() + .write_storage::() + .remove(entity); + self.state + .ecs_mut() + .write_storage::() + .remove(entity); + self.state + .ecs_mut() + .write_storage::() + .remove(entity); + self.state + .ecs_mut() + .write_storage::() + .remove(entity); + self.state + .ecs_mut() + .write_storage::() + .remove(entity); + self.state + .ecs_mut() + .write_storage::() + .remove(entity); + self.state + .ecs_mut() + .write_storage::() + .remove(entity); + if let Some(client) = self.clients.get_mut(&entity) { + client.force_state(ClientState::Registered); + } } // Remove all force flags.