diff --git a/ColdMint.Traveler.csproj b/ColdMint.Traveler.csproj
index d911b96..d395554 100644
--- a/ColdMint.Traveler.csproj
+++ b/ColdMint.Traveler.csproj
@@ -11,5 +11,7 @@
+
+
\ No newline at end of file
diff --git a/scripts/Config.cs b/scripts/Config.cs
index 1895228..516705c 100644
--- a/scripts/Config.cs
+++ b/scripts/Config.cs
@@ -136,13 +136,7 @@ public static class Config
/// 快捷栏上有多少个物品槽
///
public const int HotBarSize = 9;
-
-
- ///
- /// UserID
- /// 用户ID
- ///
- public const string UserId = "DefaultUser";
+
///
/// Whether version isolation is enabled
@@ -322,17 +316,27 @@ public static class Config
if (EnableVersionIsolation())
{
return Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), CompanyName,
- ProjectSettings.GetSetting("application/config/name").AsString(), UserId,
+ ProjectSettings.GetSetting("application/config/name").AsString(),
ProjectSettings.GetSetting("application/config/version").AsString());
}
else
{
return Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), CompanyName,
- ProjectSettings.GetSetting("application/config/name").AsString(), UserId,
+ ProjectSettings.GetSetting("application/config/name").AsString(),
DefaultVersionName);
}
}
+ ///
+ /// GetDataBaseDirectory
+ /// 获取数据库文件夹
+ ///
+ ///
+ public static string GetDataBaseDirectory()
+ {
+ return Path.Join(GetGameDataDirectory(), "Databases");
+ }
+
///
/// GetModDataDirectory
/// 获取模组文件夹
diff --git a/scripts/database/DataBaseManager.cs b/scripts/database/DataBaseManager.cs
new file mode 100644
index 0000000..3414944
--- /dev/null
+++ b/scripts/database/DataBaseManager.cs
@@ -0,0 +1,48 @@
+using System;
+using System.IO;
+
+namespace ColdMint.scripts.database;
+
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.DependencyInjection;
+
+///
+/// Game database manager
+/// 游戏数据库管理器
+///
+public class DataBaseManager
+{
+ private static ServiceProvider? _serviceProvider;
+
+ ///
+ /// Initialize database
+ /// 初始化数据库
+ ///
+ public static void InitDataBases(string databasePath)
+ {
+ var serviceCollection = new ServiceCollection();
+ serviceCollection.AddDbContext(options =>
+ options.UseSqlite($"Data Source={Path.Join(databasePath, Config.SolutionName + ".db")}"));
+ _serviceProvider = serviceCollection.BuildServiceProvider();
+ var dataPackDbContext = GetRequiredService();
+ dataPackDbContext.Database.EnsureCreated();
+ }
+
+
+ ///
+ /// Get database service
+ /// 获取数据库服务
+ ///
+ ///
+ ///
+ public static T GetRequiredService() where T : notnull
+ {
+ if (_serviceProvider == null)
+ {
+ throw new NullReferenceException("service provider is null");
+ }
+
+ var scope = _serviceProvider.CreateScope();
+ return scope.ServiceProvider.GetRequiredService();
+ }
+}
\ No newline at end of file
diff --git a/scripts/database/GameDbContext.cs b/scripts/database/GameDbContext.cs
new file mode 100644
index 0000000..922d056
--- /dev/null
+++ b/scripts/database/GameDbContext.cs
@@ -0,0 +1,40 @@
+using ColdMint.scripts.database.gameDbTables;
+using Microsoft.EntityFrameworkCore;
+
+namespace ColdMint.scripts.database;
+
+///
+/// Game database
+/// 游戏数据库
+///
+public class GameDbContext(DbContextOptions options) : DbContext(options)
+{
+ public DbSet ErrorRecords { get; set; }
+
+ ///
+ /// Async add error record
+ /// 异步添加错误信息
+ ///
+ ///
+ public async void AddOrUpdateErrorRecordAsync(ErrorRecord errorRecord)
+ {
+ if (errorRecord.Message == null)
+ {
+ return;
+ }
+
+ var oldErrorRecord = await ErrorRecords.FindAsync(errorRecord.Message);
+ if (oldErrorRecord == null)
+ {
+ ErrorRecords.Add(errorRecord);
+ }
+ else
+ {
+ oldErrorRecord.Count++;
+ oldErrorRecord.LastDateTime = errorRecord.LastDateTime;
+ ErrorRecords.Update(oldErrorRecord);
+ }
+
+ await SaveChangesAsync();
+ }
+}
\ No newline at end of file
diff --git a/scripts/database/gameDbTables/ErrorRecord.cs b/scripts/database/gameDbTables/ErrorRecord.cs
new file mode 100644
index 0000000..c38bef4
--- /dev/null
+++ b/scripts/database/gameDbTables/ErrorRecord.cs
@@ -0,0 +1,31 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+
+namespace ColdMint.scripts.database.gameDbTables;
+
+///
+/// Error record
+/// 错误记录
+///
+public class ErrorRecord
+{
+ ///
+ /// Message
+ /// 错误消息
+ ///
+ [Key]
+ [MaxLength(255)]
+ public string? Message { get; set; }
+
+ ///
+ /// Count
+ /// 出现次数
+ ///
+ public int Count { get; set; } = 1;
+
+ ///
+ /// DateTime
+ /// 时间
+ ///
+ public DateTime LastDateTime { get; set; } = DateTime.Now;
+}
\ No newline at end of file
diff --git a/scripts/debug/LogCat.cs b/scripts/debug/LogCat.cs
index 2496159..1fe6e02 100644
--- a/scripts/debug/LogCat.cs
+++ b/scripts/debug/LogCat.cs
@@ -64,6 +64,7 @@ public static class LogCat
/// 日志收集器
///
public const string LogCollector = "LogCollector";
+
///
/// Mod Loader
/// 模组加载器
@@ -237,6 +238,8 @@ public static class LogCat
return;
}
+ //If you need to upload logs, you can upload logs.
+ //如果需要上传日志,并且能够上传日志。
if (LogCollector.CanUploadLog && upload)
{
var logData = new LogData
diff --git a/scripts/loader/uiLoader/SplashScreenLoader.cs b/scripts/loader/uiLoader/SplashScreenLoader.cs
index 31a4549..06568ad 100644
--- a/scripts/loader/uiLoader/SplashScreenLoader.cs
+++ b/scripts/loader/uiLoader/SplashScreenLoader.cs
@@ -3,6 +3,7 @@ using System.Text;
using System.Threading.Tasks;
using ColdMint.scripts.camp;
using ColdMint.scripts.contribute;
+using ColdMint.scripts.database;
using ColdMint.scripts.deathInfo;
using ColdMint.scripts.debug;
using ColdMint.scripts.inventory;
@@ -96,6 +97,13 @@ public partial class SplashScreenLoader : UiLoaderTemplate
Directory.CreateDirectory(dataPath);
}
+ var databasePath = Config.GetDataBaseDirectory();
+ if (!Directory.Exists(databasePath))
+ {
+ Directory.CreateDirectory(databasePath);
+ }
+
+ DataBaseManager.InitDataBases(databasePath);
//Registered camp
//注册阵营
var defaultCamp = new Camp(Config.CampId.Default)