rename content event for consistency, simplify usage (#173)
This commit is contained in:
parent
e3522edddd
commit
363f5aeef2
|
@ -28,7 +28,7 @@ namespace StardewModdingAPI.Events
|
|||
public static event EventHandler<EventArgsValueChanged<string>> AfterLocaleChanged;
|
||||
|
||||
/// <summary>Raised when an XNB file is being read into the cache. Mods can change the data here before it's cached.</summary>
|
||||
public static event EventHandler<IContentEventHelper> AssetLoading;
|
||||
public static event EventHandler<IContentEventHelper> AfterAssetLoaded;
|
||||
|
||||
|
||||
/*********
|
||||
|
@ -52,13 +52,28 @@ namespace StardewModdingAPI.Events
|
|||
monitor.SafelyRaiseGenericEvent($"{nameof(ContentEvents)}.{nameof(ContentEvents.AfterLocaleChanged)}", ContentEvents.AfterLocaleChanged?.GetInvocationList(), null, new EventArgsValueChanged<string>(oldLocale, newLocale));
|
||||
}
|
||||
|
||||
/// <summary>Raise an <see cref="AssetLoading"/> event.</summary>
|
||||
/// <summary>Raise an <see cref="AfterAssetLoaded"/> event.</summary>
|
||||
/// <param name="monitor">Encapsulates monitoring and logging.</param>
|
||||
/// <param name="contentHelper">Encapsulates access and changes to content being read from a data file.</param>
|
||||
internal static void InvokeAssetLoading(IMonitor monitor, IContentEventHelper contentHelper)
|
||||
internal static void InvokeAfterAssetLoaded(IMonitor monitor, IContentEventHelper contentHelper)
|
||||
{
|
||||
// raise warning about experimental API
|
||||
foreach (Delegate handler in ContentEvents.AssetLoading.GetInvocationList())
|
||||
if (ContentEvents.AfterAssetLoaded != null)
|
||||
{
|
||||
Delegate[] handlers = ContentEvents.AfterAssetLoaded.GetInvocationList();
|
||||
ContentEvents.RaiseDeprecationWarning(handlers);
|
||||
monitor.SafelyRaiseGenericEvent($"{nameof(ContentEvents)}.{nameof(ContentEvents.AfterAssetLoaded)}", handlers, null, contentHelper);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*********
|
||||
** Private methods
|
||||
*********/
|
||||
/// <summary>Raise a 'experimental API' warning for each mod using the content API.</summary>
|
||||
/// <param name="handlers">The event handlers.</param>
|
||||
private static void RaiseDeprecationWarning(Delegate[] handlers)
|
||||
{
|
||||
foreach (Delegate handler in handlers)
|
||||
{
|
||||
string modName = ContentEvents.ModRegistry.GetModFrom(handler) ?? "An unknown mod";
|
||||
if (!ContentEvents.WarnedMods.Contains(modName))
|
||||
|
@ -67,15 +82,6 @@ namespace StardewModdingAPI.Events
|
|||
ContentEvents.Monitor.Log($"{modName} used the undocumented and experimental content API, which may change or be removed without warning.", LogLevel.Warn);
|
||||
}
|
||||
}
|
||||
|
||||
// raise event
|
||||
monitor.SafelyRaiseGenericEvent($"{nameof(ContentEvents)}.{nameof(ContentEvents.AssetLoading)}", ContentEvents.AssetLoading?.GetInvocationList(), null, contentHelper);
|
||||
}
|
||||
|
||||
/// <summary>Get whether there are any <see cref="AssetLoading"/> listeners.</summary>
|
||||
internal static bool HasAssetLoadingListeners()
|
||||
{
|
||||
return ContentEvents.AssetLoading != null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -80,18 +80,20 @@ namespace StardewModdingAPI.Framework
|
|||
/// <param name="assetName">The asset path relative to the loader root directory, not including the <c>.xnb</c> extension.</param>
|
||||
public override T Load<T>(string assetName)
|
||||
{
|
||||
// normalise asset name so can override the cache value later
|
||||
// get normalised metadata
|
||||
assetName = this.NormaliseAssetName(assetName);
|
||||
string cacheLocale = this.GetCacheLocale(assetName);
|
||||
|
||||
// skip if no event handlers or already loaded
|
||||
if (!ContentEvents.HasAssetLoadingListeners() || this.Cache.ContainsKey(assetName))
|
||||
// skip if already loaded
|
||||
if (this.IsLoaded(assetName))
|
||||
return base.Load<T>(assetName);
|
||||
|
||||
// intercept load
|
||||
// load data
|
||||
T data = base.Load<T>(assetName);
|
||||
string cacheLocale = this.GetCacheLocale(assetName, this.Cache);
|
||||
|
||||
// let mods intercept content
|
||||
IContentEventHelper helper = new ContentEventHelper(cacheLocale, assetName, data, this.NormaliseAssetName);
|
||||
ContentEvents.InvokeAssetLoading(this.Monitor, helper);
|
||||
ContentEvents.InvokeAfterAssetLoaded(this.Monitor, helper);
|
||||
this.Cache[assetName] = helper.Data;
|
||||
return (T)helper.Data;
|
||||
}
|
||||
|
@ -112,13 +114,19 @@ namespace StardewModdingAPI.Framework
|
|||
return this.NormaliseAssetNameForPlatform(assetName);
|
||||
}
|
||||
|
||||
/// <summary>Get whether an asset has already been loaded.</summary>
|
||||
/// <param name="normalisedAssetName">The normalised asset name.</param>
|
||||
private bool IsLoaded(string normalisedAssetName)
|
||||
{
|
||||
return this.Cache.ContainsKey(normalisedAssetName);
|
||||
}
|
||||
|
||||
/// <summary>Get the locale for which the asset name was saved, if any.</summary>
|
||||
/// <param name="normalisedAssetName">The normalised asset name.</param>
|
||||
/// <param name="cache">The cache to search.</param>
|
||||
private string GetCacheLocale(string normalisedAssetName, IDictionary<string, object> cache)
|
||||
private string GetCacheLocale(string normalisedAssetName)
|
||||
{
|
||||
string locale = this.GetKeyLocale.Invoke<string>();
|
||||
return this.Cache.ContainsKey($"{normalisedAssetName}.{this.GetKeyLocale.Invoke<string>()}")
|
||||
return this.Cache.ContainsKey($"{normalisedAssetName}.{locale}")
|
||||
? locale
|
||||
: null;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue