rename content event for consistency, simplify usage (#173)

This commit is contained in:
Jesse Plamondon-Willard 2017-03-10 20:48:54 -05:00
parent e3522edddd
commit 363f5aeef2
2 changed files with 37 additions and 23 deletions

View File

@ -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;
}
}
}

View File

@ -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;
}