diff --git a/src/SMAPI/Framework/ModHelpers/ContentHelper.cs b/src/SMAPI/Framework/ModHelpers/ContentHelper.cs
index be9594ee..7665eb78 100644
--- a/src/SMAPI/Framework/ModHelpers/ContentHelper.cs
+++ b/src/SMAPI/Framework/ModHelpers/ContentHelper.cs
@@ -26,9 +26,6 @@ namespace StardewModdingAPI.Framework.ModHelpers
/// The absolute path to the mod folder.
private readonly string ModFolderPath;
- /// The path to the mod's folder, relative to the game's content folder (e.g. "../Mods/ModName").
- private readonly string ModFolderPathFromContent;
-
/// The friendly mod name for use in errors.
private readonly string ModName;
@@ -73,7 +70,6 @@ namespace StardewModdingAPI.Framework.ModHelpers
this.ContentManager = contentManager;
this.ModFolderPath = modFolderPath;
this.ModName = modName;
- this.ModFolderPathFromContent = this.ContentManager.GetRelativePath(modFolderPath);
this.Monitor = monitor;
}
@@ -102,7 +98,7 @@ namespace StardewModdingAPI.Framework.ModHelpers
throw GetContentError($"there's no matching file at path '{file.FullName}'.");
// get asset path
- string assetName = this.GetModAssetPath(key, file.FullName);
+ string assetName = this.ContentManager.GetAssetNameFromFilePath(file.FullName);
// try cache
if (this.ContentManager.IsLoaded(assetName))
@@ -151,7 +147,7 @@ namespace StardewModdingAPI.Framework.ModHelpers
case ContentSource.ModFolder:
FileInfo file = this.GetModFile(key);
- return this.ContentManager.NormaliseAssetName(this.GetModAssetPath(key, file.FullName));
+ return this.ContentManager.NormaliseAssetName(this.ContentManager.GetAssetNameFromFilePath(file.FullName));
default:
throw new NotSupportedException($"Unknown content source '{source}'.");
@@ -356,19 +352,5 @@ namespace StardewModdingAPI.Framework.ModHelpers
// get file
return new FileInfo(path);
}
-
- /// Get the asset path which loads a mod folder through a content manager.
- /// The file path relative to the mod's folder.
- /// The absolute file path.
- private string GetModAssetPath(string localPath, string absolutePath)
- {
-#if SMAPI_FOR_WINDOWS
- // XNA doesn't allow absolute asset paths, so get a path relative to the content folder
- return Path.Combine(this.ModFolderPathFromContent, localPath);
-#else
- // MonoGame is weird about relative paths on Mac, but allows absolute paths
- return absolutePath;
-#endif
- }
}
}
diff --git a/src/SMAPI/Framework/SContentManager.cs b/src/SMAPI/Framework/SContentManager.cs
index a755a6df..524b2d17 100644
--- a/src/SMAPI/Framework/SContentManager.cs
+++ b/src/SMAPI/Framework/SContentManager.cs
@@ -102,7 +102,7 @@ namespace StardewModdingAPI.Framework
this.Monitor = monitor ?? throw new ArgumentNullException(nameof(monitor));
this.Cache = new ContentCache(this, reflection, SContentManager.PossiblePathSeparators, SContentManager.PreferredPathSeparator);
this.GetKeyLocale = reflection.GetPrivateMethod(this, "languageCode");
- this.ModContentPrefix = this.GetRelativePath(Constants.ModPath);
+ this.ModContentPrefix = this.GetAssetNameFromFilePath(Constants.ModPath);
// get asset data
this.CoreAssets = new CoreAssets(this.NormaliseAssetName);
@@ -140,19 +140,17 @@ namespace StardewModdingAPI.Framework
throw new ArgumentException("The asset key or local path contains invalid characters.");
}
- /// Get a directory path relative to the content root.
- /// The target file path.
- public string GetRelativePath(string targetPath)
+ /// Convert an absolute file path into a appropriate asset name.
+ /// The absolute path to the file.
+ public string GetAssetNameFromFilePath(string absolutePath)
{
- // convert to URIs
- Uri from = new Uri(this.FullRootDirectory + "/");
- Uri to = new Uri(targetPath + "/");
- if (from.Scheme != to.Scheme)
- throw new InvalidOperationException($"Can't get path for '{targetPath}' relative to '{this.FullRootDirectory}'.");
-
- // get relative path
- return Uri.UnescapeDataString(from.MakeRelativeUri(to).ToString())
- .Replace(Path.DirectorySeparatorChar == '/' ? '\\' : '/', Path.DirectorySeparatorChar); // use correct separator for platform
+#if SMAPI_FOR_WINDOWS
+ // XNA doesn't allow absolute asset paths, so get a path relative to the content folder
+ return this.GetRelativePath(absolutePath);
+#else
+ // MonoGame is weird about relative paths on Mac, but allows absolute paths
+ return absolutePath;
+#endif
}
/****
@@ -395,6 +393,21 @@ namespace StardewModdingAPI.Framework
/****
** Asset name/key handling
****/
+ /// Get a directory or file path relative to the content root.
+ /// The target file path.
+ private string GetRelativePath(string targetPath)
+ {
+ // convert to URIs
+ Uri from = new Uri(this.FullRootDirectory + "/");
+ Uri to = new Uri(targetPath + "/");
+ if (from.Scheme != to.Scheme)
+ throw new InvalidOperationException($"Can't get path for '{targetPath}' relative to '{this.FullRootDirectory}'.");
+
+ // get relative path
+ return Uri.UnescapeDataString(from.MakeRelativeUri(to).ToString())
+ .Replace(Path.DirectorySeparatorChar == '/' ? '\\' : '/', Path.DirectorySeparatorChar); // use correct separator for platform
+ }
+
/// Get the locale codes (like ja-JP) used in asset keys.
/// Simplifies access to private game code.
private IDictionary GetKeyLocales(Reflector reflection)
@@ -551,19 +564,6 @@ namespace StardewModdingAPI.Framework
return file;
}
- /// Get a file from the game's content folder.
- /// The asset key.
- private FileInfo GetContentFolderFile(string key)
- {
- // get file path
- string path = Path.Combine(this.FullRootDirectory, key);
- if (!path.EndsWith(".xnb"))
- path += ".xnb";
-
- // get file
- return new FileInfo(path);
- }
-
/// Load the initial asset from the registered .
/// The basic asset metadata.
/// Returns the loaded asset metadata, or null if no loader matched.