示例#1
0
        public CompiledMetafile(Metafile file)
        {
            Name   = file.Name;
            Source = file;

            byte[] buffer;

            using (var metaFileStream = new MemoryStream())
            {
                using (var metaFileWriter = new BinaryWriter(metaFileStream, Encoding.GetEncoding(949), true))
                {
                    metaFileWriter.Write((byte)(file.Nodes.Count / 256));
                    metaFileWriter.Write((byte)(file.Nodes.Count % 256));
                    foreach (var node in file.Nodes)
                    {
                        buffer = Encoding.GetEncoding(949).GetBytes(node.Text);
                        metaFileWriter.Write((byte)buffer.Length);
                        metaFileWriter.Write(buffer);
                        metaFileWriter.Write((byte)(node.Properties.Count / 256));
                        metaFileWriter.Write((byte)(node.Properties.Count % 256));
                        foreach (var property in node.Properties)
                        {
                            buffer = Encoding.GetEncoding(949).GetBytes(property);
                            metaFileWriter.Write((byte)(buffer.Length / 256));
                            metaFileWriter.Write((byte)(buffer.Length % 256));
                            metaFileWriter.Write(buffer);
                        }
                    }
                }

                Checksum = ~Crc32.Calculate(metaFileStream.ToArray());

                using (var compressedMetaFileStream = new MemoryStream())
                {
                    ZlibCompression.Compress(metaFileStream, compressedMetaFileStream);
                    Data = compressedMetaFileStream.ToArray();
                }
            }
        }
示例#2
0
        public CompiledMetafile(Metafile file)
        {
            Name   = file.Name;
            Source = file;

            using (var metaFileStream = new MemoryStream())
            {
                using (var metaFileWriter = new BinaryWriter(metaFileStream, CodePagesEncodingProvider.Instance.GetEncoding(949), true))
                {
                    metaFileWriter.Write((byte)(file.Nodes.Count / 256));
                    metaFileWriter.Write((byte)(file.Nodes.Count % 256));
                    foreach (var node in file.Nodes)
                    {
                        byte[] nodeBuffer = CodePagesEncodingProvider.Instance.GetEncoding(949).GetBytes(node.Text);
                        metaFileWriter.Write((byte)nodeBuffer.Length);
                        metaFileWriter.Write(nodeBuffer);
                        metaFileWriter.Write((byte)(node.Properties.Count / 256));
                        metaFileWriter.Write((byte)(node.Properties.Count % 256));
                        foreach (var property in node.Properties)
                        {
                            byte[] propertyBuffer = CodePagesEncodingProvider.Instance.GetEncoding(949).GetBytes(property);
                            metaFileWriter.Write((byte)(propertyBuffer.Length / 256));
                            metaFileWriter.Write((byte)(propertyBuffer.Length % 256));
                            metaFileWriter.Write(propertyBuffer);
                        }
                    }
                }

                Checksum = ~Crc32.Calculate(metaFileStream.ToArray());
                metaFileStream.Seek(0, SeekOrigin.Begin);

                using (var compressedMetaFileStream = new MemoryStream())
                {
                    ZlibCompression.Compress(metaFileStream, compressedMetaFileStream);
                    Data = compressedMetaFileStream.ToArray();
                }
            }
        }
