diff --git a/dGame/UserManager.cpp b/dGame/UserManager.cpp index 7b54407b5..8f10d4219 100644 --- a/dGame/UserManager.cpp +++ b/dGame/UserManager.cpp @@ -248,8 +248,16 @@ void UserManager::RequestCharacterList(const SystemAddress& sysAddr) { chars.push_back(character); } + // Live kept the characters in the order they were made and selected the one with the latest last login (a new + // character counts as logged in when it is made), as 2014 captures of the character list show. Character IDs + // only grow, so sorting by ID gives the order they were made in. + std::ranges::sort(chars, {}, &Character::GetID); + ClientPackets::CharacterListResponse response; - response.selectedCharacterIndex = 0; //TODO: Pick the most recent played index. character index in front, just picking 0 + response.selectedCharacterIndex = 0; + for (size_t i = 1; i < chars.size(); i++) { + if (chars[i]->GetLastLogin() > chars[response.selectedCharacterIndex]->GetLastLogin()) response.selectedCharacterIndex = static_cast(i); + } for (const auto* const character : u->GetCharacters()) { auto& entry = response.characters.emplace_back(); diff --git a/dNet/ClientPackets.h b/dNet/ClientPackets.h index c85c83ebb..19eb5ffa8 100644 --- a/dNet/ClientPackets.h +++ b/dNet/ClientPackets.h @@ -113,7 +113,7 @@ namespace ClientPackets { }; // Written as a u8 count first - uint8_t selectedCharacterIndex{}; // TODO: Pick the most recent played index. DLU always sends 0 + uint8_t selectedCharacterIndex{}; // The character with the latest last login std::vector characters{}; CharacterListResponse() : LUBitStream(ServiceType::CLIENT, MessageType::Client::CHARACTER_LIST_RESPONSE) {}