using GFramework.Core.extensions; using GFramework.Core.system; using GFramework.Game.Abstractions.setting; using GFramework.Game.setting.events; namespace GFramework.Game.setting; /// /// 设置系统,负责管理和应用各种设置配置 /// public class SettingsSystem : AbstractSystem, ISettingsSystem { private ISettingsModel _model = null!; /// /// 应用所有设置配置 /// /// 完成的任务 public async Task ApplyAll() { // 遍历所有设置应用器并尝试应用 foreach (var applicator in _model.AllApplicators()) await TryApplyAsync(applicator); } /// /// 应用指定类型的设置配置 /// /// 设置配置类型,必须是类且实现IResetApplyAbleSettings接口 /// 完成的任务 public Task Apply() where T : class, IResetApplyAbleSettings { var applicator = _model.GetApplicator(); return applicator != null ? TryApplyAsync(applicator) : Task.CompletedTask; } /// /// 保存所有设置数据到存储库 /// /// 完成的任务 public async Task SaveAll() { await _model.SaveAllAsync(); } /// /// 重置所有设置并应用更改 /// /// 异步任务 public async Task ResetAll() { _model.ResetAll(); await ApplyAll(); } /// /// 重置指定类型的设置并应用更改 /// /// 设置类型,必须实现IPersistentApplyAbleSettings接口且具有无参构造函数 /// 异步任务 public async Task Reset() where T : class, ISettingsData, IResetApplyAbleSettings, new() { _model.Reset(); await Apply(); } /// /// 初始化设置系统,获取设置模型实例 /// protected override void OnInit() { _model = this.GetModel()!; } /// /// 尝试应用可应用的设置配置 /// /// 设置配置对象 private async Task TryApplyAsync(ISettingsSection section) { if (section is not IApplyAbleSettings applyAbleSettings) return; // 发送设置应用中事件 this.SendEvent(new SettingsApplyingEvent(section)); try { await applyAbleSettings.Apply(); // 发送设置应用成功事件 this.SendEvent(new SettingsAppliedEvent(section, true)); } catch (Exception ex) { // 发送设置应用失败事件 this.SendEvent(new SettingsAppliedEvent(section, false, ex)); } } }