Merge branch 'develop' into stable
This commit is contained in:
commit
9ae69245b3
|
@ -7,7 +7,7 @@ repo. It imports the other MSBuild files as needed.
|
||||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<!--set general build properties -->
|
<!--set general build properties -->
|
||||||
<Version>3.17.1</Version>
|
<Version>3.17.2</Version>
|
||||||
<Product>SMAPI</Product>
|
<Product>SMAPI</Product>
|
||||||
<LangVersion>latest</LangVersion>
|
<LangVersion>latest</LangVersion>
|
||||||
<AssemblySearchPaths>$(AssemblySearchPaths);{GAC}</AssemblySearchPaths>
|
<AssemblySearchPaths>$(AssemblySearchPaths);{GAC}</AssemblySearchPaths>
|
||||||
|
|
|
@ -7,6 +7,14 @@
|
||||||
_If needed, you can update to SMAPI 3.16.0 first and then install the latest version._
|
_If needed, you can update to SMAPI 3.16.0 first and then install the latest version._
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
## 3.17.2
|
||||||
|
Released 21 October 2022 for Stardew Valley 1.5.6 or later.
|
||||||
|
|
||||||
|
* For players:
|
||||||
|
* Fixed installer crash if Steam's library data is invalid or in an old format; it'll now be ignored instead.
|
||||||
|
* For mod authors:
|
||||||
|
* Fixed image patches sometimes applied one pixel higher than expected after 3.17.0 (thanks to atravita!).
|
||||||
|
|
||||||
## 3.17.1
|
## 3.17.1
|
||||||
Released 10 October 2022 for Stardew Valley 1.5.6 or later.
|
Released 10 October 2022 for Stardew Valley 1.5.6 or later.
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
{
|
{
|
||||||
"Name": "Console Commands",
|
"Name": "Console Commands",
|
||||||
"Author": "SMAPI",
|
"Author": "SMAPI",
|
||||||
"Version": "3.17.1",
|
"Version": "3.17.2",
|
||||||
"Description": "Adds SMAPI console commands that let you manipulate the game.",
|
"Description": "Adds SMAPI console commands that let you manipulate the game.",
|
||||||
"UniqueID": "SMAPI.ConsoleCommands",
|
"UniqueID": "SMAPI.ConsoleCommands",
|
||||||
"EntryDll": "ConsoleCommands.dll",
|
"EntryDll": "ConsoleCommands.dll",
|
||||||
"MinimumApiVersion": "3.17.1"
|
"MinimumApiVersion": "3.17.2"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
{
|
{
|
||||||
"Name": "Error Handler",
|
"Name": "Error Handler",
|
||||||
"Author": "SMAPI",
|
"Author": "SMAPI",
|
||||||
"Version": "3.17.1",
|
"Version": "3.17.2",
|
||||||
"Description": "Handles some common vanilla errors to log more useful info or avoid breaking the game.",
|
"Description": "Handles some common vanilla errors to log more useful info or avoid breaking the game.",
|
||||||
"UniqueID": "SMAPI.ErrorHandler",
|
"UniqueID": "SMAPI.ErrorHandler",
|
||||||
"EntryDll": "ErrorHandler.dll",
|
"EntryDll": "ErrorHandler.dll",
|
||||||
"MinimumApiVersion": "3.17.1"
|
"MinimumApiVersion": "3.17.2"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
{
|
{
|
||||||
"Name": "Save Backup",
|
"Name": "Save Backup",
|
||||||
"Author": "SMAPI",
|
"Author": "SMAPI",
|
||||||
"Version": "3.17.1",
|
"Version": "3.17.2",
|
||||||
"Description": "Automatically backs up all your saves once per day into its folder.",
|
"Description": "Automatically backs up all your saves once per day into its folder.",
|
||||||
"UniqueID": "SMAPI.SaveBackup",
|
"UniqueID": "SMAPI.SaveBackup",
|
||||||
"EntryDll": "SaveBackup.dll",
|
"EntryDll": "SaveBackup.dll",
|
||||||
"MinimumApiVersion": "3.17.1"
|
"MinimumApiVersion": "3.17.2"
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
<PackageReference Include="Moq" Version="4.18.1" />
|
<PackageReference Include="Moq" Version="4.18.1" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||||
<PackageReference Include="NUnit" Version="3.13.3" />
|
<PackageReference Include="NUnit" Version="3.13.3" />
|
||||||
|
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" PrivateAssets="all" IncludeAssets="runtime; build; native; contentfiles; analyzers; buildtransitive" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -261,39 +261,50 @@ namespace StardewModdingAPI.Toolkit.Framework.GameScanning
|
||||||
/// <returns>The game directory, if found.</returns>
|
/// <returns>The game directory, if found.</returns>
|
||||||
private string? GetPathFromSteamLibrary(string? steamPath)
|
private string? GetPathFromSteamLibrary(string? steamPath)
|
||||||
{
|
{
|
||||||
if (steamPath == null)
|
try
|
||||||
return null;
|
|
||||||
|
|
||||||
// get .vdf file path
|
|
||||||
string libraryFoldersPath = Path.Combine(steamPath.Replace('/', '\\'), "steamapps\\libraryfolders.vdf");
|
|
||||||
if (!File.Exists(libraryFoldersPath))
|
|
||||||
return null;
|
|
||||||
|
|
||||||
// read data
|
|
||||||
using FileStream fileStream = File.OpenRead(libraryFoldersPath);
|
|
||||||
VdfDeserializer deserializer = new();
|
|
||||||
dynamic libraries = deserializer.Deserialize(fileStream);
|
|
||||||
if (libraries?.libraryfolders is null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
// get path from Stardew Valley app (if any)
|
|
||||||
foreach (dynamic pair in libraries.libraryfolders)
|
|
||||||
{
|
{
|
||||||
dynamic library = pair.Value;
|
if (steamPath == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
foreach (dynamic app in library.apps)
|
// get .vdf file path
|
||||||
|
string libraryFoldersPath = Path.Combine(steamPath.Replace('/', '\\'), "steamapps\\libraryfolders.vdf");
|
||||||
|
if (!File.Exists(libraryFoldersPath))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
// read data
|
||||||
|
using FileStream fileStream = File.OpenRead(libraryFoldersPath);
|
||||||
|
VdfDeserializer deserializer = new();
|
||||||
|
dynamic libraries = deserializer.Deserialize(fileStream);
|
||||||
|
if (libraries?.libraryfolders is null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
// get path from Stardew Valley app (if any)
|
||||||
|
foreach (dynamic pair in libraries.libraryfolders)
|
||||||
{
|
{
|
||||||
string key = app.Key;
|
dynamic library = pair.Value;
|
||||||
if (key == GameScanner.SteamAppId)
|
|
||||||
{
|
|
||||||
string path = library.path;
|
|
||||||
|
|
||||||
return Path.Combine(path.Replace("\\\\", "\\"), "steamapps", "common", "Stardew Valley");
|
foreach (dynamic app in library.apps)
|
||||||
|
{
|
||||||
|
string key = app.Key;
|
||||||
|
if (key == GameScanner.SteamAppId)
|
||||||
|
{
|
||||||
|
string path = library.path;
|
||||||
|
|
||||||
|
return Path.Combine(path.Replace("\\\\", "\\"), "steamapps", "common", "Stardew Valley");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// The file might not be parseable in some cases (e.g. some players have an older Steam version using
|
||||||
|
// a different format). Ideally we'd log an error to know when it's actually an issue, but the SMAPI
|
||||||
|
// installer doesn't have a logging mechanism (and third-party code calling the toolkit may not either).
|
||||||
|
// So for now, just ignore the error and fallback to the other discovery mechanisms.
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,7 @@ namespace StardewModdingAPI
|
||||||
internal static int? LogScreenId { get; set; }
|
internal static int? LogScreenId { get; set; }
|
||||||
|
|
||||||
/// <summary>SMAPI's current raw semantic version.</summary>
|
/// <summary>SMAPI's current raw semantic version.</summary>
|
||||||
internal static string RawApiVersion = "3.17.1";
|
internal static string RawApiVersion = "3.17.2";
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Contains SMAPI's constants and assumptions.</summary>
|
/// <summary>Contains SMAPI's constants and assumptions.</summary>
|
||||||
|
|
|
@ -192,7 +192,7 @@ namespace StardewModdingAPI.Framework.Content
|
||||||
int topOffset = startIndex / sourceArea.Width;
|
int topOffset = startIndex / sourceArea.Width;
|
||||||
int bottomOffset = endIndex / sourceArea.Width;
|
int bottomOffset = endIndex / sourceArea.Width;
|
||||||
|
|
||||||
targetArea = new(targetArea.X, targetArea.Y + topOffset, targetArea.Width, bottomOffset - topOffset + 1);
|
targetArea = new(targetArea.X, targetArea.Y + topOffset - startRow, targetArea.Width, bottomOffset - topOffset + 1);
|
||||||
pixelCount = targetArea.Width * targetArea.Height;
|
pixelCount = targetArea.Width * targetArea.Height;
|
||||||
sourceOffset = topOffset * sourceArea.Width;
|
sourceOffset = topOffset * sourceArea.Width;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue