summaryrefslogtreecommitdiff
path: root/src/SMAPI/Framework/ContentPack.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI/Framework/ContentPack.cs')
-rw-r--r--src/SMAPI/Framework/ContentPack.cs44
1 files changed, 34 insertions, 10 deletions
diff --git a/src/SMAPI/Framework/ContentPack.cs b/src/SMAPI/Framework/ContentPack.cs
index e39d03a1..9c0bb9d1 100644
--- a/src/SMAPI/Framework/ContentPack.cs
+++ b/src/SMAPI/Framework/ContentPack.cs
@@ -2,7 +2,7 @@ using System;
using System.IO;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
-using StardewModdingAPI.Toolkit.Serialisation;
+using StardewModdingAPI.Toolkit.Serialization;
using StardewModdingAPI.Toolkit.Utilities;
using xTile;
@@ -30,6 +30,9 @@ namespace StardewModdingAPI.Framework
/// <summary>The content pack's manifest.</summary>
public IManifest Manifest { get; }
+ /// <summary>Provides translations stored in the content pack's <c>i18n</c> folder. See <see cref="IModHelper.Translation"/> for more info.</summary>
+ public ITranslationHelper Translation { get; }
+
/*********
** Public methods
@@ -38,26 +41,36 @@ namespace StardewModdingAPI.Framework
/// <param name="directoryPath">The full path to the content pack's folder.</param>
/// <param name="manifest">The content pack's manifest.</param>
/// <param name="content">Provides an API for loading content assets.</param>
+ /// <param name="translation">Provides translations stored in the content pack's <c>i18n</c> folder.</param>
/// <param name="jsonHelper">Encapsulates SMAPI's JSON file parsing.</param>
- public ContentPack(string directoryPath, IManifest manifest, IContentHelper content, JsonHelper jsonHelper)
+ public ContentPack(string directoryPath, IManifest manifest, IContentHelper content, ITranslationHelper translation, JsonHelper jsonHelper)
{
this.DirectoryPath = directoryPath;
this.Manifest = manifest;
this.Content = content;
+ this.Translation = translation;
this.JsonHelper = jsonHelper;
}
+ /// <summary>Get whether a given file exists in the content pack.</summary>
+ /// <param name="path">The file path to check.</param>
+ public bool HasFile(string path)
+ {
+ this.AssertRelativePath(path, nameof(this.HasFile));
+
+ return File.Exists(Path.Combine(this.DirectoryPath, path));
+ }
+
/// <summary>Read a JSON file from the content pack folder.</summary>
/// <typeparam name="TModel">The model type.</typeparam>
- /// <param name="path">The file path relative to the contnet directory.</param>
- /// <returns>Returns the deserialised model, or <c>null</c> if the file doesn't exist or is empty.</returns>
+ /// <param name="path">The file path relative to the content directory.</param>
+ /// <returns>Returns the deserialized model, or <c>null</c> if the file doesn't exist or is empty.</returns>
/// <exception cref="InvalidOperationException">The <paramref name="path"/> is not relative or contains directory climbing (../).</exception>
public TModel ReadJsonFile<TModel>(string path) where TModel : class
{
- if (!PathUtilities.IsSafeRelativePath(path))
- throw new InvalidOperationException($"You must call {nameof(IContentPack)}.{nameof(this.ReadJsonFile)} with a relative path.");
+ this.AssertRelativePath(path, nameof(this.ReadJsonFile));
- path = Path.Combine(this.DirectoryPath, PathUtilities.NormalisePathSeparators(path));
+ path = Path.Combine(this.DirectoryPath, PathUtilities.NormalizePathSeparators(path));
return this.JsonHelper.ReadJsonFileIfExists(path, out TModel model)
? model
: null;
@@ -70,10 +83,9 @@ namespace StardewModdingAPI.Framework
/// <exception cref="InvalidOperationException">The <paramref name="path"/> is not relative or contains directory climbing (../).</exception>
public void WriteJsonFile<TModel>(string path, TModel data) where TModel : class
{
- if (!PathUtilities.IsSafeRelativePath(path))
- throw new InvalidOperationException($"You must call {nameof(IContentPack)}.{nameof(this.WriteJsonFile)} with a relative path.");
+ this.AssertRelativePath(path, nameof(this.WriteJsonFile));
- path = Path.Combine(this.DirectoryPath, PathUtilities.NormalisePathSeparators(path));
+ path = Path.Combine(this.DirectoryPath, PathUtilities.NormalizePathSeparators(path));
this.JsonHelper.WriteJsonFile(path, data);
}
@@ -95,5 +107,17 @@ namespace StardewModdingAPI.Framework
return this.Content.GetActualAssetKey(key, ContentSource.ModFolder);
}
+
+ /*********
+ ** Private methods
+ *********/
+ /// <summary>Assert that a relative path was passed it to a content pack method.</summary>
+ /// <param name="path">The path to check.</param>
+ /// <param name="methodName">The name of the method which was invoked.</param>
+ private void AssertRelativePath(string path, string methodName)
+ {
+ if (!PathUtilities.IsSafeRelativePath(path))
+ throw new InvalidOperationException($"You must call {nameof(IContentPack)}.{methodName} with a relative path.");
+ }
}
}