From 0cc6737453188e1baa069e7c6546b5e3fd7ccdd3 Mon Sep 17 00:00:00 2001 From: Jonni Liljamo Date: Thu, 9 Mar 2023 10:39:59 +0200 Subject: [PATCH] feat(client): graceful exit with disconnect --- client/src/main.rs | 24 +++++++++++++++++++++++- client/src/plugins/menu/ui/menu.rs | 8 ++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/client/src/main.rs b/client/src/main.rs index b085980..78482bc 100644 --- a/client/src/main.rs +++ b/client/src/main.rs @@ -7,13 +7,14 @@ */ use bevy::{ + app::AppExit, prelude::*, window::{CompositeAlphaMode, CursorGrabMode, PresentMode, WindowResizeConstraints}, }; use bevy_console::{ConsoleConfiguration, ConsolePlugin, ToggleConsoleKey}; use bevy_inspector_egui::quick::WorldInspectorPlugin; use iyes_loopless::prelude::*; -use naia_bevy_client::{ClientConfig as NaiaClientConfig, Plugin as NaiaClientPlugin}; +use naia_bevy_client::{Client, ClientConfig as NaiaClientConfig, Plugin as NaiaClientPlugin}; use laurelin_shared::server::protocol::protocol; @@ -107,6 +108,10 @@ fn main() { )) .add_plugin(plugins::networking::NetworkingPlugin); + // Graceful exit + app.add_event::() + .add_system(handle_graceful_exit); + app.run(); } @@ -121,3 +126,20 @@ pub fn despawn_screen(to_despawn: Query>, mut comm commands.entity(entity).despawn_recursive(); } } + +pub struct GracefulExit; + +/// Graceful exit, disconnects client cleanly before closing +pub fn handle_graceful_exit( + mut ev: EventReader, + mut app_exit_events: EventWriter, + mut client: Client, +) { + for _ in ev.iter() { + if client.is_connected() { + client.disconnect(); + } + + app_exit_events.send(AppExit); + } +} diff --git a/client/src/plugins/menu/ui/menu.rs b/client/src/plugins/menu/ui/menu.rs index 238e91e..61239a3 100644 --- a/client/src/plugins/menu/ui/menu.rs +++ b/client/src/plugins/menu/ui/menu.rs @@ -6,12 +6,12 @@ * See LICENSE for licensing information. */ -use bevy::ecs::system::ResMut; +use bevy::prelude::*; use bevy_inspector_egui::bevy_egui::{egui, EguiContext}; -use crate::util::egui::menuwindow; +use crate::{util::egui::menuwindow, GracefulExit}; -pub fn ui(mut egui_context: ResMut) { +pub fn ui(mut egui_context: ResMut, mut exit_events: EventWriter) { menuwindow( egui_context.ctx_mut(), "Laurelin", @@ -30,7 +30,7 @@ pub fn ui(mut egui_context: ResMut) { } if ui.button("Quit").clicked() { - // + exit_events.send(GracefulExit); } }, ); -- 2.44.1