public static void Save(bool message) { object[] objArray1; if (World.m_Saving || (AsyncWriter.ThreadCount > 0)) { return; } World.m_Saving = true; if (message) { World.Broadcast(53, true, "The world is saving, please wait."); } Console.Write("World: Saving..."); DateTime time1 = DateTime.Now; if (!Directory.Exists("Saves/Mobiles/")) { Directory.CreateDirectory("Saves/Mobiles/"); } if (!Directory.Exists("Saves/Items/")) { Directory.CreateDirectory("Saves/Items/"); } if (!Directory.Exists("Saves/Guilds/")) { Directory.CreateDirectory("Saves/Guilds/"); } if (!Directory.Exists("Saves/Regions/")) { Directory.CreateDirectory("Saves/Regions/"); } World.SaveMobiles(); World.SaveItems(); World.SaveGuilds(); World.SaveRegions(); try { EventSink.InvokeWorldSave(new WorldSaveEventArgs(message)); } catch (Exception exception1) { throw new Exception("World Save event threw an exception. Save failed!", exception1); } GC.Collect(); DateTime time2 = DateTime.Now; TimeSpan span1 = ((TimeSpan)(time2 - time1)); Console.WriteLine("done in {0:F1} seconds.", span1.TotalSeconds); if (message) { objArray1 = new object[1]; span1 = ((TimeSpan)(time2 - time1)); objArray1[0] = span1.TotalSeconds; World.Broadcast(53, true, "World save complete. The entire process took {0:F1} seconds.", objArray1); } World.m_Saving = false; }
public static void Save( bool message ) { if ( m_Saving || AsyncWriter.ThreadCount > 0 ) return; NetState.FlushAll(); NetState.Pause(); m_Saving = true; if ( message ) Broadcast( 0x35, true, "The world is saving, please wait." ); SaveStrategy strategy = SaveStrategy.Acquire(); Console.WriteLine( "Core: Using {0} save strategy", strategy.Name.ToLowerInvariant() ); Console.Write( "World: Saving..." ); Stopwatch watch = Stopwatch.StartNew(); if ( !Directory.Exists( "Saves/Mobiles/" ) ) Directory.CreateDirectory( "Saves/Mobiles/" ); if ( !Directory.Exists( "Saves/Items/" ) ) Directory.CreateDirectory( "Saves/Items/" ); if ( !Directory.Exists( "Saves/Guilds/" ) ) Directory.CreateDirectory( "Saves/Guilds/" ); /*using ( SaveMetrics metrics = new SaveMetrics() ) {*/ strategy.Save( null ); /*}*/ try { EventSink.InvokeWorldSave( new WorldSaveEventArgs( message ) ); } catch ( Exception e ) { throw new Exception( "World Save event threw an exception. Save failed!", e ); } watch.Stop(); m_Saving = false; ProcessSafetyQueues(); strategy.ProcessDecay(); Console.WriteLine( "done in {0:F2} seconds.", watch.Elapsed.TotalSeconds ); if ( message ) Broadcast( 0x35, true, "World save complete. The entire process took {0:F1} seconds.", watch.Elapsed.TotalSeconds ); NetState.Resume(); }
public static void Save(bool message = true, bool permitBackgroundWrite = false) { if (Saving) { return; } GameServer.Instance.Clients.Each(c => c.Flush()); WaitForWriteCompletion(); // Blocks Save until current disk flush is done. Saving = true; m_DiskWriteHandle.Reset(); if (message) { Broadcast(0x35, true, "The world is saving, please wait."); } log.Info("Save started"); var strategy = SaveStrategy.Acquire(); log.Info("Using {0} save strategy", strategy.Name.ToLowerInvariant()); var watch = Stopwatch.StartNew(); try { EventSink.InvokeWorldBeforeSave(); } catch (Exception e) { throw new Exception("World Before Save event threw an exception. Save failed!", e); } if (!Directory.Exists(MobileBasePath)) { Directory.CreateDirectory(MobileBasePath); } if (!Directory.Exists(ItemBasePath)) { Directory.CreateDirectory(ItemBasePath); } if (!Directory.Exists(GuildBasePath)) { Directory.CreateDirectory(GuildBasePath); } strategy.Save(permitBackgroundWrite); log.Info("Entities saved in {0:F2} seconds.", watch.Elapsed.TotalSeconds); try { EventSink.InvokeWorldSave(new WorldSaveEventArgs(message)); } catch (Exception e) { throw new Exception("World Save event threw an exception. Save failed!", e); } if (ManualGC) { GC.Collect(); } watch.Stop(); Saving = false; if (!permitBackgroundWrite) { NotifyDiskWriteComplete(); // Sets the DiskWriteHandle. If we allow background writes, we leave this upto the individual save strategies. } ProcessSafetyQueues(); strategy.OnFinished(); log.Info("Save done in {0:F2} seconds.", watch.Elapsed.TotalSeconds); if (message) { Broadcast(0x35, true, "World save complete. The entire process took {0:F2} seconds.", watch.Elapsed.TotalSeconds); } }
public static void Save(bool message, bool permitBackgroundWrite) { if (m_Saving) { return; } ++m_Saves; NetState.FlushAll(); NetState.Pause(); World.WaitForWriteCompletion();//Blocks Save until current disk flush is done. m_Saving = true; m_DiskWriteHandle.Reset(); if (message) { Broadcast(0x35, true, "The world is saving, please wait."); } SaveStrategy strategy = SaveStrategy.Acquire(); Console.WriteLine("Core: Using {0} save strategy", strategy.Name.ToLowerInvariant()); Console.Write("World: Saving..."); Stopwatch watch = Stopwatch.StartNew(); if (!Directory.Exists("Saves/Mobiles/")) { Directory.CreateDirectory("Saves/Mobiles/"); } if (!Directory.Exists("Saves/Items/")) { Directory.CreateDirectory("Saves/Items/"); } /*using ( SaveMetrics metrics = new SaveMetrics() ) {*/ strategy.Save(null, permitBackgroundWrite); /*}*/ try { EventSink.InvokeWorldSave(new WorldSaveEventArgs(message)); } catch (Exception e) { throw new Exception("World Save event threw an exception. Save failed!", e); } watch.Stop(); m_Saving = false; if (!permitBackgroundWrite) { World.NotifyDiskWriteComplete(); //Sets the DiskWriteHandle. If we allow background writes, we leave this upto the individual save strategies. } ProcessSafetyQueues(); strategy.ProcessDecay(); Console.WriteLine("Save done in {0:F2} seconds.", watch.Elapsed.TotalSeconds); if (message) { Broadcast(0x35, true, "World save complete. The entire process took {0:F1} seconds.", watch.Elapsed.TotalSeconds); } NetState.Resume(); }
public static void Save(bool message) { if (m_Saving || AsyncWriter.ThreadCount > 0) { return; } NetState.FlushAll(); m_Saving = true; if (message) { Broadcast(0x35, true, "The world is saving, please wait."); } Console.Write("World: Saving..."); DateTime startTime = DateTime.Now; if (!Directory.Exists("Saves/Mobiles/")) { Directory.CreateDirectory("Saves/Mobiles/"); } if (!Directory.Exists("Saves/Items/")) { Directory.CreateDirectory("Saves/Items/"); } if (!Directory.Exists("Saves/Guilds/")) { Directory.CreateDirectory("Saves/Guilds/"); } if (!Directory.Exists("Saves/Regions/")) { Directory.CreateDirectory("Saves/Regions/"); } if (m_MultiProcessor) { Thread saveThread = new Thread(new ThreadStart(SaveItems)); saveThread.Name = "Item Save Subset"; saveThread.Start(); SaveMobiles(); SaveGuilds(); SaveRegions(); saveThread.Join(); } else { SaveMobiles(); SaveItems(); SaveGuilds(); SaveRegions(); } //Accounts.Save(); try { EventSink.InvokeWorldSave(new WorldSaveEventArgs(message)); } catch (Exception e) { throw new Exception("World Save event threw an exception. Save failed!", e); } //System.GC.Collect(); DateTime endTime = DateTime.Now; Console.WriteLine("done in {0:F1} seconds.", (endTime - startTime).TotalSeconds); if (message) { Broadcast(0x35, true, "World save complete. The entire process took {0:F1} seconds.", (endTime - startTime).TotalSeconds); } m_Saving = false; }
public static void Save(bool message) { if (m_Saving || AsyncWriter.ThreadCount > 0) { return; } NetState.FlushAll(); m_Saving = true; if (message) { Broadcast(0x35, true, "The world is saving, please wait."); } log.Info("Saving world"); DateTime startTime = DateTime.Now; if (!Directory.Exists(mobileBase)) { Directory.CreateDirectory(mobileBase); } if (!Directory.Exists(itemBase)) { Directory.CreateDirectory(itemBase); } if (!Directory.Exists(guildBase)) { Directory.CreateDirectory(guildBase); } if (!Directory.Exists(regionBase)) { Directory.CreateDirectory(regionBase); } if (Core.Config.Features["multi-threading"]) { Thread saveThread = new Thread(new ThreadStart(SaveItems)); saveThread.Name = "Item Save Subset"; saveThread.Start(); SaveMobiles(); SaveGuilds(); SaveRegions(); saveThread.Join(); } else { SaveMobiles(); SaveItems(); SaveGuilds(); SaveRegions(); } //Accounts.Save(); try { EventSink.InvokeWorldSave(new WorldSaveEventArgs(message)); } catch (Exception e) { throw new Exception("World Save event threw an exception. Save failed!", e); } //System.GC.Collect(); DateTime endTime = DateTime.Now; log.Info(String.Format("World saved in {0:F1} seconds.", (endTime - startTime).TotalSeconds)); if (message) { Broadcast(0x35, true, "World save complete. The entire process took {0:F1} seconds.", (endTime - startTime).TotalSeconds); } m_Saving = false; }
public static void Save(bool message, bool permitBackgroundWrite) { if (Saving) { return; } ++m_Saves; NetState.FlushAll(); NetState.Pause(); WaitForWriteCompletion(); //Blocks Save until current disk flush is done. Saving = true; m_DiskWriteHandle.Reset(); if (message) { Broadcast(0x35, false, AccessLevel.Player, "The world is saving, please wait."); } SaveStrategy strategy = SaveStrategy.Acquire(); Console.WriteLine("Core: Using {0} save strategy", strategy.Name.ToLowerInvariant()); Console.WriteLine("World: Saving..."); Stopwatch watch = Stopwatch.StartNew(); if (!Directory.Exists("Saves/Mobiles/")) { Directory.CreateDirectory("Saves/Mobiles/"); } if (!Directory.Exists("Saves/Items/")) { Directory.CreateDirectory("Saves/Items/"); } if (!Directory.Exists("Saves/Guilds/")) { Directory.CreateDirectory("Saves/Guilds/"); } try { EventSink.InvokeBeforeWorldSave(new BeforeWorldSaveEventArgs()); } catch (Exception e) { throw new Exception("FATAL: Exception in EventSink.BeforeWorldSave", e); } if (m_Metrics) { using (SaveMetrics metrics = new SaveMetrics()) strategy.Save(metrics, permitBackgroundWrite); } else { strategy.Save(null, permitBackgroundWrite); } try { EventSink.InvokeWorldSave(new WorldSaveEventArgs(message)); } catch (Exception e) { throw new Exception("FATAL: Exception in EventSink.WorldSave", e); } watch.Stop(); Saving = false; if (!permitBackgroundWrite) { NotifyDiskWriteComplete(); //Sets the DiskWriteHandle. If we allow background writes, we leave this upto the individual save strategies. } ProcessSafetyQueues(); strategy.ProcessDecay(); Console.WriteLine("Save finished in {0:F2} seconds.", watch.Elapsed.TotalSeconds); if (message) { Broadcast(0x35, false, AccessLevel.Player, "World save done in {0:F1} seconds.", watch.Elapsed.TotalSeconds); } NetState.Resume(); try { EventSink.InvokeAfterWorldSave(new AfterWorldSaveEventArgs()); } catch (Exception e) { throw new Exception("FATAL: Exception in EventSink.AfterWorldSave", e); } }
public static void Save(string saveDirectory, bool message) { if (m_Saving || AsyncWriter.ThreadCount > 0) { return; } NetState.FlushAll(); m_Saving = true; if (message) { Broadcast(0x35, true, "The world is saving, please wait."); } log.Info("Saving world"); DateTime startTime = DateTime.Now; string mobileBase = Path.Combine(saveDirectory, "Mobiles"); string itemBase = Path.Combine(saveDirectory, "Items"); string guildBase = Path.Combine(saveDirectory, "Guilds"); string regionBase = Path.Combine(saveDirectory, "Regions"); if (Core.Config.Features["multi-threading"]) { Thread saveThread = new Thread(new ThreadStart(new SaveItemsStart(itemBase).SaveItems)); saveThread.Name = "Item Save Subset"; saveThread.Start(); SaveMobiles(mobileBase); SaveGuilds(guildBase); SaveRegions(regionBase); saveThread.Join(); } else { SaveMobiles(mobileBase); SaveItems(itemBase); SaveGuilds(guildBase); SaveRegions(regionBase); } log.InfoFormat("Entities saved in {0:F1} seconds.", (DateTime.Now - startTime).TotalSeconds); //Accounts.Save(); try { EventSink.InvokeWorldSave(new WorldSaveEventArgs(saveDirectory, message)); } catch (Exception e) { throw new Exception("World Save event threw an exception. Save failed!", e); } if (ManualGC) { log.Debug("Manual garbage collection"); System.GC.Collect(); } DateTime endTime = DateTime.Now; log.InfoFormat("World saved in {0:F1} seconds.", (endTime - startTime).TotalSeconds); if (message) { Broadcast(0x35, true, "World save complete. The entire process took {0:F1} seconds.", (endTime - startTime).TotalSeconds); } m_Saving = false; }