remove support for mods in AppData directory (#156)

This commit is contained in:
Jesse Plamondon-Willard 2016-10-30 22:31:21 -04:00
parent 39e2e46a21
commit d0f912a3e9
1 changed files with 79 additions and 105 deletions

View File

@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
@ -23,7 +22,8 @@ namespace StardewModdingAPI
? Path.Combine(Constants.ExecutionPath, "StardewValley.exe") // Linux or Mac
: Path.Combine(Constants.ExecutionPath, "Stardew Valley.exe"); // Windows
private static List<string> _modPaths;
/// <summary>The full path to the folder containing mods.</summary>
private static readonly string ModPath = Path.Combine(Constants.ExecutionPath, "Mods");
public static SGame gamePtr;
public static bool ready;
@ -56,7 +56,7 @@ namespace StardewModdingAPI
Log.AsyncY("SDV Version: " + Game1.version);
Log.AsyncY("SMAPI Version: " + Constants.Version.VersionString);
ConfigureUI();
ConfigurePaths();
CreateDirectories();
StartGame();
}
catch (Exception e)
@ -82,31 +82,14 @@ namespace StardewModdingAPI
#endif
}
/// <summary>
/// Setup the required paths and logging
/// </summary>
private static void ConfigurePaths()
/// <summary>Create and verify the SMAPI directories.</summary>
private static void CreateDirectories()
{
Log.AsyncY("Validating api paths...");
_modPaths = new List<string> {Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "StardewValley", "Mods"), Path.Combine(Constants.ExecutionPath, "Mods")};
//_modContentPaths = new List<string>();
//TODO: Have an app.config and put the paths inside it so users can define locations to load mods from
//Mods need to make their own content paths, since we're doing a different, manifest-driven, approach.
//_modContentPaths.Add(Path.Combine(Constants.ExecutionPath, "Mods", "Content"));
//_modContentPaths.Add(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "StardewValley", "Mods", "Content"));
//Checks that all defined modpaths exist as directories
_modPaths.ForEach(VerifyPath);
//_modContentPaths.ForEach(path => VerifyPath(path));
Log.AsyncY("Validating file paths...");
VerifyPath(ModPath);
VerifyPath(Constants.LogDir);
if (!File.Exists(GameExecutablePath))
{
throw new FileNotFoundException($"Could not found: {GameExecutablePath}");
}
throw new FileNotFoundException($"Could not find executable: {GameExecutablePath}");
}
/// <summary>
@ -211,18 +194,14 @@ namespace StardewModdingAPI
}
}
/// <summary>
/// Create the given directory path if it does not exist
/// </summary>
/// <param name="path">Desired directory path</param>
/// <summary>Create a directory path if it doesn't exist.</summary>
/// <param name="path">The directory path.</param>
private static void VerifyPath(string path)
{
try
{
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
}
catch (Exception ex)
{
@ -235,101 +214,96 @@ namespace StardewModdingAPI
public static void LoadMods()
{
Log.AsyncY("LOADING MODS");
foreach (var ModPath in _modPaths)
foreach (string directory in Directory.GetDirectories(ModPath))
{
foreach (var d in Directory.GetDirectories(ModPath))
foreach (string manifestFile in Directory.GetFiles(directory, "manifest.json"))
{
foreach (var s in Directory.GetFiles(d, "manifest.json"))
if (manifestFile.Contains("StardewInjector"))
continue;
Log.AsyncG("Found Manifest: " + manifestFile);
var manifest = new Manifest();
try
{
if (s.Contains("StardewInjector"))
continue;
Log.AsyncG("Found Manifest: " + s);
var manifest = new Manifest();
try
string t = File.ReadAllText(manifestFile);
if (string.IsNullOrEmpty(t))
{
var t = File.ReadAllText(s);
if (string.IsNullOrEmpty(t))
Log.AsyncR($"Failed to read mod manifest '{manifestFile}'. Manifest is empty!");
continue;
}
manifest = manifest.InitializeConfig(manifestFile);
if (string.IsNullOrEmpty(manifest.EntryDll))
{
Log.AsyncR($"Failed to read mod manifest '{manifestFile}'. EntryDll is empty!");
continue;
}
}
catch (Exception ex)
{
Log.AsyncR($"Failed to read mod manifest '{manifestFile}'. Exception details:\n" + ex);
continue;
}
string targDir = Path.GetDirectoryName(manifestFile);
string psDir = Path.Combine(targDir, "psconfigs");
Log.AsyncY($"Created psconfigs directory @{psDir}");
try
{
if (manifest.PerSaveConfigs)
{
if (!Directory.Exists(psDir))
{
Log.AsyncR($"Failed to read mod manifest '{s}'. Manifest is empty!");
continue;
Directory.CreateDirectory(psDir);
Log.AsyncY($"Created psconfigs directory @{psDir}");
}
manifest = manifest.InitializeConfig(s);
if (string.IsNullOrEmpty(manifest.EntryDll))
if (!Directory.Exists(psDir))
{
Log.AsyncR($"Failed to read mod manifest '{s}'. EntryDll is empty!");
Log.AsyncR($"Failed to create psconfigs directory '{psDir}'. No exception occured.");
continue;
}
}
catch (Exception ex)
}
catch (Exception ex)
{
Log.AsyncR($"Failed to create psconfigs directory '{targDir}'. Exception details:\n" + ex);
continue;
}
string targDll = string.Empty;
try
{
targDll = Path.Combine(targDir, manifest.EntryDll);
if (!File.Exists(targDll))
{
Log.AsyncR($"Failed to read mod manifest '{s}'. Exception details:\n" + ex);
Log.AsyncR($"Failed to load mod '{manifest.EntryDll}'. File {targDll} does not exist!");
continue;
}
var targDir = Path.GetDirectoryName(s);
var psDir = Path.Combine(targDir, "psconfigs");
Log.AsyncY($"Created psconfigs directory @{psDir}");
try
{
if (manifest.PerSaveConfigs)
{
if (!Directory.Exists(psDir))
{
Directory.CreateDirectory(psDir);
Log.AsyncY($"Created psconfigs directory @{psDir}");
}
if (!Directory.Exists(psDir))
{
Log.AsyncR($"Failed to create psconfigs directory '{psDir}'. No exception occured.");
continue;
}
}
}
catch (Exception ex)
Assembly modAssembly = Assembly.UnsafeLoadFrom(targDll);
if (modAssembly.DefinedTypes.Count(x => x.BaseType == typeof(Mod)) > 0)
{
Log.AsyncR($"Failed to create psconfigs directory '{targDir}'. Exception details:\n" + ex);
continue;
}
var targDll = string.Empty;
try
{
targDll = Path.Combine(targDir, manifest.EntryDll);
if (!File.Exists(targDll))
Log.AsyncY("Loading Mod DLL...");
TypeInfo tar = modAssembly.DefinedTypes.First(x => x.BaseType == typeof(Mod));
Mod modEntry = (Mod)modAssembly.CreateInstance(tar.ToString());
if (modEntry != null)
{
Log.AsyncR($"Failed to load mod '{manifest.EntryDll}'. File {targDll} does not exist!");
continue;
}
var mod = Assembly.UnsafeLoadFrom(targDll);
if (mod.DefinedTypes.Count(x => x.BaseType == typeof(Mod)) > 0)
{
Log.AsyncY("Loading Mod DLL...");
var tar = mod.DefinedTypes.First(x => x.BaseType == typeof(Mod));
var m = (Mod) mod.CreateInstance(tar.ToString());
if (m != null)
{
m.PathOnDisk = targDir;
m.Manifest = manifest;
Log.AsyncG($"LOADED MOD: {m.Manifest.Name} by {m.Manifest.Authour} - Version {m.Manifest.Version} | Description: {m.Manifest.Description} (@ {targDll})");
Constants.ModsLoaded += 1;
m.Entry();
}
}
else
{
Log.AsyncR("Invalid Mod DLL");
modEntry.PathOnDisk = targDir;
modEntry.Manifest = manifest;
Log.AsyncG($"LOADED MOD: {modEntry.Manifest.Name} by {modEntry.Manifest.Authour} - Version {modEntry.Manifest.Version} | Description: {modEntry.Manifest.Description} (@ {targDll})");
Constants.ModsLoaded += 1;
modEntry.Entry();
}
}
catch (Exception ex)
{
Log.AsyncR($"Failed to load mod '{targDll}'. Exception details:\n" + ex);
}
else
Log.AsyncR("Invalid Mod DLL");
}
catch (Exception ex)
{
Log.AsyncR($"Failed to load mod '{targDll}'. Exception details:\n" + ex);
}
}
}
Log.AsyncG($"LOADED {Constants.ModsLoaded} MODS");
Console.Title = Constants.ConsoleTitle;
}
@ -346,7 +320,7 @@ namespace StardewModdingAPI
{
Log.AsyncY("Initializing Debug Assets...");
DebugPixel = new Texture2D(Game1.graphics.GraphicsDevice, 1, 1);
DebugPixel.SetData(new[] {Color.White});
DebugPixel.SetData(new[] { Color.White });
}
private static void Events_KeyPressed(object o, EventArgsKeyPressed e)