Support loopback servers for solo play

This commit is contained in:
Paul Chote
2011-05-10 17:29:32 +12:00
parent b1a6eec3d3
commit 33a4f5e29e
6 changed files with 50 additions and 45 deletions

View File

@@ -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)

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);
} }
} }
} }

View File

@@ -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);
} }

View File

@@ -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;
}; };