diff --git a/Api/Utility/PluginConfig.cs b/Api/Utility/PluginConfig.cs
new file mode 100644
index 0000000..83f9d86
--- /dev/null
+++ b/Api/Utility/PluginConfig.cs
@@ -0,0 +1,198 @@
+using System.Text;
+using System.Text.Json;
+using Milimoe.FunGame.Core.Library.Constant;
+
+namespace Milimoe.FunGame.Core.Api.Utility
+{
+ ///
+ /// 简易的插件配置文件生成器
+ /// 仅支持部分基本类型(, , , )及其数组(List<long>, List<decimal>, List<string>, List<bool>和long[], decimal[], string[], bool[])
+ /// 文件会保存为:程序目录/configs//.json
+ ///
+ ///
+ /// 新建一个配置文件,文件会保存为:程序目录/configs//.json
+ ///
+ ///
+ ///
+ public class PluginConfig(string plugin_name, string file_name) : Dictionary
+ {
+ ///
+ /// 插件的名称
+ ///
+ public string PluginName { get; set; } = plugin_name;
+
+ ///
+ /// 配置文件的名称(后缀将是.json)
+ ///
+ public string FileName { get; set; } = file_name;
+
+ ///
+ /// 使用索引器给指定key赋值,不存在key会新增
+ ///
+ ///
+ ///
+ public new object this[string key]
+ {
+ set => Add(key, value);
+ }
+
+ ///
+ /// 如果保存了对象,请使用此方法转换
+ ///
+ ///
+ ///
+ public void Parse(string key)
+ {
+ if (TryGetValue(key, out object? value) && value != null)
+ {
+ T? instance = NetworkUtility.JsonDeserialize(value.ToString() ?? "");
+ if (instance != null)
+ {
+ base[key] = instance;
+ }
+ }
+ }
+
+ ///
+ /// 使用泛型获取指定key的value
+ ///
+ ///
+ ///
+ ///
+ public T? Get(string key)
+ {
+ if (TryGetValue(key, out object? value) && value != null)
+ {
+ return NetworkUtility.JsonDeserialize(value.ToString() ?? "");
+ }
+ return default;
+ }
+
+ ///
+ /// 添加一个配置,如果已存在key会覆盖
+ ///
+ ///
+ ///
+ public new void Add(string key, object value)
+ {
+ if (value != null)
+ {
+ if (TryGetValue(key, out _)) base[key] = value;
+ else base.Add(key, value);
+ }
+ }
+
+ ///
+ /// 从配置文件中读取配置。
+ /// 注意:所有保存时为数组的对象都会变成对象,并且不支持类型
+ ///
+ public void LoadConfig()
+ {
+ string dpath = $@"{AppDomain.CurrentDomain.BaseDirectory}configs/{PluginName}";
+ string fpath = $@"{dpath}/{FileName}.json";
+ if (!Directory.Exists(dpath))
+ {
+ Directory.CreateDirectory(dpath);
+ }
+ if (File.Exists(fpath))
+ {
+ string json = File.ReadAllText(fpath, General.DefaultEncoding);
+ Dictionary dict = NetworkUtility.JsonDeserialize>(json) ?? [];
+ Clear();
+ foreach (string key in dict.Keys)
+ {
+ JsonElement obj = (JsonElement)dict[key];
+ AddValue(key, obj);
+ }
+ }
+ }
+
+ ///
+ /// 将配置保存到配置文件。调用此方法会覆盖原有的.json,请注意备份
+ ///
+ public void SaveConfig()
+ {
+ string json = NetworkUtility.JsonSerialize((Dictionary)this);
+ string dpath = $@"{AppDomain.CurrentDomain.BaseDirectory}configs/{PluginName}";
+ string fpath = $@"{dpath}/{FileName}.json";
+ if (!Directory.Exists(dpath))
+ {
+ Directory.CreateDirectory(dpath);
+ }
+ using StreamWriter writer = new(fpath, false, Encoding.Unicode);
+ writer.WriteLine(json);
+ writer.Flush();
+ }
+
+ ///
+ /// Json反序列化的方法
+ ///
+ ///
+ ///
+ private void AddValue(string key, JsonElement obj)
+ {
+ switch (obj.ValueKind)
+ {
+ case JsonValueKind.Object:
+ base.Add(key, obj);
+ break;
+ case JsonValueKind.Number:
+ if (obj.ValueKind == JsonValueKind.Number && obj.TryGetInt64(out long longValue))
+ {
+ base.Add(key, longValue);
+ }
+ else if (obj.ValueKind == JsonValueKind.Number && obj.TryGetDecimal(out decimal decValue))
+ {
+ base.Add(key, decValue);
+ }
+ break;
+ case JsonValueKind.String:
+ base.Add(key, obj.GetString() ?? "");
+ break;
+ case JsonValueKind.True:
+ case JsonValueKind.False:
+ base.Add(key, obj.GetBoolean());
+ break;
+ case JsonValueKind.Array:
+ AddValues(key, obj.EnumerateArray());
+ break;
+ }
+ }
+
+ ///
+ /// Json数组反序列化的方法。不支持数组。
+ ///
+ ///
+ ///
+ private void AddValues(string key, JsonElement.ArrayEnumerator obj)
+ {
+ List longList = [];
+ List decList = [];
+ List strList = [];
+ List bolList = [];
+ foreach (JsonElement array_e in obj)
+ {
+ if (array_e.ValueKind == JsonValueKind.Number && array_e.TryGetInt64(out long longValue))
+ {
+ longList.Add(longValue);
+ }
+ else if (array_e.ValueKind == JsonValueKind.Number && array_e.TryGetDecimal(out decimal decValue))
+ {
+ decList.Add(decValue);
+ }
+ else if (array_e.ValueKind == JsonValueKind.String)
+ {
+ strList.Add(array_e.GetString() ?? "");
+ }
+ else if (array_e.ValueKind == JsonValueKind.True || array_e.ValueKind == JsonValueKind.False)
+ {
+ bolList.Add(array_e.GetBoolean());
+ }
+ }
+ if (longList.Count > 0) base.Add(key, longList);
+ if (decList.Count > 0) base.Add(key, decList);
+ if (strList.Count > 0) base.Add(key, strList);
+ if (bolList.Count > 0) base.Add(key, bolList);
+ }
+ }
+}
diff --git a/Docs/FunGame.Core.xml b/Docs/FunGame.Core.xml
index 1638394..198d554 100644
--- a/Docs/FunGame.Core.xml
+++ b/Docs/FunGame.Core.xml
@@ -780,6 +780,94 @@
Private JsonSerializerOptions
+
+
+ 简易的插件配置文件生成器
+ 仅支持部分基本类型(, , , )及其数组(List<long>, List<decimal>, List<string>, List<bool>和long[], decimal[], string[], bool[])
+ 文件会保存为:程序目录/configs//.json
+
+
+ 新建一个配置文件,文件会保存为:程序目录/configs//.json
+
+
+
+
+
+
+ 简易的插件配置文件生成器
+ 仅支持部分基本类型(, , , )及其数组(List<long>, List<decimal>, List<string>, List<bool>和long[], decimal[], string[], bool[])
+ 文件会保存为:程序目录/configs//.json
+
+
+ 新建一个配置文件,文件会保存为:程序目录/configs//.json
+
+
+
+
+
+
+ 插件的名称
+
+
+
+
+ 配置文件的名称(后缀将是.json)
+
+
+
+
+ 使用索引器给指定key赋值,不存在key会新增
+
+
+
+
+
+
+ 如果保存了对象,请使用此方法转换
+
+
+
+
+
+
+ 使用泛型获取指定key的value
+
+
+
+
+
+
+
+ 添加一个配置,如果已存在key会覆盖
+
+
+
+
+
+
+ 从配置文件中读取配置。
+ 注意:所有保存时为数组的对象都会变成对象,并且不支持类型
+
+
+
+
+ 将配置保存到配置文件。调用此方法会覆盖原有的.json,请注意备份
+
+
+
+
+ Json反序列化的方法
+
+
+
+
+
+
+ Json数组反序列化的方法。不支持数组。
+
+
+
+
已读取的插件列表