可以下载模组了,修复了一些已知问题

This commit is contained in:
muqing 2024-08-06 14:34:25 +08:00
parent 28e6054ed6
commit 2407c99e6d
11 changed files with 267 additions and 75 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

View File

@ -15,8 +15,8 @@ public sealed partial class MainWindow : WindowEx
public MainWindow() public MainWindow()
{ {
gj.SetBackTheme(this);
InitializeComponent(); InitializeComponent();
gj.SetBackTheme(this);
//gj.sc("lujing"+ AppContext.BaseDirectory); //gj.sc("lujing"+ AppContext.BaseDirectory);
//Resources //Resources
AppWindow.SetIcon(Path.Combine(AppContext.BaseDirectory, "Assets/WindowIcon.ico")); AppWindow.SetIcon(Path.Combine(AppContext.BaseDirectory, "Assets/WindowIcon.ico"));

View File

@ -18,7 +18,7 @@
<DefaultLanguage>zh-cn</DefaultLanguage> <DefaultLanguage>zh-cn</DefaultLanguage>
<GenerateAppInstallerFile>True</GenerateAppInstallerFile> <GenerateAppInstallerFile>False</GenerateAppInstallerFile>
<AppxPackageSigningEnabled>True</AppxPackageSigningEnabled> <AppxPackageSigningEnabled>True</AppxPackageSigningEnabled>
<PackageCertificateThumbprint>3386EC79D3BB9691D0A8DA634167500B242E109D</PackageCertificateThumbprint> <PackageCertificateThumbprint>3386EC79D3BB9691D0A8DA634167500B242E109D</PackageCertificateThumbprint>
<AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm> <AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm>

View File

@ -81,8 +81,6 @@ public partial class ConcernViewModel : ObservableRecipient
//item.UserName //item.UserName
item.HeadIcon= item.HeadIcon.Replace("..", wl.api); item.HeadIcon= item.HeadIcon.Replace("..", wl.api);
communitylist.Add(item); communitylist.Add(item);
communitylist.Add(item);
communitylist.Add(item);
} }
MovingInfoList.Add(new MovingInfo.Data("123123")); MovingInfoList.Add(new MovingInfo.Data("123123"));

View File

@ -90,10 +90,16 @@ public sealed partial class SettingsPage : Page
} }
private void Dialog_PrimaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args){ private void Dialog_PrimaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args){
var mod = new Mod(); sender.Hide();
ModFileUrlText.Text =mod.getUnitsDir(); var mod = new Mod(XamlRoot, (FileDri) =>
MapsFileUrlText.Text =mod.getMaps(); {
gj.sc("找到了QWQ"+FileDri);
var a = Path.Combine(FileDri, "mods\\units");
ModFileUrlText.Text = a;
var b = Path.Combine(FileDri, "mods\\maps");
MapsFileUrlText.Text = b;
SaveModAndMaps(); SaveModAndMaps();
});
} }
private async void Dialog_SecondaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args){ private async void Dialog_SecondaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args){
@ -131,13 +137,45 @@ public sealed partial class SettingsPage : Page
iniHelper.Load(IniHelper.FILE.Config); iniHelper.Load(IniHelper.FILE.Config);
if (a.Name.Equals("MapsFileUrlText")) if (a.Name.Equals("MapsFileUrlText"))
{ {
iniHelper.SetValue(IniHelper.CODE.Rust, IniHelper.KEY.MapsFileUrl, MapsFileUrlText.Text); var Url = MapsFileUrlText.Text;
if (!Directory.Exists(Url)&&Url!=string.Empty) {
Url = iniHelper.GetValue(IniHelper.CODE.Rust, IniHelper.KEY.MapsFileUrl);
MapsFileUrlText.Text= Url;
}
if (Url != string.Empty)
{
Url = Path.GetFullPath(Url);
}
iniHelper.SetValue(IniHelper.CODE.Rust, IniHelper.KEY.MapsFileUrl,Url);
MapsFileUrlText.Text = Url;
} }
else if(a.Name.Equals("ModFileUrlText")) else if(a.Name.Equals("ModFileUrlText"))
{ {
iniHelper.SetValue(IniHelper.CODE.Rust, IniHelper.KEY.ModFileUrl, ModFileUrlText.Text); var Url = ModFileUrlText.Text;
if (!Directory.Exists(Url)&&Url!=string.Empty)
{
Url=iniHelper.GetValue(IniHelper.CODE.Rust, IniHelper.KEY.ModFileUrl);
ModFileUrlText.Text = Url;
}
if (Url != string.Empty)
{
Url = Path.GetFullPath(Url);
}
iniHelper.SetValue(IniHelper.CODE.Rust, IniHelper.KEY.ModFileUrl,Url);
ModFileUrlText.Text = Url;
} }
// 获取 AutoSuggestBox 的当前文本 // 获取 AutoSuggestBox 的当前文本
iniHelper.Save(); iniHelper.Save();
} }
private async Task ModMapDialog()
{
var dialog = new ContentDialog()
{
XamlRoot = XamlRoot,
Title = "警告",
Content = "不正确的路径无法保存",
SecondaryButtonText = "取消"
};
await dialog.ShowAsync();
}
} }

