diff --git a/src/SMAPI/Constants.cs b/src/SMAPI/Constants.cs
index 89012a19..0cfac5e3 100644
--- a/src/SMAPI/Constants.cs
+++ b/src/SMAPI/Constants.cs
@@ -65,10 +65,10 @@ public static class Constants
public static ISemanticVersion ApiVersion { get; } = new Toolkit.SemanticVersion(EarlyConstants.RawApiVersion);
/// The minimum supported version of Stardew Valley.
- public static ISemanticVersion MinimumGameVersion { get; } = new GameVersion("1.6.14");
+ public static ISemanticVersion MinimumGameVersion { get; } = new GameVersion("1.6.16");
/// The minimum supported Stardew Valley build number, or null for any build of .
- public static int? MinimumGameBuild { get; } = null;
+ public static int? MinimumGameBuild { get; } = 25256;
/// The maximum supported version of Stardew Valley, if any.
public static ISemanticVersion? MaximumGameVersion { get; } = null;
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/ArgUtilityFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/ArgUtilityFacade.cs
index 27343059..82438be0 100644
--- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/ArgUtilityFacade.cs
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/ArgUtilityFacade.cs
@@ -6,7 +6,7 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6;
/// Maps Stardew Valley 1.5.6's methods to their newer form to avoid breaking older mods.
/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
-public class ArgUtilityFacade : IRewriteFacade
+public class ArgUtilityFacade_1_6 : IRewriteFacade
{
/*********
** Fields
@@ -19,108 +19,108 @@ public class ArgUtilityFacade : IRewriteFacade
** Public methods
*********/
/// Changed in Stardew Valley 1.6.9.
- public static bool TryGet(string[] array, int index, out string value, out string error, bool allowBlank = true)
+ public static bool TryGet(string[] array, int index, out string? value, out string? error, bool allowBlank = true)
{
- return ArgUtility.TryGet(array, index, out value, out error, allowBlank, ArgUtilityFacade.DefaultName);
+ return ArgUtility.TryGet(array, index, out value, out error, allowBlank, ArgUtilityFacade_1_6.DefaultName);
}
/// Changed in Stardew Valley 1.6.9.
- public static bool TryGetOptional(string[] array, int index, out string value, out string error, string? defaultValue = null, bool allowBlank = true)
+ public static bool TryGetOptional(string[] array, int index, out string? value, out string? error, string? defaultValue = null, bool allowBlank = true)
{
- return ArgUtility.TryGetOptional(array, index, out value, out error, defaultValue, allowBlank, ArgUtilityFacade.DefaultName);
+ return ArgUtility.TryGetOptional(array, index, out value, out error, defaultValue, allowBlank, ArgUtilityFacade_1_6.DefaultName);
}
/// Changed in Stardew Valley 1.6.9.
- public static bool TryGetBool(string[] array, int index, out bool value, out string error)
+ public static bool TryGetBool(string[] array, int index, out bool value, out string? error)
{
- return ArgUtility.TryGetBool(array, index, out value, out error, ArgUtilityFacade.DefaultName);
+ return ArgUtility.TryGetBool(array, index, out value, out error, ArgUtilityFacade_1_6.DefaultName);
}
/// Changed in Stardew Valley 1.6.9.
- public static bool TryGetOptionalBool(string[] array, int index, out bool value, out string error, bool defaultValue = false)
+ public static bool TryGetOptionalBool(string[] array, int index, out bool value, out string? error, bool defaultValue = false)
{
- return ArgUtility.TryGetOptionalBool(array, index, out value, out error, defaultValue, ArgUtilityFacade.DefaultName);
+ return ArgUtility.TryGetOptionalBool(array, index, out value, out error, defaultValue, ArgUtilityFacade_1_6.DefaultName);
}
/// Changed in Stardew Valley 1.6.9.
- public static bool TryGetDirection(string[] array, int index, out int value, out string error)
+ public static bool TryGetDirection(string[] array, int index, out int value, out string? error)
{
- return ArgUtility.TryGetDirection(array, index, out value, out error, ArgUtilityFacade.DefaultName);
+ return ArgUtility.TryGetDirection(array, index, out value, out error, ArgUtilityFacade_1_6.DefaultName);
}
/// Changed in Stardew Valley 1.6.9.
- public static bool TryGetOptionalDirection(string[] array, int index, out int value, out string error, int defaultValue = Game1.up)
+ public static bool TryGetOptionalDirection(string[] array, int index, out int value, out string? error, int defaultValue = Game1.up)
{
- return ArgUtility.TryGetOptionalDirection(array, index, out value, out error, defaultValue, ArgUtilityFacade.DefaultName);
+ return ArgUtility.TryGetOptionalDirection(array, index, out value, out error, defaultValue, ArgUtilityFacade_1_6.DefaultName);
}
/// Changed in Stardew Valley 1.6.9.
- public static bool TryGetEnum(string[] array, int index, out TEnum value, out string error)
+ public static bool TryGetEnum(string[] array, int index, out TEnum value, out string? error)
where TEnum : struct
{
- return ArgUtility.TryGetEnum(array, index, out value, out error, ArgUtilityFacade.DefaultName);
+ return ArgUtility.TryGetEnum(array, index, out value, out error, ArgUtilityFacade_1_6.DefaultName);
}
/// Changed in Stardew Valley 1.6.9.
- public static bool TryGetOptionalEnum(string[] array, int index, out TEnum value, out string error, TEnum defaultValue = default)
+ public static bool TryGetOptionalEnum(string[] array, int index, out TEnum value, out string? error, TEnum defaultValue = default)
where TEnum : struct
{
- return ArgUtility.TryGetOptionalEnum(array, index, out value, out error, defaultValue, ArgUtilityFacade.DefaultName);
+ return ArgUtility.TryGetOptionalEnum(array, index, out value, out error, defaultValue, ArgUtilityFacade_1_6.DefaultName);
}
/// Changed in Stardew Valley 1.6.9.
- public static bool TryGetFloat(string[] array, int index, out float value, out string error)
+ public static bool TryGetFloat(string[] array, int index, out float value, out string? error)
{
- return ArgUtility.TryGetFloat(array, index, out value, out error, ArgUtilityFacade.DefaultName);
+ return ArgUtility.TryGetFloat(array, index, out value, out error, ArgUtilityFacade_1_6.DefaultName);
}
/// Changed in Stardew Valley 1.6.9.
- public static bool TryGetOptionalFloat(string[] array, int index, out float value, out string error, float defaultValue = 0)
+ public static bool TryGetOptionalFloat(string[] array, int index, out float value, out string? error, float defaultValue = 0)
{
- return ArgUtility.TryGetOptionalFloat(array, index, out value, out error, defaultValue, ArgUtilityFacade.DefaultName);
+ return ArgUtility.TryGetOptionalFloat(array, index, out value, out error, defaultValue, ArgUtilityFacade_1_6.DefaultName);
}
/// Changed in Stardew Valley 1.6.9.
- public static bool TryGetInt(string[] array, int index, out int value, out string error)
+ public static bool TryGetInt(string[] array, int index, out int value, out string? error)
{
- return ArgUtility.TryGetInt(array, index, out value, out error, ArgUtilityFacade.DefaultName);
+ return ArgUtility.TryGetInt(array, index, out value, out error, ArgUtilityFacade_1_6.DefaultName);
}
/// Changed in Stardew Valley 1.6.9.
- public static bool TryGetOptionalInt(string[] array, int index, out int value, out string error, int defaultValue = 0)
+ public static bool TryGetOptionalInt(string[] array, int index, out int value, out string? error, int defaultValue = 0)
{
- return ArgUtility.TryGetOptionalInt(array, index, out value, out error, defaultValue, ArgUtilityFacade.DefaultName);
+ return ArgUtility.TryGetOptionalInt(array, index, out value, out error, defaultValue, ArgUtilityFacade_1_6.DefaultName);
}
/// Changed in Stardew Valley 1.6.9.
- public static bool TryGetPoint(string[] array, int index, out Point value, out string error)
+ public static bool TryGetPoint(string[] array, int index, out Point value, out string? error)
{
- return ArgUtility.TryGetPoint(array, index, out value, out error, ArgUtilityFacade.DefaultName);
+ return ArgUtility.TryGetPoint(array, index, out value, out error, ArgUtilityFacade_1_6.DefaultName);
}
/// Changed in Stardew Valley 1.6.9.
- public static bool TryGetRectangle(string[] array, int index, out Rectangle value, out string error)
+ public static bool TryGetRectangle(string[] array, int index, out Rectangle value, out string? error)
{
- return ArgUtility.TryGetRectangle(array, index, out value, out error, ArgUtilityFacade.DefaultName);
+ return ArgUtility.TryGetRectangle(array, index, out value, out error, ArgUtilityFacade_1_6.DefaultName);
}
/// Changed in Stardew Valley 1.6.9.
- public static bool TryGetVector2(string[] array, int index, out Vector2 value, out string error, bool integerOnly = false)
+ public static bool TryGetVector2(string[] array, int index, out Vector2 value, out string? error, bool integerOnly = false)
{
- return ArgUtility.TryGetVector2(array, index, out value, out error, integerOnly, ArgUtilityFacade.DefaultName);
+ return ArgUtility.TryGetVector2(array, index, out value, out error, integerOnly, ArgUtilityFacade_1_6.DefaultName);
}
/// Changed in Stardew Valley 1.6.9.
- public static bool TryGetRemainder(string[] array, int index, out string value, out string error, char delimiter = ' ')
+ public static bool TryGetRemainder(string[] array, int index, out string? value, out string? error, char delimiter = ' ')
{
- return ArgUtility.TryGetRemainder(array, index, out value, out error, delimiter, ArgUtilityFacade.DefaultName);
+ return ArgUtility.TryGetRemainder(array, index, out value, out error, delimiter, ArgUtilityFacade_1_6.DefaultName);
}
/*********
** Private methods
*********/
- private ArgUtilityFacade()
+ private ArgUtilityFacade_1_6()
{
RewriteHelper.ThrowFakeConstructorCalled();
}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/BuffFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/BuffFacade.cs
index 009cada6..b476b6f9 100644
--- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/BuffFacade.cs
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/BuffFacade.cs
@@ -34,7 +34,7 @@ public class BuffFacade : Buff, IRewriteFacade
public void addBuff()
{
- Game1.player.buffs.Apply(this);
+ Game1.player.buffs.ApplyLocal(this);
}
public void removeBuff()
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/BushFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/BushFacade.cs
index 6bebafae..92ee2a8c 100644
--- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/BushFacade.cs
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/BushFacade.cs
@@ -7,14 +7,17 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6;
/// Maps Stardew Valley 1.5.6's methods to their newer form to avoid breaking older mods.
/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
-public class BushFacade : Bush, IRewriteFacade
+public class BushFacade_1_6 : Bush, IRewriteFacade
{
/*********
** Public methods
*********/
public void draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch, Vector2 tileLocation, float yDrawOffset)
{
- base.draw(spriteBatch, yDrawOffset);
+ if (this.drawOffset.Y != yDrawOffset)
+ this.drawOffset = new Point(this.drawOffset.X, this.drawOffset.Y);
+
+ base.draw(spriteBatch);
}
public void draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch, Vector2 tileLocation)
@@ -59,7 +62,7 @@ public class BushFacade : Bush, IRewriteFacade
/*********
** Private methods
*********/
- private BushFacade()
+ private BushFacade_1_6()
{
RewriteHelper.ThrowFakeConstructorCalled();
}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/DialogueFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/DialogueFacade.cs
index a27accbb..0bb16971 100644
--- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/DialogueFacade.cs
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/DialogueFacade.cs
@@ -5,7 +5,7 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6;
/// Maps Stardew Valley 1.5.6's methods to their newer form to avoid breaking older mods.
/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
-public class DialogueFacade : Dialogue, IRewriteFacade
+public class DialogueFacade_1_6 : Dialogue, IRewriteFacade
{
/*********
** Public methods
@@ -19,7 +19,7 @@ public class DialogueFacade : Dialogue, IRewriteFacade
/*********
** Private methods
*********/
- private DialogueFacade()
+ private DialogueFacade_1_6()
: base(null, null)
{
RewriteHelper.ThrowFakeConstructorCalled();
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/FarmerFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/FarmerFacade.cs
index ee6fbeed..477e0a1f 100644
--- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/FarmerFacade.cs
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/FarmerFacade.cs
@@ -10,7 +10,7 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6;
/// Maps Stardew Valley 1.5.6's methods to their newer form to avoid breaking older mods.
/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
-public class FarmerFacade : Farmer, IRewriteFacade
+public class FarmerFacade_1_6 : Farmer, IRewriteFacade
{
/*********
** Accessors
@@ -285,11 +285,10 @@ public class FarmerFacade : Farmer, IRewriteFacade
}
-
/*********
** Private methods
*********/
- private FarmerFacade()
+ private FarmerFacade_1_6()
{
RewriteHelper.ThrowFakeConstructorCalled();
}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/ForestFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/ForestFacade.cs
index 3b01dfba..06be04a2 100644
--- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/ForestFacade.cs
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/ForestFacade.cs
@@ -6,7 +6,7 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6;
/// Maps Stardew Valley 1.5.6's methods to their newer form to avoid breaking older mods.
/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
-public class ForestFacade : Forest, IRewriteFacade
+public class ForestFacade_1_6 : Forest, IRewriteFacade
{
/*********
** Accessors
@@ -40,7 +40,7 @@ public class ForestFacade : Forest, IRewriteFacade
/*********
** Private methods
*********/
- private ForestFacade()
+ private ForestFacade_1_6()
{
RewriteHelper.ThrowFakeConstructorCalled();
}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Game1Facade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Game1Facade.cs
index 4b11c202..023f28d1 100644
--- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Game1Facade.cs
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Game1Facade.cs
@@ -9,7 +9,7 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6;
/// Maps Stardew Valley 1.5.6's methods to their newer form to avoid breaking older mods.
/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
-public class Game1Facade : Game1, IRewriteFacade
+public class Game1Facade_1_6 : Game1, IRewriteFacade
{
/*********
** Accessors
@@ -179,7 +179,7 @@ public class Game1Facade : Game1, IRewriteFacade
/*********
** Private methods
*********/
- private Game1Facade()
+ private Game1Facade_1_6()
{
RewriteHelper.ThrowFakeConstructorCalled();
}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/GameLocationFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/GameLocationFacade.cs
index f7545f98..52e97ec5 100644
--- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/GameLocationFacade.cs
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/GameLocationFacade.cs
@@ -48,7 +48,7 @@ public class GameLocationFacade : GameLocation, IRewriteFacade
}
/// Changed in Stardew Valley 1.6.9.
- public LightSource getLightSource(int identifier)
+ public LightSource? getLightSource(int identifier)
{
return base.getLightSource(identifier.ToString());
}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Internal/NetRefWrapperCache.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Internal/NetRefWrapperCache.cs
index 6ad67457..f9e166cb 100644
--- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Internal/NetRefWrapperCache.cs
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Internal/NetRefWrapperCache.cs
@@ -20,7 +20,7 @@ internal static class NetRefWrapperCache
*********/
/// Get a wrapper for a given value.
/// The value to wrap.
- public static NetRef GetCachedWrapperFor(T value)
+ public static NetRef GetCachedWrapperFor(T? value)
{
if (value is null)
throw new InvalidOperationException($"{nameof(NetRefWrapperCache)} doesn't support wrapping null values.");
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/LocalizedContentManagerFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/LocalizedContentManagerFacade.cs
index 0b749fb9..b5ede96b 100644
--- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/LocalizedContentManagerFacade.cs
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/LocalizedContentManagerFacade.cs
@@ -5,7 +5,7 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6;
/// Maps Stardew Valley 1.5.6's methods to their newer form to avoid breaking older mods.
/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
-public class LocalizedContentManagerFacade : LocalizedContentManager, IRewriteFacade
+public class LocalizedContentManagerFacade_1_6 : LocalizedContentManager, IRewriteFacade
{
/*********
** Public methods
@@ -19,7 +19,7 @@ public class LocalizedContentManagerFacade : LocalizedContentManager, IRewriteFa
/*********
** Private methods
*********/
- private LocalizedContentManagerFacade()
+ private LocalizedContentManagerFacade_1_6()
: base(null, null)
{
RewriteHelper.ThrowFakeConstructorCalled();
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/NpcFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/NpcFacade.cs
index 88bed113..c2d263d2 100644
--- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/NpcFacade.cs
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/NpcFacade.cs
@@ -10,7 +10,7 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6;
/// Maps Stardew Valley 1.5.6's methods to their newer form to avoid breaking older mods.
/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
-public abstract class NpcFacade : NPC, IRewriteFacade
+public abstract class NpcFacade_1_6 : NPC, IRewriteFacade
{
/*********
** Accessors
@@ -33,7 +33,7 @@ public abstract class NpcFacade : NPC, IRewriteFacade
*********/
public static NPC Constructor(AnimatedSprite sprite, Vector2 position, string defaultMap, int facingDirection, string name, bool datable, Dictionary schedule, Texture2D portrait)
{
- return new NPC(sprite, position, defaultMap, facingDirection, name, datable, portrait);
+ return new NPC(sprite, position, defaultMap, facingDirection, name, portrait);
}
public static NPC Constructor(AnimatedSprite sprite, Vector2 position, string defaultMap, int facingDir, string name, Dictionary schedule, Texture2D portrait, bool eventActor, string? syncedPortraitPath = null)
@@ -58,7 +58,8 @@ public abstract class NpcFacade : NPC, IRewriteFacade
// else replicate old behavior
return
base.Birthday_Season != null
- && base.Birthday_Season == season
+ && Utility.TryParseEnum(season, out Season parsedSeason)
+ && base.Birthday_Season.Value == parsedSeason
&& base.Birthday_Day == day;
}
@@ -67,7 +68,7 @@ public abstract class NpcFacade : NPC, IRewriteFacade
WarpPathfindingCache.PopulateCache();
}
- public void showTextAboveHead(string Text, int spriteTextColor = -1, int style = NPC.textStyle_none, int duration = 3000, int preTimer = 0)
+ public void showTextAboveHead(string Text, int spriteTextColor = -1, int style = SpeechBubble.textStyle_none, int duration = 3000, int preTimer = 0)
{
Color? color = spriteTextColor != -1 ? SpriteText.getColorFromIndex(spriteTextColor) : null;
base.showTextAboveHead(Text, color, style, duration, preTimer);
@@ -77,7 +78,7 @@ public abstract class NpcFacade : NPC, IRewriteFacade
/*********
** Private methods
*********/
- private NpcFacade()
+ private NpcFacade_1_6()
{
RewriteHelper.ThrowFakeConstructorCalled();
}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Stats_160_Facade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Stats_160_Facade.cs
index ed4d652a..1b1e6728 100644
--- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Stats_160_Facade.cs
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/Stats_160_Facade.cs
@@ -31,7 +31,7 @@ public class Stats_160_Facade : Stats, IRewriteFacade
public uint averageBedtime
{
get => base.AverageBedtime;
- set => base.AverageBedtime = value;
+ set => base.OnWentToBed((int)value);
}
public uint beveragesMade
@@ -40,12 +40,6 @@ public class Stats_160_Facade : Stats, IRewriteFacade
set => base.BeveragesMade = value;
}
- public uint caveCarrotsFound
- {
- get => base.CaveCarrotsFound;
- set => base.CaveCarrotsFound = value;
- }
-
public uint cheeseMade
{
get => base.CheeseMade;
@@ -256,12 +250,6 @@ public class Stats_160_Facade : Stats, IRewriteFacade
set => base.SheepWoolProduced = value;
}
- public uint slimesKilled
- {
- get => base.SlimesKilled;
- set => base.SlimesKilled = value;
- }
-
public uint stepsTaken
{
get => base.StepsTaken;
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/UtilityFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/UtilityFacade.cs
index 4c63ec7f..29864b6c 100644
--- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/UtilityFacade.cs
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/UtilityFacade.cs
@@ -72,7 +72,7 @@ public class UtilityFacade : Utility, IRewriteFacade
yield return 3;
}
- public static T GetRandom(List list, Random? random = null)
+ public static T? GetRandom(List list, Random? random = null)
{
return (random ?? Game1.random).ChooseFrom(list);
}
@@ -85,13 +85,17 @@ public class UtilityFacade : Utility, IRewriteFacade
// else replicate old behavior
NPC? found = null;
- Utility.ForEachCharacter(npc =>
+ if (Utility.TryParseEnum(season, out Season parsedSeason))
{
- if (npc.birthday_Season.Value == season && npc.birthday_Day.Value == day)
- found = npc;
+ Utility.ForEachCharacter(npc =>
+ {
+ if (npc.Birthday_Season == parsedSeason && npc.Birthday_Day == day)
+ found = npc;
+
+ return found is null;
+ });
+ }
- return found is null;
- });
return found;
}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/WallpaperFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/WallpaperFacade.cs
index 1cf71c33..7f682172 100644
--- a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/WallpaperFacade.cs
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6/WallpaperFacade.cs
@@ -1,5 +1,6 @@
using Netcode;
using StardewModdingAPI.Framework.ModLoading.Framework;
+using StardewValley;
using StardewValley.GameData;
using StardewValley.Objects;
@@ -18,9 +19,9 @@ public class WallpaperFacade : Wallpaper, IRewriteFacade
/*********
** Public methods
*********/
- public virtual ModWallpaperOrFlooring GetModData()
+ public virtual ModWallpaperOrFlooring? GetModData()
{
- return base.GetSetData();
+ return ItemRegistry.GetData(base.QualifiedItemId)?.RawData as ModWallpaperOrFlooring;
}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/AnimatedSpriteFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/AnimatedSpriteFacade.cs
new file mode 100644
index 00000000..3e601fed
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/AnimatedSpriteFacade.cs
@@ -0,0 +1,26 @@
+using StardewModdingAPI.Framework.ModLoading.Framework;
+using StardewValley;
+
+namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16;
+
+/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods.
+/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
+public class AnimatedSpriteFacade : AnimatedSprite, IRewriteFacade
+{
+ /*********
+ ** Public methods
+ *********/
+ public new void LoadTexture(string textureName, bool syncTextureName = true)
+ {
+ base.LoadTexture(textureName, syncTextureName);
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ private AnimatedSpriteFacade()
+ {
+ RewriteHelper.ThrowFakeConstructorCalled();
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ArgUtilityFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ArgUtilityFacade.cs
new file mode 100644
index 00000000..31c1d925
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ArgUtilityFacade.cs
@@ -0,0 +1,17 @@
+using StardewValley;
+
+namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16;
+
+/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods.
+/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
+public class ArgUtilityFacade_1_6_16 : IRewriteFacade
+{
+ /*********
+ ** Public methods
+ *********/
+ public static bool TryGetOptionalRemainder(string[]? array, int index, out string? value, string? defaultValue = null, char delimiter = ' ')
+ {
+ value = ArgUtility.GetRemainder(array, index, defaultValue, delimiter);
+ return true;
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/BuffManagerFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/BuffManagerFacade.cs
new file mode 100644
index 00000000..f32aa1f7
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/BuffManagerFacade.cs
@@ -0,0 +1,27 @@
+using StardewModdingAPI.Framework.ModLoading.Framework;
+using StardewValley;
+using StardewValley.Buffs;
+
+namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16;
+
+/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods.
+/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
+public class BuffManagerFacade : BuffManager, IRewriteFacade
+{
+ /*********
+ ** Public methods
+ *********/
+ public void Apply(Buff buff)
+ {
+ base.ApplyLocal(buff);
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ private BuffManagerFacade()
+ {
+ RewriteHelper.ThrowFakeConstructorCalled();
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/BushFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/BushFacade.cs
new file mode 100644
index 00000000..10ae54b8
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/BushFacade.cs
@@ -0,0 +1,31 @@
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using StardewModdingAPI.Framework.ModLoading.Framework;
+using StardewValley.TerrainFeatures;
+
+namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16;
+
+/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods.
+/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
+public class BushFacade_1_6_16 : Bush, IRewriteFacade
+{
+ /*********
+ ** Public methods
+ *********/
+ public void draw(SpriteBatch spriteBatch, float yDrawOffset)
+ {
+ if (this.drawOffset.Y != yDrawOffset)
+ this.drawOffset = new Point(this.drawOffset.X, this.drawOffset.Y);
+
+ base.draw(spriteBatch);
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ private BushFacade_1_6_16()
+ {
+ RewriteHelper.ThrowFakeConstructorCalled();
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/DataLoaderFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/DataLoaderFacade.cs
new file mode 100644
index 00000000..6fd821ae
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/DataLoaderFacade.cs
@@ -0,0 +1,488 @@
+using System.Collections.Generic;
+using StardewModdingAPI.Framework.ModLoading.Framework;
+using StardewValley;
+using StardewValley.ContentManagement;
+using StardewValley.GameData;
+using StardewValley.GameData.BigCraftables;
+using StardewValley.GameData.Buffs;
+using StardewValley.GameData.Buildings;
+using StardewValley.GameData.Bundles;
+using StardewValley.GameData.Characters;
+using StardewValley.GameData.Crafting;
+using StardewValley.GameData.Crops;
+using StardewValley.GameData.FarmAnimals;
+using StardewValley.GameData.Fences;
+using StardewValley.GameData.FishPonds;
+using StardewValley.GameData.FloorsAndPaths;
+using StardewValley.GameData.FruitTrees;
+using StardewValley.GameData.GarbageCans;
+using StardewValley.GameData.GiantCrops;
+using StardewValley.GameData.HomeRenovations;
+using StardewValley.GameData.LocationContexts;
+using StardewValley.GameData.Locations;
+using StardewValley.GameData.Machines;
+using StardewValley.GameData.MakeoverOutfits;
+using StardewValley.GameData.Minecarts;
+using StardewValley.GameData.Movies;
+using StardewValley.GameData.Museum;
+using StardewValley.GameData.Objects;
+using StardewValley.GameData.Pants;
+using StardewValley.GameData.Pets;
+using StardewValley.GameData.Powers;
+using StardewValley.GameData.Shirts;
+using StardewValley.GameData.Shops;
+using StardewValley.GameData.SpecialOrders;
+using StardewValley.GameData.Tools;
+using StardewValley.GameData.Weapons;
+using StardewValley.GameData.Weddings;
+using StardewValley.GameData.WildTrees;
+using StardewValley.GameData.WorldMaps;
+
+namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16;
+
+/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods.
+/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
+public class DataLoaderFacade : IRewriteFacade
+{
+ /*********
+ ** Public methods
+ *********/
+ // return type changed too, which is a breaking change we can't easily rewrite
+ /////
+ //public static Dictionary Achievements(LocalizedContentManager content)
+ //{
+ // return DataLoader.Achievements(content);
+ //}
+
+ ///
+ public static List AdditionalFarms(LocalizedContentManager content)
+ {
+ return DataLoader.AdditionalFarms(content);
+ }
+
+ ///
+ public static List AdditionalLanguages(LocalizedContentManager content)
+ {
+ return DataLoader.AdditionalLanguages(content);
+ }
+
+ ///
+ public static List AdditionalWallpaperFlooring(LocalizedContentManager content)
+ {
+ return DataLoader.AdditionalWallpaperFlooring(content);
+ }
+
+ ///
+ public static Dictionary AnimationDescriptions(LocalizedContentManager content)
+ {
+ return DataLoader.AnimationDescriptions(content);
+ }
+
+ ///
+ public static Dictionary AquariumFish(LocalizedContentManager content)
+ {
+ return DataLoader.AquariumFish(content);
+ }
+
+ ///
+ public static Dictionary AudioChanges(LocalizedContentManager content)
+ {
+ return DataLoader.AudioChanges(content);
+ }
+
+ ///
+ public static Dictionary BigCraftables(LocalizedContentManager content)
+ {
+ return DataLoader.BigCraftables(content);
+ }
+
+ ///
+ public static Dictionary Boots(LocalizedContentManager content)
+ {
+ return DataLoader.Boots(content);
+ }
+
+ ///
+ public static Dictionary Buffs(LocalizedContentManager content)
+ {
+ return DataLoader.Buffs(content);
+ }
+
+ ///
+ public static Dictionary Buildings(LocalizedContentManager content)
+ {
+ return DataLoader.Buildings(content);
+ }
+
+ ///
+ public static Dictionary Bundles(LocalizedContentManager content)
+ {
+ return DataLoader.Bundles(content);
+ }
+
+ ///
+ public static Dictionary ChairTiles(LocalizedContentManager content)
+ {
+ return DataLoader.ChairTiles(content);
+ }
+
+ ///
+ public static Dictionary Characters(LocalizedContentManager content)
+ {
+ return DataLoader.Characters(content);
+ }
+
+ ///
+ public static List Concessions(LocalizedContentManager content)
+ {
+ return DataLoader.Concessions(content);
+ }
+
+ ///
+ public static List ConcessionTastes(LocalizedContentManager content)
+ {
+ return DataLoader.ConcessionTastes(content);
+ }
+
+ ///
+ public static Dictionary CookingRecipes(LocalizedContentManager content)
+ {
+ return DataLoader.CookingRecipes(content);
+ }
+
+ ///
+ public static Dictionary CraftingRecipes(LocalizedContentManager content)
+ {
+ return DataLoader.CraftingRecipes(content);
+ }
+
+ ///
+ public static Dictionary Crops(LocalizedContentManager content)
+ {
+ return DataLoader.Crops(content);
+ }
+
+ ///
+ public static List LostItemsShop(LocalizedContentManager content)
+ {
+ return DataLoader.LostItemsShop(content);
+ }
+
+ ///
+ public static Dictionary EngagementDialogue(LocalizedContentManager content)
+ {
+ return DataLoader.EngagementDialogue(content);
+ }
+
+ ///
+ public static Dictionary FarmAnimals(LocalizedContentManager content)
+ {
+ return DataLoader.FarmAnimals(content);
+ }
+
+ ///
+ public static Dictionary Fences(LocalizedContentManager content)
+ {
+ return DataLoader.Fences(content);
+ }
+
+ ///
+ public static Dictionary Festivals_FestivalDates(LocalizedContentManager content)
+ {
+ return DataLoader.Festivals_FestivalDates(content);
+ }
+
+ ///
+ public static Dictionary Fish(LocalizedContentManager content)
+ {
+ return DataLoader.Fish(content);
+ }
+
+ ///
+ public static List FishPondData(LocalizedContentManager content)
+ {
+ return DataLoader.FishPondData(content);
+ }
+
+ ///
+ public static Dictionary FloorsAndPaths(LocalizedContentManager content)
+ {
+ return DataLoader.FloorsAndPaths(content);
+ }
+
+ ///
+ public static Dictionary FruitTrees(LocalizedContentManager content)
+ {
+ return DataLoader.FruitTrees(content);
+ }
+
+ ///
+ public static Dictionary Furniture(LocalizedContentManager content)
+ {
+ return DataLoader.Furniture(content);
+ }
+
+ ///
+ public static GarbageCanData GarbageCans(LocalizedContentManager content)
+ {
+ return DataLoader.GarbageCans(content);
+ }
+
+ ///
+ public static Dictionary GiantCrops(LocalizedContentManager content)
+ {
+ return DataLoader.GiantCrops(content);
+ }
+
+ ///
+ public static Dictionary HairData(LocalizedContentManager content)
+ {
+ return DataLoader.HairData(content);
+ }
+
+ ///
+ public static Dictionary Hats(LocalizedContentManager content)
+ {
+ return DataLoader.Hats(content);
+ }
+
+ ///
+ public static Dictionary HomeRenovations(LocalizedContentManager content)
+ {
+ return DataLoader.HomeRenovations(content);
+ }
+
+ ///
+ public static Dictionary IncomingPhoneCalls(LocalizedContentManager content)
+ {
+ return DataLoader.IncomingPhoneCalls(content);
+ }
+
+ ///
+ public static Dictionary JukeboxTracks(LocalizedContentManager content)
+ {
+ return DataLoader.JukeboxTracks(content);
+ }
+
+ ///
+ public static Dictionary LocationContexts(LocalizedContentManager content)
+ {
+ return DataLoader.LocationContexts(content);
+ }
+
+ ///
+ public static Dictionary Locations(LocalizedContentManager content)
+ {
+ return DataLoader.Locations(content);
+ }
+
+ ///
+ public static Dictionary Machines(LocalizedContentManager content)
+ {
+ return DataLoader.Machines(content);
+ }
+
+ ///
+ public static Dictionary Mail(LocalizedContentManager content)
+ {
+ return DataLoader.Mail(content);
+ }
+
+ ///
+ public static List MakeoverOutfits(LocalizedContentManager content)
+ {
+ return content.Load>("Data/MakeoverOutfits");
+ }
+
+ ///
+ public static Dictionary Mannequins(LocalizedContentManager content)
+ {
+ return content.Load>("Data/Mannequins");
+ }
+
+ ///
+ public static Dictionary Minecarts(LocalizedContentManager content)
+ {
+ return DataLoader.Minecarts(content);
+ }
+
+ ///
+ public static Dictionary Monsters(LocalizedContentManager content)
+ {
+ return DataLoader.Monsters(content);
+ }
+
+ ///
+ public static Dictionary MonsterSlayerQuests(LocalizedContentManager content)
+ {
+ return DataLoader.MonsterSlayerQuests(content);
+ }
+
+ ///
+ public static List Movies(LocalizedContentManager content)
+ {
+ return DataLoader.Movies(content);
+ }
+
+ ///
+ public static List MoviesReactions(LocalizedContentManager content)
+ {
+ return DataLoader.MoviesReactions(content);
+ }
+
+ ///
+ public static Dictionary MuseumRewards(LocalizedContentManager content)
+ {
+ return DataLoader.MuseumRewards(content);
+ }
+
+ ///
+ public static Dictionary NpcGiftTastes(LocalizedContentManager content)
+ {
+ return DataLoader.NpcGiftTastes(content);
+ }
+
+ ///
+ public static Dictionary Objects(LocalizedContentManager content)
+ {
+ return DataLoader.Objects(content);
+ }
+
+ ///
+ public static Dictionary PaintData(LocalizedContentManager content)
+ {
+ return DataLoader.PaintData(content);
+ }
+
+ ///
+ public static Dictionary Pants(LocalizedContentManager content)
+ {
+ return DataLoader.Pants(content);
+ }
+
+ ///
+ public static Dictionary PassiveFestivals(LocalizedContentManager content)
+ {
+ return DataLoader.PassiveFestivals(content);
+ }
+
+ ///
+ public static Dictionary Pets(LocalizedContentManager content)
+ {
+ return DataLoader.Pets(content);
+ }
+
+ ///
+ public static Dictionary Powers(LocalizedContentManager content)
+ {
+ return content.Load>("Data/Powers");
+ }
+
+ ///
+ public static Dictionary Quests(LocalizedContentManager content)
+ {
+ return DataLoader.Quests(content);
+ }
+
+ ///
+ public static List RandomBundles(LocalizedContentManager content)
+ {
+ return DataLoader.RandomBundles(content);
+ }
+
+ ///
+ public static Dictionary SecretNotes(LocalizedContentManager content)
+ {
+ return DataLoader.SecretNotes(content);
+ }
+
+ ///
+ public static Dictionary Shirts(LocalizedContentManager content)
+ {
+ return DataLoader.Shirts(content);
+ }
+
+ ///
+ public static Dictionary Shops(LocalizedContentManager content)
+ {
+ return DataLoader.Shops(content);
+ }
+
+ ///
+ public static Dictionary SpecialOrders(LocalizedContentManager content)
+ {
+ return DataLoader.SpecialOrders(content);
+ }
+
+ ///
+ public static List TailoringRecipes(LocalizedContentManager content)
+ {
+ return DataLoader.TailoringRecipes(content);
+ }
+
+ ///
+ public static Dictionary Tools(LocalizedContentManager content)
+ {
+ return DataLoader.Tools(content);
+ }
+
+ ///
+ public static List TriggerActions(LocalizedContentManager content)
+ {
+ return DataLoader.TriggerActions(content);
+ }
+
+ ///
+ public static Dictionary Trinkets(LocalizedContentManager content)
+ {
+ return content.Load>("Data/Trinkets");
+ }
+
+ ///
+ public static Dictionary Weapons(LocalizedContentManager content)
+ {
+ return DataLoader.Weapons(content);
+ }
+
+ ///
+ public static WeddingData Weddings(LocalizedContentManager content)
+ {
+ return DataLoader.Weddings(content);
+ }
+
+ ///
+ public static Dictionary WildTrees(LocalizedContentManager content)
+ {
+ return DataLoader.WildTrees(content);
+ }
+
+ ///
+ public static Dictionary WorldMap(LocalizedContentManager content)
+ {
+ return DataLoader.WorldMap(content);
+ }
+
+ /****
+ ** TV assets
+ ****/
+ ///
+ public static Dictionary Tv_CookingChannel(LocalizedContentManager content)
+ {
+ return DataLoader.Tv_CookingChannel(content);
+ }
+
+ ///
+ public static Dictionary Tv_TipChannel(LocalizedContentManager content)
+ {
+ return DataLoader.Tv_TipChannel(content);
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ private DataLoaderFacade()
+ {
+ RewriteHelper.ThrowFakeConstructorCalled();
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/FarmerFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/FarmerFacade.cs
new file mode 100644
index 00000000..d4aac5c4
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/FarmerFacade.cs
@@ -0,0 +1,54 @@
+using StardewModdingAPI.Framework.ModLoading.Framework;
+using StardewValley;
+using StardewValley.Inventories;
+using StardewValley.Objects;
+
+namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16;
+
+/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods.
+/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
+public class FarmerFacade_1_6_16 : Farmer, IRewriteFacade
+{
+ /*********
+ ** Public methods
+ *********/
+ public bool addItemToInventoryBool(Item? item, bool makeActiveObject = false)
+ {
+ if (item is null || !this.IsLocalPlayer)
+ return false;
+
+ AddToInventoryResult result = base.TryAddToInventory(item);
+
+ if (makeActiveObject && result.AnyAdded && item is not SpecialItem && result.Remainder != null && item.Stack <= 1)
+ {
+ int newItemPosition = this.getIndexOfInventoryItem(item);
+ if (newItemPosition > -1)
+ (this.Items[this.CurrentToolIndex], this.Items[newItemPosition]) = (this.Items[newItemPosition], this.Items[this.CurrentToolIndex]); // swap into active position
+ }
+
+ return result.AnyAdded;
+ }
+
+ public void applyBuff(Buff buff)
+ {
+ base.applyLocalBuff(buff);
+ }
+
+ public void dropItem(Item? i)
+ {
+ if (i is null || !i.canBeDropped())
+ return;
+
+
+ this.DropItemAtFeet(i, direction: this.FacingDirection);
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ private FarmerFacade_1_6_16()
+ {
+ RewriteHelper.ThrowFakeConstructorCalled();
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ForestFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ForestFacade.cs
new file mode 100644
index 00000000..5bca037d
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ForestFacade.cs
@@ -0,0 +1,28 @@
+using StardewModdingAPI.Framework.ModLoading.Framework;
+using StardewValley;
+using StardewValley.Locations;
+using StardewValley.TerrainFeatures;
+
+namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16;
+
+/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods.
+/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
+public class ForestFacade_1_6_16 : Forest, IRewriteFacade
+{
+ /*********
+ ** Public methods
+ *********/
+ public bool ShouldTravelingMerchantVisitToday()
+ {
+ return Forest.ShouldTravelingMerchantVisit(Game1.Date);
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ private ForestFacade_1_6_16()
+ {
+ RewriteHelper.ThrowFakeConstructorCalled();
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/Game1Facade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/Game1Facade.cs
new file mode 100644
index 00000000..d49247f5
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/Game1Facade.cs
@@ -0,0 +1,26 @@
+using StardewModdingAPI.Framework.ModLoading.Framework;
+using StardewValley;
+using StardewValley.ContentManagement;
+
+namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16;
+
+/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods.
+/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
+public class Game1Facade_1_6_16 : Game1, IRewriteFacade
+{
+ /*********
+ ** Accessors
+ *********/
+ public new static LocalizedContentManager content => (LocalizedContentManager)Game1.content;
+ public new static LocalizedContentManager temporaryContent => (LocalizedContentManager)Game1.temporaryContent;
+ public new LocalizedContentManager? xTileContent => (LocalizedContentManager?)base.xTileContent;
+
+
+ /*********
+ ** Private methods
+ *********/
+ private Game1Facade_1_6_16()
+ {
+ RewriteHelper.ThrowFakeConstructorCalled();
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ItemRegistryFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ItemRegistryFacade.cs
new file mode 100644
index 00000000..a05b8258
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ItemRegistryFacade.cs
@@ -0,0 +1,33 @@
+using StardewValley;
+
+namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16;
+
+/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods.
+/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
+public class ItemRegistryFacade : IRewriteFacade
+{
+ /*********
+ ** Public methods
+ *********/
+ public static Item? Create(string itemId, int amount = 1, int quality = 0, bool allowNull = false)
+ {
+ return allowNull
+ ? ItemRegistry.CreateOrNull(itemId, amount, quality)
+ : ItemRegistry.Create(itemId, amount, quality);
+ }
+
+ public static TItem? Create(string itemId, int amount = 1, int quality = 0, bool allowNull = false)
+ where TItem : Item
+ {
+ return CreateGeneric(itemId, amount, quality, allowNull);
+ }
+
+ // referenced from InstructionMetadata
+ public static TItem? CreateGeneric(string itemId, int amount = 1, int quality = 0, bool allowNull = false)
+ where TItem : Item
+ {
+ return allowNull
+ ? ItemRegistry.CreateOrNull(itemId, amount, quality)
+ : ItemRegistry.Create(itemId, amount, quality);
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/LocalizedContentManagerFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/LocalizedContentManagerFacade.cs
new file mode 100644
index 00000000..3ce0c6a4
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/LocalizedContentManagerFacade.cs
@@ -0,0 +1,82 @@
+using System;
+using System.Reflection;
+using StardewModdingAPI.Framework.ContentManagers;
+using StardewModdingAPI.Framework.ModLoading.Framework;
+using StardewValley;
+using StardewValley.ContentManagement;
+using StardewValley.GameData;
+
+namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16;
+
+/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods.
+/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
+public class LocalizedContentManagerFacade_1_6_16 : LocalizedContentManager, IRewriteFacade
+{
+ /*********
+ ** Accessors
+ *********/
+ public static string CurrentLanguageString => Game1.content.LanguageString;
+ public static bool CurrentLanguageLatin => Game1.content.LanguageUsesLatinFont;
+ public static ModLanguage CurrentModLanguage => Game1.content.LanguageModData;
+
+ public static LanguageCode CurrentLanguageCode
+ {
+ get => Game1.content.LanguageCode;
+ set => Game1.content.LanguageCode = value;
+ }
+
+ public static event LanguageChangedHandler OnLanguageChange
+ {
+ add => Game1.content.OnGlobalLanguageChanged += value;
+ remove => Game1.content.OnGlobalLanguageChanged -= value;
+ }
+
+
+ /*********
+ ** Public methods
+ *********/
+ public LanguageCode GetCurrentLanguage()
+ {
+ return this.LanguageCode;
+ }
+
+ public new static LanguageCode GetDefaultLanguageCode()
+ {
+ return Game1.content.GetDefaultLanguageCode();
+ }
+
+ public new static void SetModLanguage(ModLanguage new_mod_language)
+ {
+ Game1.content.SetModLanguage(new_mod_language);
+ }
+
+ public new LocalizedContentManager CreateTemporary()
+ {
+ //
+ // Note: since method calls are redirected to this implementation, the context doesn't work as you'd expect.
+ // In particular:
+ // - `base.CreateTemporary()` calls the vanilla base class (*not* the subclass we're rewriting).
+ // - `this is GameContentManager` is false even if `this.GetType() == typeof(GameContentManager)`.
+ // - Private fields (e.g. to cache the reflection) are shared between multiple instances, resulting in access
+ // violation exceptions.
+ //
+
+ Type type = this.GetType();
+
+ if (type == typeof(GameContentManager))
+ return (LocalizedContentManager)Game1.content.CreateTemporary(); // skip reflection if we can avoid it
+
+ MethodInfo method = this.GetType().GetMethod(nameof(base.CreateTemporary))!;
+ return (LocalizedContentManager)method.Invoke(this, [])!;
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ private LocalizedContentManagerFacade_1_6_16()
+ : base(null, null)
+ {
+ RewriteHelper.ThrowFakeConstructorCalled();
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/NpcFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/NpcFacade.cs
new file mode 100644
index 00000000..fae3142b
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/NpcFacade.cs
@@ -0,0 +1,47 @@
+using Microsoft.Xna.Framework;
+using StardewModdingAPI.Framework.ModLoading.Framework;
+using StardewValley;
+using StardewValley.ContentManagement;
+
+namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16;
+
+/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods.
+/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
+public abstract class NpcFacade_1_6_16 : NPC, IRewriteFacade
+{
+ /*********
+ ** Accessors
+ *********/
+ public string? Birthday_Season =>
+ base.Birthday_Season != null
+ ? Utility.getSeasonNameFromNumber((int)base.Birthday_Season.Value)
+ : null;
+
+
+ /*********
+ ** Public methods
+ *********/
+ public static NPC Constructor(AnimatedSprite sprite, Vector2 position, int facingDir, string name, LocalizedContentManager? content = null)
+ {
+ return new NPC(sprite, position, facingDir, name, content);
+ }
+
+ public bool TryLoadPortraits(string assetName, out string error, LocalizedContentManager? content = null)
+ {
+ return this.TryLoadPortraits(assetName, out error, (IContentManager?)content);
+ }
+
+ public bool TryLoadSprites(string assetName, out string error, LocalizedContentManager? content = null)
+ {
+ return this.TryLoadSprites(assetName, out error, (IContentManager?)content);
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ private NpcFacade_1_6_16()
+ {
+ RewriteHelper.ThrowFakeConstructorCalled();
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/PetDataFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/PetDataFacade.cs
new file mode 100644
index 00000000..1d1ddb90
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/PetDataFacade.cs
@@ -0,0 +1,29 @@
+using System.Linq;
+using StardewModdingAPI.Framework.ModLoading.Framework;
+using StardewValley.GameData.Pets;
+
+namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16;
+
+/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods.
+/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
+public abstract class PetDataFacade : PetData, IRewriteFacade
+{
+ /*********
+ ** Public methods
+ *********/
+ public PetBreed? GetBreedById(string breedId, bool allowNull = false)
+ {
+ return allowNull
+ ? base.Breeds?.FirstOrDefault(p => p.Id == breedId)
+ : base.GetPreferredBreed(breedId);
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ private PetDataFacade()
+ {
+ RewriteHelper.ThrowFakeConstructorCalled();
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ResponseFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ResponseFacade.cs
new file mode 100644
index 00000000..5666c11c
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/ResponseFacade.cs
@@ -0,0 +1,31 @@
+using Microsoft.Xna.Framework.Input;
+using StardewModdingAPI.Framework.ModLoading.Framework;
+using StardewValley;
+
+namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16;
+
+/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods.
+/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
+public class ResponseFacade : Response, IRewriteFacade
+{
+ /*********
+ ** Public methods
+ *********/
+ public Response SetHotKey(Keys key)
+ {
+ // note: the original code mutated the instance *and* returned it. Changing the current instance is no longer
+ // possible since it's immutable, so this only really works for mods which used the return value correctly.
+
+ return new Response(this.responseKey, this.responseText, key);
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ private ResponseFacade()
+ : base(null, null)
+ {
+ RewriteHelper.ThrowFakeConstructorCalled();
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/TemporaryAnimatedSpriteListFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/TemporaryAnimatedSpriteListFacade.cs
new file mode 100644
index 00000000..b78fab4a
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/TemporaryAnimatedSpriteListFacade.cs
@@ -0,0 +1,27 @@
+using System.Collections.Generic;
+using StardewModdingAPI.Framework.ModLoading.Framework;
+using StardewValley;
+
+namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16;
+
+/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods.
+/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
+public abstract class TemporaryAnimatedSpriteListFacade : TemporaryAnimatedSpriteList, IRewriteFacade
+{
+ /*********
+ ** Public methods
+ *********/
+ public new IEnumerator GetEnumerator()
+ {
+ return base.GetEnumerator();
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ private TemporaryAnimatedSpriteListFacade()
+ {
+ RewriteHelper.ThrowFakeConstructorCalled();
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/TextBoxFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/TextBoxFacade.cs
new file mode 100644
index 00000000..1d0e4462
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/TextBoxFacade.cs
@@ -0,0 +1,35 @@
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Input;
+using StardewModdingAPI.Framework.ModLoading.Framework;
+using StardewValley;
+using StardewValley.Menus;
+
+namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16;
+
+/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods.
+/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
+public abstract class TextBoxFacade : TextBox, IRewriteFacade
+{
+ /*********
+ ** Public methods
+ *********/
+ public void RecieveCommandInput(char command)
+ {
+ base.RecieveCommandInput(command, KeyboardModifier.None);
+ }
+
+ public void RecieveSpecialInput(Keys key)
+ {
+ base.RecieveSpecialInput(key, KeyboardModifier.None);
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ private TextBoxFacade()
+ : base(null, null, null, Color.Transparent)
+ {
+ RewriteHelper.ThrowFakeConstructorCalled();
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/UtilityFacade.cs b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/UtilityFacade.cs
new file mode 100644
index 00000000..9ffd929b
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Rewriters/StardewValley_1_6_16/UtilityFacade.cs
@@ -0,0 +1,37 @@
+using System.Collections.Generic;
+using StardewModdingAPI.Framework.ModLoading.Framework;
+using StardewValley;
+
+namespace StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16;
+
+/// Maps Stardew Valley 1.6.15's methods to their newer form to avoid breaking older mods.
+/// This is public to support SMAPI rewriting and should never be referenced directly by mods. See remarks on for more info.
+public class UtilityFacade_1_6_16 : Utility, IRewriteFacade
+{
+ /*********
+ ** Public methods
+ *********/
+ public static bool CollectOrDrop(Item item, int direction)
+ {
+ return Game1.player.CollectOrDrop(item, direction);
+ }
+
+ public static bool CollectOrDrop(Item item)
+ {
+ return Game1.player.CollectOrDrop(item);
+ }
+
+ public static List getDaysOfBooksellerThisSeason()
+ {
+ return Utility.getDaysOfBooksellerThisSeason(Game1.season, Game1.year);
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ private UtilityFacade_1_6_16()
+ {
+ RewriteHelper.ThrowFakeConstructorCalled();
+ }
+}
diff --git a/src/SMAPI/Metadata/InstructionMetadata.cs b/src/SMAPI/Metadata/InstructionMetadata.cs
index 5fbb51de..9928f153 100644
--- a/src/SMAPI/Metadata/InstructionMetadata.cs
+++ b/src/SMAPI/Metadata/InstructionMetadata.cs
@@ -10,9 +10,11 @@ using StardewModdingAPI.Framework.ModLoading.Finders;
using StardewModdingAPI.Framework.ModLoading.Rewriters;
using StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_5;
using StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6;
+using StardewModdingAPI.Framework.ModLoading.Rewriters.StardewValley_1_6_16;
using StardewValley;
using StardewValley.Audio;
using StardewValley.BellsAndWhistles;
+using StardewValley.Buffs;
using StardewValley.Buildings;
using StardewValley.ContentManagement;
using StardewValley.Enchantments;
@@ -20,6 +22,7 @@ using StardewValley.GameData;
using StardewValley.GameData.FishPonds;
using StardewValley.GameData.FloorsAndPaths;
using StardewValley.GameData.Movies;
+using StardewValley.GameData.Pets;
using StardewValley.GameData.SpecialOrders;
using StardewValley.Internal;
using StardewValley.Locations;
@@ -28,6 +31,7 @@ using StardewValley.Minigames;
using StardewValley.Mods;
using StardewValley.Network;
using StardewValley.Objects;
+using StardewValley.Objects.Trinkets;
using StardewValley.Pathfinding;
using StardewValley.Projectiles;
using StardewValley.Quests;
@@ -182,7 +186,7 @@ internal class InstructionMetadata
// note: types are mapped before members, regardless of the order listed here
.MapFacade()
.MapFacade()
- .MapFacade(typeof(ArgUtility).FullName!, typeof(ArgUtilityFacade))
+ .MapFacade(typeof(ArgUtility).FullName!, typeof(ArgUtilityFacade_1_6))
.MapFacade()
.MapFacade()
.MapFacade()
@@ -190,7 +194,7 @@ internal class InstructionMetadata
.MapFacade()
.MapFacade()
.MapFacade()
- .MapFacade()
+ .MapFacade()
.MapFacade()
.MapFacade()
.MapFacade()
@@ -204,23 +208,23 @@ internal class InstructionMetadata
.MapFacade()
.MapFacade()
.MapFacade()
- .MapFacade()
+ .MapFacade()
.MapFacade()
.MapFacade()
.MapFacade()
.MapFacade()
.MapFacade()
- .MapFacade()
+ .MapFacade()
.MapFacade()
.MapFacade()
.MapFacade()
.MapFacade()
.MapFacade()
.MapFacade()
- .MapFacade()
+ .MapFacade()
.MapFacade()
.MapFacade()
- .MapFacade()
+ .MapFacade()
.MapFacade()
.MapFacade()
.MapFacade()
@@ -235,14 +239,14 @@ internal class InstructionMetadata
.MapFacade()
.MapFacade()
.MapFacade()
- .MapFacade()
+ .MapFacade()
.MapType("StardewValley.Buildings.Mill", typeof(Building))
.MapFacade()
.MapFacade()
.MapFacade()
.MapFacade()
.MapFacade()
- .MapFacade()
+ .MapFacade()
.MapFacade()
.MapFacade()
.MapFacade()
@@ -294,7 +298,53 @@ internal class InstructionMetadata
.MapMethod("System.Int32 Netcode.NetInt::op_Implicit(Netcode.NetInt)", typeof(ImplicitConversionOperatorsFacade), nameof(ImplicitConversionOperatorsFacade.NetInt_ToInt))
.MapMethod("System.String Netcode.NetString::op_Implicit(Netcode.NetString)", typeof(ImplicitConversionOperatorsFacade), nameof(ImplicitConversionOperatorsFacade.NetString_ToString))
.MapMethod("System.Int32 StardewValley.Network.NetDirection::op_Implicit(StardewValley.Network.NetDirection)", typeof(ImplicitConversionOperatorsFacade), nameof(ImplicitConversionOperatorsFacade.NetDirection_ToInt))
- .MapMethod("!0 StardewValley.Network.NetPausableField`3::op_Implicit(StardewValley.Network.NetPausableField`3)", typeof(NetPausableFieldFacade), nameof(NetPausableFieldFacade.op_Implicit));
+ .MapMethod("!0 StardewValley.Network.NetPausableField`3::op_Implicit(StardewValley.Network.NetPausableField`3)", typeof(NetPausableFieldFacade), nameof(NetPausableFieldFacade.op_Implicit))
+
+ /****
+ ** Stardew Valley 1.6.16
+ ****/
+ // moved types (FishTankFurniture)
+ .MapType("StardewValley.Objects.FishTankFurniture/FishTankCategories", typeof(StardewValley.Objects.FishTanks.FishTankCategories))
+ .MapType("StardewValley.Objects.TankFish", typeof(StardewValley.Objects.FishTanks.TankFish))
+ .MapType("StardewValley.Objects.TankFish/FishType", typeof(StardewValley.Objects.FishTanks.FishType))
+
+ // moved types (LocalizedContentManager)
+ .MapType("StardewValley.LocalizedContentManager", typeof(LocalizedContentManager))
+ .MapType("StardewValley.LocalizedContentManager/LanguageChangedHandler", typeof(LanguageChangedHandler))
+ .MapType("StardewValley.LocalizedContentManager/LanguageCode", typeof(LanguageCode))
+
+ // generic ItemRegistry.Create changes
+ // For some reason, these aren't handled by the ItemRegistryFacade. We can't list every possible item,
+ // but we can cover the main ones and add others as needed.
+ .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Axe).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric))
+ .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Boots).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric))
+ .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Chest).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric))
+ .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Clothing).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric))
+ .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Furniture).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric))
+ .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Hat).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric))
+ .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Ring).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric))
+ .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(SObject).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric))
+ .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Tool).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric))
+ .MapMethod($"!!0 StardewValley.ItemRegistry::Create<{typeof(Trinket).FullName}>(System.String,System.Int32,System.Int32,System.Boolean)", typeof(ItemRegistryFacade), nameof(ItemRegistryFacade.CreateGeneric))
+
+ // general API changes
+ // note: types are mapped before members, regardless of the order listed here
+ .MapFacade("StardewValley.DataLoader", typeof(DataLoaderFacade))
+ .MapFacade()
+ .MapFacade(typeof(ArgUtility).FullName!, typeof(ArgUtilityFacade_1_6_16))
+ .MapFacade()
+ .MapFacade()
+ .MapFacade()
+ .MapFacade()
+ .MapFacade()
+ .MapFacade(typeof(ItemRegistry).FullName!, typeof(ItemRegistryFacade))
+ .MapFacade()
+ .MapFacade()
+ .MapFacade()
+ .MapFacade()
+ .MapFacade()
+ .MapFacade()
+ .MapFacade();
// heuristic rewrites
yield return new HeuristicFieldRewriter(this.ValidateReferencesToAssemblies);