diff options
-rw-r--r-- | src/StardewModdingAPI/Manifest.cs | 67 | ||||
-rw-r--r-- | src/StardewModdingAPI/Program.cs | 36 |
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; |