/
NLObP
/
AAEmu
Обзор
Документация
Войти
/
NLObP
/
AAEmu
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
AAEmu.Game/Core/Managers/SaveManager.cs
185 строк
7 KB
Roger Barreto
Async Await Refactor (#1038)
19 июл 2024, 13:19
Не верифицирован
19 июл 2024, 13:19
3173ce0
Код
Авторство
О чём код?
using System; using System.Diagnostics; using AAEmu.Commons.Utils; using AAEmu.Commons.Utils.DB; using AAEmu.Game.Core.Managers.World; using AAEmu.Game.Models; using AAEmu.Game.Models.Tasks; using AAEmu.Game.Models.Tasks.SaveTask; using NLog; namespace AAEmu.Game.Core.Managers; public class SaveManager : Singleton<SaveManager> { private static Logger Logger { get; } = LogManager.GetCurrentClassLogger(); private double Delay = 1; private bool _enabled; private bool _isSaving; private object _lock = new(); private SaveTickStartTask saveTask; public ShutdownTask ShutdownTask { get; set; } = null; public SaveManager() { _enabled = false; _isSaving = false; } public void Initialize() { Logger.Info("Initialising Save Manager..."); _enabled = true; Delay = AppConfiguration.Instance.World.AutoSaveInterval; SaveTickStart(); } public async System.Threading.Tasks.Task StopAsync() { _enabled = false; if (saveTask == null) { return; } var result = await saveTask.CancelAsync(); if (result) { saveTask = null; } // Do one final save here DoSave(); } public void SaveTickStart() { // Logger.Warn("SaveTickStart: Started"); saveTask = new SaveTickStartTask(); TaskManager.Instance.Schedule(saveTask, TimeSpan.FromMinutes(Delay), TimeSpan.FromMinutes(Delay)); } public bool DoSave() { if (_isSaving) return false; var saved = false; lock (_lock) { _isSaving = true; var stopWatch = new Stopwatch(); stopWatch.Start(); try { // Save stuff Logger.Debug("Saving DB ..."); using (var connection = MySQL.CreateConnection()) { using (var transaction = connection.BeginTransaction()) { // Houses var savedHouses = HousingManager.Instance.Save(connection, transaction); // Mail var savedMails = MailManager.Instance.Save(connection, transaction); // Items var saveItems = ItemManager.Instance.Save(connection, transaction); //Auction House var savedAuctionHouse = AuctionManager.Instance.Save(connection, transaction); // Characters var savedCharacters = 0; foreach (var c in WorldManager.Instance.GetAllCharacters()) { if (c.Save(connection, transaction)) savedCharacters++; else Logger.Error("Failed to get save data for character {0} - {1}", c.Id, c.Name); } // Slaves var savedSlaves = 0; foreach (var slave in WorldManager.Instance.GetAllSlaves()) { if (slave.Save(connection, transaction)) savedSlaves++; } var totalCommits = 0; totalCommits += savedHouses.Item1 + savedHouses.Item2; totalCommits += savedMails.Item1 + savedMails.Item2; totalCommits += saveItems.Item1 + saveItems.Item2 + saveItems.Item3; totalCommits += savedAuctionHouse.Item1 + savedAuctionHouse.Item2; totalCommits += savedCharacters; totalCommits += savedSlaves; if (totalCommits <= 0) { Logger.Debug("No data to update ..."); saved = true; } else { try { transaction.Commit(); if ((savedHouses.Item1 + savedHouses.Item2) > 0) Logger.Debug($"Updated {savedHouses.Item1} and deleted {savedHouses.Item2} houses ..."); if ((savedMails.Item1 + savedMails.Item2) > 0) Logger.Debug($"Updated {savedMails.Item1} and deleted {savedMails.Item2} mails ..."); if ((saveItems.Item1 + saveItems.Item2) > 0) Logger.Debug($"Updated {saveItems.Item1} and deleted {saveItems.Item2} items in {saveItems.Item3} containers ..."); if ((saveItems.Item3) > 0) Logger.Debug($"Updated {saveItems.Item3} item containers ..."); if ((savedAuctionHouse.Item1 + savedAuctionHouse.Item2) > 0) Logger.Debug($"Updated {savedAuctionHouse.Item1} and deleted {savedAuctionHouse.Item2} auction items ..."); if (savedCharacters > 0) Logger.Debug($"Updated {savedCharacters} characters ..."); if (savedSlaves > 0) Logger.Debug($"Updated {savedSlaves} slaves ..."); saved = true; } catch (Exception e) { Logger.Error(e); try { transaction.Rollback(); } catch (Exception eRollback) { Logger.Error(eRollback); } } } } } } catch (Exception e) { Logger.Error(e, "DoSave Exception\n"); } stopWatch.Stop(); Logger.Debug("Saving data took {0}", stopWatch.Elapsed); } _isSaving = false; return saved; } public void SaveTick() { if (!_enabled) { Logger.Warn("Auto-Saving disabled, skipping ..."); return; } DoSave(); } public void SetAutoSaveInterval() { Delay = AppConfiguration.Instance.World.AutoSaveInterval; } }