Index: binaries/data/mods/public/gui/gamesetup/gamesetup.js
===================================================================
--- binaries/data/mods/public/gui/gamesetup/gamesetup.js (revision 18344)
+++ binaries/data/mods/public/gui/gamesetup/gamesetup.js (working copy)
@@ -160,6 +160,7 @@
* 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
@@ -243,6 +244,7 @@
g_IsNetworked = attribs.type != "offline";
g_IsController = attribs.type != "client";
g_ServerName = attribs.serverName || undefined;
+ g_ServerPort = attribs.serverPort;
// Replace empty playername when entering a singleplayermatch for the first time
if (!g_IsNetworked)
@@ -1940,6 +1942,7 @@
let stanza = {
"name": g_ServerName,
+ "port": g_ServerPort,
"mapName": g_GameAttributes.map,
"niceMapName": getMapDisplayName(g_GameAttributes.map),
"mapSize": mapSize,
Index: binaries/data/mods/public/gui/gamesetup/gamesetup_mp.js
===================================================================
--- binaries/data/mods/public/gui/gamesetup/gamesetup_mp.js (revision 18344)
+++ binaries/data/mods/public/gui/gamesetup/gamesetup_mp.js (working copy)
@@ -1,6 +1,9 @@
+const g_DefaultPort = 20595;
+
var g_IsConnecting = false;
var g_GameType; // "server" or "client"
var g_ServerName = "";
+var g_ServerPort;
var g_IsRejoining = false;
var g_GameAttributes; // used when rejoining
@@ -15,7 +18,7 @@
case "join":
if(Engine.HasXmppClient())
{
- if (startJoin(attribs.name, attribs.ip))
+ if (startJoin(attribs.name, attribs.ip, +attribs.port || g_DefaultPort))
switchSetupPage("pageJoin", "pageConnecting");
}
else
@@ -27,6 +30,7 @@
case "host":
Engine.GetGUIObjectByName("pageJoin").hidden = true;
Engine.GetGUIObjectByName("pageHost").hidden = false;
+ Engine.GetGUIObjectByName("hostPortWrapper").hidden = false;
if(Engine.HasXmppClient())
{
Engine.GetGUIObjectByName("hostServerNameWrapper").hidden = false;
@@ -60,7 +64,8 @@
{
let joinPlayerName = Engine.GetGUIObjectByName("joinPlayerName").caption;
let joinServer = Engine.GetGUIObjectByName("joinServer").caption;
- if (startJoin(joinPlayerName, joinServer))
+ let joinPort = +Engine.GetGUIObjectByName("joinPort").caption || g_DefaultPort;
+ if (startJoin(joinPlayerName, joinServer, joinPort))
switchSetupPage("pageJoin", "pageConnecting");
}
else if (!Engine.GetGUIObjectByName("pageHost").hidden)
@@ -67,7 +72,8 @@
{
let hostPlayerName = Engine.GetGUIObjectByName("hostPlayerName").caption;
let hostServerName = Engine.GetGUIObjectByName("hostServerName").caption;
- if (startHost(hostPlayerName, hostServerName))
+ let hostPort = +Engine.GetGUIObjectByName("hostPort").caption || g_DefaultPort;
+ if (startHost(hostPlayerName, hostServerName, hostPort))
switchSetupPage("pageHost", "pageConnecting");
}
}
@@ -177,7 +183,7 @@
}
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
}
@@ -210,7 +216,7 @@
Engine.GetGUIObjectByName("continueButton").hidden = true;
}
-function startHost(playername, servername)
+function startHost(playername, servername, port)
{
// Save player name
Engine.ConfigDB_CreateValue("user", "playername.multiplayer", playername);
@@ -231,9 +237,9 @@
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)
{
@@ -248,6 +254,7 @@
startConnectionStatus("server");
g_ServerName = servername;
+ g_ServerPort = port;
if (Engine.HasXmppClient())
Engine.LobbySetPlayerPresence("playing");
@@ -255,14 +262,14 @@
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)
{
@@ -285,6 +292,7 @@
Engine.ConfigDB_CreateValue("user", "playername.multiplayer", playername);
Engine.ConfigDB_WriteValueToFile("user", "playername.multiplayer", playername, "config/user.cfg");
Engine.ConfigDB_CreateValue("user", "multiplayerserver", ip);
+ Engine.ConfigDB_CreateValue("user", "multiplayerport", port);
Engine.ConfigDB_WriteValueToFile("user", "multiplayerserver", ip, "config/user.cfg");
}
return true;
Index: binaries/data/mods/public/gui/gamesetup/gamesetup_mp.xml
===================================================================
--- binaries/data/mods/public/gui/gamesetup/gamesetup_mp.xml (revision 18344)
+++ binaries/data/mods/public/gui/gamesetup/gamesetup_mp.xml (working copy)
@@ -45,6 +45,16 @@
this.caption = Engine.ConfigDB_GetValue("user", "multiplayerserver");
+
+
+
+
@@ -77,6 +87,18 @@
+
+
+
+ Server Port:
+
+
+
+
+ this.caption = Engine.ConfigDB_GetValue("user", "multiplayerport");
+
+
+
Index: binaries/data/mods/public/gui/lobby/lobby.js
===================================================================
--- binaries/data/mods/public/gui/lobby/lobby.js (revision 18344)
+++ binaries/data/mods/public/gui/lobby/lobby.js (working copy)
@@ -102,6 +102,11 @@
var g_SelectedGameIP = "";
/**
+ * Used to restore the selection after updating the gamelist.
+ */
+var g_SelectedGamePort = "";
+
+/**
* Notifications sent by XmppClient.cpp
*/
var g_NetMessageTypes = {
@@ -509,7 +514,10 @@
var sortOrder = gamesBox.selected_column_order || 1;
if (gamesBox.selected > -1)
+ {
g_SelectedGameIP = g_GameList[gamesBox.selected].ip;
+ g_SelectedGamePort = g_GameList[gamesBox.selected].port;
+ }
g_GameList = Engine.GetGameList().filter(game => !filterGame(game)).sort((a, b) => {
var sortA, sortB;
@@ -556,7 +564,7 @@
let gameName = escapeText(game.name);
let mapTypeIdx = g_MapTypes.Name.indexOf(game.mapType);
- if (game.ip == g_SelectedGameIP)
+ if (game.ip == g_SelectedGameIP && game.port == g_SelectedGamePort)
selectedGameIndex = +i;
list_name.push('[color="' + g_GameColors[game.state] + '"]' + gameName);
@@ -672,10 +680,19 @@
});
return;
}
+ if (!game.port)
+ {
+ addChatMessage({
+ "from": "system",
+ "text": translate("The game's port is missing.")
+ });
+ return;
+ }
Engine.PushGuiPage("page_gamesetup_mp.xml", {
"multiplayerGameType": "join",
"ip": game.ip,
+ "port": game.port,
"name": g_Username,
"rating": g_UserRating
});
Index: source/gui/scripting/ScriptFunctions.cpp
===================================================================
--- source/gui/scripting/ScriptFunctions.cpp (revision 18344)
+++ source/gui/scripting/ScriptFunctions.cpp (working copy)
@@ -341,7 +341,7 @@
g_NetClient->SendGameSetupMessage(&attribs, *(pCxPrivate->pScriptInterface));
}
-void StartNetworkHost(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& playerName)
+void StartNetworkHost(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& playerName, unsigned int serverPort)
{
ENSURE(!g_NetClient);
ENSURE(!g_NetServer);
@@ -348,7 +348,7 @@
ENSURE(!g_Game);
g_NetServer = new CNetServer();
- if (!g_NetServer->SetupConnection())
+ if (!g_NetServer->SetupConnection(serverPort))
{
pCxPrivate->pScriptInterface->ReportError("Failed to start server");
SAFE_DELETE(g_NetServer);
@@ -359,7 +359,7 @@
g_NetClient = new CNetClient(g_Game, true);
g_NetClient->SetUserName(playerName);
- if (!g_NetClient->SetupConnection("127.0.0.1"))
+ if (!g_NetClient->SetupConnection("127.0.0.1", serverPort))
{
pCxPrivate->pScriptInterface->ReportError("Failed to connect to server");
SAFE_DELETE(g_NetClient);
@@ -367,7 +367,7 @@
}
}
-void StartNetworkJoin(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& playerName, const std::string& serverAddress)
+void StartNetworkJoin(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& playerName, const std::string& serverAddress, unsigned int serverPort)
{
ENSURE(!g_NetClient);
ENSURE(!g_NetServer);
@@ -376,7 +376,7 @@
g_Game = new CGame();
g_NetClient = new CNetClient(g_Game, false);
g_NetClient->SetUserName(playerName);
- if (!g_NetClient->SetupConnection(serverAddress))
+ if (!g_NetClient->SetupConnection(serverAddress, serverPort))
{
pCxPrivate->pScriptInterface->ReportError("Failed to connect to server");
SAFE_DELETE(g_NetClient);
@@ -1027,8 +1027,8 @@
scriptInterface.RegisterFunction("StartNetworkGame");
scriptInterface.RegisterFunction("StartGame");
scriptInterface.RegisterFunction("EndGame");
- scriptInterface.RegisterFunction("StartNetworkHost");
- scriptInterface.RegisterFunction("StartNetworkJoin");
+ scriptInterface.RegisterFunction("StartNetworkHost");
+ scriptInterface.RegisterFunction("StartNetworkJoin");
scriptInterface.RegisterFunction("DisconnectNetworkGame");
scriptInterface.RegisterFunction("GetPlayerGUID");
scriptInterface.RegisterFunction("KickPlayer");
Index: source/lobby/XmppClient.cpp
===================================================================
--- source/lobby/XmppClient.cpp (revision 18344)
+++ source/lobby/XmppClient.cpp (working copy)
@@ -502,7 +502,7 @@
JSAutoRequest rq(cx);
scriptInterface.Eval("([])", ret);
- const char* stats[] = { "name", "ip", "state", "nbp", "tnbp", "players", "mapName", "niceMapName", "mapSize", "mapType", "victoryCondition" };
+ const char* stats[] = { "name", "ip", "port", "state", "nbp", "tnbp", "players", "mapName", "niceMapName", "mapSize", "mapType", "victoryCondition" };
for(const glooxwrapper::Tag* const& t : m_GameList)
{
JS::RootedValue game(cx);
Index: source/network/NetClient.cpp
===================================================================
--- source/network/NetClient.cpp (revision 18344)
+++ source/network/NetClient.cpp (working copy)
@@ -154,10 +154,10 @@
m_UserName = username;
}
-bool CNetClient::SetupConnection(const CStr& server)
+bool CNetClient::SetupConnection(const CStr& server, u16 port)
{
CNetClientSession* session = new CNetClientSession(*this);
- bool ok = session->Connect(PS_DEFAULT_PORT, server, m_IsLocalClient);
+ bool ok = session->Connect(port, server, m_IsLocalClient);
SetAndOwnSession(session);
return ok;
}
Index: source/network/NetClient.h
===================================================================
--- source/network/NetClient.h (revision 18344)
+++ source/network/NetClient.h (working copy)
@@ -99,7 +99,7 @@
* @param server IP address or host name to connect to
* @return true on success, false on connection failure
*/
- bool SetupConnection(const CStr& server);
+ bool SetupConnection(const CStr& server, u16 port);
/**
* Destroy the connection to the server.
Index: source/network/NetServer.cpp
===================================================================
--- source/network/NetServer.cpp (revision 18344)
+++ source/network/NetServer.cpp (working copy)
@@ -169,7 +169,7 @@
delete m_ServerTurnManager;
}
-bool CNetServerWorker::SetupConnection()
+bool CNetServerWorker::SetupConnection(u16 port)
{
ENSURE(m_State == SERVER_STATE_UNCONNECTED);
ENSURE(!m_Host);
@@ -177,7 +177,7 @@
// Bind to default host
ENetAddress addr;
addr.host = ENET_HOST_ANY;
- addr.port = PS_DEFAULT_PORT;
+ addr.port = port;
// Create ENet server
m_Host = enet_host_create(&addr, MAX_CLIENTS, CHANNEL_COUNT, 0, 0);
@@ -1427,9 +1427,9 @@
delete m_Worker;
}
-bool CNetServer::SetupConnection()
+bool CNetServer::SetupConnection(u16 port)
{
- return m_Worker->SetupConnection();
+ return m_Worker->SetupConnection(port);
}
void CNetServer::StartGame()
Index: source/network/NetServer.h
===================================================================
--- source/network/NetServer.h (revision 18344)
+++ source/network/NetServer.h (working copy)
@@ -113,7 +113,7 @@
* This function is synchronous (it won't return until the connection is established).
* @return true on success, false on error (e.g. port already in use)
*/
- bool SetupConnection();
+ bool SetupConnection(u16 port);
/**
* Call from the GUI to asynchronously notify all clients that they should start loading the game.
@@ -184,7 +184,7 @@
* Begin listening for network connections.
* @return true on success, false on error (e.g. port already in use)
*/
- bool SetupConnection();
+ bool SetupConnection(u16 port);
/**
* Call from the GUI to update the player assignments.
Index: source/network/tests/test_Net.h
===================================================================
--- source/network/tests/test_Net.h (revision 18344)
+++ source/network/tests/test_Net.h (working copy)
@@ -24,6 +24,8 @@
#include "network/NetServer.h"
#include "network/NetClient.h"
#include "network/NetTurnManager.h"
+#include "network/NetMessage.h"
+#include "network/NetMessages.h"
#include "ps/CLogger.h"
#include "ps/Game.h"
#include "ps/Filesystem.h"
@@ -71,9 +73,9 @@
void connect(CNetServer& server, const std::vector& clients)
{
- TS_ASSERT(server.SetupConnection());
+ TS_ASSERT(server.SetupConnection(PS_DEFAULT_PORT));
for (size_t j = 0; j < clients.size(); ++j)
- TS_ASSERT(clients[j]->SetupConnection("127.0.0.1"));
+ TS_ASSERT(clients[j]->SetupConnection("127.0.0.1", PS_DEFAULT_PORT));
for (size_t i = 0; ; ++i)
{
@@ -273,7 +275,7 @@
client2B.SetUserName(L"bob");
clients.push_back(&client2B);
- TS_ASSERT(client2B.SetupConnection("127.0.0.1"));
+ TS_ASSERT(client2B.SetupConnection("127.0.0.1", PS_DEFAULT_PORT));
for (size_t i = 0; ; ++i)
{
Index: source/ps/GameSetup/GameSetup.cpp
===================================================================
--- source/ps/GameSetup/GameSetup.cpp (revision 18344)
+++ source/ps/GameSetup/GameSetup.cpp (working copy)
@@ -50,6 +50,8 @@
#include "maths/MathUtil.h"
#include "network/NetServer.h"
#include "network/NetClient.h"
+#include "network/NetMessage.h"
+#include "network/NetMessages.h"
#include "ps/CConsole.h"
#include "ps/CLogger.h"
@@ -1483,12 +1485,12 @@
g_NetServer->UpdateGameAttributes(&attrs, scriptInterface);
- bool ok = g_NetServer->SetupConnection();
+ bool ok = g_NetServer->SetupConnection(PS_DEFAULT_PORT);
ENSURE(ok);
g_NetClient = new CNetClient(g_Game, true);
g_NetClient->SetUserName(userName);
- g_NetClient->SetupConnection("127.0.0.1");
+ g_NetClient->SetupConnection("127.0.0.1", PS_DEFAULT_PORT);
}
else if (args.Has("autostart-client"))
{
@@ -1501,7 +1503,7 @@
if (ip.empty())
ip = "127.0.0.1";
- bool ok = g_NetClient->SetupConnection(ip);
+ bool ok = g_NetClient->SetupConnection(ip, PS_DEFAULT_PORT);
ENSURE(ok);
}
else