summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/StardewModdingAPI/Manifest.cs67
-rw-r--r--src/StardewModdingAPI/Program.cs36
2 files changed, 27 insertions, 76 deletions
diff --git a/src/StardewModdingAPI/Manifest.cs b/src/StardewModdingAPI/Manifest.cs
index dc8a2f7b..89ce7904 100644
--- a/src/StardewModdingAPI/Manifest.cs
+++ b/src/StardewModdingAPI/Manifest.cs
@@ -1,22 +1,19 @@
using System;
-using System.IO;
-using System.Linq;
using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
namespace StardewModdingAPI
{
/// <summary>A manifest which describes a mod for SMAPI.</summary>
- public class Manifest : Config
+ public class Manifest
{
/*********
** Accessors
*********/
/// <summary>The mod name.</summary>
- public virtual string Name { get; set; }
+ public virtual string Name { get; set; } = "";
/// <summary>The mod author's name.</summary>
- public virtual string Author { get; set; }
+ public virtual string Author { get; set; } = "";
/// <summary>Obsolete.</summary>
[Obsolete("Use 'Author'.")]
@@ -27,68 +24,18 @@ namespace StardewModdingAPI
}
/// <summary>The mod version.</summary>
- public virtual Version Version { get; set; }
+ public virtual Version Version { get; set; } = new Version(0, 0, 0, "");
/// <summary>A brief description of the mod.</summary>
- public virtual string Description { get; set; }
+ public virtual string Description { get; set; } = "";
/// <summary>The unique mod ID.</summary>
- public virtual string UniqueID { get; set; }
+ public virtual string UniqueID { get; set; } = Guid.NewGuid().ToString();
/// <summary>Whether the mod uses per-save config files.</summary>
public virtual bool PerSaveConfigs { get; set; }
/// <summary>The name of the DLL in the directory that has the <see cref="Mod.Entry"/> method.</summary>
- public virtual string EntryDll { get; set; }
-
-
- /*********
- ** Public methods
- *********/
- /// <summary>Get the default config values.</summary>
- public override T GenerateDefaultConfig<T>()
- {
- this.Name = "";
- this.Author = "";
- this.Version = new Version(0, 0, 0, "");
- this.Description = "";
- this.UniqueID = Guid.NewGuid().ToString();
- this.PerSaveConfigs = false;
- this.EntryDll = "";
- return this as T;
- }
-
- /// <summary>Load the config from the JSON file, saving it to disk if needed.</summary>
- /// <typeparam name="T">The config class type.</typeparam>
- public override T LoadConfig<T>()
- {
- if (File.Exists(this.ConfigLocation))
- {
- try
- {
- JsonConvert.DeserializeObject<Manifest>(File.ReadAllText(this.ConfigLocation));
- }
- catch
- {
- //Invalid json blob. Try to remove version?
- try
- {
- JObject j = JObject.Parse(File.ReadAllText(this.ConfigLocation));
- if (!j.GetValue("Version").Contains("{"))
- {
- Log.AsyncC("INVALID JSON VERSION. TRYING TO REMOVE SO A NEW CAN BE AUTO-GENERATED");
- j.Remove("Version");
- File.WriteAllText(this.ConfigLocation, j.ToString());
- }
- }
- catch (Exception)
- {
- // ignored
- }
- }
- }
-
- return base.LoadConfig<T>();
- }
+ public virtual string EntryDll { get; set; } = "";
}
}
diff --git a/src/StardewModdingAPI/Program.cs b/src/StardewModdingAPI/Program.cs
index dfd8f703..c0129036 100644
--- a/src/StardewModdingAPI/Program.cs
+++ b/src/StardewModdingAPI/Program.cs
@@ -240,7 +240,7 @@ namespace StardewModdingAPI
{
foreach (string manifestPath in Directory.GetFiles(directory, "manifest.json"))
{
- // error format
+ ModHelper helper = new ModHelper(directory);
string errorPrefix = $"Couldn't load mod for manifest '{manifestPath}'";
// read manifest
@@ -256,7 +256,12 @@ namespace StardewModdingAPI
}
// deserialise manifest
- manifest = manifest.InitializeConfig(manifestPath);
+ manifest = helper.ReadJsonFile<Manifest>("manifest.json");
+ if (manifest == null)
+ {
+ Log.Error($"{errorPrefix}: the manifest file does not exist.");
+ continue;
+ }
if (string.IsNullOrEmpty(manifest.EntryDll))
{
Log.Error($"{errorPrefix}: manifest doesn't specify an entry DLL.");
@@ -270,12 +275,11 @@ namespace StardewModdingAPI
}
// create per-save directory
- string targDir = Path.GetDirectoryName(manifestPath);
- string psDir = Path.Combine(targDir, "psconfigs");
- try
+ if (manifest.PerSaveConfigs)
{
- if (manifest.PerSaveConfigs)
+ try
{
+ string psDir = Path.Combine(directory, "psconfigs");
Directory.CreateDirectory(psDir);
if (!Directory.Exists(psDir))
{
@@ -283,18 +287,18 @@ namespace StardewModdingAPI
continue;
}
}
- }
- catch (Exception ex)
- {
- Log.Error($"{errorPrefix}: couldm't create the per-save configuration directory ('psconfigs') requested by this mod.\n{ex}");
- continue;
+ catch (Exception ex)
+ {
+ Log.Error($"{errorPrefix}: couldm't create the per-save configuration directory ('psconfigs') requested by this mod.\n{ex}");
+ continue;
+ }
}
// load DLL & hook up mod
string targDll = string.Empty;
try
{
- targDll = Path.Combine(targDir, manifest.EntryDll);
+ targDll = Path.Combine(directory, manifest.EntryDll);
if (!File.Exists(targDll))
{
Log.Error($"{errorPrefix}: target DLL '{targDll}' does not exist.");
@@ -304,12 +308,12 @@ namespace StardewModdingAPI
Assembly modAssembly = Assembly.UnsafeLoadFrom(targDll);
if (modAssembly.DefinedTypes.Count(x => x.BaseType == typeof(Mod)) > 0)
{
- TypeInfo tar = modAssembly.DefinedTypes.First(x => x.BaseType == typeof(Mod));
- Mod modEntry = (Mod)modAssembly.CreateInstance(tar.ToString());
+ TypeInfo modEntryType = modAssembly.DefinedTypes.First(x => x.BaseType == typeof(Mod));
+ Mod modEntry = (Mod)modAssembly.CreateInstance(modEntryType.ToString());
if (modEntry != null)
{
- modEntry.Helper = new ModHelper(targDir);
- modEntry.PathOnDisk = targDir;
+ modEntry.Helper = helper;
+ modEntry.PathOnDisk = directory;
modEntry.Manifest = manifest;
Log.Info($"Loaded mod: {modEntry.Manifest.Name} by {modEntry.Manifest.Author}, v{modEntry.Manifest.Version} | {modEntry.Manifest.Description}\n@ {targDll}");
Program.ModsLoaded += 1;