From 7f9439d774fdbb8ae795e59f43171459c6df51e8 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Sat, 14 Feb 2026 19:24:31 -0800 Subject: [PATCH] Reset realm and character lists when switching servers Add reset() to RealmScreen and CharacterScreen to clear stale selection state. Clear auth handler realm list on reconnect. Reset both screens when going back to login or back to realm selection, so switching servers shows fresh data instead of stale lists from the previous connection. --- include/ui/character_screen.hpp | 19 +++++++++++++++++++ include/ui/realm_screen.hpp | 11 +++++++++++ src/auth/auth_handler.cpp | 3 +++ src/core/application.cpp | 11 +++++++++++ 4 files changed, 44 insertions(+) diff --git a/include/ui/character_screen.hpp b/include/ui/character_screen.hpp index 3899b16a..384464e0 100644 --- a/include/ui/character_screen.hpp +++ b/include/ui/character_screen.hpp @@ -48,6 +48,25 @@ public: void setOnBack(std::function cb) { onBack = std::move(cb); } void setOnDeleteCharacter(std::function cb) { onDeleteCharacter = std::move(cb); } + /** + * Reset selection state (e.g., when switching servers) + */ + void reset() { + selectedCharacterIndex = -1; + characterSelected = false; + selectedCharacterGuid = 0; + restoredLastCharacter = false; + newlyCreatedCharacterName.clear(); + statusMessage.clear(); + deleteConfirmStage = 0; + previewInitialized_ = false; + previewGuid_ = 0; + previewAppearanceBytes_ = 0; + previewFacialFeatures_ = 0; + previewUseFemaleModel_ = false; + previewEquipHash_ = 0; + } + /** * Check if a character has been selected */ diff --git a/include/ui/realm_screen.hpp b/include/ui/realm_screen.hpp index 2899408f..8f9a9148 100644 --- a/include/ui/realm_screen.hpp +++ b/include/ui/realm_screen.hpp @@ -30,6 +30,17 @@ public: onRealmSelected = callback; } + /** + * Reset selection state (e.g., when switching servers) + */ + void reset() { + selectedRealmIndex = -1; + realmSelected = false; + selectedRealmName.clear(); + selectedRealmAddress.clear(); + statusMessage.clear(); + } + /** * Check if a realm has been selected */ diff --git a/src/auth/auth_handler.cpp b/src/auth/auth_handler.cpp index efd939be..2e6d89b1 100644 --- a/src/auth/auth_handler.cpp +++ b/src/auth/auth_handler.cpp @@ -34,6 +34,9 @@ bool AuthHandler::connect(const std::string& host, uint16_t port) { const std::string hostTrimmed = trimHost(host); LOG_INFO("Connecting to auth server: ", hostTrimmed, ":", port); + // Clear stale realm list from previous connection + realms.clear(); + socket = std::make_unique(); // Set up packet callback diff --git a/src/core/application.cpp b/src/core/application.cpp index 9fea8d99..fb823150 100644 --- a/src/core/application.cpp +++ b/src/core/application.cpp @@ -537,6 +537,11 @@ void Application::logoutToLogin() { music->stopMusic(0.0f); } } + // Clear stale realm/character selection so switching servers starts fresh + if (uiManager) { + uiManager->getRealmScreen().reset(); + uiManager->getCharacterScreen().reset(); + } setState(AppState::AUTHENTICATION); } @@ -1733,6 +1738,12 @@ void Application::setupUICallbacks() { // "Back" button on character screen uiManager->getCharacterScreen().setOnBack([this]() { + // Disconnect from world server and reset UI state for fresh realm selection + if (gameHandler) { + gameHandler->disconnect(); + } + uiManager->getRealmScreen().reset(); + uiManager->getCharacterScreen().reset(); setState(AppState::REALM_SELECTION); });