using System; using System.Collections.Generic; using NitroxClient.GameLogic.Bases; using NitroxClient.MonoBehaviours.Gui.MainMenu.ServersList; using UnityEngine.Events; namespace NitroxClient.GameLogic.Settings; public class NitroxSettingsManager { /// /// Settings grouped by their headings /// public readonly Dictionary> NitroxSettings; public NitroxSettingsManager() { NitroxSettings = new Dictionary>(); MakeSettings(); } /// /// Allows to create new settings /// /// Available types : TOGGLE, SLIDER, LIST, BUTTON /// /// /// Examples : /// /// AddSetting("Subtitles", new Setting("Test Slidder", NitroxPrefs.SliderPref, newValue => NitroxPrefs.SliderPref.Value = newValue, 0.1f, 1f, 0.4f)); /// AddSetting("Advanced", new Setting("Test list", NitroxPrefs.ListPref, newIndex => NitroxPrefs.ListPref.Value = newIndex, new string[] { "option 1", "option 2", "option 3" })); /// /// /// private void MakeSettings() { AddSetting("Nitrox_StreamerSettings", new Setting("Nitrox_SilenceChat", NitroxPrefs.SilenceChat, silence => NitroxPrefs.SilenceChat.Value = silence)); AddSetting("Nitrox_StreamerSettings", new Setting("Nitrox_HideIp", NitroxPrefs.HideIp, hide => { NitroxPrefs.HideIp.Value = hide; MainMenuServerListPanel.Main.RefreshServerEntries(); })); AddSetting("Nitrox_ResyncSettings", new Setting("Nitrox_ResyncBuildings", () => { if (BuildingHandler.Main) { BuildingHandler.Main.AskForResync(); } })); AddSetting("Nitrox_BuildingSettings", new Setting("Nitrox_SafeBuilding", NitroxPrefs.SafeBuilding, safe => NitroxPrefs.SafeBuilding.Value = safe)); AddSetting("Nitrox_BuildingSettings", new Setting("Nitrox_SafeBuildingLog", NitroxPrefs.SafeBuildingLog, safeLog => NitroxPrefs.SafeBuildingLog.Value = safeLog)); AddSetting("Nitrox_Settings_Bandwidth", new Setting("Nitrox_Settings_LatencyUpdatePeriod", NitroxPrefs.LatencyUpdatePeriod, latencyUpdatePeriod => NitroxPrefs.LatencyUpdatePeriod.Value = (int)latencyUpdatePeriod, 1, 60, NitroxPrefs.LatencyUpdatePeriod.DefaultValue, 1, SliderLabelMode.Int, tooltip: "Nitrox_Settings_HigherForUnstable_Tooltip")); AddSetting("Nitrox_Settings_Bandwidth", new Setting("Nitrox_Settings_SafetyLatencyMargin", NitroxPrefs.SafetyLatencyMargin, safetyLatencyMargin => NitroxPrefs.SafetyLatencyMargin.Value = safetyLatencyMargin, 0.01f, 0.5f, NitroxPrefs.SafetyLatencyMargin.DefaultValue, 0.01f, SliderLabelMode.Float, "0.00", "Nitrox_Settings_HigherForUnstable_Tooltip")); AddSetting("Nitrox_Settings_Bandwidth", new Setting("Nitrox_Settings_OfflineClockSyncDuration", NitroxPrefs.OfflineClockSyncDuration, offlineClockSyncDuration => NitroxPrefs.OfflineClockSyncDuration.Value = (int)offlineClockSyncDuration, 3, 15, NitroxPrefs.OfflineClockSyncDuration.DefaultValue, 1, SliderLabelMode.Int, tooltip: "Nitrox_Settings_HigherForUnstable_Tooltip")); } /// Adds a setting to the list under a certain heading public void AddSetting(string heading, Setting setting) { if (NitroxSettings.TryGetValue(heading, out List settings)) { settings.Add(setting); } else { NitroxSettings.Add(heading, new List { setting }); } } public class Setting { // These fields are used by each type of setting // To get the value, you need to type setting.GetValue() or (type)NitroxPrefs.MyPref.Value when you don't have the setting public readonly SettingType SettingType; public readonly string Label; public readonly NitroxPref NitroxPref; public readonly Delegate Callback; // Slider specifics public readonly float SliderMinValue; public readonly float SliderMaxValue; public readonly float SliderDefaultValue; public readonly float SliderStep; public readonly SliderLabelMode LabelMode; /// /// Examples: "0", "0.00" /// public string FloatFormat; public readonly string Tooltip; // List specifics public readonly string[] ListItems; /// Base constructor for the class private Setting(SettingType settingType, string label, NitroxPref nitroxPref, Delegate callback) { SettingType = settingType; Label = label; NitroxPref = nitroxPref; Callback = callback; } /// Constructor for buttons (doesn't need a NitroxPref) public Setting(string label, UnityAction callback) { SettingType = SettingType.BUTTON; Label = label; Callback = callback; } /// Constructor for a Toggle setting public Setting(string label, NitroxPref nitroxPref, UnityAction callback) : this(SettingType.TOGGLE, label, nitroxPref, callback) { } /// Constructor for a Slider setting public Setting(string label, NitroxPref nitroxPref, UnityAction callback, float sliderMinValue, float sliderMaxValue, float sliderDefaultValue, float sliderStep, SliderLabelMode labelMode, string floatFormat = "0", string tooltip = null) : this(SettingType.SLIDER, label, nitroxPref, callback) { SliderMinValue = sliderMinValue; SliderMaxValue = sliderMaxValue; SliderDefaultValue = sliderDefaultValue; SliderStep = sliderStep; LabelMode = labelMode; FloatFormat = floatFormat; Tooltip = tooltip; } /// Constructor for a List setting public Setting(string label, NitroxPref nitroxPref, UnityAction callback, string[] listItems) : this(SettingType.LIST, label, nitroxPref, callback) { ListItems = listItems; } public T GetValue() where T : IConvertible { return ((NitroxPref)NitroxPref).Value; } } public enum SettingType { TOGGLE, SLIDER, LIST, BUTTON } }