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.
This commit is contained in:
Kelsi 2026-02-14 19:24:31 -08:00
parent 388db59463
commit 7f9439d774
4 changed files with 44 additions and 0 deletions

View file

@ -48,6 +48,25 @@ public:
void setOnBack(std::function<void()> cb) { onBack = std::move(cb); }
void setOnDeleteCharacter(std::function<void(uint64_t)> 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
*/

View file

@ -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
*/

View file

@ -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<network::TCPSocket>();
// Set up packet callback

View file

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