public static void Main(string[] args) { AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit); var logRepository = LogManager.GetRepository(System.Reflection.Assembly.GetEntryAssembly()); XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config")); log.Info("Starting ACEmulator..."); Console.Title = @"ACEmulator"; ConfigManager.Initialize(); ServerManager.Initialize(); DatabaseManager.Initialize(); AssetManager.Initialize(); InboundMessageManager.Initialize(); DatabaseManager.Start(); DatManager.Initialize(); GuidManager.Initialize(); SocketManager.Initialize(); WorldManager.Initialize(); CommandManager.Initialize(); RecipeManager.Initialize(); DatabaseManager.Start(); }
public static void Init() { ACFolder = @"j:\AC\"; ACEFolder = @"c:\ACE\"; ConfigManager.Initialize(ACEFolder + "Config.json"); DatManager.Initialize(ACFolder); // load the region file from portal.dat RegionDesc = DatManager.PortalDat.ReadFromDat <RegionDesc>(0x13000000); }
public static void Main(string[] args) { AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit); var logRepository = LogManager.GetRepository(System.Reflection.Assembly.GetEntryAssembly()); XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config")); log.Info("Starting ACEmulator..."); Console.Title = @"ACEmulator"; log.Info("Initializing ConfigManager..."); ConfigManager.Initialize(); log.Info("Initializing ServerManager..."); ServerManager.Initialize(); log.Info("Initializing DatManager..."); DatManager.Initialize(ConfigManager.Config.Server.DatFilesDirectory); log.Info("Initializing DatabaseManager..."); DatabaseManager.Initialize(); log.Info("Starting DatabaseManager..."); DatabaseManager.Start(); log.Info("Initializing GuidManager..."); GuidManager.Initialize(); log.Info("Initializing InboundMessageManager..."); InboundMessageManager.Initialize(); log.Info("Initializing SocketManager..."); SocketManager.Initialize(); log.Info("Initializing WorldManager..."); WorldManager.Initialize(); log.Info("Initializing EventManager..."); EventManager.Initialize(); log.Info("Starting PropertyManager..."); PropertyManager.Initialize(); // This should be last log.Info("Initializing CommandManager..."); CommandManager.Initialize(); }
public static void Main(string[] args) { Console.Title = "ACEmulator"; ConfigManager.Initialise(); DatabaseManager.Initialise(); AssetManager.Initialise(); InboundMessageManager.Initialise(); SocketManager.Initialise(); WorldManager.Initialise(); DatManager.Initialize(); CommandManager.Initialise(); }
public static void Main(string[] args) { AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit); // Init our text encoding options. This will allow us to use more than standard ANSI text, which the client also supports. System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); var logRepository = LogManager.GetRepository(System.Reflection.Assembly.GetEntryAssembly()); XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config")); log.Info("Starting ACEmulator..."); Console.Title = @"ACEmulator"; log.Info("Initializing ConfigManager..."); ConfigManager.Initialize(); log.Info("Initializing ServerManager..."); ServerManager.Initialize(); log.Info("Initializing DatManager..."); DatManager.Initialize(ConfigManager.Config.Server.DatFilesDirectory); log.Info("Initializing DatabaseManager..."); DatabaseManager.Initialize(); log.Info("Starting DatabaseManager..."); DatabaseManager.Start(); log.Info("Initializing GuidManager..."); GuidManager.Initialize(); log.Info("Initializing InboundMessageManager..."); InboundMessageManager.Initialize(); log.Info("Initializing SocketManager..."); SocketManager.Initialize(); log.Info("Initializing WorldManager..."); WorldManager.Initialize(); log.Info("Initializing EventManager..."); EventManager.Initialize(); log.Info("Starting PropertyManager..."); PropertyManager.Initialize(); // This should be last log.Info("Initializing CommandManager..."); CommandManager.Initialize(); }
public static void Main(string[] args) { AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit); log.Info("Starting ACEmulator..."); Console.Title = "ACEmulator"; ConfigManager.Initialize(); DatabaseManager.Initialize(); AssetManager.Initialize(); InboundMessageManager.Initialize(); DatManager.Initialize(); SocketManager.Initialize(); WorldManager.Initialize(); CommandManager.Initialize(); }
public static void Main(string[] args) { AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit); // Typically, you wouldn't force the current culture on an entire application unless you know sure your application is used in a specific region (which ACE is not) // We do this because almost all of the client/user input/output code does not take culture into account, and assumes en-US formatting. // Without this, many commands that require special characters like , and . will break Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); // Init our text encoding options. This will allow us to use more than standard ANSI text, which the client also supports. System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); // Look for the log4net.config first in the current environment directory, then in the ExecutingAssembly location var exeLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var containerConfigDirectory = "/ace/Config"; var log4netConfig = Path.Combine(exeLocation, "log4net.config"); var log4netConfigExample = Path.Combine(exeLocation, "log4net.config.example"); var log4netConfigContainer = Path.Combine(containerConfigDirectory, "log4net.config"); if (IsRunningInContainer && File.Exists(log4netConfigContainer)) { File.Copy(log4netConfigContainer, log4netConfig, true); } var log4netFileInfo = new FileInfo("log4net.config"); if (!log4netFileInfo.Exists) { log4netFileInfo = new FileInfo(log4netConfig); } if (!log4netFileInfo.Exists) { var exampleFile = new FileInfo(log4netConfigExample); if (!exampleFile.Exists) { Console.WriteLine("log4net Configuration file is missing. Please copy the file log4net.config.example to log4net.config and edit it to match your needs before running ACE."); throw new Exception("missing log4net configuration file"); } else { if (!IsRunningInContainer) { Console.WriteLine("log4net Configuration file is missing, cloning from example file."); File.Copy(log4netConfigExample, log4netConfig); } else { if (!File.Exists(log4netConfigContainer)) { Console.WriteLine("log4net Configuration file is missing, ACEmulator is running in a container, cloning from docker file."); var log4netConfigDocker = Path.Combine(exeLocation, "log4net.config.docker"); File.Copy(log4netConfigDocker, log4netConfig); File.Copy(log4netConfigDocker, log4netConfigContainer); } else { File.Copy(log4netConfigContainer, log4netConfig); } } } } var logRepository = LogManager.GetRepository(System.Reflection.Assembly.GetEntryAssembly()); XmlConfigurator.Configure(logRepository, log4netFileInfo); if (Environment.ProcessorCount < 2) { log.Warn("Only one vCPU was detected. ACE may run with limited performance. You should increase your vCPU count for anything more than a single player server."); } // Do system specific initializations here try { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { // On many windows systems, the default resolution for Thread.Sleep is 15.6ms. This allows us to command a tighter resolution MM_BeginPeriod(1); } } catch (Exception ex) { log.Error(ex.ToString()); } log.Info("Starting ACEmulator..."); if (IsRunningInContainer) { log.Info("ACEmulator is running in a container..."); } Console.Title = @$ "ACEmulator - v{ServerBuildInfo.FullVersion}"; var configFile = Path.Combine(exeLocation, "Config.js"); var configConfigContainer = Path.Combine(containerConfigDirectory, "Config.js"); if (IsRunningInContainer && File.Exists(configConfigContainer)) { File.Copy(configConfigContainer, configFile, true); } if (!File.Exists(configFile)) { if (!IsRunningInContainer) { DoOutOfBoxSetup(configFile); } else { if (!File.Exists(configConfigContainer)) { DoOutOfBoxSetup(configFile); File.Copy(configFile, configConfigContainer); } else { File.Copy(configConfigContainer, configFile); } } } log.Info("Initializing ConfigManager..."); ConfigManager.Initialize(); if (ConfigManager.Config.Offline.PurgeDeletedCharacters) { log.Info($"Purging deleted characters, and their possessions, older than {ConfigManager.Config.Offline.PurgeDeletedCharactersDays} days ({DateTime.Now.AddDays(-ConfigManager.Config.Offline.PurgeDeletedCharactersDays)})..."); ShardDatabaseOfflineTools.PurgeCharactersInParallel(ConfigManager.Config.Offline.PurgeDeletedCharactersDays, out var charactersPurged, out var playerBiotasPurged, out var possessionsPurged); log.Info($"Purged {charactersPurged:N0} characters, {playerBiotasPurged:N0} player biotas and {possessionsPurged:N0} possessions."); } if (ConfigManager.Config.Offline.PurgeOrphanedBiotas) { log.Info($"Purging orphaned biotas..."); ShardDatabaseOfflineTools.PurgeOrphanedBiotasInParallel(out var numberOfBiotasPurged); log.Info($"Purged {numberOfBiotasPurged:N0} biotas."); } if (ConfigManager.Config.Offline.AutoUpdateWorldDatabase) { CheckForWorldDatabaseUpdate(); if (ConfigManager.Config.Offline.AutoApplyWorldCustomizations) { AutoApplyWorldCustomizations(); } } else { log.Info($"AutoUpdateWorldDatabase is disabled..."); } if (ConfigManager.Config.Offline.AutoApplyDatabaseUpdates) { AutoApplyDatabaseUpdates(); } else { log.Info($"AutoApplyDatabaseUpdates is disabled..."); } // This is temporary and can be removed in the near future, 2020-04-05 Mag-nus ShardDatabaseOfflineTools.FixAnimPartAndTextureMapFromPR2731(out var numberOfRecordsFixed); log.Info($"Fixed {numberOfRecordsFixed:N0} AnimPart and TextureMap records."); // This is temporary and can be removed in the near future, 2020-04-12 Ripley ShardDatabaseOfflineTools.CheckForPR2918Script(); log.Info("Initializing ServerManager..."); ServerManager.Initialize(); log.Info("Initializing DatManager..."); DatManager.Initialize(ConfigManager.Config.Server.DatFilesDirectory, true); log.Info("Initializing DatabaseManager..."); DatabaseManager.Initialize(); log.Info("Starting DatabaseManager..."); DatabaseManager.Start(); log.Info("Starting PropertyManager..."); PropertyManager.Initialize(); log.Info("Initializing GuidManager..."); GuidManager.Initialize(); if (ConfigManager.Config.Server.ServerPerformanceMonitorAutoStart) { log.Info("Server Performance Monitor auto starting..."); ServerPerformanceMonitor.Start(); } if (ConfigManager.Config.Server.WorldDatabasePrecaching) { log.Info("Precaching Weenies..."); DatabaseManager.World.CacheAllWeeniesInParallel(); log.Info("Precaching Cookbooks..."); DatabaseManager.World.CacheAllCookbooksInParallel(); log.Info("Precaching Events..."); DatabaseManager.World.GetAllEvents(); log.Info("Precaching House Portals..."); DatabaseManager.World.CacheAllHousePortals(); log.Info("Precaching Points Of Interest..."); DatabaseManager.World.CacheAllPointsOfInterest(); log.Info("Precaching Spells..."); DatabaseManager.World.CacheAllSpells(); log.Info("Precaching Treasures - Death..."); DatabaseManager.World.CacheAllTreasuresDeath(); log.Info("Precaching Treasures - Material Base..."); DatabaseManager.World.CacheAllTreasuresMaterialBaseInParallel(); log.Info("Precaching Treasures - Material Groups..."); DatabaseManager.World.CacheAllTreasuresMaterialGroupsInParallel(); log.Info("Precaching Treasures - Material Colors..."); DatabaseManager.World.CacheAllTreasuresMaterialColorInParallel(); log.Info("Precaching Treasures - Wielded..."); DatabaseManager.World.CacheAllTreasuresWieldedInParallel(); } else { log.Info("Precaching World Database Disabled..."); } log.Info("Initializing PlayerManager..."); PlayerManager.Initialize(); log.Info("Initializing HouseManager..."); HouseManager.Initialize(); log.Info("Initializing InboundMessageManager..."); InboundMessageManager.Initialize(); log.Info("Initializing SocketManager..."); SocketManager.Initialize(); log.Info("Initializing WorldManager..."); WorldManager.Initialize(); log.Info("Initializing EventManager..."); EventManager.Initialize(); // Free up memory before the server goes online. This can free up 6 GB+ on larger servers. log.Info("Forcing .net garbage collection..."); for (int i = 0; i < 10; i++) { GC.Collect(); } // This should be last log.Info("Initializing CommandManager..."); CommandManager.Initialize(); if (!PropertyManager.GetBool("world_closed", false).Item) { WorldManager.Open(null); } }
public static void Main(string[] args) { AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit); // Init our text encoding options. This will allow us to use more than standard ANSI text, which the client also supports. System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); var logRepository = LogManager.GetRepository(System.Reflection.Assembly.GetEntryAssembly()); XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config")); if (Environment.ProcessorCount < 2) { log.Warn("Only one vCPU was detected. ACE may run with limited performance. You should increase your vCPU count for anything more than a single player server."); } // Do system specific initializations here try { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { // On many windows systems, the default resolution for Thread.Sleep is 15.6ms. This allows us to command a tighter resolution MM_BeginPeriod(1); } } catch (Exception ex) { log.Error(ex.ToString()); } log.Info("Starting ACEmulator..."); Console.Title = @"ACEmulator"; log.Info("Initializing ConfigManager..."); ConfigManager.Initialize(); if (ConfigManager.Config.Offline.PurgeDeletedCharacters) { log.Info($"Purging deleted characters, and their possessions, older than {ConfigManager.Config.Offline.PurgeDeletedCharactersDays} days ({DateTime.Now.AddDays(-ConfigManager.Config.Offline.PurgeDeletedCharactersDays)})..."); ShardDatabaseOfflineTools.PurgeCharactersInParallel(ConfigManager.Config.Offline.PurgeDeletedCharactersDays, out var charactersPurged, out var playerBiotasPurged, out var possessionsPurged); log.Info($"Purged {charactersPurged:N0} characters, {playerBiotasPurged:N0} player biotas and {possessionsPurged:N0} possessions."); } if (ConfigManager.Config.Offline.PurgeOrphanedBiotas) { log.Info($"Purging orphaned biotas..."); ShardDatabaseOfflineTools.PurgeOrphanedBiotasInParallel(out var numberOfBiotasPurged); log.Info($"Purged {numberOfBiotasPurged:N0} biotas."); } log.Info("Initializing ServerManager..."); ServerManager.Initialize(); log.Info("Initializing DatManager..."); DatManager.Initialize(ConfigManager.Config.Server.DatFilesDirectory, true); log.Info("Initializing DatabaseManager..."); DatabaseManager.Initialize(); log.Info("Starting DatabaseManager..."); DatabaseManager.Start(); log.Info("Starting PropertyManager..."); PropertyManager.Initialize(); log.Info("Initializing GuidManager..."); GuidManager.Initialize(); if (ConfigManager.Config.Server.ServerPerformanceMonitorAutoStart) { log.Info("Server Performance Monitor auto starting..."); ServerPerformanceMonitor.Start(); } if (ConfigManager.Config.Server.WorldDatabasePrecaching) { log.Info("Precaching Weenies..."); DatabaseManager.World.CacheAllWeeniesInParallel(); log.Info("Precaching House Portals..."); DatabaseManager.World.CacheAllHousePortals(); log.Info("Precaching Points Of Interest..."); DatabaseManager.World.CacheAllPointsOfInterest(); log.Info("Precaching Spells..."); DatabaseManager.World.CacheAllSpells(); log.Info("Precaching Events..."); DatabaseManager.World.GetAllEvents(); log.Info("Precaching Death Treasures..."); DatabaseManager.World.CacheAllDeathTreasures(); log.Info("Precaching Wielded Treasures..."); DatabaseManager.World.CacheAllWieldedTreasuresInParallel(); log.Info("Precaching Treasure Materials..."); DatabaseManager.World.CacheAllTreasuresMaterialBaseInParallel(); DatabaseManager.World.CacheAllTreasuresMaterialGroupsInParallel(); log.Info("Precaching Treasure Colors..."); DatabaseManager.World.CacheAllTreasuresMaterialColorInParallel(); log.Info("Precaching Cookbooks..."); DatabaseManager.World.CacheAllCookbooksInParallel(); } else { log.Info("Precaching World Database Disabled..."); } log.Info("Initializing PlayerManager..."); PlayerManager.Initialize(); log.Info("Initializing HouseManager..."); HouseManager.Initialize(); log.Info("Initializing InboundMessageManager..."); InboundMessageManager.Initialize(); log.Info("Initializing SocketManager..."); SocketManager.Initialize(); log.Info("Initializing WorldManager..."); WorldManager.Initialize(); log.Info("Initializing EventManager..."); EventManager.Initialize(); // This should be last log.Info("Initializing CommandManager..."); CommandManager.Initialize(); if (!PropertyManager.GetBool("world_closed", false).Item) { WorldManager.Open(null); } }
public static void Main(string[] args) { AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit); // Init our text encoding options. This will allow us to use more than standard ANSI text, which the client also supports. System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); var logRepository = LogManager.GetRepository(System.Reflection.Assembly.GetEntryAssembly()); XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config")); // Do system specific initializations here try { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { // On many windows systems, the default resolution for Thread.Sleep is 15.6ms. This allows us to command a tighter resolution MM_BeginPeriod(1); } } catch (Exception ex) { log.Error(ex.ToString()); } log.Info("Starting ACEmulator..."); Console.Title = @"ACEmulator"; log.Info("Initializing ConfigManager..."); ConfigManager.Initialize(); log.Info("Initializing ServerManager..."); ServerManager.Initialize(); log.Info("Initializing DatManager..."); DatManager.Initialize(ConfigManager.Config.Server.DatFilesDirectory, true); log.Info("Initializing DatabaseManager..."); DatabaseManager.Initialize(); log.Info("Starting DatabaseManager..."); DatabaseManager.Start(); log.Info("Starting PropertyManager..."); PropertyManager.Initialize(); log.Info("Initializing GuidManager..."); GuidManager.Initialize(); if (ConfigManager.Config.Server.ServerPerformanceMonitorAutoStart) { log.Info("Server Performance Monitor auto starting..."); ServerPerformanceMonitor.Start(); } if (ConfigManager.Config.Server.WorldDatabasePrecaching) { log.Info("Precaching Weenies..."); DatabaseManager.World.CacheAllWeeniesInParallel(); log.Info("Precaching House Portals..."); DatabaseManager.World.CacheAllHousePortals(); log.Info("Precaching Points Of Interest..."); DatabaseManager.World.CacheAllPointsOfInterest(); log.Info("Precaching Spells..."); DatabaseManager.World.CacheAllSpells(); log.Info("Precaching Events..."); DatabaseManager.World.GetAllEvents(); log.Info("Precaching Death Treasures..."); DatabaseManager.World.CacheAllDeathTreasures(); log.Info("Precaching Wielded Treasures..."); DatabaseManager.World.CacheAllWieldedTreasuresInParallel(); log.Info("Precaching Treasure Materials..."); DatabaseManager.World.CacheAllTreasuresMaterialBaseInParallel(); DatabaseManager.World.CacheAllTreasuresMaterialGroupsInParallel(); log.Info("Precaching Treasure Colors..."); DatabaseManager.World.CacheAllTreasuresMaterialColorInParallel(); log.Info("Precaching Cookbooks..."); DatabaseManager.World.CacheAllCookbooksInParallel(); } else { log.Info("Precaching World Database Disabled..."); } log.Info("Initializing PlayerManager..."); PlayerManager.Initialize(); log.Info("Initializing HouseManager..."); HouseManager.Initialize(); log.Info("Initializing InboundMessageManager..."); InboundMessageManager.Initialize(); log.Info("Initializing SocketManager..."); SocketManager.Initialize(); log.Info("Initializing WorldManager..."); WorldManager.Initialize(); log.Info("Initializing EventManager..."); EventManager.Initialize(); // This should be last log.Info("Initializing CommandManager..."); CommandManager.Initialize(); if (!PropertyManager.GetBool("world_closed", false).Item) { WorldManager.Open(null); } }
private void openDatFileToolStripMenuItem_Click(object sender, EventArgs e) { // Show OpenDialog box if (openFileDialog_Dat.ShowDialog() == DialogResult.OK) { this.UseWaitCursor = true; Application.UseWaitCursor = true; Application.DoEvents(); // hack to force the cursor update. Cleaner than DoEvents if (textBoxStatus.Lines.Length > 0) { AddStatus("----------------"); } ClearMapImage(); string datFile = openFileDialog_Dat.FileName; if (DatManager.Initialize(datFile)) { AddStatus($"Loaded {datFile}");; DatManager.ReadDatFile(); string statusMessage = "Successfully read dat file. "; switch (DatManager.DatVersion) { case DatVersionType.ACDM: statusMessage += ("Format is \"AC-DM\" era."); break; case DatVersionType.ACTOD: statusMessage += ("Format is \"AC-TOD\" era."); break; } AddStatus(statusMessage); switch (DatManager.CellDat.Blocksize) { case 0x100: DrawMap(); break; default: AddStatus("Dat file is a PORTAL type file."); PortalHelper ph = new PortalHelper(); var contactSheet = ph.BuildIconContactSheet(); pictureBox1.Image = contactSheet; break; } AddStatus("-Files " + DatManager.CellDat.AllFiles.Count.ToString("N0")); string iteration = DatManager.Iteration; AddStatus("-Iteration " + iteration); var v = new VersionChecker(); string version = v.GetVersionInfo(Path.GetFileName(datFile), iteration); if (version != "") { AddStatus($"-File appears to be from {version}."); if (!v.IsComplete(Path.GetFileName(datFile), iteration)) { AddStatus("This file is not complete in the Asheron's Call Archive. Please consider uploading it at https://mega.nz/megadrop/0WvIiXRRYmg"); } } else { AddStatus("This file does not appear in the Asheron's Call Archive. Please consider uploading it at https://mega.nz/megadrop/0WvIiXRRYmg"); } } else { ClearMapImage(); AddStatus($"ERROR loading {datFile}. Probalby not a valid Asheron's Call dat file."); } } this.UseWaitCursor = false; Application.UseWaitCursor = false; }
private void loadPortalColorsToolStripMenuItem_Click(object sender, EventArgs e) { // Show OpenDialog box if (openFileDialog_Dat.ShowDialog() == DialogResult.OK) { if (textBoxStatus.Lines.Length > 0) { AddStatus("----------------"); } this.UseWaitCursor = true; Application.UseWaitCursor = true; Application.DoEvents(); // hack to force the cursor update. Cleaner than DoEvents string datFile = openFileDialog_Dat.FileName; if (DatManager.Initialize(datFile)) { AddStatus($"Loaded {datFile}");; DatManager.ReadDatFile(); string statusMessage = "Successfully read dat file. "; switch (DatManager.DatVersion) { case DatVersionType.ACDM: statusMessage += ("Format is \"AC-DM\" era."); break; case DatVersionType.ACTOD: statusMessage += ("Format is \"AC-TOD\" era."); break; } AddStatus(statusMessage); switch (DatManager.CellDat.Blocksize) { case 0x100: AddStatus("File is not a portal. No colors have been loaded."); break; default: PortalHelper ph = new PortalHelper(); uint regionId; if (DatManager.DatVersion == DatVersionType.ACDM) { regionId = RegionDesc.HW_FILE_ID; } else { regionId = RegionDesc.FILE_ID; } MapColors = ph.GetColors(regionId); ClearMapImage(); break; } AddStatus("-Files " + DatManager.CellDat.AllFiles.Count.ToString("N0")); string iteration = DatManager.Iteration; AddStatus("-Iteration " + iteration); var v = new VersionChecker(); string version = v.GetVersionInfo(Path.GetFileName(datFile), iteration); if (version != "") { AddStatus($"-File appears to be from {version}."); } else { AddStatus("This file does not appear in the Asheron's Call Archive. Please consider uploading it at https://mega.nz/megadrop/7x-Qh19h5Ek"); } } } this.UseWaitCursor = false; Application.UseWaitCursor = false; }
public static void Main(string[] args) { AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit); // Init our text encoding options. This will allow us to use more than standard ANSI text, which the client also supports. System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); var logRepository = LogManager.GetRepository(System.Reflection.Assembly.GetEntryAssembly()); XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config")); // Do system specific initializations here try { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { // On many windows systems, the default resolution for Thread.Sleep is 15.6ms. This allows us to command a tighter resolution MM_BeginPeriod(1); } } catch (Exception ex) { log.Error(ex.ToString()); } log.Info("Starting ACEmulator..."); Console.Title = @"ACEmulator"; log.Info("Initializing ConfigManager..."); ConfigManager.Initialize(); log.Info("Initializing ServerManager..."); ServerManager.Initialize(); log.Info("Initializing DatManager..."); DatManager.Initialize(ConfigManager.Config.Server.DatFilesDirectory); log.Info("Initializing DatabaseManager..."); DatabaseManager.Initialize(); log.Info("Starting DatabaseManager..."); DatabaseManager.Start(); log.Info("Starting PropertyManager..."); PropertyManager.Initialize(); log.Info("Initializing GuidManager..."); GuidManager.Initialize(); log.Info("Initializing InboundMessageManager..."); InboundMessageManager.Initialize(); log.Info("Initializing SocketManager..."); SocketManager.Initialize(); log.Info("Initializing WorldManager..."); WorldManager.Initialize(); log.Info("Initializing EventManager..."); EventManager.Initialize(); // This should be last log.Info("Initializing CommandManager..."); CommandManager.Initialize(); }
public static void Main(string[] args) { AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit); // Typically, you wouldn't force the current culture on an entire application unless you know sure your application is used in a specific region (which ACE is not) // We do this because almost all of the client/user input/output code does not take culture into account, and assumes en-US formatting. // Without this, many commands that require special characters like , and . will break Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); // Init our text encoding options. This will allow us to use more than standard ANSI text, which the client also supports. System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); // Look for the log4net.config first in the current environment directory, then in the ExecutingAssembly location var log4netFileInfo = new FileInfo("log4net.config"); if (!log4netFileInfo.Exists) { log4netFileInfo = new FileInfo(Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "log4net.config")); } var logRepository = LogManager.GetRepository(System.Reflection.Assembly.GetEntryAssembly()); XmlConfigurator.Configure(logRepository, log4netFileInfo); if (Environment.ProcessorCount < 2) { log.Warn("Only one vCPU was detected. ACE may run with limited performance. You should increase your vCPU count for anything more than a single player server."); } // Do system specific initializations here try { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { // On many windows systems, the default resolution for Thread.Sleep is 15.6ms. This allows us to command a tighter resolution MM_BeginPeriod(1); } } catch (Exception ex) { log.Error(ex.ToString()); } log.Info("Starting ACEmulator..."); Console.Title = @"ACEmulator"; log.Info("Initializing ConfigManager..."); ConfigManager.Initialize(); if (ConfigManager.Config.Offline.PurgeDeletedCharacters) { log.Info($"Purging deleted characters, and their possessions, older than {ConfigManager.Config.Offline.PurgeDeletedCharactersDays} days ({DateTime.Now.AddDays(-ConfigManager.Config.Offline.PurgeDeletedCharactersDays)})..."); ShardDatabaseOfflineTools.PurgeCharactersInParallel(ConfigManager.Config.Offline.PurgeDeletedCharactersDays, out var charactersPurged, out var playerBiotasPurged, out var possessionsPurged); log.Info($"Purged {charactersPurged:N0} characters, {playerBiotasPurged:N0} player biotas and {possessionsPurged:N0} possessions."); } if (ConfigManager.Config.Offline.PurgeOrphanedBiotas) { log.Info($"Purging orphaned biotas..."); ShardDatabaseOfflineTools.PurgeOrphanedBiotasInParallel(out var numberOfBiotasPurged); log.Info($"Purged {numberOfBiotasPurged:N0} biotas."); } log.Info("Initializing ServerManager..."); ServerManager.Initialize(); log.Info("Initializing DatManager..."); DatManager.Initialize(ConfigManager.Config.Server.DatFilesDirectory, true); log.Info("Initializing DatabaseManager..."); DatabaseManager.Initialize(); log.Info("Starting DatabaseManager..."); DatabaseManager.Start(); log.Info("Starting PropertyManager..."); PropertyManager.Initialize(); log.Info("[Custom Code] Starting CustomPropertyManager..."); CustomPropertiesManager.Initialize(); log.Info("Initializing GuidManager..."); GuidManager.Initialize(); if (ConfigManager.Config.Server.ServerPerformanceMonitorAutoStart) { log.Info("Server Performance Monitor auto starting..."); ServerPerformanceMonitor.Start(); } if (ConfigManager.Config.Server.WorldDatabasePrecaching) { log.Info("Precaching Weenies..."); DatabaseManager.World.CacheAllWeeniesInParallel(); log.Info("Precaching House Portals..."); DatabaseManager.World.CacheAllHousePortals(); log.Info("Precaching Points Of Interest..."); DatabaseManager.World.CacheAllPointsOfInterest(); log.Info("Precaching Spells..."); DatabaseManager.World.CacheAllSpells(); log.Info("Precaching Events..."); DatabaseManager.World.GetAllEvents(); log.Info("Precaching Death Treasures..."); DatabaseManager.World.CacheAllDeathTreasures(); log.Info("Precaching Wielded Treasures..."); DatabaseManager.World.CacheAllWieldedTreasuresInParallel(); log.Info("Precaching Treasure Materials..."); DatabaseManager.World.CacheAllTreasuresMaterialBaseInParallel(); DatabaseManager.World.CacheAllTreasuresMaterialGroupsInParallel(); log.Info("Precaching Treasure Colors..."); DatabaseManager.World.CacheAllTreasuresMaterialColorInParallel(); log.Info("Precaching Cookbooks..."); DatabaseManager.World.CacheAllCookbooksInParallel(); } else { log.Info("Precaching World Database Disabled..."); } log.Info("Initializing PlayerManager..."); PlayerManager.Initialize(); log.Info("Initializing HouseManager..."); HouseManager.Initialize(); log.Info("Initializing InboundMessageManager..."); InboundMessageManager.Initialize(); log.Info("Initializing SocketManager..."); SocketManager.Initialize(); log.Info("Initializing WorldManager..."); WorldManager.Initialize(); log.Info("Initializing EventManager..."); EventManager.Initialize(); // This should be last log.Info("Initializing CommandManager..."); CommandManager.Initialize(); log.Info("Initializing Riptide API Portal..."); GlobalEventManager.AuthWebPortal(); if (!PropertyManager.GetBool("world_closed", false).Item) { WorldManager.Open(null); } }