Index: binaries/data/mods/public/gui/common/network.js =================================================================== --- binaries/data/mods/public/gui/common/network.js +++ binaries/data/mods/public/gui/common/network.js @@ -73,7 +73,6 @@ case 6: return translate("You have been banned"); case 7: return translate("Playername in use. If you were disconnected, retry in few seconds"); case 8: return translate("Server full"); - case 9: return translate("Player identifier in use. If you were disconnected, retry in few seconds"); default: warn("Unknown disconnect-reason ID received: " + id); return sprintf(translate("\\[Invalid value %(id)s]"), { "id": id }); Index: source/network/NetClient.cpp =================================================================== --- source/network/NetClient.cpp +++ source/network/NetClient.cpp @@ -31,7 +31,6 @@ #include "ps/Compress.h" #include "ps/CStr.h" #include "ps/Game.h" -#include "ps/GUID.h" #include "ps/Loader.h" #include "scriptinterface/ScriptInterface.h" #include "simulation2/Simulation2.h" @@ -70,7 +69,7 @@ CNetClient::CNetClient(CGame* game, bool isLocalClient) : m_Session(NULL), m_UserName(L"anonymous"), - m_GUID(ps_generate_guid()), m_HostID((u32)-1), m_ClientTurnManager(NULL), m_Game(game), + m_HostID((u32)-1), m_ClientTurnManager(NULL), m_Game(game), m_GameAttributes(game->GetSimulation2()->GetScriptInterface().GetContext()), m_IsLocalClient(isLocalClient), m_LastConnectionCheck(0), @@ -514,8 +513,10 @@ CNetClient* client = (CNetClient*)context; + CSrvHandshakeResponseMessage* message = (CSrvHandshakeResponseMessage*)event->GetParamRef(); + client->m_GUID = message->m_GUID; + CAuthenticateMessage authenticate; - authenticate.m_GUID = client->m_GUID; authenticate.m_Name = client->m_UserName; authenticate.m_Password = L""; // TODO authenticate.m_IsLocalClient = client->m_IsLocalClient; Index: source/network/NetHost.h =================================================================== --- source/network/NetHost.h +++ source/network/NetHost.h @@ -67,8 +67,7 @@ NDR_KICKED, NDR_BANNED, NDR_PLAYERNAME_IN_USE, - NDR_SERVER_FULL, - NDR_PLAYERGUID_IN_USE + NDR_SERVER_FULL }; class CNetHost Index: source/network/NetMessages.h =================================================================== --- source/network/NetMessages.h +++ source/network/NetMessages.h @@ -113,11 +113,10 @@ START_NMT_CLASS_(SrvHandshakeResponse, NMT_SERVER_HANDSHAKE_RESPONSE) NMT_FIELD_INT(m_UseProtocolVersion, u32, 4) NMT_FIELD_INT(m_Flags, u32, 4) - NMT_FIELD(CStrW, m_Message) + NMT_FIELD(CStr, m_GUID) END_NMT_CLASS() START_NMT_CLASS_(Authenticate, NMT_AUTHENTICATE) - NMT_FIELD(CStr, m_GUID) NMT_FIELD(CStrW, m_Name) NMT_FIELD(CStrW, m_Password) NMT_FIELD_INT(m_IsLocalClient, u8, 1) Index: source/network/NetServer.cpp =================================================================== --- source/network/NetServer.cpp +++ source/network/NetServer.cpp @@ -29,6 +29,7 @@ #include "network/StunClient.h" #include "ps/CLogger.h" #include "ps/ConfigDB.h" +#include "ps/GUID.h" #include "ps/Profile.h" #include "scriptinterface/ScriptInterface.h" #include "scriptinterface/ScriptRuntime.h" @@ -871,9 +872,27 @@ return false; } + // Ensure unique GUID + CStr guid = ps_generate_guid(); + int count = 0; + while(std::find_if( + server.m_Sessions.begin(), server.m_Sessions.end(), + [&guid] (const CNetServerSession* session) + { return session->GetGUID() == guid; }) != server.m_Sessions.end()) + { + if (++count > 100) + { + session->Disconnect(NDR_UNKNOWN); + return true; + } + guid = ps_generate_guid(); + } + + session->SetGUID(guid); + CSrvHandshakeResponseMessage handshakeResponse; handshakeResponse.m_UseProtocolVersion = PS_PROTOCOL_VERSION; - handshakeResponse.m_Message = server.m_WelcomeMessage; + handshakeResponse.m_GUID = guid; handshakeResponse.m_Flags = 0; session->SendMessage(&handshakeResponse); @@ -897,7 +916,6 @@ CAuthenticateMessage* message = (CAuthenticateMessage*)event->GetParamRef(); CStrW username = SanitisePlayerName(message->m_Name); - CStr guid = message->m_GUID; // Either deduplicate or prohibit join if name is in use bool duplicatePlayernames = false; @@ -914,16 +932,6 @@ return true; } - // Disconnect user if the provided GUID is already in use - if (std::find_if( - server.m_Sessions.begin(), server.m_Sessions.end(), - [&guid] (const CNetServerSession* session) - { return session->GetGUID() == guid; }) != server.m_Sessions.end()) - { - session->Disconnect(NDR_PLAYERGUID_IN_USE); - return true; - } - // Disconnect banned usernames if (std::find(server.m_BannedPlayers.begin(), server.m_BannedPlayers.end(), username) != server.m_BannedPlayers.end()) { @@ -1018,7 +1026,6 @@ u32 newHostID = server.m_NextHostID++; session->SetUserName(username); - session->SetGUID(message->m_GUID); session->SetHostID(newHostID); session->SetLocalClient(message->m_IsLocalClient);