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