summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2019-10-03 12:08:22 -0400
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2019-10-03 12:08:22 -0400
commit175ebf907134e1e32992f62637a5d7e43bfc6a20 (patch)
tree181bc49154a5139efa11e09f2618d4dc47d8321e
parent15cd316ce44fb1ca43b29f6087243cc3af2f78fb (diff)
downloadSMAPI-175ebf907134e1e32992f62637a5d7e43bfc6a20.tar.gz
SMAPI-175ebf907134e1e32992f62637a5d7e43bfc6a20.tar.bz2
SMAPI-175ebf907134e1e32992f62637a5d7e43bfc6a20.zip
fix non-generic GetAPI not checking that all mods are loaded (#662)
-rw-r--r--docs/release-notes.md1
-rw-r--r--src/SMAPI/Framework/ModHelpers/ModRegistryHelper.cs24
2 files changed, 14 insertions, 11 deletions
diff --git a/docs/release-notes.md b/docs/release-notes.md
index 30a759be..9cfb70a6 100644
--- a/docs/release-notes.md
+++ b/docs/release-notes.md
@@ -112,6 +112,7 @@ For modders:
* Fixed asset propagation for NPC portraits resetting any unique portraits (e.g. Maru's hospital portrait) to the default.
* Fixed changes to `Data\NPCDispositions` not always propagated correctly to existing NPCs.
* Fixed `LoadStageChanged` event not raising correct flags in some cases when creating a new save.
+ * Fixed `GetApi` without an interface not checking if all mods are loaded.
### For SMAPI maintainers
* Added support for core translation files.
diff --git a/src/SMAPI/Framework/ModHelpers/ModRegistryHelper.cs b/src/SMAPI/Framework/ModHelpers/ModRegistryHelper.cs
index 24bed3bb..f42cb085 100644
--- a/src/SMAPI/Framework/ModHelpers/ModRegistryHelper.cs
+++ b/src/SMAPI/Framework/ModHelpers/ModRegistryHelper.cs
@@ -1,5 +1,4 @@
using System.Collections.Generic;
-using System.Linq;
using StardewModdingAPI.Framework.Reflection;
namespace StardewModdingAPI.Framework.ModHelpers
@@ -63,6 +62,14 @@ namespace StardewModdingAPI.Framework.ModHelpers
/// <summary>Get the API provided by a mod, or <c>null</c> if it has none. This signature requires using the <see cref="IModHelper.Reflection"/> API to access the API's properties and methods.</summary>
public object GetApi(string uniqueID)
{
+ // validate ready
+ if (!this.Registry.AreAllModsInitialized)
+ {
+ this.Monitor.Log("Tried to access a mod-provided API before all mods were initialized.", LogLevel.Error);
+ return null;
+ }
+
+ // get raw API
IModMetadata mod = this.Registry.Get(uniqueID);
if (mod?.Api != null && this.AccessedModApis.Add(mod.Manifest.UniqueID))
this.Monitor.Log($"Accessed mod-provided API for {mod.DisplayName}.", LogLevel.Trace);
@@ -74,12 +81,12 @@ namespace StardewModdingAPI.Framework.ModHelpers
/// <param name="uniqueID">The mod's unique ID.</param>
public TInterface GetApi<TInterface>(string uniqueID) where TInterface : class
{
- // validate
- if (!this.Registry.AreAllModsInitialized)
- {
- this.Monitor.Log("Tried to access a mod-provided API before all mods were initialized.", LogLevel.Error);
+ // get raw API
+ object api = this.GetApi(uniqueID);
+ if (api == null)
return null;
- }
+
+ // validate mapping
if (!typeof(TInterface).IsInterface)
{
this.Monitor.Log($"Tried to map a mod-provided API to class '{typeof(TInterface).FullName}'; must be a public interface.", LogLevel.Error);
@@ -91,11 +98,6 @@ namespace StardewModdingAPI.Framework.ModHelpers
return null;
}
- // get raw API
- object api = this.GetApi(uniqueID);
- if (api == null)
- return null;
-
// get API of type
if (api is TInterface castApi)
return castApi;