add content language changed event (#243)

This commit is contained in:
Jesse Plamondon-Willard 2017-03-03 20:57:52 -05:00
parent c3c6fa1187
commit 4991a25d46
6 changed files with 64 additions and 6 deletions

View File

@ -5,8 +5,9 @@
See [log](https://github.com/Pathoschild/SMAPI/compare/1.9...2.0). See [log](https://github.com/Pathoschild/SMAPI/compare/1.9...2.0).
For mod developers: For mod developers:
* Added content events and an API which let you intercept XNB content as it's loaded, then * Added `ContentEvents.AssetLoading` event with a helper which lets you intercept the XNB content
dynamically replace data entries or patch images. load, and dynamically adjust or replace the content being loaded (including support for patching
images).
--> -->
## 1.9 ## 1.9
@ -29,7 +30,7 @@ For players:
* Fixed errors in console command handlers causing the game to crash. * Fixed errors in console command handlers causing the game to crash.
For mod developers: For mod developers:
* Added `SaveEvents.AfterReturnToTitle` and `TimeEvents.AfterDayStarted` events. * Added `SaveEvents.AfterReturnToTitle`, `TimeEvents.AfterDayStarted`, and `ContentEvents.AfterLocaleChanged` events.
* Added a simpler API for console commands (see `helper.ConsoleCommands`). * Added a simpler API for console commands (see `helper.ConsoleCommands`).
* Added `GetPrivateProperty` reflection helper. * Added `GetPrivateProperty` reflection helper.
* SMAPI now writes XNA input enums (`Buttons` and `Keys`) to JSON as strings automatically, so mods no longer need to add a `StringEnumConverter` themselves for those. * SMAPI now writes XNA input enums (`Buttons` and `Keys`) to JSON as strings automatically, so mods no longer need to add a `StringEnumConverter` themselves for those.

View File

@ -24,6 +24,9 @@ namespace StardewModdingAPI.Events
/********* /*********
** Events ** Events
*********/ *********/
/// <summary>Raised after the content language changes.</summary>
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> /// <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> AssetLoading;
@ -40,6 +43,15 @@ namespace StardewModdingAPI.Events
ContentEvents.Monitor = monitor; ContentEvents.Monitor = monitor;
} }
/// <summary>Raise an <see cref="AfterLocaleChanged"/> event.</summary>
/// <param name="monitor">Encapsulates monitoring and logging.</param>
/// <param name="oldLocale">The previous locale.</param>
/// <param name="newLocale">The current locale.</param>
internal static void InvokeAfterLocaleChanged(IMonitor monitor, string oldLocale, string newLocale)
{
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="AssetLoading"/> event.</summary>
/// <param name="monitor">Encapsulates monitoring and logging.</param> /// <param name="monitor">Encapsulates monitoring and logging.</param>
/// <param name="contentHelper">Encapsulates access and changes to content being read from a data file.</param> /// <param name="contentHelper">Encapsulates access and changes to content being read from a data file.</param>

View File

@ -9,11 +9,10 @@ namespace StardewModdingAPI.Events
** Accessors ** Accessors
*********/ *********/
/// <summary>The previous value.</summary> /// <summary>The previous value.</summary>
public int NewInt { get; }
/// <summary>The current value.</summary>
public int PriorInt { get; } public int PriorInt { get; }
/// <summary>The current value.</summary>
public int NewInt { get; }
/********* /*********
** Public methods ** Public methods

View File

@ -0,0 +1,31 @@
using System;
namespace StardewModdingAPI.Events
{
/// <summary>Event arguments for a field that changed value.</summary>
/// <typeparam name="T">The value type.</typeparam>
public class EventArgsValueChanged<T> : EventArgs
{
/*********
** Accessors
*********/
/// <summary>The previous value.</summary>
public T PriorValue { get; }
/// <summary>The current value.</summary>
public T NewValue { get; }
/*********
** Public methods
*********/
/// <summary>Construct an instance.</summary>
/// <param name="priorValue">The previous value.</param>
/// <param name="newValue">The current value.</param>
public EventArgsValueChanged(T priorValue, T newValue)
{
this.PriorValue = priorValue;
this.NewValue = newValue;
}
}
}

View File

@ -159,6 +159,9 @@ namespace StardewModdingAPI.Framework
/// <summary>The player character at last check.</summary> /// <summary>The player character at last check.</summary>
public SFarmer PreviousFarmer { get; private set; } public SFarmer PreviousFarmer { get; private set; }
/// <summary>The previous content locale.</summary>
public LocalizedContentManager.LanguageCode? PreviousLocale { get; private set; }
/// <summary>An index incremented on every tick and reset every 60th tick (059).</summary> /// <summary>An index incremented on every tick and reset every 60th tick (059).</summary>
public int CurrentUpdateTick { get; private set; } public int CurrentUpdateTick { get; private set; }
@ -1079,6 +1082,17 @@ namespace StardewModdingAPI.Framework
/// <summary>Detect changes since the last update ticket and trigger mod events.</summary> /// <summary>Detect changes since the last update ticket and trigger mod events.</summary>
private void UpdateEventCalls() private void UpdateEventCalls()
{ {
// content locale changed event
if (this.PreviousLocale != LocalizedContentManager.CurrentLanguageCode)
{
var oldValue = this.PreviousLocale;
var newValue = LocalizedContentManager.CurrentLanguageCode;
if (oldValue != null)
ContentEvents.InvokeAfterLocaleChanged(this.Monitor, oldValue.ToString(), newValue.ToString());
this.PreviousLocale = newValue;
}
// save loaded event // save loaded event
if (Game1.hasLoadedGame && !SaveGame.IsProcessing/*still loading save*/ && this.AfterLoadTimer >= 0) if (Game1.hasLoadedGame && !SaveGame.IsProcessing/*still loading save*/ && this.AfterLoadTimer >= 0)
{ {

View File

@ -119,6 +119,7 @@
<Compile Include="Advanced\IConfigFile.cs" /> <Compile Include="Advanced\IConfigFile.cs" />
<Compile Include="Command.cs" /> <Compile Include="Command.cs" />
<Compile Include="Events\ContentEvents.cs" /> <Compile Include="Events\ContentEvents.cs" />
<Compile Include="Events\EventArgsValueChanged.cs" />
<Compile Include="Framework\Command.cs" /> <Compile Include="Framework\Command.cs" />
<Compile Include="Config.cs" /> <Compile Include="Config.cs" />
<Compile Include="Constants.cs" /> <Compile Include="Constants.cs" />