From 62061557db60564f2603ac989f8309b259480092 Mon Sep 17 00:00:00 2001 From: elexis Date: Mon, 13 Jun 2016 16:56:14 +0000 Subject: [PATCH] Host on arbitrary UDP ports. Patch in cooperation with Imarok, fixes #3575. This was SVN commit r18372. --- .../data/mods/public/gui/common/network.js | 8 +++ .../mods/public/gui/gamesetup/gamesetup.js | 5 +- .../mods/public/gui/gamesetup/gamesetup_mp.js | 40 ++++++++++---- .../public/gui/gamesetup/gamesetup_mp.xml | 54 ++++++++++++++----- binaries/data/mods/public/gui/lobby/lobby.js | 11 +++- source/gui/scripting/ScriptFunctions.cpp | 20 ++++--- source/lobby/XmppClient.cpp | 2 +- source/network/NetClient.cpp | 4 +- source/network/NetClient.h | 2 +- source/network/NetServer.cpp | 8 +-- source/network/NetServer.h | 4 +- source/network/NetSession.cpp | 2 +- source/network/NetSession.h | 2 +- source/network/tests/test_Net.h | 10 ++-- source/ps/GameSetup/GameSetup.cpp | 8 +-- 15 files changed, 130 insertions(+), 50 deletions(-) diff --git a/binaries/data/mods/public/gui/common/network.js b/binaries/data/mods/public/gui/common/network.js index d3863fa17d..7e7f86fcb6 100644 --- a/binaries/data/mods/public/gui/common/network.js +++ b/binaries/data/mods/public/gui/common/network.js @@ -43,6 +43,14 @@ var g_NetworkCommands = { "/clear": argument => clearChatMessages() }; +function getValidPort(port) +{ + if (isNaN(+port) || +port <= 0 || +port > 65535) + return Engine.GetDefaultPort(); + + return +port; +} + /** * Must be kept in sync with source/network/NetHost.h */ diff --git a/binaries/data/mods/public/gui/gamesetup/gamesetup.js b/binaries/data/mods/public/gui/gamesetup/gamesetup.js index 8b6dc79a9c..aaa8a1375c 100644 --- a/binaries/data/mods/public/gui/gamesetup/gamesetup.js +++ b/binaries/data/mods/public/gui/gamesetup/gamesetup.js @@ -160,6 +160,7 @@ var g_IsController; * To report the game to the lobby bot. */ var g_ServerName; +var g_ServerPort; /** * States whether the GUI is currently updated in response to network messages instead of user input @@ -242,7 +243,8 @@ function init(attribs) g_IsNetworked = attribs.type != "offline"; g_IsController = attribs.type != "client"; - g_ServerName = attribs.serverName || undefined; + g_ServerName = attribs.serverName; + g_ServerPort = attribs.serverPort; // Replace empty playername when entering a singleplayermatch for the first time if (!g_IsNetworked) @@ -1937,6 +1939,7 @@ function sendRegisterGameStanza() let stanza = { "name": g_ServerName, + "port": g_ServerPort, "mapName": g_GameAttributes.map, "niceMapName": getMapDisplayName(g_GameAttributes.map), "mapSize": mapSize, diff --git a/binaries/data/mods/public/gui/gamesetup/gamesetup_mp.js b/binaries/data/mods/public/gui/gamesetup/gamesetup_mp.js index e7da6946bf..36d4f3f5a2 100644 --- a/binaries/data/mods/public/gui/gamesetup/gamesetup_mp.js +++ b/binaries/data/mods/public/gui/gamesetup/gamesetup_mp.js @@ -13,6 +13,11 @@ var g_GameType; */ var g_ServerName = ""; +/** + * Cached to pass it to the gamesetup of the controller to report the game to the lobby. + */ +var g_ServerPort; + var g_IsRejoining = false; var g_GameAttributes; // used when rejoining var g_PlayerAssignments; // used when rejoining @@ -28,7 +33,7 @@ function init(attribs) { if (Engine.HasXmppClient()) { - if (startJoin(attribs.name, attribs.ip)) + if (startJoin(attribs.name, attribs.ip, getValidPort(attribs.port))) switchSetupPage("pageConnecting"); } else @@ -85,14 +90,18 @@ function confirmSetup() { let joinPlayerName = Engine.GetGUIObjectByName("joinPlayerName").caption; let joinServer = Engine.GetGUIObjectByName("joinServer").caption; - if (startJoin(joinPlayerName, joinServer)) + let joinPort = Engine.GetGUIObjectByName("joinPort").caption; + + if (startJoin(joinPlayerName, joinServer, getValidPort(joinPort))) switchSetupPage("pageConnecting"); } else if (!Engine.GetGUIObjectByName("pageHost").hidden) { let hostPlayerName = Engine.GetGUIObjectByName("hostPlayerName").caption; let hostServerName = Engine.GetGUIObjectByName("hostServerName").caption; - if (startHost(hostPlayerName, hostServerName)) + let hostPort = Engine.GetGUIObjectByName("hostPort").caption; + + if (startHost(hostPlayerName, hostServerName, getValidPort(hostPort))) switchSetupPage("pageConnecting"); } } @@ -202,7 +211,11 @@ function pollAndHandleNetworkClient() } else { - Engine.SwitchGuiPage("page_gamesetup.xml", { "type": g_GameType, "serverName": g_ServerName }); + Engine.SwitchGuiPage("page_gamesetup.xml", { + "type": g_GameType, + "serverName": g_ServerName, + "serverPort": g_ServerPort + }); return; // don't process any more messages - leave them for the game GUI loop } @@ -242,7 +255,7 @@ function switchSetupPage(newPage) Engine.GetGUIObjectByName("continueButton").hidden = newPage == "pageConnecting"; } -function startHost(playername, servername) +function startHost(playername, servername, port) { startConnectionStatus("server"); @@ -250,6 +263,10 @@ function startHost(playername, servername) Engine.ConfigDB_CreateValue("user", "playername.multiplayer", playername); Engine.ConfigDB_WriteValueToFile("user", "playername.multiplayer", playername, "config/user.cfg"); + // Save port + Engine.ConfigDB_CreateValue("user", "multiplayerhosting.port", port); + Engine.ConfigDB_WriteValueToFile("user", "multiplayerhosting.port", port, "config/user.cfg"); + // Disallow identically named games in the multiplayer lobby if (Engine.HasXmppClient() && Engine.GetGameList().some(game => game.name == servername)) @@ -263,9 +280,9 @@ function startHost(playername, servername) try { if (g_UserRating) - Engine.StartNetworkHost(playername + " (" + g_UserRating + ")"); + Engine.StartNetworkHost(playername + " (" + g_UserRating + ")", port); else - Engine.StartNetworkHost(playername); + Engine.StartNetworkHost(playername, port); } catch (e) { @@ -279,6 +296,7 @@ function startHost(playername, servername) } g_ServerName = servername; + g_ServerPort = port; if (Engine.HasXmppClient()) Engine.LobbySetPlayerPresence("playing"); @@ -286,14 +304,14 @@ function startHost(playername, servername) return true; } -function startJoin(playername, ip) +function startJoin(playername, ip, port) { try { if (g_UserRating) - Engine.StartNetworkJoin(playername + " (" + g_UserRating + ")", ip); + Engine.StartNetworkJoin(playername + " (" + g_UserRating + ")", ip, port); else - Engine.StartNetworkJoin(playername, ip); + Engine.StartNetworkJoin(playername, ip, port); } catch (e) { @@ -317,6 +335,8 @@ function startJoin(playername, ip) Engine.ConfigDB_WriteValueToFile("user", "playername.multiplayer", playername, "config/user.cfg"); Engine.ConfigDB_CreateValue("user", "multiplayerserver", ip); Engine.ConfigDB_WriteValueToFile("user", "multiplayerserver", ip, "config/user.cfg"); + Engine.ConfigDB_CreateValue("user", "multiplayerjoining.port", port); + Engine.ConfigDB_WriteValueToFile("user", "multiplayerjoining.port", port, "config/user.cfg"); } return true; } diff --git a/binaries/data/mods/public/gui/gamesetup/gamesetup_mp.xml b/binaries/data/mods/public/gui/gamesetup/gamesetup_mp.xml index 7dd4048c1d..a2449f93cf 100644 --- a/binaries/data/mods/public/gui/gamesetup/gamesetup_mp.xml +++ b/binaries/data/mods/public/gui/gamesetup/gamesetup_mp.xml @@ -26,7 +26,7 @@ Joining an existing game. - + Player name: @@ -36,7 +36,7 @@ - + Server Hostname or IP: @@ -45,6 +45,20 @@ this.caption = Engine.ConfigDB_GetValue("user", "multiplayerserver"); + + + Server Port: + + + + Leave blank to use the default port. + + this.caption = getValidPort(Engine.ConfigDB_GetValue("user", "multiplayerjoining.port")); + + + this.caption = getValidPort(this.caption); + +