Пример #1
0
 public ServerSettings(ServerSettings other)
 {
     Name = other.Name;
     ListenPort = other.ListenPort;
     ExternalPort = other.ExternalPort;
     AdvertiseOnline = other.AdvertiseOnline;
     MasterServer = other.MasterServer;
     AllowCheats = other.AllowCheats;
     Map = other.Map;
 }
Пример #2
0
        void CreateAndJoin()
        {
            var name = panel.Get<TextFieldWidget>("SERVER_NAME").Text;
            int listenPort, externalPort;
            if (!int.TryParse(panel.Get<TextFieldWidget>("LISTEN_PORT").Text, out listenPort))
                listenPort = 1234;

            if (!int.TryParse(panel.Get<TextFieldWidget>("EXTERNAL_PORT").Text, out externalPort))
                externalPort = 1234;

            var passwordField = panel.GetOrNull<PasswordFieldWidget>("PASSWORD");
            var password = passwordField != null ? passwordField.Text : "";

            // 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.AllowPortForward = allowPortForward;
            Game.Settings.Server.Map = map.Uid;
            Game.Settings.Server.Password = password;
            Game.Settings.Save();

            // Take a copy so that subsequent changes don't affect the server
            var settings = new ServerSettings(Game.Settings.Server);

            // Create and join the server
            Game.CreateServer(settings);
            Ui.CloseWindow();
            ConnectionLogic.Connect(IPAddress.Loopback.ToString(), Game.Settings.Server.ListenPort, password, onCreate, onExit);
        }
Пример #3
0
        public Server(IPEndPoint endpoint, string[] mods, ServerSettings settings, ModData modData)
        {
            Log.AddChannel("server", "server.log");

            pState = ServerState.WaitingPlayers;
            listener = new TcpListener(endpoint);
            listener.Start();
            var localEndpoint = (IPEndPoint)listener.LocalEndpoint;
            Ip = localEndpoint.Address;
            Port = localEndpoint.Port;

            Settings = settings;
            ModData = modData;

            randomSeed = (int)DateTime.Now.ToBinary();

            if (Settings.AllowPortForward)
                UPnP.ForwardPort();

            foreach (var trait in modData.Manifest.ServerTraits)
                ServerTraits.Add(modData.ObjectCreator.CreateObject<ServerTrait>(trait));

            lobbyInfo = new Session(mods);
            lobbyInfo.GlobalSettings.RandomSeed = randomSeed;
            lobbyInfo.GlobalSettings.Map = settings.Map;
            lobbyInfo.GlobalSettings.ServerName = settings.Name;
            lobbyInfo.GlobalSettings.Dedicated = settings.Dedicated;
            FieldLoader.Load(lobbyInfo.GlobalSettings, modData.Manifest.LobbyDefaults);

            foreach (var t in ServerTraits.WithInterface<INotifyServerStart>())
                t.ServerStarted(this);

            Log.Write("server", "Initial mods: ");
            foreach (var m in lobbyInfo.GlobalSettings.Mods)
                Log.Write("server","- {0}", m);

            Log.Write("server", "Initial map: {0}",lobbyInfo.GlobalSettings.Map);

            new Thread( _ =>
            {
                var timeout = ServerTraits.WithInterface<ITick>().Min(t => t.TickTimeout);
                for (;;)
                {
                    var checkRead = new List<Socket>();
                    checkRead.Add(listener.Server);
                    foreach (var c in conns) checkRead.Add(c.socket);
                    foreach (var c in preConns) checkRead.Add(c.socket);

                    Socket.Select(checkRead, null, null, timeout);
                    if (State == ServerState.ShuttingDown)
                    {
                        EndGame();
                        break;
                    }

                    foreach (var s in checkRead)
                        if (s == listener.Server) AcceptConnection();
                        else if (preConns.Count > 0)
                        {
                            var p = preConns.SingleOrDefault(c => c.socket == s);
                            if (p != null) p.ReadData(this);
                        }
                        else if (conns.Count > 0)
                        {
                            var conn = conns.SingleOrDefault(c => c.socket == s);
                            if (conn != null) conn.ReadData(this);
                        }

                    foreach (var t in ServerTraits.WithInterface<ITick>())
                        t.Tick(this);

                    if (State == ServerState.ShuttingDown)
                    {
                        EndGame();
                        if (Settings.AllowPortForward) UPnP.RemovePortforward();
                        break;
                    }
                }

                foreach (var t in ServerTraits.WithInterface<INotifyServerShutdown>())
                    t.ServerShutdown(this);

                preConns.Clear();
                conns.Clear();
                try { listener.Stop(); }
                catch { }
            } ) { IsBackground = true }.Start();
        }
Пример #4
0
 public ServerSettings(ServerSettings other)
 {
     Name = other.Name;
     ListenPort = other.ListenPort;
     ExternalPort = other.ExternalPort;
     AdvertiseOnline = other.AdvertiseOnline;
     MasterServer = other.MasterServer;
     AllowUPnP = other.AllowUPnP;
     AllowCheats = other.AllowCheats;
     Map = other.Map;
     Ban = other.Ban;
     TimeOut = other.TimeOut;
     Dedicated = other.Dedicated;
     DedicatedLoop = other.DedicatedLoop;
 }
