use shared reflection helper
This commit is contained in:
parent
85f609dc6c
commit
486ac29796
|
@ -1,6 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using StardewModdingAPI.Framework.Reflection;
|
|
||||||
using StardewModdingAPI.Framework.Serialisation;
|
using StardewModdingAPI.Framework.Serialisation;
|
||||||
|
|
||||||
namespace StardewModdingAPI.Framework
|
namespace StardewModdingAPI.Framework
|
||||||
|
@ -25,7 +24,7 @@ namespace StardewModdingAPI.Framework
|
||||||
public IContentHelper Content { get; }
|
public IContentHelper Content { get; }
|
||||||
|
|
||||||
/// <summary>Simplifies access to private game code.</summary>
|
/// <summary>Simplifies access to private game code.</summary>
|
||||||
public IReflectionHelper Reflection { get; } = new ReflectionHelper();
|
public IReflectionHelper Reflection { get; }
|
||||||
|
|
||||||
/// <summary>Metadata about loaded mods.</summary>
|
/// <summary>Metadata about loaded mods.</summary>
|
||||||
public IModRegistry ModRegistry { get; }
|
public IModRegistry ModRegistry { get; }
|
||||||
|
@ -44,9 +43,10 @@ namespace StardewModdingAPI.Framework
|
||||||
/// <param name="modRegistry">Metadata about loaded mods.</param>
|
/// <param name="modRegistry">Metadata about loaded mods.</param>
|
||||||
/// <param name="commandManager">Manages console commands.</param>
|
/// <param name="commandManager">Manages console commands.</param>
|
||||||
/// <param name="contentManager">The content manager which loads content assets.</param>
|
/// <param name="contentManager">The content manager which loads content assets.</param>
|
||||||
|
/// <param name="reflection">Simplifies access to private game code.</param>
|
||||||
/// <exception cref="ArgumentNullException">An argument is null or empty.</exception>
|
/// <exception cref="ArgumentNullException">An argument is null or empty.</exception>
|
||||||
/// <exception cref="InvalidOperationException">The <paramref name="modDirectory"/> path does not exist on disk.</exception>
|
/// <exception cref="InvalidOperationException">The <paramref name="modDirectory"/> path does not exist on disk.</exception>
|
||||||
public ModHelper(IManifest manifest, string modDirectory, JsonHelper jsonHelper, IModRegistry modRegistry, CommandManager commandManager, SContentManager contentManager)
|
public ModHelper(IManifest manifest, string modDirectory, JsonHelper jsonHelper, IModRegistry modRegistry, CommandManager commandManager, SContentManager contentManager, IReflectionHelper reflection)
|
||||||
{
|
{
|
||||||
// validate
|
// validate
|
||||||
if (string.IsNullOrWhiteSpace(modDirectory))
|
if (string.IsNullOrWhiteSpace(modDirectory))
|
||||||
|
@ -64,6 +64,7 @@ namespace StardewModdingAPI.Framework
|
||||||
this.Content = new ContentHelper(contentManager, modDirectory, manifest.Name);
|
this.Content = new ContentHelper(contentManager, modDirectory, manifest.Name);
|
||||||
this.ModRegistry = modRegistry;
|
this.ModRegistry = modRegistry;
|
||||||
this.ConsoleCommands = new CommandHelper(manifest.Name, commandManager);
|
this.ConsoleCommands = new CommandHelper(manifest.Name, commandManager);
|
||||||
|
this.Reflection = reflection;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****
|
/****
|
||||||
|
|
|
@ -9,7 +9,6 @@ using Microsoft.Xna.Framework;
|
||||||
using Microsoft.Xna.Framework.Graphics;
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
using Microsoft.Xna.Framework.Input;
|
using Microsoft.Xna.Framework.Input;
|
||||||
using StardewModdingAPI.Events;
|
using StardewModdingAPI.Events;
|
||||||
using StardewModdingAPI.Framework.Reflection;
|
|
||||||
using StardewValley;
|
using StardewValley;
|
||||||
using StardewValley.BellsAndWhistles;
|
using StardewValley.BellsAndWhistles;
|
||||||
using StardewValley.Locations;
|
using StardewValley.Locations;
|
||||||
|
@ -157,9 +156,11 @@ namespace StardewModdingAPI.Framework
|
||||||
/****
|
/****
|
||||||
** Private wrappers
|
** Private wrappers
|
||||||
****/
|
****/
|
||||||
|
/// <summary>Simplifies access to private game code.</summary>
|
||||||
|
private static IReflectionHelper Reflection;
|
||||||
|
|
||||||
// ReSharper disable ArrangeStaticMemberQualifier, ArrangeThisQualifier, InconsistentNaming
|
// ReSharper disable ArrangeStaticMemberQualifier, ArrangeThisQualifier, InconsistentNaming
|
||||||
/// <summary>Used to access private fields and methods.</summary>
|
/// <summary>Used to access private fields and methods.</summary>
|
||||||
private static readonly IReflectionHelper Reflection = new ReflectionHelper();
|
|
||||||
private static List<float> _fpsList => SGame.Reflection.GetPrivateField<List<float>>(typeof(Game1), nameof(_fpsList)).GetValue();
|
private static List<float> _fpsList => SGame.Reflection.GetPrivateField<List<float>>(typeof(Game1), nameof(_fpsList)).GetValue();
|
||||||
private static Stopwatch _fpsStopwatch => SGame.Reflection.GetPrivateField<Stopwatch>(typeof(Game1), nameof(SGame._fpsStopwatch)).GetValue();
|
private static Stopwatch _fpsStopwatch => SGame.Reflection.GetPrivateField<Stopwatch>(typeof(Game1), nameof(SGame._fpsStopwatch)).GetValue();
|
||||||
private static float _fps
|
private static float _fps
|
||||||
|
@ -176,6 +177,7 @@ namespace StardewModdingAPI.Framework
|
||||||
private readonly Action renderScreenBuffer = () => SGame.Reflection.GetPrivateMethod(SGame.Instance, nameof(renderScreenBuffer)).Invoke(new object[0]);
|
private readonly Action renderScreenBuffer = () => SGame.Reflection.GetPrivateMethod(SGame.Instance, nameof(renderScreenBuffer)).Invoke(new object[0]);
|
||||||
// ReSharper restore ArrangeStaticMemberQualifier, ArrangeThisQualifier, InconsistentNaming
|
// ReSharper restore ArrangeStaticMemberQualifier, ArrangeThisQualifier, InconsistentNaming
|
||||||
|
|
||||||
|
|
||||||
/*********
|
/*********
|
||||||
** Accessors
|
** Accessors
|
||||||
*********/
|
*********/
|
||||||
|
@ -188,11 +190,13 @@ namespace StardewModdingAPI.Framework
|
||||||
*********/
|
*********/
|
||||||
/// <summary>Construct an instance.</summary>
|
/// <summary>Construct an instance.</summary>
|
||||||
/// <param name="monitor">Encapsulates monitoring and logging.</param>
|
/// <param name="monitor">Encapsulates monitoring and logging.</param>
|
||||||
internal SGame(IMonitor monitor)
|
/// <param name="reflection">Simplifies access to private game code.</param>
|
||||||
|
internal SGame(IMonitor monitor, IReflectionHelper reflection)
|
||||||
{
|
{
|
||||||
this.Monitor = monitor;
|
this.Monitor = monitor;
|
||||||
this.FirstUpdate = true;
|
this.FirstUpdate = true;
|
||||||
SGame.Instance = this;
|
SGame.Instance = this;
|
||||||
|
SGame.Reflection = reflection;
|
||||||
|
|
||||||
Game1.graphics.GraphicsProfile = GraphicsProfile.HiDef; // required by Stardew Valley
|
Game1.graphics.GraphicsProfile = GraphicsProfile.HiDef; // required by Stardew Valley
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ using StardewModdingAPI.Events;
|
||||||
using StardewModdingAPI.Framework;
|
using StardewModdingAPI.Framework;
|
||||||
using StardewModdingAPI.Framework.Logging;
|
using StardewModdingAPI.Framework.Logging;
|
||||||
using StardewModdingAPI.Framework.Models;
|
using StardewModdingAPI.Framework.Models;
|
||||||
|
using StardewModdingAPI.Framework.Reflection;
|
||||||
using StardewModdingAPI.Framework.Serialisation;
|
using StardewModdingAPI.Framework.Serialisation;
|
||||||
using StardewValley;
|
using StardewValley;
|
||||||
using Monitor = StardewModdingAPI.Framework.Monitor;
|
using Monitor = StardewModdingAPI.Framework.Monitor;
|
||||||
|
@ -40,6 +41,9 @@ namespace StardewModdingAPI
|
||||||
/// <summary>Tracks whether the game should exit immediately and any pending initialisation should be cancelled.</summary>
|
/// <summary>Tracks whether the game should exit immediately and any pending initialisation should be cancelled.</summary>
|
||||||
private readonly CancellationTokenSource CancellationTokenSource = new CancellationTokenSource();
|
private readonly CancellationTokenSource CancellationTokenSource = new CancellationTokenSource();
|
||||||
|
|
||||||
|
/// <summary>Simplifies access to private game code.</summary>
|
||||||
|
private readonly IReflectionHelper Reflection = new ReflectionHelper();
|
||||||
|
|
||||||
/// <summary>The underlying game instance.</summary>
|
/// <summary>The underlying game instance.</summary>
|
||||||
private SGame GameInstance;
|
private SGame GameInstance;
|
||||||
|
|
||||||
|
@ -141,7 +145,7 @@ namespace StardewModdingAPI
|
||||||
AppDomain.CurrentDomain.UnhandledException += (sender, e) => this.Monitor.Log($"Critical app domain exception: {e.ExceptionObject}", LogLevel.Error);
|
AppDomain.CurrentDomain.UnhandledException += (sender, e) => this.Monitor.Log($"Critical app domain exception: {e.ExceptionObject}", LogLevel.Error);
|
||||||
|
|
||||||
// override game
|
// override game
|
||||||
this.GameInstance = new SGame(this.Monitor);
|
this.GameInstance = new SGame(this.Monitor, this.Reflection);
|
||||||
StardewValley.Program.gamePtr = this.GameInstance;
|
StardewValley.Program.gamePtr = this.GameInstance;
|
||||||
|
|
||||||
// add exit handler
|
// add exit handler
|
||||||
|
@ -599,7 +603,7 @@ namespace StardewModdingAPI
|
||||||
// inject data
|
// inject data
|
||||||
// get helper
|
// get helper
|
||||||
mod.ModManifest = manifest;
|
mod.ModManifest = manifest;
|
||||||
mod.Helper = new ModHelper(manifest, directory.FullName, jsonHelper, this.ModRegistry, this.CommandManager, (SContentManager)Game1.content);
|
mod.Helper = new ModHelper(manifest, directory.FullName, jsonHelper, this.ModRegistry, this.CommandManager, (SContentManager)Game1.content, this.Reflection);
|
||||||
mod.Monitor = this.GetSecondaryMonitor(manifest.Name);
|
mod.Monitor = this.GetSecondaryMonitor(manifest.Name);
|
||||||
mod.PathOnDisk = directory.FullName;
|
mod.PathOnDisk = directory.FullName;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue