using System; using System.IO; using System.Reflection; namespace IPA { public class PatchContext { /// /// Gets the filename of the executable. /// public string Executable { get; private set; } public string DataPathSrc { get; private set; } public string LibsPathSrc { get; private set; } public string PluginsFolder { get; private set; } public string ProjectName { get; private set; } public string DataPathDst { get; private set; } public string LibsPathDst { get; private set; } public string ManagedPath { get; private set; } public string EngineFile { get; private set; } public string AssemblyFile { get; private set; } public string ProjectRoot { get; private set; } public string IPARoot { get; private set; } public string ShortcutPath { get; private set; } public string IPA { get; private set; } public string BackupPath { get; private set; } // This is only created by us; and all are assigned #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. private PatchContext() { } #pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. public static PatchContext Create(string exe) { var context = new PatchContext { Executable = exe }; context.ProjectRoot = new FileInfo(context.Executable).Directory?.FullName ?? throw new Exception(); context.IPARoot = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly()!.Location) ?? throw new InvalidOperationException(), "IPA"); context.IPA = Assembly.GetExecutingAssembly().Location; context.DataPathSrc = Path.Combine(context.IPARoot, "Data"); context.LibsPathSrc = Path.Combine(context.IPARoot, "Libs"); context.PluginsFolder = Path.Combine(context.ProjectRoot ?? throw new InvalidOperationException(), "Plugins"); context.ProjectName = Path.GetFileNameWithoutExtension(context.Executable); context.DataPathDst = Path.Combine(context.ProjectRoot, context.ProjectName + "_Data"); context.LibsPathDst = Path.Combine(context.ProjectRoot, "Libs"); context.ManagedPath = Path.Combine(context.DataPathDst, "Managed"); context.EngineFile = Path.Combine(context.ManagedPath, "UnityEngine.CoreModule.dll"); context.AssemblyFile = Path.Combine(context.ManagedPath, "Assembly-CSharp.dll"); context.BackupPath = Path.Combine(context.IPARoot, "Backups", context.ProjectName); string shortcutName = $"{context.ProjectName} (Patch & Launch)"; context.ShortcutPath = Path.Combine(context.ProjectRoot, shortcutName) + ".lnk"; _ = Directory.CreateDirectory(context.BackupPath); return context; } } }