View File

@ -108,5 +108,14 @@
PlacementMargin="20" PlacementMargin="20"
PreferredPlacement="Auto" PreferredPlacement="Auto"
Subtitle="消息" /> Subtitle="消息" />
<ContentDialog
x:Name="DownloadDialog"
Title="下载中"
SecondaryButtonText="取消">
<StackPanel>
<TextBlock Name="DownloadDialogText" Text="下载完成后会自动导入到你配置的模组路径,请勿取消" />
<ProgressBar Margin="0,6,0,0" IsIndeterminate="True" />
</StackPanel>
</ContentDialog>
</Grid> </Grid>
</windowex:WindowEx> </windowex:WindowEx>

View File

@ -9,6 +9,8 @@ using System.Diagnostics;
using Windows.UI.ViewManagement; using Windows.UI.ViewManagement;
using Microsoft.UI.Xaml.Media; using Microsoft.UI.Xaml.Media;
using Microsoft.UI; using Microsoft.UI;
using static RustTools.muqing.wl;
using System.Threading;
// To learn more about WinUI, the WinUI project structure, // To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info. // and more about our project templates, see: http://aka.ms/winui-project-info.
@ -98,7 +100,7 @@ public sealed partial class ModulePage : WindowEx
ModulePageList.Remove(this); ModulePageList.Remove(this);
} }
private void AppBarButton_Click(object sender, RoutedEventArgs e) private async void AppBarButton_Click(object sender, RoutedEventArgs e)
{ {
var label = ((AppBarButton)sender).Name; var label = ((AppBarButton)sender).Name;
gj.sc(label); gj.sc(label);
@ -121,7 +123,58 @@ public sealed partial class ModulePage : WindowEx
break; break;
case "DownLoadButton": case "DownLoadButton":
var iniHelper = new IniHelper();
iniHelper.Load(IniHelper.FILE.Config);
var v = iniHelper.GetValue(IniHelper.CODE.Rust, IniHelper.KEY.ModFileUrl);
if (v == string.Empty)
{
var dialog=new ContentDialog()
{
XamlRoot = grid.XamlRoot,
Title="警告",
Content="请在设置中配置好模组路径再来",
SecondaryButtonText="取消"
};
await dialog.ShowAsync();
return;
}
var cancellationTokenSource = new CancellationTokenSource();
gj.sc("ÏÂÔØ´ËÄ£×é:" + Mod.Link); gj.sc("ÏÂÔØ´ËÄ£×é:" + Mod.Link);
var downloader = new FileDownloader();
var asyncOperation = DownloadDialog.ShowAsync();
DownloadDialog.Closing += DownloadDialog_Closing;
DownloadDialog.SecondaryButtonClick += (a, b) =>
{
gj.sc("删除");
cancellationTokenSource.Cancel();
downloader.Delete();
};
try
{
//下载链接 保存文件的本地路径
await downloader.DownloadFileAsync(Mod.Link, Path.Combine(v, Mod.Name), (totalBytesRead, totalBytes) =>
{
DownloadDialogText.Text = $"Downloaded {totalBytesRead} of {totalBytes} bytes. {(totalBytes > 0 ? (double)totalBytesRead / totalBytes * 100 : 0):0.00}% complete.";
//Debug.WriteLine($"Downloaded {totalBytesRead} of {totalBytes} bytes. {(totalBytes > 0 ? (double)totalBytesRead / totalBytes * 100 : 0):0.00}% complete.");
}, cancellationTokenSource.Token);
Debug.WriteLine("文件下载完成");
DownloadDialog.Closing -= DownloadDialog_Closing;
// 手动隐藏对话框
DownloadDialog.Hide();
}
catch (Exception ex)
{
Debug.WriteLine($"Error downloading file: {ex.Message}");
}
finally
{
DownloadDialog.Closing -= DownloadDialog_Closing;
DownloadDialog.Hide();
}
break; break;
} }
} }
@ -130,4 +183,15 @@ public sealed partial class ModulePage : WindowEx
{ {
} }
private void DownloadDialog_Closing(ContentDialog sender, ContentDialogClosingEventArgs args)
{
// Prevent the dialog from closing
if (args.Result != ContentDialogResult.Secondary)
{
args.Cancel = true;
}
}
} }

