Ticket #3604: t3604_stop_rejoin_confusion_v2.patch

File t3604_stop_rejoin_confusion_v2.patch, 2.4 KB (added by elexis, 8 years ago)
  • source/network/NetServer.cpp

    bool CNetServerWorker::OnAuthenticate(vo  
    844844        session->Disconnect(NDR_SERVER_LOADING);
    845845        return true;
    846846    }
    847847
    848848    CAuthenticateMessage* message = (CAuthenticateMessage*)event->GetParamRef();
    849     CStrW username = server.DeduplicatePlayerName(SanitisePlayerName(message->m_Name));
     849    CStrW username = SanitisePlayerName(message->m_Name);
     850
     851    // Prohibit late-observer joins if a player with the same name exists
     852    if (std::find_if(
     853            server.m_Sessions.begin(), server.m_Sessions.end(),
     854            [&username] (const CNetServerSession* session)
     855            { return session->GetUserName() == username; })
     856        != server.m_Sessions.end())
     857    {
     858        session->Disconnect(NDR_UNKNOWN);
     859        return true;
     860    }
    850861
    851862    // Disconnect banned usernames
    852863    if (std::find(server.m_BannedPlayers.begin(), server.m_BannedPlayers.end(), username) != server.m_BannedPlayers.end())
    853864    {
    854865        session->Disconnect(NDR_BANNED);
    CStrW CNetServerWorker::SanitisePlayerNa  
    11741185        name = L"Anonymous";
    11751186
    11761187    return name;
    11771188}
    11781189
    1179 CStrW CNetServerWorker::DeduplicatePlayerName(const CStrW& original)
    1180 {
    1181     CStrW name = original;
    1182 
    1183     // Try names "Foo", "Foo (2)", "Foo (3)", etc
    1184     size_t id = 2;
    1185     while (true)
    1186     {
    1187         bool unique = true;
    1188         for (size_t i = 0; i < m_Sessions.size(); ++i)
    1189         {
    1190             if (m_Sessions[i]->GetUserName() == name)
    1191             {
    1192                 unique = false;
    1193                 break;
    1194             }
    1195         }
    1196 
    1197         if (unique)
    1198             return name;
    1199 
    1200         name = original + L" (" + CStrW::FromUInt(id++) + L")";
    1201     }
    1202 }
    1203 
    12041190
    12051191
    12061192
    12071193CNetServer::CNetServer(int autostartPlayers) :
    12081194    m_Worker(new CNetServerWorker(autostartPlayers))
  • source/network/NetServer.h

    private:  
    236236     * Make a player name 'nicer' by limiting the length and removing forbidden characters etc.
    237237     */
    238238    static CStrW SanitisePlayerName(const CStrW& original);
    239239
    240240    /**
    241      * Make a player name unique, if it matches any existing session's name.
    242      */
    243     CStrW DeduplicatePlayerName(const CStrW& original);
    244 
    245     /**
    246241     * Get the script context used for game attributes.
    247242     */
    248243    ScriptInterface& GetScriptInterface();
    249244
    250245    /**