Ticket #3575: 3575_differentPorts.patch
File 3575_differentPorts.patch, 17.4 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/gui/gamesetup/gamesetup.js
160 160 * To report the game to the lobby bot. 161 161 */ 162 162 var g_ServerName; 163 var g_ServerPort; 163 164 164 165 /** 165 166 * States whether the GUI is currently updated in response to network messages instead of user input … … 243 244 g_IsNetworked = attribs.type != "offline"; 244 245 g_IsController = attribs.type != "client"; 245 246 g_ServerName = attribs.serverName || undefined; 247 g_ServerPort = attribs.serverPort; 246 248 247 249 // Replace empty playername when entering a singleplayermatch for the first time 248 250 if (!g_IsNetworked) … … 1940 1942 1941 1943 let stanza = { 1942 1944 "name": g_ServerName, 1945 "port": g_ServerPort, 1943 1946 "mapName": g_GameAttributes.map, 1944 1947 "niceMapName": getMapDisplayName(g_GameAttributes.map), 1945 1948 "mapSize": mapSize, -
binaries/data/mods/public/gui/gamesetup/gamesetup_mp.js
1 const g_DefaultPort = 20595; 2 1 3 var g_IsConnecting = false; 2 4 var g_GameType; // "server" or "client" 3 5 var g_ServerName = ""; 6 var g_ServerPort; 4 7 5 8 var g_IsRejoining = false; 6 9 var g_GameAttributes; // used when rejoining … … 15 18 case "join": 16 19 if(Engine.HasXmppClient()) 17 20 { 18 if (startJoin(attribs.name, attribs.ip ))21 if (startJoin(attribs.name, attribs.ip, +attribs.port || g_DefaultPort)) 19 22 switchSetupPage("pageJoin", "pageConnecting"); 20 23 } 21 24 else … … 27 30 case "host": 28 31 Engine.GetGUIObjectByName("pageJoin").hidden = true; 29 32 Engine.GetGUIObjectByName("pageHost").hidden = false; 33 Engine.GetGUIObjectByName("hostPortWrapper").hidden = false; 30 34 if(Engine.HasXmppClient()) 31 35 { 32 36 Engine.GetGUIObjectByName("hostServerNameWrapper").hidden = false; … … 60 64 { 61 65 let joinPlayerName = Engine.GetGUIObjectByName("joinPlayerName").caption; 62 66 let joinServer = Engine.GetGUIObjectByName("joinServer").caption; 63 if (startJoin(joinPlayerName, joinServer)) 67 let joinPort = +Engine.GetGUIObjectByName("joinPort").caption || g_DefaultPort; 68 if (startJoin(joinPlayerName, joinServer, joinPort)) 64 69 switchSetupPage("pageJoin", "pageConnecting"); 65 70 } 66 71 else if (!Engine.GetGUIObjectByName("pageHost").hidden) … … 67 72 { 68 73 let hostPlayerName = Engine.GetGUIObjectByName("hostPlayerName").caption; 69 74 let hostServerName = Engine.GetGUIObjectByName("hostServerName").caption; 70 if (startHost(hostPlayerName, hostServerName)) 75 let hostPort = +Engine.GetGUIObjectByName("hostPort").caption || g_DefaultPort; 76 if (startHost(hostPlayerName, hostServerName, hostPort)) 71 77 switchSetupPage("pageHost", "pageConnecting"); 72 78 } 73 79 } … … 177 183 } 178 184 else 179 185 { 180 Engine.SwitchGuiPage("page_gamesetup.xml", { "type": g_GameType, "serverName": g_ServerName 186 Engine.SwitchGuiPage("page_gamesetup.xml", { "type": g_GameType, "serverName": g_ServerName, "serverPort": g_ServerPort}); 181 187 return; // don't process any more messages - leave them for the game GUI loop 182 188 } 183 189 … … 210 216 Engine.GetGUIObjectByName("continueButton").hidden = true; 211 217 } 212 218 213 function startHost(playername, servername )219 function startHost(playername, servername, port) 214 220 { 215 221 // Save player name 216 222 Engine.ConfigDB_CreateValue("user", "playername.multiplayer", playername); … … 231 237 try 232 238 { 233 239 if (g_UserRating) 234 Engine.StartNetworkHost(playername + " (" + g_UserRating + ")" );240 Engine.StartNetworkHost(playername + " (" + g_UserRating + ")", port); 235 241 else 236 Engine.StartNetworkHost(playername );242 Engine.StartNetworkHost(playername, port); 237 243 } 238 244 catch (e) 239 245 { … … 248 254 249 255 startConnectionStatus("server"); 250 256 g_ServerName = servername; 257 g_ServerPort = port; 251 258 252 259 if (Engine.HasXmppClient()) 253 260 Engine.LobbySetPlayerPresence("playing"); … … 255 262 return true; 256 263 } 257 264 258 function startJoin(playername, ip )265 function startJoin(playername, ip, port) 259 266 { 260 267 try 261 268 { 262 269 if (g_UserRating) 263 Engine.StartNetworkJoin(playername + " (" + g_UserRating + ")", ip );270 Engine.StartNetworkJoin(playername + " (" + g_UserRating + ")", ip, port); 264 271 else 265 Engine.StartNetworkJoin(playername, ip );272 Engine.StartNetworkJoin(playername, ip, port); 266 273 } 267 274 catch (e) 268 275 { … … 285 292 Engine.ConfigDB_CreateValue("user", "playername.multiplayer", playername); 286 293 Engine.ConfigDB_WriteValueToFile("user", "playername.multiplayer", playername, "config/user.cfg"); 287 294 Engine.ConfigDB_CreateValue("user", "multiplayerserver", ip); 295 Engine.ConfigDB_CreateValue("user", "multiplayerport", port); 288 296 Engine.ConfigDB_WriteValueToFile("user", "multiplayerserver", ip, "config/user.cfg"); 289 297 } 290 298 return true; -
binaries/data/mods/public/gui/gamesetup/gamesetup_mp.xml
45 45 this.caption = Engine.ConfigDB_GetValue("user", "multiplayerserver"); 46 46 </action> 47 47 </object> 48 49 <object type="text" size="20 120 50% 150" style="ModernLabelText" text_align="right"> 50 <translatableAttribute id="caption">Server Port:</translatableAttribute> 51 </object> 52 53 <object name="joinPort" type="input" size="50%+10 120 100%-20 144" style="ModernInput"> 54 <action on="Load"> 55 this.caption = Engine.ConfigDB_GetValue("user", "multiplayerport"); 56 </action> 57 </object> 48 58 </object> 49 59 50 60 <object name="pageHost" size="0 32 100% 100%" hidden="true"> … … 54 64 </object> 55 65 56 66 <object name="hostPlayerNameWrapper" hidden="true"> 57 <object type="text" size="20 40 50% 70" style="ModernLabelText" text_align="right">58 <translatableAttribute id="caption">Player name:</translatableAttribute>59 </object>67 <object type="text" size="20 40 50% 70" style="ModernLabelText" text_align="right"> 68 <translatableAttribute id="caption">Player name:</translatableAttribute> 69 </object> 60 70 61 <object name="hostPlayerName" type="input" size="50%+10 40 100%-20 64" style="ModernInput"> 62 <action on="Load"> 63 this.caption = multiplayerName(); 64 </action> 71 <object name="hostPlayerName" type="input" size="50%+10 40 100%-20 64" style="ModernInput"> 72 <action on="Load"> 73 this.caption = multiplayerName(); 74 </action> 75 </object> 65 76 </object> 66 </object>67 77 68 78 <!-- Host server name is only used on games started through the lobby. --> 69 79 <object name="hostServerNameWrapper" hidden="true"> … … 77 87 </action> 78 88 </object> 79 89 </object> 90 91 <object name="hostPortWrapper" hidden="true"> 92 <object type="text" size="20 120 50% 150" style="ModernLabelText" text_align="right"> 93 <translatableAttribute id="caption">Server Port:</translatableAttribute> 94 </object> 95 96 <object name="hostPort" type="input" size="50%+10 120 100%-20 144" style="ModernInput"> 97 <action on="Load"> 98 this.caption = Engine.ConfigDB_GetValue("user", "multiplayerport"); 99 </action> 100 </object> 101 </object> 80 102 </object> 81 103 82 104 <object name="hostFeedback" type="text" style="ModernLabelText" size="50 100%-90 100%-50 100%-50" textcolor="red" /> -
binaries/data/mods/public/gui/lobby/lobby.js
102 102 var g_SelectedGameIP = ""; 103 103 104 104 /** 105 * Used to restore the selection after updating the gamelist. 106 */ 107 var g_SelectedGamePort = ""; 108 109 /** 105 110 * Notifications sent by XmppClient.cpp 106 111 */ 107 112 var g_NetMessageTypes = { … … 509 514 var sortOrder = gamesBox.selected_column_order || 1; 510 515 511 516 if (gamesBox.selected > -1) 517 { 512 518 g_SelectedGameIP = g_GameList[gamesBox.selected].ip; 519 g_SelectedGamePort = g_GameList[gamesBox.selected].port; 520 } 513 521 514 522 g_GameList = Engine.GetGameList().filter(game => !filterGame(game)).sort((a, b) => { 515 523 var sortA, sortB; … … 556 564 let gameName = escapeText(game.name); 557 565 let mapTypeIdx = g_MapTypes.Name.indexOf(game.mapType); 558 566 559 if (game.ip == g_SelectedGameIP )567 if (game.ip == g_SelectedGameIP && game.port == g_SelectedGamePort) 560 568 selectedGameIndex = +i; 561 569 562 570 list_name.push('[color="' + g_GameColors[game.state] + '"]' + gameName); … … 672 680 }); 673 681 return; 674 682 } 683 if (!game.port) 684 { 685 addChatMessage({ 686 "from": "system", 687 "text": translate("The game's port is missing.") 688 }); 689 return; 690 } 675 691 676 692 Engine.PushGuiPage("page_gamesetup_mp.xml", { 677 693 "multiplayerGameType": "join", 678 694 "ip": game.ip, 695 "port": game.port, 679 696 "name": g_Username, 680 697 "rating": g_UserRating 681 698 }); -
source/gui/scripting/ScriptFunctions.cpp
341 341 g_NetClient->SendGameSetupMessage(&attribs, *(pCxPrivate->pScriptInterface)); 342 342 } 343 343 344 void StartNetworkHost(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& playerName )344 void StartNetworkHost(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& playerName, unsigned int serverPort) 345 345 { 346 346 ENSURE(!g_NetClient); 347 347 ENSURE(!g_NetServer); … … 348 348 ENSURE(!g_Game); 349 349 350 350 g_NetServer = new CNetServer(); 351 if (!g_NetServer->SetupConnection( ))351 if (!g_NetServer->SetupConnection(serverPort)) 352 352 { 353 353 pCxPrivate->pScriptInterface->ReportError("Failed to start server"); 354 354 SAFE_DELETE(g_NetServer); … … 359 359 g_NetClient = new CNetClient(g_Game, true); 360 360 g_NetClient->SetUserName(playerName); 361 361 362 if (!g_NetClient->SetupConnection("127.0.0.1" ))362 if (!g_NetClient->SetupConnection("127.0.0.1", serverPort)) 363 363 { 364 364 pCxPrivate->pScriptInterface->ReportError("Failed to connect to server"); 365 365 SAFE_DELETE(g_NetClient); … … 367 367 } 368 368 } 369 369 370 void StartNetworkJoin(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& playerName, const std::string& serverAddress )370 void StartNetworkJoin(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& playerName, const std::string& serverAddress, unsigned int serverPort) 371 371 { 372 372 ENSURE(!g_NetClient); 373 373 ENSURE(!g_NetServer); … … 376 376 g_Game = new CGame(); 377 377 g_NetClient = new CNetClient(g_Game, false); 378 378 g_NetClient->SetUserName(playerName); 379 if (!g_NetClient->SetupConnection(serverAddress ))379 if (!g_NetClient->SetupConnection(serverAddress, serverPort)) 380 380 { 381 381 pCxPrivate->pScriptInterface->ReportError("Failed to connect to server"); 382 382 SAFE_DELETE(g_NetClient); … … 1027 1027 scriptInterface.RegisterFunction<void, &StartNetworkGame>("StartNetworkGame"); 1028 1028 scriptInterface.RegisterFunction<void, JS::HandleValue, int, &StartGame>("StartGame"); 1029 1029 scriptInterface.RegisterFunction<void, &Script_EndGame>("EndGame"); 1030 scriptInterface.RegisterFunction<void, std::wstring, &StartNetworkHost>("StartNetworkHost");1031 scriptInterface.RegisterFunction<void, std::wstring, std::string, &StartNetworkJoin>("StartNetworkJoin");1030 scriptInterface.RegisterFunction<void, std::wstring, unsigned int, &StartNetworkHost>("StartNetworkHost"); 1031 scriptInterface.RegisterFunction<void, std::wstring, std::string, unsigned int, &StartNetworkJoin>("StartNetworkJoin"); 1032 1032 scriptInterface.RegisterFunction<void, &DisconnectNetworkGame>("DisconnectNetworkGame"); 1033 1033 scriptInterface.RegisterFunction<std::string, &GetPlayerGUID>("GetPlayerGUID"); 1034 1034 scriptInterface.RegisterFunction<void, CStrW, bool, &KickPlayer>("KickPlayer"); -
source/lobby/XmppClient.cpp
502 502 JSAutoRequest rq(cx); 503 503 504 504 scriptInterface.Eval("([])", ret); 505 const char* stats[] = { "name", "ip", " state", "nbp", "tnbp", "players", "mapName", "niceMapName", "mapSize", "mapType", "victoryCondition" };505 const char* stats[] = { "name", "ip", "port", "state", "nbp", "tnbp", "players", "mapName", "niceMapName", "mapSize", "mapType", "victoryCondition" }; 506 506 for(const glooxwrapper::Tag* const& t : m_GameList) 507 507 { 508 508 JS::RootedValue game(cx); -
source/network/NetClient.cpp
154 154 m_UserName = username; 155 155 } 156 156 157 bool CNetClient::SetupConnection(const CStr& server )157 bool CNetClient::SetupConnection(const CStr& server, u16 port) 158 158 { 159 159 CNetClientSession* session = new CNetClientSession(*this); 160 bool ok = session->Connect( PS_DEFAULT_PORT, server, m_IsLocalClient);160 bool ok = session->Connect(port, server, m_IsLocalClient); 161 161 SetAndOwnSession(session); 162 162 return ok; 163 163 } -
source/network/NetClient.h
99 99 * @param server IP address or host name to connect to 100 100 * @return true on success, false on connection failure 101 101 */ 102 bool SetupConnection(const CStr& server );102 bool SetupConnection(const CStr& server, u16 port); 103 103 104 104 /** 105 105 * Destroy the connection to the server. -
source/network/NetServer.cpp
169 169 delete m_ServerTurnManager; 170 170 } 171 171 172 bool CNetServerWorker::SetupConnection( )172 bool CNetServerWorker::SetupConnection(u16 port) 173 173 { 174 174 ENSURE(m_State == SERVER_STATE_UNCONNECTED); 175 175 ENSURE(!m_Host); … … 177 177 // Bind to default host 178 178 ENetAddress addr; 179 179 addr.host = ENET_HOST_ANY; 180 addr.port = PS_DEFAULT_PORT;180 addr.port = port; 181 181 182 182 // Create ENet server 183 183 m_Host = enet_host_create(&addr, MAX_CLIENTS, CHANNEL_COUNT, 0, 0); … … 1427 1427 delete m_Worker; 1428 1428 } 1429 1429 1430 bool CNetServer::SetupConnection( )1430 bool CNetServer::SetupConnection(u16 port) 1431 1431 { 1432 return m_Worker->SetupConnection( );1432 return m_Worker->SetupConnection(port); 1433 1433 } 1434 1434 1435 1435 void CNetServer::StartGame() -
source/network/NetServer.h
113 113 * This function is synchronous (it won't return until the connection is established). 114 114 * @return true on success, false on error (e.g. port already in use) 115 115 */ 116 bool SetupConnection( );116 bool SetupConnection(u16 port); 117 117 118 118 /** 119 119 * Call from the GUI to asynchronously notify all clients that they should start loading the game. … … 184 184 * Begin listening for network connections. 185 185 * @return true on success, false on error (e.g. port already in use) 186 186 */ 187 bool SetupConnection( );187 bool SetupConnection(u16 port); 188 188 189 189 /** 190 190 * Call from the GUI to update the player assignments. -
source/network/tests/test_Net.h
24 24 #include "network/NetServer.h" 25 25 #include "network/NetClient.h" 26 26 #include "network/NetTurnManager.h" 27 #include "network/NetMessage.h" 28 #include "network/NetMessages.h" 27 29 #include "ps/CLogger.h" 28 30 #include "ps/Game.h" 29 31 #include "ps/Filesystem.h" … … 71 73 72 74 void connect(CNetServer& server, const std::vector<CNetClient*>& clients) 73 75 { 74 TS_ASSERT(server.SetupConnection( ));76 TS_ASSERT(server.SetupConnection(PS_DEFAULT_PORT)); 75 77 for (size_t j = 0; j < clients.size(); ++j) 76 TS_ASSERT(clients[j]->SetupConnection("127.0.0.1" ));78 TS_ASSERT(clients[j]->SetupConnection("127.0.0.1", PS_DEFAULT_PORT)); 77 79 78 80 for (size_t i = 0; ; ++i) 79 81 { … … 273 275 client2B.SetUserName(L"bob"); 274 276 clients.push_back(&client2B); 275 277 276 TS_ASSERT(client2B.SetupConnection("127.0.0.1" ));278 TS_ASSERT(client2B.SetupConnection("127.0.0.1", PS_DEFAULT_PORT)); 277 279 278 280 for (size_t i = 0; ; ++i) 279 281 { -
source/ps/GameSetup/GameSetup.cpp
50 50 #include "maths/MathUtil.h" 51 51 #include "network/NetServer.h" 52 52 #include "network/NetClient.h" 53 #include "network/NetMessage.h" 54 #include "network/NetMessages.h" 53 55 54 56 #include "ps/CConsole.h" 55 57 #include "ps/CLogger.h" … … 1483 1485 1484 1486 g_NetServer->UpdateGameAttributes(&attrs, scriptInterface); 1485 1487 1486 bool ok = g_NetServer->SetupConnection( );1488 bool ok = g_NetServer->SetupConnection(PS_DEFAULT_PORT); 1487 1489 ENSURE(ok); 1488 1490 1489 1491 g_NetClient = new CNetClient(g_Game, true); 1490 1492 g_NetClient->SetUserName(userName); 1491 g_NetClient->SetupConnection("127.0.0.1" );1493 g_NetClient->SetupConnection("127.0.0.1", PS_DEFAULT_PORT); 1492 1494 } 1493 1495 else if (args.Has("autostart-client")) 1494 1496 { … … 1501 1503 if (ip.empty()) 1502 1504 ip = "127.0.0.1"; 1503 1505 1504 bool ok = g_NetClient->SetupConnection(ip );1506 bool ok = g_NetClient->SetupConnection(ip, PS_DEFAULT_PORT); 1505 1507 ENSURE(ok); 1506 1508 } 1507 1509 else