From d8b90b74bc41eb6623efadbd5cc610fce72df4df Mon Sep 17 00:00:00 2001 From: Thinkofname Date: Fri, 8 Apr 2016 01:41:26 +0100 Subject: [PATCH] Support being kicked from servers --- src/main.rs | 18 +++++++++++++++++- src/server/mod.rs | 22 ++++++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index a87dd7e..ce70f0b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -100,12 +100,21 @@ impl Game { pub fn tick(&mut self, delta: f64) { if !self.server.is_connected() { - self.renderer.camera.pos = cgmath::Point3::new(0.5, 13.2, 0.5); self.renderer.camera.yaw += 0.005 * delta; if self.renderer.camera.yaw > ::std::f64::consts::PI * 2.0 { self.renderer.camera.yaw = 0.0; } } + + if let Some(disconnect_reason) = self.server.disconnect_reason.take() { + self.screen_sys.replace_screen(Box::new(screen::ServerList::new( + Some(disconnect_reason) + ))); + } + if !self.server.is_connected() { + self.focused = false; + } + let mut clear_reply = false; if let Some(ref recv) = self.connect_reply { if let Ok(server) = recv.try_recv() { @@ -206,6 +215,7 @@ fn main() { chunk_builder: chunk_builder::ChunkBuilder::new(resource_manager, textures), connect_reply: None, }; + game.renderer.camera.pos = cgmath::Point3::new(0.5, 13.2, 0.5); let mut events = sdl.event_pump().unwrap(); while !game.should_close { @@ -278,6 +288,9 @@ fn handle_window_event(window: &sdl2::video::Window, } } } else { + if mouse.relative_mouse_mode() { + mouse.set_relative_mouse_mode(false); + } ui_container.hover_at(game, x as f64, y as f64, width as f64, height as f64); } } @@ -290,6 +303,9 @@ fn handle_window_event(window: &sdl2::video::Window, mouse.warp_mouse_in_window(&window, (width/2) as i32, (height/2) as i32); return; } + if mouse.relative_mouse_mode() { + mouse.set_relative_mouse_mode(false); + } if !game.focused { ui_container.click_at(game, x as f64, y as f64, width as f64, height as f64); } diff --git a/src/server/mod.rs b/src/server/mod.rs index 73abc30..33b5dde 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -42,6 +42,7 @@ pub struct Server { uuid: protocol::UUID, conn: Option, read_queue: Option>>, + pub disconnect_reason: Option, pub world: world::World, pub entities: ecs::Manager, @@ -270,6 +271,7 @@ impl Server { uuid: uuid, conn: conn, read_queue: read_queue, + disconnect_reason: None, world: world::World::new(), world_age: 0, @@ -370,6 +372,7 @@ impl Server { ChangeGameState => on_game_state_change, UpdateSign => on_sign_update, PlayerInfo => on_player_info, + Disconnect => on_disconnect, // Entities EntityDestroy => on_entity_destroy, SpawnPlayer => on_player_spawn, @@ -381,8 +384,15 @@ impl Server { }, Err(err) => panic!("Err: {:?}", err), } + // Disconnected + if self.conn.is_none() { + break; + } + } + + if self.conn.is_some() { + self.read_queue = Some(rx); } - self.read_queue = Some(rx); } self.entity_tick_timer += delta; @@ -487,7 +497,7 @@ impl Server { } pub fn write_packet(&mut self, p: T) { - self.conn.as_mut().unwrap().write_packet(p).unwrap(); // TODO handle errors + let _ = self.conn.as_mut().unwrap().write_packet(p); // TODO handle errors } fn on_keep_alive(&mut self, keep_alive: packet::play::clientbound::KeepAliveClientbound) { @@ -522,6 +532,14 @@ impl Server { } } + fn on_disconnect(&mut self, disconnect: packet::play::clientbound::Disconnect) { + self.conn = None; + self.disconnect_reason = Some(disconnect.reason); + if let Some(player) = self.player.take() { + self.entities.remove_entity(player); + } + } + fn on_time_update(&mut self, time_update: packet::play::clientbound::TimeUpdate) { self.world_age = time_update.time_of_day; self.world_time_target = (time_update.time_of_day % 24000) as f64;