diff --git a/SetupDevEnvironment/App.config b/SetupDevEnvironment/App.config
new file mode 100644
index 00000000..514b2e92
--- /dev/null
+++ b/SetupDevEnvironment/App.config
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SetupDevEnvironment/IO/AssemblyPublicizer.cs b/SetupDevEnvironment/IO/AssemblyPublicizer.cs
new file mode 100644
index 00000000..c70bbfc9
--- /dev/null
+++ b/SetupDevEnvironment/IO/AssemblyPublicizer.cs
@@ -0,0 +1,112 @@
+//elliotttate/Bepinex-Tools
+
+using dnlib.DotNet;
+using System.Reflection;
+using FieldAttributes = dnlib.DotNet.FieldAttributes;
+using MethodAttributes = dnlib.DotNet.MethodAttributes;
+using TypeAttributes = dnlib.DotNet.TypeAttributes;
+
+namespace SetupDevEnvironment.IO;
+
+internal class AssemblyPublicizer
+{
+ public AssemblyPublicizer()
+ {
+ Logger.Start();
+ }
+
+ public static void ProcessAssemblies(string[] files)
+ {
+ foreach (var file in files)
+ {
+ try
+ {
+ var assembly = Assembly.LoadFile(file);
+ ProcessAssembly(assembly);
+ } catch(Exception ex)
+ {
+ Logger.Log(ex.Message);
+ }
+ }
+ }
+
+ private static void ProcessAssembly(Assembly assembly)
+ {
+ string assemblyPath = assembly.Location;
+ string filename = assembly.GetName().Name!;
+ string outputPath = Path.Combine(Path.GetDirectoryName(assemblyPath)!, "publicized_assemblies");
+ string outputSuffix = "_publicized";
+
+ Directory.CreateDirectory(outputPath);
+
+ string curHash = ComputeHash(assembly);
+
+ string hashPath = Path.Combine(outputPath, $"{filename}{outputSuffix}.hash");
+ string lastHash = string.Empty;
+
+ if (File.Exists(hashPath))
+ lastHash = File.ReadAllText(hashPath);
+
+ if (curHash == lastHash)
+ return;
+
+ Logger.Log($"Making a public assembly from {filename}");
+ RewriteAssembly(assemblyPath).Write($"{Path.Combine(outputPath, filename)}{outputSuffix}.dll");
+ File.WriteAllText(hashPath, curHash);
+ }
+
+ private static string ComputeHash(Assembly assembly)
+ {
+ return assembly.ManifestModule.ModuleVersionId.ToString();
+ }
+
+ private static ModuleDef RewriteAssembly(string assemblyPath)
+ {
+ var assembly = ModuleDefMD.Load(assemblyPath);
+
+ var types = assembly.GetTypes();
+ Logger.Log($"{assembly.Name}: {types.Count()} types");
+
+ foreach (var type in types)
+ {
+ MakeTypePublic(type);
+ MakeMethodsPublic(type);
+ MakeFieldsPublic(type);
+ }
+
+ return assembly;
+ }
+
+ private static void MakeFieldsPublic(TypeDef type)
+ {
+ var eventNames = type.Events
+ .Select(ev => ev.Name.ToString()).ToList();
+
+ var fields = type.Fields
+ .Where(x => !eventNames.Contains(x.Name)).ToArray();
+
+ foreach (FieldDef field in fields)
+ {
+ field.Attributes &= ~FieldAttributes.FieldAccessMask;
+ field.Attributes |= FieldAttributes.Public;
+ }
+ }
+
+ private static void MakeTypePublic(TypeDef type)
+ {
+ type.Attributes &= ~TypeAttributes.VisibilityMask;
+ if (type.IsNested)
+ type.Attributes |= TypeAttributes.NestedPublic;
+ else
+ type.Attributes |= TypeAttributes.Public;
+ }
+
+ private static void MakeMethodsPublic(TypeDef type)
+ {
+ foreach (MethodDef method in type.Methods)
+ {
+ method.Attributes &= ~MethodAttributes.MemberAccessMask;
+ method.Attributes |= MethodAttributes.Public;
+ }
+ }
+}
diff --git a/SetupDevEnvironment/IO/DirectoryHelper.cs b/SetupDevEnvironment/IO/DirectoryHelper.cs
new file mode 100644
index 00000000..3106b0a8
--- /dev/null
+++ b/SetupDevEnvironment/IO/DirectoryHelper.cs
@@ -0,0 +1,13 @@
+namespace SetupDevEnvironment.IO
+{
+ public static class DirectoryHelper
+ {
+ public static string CreateTempFolder()
+ {
+ var tempFolder = Path.GetTempPath();
+ var folder = Path.Combine(tempFolder, Path.GetRandomFileName());
+ Directory.CreateDirectory(folder);
+ return folder;
+ }
+ }
+}
diff --git a/SetupDevEnvironment/IO/Downloader.cs b/SetupDevEnvironment/IO/Downloader.cs
new file mode 100644
index 00000000..eaae7754
--- /dev/null
+++ b/SetupDevEnvironment/IO/Downloader.cs
@@ -0,0 +1,17 @@
+namespace SetupDevEnvironment.IO;
+
+internal partial class Downloader
+{
+
+ public static async Task Download(string url, string? fileName = null)
+ {
+ var tempFile = fileName ?? Path.GetTempFileName();
+
+ using (var client = new HttpClient())
+ {
+ var data = await client.GetByteArrayAsync(url);
+ await File.WriteAllBytesAsync(tempFile, data);
+ return tempFile;
+ }
+ }
+}
diff --git a/SetupDevEnvironment/IO/FileMover.cs b/SetupDevEnvironment/IO/FileMover.cs
new file mode 100644
index 00000000..2447cb60
--- /dev/null
+++ b/SetupDevEnvironment/IO/FileMover.cs
@@ -0,0 +1,34 @@
+using dnlib.DotNet;
+
+namespace SetupDevEnvironment.IO
+{
+ internal class FileCopier
+ {
+ public static void CopyFiles(string sourceFolder, string destinationFolder)
+ {
+ var sourceFiles = Directory.GetFiles(sourceFolder, "*.*", SearchOption.AllDirectories);
+ CopyFiles(sourceFolder, sourceFiles, destinationFolder);
+ }
+
+ public static void CopyFiles(string sourceFolder, string[] sourceFiles, string destinationFolder)
+ {
+ Directory.CreateDirectory(destinationFolder);
+ foreach (string file in sourceFiles)
+ {
+ var relativeFile = Path.GetRelativePath(sourceFolder, file);
+ var destFile = Path.Combine(destinationFolder, relativeFile);
+
+ // we may need new subfolders
+ var folder = Path.GetDirectoryName(destFile);
+ Directory.CreateDirectory(folder!);
+
+ if (File.GetAttributes(file).HasFlag(System.IO.FileAttributes.Directory))
+ {
+ continue;
+ }
+
+ File.Copy(file, destFile, true);
+ }
+ }
+ }
+}
diff --git a/SetupDevEnvironment/IO/Links.cs b/SetupDevEnvironment/IO/Links.cs
new file mode 100644
index 00000000..215bfd5e
--- /dev/null
+++ b/SetupDevEnvironment/IO/Links.cs
@@ -0,0 +1,29 @@
+namespace SetupDevEnvironment.IO;
+
+internal static class Links
+{
+ internal static string DefaultValheimInstallFolder =
+ @"C:\Program Files (x86)\Steam\steamapps\common\Valheim";
+ internal static string DefaultValheimPlusDevInstallFolder =
+ @"C:\Program Files (x86)\Steam\steamapps\common\Valheim Plus Development";
+ internal static readonly string DnSpy64TargetFolder =
+ @"C:\Program Files\dnSpy64";
+
+ internal static readonly string BepInEx =
+ @"https://valheim.thunderstore.io/package/download/denikson/BepInExPack_Valheim/5.4.1900/";
+ internal static readonly string BepInEx21 =
+ @"https://github.com/BepInEx/BepInEx/releases/download/v5.4.21/BepInEx_x64_5.4.21.0.zip";
+
+ [Obsolete("This should be the correct source, but you can't run valheim with it", true)]
+ internal static readonly string Unstripped_Corlib =
+ @"https://cdn.discordapp.com/attachments/624272422295568435/841990037935882250/unstripped_corlib.7z";
+ internal static readonly string Unstripped_Corlib_ValheimPlusSource =
+ @"https://github.com/valheimPlus/ValheimPlus/releases/download/0.9.9.9/WindowsClient.zip";
+
+ internal static readonly string DnSpy64 =
+ @"https://github.com/dnSpy/dnSpy/releases/download/v6.1.8/dnSpy-net-win64.zip";
+
+ [Obsolete("we're doing this ourselves now", true)]
+ internal static readonly string Assemblyinternalizer =
+ @"https://github.com/elliotttate/Bepinex-Tools/releases/download/1.0.0-internalizer/Bepinex-internalizer.zip";
+}
diff --git a/SetupDevEnvironment/IO/LogEvent.cs b/SetupDevEnvironment/IO/LogEvent.cs
new file mode 100644
index 00000000..1c9d1535
--- /dev/null
+++ b/SetupDevEnvironment/IO/LogEvent.cs
@@ -0,0 +1,11 @@
+namespace SetupDevEnvironment.IO;
+
+internal class LogEvent : EventArgs
+{
+ public string Message { get; private set; }
+
+ public LogEvent(string message)
+ {
+ Message = message;
+ }
+}
diff --git a/SetupDevEnvironment/IO/ProcessRunner.cs b/SetupDevEnvironment/IO/ProcessRunner.cs
new file mode 100644
index 00000000..99484e30
--- /dev/null
+++ b/SetupDevEnvironment/IO/ProcessRunner.cs
@@ -0,0 +1,19 @@
+using System.Diagnostics;
+
+namespace SetupDevEnvironment.IO
+{
+ internal class ProcessRunner
+ {
+ internal static void Run(string path)
+ {
+ var process = new Process();
+ process.StartInfo = new ProcessStartInfo()
+ {
+ UseShellExecute = true,
+ FileName = path,
+ };
+
+ process.Start();
+ }
+ }
+}
diff --git a/SetupDevEnvironment/IO/ResourceHelper.cs b/SetupDevEnvironment/IO/ResourceHelper.cs
new file mode 100644
index 00000000..786e4a84
--- /dev/null
+++ b/SetupDevEnvironment/IO/ResourceHelper.cs
@@ -0,0 +1,18 @@
+namespace SetupDevEnvironment.IO
+{
+ #nullable disable
+ internal class ResourceHelper
+ {
+ public static string GetResource(string name)
+ {
+ var assembly = typeof(ResourceHelper).Assembly;
+ var resourceName = assembly.GetManifestResourceNames().Single(x => x.Contains(name));
+
+ using (var stream = assembly.GetManifestResourceStream(resourceName))
+ using (var reader = new StreamReader(stream))
+ {
+ return reader.ReadToEnd();
+ }
+ }
+ }
+}
diff --git a/SetupDevEnvironment/IO/Unzipper.cs b/SetupDevEnvironment/IO/Unzipper.cs
new file mode 100644
index 00000000..d765e089
--- /dev/null
+++ b/SetupDevEnvironment/IO/Unzipper.cs
@@ -0,0 +1,61 @@
+using SharpCompress.Common;
+using SharpCompress.Readers;
+using System.IO.Compression;
+
+namespace SetupDevEnvironment.IO
+{
+ internal static class Unzipper
+ {
+ ///
+ /// returns all entries relative to the target folder
+ ///
+ ///
+ ///
+ ///
+ public static string[] Unzip(string filename, string? targetFolder = null)
+ {
+ targetFolder = targetFolder ?? DirectoryHelper.CreateTempFolder();
+ Directory.CreateDirectory(targetFolder);
+
+ var archive = SharpCompress.Archives.ArchiveFactory.Open(filename);
+ using (var reader = archive.ExtractAllEntries())
+ {
+ reader.WriteAllToDirectory(targetFolder, new ExtractionOptions { ExtractFullPath = true, Overwrite = true, PreserveFileTime = true });
+ }
+ return archive.Entries.Select(e => Path.Combine(targetFolder, e.Key)).ToArray();
+ }
+ // switch (Path.GetExtension(filename).ToLower())
+ // {
+ // case ".zip":
+ // return UnzipZip(filename, targetFolder);
+ // case ".7z":
+ // return Unzip7z(filename, targetFolder);
+ // }
+ //}
+
+ //private static string[] Unzip7z(string filename, string? targetFolder)
+ //{
+ // using (var zipFileStream = new SharpCompress.Archives.SevenZip.(filename))
+ // using (var zipfile = new ZipArchive(zipFileStream))
+ // {
+ // zipfile.ExtractToDirectory(targetFolder, true);
+
+ // return zipfile.Entries
+ // .Select(entry => Path.Combine(targetFolder, entry.FullName))
+ // .ToArray();
+ // }
+ //}
+
+ //public static string[] UnzipZip(string filename, string? targetFolder = null)
+ //{
+ // using (var zipFileStream = new FileStream(filename, FileMode.Open))
+ // using (var zipfile = new ZipArchive(zipFileStream))
+ // {
+ // zipfile.ExtractToDirectory(targetFolder, true);
+
+ // return zipfile.Entries
+ // .Select(entry => Path.Combine(targetFolder, entry.FullName))
+ // .ToArray();
+ // }
+ }
+}
diff --git a/SetupDevEnvironment/InstallScript.cs b/SetupDevEnvironment/InstallScript.cs
new file mode 100644
index 00000000..52f7e2da
--- /dev/null
+++ b/SetupDevEnvironment/InstallScript.cs
@@ -0,0 +1,156 @@
+using SetupDevEnvironment.IO;
+using System.Reflection;
+
+namespace SetupDevEnvironment;
+internal class InstallScript
+{
+ public InstallScript()
+ {
+ Logger.Start();
+ }
+
+ public async Task Install()
+ {
+ //1.Download the[BepInEx for Valheim package](https://valheim.thunderstore.io/package/download/denikson/BepInExPack_Valheim/5.4.1901/).
+ //1.Extract zip contents and copy the contents inside `/ BepInExPack_Valheim /` and paste them in your Valheim root folder and overwrite every file when asked.
+ //1.Copy over all the DLLs from Valheim/ unstripped_corlib to Valheim / valheim_Data / Managed * (overwrite when asked) *
+ //1.Download the[AssemblyPublicizer package](https://mega.nz/file/oQxEjCJI#_XPXEjwLfv9zpcF2HRakYzepMwaUXflA9txxhx4tACA).
+ //1.Drag and drop all `assembly_ *.dll` files from "\Valheim\valheim_Data\Managed\" folder onto "AssemblyPublicizer.exe".
+ //1.Define Environment Variable `VALHEIM_INSTALL` with path to Valheim Install Directory
+
+ CopyValheimFiles();
+ await InstallBepInEx541900();
+ //await InstallUnstrippedFiles();
+ PublicizeAssembliesDirectly();
+ await SetupDnSpy();
+ ConfigureEnvironment();
+ Logger.Log("All Done, have a nice dev.");
+ Logger.Stop();
+ }
+
+ private static void CopyValheimFiles()
+ {
+ Logger.Log("Copying existing Valheim files to Dev Environment...");
+ FileCopier.CopyFiles(Settings.ValheimInstallDir, Settings.ValheimPlusDevInstallDir);
+ Logger.Log("Done!");
+ }
+
+ private static void ConfigureEnvironment()
+ {
+ Logger.Log("Configuring environment...");
+ Environment.SetEnvironmentVariable("VALHEIM_INSTALL", Settings.ValheimPlusDevInstallDir, EnvironmentVariableTarget.Machine);
+ var configPath = Path.Combine(Settings.ValheimPlusDevInstallDir, "BepInEx\\config\\");
+
+ Directory.CreateDirectory(configPath);
+ var configFile = Path.Combine(configPath, "valheim_plus.cfg");
+ if (!File.Exists(configFile))
+ {
+ var defaultConfig = ResourceHelper.GetResource("valheim_plus.cfg");
+ File.WriteAllText(configFile, defaultConfig);
+ }
+
+ Directory.CreateDirectory(Path.Combine(Settings.ValheimPlusDevInstallDir, "BepInEx\\plugins\\"));
+
+ Logger.Log("Done!");
+ }
+
+ private static async Task SetupDnSpy()
+ {
+ Logger.Log("Installing Debug helper DnSpy...");
+ var tempFolder = DirectoryHelper.CreateTempFolder();
+ var dnSpyZip = await Downloader.Download(Links.DnSpy64, Path.Combine(tempFolder, "dnSpy.zip"));
+ var dnSpyFiles = Unzipper.Unzip(dnSpyZip, Links.DnSpy64TargetFolder);
+ var dnSpyExecutable = dnSpyFiles.Single(file => file.EndsWith("dnSpy.exe"));
+
+ Logger.Log($"DnSpy installed to '{dnSpyExecutable}'");
+ Logger.Log("Done!");
+
+ Logger.Log("Creating DnSpy configuration...");
+ var template = ResourceHelper.GetResource("DnSpyConfiguration.xml");
+ template = template.Replace(@"%%DNSPYDIR%%", Links.DnSpy64TargetFolder);
+ template = template.Replace(@"%%VALHEIMPLUSINSTALLDIR%%", Settings.ValheimPlusDevInstallDir);
+
+ var configurationFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "dnSpy", "dnSpy.xml");
+ if (File.Exists(configurationFile))
+ {
+ Logger.Log("backing up existing dnSpy config");
+ File.Copy(configurationFile, configurationFile + ".ValheimPlus.bak", true);
+ }
+ File.WriteAllText(configurationFile, template);
+ Logger.Log("Done!");
+
+ Logger.Log("Installing patched mono dll...");
+ var executablePath = Path.GetDirectoryName(Assembly.GetEntryAssembly()!.Location);
+ var libPath = Path.Combine(executablePath!, "../../../../libraries/Debug/mono-2.0-bdwgc.dll");
+ var destinationPath = Path.Combine(Settings.ValheimPlusDevInstallDir, "MonoBleedingEdge\\EmbedRuntime\\mono-2.0-bdwgc.dll");
+ File.Copy(destinationPath, destinationPath + ".bak", true);
+ File.Copy(libPath, destinationPath, true);
+ Logger.Log("Done!");
+ }
+
+ public static async Task InstallBepInEx541900(bool includeCoreLib = false)
+ {
+ Logger.Log("Installing BepInEx...");
+ var tempFolder = DirectoryHelper.CreateTempFolder();
+ var bepInExZip = await Downloader.Download(Links.BepInEx, Path.Combine(tempFolder, "bepInExPack.zip"));
+ var bepInExFiles = Unzipper.Unzip(bepInExZip);
+ File.Delete(bepInExZip);
+
+ var sourceFolder = bepInExFiles.Single(file => file.EndsWith("BepInExPack_Valheim/"));
+ FileCopier.CopyFiles(sourceFolder, Settings.ValheimPlusDevInstallDir);
+
+ if (includeCoreLib)
+ {
+ var coreLibFolder = Path.Combine(Settings.ValheimPlusDevInstallDir, $"unstripped_corlib\\");
+ var managedFolder = Path.Combine(Settings.ValheimPlusDevInstallDir, $"valheim_Data\\Managed\\");
+
+ FileCopier.CopyFiles(coreLibFolder, managedFolder);
+ } else
+ {
+ await InstallUnstrippedFiles();
+ }
+ }
+
+ public static async Task InstallUnstrippedFiles()
+ {
+ Logger.Log("Installing Unstripped Unity Dlls...");
+ var tempFolder = DirectoryHelper.CreateTempFolder();
+ var unstrippedZip = await Downloader.Download(Links.Unstripped_Corlib_ValheimPlusSource, Path.Combine(tempFolder, "unstripped.zip"));
+ tempFolder = DirectoryHelper.CreateTempFolder();
+ var unstripped_corlibFiles = Unzipper.Unzip(unstrippedZip, tempFolder)
+ .Where(x => x.Contains("unstripped", StringComparison.CurrentCultureIgnoreCase))
+ .ToArray();
+
+ var managedFolder = Path.Combine(Settings.ValheimPlusDevInstallDir, $"valheim_Data\\Managed\\");
+ var coreLibFolder = Path.Combine(Settings.ValheimPlusDevInstallDir, $"unstripped_corlib\\");
+
+ Logger.Log("\\valheim_Data\\Managed\\");
+ FileCopier.CopyFiles(tempFolder, unstripped_corlibFiles, managedFolder);
+ Logger.Log("\\unstripped_corlib");
+ FileCopier.CopyFiles(tempFolder, unstripped_corlibFiles, coreLibFolder);
+
+ Logger.Log("Done!");
+ }
+
+ public static async Task InstallBepInEx542100()
+ {
+ Logger.Log("Installing BepInEx...");
+ var tempFolder = DirectoryHelper.CreateTempFolder();
+ var bepInExZip = await Downloader.Download(Links.BepInEx21, Path.Combine(tempFolder, "bepInExPack.zip"));
+ var bepInExFiles = Unzipper.Unzip(bepInExZip);
+ File.Delete(bepInExZip);
+
+ var sourceFolder = Path.GetDirectoryName(bepInExFiles.First());
+ FileCopier.CopyFiles(sourceFolder!, bepInExFiles, Settings.ValheimPlusDevInstallDir);
+ Logger.Log("Done!");
+ }
+
+ public static void PublicizeAssembliesDirectly()
+ {
+ Logger.Log("Publicizing assemblies...");
+ var managedFolder = Path.Combine(Settings.ValheimPlusDevInstallDir, "valheim_Data\\Managed\\");
+ var files = Directory.GetFiles(managedFolder, "assembly*.dll", SearchOption.TopDirectoryOnly);
+ AssemblyPublicizer.ProcessAssemblies(files);
+ Logger.Log("Done!");
+ }
+}
diff --git a/SetupDevEnvironment/Logger.cs b/SetupDevEnvironment/Logger.cs
new file mode 100644
index 00000000..2c61be69
--- /dev/null
+++ b/SetupDevEnvironment/Logger.cs
@@ -0,0 +1,50 @@
+using System.ComponentModel;
+
+namespace SetupDevEnvironment
+{
+ internal class Logger
+ {
+ public event ProgressChangedEventHandler? OnLogMessage;
+ public static Logger? Instance { get; private set; }
+ private static StreamWriter? _logFile = null;
+
+ public static void Log(string msg, int progressPct = 0)
+ {
+ if (Instance?.OnLogMessage != null)
+ {
+ Instance.OnLogMessage(Instance, new ProgressChangedEventArgs(progressPct, msg));
+ }
+ if (_logFile != null)
+ {
+ _logFile.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + msg);
+ }
+ }
+
+ private Logger() { }
+
+ public static Logger Start()
+ {
+ if (Instance == null)
+ {
+ Instance = new Logger();
+ }
+ return Instance;
+ }
+
+ public static void ToDisk(string path)
+ {
+ Start();
+ _logFile = new StreamWriter(File.Create(path));
+ _logFile.AutoFlush = true;
+ }
+
+ internal static void Stop()
+ {
+ if (_logFile is null) return;
+
+ _logFile.Flush();
+ _logFile.Close();
+ _logFile.Dispose();
+ }
+ }
+}
diff --git a/SetupDevEnvironment/Program.cs b/SetupDevEnvironment/Program.cs
new file mode 100644
index 00000000..15186ed4
--- /dev/null
+++ b/SetupDevEnvironment/Program.cs
@@ -0,0 +1,17 @@
+namespace SetupDevEnvironment
+{
+ internal static class Program
+ {
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ // To customize application configuration such as set high DPI settings or default font,
+ // see https://aka.ms/applicationconfiguration.
+ ApplicationConfiguration.Initialize();
+ Application.Run(new SetupForm());
+ }
+ }
+}
\ No newline at end of file
diff --git a/SetupDevEnvironment/Properties/Resources.Designer.cs b/SetupDevEnvironment/Properties/Resources.Designer.cs
new file mode 100644
index 00000000..87a4bf29
--- /dev/null
+++ b/SetupDevEnvironment/Properties/Resources.Designer.cs
@@ -0,0 +1,73 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace SetupDevEnvironment.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SetupDevEnvironment.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap Valheim_Wallpaper {
+ get {
+ object obj = ResourceManager.GetObject("Valheim_Wallpaper", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+ }
+}
diff --git a/SetupDevEnvironment/Properties/Resources.resx b/SetupDevEnvironment/Properties/Resources.resx
new file mode 100644
index 00000000..9cadb021
--- /dev/null
+++ b/SetupDevEnvironment/Properties/Resources.resx
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+ ..\Resources\Valheim-Wallpaper.jpeg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/SetupDevEnvironment/Properties/Settings.Designer.cs b/SetupDevEnvironment/Properties/Settings.Designer.cs
new file mode 100644
index 00000000..0b3b4e9a
--- /dev/null
+++ b/SetupDevEnvironment/Properties/Settings.Designer.cs
@@ -0,0 +1,50 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace SetupDevEnvironment.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string ValheimInstallDir {
+ get {
+ return ((string)(this["ValheimInstallDir"]));
+ }
+ set {
+ this["ValheimInstallDir"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string ValheimPlusDevInstallDir {
+ get {
+ return ((string)(this["ValheimPlusDevInstallDir"]));
+ }
+ set {
+ this["ValheimPlusDevInstallDir"] = value;
+ }
+ }
+ }
+}
diff --git a/SetupDevEnvironment/Properties/Settings.settings b/SetupDevEnvironment/Properties/Settings.settings
new file mode 100644
index 00000000..f24a61a8
--- /dev/null
+++ b/SetupDevEnvironment/Properties/Settings.settings
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SetupDevEnvironment/Resources/DnSpyConfiguration.xml b/SetupDevEnvironment/Resources/DnSpyConfiguration.xml
new file mode 100644
index 00000000..13af61be
--- /dev/null
+++ b/SetupDevEnvironment/Resources/DnSpyConfiguration.xml
@@ -0,0 +1,209 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SetupDevEnvironment/Resources/Valheim-Wallpaper.jpeg b/SetupDevEnvironment/Resources/Valheim-Wallpaper.jpeg
new file mode 100644
index 00000000..ca69e791
Binary files /dev/null and b/SetupDevEnvironment/Resources/Valheim-Wallpaper.jpeg differ
diff --git a/SetupDevEnvironment/Resources/valheim_plus.cfg b/SetupDevEnvironment/Resources/valheim_plus.cfg
new file mode 100644
index 00000000..0d08acc3
--- /dev/null
+++ b/SetupDevEnvironment/Resources/valheim_plus.cfg
@@ -0,0 +1,1106 @@
+[ValheimPlus]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#ValheimPlus
+enabled=true
+
+; Display the Valheim Plus logo in the main menu
+mainMenuLogo=true
+
+; Display the advertisement of our server hosting partner on the server browser menu
+serverBrowserAdvertisement=true
+
+[AdvancedBuildingMode]
+
+; https://docs.unity3d.com/ScriptReference/KeyCode.html <- a list of keycodes
+; Change false to true to enable this section, if you set this to false the mode will not be accessible. https://valheim.plus/documentation/list#AdvancedBuildingMode
+enabled=false
+
+; Enter the advanced building mode with this key when building
+enterAdvancedBuildingMode=F1
+
+; Exit the advanced building mode with this key when building
+exitAdvancedBuildingMode=F3
+
+; Copy the object rotation of the currently selected object in ABM
+copyObjectRotation=Keypad7
+
+; Apply the copied object rotation to the currently selected object in ABM
+pasteObjectRotation=Keypad8
+
+; Increases the amount an object rotates and moves. Holding Shift will increase in increments of 10 instead of 1.
+increaseScrollSpeed=KeypadPlus
+
+; Decreases the amount an object rotates and moves. Holding Shift will decrease in increments of 10 instead of 1.
+decreaseScrollSpeed=KeypadMinus
+
+[AdvancedEditingMode]
+
+; https://docs.unity3d.com/ScriptReference/KeyCode.html <- a list of keycodes
+; Change false to true to enable this section, if you set this to false the mode will not be accessible. https://valheim.plus/documentation/list#AdvancedEditingMode
+enabled=false
+
+; Enter the advanced editing mode with this key
+enterAdvancedEditingMode=Keypad0
+
+; Reset the object to its original position and rotation
+resetAdvancedEditingMode=F7
+
+; Exit the advanced editing mode with this key and reset the object
+abortAndExitAdvancedEditingMode=F8
+
+; Confirm the placement of the object and place it
+confirmPlacementOfAdvancedEditingMode=KeypadEnter
+
+; Copy the object rotation of the currently selected object in AEM
+copyObjectRotation=Keypad7
+
+; Apply the copied object rotation to the currently selected object in AEM
+pasteObjectRotation=Keypad8
+
+; Increases the amount an object rotates and moves. Holding Shift will increase in increments of 10 instead of 1.
+increaseScrollSpeed=KeypadPlus
+
+; Decreases the amount an object rotates and moves. Holding Shift will decrease in increments of 10 instead of 1.
+decreaseScrollSpeed=KeypadMinus
+
+[Bed]
+
+; Change false to true to enable this section
+enabled=false
+
+; Change false to true to enable sleeping without setting bed as spawn.
+; When hovering over a bed you will be presented with a Hot-Key 'LShift+E'. This Hot-Key will allow for you to sleep on any bed without having to set a spawn-point.
+sleepWithoutSpawn=false
+
+; Change false to true to enable sleeping on only unclaimed beds without setting bed as spawn.
+; With this option enabled only beds that are not claimed by other players can be slept on without setting spawn-point using 'Shift+E'
+unclaimedBedsOnly=false
+
+[Beehive]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Beehive
+enabled=false
+
+; Configure the speed at which the bees produce honey in seconds, 1200 seconds are 24 ingame hours.
+honeyProductionSpeed=1200
+
+; Configure the maximum amount of honey in beehives.
+maximumHoneyPerBeehive=4
+
+; Instead of dropping the items, they will be placed inside the nearest nearby chests.
+autoDeposit=false
+
+; The range of the chest detection for the auto deposit feature.
+; Maximum is 50
+autoDepositRange=10
+
+; Display the minutes and seconds until the beehive produces honey on crosshair hover.
+showDuration=false
+
+[Building]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Building
+enabled=false
+
+; Remove some of the Invalid placement messages, most notably provides the ability to place objects into other objects
+noInvalidPlacementRestriction=false
+
+; Removes the "Mystical forces" building prevention and allows destruction of build objects in those areas with the hammer.
+noMysticalForcesPreventPlacementRestriction=false
+
+; Removes the weather damage from rain and water erosion.
+noWeatherDamage=false
+
+; The maximum range in meters that you can place build objects at inside the hammer build mode.
+maximumPlacementDistance=8
+
+; The radius, in meters, in which a piece must be to contribute to the comfort level.
+pieceComfortRadius=10
+
+; When destroying a building piece, setting this to true will ensure it always drops full resources.
+; We recommend to enable this if you use this section.
+alwaysDropResources=false
+
+; When destroying a building piece, setting this to true will ensure it always drops pieces that the devs have marked as "do not drop".
+; We recommend to enable this if you use this section.
+alwaysDropExcludedResources=false
+
+; Setting this to true will cause repairing with the hammer to repair in a radius instead of a single piece.
+enableAreaRepair=false
+
+; Sets the area repair radius of enableAreaRepair. A value of 7.5 would mean your repair radius is 7.5 meters.
+; Requires enableAreaRepair=true
+areaRepairRadius=7.5
+
+[Camera]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Camera
+enabled=false
+
+; The maximum zoom distance to your character in-game.
+; Default is 6
+cameraMaximumZoomDistance=6
+
+; The maximum zoom distance to your character when in a boat.
+; Default is 6
+cameraBoatMaximumZoomDistance=6
+
+; The in-game camera FOV.
+; Default is 65
+cameraFOV=65
+
+[Experience]
+
+; Change false to true to enable this section. This section contains modifiers. https://valheim.plus/documentation/list#Experience
+; Modifiers are increases and reduction in percent declared by 50, or -50. The value 50 will increase experience gained by 50%, -50 will reduce experience gained by 50%.
+enabled=false
+
+; The modifier value for the experience gained of swords.
+swords=0
+
+; The modifier value for the experience gained of knives.
+knives=0
+
+; The modifier value for the experience gained of clubs.
+clubs=0
+
+; The modifier value for the experience gained of polearms.
+polearms=0
+
+; The modifier value for the experience gained of spears.
+spears=0
+
+; The modifier value for the experience gained of blocking.
+blocking=0
+
+; The modifier value for the experience gained of axes.
+axes=0
+
+; The modifier value for the experience gained of bows.
+bows=0
+
+; The modifier value for the experience gained of fire magic.
+fireMagic=0
+
+; The modifier value for the experience gained of frost magic.
+frostMagic=0
+
+; The modifier value for the experience gained of unarmed.
+unarmed=0
+
+; The modifier value for the experience gained of mining.
+pickaxes=0
+
+; The modifier value for the experience gained of wood cutting.
+woodCutting=0
+
+; The modifier value for the experience gained of jumping.
+jump=0
+
+; The modifier value for the experience gained of sneaking.
+sneak=0
+
+; The modifier value for the experience gained of running.
+run=0
+
+; The modifier value for the experience gained of swimming.
+swim=0
+
+; The modifier value for the experience gained of riding.
+ride=0
+
+[Fermenter]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Fermenter
+enabled=false
+
+; Configure the time that the fermenter takes to produce its product, 2400 seconds are 48 ingame hours.
+fermenterDuration=2400
+
+; Configure the total amount of produced items from a fermenter.
+fermenterItemsProduced=6
+
+; Display the minutes and seconds until the fermenter is done on crosshair hover.
+showDuration=false
+
+; Instead of dropping the items, they will be placed inside the nearest nearby chests.
+autoDeposit=false
+
+; Automatically pull meads from nearby chests to be placed inside the Fermenter as soon as its empty.
+autoFuel=false
+
+; This option prevents the fermenter to pull items from warded areas if it isn't placed inside of it.
+; For convenience, we recommend this to be set to true.
+ignorePrivateAreaCheck=true
+
+; The range of the chest detection for the auto deposit and auto fuel features
+; Maximum is 50
+autoRange=10
+
+[FireSource]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#FireSource
+enabled=false
+
+; If set to true, torch-type fire sources will stay at max fuel level once filled.
+; Applies to: wood torches, iron torches, green torches, sconces and brazier.
+torches=false
+
+; If set to true, non torch-type fire sources will stay at max fuel level once filled.
+fires=false
+
+; Automatically pull wood from nearby chests to be placed inside the Fire as soon as its empty.
+autoFuel=false
+
+; This option prevents the Fire to pull items from warded areas if it isn't placed inside of it.
+; For convenience, we recommend this to be set to true.
+ignorePrivateAreaCheck=true
+
+; The range of the chest detection for the auto fuel features.
+; Maximum is 50
+autoRange=10
+
+[Food]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Food
+enabled=false
+
+; Increase or reduce the time that food lasts by %.
+; The value 50 would cause food to run out 50% slower, -50% would cause the food to run out 50% faster.
+foodDurationMultiplier=0
+
+; This option prevents food degrading over time - in other words, it retains its maximum benefit until it runs out instead of reducing its effect over time.
+disableFoodDegradation=false
+
+[Smelter]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Smelter
+enabled=false
+
+; Maximum amount of ore in a Smelter.
+maximumOre=10
+
+; Maximum amount of coal in a Smelter.
+maximumCoal=20
+
+; The total amount of coal used to produce a single smelted ingot.
+coalUsedPerProduct=2
+
+; The time it takes for the Smelter to produce a single ingot in seconds.
+productionSpeed=30
+
+; Instead of dropping the items, they will be placed inside the nearest nearby chests.
+autoDeposit=false
+
+; The Smelter will pull coal and raw materials from nearby chests to be automatically added to it when its empty.
+autoFuel=false
+
+; This option prevents the Smelter to pull items from warded areas if it isn't placed inside of it.
+; For convenience, we recommend this to be set to true.
+ignorePrivateAreaCheck=true
+
+; The range of the chest detection for the auto deposit and auto fuel features.
+; Maximum is 50
+autoRange=10
+
+[Furnace]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Furnace
+enabled=false
+
+; Maximum amount of ore in a Furnace.
+maximumOre=10
+
+; Maximum amount of coal in a Furnace.
+maximumCoal=20
+
+; The total amount of coal used to produce a single smelted ingot.
+coalUsedPerProduct=2
+
+; The time it takes for the Furnace to produce a single ingot in seconds.
+productionSpeed=30
+
+; Instead of dropping the items, they will be placed inside the nearest nearby chests.
+autoDeposit=false
+
+; The Furnace will pull coal and raw materials from nearby chests to be automatically added to it when its empty.
+autoFuel=false
+
+; This option prevents the Furnace to pull items from warded areas if it isn't placed inside of it.
+; For convenience, we recommend this to be set to true.
+ignorePrivateAreaCheck=true
+
+; The range of the chest detection for the auto deposit and auto fuel features.
+; Maximum is 50
+autoRange=10
+
+; This option allows all ores inside the Furnace.
+allowAllOres=false
+
+[Game]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Game
+enabled=false
+
+; The games damage multiplier per person nearby in difficultyScaleRange(m) radius.
+; Default is 4% monster damage increase per player in radius.
+gameDifficultyDamageScale=4
+
+; The games health multiplier per person nearby in difficultyScaleRange(m) radius.
+; Default is 40% monster health increase per player in radius.
+gameDifficultyHealthScale=40
+
+; Adds additional players to the difficulty calculation in multiplayer unrelated to the actual amount.
+; This option is disabled if its set to 0.
+extraPlayerCountNearby=0
+
+; Sets the nearby player count always to this value + extraPlayerCountNearby.
+; This option is disabled if its set to 0.
+setFixedPlayerCountTo=0
+
+; The range in meters at which other players count towards nearby players for the difficulty scale.
+difficultyScaleRange=200
+
+; If you set this to true, all portals will be disabled.
+disablePortals=false
+
+; If you set this to true the console will be force disabled in-game.
+disableConsole=false
+
+;If you set this to true, portal names will be displayed in big text in center of screen.
+bigPortalNames=false
+
+;Remove dense fog from the game.
+disableFog=false
+
+[Hotkeys]
+
+; https://docs.unity3d.com/ScriptReference/KeyCode.html <- a list of keycodes
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Hotkeys
+enabled=false
+
+; Roll forwards on hot key pressed.
+rollForwards=F9
+
+; Roll backwards on hot key pressed.
+rollBackwards=F10
+
+[Items]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Items
+enabled=false
+
+; Enables you to teleport with ores and other usually teleport restricted objects.
+noTeleportPrevention=false
+
+; Increase or reduce item weight by a modifier in percent.
+; The value -50 will reduce item weight of every object by 50%, 50 will increase the weight of every item by 50%.
+baseItemWeightReduction=0
+
+; Increase or reduce the size of all maximum item stacks by a modifier in percent.
+; The value 50 would set a usual item stack of 100 to be 150.
+; The value -50 would set a usual item stack of 100 to be 50.
+itemStackMultiplier=0
+
+; Set duration that dropped items stay on the ground before they are despawning. Game default is 3600 seconds.
+droppedItemOnGroundDurationInSeconds=3600
+
+; Items dropped always float in water.
+itemsFloatInWater=false
+
+[Hud]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#HUD
+enabled=false
+
+; Shows the required amount of items AND the amount of items in your inventory in build mode and while crafting.
+; This is enabled when the CraftFromChest section is enabled.
+showRequiredItems=false
+
+; Shows small notifications about all skill experienced gained in the top left corner.
+experienceGainedNotifications=false
+
+; Set to true to remove the red screen flash overlay when the player takes damage.
+removeDamageFlash=false
+
+; If bow is in hotbar, display current ammo & total ammo under hotbar icon - never (0), when equipped (1), or always (2).
+displayBowAmmoCounts=0
+
+[Gathering]
+
+; Change false to true to enable this section. This section contains modifiers. Modifiers are increases and reduction in percent declared by 50, or -50. https://valheim.plus/documentation/list#Gathering
+enabled=false
+
+; Modify the chance to drop resources from resource nodes affected by this category. This only works on resource nodes that do not have guaranteed drops.
+; As example by default scrap piles in dungeons have a 20% chance to drop a item, if you set this option to 200, you will then have a 60% chance to drop iron.
+dropChance=0
+
+; Each of these values increase or reduce the dropped items from destroyed objects with tools (Stones, Trees, Resource nodes, etc.) by %.
+; The value 50 will increase the dropped wood from trees from 10 to 15. The value -50 will reduce the amount of dropped wood from 10 to 5.
+wood=0
+stone=0
+fineWood=0
+coreWood=0
+elderBark=0
+ironScrap=0
+tinOre=0
+copperOre=0
+silverOre=0
+chitin=0
+
+[Pickable]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Pickable
+; Each value below (in percent) will modify the yield when "picking" items (default key E) such as berries and flowers.
+; A value of 100 will double drops, 200 will triple and so on.
+enabled=false
+
+; All berries, all mushrooms, onions and carrots
+edibles=0
+
+; Barley, Flax, Dandelion, Thistle, Carrot Seeds, Turnip Seeds, Turnip, Onion Seeds
+flowersAndIngredients=0
+
+; Bone Fragments, Flint, Stone, Wood (branches on the ground)
+materials=0
+
+; Amber, Amber Pearl, Coins, Ruby
+valuables=0
+
+; Surtling Core only
+surtlingCores=0
+
+[Durability]
+
+; Change false to true to enable this section. This section contains modifiers. https://valheim.plus/documentation/list#Durability
+; Modifiers are increases and reduction in percent declared by 50, or -50.
+enabled=false
+
+; Each of these values increase or reduce the durability of the specific item type by %.
+; The value 50 will increase the durability from 100 to 150. The value -50 will reduce the durability from 100 to 50.
+axes=0
+pickaxes=0
+hammer=0
+cultivator=0
+hoe=0
+weapons=0
+armor=0
+bows=0
+shields=0
+torch=0
+
+[Armor]
+
+; Change false to true to enable this section. This section contains modifiers. https://valheim.plus/documentation/list#Armor
+; Modifiers are increases and reduction in percent declared by 50, or -50.
+enabled=false
+
+; Each of these values increase or reduce the armor of the specific item type by %.
+; The value 50 will increase the armor from 14 to 21. The value -50 will reduce the armor from 14 to 7.
+helmets=0
+chests=0
+legs=0
+capes=0
+
+
+[Kiln]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Kiln
+enabled=false
+
+; Maximum amount of wood in a Kiln.
+maximumWood=25
+
+; Change false to true to disable Fine Wood processing.
+dontProcessFineWood=false
+
+; Change false to true to disabled Round Log processing.
+dontProcessRoundLog=false
+
+; The time it takes for the Kiln to produce a single piece of coal in seconds.
+productionSpeed=15
+
+; Instead of dropping the items, they will be placed inside the nearest nearby chests.
+autoDeposit=false
+
+; The Kiln will pull wood from nearby chests to be automatically added to it when its empty.
+; This option respects the dontProcessFineWood and dontProcessRoundLog settings.
+autoFuel=false
+
+; Stops autoFuel (looking for fuel) when there is at leasts this quantity of Coal in nearby chests
+; (ignored if set to 0)
+stopAutoFuelThreshold=0
+
+; This option prevents the Kiln to pull items from warded areas if it isn't placed inside of it.
+; For convenience, we recommend this to be set to true.
+ignorePrivateAreaCheck=true
+
+; The range of the chest detection for the auto deposit and fuel features.
+; Maximum is 50
+autoRange=10
+
+[Map]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Map
+enabled=false
+
+; With this enabled you will receive the same exploration progression as other players on the server.
+; This will also enable the option for the server to sync everyones exploration progression on connecting to the server.
+shareMapProgression=false
+
+; The radius of the map that you explore when moving.
+exploreRadius=100
+
+; Prevents you and other people on the server to turn off their map sharing option.
+preventPlayerFromTurningOffPublicPosition=false
+
+; This option automatically shares created pins with everyone playing on the server.
+shareAllPins=false
+
+; Display carts and boats on the map
+displayCartsAndBoats=false
+
+[Player]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Player
+enabled=false
+
+; The base amount of carry weight of your character.
+baseMaximumWeight=300
+
+; Increase the buff you receive to your carry weight from Megingjord's girdle.
+baseMegingjordBuff=150
+
+; Increase auto pickup range of all items.
+baseAutoPickUpRange=2
+
+; Disable all types of camera shake.
+disableCameraShake=false
+
+; The base unarmed damage multiplied by your skill level. 120 will result in a maximum of up to 12 damage when you have a skill level of 10.
+baseUnarmedDamage=70
+
+; When changed to true, you will not be permitted to place a crop within the grow radius of another crop.
+cropNotifier=false
+
+; How many seconds each comfort level contributes to the rested bonus.
+restSecondsPerComfortLevel=60
+
+; Change the death penalty in percentage, where higher will increase the death penalty and lower will reduce it.
+; This is a modifier value. 50 will increase it by 50%, -50 will reduce it by 50%.
+deathPenaltyMultiplier=0
+
+; If set to true, this option will automatically repair your equipment when you interact with the appropriate workbench.
+autoRepair=false
+
+; Boss buff duration (seconds)
+guardianBuffDuration=300
+
+; Boss buff cooldown (seconds)
+guardianBuffCooldown=1200
+
+; Disable the Guardian Buff animation
+disableGuardianBuffAnimation=false
+
+; If set to true, when equipping a one-handed weapon, the best shield from your inventory is automatically equipped.
+; (Best is determined by highest block power)
+autoEquipShield=false
+
+; When unequipping a one-handed weapon also unequip shield from inventory.
+autoUnequipShield=false
+
+; If set to true, weapon switches requested mid-attack will be carried out when the current attack is finished instead of being ignored.
+queueWeaponChanges=false
+
+; If set to true, you will always skip the intro of the game.
+skipIntro=false
+
+; If set to false, disables the "I have arrived!" message on player spawn.
+iHaveArrivedOnSpawn=true
+
+; If set to true, you will not put away / unequip your items when swimming.
+dontUnequipItemsWhenSwimming=false
+
+; If set to true, items will be re-equipped when you exit water after swimming (if they were hidden automatically)
+reequipItemsAfterSwimming=false
+
+; This value represents how much the fall damage should be scaled in +/- %. This is a modifier value.
+; The value 50 would result in 50% increased fall damage. The value -50 would result in 50% reduced fall damage.
+fallDamageScalePercent=0
+
+; Max fall damage. Game default is 100 (so with enough health, falls can't kill).
+maxFallDamage=100
+
+; If set to true, all tutorials will skip from now on. You can turn this config off and reset the tutorial (in the settings) at any time.
+skipTutorials=false
+
+; Disable the encumbered state when you carry too many items (overweight)
+disableEncumbered=false
+
+; Allow auto pickup of items when encumbered (overweight)
+autoPickUpWhenEncumbered=false
+
+[Server]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Server
+enabled=true
+
+; Modify the maximum amount of players on your Server.
+maxPlayers=10
+
+; Removes the requirement to have a server password.
+disableServerPassword=false
+
+; This settings add a version control check to make sure that people that try to join your game or the server you try to join has V+ installed
+; WE HEAVILY RECOMMEND TO NEVER DISABLE THIS!
+enforceMod=true
+
+; Changes whether the server will force it's config on clients that connect. Only affects servers.
+; WE HEAVILY RECOMMEND TO NEVER DISABLE THIS!
+serverSyncsConfig=true
+
+; If false allows you to keep your own defined hotkeys instead of synchronising the ones declared for the server.
+; Sections need to be enabled in your local configuration to load hotkeys.
+; This is a client side setting and not affected by server settings.
+serverSyncHotkeys=false
+
+
+[Stamina]
+
+; Change false to true to enable this section. This section contains modifiers. https://valheim.plus/documentation/list#Stamina
+; Modifiers are increases and reduction in percent declared by 50, or -50.
+enabled=false
+
+; Changes the amount of stamina cost of using the dodge roll by %
+dodgeStaminaUsage=0
+
+; Changes the stamina drain of being overweight by %
+encumberedStaminaDrain=0
+
+; Changes the stamina cost of jumping by %
+jumpStaminaDrain=0
+
+; Changes the stamina cost of running by %
+runStaminaDrain=0
+
+; Changes the stamina drain by sneaking by %
+sneakStaminaDrain=0
+
+; Changes the total amount of stamina recovered per second by %
+staminaRegen=0
+
+; Changes the delay until stamina regeneration sets in by %
+staminaRegenDelay=0
+
+; Changes the stamina drain of swimming by %
+swimStaminaDrain=0
+
+
+[StaminaUsage]
+
+; Change false to true to enable this section. This section contains modifiers. https://valheim.plus/documentation/list#StaminaUsage
+; Modifiers are increases and reduction in percent declared by 50, or -50.
+enabled=false
+
+; Each of these values change the respective tool in stamina usage by increases and reduction in percent declared by 50, or -50.
+axes=0
+blocking=0
+bows=0
+clubs=0
+knives=0
+pickaxes=0
+polearms=0
+spears=0
+swords=0
+unarmed=0
+hammer=0
+hoe=0
+cultivator=0
+fishing=0
+
+[StructuralIntegrity]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#StructuralIntegrity
+enabled=false
+
+; Disables the entire structural integrity system and allows for placement in free air, does not prevent building damage.
+disableStructuralIntegrity=false
+
+; Disables any damage from anything to all player built structures. Does not prevent damage from structural integrity.
+disableDamageToPlayerStructures=false
+
+; Disables any damage from anything to all player built boats.
+disableDamageToPlayerBoats=false
+
+; Disables water force damage to all player built boats.
+disableWaterDamageToPlayerBoats=false
+
+; Each of these values reduce the loss of structural integrity by distance by % less.
+; The value 100 would result in disabled structural integrity over distance, does not allow for placement in free air without disableStructuralIntegrity.
+wood=0
+stone=0
+iron=0
+hardWood=0
+
+
+[Ward]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Ward
+enabled=false
+
+; The range of wards by meters.
+wardRange=20
+
+; Set the enemy spawn radius around wards in meters
+; This value equals wardRange if its set to 0.
+wardEnemySpawnRange=0
+
+[Workbench]
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Workbench
+enabled=false
+
+; Set the workbench radius in meters.
+workbenchRange=20
+
+; Set the enemy spawn radius around workbenches in meters
+; This value equals workbenchRange if its set to 0.
+workbenchEnemySpawnRange=0
+
+; Sets the workbench attachment (e.g. anvil) radius.
+workbenchAttachmentRange=5
+
+; Disables the roof and exposure requirement to use a workbench.
+disableRoofCheck=false
+
+[Wagon]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Wagon
+enabled=false
+
+; Change the base wagon physical mass of the wagon object.
+; This is essentially the base weight of a cart.
+wagonBaseMass=20
+
+; This value changes the physical weight of wagons by +/- more/less from item weight inside.
+; The value 50 would increase the weight by 50% more. The value -100 would remove the entire extra weight.
+wagonExtraMassFromItems=0
+
+[Inventory]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Inventory
+enabled=false
+
+; Player inventory number of rows (inventory is resized up to 6 rows, higher values will add a scrollbar). default 4, min 4, max 20
+playerInventoryRows=4
+
+; Wood chest number of columns
+; (default 5, 3 min, 8 max)
+woodChestColumns=5
+
+; Wood chest number of rows (more than 4 rows will add a scrollbar).
+; (default 2, min 2, 10 max)
+woodChestRows=2
+
+; Personal chest number of columns.
+; (default 3, 3 min, 8 max)
+personalChestColumns=3
+
+; Personal chest number of rows
+; (default 2, 2 min, 20 max)
+personalChestRows=2
+
+; Iron chest number of columns.
+; (default 6, min 3, max 8)
+ironChestColumns=6
+
+; Iron chest number of rows (more than 4 rows will add a scrollbar)
+; (default 4, min 3, max 20)
+ironChestRows=4
+
+; Blackmetal chests already have 8 columns by default but now you can lower it
+; (default 8, min 3, max 8)
+blackmetalChestColumns=8
+
+; Blackmetal number of rows (more than 4 rows will add a scrollbar)
+; (default 4, min 3, max 20)
+blackmetalChestRows=4
+
+; Cart (Wagon) inventory number of columns
+; (default 8, min 6, max 8)
+cartInventoryColumns=8
+
+; Cart (Wagon) inventory number of rows (more than 4 rows will add a scrollbar)
+; (default 3, min 3, max 30)
+cartInventoryRows=3
+
+; Karve (small boat) inventory number of columns
+; (default 2, min 2, max 8)
+karveInventoryColumns=2
+
+; Karve (small boat) inventory number of rows (more than 4 rows will add a scrollbar)
+; (default 2, min 2, max 30)
+karveInventoryRows=2
+
+; Longboat (large boat) inventory number of columns
+; (default 8, min 6, max 8)
+longboatInventoryColumns=8
+
+; Longboat (large boat) inventory number of rows (more than 4 rows will add a scrollbar)
+; (default 3, min 3, max 30)
+longboatInventoryRows=3
+
+; By default tools and weapons go into inventories top to bottom and other materials bottom to top.
+; Set to true to make all items go into the inventory top to bottom.
+inventoryFillTopToBottom=false
+
+; By default items go to their original position when picking up your tombstone.
+; Set to true to make all stacks try to merge with an existing stack first.
+mergeWithExistingStacks=false
+
+[FreePlacementRotation]
+
+; Change false to true to enable this section, if you set this to false the mode will not be accessible. https://valheim.plus/documentation/list#FreePlacementRotation
+enabled=false
+
+; Rotates placement marker by 1 degree with keep ability to attach to nearly pieces.
+rotateY=LeftAlt
+rotateX=C
+rotateZ=V
+
+; Copy rotation of placement marker from target piece in front of you.
+copyRotationParallel=F
+
+; Set rotation to be perpendicular to piece in front of you.
+copyRotationPerpendicular=G
+
+[Shields]
+
+; Change false to true to enable this section, if you set this to false the mode will not be accessible. https://valheim.plus/documentation/list#Shields
+enabled=false
+
+; Increase or decrease the block value on all shields in %. -50 would be 50% less block rating, 50 would be 50% more block rating.
+blockRating=0
+
+[FirstPerson]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#FirstPerson
+enabled=false
+
+; Hotkey to enable First Person.
+hotkey=F10
+
+; Default Field Of View to use.
+defaultFOV=65.0
+
+; Hotkey to raise Field Of View.
+raiseFOVHotkey=PageUp
+
+; Hotkey to lower Field Of View.
+lowerFOVHotkey=PageDown
+
+[GridAlignment]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#GridAlignment
+; This offers a global fixed grid system to make precise placements.
+enabled=false
+
+; Key to enable grid alignment.
+align=LeftAlt
+
+; Key to toggle grid alignment.
+alignToggle=F7
+
+; Key to change the default alignment.
+changeDefaultAlignment=F6
+
+[CraftFromChest]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#CraftFromChest
+; This feature allows you to craft from nearby chests when in range.
+enabled=false
+
+; Change false to true to disable this feature when using a Cooking Station.
+disableCookingStation=false
+
+; If in a workbench area, uses it as reference point when scanning for chests.
+checkFromWorkbench=true
+
+; This option prevents crafting to pull items from warded areas if the player doesnt have access to it.
+ignorePrivateAreaCheck=false
+
+; The range of the chest detection in meters.
+range=20
+
+; The interval in seconds that the feature scans your nearby chests.
+; We recommend not going below 3 seconds.
+lookupInterval=3
+
+; Allows the system to use and see contents of carts for crafting. Might also allow use of other modded containers or vehicles not accessible otherwise.
+allowCraftingFromCarts=false
+
+; Allows the system to use and see contents of ships for crafting. Might also allow use of other modded containers or vehicles not accessible otherwise.
+allowCraftingFromShips=false
+
+[Windmill]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Windmill
+enabled=false
+
+; Maximum amount of barley in a windmill.
+maximumBarley=50
+
+; The time it takes for the windmill to produce a single ingot in seconds.
+productionSpeed=10
+
+; Ignore wind intensity so it always takes the production speed value to process one barley.
+ignoreWindIntensity=false
+
+; Instead of dropping the items, they will be placed inside the nearest nearby chests.
+autoDeposit=false
+
+; The Windmill will pull barley from nearby chests to be automatically added to it when its empty.
+autoFuel=false
+
+; This option prevents the Windmill to pull items from warded areas if it isn't placed inside of it.
+; For convenience, we recommend this to be set to true.
+ignorePrivateAreaCheck=true
+
+; The range of the chest detection for the auto deposit and auto fuel features.
+; Maximum is 50
+autoRange=10
+
+[SpinningWheel]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#SpinningWheel
+enabled=false
+
+; Maximum amount of flax in a spinning wheel.
+maximumFlax=50
+
+; The time it takes for the spinning wheel to produce linen thread.
+productionSpeed=30
+
+; Instead of dropping the items, they will be placed inside the nearest nearby chests.
+autoDeposit=false
+
+; The Spinning Wheel will pull flax from nearby chests to be automatically added to it when its empty.
+autoFuel=false
+
+; This option prevents the Spinning Wheel to pull items from warded areas if it isn't placed inside of it.
+; For convenience, we recommend this to be set to true.
+ignorePrivateAreaCheck=true
+
+; The range of the chest detection for the auto deposit and auto fuel features
+; Maximum is 50
+autoRange=10
+
+
+[PlayerProjectile]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#PlayerProjectile
+enabled=false
+
+; Value of 50 would increase the minimum charge velocity from 2 to 3.
+playerMinChargeVelocityMultiplier=0
+
+; Value of 50 would increase the maximum charge velocity (of Finwood bow) from 50 to 75.
+playerMaxChargeVelocityMultiplier=0
+
+; Value of (+)50 increase in accuracy will change the variance of arrows 20 degree to 10 degree at the point of minimum charge release.
+playerMinChargeAccuracyMultiplier=0
+
+; Value of (+)50 increase in accuracy will change the variance of arrows 1 degree to 0.5 degree at the point of maximum charge release.
+playerMaxChargeAccuracyMultiplier=0
+
+; Enabling this option will linearly scale by skill level from the base values of the weapon to the modified values (according to multipliers above).
+enableScaleWithSkillLevel=false
+
+
+[MonsterProjectile]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#MonsterProjectile
+enabled=false
+
+; Value of 10 would increase the projectile velocity from 50 to 55.
+monsterMaxChargeVelocityMultiplier=0
+
+; Value of (+)10 increase in accuracy will change the variance of projectile 1 degree to 0.9 degree at the point of projectile release.
+monsterMaxChargeAccuracyMultiplier=0
+
+
+[Tameable]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Tameable
+enabled=false
+
+; Modify what happens when a tamed creature is attacked.
+; 0 = normal, 1 = essential(deadly attacks stun instead of kill, tamed creatures can still die rarely), 2 = immortal.
+mortality=0
+
+; This will circumvent the mortality setting, so even if tamed creatures are immortal, players can still kill them with a butcher knife.
+; For this option to work you need to have mortality to set to either essential or immortal.
+ownerDamageOverride=true
+
+; How long it takes for a tamed creature to recover if mortality is set to 1(essential) and they are stunned.
+stunRecoveryTime=10
+
+; If the tamed creature is recovering from a stun, then add Stunned to the hover text on mouse over.
+stunInformation=false
+
+[GameClock]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#GameClock
+enabled=false
+
+; Change time formatting from 24hr to AM-PM.
+useAMPM=false
+
+; Change font size of time text.
+textFontSize=34
+
+; Change how red the time text is (51/255).
+textRedChannel=248
+
+; Change how green the time text is (51/255).
+textGreenChannel=105
+
+; Change how blue the time text is (51/255).
+textBlueChannel=0
+
+; Change how transparent the time text is (255 is solid with no transparency).
+textTransparencyChannel=255
+
+
+[Brightness]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Brightness
+enabled=false
+
+; Changes how bright it looks at night. A value between 5 and 10 will result in nearly double in brightness at night.
+nightBrightnessMultiplier=0
+
+[Chat]
+
+; Change false to true to enable this section. https://valheim.plus/documentation/list#Chat
+enabled = false
+
+; If the player is outside of this range in meters in comparison to the creator of the shout you will not see the message on the map or in the chat. If this is set to 0, its disabled.
+shoutDistance = 0
+
+; With this option enabled you will see the shout message in your chat window even if you are outside of shoutDistance.
+outOfRangeShoutsDisplayInChatWindow = true
+
+; If the player is outside of this range in meters in comparison to the creator of the ping on the map you will not see the ping on the map. If this is set to 0, its disabled.
+pingDistance = 0
+
+; Disable the forced upper and lower case conversions for in-game text messages of all types.
+forcedCase = true
+
+; This value determines the range in meters that you can see whisper text messages by default.
+defaultWhisperDistance = 4
+
+; This value determines the range in meters that you can see normal text messages by default.
+defaultNormalDistance = 15
+
+; This value determines the range in meters that you can see shout text messages by default.
+defaultShoutDistance = 70
diff --git a/SetupDevEnvironment/Settings.cs b/SetupDevEnvironment/Settings.cs
new file mode 100644
index 00000000..ae2fafc8
--- /dev/null
+++ b/SetupDevEnvironment/Settings.cs
@@ -0,0 +1,36 @@
+using SetupDevEnvironment.IO;
+
+namespace SetupDevEnvironment
+{
+ internal static class Settings
+ {
+ public static string ValheimInstallDir
+ {
+ get
+ {
+ return
+ string.IsNullOrEmpty(Properties.Settings.Default.ValheimInstallDir)
+ ? Links.DefaultValheimInstallFolder
+ : Properties.Settings.Default.ValheimInstallDir;
+ }
+ set
+ {
+ Properties.Settings.Default.ValheimInstallDir = value;
+ }
+ }
+ public static string ValheimPlusDevInstallDir
+ {
+ get
+ {
+ return
+ string.IsNullOrEmpty(Properties.Settings.Default.ValheimPlusDevInstallDir)
+ ? Links.DefaultValheimPlusDevInstallFolder
+ : Properties.Settings.Default.ValheimPlusDevInstallDir;
+ }
+ set
+ {
+ Properties.Settings.Default.ValheimPlusDevInstallDir = value;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SetupDevEnvironment/SetupDevEnvironment.csproj b/SetupDevEnvironment/SetupDevEnvironment.csproj
new file mode 100644
index 00000000..e9811ba8
--- /dev/null
+++ b/SetupDevEnvironment/SetupDevEnvironment.csproj
@@ -0,0 +1,54 @@
+
+
+
+ WinExe
+ net6.0-windows
+ enable
+ true
+ enable
+ app.manifest
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ True
+ Settings.settings
+
+
+
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
\ No newline at end of file
diff --git a/SetupDevEnvironment/SetupForm.Designer.cs b/SetupDevEnvironment/SetupForm.Designer.cs
new file mode 100644
index 00000000..607269f7
--- /dev/null
+++ b/SetupDevEnvironment/SetupForm.Designer.cs
@@ -0,0 +1,193 @@
+namespace SetupDevEnvironment
+{
+ partial class SetupForm
+ {
+ ///
+ /// 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()
+ {
+ this.tbValheimPlusInstallDir = new System.Windows.Forms.TextBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.btBrowseVPlusInstallDir = new System.Windows.Forms.Button();
+ this.btStartInstallation = new System.Windows.Forms.Button();
+ this.btBrowseValheimInstallDir = new System.Windows.Forms.Button();
+ this.label2 = new System.Windows.Forms.Label();
+ this.tbValheimInstallDir = new System.Windows.Forms.TextBox();
+ this.tbLog = new System.Windows.Forms.TextBox();
+ this.btEditConfig = new System.Windows.Forms.Button();
+ this.btStartDnSpy = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // tbValheimPlusInstallDir
+ //
+ this.tbValheimPlusInstallDir.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tbValheimPlusInstallDir.Enabled = false;
+ this.tbValheimPlusInstallDir.Location = new System.Drawing.Point(12, 84);
+ this.tbValheimPlusInstallDir.Name = "tbValheimPlusInstallDir";
+ this.tbValheimPlusInstallDir.PlaceholderText = "Where would you like to create the Valheim Plus folder?";
+ this.tbValheimPlusInstallDir.Size = new System.Drawing.Size(739, 23);
+ this.tbValheimPlusInstallDir.TabIndex = 0;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.BackColor = System.Drawing.Color.Transparent;
+ this.label1.Location = new System.Drawing.Point(18, 63);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(174, 15);
+ this.label1.TabIndex = 1;
+ this.label1.Text = "Valheim Plus Installation Folder:";
+ //
+ // btBrowseVPlusInstallDir
+ //
+ this.btBrowseVPlusInstallDir.Location = new System.Drawing.Point(198, 59);
+ this.btBrowseVPlusInstallDir.Name = "btBrowseVPlusInstallDir";
+ this.btBrowseVPlusInstallDir.Size = new System.Drawing.Size(75, 23);
+ this.btBrowseVPlusInstallDir.TabIndex = 2;
+ this.btBrowseVPlusInstallDir.Text = "Browse...";
+ this.btBrowseVPlusInstallDir.UseVisualStyleBackColor = true;
+ this.btBrowseVPlusInstallDir.Click += new System.EventHandler(this.btBrowseVPlusInstallDir_Click);
+ //
+ // btStartInstallation
+ //
+ this.btStartInstallation.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.btStartInstallation.Enabled = false;
+ this.btStartInstallation.Location = new System.Drawing.Point(12, 460);
+ this.btStartInstallation.Name = "btStartInstallation";
+ this.btStartInstallation.Size = new System.Drawing.Size(161, 62);
+ this.btStartInstallation.TabIndex = 3;
+ this.btStartInstallation.Text = "Setup Dev Environment";
+ this.btStartInstallation.UseVisualStyleBackColor = true;
+ this.btStartInstallation.Click += new System.EventHandler(this.btStartInstallation_Click);
+ //
+ // btBrowseValheimInstallDir
+ //
+ this.btBrowseValheimInstallDir.Location = new System.Drawing.Point(198, 5);
+ this.btBrowseValheimInstallDir.Name = "btBrowseValheimInstallDir";
+ this.btBrowseValheimInstallDir.Size = new System.Drawing.Size(75, 23);
+ this.btBrowseValheimInstallDir.TabIndex = 6;
+ this.btBrowseValheimInstallDir.Text = "Browse...";
+ this.btBrowseValheimInstallDir.UseVisualStyleBackColor = true;
+ this.btBrowseValheimInstallDir.Click += new System.EventHandler(this.btBrowseValheimInstallDir_Click);
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.BackColor = System.Drawing.Color.Transparent;
+ this.label2.Location = new System.Drawing.Point(18, 9);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(149, 15);
+ this.label2.TabIndex = 5;
+ this.label2.Text = "Valheim Installation Folder:";
+ //
+ // tbValheimInstallDir
+ //
+ this.tbValheimInstallDir.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tbValheimInstallDir.Enabled = false;
+ this.tbValheimInstallDir.Location = new System.Drawing.Point(12, 30);
+ this.tbValheimInstallDir.Name = "tbValheimInstallDir";
+ this.tbValheimInstallDir.PlaceholderText = "Where has Steam installed Valheim?";
+ this.tbValheimInstallDir.Size = new System.Drawing.Size(739, 23);
+ this.tbValheimInstallDir.TabIndex = 4;
+ //
+ // tbLog
+ //
+ this.tbLog.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tbLog.Location = new System.Drawing.Point(12, 113);
+ this.tbLog.Multiline = true;
+ this.tbLog.Name = "tbLog";
+ this.tbLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+ this.tbLog.Size = new System.Drawing.Size(739, 341);
+ this.tbLog.TabIndex = 7;
+ this.tbLog.Visible = false;
+ //
+ // btEditConfig
+ //
+ this.btEditConfig.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btEditConfig.Enabled = false;
+ this.btEditConfig.Location = new System.Drawing.Point(590, 460);
+ this.btEditConfig.Name = "btEditConfig";
+ this.btEditConfig.Size = new System.Drawing.Size(161, 62);
+ this.btEditConfig.TabIndex = 8;
+ this.btEditConfig.Text = "Edit Valheim+ config";
+ this.btEditConfig.UseVisualStyleBackColor = true;
+ this.btEditConfig.Click += new System.EventHandler(this.btEditConfig_Click);
+ //
+ // btStartDnSpy
+ //
+ this.btStartDnSpy.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btStartDnSpy.Enabled = false;
+ this.btStartDnSpy.Location = new System.Drawing.Point(423, 460);
+ this.btStartDnSpy.Name = "btStartDnSpy";
+ this.btStartDnSpy.Size = new System.Drawing.Size(161, 62);
+ this.btStartDnSpy.TabIndex = 9;
+ this.btStartDnSpy.Text = "Start DnSpy";
+ this.btStartDnSpy.UseVisualStyleBackColor = true;
+ this.btStartDnSpy.Click += new System.EventHandler(this.btStartDnSpy_Click);
+ //
+ // SetupForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackgroundImage = global::SetupDevEnvironment.Properties.Resources.Valheim_Wallpaper;
+ this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
+ this.ClientSize = new System.Drawing.Size(763, 534);
+ this.Controls.Add(this.btStartDnSpy);
+ this.Controls.Add(this.btEditConfig);
+ this.Controls.Add(this.tbLog);
+ this.Controls.Add(this.btBrowseValheimInstallDir);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.tbValheimInstallDir);
+ this.Controls.Add(this.btStartInstallation);
+ this.Controls.Add(this.btBrowseVPlusInstallDir);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.tbValheimPlusInstallDir);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.Name = "SetupForm";
+ this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
+ this.Text = "Valheim Plus Development Plus Setup";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private TextBox tbValheimPlusInstallDir;
+ private Label label1;
+ private Button btBrowseVPlusInstallDir;
+ private Button btStartInstallation;
+ private Button btBrowseValheimInstallDir;
+ private Label label2;
+ private TextBox tbValheimInstallDir;
+ private TextBox tbLog;
+ private Button btEditConfig;
+ private Button btStartDnSpy;
+ }
+}
\ No newline at end of file
diff --git a/SetupDevEnvironment/SetupForm.cs b/SetupDevEnvironment/SetupForm.cs
new file mode 100644
index 00000000..16f3ca26
--- /dev/null
+++ b/SetupDevEnvironment/SetupForm.cs
@@ -0,0 +1,170 @@
+using SetupDevEnvironment.IO;
+using System.ComponentModel;
+
+#nullable disable
+namespace SetupDevEnvironment
+{
+ public partial class SetupForm : Form
+ {
+ private string ValheimInstallPath
+ {
+ get => Settings.ValheimInstallDir;
+ set
+ {
+ Settings.ValheimInstallDir = value;
+ EnableStartButton();
+ }
+ }
+
+ private string ValheimPlusInstallPath
+ {
+ get => Settings.ValheimPlusDevInstallDir;
+ set
+ {
+ Settings.ValheimPlusDevInstallDir = value;
+ EnableDevButtons();
+ EnableStartButton();
+ }
+ }
+
+ public SetupForm()
+ {
+ InitializeComponent();
+ Logger.Start().OnLogMessage += this.OnLogMessage;
+
+ tbValheimInstallDir.Text = Settings.ValheimInstallDir;
+ tbValheimPlusInstallDir.Text = Settings.ValheimPlusDevInstallDir;
+
+ EnableStartButton();
+ EnableDevButtons();
+ }
+
+ private void EnableStartButton()
+ {
+ if (Directory.Exists(tbValheimInstallDir.Text) &&
+ Directory.Exists(tbValheimPlusInstallDir.Text) &&
+ tbValheimInstallDir.Text != tbValheimPlusInstallDir.Text)
+ {
+ btStartInstallation.Enabled = true;
+ }
+ else
+ {
+ btStartInstallation.Enabled = false;
+ }
+ }
+
+ private void EnableDevButtons()
+ {
+ if (File.Exists(Path.Combine(Settings.ValheimPlusDevInstallDir, "devsetup.log")))
+ {
+ btEditConfig.Enabled = true;
+ btStartDnSpy.Enabled = true;
+ }
+ }
+
+ private void btBrowseValheimInstallDir_Click(object sender, EventArgs e)
+ {
+ var path = GetFolder(Links.DefaultValheimInstallFolder);
+ if (path == string.Empty)
+ return;
+
+ ValheimInstallPath = path;
+ tbValheimInstallDir.Text = ValheimInstallPath;
+ tbValheimInstallDir.Invalidate();
+
+ var steamRoot = Directory.GetParent(path);
+ ValheimPlusInstallPath = Path.Combine(steamRoot.FullName, "Valheim Plus Development");
+ tbValheimPlusInstallDir.Text = ValheimPlusInstallPath;
+ tbValheimPlusInstallDir.Invalidate();
+
+ EnableStartButton();
+ }
+
+ private void btBrowseVPlusInstallDir_Click(object sender, EventArgs e)
+ {
+ var path = GetFolder(Links.DefaultValheimPlusDevInstallFolder);
+ if (path == string.Empty)
+ return;
+
+ if (path == ValheimInstallPath)
+ {
+ MessageBox.Show("Folders can't be the same. Let's try that again.");
+ return;
+ }
+
+ ValheimPlusInstallPath = path;
+ tbValheimPlusInstallDir.Text = ValheimPlusInstallPath;
+ tbValheimPlusInstallDir.Invalidate();
+
+ EnableStartButton();
+ }
+
+ private async void btStartInstallation_Click(object sender, EventArgs e)
+ {
+ btStartInstallation.Enabled = false;
+
+ SetupLogging();
+
+ var script = new InstallScript();
+ await script.Install();
+
+ EnableDevButtons();
+ EnableStartButton();
+ }
+
+ private void SetupLogging()
+ {
+ Logger.ToDisk(Path.Combine(Settings.ValheimPlusDevInstallDir, "devsetup.log"));
+
+ tbLog.Enabled = false;
+ tbLog.Visible = true;
+ }
+
+ private static string GetFolder(string initialPath)
+ {
+ var odd = new FolderBrowserDialog
+ {
+ InitialDirectory = initialPath,
+ };
+
+ var result = odd.ShowDialog();
+
+ if (result != DialogResult.OK)
+ {
+ return string.Empty;
+ }
+
+ return odd.SelectedPath;
+ }
+
+ ///
+ /// yes, old school. but it works.
+ ///
+ ///
+ ///
+ private void OnLogMessage(object sender, ProgressChangedEventArgs e)
+ {
+ if (InvokeRequired)
+ {
+ Invoke(UpdateLog, (string)e.UserState);
+ return;
+ }
+ UpdateLog((string)e.UserState);
+ }
+
+ private void UpdateLog(string text)
+ {
+ tbLog.AppendText(text + Environment.NewLine);
+ }
+
+ private void btEditConfig_Click(object sender, EventArgs e)
+ {
+ ProcessRunner.Run(Path.Combine(ValheimPlusInstallPath, "BepInEx\\config\\valheim_plus.cfg"));
+ }
+
+ private void btStartDnSpy_Click(object sender, EventArgs e)
+ {
+ ProcessRunner.Run(Path.Combine(Links.DnSpy64TargetFolder, "dnSpy.exe"));
+ }
+ }
+}
\ No newline at end of file
diff --git a/SetupDevEnvironment/SetupForm.resx b/SetupDevEnvironment/SetupForm.resx
new file mode 100644
index 00000000..f298a7be
--- /dev/null
+++ b/SetupDevEnvironment/SetupForm.resx
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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/SetupDevEnvironment/app.manifest b/SetupDevEnvironment/app.manifest
new file mode 100644
index 00000000..4fc1d1d5
--- /dev/null
+++ b/SetupDevEnvironment/app.manifest
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ValheimPlus.sln b/ValheimPlus.sln
index 99a3ffa1..547e7531 100644
--- a/ValheimPlus.sln
+++ b/ValheimPlus.sln
@@ -20,6 +20,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unix", "unix", "{7FBDF646-C
resources\unix\start_server_bepinex.sh = resources\unix\start_server_bepinex.sh
EndProjectSection
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SetupDevEnvironment", "SetupDevEnvironment\SetupDevEnvironment.csproj", "{70D1B8BE-D049-4155-8D48-9B01EF38A6AC}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -30,6 +32,10 @@ Global
{2A837100-A030-4D0C-BFFB-B38356118D9A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2A837100-A030-4D0C-BFFB-B38356118D9A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2A837100-A030-4D0C-BFFB-B38356118D9A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {70D1B8BE-D049-4155-8D48-9B01EF38A6AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {70D1B8BE-D049-4155-8D48-9B01EF38A6AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {70D1B8BE-D049-4155-8D48-9B01EF38A6AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {70D1B8BE-D049-4155-8D48-9B01EF38A6AC}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/ValheimPlus/ValheimPlus.csproj b/ValheimPlus/ValheimPlus.csproj
index deb23f64..bdba7f78 100644
--- a/ValheimPlus/ValheimPlus.csproj
+++ b/ValheimPlus/ValheimPlus.csproj
@@ -1,488 +1,490 @@
-
-
-
- Debug
- AnyCPU
- {2A837100-A030-4D0C-BFFB-B38356118D9A}
- Library
- Properties
- ValheimPlus
- ValheimPlus
- v4.5
- 512
- true
-
-
-
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
- true
- false
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
- true
- false
-
-
-
-
- ..\packages\HarmonyX.2.10.0\lib\net45\0Harmony.dll
-
-
- $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_googleanalytics_publicized.dll
-
-
- $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_guiutils_publicized.dll
-
-
- $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_lux_publicized.dll
-
-
- $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_postprocessing_publicized.dll
-
-
- $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_simplemeshcombine_publicized.dll
-
-
- $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_steamworks_publicized.dll
-
-
- $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_sunshafts_publicized.dll
-
-
- $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_utils_publicized.dll
-
-
- $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_valheim_publicized.dll
-
-
- False
- $(VALHEIM_INSTALL)\BepInEx\core\BepInEx.dll
-
-
- False
- $(VALHEIM_INSTALL)\BepInEx\core\BepInEx.Harmony.dll
-
-
- False
- $(VALHEIM_INSTALL)\BepInEx\core\BepInEx.Preloader.dll
-
-
- ..\packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll
-
-
- False
- $(VALHEIM_INSTALL)\BepInEx\core\HarmonyXInterop.dll
-
-
- ..\packages\ini-parser.2.5.2\lib\net20\INIFileParser.dll
-
-
- ..\packages\Mono.Cecil.0.11.4\lib\net40\Mono.Cecil.dll
-
-
- ..\packages\Mono.Cecil.0.11.4\lib\net40\Mono.Cecil.Mdb.dll
-
-
- ..\packages\Mono.Cecil.0.11.4\lib\net40\Mono.Cecil.Pdb.dll
-
-
- ..\packages\Mono.Cecil.0.11.4\lib\net40\Mono.Cecil.Rocks.dll
-
-
- $(VALHEIM_INSTALL)\valheim_Data\Managed\Mono.Security.dll
-
+
+
+
+ Debug
+ AnyCPU
+ {2A837100-A030-4D0C-BFFB-B38356118D9A}
+ Library
+ Properties
+ ValheimPlus
+ ValheimPlus
+ v4.5.2
+ 512
+ true
+
+
+
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ true
+ false
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+ true
+ false
+
+
- ..\packages\MonoMod.RuntimeDetour.22.5.1.1\lib\net35\MonoMod.RuntimeDetour.dll
+ ..\packages\MonoMod.RuntimeDetour.22.5.1.1\lib\net452\MonoMod.RuntimeDetour.dll
- ..\packages\MonoMod.Utils.22.5.1.1\lib\net35\MonoMod.Utils.dll
-
-
-
-
- ..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.AccessibilityModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.AIModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.AndroidJNIModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.AnimationModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.ARModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.AssetBundleModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.AudioModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.ClothModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.ClusterInputModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.ClusterRendererModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.CoreModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.CrashReportingModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.DirectorModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.DSPGraphModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.GameCenterModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.GridModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.HotReloadModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.ImageConversionModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.IMGUIModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.InputLegacyModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.InputModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.JSONSerializeModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.LocalizationModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.ParticleSystemModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.PerformanceReportingModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.Physics2DModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.PhysicsModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.ProfilerModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.ScreenCaptureModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.SharedInternalsModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.SpriteMaskModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.SpriteShapeModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.StreamingModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.SubstanceModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.SubsystemsModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.TerrainModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.TerrainPhysicsModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.TextCoreModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.TextRenderingModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.TilemapModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.TLSModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UI.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UIElementsModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UIModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UmbraModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UNETModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UnityAnalyticsModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UnityConnectModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UnityTestProtocolModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UnityWebRequestAssetBundleModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UnityWebRequestAudioModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UnityWebRequestModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UnityWebRequestTextureModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UnityWebRequestWWWModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.VehiclesModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.VFXModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.VideoModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.VRModule.dll
-
-
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.WindModule.dll
-
-
- False
- $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.XRModule.dll
-
-
- ..\packages\YamlDotNet.11.2.1\lib\net45\YamlDotNet.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- copy "$(TargetDir)ValheimPlus.dll" "$(VALHEIM_INSTALL)\BepInEx\plugins\ValheimPlus.dll"
-copy "$(TargetDir)ValheimPlus.pdb" "$(VALHEIM_INSTALL)\BepInEx\plugins\ValheimPlus.pdb"
-copy "$(TargetDir)ValheimPlus.dll.config" "$(VALHEIM_INSTALL)\BepInEx\plugins\ValheimPlus.dll.config"
-$(SolutionDir)resources\tools\pdb2mdb.exe "$(TargetPath)"
-copy "$(TargetDir)\ValheimPlus.dll.mdb" "$(VALHEIM_INSTALL)\BepInEx\plugins\ValheimPlus.dll.mdb"
-
-
-
-
- This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
-
-
-
-
-
+ ..\packages\MonoMod.Utils.22.5.1.1\lib\net452\MonoMod.Utils.dll
+
+
+
+ ..\packages\HarmonyX.2.10.0\lib\net45\0Harmony.dll
+
+
+ $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_googleanalytics_publicized.dll
+
+
+ $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_guiutils_publicized.dll
+
+
+ $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_lux_publicized.dll
+
+
+ $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_postprocessing_publicized.dll
+
+
+ $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_simplemeshcombine_publicized.dll
+
+
+ $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_steamworks_publicized.dll
+
+
+ $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_sunshafts_publicized.dll
+
+
+ $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_utils_publicized.dll
+
+
+ $(VALHEIM_INSTALL)\valheim_Data\Managed\publicized_assemblies\assembly_valheim_publicized.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\BepInEx\core\BepInEx.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\BepInEx\core\BepInEx.Harmony.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\BepInEx\core\BepInEx.Preloader.dll
+
+
+ ..\packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\BepInEx\core\HarmonyXInterop.dll
+
+
+ ..\packages\ini-parser.2.5.2\lib\net20\INIFileParser.dll
+
+
+ ..\packages\Mono.Cecil.0.11.4\lib\net40\Mono.Cecil.dll
+
+
+ ..\packages\Mono.Cecil.0.11.4\lib\net40\Mono.Cecil.Mdb.dll
+
+
+ ..\packages\Mono.Cecil.0.11.4\lib\net40\Mono.Cecil.Pdb.dll
+
+
+ ..\packages\Mono.Cecil.0.11.4\lib\net40\Mono.Cecil.Rocks.dll
+
+
+ $(VALHEIM_INSTALL)\valheim_Data\Managed\Mono.Security.dll
+
+
+
+
+ ..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.AccessibilityModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.AIModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.AndroidJNIModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.AnimationModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.ARModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.AssetBundleModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.AudioModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.ClothModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.ClusterInputModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.ClusterRendererModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.CoreModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.CrashReportingModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.DirectorModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.DSPGraphModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.GameCenterModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.GridModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.HotReloadModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.ImageConversionModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.IMGUIModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.InputLegacyModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.InputModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.JSONSerializeModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.LocalizationModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.ParticleSystemModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.PerformanceReportingModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.Physics2DModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.PhysicsModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.ProfilerModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.ScreenCaptureModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.SharedInternalsModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.SpriteMaskModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.SpriteShapeModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.StreamingModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.SubstanceModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.SubsystemsModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.TerrainModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.TerrainPhysicsModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.TextCoreModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.TextRenderingModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.TilemapModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.TLSModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UI.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UIElementsModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UIModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UmbraModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UNETModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UnityAnalyticsModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UnityConnectModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UnityTestProtocolModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UnityWebRequestAssetBundleModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UnityWebRequestAudioModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UnityWebRequestModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UnityWebRequestTextureModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.UnityWebRequestWWWModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.VehiclesModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.VFXModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.VideoModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.VRModule.dll
+
+
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.WindModule.dll
+
+
+ False
+ $(VALHEIM_INSTALL)\unstripped_corlib\UnityEngine.XRModule.dll
+
+
+ ..\packages\YamlDotNet.11.2.1\lib\net45\YamlDotNet.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ copy "$(TargetDir)ValheimPlus.dll" "$(VALHEIM_INSTALL)\BepInEx\plugins\ValheimPlus.dll"
+ copy "$(TargetDir)ValheimPlus.pdb" "$(VALHEIM_INSTALL)\BepInEx\plugins\ValheimPlus.pdb"
+ copy "$(TargetDir)ValheimPlus.dll.config" "$(VALHEIM_INSTALL)\BepInEx\plugins\ValheimPlus.dll.config"
+ $(SolutionDir)resources\tools\pdb2mdb.exe "$(TargetPath)"
+ copy "$(TargetDir)\ValheimPlus.dll.mdb" "$(VALHEIM_INSTALL)\BepInEx\plugins\ValheimPlus.dll.mdb"
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ValheimPlus/app.config b/ValheimPlus/app.config
index df013594..83ea8bfd 100644
--- a/ValheimPlus/app.config
+++ b/ValheimPlus/app.config
@@ -8,4 +8,4 @@
-
+
diff --git a/ValheimPlus/packages.config b/ValheimPlus/packages.config
index b08b1456..1414f7c8 100644
--- a/ValheimPlus/packages.config
+++ b/ValheimPlus/packages.config
@@ -3,7 +3,7 @@
-
+