Handle Unhollowed modules path through IExplorerLoader. Allow Standalone release to specify manually.

This commit is contained in:
Sinai 2021-08-19 16:20:25 +10:00
parent a2f22051f0
commit 506e75c5fe
5 changed files with 38 additions and 20 deletions

View File

@ -481,29 +481,21 @@ namespace UnityExplorer
#region Force-loading game modules #region Force-loading game modules
internal static string UnhollowedFolderPath => Path.GetFullPath(
#if ML
Path.Combine("MelonLoader", "Managed")
#elif BIE
Path.Combine(BepInEx.Paths.BepInExRootPath, "unhollowed")
#else
Path.Combine(ExplorerCore.Loader.ExplorerFolder, "Modules")
#endif
);
// Helper for IL2CPP to try to make sure the Unhollowed game assemblies are actually loaded. // Helper for IL2CPP to try to make sure the Unhollowed game assemblies are actually loaded.
// Force loading all il2cpp modules // Force loading all il2cpp modules
internal void TryLoadGameModules() internal void TryLoadGameModules()
{ {
if (Directory.Exists(UnhollowedFolderPath)) var dir = ExplorerCore.Loader.UnhollowedModulesFolder;
if (Directory.Exists(dir))
{ {
foreach (var filePath in Directory.GetFiles(UnhollowedFolderPath, "*.dll")) foreach (var filePath in Directory.GetFiles(dir, "*.dll"))
DoLoadModule(filePath); DoLoadModule(filePath);
} }
else else
ExplorerCore.LogWarning($"Expected Unhollowed folder path does not exist: '{UnhollowedFolderPath}'"); ExplorerCore.LogWarning($"Expected Unhollowed folder path does not exist: '{dir}'. " +
$"If you are using the standalone release, you can specify the Unhollowed modules path when you call CreateInstance().");
} }
internal bool DoLoadModule(string fullPath) internal bool DoLoadModule(string fullPath)
@ -514,7 +506,6 @@ namespace UnityExplorer
try try
{ {
Assembly.LoadFile(fullPath); Assembly.LoadFile(fullPath);
//Assembly.Load(File.ReadAllBytes(fullPath));
return true; return true;
} }
catch //(Exception e) catch //(Exception e)

View File

@ -39,6 +39,8 @@ namespace UnityExplorer
=> Log; => Log;
#endif #endif
public string UnhollowedModulesFolder => Path.Combine(Paths.BepInExRootPath, "unhollowed");
public ConfigHandler ConfigHandler => _configHandler; public ConfigHandler ConfigHandler => _configHandler;
private BepInExConfigHandler _configHandler; private BepInExConfigHandler _configHandler;

View File

@ -9,6 +9,7 @@ namespace UnityExplorer
public interface IExplorerLoader public interface IExplorerLoader
{ {
string ExplorerFolder { get; } string ExplorerFolder { get; }
string UnhollowedModulesFolder { get; }
ConfigHandler ConfigHandler { get; } ConfigHandler ConfigHandler { get; }

View File

@ -24,6 +24,10 @@ namespace UnityExplorer
public string ExplorerFolder => Path.Combine("Mods", ExplorerCore.NAME); public string ExplorerFolder => Path.Combine("Mods", ExplorerCore.NAME);
public string UnhollowedModulesFolder => Path.Combine(
Path.GetDirectoryName(MelonHandler.ModsDirectory),
Path.Combine("MelonLoader", "Managed"));
public ConfigHandler ConfigHandler => _configHandler; public ConfigHandler ConfigHandler => _configHandler;
public MelonLoaderConfigHandler _configHandler; public MelonLoaderConfigHandler _configHandler;

View File

@ -18,26 +18,43 @@ namespace UnityExplorer
public class ExplorerStandalone : IExplorerLoader public class ExplorerStandalone : IExplorerLoader
{ {
/// <summary> /// <summary>
/// Call this to initialize UnityExplorer without adding a log listener. /// Call this to initialize UnityExplorer without adding a log listener or Unhollowed modules path.
/// The default Unhollowed path "UnityExplorer\Modules\" will be used.
/// </summary> /// </summary>
/// <returns>The new (or active, if one exists) instance of ExplorerStandalone.</returns> /// <returns>The new (or active, if one exists) instance of ExplorerStandalone.</returns>
public static ExplorerStandalone CreateInstance() => CreateInstance(null); public static ExplorerStandalone CreateInstance() => CreateInstance(null, null);
/// <summary> /// <summary>
/// Call this to initialize UnityExplorer and add a listener for UnityExplorer's log messages. /// Call this to initialize UnityExplorer and add a listener for UnityExplorer's log messages, without specifying an Unhollowed modules path.
/// The default Unhollowed path "UnityExplorer\Modules\" will be used.
/// </summary> /// </summary>
/// <param name="logListener">Your log listener to handle UnityExplorer logs.</param> /// <param name="logListener">Your log listener to handle UnityExplorer logs.</param>
/// <returns>The new (or active, if one exists) instance of ExplorerStandalone.</returns> /// <returns>The new (or active, if one exists) instance of ExplorerStandalone.</returns>
public static ExplorerStandalone CreateInstance(Action<string, LogType> logListener) public static ExplorerStandalone CreateInstance(Action<string, LogType> logListener) => CreateInstance(logListener, null);
/// <summary>
/// Call this to initialize UnityExplorer with the provided log listener and Unhollowed modules path.
/// </summary>
/// <param name="logListener">Your log listener to handle UnityExplorer logs.</param>
/// <param name="unhollowedModulesPath">The path of the Unhollowed modules, either relative or absolute.</param>
/// <returns>The new (or active, if one exists) instance of ExplorerStandalone.</returns>
public static ExplorerStandalone CreateInstance(Action<string, LogType> logListener, string unhollowedModulesPath)
{ {
if (Instance != null) if (Instance != null)
return Instance; return Instance;
var instance = new ExplorerStandalone();
instance.Init();
instance.CheckExplorerFolder();
if (logListener != null) if (logListener != null)
OnLog += logListener; OnLog += logListener;
var instance = new ExplorerStandalone(); if (string.IsNullOrEmpty(unhollowedModulesPath) || !Directory.Exists(unhollowedModulesPath))
instance.Init(); instance._unhollowedPath = Path.Combine(instance.ExplorerFolder, "Modules");
else
instance._unhollowedPath = unhollowedModulesPath;
return instance; return instance;
} }
@ -48,6 +65,9 @@ namespace UnityExplorer
/// </summary> /// </summary>
public static event Action<string, LogType> OnLog; public static event Action<string, LogType> OnLog;
public string UnhollowedModulesFolder => _unhollowedPath;
private string _unhollowedPath;
public ConfigHandler ConfigHandler => _configHandler; public ConfigHandler ConfigHandler => _configHandler;
private StandaloneConfigHandler _configHandler; private StandaloneConfigHandler _configHandler;