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); });