using System; using System.Xml.Linq; using Barotrauma.LuaCs.Data; using Barotrauma.LuaCs; namespace Barotrauma.LuaCs.Data; public interface ISettingsRegistrationProvider : IService { void RegisterTypeProviders(IConfigService configService, Func, bool> valueChangePredicate); } public class SettingsEntryRegistrar : ISettingsRegistrationProvider { private ILuaCsInfoProvider _infoProvider; public SettingsEntryRegistrar(ILuaCsInfoProvider infoProvider) { _infoProvider = infoProvider; } public void RegisterTypeProviders(IConfigService configService, Func, bool> valueChangePredicate) { // ISettingBase RegisterSettingEntry(configService, "bool"); RegisterSettingEntry(configService, "byte"); RegisterSettingEntry(configService, "sbyte"); RegisterSettingEntry(configService, "short"); RegisterSettingEntry(configService, "ushort"); RegisterSettingEntry(configService, "int"); RegisterSettingEntry(configService, "uint"); RegisterSettingEntry(configService, "long"); RegisterSettingEntry(configService, "ulong"); RegisterSettingEntry(configService, "string"); // ISettingRangeBase // ISettingList } private void RegisterSettingEntry(IConfigService configService, string typeName) where T : IEquatable, IConvertible { configService.RegisterSettingTypeInitializer(typeName, cfgInfo => { return new SettingEntry.Factory().CreateInstance(cfgInfo.Info, (val) => { return !cfgInfo.Info.Element.GetAttributeBool("ReadOnly", false) && cfgInfo.Info.EditableStates.HasFlag(_infoProvider?.CurrentRunState ?? RunState.Running); }); }); } public void Dispose() { if (!ModUtils.Threading.CheckIfClearAndSetBool(ref _isDisposed)) { return; } _infoProvider.Dispose(); _infoProvider = null; } private int _isDisposed; public bool IsDisposed { get => ModUtils.Threading.GetBool(ref _isDisposed); private set => ModUtils.Threading.SetBool(ref _isDisposed, value); } }