diff --git a/world/clientlist.cpp b/world/clientlist.cpp index 1264957a7..2c3a958d2 100644 --- a/world/clientlist.cpp +++ b/world/clientlist.cpp @@ -1277,7 +1277,19 @@ void ClientList::UpdateClientGuild(uint32 char_id, uint32 guild_id) { } } +void ClientList::RemoveCLEByLSID(uint32 iLSID) +{ + LinkedListIterator iterator(clientlist); + iterator.Reset(); + while (iterator.MoreElements()) { + if (iterator.GetData()->LSAccountID() == iLSID) { + iterator.RemoveCurrent(); + } + else + iterator.Advance(); + } +} int ClientList::GetClientCount() { return(numplayers); diff --git a/world/clientlist.h b/world/clientlist.h index 5b3bad297..19b8adc05 100644 --- a/world/clientlist.h +++ b/world/clientlist.h @@ -66,6 +66,7 @@ public: void CLEKeepAlive(uint32 numupdates, uint32* wid); void CLEAdd(uint32 iLSID, const char* iLoginName, const char* iLoginKey, int16 iWorldAdmin = 0, uint32 ip = 0, uint8 local=0); void UpdateClientGuild(uint32 char_id, uint32 guild_id); + void RemoveCLEByLSID(uint32 iLSID); int GetClientCount(); void GetClients(const char *zone_name, std::vector &into); diff --git a/world/login_server.cpp b/world/login_server.cpp index 61cc53bc2..73cb8a3eb 100644 --- a/world/login_server.cpp +++ b/world/login_server.cpp @@ -109,11 +109,15 @@ void LoginServer::ProcessUsertoWorldReq(uint16_t opcode, EQ::Net::Packet &p) { auto cle = client_list.FindCLEByLSID(utwr->lsaccountid); if (cle != nullptr) { auto status = cle->GetOnline(); - if (CLE_Status_Never != status && CLE_Status_Offline != status) { + if (CLE_Status_Zoning == status || CLE_Status_InZone == status) { utwrs->response = UserToWorldStatusAlreadyOnline; SendPacket(&outpack); return; } + else { + //our existing cle is in a state we can login to, mark the old as stale and remove it. + client_list.RemoveCLEByLSID(utwr->lsaccountid); + } } }