From 175ebf907134e1e32992f62637a5d7e43bfc6a20 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Thu, 3 Oct 2019 12:08:22 -0400 Subject: fix non-generic GetAPI not checking that all mods are loaded (#662) --- docs/release-notes.md | 1 + .../Framework/ModHelpers/ModRegistryHelper.cs | 24 ++++++++++++---------- 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 /// Get the API provided by a mod, or null if it has none. This signature requires using the API to access the API's properties and methods. 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 /// The mod's unique ID. public TInterface GetApi(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; -- cgit