summaryrefslogtreecommitdiff
path: root/src/SMAPI
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI')
-rw-r--r--src/SMAPI/Constants.cs35
-rw-r--r--src/SMAPI/Events/ContentEvents.cs28
-rw-r--r--src/SMAPI/Events/ControlEvents.cs123
-rw-r--r--src/SMAPI/Events/GameEvents.cs110
-rw-r--r--src/SMAPI/Events/GraphicsEvents.cs120
-rw-r--r--src/SMAPI/Events/InputEvents.cs46
-rw-r--r--src/SMAPI/Events/LocationEvents.cs61
-rw-r--r--src/SMAPI/Events/MenuEvents.cs44
-rw-r--r--src/SMAPI/Events/MineEvents.cs29
-rw-r--r--src/SMAPI/Events/PlayerEvents.cs45
-rw-r--r--src/SMAPI/Events/SaveEvents.cs84
-rw-r--r--src/SMAPI/Events/SpecialisedEvents.cs37
-rw-r--r--src/SMAPI/Events/TimeEvents.cs41
-rw-r--r--src/SMAPI/Framework/Content/ContentCache.cs19
-rw-r--r--src/SMAPI/Framework/ContentPack.cs79
-rw-r--r--src/SMAPI/Framework/Events/EventManager.cs249
-rw-r--r--src/SMAPI/Framework/Events/ManagedEvent.cs119
-rw-r--r--src/SMAPI/Framework/Events/ManagedEventBase.cs81
-rw-r--r--src/SMAPI/Framework/IModMetadata.cs22
-rw-r--r--src/SMAPI/Framework/InternalExtensions.cs86
-rw-r--r--src/SMAPI/Framework/ModData/ModDataField.cs82
-rw-r--r--src/SMAPI/Framework/ModData/ModDataFieldKey.cs18
-rw-r--r--src/SMAPI/Framework/ModData/ModDataRecord.cs141
-rw-r--r--src/SMAPI/Framework/ModData/ModDatabase.cs206
-rw-r--r--src/SMAPI/Framework/ModData/ModStatus.cs (renamed from src/SMAPI/Framework/Models/ModStatus.cs)2
-rw-r--r--src/SMAPI/Framework/ModData/ParsedModDataRecord.cs48
-rw-r--r--src/SMAPI/Framework/ModHelpers/ContentHelper.cs3
-rw-r--r--src/SMAPI/Framework/ModHelpers/ModHelper.cs74
-rw-r--r--src/SMAPI/Framework/ModHelpers/ModRegistryHelper.cs10
-rw-r--r--src/SMAPI/Framework/ModLoading/AssemblyLoader.cs5
-rw-r--r--src/SMAPI/Framework/ModLoading/InstructionHandleResult.cs7
-rw-r--r--src/SMAPI/Framework/ModLoading/ModMetadata.cs35
-rw-r--r--src/SMAPI/Framework/ModLoading/ModResolver.cs238
-rw-r--r--src/SMAPI/Framework/ModRegistry.cs17
-rw-r--r--src/SMAPI/Framework/Models/Manifest.cs8
-rw-r--r--src/SMAPI/Framework/Models/ManifestContentPackFor.cs15
-rw-r--r--src/SMAPI/Framework/Models/ModCompatibility.cs55
-rw-r--r--src/SMAPI/Framework/Models/ModDataID.cs85
-rw-r--r--src/SMAPI/Framework/Models/ModDataRecord.cs63
-rw-r--r--src/SMAPI/Framework/Models/SConfig.cs5
-rw-r--r--src/SMAPI/Framework/Reflection/InterfaceProxyBuilder.cs92
-rw-r--r--src/SMAPI/Framework/Reflection/InterfaceProxyFactory.cs58
-rw-r--r--src/SMAPI/Framework/SContentManager.cs36
-rw-r--r--src/SMAPI/Framework/SGame.cs140
-rw-r--r--src/SMAPI/Framework/Serialisation/CrossplatformConverters/ColorConverter.cs8
-rw-r--r--src/SMAPI/Framework/Serialisation/CrossplatformConverters/PointConverter.cs4
-rw-r--r--src/SMAPI/Framework/Serialisation/CrossplatformConverters/RectangleConverter.cs10
-rw-r--r--src/SMAPI/Framework/Serialisation/JsonHelper.cs3
-rw-r--r--src/SMAPI/Framework/Serialisation/SmapiConverters/ManifestContentPackForConverter.cs (renamed from src/SMAPI/Framework/Serialisation/SmapiConverters/ModCompatibilityArrayConverter.cs)19
-rw-r--r--src/SMAPI/Framework/Serialisation/SmapiConverters/ManifestDependencyArrayConverter.cs6
-rw-r--r--src/SMAPI/Framework/Serialisation/SmapiConverters/ModDataIdConverter.cs19
-rw-r--r--src/SMAPI/Framework/Serialisation/SmapiConverters/SemanticVersionConverter.cs8
-rw-r--r--src/SMAPI/Framework/Utilities/PathUtilities.cs62
-rw-r--r--src/SMAPI/IContentPack.cs42
-rw-r--r--src/SMAPI/IManifest.cs5
-rw-r--r--src/SMAPI/IManifestContentPackFor.cs12
-rw-r--r--src/SMAPI/IModHelper.cs23
-rw-r--r--src/SMAPI/Metadata/InstructionMetadata.cs1
-rw-r--r--src/SMAPI/Program.cs178
-rw-r--r--src/SMAPI/Properties/AssemblyInfo.cs6
-rw-r--r--src/SMAPI/StardewModdingAPI.config.json3281
-rw-r--r--src/SMAPI/StardewModdingAPI.csproj26
-rw-r--r--src/SMAPI/unix-launcher.sh95
63 files changed, 3823 insertions, 2886 deletions
diff --git a/src/SMAPI/Constants.cs b/src/SMAPI/Constants.cs
index 515e9870..8fe2b55b 100644
--- a/src/SMAPI/Constants.cs
+++ b/src/SMAPI/Constants.cs
@@ -21,6 +21,14 @@ namespace StardewModdingAPI
/// <summary>Whether the directory containing the current save's data exists on disk.</summary>
private static bool SavePathReady => Context.IsSaveLoaded && Directory.Exists(Constants.RawSavePath);
+ /// <summary>Maps vendor keys (like <c>Nexus</c>) to their mod URL template (where <c>{0}</c> is the mod ID). This doesn't affect update checks, which defer to the remote web API.</summary>
+ private static readonly IDictionary<string, string> VendorModUrls = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase)
+ {
+ ["Chucklefish"] = "https://community.playstarbound.com/resources/{0}",
+ ["GitHub"] = "https://github.com/{0}/releases",
+ ["Nexus"] = "https://www.nexusmods.com/stardewvalley/mods/{0}"
+ };
+
/*********
** Accessors
@@ -29,7 +37,7 @@ namespace StardewModdingAPI
** Public
****/
/// <summary>SMAPI's current semantic version.</summary>
- public static ISemanticVersion ApiVersion { get; } = new SemanticVersion("2.4.0");
+ public static ISemanticVersion ApiVersion { get; } = new SemanticVersion("2.5.0");
/// <summary>The minimum supported version of Stardew Valley.</summary>
public static ISemanticVersion MinimumGameVersion { get; } = new SemanticVersion("1.2.30");
@@ -87,14 +95,6 @@ namespace StardewModdingAPI
Platform.Mono;
#endif
- /// <summary>Maps vendor keys (like <c>Nexus</c>) to their mod URL template (where <c>{0}</c> is the mod ID) during mod compatibility checks. This doesn't affect update checks, which defer to the remote web API.</summary>
- internal static readonly IDictionary<string, string> VendorModUrls = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase)
- {
- ["Chucklefish"] = "https://community.playstarbound.com/resources/{0}",
- ["Nexus"] = "http://nexusmods.com/stardewvalley/mods/{0}",
- ["GitHub"] = "https://github.com/{0}/releases"
- };
-
/*********
** Internal methods
@@ -145,6 +145,23 @@ namespace StardewModdingAPI
return new PlatformAssemblyMap(targetPlatform, removeAssemblyReferences, targetAssemblies);
}
+ /// <summary>Get an update URL for an update key (if valid).</summary>
+ /// <param name="updateKey">The update key.</param>
+ internal static string GetUpdateUrl(string updateKey)
+ {
+ string[] parts = updateKey.Split(new[] { ':' }, 2);
+ if (parts.Length != 2)
+ return null;
+
+ string vendorKey = parts[0].Trim();
+ string modID = parts[1].Trim();
+
+ if (Constants.VendorModUrls.TryGetValue(vendorKey, out string urlTemplate))
+ return string.Format(urlTemplate, modID);
+
+ return null;
+ }
+
/*********
** Private methods
diff --git a/src/SMAPI/Events/ContentEvents.cs b/src/SMAPI/Events/ContentEvents.cs
index 4b4e2ad0..63645258 100644
--- a/src/SMAPI/Events/ContentEvents.cs
+++ b/src/SMAPI/Events/ContentEvents.cs
@@ -1,29 +1,37 @@
-using System;
-using StardewModdingAPI.Framework;
+using System;
+using StardewModdingAPI.Framework.Events;
namespace StardewModdingAPI.Events
{
/// <summary>Events raised when the game loads content.</summary>
public static class ContentEvents
{
+ /*********
+ ** Properties
+ *********/
+ /// <summary>The core event manager.</summary>
+ private static EventManager EventManager;
+
/*********
** Events
*********/
/// <summary>Raised after the content language changes.</summary>
- public static event EventHandler<EventArgsValueChanged<string>> AfterLocaleChanged;
+ public static event EventHandler<EventArgsValueChanged<string>> AfterLocaleChanged
+ {
+ add => ContentEvents.EventManager.Content_LocaleChanged.Add(value);
+ remove => ContentEvents.EventManager.Content_LocaleChanged.Remove(value);
+ }
/*********
- ** Internal methods
+ ** Public methods
*********/
- /// <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)
+ /// <summary>Initialise the events.</summary>
+ /// <param name="eventManager">The core event manager.</param>
+ internal static void Init(EventManager eventManager)
{
- monitor.SafelyRaiseGenericEvent($"{nameof(ContentEvents)}.{nameof(ContentEvents.AfterLocaleChanged)}", ContentEvents.AfterLocaleChanged?.GetInvocationList(), null, new EventArgsValueChanged<string>(oldLocale, newLocale));
+ ContentEvents.EventManager = eventManager;
}
}
}
diff --git a/src/SMAPI/Events/ControlEvents.cs b/src/SMAPI/Events/ControlEvents.cs
index 80d0f547..973bb245 100644
--- a/src/SMAPI/Events/ControlEvents.cs
+++ b/src/SMAPI/Events/ControlEvents.cs
@@ -1,7 +1,6 @@
-using System;
-using Microsoft.Xna.Framework;
+using System;
using Microsoft.Xna.Framework.Input;
-using StardewModdingAPI.Framework;
+using StardewModdingAPI.Framework.Events;
namespace StardewModdingAPI.Events
{
@@ -9,104 +8,80 @@ namespace StardewModdingAPI.Events
public static class ControlEvents
{
/*********
- ** Events
+ ** Properties
*********/
- /// <summary>Raised when the <see cref="KeyboardState"/> changes. That happens when the player presses or releases a key.</summary>
- public static event EventHandler<EventArgsKeyboardStateChanged> KeyboardChanged;
-
- /// <summary>Raised when the player presses a keyboard key.</summary>
- public static event EventHandler<EventArgsKeyPressed> KeyPressed;
-
- /// <summary>Raised when the player releases a keyboard key.</summary>
- public static event EventHandler<EventArgsKeyPressed> KeyReleased;
-
- /// <summary>Raised when the <see cref="MouseState"/> changes. That happens when the player moves the mouse, scrolls the mouse wheel, or presses/releases a button.</summary>
- public static event EventHandler<EventArgsMouseStateChanged> MouseChanged;
-
- /// <summary>The player pressed a controller button. This event isn't raised for trigger buttons.</summary>
- public static event EventHandler<EventArgsControllerButtonPressed> ControllerButtonPressed;
-
- /// <summary>The player released a controller button. This event isn't raised for trigger buttons.</summary>
- public static event EventHandler<EventArgsControllerButtonReleased> ControllerButtonReleased;
-
- /// <summary>The player pressed a controller trigger button.</summary>
- public static event EventHandler<EventArgsControllerTriggerPressed> ControllerTriggerPressed;
-
- /// <summary>The player released a controller trigger button.</summary>
- public static event EventHandler<EventArgsControllerTriggerReleased> ControllerTriggerReleased;
+ /// <summary>The core event manager.</summary>
+ private static EventManager EventManager;
/*********
- ** Internal methods
+ ** Events
*********/
- /// <summary>Raise a <see cref="KeyboardChanged"/> event.</summary>
- /// <param name="monitor">Encapsulates monitoring and logging.</param>
- /// <param name="priorState">The previous keyboard state.</param>
- /// <param name="newState">The current keyboard state.</param>
- internal static void InvokeKeyboardChanged(IMonitor monitor, KeyboardState priorState, KeyboardState newState)
+ /// <summary>Raised when the <see cref="KeyboardState"/> changes. That happens when the player presses or releases a key.</summary>
+ public static event EventHandler<EventArgsKeyboardStateChanged> KeyboardChanged
{
- monitor.SafelyRaiseGenericEvent($"{nameof(ControlEvents)}.{nameof(ControlEvents.KeyboardChanged)}", ControlEvents.KeyboardChanged?.GetInvocationList(), null, new EventArgsKeyboardStateChanged(priorState, newState));
+ add => ControlEvents.EventManager.Control_KeyboardChanged.Add(value);
+ remove => ControlEvents.EventManager.Control_KeyboardChanged.Remove(value);
}
- /// <summary>Raise a <see cref="MouseChanged"/> event.</summary>
- /// <param name="monitor">Encapsulates monitoring and logging.</param>
- /// <param name="priorState">The previous mouse state.</param>
- /// <param name="newState">The current mouse state.</param>
- /// <param name="priorPosition">The previous mouse position on the screen adjusted for the zoom level.</param>
- /// <param name="newPosition">The current mouse position on the screen adjusted for the zoom level.</param>
- internal static void InvokeMouseChanged(IMonitor monitor, MouseState priorState, MouseState newState, Point priorPosition, Point newPosition)
+ /// <summary>Raised when the player presses a keyboard key.</summary>
+ public static event EventHandler<EventArgsKeyPressed> KeyPressed
{
- monitor.SafelyRaiseGenericEvent($"{nameof(ControlEvents)}.{nameof(ControlEvents.MouseChanged)}", ControlEvents.MouseChanged?.GetInvocationList(), null, new EventArgsMouseStateChanged(priorState, newState, priorPosition, newPosition));
+ add => ControlEvents.EventManager.Control_KeyPressed.Add(value);
+ remove => ControlEvents.EventManager.Control_KeyPressed.Remove(value);
}
- /// <summary>Raise a <see cref="KeyPressed"/> event.</summary>
- /// <param name="monitor">Encapsulates monitoring and logging.</param>
- /// <param name="key">The keyboard button that was pressed.</param>
- internal static void InvokeKeyPressed(IMonitor monitor, Keys key)
+ /// <summary>Raised when the player releases a keyboard key.</summary>
+ public static event EventHandler<EventArgsKeyPressed> KeyReleased
{
- monitor.SafelyRaiseGenericEvent($"{nameof(ControlEvents)}.{nameof(ControlEvents.KeyPressed)}", ControlEvents.KeyPressed?.GetInvocationList(), null, new EventArgsKeyPressed(key));
+ add => ControlEvents.EventManager.Control_KeyReleased.Add(value);
+ remove => ControlEvents.EventManager.Control_KeyReleased.Remove(value);
}
- /// <summary>Raise a <see cref="KeyReleased"/> event.</summary>
- /// <param name="monitor">Encapsulates monitoring and logging.</param>
- /// <param name="key">The keyboard button that was released.</param>
- internal static void InvokeKeyReleased(IMonitor monitor, Keys key)
+ /// <summary>Raised when the <see cref="MouseState"/> changes. That happens when the player moves the mouse, scrolls the mouse wheel, or presses/releases a button.</summary>
+ public static event EventHandler<EventArgsMouseStateChanged> MouseChanged
{
- monitor.SafelyRaiseGenericEvent($"{nameof(ControlEvents)}.{nameof(ControlEvents.KeyReleased)}", ControlEvents.KeyReleased?.GetInvocationList(), null, new EventArgsKeyPressed(key));
+ add => ControlEvents.EventManager.Control_MouseChanged.Add(value);
+ remove => ControlEvents.EventManager.Control_MouseChanged.Remove(value);
}
- /// <summary>Raise a <see cref="ControllerButtonPressed"/> event.</summary>
- /// <param name="monitor">Encapsulates monitoring and logging.</param>
- /// <param name="button">The controller button that was pressed.</param>
- internal static void InvokeButtonPressed(IMonitor monitor, Buttons button)
+ /// <summary>The player pressed a controller button. This event isn't raised for trigger buttons.</summary>
+ public static event EventHandler<EventArgsControllerButtonPressed> ControllerButtonPressed
{
- monitor.SafelyRaiseGenericEvent($"{nameof(ControlEvents)}.{nameof(ControlEvents.ControllerButtonPressed)}", ControlEvents.ControllerButtonPressed?.GetInvocationList(), null, new EventArgsControllerButtonPressed(PlayerIndex.One, button));
+ add => ControlEvents.EventManager.Control_ControllerButtonPressed.Add(value);
+ remove => ControlEvents.EventManager.Control_ControllerButtonPressed.Remove(value);
}
- /// <summary>Raise a <see cref="ControllerButtonReleased"/> event.</summary>
- /// <param name="monitor">Encapsulates monitoring and logging.</param>
- /// <param name="button">The controller button that was released.</param>
- internal static void InvokeButtonReleased(IMonitor monitor, Buttons button)
+ /// <summary>The player released a controller button. This event isn't raised for trigger buttons.</summary>
+ public static event EventHandler<EventArgsControllerButtonReleased> ControllerButtonReleased
{
- monitor.SafelyRaiseGenericEvent($"{nameof(ControlEvents)}.{nameof(ControlEvents.ControllerButtonReleased)}", ControlEvents.ControllerButtonReleased?.GetInvocationList(), null, new EventArgsControllerButtonReleased(PlayerIndex.One, button));
+ add => ControlEvents.EventManager.Control_ControllerButtonReleased.Add(value);
+ remove => ControlEvents.EventManager.Control_ControllerButtonReleased.Remove(value);
}
- /// <summary>Raise a <see cref="ControllerTriggerPressed"/> event.</summary>
- /// <param name="monitor">Encapsulates monitoring and logging.</param>
- /// <param name="button">The trigger button that was pressed.</param>
- /// <param name="value">The current trigger value.</param>
- internal static void InvokeTriggerPressed(IMonitor monitor, Buttons button, float value)
+ /// <summary>The player pressed a controller trigger button.</summary>
+ public static event EventHandler<EventArgsControllerTriggerPressed> ControllerTriggerPressed
{
- monitor.SafelyRaiseGenericEvent($"{nameof(ControlEvents)}.{nameof(ControlEvents.ControllerTriggerPressed)}", ControlEvents.ControllerTriggerPressed?.GetInvocationList(), null, new EventArgsControllerTriggerPressed(PlayerIndex.One, button, value));
+ add => ControlEvents.EventManager.Control_ControllerTriggerPressed.Add(value);
+ remove => ControlEvents.EventManager.Control_ControllerTriggerPressed.Remove(value);
}
- /// <summary>Raise a <see cref="ControllerTriggerReleased"/> event.</summary>
- /// <param name="monitor">Encapsulates monitoring and logging.</param>
- /// <param name="button">The trigger button that was pressed.</param>
- /// <param name="value">The current trigger value.</param>
- internal static void InvokeTriggerReleased(IMonitor monitor, Buttons button, float value)
+ /// <summary>The player released a controller trigger button.</summary>
+ public static event EventHandler<EventArgsControllerTriggerReleased> ControllerTriggerReleased
+ {
+ add => ControlEvents.EventManager.Control_ControllerTriggerReleased.Add(value);
+ remove => ControlEvents.EventManager.Control_ControllerTriggerReleased.Remove(value);
+ }
+
+
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Initialise the events.</summary>
+ /// <param name="eventManager">The core event manager.</param>
+ internal static void Init(EventManager eventManager)
{
- monitor.SafelyRaiseGenericEvent($"{nameof(ControlEvents)}.{nameof(ControlEvents.ControllerTriggerReleased)}", ControlEvents.ControllerTriggerReleased?.GetInvocationList(), null, new EventArgsControllerTriggerReleased(PlayerIndex.One, button, value));
+ ControlEvents.EventManager = eventManager;
}
}
}
diff --git a/src/SMAPI/Events/GameEvents.cs b/src/SMAPI/Events/GameEvents.cs
index 3466470d..92879280 100644
--- a/src/SMAPI/Events/GameEvents.cs
+++ b/src/SMAPI/Events/GameEvents.cs
@@ -1,5 +1,5 @@
using System;
-using StardewModdingAPI.Framework;
+using StardewModdingAPI.Framework.Events;
namespace StardewModdingAPI.Events
{
@@ -7,100 +7,80 @@ namespace StardewModdingAPI.Events
public static class GameEvents
{
/*********
- ** Events
+ ** Properties
*********/
- /// <summary>Raised during launch after configuring XNA or MonoGame. The game window hasn't been opened by this point. Called after <see cref="Microsoft.Xna.Framework.Game.Initialize"/>.</summary>
- internal static event EventHandler InitializeInternal;
-
- /// <summary>Raised when the game updates its state (≈60 times per second).</summary>
- public static event EventHandler UpdateTick;
-
- /// <summary>Raised every other tick (≈30 times per second).</summary>
- public static event EventHandler SecondUpdateTick;
-
- /// <summary>Raised every fourth tick (≈15 times per second).</summary>
- public static event EventHandler FourthUpdateTick;
-
- /// <summary>Raised every eighth tick (≈8 times per second).</summary>
- public static event EventHandler EighthUpdateTick;
-
- /// <summary>Raised every 15th tick (≈4 times per second).</summary>
- public static event EventHandler QuarterSecondTick;
-
- /// <summary>Raised every 30th tick (≈twice per second).</summary>
- public static event EventHandler HalfSecondTick;
-
- /// <summary>Raised every 60th tick (≈once per second).</summary>
- public static event EventHandler OneSecondTick;
-
- /// <summary>Raised once after the game initialises and all <see cref="IMod.Entry"/> methods have been called.</summary>
- public static event EventHandler FirstUpdateTick;
+ /// <summary>The core event manager.</summary>
+ private static EventManager EventManager;
/*********
- ** Internal methods
+ ** Events
*********/
- /// <summary>Raise an <see cref="InitializeInternal"/> event.</summary>
- /// <param name="monitor">Encapsulates logging and monitoring.</param>
- internal static void InvokeInitialize(IMonitor monitor)
+ /// <summary>Raised when the game updates its state (≈60 times per second).</summary>
+ public static event EventHandler UpdateTick
{
- monitor.SafelyRaisePlainEvent($"{nameof(GameEvents)}.{nameof(GameEvents.InitializeInternal)}", GameEvents.InitializeInternal?.GetInvocationList());
+ add => GameEvents.EventManager.Game_UpdateTick.Add(value);
+ remove => GameEvents.EventManager.Game_UpdateTick.Remove(value);
}
- /// <summary>Raise an <see cref="UpdateTick"/> event.</summary>
- /// <param name="monitor">Encapsulates logging and monitoring.</param>
- internal static void InvokeUpdateTick(IMonitor monitor)
+ /// <summary>Raised every other tick (≈30 times per second).</summary>
+ public static event EventHandler SecondUpdateTick
{
- monitor.SafelyRaisePlainEvent($"{nameof(GameEvents)}.{nameof(GameEvents.UpdateTick)}", GameEvents.UpdateTick?.GetInvocationList());
+ add => GameEvents.EventManager.Game_SecondUpdateTick.Add(value);
+ remove => GameEvents.EventManager.Game_SecondUpdateTick.Remove(value);
}
- /// <summary>Raise a <see cref="SecondUpdateTick"/> event.</summary>
- /// <param name="monitor">Encapsulates monitoring and logging.</param>
- internal static void InvokeSecondUpdateTick(IMonitor monitor)
+ /// <summary>Raised every fourth tick (≈15 times per second).</summary>
+ public static event EventHandler FourthUpdateTick
{
- monitor.SafelyRaisePlainEvent($"{nameof(GameEvents)}.{nameof(GameEvents.SecondUpdateTick)}", GameEvents.SecondUpdateTick?.GetInvocationList());
+ add => GameEvents.EventManager.Game_FourthUpdateTick.Add(value);
+ remove => GameEvents.EventManager.Game_FourthUpdateTick.Remove(value);
}
- /// <summary>Raise a <see cref="FourthUpdateTick"/> event.</summary>
- /// <param name="monitor">Encapsulates monitoring and logging.</param>
- internal static void InvokeFourthUpdateTick(IMonitor monitor)
+ /// <summary>Raised every eighth tick (≈8 times per second).</summary>
+ public static event EventHandler EighthUpdateTick
{
- monitor.SafelyRaisePlainEvent($"{nameof(GameEvents)}.{nameof(GameEvents.FourthUpdateTick)}", GameEvents.FourthUpdateTick?.GetInvocationList());
+ add => GameEvents.EventManager.Game_EighthUpdateTick.Add(value);
+ remove => GameEvents.EventManager.Game_EighthUpdateTick.Remove(value);
}
- /// <summary>Raise a <see cref="EighthUpdateTick"/> event.</summary>
- /// <param name="monitor">Encapsulates monitoring and logging.</param>
- internal static void InvokeEight