This commit is contained in:
CortexCore
2025-02-24 23:02:43 +08:00
parent 41715e4413
commit 8261a458e2
105 changed files with 2934 additions and 696 deletions

View File

@@ -14,6 +14,7 @@ using BITKit.IO;
using BITKit.UX;
using Cysharp.Threading.Tasks;
using Microsoft.CSharp;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace BITKit.Mod
@@ -133,17 +134,26 @@ namespace BITKit.Mod
var list=new List<ModPackage>();
var path = Path.Combine(Environment.CurrentDirectory, "Mods");
var dir = new DirectoryInfo(path);
dir.Create();
foreach (var x in dir.GetDirectories())
try
{
var file = Path.Combine(x.FullName,ModPackage.DefaultFileName);
if(File.Exists(file) is false)continue;
var package = JsonConvert.DeserializeObject<ModPackage>(await File.ReadAllTextAsync(file))!;
package.PackagePath = file;
package.WorkDirectory = x.FullName;
list.Add(package);
var dir = new DirectoryInfo(path);
dir.Create();
foreach (var x in dir.GetDirectories())
{
var file = Path.Combine(x.FullName,ModPackage.DefaultFileName);
if(File.Exists(file) is false)continue;
var package = JsonConvert.DeserializeObject<ModPackage>(await File.ReadAllTextAsync(file))!;
package.PackagePath = file;
package.WorkDirectory = x.FullName;
list.Add(package);
}
}
catch (Exception e)
{
BIT4Log.LogException(e);
}
return list.ToArray();
}
@@ -200,19 +210,16 @@ namespace BITKit.Mod
private static CancellationTokenSource _CancellationTokenSource;
private static readonly ConcurrentDictionary<string,IMod> _InstalledMods=new();
public static async UniTask Initialize()
public static async UniTask Initialize(ILogger logger=null)
{
BIT4Log.Log<ModService>("Mod服务已启动");
logger?.LogInformation("Mod服务已启动");
_CancellationTokenSource = new CancellationTokenSource();
try
{
try
{
var modPath = Path.Combine(Environment.CurrentDirectory, "Mods\\");
var modPath = Path.Combine(Environment.CurrentDirectory, @"Mods\");
PathHelper.EnsureDirectoryCreated(modPath);
var directoryInfo = new DirectoryInfo(modPath);
foreach (var fileInfo in directoryInfo.GetFiles())
@@ -238,18 +245,16 @@ namespace BITKit.Mod
}
catch (Exception e)
{
BIT4Log.Warning<ModService>("自动加载Mod失败");
logger?.LogWarning("自动加载Mod失败");
BIT4Log.LogException(e);
}
}
catch (Exception e)
{
logger?.LogWarning("Mod服务遇到了错误,已停止");
BIT4Log.LogException(e);
BIT4Log.Warning<ModService>("Mod服务遇到了错误,已停止");
}
}
public static void Dispose()
@@ -336,7 +341,7 @@ namespace BITKit.Mod
}
var fileInfo = new FileInfo(path);
var fileInfo = new FileInfo(path);
switch (fileInfo.Extension)
{
case ".dll":
@@ -360,6 +365,10 @@ namespace BITKit.Mod
}
public static async UniTask Load(IMod mod)
{
await IsBusy;
using var _ = IsBusy.GetHandle();
mod.OnInitialize();
OnModLoad?.Invoke(mod);
BIT4Log.Log<ModService>($"加载Mod:{mod.GetType().FullName}");
@@ -381,7 +390,7 @@ namespace BITKit.Mod
BIT4Log.Log<ModService>($"卸载Mod:{mod.GetType().FullName}");
}
public static async void Install(IMod mod)
public static async UniTask Install(IMod mod)
{
await IsBusy;
@@ -404,11 +413,12 @@ namespace BITKit.Mod
mod.OnInitialized();
OnModLoaded?.Invoke(mod);
}
public static void UnInstall(IMod mod)
public static async UniTask UnInstall(IMod mod)
{
await IsBusy;
using var _ = IsBusy.GetHandle();
if(_InstalledMods.ContainsKey(mod.PackageName) is false) return;
_InstalledMods.TryRemove(mod.PackageName);
Mods = _InstalledMods.Values.ToArray();

View File

@@ -8,7 +8,20 @@ namespace BITKit.Mod
public partial class ModService
{
public static Func<string, UniTask<object>> LoadAssetAsyncFactory;
public static Func<string[], UniTask<IReadOnlyList<object>>> LoadAssetsAsyncFactory;
public static async UniTask<IReadOnlyList<T>> LoadAssets<T>(params string[] tags)
{
var list = new List<T>();
foreach (var func in LoadAssetsAsyncFactory.CastAsFunc())
{
foreach (var obj in await func.Invoke(tags))
{
list.Add((T)obj);
}
}
return list;
}
public static async UniTask<T> LoadAsset<T>(string location) where T : class
{
if (LoadAssetAsyncFactory is null)