Ticket #3604: t3604_stop_rejoin_confusion_v2.patch
File t3604_stop_rejoin_confusion_v2.patch, 2.4 KB (added by , 8 years ago) |
---|
-
source/network/NetServer.cpp
bool CNetServerWorker::OnAuthenticate(vo 844 844 session->Disconnect(NDR_SERVER_LOADING); 845 845 return true; 846 846 } 847 847 848 848 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 } 850 861 851 862 // Disconnect banned usernames 852 863 if (std::find(server.m_BannedPlayers.begin(), server.m_BannedPlayers.end(), username) != server.m_BannedPlayers.end()) 853 864 { 854 865 session->Disconnect(NDR_BANNED); … … CStrW CNetServerWorker::SanitisePlayerNa 1174 1185 name = L"Anonymous"; 1175 1186 1176 1187 return name; 1177 1188 } 1178 1189 1179 CStrW CNetServerWorker::DeduplicatePlayerName(const CStrW& original)1180 {1181 CStrW name = original;1182 1183 // Try names "Foo", "Foo (2)", "Foo (3)", etc1184 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 1204 1190 1205 1191 1206 1192 1207 1193 CNetServer::CNetServer(int autostartPlayers) : 1208 1194 m_Worker(new CNetServerWorker(autostartPlayers)) -
source/network/NetServer.h
private: 236 236 * Make a player name 'nicer' by limiting the length and removing forbidden characters etc. 237 237 */ 238 238 static CStrW SanitisePlayerName(const CStrW& original); 239 239 240 240 /** 241 * Make a player name unique, if it matches any existing session's name.242 */243 CStrW DeduplicatePlayerName(const CStrW& original);244 245 /**246 241 * Get the script context used for game attributes. 247 242 */ 248 243 ScriptInterface& GetScriptInterface(); 249 244 250 245 /**