From 8576a5b673d49cc7db5213293414b0c7eea7fb99 Mon Sep 17 00:00:00 2001 From: Sofia Date: Thu, 23 Jul 2026 23:58:28 +0300 Subject: [PATCH] Properly handle disconnect during game --- rust/src/game_manager.rs | 5 +++++ rust/src/ui/player_listings.rs | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/rust/src/game_manager.rs b/rust/src/game_manager.rs index 8acee52..71d4732 100644 --- a/rust/src/game_manager.rs +++ b/rust/src/game_manager.rs @@ -536,6 +536,11 @@ impl Game { } pub fn remove_player(&mut self, id: u16) { + if let Some(player) = self.find_player_mut(id) + && let Some(mut character) = player.character.take() + { + character.queue_free(); + } self.players.retain(|p| p.id() != id); self.run_deferred(move |s| s.signals().on_player_disconnected().emit(id)); } diff --git a/rust/src/ui/player_listings.rs b/rust/src/ui/player_listings.rs index dd0c846..6b3e301 100644 --- a/rust/src/ui/player_listings.rs +++ b/rust/src/ui/player_listings.rs @@ -11,6 +11,8 @@ use crate::{game_manager::Game, ui::player_listing::PlayerListing}; pub struct PlayerListings { #[export] player_listing_scene: Option>, + #[export] + update_on_disconnect: bool, base: Base, } @@ -18,6 +20,14 @@ pub struct PlayerListings { #[godot_api] impl IHBoxContainer for PlayerListings { fn ready(&mut self) { + if let Some(game) = Game::singleton() + && self.update_on_disconnect + { + game.signals() + .on_player_disconnected() + .connect_other(self, |s, _| s.update_player_listings()); + } + self.run_deferred(|s| s.update_player_listings()); } }