diff --git a/changelog-template.hbs b/changelog-template.hbs
index d2bd952d..2043b76e 100644
--- a/changelog-template.hbs
+++ b/changelog-template.hbs
@@ -1,69 +1,28 @@
[Read and Discuss in a Browser](https://github.com/Reloaded-Project/Reloaded-II/discussions/473).
-[Previous Changelog](https://github.com/Reloaded-Project/Reloaded-II/releases/tag/1.29.3).
+[Previous Changelog](https://github.com/Reloaded-Project/Reloaded-II/releases/tag/1.29.5).
-Just a few community PRs and miscellany. As usual, Reloaded-II is on life support while I spend
-the next years building the next best thing - if you want features, please contribute!
+# 1.30.0: Sliders and Supported Games
-# 1.29.5: Add missing `ModConfig.json` to include files
+# Added `TickFrequencyDouble` to `SliderControlParamsAttribute`
-There was a small regression in `1.29.3`, where the default includes did not
-include `ModConfig.json`, that's now been fixed.
+The `TickFrequency` property on `SliderControlParamsAttribute` was previously an `int`, which prevented
+using non-integer tick frequencies for sliders (e.g., `0.5`).
-In addition I added a missing 'include files' label before the second table.
+A new `TickFrequencyDouble` property has been added. When set, it takes precedence over the old `TickFrequency` property.
-# 1.29.4: Misc Linux Installer Improvements
+```csharp
+// Old way (integer only, now obsolete)
+[SliderControlParams(minimum: 0, maximum: 1, tickFrequency: 1)]
-Small improvements to install on Linux:
+// New way (supports non-integer values)
+[SliderControlParams(minimum: 0, maximum: 1, TickFrequencyDouble = 0.1)]
+```
-- [Ensure 'Applications' directory exists so creating shortcut doesn't fail during install on some systems.](https://github.com/Reloaded-Project/Reloaded-II/issues/717)
-- Create `Software\Wine` key in registry if doesn't exist. May fix odd cases where people's 'show dot files' settings don't enable by default.
+Alongside the addition of `textFieldFormat` from @monkeyman192 which (somehow) sat unreleased for 2 years, due to missing `Reloaded.Mod.Interfaces` release, you can now have sliders with nice fractions in configs, without crazy behaviour.
-And also:
-- Updated 🇫🇷 French Localization by @dysfunctionalriot
+
-# 1.29.3: More Miscellaneous Improvements
-
-## Allow .NET 9 Versions >= 9.0.8 for loader.
-
-No update to .NET 10 as of current; but am allowing 9.0.8 or greater for loader now.
-
-According to 3rd party reports I got thus far, `Proton` needs updating to receive some upstream fixes from `Wine` for .NET 10, which may take a while to reach downstream.
-We wait for Proton 11, I suppose.
-
-## Added Progress Bar for Mod Installation
-
-
-
-If a mod takes longer than 3 seconds to install via Drag & Drop, a simple progress bar will display on the screen now.
-In practice you should only see this if you install large mods (think >500MB); on a typical CPU.
-
-## Save Mod Config on Publish, Including `IncludeFiles` and `ExcludeFiles` by @TheBestAstroNOT , @Sewer56
-
-When you `Publish` a mod you have an option to exclude certain files from the released project via `File Inclusions & Exclusions`.
-By default, that is all `.json` files except `.deps.json` and `.runtimeconfig.json` ones.
-
-Previously, changes on this menu didn't save; as barely anyone ever changed the defaults.
-Now they do.
-
-## Reorder ASI Loader DLL Detection Order by @dreamsyntax
-
-The order of which DLL name gets selected for Ultimate ASI Loader was changed.
-Now matches using order defined in our code, rather than the order in `PE Header`.
-
-With that in mind, items were rearranged to be as least intrusive as possible.
-For instance, ASI Loader as `dinput8.dll` has caused issues in the past in limited scenarios; e.g. when using C# library with SharpDX to read inputs via dinput.
-
-## Disabled CET
-
-[.NET 9 added a security feature (on by default)](https://learn.microsoft.com/en-us/dotnet/core/compatibility/interop/9.0/cet-support) which is incompatible with older unsupported versions of Windows.
-Namely Windows 10 22H2 and older.
-
-Given that Reloaded-II is already unsafe by design (injects arbitrary code), and it's usually not used for multiplayer, there is no good reason for CET to be enforced.
-Rather, it should be the game's responsibility to opt in. Generally, if possible, if the base game runs on the PC, the modded game should too, out of the box.
-
-## Misc
-
-- Update Dependencies (@dreamsyntax)
+The old `TickFrequency` property has been marked as `[Obsolete]` but remains functional for backwards compatibility.
------------------------------------
diff --git a/source/Reloaded.Mod.Interfaces/PublicAPI.Shipped.txt b/source/Reloaded.Mod.Interfaces/PublicAPI.Shipped.txt
index 5f282702..c55b4cbf 100644
--- a/source/Reloaded.Mod.Interfaces/PublicAPI.Shipped.txt
+++ b/source/Reloaded.Mod.Interfaces/PublicAPI.Shipped.txt
@@ -1 +1,270 @@
-
\ No newline at end of file
+override Reloaded.Mod.Interfaces.Structs.ModInfo.Equals(object obj) -> bool
+override Reloaded.Mod.Interfaces.Structs.ModInfo.GetHashCode() -> int
+Reloaded.Mod.Interfaces.ConfiguratorContext
+Reloaded.Mod.Interfaces.ConfiguratorContext.Application -> Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1
+Reloaded.Mod.Interfaces.ConfiguratorContext.ApplicationConfigPath -> string
+Reloaded.Mod.Interfaces.ConfiguratorContext.ConfiguratorContext() -> void
+Reloaded.Mod.Interfaces.ConfiguratorContext.ModConfigPath -> string
+Reloaded.Mod.Interfaces.ExportsContext
+Reloaded.Mod.Interfaces.ExportsContext.ApplicationConfig.get -> Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1
+Reloaded.Mod.Interfaces.ExportsContext.ApplicationConfig.set -> void
+Reloaded.Mod.Interfaces.ExportsContext.ExportsContext() -> void
+Reloaded.Mod.Interfaces.IApplicationConfig
+Reloaded.Mod.Interfaces.IConfigurable
+Reloaded.Mod.Interfaces.IConfigurable.ConfigName.get -> string
+Reloaded.Mod.Interfaces.IConfigurable.Save.get -> System.Action
+Reloaded.Mod.Interfaces.IConfigurator
+Reloaded.Mod.Interfaces.IConfiguratorV1
+Reloaded.Mod.Interfaces.IConfiguratorV1.GetConfigurations() -> Reloaded.Mod.Interfaces.IConfigurable[]
+Reloaded.Mod.Interfaces.IConfiguratorV1.SetModDirectory(string modDirectory) -> void
+Reloaded.Mod.Interfaces.IConfiguratorV1.TryRunCustomConfiguration() -> bool
+Reloaded.Mod.Interfaces.IConfiguratorV2
+Reloaded.Mod.Interfaces.IConfiguratorV2.Migrate(string oldDirectory, string newDirectory) -> void
+Reloaded.Mod.Interfaces.IConfiguratorV2.SetConfigDirectory(string configDirectory) -> void
+Reloaded.Mod.Interfaces.IConfiguratorV3
+Reloaded.Mod.Interfaces.IConfiguratorV3.SetContext(in Reloaded.Mod.Interfaces.ConfiguratorContext context) -> void
+Reloaded.Mod.Interfaces.IExports
+Reloaded.Mod.Interfaces.IExports.GetTypes() -> System.Type[]
+Reloaded.Mod.Interfaces.IExports.GetTypesEx(in Reloaded.Mod.Interfaces.ExportsContext context) -> System.Type[]
+Reloaded.Mod.Interfaces.ILogger
+Reloaded.Mod.Interfaces.IMod
+Reloaded.Mod.Interfaces.IModConfig
+Reloaded.Mod.Interfaces.IModLoader
+Reloaded.Mod.Interfaces.IModUserConfig
+Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1
+Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppArguments.get -> string
+Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppArguments.set -> void
+Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppIcon.get -> string
+Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppIcon.set -> void
+Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppId.get -> string
+Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppId.set -> void
+Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppLocation.get -> string
+Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppLocation.set -> void
+Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppName.get -> string
+Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppName.set -> void
+Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.EnabledMods.get -> string[]
+Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.EnabledMods.set -> void
+Reloaded.Mod.Interfaces.Internal.IApplicationConfigV2
+Reloaded.Mod.Interfaces.Internal.IApplicationConfigV2.PluginData.get -> System.Collections.Generic.Dictionary
+Reloaded.Mod.Interfaces.Internal.IApplicationConfigV2.PluginData.set -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV1
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.BackgroundColor.get -> System.Drawing.Color
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.BackgroundColor.set -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorBlue.get -> System.Drawing.Color
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorBlue.set -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorBlueLight.get -> System.Drawing.Color
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorBlueLight.set -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorGreen.get -> System.Drawing.Color
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorGreen.set -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorGreenLight.get -> System.Drawing.Color
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorGreenLight.set -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorLightBlue.get -> System.Drawing.Color
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorLightBlue.set -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorLightBlueLight.get -> System.Drawing.Color
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorLightBlueLight.set -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorPink.get -> System.Drawing.Color
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorPink.set -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorPinkLight.get -> System.Drawing.Color
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorPinkLight.set -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorRed.get -> System.Drawing.Color
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorRed.set -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorRedLight.get -> System.Drawing.Color
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorRedLight.set -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorYellow.get -> System.Drawing.Color
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorYellow.set -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorYellowLight.get -> System.Drawing.Color
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorYellowLight.set -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.OnPrintMessage -> System.EventHandler
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.PrintMessage(string message, System.Drawing.Color color) -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.TextColor.get -> System.Drawing.Color
+Reloaded.Mod.Interfaces.Internal.ILoggerV1.TextColor.set -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV2
+Reloaded.Mod.Interfaces.Internal.ILoggerV2.Write(string message) -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV2.Write(string message, System.Drawing.Color color) -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV2.WriteLine(string message) -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV2.WriteLine(string message, System.Drawing.Color color) -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV3
+Reloaded.Mod.Interfaces.Internal.ILoggerV3.WaitForConsoleInit(System.Threading.CancellationToken token) -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV3.WriteAsync(string message) -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV3.WriteAsync(string message, System.Drawing.Color color) -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV3.WriteLineAsync(string message) -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV3.WriteLineAsync(string message, System.Drawing.Color color) -> void
+Reloaded.Mod.Interfaces.Internal.ILoggerV4
+Reloaded.Mod.Interfaces.Internal.ILoggerV4.OnWrite -> System.EventHandler<(string text, System.Drawing.Color color)>
+Reloaded.Mod.Interfaces.Internal.ILoggerV4.OnWriteLine -> System.EventHandler<(string text, System.Drawing.Color color)>
+Reloaded.Mod.Interfaces.Internal.IModConfigV1
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModAuthor.get -> string
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModAuthor.set -> void
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModDependencies.get -> string[]
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModDependencies.set -> void
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModDescription.get -> string
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModDescription.set -> void
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModDll.get -> string
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModDll.set -> void
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModIcon.get -> string
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModIcon.set -> void
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModId.get -> string
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModId.set -> void
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModName.get -> string
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModName.set -> void
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModVersion.get -> string
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModVersion.set -> void
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.SupportedAppId.get -> string[]
+Reloaded.Mod.Interfaces.Internal.IModConfigV1.SupportedAppId.set -> void
+Reloaded.Mod.Interfaces.Internal.IModConfigV2
+Reloaded.Mod.Interfaces.Internal.IModConfigV2.OptionalDependencies.get -> string[]
+Reloaded.Mod.Interfaces.Internal.IModConfigV2.OptionalDependencies.set -> void
+Reloaded.Mod.Interfaces.Internal.IModConfigV3
+Reloaded.Mod.Interfaces.Internal.IModConfigV3.GetDllPath(string configPath) -> string
+Reloaded.Mod.Interfaces.Internal.IModConfigV3.GetManagedDllPath(string configPath) -> string
+Reloaded.Mod.Interfaces.Internal.IModConfigV3.GetNativeDllPath(string configPath) -> string
+Reloaded.Mod.Interfaces.Internal.IModConfigV3.IsNativeMod(string configPath) -> bool
+Reloaded.Mod.Interfaces.Internal.IModConfigV3.IsR2R(string configPath) -> bool
+Reloaded.Mod.Interfaces.Internal.IModConfigV3.ModNativeDll32.get -> string
+Reloaded.Mod.Interfaces.Internal.IModConfigV3.ModNativeDll32.set -> void
+Reloaded.Mod.Interfaces.Internal.IModConfigV3.ModNativeDll64.get -> string
+Reloaded.Mod.Interfaces.Internal.IModConfigV3.ModNativeDll64.set -> void
+Reloaded.Mod.Interfaces.Internal.IModConfigV3.ModR2RManagedDll32.get -> string
+Reloaded.Mod.Interfaces.Internal.IModConfigV3.ModR2RManagedDll32.set -> void
+Reloaded.Mod.Interfaces.Internal.IModConfigV3.ModR2RManagedDll64.get -> string
+Reloaded.Mod.Interfaces.Internal.IModConfigV3.ModR2RManagedDll64.set -> void
+Reloaded.Mod.Interfaces.Internal.IModConfigV3.TryGetIconPath(string configPath, out string iconPath) -> bool
+Reloaded.Mod.Interfaces.Internal.IModConfigV4
+Reloaded.Mod.Interfaces.Internal.IModConfigV4.IsLibrary.get -> bool
+Reloaded.Mod.Interfaces.Internal.IModConfigV4.IsLibrary.set -> void
+Reloaded.Mod.Interfaces.Internal.IModConfigV5
+Reloaded.Mod.Interfaces.Internal.IModConfigV5.IsUniversalMod.get -> bool
+Reloaded.Mod.Interfaces.Internal.IModConfigV5.IsUniversalMod.set -> void
+Reloaded.Mod.Interfaces.Internal.IModConfigV5.PluginData.get -> System.Collections.Generic.Dictionary
+Reloaded.Mod.Interfaces.Internal.IModConfigV5.PluginData.set -> void
+Reloaded.Mod.Interfaces.Internal.IModConfigV5.ReleaseMetadataFileName.get -> string
+Reloaded.Mod.Interfaces.Internal.IModConfigV5.ReleaseMetadataFileName.set -> void
+Reloaded.Mod.Interfaces.Internal.IModLoaderV1
+Reloaded.Mod.Interfaces.Internal.IModLoaderV1.AddOrReplaceController(Reloaded.Mod.Interfaces.Internal.IModV1 owner, T instance) -> void
+Reloaded.Mod.Interfaces.Internal.IModLoaderV1.GetActiveMods() -> Reloaded.Mod.Interfaces.Internal.ModGenericTuple[]
+Reloaded.Mod.Interfaces.Internal.IModLoaderV1.GetAppConfig() -> Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1
+Reloaded.Mod.Interfaces.Internal.IModLoaderV1.GetController() -> System.WeakReference
+Reloaded.Mod.Interfaces.Internal.IModLoaderV1.GetLoaderVersion() -> System.Version
+Reloaded.Mod.Interfaces.Internal.IModLoaderV1.GetLogger() -> Reloaded.Mod.Interfaces.Internal.ILoggerV1
+Reloaded.Mod.Interfaces.Internal.IModLoaderV1.MakeInterfaces() -> System.WeakReference[]
+Reloaded.Mod.Interfaces.Internal.IModLoaderV1.ModLoaded.get -> System.Action
+Reloaded.Mod.Interfaces.Internal.IModLoaderV1.ModLoaded.set -> void
+Reloaded.Mod.Interfaces.Internal.IModLoaderV1.ModLoading.get -> System.Action
+Reloaded.Mod.Interfaces.Internal.IModLoaderV1.ModLoading.set -> void
+Reloaded.Mod.Interfaces.Internal.IModLoaderV1.ModUnloading.get -> System.Action
+Reloaded.Mod.Interfaces.Internal.IModLoaderV1.ModUnloading.set -> void
+Reloaded.Mod.Interfaces.Internal.IModLoaderV1.OnModLoaderInitialized.get -> System.Action
+Reloaded.Mod.Interfaces.Internal.IModLoaderV1.OnModLoaderInitialized.set -> void
+Reloaded.Mod.Interfaces.Internal.IModLoaderV1.RemoveController() -> void
+Reloaded.Mod.Interfaces.Internal.IModLoaderV2
+Reloaded.Mod.Interfaces.Internal.IModLoaderV2.GetDirectoryForModId(string modId) -> string
+Reloaded.Mod.Interfaces.Internal.IModLoaderV3
+Reloaded.Mod.Interfaces.Internal.IModLoaderV3.GetModConfigDirectory(string modId) -> string
+Reloaded.Mod.Interfaces.Internal.IModLoaderV4
+Reloaded.Mod.Interfaces.Internal.IModLoaderV4.GetLoadedMods() -> Reloaded.Mod.Interfaces.Structs.ModInfo[]
+Reloaded.Mod.Interfaces.Internal.IModLoaderV4.LoadMod(string modId) -> void
+Reloaded.Mod.Interfaces.Internal.IModLoaderV4.ResumeMod(string modId) -> void
+Reloaded.Mod.Interfaces.Internal.IModLoaderV4.SuspendMod(string modId) -> void
+Reloaded.Mod.Interfaces.Internal.IModLoaderV4.UnloadMod(string modId) -> void
+Reloaded.Mod.Interfaces.Internal.IModUserConfigV1
+Reloaded.Mod.Interfaces.Internal.IModUserConfigV1.AllowPrereleases.get -> bool?
+Reloaded.Mod.Interfaces.Internal.IModUserConfigV1.AllowPrereleases.set -> void
+Reloaded.Mod.Interfaces.Internal.IModUserConfigV1.IsUniversalMod.get -> bool
+Reloaded.Mod.Interfaces.Internal.IModUserConfigV1.IsUniversalMod.set -> void
+Reloaded.Mod.Interfaces.Internal.IModUserConfigV1.ModId.get -> string
+Reloaded.Mod.Interfaces.Internal.IModUserConfigV1.ModId.set -> void
+Reloaded.Mod.Interfaces.Internal.IModUserConfigV1.PluginData.get -> System.Collections.Generic.Dictionary
+Reloaded.Mod.Interfaces.Internal.IModUserConfigV1.PluginData.set -> void
+Reloaded.Mod.Interfaces.Internal.IModV1
+Reloaded.Mod.Interfaces.Internal.IModV1.CanSuspend() -> bool
+Reloaded.Mod.Interfaces.Internal.IModV1.CanUnload() -> bool
+Reloaded.Mod.Interfaces.Internal.IModV1.Disposing.get -> System.Action
+Reloaded.Mod.Interfaces.Internal.IModV1.Resume() -> void
+Reloaded.Mod.Interfaces.Internal.IModV1.Start(Reloaded.Mod.Interfaces.Internal.IModLoaderV1 loader) -> void
+Reloaded.Mod.Interfaces.Internal.IModV1.Suspend() -> void
+Reloaded.Mod.Interfaces.Internal.IModV1.Unload() -> void
+Reloaded.Mod.Interfaces.Internal.IModV2
+Reloaded.Mod.Interfaces.Internal.IModV2.StartEx(Reloaded.Mod.Interfaces.Internal.IModLoaderV1 loader, Reloaded.Mod.Interfaces.Internal.IModConfigV1 config) -> void
+Reloaded.Mod.Interfaces.Internal.IPluginConfigV1
+Reloaded.Mod.Interfaces.Internal.IPluginConfigV1.Author.get -> string
+Reloaded.Mod.Interfaces.Internal.IPluginConfigV1.Author.set -> void
+Reloaded.Mod.Interfaces.Internal.IPluginConfigV1.Description.get -> string
+Reloaded.Mod.Interfaces.Internal.IPluginConfigV1.Description.set -> void
+Reloaded.Mod.Interfaces.Internal.IPluginConfigV1.Name.get -> string
+Reloaded.Mod.Interfaces.Internal.IPluginConfigV1.Name.set -> void
+Reloaded.Mod.Interfaces.Internal.IPluginConfigV1.Version.get -> string
+Reloaded.Mod.Interfaces.Internal.IPluginConfigV1.Version.set -> void
+Reloaded.Mod.Interfaces.Internal.ModGenericTuple
+Reloaded.Mod.Interfaces.Internal.ModGenericTuple.Generic.get -> T
+Reloaded.Mod.Interfaces.Internal.ModGenericTuple.Generic.set -> void
+Reloaded.Mod.Interfaces.Internal.ModGenericTuple.Mod.get -> Reloaded.Mod.Interfaces.Internal.IModV1
+Reloaded.Mod.Interfaces.Internal.ModGenericTuple.Mod.set -> void
+Reloaded.Mod.Interfaces.Internal.ModGenericTuple.ModGenericTuple(Reloaded.Mod.Interfaces.Internal.IModV1 mod, T generic) -> void
+Reloaded.Mod.Interfaces.IPluginConfig
+Reloaded.Mod.Interfaces.IUpdatableConfigurable
+Reloaded.Mod.Interfaces.IUpdatableConfigurable.ConfigurationUpdated -> System.Action
+Reloaded.Mod.Interfaces.Structs.Enums.ModState
+Reloaded.Mod.Interfaces.Structs.Enums.ModState.Running = 0 -> Reloaded.Mod.Interfaces.Structs.Enums.ModState
+Reloaded.Mod.Interfaces.Structs.Enums.ModState.Suspended = 1 -> Reloaded.Mod.Interfaces.Structs.Enums.ModState
+Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute
+Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.AddToRecent.get -> bool
+Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.ChooseFileButtonLabel.get -> string
+Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.FilePickerParamsAttribute(string initialDirectory = null, System.Environment.SpecialFolder initialFolderPath = System.Environment.SpecialFolder.MyDocuments, string chooseFileButtonLabel = "Choose File", bool userCanEditPathText = true, string title = "", string filter = "All files (*.*)|*.*", int filterIndex = 0, bool multiselect = false, bool supportMultiDottedExtensions = false, bool showHiddenFiles = false, bool showPreview = false, bool restoreDirectory = false, bool addToRecent = false) -> void
+Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.Filter.get -> string
+Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.FilterIndex.get -> int
+Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.InitialDirectory.get -> string
+Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.InitialFolderPath.get -> System.Environment.SpecialFolder
+Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.Multiselect.get -> bool
+Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.RestoreDirectory.get -> bool
+Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.ShowHiddenFiles.get -> bool
+Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.ShowPreview.get -> bool
+Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.SupportMultiDottedExtensions.get -> bool
+Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.Title.get -> string
+Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.UserCanEditPathText.get -> bool
+Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute
+Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.ChooseFolderButtonLabel.get -> string
+Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.FileNameLabel.get -> string
+Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.FolderPickerParamsAttribute(string initialDirectory = null, System.Environment.SpecialFolder initialFolderPath = System.Environment.SpecialFolder.MyDocuments, string chooseFolderButtonLabel = "Choose Folder", bool userCanEditPathText = true, string title = "", string okButtonLabel = "Ok", string fileNameLabel = "", bool multiSelect = false, bool forceFileSystem = false) -> void
+Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.ForceFileSystem.get -> bool
+Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.InitialDirectory.get -> string
+Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.InitialFolderPath.get -> System.Environment.SpecialFolder
+Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.Multiselect.get -> bool
+Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.OkButtonLabel.get -> string
+Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.Title.get -> string
+Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.UserCanEditPathText.get -> bool
+Reloaded.Mod.Interfaces.Structs.ICustomControlAttribute
+Reloaded.Mod.Interfaces.Structs.ModInfo
+Reloaded.Mod.Interfaces.Structs.ModInfo.CanSendResume.get -> bool
+Reloaded.Mod.Interfaces.Structs.ModInfo.CanSendSuspend.get -> bool
+Reloaded.Mod.Interfaces.Structs.ModInfo.CanSuspend.get -> bool
+Reloaded.Mod.Interfaces.Structs.ModInfo.CanSuspend.set -> void
+Reloaded.Mod.Interfaces.Structs.ModInfo.CanUnload.get -> bool
+Reloaded.Mod.Interfaces.Structs.ModInfo.CanUnload.set -> void
+Reloaded.Mod.Interfaces.Structs.ModInfo.Config.get -> Reloaded.Mod.Interfaces.IModConfig
+Reloaded.Mod.Interfaces.Structs.ModInfo.Config.set -> void
+Reloaded.Mod.Interfaces.Structs.ModInfo.Equals(Reloaded.Mod.Interfaces.Structs.ModInfo other) -> bool
+Reloaded.Mod.Interfaces.Structs.ModInfo.ModId.get -> string
+Reloaded.Mod.Interfaces.Structs.ModInfo.ModInfo() -> void
+Reloaded.Mod.Interfaces.Structs.ModInfo.ModInfo(Reloaded.Mod.Interfaces.Structs.Enums.ModState state, Reloaded.Mod.Interfaces.IModConfig modConfig, bool canSuspend, bool canUnload) -> void
+Reloaded.Mod.Interfaces.Structs.ModInfo.State.get -> Reloaded.Mod.Interfaces.Structs.Enums.ModState
+Reloaded.Mod.Interfaces.Structs.ModInfo.State.set -> void
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.IsSnapToTickEnabled.get -> bool
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.IsTextFieldEditable.get -> bool
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.LargeChange.get -> double
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.Maximum.get -> double
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.Minimum.get -> double
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.ShowTextField.get -> bool
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.SliderControlParamsAttribute(double minimum = 0, double maximum = 1, double smallChange = 0.1, double largeChange = 1, int tickFrequency = 10, bool isSnapToTickEnabled = false, Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement tickPlacement = Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement.None, bool showTextField = false, bool isTextFieldEditable = true, string textValidationRegex = ".*", string textFieldFormat = "") -> void
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.SmallChange.get -> double
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.TextFieldFormat.get -> string
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.TextValidationRegex.get -> string
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.TickFrequency.get -> int
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.TickPlacement.get -> Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement
+Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement
+Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement.Both = 3 -> Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement
+Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement.BottomRight = 2 -> Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement
+Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement.None = 0 -> Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement
+Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement.TopLeft = 1 -> Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement
+Reloaded.Mod.Interfaces.Utilities.Extensions
+static Reloaded.Mod.Interfaces.Utilities.Extensions.TryGetValue(this System.Collections.Generic.Dictionary pluginData, string key, out T result) -> bool
\ No newline at end of file
diff --git a/source/Reloaded.Mod.Interfaces/PublicAPI.Unshipped.txt b/source/Reloaded.Mod.Interfaces/PublicAPI.Unshipped.txt
index c55b4cbf..cc943645 100644
--- a/source/Reloaded.Mod.Interfaces/PublicAPI.Unshipped.txt
+++ b/source/Reloaded.Mod.Interfaces/PublicAPI.Unshipped.txt
@@ -1,270 +1,5 @@
-override Reloaded.Mod.Interfaces.Structs.ModInfo.Equals(object obj) -> bool
-override Reloaded.Mod.Interfaces.Structs.ModInfo.GetHashCode() -> int
-Reloaded.Mod.Interfaces.ConfiguratorContext
-Reloaded.Mod.Interfaces.ConfiguratorContext.Application -> Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1
-Reloaded.Mod.Interfaces.ConfiguratorContext.ApplicationConfigPath -> string
-Reloaded.Mod.Interfaces.ConfiguratorContext.ConfiguratorContext() -> void
-Reloaded.Mod.Interfaces.ConfiguratorContext.ModConfigPath -> string
-Reloaded.Mod.Interfaces.ExportsContext
-Reloaded.Mod.Interfaces.ExportsContext.ApplicationConfig.get -> Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1
-Reloaded.Mod.Interfaces.ExportsContext.ApplicationConfig.set -> void
-Reloaded.Mod.Interfaces.ExportsContext.ExportsContext() -> void
-Reloaded.Mod.Interfaces.IApplicationConfig
-Reloaded.Mod.Interfaces.IConfigurable
-Reloaded.Mod.Interfaces.IConfigurable.ConfigName.get -> string
-Reloaded.Mod.Interfaces.IConfigurable.Save.get -> System.Action
-Reloaded.Mod.Interfaces.IConfigurator
-Reloaded.Mod.Interfaces.IConfiguratorV1
-Reloaded.Mod.Interfaces.IConfiguratorV1.GetConfigurations() -> Reloaded.Mod.Interfaces.IConfigurable[]
-Reloaded.Mod.Interfaces.IConfiguratorV1.SetModDirectory(string modDirectory) -> void
-Reloaded.Mod.Interfaces.IConfiguratorV1.TryRunCustomConfiguration() -> bool
-Reloaded.Mod.Interfaces.IConfiguratorV2
-Reloaded.Mod.Interfaces.IConfiguratorV2.Migrate(string oldDirectory, string newDirectory) -> void
-Reloaded.Mod.Interfaces.IConfiguratorV2.SetConfigDirectory(string configDirectory) -> void
-Reloaded.Mod.Interfaces.IConfiguratorV3
-Reloaded.Mod.Interfaces.IConfiguratorV3.SetContext(in Reloaded.Mod.Interfaces.ConfiguratorContext context) -> void
-Reloaded.Mod.Interfaces.IExports
-Reloaded.Mod.Interfaces.IExports.GetTypes() -> System.Type[]
-Reloaded.Mod.Interfaces.IExports.GetTypesEx(in Reloaded.Mod.Interfaces.ExportsContext context) -> System.Type[]
-Reloaded.Mod.Interfaces.ILogger
-Reloaded.Mod.Interfaces.IMod
-Reloaded.Mod.Interfaces.IModConfig
-Reloaded.Mod.Interfaces.IModLoader
-Reloaded.Mod.Interfaces.IModUserConfig
-Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1
-Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppArguments.get -> string
-Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppArguments.set -> void
-Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppIcon.get -> string
-Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppIcon.set -> void
-Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppId.get -> string
-Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppId.set -> void
-Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppLocation.get -> string
-Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppLocation.set -> void
-Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppName.get -> string
-Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.AppName.set -> void
-Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.EnabledMods.get -> string[]
-Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1.EnabledMods.set -> void
-Reloaded.Mod.Interfaces.Internal.IApplicationConfigV2
-Reloaded.Mod.Interfaces.Internal.IApplicationConfigV2.PluginData.get -> System.Collections.Generic.Dictionary
-Reloaded.Mod.Interfaces.Internal.IApplicationConfigV2.PluginData.set -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV1
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.BackgroundColor.get -> System.Drawing.Color
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.BackgroundColor.set -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorBlue.get -> System.Drawing.Color
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorBlue.set -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorBlueLight.get -> System.Drawing.Color
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorBlueLight.set -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorGreen.get -> System.Drawing.Color
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorGreen.set -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorGreenLight.get -> System.Drawing.Color
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorGreenLight.set -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorLightBlue.get -> System.Drawing.Color
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorLightBlue.set -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorLightBlueLight.get -> System.Drawing.Color
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorLightBlueLight.set -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorPink.get -> System.Drawing.Color
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorPink.set -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorPinkLight.get -> System.Drawing.Color
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorPinkLight.set -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorRed.get -> System.Drawing.Color
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorRed.set -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorRedLight.get -> System.Drawing.Color
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorRedLight.set -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorYellow.get -> System.Drawing.Color
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorYellow.set -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorYellowLight.get -> System.Drawing.Color
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.ColorYellowLight.set -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.OnPrintMessage -> System.EventHandler
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.PrintMessage(string message, System.Drawing.Color color) -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.TextColor.get -> System.Drawing.Color
-Reloaded.Mod.Interfaces.Internal.ILoggerV1.TextColor.set -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV2
-Reloaded.Mod.Interfaces.Internal.ILoggerV2.Write(string message) -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV2.Write(string message, System.Drawing.Color color) -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV2.WriteLine(string message) -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV2.WriteLine(string message, System.Drawing.Color color) -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV3
-Reloaded.Mod.Interfaces.Internal.ILoggerV3.WaitForConsoleInit(System.Threading.CancellationToken token) -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV3.WriteAsync(string message) -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV3.WriteAsync(string message, System.Drawing.Color color) -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV3.WriteLineAsync(string message) -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV3.WriteLineAsync(string message, System.Drawing.Color color) -> void
-Reloaded.Mod.Interfaces.Internal.ILoggerV4
-Reloaded.Mod.Interfaces.Internal.ILoggerV4.OnWrite -> System.EventHandler<(string text, System.Drawing.Color color)>
-Reloaded.Mod.Interfaces.Internal.ILoggerV4.OnWriteLine -> System.EventHandler<(string text, System.Drawing.Color color)>
-Reloaded.Mod.Interfaces.Internal.IModConfigV1
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModAuthor.get -> string
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModAuthor.set -> void
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModDependencies.get -> string[]
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModDependencies.set -> void
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModDescription.get -> string
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModDescription.set -> void
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModDll.get -> string
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModDll.set -> void
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModIcon.get -> string
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModIcon.set -> void
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModId.get -> string
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModId.set -> void
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModName.get -> string
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModName.set -> void
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModVersion.get -> string
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.ModVersion.set -> void
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.SupportedAppId.get -> string[]
-Reloaded.Mod.Interfaces.Internal.IModConfigV1.SupportedAppId.set -> void
-Reloaded.Mod.Interfaces.Internal.IModConfigV2
-Reloaded.Mod.Interfaces.Internal.IModConfigV2.OptionalDependencies.get -> string[]
-Reloaded.Mod.Interfaces.Internal.IModConfigV2.OptionalDependencies.set -> void
-Reloaded.Mod.Interfaces.Internal.IModConfigV3
-Reloaded.Mod.Interfaces.Internal.IModConfigV3.GetDllPath(string configPath) -> string
-Reloaded.Mod.Interfaces.Internal.IModConfigV3.GetManagedDllPath(string configPath) -> string
-Reloaded.Mod.Interfaces.Internal.IModConfigV3.GetNativeDllPath(string configPath) -> string
-Reloaded.Mod.Interfaces.Internal.IModConfigV3.IsNativeMod(string configPath) -> bool
-Reloaded.Mod.Interfaces.Internal.IModConfigV3.IsR2R(string configPath) -> bool
-Reloaded.Mod.Interfaces.Internal.IModConfigV3.ModNativeDll32.get -> string
-Reloaded.Mod.Interfaces.Internal.IModConfigV3.ModNativeDll32.set -> void
-Reloaded.Mod.Interfaces.Internal.IModConfigV3.ModNativeDll64.get -> string
-Reloaded.Mod.Interfaces.Internal.IModConfigV3.ModNativeDll64.set -> void
-Reloaded.Mod.Interfaces.Internal.IModConfigV3.ModR2RManagedDll32.get -> string
-Reloaded.Mod.Interfaces.Internal.IModConfigV3.ModR2RManagedDll32.set -> void
-Reloaded.Mod.Interfaces.Internal.IModConfigV3.ModR2RManagedDll64.get -> string
-Reloaded.Mod.Interfaces.Internal.IModConfigV3.ModR2RManagedDll64.set -> void
-Reloaded.Mod.Interfaces.Internal.IModConfigV3.TryGetIconPath(string configPath, out string iconPath) -> bool
-Reloaded.Mod.Interfaces.Internal.IModConfigV4
-Reloaded.Mod.Interfaces.Internal.IModConfigV4.IsLibrary.get -> bool
-Reloaded.Mod.Interfaces.Internal.IModConfigV4.IsLibrary.set -> void
-Reloaded.Mod.Interfaces.Internal.IModConfigV5
-Reloaded.Mod.Interfaces.Internal.IModConfigV5.IsUniversalMod.get -> bool
-Reloaded.Mod.Interfaces.Internal.IModConfigV5.IsUniversalMod.set -> void
-Reloaded.Mod.Interfaces.Internal.IModConfigV5.PluginData.get -> System.Collections.Generic.Dictionary
-Reloaded.Mod.Interfaces.Internal.IModConfigV5.PluginData.set -> void
-Reloaded.Mod.Interfaces.Internal.IModConfigV5.ReleaseMetadataFileName.get -> string
-Reloaded.Mod.Interfaces.Internal.IModConfigV5.ReleaseMetadataFileName.set -> void
-Reloaded.Mod.Interfaces.Internal.IModLoaderV1
-Reloaded.Mod.Interfaces.Internal.IModLoaderV1.AddOrReplaceController(Reloaded.Mod.Interfaces.Internal.IModV1 owner, T instance) -> void
-Reloaded.Mod.Interfaces.Internal.IModLoaderV1.GetActiveMods() -> Reloaded.Mod.Interfaces.Internal.ModGenericTuple[]
-Reloaded.Mod.Interfaces.Internal.IModLoaderV1.GetAppConfig() -> Reloaded.Mod.Interfaces.Internal.IApplicationConfigV1
-Reloaded.Mod.Interfaces.Internal.IModLoaderV1.GetController() -> System.WeakReference
-Reloaded.Mod.Interfaces.Internal.IModLoaderV1.GetLoaderVersion() -> System.Version
-Reloaded.Mod.Interfaces.Internal.IModLoaderV1.GetLogger() -> Reloaded.Mod.Interfaces.Internal.ILoggerV1
-Reloaded.Mod.Interfaces.Internal.IModLoaderV1.MakeInterfaces() -> System.WeakReference[]
-Reloaded.Mod.Interfaces.Internal.IModLoaderV1.ModLoaded.get -> System.Action
-Reloaded.Mod.Interfaces.Internal.IModLoaderV1.ModLoaded.set -> void
-Reloaded.Mod.Interfaces.Internal.IModLoaderV1.ModLoading.get -> System.Action
-Reloaded.Mod.Interfaces.Internal.IModLoaderV1.ModLoading.set -> void
-Reloaded.Mod.Interfaces.Internal.IModLoaderV1.ModUnloading.get -> System.Action
-Reloaded.Mod.Interfaces.Internal.IModLoaderV1.ModUnloading.set -> void
-Reloaded.Mod.Interfaces.Internal.IModLoaderV1.OnModLoaderInitialized.get -> System.Action
-Reloaded.Mod.Interfaces.Internal.IModLoaderV1.OnModLoaderInitialized.set -> void
-Reloaded.Mod.Interfaces.Internal.IModLoaderV1.RemoveController() -> void
-Reloaded.Mod.Interfaces.Internal.IModLoaderV2
-Reloaded.Mod.Interfaces.Internal.IModLoaderV2.GetDirectoryForModId(string modId) -> string
-Reloaded.Mod.Interfaces.Internal.IModLoaderV3
-Reloaded.Mod.Interfaces.Internal.IModLoaderV3.GetModConfigDirectory(string modId) -> string
-Reloaded.Mod.Interfaces.Internal.IModLoaderV4
-Reloaded.Mod.Interfaces.Internal.IModLoaderV4.GetLoadedMods() -> Reloaded.Mod.Interfaces.Structs.ModInfo[]
-Reloaded.Mod.Interfaces.Internal.IModLoaderV4.LoadMod(string modId) -> void
-Reloaded.Mod.Interfaces.Internal.IModLoaderV4.ResumeMod(string modId) -> void
-Reloaded.Mod.Interfaces.Internal.IModLoaderV4.SuspendMod(string modId) -> void
-Reloaded.Mod.Interfaces.Internal.IModLoaderV4.UnloadMod(string modId) -> void
-Reloaded.Mod.Interfaces.Internal.IModUserConfigV1
-Reloaded.Mod.Interfaces.Internal.IModUserConfigV1.AllowPrereleases.get -> bool?
-Reloaded.Mod.Interfaces.Internal.IModUserConfigV1.AllowPrereleases.set -> void
-Reloaded.Mod.Interfaces.Internal.IModUserConfigV1.IsUniversalMod.get -> bool
-Reloaded.Mod.Interfaces.Internal.IModUserConfigV1.IsUniversalMod.set -> void
-Reloaded.Mod.Interfaces.Internal.IModUserConfigV1.ModId.get -> string
-Reloaded.Mod.Interfaces.Internal.IModUserConfigV1.ModId.set -> void
-Reloaded.Mod.Interfaces.Internal.IModUserConfigV1.PluginData.get -> System.Collections.Generic.Dictionary
-Reloaded.Mod.Interfaces.Internal.IModUserConfigV1.PluginData.set -> void
-Reloaded.Mod.Interfaces.Internal.IModV1
-Reloaded.Mod.Interfaces.Internal.IModV1.CanSuspend() -> bool
-Reloaded.Mod.Interfaces.Internal.IModV1.CanUnload() -> bool
-Reloaded.Mod.Interfaces.Internal.IModV1.Disposing.get -> System.Action
-Reloaded.Mod.Interfaces.Internal.IModV1.Resume() -> void
-Reloaded.Mod.Interfaces.Internal.IModV1.Start(Reloaded.Mod.Interfaces.Internal.IModLoaderV1 loader) -> void
-Reloaded.Mod.Interfaces.Internal.IModV1.Suspend() -> void
-Reloaded.Mod.Interfaces.Internal.IModV1.Unload() -> void
-Reloaded.Mod.Interfaces.Internal.IModV2
-Reloaded.Mod.Interfaces.Internal.IModV2.StartEx(Reloaded.Mod.Interfaces.Internal.IModLoaderV1 loader, Reloaded.Mod.Interfaces.Internal.IModConfigV1 config) -> void
-Reloaded.Mod.Interfaces.Internal.IPluginConfigV1
-Reloaded.Mod.Interfaces.Internal.IPluginConfigV1.Author.get -> string
-Reloaded.Mod.Interfaces.Internal.IPluginConfigV1.Author.set -> void
-Reloaded.Mod.Interfaces.Internal.IPluginConfigV1.Description.get -> string
-Reloaded.Mod.Interfaces.Internal.IPluginConfigV1.Description.set -> void
-Reloaded.Mod.Interfaces.Internal.IPluginConfigV1.Name.get -> string
-Reloaded.Mod.Interfaces.Internal.IPluginConfigV1.Name.set -> void
-Reloaded.Mod.Interfaces.Internal.IPluginConfigV1.Version.get -> string
-Reloaded.Mod.Interfaces.Internal.IPluginConfigV1.Version.set -> void
-Reloaded.Mod.Interfaces.Internal.ModGenericTuple
-Reloaded.Mod.Interfaces.Internal.ModGenericTuple.Generic.get -> T
-Reloaded.Mod.Interfaces.Internal.ModGenericTuple.Generic.set -> void
-Reloaded.Mod.Interfaces.Internal.ModGenericTuple.Mod.get -> Reloaded.Mod.Interfaces.Internal.IModV1
-Reloaded.Mod.Interfaces.Internal.ModGenericTuple.Mod.set -> void
-Reloaded.Mod.Interfaces.Internal.ModGenericTuple.ModGenericTuple(Reloaded.Mod.Interfaces.Internal.IModV1 mod, T generic) -> void
-Reloaded.Mod.Interfaces.IPluginConfig
-Reloaded.Mod.Interfaces.IUpdatableConfigurable
-Reloaded.Mod.Interfaces.IUpdatableConfigurable.ConfigurationUpdated -> System.Action
-Reloaded.Mod.Interfaces.Structs.Enums.ModState
-Reloaded.Mod.Interfaces.Structs.Enums.ModState.Running = 0 -> Reloaded.Mod.Interfaces.Structs.Enums.ModState
-Reloaded.Mod.Interfaces.Structs.Enums.ModState.Suspended = 1 -> Reloaded.Mod.Interfaces.Structs.Enums.ModState
-Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute
-Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.AddToRecent.get -> bool
-Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.ChooseFileButtonLabel.get -> string
-Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.FilePickerParamsAttribute(string initialDirectory = null, System.Environment.SpecialFolder initialFolderPath = System.Environment.SpecialFolder.MyDocuments, string chooseFileButtonLabel = "Choose File", bool userCanEditPathText = true, string title = "", string filter = "All files (*.*)|*.*", int filterIndex = 0, bool multiselect = false, bool supportMultiDottedExtensions = false, bool showHiddenFiles = false, bool showPreview = false, bool restoreDirectory = false, bool addToRecent = false) -> void
-Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.Filter.get -> string
-Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.FilterIndex.get -> int
-Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.InitialDirectory.get -> string
-Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.InitialFolderPath.get -> System.Environment.SpecialFolder
-Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.Multiselect.get -> bool
-Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.RestoreDirectory.get -> bool
-Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.ShowHiddenFiles.get -> bool
-Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.ShowPreview.get -> bool
-Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.SupportMultiDottedExtensions.get -> bool
-Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.Title.get -> string
-Reloaded.Mod.Interfaces.Structs.FilePickerParamsAttribute.UserCanEditPathText.get -> bool
-Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute
-Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.ChooseFolderButtonLabel.get -> string
-Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.FileNameLabel.get -> string
-Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.FolderPickerParamsAttribute(string initialDirectory = null, System.Environment.SpecialFolder initialFolderPath = System.Environment.SpecialFolder.MyDocuments, string chooseFolderButtonLabel = "Choose Folder", bool userCanEditPathText = true, string title = "", string okButtonLabel = "Ok", string fileNameLabel = "", bool multiSelect = false, bool forceFileSystem = false) -> void
-Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.ForceFileSystem.get -> bool
-Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.InitialDirectory.get -> string
-Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.InitialFolderPath.get -> System.Environment.SpecialFolder
-Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.Multiselect.get -> bool
-Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.OkButtonLabel.get -> string
-Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.Title.get -> string
-Reloaded.Mod.Interfaces.Structs.FolderPickerParamsAttribute.UserCanEditPathText.get -> bool
-Reloaded.Mod.Interfaces.Structs.ICustomControlAttribute
-Reloaded.Mod.Interfaces.Structs.ModInfo
-Reloaded.Mod.Interfaces.Structs.ModInfo.CanSendResume.get -> bool
-Reloaded.Mod.Interfaces.Structs.ModInfo.CanSendSuspend.get -> bool
-Reloaded.Mod.Interfaces.Structs.ModInfo.CanSuspend.get -> bool
-Reloaded.Mod.Interfaces.Structs.ModInfo.CanSuspend.set -> void
-Reloaded.Mod.Interfaces.Structs.ModInfo.CanUnload.get -> bool
-Reloaded.Mod.Interfaces.Structs.ModInfo.CanUnload.set -> void
-Reloaded.Mod.Interfaces.Structs.ModInfo.Config.get -> Reloaded.Mod.Interfaces.IModConfig
-Reloaded.Mod.Interfaces.Structs.ModInfo.Config.set -> void
-Reloaded.Mod.Interfaces.Structs.ModInfo.Equals(Reloaded.Mod.Interfaces.Structs.ModInfo other) -> bool
-Reloaded.Mod.Interfaces.Structs.ModInfo.ModId.get -> string
-Reloaded.Mod.Interfaces.Structs.ModInfo.ModInfo() -> void
-Reloaded.Mod.Interfaces.Structs.ModInfo.ModInfo(Reloaded.Mod.Interfaces.Structs.Enums.ModState state, Reloaded.Mod.Interfaces.IModConfig modConfig, bool canSuspend, bool canUnload) -> void
-Reloaded.Mod.Interfaces.Structs.ModInfo.State.get -> Reloaded.Mod.Interfaces.Structs.Enums.ModState
-Reloaded.Mod.Interfaces.Structs.ModInfo.State.set -> void
-Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute
-Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.IsSnapToTickEnabled.get -> bool
-Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.IsTextFieldEditable.get -> bool
-Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.LargeChange.get -> double
-Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.Maximum.get -> double
-Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.Minimum.get -> double
-Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.ShowTextField.get -> bool
-Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.SliderControlParamsAttribute(double minimum = 0, double maximum = 1, double smallChange = 0.1, double largeChange = 1, int tickFrequency = 10, bool isSnapToTickEnabled = false, Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement tickPlacement = Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement.None, bool showTextField = false, bool isTextFieldEditable = true, string textValidationRegex = ".*", string textFieldFormat = "") -> void
-Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.SmallChange.get -> double
-Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.TextFieldFormat.get -> string
-Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.TextValidationRegex.get -> string
-Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.TickFrequency.get -> int
-Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.TickPlacement.get -> Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement
-Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement
-Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement.Both = 3 -> Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement
-Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement.BottomRight = 2 -> Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement
-Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement.None = 0 -> Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement
-Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement.TopLeft = 1 -> Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement
-Reloaded.Mod.Interfaces.Utilities.Extensions
-static Reloaded.Mod.Interfaces.Utilities.Extensions.TryGetValue(this System.Collections.Generic.Dictionary pluginData, string key, out T result) -> bool
\ No newline at end of file
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.SliderControlParamsAttribute(double minimum = 0, double maximum = 1, double smallChange = 0.1, double largeChange = 1, int tickFrequency = 10, bool isSnapToTickEnabled = false, Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement tickPlacement = Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement.None, bool showTextField = false, bool isTextFieldEditable = true, string textValidationRegex = ".*", string textFieldFormat = "", double tickFrequencyDouble = 0) -> void
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.SliderControlParamsAttribute(double minimum, double maximum, double smallChange, double largeChange, int tickFrequency, bool isSnapToTickEnabled, Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement tickPlacement, bool showTextField, bool isTextFieldEditable, string textValidationRegex) -> void
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.SliderControlParamsAttribute(double minimum, double maximum, double smallChange, double largeChange, int tickFrequency, bool isSnapToTickEnabled, Reloaded.Mod.Interfaces.Structs.SliderControlTickPlacement tickPlacement, bool showTextField, bool isTextFieldEditable, string textValidationRegex, string textFieldFormat) -> void
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.TickFrequencyDouble.get -> double
+Reloaded.Mod.Interfaces.Structs.SliderControlParamsAttribute.TickFrequencyDouble.set -> void
\ No newline at end of file
diff --git a/source/Reloaded.Mod.Interfaces/Reloaded.Mod.Interfaces.csproj b/source/Reloaded.Mod.Interfaces/Reloaded.Mod.Interfaces.csproj
index 3d39b667..59ac2452 100644
--- a/source/Reloaded.Mod.Interfaces/Reloaded.Mod.Interfaces.csproj
+++ b/source/Reloaded.Mod.Interfaces/Reloaded.Mod.Interfaces.csproj
@@ -1,4 +1,4 @@
-
+
netcoreapp3.1
@@ -13,7 +13,7 @@
https://github.com/Reloaded-Project/Reloaded-II
git
true
- 2.4.1
+ 2.5.0
true
AnyCPU
1701;1702;1591
diff --git a/source/Reloaded.Mod.Interfaces/Structs/ControlAttribute.cs b/source/Reloaded.Mod.Interfaces/Structs/ControlAttribute.cs
index aec0872b..77d5c6c2 100644
--- a/source/Reloaded.Mod.Interfaces/Structs/ControlAttribute.cs
+++ b/source/Reloaded.Mod.Interfaces/Structs/ControlAttribute.cs
@@ -1,4 +1,4 @@
-namespace Reloaded.Mod.Interfaces.Structs;
+namespace Reloaded.Mod.Interfaces.Structs;
///
/// Change the position that the ticks appear for the Slider Control
@@ -35,9 +35,22 @@ public class SliderControlParamsAttribute : Attribute, ICustomControlAttribute
///
public double LargeChange { get; }
///
- /// Places a tick every N values
+ /// Places a tick every N values.
///
+ ///
+ /// This property is obsolete. Use instead, which supports non-integer tick frequencies.
+ /// This property remains for binary backwards compatibility.
+ ///
+ [Obsolete("Use TickFrequencyDouble instead. This property remains for binary backwards compatibility.")]
public int TickFrequency { get; }
+
+ ///
+ /// Places a tick every N values. If set to a value greater than 0, this takes precedence over .
+ ///
+ ///
+ /// Default value is 0, which means the old property is used instead.
+ ///
+ public double TickFrequencyDouble { get; set; }
///
/// If enabled, the slider will snap to the tick values.
///
@@ -78,7 +91,23 @@ public SliderControlParamsAttribute(
bool showTextField,
bool isTextFieldEditable,
string textValidationRegex
-) : this(minimum, maximum, smallChange, largeChange, tickFrequency, isSnapToTickEnabled, tickPlacement, showTextField, isTextFieldEditable, textValidationRegex, textFieldFormat: "")
+) : this(minimum, maximum, smallChange, largeChange, tickFrequency, isSnapToTickEnabled, tickPlacement, showTextField, isTextFieldEditable, textValidationRegex, "")
+ {}
+
+ // 2.4.1 BACKCOMPAT OVERLOAD -- DO NOT TOUCH
+ public SliderControlParamsAttribute(
+ double minimum,
+ double maximum,
+ double smallChange,
+ double largeChange,
+ int tickFrequency,
+ bool isSnapToTickEnabled,
+ SliderControlTickPlacement tickPlacement,
+ bool showTextField,
+ bool isTextFieldEditable,
+ string textValidationRegex,
+ string textFieldFormat
+ ) : this(minimum, maximum, smallChange, largeChange, tickFrequency, isSnapToTickEnabled, tickPlacement, showTextField, isTextFieldEditable, textValidationRegex, textFieldFormat, 0)
{}
public SliderControlParamsAttribute(
@@ -92,13 +121,17 @@ public SliderControlParamsAttribute(
bool showTextField = false,
bool isTextFieldEditable = true,
string textValidationRegex = ".*",
- string textFieldFormat = ""
+ string textFieldFormat = "",
+ double tickFrequencyDouble = 0
) {
Minimum = minimum;
Maximum = maximum;
SmallChange = smallChange;
LargeChange = largeChange;
+#pragma warning disable CS0618 // Type or member is obsolete
TickFrequency = tickFrequency;
+#pragma warning restore CS0618
+ TickFrequencyDouble = tickFrequencyDouble;
IsSnapToTickEnabled = isSnapToTickEnabled;
TickPlacement = tickPlacement;
ShowTextField = showTextField;
diff --git a/source/Reloaded.Mod.Launcher/Controls/PropertyGridEx.cs b/source/Reloaded.Mod.Launcher/Controls/PropertyGridEx.cs
index 75c9e9a5..7210dc5f 100644
--- a/source/Reloaded.Mod.Launcher/Controls/PropertyGridEx.cs
+++ b/source/Reloaded.Mod.Launcher/Controls/PropertyGridEx.cs
@@ -476,7 +476,9 @@ public override FrameworkElement CreateElement(PropertyItem propertyItem)
Maximum = SliderControlParams.Maximum,
SmallChange = SliderControlParams.SmallChange,
LargeChange = SliderControlParams.LargeChange,
- TickFrequency = SliderControlParams.TickFrequency,
+#pragma warning disable CS0618 // TickFrequency is obsolete - intentional fallback for backward compatibility
+ TickFrequency = SliderControlParams.TickFrequencyDouble > 0 ? SliderControlParams.TickFrequencyDouble : SliderControlParams.TickFrequency,
+#pragma warning restore CS0618
IsSnapToTickEnabled = SliderControlParams.IsSnapToTickEnabled,
TickPlacement = SliderTickPlacementEnumConvert.ToTickPlacement(SliderControlParams.TickPlacement)
};
diff --git a/source/Reloaded.Mod.Launcher/Reloaded.Mod.Launcher.csproj b/source/Reloaded.Mod.Launcher/Reloaded.Mod.Launcher.csproj
index eb7d3493..a615f1b3 100644
--- a/source/Reloaded.Mod.Launcher/Reloaded.Mod.Launcher.csproj
+++ b/source/Reloaded.Mod.Launcher/Reloaded.Mod.Launcher.csproj
@@ -1,4 +1,4 @@
-
+
WinExe
@@ -7,7 +7,7 @@
true
Reloaded-II
Reloaded.Mod.Launcher
- 1.29.6
+ 1.30.0
Sewer56 ~ $([System.DateTime]::UtcNow.ToString("s")) | $(Version)
false
appicon.ico
diff --git a/source/Reloaded.Mod.Loader/Reloaded.Mod.Loader.csproj b/source/Reloaded.Mod.Loader/Reloaded.Mod.Loader.csproj
index d8021f14..e58c3e3a 100644
--- a/source/Reloaded.Mod.Loader/Reloaded.Mod.Loader.csproj
+++ b/source/Reloaded.Mod.Loader/Reloaded.Mod.Loader.csproj
@@ -1,4 +1,4 @@
-
+
net9.0-windows
9.0.8
@@ -14,7 +14,7 @@
true
false
$(NoWarn);NU1605;NU1701
- 1.29.5
+ 1.30.0
false
x86;x64
false
diff --git a/source/Testing/Mods/TestModControlParams/Config.cs b/source/Testing/Mods/TestModControlParams/Config.cs
index def2ba12..7ada968f 100644
--- a/source/Testing/Mods/TestModControlParams/Config.cs
+++ b/source/Testing/Mods/TestModControlParams/Config.cs
@@ -1,4 +1,4 @@
-using System.ComponentModel;
+using System.ComponentModel;
using TestModControlParams.Template.Configuration;
using Reloaded.Mod.Interfaces.Structs;
@@ -28,6 +28,21 @@ public class Config : Configurable
[SliderControlParams(minimum: 0.0, maximum: 1.0, showTextField: true, textFieldFormat: "{0:#,0.000}")]
public double DoubleSlider { get; set; } = 0.5;
+ [DisplayName("Double Slider (TickFrequencyDouble)")]
+ [Description("This slider uses the new TickFrequencyDouble property for 0.01 tick increments.")]
+ [DefaultValue(0.5)]
+ [SliderControlParams(
+ minimum: 0.0,
+ maximum: 1.0,
+ smallChange: 0.001,
+ largeChange: 0.001,
+ isSnapToTickEnabled: true,
+ tickPlacement: SliderControlTickPlacement.BottomRight,
+ showTextField: true,
+ textFieldFormat: "{0:0.000}",
+ TickFrequencyDouble = 0.001)]
+ public double DoubleSliderWithTickFrequencyDouble { get; set; } = 0.5;
+
[DisplayName("File Picker")]
[Description("This is a sample file picker.")]
[DefaultValue("")]