Ticket #3575: 3575_differentPorts_v2.5.patch
File 3575_differentPorts_v2.5.patch, 18.7 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 1 var g_IsConnecting = false; 2 2 var g_GameType; // "server" or "client" 3 3 var g_ServerName = ""; 4 var g_ServerPort; 4 5 5 6 var g_IsRejoining = false; 6 7 var g_GameAttributes; // used when rejoining … … 15 16 case "join": 16 17 if(Engine.HasXmppClient()) 17 18 { 18 if (startJoin(attribs.name, attribs.ip ))19 if (startJoin(attribs.name, attribs.ip, getValidPort(attribs.port))) 19 20 switchSetupPage("pageJoin", "pageConnecting"); 20 21 } 21 22 else … … 27 28 case "host": 28 29 Engine.GetGUIObjectByName("pageJoin").hidden = true; 29 30 Engine.GetGUIObjectByName("pageHost").hidden = false; 31 Engine.GetGUIObjectByName("hostPortWrapper").hidden = false; 30 32 if(Engine.HasXmppClient()) 31 33 { 32 34 Engine.GetGUIObjectByName("hostServerNameWrapper").hidden = false; … … 60 62 { 61 63 let joinPlayerName = Engine.GetGUIObjectByName("joinPlayerName").caption; 62 64 let joinServer = Engine.GetGUIObjectByName("joinServer").caption; 63 if (startJoin(joinPlayerName, joinServer)) 65 let joinPort = getValidPort(Engine.GetGUIObjectByName("joinPort").caption); 66 if (startJoin(joinPlayerName, joinServer, joinPort)) 64 67 switchSetupPage("pageJoin", "pageConnecting"); 65 68 } 66 69 else if (!Engine.GetGUIObjectByName("pageHost").hidden) … … 67 70 { 68 71 let hostPlayerName = Engine.GetGUIObjectByName("hostPlayerName").caption; 69 72 let hostServerName = Engine.GetGUIObjectByName("hostServerName").caption; 70 if (startHost(hostPlayerName, hostServerName)) 73 let hostPort = getValidPort(Engine.GetGUIObjectByName("hostPort").caption); 74 if (startHost(hostPlayerName, hostServerName, hostPort)) 71 75 switchSetupPage("pageHost", "pageConnecting"); 72 76 } 73 77 } 74 78 79 function getValidPort(port) 80 { 81 if (+port && +port >= 0 && +port <=65535) 82 return +port 83 return Engine.GetDefaultPort(); 84 } 85 75 86 function startConnectionStatus(type) 76 87 { 77 88 g_GameType = type; … … 177 188 } 178 189 else 179 190 { 180 Engine.SwitchGuiPage("page_gamesetup.xml", { "type": g_GameType, "serverName": g_ServerName }); 191 Engine.SwitchGuiPage("page_gamesetup.xml", { 192 "type": g_GameType, 193 "serverName": g_ServerName, 194 "serverPort": g_ServerPort 195 }); 181 196 return; // don't process any more messages - leave them for the game GUI loop 182 197 } 183 198 … … 210 225 Engine.GetGUIObjectByName("continueButton").hidden = true; 211 226 } 212 227 213 function startHost(playername, servername )228 function startHost(playername, servername, port) 214 229 { 215 230 // Save player name 216 231 Engine.ConfigDB_CreateValue("user", "playername.multiplayer", playername); 217 232 Engine.ConfigDB_WriteValueToFile("user", "playername.multiplayer", playername, "config/user.cfg"); 233 Engine.ConfigDB_CreateValue("user", "multiplayerhosting.port", port); 234 Engine.ConfigDB_WriteValueToFile("user", "multiplayerhosting.port", port, "config/user.cfg"); 218 235 219 236 // Disallow identically named games in the multiplayer lobby 220 237 if (Engine.HasXmppClient()) … … 231 248 try 232 249 { 233 250 if (g_UserRating) 234 Engine.StartNetworkHost(playername + " (" + g_UserRating + ")" );251 Engine.StartNetworkHost(playername + " (" + g_UserRating + ")", port); 235 252 else 236 Engine.StartNetworkHost(playername );253 Engine.StartNetworkHost(playername, port); 237 254 } 238 255 catch (e) 239 256 { … … 248 265 249 266 startConnectionStatus("server"); 250 267 g_ServerName = servername; 268 g_ServerPort = port; 251 269 252 270 if (Engine.HasXmppClient()) 253 271 Engine.LobbySetPlayerPresence("playing"); … … 255 273 return true; 256 274 } 257 275 258 function startJoin(playername, ip )276 function startJoin(playername, ip, port) 259 277 { 260 278 try 261 279 { 262 280 if (g_UserRating) 263 Engine.StartNetworkJoin(playername + " (" + g_UserRating + ")", ip );281 Engine.StartNetworkJoin(playername + " (" + g_UserRating + ")", ip, port); 264 282 else 265 Engine.StartNetworkJoin(playername, ip );283 Engine.StartNetworkJoin(playername, ip, port); 266 284 } 267 285 catch (e) 268 286 { … … 286 304 Engine.ConfigDB_WriteValueToFile("user", "playername.multiplayer", playername, "config/user.cfg"); 287 305 Engine.ConfigDB_CreateValue("user", "multiplayerserver", ip); 288 306 Engine.ConfigDB_WriteValueToFile("user", "multiplayerserver", ip, "config/user.cfg"); 307 Engine.ConfigDB_CreateValue("user", "multiplayerjoining.port", port); 308 Engine.ConfigDB_WriteValueToFile("user", "multiplayerjoining.port", port, "config/user.cfg"); 289 309 } 290 310 return true; 291 311 } -
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 <translatableAttribute id="tooltip">Leave blank to use the default port.</translatableAttribute> 55 <action on="Load"> 56 this.caption = Engine.ConfigDB_GetValue("user", "multiplayerjoining.port"); 57 </action> 58 </object> 48 59 </object> 49 60 50 61 <object name="pageHost" size="0 32 100% 100%" hidden="true"> … … 54 65 </object> 55 66 56 67 <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>68 <object type="text" size="20 40 50% 70" style="ModernLabelText" text_align="right"> 69 <translatableAttribute id="caption">Player name:</translatableAttribute> 70 </object> 60 71 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> 72 <object name="hostPlayerName" type="input" size="50%+10 40 100%-20 64" style="ModernInput"> 73 <action on="Load"> 74 this.caption = multiplayerName(); 75 </action> 76 </object> 65 77 </object> 66 </object>67 78 68 79 <!-- Host server name is only used on games started through the lobby. --> 69 80 <object name="hostServerNameWrapper" hidden="true"> … … 77 88 </action> 78 89 </object> 79 90 </object> 91 92 <object name="hostPortWrapper" hidden="true"> 93 <object type="text" size="20 120 50% 150" style="ModernLabelText" text_align="right"> 94 <translatableAttribute id="caption">Server Port:</translatableAttribute> 95 </object> 96 97 <object name="hostPort" type="input" size="50%+10 120 100%-20 144" style="ModernInput"> 98 <translatableAttribute id="tooltip">Leave blank to use the default port.</translatableAttribute> 99 <action on="Load"> 100 this.caption = Engine.ConfigDB_GetValue("user", "multiplayerhosting.port"); 101 </action> 102 </object> 103 </object> 80 104 </object> 81 105 82 106 <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, u16 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); … … 384 384 } 385 385 } 386 386 387 u16 GetDefaultPort(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) 388 { 389 return PS_DEFAULT_PORT; 390 } 391 387 392 void DisconnectNetworkGame(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) 388 393 { 389 394 // TODO: we ought to do async reliable disconnections … … 1027 1032 scriptInterface.RegisterFunction<void, &StartNetworkGame>("StartNetworkGame"); 1028 1033 scriptInterface.RegisterFunction<void, JS::HandleValue, int, &StartGame>("StartGame"); 1029 1034 scriptInterface.RegisterFunction<void, &Script_EndGame>("EndGame"); 1030 scriptInterface.RegisterFunction<void, std::wstring, &StartNetworkHost>("StartNetworkHost"); 1031 scriptInterface.RegisterFunction<void, std::wstring, std::string, &StartNetworkJoin>("StartNetworkJoin"); 1035 scriptInterface.RegisterFunction<void, std::wstring, unsigned int, &StartNetworkHost>("StartNetworkHost"); 1036 scriptInterface.RegisterFunction<void, std::wstring, std::string, u16, &StartNetworkJoin>("StartNetworkJoin"); 1037 scriptInterface.RegisterFunction<u16, &GetDefaultPort>("GetDefaultPort"); 1032 1038 scriptInterface.RegisterFunction<void, &DisconnectNetworkGame>("DisconnectNetworkGame"); 1033 1039 scriptInterface.RegisterFunction<std::string, &GetPlayerGUID>("GetPlayerGUID"); 1034 1040 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
1 /* Copyright (C) 201 4Wildfire Games.1 /* Copyright (C) 2016 Wildfire Games. 2 2 * This file is part of 0 A.D. 3 3 * 4 4 * 0 A.D. is free software: you can redistribute it and/or modify … … 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