summaryrefslogtreecommitdiff
path: root/src/StardewModdingAPI
diff options
context:
space:
mode:
Diffstat (limited to 'src/StardewModdingAPI')
-rw-r--r--src/StardewModdingAPI/Command.cs10
-rw-r--r--src/StardewModdingAPI/Config.cs6
-rw-r--r--src/StardewModdingAPI/Constants.cs33
-rw-r--r--src/StardewModdingAPI/Events/ContentEvents.cs65
-rw-r--r--src/StardewModdingAPI/Events/EventArgsCommand.cs4
-rw-r--r--src/StardewModdingAPI/Events/EventArgsFarmerChanged.cs2
-rw-r--r--src/StardewModdingAPI/Events/EventArgsInput.cs126
-rw-r--r--src/StardewModdingAPI/Events/EventArgsLoadedGameChanged.cs4
-rw-r--r--src/StardewModdingAPI/Events/EventArgsNewDay.cs4
-rw-r--r--src/StardewModdingAPI/Events/EventArgsStringChanged.cs4
-rw-r--r--src/StardewModdingAPI/Events/GameEvents.cs30
-rw-r--r--src/StardewModdingAPI/Events/InputEvents.cs45
-rw-r--r--src/StardewModdingAPI/Events/PlayerEvents.cs10
-rw-r--r--src/StardewModdingAPI/Events/TimeEvents.cs19
-rw-r--r--src/StardewModdingAPI/Framework/Content/AssetData.cs44
-rw-r--r--src/StardewModdingAPI/Framework/Content/AssetDataForDictionary.cs (renamed from src/StardewModdingAPI/Framework/Content/ContentEventHelperForDictionary.cs)4
-rw-r--r--src/StardewModdingAPI/Framework/Content/AssetDataForImage.cs (renamed from src/StardewModdingAPI/Framework/Content/ContentEventHelperForImage.cs)4
-rw-r--r--src/StardewModdingAPI/Framework/Content/AssetDataForObject.cs (renamed from src/StardewModdingAPI/Framework/Content/ContentEventHelper.cs)19
-rw-r--r--src/StardewModdingAPI/Framework/Content/AssetInfo.cs (renamed from src/StardewModdingAPI/Framework/Content/ContentEventData.cs)41
-rw-r--r--src/StardewModdingAPI/Framework/CursorPosition.cs37
-rw-r--r--src/StardewModdingAPI/Framework/DeprecationManager.cs13
-rw-r--r--src/StardewModdingAPI/Framework/Exceptions/SParseException.cs17
-rw-r--r--src/StardewModdingAPI/Framework/InternalExtensions.cs5
-rw-r--r--src/StardewModdingAPI/Framework/ModHelpers/BaseHelper.cs23
-rw-r--r--src/StardewModdingAPI/Framework/ModHelpers/CommandHelper.cs (renamed from src/StardewModdingAPI/Framework/CommandHelper.cs)9
-rw-r--r--src/StardewModdingAPI/Framework/ModHelpers/ContentHelper.cs (renamed from src/StardewModdingAPI/Framework/ContentHelper.cs)26
-rw-r--r--src/StardewModdingAPI/Framework/ModHelpers/ModHelper.cs (renamed from src/StardewModdingAPI/Framework/ModHelper.cs)42
-rw-r--r--src/StardewModdingAPI/Framework/ModHelpers/ModRegistryHelper.cs48
-rw-r--r--src/StardewModdingAPI/Framework/ModHelpers/ReflectionHelper.cs160
-rw-r--r--src/StardewModdingAPI/Framework/ModHelpers/TranslationHelper.cs (renamed from src/StardewModdingAPI/Framework/TranslationHelper.cs)8
-rw-r--r--src/StardewModdingAPI/Framework/ModLoading/AssemblyLoader.cs27
-rw-r--r--src/StardewModdingAPI/Framework/ModLoading/ModResolver.cs124
-rw-r--r--src/StardewModdingAPI/Framework/ModRegistry.cs6
-rw-r--r--src/StardewModdingAPI/Framework/Models/DisabledMod.cs22
-rw-r--r--src/StardewModdingAPI/Framework/Models/Manifest.cs5
-rw-r--r--src/StardewModdingAPI/Framework/Models/ManifestDependency.cs21
-rw-r--r--src/StardewModdingAPI/Framework/Models/SConfig.cs3
-rw-r--r--src/StardewModdingAPI/Framework/Monitor.cs32
-rw-r--r--src/StardewModdingAPI/Framework/Reflection/Reflector.cs (renamed from src/StardewModdingAPI/Framework/Reflection/ReflectionHelper.cs)44
-rw-r--r--src/StardewModdingAPI/Framework/SContentManager.cs248
-rw-r--r--src/StardewModdingAPI/Framework/SGame.cs357
-rw-r--r--src/StardewModdingAPI/Framework/Serialisation/JsonHelper.cs19
-rw-r--r--src/StardewModdingAPI/Framework/Serialisation/ManifestFieldConverter.cs41
-rw-r--r--src/StardewModdingAPI/IAssetData.cs47
-rw-r--r--src/StardewModdingAPI/IAssetDataForDictionary.cs (renamed from src/StardewModdingAPI/IContentEventHelperForDictionary.cs)2
-rw-r--r--src/StardewModdingAPI/IAssetDataForImage.cs (renamed from src/StardewModdingAPI/IContentEventHelperForImage.cs)2
-rw-r--r--src/StardewModdingAPI/IAssetEditor.cs17
-rw-r--r--src/StardewModdingAPI/IAssetInfo.cs28
-rw-r--r--src/StardewModdingAPI/IAssetLoader.cs17
-rw-r--r--src/StardewModdingAPI/ICommandHelper.cs2
-rw-r--r--src/StardewModdingAPI/IContentEventData.cs38
-rw-r--r--src/StardewModdingAPI/IContentEventHelper.cs26
-rw-r--r--src/StardewModdingAPI/IContentHelper.cs2
-rw-r--r--src/StardewModdingAPI/ICursorPosition.cs19
-rw-r--r--src/StardewModdingAPI/IManifest.cs2
-rw-r--r--src/StardewModdingAPI/IManifestDependency.cs8
-rw-r--r--src/StardewModdingAPI/IModLinked.cs12
-rw-r--r--src/StardewModdingAPI/IModRegistry.cs4
-rw-r--r--src/StardewModdingAPI/IReflectionHelper.cs4
-rw-r--r--src/StardewModdingAPI/ITranslationHelper.cs2
-rw-r--r--src/StardewModdingAPI/Log.cs6
-rw-r--r--src/StardewModdingAPI/Mod.cs17
-rw-r--r--src/StardewModdingAPI/Program.cs335
-rw-r--r--src/StardewModdingAPI/SemanticVersion.cs32
-rw-r--r--src/StardewModdingAPI/StardewModdingAPI.config.json25
-rw-r--r--src/StardewModdingAPI/StardewModdingAPI.csproj45
-rw-r--r--src/StardewModdingAPI/Utilities/SButton.cs659
-rw-r--r--src/StardewModdingAPI/Utilities/SDate.cs222
68 files changed, 2703 insertions, 681 deletions
diff --git a/src/StardewModdingAPI/Command.cs b/src/StardewModdingAPI/Command.cs
index e2d08538..689bb18b 100644
--- a/src/StardewModdingAPI/Command.cs
+++ b/src/StardewModdingAPI/Command.cs
@@ -1,4 +1,5 @@
-using System;
+#if !SMAPI_2_0
+using System;
using System.Collections.Generic;
using StardewModdingAPI.Events;
using StardewModdingAPI.Framework;
@@ -94,7 +95,7 @@ namespace StardewModdingAPI
/// <param name="monitor">Encapsulates monitoring and logging.</param>
public static void CallCommand(string input, IMonitor monitor)
{
- Command.DeprecationManager.Warn("Command.CallCommand", "1.9", DeprecationLevel.Info);
+ Command.DeprecationManager.Warn("Command.CallCommand", "1.9", DeprecationLevel.PendingRemoval);
Command.CommandManager.Trigger(input);
}
@@ -107,7 +108,7 @@ namespace StardewModdingAPI
name = name?.Trim().ToLower();
// raise deprecation warning
- Command.DeprecationManager.Warn("Command.RegisterCommand", "1.9", DeprecationLevel.Info);
+ Command.DeprecationManager.Warn("Command.RegisterCommand", "1.9", DeprecationLevel.PendingRemoval);
// validate
if (Command.LegacyCommands.ContainsKey(name))
@@ -130,7 +131,7 @@ namespace StardewModdingAPI
/// <param name="name">The command name to find.</param>
public static Command FindCommand(string name)
{
- Command.DeprecationManager.Warn("Command.FindCommand", "1.9", DeprecationLevel.Info);
+ Command.DeprecationManager.Warn("Command.FindCommand", "1.9", DeprecationLevel.PendingRemoval);
if (name == null)
return null;
@@ -155,3 +156,4 @@ namespace StardewModdingAPI
}
}
}
+#endif \ No newline at end of file
diff --git a/src/StardewModdingAPI/Config.cs b/src/StardewModdingAPI/Config.cs
index 9f4bfad2..e166f414 100644
--- a/src/StardewModdingAPI/Config.cs
+++ b/src/StardewModdingAPI/Config.cs
@@ -1,4 +1,5 @@
-using System;
+#if !SMAPI_2_0
+using System;
using System.IO;
using System.Linq;
using Newtonsoft.Json;
@@ -125,7 +126,7 @@ namespace StardewModdingAPI
/// <summary>Construct an instance.</summary>
protected Config()
{
- Config.DeprecationManager.Warn("the Config class", "1.0", DeprecationLevel.Info);
+ Config.DeprecationManager.Warn("the Config class", "1.0", DeprecationLevel.PendingRemoval);
Config.DeprecationManager.MarkWarned($"{nameof(Mod)}.{nameof(Mod.BaseConfigPath)}", "1.0"); // typically used to construct config, avoid redundant warnings
}
}
@@ -184,3 +185,4 @@ namespace StardewModdingAPI
}
}
}
+#endif \ No newline at end of file
diff --git a/src/StardewModdingAPI/Constants.cs b/src/StardewModdingAPI/Constants.cs
index bd489b29..586cadeb 100644
--- a/src/StardewModdingAPI/Constants.cs
+++ b/src/StardewModdingAPI/Constants.cs
@@ -33,7 +33,12 @@ namespace StardewModdingAPI
** Public
****/
/// <summary>SMAPI's current semantic version.</summary>
- public static ISemanticVersion ApiVersion { get; } = new SemanticVersion(1, 14, 1); // alpha-{DateTime.UtcNow:yyyyMMddHHmm}
+ public static ISemanticVersion ApiVersion { get; } =
+#if SMAPI_2_0
+ new SemanticVersion(2, 0, 0, $"alpha-{DateTime.UtcNow:yyyyMMddHHmm}");
+#else
+ new SemanticVersion(1, 15, 0); // alpha-{DateTime.UtcNow:yyyyMMddHHmm}
+#endif
/// <summary>The minimum supported version of Stardew Valley.</summary>
public static ISemanticVersion MinimumGameVersion { get; } = new SemanticVersion("1.2.30");
@@ -169,6 +174,32 @@ namespace StardewModdingAPI
new EventFinder("StardewModdingAPI.Events.GraphicsEvents", "OnPreRenderHudEventNoCheck"),
new EventFinder("StardewModdingAPI.Events.GraphicsEvents", "OnPreRenderGuiEventNoCheck"),
+ // APIs removed in SMAPI 2.0
+#if SMAPI_2_0
+ new TypeFinder("StardewModdingAPI.Command"),
+ new TypeFinder("StardewModdingAPI.Config"),
+ new TypeFinder("StardewModdingAPI.Log"),
+ new TypeFinder("StardewModdingAPI.Events.EventArgsCommand"),
+ new TypeFinder("StardewModdingAPI.Events.EventArgsFarmerChanged"),
+ new TypeFinder("StardewModdingAPI.Events.EventArgsLoadedGameChanged"),
+ new TypeFinder("StardewModdingAPI.Events.EventArgsNewDay"),
+ new TypeFinder("StardewModdingAPI.Events.EventArgsStringChanged"),
+ new PropertyFinder("StardewModdingAPI.Mod", "PathOnDisk"),
+ new PropertyFinder("StardewModdingAPI.Mod", "BaseConfigPath"),
+ new PropertyFinder("StardewModdingAPI.Mod", "PerSaveConfigFolder"),
+ new PropertyFinder("StardewModdingAPI.Mod", "PerSaveConfigPath"),
+ new EventFinder("StardewModdingAPI.Events.GameEvents", "Initialize"),
+ new EventFinder("StardewModdingAPI.Events.GameEvents", "LoadContent"),
+ new EventFinder("StardewModdingAPI.Events.GameEvents", "GameLoaded"),
+ new EventFinder("StardewModdingAPI.Events.GameEvents", "FirstUpdateTick"),
+ new EventFinder("StardewModdingAPI.Events.PlayerEvents", "LoadedGame"),
+ new EventFinder("StardewModdingAPI.Events.PlayerEvents", "FarmerChanged"),
+ new EventFinder("StardewModdingAPI.Events.TimeEvents", "DayOfMonthChanged"),
+ new EventFinder("StardewModdingAPI.Events.TimeEvents", "YearOfGameChanged"),
+ new EventFinder("StardewModdingAPI.Events.TimeEvents", "SeasonOfYearChanged"),
+ new EventFinder("StardewModdingAPI.Events.TimeEvents", "OnNewDay"),
+#endif
+
/****
** Rewriters change CIL as needed to fix incompatible code
****/
diff --git a/src/StardewModdingAPI/Events/ContentEvents.cs b/src/StardewModdingAPI/Events/ContentEvents.cs
index 8fa9ae3c..4b4e2ad0 100644
--- a/src/StardewModdingAPI/Events/ContentEvents.cs
+++ b/src/StardewModdingAPI/Events/ContentEvents.cs
@@ -1,6 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Diagnostics.CodeAnalysis;
using StardewModdingAPI.Framework;
namespace StardewModdingAPI.Events
@@ -8,21 +6,6 @@ namespace StardewModdingAPI.Events
/// <summary>Events raised when the game loads content.</summary>
public static class ContentEvents
{
- /*********
- ** Properties
- *********/
- /// <summary>Tracks the installed mods.</summary>
- private static ModRegistry ModRegistry;
-
- /// <summary>Encapsulates monitoring and logging.</summary>
- private static IMonitor Monitor;
-
- /// <summary>The mods using the experimental API for which a warning has been raised.</summary>
- private static readonly HashSet<string> WarnedMods = new HashSet<string>();
-
- /// <summary>The backing field for <see cref="AfterAssetLoaded"/>.</summary>
- [SuppressMessage("ReSharper", "InconsistentNaming")]
- private static event EventHandler<IContentEventHelper> _AfterAssetLoaded;
/*********
** Events
@@ -30,35 +13,10 @@ namespace StardewModdingAPI.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>
-#if EXPERIMENTAL
- public
-#else
- internal
-#endif
- static event EventHandler<IContentEventHelper> AfterAssetLoaded
- {
- add
- {
- ContentEvents.RaiseContentExperimentalWarning();
- ContentEvents._AfterAssetLoaded += value;
- }
- remove => ContentEvents._AfterAssetLoaded -= value;
- }
-
/*********
** Internal methods
*********/
- /// <summary>Injects types required for backwards compatibility.</summary>
- /// <param name="modRegistry">Tracks the installed mods.</param>
- /// <param name="monitor">Encapsulates monitoring and logging.</param>
- internal static void Shim(ModRegistry modRegistry, IMonitor monitor)
- {
- ContentEvents.ModRegistry = modRegistry;
- 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>
@@ -67,28 +25,5 @@ namespace StardewModdingAPI.Events
{
monitor.SafelyRaiseGenericEvent($"{nameof(ContentEvents)}.{nameof(ContentEvents.AfterLocaleChanged)}", ContentEvents.AfterLocaleChanged?.GetInvocationList(), null, new EventArgsValueChanged<string>(oldLocale, newLocale));
}
-
- /// <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 InvokeAfterAssetLoaded(IMonitor monitor, IContentEventHelper contentHelper)
- {
- monitor.SafelyRaiseGenericEvent($"{nameof(ContentEvents)}.{nameof(ContentEvents.AfterAssetLoaded)}", ContentEvents._AfterAssetLoaded?.GetInvocationList(), null, contentHelper);
- }
-
-
- /*********
- ** Private methods
- *********/
- /// <summary>Raise an 'experimental API' warning for a mod using the content API.</summary>
- private static void RaiseContentExperimentalWarning()
- {
- string modName = ContentEvents.ModRegistry.GetModFromStack() ?? "An unknown mod";
- if (!ContentEvents.WarnedMods.Contains(modName))
- {
- ContentEvents.WarnedMods.Add(modName);
- ContentEvents.Monitor.Log($"{modName} used the undocumented and experimental content API, which may change or be removed without warning.", LogLevel.Warn);
- }
- }
}
}
diff --git a/src/StardewModdingAPI/Events/EventArgsCommand.cs b/src/StardewModdingAPI/Events/EventArgsCommand.cs
index 88a9e5a3..f0435904 100644
--- a/src/StardewModdingAPI/Events/EventArgsCommand.cs
+++ b/src/StardewModdingAPI/Events/EventArgsCommand.cs
@@ -1,4 +1,5 @@
-using System;
+#if !SMAPI_2_0
+using System;
namespace StardewModdingAPI.Events
{
@@ -24,3 +25,4 @@ namespace StardewModdingAPI.Events
}
}
}
+#endif \ No newline at end of file
diff --git a/src/StardewModdingAPI/Events/EventArgsFarmerChanged.cs b/src/StardewModdingAPI/Events/EventArgsFarmerChanged.cs
index 699d90be..c34fc4ab 100644
--- a/src/StardewModdingAPI/Events/EventArgsFarmerChanged.cs
+++ b/src/StardewModdingAPI/Events/EventArgsFarmerChanged.cs
@@ -1,3 +1,4 @@
+#if !SMAPI_2_0
using System;
using SFarmer = StardewValley.Farmer;
@@ -29,3 +30,4 @@ namespace StardewModdingAPI.Events
}
}
}
+#endif \ No newline at end of file
diff --git a/src/StardewModdingAPI/Events/EventArgsInput.cs b/src/StardewModdingAPI/Events/EventArgsInput.cs
new file mode 100644
index 00000000..e5eb7372
--- /dev/null
+++ b/src/StardewModdingAPI/Events/EventArgsInput.cs
@@ -0,0 +1,126 @@
+#if SMAPI_2_0
+using System;
+using System.Linq;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Input;
+using StardewModdingAPI.Utilities;
+using StardewValley;
+
+namespace StardewModdingAPI.Events
+{
+ /// <summary>Event arguments when a button is pressed or released.</summary>
+ public class EventArgsInput : EventArgs
+ {
+ /*********
+ ** Accessors
+ *********/
+ /// <summary>The button on the controller, keyboard, or mouse.</summary>
+ public SButton Button { get; }
+
+ /// <summary>The current cursor position.</summary>
+ public ICursorPosition Cursor { get; set; }
+
+ /// <summary>Whether the input is considered a 'click' by the game for enabling action.</summary>
+ public bool IsClick { get; }
+
+
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Construct an instance.</summary>
+ /// <param name="button">The button on the controller, keyboard, or mouse.</param>
+ /// <param name="cursor">The cursor position.</param>
+ /// <param name="isClick">Whether the input is considered a 'click' by the game for enabling action.</param>
+ public EventArgsInput(SButton button, ICursorPosition cursor, bool isClick)
+ {
+ this.Button = button;
+ this.Cursor = cursor;
+ this.IsClick = isClick;
+ }
+
+ /// <summary>Prevent the game from handling the vurrent button press. This doesn't prevent other mods from receiving the event.</summary>
+ public void SuppressButton()
+ {
+ this.SuppressButton(this.Button);
+ }
+
+ /// <summary>Prevent the game from handling a button press. This doesn't prevent other mods from receiving the event.</summary>
+ /// <param name="button">The button to suppress.</param>
+ public void SuppressButton(SButton button)
+ {
+ // keyboard
+ if (this.Button.TryGetKeyboard(out Keys key))
+ Game1.oldKBState = new KeyboardState(Game1.oldKBState.GetPressedKeys().Except(new[] { key }).ToArray());
+
+ // controller
+ else if (this.Button.TryGetController(out Buttons controllerButton))
+ {
+ var newState = GamePad.GetState(PlayerIndex.One);
+ var thumbsticks = Game1.oldPadState.ThumbSticks;
+ var triggers = Game1.oldPadState.Triggers;
+ var buttons = Game1.oldPadState.Buttons;
+ var dpad = Game1.oldPadState.DPad;
+
+ switch (controllerButton)
+ {
+ // d-pad
+ case Buttons.DPadDown:
+ dpad = new GamePadDPad(dpad.Up, newState.DPad.Down, dpad.Left, dpad.Right);
+ break;
+ case Buttons.DPadLeft:
+ dpad = new GamePadDPad(dpad.Up, dpad.Down, newState.DPad.Left, dpad.Right);
+ break;
+ case Buttons.DPadRight:
+ dpad = new GamePadDPad(dpad.Up, dpad.Down, dpad.Left, newState.DPad.Right);
+ break;
+ case Buttons.DPadUp:
+ dpad = new GamePadDPad(newState.DPad.Up, dpad.Down, dpad.Left, dpad.Right);
+ break;
+
+ // trigger
+ case Buttons.LeftTrigger:
+ triggers = new GamePadTriggers(newState.Triggers.Left, triggers.Right);
+ break;
+ case Buttons.RightTrigger:
+ triggers = new GamePadTriggers(triggers.Left, newState.Triggers.Right);
+ break;
+
+ // thumbstick
+ case Buttons.LeftThumbstickDown:
+ case Buttons.LeftThumbstickLeft:
+ case Buttons.LeftThumbstickRight:
+ case Buttons.LeftThumbstickUp:
+ thumbsticks = new GamePadThumbSticks(newState.ThumbSticks.Left, thumbsticks.Right);
+ break;
+ case Buttons.RightThumbstickDown:
+ case Buttons.RightThumbstickLeft:
+ case Buttons.RightThumbstickRight:
+ case Buttons.RightThumbstickUp:
+ thumbsticks = new GamePadThumbSticks(newState.ThumbSticks.Right, thumbsticks.Left);
+ break;
+
+ // buttons
+ default:
+ var mask =
+ (buttons.A == ButtonState.Pressed ? Buttons.A : 0)
+ | (buttons.B == ButtonState.Pressed ? Buttons.B : 0)
+ | (buttons.Back == ButtonState.Pressed ? Buttons.Back : 0)
+ | (buttons.BigButton == ButtonState.Pressed ? Buttons.BigButton : 0)
+ | (buttons.LeftShoulder == ButtonState.Pressed ? Buttons.LeftShoulder : 0)
+ | (buttons.LeftStick == ButtonState.Pressed ? Buttons.LeftStick : 0)
+ | (buttons.RightShoulder == ButtonState.Pressed ? Buttons.RightShoulder : 0)
+ | (buttons.RightStick == ButtonState.Pressed ? Buttons.RightStick : 0)
+ | (buttons.Start == ButtonState.Pressed ? Buttons.Start : 0)
+ | (buttons.X == ButtonState.Pressed ? Buttons.X : 0)
+ | (buttons.Y == ButtonState.Pressed ? Buttons.Y : 0);
+ mask = mask ^ controllerButton;
+ buttons = new GamePadButtons(mask);
+ break;
+ }
+
+ Game1.oldPadState = new GamePadState(thumbsticks, triggers, buttons, dpad);
+ }
+ }
+ }
+}
+#endif
diff --git a/src/StardewModdingAPI/Events/EventArgsLoadedGameChanged.cs b/src/StardewModdingAPI/Events/EventArgsLoadedGameChanged.cs
index 51d64016..d6fc4594 100644
--- a/src/StardewModdingAPI/Events/EventArgsLoadedGameChanged.cs
+++ b/src/StardewModdingAPI/Events/EventArgsLoadedGameChanged.cs
@@ -1,4 +1,5 @@
-using System;
+#if !SMAPI_2_0
+using System;
namespace StardewModdingAPI.Events
{
@@ -23,3 +24,4 @@ namespace StardewModdingAPI.Events
}
}
}