Support loopback servers for solo play
This commit is contained in:
@@ -364,16 +364,20 @@ namespace OpenRA
|
|||||||
{
|
{
|
||||||
return modData.ObjectCreator.CreateObject<T>( name );
|
return modData.ObjectCreator.CreateObject<T>( name );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void CreateServer(Settings settings, string map)
|
public static void CreateServer(int port, string name, string map)
|
||||||
{
|
{
|
||||||
server = new Server.Server(modData, settings, map);
|
server = new Server.Server(IPAddress.Any, port, name, Settings.Game.Mods, map, modData);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void CreateAndJoinServer(Settings settings, string map)
|
public static void CreateLocalServer(string map)
|
||||||
{
|
{
|
||||||
CreateServer(settings, map);
|
server = new Server.Server(IPAddress.Loopback,
|
||||||
JoinServer(IPAddress.Loopback.ToString(), settings.Server.ListenPort);
|
Game.Settings.Server.LoopbackPort,
|
||||||
|
"Skirmish Game",
|
||||||
|
Game.Settings.Game.Mods,
|
||||||
|
map,
|
||||||
|
modData);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool IsCurrentWorld(World world)
|
public static bool IsCurrentWorld(World world)
|
||||||
|
|||||||
@@ -22,8 +22,9 @@ namespace OpenRA.GameRules
|
|||||||
public class ServerSettings
|
public class ServerSettings
|
||||||
{
|
{
|
||||||
public string Name = "OpenRA Game";
|
public string Name = "OpenRA Game";
|
||||||
public int ListenPort = 1234;
|
public int LoopbackPort = 1234; // Port used for soloplay servers
|
||||||
public int ExternalPort = 1234;
|
public int ListenPort = 1234; // Port that we listen on
|
||||||
|
public int ExternalPort = 1234; // Router port that the master server forwards people to
|
||||||
public bool AdvertiseOnline = true;
|
public bool AdvertiseOnline = true;
|
||||||
public string MasterServer = "http://master.open-ra.org/";
|
public string MasterServer = "http://master.open-ra.org/";
|
||||||
public bool AllowCheats = false;
|
public bool AllowCheats = false;
|
||||||
|
|||||||
@@ -49,22 +49,21 @@ namespace OpenRA.Server
|
|||||||
shutdown = true;
|
shutdown = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Server(ModData modData, Settings settings, string map)
|
public Server(IPAddress ip, int port, string serverName, string[] mods, string map, ModData modData)
|
||||||
{
|
{
|
||||||
Log.AddChannel("server", "server.log");
|
Log.AddChannel("server", "server.log");
|
||||||
|
listener = new TcpListener(ip, port);
|
||||||
listener = new TcpListener(IPAddress.Any, settings.Server.ListenPort);
|
Name = serverName;
|
||||||
Name = settings.Server.Name;
|
|
||||||
randomSeed = (int)DateTime.Now.ToBinary();
|
randomSeed = (int)DateTime.Now.ToBinary();
|
||||||
ModData = modData;
|
ModData = modData;
|
||||||
|
|
||||||
foreach (var trait in modData.Manifest.ServerTraits)
|
foreach (var trait in modData.Manifest.ServerTraits)
|
||||||
ServerTraits.Add( modData.ObjectCreator.CreateObject<ServerTrait>(trait) );
|
ServerTraits.Add( modData.ObjectCreator.CreateObject<ServerTrait>(trait) );
|
||||||
|
|
||||||
lobbyInfo = new Session( settings.Game.Mods );
|
lobbyInfo = new Session( mods );
|
||||||
lobbyInfo.GlobalSettings.RandomSeed = randomSeed;
|
lobbyInfo.GlobalSettings.RandomSeed = randomSeed;
|
||||||
lobbyInfo.GlobalSettings.Map = map;
|
lobbyInfo.GlobalSettings.Map = map;
|
||||||
lobbyInfo.GlobalSettings.ServerName = settings.Server.Name;
|
lobbyInfo.GlobalSettings.ServerName = serverName;
|
||||||
|
|
||||||
foreach (var t in ServerTraits.WithInterface<INotifyServerStart>())
|
foreach (var t in ServerTraits.WithInterface<INotifyServerStart>())
|
||||||
t.ServerStarted(this);
|
t.ServerStarted(this);
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using OpenRA.FileFormats;
|
using OpenRA.FileFormats;
|
||||||
|
using System.Net;
|
||||||
using OpenRA.Network;
|
using OpenRA.Network;
|
||||||
using OpenRA.Server;
|
using OpenRA.Server;
|
||||||
using OpenRA.Widgets;
|
using OpenRA.Widgets;
|
||||||
@@ -68,8 +69,8 @@ namespace OpenRA.Mods.Cnc.Widgets
|
|||||||
Menu = MenuType.None;
|
Menu = MenuType.None;
|
||||||
Widget.OpenWindow("SERVERBROWSER_PANEL", new Dictionary<string, object>()
|
Widget.OpenWindow("SERVERBROWSER_PANEL", new Dictionary<string, object>()
|
||||||
{
|
{
|
||||||
{"onExit", new Action(ReturnToMultiplayerMenu)},
|
{ "onExit", new Action(() => ReturnToMenu(MenuType.Multiplayer)) },
|
||||||
{ "openLobby", new Action(() => OpenLobbyPanel(MenuType.Main)) }
|
{ "openLobby", new Action(() => OpenLobbyPanel(MenuType.Multiplayer)) }
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -78,7 +79,7 @@ namespace OpenRA.Mods.Cnc.Widgets
|
|||||||
Menu = MenuType.None;
|
Menu = MenuType.None;
|
||||||
Widget.OpenWindow("CREATESERVER_PANEL", new Dictionary<string, object>()
|
Widget.OpenWindow("CREATESERVER_PANEL", new Dictionary<string, object>()
|
||||||
{
|
{
|
||||||
{ "onExit", new Action(ReturnToMultiplayerMenu) },
|
{ "onExit", new Action(() => ReturnToMenu(MenuType.Multiplayer)) },
|
||||||
{ "openLobby", new Action(() => OpenLobbyPanel(MenuType.Multiplayer)) }
|
{ "openLobby", new Action(() => OpenLobbyPanel(MenuType.Multiplayer)) }
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -88,7 +89,7 @@ namespace OpenRA.Mods.Cnc.Widgets
|
|||||||
Menu = MenuType.None;
|
Menu = MenuType.None;
|
||||||
Widget.OpenWindow("DIRECTCONNECT_PANEL", new Dictionary<string, object>()
|
Widget.OpenWindow("DIRECTCONNECT_PANEL", new Dictionary<string, object>()
|
||||||
{
|
{
|
||||||
{ "onExit", new Action(ReturnToMultiplayerMenu) },
|
{ "onExit", new Action(() => ReturnToMenu(MenuType.Multiplayer)) },
|
||||||
{ "openLobby", new Action(() => OpenLobbyPanel(MenuType.Multiplayer)) }
|
{ "openLobby", new Action(() => OpenLobbyPanel(MenuType.Multiplayer)) }
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -103,9 +104,9 @@ namespace OpenRA.Mods.Cnc.Widgets
|
|||||||
settingsMenu.GetWidget<CncMenuButtonWidget>("BACK_BUTTON").OnClick = () => Menu = MenuType.Main;
|
settingsMenu.GetWidget<CncMenuButtonWidget>("BACK_BUTTON").OnClick = () => Menu = MenuType.Main;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReturnToMultiplayerMenu()
|
void ReturnToMenu(MenuType menu)
|
||||||
{
|
{
|
||||||
Menu = MenuType.Multiplayer;
|
Menu = menu;
|
||||||
Widget.CloseWindow();
|
Widget.CloseWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,18 +119,10 @@ namespace OpenRA.Mods.Cnc.Widgets
|
|||||||
|
|
||||||
void OpenLobbyPanel(MenuType menu)
|
void OpenLobbyPanel(MenuType menu)
|
||||||
{
|
{
|
||||||
// Quit the lobby: disconnect and restore menu
|
|
||||||
Action onLobbyClose = () =>
|
|
||||||
{
|
|
||||||
Game.DisconnectOnly();
|
|
||||||
Menu = menu;
|
|
||||||
Widget.CloseWindow();
|
|
||||||
};
|
|
||||||
|
|
||||||
Menu = MenuType.None;
|
Menu = MenuType.None;
|
||||||
Game.OpenWindow("SERVER_LOBBY", new Dictionary<string, object>()
|
Game.OpenWindow("SERVER_LOBBY", new Dictionary<string, object>()
|
||||||
{
|
{
|
||||||
{ "onExit", onLobbyClose },
|
{ "onExit", new Action(() => { Game.DisconnectOnly(); ReturnToMenu(menu); }) },
|
||||||
{ "onStart", new Action(RemoveShellmapUI) }
|
{ "onStart", new Action(RemoveShellmapUI) }
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -138,14 +131,11 @@ namespace OpenRA.Mods.Cnc.Widgets
|
|||||||
{
|
{
|
||||||
var map = Game.modData.AvailableMaps.FirstOrDefault(m => m.Value.Selectable).Key;
|
var map = Game.modData.AvailableMaps.FirstOrDefault(m => m.Value.Selectable).Key;
|
||||||
|
|
||||||
var settings = Game.Settings;
|
Game.CreateLocalServer(map);
|
||||||
settings.Server.Name = "Skirmish Game";
|
CncConnectingLogic.Connect(IPAddress.Loopback.ToString(),
|
||||||
// TODO: we want to prevent binding a port altogether
|
Game.Settings.Server.LoopbackPort,
|
||||||
settings.Server.ListenPort = 1234;
|
new Action(() => OpenLobbyPanel(MenuType.Main)),
|
||||||
settings.Server.ExternalPort = 1234;
|
new Action(() => ReturnToMenu(MenuType.Main)));
|
||||||
Game.CreateAndJoinServer(settings, map);
|
|
||||||
|
|
||||||
OpenLobbyPanel(MenuType.Main);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,14 +71,24 @@ namespace OpenRA.Mods.Cnc.Widgets
|
|||||||
|
|
||||||
void CreateAndJoin()
|
void CreateAndJoin()
|
||||||
{
|
{
|
||||||
Game.Settings.Server.Name = panel.GetWidget<TextFieldWidget>("SERVER_NAME").Text;
|
var name = panel.GetWidget<TextFieldWidget>("SERVER_NAME").Text;
|
||||||
Game.Settings.Server.ListenPort = int.Parse(panel.GetWidget<TextFieldWidget>("LISTEN_PORT").Text);
|
int listenPort, externalPort;
|
||||||
Game.Settings.Server.ExternalPort = int.Parse(panel.GetWidget<TextFieldWidget>("EXTERNAL_PORT").Text);
|
if (!int.TryParse(panel.GetWidget<TextFieldWidget>("LISTEN_PORT").Text, out listenPort))
|
||||||
|
listenPort = 1234;
|
||||||
|
|
||||||
|
if (!int.TryParse(panel.GetWidget<TextFieldWidget>("EXTERNAL_PORT").Text, out externalPort))
|
||||||
|
externalPort = 1234;
|
||||||
|
|
||||||
|
// Save new settings
|
||||||
|
Game.Settings.Server.Name = name;
|
||||||
|
Game.Settings.Server.ListenPort = listenPort;
|
||||||
|
Game.Settings.Server.ExternalPort = externalPort;
|
||||||
Game.Settings.Server.AdvertiseOnline = advertiseOnline;
|
Game.Settings.Server.AdvertiseOnline = advertiseOnline;
|
||||||
Game.Settings.Server.LastMap = map.Uid;
|
Game.Settings.Server.LastMap = map.Uid;
|
||||||
Game.Settings.Save();
|
Game.Settings.Save();
|
||||||
|
|
||||||
Game.CreateServer(Game.Settings, map.Uid);
|
// Create and join the server
|
||||||
|
Game.CreateServer(listenPort, name, map.Uid);
|
||||||
Widget.CloseWindow();
|
Widget.CloseWindow();
|
||||||
CncConnectingLogic.Connect(IPAddress.Loopback.ToString(), Game.Settings.Server.ListenPort, onCreate, onExit);
|
CncConnectingLogic.Connect(IPAddress.Loopback.ToString(), Game.Settings.Server.ListenPort, onCreate, onExit);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,8 +33,9 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
|
|||||||
settings.Server.ListenPort = int.Parse(cs.GetWidget<TextFieldWidget>("LISTEN_PORT").Text);
|
settings.Server.ListenPort = int.Parse(cs.GetWidget<TextFieldWidget>("LISTEN_PORT").Text);
|
||||||
settings.Server.ExternalPort = int.Parse(cs.GetWidget<TextFieldWidget>("EXTERNAL_PORT").Text);
|
settings.Server.ExternalPort = int.Parse(cs.GetWidget<TextFieldWidget>("EXTERNAL_PORT").Text);
|
||||||
settings.Save();
|
settings.Save();
|
||||||
|
|
||||||
Game.CreateAndJoinServer(settings, map);
|
Game.CreateServer(settings.Server.ListenPort, settings.Server.Name, map);
|
||||||
|
Game.JoinServer(IPAddress.Loopback.ToString(), settings.Server.ListenPort);
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user