using System.IO; using System.Linq; using System.Reflection; using MonoMod.Utils; namespace BepInEx { /// /// Paths used by BepInEx /// public static class Paths { public static void SetExecutablePath(string executablePath, string bepinRootPath = null) { ExecutablePath = executablePath; ProcessName = Path.GetFileNameWithoutExtension(executablePath); GameRootPath = PlatformHelper.Is(Platform.MacOS) ? Utility.ParentDirectory(executablePath, 4) : Path.GetDirectoryName(executablePath); BepInExRootPath = bepinRootPath ?? Path.Combine(GameRootPath, "BepInEx"); ConfigPath = Path.Combine(BepInExRootPath, "config"); BepInExConfigPath = Path.Combine(ConfigPath, "BepInEx.cfg"); PluginPath = Path.Combine(BepInExRootPath, "plugins"); PatcherPluginPath = Path.Combine(BepInExRootPath, "patchers"); BepInExAssemblyDirectory = Path.Combine(BepInExRootPath, "core"); BepInExAssemblyPath = Path.Combine(BepInExAssemblyDirectory, $"{Assembly.GetExecutingAssembly().GetName().Name}.dll"); CachePath = Path.Combine(BepInExRootPath, "cache"); } internal static void SetPluginPath(string pluginPath) { PluginPath = Utility.CombinePaths(BepInExRootPath, pluginPath); } public static SemVer.Version BepInExVersion { get; } = SemVer.Version.Parse(typeof(Paths).Assembly.GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false).Cast().First().InformationalVersion); /// /// The directory that the core BepInEx DLLs reside in. /// public static string BepInExAssemblyDirectory { get; private set; } /// /// The path to the core BepInEx DLL. /// public static string BepInExAssemblyPath { get; private set; } /// /// The path to the main BepInEx folder. /// public static string BepInExRootPath { get; private set; } /// /// The path of the currently executing program BepInEx is encapsulated in. /// public static string ExecutablePath { get; private set; } /// /// The directory that the currently executing process resides in. /// On OSX however, this is the parent directory of the game.app folder. /// public static string GameRootPath { get; private set; } /// /// The path to the config directory. /// public static string ConfigPath { get; private set; } /// /// The path to the global BepInEx configuration file. /// public static string BepInExConfigPath { get; private set; } /// /// The path to temporary cache files. /// public static string CachePath { get; private set; } /// /// The path to the patcher plugin folder which resides in the BepInEx folder. /// public static string PatcherPluginPath { get; private set; } /// /// The path to the plugin folder which resides in the BepInEx folder. /// /// This is ONLY guaranteed to be set correctly when Chainloader has been initialized. /// /// public static string PluginPath { get; private set; } /// /// The name of the currently executing process. /// public static string ProcessName { get; private set; } } }