fix error when swapping maps mid-session for a location with interior doors

This commit is contained in:
Jesse Plamondon-Willard 2019-02-08 18:19:28 -05:00
parent 63d146b271
commit 215574f2b9
No known key found for this signature in database
GPG Key ID: 7D7C8097B62033CE
2 changed files with 15 additions and 1 deletions

View File

@ -19,6 +19,7 @@
* Asset changes are now propagated into the parsed save being loaded if applicable. * Asset changes are now propagated into the parsed save being loaded if applicable.
* Added locale to context trace logs. * Added locale to context trace logs.
* Fixed error loading custom map tilesheets in some cases. * Fixed error loading custom map tilesheets in some cases.
* Fixed error when swapping maps mid-session for a location with interior doors.
* Fixed `Constants.SaveFolderName` and `CurrentSavePath` not available during early load stages when using `Specialised.LoadStageChanged` event. * Fixed `Constants.SaveFolderName` and `CurrentSavePath` not available during early load stages when using `Specialised.LoadStageChanged` event.
* Fixed `LoadStage.SaveParsed` raised before the parsed save data is available. * Fixed `LoadStage.SaveParsed` raised before the parsed save data is available.
* Fixed 'unknown mod' deprecation warnings showing the wrong stack trace. * Fixed 'unknown mod' deprecation warnings showing the wrong stack trace.

View File

@ -2,7 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using Microsoft.Xna.Framework; using System.Reflection;
using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Graphics;
using StardewModdingAPI.Framework.Reflection; using StardewModdingAPI.Framework.Reflection;
using StardewValley; using StardewValley;
@ -99,8 +99,21 @@ namespace StardewModdingAPI.Metadata
{ {
if (!string.IsNullOrWhiteSpace(location.mapPath.Value) && this.GetNormalisedPath(location.mapPath.Value) == key) if (!string.IsNullOrWhiteSpace(location.mapPath.Value) && this.GetNormalisedPath(location.mapPath.Value) == key)
{ {
// reload map data
this.Reflection.GetMethod(location, "reloadMap").Invoke(); this.Reflection.GetMethod(location, "reloadMap").Invoke();
this.Reflection.GetMethod(location, "updateWarps").Invoke(); this.Reflection.GetMethod(location, "updateWarps").Invoke();
// reload doors
{
Type interiorDoorDictType = Type.GetType($"StardewValley.InteriorDoorDictionary, {Constants.GameAssemblyName}", throwOnError: true);
ConstructorInfo constructor = interiorDoorDictType.GetConstructor(new[] { typeof(GameLocation) });
if (constructor == null)
throw new InvalidOperationException("Can't reset location doors: constructor not found for InteriorDoorDictionary type.");
object instance = constructor.Invoke(new object[] { location });
this.Reflection.GetField<object>(location, "interiorDoors").SetValue(instance);
}
anyChanged = true; anyChanged = true;
} }
} }