using Dalamud.Configuration; using ICRebuild.Core; namespace ICRebuild; [Serializable] public sealed class Configuration : IPluginConfiguration { public int Version { get; set; } = 1; public Dictionary Values { get; set; } = []; public HashSet Requested { get; set; } = []; public HashSet BlockedTimelines { get; set; } = []; public HashSet BlockedStatuses { get; set; } = [StatusBlockPolicy.DefaultStatusId]; public bool BlockListed { get; set; } = true; public DashFilterMode? DashMode { get; set; } public string MovementListGameVersion { get; set; } = ""; public float KnockSeconds { get; set; } public bool AutoSaveCapture { get; set; } = true; private SettingsSnapshot published = new(new Dictionary(),Array.Empty(),true,0); [Newtonsoft.Json.JsonIgnore] public SettingsSnapshot Published => Volatile.Read(ref published); public string OpcodeUrl { get; set; } = "https://raw.githubusercontent.com/extrant/FFXIV.EXE/main/Opcode/all_opcodes.json"; public bool SmartGroundCastAtTarget { get; set; } = true; public bool FastEventFinish { get; set; } = false; public bool AutoRetainerReventure { get; set; } = true; public float Value(int id) { return Published.Value(id); } public void Normalize() { Values ??= []; Requested ??= []; BlockedTimelines ??= []; BlockedStatuses ??= [StatusBlockPolicy.DefaultStatusId]; BlockedStatuses.RemoveWhere(id=>!StatusCatalog.AuditedBlockCandidates.Contains(id)); foreach (var feature in Features.All) Values[feature.Id] = Policies.FiniteClamp(Values.GetValueOrDefault(feature.Id,feature.Default),feature.Min,feature.Max,feature.Default); foreach (var id in Values.Keys.Where(id => !Features.All.Any(f => f.Id == id)).ToArray()) Values.Remove(id); Requested.RemoveWhere(id => !Features.All.Any(f => f.Id == id)); KnockSeconds = Policies.FiniteClamp(KnockSeconds, 0, 5); BlockedTimelines.Remove(0); BlockedTimelines.RemoveWhere(x=>x>ushort.MaxValue); DashMode ??= BlockedTimelines.Count==0 ? DashFilterMode.AllLocal : BlockListed ? DashFilterMode.BlockListed : DashFilterMode.AllowListed; if(!Enum.IsDefined(DashMode.Value)) DashMode=DashFilterMode.AllLocal; Version=2; Volatile.Write(ref published,new(Values,BlockedTimelines,BlockListed,KnockSeconds,DashMode.Value,BlockedStatuses)); } }