Pathoschild / SMAPI

The modding API for Stardew Valley.
https://smapi.io/
GNU Lesser General Public License v3.0
1.72k stars 259 forks source link

Some content loads broken in SMAPI 2.1 beta #381

Closed Pathoschild closed 6 years ago

Pathoschild commented 6 years ago

In some cases SMAPI 2.1 beta uses the absolute file path as an asset key, which causes errors. This didn't happen in earlier versions.

For example, Custom Furniture has this code:

texture = helper.Content.Load<Texture2D>(Path.Combine("Furniture", data.folderName, data.texture));

That causes this error on Windows (see full log):


Custom Furniture failed on entry and might not work correctly. Technical details:
StardewModdingAPI.Framework.Exceptions.SContentLoadException: Custom Furniture failed loading content asset 'C:\Users\Rebecka\Desktop\Steam\steamapps\common\Stardew Valley\Mods\CustomFurniture\Furniture\Coffee table\Coffee table b.png' from ModFolder.
---> Microsoft.Xna.Framework.Content.ContentLoadException: Error loading "C:\Users\Rebecka\Desktop\Steam\steamapps\common\Stardew Valley\Mods\CustomFurniture\Furniture\Coffee table\Coffee table b.png". Cannot open file.
---> System.ArgumentException: Invalid filename. TitleContainer.OpenStream requires a relative URI.
  at Microsoft.Xna.Framework.TitleContainer.OpenStream(String name)
  at Microsoft.Xna.Framework.Content.ContentManager.OpenStream(String assetName)
  --- End of inner exception stack trace ---
  at Microsoft.Xna.Framework.Content.ContentManager.OpenStream(String assetName)
  at Microsoft.Xna.Framework.Content.ContentManager.ReadAsset[T](String assetName, Action`1 recordDisposableObject)
  at Microsoft.Xna.Framework.Content.ContentManager.Load[T](String assetName)
  at StardewValley.LocalizedContentManager.Load[T](String assetName)
  at StardewModdingAPI.Framework.SContentManager.<>n__2[T](String assetName)
  at StardewModdingAPI.Framework.SContentManager.<>c__DisplayClass40_0`1.<LoadImpl>b__1() in C:\source\_Stardew\SMAPI\src\SMAPI\Framework\SContentManager.cs:line 512
  at StardewModdingAPI.Framework.Utilities.ContextHash`1.Track[TResult](T key, Func`1 action) in C:\source\_Stardew\SMAPI\src\SMAPI\Framework\Utilities\ContextHash.cs:line 53
  at StardewModdingAPI.Framework.SContentManager.<>c__DisplayClass40_0`1.<LoadImpl>b__0() in C:\source\_Stardew\SMAPI\src\SMAPI\Framework\SContentManager.cs:line 509
  at StardewModdingAPI.Framework.SContentManager.WithWriteLock[T](Func`1 action) in C:\source\_Stardew\SMAPI\src\SMAPI\Framework\SContentManager.cs:line 794
  at StardewModdingAPI.Framework.SContentManager.LoadImpl[T](String assetName, ContentManager instance) in C:\source\_Stardew\SMAPI\src\SMAPI\Framework\SContentManager.cs:line 490
  at StardewModdingAPI.Framework.SContentManager.LoadFor[T](String assetName, ContentManager instance) in C:\source\_Stardew\SMAPI\src\SMAPI\Framework\SContentManager.cs:line 207
  at StardewModdingAPI.Framework.SContentManager.Load[T](String assetName) in C:\source\_Stardew\SMAPI\src\SMAPI\Framework\SContentManager.cs:line 190
  at StardewModdingAPI.Framework.ModHelpers.ContentHelper.Load[T](String key, ContentSource source) in C:\source\_Stardew\SMAPI\src\SMAPI\Framework\ModHelpers\ContentHelper.cs:line 128
  --- End of inner exception stack trace ---
  at StardewModdingAPI.Framework.ModHelpers.ContentHelper.Load[T](String key, ContentSource source) in C:\source\_Stardew\SMAPI\src\SMAPI\Framework\ModHelpers\ContentHelper.cs:line 136
  at CustomFurniture.CustomFurniture.build(CustomFurnitureData data, String objectID, Vector2 tile) in C:\Users\David\Documents\GitHub\Stardew-Valley-Mods\CustomFurniture\CustomFurniture.cs:line 40
  at CustomFurniture.CustomFurniture..ctor(CustomFurnitureData data, String objectID, Vector2 tile) in C:\Users\David\Documents\GitHub\Stardew-Valley-Mods\CustomFurniture\CustomFurniture.cs:line 34
  at CustomFurniture.CustomFurnitureMod.loadPacks() in C:\Users\David\Documents\GitHub\Stardew-Valley-Mods\CustomFurniture\CustomFurnitureMod.cs:line 58
  at CustomFurniture.CustomFurnitureMod.Entry(IModHelper helper) in C:\Users\David\Documents\GitHub\Stardew-Valley-Mods\CustomFurniture\CustomFurnitureMod.cs:line 24
  at StardewModdingAPI.Program.LoadMods(IModMetadata[] mods, JsonHelper jsonHelper, SContentManager contentManager) in C:\source\_Stardew\SMAPI\src\SMAPI\Program.cs:line 800
``
Pathoschild commented 6 years ago

Turns out it's a bug in Custom Furniture (see Platonymous/Stardew-Valley-Mods#10). I added logic in SMAPI 2.1 to explicitly block absolute asset paths, to make this more clear.