Beispiel #1
0
        public bool StartServer()
        {
            DisplayTimerProperties();

            if (_listener != null)
            {
                return(false);                               // Already started
            }
            try
            {
                Log.Info("Initializing...");

                if (ServerRole == ServerRole.Full || ServerRole == ServerRole.Proxy)
                {
                    if (IsEdu)
                    {
                        EduTokenManager = new EduTokenManager();
                    }

                    if (Endpoint == null)
                    {
                        var ip   = IPAddress.Parse(Config.GetProperty("ip", "0.0.0.0"));
                        int port = Config.GetProperty("port", 19132);
                        Endpoint = new IPEndPoint(ip, port);
                    }
                }

                ServerManager = ServerManager ?? new DefaultServerManager(this);

                if (ServerRole == ServerRole.Full || ServerRole == ServerRole.Node)
                {
                    Log.Info("Loading plugins...");
                    PluginManager = new PluginManager();
                    PluginManager.LoadPlugins();
                    Log.Info("Plugins loaded!");

                    // Bootstrap server
                    PluginManager.ExecuteStartup(this);

                    GreylistManager = GreylistManager ?? new GreylistManager(this);
                    SessionManager  = SessionManager ?? new SessionManager();
                    LevelManager    = LevelManager ?? new LevelManager();
                    //LevelManager = LevelManager ?? new SpreadLevelManager(1);
                    PlayerFactory = PlayerFactory ?? new PlayerFactory();

                    PluginManager.EnablePlugins(this, LevelManager);

                    // Cache - remove
                    LevelManager.GetLevel(null, Dimension.Overworld.ToString());
                }

                GreylistManager = GreylistManager ?? new GreylistManager(this);
                MotdProvider    = MotdProvider ?? new MotdProvider();

                if (ServerRole == ServerRole.Full || ServerRole == ServerRole.Proxy)
                {
                    _listener = CreateListener();

                    new Thread(ProcessDatagrams)
                    {
                        IsBackground = true
                    }.Start(_listener);
                }

                ServerInfo = new ServerInfo(LevelManager, _playerSessions)
                {
                    MaxNumberOfPlayers = Config.GetProperty("MaxNumberOfPlayers", 1000)
                };
                ServerInfo.MaxNumberOfConcurrentConnects = Config.GetProperty("MaxNumberOfConcurrentConnects", ServerInfo.MaxNumberOfPlayers);

                _tickerHighPrecisionTimer = new HighPrecisionTimer(10, SendTick, true);

                Log.Info("Server open for business on port " + Endpoint?.Port + " ...");

                return(true);
            }
            catch (Exception e)
            {
                Log.Error("Error during startup!", e);
                StopServer();
            }

            return(false);
        }
Beispiel #2
0
        public bool StartServer()
        {
            int threads;
            int iothreads;

            ThreadPool.GetMinThreads(out threads, out iothreads);
            ThreadPool.SetMinThreads(threads, iothreads * 4);

            if (_listener != null)
            {
                return(false);                               // Already started
            }
            try
            {
                Log.Info("Initializing...");

                InacvitityTimeout = Config.GetProperty("InactivityTimeout", 8500);

                if (Endpoint == null)
                {
                    var ip   = IPAddress.Parse(Config.GetProperty("ip", "0.0.0.0"));
                    int port = Config.GetProperty("port", 19132);
                    Endpoint = new IPEndPoint(ip, port);
                }

                ForwardAllPlayers = Config.GetProperty("ForwardAllPlayers", false);
                if (ForwardAllPlayers)
                {
                    var ip   = IPAddress.Parse(Config.GetProperty("ForwardIP", "127.0.0.1"));
                    int port = Config.GetProperty("ForwardPort", 19132);
                    ForwardTarget = new IPEndPoint(ip, port);
                }

                Log.Info("Loading plugins...");
                PluginManager = new PluginManager();
                PluginManager.LoadPlugins();
                Log.Info("Plugins loaded!");

                // Bootstrap server
                PluginManager.ExecuteStartup(this);

                MotdProvider = MotdProvider ?? new MotdProvider();

                IsSecurityEnabled = Config.GetProperty("EnableSecurity", false);
                if (IsSecurityEnabled)
                {
                    // http://www.asp.net/identity/overview/extensibility/overview-of-custom-storage-providers-for-aspnet-identity
                    UserManager = UserManager ?? new UserManager <User>(new DefaultUserStore());
                    RoleManager = RoleManager ?? new RoleManager <Role>(new DefaultRoleStore());
                }

                GreylistManager = GreylistManager ?? new GreylistManager(this);
                SessionManager  = SessionManager ?? new SessionManager();
                LevelManager    = LevelManager ?? new LevelManager();
                PlayerFactory   = PlayerFactory ?? new PlayerFactory();

                PluginManager.EnablePlugins(this, LevelManager);

                // Cache - remove
                LevelManager.GetLevel(null, "Default");

                _listener = new UdpClient(Endpoint);

                if (IsRunningOnMono())
                {
                    _listener.Client.ReceiveBufferSize = 1024 * 1024 * 3;
                    _listener.Client.SendBufferSize    = 4096;
                }
                else
                {
                    //_listener.Client.ReceiveBufferSize = 1600*40000;
                    _listener.Client.ReceiveBufferSize = int.MaxValue;
                    //_listener.Client.SendBufferSize = 1600*40000;
                    _listener.Client.SendBufferSize = int.MaxValue;
                    _listener.DontFragment          = false;
                    _listener.EnableBroadcast       = false;

                    // SIO_UDP_CONNRESET (opcode setting: I, T==3)
                    // Windows:  Controls whether UDP PORT_UNREACHABLE messages are reported.
                    // - Set to TRUE to enable reporting.
                    // - Set to FALSE to disable reporting.

                    uint IOC_IN            = 0x80000000;
                    uint IOC_VENDOR        = 0x18000000;
                    uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
                    _listener.Client.IOControl((int)SIO_UDP_CONNRESET, new byte[] { Convert.ToByte(false) }, null);

                    //
                    //WARNING: We need to catch errors here to remove the code above.
                    //
                }

                _ackTimer     = new Timer(SendAckQueue, null, 0, 10);
                _cleanerTimer = new Timer(Update, null, 10, Timeout.Infinite);

                _listener.BeginReceive(ReceiveCallback, _listener);

                // Measure latency through system
                //_internalPingTimer = new Timer(delegate(object state)
                //{
                //	var playerSession = _playerSessions.Values.FirstOrDefault();
                //	if (playerSession != null)
                //	{
                //		var ping = new InternalPing();
                //		ping.Timer.Start();
                //		HandlePackage(ping, playerSession);
                //	}
                //}, null, 1000, 1000);

                ServerInfo = new ServerInfo(LevelManager, _playerSessions)
                {
                    MaxNumberOfPlayers = Config.GetProperty("MaxNumberOfPlayers", 1000)
                };
                ServerInfo.MaxNumberOfConcurrentConnects = Config.GetProperty("MaxNumberOfConcurrentConnects", ServerInfo.MaxNumberOfPlayers);

                Log.Info("Server open for business on port " + Endpoint.Port + " ...");

                return(true);
            }
            catch (Exception e)
            {
                Log.Error("Error during startup!", e);
                StopServer();
            }

            return(false);
        }