Support being kicked from servers
This commit is contained in:
parent
51ec66ec5c
commit
d8b90b74bc
18
src/main.rs
18
src/main.rs
|
@ -100,12 +100,21 @@ impl Game {
|
||||||
|
|
||||||
pub fn tick(&mut self, delta: f64) {
|
pub fn tick(&mut self, delta: f64) {
|
||||||
if !self.server.is_connected() {
|
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;
|
self.renderer.camera.yaw += 0.005 * delta;
|
||||||
if self.renderer.camera.yaw > ::std::f64::consts::PI * 2.0 {
|
if self.renderer.camera.yaw > ::std::f64::consts::PI * 2.0 {
|
||||||
self.renderer.camera.yaw = 0.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;
|
let mut clear_reply = false;
|
||||||
if let Some(ref recv) = self.connect_reply {
|
if let Some(ref recv) = self.connect_reply {
|
||||||
if let Ok(server) = recv.try_recv() {
|
if let Ok(server) = recv.try_recv() {
|
||||||
|
@ -206,6 +215,7 @@ fn main() {
|
||||||
chunk_builder: chunk_builder::ChunkBuilder::new(resource_manager, textures),
|
chunk_builder: chunk_builder::ChunkBuilder::new(resource_manager, textures),
|
||||||
connect_reply: None,
|
connect_reply: None,
|
||||||
};
|
};
|
||||||
|
game.renderer.camera.pos = cgmath::Point3::new(0.5, 13.2, 0.5);
|
||||||
|
|
||||||
let mut events = sdl.event_pump().unwrap();
|
let mut events = sdl.event_pump().unwrap();
|
||||||
while !game.should_close {
|
while !game.should_close {
|
||||||
|
@ -278,6 +288,9 @@ fn handle_window_event(window: &sdl2::video::Window,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} 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);
|
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);
|
mouse.warp_mouse_in_window(&window, (width/2) as i32, (height/2) as i32);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if mouse.relative_mouse_mode() {
|
||||||
|
mouse.set_relative_mouse_mode(false);
|
||||||
|
}
|
||||||
if !game.focused {
|
if !game.focused {
|
||||||
ui_container.click_at(game, x as f64, y as f64, width as f64, height as f64);
|
ui_container.click_at(game, x as f64, y as f64, width as f64, height as f64);
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,7 @@ pub struct Server {
|
||||||
uuid: protocol::UUID,
|
uuid: protocol::UUID,
|
||||||
conn: Option<protocol::Conn>,
|
conn: Option<protocol::Conn>,
|
||||||
read_queue: Option<mpsc::Receiver<Result<packet::Packet, protocol::Error>>>,
|
read_queue: Option<mpsc::Receiver<Result<packet::Packet, protocol::Error>>>,
|
||||||
|
pub disconnect_reason: Option<format::Component>,
|
||||||
|
|
||||||
pub world: world::World,
|
pub world: world::World,
|
||||||
pub entities: ecs::Manager,
|
pub entities: ecs::Manager,
|
||||||
|
@ -270,6 +271,7 @@ impl Server {
|
||||||
uuid: uuid,
|
uuid: uuid,
|
||||||
conn: conn,
|
conn: conn,
|
||||||
read_queue: read_queue,
|
read_queue: read_queue,
|
||||||
|
disconnect_reason: None,
|
||||||
|
|
||||||
world: world::World::new(),
|
world: world::World::new(),
|
||||||
world_age: 0,
|
world_age: 0,
|
||||||
|
@ -370,6 +372,7 @@ impl Server {
|
||||||
ChangeGameState => on_game_state_change,
|
ChangeGameState => on_game_state_change,
|
||||||
UpdateSign => on_sign_update,
|
UpdateSign => on_sign_update,
|
||||||
PlayerInfo => on_player_info,
|
PlayerInfo => on_player_info,
|
||||||
|
Disconnect => on_disconnect,
|
||||||
// Entities
|
// Entities
|
||||||
EntityDestroy => on_entity_destroy,
|
EntityDestroy => on_entity_destroy,
|
||||||
SpawnPlayer => on_player_spawn,
|
SpawnPlayer => on_player_spawn,
|
||||||
|
@ -381,8 +384,15 @@ impl Server {
|
||||||
},
|
},
|
||||||
Err(err) => panic!("Err: {:?}", err),
|
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;
|
self.entity_tick_timer += delta;
|
||||||
|
@ -487,7 +497,7 @@ impl Server {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn write_packet<T: protocol::PacketType>(&mut self, p: T) {
|
pub fn write_packet<T: protocol::PacketType>(&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) {
|
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) {
|
fn on_time_update(&mut self, time_update: packet::play::clientbound::TimeUpdate) {
|
||||||
self.world_age = time_update.time_of_day;
|
self.world_age = time_update.time_of_day;
|
||||||
self.world_time_target = (time_update.time_of_day % 24000) as f64;
|
self.world_time_target = (time_update.time_of_day % 24000) as f64;
|
||||||
|
|
Loading…
Reference in New Issue