From 83c198bc26c630ca7e44fd74085e7589c8475da9 Mon Sep 17 00:00:00 2001 From: MapleWheels Date: Tue, 3 Mar 2026 20:45:51 -0500 Subject: [PATCH] [Save/Sync] Commit work before .NET 10 tests. --- .../LuaCs/Services/ConfigService.cs | 2 + .../ModsControlsSettingsMenu.cs | 2 +- .../ModsGameplaySettingsMenu.cs | 101 ++++++++++++++---- .../ModsSettingsMenuBase.cs} | 4 +- .../{ => _SettingsMenu}/SettingsMenuSystem.cs | 2 +- .../LuaCs/Data/ISettingTypeDef.cs | 1 + .../SharedSource/LuaCs/Data/SettingBase.cs | 1 + .../LuaCs/_Services/ConfigService.cs | 6 +- 8 files changed, 91 insertions(+), 28 deletions(-) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/{ => _SettingsMenu}/ModsControlsSettingsMenu.cs (98%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/{ => _SettingsMenu}/ModsGameplaySettingsMenu.cs (60%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/{ModsSettingsMenu.cs => _SettingsMenu/ModsSettingsMenuBase.cs} (89%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/{ => _SettingsMenu}/SettingsMenuSystem.cs (97%) diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ConfigService.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ConfigService.cs index 556b46757..a8f340eb1 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ConfigService.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ConfigService.cs @@ -18,6 +18,8 @@ public sealed partial class ConfigService return _settingsInstances.Values .Where(s => !s.IsDisposed) .Where(s => s.GetDisplayInfo().ShowInMenus) + .Where(s => !GameMain.IsMultiplayer || s.GetConfigInfo().NetSync != NetSync.ServerAuthority) + .Where(s => s.GetConfigInfo().EditableStates >= _infoProvider.CurrentRunState) .ToImmutableArray(); } } diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ModsControlsSettingsMenu.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsControlsSettingsMenu.cs similarity index 98% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ModsControlsSettingsMenu.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsControlsSettingsMenu.cs index 8b8806b7e..a1243feca 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ModsControlsSettingsMenu.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsControlsSettingsMenu.cs @@ -1,6 +1,6 @@ namespace Barotrauma.LuaCs; -internal sealed class ModsControlsSettingsMenu : ModsSettingsMenu +internal sealed class ModsControlsSettingsMenu : ModsSettingsMenuBase { public ModsControlsSettingsMenu(GUIFrame contentFrame, IPackageManagementService packageManagementService, diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ModsGameplaySettingsMenu.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsGameplaySettingsMenu.cs similarity index 60% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ModsGameplaySettingsMenu.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsGameplaySettingsMenu.cs index 43c3fc6a7..d46394e82 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ModsGameplaySettingsMenu.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsGameplaySettingsMenu.cs @@ -3,10 +3,11 @@ using System.Collections.Immutable; using Microsoft.Xna.Framework; using System.Linq; using Barotrauma.LuaCs.Data; +// ReSharper disable ObjectCreationAsStatement namespace Barotrauma.LuaCs; -internal sealed class ModsGameplaySettingsMenu : ModsSettingsMenu +internal sealed class ModsGameplaySettingsMenu : ModsSettingsMenuBase { private readonly ImmutableArray _settingsInstancesGameplay; // menu vars @@ -57,65 +58,121 @@ internal sealed class ModsGameplaySettingsMenu : ModsSettingsMenu _modCategoryDisplayGroup.RectTransform.RelativeSize = new Vector2(0.3f, 1f); _settingsDisplayGroup.RectTransform.RelativeSize = new Vector2(0.7f, 1f); - GenerateCategoryListDisplay(_modCategoryDisplayGroup, GetDisplayCategoriesList()); + GenerateCategoryListDisplay(_modCategoryDisplayGroup, GetTargetPackagesList(), GetDisplayCategoriesList()); GenerateSettingsListDisplay(_settingsDisplayGroup, GetDisplaySettingsList()); void GenerateDisplayFromFilter(string text) { _selectedSearchQuery = text; - GenerateCategoryListDisplay(_modCategoryDisplayGroup, GetDisplayCategoriesList()); + GenerateCategoryListDisplay(_modCategoryDisplayGroup, GetTargetPackagesList(), GetDisplayCategoriesList()); GenerateSettingsListDisplay(_settingsDisplayGroup, GetDisplaySettingsList()); } + + string GetLocalizedString(string identifier) + { + var lstr = TextManager.Get(identifier); + return lstr.IsNullOrWhiteSpace() ? "General" : lstr.Value; + } + // Filters by selected package and query text ImmutableArray GetDisplayCategoriesList() { - return _settingsInstancesGameplay - .Select(s => s.GetDisplayInfo().DisplayCategory) + return GetFilteredSettingsList() + .Select(s => GetLocalizedString(s.GetDisplayInfo().DisplayCategory)) .Distinct() .ToImmutableArray(); } - ImmutableArray GetDisplaySettingsList() + // Filters by query text + ImmutableArray GetTargetPackagesList() { return _settingsInstancesGameplay + .Where(s => SettingMatchesQuery(s, _selectedSearchQuery)) + .Select(s => s.OwnerPackage) + .Distinct() + .ToImmutableArray(); + } + + // Filters by selected package, query text, and selected category. + ImmutableArray GetDisplaySettingsList() + { + return GetFilteredSettingsList() .Where(s => _selectedCategory.IsNullOrWhiteSpace() - || s.GetDisplayInfo().DisplayCategory == _selectedCategory) + || GetLocalizedString(s.GetDisplayInfo().DisplayCategory) == _selectedCategory) + .ToImmutableArray(); + } + + // Filters by selected package and by query text. + ImmutableArray GetFilteredSettingsList() + { + return _settingsInstancesGameplay + .Where(s => SettingMatchesQuery(s, _selectedSearchQuery)) .Where(s => _selectedContentPackage is null + || _selectedContentPackage == ContentPackageManager.VanillaCorePackage // vanilla is treated as all packages || s.OwnerPackage == _selectedContentPackage) .ToImmutableArray(); } + + + bool SettingMatchesQuery(ISettingBase setting, string queryText) + { + if (queryText.IsNullOrWhiteSpace()) + { + return true; + } + + queryText = queryText.ToLowerInvariant().Trim(); - void GenerateCategoryListDisplay(GUILayoutGroup layoutGroup, ImmutableArray categoryIdents) + if (setting.InternalName.ToLowerInvariant().Trim().Contains(queryText) || setting.OwnerPackage.Name.ToLowerInvariant().Trim().Contains(queryText)) + { + return true; + } + + var displayInfo = setting.GetDisplayInfo(); + return TextManager.Get(displayInfo.DisplayName).Value.ToLowerInvariant().Trim().Contains(queryText) + || TextManager.Get(displayInfo.DisplayCategory).Value.ToLowerInvariant().Trim().Contains(queryText) + || TextManager.Get(displayInfo.Description).Value.ToLowerInvariant().Trim().Contains(queryText) + || TextManager.Get(displayInfo.Tooltip).Value.ToLowerInvariant().Trim().Contains(queryText); + } + + string GetPackageName(ContentPackage package) + { + return package is null || package == ContentPackageManager.VanillaCorePackage ? "All" : package.Name; + } + + void GenerateCategoryListDisplay(GUILayoutGroup layoutGroup, ImmutableArray packagesList, + ImmutableArray categories) { layoutGroup.ClearChildren(); - - var packages = _settingsInstancesGameplay.Select(s => s.OwnerPackage) - .Distinct() - .OrderBy(cp => cp.Name) - .ToImmutableArray(); - var packageSelectionList = GUIUtil.Dropdown(layoutGroup, cp => cp.Name, null, - packages, packages.Length > 0 ? packages[0] : null, cp => + var packageSelectionList = GUIUtil.Dropdown(layoutGroup, cp => GetPackageName(cp), null, + packagesList, packagesList.Length > 0 ? packagesList[0] : null, cp => { - _selectedContentPackage = cp; - _selectedCategory = string.Empty; - GenerateCategoryListDisplay(_modCategoryDisplayGroup, GetDisplayCategoriesList()); + _selectedContentPackage = cp == ContentPackageManager.VanillaCorePackage ? null : 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)); - float size_y = MathF.Max(categoryIdents.Length * 0.122f, 1f); + 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) { CanBeFocused = false }; var displayCategoriesLayout = new GUILayoutGroup(new RectTransform(Vector2.One, displayedCategoriesFrame.RectTransform)); - foreach (var category in categoryIdents) + foreach (var category in categories) { DebugConsole.Log(category); - new GUIButton(new RectTransform(new Vector2(1f, 0.122f), displayCategoriesLayout.RectTransform), text: TextManager.Get(category)) + var btn = new GUIButton(new RectTransform(new Vector2(1f, 0.122f), displayCategoriesLayout.RectTransform), + text: category, color: Color.TransparentBlack) { CanBeFocused = true, CanBeSelected = true, + TextColor = Color.PeachPuff, + HoverColor = new Color(50, 50, 50, 255), + HoverTextColor = Color.White, + SelectedColor = new Color(50, 50, 50, 255), + SelectedTextColor = Color.White, OnPressed = () => { _selectedCategory = category; @@ -124,8 +181,6 @@ internal sealed class ModsGameplaySettingsMenu : ModsSettingsMenu } }; } - - } void GenerateSettingsListDisplay(GUILayoutGroup layoutGroup, ImmutableArray settings) diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ModsSettingsMenu.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsSettingsMenuBase.cs similarity index 89% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ModsSettingsMenu.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsSettingsMenuBase.cs index b228d1da5..dc7cd8b6f 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ModsSettingsMenu.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsSettingsMenuBase.cs @@ -4,14 +4,14 @@ using Microsoft.Xna.Framework; namespace Barotrauma.LuaCs; -internal abstract class ModsSettingsMenu : IDisposable +internal abstract class ModsSettingsMenuBase : IDisposable { public GUIFrame ContentFrame { get; private set; } protected IPackageManagementService PackageManagementService { get; private set; } protected IConfigService ConfigService { get; private set; } protected SettingsMenu SettingsMenuInstance { get; private set; } - protected ModsSettingsMenu(GUIFrame contentFrame, + protected ModsSettingsMenuBase(GUIFrame contentFrame, IPackageManagementService packageManagementService, IConfigService configService, SettingsMenu settingsMenuInstance) { diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/SettingsMenuSystem.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/SettingsMenuSystem.cs similarity index 97% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/SettingsMenuSystem.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/SettingsMenuSystem.cs index df664031c..055b206b4 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/SettingsMenuSystem.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/SettingsMenuSystem.cs @@ -42,7 +42,7 @@ public class SettingsMenuSystem : ISettingsMenuSystem var gameplayContentFrame = CreateNewContentTab(tabGameplayIndex, __instance, "SettingsMenuTab.Mods", "LuaCsForBarotrauma.SettingsMenu.ModGameplayButton"); var controlsContentFrame = CreateNewContentTab(tabControlsIndex, __instance, - "SettingsMenuTab.Mods", "LuaCsForBarotrauma.SettingsMenu.ModControlsButton"); + "SettingsMenuTab.Controls", "LuaCsForBarotrauma.SettingsMenu.ModControlsButton"); _gameplayMenuInstance = new ModsGameplaySettingsMenu(gameplayContentFrame, _packageManagementService, _configService, __instance); _controlsMenuInstance = new ModsControlsSettingsMenu(controlsContentFrame, _packageManagementService, _configService, __instance); diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/ISettingTypeDef.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/ISettingTypeDef.cs index aca15df9d..3cb0e0364 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/ISettingTypeDef.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/ISettingTypeDef.cs @@ -26,6 +26,7 @@ public interface ISettingBase : IDataInfo, IEquatable, IDisposable T CreateInstance([NotNull]IConfigInfo configInfo, Func, bool> valueChangePredicate); } + IConfigInfo GetConfigInfo(); #if CLIENT IConfigDisplayInfo GetDisplayInfo(); #endif diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingBase.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingBase.cs index 7e9ee3697..ccfbe40df 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingBase.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingBase.cs @@ -17,6 +17,7 @@ public abstract class SettingBase : ISettingBase public string InternalName => ConfigInfo.InternalName; public ContentPackage OwnerPackage => ConfigInfo.OwnerPackage; + public IConfigInfo GetConfigInfo() => ConfigInfo; #if CLIENT public IConfigDisplayInfo GetDisplayInfo() => ConfigInfo; #endif diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/ConfigService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/ConfigService.cs index ec3c131c6..903e3103d 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/ConfigService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/ConfigService.cs @@ -80,6 +80,7 @@ public sealed partial class ConfigService : IConfigService _configInfoParserService = null; _configProfileInfoParserService = null; _commandsService = null; + _infoProvider = null; } public FluentResults.Result Reset() @@ -140,6 +141,7 @@ public sealed partial class ConfigService : IConfigService private ILoggerService _logger; private IEventService _eventService; private IConsoleCommandsService _commandsService; + private ILuaCsInfoProvider _infoProvider; private IParserServiceOneToManyAsync _configInfoParserService; private IParserServiceOneToManyAsync _configProfileInfoParserService; @@ -148,7 +150,8 @@ public sealed partial class ConfigService : IConfigService IParserServiceOneToManyAsync configInfoParserService, IParserServiceOneToManyAsync configProfileInfoParserService, IEventService eventService, - IConsoleCommandsService commandsService) + IConsoleCommandsService commandsService, + ILuaCsInfoProvider infoProvider) { _logger = logger; _storageService = storageService; @@ -156,6 +159,7 @@ public sealed partial class ConfigService : IConfigService _configProfileInfoParserService = configProfileInfoParserService; _eventService = eventService; _commandsService = commandsService; + _infoProvider = infoProvider; _storageService.UseCaching = true; InjectCommands(commandsService);