1
This commit is contained in:
@@ -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();
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user