示例#3
0
文件: Game.cs 项目: Caeldeth/server
        public static void Main(string[] args)
        {
            // Make our window nice and big
            Console.SetWindowSize(140, 36);
            LogLevel     = Hybrasyl.Constants.DEFAULT_LOG_LEVEL;
            Assemblyinfo = new AssemblyInfo(Assembly.GetEntryAssembly());


            Constants.DataDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Hybrasyl");

            if (!Directory.Exists(Constants.DataDirectory))
            {
                Logger.InfoFormat("Creating data directory {0}", Constants.DataDirectory);
                try
                {
                    // Create the various directories we need
                    Directory.CreateDirectory(Constants.DataDirectory);
                    Directory.CreateDirectory(Path.Combine(Constants.DataDirectory, "maps"));
                    Directory.CreateDirectory(Path.Combine(Constants.DataDirectory, "scripts"));
                    Directory.CreateDirectory(Path.Combine(Constants.DataDirectory, "world"));
                }
                catch (Exception e)
                {
                    Logger.ErrorFormat("Can't create data directory: {0}", e.ToString());
                    return;
                }
            }

            var hybconfig = Path.Combine(Constants.DataDirectory, "config.xml");

            if (File.Exists(hybconfig))
            {
                try
                {
                    Config = Serializer.Deserialize(XmlReader.Create(hybconfig), new HybrasylConfig());
                    Logger.Info("Configuration file loaded.");
                }
                catch (Exception e)
                {
                    Logger.ErrorFormat("The config file {0} could not be parsed: {1}", hybconfig, e);
                }
            }
            else
            {
                var validConfig = false;
                while (validConfig == false)
                {
                    try
                    {
                        Config      = GatherConfig();
                        validConfig = true;
                    }
                    catch (Exception e)
                    {
                        Logger.ErrorFormat("Some of the values you entered were invalid. Try again. Error was: {0}",
                                           e.ToString());
                    }
                }
                // Write out our configuration
                XML.Serializer.Serialize(new XmlTextWriter(hybconfig, null), Config);
                Console.WriteLine("Configuration has been written. Press any key to start the server.");
                Console.ReadKey();
            }

            //set up service endpoint for ControlService

            var host = new WebServiceHost(typeof(ControlService), new Uri($"http://{Config.ApiEndpoints.ControlService?.BindAddress ?? "127.0.0.1"}:{Config.ApiEndpoints.ControlService?.Port ?? Constants.ControlServicePort}/ControlService"));

            host.Open();
            Logger.InfoFormat($"Starting ControlService on port {Config.ApiEndpoints.ControlService?.Port ?? Constants.ControlServicePort}");

            // Set default logging level
            ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root.Level = Level.Info;
            ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).RaiseConfigurationChanged(
                EventArgs.Empty);

            // Set console buffer, so we can scroll back a bunch
            Console.BufferHeight = Int16.MaxValue - 1;

            Logger.InfoFormat("Hybrasyl {0} starting.", Assemblyinfo.Version);
            Logger.InfoFormat("{0} - this program is licensed under the GNU AGPL, version 3.", Assemblyinfo.Copyright);

            LoadCollisions();

            // For right now we don't support binding to different addresses; the support in the XML
            // is for a distant future where that may be desirable.
            IpAddress = IPAddress.Parse(Config.Network.Lobby.BindAddress);
            Lobby     = new Lobby(Config.Network.Lobby.Port);
            Login     = new Login(Config.Network.Login.Port);
            World     = new World(Config.Network.World.Port, Config.DataStore);

            Lobby.StopToken = CancellationTokenSource.Token;
            Login.StopToken = CancellationTokenSource.Token;
            World.StopToken = CancellationTokenSource.Token;

            _monolith        = new Monolith();
            _monolithControl = new MonolithControl();


            if (!World.InitWorld())
            {
                Logger.FatalFormat("Hybrasyl cannot continue loading. Press any key to exit.");
                Console.ReadKey();
                Environment.Exit(1);
            }

            byte[] addressBytes;
            addressBytes = IpAddress.GetAddressBytes();
            Array.Reverse(addressBytes);

            using (var multiServerTableStream = new MemoryStream())
            {
                using (var multiServerTableWriter = new BinaryWriter(multiServerTableStream, Encoding.GetEncoding(949), true))
                {
                    multiServerTableWriter.Write((byte)1);
                    multiServerTableWriter.Write((byte)1);
                    multiServerTableWriter.Write(addressBytes);
                    multiServerTableWriter.Write((byte)(2611 / 256));
                    multiServerTableWriter.Write((byte)(2611 % 256));
                    multiServerTableWriter.Write(Encoding.GetEncoding(949).GetBytes("Hybrasyl;Hybrasyl Production\0"));
                }

                ServerTableCrc = ~Crc32.Calculate(multiServerTableStream.ToArray());

                using (var compressedMultiServerTableStream = new MemoryStream())
                {
                    ZlibCompression.Compress(multiServerTableStream, compressedMultiServerTableStream);
                    ServerTable = compressedMultiServerTableStream.ToArray();
                }
            }

            using (var stipulationStream = new MemoryStream())
            {
                using (var stipulationWriter = new StreamWriter(stipulationStream, Encoding.GetEncoding(949), 1024, true))
                {
                    var serverMsgFileName = Path.Combine(Constants.DataDirectory, "server.msg");

                    if (File.Exists(serverMsgFileName))
                    {
                        stipulationWriter.Write(File.ReadAllText(serverMsgFileName));
                    }
                    else
                    {
                        stipulationWriter.Write($"Welcome to Hybrasyl!\n\nThis is Hybrasyl (version {Assemblyinfo.Version}).\n\nFor more information please visit http://www.hybrasyl.com");
                        if (string.IsNullOrEmpty(Motd))
                        {
                            Motd = ControlService.GetMotd();
                        }
                        stipulationWriter.Write($"\n\n{Motd}");
                    }
                }

                NotificationCrc = ~Crc32.Calculate(stipulationStream.ToArray());

                using (var compressedStipulationStream = new MemoryStream())
                {
                    ZlibCompression.Compress(stipulationStream, compressedStipulationStream);
                    Notification = compressedStipulationStream.ToArray();
                }
            }

            World.StartTimers();
            World.StartQueueConsumer();
            World.StartControlConsumers();

            ToggleActive();
            StartDate = DateTime.Now;

            _lobbyThread = new Thread(new ThreadStart(Lobby.StartListening));
            _loginThread = new Thread(new ThreadStart(Login.StartListening));
            _worldThread = new Thread(new ThreadStart(World.StartListening));

            _spawnThread   = new Thread(_monolith.Start);
            _controlThread = new Thread(_monolithControl.Start);

            _lobbyThread.Start();
            _loginThread.Start();
            _worldThread.Start();
            _spawnThread.Start();
            _controlThread.Start();

            while (true)
            {
                if (!IsActive())
                {
                    CancellationTokenSource.Cancel();
                    break;
                }
                Thread.Sleep(5);
            }

            Logger.Warn("Hybrasyl: all servers shutting down");

            // Server is shutting down. For Lobby and Login, this terminates the TCP listeners;
            // for World, this triggers a logoff for all logged in users and then terminates. After
            // termination, the queue consumer is stopped as well.
            // For a true restart we'll need to do a few other things; stop timers, etc.

            host.Close();
            Lobby.Shutdown();
            Login.Shutdown();
            World.Shutdown();
            World.StopQueueConsumer();
            World.StopControlConsumers();
            Logger.WarnFormat("Hybrasyl {0}: shutdown complete.", Assemblyinfo.Version);
            Environment.Exit(0);
        }