Allow account concurrency across client sources

This commit is contained in:
2026-06-10 15:27:17 -04:00
parent 98e338046c
commit 79fa456365
5 changed files with 104 additions and 6 deletions
+44
View File
@@ -1,4 +1,42 @@
#include "GameServer.hh"
#include <stdexcept>
static uint8_t account_client_source_for_version(Version v) {
switch (v) {
case Version::DC_NTE:
case Version::DC_11_2000:
case Version::DC_V1:
case Version::DC_V2:
return 1;
case Version::PC_PATCH:
case Version::PC_NTE:
case Version::PC_V2:
return 2;
case Version::GC_NTE:
case Version::GC_V3:
case Version::GC_EP3_NTE:
case Version::GC_EP3:
return 3;
case Version::XB_V3:
return 4;
case Version::BB_PATCH:
case Version::BB_V4:
return 5;
default:
throw std::logic_error("invalid game version for account client source");
}
}
static uint64_t account_client_source_key(uint32_t account_id, Version v) {
return (static_cast<uint64_t>(account_id) << 8) | account_client_source_for_version(v);
}
#include <ctype.h>
#include <errno.h>
@@ -201,5 +239,11 @@ asio::awaitable<void> GameServer::destroy_client(std::shared_ptr<Client> c) {
if ((it != this->state->client_for_account.end()) && (it->second == c)) {
this->state->client_for_account.erase(it);
}
uint64_t source_key = account_client_source_key(c->login->account->account_id, c->version());
auto source_it = this->state->client_for_account_source.find(source_key);
if ((source_it != this->state->client_for_account_source.end()) && (source_it->second == c)) {
this->state->client_for_account_source.erase(source_it);
}
}
}