Пример #5
0
        Action ResetAdvancedPanel(Widget panel)
        {
            var ds = Game.Settings.Debug;
            var ss = Game.Settings.Server;
            var dds = new DebugSettings();
            var dss = new ServerSettings();

            return () =>
            {
                ss.DiscoverNatDevices = dss.DiscoverNatDevices;
                ss.VerboseNatDiscovery = dss.VerboseNatDiscovery;
                ds.PerfText = dds.PerfText;
                ds.PerfGraph = dds.PerfGraph;
                ds.SanityCheckUnsyncedCode = dds.SanityCheckUnsyncedCode;
                ds.BotDebug = dds.BotDebug;
                ds.ShowFatalErrorDialog = dds.ShowFatalErrorDialog;
            };
        }
Пример #6
0
        public Server(IPEndPoint endpoint, string[] mods, ServerSettings settings, ModData modData)
        {
            Log.AddChannel("server", "server.log");

            pState = ServerState.WaitingPlayers;
            listener = new TcpListener(endpoint);
            listener.Start();
            var localEndpoint = (IPEndPoint)listener.LocalEndpoint;
            Ip = localEndpoint.Address;
            Port = localEndpoint.Port;

            Settings = settings;
            ModData = modData;

            randomSeed = (int)DateTime.Now.ToBinary();

            if (Settings.AllowUPnP)
            {
                try
                {
                    if (UPnP.NAT.Discover())
                        {
                            Log.Write("server", "UPnP-enabled router discovered.");
                            Log.Write("server", "Your IP is: {0}", UPnP.NAT.GetExternalIP() );
                        }
                        else
                        {
                            Log.Write("server", "No UPnP-enabled router detected.");
                            Settings.AllowUPnP = false;
                        }
                }
                catch (Exception e)
                {
                    OpenRA.Log.Write("server", "Can't discover UPnP-enabled routers: {0}", e);
                    Settings.AllowUPnP = false;
                }
            }

            if (Settings.AllowUPnP)
            {
                try
                {
                    if (UPnP.NAT.ForwardPort(Port, ProtocolType.Tcp, "OpenRA"))
                        Log.Write("server", "Port {0} (TCP) has been forwarded.", Port);
                    else
                        Settings.AllowUPnP = false;
                }
                catch (Exception e)
                {
                    OpenRA.Log.Write("server", "Can not forward ports via UPnP: {0}", e);
                    Settings.AllowUPnP = false;
                }
            }

            foreach (var trait in modData.Manifest.ServerTraits)
                ServerTraits.Add( modData.ObjectCreator.CreateObject<ServerTrait>(trait) );

            lobbyInfo = new Session( mods );
            lobbyInfo.GlobalSettings.RandomSeed = randomSeed;
            lobbyInfo.GlobalSettings.Map = settings.Map;
            lobbyInfo.GlobalSettings.ServerName = settings.Name;
            lobbyInfo.GlobalSettings.Ban = settings.Ban;
            lobbyInfo.GlobalSettings.Dedicated = settings.Dedicated;

            foreach (var t in ServerTraits.WithInterface<INotifyServerStart>())
                t.ServerStarted(this);

            Log.Write("server", "Initial mods: ");
            foreach( var m in lobbyInfo.GlobalSettings.Mods )
                Log.Write("server","- {0}", m);

            Log.Write("server", "Initial map: {0}",lobbyInfo.GlobalSettings.Map);

            new Thread( _ =>
            {
                var timeout = ServerTraits.WithInterface<ITick>().Min(t => t.TickTimeout);
                for( ; ; )
                {
                    var checkRead = new ArrayList();
                    checkRead.Add( listener.Server );
                    foreach( var c in conns ) checkRead.Add( c.socket );
                    foreach( var c in preConns ) checkRead.Add( c.socket );

                    Socket.Select( checkRead, null, null, timeout );
                    if (State == ServerState.ShuttingDown)
                    {
                        EndGame();
                        break;
                    }

                    foreach( Socket s in checkRead )
                        if( s == listener.Server ) AcceptConnection();
                        else if (preConns.Count > 0)
                        {
                            var p = preConns.SingleOrDefault( c => c.socket == s );
                            if (p != null) p.ReadData( this );
                        }
                        else if (conns.Count > 0) conns.Single( c => c.socket == s ).ReadData( this );

                    foreach (var t in ServerTraits.WithInterface<ITick>())
                        t.Tick(this);

                    if (State == ServerState.ShuttingDown)
                    {
                        EndGame();
                        break;
                    }
                }

                foreach (var t in ServerTraits.WithInterface<INotifyServerShutdown>())
                    t.ServerShutdown(this);

                preConns.Clear();
                conns.Clear();
                try { listener.Stop(); }
                catch { }
            } ) { IsBackground = true }.Start();
        }
Пример #7
0
 public ServerSettings(ServerSettings other)
 {
     Name = other.Name;
     ListenPort = other.ListenPort;
     ExternalPort = other.ExternalPort;
     AdvertiseOnline = other.AdvertiseOnline;
     MasterServer = other.MasterServer;
     DiscoverNatDevices = other.DiscoverNatDevices;
     AllowPortForward = other.AllowPortForward;
     NatDeviceAvailable = other.NatDeviceAvailable;
     NatDiscoveryTimeout = other.NatDiscoveryTimeout;
     VerboseNatDiscovery = other.VerboseNatDiscovery;
     AllowCheats = other.AllowCheats;
     Map = other.Map;
     Ban = other.Ban;
     TimeOut = other.TimeOut;
     Dedicated = other.Dedicated;
     DedicatedLoop = other.DedicatedLoop;
     LockBots = other.LockBots;
     AllowVersionMismatch = other.AllowVersionMismatch;
 }