View File

@ -1,7 +1,16 @@
using System.Diagnostics;
using System.Reflection.Emit;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media;
using Microsoft.Win32; using Microsoft.Win32;
using Newtonsoft.Json.Linq;
using RustTools.muqing;
using Windows.ApplicationModel.Core;
using Windows.UI.Core;
using Microsoft.UI.Dispatching;
public class Mod public class Mod
{ {
@ -23,15 +32,81 @@ public class Mod
"Windows", "Windows 10", "Steam", "Windows", "Windows 10", "Steam",
"Genshin Impact Game", "Godot", "Gradle", "Genshin Impact Game", "Godot", "Gradle",
"WeGame", "Mental Omega", "WeGameApps", "WeGame", "Mental Omega", "WeGameApps",
"ramboplayGame", "QQ", "QQWORD" "ramboplayGame", "QQ", "QQWORD","Microsoft SDKs","Creator","editors","AndroidSDK","SDK","Pr","PR","PS","Ps","WE",
"androidstudioword","鸿图对战平台","xshell7"
}; };
//游戏位置 //游戏位置
public string FileDir = ""; public string FileDir =string.Empty;
public Mod() private readonly ContentDialog? dialog =null;
//在MainPage的后台code里面添加这个申明
public async void Invoke(Action action, Windows.UI.Core.CoreDispatcherPriority Priority = Windows.UI.Core.CoreDispatcherPriority.Normal)
{ {
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Priority, () => { action(); });
}
XamlRoot xamlRoot;
Action<string> action;
private DispatcherQueue _dispatcherQueue;
public Mod(XamlRoot xamlRoot, Action<string> action)
{
_dispatcherQueue = DispatcherQueue.GetForCurrentThread();
this.xamlRoot = xamlRoot;
this.action = action;
StartTime = DateTime.Now; StartTime = DateTime.Now;
Console.WriteLine("开始执行文件搜索引擎");
Debug.WriteLine("开始执行文件搜索引擎");
//先找steam中的位置 //先找steam中的位置
//steam();
if (FileDir == string.Empty) {
//找不到执行搜索引擎
gj.sc("找不到执行搜索引擎");
dialog = new ContentDialog()
{
XamlRoot = xamlRoot,
Title = "提示",
Content = "搜索中",
PrimaryButtonText = "关闭"
};
dialog.Closing += Dialog_Closing;
dialog.ShowAsync();
Task.Run(async () =>
{
await init();
// 使用 DispatcherQueue 将 UI 更新委托回 UI 线程
_dispatcherQueue.TryEnqueue(() => {
dialog.Closing -= Dialog_Closing;
dialog.Hide();
action?.Invoke(FileDir);
});
});
//if (IsSearch)
//{
//}
//var thread = new Thread(init);
//thread.Start();
//thread.Join();
}
//dialog.Closing -= Dialog_Closing;
//if (FileDir != string.Empty) {
// dialog.Content = FileDir;
//}
//dialog.Hide();
}
private void Dialog_Closing(ContentDialog sender, ContentDialogClosingEventArgs args){
gj.sc(args.Result);
if (args.Result != ContentDialogResult.Primary)
{
IsSearch = false;
args.Cancel = true;
}
}
private void steam()
{
var steamPath = GetSteamInstallPath(); var steamPath = GetSteamInstallPath();
if (!string.IsNullOrEmpty(steamPath)) if (!string.IsNullOrEmpty(steamPath))
{ {
@ -41,59 +116,25 @@ public class Mod
{ {
//结束计时 //结束计时
Console.WriteLine("已找到游戏文件路径 " + steamPath + "\\steamapps\\common\\Rusted Warfare"); Console.WriteLine("已找到游戏文件路径 " + steamPath + "\\steamapps\\common\\Rusted Warfare");
FileDir = steamPath+ "\\steamapps\\common\\Rusted Warfare"; FileDir = steamPath + "\\steamapps\\common\\Rusted Warfare";
EndTime(); EndTime();
} }
else else
{ {
Console.WriteLine("未找到游戏文件路径"); Console.WriteLine("未找到游戏文件路径");
init();
} }
} }
else else
{ {
Console.WriteLine("找不到steam的安装位置"); Console.WriteLine("找不到steam的安装位置");
init();
} }
} }
public string getUnitsDir()
{
if (FileDir==string.Empty) {
return string.Empty;
}
else
{
var v = Path.Combine(FileDir, "mods\\units");
if (Directory.Exists(v))
{
Directory.CreateDirectory(v);
}
return v;
}
}
public string getMaps()
{
if (FileDir == string.Empty)
{
return string.Empty;
}
else
{
var v = Path.Combine(FileDir, "mods\\maps");
if (!Directory.Exists(v))
{
Directory.CreateDirectory(v);
}
return v;
}
}
private void init() private async Task init()
{ {
var allDrives = DriveInfo.GetDrives();
DriveInfo[] allDrives = DriveInfo.GetDrives(); foreach (var d in allDrives)
foreach (DriveInfo d in allDrives)
{ {
Console.WriteLine(); Console.WriteLine();
// Console.WriteLine(" Drive type: {0}", d.DriveType); // Console.WriteLine(" Drive type: {0}", d.DriveType);
@ -107,17 +148,17 @@ public class Mod
//只要不是C盘 //只要不是C盘
if (name.Equals("C:\\")) if (name.Equals("C:\\"))
{ {
Console.WriteLine("在C盘快速找游戏文件路径"); Debug.WriteLine("在C盘快速找游戏文件路径");
FileSearch(name); //FileSearch(name);
} }
else else
{ {
Console.WriteLine("在其他盘中快速找游戏文件路径"); Debug.WriteLine("在其他盘中快速找游戏文件路径");
// steam\steamapps\common\Rusted Warfare // steam\steamapps\common\Rusted Warfare
// new FileSearch(name).Search(); // new FileSearch(name).Search();
if (Directory.Exists(name + "/Rusted Warfare")) if (Directory.Exists(name + "/Rusted Warfare"))
{ {
Console.WriteLine("找到游戏文件路径"); Debug.WriteLine("找到游戏文件路径");
EndTime(); EndTime();
break; break;
} }
@ -128,25 +169,20 @@ public class Mod
} }
} }
Console.WriteLine();
} }
} }
//是否找到游戏位置 //是否还搜索
bool IsFind = false; public bool IsSearch = true;
private void FileSearch(string path) private void FileSearch(string path)
{ {
if (IsFind) Debug.WriteLine("开始遍历文件夹" + path);
{
return;
}
Console.WriteLine("开始遍历文件夹" + path);
try try
{ {
// 遍历文件夹 // 遍历文件夹
foreach (var file in Directory.EnumerateDirectories(path)) foreach (var file in Directory.EnumerateDirectories(path))
{ {
if (IsFind) if (!IsSearch)
{ {
return; return;
} }
@ -160,19 +196,19 @@ public class Mod
var name = Path.GetFileName(file); var name = Path.GetFileName(file);
if (Isdot && name.StartsWith(".")) if (Isdot && name.StartsWith("."))
{ {
Console.WriteLine("排除。开头的文件夹" + file); Debug.WriteLine("排除。开头的文件夹" + file);
continue; continue;
} }
//排除掉列表中的文件夹 //排除掉列表中的文件夹
if (ExcludeFile.Contains(name)) if (ExcludeFile.Contains(name))
{ {
Console.WriteLine("排除列表中的文件夹" + file); Debug.WriteLine("排除列表中的文件夹" + file);
continue; continue;
} }
if (name.Equals("Rusted Warfare")) if (name.Equals("Rusted Warfare"))
{ {
IsFind = true; Debug.WriteLine("找到游戏文件路径" + file);
Console.WriteLine("找到游戏文件路径" + file); FileDir = file;
EndTime(); EndTime();
break; break;
} }
@ -198,7 +234,7 @@ public class Mod
private static string GetSteamInstallPath() private static string GetSteamInstallPath()
{ {
string installPath = GetInstallPathFromKey(@"Software\Valve\Steam"); var installPath = GetInstallPathFromKey(@"Software\Valve\Steam");
if (string.IsNullOrEmpty(installPath)) if (string.IsNullOrEmpty(installPath))
{ {
@ -226,7 +262,7 @@ public class Mod
{ {
if (key != null) if (key != null)
{ {
object path = key.GetValue("InstallPath"); var path = key.GetValue("InstallPath");
if (path != null) if (path != null)
{ {
return (string)path; return (string)path;

View File

@ -1,4 +1,5 @@
using RestSharp; using System.Threading;
using RestSharp;
namespace RustTools.muqing; namespace RustTools.muqing;
class wl class wl
@ -55,4 +56,50 @@ class wl
} }
return null; return null;
} }
public class FileDownloader
{
private readonly HttpClient _httpClient=new();
private bool IsDelete = false;
public FileDownloader()
{
}
public void Delete()
{
IsDelete = true;
}
public async Task DownloadFileAsync(string fileUrl, string savePath, Action<long, long> progress, CancellationToken cancellationToken)
{
using (var response = await _httpClient.GetAsync(fileUrl, HttpCompletionOption.ResponseHeadersRead))
{
response.EnsureSuccessStatusCode();
var totalBytes = response.Content.Headers.ContentLength ?? -1L;
var totalBytesRead = 0L;
var buffer = new byte[8192];
int bytesRead;
using (var contentStream = await response.Content.ReadAsStreamAsync())
using (var fileStream = new FileStream(savePath, FileMode.Create, FileAccess.Write, FileShare.None))
{
while ((bytesRead = await contentStream.ReadAsync(buffer, 0, buffer.Length, cancellationToken)) > 0)
{
//if (IsDelete) {
// break;
//}
await fileStream.WriteAsync(buffer, 0, bytesRead,cancellationToken);
totalBytesRead += bytesRead;
progress?.Invoke(totalBytesRead, totalBytes);
}
}
}
//if (IsDelete)
//{
// File.Delete(savePath);
//}
}
}
} }