diff --git a/src/Loader/Properties/AndroidManifest.xml b/src/Loader/Properties/AndroidManifest.xml index 4608458d..56edacde 100644 --- a/src/Loader/Properties/AndroidManifest.xml +++ b/src/Loader/Properties/AndroidManifest.xml @@ -15,6 +15,7 @@ android:allowBackup="true" android:resizeableActivity="false" android:debuggable="true" - android:requestLegacyExternalStorage="true"> + android:requestLegacyExternalStorage="true"> + diff --git a/src/Loader/Resources/Resource.designer.cs b/src/Loader/Resources/Resource.designer.cs index ccff4cdf..9ff77170 100644 --- a/src/Loader/Resources/Resource.designer.cs +++ b/src/Loader/Resources/Resource.designer.cs @@ -26,6 +26,7 @@ namespace Loader public static void UpdateIdValues() { global::StardewModdingAPI.Resource.String.app_name = global::Loader.Resource.String.app_name; + global::StardewModdingAPI.Resource.String.hello = global::Loader.Resource.String.hello; } public partial class Attribute @@ -125,6 +126,9 @@ namespace Loader // aapt resource value: 0x7F040001 public const int app_name = 2130968577; + // aapt resource value: 0x7F040002 + public const int hello = 2130968578; + static String() { global::Android.Runtime.ResourceIdManager.UpdateIdValues(); diff --git a/src/SMAPI/Framework/ModLoading/RewriteFacades/Game1Methods.cs b/src/SMAPI/Framework/ModLoading/RewriteFacades/Game1Methods.cs index 7f067081..e15756e1 100644 --- a/src/SMAPI/Framework/ModLoading/RewriteFacades/Game1Methods.cs +++ b/src/SMAPI/Framework/ModLoading/RewriteFacades/Game1Methods.cs @@ -13,10 +13,11 @@ namespace StardewModdingAPI.Framework.ModLoading.RewriteFacades { public static new IList onScreenMenus => Game1.onScreenMenus; + public static new RainDrop[] RainDropsProp => Game1.rainDrops.ToArray(); - public static new IList LocationsGetter(Game1 game1) + public static new IList LocationsGetter() { - return game1._locations; + return Game1.game1._locations; } #if SMAPI_LEGACY_PATCH diff --git a/src/SMAPI/Framework/SCore.cs b/src/SMAPI/Framework/SCore.cs index 4a863fa0..4e559a47 100644 --- a/src/SMAPI/Framework/SCore.cs +++ b/src/SMAPI/Framework/SCore.cs @@ -292,6 +292,7 @@ namespace StardewModdingAPI.Framework #if SMAPI_FOR_MOBILE new StringPatcher(this.Reflection), new ThreadSilenceExitPatch(this.Monitor), + new UIThreadPatch(this.Monitor), #endif new TitleMenuPatcher(this.OnLoadStageChanged) ); diff --git a/src/SMAPI/Metadata/InstructionMetadata.cs b/src/SMAPI/Metadata/InstructionMetadata.cs index 36331087..4d851a77 100644 --- a/src/SMAPI/Metadata/InstructionMetadata.cs +++ b/src/SMAPI/Metadata/InstructionMetadata.cs @@ -58,7 +58,7 @@ namespace StardewModdingAPI.Metadata #if SMAPI_FOR_MOBILE // module rewrite for .Net 5 runtime assemblies - yield return new ModuleReferenceRewriter("System.*", "System.", new Version(5,0), new[] + yield return new ModuleReferenceRewriter("System.*", "System.", new Version(4,0), new[] { typeof(System.Collections.CollectionBase).Assembly, typeof(System.Collections.Generic.ISet<>).Assembly, @@ -66,7 +66,7 @@ namespace StardewModdingAPI.Metadata typeof(System.Xml.XmlDocument).Assembly, typeof(System.Xml.Linq.XComment).Assembly, typeof(System.Collections.Generic.IReadOnlySet<>).Assembly, - typeof(System.Data.DataTable).Assembly, + typeof(System.Data.DataTable).Assembly }); yield return new TypeFieldToAnotherTypePropertyRewriter(typeof(Game1), typeof(Game1Methods), "onScreenMenus", "onScreenMenus"); @@ -82,6 +82,7 @@ namespace StardewModdingAPI.Metadata // Game1.location fix yield return new TypePropertyToAnotherTypeMethodRewriter(typeof(Game1), typeof(Game1Methods), "locations", "LocationsGetter", null); + yield return new TypeFieldToAnotherTypePropertyRewriter(typeof(Game1), typeof(Game1Methods), "rainDrops", "RainDropsProp"); // Rewrite Missing Type yield return new TypeReferenceRewriter("StardewValley.Menus.CraftingPage", typeof(CraftingPageMobile)); diff --git a/src/SMAPI/Patches/UIThreadPatch.cs b/src/SMAPI/Patches/UIThreadPatch.cs new file mode 100644 index 00000000..ce13a30c --- /dev/null +++ b/src/SMAPI/Patches/UIThreadPatch.cs @@ -0,0 +1,64 @@ +#if SMAPI_FOR_MOBILE +using System; +using System.Diagnostics.CodeAnalysis; +using System.Threading; +using HarmonyLib; +using StardewModdingAPI.Internal.Patching; + +namespace StardewModdingAPI.Patches +{ + /// A Harmony patch for . + /// Patch methods must be static for Harmony to work correctly. See the Harmony documentation before renaming patch arguments. + [SuppressMessage("ReSharper", "InconsistentNaming", Justification = "Argument names are defined by Harmony and methods are named for clarity.")] + [SuppressMessage("ReSharper", "IdentifierTypo", Justification = "Argument names are defined by Harmony and methods are named for clarity.")] + internal class UIThreadPatch : BasePatcher + { + /********* + ** Fields + *********/ + + /********* + ** Fields + *********/ + /// Writes messages to the console and log file. + private static IMonitor Monitor; + + /********* + ** Accessors + *********/ + /// A unique name for this patch. + public string Name => nameof(UIThreadPatch); + + + /********* + ** Public methods + *********/ + /// Construct an instance. + /// Writes messages to the console and log file on behalf of the game. + public UIThreadPatch(IMonitor monitor) + { + Monitor = monitor; + } + + /// Apply the Harmony patch. + /// The Harmony instance. + public override void Apply(Harmony harmony, IMonitor monitor) + { + harmony.Patch( + original: AccessTools.Method(typeof(Microsoft.Xna.Framework.Point).Assembly.GetType("Microsoft.Xna.Framework.Threading"), "EnsureUIThread"), + prefix: this.GetHarmonyMethod(nameof(UIThreadPatch.UIThreadPatch_Prefix)) + ); + } + + /********* + ** Private methods + *********/ + /// The method to call instead of . + /// Returns whether to execute the original method. + private static bool UIThreadPatch_Prefix() + { + return false; + } + } +} +#endif