From f38a7bd574c16fa5a4495c652d3f01e9d7bb4377 Mon Sep 17 00:00:00 2001 From: MapleWheels Date: Wed, 4 Mar 2026 20:39:13 -0500 Subject: [PATCH] The gameplay settings menu kinda works (only for luacsforbarotrauma). --- .../ClientSource/LuaCs/Data/IDisplayable.cs | 9 +++ .../ClientSource/LuaCs/Data/ISettingBase.cs | 6 ++ .../ISettingControl.cs | 0 .../{Configuration => Data}/SettingControl.cs | 2 +- .../LuaCs/Services/ConfigService.cs | 3 - .../Services/_Interfaces/IConfigService.cs | 1 - .../_SettingsMenu/ModsControlsSettingsMenu.cs | 5 ++ .../_SettingsMenu/ModsGameplaySettingsMenu.cs | 81 +++++++++++++++++-- .../_SettingsMenu/ModsSettingsMenuBase.cs | 5 ++ .../_SettingsMenu/SettingsMenuSystem.cs | 8 ++ .../Config/SettingsShared.xml | 2 +- .../LuaCsForBarotrauma/Texts/English.xml | 2 + .../LuaCs/Data/ISettingTypeDef.cs | 2 +- .../SharedSource/LuaCs/Data/SettingBase.cs | 14 ++++ .../SharedSource/LuaCs/Data/SettingEntry.cs | 56 ++++++++++++- .../_Services/SettingsFileParserService.cs | 2 +- 16 files changed, 182 insertions(+), 16 deletions(-) create mode 100644 Barotrauma/BarotraumaClient/ClientSource/LuaCs/Data/IDisplayable.cs create mode 100644 Barotrauma/BarotraumaClient/ClientSource/LuaCs/Data/ISettingBase.cs rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/{Configuration => Data}/ISettingControl.cs (100%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/{Configuration => Data}/SettingControl.cs (99%) diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Data/IDisplayable.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Data/IDisplayable.cs new file mode 100644 index 000000000..6d690ec50 --- /dev/null +++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Data/IDisplayable.cs @@ -0,0 +1,9 @@ +using System; +using Microsoft.Xna.Framework; + +namespace Barotrauma.LuaCs.Data; + +public interface IDisplayable +{ + public void AddDisplayComponent(GUILayoutGroup layoutGroup, Vector2 relativeSize, Action onSerializedValue); +} diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Data/ISettingBase.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Data/ISettingBase.cs new file mode 100644 index 000000000..e61ad2e1d --- /dev/null +++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Data/ISettingBase.cs @@ -0,0 +1,6 @@ +namespace Barotrauma.LuaCs.Data; + +public partial interface ISettingBase : IDisplayable +{ + +} diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Configuration/ISettingControl.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Data/ISettingControl.cs similarity index 100% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Configuration/ISettingControl.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/Data/ISettingControl.cs diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Configuration/SettingControl.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Data/SettingControl.cs similarity index 99% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Configuration/SettingControl.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/Data/SettingControl.cs index bf18aa122..fb2dea794 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Configuration/SettingControl.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Data/SettingControl.cs @@ -6,7 +6,7 @@ using Barotrauma.LuaCs.Data; using Microsoft.Xna.Framework.Input; using OneOf; -namespace Barotrauma.LuaCs.Configuration; +namespace Barotrauma.LuaCs.Data; public class SettingControl : SettingBase, ISettingControl { diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ConfigService.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ConfigService.cs index a8f340eb1..16a67e301 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ConfigService.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ConfigService.cs @@ -1,10 +1,7 @@ using System; using System.Collections.Immutable; using System.Linq; -using Barotrauma.LuaCs.Configuration; using Barotrauma.LuaCs.Data; -using Barotrauma.Networking; -using FluentResults; namespace Barotrauma.LuaCs; diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_Interfaces/IConfigService.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_Interfaces/IConfigService.cs index 1a1ca2178..98a23dd6d 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_Interfaces/IConfigService.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_Interfaces/IConfigService.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; -using Barotrauma.LuaCs.Configuration; using Barotrauma.LuaCs.Data; using Barotrauma.LuaCs; using Barotrauma.Networking; diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsControlsSettingsMenu.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsControlsSettingsMenu.cs index a1243feca..14b6f58d4 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsControlsSettingsMenu.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsControlsSettingsMenu.cs @@ -14,4 +14,9 @@ internal sealed class ModsControlsSettingsMenu : ModsSettingsMenuBase { // TODO: Finish this later. } + + public override void ApplyInstalledModChanges() + { + // TODO: Finish this later. + } } diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsGameplaySettingsMenu.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsGameplaySettingsMenu.cs index d46394e82..e9063408a 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsGameplaySettingsMenu.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsGameplaySettingsMenu.cs @@ -1,8 +1,12 @@ using System; +using System.Collections.Concurrent; using System.Collections.Immutable; using Microsoft.Xna.Framework; using System.Linq; +using System.Numerics; using Barotrauma.LuaCs.Data; +using Vector2 = Microsoft.Xna.Framework.Vector2; + // ReSharper disable ObjectCreationAsStatement namespace Barotrauma.LuaCs; @@ -57,6 +61,9 @@ internal sealed class ModsGameplaySettingsMenu : ModsSettingsMenuBase (_modCategoryDisplayGroup, _settingsDisplayGroup) = GUIUtil.CreateSidebars(settingsContentAreaGroup, true); _modCategoryDisplayGroup.RectTransform.RelativeSize = new Vector2(0.3f, 1f); _settingsDisplayGroup.RectTransform.RelativeSize = new Vector2(0.7f, 1f); + + // default category + _selectedCategory = "All"; GenerateCategoryListDisplay(_modCategoryDisplayGroup, GetTargetPackagesList(), GetDisplayCategoriesList()); GenerateSettingsListDisplay(_settingsDisplayGroup, GetDisplaySettingsList()); @@ -68,18 +75,20 @@ internal sealed class ModsGameplaySettingsMenu : ModsSettingsMenuBase GenerateSettingsListDisplay(_settingsDisplayGroup, GetDisplaySettingsList()); } - string GetLocalizedString(string identifier) + string GetLocalizedString(string identifier, string defaultValue) { var lstr = TextManager.Get(identifier); - return lstr.IsNullOrWhiteSpace() ? "General" : lstr.Value; + return lstr.IsNullOrWhiteSpace() ? defaultValue : lstr.Value; } // Filters by selected package and query text ImmutableArray GetDisplayCategoriesList() { return GetFilteredSettingsList() - .Select(s => GetLocalizedString(s.GetDisplayInfo().DisplayCategory)) + .Select(s => GetLocalizedString(s.GetDisplayInfo().DisplayCategory, "General")) + .Concat(new []{ "All" }) .Distinct() + .OrderBy(s => s) .ToImmutableArray(); } @@ -89,7 +98,10 @@ internal sealed class ModsGameplaySettingsMenu : ModsSettingsMenuBase return _settingsInstancesGameplay .Where(s => SettingMatchesQuery(s, _selectedSearchQuery)) .Select(s => s.OwnerPackage) + .Concat(new[] { ContentPackageManager.VanillaCorePackage }) .Distinct() + .OrderBy(p => p == ContentPackageManager.VanillaCorePackage ? 1 : 0) + .ThenBy(p => p.Name) .ToImmutableArray(); } @@ -98,7 +110,8 @@ internal sealed class ModsGameplaySettingsMenu : ModsSettingsMenuBase { return GetFilteredSettingsList() .Where(s => _selectedCategory.IsNullOrWhiteSpace() - || GetLocalizedString(s.GetDisplayInfo().DisplayCategory) == _selectedCategory) + || _selectedCategory == "All" + || GetLocalizedString(s.GetDisplayInfo().DisplayCategory, "General") == _selectedCategory) .ToImmutableArray(); } @@ -147,12 +160,12 @@ internal sealed class ModsGameplaySettingsMenu : ModsSettingsMenuBase var packageSelectionList = GUIUtil.Dropdown(layoutGroup, cp => GetPackageName(cp), null, packagesList, packagesList.Length > 0 ? packagesList[0] : null, cp => { - _selectedContentPackage = cp == ContentPackageManager.VanillaCorePackage ? null : cp; + _selectedContentPackage = cp; _selectedCategory = string.Empty; GenerateCategoryListDisplay(_modCategoryDisplayGroup, GetTargetPackagesList(), GetDisplayCategoriesList()); GenerateSettingsListDisplay(_settingsDisplayGroup, GetDisplaySettingsList()); }, new Vector2(1f, 0.07f)); - var containerBox = new GUIListBox(new RectTransform(new Vector2(1f, 0.93f), layoutGroup.RectTransform)); + var containerBox = new GUIListBox(new RectTransform(new Vector2(1f, 0.945f), layoutGroup.RectTransform)); float size_y = MathF.Max(categories.Length * 0.122f, 1f); var displayedCategoriesFrame = new GUIFrame(new RectTransform(new Vector2(1f, size_y), containerBox.Content.RectTransform), style: null, color: Color.Black) { @@ -185,13 +198,67 @@ internal sealed class ModsGameplaySettingsMenu : ModsSettingsMenuBase void GenerateSettingsListDisplay(GUILayoutGroup layoutGroup, ImmutableArray settings) { + layoutGroup.ClearChildren(); + float settingHeight = 0.06f; + var containerBox = new GUIListBox(new RectTransform(new Vector2(1f, 1f), layoutGroup.RectTransform)); + foreach (var setting in settings) + { + var entry = AddSettingToDisplay( + setting, + containerBox.Content.RectTransform, + settingHeight: settingHeight, + labelSize: new Vector2(0.6f, 1f), + controlSize: new Vector2(0.4f, 1f)); + + + } + } + + (GUIFrame entryFrame, GUILayoutGroup entryLayoutGroup) AddSettingToDisplay(ISettingBase setting, + RectTransform parent, float settingHeight, Vector2 labelSize, Vector2 controlSize) + { + GUIFrame entryFrame = new GUIFrame(new RectTransform(new Vector2(1f, settingHeight), parent)); + GUILayoutGroup entryLayoutGroup = new GUILayoutGroup(new RectTransform(Vector2.One, entryFrame.RectTransform), isHorizontal: true); + + new GUITextBlock(new RectTransform(labelSize, entryLayoutGroup.RectTransform), + GetLocalizedString(setting.GetDisplayInfo().DisplayName, setting.GetDisplayInfo().DisplayName), + textColor: Color.PeachPuff, + font: GUIStyle.SmallFont, + textAlignment: Alignment.Left) + { + CanBeFocused = false + }; + + setting.AddDisplayComponent(entryLayoutGroup, controlSize, newValue => + { + NewValuesCache[setting] = newValue; + }); + return (entryFrame, entryLayoutGroup); } } protected override void DisposeInternal() { - // TODO: Finish this later. + NewValuesCache.Clear(); + _modCategoryDisplayGroup?.Parent.RemoveChild(_modCategoryDisplayGroup); + _settingsDisplayGroup?.Parent.RemoveChild(_settingsDisplayGroup); + _modCategoryDisplayGroup = null; + _settingsDisplayGroup = null; + } + + public override void ApplyInstalledModChanges() + { + foreach (var kvp in NewValuesCache) + { + if (kvp.Key.IsDisposed) + { + continue; + } + + kvp.Key.TrySetValue(kvp.Value); + } + NewValuesCache.Clear(); } } diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsSettingsMenuBase.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsSettingsMenuBase.cs index dc7cd8b6f..9cad5c561 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsSettingsMenuBase.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsSettingsMenuBase.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Concurrent; using Barotrauma.Extensions; +using Barotrauma.LuaCs.Data; using Microsoft.Xna.Framework; namespace Barotrauma.LuaCs; @@ -10,6 +12,7 @@ internal abstract class ModsSettingsMenuBase : IDisposable protected IPackageManagementService PackageManagementService { get; private set; } protected IConfigService ConfigService { get; private set; } protected SettingsMenu SettingsMenuInstance { get; private set; } + protected readonly ConcurrentDictionary NewValuesCache = new(); protected ModsSettingsMenuBase(GUIFrame contentFrame, IPackageManagementService packageManagementService, @@ -22,6 +25,7 @@ internal abstract class ModsSettingsMenuBase : IDisposable } protected abstract void DisposeInternal(); + public abstract void ApplyInstalledModChanges(); public void Dispose() { @@ -31,5 +35,6 @@ internal abstract class ModsSettingsMenuBase : IDisposable ContentFrame = null; PackageManagementService = null; ConfigService = null; + NewValuesCache.Clear(); } } diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/SettingsMenuSystem.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/SettingsMenuSystem.cs index 055b206b4..5969ec0b5 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/SettingsMenuSystem.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/SettingsMenuSystem.cs @@ -75,6 +75,14 @@ public class SettingsMenuSystem : ISettingsMenuSystem return contentFr; } + + [HarmonyPatch(typeof(SettingsMenu), nameof(SettingsMenu.ApplyInstalledModChanges)), HarmonyPostfix] + private static void SettingsMenu_ApplyInstalledModChanges_Post() + { + SystemInstance._gameplayMenuInstance?.ApplyInstalledModChanges(); + SystemInstance._controlsMenuInstance?.ApplyInstalledModChanges(); + } + private void DisposeMenuFrames() { _controlsMenuInstance?.Dispose(); diff --git a/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Config/SettingsShared.xml b/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Config/SettingsShared.xml index e2241fa2f..d6a5afe2a 100644 --- a/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Config/SettingsShared.xml +++ b/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Config/SettingsShared.xml @@ -4,7 +4,7 @@ - + diff --git a/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Texts/English.xml b/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Texts/English.xml index 1700c861f..222a150af 100644 --- a/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Texts/English.xml +++ b/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Texts/English.xml @@ -11,4 +11,6 @@ General Where to Save Local Data General + Limit Network Message Size + Networking diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/ISettingTypeDef.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/ISettingTypeDef.cs index 3cb0e0364..49974fdc9 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/ISettingTypeDef.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/ISettingTypeDef.cs @@ -8,7 +8,7 @@ using Barotrauma.Networking; namespace Barotrauma.LuaCs.Data; -public interface ISettingBase : IDataInfo, IEquatable, IDisposable +public partial interface ISettingBase : IDataInfo, IEquatable, IDisposable { /// /// Settings production factory. Should be implemented by all types and registered with the Dependency Injector. diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingBase.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingBase.cs index ccfbe40df..af16faa4d 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingBase.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingBase.cs @@ -1,6 +1,7 @@ using System; using System.Xml.Linq; using Barotrauma.LuaCs.Data; +using Microsoft.Xna.Framework; using OneOf; namespace Barotrauma.LuaCs.Data; @@ -60,4 +61,17 @@ public abstract class SettingBase : ISettingBase public abstract bool TrySetValue(OneOf value); public abstract event Action OnValueChanged; public abstract OneOf GetSerializableValue(); +#if CLIENT + public virtual void AddDisplayComponent(GUILayoutGroup layoutGroup, Vector2 relativeSize, Action onSerializedValue) + { + new GUITextBox(new RectTransform(relativeSize, layoutGroup.RectTransform), font: GUIStyle.SmallFont) + { + OnEnterPressed = (box, txt) => + { + onSerializedValue?.Invoke(txt); + return true; + } + }; + } +#endif } diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingEntry.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingEntry.cs index 82c748691..16394b6cd 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingEntry.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingEntry.cs @@ -5,11 +5,12 @@ using Barotrauma.LuaCs.Data; using Barotrauma.LuaCs; using Barotrauma.Networking; using Microsoft.Toolkit.Diagnostics; +using Microsoft.Xna.Framework; using OneOf; namespace Barotrauma.LuaCs.Data; -public class SettingEntry : SettingBase, ISettingBase, INetworkSyncVar where T : IEquatable, IConvertible +public partial class SettingEntry : SettingBase, ISettingBase, INetworkSyncVar where T : IEquatable, IConvertible { public class Factory : ISettingBase.IFactory> { @@ -302,4 +303,57 @@ public class SettingEntry : SettingBase, ISettingBase, INetworkSyncVar whe #endif } } + +#if CLIENT + public override void AddDisplayComponent(GUILayoutGroup layoutGroup, Vector2 relativeSize, Action onSerializedValue) + { + switch (Type.GetTypeCode(typeof(T))) + { + case TypeCode.Boolean: + new GUITickBox(new RectTransform(relativeSize, layoutGroup.RectTransform), "") + { + Selected = (bool)Convert.ChangeType(this.Value, TypeCode.Boolean), + OnSelected = (box) => + { + onSerializedValue?.Invoke(box.Selected.ToString()); + return true; + } + }; + break; + case TypeCode.Byte: + case TypeCode.SByte: + case TypeCode.Int16: + case TypeCode.Char: + case TypeCode.UInt16: + case TypeCode.Int32: + case TypeCode.UInt32: + case TypeCode.Int64: + case TypeCode.UInt64: + new GUINumberInput(new RectTransform(relativeSize, layoutGroup.RectTransform), NumberType.Int) + { + IntValue = (int)Convert.ChangeType(this.Value, TypeCode.Int32)!, + OnValueChanged = (num) => + { + onSerializedValue?.Invoke(num.IntValue.ToString()); + } + }; + break; + case TypeCode.Single: + case TypeCode.Double: + new GUINumberInput(new RectTransform(relativeSize, layoutGroup.RectTransform), NumberType.Float) + { + FloatValue = (float)Convert.ChangeType(this.Value, TypeCode.Single)!, + OnValueChanged = (num) => + { + onSerializedValue?.Invoke(num.FloatValue.ToString()); + } + }; + break; + case TypeCode.String: + default: + base.AddDisplayComponent(layoutGroup, relativeSize, onSerializedValue); + break; + } + } +#endif } diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/SettingsFileParserService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/SettingsFileParserService.cs index 70699e6c4..4e0231e16 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/SettingsFileParserService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/SettingsFileParserService.cs @@ -75,7 +75,7 @@ public sealed class SettingsFileParserService : continue; } - var packageIdent = res.path.ContentPackage.ToIdentifier().ToString(); + var packageIdent = res.path.ContentPackage!.Name; foreach (var element in settingElements) {