From 92ad4057e79acccf30e60ee3506e544aa0072b1c Mon Sep 17 00:00:00 2001 From: Collecting Date: Mon, 12 Jan 2026 08:04:44 +0000 Subject: [PATCH] fix(multiplayer): Overlay Cleanup Forgor to implement necessary components for proper cleanup after exiting game/fix multiple redundant calls to overlay/chatroom. Signed-off-by: Collecting --- src/citron/util/multiplayer_room_overlay.cpp | 33 +++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/citron/util/multiplayer_room_overlay.cpp b/src/citron/util/multiplayer_room_overlay.cpp index 8953f078d..58575c075 100644 --- a/src/citron/util/multiplayer_room_overlay.cpp +++ b/src/citron/util/multiplayer_room_overlay.cpp @@ -199,15 +199,26 @@ void MultiplayerRoomOverlay::ConnectToRoom() { if (!main_window) return; multiplayer_state = main_window->GetMultiplayerState(); if (!multiplayer_state) return; + if (multiplayer_state->IsClientRoomVisible()) { chat_room_widget->setEnabled(false); chat_room_widget->Clear(); chat_room_widget->AppendStatusMessage(tr("Please close the Multiplayer Room Window to use the Overlay.")); return; } + chat_room_widget->setEnabled(true); auto& room_network = multiplayer_state->GetRoomNetwork(); - room_member = room_network.GetRoomMember().lock(); + + auto current_member = room_network.GetRoomMember().lock(); + if (current_member != room_member) { + if (is_chat_initialized && chat_room_widget) { + chat_room_widget->Shutdown(); + } + is_chat_initialized = false; + room_member = current_member; + } + if (room_member) { if (!is_chat_initialized) { chat_room_widget->Initialize(&room_network); @@ -233,9 +244,17 @@ void MultiplayerRoomOverlay::ClearUI() { } void MultiplayerRoomOverlay::UpdateRoomData() { - if (!multiplayer_state) { ConnectToRoom(); return; } - if (multiplayer_state->IsClientRoomVisible()) { chat_room_widget->setEnabled(false); return; } - if (!chat_room_widget->isEnabled()) ConnectToRoom(); + if (!multiplayer_state) { + ConnectToRoom(); + return; + } + if (multiplayer_state->IsClientRoomVisible()) { + chat_room_widget->setEnabled(false); + return; + } + if (!chat_room_widget->isEnabled()) { + ConnectToRoom(); + } if (room_member && room_member->GetState() >= Network::RoomMember::State::Joined) { const auto& members = room_member->GetMemberInformation(); @@ -290,6 +309,12 @@ void MultiplayerRoomOverlay::UpdateRoomData() { } players_online_label->setText(label_text); if (chat_room_widget->isEnabled()) chat_room_widget->SetPlayerList(members); + } else { + ClearUI(); + + // Refresh the member pointer if we lost connection + auto& room_network = multiplayer_state->GetRoomNetwork(); + room_member = room_network.GetRoomMember().lock(); } }