From d4013ec6e7ef9f91bd10d59a7d10ac5a7c9a4ead Mon Sep 17 00:00:00 2001 From: dolphinspired Date: Fri, 27 Oct 2023 07:22:14 -0400 Subject: [PATCH 01/10] Add world gen opts to ValheimServerOptions --- ValheimServerGUI/Game/ValheimServer.cs | 20 +++++ ValheimServerGUI/Game/ValheimServerOptions.cs | 38 +++++++++ ValheimServerGUI/Game/WorldGenKeys.cs | 20 +++++ ValheimServerGUI/Game/WorldGenModifiers.cs | 78 +++++++++++++++++++ ValheimServerGUI/Game/WorldGenPresets.cs | 26 +++++++ 5 files changed, 182 insertions(+) create mode 100644 ValheimServerGUI/Game/WorldGenKeys.cs create mode 100644 ValheimServerGUI/Game/WorldGenModifiers.cs create mode 100644 ValheimServerGUI/Game/WorldGenPresets.cs diff --git a/ValheimServerGUI/Game/ValheimServer.cs b/ValheimServerGUI/Game/ValheimServer.cs index 2edacfa..0814eed 100644 --- a/ValheimServerGUI/Game/ValheimServer.cs +++ b/ValheimServerGUI/Game/ValheimServer.cs @@ -366,6 +366,26 @@ private static string GenerateArgs(IValheimServerOptions options) processArgs += " -crossplay"; } + if (!string.IsNullOrWhiteSpace(options.WorldPreset)) + { + processArgs += $" -preset {options.WorldPreset}"; + } + else if (options.WorldModifiers != null) + { + foreach (var (key, value) in options.WorldModifiers) + { + processArgs += $" -modifier {key} {value}"; + } + } + + if (options.WorldKeys != null) + { + foreach (var key in options.WorldKeys) + { + processArgs += $" -setkey {key}"; + } + } + if (!string.IsNullOrWhiteSpace(options.AdditionalArgs)) { processArgs += $" {options.AdditionalArgs}"; diff --git a/ValheimServerGUI/Game/ValheimServerOptions.cs b/ValheimServerGUI/Game/ValheimServerOptions.cs index b704042..989feee 100644 --- a/ValheimServerGUI/Game/ValheimServerOptions.cs +++ b/ValheimServerGUI/Game/ValheimServerOptions.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; namespace ValheimServerGUI.Game { @@ -34,6 +36,12 @@ public class ValheimServerOptions : IValheimServerOptions public Action LogMessageHandler { get; set; } + public string WorldPreset { get; set; } + + public Dictionary WorldModifiers { get; set; } + + public HashSet WorldKeys { get; set; } + public void Validate() { // Ensure all required fields exist @@ -65,6 +73,30 @@ public void Validate() if (SaveInterval > BackupShort || SaveInterval > BackupLong) throw new ArgumentException($"Save interval must be less than or equal to the backup intervals."); if (BackupShort > BackupLong) throw new ArgumentException($"Short backup interval must be less than or equal to the long backup interval."); + // World generation settings + if (WorldPreset != null) + { + if (!WorldGenPresets.All.Contains(WorldPreset)) throw new ArgumentException($"World preset value '${WorldPreset}' is not allowed. Supported values are: ${string.Join(", ", WorldGenPresets.All)}"); + if (WorldModifiers != null && WorldModifiers.Count > 0) throw new ArgumentException($"World modifiers may not be set when a world preset is selected."); + } + else if (WorldModifiers != null) + { + foreach (var (key, value) in WorldModifiers) + { + if (!WorldGenModifiers.All.Contains(key)) throw new ArgumentException($"World modifier key '${key}' is not allowed. Supported values are: ${string.Join(", ", WorldGenModifiers.All)}"); + var allowedValues = WorldGenModifiers.AllowedValues[key]; + if (!allowedValues.Contains(value)) throw new ArgumentException($"World modifier value '${value}' is not allowed for key '${key}'. Supported values are: ${string.Join(", ", allowedValues)}"); + } + } + + if (WorldKeys != null) + { + foreach (var key in WorldKeys) + { + if (!WorldGenKeys.All.Contains(key)) throw new ArgumentException($"World key value '${key}' is not allowed. Supported values are: ${string.Join(", ", WorldGenKeys.All)}"); + } + } + // Additional args // Using the native -logFile command will prevent logs from being piped to VSG, so don't allow it. if (AdditionalArgs.ToLower().Contains("-logfile")) throw new ArgumentException($"ValheimServerGUI does not support the '-logFile' server argument. Instead, enable writing server logs to file under Advanced Controls."); @@ -106,5 +138,11 @@ public interface IValheimServerOptions bool LogToFile { get; } Action LogMessageHandler { get; } + + public string WorldPreset { get; } + + public Dictionary WorldModifiers { get; } + + public HashSet WorldKeys { get; } } } diff --git a/ValheimServerGUI/Game/WorldGenKeys.cs b/ValheimServerGUI/Game/WorldGenKeys.cs new file mode 100644 index 0000000..23a3cb3 --- /dev/null +++ b/ValheimServerGUI/Game/WorldGenKeys.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; + +namespace ValheimServerGUI.Game +{ + public static class WorldGenKeys + { + public const string NoBuildCost = "nobuildcost"; + public const string PlayerEvents = "playerevents"; + public const string PassiveMobs = "passivemobs"; + public const string NoMap = "nomap"; + + public static readonly IReadOnlyList All = new List + { + NoBuildCost, + PlayerEvents, + PassiveMobs, + NoMap, + }; + } +} diff --git a/ValheimServerGUI/Game/WorldGenModifiers.cs b/ValheimServerGUI/Game/WorldGenModifiers.cs new file mode 100644 index 0000000..3224b4b --- /dev/null +++ b/ValheimServerGUI/Game/WorldGenModifiers.cs @@ -0,0 +1,78 @@ +using System.Collections.Generic; + +namespace ValheimServerGUI.Game +{ + public static class WorldGenModifiers + { + public const string Combat = "combat"; + public const string DeathPenalty = "deathpenalty"; + public const string Resources = "resources"; + public const string Raids = "raids"; + public const string Portals = "portals"; + + public static readonly IReadOnlyList All = new List() + { + Combat, + DeathPenalty, + Resources, + Raids, + Portals, + }; + + public static readonly IReadOnlyDictionary AllowedValues = new Dictionary() + { + { + Combat, + new[] + { + "veryeasy", + "easy", + "hard", + "veryhard", + } + }, + { + DeathPenalty, + new[] + { + "casual", + "veryeasy", + "easy", + "hard", + "hardcore", + } + }, + { + Resources, + new[] + { + "muchless", + "less", + "more", + "muchmore", + "most", + } + }, + { + Raids, + new[] + { + "none", + "muchless", + "less", + "more", + "muchmore", + } + }, + { + Portals, + new[] + { + "casual", + "hard", + "veryhard", + } + }, + }; + } +} diff --git a/ValheimServerGUI/Game/WorldGenPresets.cs b/ValheimServerGUI/Game/WorldGenPresets.cs new file mode 100644 index 0000000..93abca8 --- /dev/null +++ b/ValheimServerGUI/Game/WorldGenPresets.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + +namespace ValheimServerGUI.Game +{ + public static class WorldGenPresets + { + public const string Normal = "normal"; + public const string Casual = "casual"; + public const string Easy = "easy"; + public const string Hard = "hard"; + public const string Hardcore = "hardcore"; + public const string Immersive = "immersive"; + public const string Hammer = "hammer"; + + public static readonly IReadOnlyList All = new List() + { + Normal, + Casual, + Easy, + Hard, + Hardcore, + Immersive, + Hammer, + }; + } +} From 1a74f4065dd384f43bbfcbc7067ec46891018a9a Mon Sep 17 00:00:00 2001 From: dolphinspired Date: Fri, 27 Oct 2023 08:13:04 -0400 Subject: [PATCH 02/10] Add WorldPreferences to UserPreferences --- ValheimServerGUI/Game/UserPreferences.cs | 22 ++++++++++ ValheimServerGUI/Game/UserPreferencesFile.cs | 3 ++ ValheimServerGUI/Game/WorldPreferences.cs | 43 +++++++++++++++++++ ValheimServerGUI/Game/WorldPreferencesFile.cs | 20 +++++++++ 4 files changed, 88 insertions(+) create mode 100644 ValheimServerGUI/Game/WorldPreferences.cs create mode 100644 ValheimServerGUI/Game/WorldPreferencesFile.cs diff --git a/ValheimServerGUI/Game/UserPreferences.cs b/ValheimServerGUI/Game/UserPreferences.cs index 6f533d3..3739470 100644 --- a/ValheimServerGUI/Game/UserPreferences.cs +++ b/ValheimServerGUI/Game/UserPreferences.cs @@ -27,6 +27,8 @@ public class UserPreferences public List Servers { get; set; } = new(); + public List Worlds { get; set; } = new(); + public static UserPreferences FromFile(UserPreferencesFile file) { var prefs = new UserPreferences(); @@ -50,6 +52,15 @@ public static UserPreferences FromFile(UserPreferencesFile file) .ToList(); } + if (file.Worlds != null) + { + prefs.Worlds = file.Worlds + .Where(f => f != null) + .Select(f => WorldPreferences.FromFile(f)) + .DistinctBy(f => f.WorldName) + .ToList(); + } + return prefs; } @@ -65,6 +76,7 @@ public UserPreferencesFile ToFile() SaveProfileOnStart = SaveProfileOnStart, WriteApplicationLogsToFile = WriteApplicationLogsToFile, Servers = new(), + Worlds = new(), }; if (Servers != null) @@ -77,6 +89,16 @@ public UserPreferencesFile ToFile() file.Servers.AddRange(servers); } + if (Worlds != null) + { + var worlds = Worlds + .Select(p => p.ToFile()) + .Where(p => !string.IsNullOrWhiteSpace(p.WorldName)) // Remove world settings with no name + .DistinctBy(p => p.WorldName); // Remove duplicate entries by world name + + file.Worlds.AddRange(worlds); + } + return file; } } diff --git a/ValheimServerGUI/Game/UserPreferencesFile.cs b/ValheimServerGUI/Game/UserPreferencesFile.cs index aca18b8..a8c715e 100644 --- a/ValheimServerGUI/Game/UserPreferencesFile.cs +++ b/ValheimServerGUI/Game/UserPreferencesFile.cs @@ -43,5 +43,8 @@ public class UserPreferencesFile [JsonProperty("servers")] public List Servers { get; set; } + + [JsonProperty("worlds")] + public List Worlds { get; set; } } } diff --git a/ValheimServerGUI/Game/WorldPreferences.cs b/ValheimServerGUI/Game/WorldPreferences.cs new file mode 100644 index 0000000..25aecb2 --- /dev/null +++ b/ValheimServerGUI/Game/WorldPreferences.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using System.Linq; + +namespace ValheimServerGUI.Game +{ + public class WorldPreferences + { + public string WorldName { get; set; } + + public string Preset { get; set; } + + public Dictionary Modifiers { get; set; } = new(); + + public HashSet Keys { get; set; } = new(); + + public static WorldPreferences FromFile(WorldPreferencesFile file) + { + var prefs = new WorldPreferences(); + + if (file == null) return prefs; + + prefs.WorldName = file.WorldName; + prefs.Preset = file.Preset; + prefs.Modifiers = file.Modifiers; + prefs.Keys = file.Keys.ToHashSet(); + + return prefs; + } + + public WorldPreferencesFile ToFile() + { + var file = new WorldPreferencesFile() + { + WorldName = WorldName, + Preset = Preset, + Modifiers = Modifiers, + Keys = Keys.ToList(), + }; + + return file; + } + } +} diff --git a/ValheimServerGUI/Game/WorldPreferencesFile.cs b/ValheimServerGUI/Game/WorldPreferencesFile.cs new file mode 100644 index 0000000..b982271 --- /dev/null +++ b/ValheimServerGUI/Game/WorldPreferencesFile.cs @@ -0,0 +1,20 @@ +using Newtonsoft.Json; +using System.Collections.Generic; + +namespace ValheimServerGUI.Game +{ + public class WorldPreferencesFile + { + [JsonProperty("worldName")] + public string WorldName { get; set; } + + [JsonProperty("preset")] + public string Preset { get; set; } + + [JsonProperty("modifiers")] + public Dictionary Modifiers { get; set; } + + [JsonProperty("keys")] + public List Keys { get; set; } + } +} From 875b439ebe0cbb13e85f8be4efbaad3a5b7624eb Mon Sep 17 00:00:00 2001 From: dolphinspired Date: Fri, 27 Oct 2023 08:27:12 -0400 Subject: [PATCH 03/10] Add WorldPreferencesProvider --- ValheimServerGUI/Game/WorldPreferences.cs | 7 +- ValheimServerGUI/Game/WorldPreferencesFile.cs | 4 + .../Game/WorldPreferencesProvider.cs | 105 ++++++++++++++++++ ValheimServerGUI/Program.cs | 1 + 4 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 ValheimServerGUI/Game/WorldPreferencesProvider.cs diff --git a/ValheimServerGUI/Game/WorldPreferences.cs b/ValheimServerGUI/Game/WorldPreferences.cs index 25aecb2..9e31c31 100644 --- a/ValheimServerGUI/Game/WorldPreferences.cs +++ b/ValheimServerGUI/Game/WorldPreferences.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; namespace ValheimServerGUI.Game @@ -7,6 +8,8 @@ public class WorldPreferences { public string WorldName { get; set; } + public DateTime LastSaved { get; set; } = DateTime.UnixEpoch; + public string Preset { get; set; } public Dictionary Modifiers { get; set; } = new(); @@ -20,6 +23,7 @@ public static WorldPreferences FromFile(WorldPreferencesFile file) if (file == null) return prefs; prefs.WorldName = file.WorldName; + prefs.LastSaved = file.LastSaved ?? prefs.LastSaved; prefs.Preset = file.Preset; prefs.Modifiers = file.Modifiers; prefs.Keys = file.Keys.ToHashSet(); @@ -32,6 +36,7 @@ public WorldPreferencesFile ToFile() var file = new WorldPreferencesFile() { WorldName = WorldName, + LastSaved = LastSaved, Preset = Preset, Modifiers = Modifiers, Keys = Keys.ToList(), diff --git a/ValheimServerGUI/Game/WorldPreferencesFile.cs b/ValheimServerGUI/Game/WorldPreferencesFile.cs index b982271..ae6ae3a 100644 --- a/ValheimServerGUI/Game/WorldPreferencesFile.cs +++ b/ValheimServerGUI/Game/WorldPreferencesFile.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json; +using System; using System.Collections.Generic; namespace ValheimServerGUI.Game @@ -8,6 +9,9 @@ public class WorldPreferencesFile [JsonProperty("worldName")] public string WorldName { get; set; } + [JsonProperty("lastSaved")] + public DateTime? LastSaved { get; set; } + [JsonProperty("preset")] public string Preset { get; set; } diff --git a/ValheimServerGUI/Game/WorldPreferencesProvider.cs b/ValheimServerGUI/Game/WorldPreferencesProvider.cs new file mode 100644 index 0000000..cddea24 --- /dev/null +++ b/ValheimServerGUI/Game/WorldPreferencesProvider.cs @@ -0,0 +1,105 @@ +using Serilog; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ValheimServerGUI.Game +{ + public interface IWorldPreferencesProvider + { + event EventHandler> PreferencesSaved; + + WorldPreferences LoadPreferences(string worldName); + + IEnumerable LoadPreferences(); + + void SavePreferences(WorldPreferences preferences); + + void RemovePreferences(string worldName); + } + + public class WorldPreferencesProvider : IWorldPreferencesProvider + { + private readonly IUserPreferencesProvider UserPreferencesProvider; + private readonly ILogger Logger; + + public WorldPreferencesProvider(IUserPreferencesProvider userPreferencesProvider, ILogger logger) + { + UserPreferencesProvider = userPreferencesProvider; + Logger = logger; + + UserPreferencesProvider.PreferencesSaved += OnPreferencesSaved; + } + + #region IWorldPreferencesProvider implementation + + public event EventHandler> PreferencesSaved; + + public WorldPreferences LoadPreferences(string worldName) + { + if (string.IsNullOrWhiteSpace(worldName)) throw new ArgumentException($"{nameof(worldName)} must not be null or whitespace"); + + var prefs = LoadPreferences().Where(p => p.WorldName == worldName).ToList(); + + if (prefs.Count == 0) + { + return null; + } + else if (prefs.Count > 1) + { + Logger.Warning("Multiple configurations found for world '{worldName}'. Returning the most recently updated one.", worldName); + return prefs.OrderByDescending(p => p.LastSaved).First(); + } + + return prefs.Single(); + } + + public IEnumerable LoadPreferences() + { + return UserPreferencesProvider.LoadPreferences().Worlds; + } + + public void SavePreferences(WorldPreferences preferences) + { + if (preferences == null) return; + + var userPrefs = UserPreferencesProvider.LoadPreferences(); + + // Remove any existing world preferences with this name + userPrefs.Worlds.RemoveAll(p => p.WorldName == preferences.WorldName); + userPrefs.Worlds.Add(preferences); + + preferences.LastSaved = DateTime.UtcNow; + + UserPreferencesProvider.SavePreferences(userPrefs); + Logger.Information("Saved preferences for world: {worldName}", preferences.WorldName); + } + + public void RemovePreferences(string worldName) + { + if (string.IsNullOrWhiteSpace(worldName)) return; + + var userPrefs = UserPreferencesProvider.LoadPreferences(); + + if (userPrefs.Worlds.Any(p => p.WorldName == worldName)) + { + // Remove any existing world preferences with this name + userPrefs.Worlds.RemoveAll(p => p.WorldName == worldName); + + UserPreferencesProvider.SavePreferences(userPrefs); + Logger.Information("Removed preferences for world: {worldName}", worldName); + } + } + + #endregion + + #region Non-public methods + + private void OnPreferencesSaved(object sender, UserPreferences preferences) + { + PreferencesSaved?.Invoke(this, preferences.Worlds); + } + + #endregion + } +} diff --git a/ValheimServerGUI/Program.cs b/ValheimServerGUI/Program.cs index 57b0405..6317a4c 100644 --- a/ValheimServerGUI/Program.cs +++ b/ValheimServerGUI/Program.cs @@ -67,6 +67,7 @@ public static void ConfigureServices(IServiceCollection services, string[] args) .AddSingleton() .AddSingleton() .AddSingleton() + .AddSingleton() .AddSingleton(startupArgsProvider) .AddTransient(); From 85d475dcb6da17d2603fbdee6f687ae9a242edcf Mon Sep 17 00:00:00 2001 From: dolphinspired Date: Sat, 28 Oct 2023 06:34:21 -0400 Subject: [PATCH 04/10] Create constants from modifier values --- ValheimServerGUI/Game/WorldGenModifiers.cs | 74 +++++++++++++++------- 1 file changed, 52 insertions(+), 22 deletions(-) diff --git a/ValheimServerGUI/Game/WorldGenModifiers.cs b/ValheimServerGUI/Game/WorldGenModifiers.cs index 3224b4b..cade9c1 100644 --- a/ValheimServerGUI/Game/WorldGenModifiers.cs +++ b/ValheimServerGUI/Game/WorldGenModifiers.cs @@ -10,6 +10,36 @@ public static class WorldGenModifiers public const string Raids = "raids"; public const string Portals = "portals"; + public static class Values + { + public const string CombatVeryEasy = "veryeasy"; + public const string CombatEasy = "easy"; + public const string CombatHard = "hard"; + public const string CombatVeryHard = "veryhard"; + + public const string DeathPenaltyCasual = "casual"; + public const string DeathPenaltyVeryEasy = "veryeasy"; + public const string DeathPenaltyEasy = "easy"; + public const string DeathPenaltyHard = "hard"; + public const string DeathPenaltyHardcore = "hardcore"; + + public const string ResourcesMuchLess = "muchless"; + public const string ResourcesLess = "less"; + public const string ResourcesMore = "more"; + public const string ResourcesMuchMore = "muchmore"; + public const string ResourcesMost = "most"; + + public const string RaidsNone = "none"; + public const string RaidsMuchLess = "muchless"; + public const string RaidsLess = "less"; + public const string RaidsMore = "more"; + public const string RaidsMuchMore = "muchmore"; + + public const string PortalsCasual = "casual"; + public const string PortalsHard = "hard"; + public const string PortalsVeryHard = "veryhard"; + } + public static readonly IReadOnlyList All = new List() { Combat, @@ -25,52 +55,52 @@ public static class WorldGenModifiers Combat, new[] { - "veryeasy", - "easy", - "hard", - "veryhard", + Values.CombatVeryEasy, + Values.CombatEasy, + Values.CombatHard, + Values.CombatVeryHard, } }, { DeathPenalty, new[] { - "casual", - "veryeasy", - "easy", - "hard", - "hardcore", + Values.DeathPenaltyCasual, + Values.DeathPenaltyVeryEasy, + Values.DeathPenaltyEasy, + Values.DeathPenaltyHard, + Values.DeathPenaltyHardcore, } }, { Resources, new[] { - "muchless", - "less", - "more", - "muchmore", - "most", + Values.ResourcesMuchLess, + Values.ResourcesLess, + Values.ResourcesMore, + Values.ResourcesMuchMore, + Values.ResourcesMost, } }, { Raids, new[] { - "none", - "muchless", - "less", - "more", - "muchmore", + Values.RaidsNone, + Values.RaidsMuchLess, + Values.RaidsLess, + Values.RaidsMore, + Values.RaidsMuchMore, } }, { Portals, new[] { - "casual", - "hard", - "veryhard", + Values.PortalsCasual, + Values.PortalsHard, + Values.PortalsVeryHard, } }, }; From 2aa7af99cf1b3d2bb47af5f912574a2cdbafe92d Mon Sep 17 00:00:00 2001 From: dolphinspired Date: Sun, 29 Oct 2023 09:47:05 -0400 Subject: [PATCH 05/10] Add WorldPreferencesForm --- .../DictionaryExtensions.cs | 17 + .../Controls/SettingsButton.Designer.cs | 59 ++++ ValheimServerGUI/Controls/SettingsButton.cs | 33 ++ ValheimServerGUI/Controls/SettingsButton.resx | 120 +++++++ ValheimServerGUI/Forms/MainWindow.Designer.cs | 12 + ValheimServerGUI/Forms/MainWindow.cs | 62 ++++ ValheimServerGUI/Forms/MainWindow.resx | 16 +- .../Forms/WorldPreferencesForm.Designer.cs | 279 ++++++++++++++++ .../Forms/WorldPreferencesForm.cs | 314 ++++++++++++++++++ .../Forms/WorldPreferencesForm.resx | 168 ++++++++++ ValheimServerGUI/Program.cs | 3 +- 11 files changed, 1074 insertions(+), 9 deletions(-) create mode 100644 ValheimServerGUI.Tools/DictionaryExtensions.cs create mode 100644 ValheimServerGUI/Controls/SettingsButton.Designer.cs create mode 100644 ValheimServerGUI/Controls/SettingsButton.cs create mode 100644 ValheimServerGUI/Controls/SettingsButton.resx create mode 100644 ValheimServerGUI/Forms/WorldPreferencesForm.Designer.cs create mode 100644 ValheimServerGUI/Forms/WorldPreferencesForm.cs create mode 100644 ValheimServerGUI/Forms/WorldPreferencesForm.resx diff --git a/ValheimServerGUI.Tools/DictionaryExtensions.cs b/ValheimServerGUI.Tools/DictionaryExtensions.cs new file mode 100644 index 0000000..ccb0abe --- /dev/null +++ b/ValheimServerGUI.Tools/DictionaryExtensions.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using System.Linq; + +namespace ValheimServerGUI.Tools +{ + public static class DictionaryExtensions + { + /// + /// Returns a new dictionary where values become keys and vice-versa. + /// Probably throws an exception if any values are duplicated (i.e. would create a duplicate key). + /// + public static Dictionary Invert(this Dictionary dictionary) + { + return dictionary.ToDictionary(kvp => kvp.Value, kvp => kvp.Key); + } + } +} diff --git a/ValheimServerGUI/Controls/SettingsButton.Designer.cs b/ValheimServerGUI/Controls/SettingsButton.Designer.cs new file mode 100644 index 0000000..81040c9 --- /dev/null +++ b/ValheimServerGUI/Controls/SettingsButton.Designer.cs @@ -0,0 +1,59 @@ +namespace ValheimServerGUI.Controls +{ + partial class SettingsButton + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + IconButton = new IconButton(); + SuspendLayout(); + // + // IconButton + // + IconButton.ConfirmImage = null; + IconButton.HelpText = ""; + IconButton.IconClicked = null; + IconButton.Image = Properties.Resources.Settings_16x; + IconButton.Location = new System.Drawing.Point(0, 0); + IconButton.Name = "IconButton"; + IconButton.Size = new System.Drawing.Size(16, 16); + IconButton.TabIndex = 0; + // + // SettingsButton + // + AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + Controls.Add(IconButton); + Name = "SettingsButton"; + Size = new System.Drawing.Size(16, 16); + ResumeLayout(false); + } + + #endregion + + private IconButton IconButton; + } +} diff --git a/ValheimServerGUI/Controls/SettingsButton.cs b/ValheimServerGUI/Controls/SettingsButton.cs new file mode 100644 index 0000000..4a6eb17 --- /dev/null +++ b/ValheimServerGUI/Controls/SettingsButton.cs @@ -0,0 +1,33 @@ +using System; +using System.ComponentModel; +using System.Windows.Forms; + +namespace ValheimServerGUI.Controls +{ + public partial class SettingsButton : UserControl + { + [Browsable(false)] + public Action ClickFunction { get; set; } + + public string HelpText + { + get => IconButton.HelpText; + set => IconButton.HelpText = value; + } + + public SettingsButton() + { + InitializeComponent(); + + IconButton.IconClicked = OnIconClicked; + } + + private bool OnIconClicked() + { + if (ClickFunction == null) return false; + + ClickFunction.Invoke(); + return true; + } + } +} diff --git a/ValheimServerGUI/Controls/SettingsButton.resx b/ValheimServerGUI/Controls/SettingsButton.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ValheimServerGUI/Controls/SettingsButton.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ValheimServerGUI/Forms/MainWindow.Designer.cs b/ValheimServerGUI/Forms/MainWindow.Designer.cs index 0ce8c34..61121b3 100644 --- a/ValheimServerGUI/Forms/MainWindow.Designer.cs +++ b/ValheimServerGUI/Forms/MainWindow.Designer.cs @@ -65,6 +65,7 @@ private void InitializeComponent() CommunityServerField = new ValheimServerGUI.Controls.CheckboxFormField(); ServerCrossplayField = new ValheimServerGUI.Controls.CheckboxFormField(); WorldSelectGroupBox = new System.Windows.Forms.GroupBox(); + WorldsListSettingsButton = new ValheimServerGUI.Controls.SettingsButton(); WorldsListRefreshButton = new RefreshButton(); WorldsFolderOpenButton = new OpenButton(); WorldSelectNewNameField = new Controls.TextFormField(); @@ -405,6 +406,7 @@ private void InitializeComponent() // // WorldSelectGroupBox // + WorldSelectGroupBox.Controls.Add(WorldsListSettingsButton); WorldSelectGroupBox.Controls.Add(WorldsListRefreshButton); WorldSelectGroupBox.Controls.Add(WorldsFolderOpenButton); WorldSelectGroupBox.Controls.Add(WorldSelectNewNameField); @@ -418,6 +420,15 @@ private void InitializeComponent() WorldSelectGroupBox.TabStop = false; WorldSelectGroupBox.Text = "World"; // + // WorldsListSettingsButton + // + WorldsListSettingsButton.ClickFunction = null; + WorldsListSettingsButton.HelpText = "World Modifier Settings"; + WorldsListSettingsButton.Location = new System.Drawing.Point(166, 24); + WorldsListSettingsButton.Name = "WorldsListSettingsButton"; + WorldsListSettingsButton.Size = new System.Drawing.Size(16, 16); + WorldsListSettingsButton.TabIndex = 6; + // // WorldsListRefreshButton // WorldsListRefreshButton.HelpText = "Refresh the worlds list"; @@ -1308,5 +1319,6 @@ private void InitializeComponent() private ValheimServerGUI.Controls.CheckboxFormField ServerLogFileField; private OpenButton LogsFolderOpenButton; private System.Windows.Forms.LinkLabel LinkCharacterNamesHelp; + private ValheimServerGUI.Controls.SettingsButton WorldsListSettingsButton; } } \ No newline at end of file diff --git a/ValheimServerGUI/Forms/MainWindow.cs b/ValheimServerGUI/Forms/MainWindow.cs index a250b09..240c461 100644 --- a/ValheimServerGUI/Forms/MainWindow.cs +++ b/ValheimServerGUI/Forms/MainWindow.cs @@ -62,6 +62,7 @@ public string CurrentProfile private readonly IFormProvider FormProvider; private readonly IUserPreferencesProvider UserPrefsProvider; private readonly IServerPreferencesProvider ServerPrefsProvider; + private readonly IWorldPreferencesProvider WorldPrefsProvider; private readonly IPlayerDataRepository PlayerDataProvider; private readonly ValheimServer Server; private readonly IApplicationLogger Logger; @@ -72,6 +73,7 @@ public MainWindow( IFormProvider formProvider, IUserPreferencesProvider userPrefsProvider, IServerPreferencesProvider serverPrefsProvider, + IWorldPreferencesProvider worldPrefsProvider, IPlayerDataRepository playerDataProvider, ValheimServer server, IApplicationLogger appLogger, @@ -84,6 +86,7 @@ public MainWindow( FormProvider = formProvider; UserPrefsProvider = userPrefsProvider; ServerPrefsProvider = serverPrefsProvider; + WorldPrefsProvider = worldPrefsProvider; PlayerDataProvider = playerDataProvider; Server = server; Logger = appLogger; @@ -170,6 +173,7 @@ private void InitializeFormEvents() LinkCharacterNamesHelp.Click += LinkCharacterNamesHelp_Click; ButtonRemovePlayer.Click += ButtonRemovePlayer_Click; CopyButtonServerPassword.CopyFunction = () => ServerPasswordField.Value; + WorldsListSettingsButton.ClickFunction = WorldsListSettingsButton_Click; WorldsListRefreshButton.RefreshFunction = WorldsListRefreshButton_Click; WorldsFolderOpenButton.PathFunction = () => GetServerOptionsFromFormState().SaveDataFolderPath; CopyButtonExternalIpAddress.CopyFunction = () => LabelExternalIpAddress.Value; @@ -657,6 +661,44 @@ private void TrayContextMenuServerName_Click(object sender, EventArgs e) RefocusWindow(); } + private void WorldsListSettingsButton_Click() + { + string worldName; + + if (WorldSelectRadioNew.Value) + { + worldName = WorldSelectNewNameField.Value; + + if (string.IsNullOrWhiteSpace(worldName)) + { + MessageBox.Show( + "Please enter a new world name before changing modifier settings.", + "World Name Missing", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + return; + } + } + else + { + worldName = WorldSelectExistingNameField.Value; + + if (string.IsNullOrWhiteSpace(worldName)) + { + MessageBox.Show( + "Unable to change modifier settings. No world is selected.", + "World Name Missing", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + return; + } + } + + var form = FormProvider.GetForm(); + form.SetWorld(worldName); + form.ShowDialog(); + } + private void WorldsListRefreshButton_Click() { RefreshWorldSelect(); @@ -1128,6 +1170,26 @@ private ValheimServerOptions GetServerOptionsFromFormState() LogMessageHandler = this.BuildActionHandler(OnServerLogReceived), }; + // If a world is selected, load preferences for that world + var worldName = serverPrefs.WorldName; + if (!string.IsNullOrWhiteSpace(worldName)) + { + var worldPrefs = WorldPrefsProvider.LoadPreferences(worldName); + if (worldPrefs != null) + { + if (!string.IsNullOrEmpty(worldPrefs.Preset)) + { + options.WorldPreset = worldPrefs.Preset; + } + else + { + options.WorldModifiers = worldPrefs.Modifiers; + } + + options.WorldKeys = worldPrefs.Keys; + } + } + return options; } diff --git a/ValheimServerGUI/Forms/MainWindow.resx b/ValheimServerGUI/Forms/MainWindow.resx index aee98a5..1fe33cf 100644 --- a/ValheimServerGUI/Forms/MainWindow.resx +++ b/ValheimServerGUI/Forms/MainWindow.resx @@ -18,7 +18,7 @@ System.Resources.ResXResourceReader, System.Windows.Forms, ... System.Resources.ResXResourceWriter, System.Windows.Forms, ... this is my long stringthis is a comment - Blue + Blue [base64 mime encoded serialized .NET Framework object] @@ -123,13 +123,6 @@ 125, 17 - - If this box is checked, your server will show up in the Community Servers list within Valheim. -If not, other players will need to "Join by IP" to connect to your game. - -NOTE: It usually takes 1-2 minutes for your server to appear in the list in-game, but it can -take up to 15 minutes, and rarely not show up at all. You can always "Join by IP" as a fallback. - AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 @@ -137,6 +130,13 @@ take up to 15 minutes, and rarely not show up at all. You can always "Join by IP bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI CAkCAAAAAQAAAAEAAAARAgAAAAQAAAAGAwAAAAANAws= + + + If this box is checked, your server will show up in the Community Servers list within Valheim. +If not, other players will need to "Join by IP" to connect to your game. + +NOTE: It usually takes 1-2 minutes for your server to appear in the list in-game, but it can +take up to 15 minutes, and rarely not show up at all. You can always "Join by IP" as a fallback. Automatically start up this server when you open diff --git a/ValheimServerGUI/Forms/WorldPreferencesForm.Designer.cs b/ValheimServerGUI/Forms/WorldPreferencesForm.Designer.cs new file mode 100644 index 0000000..f798a3e --- /dev/null +++ b/ValheimServerGUI/Forms/WorldPreferencesForm.Designer.cs @@ -0,0 +1,279 @@ +namespace ValheimServerGUI.Forms +{ + partial class WorldPreferencesForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(WorldPreferencesForm)); + ModifiersGroupBox = new System.Windows.Forms.GroupBox(); + ModifierPortalsFormField = new ValheimServerGUI.Controls.DropdownFormField(); + ModifierResourcesFormField = new ValheimServerGUI.Controls.DropdownFormField(); + ModifierRaidsFormField = new ValheimServerGUI.Controls.DropdownFormField(); + ModifierDeathPenaltyFormField = new ValheimServerGUI.Controls.DropdownFormField(); + ModifierCombatFormField = new ValheimServerGUI.Controls.DropdownFormField(); + KeysGroupBox = new System.Windows.Forms.GroupBox(); + KeyNoMapFormField = new ValheimServerGUI.Controls.CheckboxFormField(); + KeyPassiveMobsFormField = new ValheimServerGUI.Controls.CheckboxFormField(); + KeyPlayerEventsFormField = new ValheimServerGUI.Controls.CheckboxFormField(); + KeyNoBuildCostFormField = new ValheimServerGUI.Controls.CheckboxFormField(); + PresetFormField = new ValheimServerGUI.Controls.DropdownFormField(); + ButtonCancel = new System.Windows.Forms.Button(); + ButtonOK = new System.Windows.Forms.Button(); + ButtonDefaults = new System.Windows.Forms.Button(); + ModifiersGroupBox.SuspendLayout(); + KeysGroupBox.SuspendLayout(); + SuspendLayout(); + // + // ModifiersGroupBox + // + ModifiersGroupBox.Controls.Add(ModifierPortalsFormField); + ModifiersGroupBox.Controls.Add(ModifierResourcesFormField); + ModifiersGroupBox.Controls.Add(ModifierRaidsFormField); + ModifiersGroupBox.Controls.Add(ModifierDeathPenaltyFormField); + ModifiersGroupBox.Controls.Add(ModifierCombatFormField); + ModifiersGroupBox.Location = new System.Drawing.Point(12, 59); + ModifiersGroupBox.Name = "ModifiersGroupBox"; + ModifiersGroupBox.Size = new System.Drawing.Size(200, 262); + ModifiersGroupBox.TabIndex = 1; + ModifiersGroupBox.TabStop = false; + ModifiersGroupBox.Text = "Modifiers"; + // + // ModifierPortalsFormField + // + ModifierPortalsFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ModifierPortalsFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierPortalsFormField.DataSource"); + ModifierPortalsFormField.DropdownEnabled = true; + ModifierPortalsFormField.EmptyText = ""; + ModifierPortalsFormField.HelpText = ""; + ModifierPortalsFormField.LabelText = "Portals"; + ModifierPortalsFormField.Location = new System.Drawing.Point(6, 210); + ModifierPortalsFormField.Name = "ModifierPortalsFormField"; + ModifierPortalsFormField.Size = new System.Drawing.Size(188, 41); + ModifierPortalsFormField.TabIndex = 5; + ModifierPortalsFormField.Value = null; + // + // ModifierResourcesFormField + // + ModifierResourcesFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ModifierResourcesFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierResourcesFormField.DataSource"); + ModifierResourcesFormField.DropdownEnabled = true; + ModifierResourcesFormField.EmptyText = ""; + ModifierResourcesFormField.HelpText = ""; + ModifierResourcesFormField.LabelText = "Resources"; + ModifierResourcesFormField.Location = new System.Drawing.Point(6, 163); + ModifierResourcesFormField.Name = "ModifierResourcesFormField"; + ModifierResourcesFormField.Size = new System.Drawing.Size(188, 41); + ModifierResourcesFormField.TabIndex = 4; + ModifierResourcesFormField.Value = null; + // + // ModifierRaidsFormField + // + ModifierRaidsFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ModifierRaidsFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierRaidsFormField.DataSource"); + ModifierRaidsFormField.DropdownEnabled = true; + ModifierRaidsFormField.EmptyText = ""; + ModifierRaidsFormField.HelpText = ""; + ModifierRaidsFormField.LabelText = "Raids"; + ModifierRaidsFormField.Location = new System.Drawing.Point(6, 116); + ModifierRaidsFormField.Name = "ModifierRaidsFormField"; + ModifierRaidsFormField.Size = new System.Drawing.Size(188, 41); + ModifierRaidsFormField.TabIndex = 3; + ModifierRaidsFormField.Value = null; + // + // ModifierDeathPenaltyFormField + // + ModifierDeathPenaltyFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ModifierDeathPenaltyFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierDeathPenaltyFormField.DataSource"); + ModifierDeathPenaltyFormField.DropdownEnabled = true; + ModifierDeathPenaltyFormField.EmptyText = ""; + ModifierDeathPenaltyFormField.HelpText = ""; + ModifierDeathPenaltyFormField.LabelText = "Death Penalty"; + ModifierDeathPenaltyFormField.Location = new System.Drawing.Point(6, 69); + ModifierDeathPenaltyFormField.Name = "ModifierDeathPenaltyFormField"; + ModifierDeathPenaltyFormField.Size = new System.Drawing.Size(188, 41); + ModifierDeathPenaltyFormField.TabIndex = 1; + ModifierDeathPenaltyFormField.Value = null; + // + // ModifierCombatFormField + // + ModifierCombatFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ModifierCombatFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierCombatFormField.DataSource"); + ModifierCombatFormField.DropdownEnabled = true; + ModifierCombatFormField.EmptyText = ""; + ModifierCombatFormField.HelpText = ""; + ModifierCombatFormField.LabelText = "Combat"; + ModifierCombatFormField.Location = new System.Drawing.Point(6, 22); + ModifierCombatFormField.Name = "ModifierCombatFormField"; + ModifierCombatFormField.Size = new System.Drawing.Size(188, 41); + ModifierCombatFormField.TabIndex = 0; + ModifierCombatFormField.Value = null; + // + // KeysGroupBox + // + KeysGroupBox.Controls.Add(KeyNoMapFormField); + KeysGroupBox.Controls.Add(KeyPassiveMobsFormField); + KeysGroupBox.Controls.Add(KeyPlayerEventsFormField); + KeysGroupBox.Controls.Add(KeyNoBuildCostFormField); + KeysGroupBox.Location = new System.Drawing.Point(222, 59); + KeysGroupBox.Name = "KeysGroupBox"; + KeysGroupBox.Size = new System.Drawing.Size(200, 262); + KeysGroupBox.TabIndex = 2; + KeysGroupBox.TabStop = false; + KeysGroupBox.Text = "Additional Keys"; + // + // KeyNoMapFormField + // + KeyNoMapFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + KeyNoMapFormField.HelpText = ""; + KeyNoMapFormField.LabelText = "No Map"; + KeyNoMapFormField.Location = new System.Drawing.Point(6, 45); + KeyNoMapFormField.Name = "KeyNoMapFormField"; + KeyNoMapFormField.Size = new System.Drawing.Size(188, 17); + KeyNoMapFormField.TabIndex = 3; + KeyNoMapFormField.Value = false; + // + // KeyPassiveMobsFormField + // + KeyPassiveMobsFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + KeyPassiveMobsFormField.HelpText = ""; + KeyPassiveMobsFormField.LabelText = "Passive Mobs"; + KeyPassiveMobsFormField.Location = new System.Drawing.Point(6, 68); + KeyPassiveMobsFormField.Name = "KeyPassiveMobsFormField"; + KeyPassiveMobsFormField.Size = new System.Drawing.Size(188, 17); + KeyPassiveMobsFormField.TabIndex = 2; + KeyPassiveMobsFormField.Value = false; + // + // KeyPlayerEventsFormField + // + KeyPlayerEventsFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + KeyPlayerEventsFormField.HelpText = ""; + KeyPlayerEventsFormField.LabelText = "Player Events"; + KeyPlayerEventsFormField.Location = new System.Drawing.Point(6, 91); + KeyPlayerEventsFormField.Name = "KeyPlayerEventsFormField"; + KeyPlayerEventsFormField.Size = new System.Drawing.Size(188, 17); + KeyPlayerEventsFormField.TabIndex = 1; + KeyPlayerEventsFormField.Value = false; + // + // KeyNoBuildCostFormField + // + KeyNoBuildCostFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + KeyNoBuildCostFormField.HelpText = ""; + KeyNoBuildCostFormField.LabelText = "No Build Cost"; + KeyNoBuildCostFormField.Location = new System.Drawing.Point(6, 22); + KeyNoBuildCostFormField.Name = "KeyNoBuildCostFormField"; + KeyNoBuildCostFormField.Size = new System.Drawing.Size(188, 17); + KeyNoBuildCostFormField.TabIndex = 0; + KeyNoBuildCostFormField.Value = false; + // + // PresetDropDownFormField + // + PresetFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("PresetDropDownFormField.DataSource"); + PresetFormField.DropdownEnabled = true; + PresetFormField.EmptyText = ""; + PresetFormField.HelpText = ""; + PresetFormField.LabelText = "Modifier Preset"; + PresetFormField.Location = new System.Drawing.Point(12, 12); + PresetFormField.Name = "PresetDropDownFormField"; + PresetFormField.Size = new System.Drawing.Size(200, 41); + PresetFormField.TabIndex = 0; + PresetFormField.Value = null; + // + // ButtonCancel + // + ButtonCancel.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; + ButtonCancel.Location = new System.Drawing.Point(347, 342); + ButtonCancel.Name = "ButtonCancel"; + ButtonCancel.Size = new System.Drawing.Size(75, 23); + ButtonCancel.TabIndex = 5; + ButtonCancel.Text = "Cancel"; + ButtonCancel.UseVisualStyleBackColor = true; + ButtonCancel.Click += ButtonCancel_Click; + // + // ButtonOK + // + ButtonOK.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; + ButtonOK.Location = new System.Drawing.Point(266, 342); + ButtonOK.Name = "ButtonOK"; + ButtonOK.Size = new System.Drawing.Size(75, 23); + ButtonOK.TabIndex = 4; + ButtonOK.Text = "OK"; + ButtonOK.UseVisualStyleBackColor = true; + ButtonOK.Click += ButtonOK_Click; + // + // ButtonDefaults + // + ButtonDefaults.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + ButtonDefaults.Location = new System.Drawing.Point(12, 342); + ButtonDefaults.Name = "ButtonDefaults"; + ButtonDefaults.Size = new System.Drawing.Size(111, 23); + ButtonDefaults.TabIndex = 3; + ButtonDefaults.Text = "Restore Defaults"; + ButtonDefaults.UseVisualStyleBackColor = true; + ButtonDefaults.Click += ButtonDefaults_Click; + // + // WorldPreferencesForm + // + AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + ClientSize = new System.Drawing.Size(434, 377); + Controls.Add(ButtonDefaults); + Controls.Add(ButtonOK); + Controls.Add(ButtonCancel); + Controls.Add(PresetFormField); + Controls.Add(KeysGroupBox); + Controls.Add(ModifiersGroupBox); + FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + MaximizeBox = false; + MinimizeBox = false; + MinimumSize = new System.Drawing.Size(450, 321); + Name = "WorldPreferencesForm"; + StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + Text = "World Settings"; + ModifiersGroupBox.ResumeLayout(false); + KeysGroupBox.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private System.Windows.Forms.GroupBox ModifiersGroupBox; + private ValheimServerGUI.Controls.DropdownFormField ModifierPortalsFormField; + private ValheimServerGUI.Controls.DropdownFormField ModifierResourcesFormField; + private ValheimServerGUI.Controls.DropdownFormField ModifierRaidsFormField; + private ValheimServerGUI.Controls.DropdownFormField ModifierDeathPenaltyFormField; + private ValheimServerGUI.Controls.DropdownFormField ModifierCombatFormField; + private System.Windows.Forms.GroupBox KeysGroupBox; + private ValheimServerGUI.Controls.DropdownFormField PresetFormField; + private ValheimServerGUI.Controls.CheckboxFormField KeyNoMapFormField; + private ValheimServerGUI.Controls.CheckboxFormField KeyPassiveMobsFormField; + private ValheimServerGUI.Controls.CheckboxFormField KeyPlayerEventsFormField; + private ValheimServerGUI.Controls.CheckboxFormField KeyNoBuildCostFormField; + private System.Windows.Forms.Button ButtonCancel; + private System.Windows.Forms.Button ButtonOK; + private System.Windows.Forms.Button ButtonDefaults; + } +} \ No newline at end of file diff --git a/ValheimServerGUI/Forms/WorldPreferencesForm.cs b/ValheimServerGUI/Forms/WorldPreferencesForm.cs new file mode 100644 index 0000000..d3b1b8d --- /dev/null +++ b/ValheimServerGUI/Forms/WorldPreferencesForm.cs @@ -0,0 +1,314 @@ +using Serilog; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using ValheimServerGUI.Controls; +using ValheimServerGUI.Game; +using ValheimServerGUI.Tools; + +namespace ValheimServerGUI.Forms +{ + public partial class WorldPreferencesForm : Form + { + private readonly IWorldPreferencesProvider WorldPrefsProvider; + private readonly ILogger Logger; + + private string WorldName { get; set; } + + private const string KeywordNoPreset = "No Preset"; + private const string KeywordNoModifierValue = ""; + + #region Modifier value mappings + + private static readonly Dictionary PresetMapping = new() + { + { KeywordNoPreset, "" }, + { "Casual", WorldGenPresets.Casual }, + { "Easy", WorldGenPresets.Easy }, + { "Normal", WorldGenPresets.Normal }, + { "Hard", WorldGenPresets.Hard }, + { "Hardcore", WorldGenPresets.Hardcore }, + { "Immersive", WorldGenPresets.Immersive }, + { "Hammer", WorldGenPresets.Hammer }, + }; + + private static readonly Dictionary ModifierCombatMapping = new() + { + { KeywordNoModifierValue, "" }, + { "Very Easy", WorldGenModifiers.Values.CombatVeryEasy }, + { "Easy", WorldGenModifiers.Values.CombatEasy }, + { "Hard", WorldGenModifiers.Values.CombatHard }, + { "Very Hard", WorldGenModifiers.Values.CombatVeryHard }, + }; + + private static readonly Dictionary ModifierDeathPenaltyMapping = new() + { + { KeywordNoModifierValue, "" }, + { "Casual", WorldGenModifiers.Values.DeathPenaltyCasual }, + { "Very Easy", WorldGenModifiers.Values.DeathPenaltyVeryEasy }, + { "Easy", WorldGenModifiers.Values.DeathPenaltyEasy }, + { "Hard", WorldGenModifiers.Values.DeathPenaltyHard }, + { "Hardcore", WorldGenModifiers.Values.DeathPenaltyHardcore }, + }; + + private static readonly Dictionary ModifierResourcesMapping = new() + { + { KeywordNoModifierValue, "" }, + { "Much Less", WorldGenModifiers.Values.ResourcesMuchLess }, + { "Less", WorldGenModifiers.Values.ResourcesLess }, + { "More", WorldGenModifiers.Values.ResourcesMore }, + { "Much More", WorldGenModifiers.Values.ResourcesMuchMore }, + { "Most", WorldGenModifiers.Values.ResourcesMost }, + }; + + private static readonly Dictionary ModifierRaidsMapping = new() + { + { KeywordNoModifierValue, "" }, + { "None", WorldGenModifiers.Values.RaidsNone }, + { "Much Less", WorldGenModifiers.Values.RaidsMuchLess }, + { "Less", WorldGenModifiers.Values.RaidsLess }, + { "More", WorldGenModifiers.Values.RaidsMore }, + { "Much More", WorldGenModifiers.Values.RaidsMuchMore }, + }; + + private static readonly Dictionary ModifierPortalsMapping = new() + { + { KeywordNoModifierValue, "" }, + { "Casual", WorldGenModifiers.Values.PortalsCasual }, + { "Hard", WorldGenModifiers.Values.PortalsHard }, + { "Very Hard", WorldGenModifiers.Values.PortalsVeryHard }, + }; + + #endregion + + public WorldPreferencesForm(IWorldPreferencesProvider worldPrefsProvider, ILogger logger) + { + WorldPrefsProvider = worldPrefsProvider; + Logger = logger; + + InitializeComponent(); + this.AddApplicationIcon(); + } + + /// + /// Call this before showing the form. + /// + public void SetWorld(string worldName) + { + WorldName = worldName; + Text = $"World Settings - {WorldName}"; + } + + protected override void OnShown(EventArgs e) + { + base.OnShown(e); + + if (string.IsNullOrWhiteSpace(WorldName)) + { + Logger.Error("Unable to open world settings. No world name has been set."); + Close(); + return; + } + + InitializeDropDownOptions(); + SetFormDefaultValues(); + LoadFormFromPreferences(); + } + + private void InitializeDropDownOptions() + { + PresetFormField.DataSource = PresetMapping.Keys.ToList(); + + ModifierCombatFormField.DataSource = ModifierCombatMapping.Keys.ToList(); + ModifierDeathPenaltyFormField.DataSource = ModifierDeathPenaltyMapping.Keys.ToList(); + ModifierResourcesFormField.DataSource = ModifierResourcesMapping.Keys.ToList(); + ModifierRaidsFormField.DataSource = ModifierRaidsMapping.Keys.ToList(); + ModifierPortalsFormField.DataSource = ModifierPortalsMapping.Keys.ToList(); + } + + private void SetFormDefaultValues() + { + PresetFormField.Value = KeywordNoPreset; + + ModifierCombatFormField.Value = KeywordNoModifierValue; + ModifierDeathPenaltyFormField.Value = KeywordNoModifierValue; + ModifierResourcesFormField.Value = KeywordNoModifierValue; + ModifierRaidsFormField.Value = KeywordNoModifierValue; + ModifierPortalsFormField.Value = KeywordNoModifierValue; + + KeyNoBuildCostFormField.Value = false; + KeyPlayerEventsFormField.Value = false; + KeyPassiveMobsFormField.Value = false; + KeyNoMapFormField.Value = false; + } + + #region Load methods + + private void LoadFormFromPreferences() + { + var prefs = WorldPrefsProvider.LoadPreferences(WorldName); + + // No preferences exist for this world, so there are no values to initialize + // A new prefs object will be saved when OK is clicked + if (prefs == null) return; + + if (!string.IsNullOrWhiteSpace(prefs.Preset)) + { + LoadPresetFromPreferences(prefs, PresetFormField, PresetMapping.Invert()); + } + else + { + LoadModifierFromPreferences(prefs, WorldGenModifiers.Combat, ModifierCombatFormField, ModifierCombatMapping.Invert()); + LoadModifierFromPreferences(prefs, WorldGenModifiers.DeathPenalty, ModifierDeathPenaltyFormField, ModifierDeathPenaltyMapping.Invert()); + LoadModifierFromPreferences(prefs, WorldGenModifiers.Resources, ModifierResourcesFormField, ModifierResourcesMapping.Invert()); + LoadModifierFromPreferences(prefs, WorldGenModifiers.Raids, ModifierRaidsFormField, ModifierRaidsMapping.Invert()); + LoadModifierFromPreferences(prefs, WorldGenModifiers.Portals, ModifierPortalsFormField, ModifierPortalsMapping.Invert()); + } + + LoadKeyFromPreferences(prefs, WorldGenKeys.NoBuildCost, KeyNoBuildCostFormField); + LoadKeyFromPreferences(prefs, WorldGenKeys.PlayerEvents, KeyPlayerEventsFormField); + LoadKeyFromPreferences(prefs, WorldGenKeys.PassiveMobs, KeyPassiveMobsFormField); + LoadKeyFromPreferences(prefs, WorldGenKeys.NoMap, KeyNoMapFormField); + } + + private void LoadPresetFromPreferences(WorldPreferences prefs, DropdownFormField dropdown, Dictionary mapping) + { + // Clear the existing value + dropdown.Value = KeywordNoPreset; + + // Return early if no preset is defined on the prefs object + if (string.IsNullOrWhiteSpace(prefs.Preset)) return; + + else if (mapping.TryGetValue(prefs.Preset, out var presetDisplayName)) + { + dropdown.Value = presetDisplayName; + } + else + { + // Would occur if a user manually wrote an unknown preset name to the prefs file + Logger.Error("Unable to load preset: no value is mapped to '{presetName}'", prefs.Preset); + } + } + + private void LoadModifierFromPreferences(WorldPreferences prefs, string modifierName, DropdownFormField dropdown, Dictionary mapping) + { + // Clear the existing value + dropdown.Value = KeywordNoModifierValue; + + // Return early if this modifier is not set on the prefs object + if (prefs.Modifiers == null || !prefs.Modifiers.TryGetValue(modifierName, out var modifierValue)) return; + + if (mapping.TryGetValue(modifierValue, out var modifierValueDisplayName)) + { + dropdown.Value = modifierValueDisplayName; + } + else + { + // Would occur if a user manually wrote an invalid value for this modifier in the prefs file + Logger.Error("Unable to load modifier: no value is mapped to '{modifierValue}'", modifierValue); + } + } + + private static void LoadKeyFromPreferences(WorldPreferences prefs, string keyName, CheckboxFormField checkbox) + { + checkbox.Value = prefs.Keys != null && prefs.Keys.Contains(keyName); + } + + #endregion + + #region Save methods + + private void SaveFormToPreferences() + { + var prefs = WorldPrefsProvider.LoadPreferences(WorldName); + prefs ??= new WorldPreferences + { + WorldName = WorldName, + }; + + prefs.Preset = null; + prefs.Modifiers.Clear(); + prefs.Keys.Clear(); + + if (PresetFormField.Value != KeywordNoPreset) + { + SavePresetToPreferences(prefs, PresetFormField, PresetMapping); + } + else + { + SaveModifierToPreferences(prefs, WorldGenModifiers.Combat, ModifierCombatFormField, ModifierCombatMapping); + SaveModifierToPreferences(prefs, WorldGenModifiers.DeathPenalty, ModifierDeathPenaltyFormField, ModifierDeathPenaltyMapping); + SaveModifierToPreferences(prefs, WorldGenModifiers.Resources, ModifierResourcesFormField, ModifierResourcesMapping); + SaveModifierToPreferences(prefs, WorldGenModifiers.Raids, ModifierRaidsFormField, ModifierRaidsMapping); + SaveModifierToPreferences(prefs, WorldGenModifiers.Portals, ModifierPortalsFormField, ModifierPortalsMapping); + + SaveKeyToPreferences(prefs, WorldGenKeys.NoBuildCost, KeyNoBuildCostFormField); + SaveKeyToPreferences(prefs, WorldGenKeys.PlayerEvents, KeyPlayerEventsFormField); + SaveKeyToPreferences(prefs, WorldGenKeys.PassiveMobs, KeyPassiveMobsFormField); + SaveKeyToPreferences(prefs, WorldGenKeys.NoMap, KeyNoMapFormField); + } + + WorldPrefsProvider.SavePreferences(prefs); + } + + private void SavePresetToPreferences(WorldPreferences prefs, DropdownFormField dropdown, Dictionary mapping) + { + if (dropdown.Value == null || dropdown.Value == KeywordNoPreset) return; + + if (mapping.TryGetValue(dropdown.Value, out var value)) + { + prefs.Preset = value; + } + else + { + // Would only occur if the mapping in this file is missing an entry + Logger.Error("Unable to save preset: no value is mapped to '{presetName}'", dropdown.Value); + } + } + + private void SaveModifierToPreferences(WorldPreferences prefs, string modifierName, DropdownFormField dropdown, Dictionary mapping) + { + if (dropdown.Value == null || dropdown.Value == KeywordNoModifierValue) return; + + if (mapping.TryGetValue(dropdown.Value, out var value)) + { + prefs.Modifiers[modifierName] = value; + } + else + { + // Would only occur if the mapping in this file is missing an entry + Logger.Error("Unable to save modifier: no value is mapped to '{valueName}' for modifier '{modifierName}'", dropdown.Value, modifierName); + } + } + + private static void SaveKeyToPreferences(WorldPreferences prefs, string keyName, CheckboxFormField checkbox) + { + if (!checkbox.Value) return; + + prefs.Keys.Add(keyName); + } + + #endregion + + #region Form events + + private void ButtonOK_Click(object sender, EventArgs e) + { + SaveFormToPreferences(); + Close(); + } + + private void ButtonCancel_Click(object sender, EventArgs e) + { + Close(); + } + + private void ButtonDefaults_Click(object sender, EventArgs e) + { + SetFormDefaultValues(); + } + + #endregion + } +} diff --git a/ValheimServerGUI/Forms/WorldPreferencesForm.resx b/ValheimServerGUI/Forms/WorldPreferencesForm.resx new file mode 100644 index 0000000..2584cf1 --- /dev/null +++ b/ValheimServerGUI/Forms/WorldPreferencesForm.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 + c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi + bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI + CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL + + + + + AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 + c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi + bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI + CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL + + + + + AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 + c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi + bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI + CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL + + + + + AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 + c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi + bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI + CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL + + + + + AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 + c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi + bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI + CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL + + + + + AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 + c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi + bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI + CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL + + + \ No newline at end of file diff --git a/ValheimServerGUI/Program.cs b/ValheimServerGUI/Program.cs index 6317a4c..354e5a6 100644 --- a/ValheimServerGUI/Program.cs +++ b/ValheimServerGUI/Program.cs @@ -79,7 +79,8 @@ public static void ConfigureServices(IServiceCollection services, string[] args) .AddSingleton() .AddSingleton() .AddSingleton() - .AddTransient(); + .AddTransient() + .AddTransient(); } } } From 613215c0ea080084e8ab9c84781afb44d7128ccc Mon Sep 17 00:00:00 2001 From: dolphinspired Date: Sun, 29 Oct 2023 10:02:21 -0400 Subject: [PATCH 06/10] Add wiki link for world modifiers --- .../Forms/WorldPreferencesForm.Designer.cs | 38 +++++++++++---- .../Forms/WorldPreferencesForm.cs | 6 +++ .../Forms/WorldPreferencesForm.resx | 48 ------------------- .../Properties/Resources.Designer.cs | 9 ++++ ValheimServerGUI/Properties/Resources.resx | 3 ++ 5 files changed, 47 insertions(+), 57 deletions(-) diff --git a/ValheimServerGUI/Forms/WorldPreferencesForm.Designer.cs b/ValheimServerGUI/Forms/WorldPreferencesForm.Designer.cs index f798a3e..499dd1d 100644 --- a/ValheimServerGUI/Forms/WorldPreferencesForm.Designer.cs +++ b/ValheimServerGUI/Forms/WorldPreferencesForm.Designer.cs @@ -28,7 +28,6 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(WorldPreferencesForm)); ModifiersGroupBox = new System.Windows.Forms.GroupBox(); ModifierPortalsFormField = new ValheimServerGUI.Controls.DropdownFormField(); ModifierResourcesFormField = new ValheimServerGUI.Controls.DropdownFormField(); @@ -44,6 +43,8 @@ private void InitializeComponent() ButtonCancel = new System.Windows.Forms.Button(); ButtonOK = new System.Windows.Forms.Button(); ButtonDefaults = new System.Windows.Forms.Button(); + WikiLinkLabel = new System.Windows.Forms.LinkLabel(); + label1 = new System.Windows.Forms.Label(); ModifiersGroupBox.SuspendLayout(); KeysGroupBox.SuspendLayout(); SuspendLayout(); @@ -65,7 +66,6 @@ private void InitializeComponent() // ModifierPortalsFormField // ModifierPortalsFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - ModifierPortalsFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierPortalsFormField.DataSource"); ModifierPortalsFormField.DropdownEnabled = true; ModifierPortalsFormField.EmptyText = ""; ModifierPortalsFormField.HelpText = ""; @@ -79,7 +79,6 @@ private void InitializeComponent() // ModifierResourcesFormField // ModifierResourcesFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - ModifierResourcesFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierResourcesFormField.DataSource"); ModifierResourcesFormField.DropdownEnabled = true; ModifierResourcesFormField.EmptyText = ""; ModifierResourcesFormField.HelpText = ""; @@ -93,7 +92,6 @@ private void InitializeComponent() // ModifierRaidsFormField // ModifierRaidsFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - ModifierRaidsFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierRaidsFormField.DataSource"); ModifierRaidsFormField.DropdownEnabled = true; ModifierRaidsFormField.EmptyText = ""; ModifierRaidsFormField.HelpText = ""; @@ -107,7 +105,6 @@ private void InitializeComponent() // ModifierDeathPenaltyFormField // ModifierDeathPenaltyFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - ModifierDeathPenaltyFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierDeathPenaltyFormField.DataSource"); ModifierDeathPenaltyFormField.DropdownEnabled = true; ModifierDeathPenaltyFormField.EmptyText = ""; ModifierDeathPenaltyFormField.HelpText = ""; @@ -121,7 +118,6 @@ private void InitializeComponent() // ModifierCombatFormField // ModifierCombatFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - ModifierCombatFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierCombatFormField.DataSource"); ModifierCombatFormField.DropdownEnabled = true; ModifierCombatFormField.EmptyText = ""; ModifierCombatFormField.HelpText = ""; @@ -189,15 +185,14 @@ private void InitializeComponent() KeyNoBuildCostFormField.TabIndex = 0; KeyNoBuildCostFormField.Value = false; // - // PresetDropDownFormField + // PresetFormField // - PresetFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("PresetDropDownFormField.DataSource"); PresetFormField.DropdownEnabled = true; PresetFormField.EmptyText = ""; PresetFormField.HelpText = ""; PresetFormField.LabelText = "Modifier Preset"; PresetFormField.Location = new System.Drawing.Point(12, 12); - PresetFormField.Name = "PresetDropDownFormField"; + PresetFormField.Name = "PresetFormField"; PresetFormField.Size = new System.Drawing.Size(200, 41); PresetFormField.TabIndex = 0; PresetFormField.Value = null; @@ -235,17 +230,39 @@ private void InitializeComponent() ButtonDefaults.UseVisualStyleBackColor = true; ButtonDefaults.Click += ButtonDefaults_Click; // + // WikiLinkLabel + // + WikiLinkLabel.AutoSize = true; + WikiLinkLabel.Location = new System.Drawing.Point(266, 27); + WikiLinkLabel.Name = "WikiLinkLabel"; + WikiLinkLabel.Size = new System.Drawing.Size(78, 15); + WikiLinkLabel.TabIndex = 6; + WikiLinkLabel.TabStop = true; + WikiLinkLabel.Text = "Valheim Wiki."; + WikiLinkLabel.LinkClicked += WikiLinkLabel_LinkClicked; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new System.Drawing.Point(228, 12); + label1.Name = "label1"; + label1.Size = new System.Drawing.Size(184, 30); + label1.TabIndex = 7; + label1.Text = "Read more about world modifiers\r\non the"; + // // WorldPreferencesForm // AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; ClientSize = new System.Drawing.Size(434, 377); + Controls.Add(WikiLinkLabel); Controls.Add(ButtonDefaults); Controls.Add(ButtonOK); Controls.Add(ButtonCancel); Controls.Add(PresetFormField); Controls.Add(KeysGroupBox); Controls.Add(ModifiersGroupBox); + Controls.Add(label1); FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; MaximizeBox = false; MinimizeBox = false; @@ -256,6 +273,7 @@ private void InitializeComponent() ModifiersGroupBox.ResumeLayout(false); KeysGroupBox.ResumeLayout(false); ResumeLayout(false); + PerformLayout(); } #endregion @@ -275,5 +293,7 @@ private void InitializeComponent() private System.Windows.Forms.Button ButtonCancel; private System.Windows.Forms.Button ButtonOK; private System.Windows.Forms.Button ButtonDefaults; + private System.Windows.Forms.LinkLabel WikiLinkLabel; + private System.Windows.Forms.Label label1; } } \ No newline at end of file diff --git a/ValheimServerGUI/Forms/WorldPreferencesForm.cs b/ValheimServerGUI/Forms/WorldPreferencesForm.cs index d3b1b8d..075e3d2 100644 --- a/ValheimServerGUI/Forms/WorldPreferencesForm.cs +++ b/ValheimServerGUI/Forms/WorldPreferencesForm.cs @@ -5,6 +5,7 @@ using System.Windows.Forms; using ValheimServerGUI.Controls; using ValheimServerGUI.Game; +using ValheimServerGUI.Properties; using ValheimServerGUI.Tools; namespace ValheimServerGUI.Forms @@ -309,6 +310,11 @@ private void ButtonDefaults_Click(object sender, EventArgs e) SetFormDefaultValues(); } + private void WikiLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + OpenHelper.OpenWebAddress(Resources.ValheimWikiWorldModifiersUrl); + } + #endregion } } diff --git a/ValheimServerGUI/Forms/WorldPreferencesForm.resx b/ValheimServerGUI/Forms/WorldPreferencesForm.resx index 2584cf1..af32865 100644 --- a/ValheimServerGUI/Forms/WorldPreferencesForm.resx +++ b/ValheimServerGUI/Forms/WorldPreferencesForm.resx @@ -117,52 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 - c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi - bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI - CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL - - - - - AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 - c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi - bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI - CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL - - - - - AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 - c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi - bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI - CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL - - - - - AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 - c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi - bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI - CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL - - - - - AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 - c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi - bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI - CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL - - - - - AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 - c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi - bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI - CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL - - \ No newline at end of file diff --git a/ValheimServerGUI/Properties/Resources.Designer.cs b/ValheimServerGUI/Properties/Resources.Designer.cs index d01a17b..255866c 100644 --- a/ValheimServerGUI/Properties/Resources.Designer.cs +++ b/ValheimServerGUI/Properties/Resources.Designer.cs @@ -661,6 +661,15 @@ internal static string ValheimSteamAppId { } } + /// + /// Looks up a localized string similar to https://valheim.fandom.com/wiki/World_Modifiers. + /// + internal static string ValheimWikiWorldModifiersUrl { + get { + return ResourceManager.GetString("ValheimWikiWorldModifiersUrl", resourceCulture); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/ValheimServerGUI/Properties/Resources.resx b/ValheimServerGUI/Properties/Resources.resx index 5fa3357..73352ed 100644 --- a/ValheimServerGUI/Properties/Resources.resx +++ b/ValheimServerGUI/Properties/Resources.resx @@ -312,6 +312,9 @@ 892970 From start_headless_server.bat + + https://valheim.fandom.com/wiki/World_Modifiers + ..\Resources\vsg_logo_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a From 55188fe6563695bd6dcaff75a74218e0b14f34f5 Mon Sep 17 00:00:00 2001 From: dolphinspired Date: Sun, 29 Oct 2023 10:11:34 -0400 Subject: [PATCH 07/10] Disable modifier dropdowns when preset is selected --- .../Forms/WorldPreferencesForm.cs | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/ValheimServerGUI/Forms/WorldPreferencesForm.cs b/ValheimServerGUI/Forms/WorldPreferencesForm.cs index 075e3d2..700864b 100644 --- a/ValheimServerGUI/Forms/WorldPreferencesForm.cs +++ b/ValheimServerGUI/Forms/WorldPreferencesForm.cs @@ -113,6 +113,7 @@ protected override void OnShown(EventArgs e) } InitializeDropDownOptions(); + InitializeFormEvents(); SetFormDefaultValues(); LoadFormFromPreferences(); } @@ -128,6 +129,11 @@ private void InitializeDropDownOptions() ModifierPortalsFormField.DataSource = ModifierPortalsMapping.Keys.ToList(); } + private void InitializeFormEvents() + { + PresetFormField.ValueChanged += PresetFormField_ValueChanged; + } + private void SetFormDefaultValues() { PresetFormField.Value = KeywordNoPreset; @@ -243,13 +249,13 @@ private void SaveFormToPreferences() SaveModifierToPreferences(prefs, WorldGenModifiers.Resources, ModifierResourcesFormField, ModifierResourcesMapping); SaveModifierToPreferences(prefs, WorldGenModifiers.Raids, ModifierRaidsFormField, ModifierRaidsMapping); SaveModifierToPreferences(prefs, WorldGenModifiers.Portals, ModifierPortalsFormField, ModifierPortalsMapping); - - SaveKeyToPreferences(prefs, WorldGenKeys.NoBuildCost, KeyNoBuildCostFormField); - SaveKeyToPreferences(prefs, WorldGenKeys.PlayerEvents, KeyPlayerEventsFormField); - SaveKeyToPreferences(prefs, WorldGenKeys.PassiveMobs, KeyPassiveMobsFormField); - SaveKeyToPreferences(prefs, WorldGenKeys.NoMap, KeyNoMapFormField); } + SaveKeyToPreferences(prefs, WorldGenKeys.NoBuildCost, KeyNoBuildCostFormField); + SaveKeyToPreferences(prefs, WorldGenKeys.PlayerEvents, KeyPlayerEventsFormField); + SaveKeyToPreferences(prefs, WorldGenKeys.PassiveMobs, KeyPassiveMobsFormField); + SaveKeyToPreferences(prefs, WorldGenKeys.NoMap, KeyNoMapFormField); + WorldPrefsProvider.SavePreferences(prefs); } @@ -310,6 +316,18 @@ private void ButtonDefaults_Click(object sender, EventArgs e) SetFormDefaultValues(); } + private void PresetFormField_ValueChanged(object sender, string e) + { + if (string.IsNullOrWhiteSpace(e) || e == KeywordNoPreset) + { + ModifiersGroupBox.Enabled = true; + } + else + { + ModifiersGroupBox.Enabled = false; + } + } + private void WikiLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { OpenHelper.OpenWebAddress(Resources.ValheimWikiWorldModifiersUrl); From d500cc68e3df7e4c792727391e52228a5453f5a7 Mon Sep 17 00:00:00 2001 From: dolphinspired Date: Mon, 30 Oct 2023 09:26:18 -0400 Subject: [PATCH 08/10] React to modifier changes when preset is selected --- .../Forms/WorldPreferencesForm.Designer.cs | 15 +- .../Forms/WorldPreferencesForm.cs | 318 +++++++++++++----- .../Forms/WorldPreferencesForm.resx | 48 +++ 3 files changed, 286 insertions(+), 95 deletions(-) diff --git a/ValheimServerGUI/Forms/WorldPreferencesForm.Designer.cs b/ValheimServerGUI/Forms/WorldPreferencesForm.Designer.cs index 499dd1d..f371ed6 100644 --- a/ValheimServerGUI/Forms/WorldPreferencesForm.Designer.cs +++ b/ValheimServerGUI/Forms/WorldPreferencesForm.Designer.cs @@ -28,6 +28,7 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(WorldPreferencesForm)); ModifiersGroupBox = new System.Windows.Forms.GroupBox(); ModifierPortalsFormField = new ValheimServerGUI.Controls.DropdownFormField(); ModifierResourcesFormField = new ValheimServerGUI.Controls.DropdownFormField(); @@ -66,6 +67,7 @@ private void InitializeComponent() // ModifierPortalsFormField // ModifierPortalsFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ModifierPortalsFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierPortalsFormField.DataSource"); ModifierPortalsFormField.DropdownEnabled = true; ModifierPortalsFormField.EmptyText = ""; ModifierPortalsFormField.HelpText = ""; @@ -79,6 +81,7 @@ private void InitializeComponent() // ModifierResourcesFormField // ModifierResourcesFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ModifierResourcesFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierResourcesFormField.DataSource"); ModifierResourcesFormField.DropdownEnabled = true; ModifierResourcesFormField.EmptyText = ""; ModifierResourcesFormField.HelpText = ""; @@ -92,6 +95,7 @@ private void InitializeComponent() // ModifierRaidsFormField // ModifierRaidsFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ModifierRaidsFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierRaidsFormField.DataSource"); ModifierRaidsFormField.DropdownEnabled = true; ModifierRaidsFormField.EmptyText = ""; ModifierRaidsFormField.HelpText = ""; @@ -105,6 +109,7 @@ private void InitializeComponent() // ModifierDeathPenaltyFormField // ModifierDeathPenaltyFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ModifierDeathPenaltyFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierDeathPenaltyFormField.DataSource"); ModifierDeathPenaltyFormField.DropdownEnabled = true; ModifierDeathPenaltyFormField.EmptyText = ""; ModifierDeathPenaltyFormField.HelpText = ""; @@ -118,6 +123,7 @@ private void InitializeComponent() // ModifierCombatFormField // ModifierCombatFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ModifierCombatFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierCombatFormField.DataSource"); ModifierCombatFormField.DropdownEnabled = true; ModifierCombatFormField.EmptyText = ""; ModifierCombatFormField.HelpText = ""; @@ -145,7 +151,7 @@ private void InitializeComponent() // KeyNoMapFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; KeyNoMapFormField.HelpText = ""; - KeyNoMapFormField.LabelText = "No Map"; + KeyNoMapFormField.LabelText = "No map"; KeyNoMapFormField.Location = new System.Drawing.Point(6, 45); KeyNoMapFormField.Name = "KeyNoMapFormField"; KeyNoMapFormField.Size = new System.Drawing.Size(188, 17); @@ -156,7 +162,7 @@ private void InitializeComponent() // KeyPassiveMobsFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; KeyPassiveMobsFormField.HelpText = ""; - KeyPassiveMobsFormField.LabelText = "Passive Mobs"; + KeyPassiveMobsFormField.LabelText = "Passive enemies"; KeyPassiveMobsFormField.Location = new System.Drawing.Point(6, 68); KeyPassiveMobsFormField.Name = "KeyPassiveMobsFormField"; KeyPassiveMobsFormField.Size = new System.Drawing.Size(188, 17); @@ -167,7 +173,7 @@ private void InitializeComponent() // KeyPlayerEventsFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; KeyPlayerEventsFormField.HelpText = ""; - KeyPlayerEventsFormField.LabelText = "Player Events"; + KeyPlayerEventsFormField.LabelText = "Player based raids"; KeyPlayerEventsFormField.Location = new System.Drawing.Point(6, 91); KeyPlayerEventsFormField.Name = "KeyPlayerEventsFormField"; KeyPlayerEventsFormField.Size = new System.Drawing.Size(188, 17); @@ -178,7 +184,7 @@ private void InitializeComponent() // KeyNoBuildCostFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; KeyNoBuildCostFormField.HelpText = ""; - KeyNoBuildCostFormField.LabelText = "No Build Cost"; + KeyNoBuildCostFormField.LabelText = "No build cost"; KeyNoBuildCostFormField.Location = new System.Drawing.Point(6, 22); KeyNoBuildCostFormField.Name = "KeyNoBuildCostFormField"; KeyNoBuildCostFormField.Size = new System.Drawing.Size(188, 17); @@ -187,6 +193,7 @@ private void InitializeComponent() // // PresetFormField // + PresetFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("PresetFormField.DataSource"); PresetFormField.DropdownEnabled = true; PresetFormField.EmptyText = ""; PresetFormField.HelpText = ""; diff --git a/ValheimServerGUI/Forms/WorldPreferencesForm.cs b/ValheimServerGUI/Forms/WorldPreferencesForm.cs index 700864b..280b373 100644 --- a/ValheimServerGUI/Forms/WorldPreferencesForm.cs +++ b/ValheimServerGUI/Forms/WorldPreferencesForm.cs @@ -16,70 +16,180 @@ public partial class WorldPreferencesForm : Form private readonly ILogger Logger; private string WorldName { get; set; } - - private const string KeywordNoPreset = "No Preset"; - private const string KeywordNoModifierValue = ""; + private bool PresetReactToFormChanges { get; set; } + private bool EnablePresetModifierPopulation { get; set; } = true; #region Modifier value mappings - private static readonly Dictionary PresetMapping = new() + private const string NoValue = ""; + + private static class DisplayNames + { + public const string NoPreset = "Custom (No Preset)"; + public const string NoModifier = "Normal"; + + public const string PresetEasy = "Easy"; + public const string PresetNormal = "Normal"; + public const string PresetHard = "Hard"; + public const string PresetHardcore = "Hardcore"; + public const string PresetCasual = "Casual"; + public const string PresetHammer = "Hammer Mode"; + public const string PresetImmersive = "Immersive"; + + public const string CombatVeryEasy = "Very Easy"; + public const string CombatEasy = "Easy"; + public const string CombatHard = "Hard"; + public const string CombatVeryHard = "Very Hard"; + + public const string DeathPenaltyCasual = "Casual"; + public const string DeathPenaltyVeryEasy = "Very Easy"; + public const string DeathPenaltyEasy = "Easy"; + public const string DeathPenaltyHard = "Hard"; + public const string DeathPenaltyHardcore = "Hardcore"; + + public const string ResourcesMuchLess = "Much Less (0.5x)"; + public const string ResourcesLess = "Less (0.75x)"; + public const string ResourcesMore = "More (1.5x)"; + public const string ResourcesMuchMore = "Much More (2x)"; + public const string ResourcesMost = "Most (3x)"; + + public const string RaidsNone = "None"; + public const string RaidsMuchLess = "Much Less"; + public const string RaidsLess = "Less"; + public const string RaidsMore = "More"; + public const string RaidsMuchMore = "Much More"; + + public const string PortalsCasual = "Casual (Portal items)"; + public const string PortalsHard = "Hard (No boss portals)"; + public const string PortalsVeryHard = "Very Hard (No portals)"; + } + + private static readonly Dictionary PresetMappingByDisplayName = new() { - { KeywordNoPreset, "" }, - { "Casual", WorldGenPresets.Casual }, - { "Easy", WorldGenPresets.Easy }, - { "Normal", WorldGenPresets.Normal }, - { "Hard", WorldGenPresets.Hard }, - { "Hardcore", WorldGenPresets.Hardcore }, - { "Immersive", WorldGenPresets.Immersive }, - { "Hammer", WorldGenPresets.Hammer }, + { DisplayNames.NoPreset, NoValue }, + { DisplayNames.PresetEasy, WorldGenPresets.Easy }, + { DisplayNames.PresetNormal, WorldGenPresets.Normal }, + { DisplayNames.PresetHard, WorldGenPresets.Hard }, + { DisplayNames.PresetHardcore, WorldGenPresets.Hardcore }, + { DisplayNames.PresetCasual, WorldGenPresets.Casual }, + { DisplayNames.PresetHammer, WorldGenPresets.Hammer }, + { DisplayNames.PresetImmersive, WorldGenPresets.Immersive }, }; + private static readonly Dictionary PresetMappingByValue = PresetMappingByDisplayName.Invert(); - private static readonly Dictionary ModifierCombatMapping = new() + private static readonly Dictionary ModifierCombatMappingByDisplayName = new() { - { KeywordNoModifierValue, "" }, - { "Very Easy", WorldGenModifiers.Values.CombatVeryEasy }, - { "Easy", WorldGenModifiers.Values.CombatEasy }, - { "Hard", WorldGenModifiers.Values.CombatHard }, - { "Very Hard", WorldGenModifiers.Values.CombatVeryHard }, + { DisplayNames.CombatVeryEasy, WorldGenModifiers.Values.CombatVeryEasy }, + { DisplayNames.CombatEasy, WorldGenModifiers.Values.CombatEasy }, + { DisplayNames.NoModifier, NoValue }, + { DisplayNames.CombatHard, WorldGenModifiers.Values.CombatHard }, + { DisplayNames.CombatVeryHard, WorldGenModifiers.Values.CombatVeryHard }, }; + private static readonly Dictionary ModifierCombatMappingByValue = ModifierCombatMappingByDisplayName.Invert(); - private static readonly Dictionary ModifierDeathPenaltyMapping = new() + private static readonly Dictionary ModifierDeathPenaltyMappingByDisplayName = new() { - { KeywordNoModifierValue, "" }, - { "Casual", WorldGenModifiers.Values.DeathPenaltyCasual }, - { "Very Easy", WorldGenModifiers.Values.DeathPenaltyVeryEasy }, - { "Easy", WorldGenModifiers.Values.DeathPenaltyEasy }, - { "Hard", WorldGenModifiers.Values.DeathPenaltyHard }, - { "Hardcore", WorldGenModifiers.Values.DeathPenaltyHardcore }, + { DisplayNames.DeathPenaltyCasual, WorldGenModifiers.Values.DeathPenaltyCasual }, + { DisplayNames.DeathPenaltyVeryEasy, WorldGenModifiers.Values.DeathPenaltyVeryEasy }, + { DisplayNames.DeathPenaltyEasy, WorldGenModifiers.Values.DeathPenaltyEasy }, + { DisplayNames.NoModifier, NoValue }, + { DisplayNames.DeathPenaltyHard, WorldGenModifiers.Values.DeathPenaltyHard }, + { DisplayNames.DeathPenaltyHardcore, WorldGenModifiers.Values.DeathPenaltyHardcore }, }; + private static readonly Dictionary ModifierDeathPenaltyMappingByValue = ModifierDeathPenaltyMappingByDisplayName.Invert(); - private static readonly Dictionary ModifierResourcesMapping = new() + private static readonly Dictionary ModifierResourcesMappingByDisplayName = new() { - { KeywordNoModifierValue, "" }, - { "Much Less", WorldGenModifiers.Values.ResourcesMuchLess }, - { "Less", WorldGenModifiers.Values.ResourcesLess }, - { "More", WorldGenModifiers.Values.ResourcesMore }, - { "Much More", WorldGenModifiers.Values.ResourcesMuchMore }, - { "Most", WorldGenModifiers.Values.ResourcesMost }, + { DisplayNames.ResourcesMuchLess, WorldGenModifiers.Values.ResourcesMuchLess }, + { DisplayNames.ResourcesLess, WorldGenModifiers.Values.ResourcesLess }, + { DisplayNames.NoModifier, NoValue }, + { DisplayNames.ResourcesMore, WorldGenModifiers.Values.ResourcesMore }, + { DisplayNames.ResourcesMuchMore, WorldGenModifiers.Values.ResourcesMuchMore }, + { DisplayNames.ResourcesMost, WorldGenModifiers.Values.ResourcesMost }, }; + private static readonly Dictionary ModifierResourcesMappingByValue = ModifierResourcesMappingByDisplayName.Invert(); - private static readonly Dictionary ModifierRaidsMapping = new() + private static readonly Dictionary ModifierRaidsMappingByDisplayName = new() { - { KeywordNoModifierValue, "" }, - { "None", WorldGenModifiers.Values.RaidsNone }, - { "Much Less", WorldGenModifiers.Values.RaidsMuchLess }, - { "Less", WorldGenModifiers.Values.RaidsLess }, - { "More", WorldGenModifiers.Values.RaidsMore }, - { "Much More", WorldGenModifiers.Values.RaidsMuchMore }, + { DisplayNames.RaidsNone, WorldGenModifiers.Values.RaidsNone }, + { DisplayNames.RaidsMuchLess, WorldGenModifiers.Values.RaidsMuchLess }, + { DisplayNames.RaidsLess, WorldGenModifiers.Values.RaidsLess }, + { DisplayNames.NoModifier, NoValue }, + { DisplayNames.RaidsMore, WorldGenModifiers.Values.RaidsMore }, + { DisplayNames.RaidsMuchMore, WorldGenModifiers.Values.RaidsMuchMore }, }; + private static readonly Dictionary ModifierRaidsMappingByValue = ModifierRaidsMappingByDisplayName.Invert(); - private static readonly Dictionary ModifierPortalsMapping = new() + private static readonly Dictionary ModifierPortalsMappingByDisplayName = new() { - { KeywordNoModifierValue, "" }, - { "Casual", WorldGenModifiers.Values.PortalsCasual }, - { "Hard", WorldGenModifiers.Values.PortalsHard }, - { "Very Hard", WorldGenModifiers.Values.PortalsVeryHard }, + { DisplayNames.PortalsCasual, WorldGenModifiers.Values.PortalsCasual }, + { DisplayNames.NoModifier, NoValue }, + { DisplayNames.PortalsHard, WorldGenModifiers.Values.PortalsHard }, + { DisplayNames.PortalsVeryHard, WorldGenModifiers.Values.PortalsVeryHard }, }; + private static readonly Dictionary ModifierPortalsMappingByValue = ModifierPortalsMappingByDisplayName.Invert(); + + private void SetFormValuesFromPreset() + { + if (!EnablePresetModifierPopulation) return; + + var currentPresetName = PresetFormField.Value; + if (currentPresetName == DisplayNames.NoPreset) return; + + PresetReactToFormChanges = false; + SetFormDefaultValues(); + + if (!PresetMappingByDisplayName.TryGetValue(currentPresetName, out var currentPresetValue)) return; + + switch (currentPresetValue) + { + case WorldGenPresets.Easy: + ModifierCombatFormField.Value = DisplayNames.CombatEasy; + ModifierRaidsFormField.Value = DisplayNames.RaidsLess; + break; + case WorldGenPresets.Normal: + // no change from defaults + break; + case WorldGenPresets.Hard: + ModifierCombatFormField.Value = DisplayNames.CombatHard; + ModifierRaidsFormField.Value = DisplayNames.RaidsMore; + break; + case WorldGenPresets.Hardcore: + ModifierCombatFormField.Value = DisplayNames.CombatVeryHard; + ModifierDeathPenaltyFormField.Value = DisplayNames.DeathPenaltyHardcore; + ModifierRaidsFormField.Value = DisplayNames.RaidsMore; + ModifierPortalsFormField.Value = DisplayNames.PortalsHard; + KeyNoMapFormField.Value = true; + break; + case WorldGenPresets.Casual: + ModifierCombatFormField.Value = DisplayNames.CombatVeryEasy; + ModifierDeathPenaltyFormField.Value = DisplayNames.DeathPenaltyCasual; + ModifierResourcesFormField.Value = DisplayNames.ResourcesMore; + ModifierRaidsFormField.Value = DisplayNames.RaidsNone; + ModifierPortalsFormField.Value = DisplayNames.PortalsCasual; + KeyPlayerEventsFormField.Value = true; + KeyPassiveMobsFormField.Value = true; + break; + case WorldGenPresets.Hammer: + ModifierRaidsFormField.Value = DisplayNames.RaidsNone; + KeyNoBuildCostFormField.Value = true; + KeyPassiveMobsFormField.Value = true; + break; + case WorldGenPresets.Immersive: + ModifierPortalsFormField.Value = DisplayNames.PortalsVeryHard; + KeyNoMapFormField.Value = true; + break; + default: + break; + } + + // Preset must be set last so that changes to modifier fields do not trigger + // the preset to be returned to "Custom" + EnablePresetModifierPopulation = false; + PresetFormField.Value = currentPresetName; + EnablePresetModifierPopulation = true; + PresetReactToFormChanges = true; + } #endregion @@ -120,29 +230,40 @@ protected override void OnShown(EventArgs e) private void InitializeDropDownOptions() { - PresetFormField.DataSource = PresetMapping.Keys.ToList(); + PresetFormField.DataSource = PresetMappingByDisplayName.Keys.ToList(); - ModifierCombatFormField.DataSource = ModifierCombatMapping.Keys.ToList(); - ModifierDeathPenaltyFormField.DataSource = ModifierDeathPenaltyMapping.Keys.ToList(); - ModifierResourcesFormField.DataSource = ModifierResourcesMapping.Keys.ToList(); - ModifierRaidsFormField.DataSource = ModifierRaidsMapping.Keys.ToList(); - ModifierPortalsFormField.DataSource = ModifierPortalsMapping.Keys.ToList(); + ModifierCombatFormField.DataSource = ModifierCombatMappingByDisplayName.Keys.ToList(); + ModifierDeathPenaltyFormField.DataSource = ModifierDeathPenaltyMappingByDisplayName.Keys.ToList(); + ModifierResourcesFormField.DataSource = ModifierResourcesMappingByDisplayName.Keys.ToList(); + ModifierRaidsFormField.DataSource = ModifierRaidsMappingByDisplayName.Keys.ToList(); + ModifierPortalsFormField.DataSource = ModifierPortalsMappingByDisplayName.Keys.ToList(); } private void InitializeFormEvents() { PresetFormField.ValueChanged += PresetFormField_ValueChanged; + + ModifierCombatFormField.ValueChanged += ModifierFormField_ValueChanged; + ModifierDeathPenaltyFormField.ValueChanged += ModifierFormField_ValueChanged; + ModifierResourcesFormField.ValueChanged += ModifierFormField_ValueChanged; + ModifierRaidsFormField.ValueChanged += ModifierFormField_ValueChanged; + ModifierPortalsFormField.ValueChanged += ModifierFormField_ValueChanged; + + KeyNoBuildCostFormField.ValueChanged += KeyFormField_ValueChanged; + KeyPlayerEventsFormField.ValueChanged += KeyFormField_ValueChanged; + KeyPassiveMobsFormField.ValueChanged += KeyFormField_ValueChanged; + KeyNoMapFormField.ValueChanged += KeyFormField_ValueChanged; } private void SetFormDefaultValues() { - PresetFormField.Value = KeywordNoPreset; + PresetFormField.Value = DisplayNames.NoPreset; - ModifierCombatFormField.Value = KeywordNoModifierValue; - ModifierDeathPenaltyFormField.Value = KeywordNoModifierValue; - ModifierResourcesFormField.Value = KeywordNoModifierValue; - ModifierRaidsFormField.Value = KeywordNoModifierValue; - ModifierPortalsFormField.Value = KeywordNoModifierValue; + ModifierCombatFormField.Value = DisplayNames.NoModifier; + ModifierDeathPenaltyFormField.Value = DisplayNames.NoModifier; + ModifierResourcesFormField.Value = DisplayNames.NoModifier; + ModifierRaidsFormField.Value = DisplayNames.NoModifier; + ModifierPortalsFormField.Value = DisplayNames.NoModifier; KeyNoBuildCostFormField.Value = false; KeyPlayerEventsFormField.Value = false; @@ -162,27 +283,28 @@ private void LoadFormFromPreferences() if (!string.IsNullOrWhiteSpace(prefs.Preset)) { - LoadPresetFromPreferences(prefs, PresetFormField, PresetMapping.Invert()); + LoadPresetFromPreferences(prefs, PresetFormField, PresetMappingByValue); + SetFormValuesFromPreset(); } else { - LoadModifierFromPreferences(prefs, WorldGenModifiers.Combat, ModifierCombatFormField, ModifierCombatMapping.Invert()); - LoadModifierFromPreferences(prefs, WorldGenModifiers.DeathPenalty, ModifierDeathPenaltyFormField, ModifierDeathPenaltyMapping.Invert()); - LoadModifierFromPreferences(prefs, WorldGenModifiers.Resources, ModifierResourcesFormField, ModifierResourcesMapping.Invert()); - LoadModifierFromPreferences(prefs, WorldGenModifiers.Raids, ModifierRaidsFormField, ModifierRaidsMapping.Invert()); - LoadModifierFromPreferences(prefs, WorldGenModifiers.Portals, ModifierPortalsFormField, ModifierPortalsMapping.Invert()); + LoadModifierFromPreferences(prefs, WorldGenModifiers.Combat, ModifierCombatFormField, ModifierCombatMappingByValue); + LoadModifierFromPreferences(prefs, WorldGenModifiers.DeathPenalty, ModifierDeathPenaltyFormField, ModifierDeathPenaltyMappingByValue); + LoadModifierFromPreferences(prefs, WorldGenModifiers.Resources, ModifierResourcesFormField, ModifierResourcesMappingByValue); + LoadModifierFromPreferences(prefs, WorldGenModifiers.Raids, ModifierRaidsFormField, ModifierRaidsMappingByValue); + LoadModifierFromPreferences(prefs, WorldGenModifiers.Portals, ModifierPortalsFormField, ModifierPortalsMappingByValue); + + LoadKeyFromPreferences(prefs, WorldGenKeys.NoBuildCost, KeyNoBuildCostFormField); + LoadKeyFromPreferences(prefs, WorldGenKeys.PlayerEvents, KeyPlayerEventsFormField); + LoadKeyFromPreferences(prefs, WorldGenKeys.PassiveMobs, KeyPassiveMobsFormField); + LoadKeyFromPreferences(prefs, WorldGenKeys.NoMap, KeyNoMapFormField); } - - LoadKeyFromPreferences(prefs, WorldGenKeys.NoBuildCost, KeyNoBuildCostFormField); - LoadKeyFromPreferences(prefs, WorldGenKeys.PlayerEvents, KeyPlayerEventsFormField); - LoadKeyFromPreferences(prefs, WorldGenKeys.PassiveMobs, KeyPassiveMobsFormField); - LoadKeyFromPreferences(prefs, WorldGenKeys.NoMap, KeyNoMapFormField); } private void LoadPresetFromPreferences(WorldPreferences prefs, DropdownFormField dropdown, Dictionary mapping) { // Clear the existing value - dropdown.Value = KeywordNoPreset; + dropdown.Value = DisplayNames.NoPreset; // Return early if no preset is defined on the prefs object if (string.IsNullOrWhiteSpace(prefs.Preset)) return; @@ -201,7 +323,7 @@ private void LoadPresetFromPreferences(WorldPreferences prefs, DropdownFormField private void LoadModifierFromPreferences(WorldPreferences prefs, string modifierName, DropdownFormField dropdown, Dictionary mapping) { // Clear the existing value - dropdown.Value = KeywordNoModifierValue; + dropdown.Value = DisplayNames.NoModifier; // Return early if this modifier is not set on the prefs object if (prefs.Modifiers == null || !prefs.Modifiers.TryGetValue(modifierName, out var modifierValue)) return; @@ -238,30 +360,30 @@ private void SaveFormToPreferences() prefs.Modifiers.Clear(); prefs.Keys.Clear(); - if (PresetFormField.Value != KeywordNoPreset) + if (PresetFormField.Value != DisplayNames.NoPreset) { - SavePresetToPreferences(prefs, PresetFormField, PresetMapping); + SavePresetToPreferences(prefs, PresetFormField, PresetMappingByDisplayName); } else { - SaveModifierToPreferences(prefs, WorldGenModifiers.Combat, ModifierCombatFormField, ModifierCombatMapping); - SaveModifierToPreferences(prefs, WorldGenModifiers.DeathPenalty, ModifierDeathPenaltyFormField, ModifierDeathPenaltyMapping); - SaveModifierToPreferences(prefs, WorldGenModifiers.Resources, ModifierResourcesFormField, ModifierResourcesMapping); - SaveModifierToPreferences(prefs, WorldGenModifiers.Raids, ModifierRaidsFormField, ModifierRaidsMapping); - SaveModifierToPreferences(prefs, WorldGenModifiers.Portals, ModifierPortalsFormField, ModifierPortalsMapping); + SaveModifierToPreferences(prefs, WorldGenModifiers.Combat, ModifierCombatFormField, ModifierCombatMappingByDisplayName); + SaveModifierToPreferences(prefs, WorldGenModifiers.DeathPenalty, ModifierDeathPenaltyFormField, ModifierDeathPenaltyMappingByDisplayName); + SaveModifierToPreferences(prefs, WorldGenModifiers.Resources, ModifierResourcesFormField, ModifierResourcesMappingByDisplayName); + SaveModifierToPreferences(prefs, WorldGenModifiers.Raids, ModifierRaidsFormField, ModifierRaidsMappingByDisplayName); + SaveModifierToPreferences(prefs, WorldGenModifiers.Portals, ModifierPortalsFormField, ModifierPortalsMappingByDisplayName); + + SaveKeyToPreferences(prefs, WorldGenKeys.NoBuildCost, KeyNoBuildCostFormField); + SaveKeyToPreferences(prefs, WorldGenKeys.PlayerEvents, KeyPlayerEventsFormField); + SaveKeyToPreferences(prefs, WorldGenKeys.PassiveMobs, KeyPassiveMobsFormField); + SaveKeyToPreferences(prefs, WorldGenKeys.NoMap, KeyNoMapFormField); } - SaveKeyToPreferences(prefs, WorldGenKeys.NoBuildCost, KeyNoBuildCostFormField); - SaveKeyToPreferences(prefs, WorldGenKeys.PlayerEvents, KeyPlayerEventsFormField); - SaveKeyToPreferences(prefs, WorldGenKeys.PassiveMobs, KeyPassiveMobsFormField); - SaveKeyToPreferences(prefs, WorldGenKeys.NoMap, KeyNoMapFormField); - WorldPrefsProvider.SavePreferences(prefs); } private void SavePresetToPreferences(WorldPreferences prefs, DropdownFormField dropdown, Dictionary mapping) { - if (dropdown.Value == null || dropdown.Value == KeywordNoPreset) return; + if (dropdown.Value == DisplayNames.NoPreset) return; if (mapping.TryGetValue(dropdown.Value, out var value)) { @@ -276,7 +398,7 @@ private void SavePresetToPreferences(WorldPreferences prefs, DropdownFormField d private void SaveModifierToPreferences(WorldPreferences prefs, string modifierName, DropdownFormField dropdown, Dictionary mapping) { - if (dropdown.Value == null || dropdown.Value == KeywordNoModifierValue) return; + if (dropdown.Value == DisplayNames.NoModifier) return; if (mapping.TryGetValue(dropdown.Value, out var value)) { @@ -318,14 +440,28 @@ private void ButtonDefaults_Click(object sender, EventArgs e) private void PresetFormField_ValueChanged(object sender, string e) { - if (string.IsNullOrWhiteSpace(e) || e == KeywordNoPreset) - { - ModifiersGroupBox.Enabled = true; - } - else - { - ModifiersGroupBox.Enabled = false; - } + if (PresetFormField.Value == DisplayNames.NoPreset) return; + + SetFormValuesFromPreset(); + } + + private void UpdatePresetOnValueChange() + { + if (PresetFormField.Value == DisplayNames.NoPreset || !PresetReactToFormChanges) return; + + // If any modifiers change after a preset was selected, then that preset is no longer valid + PresetReactToFormChanges = false; + PresetFormField.Value = DisplayNames.NoPreset; + } + + private void KeyFormField_ValueChanged(object sender, bool e) + { + UpdatePresetOnValueChange(); + } + + private void ModifierFormField_ValueChanged(object sender, string e) + { + UpdatePresetOnValueChange(); } private void WikiLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) diff --git a/ValheimServerGUI/Forms/WorldPreferencesForm.resx b/ValheimServerGUI/Forms/WorldPreferencesForm.resx index af32865..c66ec30 100644 --- a/ValheimServerGUI/Forms/WorldPreferencesForm.resx +++ b/ValheimServerGUI/Forms/WorldPreferencesForm.resx @@ -117,4 +117,52 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 + c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi + bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI + CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL + + + + + AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 + c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi + bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI + CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL + + + + + AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 + c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi + bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI + CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL + + + + + AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 + c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi + bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI + CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL + + + + + AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 + c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi + bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI + CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL + + + + + AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 + c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi + bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI + CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL + + \ No newline at end of file From d99c314bc4d54d810fbf79e2806827c6bdd7db7f Mon Sep 17 00:00:00 2001 From: dolphinspired Date: Mon, 30 Oct 2023 09:41:07 -0400 Subject: [PATCH 09/10] Add help text for world prefs --- .../Forms/WorldPreferencesForm.Designer.cs | 40 ++++++-------- .../Forms/WorldPreferencesForm.cs | 2 +- .../Forms/WorldPreferencesForm.resx | 53 +++---------------- 3 files changed, 24 insertions(+), 71 deletions(-) diff --git a/ValheimServerGUI/Forms/WorldPreferencesForm.Designer.cs b/ValheimServerGUI/Forms/WorldPreferencesForm.Designer.cs index f371ed6..1bd83b0 100644 --- a/ValheimServerGUI/Forms/WorldPreferencesForm.Designer.cs +++ b/ValheimServerGUI/Forms/WorldPreferencesForm.Designer.cs @@ -67,10 +67,9 @@ private void InitializeComponent() // ModifierPortalsFormField // ModifierPortalsFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - ModifierPortalsFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierPortalsFormField.DataSource"); ModifierPortalsFormField.DropdownEnabled = true; ModifierPortalsFormField.EmptyText = ""; - ModifierPortalsFormField.HelpText = ""; + ModifierPortalsFormField.HelpText = "Changes how portals work in the game."; ModifierPortalsFormField.LabelText = "Portals"; ModifierPortalsFormField.Location = new System.Drawing.Point(6, 210); ModifierPortalsFormField.Name = "ModifierPortalsFormField"; @@ -81,12 +80,11 @@ private void InitializeComponent() // ModifierResourcesFormField // ModifierResourcesFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - ModifierResourcesFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierResourcesFormField.DataSource"); ModifierResourcesFormField.DropdownEnabled = true; ModifierResourcesFormField.EmptyText = ""; - ModifierResourcesFormField.HelpText = ""; - ModifierResourcesFormField.LabelText = "Resources"; - ModifierResourcesFormField.Location = new System.Drawing.Point(6, 163); + ModifierResourcesFormField.HelpText = "Governs the amount of resources you gain from\r\nthe world and from enemies."; + ModifierResourcesFormField.LabelText = "Resource Rate"; + ModifierResourcesFormField.Location = new System.Drawing.Point(6, 116); ModifierResourcesFormField.Name = "ModifierResourcesFormField"; ModifierResourcesFormField.Size = new System.Drawing.Size(188, 41); ModifierResourcesFormField.TabIndex = 4; @@ -95,12 +93,11 @@ private void InitializeComponent() // ModifierRaidsFormField // ModifierRaidsFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - ModifierRaidsFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierRaidsFormField.DataSource"); ModifierRaidsFormField.DropdownEnabled = true; ModifierRaidsFormField.EmptyText = ""; - ModifierRaidsFormField.HelpText = ""; + ModifierRaidsFormField.HelpText = "Governs how often enemies may raid your base.\r\n"; ModifierRaidsFormField.LabelText = "Raids"; - ModifierRaidsFormField.Location = new System.Drawing.Point(6, 116); + ModifierRaidsFormField.Location = new System.Drawing.Point(6, 163); ModifierRaidsFormField.Name = "ModifierRaidsFormField"; ModifierRaidsFormField.Size = new System.Drawing.Size(188, 41); ModifierRaidsFormField.TabIndex = 3; @@ -109,10 +106,9 @@ private void InitializeComponent() // ModifierDeathPenaltyFormField // ModifierDeathPenaltyFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - ModifierDeathPenaltyFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierDeathPenaltyFormField.DataSource"); ModifierDeathPenaltyFormField.DropdownEnabled = true; ModifierDeathPenaltyFormField.EmptyText = ""; - ModifierDeathPenaltyFormField.HelpText = ""; + ModifierDeathPenaltyFormField.HelpText = "Governs what happens when you die. See the wiki\r\nfor an explanation of the different options."; ModifierDeathPenaltyFormField.LabelText = "Death Penalty"; ModifierDeathPenaltyFormField.Location = new System.Drawing.Point(6, 69); ModifierDeathPenaltyFormField.Name = "ModifierDeathPenaltyFormField"; @@ -123,10 +119,9 @@ private void InitializeComponent() // ModifierCombatFormField // ModifierCombatFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - ModifierCombatFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("ModifierCombatFormField.DataSource"); ModifierCombatFormField.DropdownEnabled = true; ModifierCombatFormField.EmptyText = ""; - ModifierCombatFormField.HelpText = ""; + ModifierCombatFormField.HelpText = "Governs how much damage you give and take.\r\nAlso governs how likely you are to encounter\r\nhigher leveled enemies, and how dangerous\r\nthey are."; ModifierCombatFormField.LabelText = "Combat"; ModifierCombatFormField.Location = new System.Drawing.Point(6, 22); ModifierCombatFormField.Name = "ModifierCombatFormField"; @@ -150,9 +145,9 @@ private void InitializeComponent() // KeyNoMapFormField // KeyNoMapFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - KeyNoMapFormField.HelpText = ""; + KeyNoMapFormField.HelpText = "You will not have access to the map or the minimap.\r\nThis makes the game harder than intended."; KeyNoMapFormField.LabelText = "No map"; - KeyNoMapFormField.Location = new System.Drawing.Point(6, 45); + KeyNoMapFormField.Location = new System.Drawing.Point(6, 91); KeyNoMapFormField.Name = "KeyNoMapFormField"; KeyNoMapFormField.Size = new System.Drawing.Size(188, 17); KeyNoMapFormField.TabIndex = 3; @@ -161,9 +156,9 @@ private void InitializeComponent() // KeyPassiveMobsFormField // KeyPassiveMobsFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - KeyPassiveMobsFormField.HelpText = ""; + KeyPassiveMobsFormField.HelpText = "Enemies won't attack until you provoke them."; KeyPassiveMobsFormField.LabelText = "Passive enemies"; - KeyPassiveMobsFormField.Location = new System.Drawing.Point(6, 68); + KeyPassiveMobsFormField.Location = new System.Drawing.Point(6, 45); KeyPassiveMobsFormField.Name = "KeyPassiveMobsFormField"; KeyPassiveMobsFormField.Size = new System.Drawing.Size(188, 17); KeyPassiveMobsFormField.TabIndex = 2; @@ -172,9 +167,9 @@ private void InitializeComponent() // KeyPlayerEventsFormField // KeyPlayerEventsFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - KeyPlayerEventsFormField.HelpText = ""; + KeyPlayerEventsFormField.HelpText = resources.GetString("KeyPlayerEventsFormField.HelpText"); KeyPlayerEventsFormField.LabelText = "Player based raids"; - KeyPlayerEventsFormField.Location = new System.Drawing.Point(6, 91); + KeyPlayerEventsFormField.Location = new System.Drawing.Point(6, 68); KeyPlayerEventsFormField.Name = "KeyPlayerEventsFormField"; KeyPlayerEventsFormField.Size = new System.Drawing.Size(188, 17); KeyPlayerEventsFormField.TabIndex = 1; @@ -183,7 +178,7 @@ private void InitializeComponent() // KeyNoBuildCostFormField // KeyNoBuildCostFormField.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - KeyNoBuildCostFormField.HelpText = ""; + KeyNoBuildCostFormField.HelpText = "Build pieces require no materials to build. You still\r\nneed to discover recipes as per usual."; KeyNoBuildCostFormField.LabelText = "No build cost"; KeyNoBuildCostFormField.Location = new System.Drawing.Point(6, 22); KeyNoBuildCostFormField.Name = "KeyNoBuildCostFormField"; @@ -193,11 +188,10 @@ private void InitializeComponent() // // PresetFormField // - PresetFormField.DataSource = (System.Collections.Generic.IEnumerable)resources.GetObject("PresetFormField.DataSource"); PresetFormField.DropdownEnabled = true; PresetFormField.EmptyText = ""; - PresetFormField.HelpText = ""; - PresetFormField.LabelText = "Modifier Preset"; + PresetFormField.HelpText = "Presets are quick sets of options to help you get a\r\nserver up and running quickly.\r\n\r\nIf you select a preset and change any individual\r\nsettings, then the preset will be deselected."; + PresetFormField.LabelText = "Difficulty Preset"; PresetFormField.Location = new System.Drawing.Point(12, 12); PresetFormField.Name = "PresetFormField"; PresetFormField.Size = new System.Drawing.Size(200, 41); diff --git a/ValheimServerGUI/Forms/WorldPreferencesForm.cs b/ValheimServerGUI/Forms/WorldPreferencesForm.cs index 280b373..1ecba99 100644 --- a/ValheimServerGUI/Forms/WorldPreferencesForm.cs +++ b/ValheimServerGUI/Forms/WorldPreferencesForm.cs @@ -33,7 +33,7 @@ private static class DisplayNames public const string PresetHard = "Hard"; public const string PresetHardcore = "Hardcore"; public const string PresetCasual = "Casual"; - public const string PresetHammer = "Hammer Mode"; + public const string PresetHammer = "Hammer Mode (Creative)"; public const string PresetImmersive = "Immersive"; public const string CombatVeryEasy = "Very Easy"; diff --git a/ValheimServerGUI/Forms/WorldPreferencesForm.resx b/ValheimServerGUI/Forms/WorldPreferencesForm.resx index c66ec30..48459fd 100644 --- a/ValheimServerGUI/Forms/WorldPreferencesForm.resx +++ b/ValheimServerGUI/Forms/WorldPreferencesForm.resx @@ -117,52 +117,11 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 - c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi - bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI - CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL - - - - - AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 - c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi - bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI - CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL - - - - - AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 - c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi - bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI - CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL - - - - - AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 - c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi - bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI - CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL - - - - - AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 - c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi - bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI - CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL - - - - - AAEAAAD/////AQAAAAAAAAAEAQAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5 - c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVi - bGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAI - CAkCAAAAAAAAAAAAAAARAgAAAAAAAAAL - + + Raids are based on the progress of each individual +player, rather than on which bosses have been +killed on the server. This setting is recommended if +you want the game to be slightly friendlier to +players with different progress. \ No newline at end of file From 50802f171be45be3d66bfdf54eae439338296848 Mon Sep 17 00:00:00 2001 From: dolphinspired Date: Mon, 30 Oct 2023 09:42:43 -0400 Subject: [PATCH 10/10] v2.3.0-rc.1 --- ValheimServerGUI/ValheimServerGUI.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ValheimServerGUI/ValheimServerGUI.csproj b/ValheimServerGUI/ValheimServerGUI.csproj index 408a520..a8476be 100644 --- a/ValheimServerGUI/ValheimServerGUI.csproj +++ b/ValheimServerGUI/ValheimServerGUI.csproj @@ -10,7 +10,7 @@ A simple user interface for running Valheim Dedicated Server on Windows. 2022 GNU GPLv3 - 2.2.0 + 2.3.0-rc.1 build$([System.DateTime]::UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ"))