mirror of
https://github.com/casksteven/Sweaty-Launcher.git
synced 2024-06-24 21:09:27 +00:00
Add files via upload
This commit is contained in:
commit
d4c4bb05c5
50 changed files with 4492 additions and 0 deletions
26
App.config
Normal file
26
App.config
Normal file
|
@ -0,0 +1,26 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
|
||||
</startup>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.2.1.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
25
App.xaml
Normal file
25
App.xaml
Normal file
|
@ -0,0 +1,25 @@
|
|||
<Application
|
||||
x:Class="Launcher.App"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:local="clr-namespace:Launcher"
|
||||
StartupUri="MainWindow.xaml">
|
||||
<Application.Resources>
|
||||
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="/Style/NavigationItemContainerStyle.xaml" />
|
||||
<ResourceDictionary Source="pack://application:,,,/Panuon.WPF.UI;component/Control.xaml" />
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
<DropShadowEffect
|
||||
x:Key="defaultShadow"
|
||||
BlurRadius="10"
|
||||
Opacity="0.2"
|
||||
ShadowDepth="0" />
|
||||
<FontFamily x:Key="remix">pack://application:,,,/Launcher;component/Res/#remixicon</FontFamily>
|
||||
|
||||
|
||||
</ResourceDictionary>
|
||||
|
||||
</Application.Resources>
|
||||
</Application>
|
103
App.xaml.cs
Normal file
103
App.xaml.cs
Normal file
|
@ -0,0 +1,103 @@
|
|||
using Launcher.Model;
|
||||
using Launcher.ViewModel;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Net;
|
||||
using System.Threading;
|
||||
using System.Windows;
|
||||
using System.Windows.Navigation;
|
||||
|
||||
namespace Launcher
|
||||
{
|
||||
/// <summary>
|
||||
/// App.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class App : Application
|
||||
{
|
||||
//#if DEBUG
|
||||
// private CultureInfo cultureOverride = new CultureInfo("en-US");
|
||||
//#endif
|
||||
System.Threading.Mutex mutex;
|
||||
|
||||
protected override void OnStartup(StartupEventArgs e)
|
||||
{
|
||||
|
||||
|
||||
ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true;
|
||||
|
||||
|
||||
AppDomain currentDomain = AppDomain.CurrentDomain;
|
||||
// 当前作用域出现未捕获异常时,使用MyHandler函数响应事件
|
||||
|
||||
#if !DEBUG
|
||||
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
//单例
|
||||
bool ret;
|
||||
mutex = new System.Threading.Mutex(true, "ElectronicNeedleTherapySystem", out ret);
|
||||
|
||||
|
||||
if (App.launcherConfig == null)
|
||||
{
|
||||
|
||||
App.launcherConfig = LauncherConfig.Load("config.json");
|
||||
|
||||
if (!string.IsNullOrEmpty(App.launcherConfig.Language))
|
||||
{
|
||||
CultureInfo cultureOverride = new CultureInfo(App.launcherConfig.Language);
|
||||
Thread.CurrentThread.CurrentCulture = cultureOverride;
|
||||
Thread.CurrentThread.CurrentUICulture = cultureOverride;
|
||||
}
|
||||
}
|
||||
|
||||
if (!ret)
|
||||
{
|
||||
MessageBox.Show(Launcher.Properties.Resources.tip_alreadyrunning);
|
||||
Environment.Exit(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
base.OnStartup(e);
|
||||
|
||||
}
|
||||
|
||||
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
|
||||
{
|
||||
Exception e = (Exception)args.ExceptionObject;
|
||||
|
||||
MessageBox.Show(e.Message + "\n" + "请吧程序目录下的 err.log 提交至项目issues!", Launcher.Properties.Resources.tip_crash_title);
|
||||
System.IO.File.WriteAllText("err.log", e.Message + JsonConvert.SerializeObject(e));
|
||||
Environment.Exit(0);
|
||||
|
||||
}
|
||||
|
||||
protected override void OnLoadCompleted(NavigationEventArgs e)
|
||||
{
|
||||
base.OnLoadCompleted(e);
|
||||
|
||||
}
|
||||
|
||||
protected override void OnExit(ExitEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
launcherConfig.Save("config.json");
|
||||
|
||||
if (HomeVM.Instacne.proxyController!=null)
|
||||
{
|
||||
HomeVM.Instacne.proxyController.Stop();
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
|
||||
base.OnExit(e);
|
||||
}
|
||||
|
||||
public static LauncherConfig launcherConfig;
|
||||
}
|
||||
}
|
140
Common/EmbedFileManager.cs
Normal file
140
Common/EmbedFileManager.cs
Normal file
|
@ -0,0 +1,140 @@
|
|||
using System;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Launcher.Common
|
||||
{
|
||||
internal class EmbedFileManager
|
||||
{
|
||||
/// <summary>
|
||||
/// 释放内嵌资源至指定位置
|
||||
/// </summary>
|
||||
/// <param name="resource">嵌入的资源,此参数写作:命名空间.文件夹名.文件名.扩展名</param>
|
||||
/// <param name="path">释放到位置</param>
|
||||
public static void ExtractFile(string file, string path)
|
||||
{
|
||||
var resource = $"Launcher.{file}";
|
||||
Assembly assembly = Assembly.GetExecutingAssembly();
|
||||
BufferedStream input = new BufferedStream(assembly.GetManifestResourceStream(resource));
|
||||
FileStream output = new FileStream(path, FileMode.Create);
|
||||
byte[] data = new byte[1024];
|
||||
int lengthEachRead;
|
||||
while ((lengthEachRead = input.Read(data, 0, data.Length)) > 0)
|
||||
{
|
||||
output.Write(data, 0, lengthEachRead);
|
||||
}
|
||||
output.Flush();
|
||||
output.Close();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static class RawFileHelper
|
||||
{
|
||||
public static byte[] GetKey(string file)
|
||||
{
|
||||
Stream sr = null; ;
|
||||
try
|
||||
{
|
||||
var _assembly = Assembly.GetExecutingAssembly();//获取当前执行代码的程序集
|
||||
sr = _assembly.GetManifestResourceStream($"Launcher.RSAPatch.{file}");
|
||||
|
||||
}
|
||||
catch
|
||||
{
|
||||
//AConsole.e(new Spectre.Console.Markup("访问资源错误"));
|
||||
throw;
|
||||
}
|
||||
|
||||
return streamToByteArray(sr);
|
||||
}
|
||||
|
||||
private static byte[] streamToByteArray(Stream input)
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
input.CopyTo(ms);
|
||||
return ms.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
public static class RSAPatchHelper
|
||||
{
|
||||
public static string TempFolder = Path.Combine(System.IO.Path.GetTempPath(),"com.launcher");
|
||||
|
||||
public static string WriteMhypbaseAllTo(Model.ServerItem item)
|
||||
{
|
||||
if (!Directory.Exists(TempFolder))
|
||||
{
|
||||
Directory.CreateDirectory(TempFolder);
|
||||
}
|
||||
var r = WriteDllTo(TempFolder);
|
||||
WriteInITo(TempFolder, item);
|
||||
return r;
|
||||
}
|
||||
|
||||
public static void CleanTemp()
|
||||
{
|
||||
Directory.Delete(TempFolder, true);
|
||||
}
|
||||
|
||||
public static string WriteDllTo(string folder)
|
||||
{
|
||||
string target_dll = Path.Combine(folder, "rsa.dll");
|
||||
try
|
||||
{
|
||||
EmbedFileManager.ExtractFile("RSAPatch.RSAPatch.dll", target_dll);
|
||||
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw;
|
||||
}
|
||||
return target_dll;
|
||||
|
||||
}
|
||||
|
||||
public static void WriteInITo(string folder, Model.ServerItem item)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
|
||||
if (App.launcherConfig.DebugMode)
|
||||
{
|
||||
// debug
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (!string.IsNullOrEmpty(item.RSAPrivateKey))
|
||||
{
|
||||
File.WriteAllText(Path.Combine(folder,"PrivateKey.txt"), item.RSAPrivateKey);
|
||||
}
|
||||
if (!string.IsNullOrEmpty(item.RSAPublicKey))
|
||||
{
|
||||
File.WriteAllText(Path.Combine(folder, "PublicKey.txt"), item.RSAPublicKey);
|
||||
}
|
||||
else
|
||||
{
|
||||
// use default
|
||||
File.WriteAllBytes(Path.Combine(folder, "PublicKey.txt"), RawFileHelper.GetKey("PublicKey.txt"));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static byte[] streamToByteArray(Stream input)
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
input.CopyTo(ms);
|
||||
return ms.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
186
Common/GameHelper.cs
Normal file
186
Common/GameHelper.cs
Normal file
|
@ -0,0 +1,186 @@
|
|||
using CommunityToolkit.Mvvm.Input;
|
||||
using Launcher.Control;
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
|
||||
namespace Launcher.Common
|
||||
{
|
||||
internal class GameHelper
|
||||
{
|
||||
[DllImport("InjectorLib.dll", CallingConvention = CallingConvention.Cdecl)]
|
||||
extern static bool Begin(string game_path, string dll_path);
|
||||
|
||||
|
||||
|
||||
public static void StartGame(string filePath,string target_dll)
|
||||
{
|
||||
string currentDir = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
|
||||
string dll_file = Path.Combine(currentDir, "InjectorLib.dll");
|
||||
if (File.Exists(filePath))
|
||||
{
|
||||
//if (!File.Exists("InjectorLib.dll"))
|
||||
//{
|
||||
// EmbedFileManager.ExtractFile("InjectorLib.dll", dll_file);
|
||||
//}
|
||||
|
||||
target_dll =Path.Combine(currentDir, target_dll);
|
||||
bool r=Begin(filePath, target_dll);
|
||||
|
||||
if (r)
|
||||
{
|
||||
SnackBar.Show("Inject Success!",null);
|
||||
}
|
||||
else
|
||||
{
|
||||
SnackBar.Show("Inject Failed!", null);
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static class GameRegReader
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取游戏目录,是静态方法
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static string GetGamePath()
|
||||
{
|
||||
try
|
||||
{
|
||||
string startpath = "";
|
||||
string launcherpath = GetLauncherPath();
|
||||
#region 获取游戏启动路径,和官方配置一致
|
||||
string cfgPath = Path.Combine(launcherpath, "config.ini");
|
||||
if (File.Exists(launcherpath) || File.Exists(cfgPath))
|
||||
{
|
||||
//获取游戏本体路径
|
||||
using (StreamReader reader = new StreamReader(cfgPath))
|
||||
{
|
||||
string[] abc = reader.ReadToEnd().Split(new string[] { "\r\n" }, StringSplitOptions.None);
|
||||
foreach (var item in abc)
|
||||
{
|
||||
//从官方获取更多配置
|
||||
if (item.IndexOf("game_install_path") != -1)
|
||||
{
|
||||
startpath += item.Substring(item.IndexOf("=") + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
byte[] bytearr = Encoding.UTF8.GetBytes(startpath);
|
||||
string path = Encoding.UTF8.GetString(bytearr);
|
||||
return path;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
/// <summary>
|
||||
/// 启动器地址
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static string GetLauncherPath()
|
||||
{
|
||||
try
|
||||
{
|
||||
RegistryKey key = Registry.LocalMachine; //打开指定注册表根
|
||||
//获取官方启动器路径
|
||||
string launcherpath = "";
|
||||
try
|
||||
{
|
||||
launcherpath = key.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\原神").GetValue("InstallPath").ToString();
|
||||
|
||||
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
launcherpath = key.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Genshin Impact").GetValue("InstallPath").ToString();
|
||||
|
||||
}
|
||||
|
||||
byte[] bytepath = Encoding.UTF8.GetBytes(launcherpath); //编码转换
|
||||
string path = Encoding.UTF8.GetString(bytepath);
|
||||
return path;
|
||||
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static string GetGameExePath()
|
||||
{
|
||||
|
||||
var gamepath = GetGamePath();
|
||||
if (gamepath == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
var cnpath = gamepath + @"/YuanShen.exe";
|
||||
var ospath = gamepath + @"/GenshinImpact.exe";
|
||||
|
||||
if (File.Exists(cnpath))
|
||||
{
|
||||
return cnpath;
|
||||
}
|
||||
else if (File.Exists(ospath))
|
||||
{
|
||||
return ospath;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static class GameLocalReader
|
||||
{
|
||||
|
||||
public static string GetGameExePath()
|
||||
{
|
||||
string Self = Process.GetCurrentProcess().MainModule.FileName;
|
||||
var Folder = Path.GetDirectoryName(Self);
|
||||
string ret;
|
||||
string cn = Path.Combine(Folder, "YuanShen.exe");
|
||||
string os = Path.Combine(Folder, "GenshinImpact.exe");
|
||||
if (File.Exists(cn))
|
||||
{
|
||||
ret = Path.Combine(Folder, cn);
|
||||
}
|
||||
else if (File.Exists(os))
|
||||
{
|
||||
ret = Path.Combine(Folder, os);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("未能从当前路径找到原神游戏文件!");
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static string GetGameExeFolder()
|
||||
{
|
||||
return Path.GetDirectoryName(GetGameExePath());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
17
Common/IProxy.cs
Normal file
17
Common/IProxy.cs
Normal file
|
@ -0,0 +1,17 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Launcher.Common
|
||||
{
|
||||
public interface IProxyController
|
||||
{
|
||||
bool _IsRun { get; set; }
|
||||
|
||||
void Start();
|
||||
|
||||
void Stop();
|
||||
}
|
||||
}
|
43
Common/IniHelper.cs
Normal file
43
Common/IniHelper.cs
Normal file
|
@ -0,0 +1,43 @@
|
|||
using System.IO;
|
||||
|
||||
namespace Launcher.Common
|
||||
{
|
||||
public static class IniHelper
|
||||
{
|
||||
// 声明INI文件的写操作函数 WritePrivateProfileString()
|
||||
[System.Runtime.InteropServices.DllImport("kernel32")]
|
||||
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
|
||||
|
||||
// 声明INI文件的读操作函数 GetPrivateProfileString()
|
||||
[System.Runtime.InteropServices.DllImport("kernel32")]
|
||||
private static extern int GetPrivateProfileString(string section, string key, string def, System.Text.StringBuilder retVal, int size, string filePath);
|
||||
|
||||
|
||||
/// 写入INI的方法
|
||||
public static void INIWrite(string section, string key, string value, string path)
|
||||
{
|
||||
// section=配置节点名称,key=键名,value=返回键值,path=路径
|
||||
WritePrivateProfileString(section, key, value, path);
|
||||
}
|
||||
|
||||
//读取INI的方法
|
||||
public static string INIRead(string section, string key, string path)
|
||||
{
|
||||
// 每次从ini中读取多少字节
|
||||
System.Text.StringBuilder temp = new System.Text.StringBuilder(255);
|
||||
|
||||
// section=配置节点名称,key=键名,temp=上面,path=路径
|
||||
GetPrivateProfileString(section, key, "", temp, 255, path);
|
||||
return temp.ToString();
|
||||
|
||||
}
|
||||
|
||||
//删除一个INI文件
|
||||
public static void INIDelete(string FilePath)
|
||||
{
|
||||
File.Delete(FilePath);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
40
Common/ProcessWatcher.cs
Normal file
40
Common/ProcessWatcher.cs
Normal file
|
@ -0,0 +1,40 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Launcher.Common
|
||||
{
|
||||
internal class ProcessWatcher
|
||||
{
|
||||
public Process proc;
|
||||
EventHandler pro_Exited;
|
||||
public ProcessWatcher(EventHandler pro_Exited)
|
||||
{
|
||||
this.pro_Exited = pro_Exited;
|
||||
}
|
||||
|
||||
public void Watch()
|
||||
{
|
||||
Process[] ps = Process.GetProcesses();
|
||||
|
||||
foreach (Process p in ps)
|
||||
{
|
||||
if (p.ProcessName== "GenshinImpact"||p.ProcessName== "YuanShen")
|
||||
{
|
||||
proc = p;
|
||||
}
|
||||
}
|
||||
|
||||
if (proc!=null)
|
||||
{
|
||||
proc.EnableRaisingEvents = true;
|
||||
proc.Exited += new EventHandler(pro_Exited);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
209
Common/ProxyHelper.cs
Normal file
209
Common/ProxyHelper.cs
Normal file
|
@ -0,0 +1,209 @@
|
|||
using Launcher.Model;
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Threading.Tasks;
|
||||
using Titanium.Web.Proxy;
|
||||
using Titanium.Web.Proxy.EventArguments;
|
||||
using Titanium.Web.Proxy.Models;
|
||||
|
||||
namespace Launcher.Common
|
||||
{
|
||||
internal static class ProxyHelper
|
||||
{
|
||||
|
||||
public static ProxyConfig GetCurrentProxy()
|
||||
{
|
||||
ProxyConfig proxyConfig = new ProxyConfig("127.0.0.1");
|
||||
|
||||
try
|
||||
{
|
||||
using (RegistryKey regkey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings"))
|
||||
{
|
||||
if (regkey.GetValue("ProxyEnable").ToString() == "1")
|
||||
{
|
||||
proxyConfig.ProxyEnable = true;
|
||||
}
|
||||
object ps = regkey.GetValue("ProxyServer");
|
||||
if (ps != null)
|
||||
{
|
||||
proxyConfig.ProxyServer = ps.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
ps = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine(ex.Message);
|
||||
}
|
||||
|
||||
return proxyConfig;
|
||||
}
|
||||
|
||||
public static void Clear_Proxy()
|
||||
{
|
||||
using (RegistryKey regkey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true))
|
||||
{
|
||||
try
|
||||
{
|
||||
regkey.SetValue("ProxyEnable", 0);
|
||||
regkey.DeleteValue("ProxyServer");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.Print(e.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class ProxyController
|
||||
{
|
||||
ProxyServer proxyServer;
|
||||
ExplicitProxyEndPoint explicitEndPoint;
|
||||
private string port;
|
||||
private string fakeHost;
|
||||
private bool usehttp;
|
||||
|
||||
public ProxyController(string port, string host, bool usehttp = false)
|
||||
{
|
||||
this.port = port;
|
||||
this.fakeHost = host;
|
||||
this.usehttp = usehttp;
|
||||
}
|
||||
|
||||
private bool IsRun;
|
||||
|
||||
public bool _IsRun
|
||||
{
|
||||
get { return proxyServer.ProxyRunning; }
|
||||
set { IsRun = value; }
|
||||
}
|
||||
|
||||
|
||||
public void Start()
|
||||
{
|
||||
if (GetCurrentProxy().ProxyEnable)
|
||||
{
|
||||
Clear_Proxy();
|
||||
}
|
||||
|
||||
proxyServer = new ProxyServer();
|
||||
var docp = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
|
||||
var certp = Path.Combine(docp, "rootCert.pfx");
|
||||
proxyServer.CertificateManager.PfxFilePath = certp;
|
||||
proxyServer.CertificateManager.EnsureRootCertificate();
|
||||
|
||||
|
||||
|
||||
proxyServer.BeforeRequest += OnRequest;
|
||||
proxyServer.ServerCertificateValidationCallback += OnCertificateValidation;
|
||||
if (String.IsNullOrEmpty(port))
|
||||
{
|
||||
port = 11451.ToString(); ;
|
||||
}
|
||||
|
||||
explicitEndPoint = new ExplicitProxyEndPoint(IPAddress.Any, int.Parse(port), true);
|
||||
|
||||
explicitEndPoint.BeforeTunnelConnectRequest += OnBeforeTunnelConnectRequest;
|
||||
|
||||
proxyServer.AddEndPoint(explicitEndPoint);
|
||||
proxyServer.Start();
|
||||
|
||||
|
||||
foreach (var endPoint in proxyServer.ProxyEndPoints)
|
||||
Console.WriteLine("Listening on '{0}' endpoint at Ip {1} and port: {2} ",
|
||||
endPoint.GetType().Name, endPoint.IpAddress, endPoint.Port);
|
||||
|
||||
proxyServer.SetAsSystemHttpProxy(explicitEndPoint);
|
||||
proxyServer.SetAsSystemHttpsProxy(explicitEndPoint);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void Stop()
|
||||
{
|
||||
try
|
||||
{
|
||||
explicitEndPoint.BeforeTunnelConnectRequest -= OnBeforeTunnelConnectRequest;
|
||||
proxyServer.BeforeRequest -= OnRequest;
|
||||
proxyServer.ServerCertificateValidationCallback -= OnCertificateValidation;
|
||||
|
||||
|
||||
}
|
||||
catch { }
|
||||
finally
|
||||
{
|
||||
if (proxyServer != null && proxyServer.ProxyRunning)
|
||||
{
|
||||
proxyServer.Stop();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void UninstallCertificate()
|
||||
{
|
||||
|
||||
proxyServer.CertificateManager.RemoveTrustedRootCertificate();
|
||||
proxyServer.CertificateManager.RemoveTrustedRootCertificateAsAdmin();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private async Task OnBeforeTunnelConnectRequest(object sender, TunnelConnectSessionEventArgs e)
|
||||
{
|
||||
string hostname = e.WebSession.Request.RequestUri.Host;
|
||||
if (hostname.EndsWith(".yuanshen.com") |
|
||||
hostname.EndsWith(".hoyoverse.com") |
|
||||
hostname.EndsWith(".mihoyo.com") | hostname.EndsWith(fakeHost))
|
||||
{
|
||||
e.DecryptSsl = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
e.DecryptSsl = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private async Task OnRequest(object sender, SessionEventArgs e)
|
||||
{
|
||||
string hostname = e.WebSession.Request.RequestUri.Host;
|
||||
if (hostname.EndsWith(".yuanshen.com") |
|
||||
hostname.EndsWith(".hoyoverse.com") |
|
||||
hostname.EndsWith(".mihoyo.com"))
|
||||
{
|
||||
string oHost = e.WebSession.Request.RequestUri.Host;
|
||||
e.HttpClient.Request.Url = e.HttpClient.Request.Url.Replace(oHost, fakeHost);
|
||||
if (usehttp)
|
||||
{
|
||||
e.HttpClient.Request.Url = e.HttpClient.Request.Url.Replace("https", "http");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Allows overriding default certificate validation logic
|
||||
private Task OnCertificateValidation(object sender, CertificateValidationEventArgs e)
|
||||
{
|
||||
e.IsValid = true;
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
174
Control/ServerEditControl.xaml
Normal file
174
Control/ServerEditControl.xaml
Normal file
|
@ -0,0 +1,174 @@
|
|||
<UserControl
|
||||
x:Class="Launcher.Control.ServerEditControl"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Launcher.Control"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:prop="clr-namespace:Launcher.Properties"
|
||||
xmlns:pu="clr-namespace:Panuon.WPF.UI;assembly=Panuon.WPF.UI"
|
||||
Name="root"
|
||||
d:DesignHeight="450"
|
||||
d:DesignWidth="800"
|
||||
d:Visibility="Visible"
|
||||
Visibility="Collapsed"
|
||||
mc:Ignorable="d">
|
||||
<Grid Background="#aa000000">
|
||||
|
||||
<Border
|
||||
Width="600"
|
||||
MinHeight="200"
|
||||
MaxHeight="400"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
Background="#f3f6fc"
|
||||
CornerRadius="20">
|
||||
<Grid Margin="20">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition />
|
||||
<RowDefinition Height="auto" />
|
||||
</Grid.RowDefinitions>
|
||||
<ScrollViewer>
|
||||
|
||||
<StackPanel>
|
||||
<TextBlock
|
||||
Margin="0,0,0,6"
|
||||
FontSize="17"
|
||||
FontWeight="Bold"
|
||||
Foreground="#294681"
|
||||
Text="{x:Static prop:Resources.h_serveredit}" />
|
||||
|
||||
<TextBox
|
||||
xmlns:Model="clr-namespace:Launcher.Model"
|
||||
Grid.Column="1"
|
||||
MinWidth="100"
|
||||
Margin="0,5,5,5"
|
||||
Padding="8"
|
||||
pu:TextBoxHelper.CornerRadius="4"
|
||||
pu:TextBoxHelper.FocusedBorderBrush="#2a73c5"
|
||||
pu:TextBoxHelper.Watermark="{x:Static prop:Resources.tip_srvname}"
|
||||
Background="Transparent"
|
||||
BorderThickness="1"
|
||||
FontSize="14"
|
||||
Text="{Binding ElementName=root, Path=ServerItem.Name}" />
|
||||
|
||||
<Grid Margin="0,0,5,0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition />
|
||||
<ColumnDefinition Width="auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<TextBox
|
||||
xmlns:Model="clr-namespace:Launcher.Model"
|
||||
MinWidth="100"
|
||||
Margin="0,5,5,5"
|
||||
Padding="8"
|
||||
pu:TextBoxHelper.CornerRadius="4"
|
||||
pu:TextBoxHelper.FocusedBorderBrush="#2a73c5"
|
||||
pu:TextBoxHelper.Watermark="127.0.0.1:8080"
|
||||
Background="Transparent"
|
||||
BorderThickness="1"
|
||||
FontSize="14"
|
||||
Text="{Binding ElementName=root, Path=ServerItem.proxy.ProxyServer}" />
|
||||
|
||||
<CheckBox
|
||||
Grid.Column="1"
|
||||
pu:CheckBoxHelper.CheckedGlyphBrush="#1e64d4"
|
||||
pu:CheckBoxHelper.CornerRadius="4"
|
||||
pu:CheckBoxHelper.GlyphThickness="3"
|
||||
pu:CheckBoxHelper.HoverBorderBrush="#1e64d4"
|
||||
Content="{x:Static prop:Resources.cb_usehttp}"
|
||||
FontSize="16"
|
||||
IsChecked="{Binding ElementName=root, Path=ServerItem.proxy.UseHttp}" />
|
||||
</Grid>
|
||||
<!--<TextBox
|
||||
xmlns:Model="clr-namespace:Launcher.Model"
|
||||
Grid.Column="1"
|
||||
MinWidth="100"
|
||||
Margin="0,5,0,5"
|
||||
Padding="8"
|
||||
pu:TextBoxHelper.CornerRadius="4"
|
||||
pu:TextBoxHelper.FocusedBorderBrush="#2a73c5"
|
||||
pu:TextBoxHelper.Watermark="服务器名称"
|
||||
Background="Transparent"
|
||||
BorderThickness="1"
|
||||
FontSize="14"
|
||||
Text="{Binding LauncherConfig.GameInfo.GameExePath}" />-->
|
||||
|
||||
<Expander Background="Transparent" BorderThickness="0">
|
||||
<Expander.Header>
|
||||
<TextBlock Text="{x:Static prop:Resources.t_advanced}" />
|
||||
</Expander.Header>
|
||||
|
||||
<StackPanel>
|
||||
<TextBox
|
||||
xmlns:Model="clr-namespace:Launcher.Model"
|
||||
MinWidth="100"
|
||||
Margin="0,5,5,5"
|
||||
Padding="8"
|
||||
pu:TextBoxHelper.CornerRadius="4"
|
||||
pu:TextBoxHelper.FocusedBorderBrush="#2a73c5"
|
||||
pu:TextBoxHelper.Watermark="{x:Static prop:Resources.tip_publickey}"
|
||||
AcceptsReturn="True"
|
||||
Background="Transparent"
|
||||
BorderThickness="1"
|
||||
FontSize="14"
|
||||
Text="{Binding ElementName=root, Path=ServerItem.RSAPublicKey}" />
|
||||
|
||||
<TextBox
|
||||
xmlns:Model="clr-namespace:Launcher.Model"
|
||||
MinWidth="100"
|
||||
Margin="0,5,5,5"
|
||||
Padding="8"
|
||||
pu:TextBoxHelper.CornerRadius="4"
|
||||
pu:TextBoxHelper.FocusedBorderBrush="#2a73c5"
|
||||
pu:TextBoxHelper.Watermark="{x:Static prop:Resources.tip_privatekey}"
|
||||
AcceptsReturn="True"
|
||||
Background="Transparent"
|
||||
BorderThickness="1"
|
||||
FontSize="14"
|
||||
Text="{Binding ElementName=root, Path=ServerItem.RSAPrivateKey}" />
|
||||
</StackPanel>
|
||||
</Expander>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
|
||||
<StackPanel
|
||||
Grid.Row="1"
|
||||
HorizontalAlignment="Right"
|
||||
Orientation="Horizontal">
|
||||
|
||||
<Button
|
||||
Padding="18,12"
|
||||
pu:ButtonHelper.ClickBackground="#88f8fafd"
|
||||
pu:ButtonHelper.CornerRadius="8"
|
||||
pu:ButtonHelper.HoverBackground="#88b8daf0"
|
||||
Background="Transparent"
|
||||
BorderThickness="0"
|
||||
Click="Button_Click_1"
|
||||
Content="{x:Static prop:Resources.tb_ok}"
|
||||
FontFamily="{StaticResource remix}"
|
||||
FontSize="14"
|
||||
FontWeight="Bold"
|
||||
Foreground="#558fd1" />
|
||||
<Button
|
||||
Margin="8,0,0,0"
|
||||
Padding="18,12"
|
||||
pu:ButtonHelper.ClickBackground="#44f8fafd"
|
||||
pu:ButtonHelper.CornerRadius="8"
|
||||
pu:ButtonHelper.HoverBackground="#44b8daf0"
|
||||
Background="Transparent"
|
||||
BorderThickness="0"
|
||||
Click="Button_Click"
|
||||
Content="取消"
|
||||
FontFamily="{StaticResource remix}"
|
||||
FontSize="14"
|
||||
Foreground="#558fd1"
|
||||
Visibility="Collapsed" />
|
||||
</StackPanel>
|
||||
|
||||
|
||||
</Grid>
|
||||
</Border>
|
||||
</Grid>
|
||||
</UserControl>
|
61
Control/ServerEditControl.xaml.cs
Normal file
61
Control/ServerEditControl.xaml.cs
Normal file
|
@ -0,0 +1,61 @@
|
|||
using Launcher.Model;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace Launcher.Control
|
||||
{
|
||||
/// <summary>
|
||||
/// ServerEditControl.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class ServerEditControl : UserControl
|
||||
{
|
||||
public static ServerEditControl instance;
|
||||
|
||||
public static void Show()
|
||||
{
|
||||
instance.Visibility =Visibility.Visible;
|
||||
}
|
||||
|
||||
public ServerEditControl()
|
||||
{
|
||||
InitializeComponent();
|
||||
instance = this;
|
||||
}
|
||||
|
||||
private void Button_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Visibility = Visibility.Collapsed;
|
||||
|
||||
}
|
||||
|
||||
public ServerItem ServerItem
|
||||
{
|
||||
get { return (ServerItem)GetValue(ServerItemProperty); }
|
||||
set { SetValue(ServerItemProperty, value); }
|
||||
}
|
||||
|
||||
// Using a DependencyProperty as the backing store for ServerItem. This enables animation, styling, binding, etc...
|
||||
public static readonly DependencyProperty ServerItemProperty =
|
||||
DependencyProperty.Register("ServerItem", typeof(ServerItem), typeof(ServerEditControl), new PropertyMetadata(null));
|
||||
|
||||
private void Button_Click_1(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
|
||||
Visibility = Visibility.Collapsed;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
36
Control/SnackBar.xaml
Normal file
36
Control/SnackBar.xaml
Normal file
|
@ -0,0 +1,36 @@
|
|||
<UserControl
|
||||
x:Class="Launcher.Control.SnackBar"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Launcher.Control"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:pu="clr-namespace:Panuon.WPF.UI;assembly=Panuon.WPF.UI"
|
||||
d:Width="200"
|
||||
mc:Ignorable="d">
|
||||
<Border Background="#FF312F36" CornerRadius="10">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition />
|
||||
<ColumnDefinition Width="auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock
|
||||
x:Name="msg_tb"
|
||||
Margin="10"
|
||||
Foreground="White"
|
||||
Text="这是一个SnackBar" />
|
||||
<Button
|
||||
x:Name="action_btn"
|
||||
Grid.Column="1"
|
||||
Margin="4"
|
||||
pu:ButtonHelper.ClickBackground="#301c54b2"
|
||||
pu:ButtonHelper.CornerRadius="4"
|
||||
Background="Transparent"
|
||||
Click="action_btn_Click"
|
||||
Content="确定"
|
||||
Cursor="Hand"
|
||||
Foreground="#1c54b2" />
|
||||
</Grid>
|
||||
|
||||
</Border>
|
||||
</UserControl>
|
96
Control/SnackBar.xaml.cs
Normal file
96
Control/SnackBar.xaml.cs
Normal file
|
@ -0,0 +1,96 @@
|
|||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace Launcher.Control
|
||||
{
|
||||
/// <summary>
|
||||
/// SnackBar.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class SnackBar : UserControl
|
||||
{
|
||||
public SnackBar()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public static void Show(string Msg, ICommand Command, string ActionStr = "确定")
|
||||
{
|
||||
var sb = new SnackBar();
|
||||
sb.Command = Command;
|
||||
sb.ActionStr = ActionStr;
|
||||
sb.Msg = Msg;
|
||||
|
||||
MainWindow.Instance.sb_container.Children.Add(sb);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public string Msg
|
||||
{
|
||||
get { return (string)GetValue(MsgProperty); }
|
||||
set { SetValue(MsgProperty, value); }
|
||||
}
|
||||
|
||||
// Using a DependencyProperty as the backing store for Msg. This enables animation, styling, binding, etc...
|
||||
public static readonly DependencyProperty MsgProperty =
|
||||
DependencyProperty.Register("Msg", typeof(string), typeof(SnackBar), new PropertyMetadata("这是一个 Snack Bar", (s, e) =>
|
||||
{
|
||||
var bar = s as SnackBar;
|
||||
if (bar != null)
|
||||
bar.msg_tb.Text = e.NewValue.ToString();
|
||||
|
||||
}));
|
||||
|
||||
|
||||
|
||||
public string ActionStr
|
||||
{
|
||||
get { return (string)GetValue(ActionStrProperty); }
|
||||
set { SetValue(ActionStrProperty, value); }
|
||||
}
|
||||
|
||||
// Using a DependencyProperty as the backing store for ActionStr. This enables animation, styling, binding, etc...
|
||||
public static readonly DependencyProperty ActionStrProperty =
|
||||
DependencyProperty.Register("ActionStr", typeof(string), typeof(SnackBar), new PropertyMetadata("确定", (s, e) =>
|
||||
{
|
||||
var bar = s as SnackBar;
|
||||
if (bar != null)
|
||||
bar.action_btn.Content = e.NewValue.ToString();
|
||||
|
||||
}));
|
||||
|
||||
private void action_btn_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (Command != null)
|
||||
{
|
||||
Command.Execute(null);
|
||||
|
||||
}
|
||||
|
||||
this.Visibility = Visibility.Collapsed;
|
||||
|
||||
StackPanel stackPanel = this.Parent as StackPanel;
|
||||
if (stackPanel != null)
|
||||
{
|
||||
stackPanel.Children.Remove(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public ICommand Command
|
||||
{
|
||||
get { return (ICommand)GetValue(CommandProperty); }
|
||||
set { SetValue(CommandProperty, value); }
|
||||
}
|
||||
|
||||
// Using a DependencyProperty as the backing store for Command. This enables animation, styling, binding, etc...
|
||||
public static readonly DependencyProperty CommandProperty =
|
||||
DependencyProperty.Register("Command", typeof(ICommand), typeof(SnackBar), new PropertyMetadata(null));
|
||||
|
||||
|
||||
}
|
||||
}
|
BIN
Costura64/InjectorLib.dll
Normal file
BIN
Costura64/InjectorLib.dll
Normal file
Binary file not shown.
7
FodyWeavers.xml
Normal file
7
FodyWeavers.xml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
|
||||
<Costura>
|
||||
<Unmanaged64Assemblies>
|
||||
InjectorLib
|
||||
</Unmanaged64Assemblies>
|
||||
</Costura>
|
||||
</Weavers>
|
404
Launcher.csproj
Normal file
404
Launcher.csproj
Normal file
|
@ -0,0 +1,404 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="packages\Costura.Fody.5.7.0\build\Costura.Fody.props" Condition="Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" />
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{D3AA2F83-0262-4994-928F-497847A6C8EC}</ProjectGuid>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<RootNamespace>Launcher</RootNamespace>
|
||||
<AssemblyName>Launcher</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||
<Deterministic>true</Deterministic>
|
||||
<NuGetPackageImportStamp>
|
||||
</NuGetPackageImportStamp>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>bin\x64\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<LangVersion>7.3</LangVersion>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<Prefer32Bit>true</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<OutputPath>bin\x64\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<LangVersion>7.3</LangVersion>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<Prefer32Bit>true</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="MultilingualAppToolkit">
|
||||
<MultilingualAppToolkitVersion>4.0</MultilingualAppToolkitVersion>
|
||||
<MultilingualFallbackLanguage>zh-CN</MultilingualFallbackLanguage>
|
||||
<TranslationReport Condition="'$(Configuration)' == 'Release'">true</TranslationReport>
|
||||
<SuppressPseudoWarning Condition="'$(Configuration)' == 'Debug'">true</SuppressPseudoWarning>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="BouncyCastle.Crypto, Version=1.8.8.0, Culture=neutral, PublicKeyToken=0e99375e54769942, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Portable.BouncyCastle.1.8.8\lib\net40\BouncyCastle.Crypto.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="BrotliSharpLib, Version=0.3.2.0, Culture=neutral, PublicKeyToken=3f4e2a1cd615fcb7, processorArchitecture=MSIL">
|
||||
<HintPath>packages\BrotliSharpLib.0.3.3\lib\net451\BrotliSharpLib.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="CommunityToolkit.Mvvm, Version=8.0.0.0, Culture=neutral, PublicKeyToken=4aff67a105548ee2, processorArchitecture=MSIL">
|
||||
<HintPath>packages\CommunityToolkit.Mvvm.8.0.0\lib\netstandard2.0\CommunityToolkit.Mvvm.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Costura, Version=5.7.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="InjectorLib">
|
||||
<HintPath>.\InjectorLib.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Win32.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Win32.Registry, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Microsoft.Win32.Registry.5.0.0\lib\net461\Microsoft.Win32.Registry.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Panuon.WPF, Version=1.0.1.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Panuon.WPF.1.0.1\lib\net472\Panuon.WPF.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Panuon.WPF.UI, Version=1.1.6.5, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Panuon.WPF.UI.1.1.6.5\lib\net472\Panuon.WPF.UI.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.AppContext, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.ComponentModel.Annotations, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.ComponentModel.Annotations.5.0.0\lib\net461\System.ComponentModel.Annotations.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.ComponentModel.Composition" />
|
||||
<Reference Include="System.ComponentModel.DataAnnotations" />
|
||||
<Reference Include="System.Console, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Console.4.3.0\lib\net46\System.Console.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Diagnostics.DiagnosticSource.4.3.0\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Diagnostics.Tracing, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Diagnostics.Tracing.4.3.0\lib\net462\System.Diagnostics.Tracing.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Globalization.Calendars, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.IO.Compression.FileSystem" />
|
||||
<Reference Include="System.IO.Compression.ZipFile, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.IO.FileSystem, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.IO.FileSystem.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Linq, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Linq.4.3.0\lib\net463\System.Linq.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Linq.Expressions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Sockets, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Numerics" />
|
||||
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Reflection, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.Extensions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.InteropServices, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Runtime.InteropServices.4.3.0\lib\net463\System.Runtime.InteropServices.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Security.AccessControl, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Security.AccessControl.5.0.0\lib\net461\System.Security.AccessControl.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Security.Cryptography.Algorithms, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Security.Principal.Windows, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Security.Principal.Windows.5.0.0\lib\net461\System.Security.Principal.Windows.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Text.RegularExpressions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Text.RegularExpressions.4.3.0\lib\net463\System.Text.RegularExpressions.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="System.Xaml">
|
||||
<RequiredTargetFramework>4.0</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Xml.ReaderWriter, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Titanium.Web.Proxy, Version=1.0.1.0, Culture=neutral, PublicKeyToken=8e41e1f1c790d7cf, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Titanium.Web.Proxy.3.2.0\lib\net461\Titanium.Web.Proxy.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="WindowsBase" />
|
||||
<Reference Include="PresentationCore" />
|
||||
<Reference Include="PresentationFramework" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ApplicationDefinition Include="App.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</ApplicationDefinition>
|
||||
<Compile Include="Common\EmbedFileManager.cs" />
|
||||
<Compile Include="Common\GameHelper.cs" />
|
||||
<Compile Include="Common\IniHelper.cs" />
|
||||
<Compile Include="Common\ProcessWatcher.cs" />
|
||||
<Compile Include="Common\ProxyHelper.cs" />
|
||||
<Compile Include="Control\ServerEditControl.xaml.cs">
|
||||
<DependentUpon>ServerEditControl.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Control\SnackBar.xaml.cs">
|
||||
<DependentUpon>SnackBar.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Model\GameInfo.cs" />
|
||||
<Compile Include="Model\LauncherConfig.cs" />
|
||||
<Compile Include="Model\PkgVersionItem.cs" />
|
||||
<Compile Include="Model\ProxyConfig.cs" />
|
||||
<Compile Include="Model\ServerItem.cs" />
|
||||
<Compile Include="ViewModel\HomeVM.cs" />
|
||||
<Compile Include="ViewModel\SettingVM.cs" />
|
||||
<Compile Include="View\About.xaml.cs">
|
||||
<DependentUpon>About.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="View\Home.xaml.cs">
|
||||
<DependentUpon>Home.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="View\Setting.xaml.cs">
|
||||
<DependentUpon>Setting.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Page Include="Control\ServerEditControl.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Control\SnackBar.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="MainWindow.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Compile Include="App.xaml.cs">
|
||||
<DependentUpon>App.xaml</DependentUpon>
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="MainWindow.xaml.cs">
|
||||
<DependentUpon>MainWindow.xaml</DependentUpon>
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Page Include="Style\NavigationItemContainerStyle.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="View\About.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="View\Home.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="View\Setting.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Properties\AssemblyInfo.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\Settings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
<EmbeddedResource Include="Properties\Resources.en.resx" />
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>PublicResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
<None Include="app.manifest" />
|
||||
<None Include="packages.config" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<Resource Include="Res\remixicon.ttf" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Costura64\InjectorLib.dll" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Resource Include="key\GC-Dispatch.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="RSAPatch\PublicKey.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="RSAPatch\RSAPatch.dll" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<XliffResource Include="MultilingualResources\Launcher.en.xlf" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="packages\CommunityToolkit.Mvvm.8.0.0\build\netstandard2.0\CommunityToolkit.Mvvm.targets" Condition="Exists('packages\CommunityToolkit.Mvvm.8.0.0\build\netstandard2.0\CommunityToolkit.Mvvm.targets')" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('packages\CommunityToolkit.Mvvm.8.0.0\build\netstandard2.0\CommunityToolkit.Mvvm.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\CommunityToolkit.Mvvm.8.0.0\build\netstandard2.0\CommunityToolkit.Mvvm.targets'))" />
|
||||
<Error Condition="!Exists('packages\Fody.6.5.5\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Fody.6.5.5\build\Fody.targets'))" />
|
||||
<Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.props'))" />
|
||||
<Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.targets'))" />
|
||||
</Target>
|
||||
<Import Project="packages\Fody.6.5.5\build\Fody.targets" Condition="Exists('packages\Fody.6.5.5\build\Fody.targets')" />
|
||||
<Import Project="packages\Costura.Fody.5.7.0\build\Costura.Fody.targets" Condition="Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" />
|
||||
<Import Project="$(MSBuildExtensionsPath)\Microsoft\Multilingual App Toolkit\Microsoft.Multilingual.ResxResources.targets" Label="MultilingualAppToolkit" Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\Multilingual App Toolkit\v$(MultilingualAppToolkitVersion)\Microsoft.Multilingual.ResxResources.targets')" />
|
||||
<Target Name="MATPrerequisite" BeforeTargets="PrepareForBuild" Condition="!Exists('$(MSBuildExtensionsPath)\Microsoft\Multilingual App Toolkit\Microsoft.Multilingual.ResxResources.targets')" Label="MultilingualAppToolkit">
|
||||
<Warning Text="$(MSBuildProjectFile) is Multilingual build enabled, but the Multilingual App Toolkit is unavailable during the build. If building with Visual Studio, please check to ensure that toolkit is properly installed." />
|
||||
</Target>
|
||||
</Project>
|
51
Launcher.sln
Normal file
51
Launcher.sln
Normal file
|
@ -0,0 +1,51 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.3.32901.215
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Launcher", "Launcher.csproj", "{D3AA2F83-0262-4994-928F-497847A6C8EC}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "InjectorLib", "..\InjectorLib\InjectorLib.vcxproj", "{6858E5BA-50F9-489C-98BB-69A785A6FF31}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{D3AA2F83-0262-4994-928F-497847A6C8EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D3AA2F83-0262-4994-928F-497847A6C8EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D3AA2F83-0262-4994-928F-497847A6C8EC}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{D3AA2F83-0262-4994-928F-497847A6C8EC}.Debug|x64.Build.0 = Debug|x64
|
||||
{D3AA2F83-0262-4994-928F-497847A6C8EC}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{D3AA2F83-0262-4994-928F-497847A6C8EC}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{D3AA2F83-0262-4994-928F-497847A6C8EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D3AA2F83-0262-4994-928F-497847A6C8EC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{D3AA2F83-0262-4994-928F-497847A6C8EC}.Release|x64.ActiveCfg = Release|x64
|
||||
{D3AA2F83-0262-4994-928F-497847A6C8EC}.Release|x64.Build.0 = Release|x64
|
||||
{D3AA2F83-0262-4994-928F-497847A6C8EC}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{D3AA2F83-0262-4994-928F-497847A6C8EC}.Release|x86.Build.0 = Release|Any CPU
|
||||
{6858E5BA-50F9-489C-98BB-69A785A6FF31}.Debug|Any CPU.ActiveCfg = Debug|x64
|
||||
{6858E5BA-50F9-489C-98BB-69A785A6FF31}.Debug|Any CPU.Build.0 = Debug|x64
|
||||
{6858E5BA-50F9-489C-98BB-69A785A6FF31}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{6858E5BA-50F9-489C-98BB-69A785A6FF31}.Debug|x64.Build.0 = Debug|x64
|
||||
{6858E5BA-50F9-489C-98BB-69A785A6FF31}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{6858E5BA-50F9-489C-98BB-69A785A6FF31}.Debug|x86.Build.0 = Debug|Win32
|
||||
{6858E5BA-50F9-489C-98BB-69A785A6FF31}.Release|Any CPU.ActiveCfg = Release|x64
|
||||
{6858E5BA-50F9-489C-98BB-69A785A6FF31}.Release|Any CPU.Build.0 = Release|x64
|
||||
{6858E5BA-50F9-489C-98BB-69A785A6FF31}.Release|x64.ActiveCfg = Release|x64
|
||||
{6858E5BA-50F9-489C-98BB-69A785A6FF31}.Release|x64.Build.0 = Release|x64
|
||||
{6858E5BA-50F9-489C-98BB-69A785A6FF31}.Release|x86.ActiveCfg = Release|Win32
|
||||
{6858E5BA-50F9-489C-98BB-69A785A6FF31}.Release|x86.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {176C524C-E912-426F-A7B3-ADBCAF646C01}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
137
MainWindow.xaml
Normal file
137
MainWindow.xaml
Normal file
|
@ -0,0 +1,137 @@
|
|||
<Window
|
||||
x:Class="Launcher.MainWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:control="clr-namespace:Launcher.Control"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Launcher"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:prop="clr-namespace:Launcher.Properties"
|
||||
xmlns:pu="clr-namespace:Panuon.WPF.UI;assembly=Panuon.WPF.UI"
|
||||
Title="MainWindow"
|
||||
Width="820"
|
||||
Height="450"
|
||||
ResizeMode="NoResize"
|
||||
Topmost="False"
|
||||
mc:Ignorable="d">
|
||||
<WindowChrome.WindowChrome>
|
||||
<WindowChrome GlassFrameThickness="1" NonClientFrameEdges="None" />
|
||||
</WindowChrome.WindowChrome>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="220" />
|
||||
<ColumnDefinition />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid Background="#f3f6fc" Effect="{StaticResource defaultShadow}">
|
||||
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="60" />
|
||||
<RowDefinition />
|
||||
</Grid.RowDefinitions>
|
||||
<StackPanel Margin="0,30,0,0">
|
||||
<TextBlock
|
||||
HorizontalAlignment="Center"
|
||||
FontSize="20"
|
||||
FontWeight="Bold"
|
||||
Text="Launcher" />
|
||||
</StackPanel>
|
||||
<ListBox
|
||||
x:Name="nav"
|
||||
Grid.Row="1"
|
||||
Padding="10"
|
||||
Background="Transparent"
|
||||
BorderThickness="0"
|
||||
ItemContainerStyle="{DynamicResource NavigationItemContainerStyle}"
|
||||
SelectedIndex="0"
|
||||
SelectionChanged="ListBox_SelectionChanged">
|
||||
<ListBoxItem>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock
|
||||
Margin="0,0,8,0"
|
||||
VerticalAlignment="Center"
|
||||
FontFamily="{StaticResource remix}"
|
||||
FontSize="18"
|
||||
Text="" />
|
||||
<TextBlock Text="{x:Static prop:Resources.nav_home}" />
|
||||
</StackPanel>
|
||||
</ListBoxItem>
|
||||
<ListBoxItem>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock
|
||||
Margin="0,0,8,0"
|
||||
VerticalAlignment="Center"
|
||||
FontFamily="{StaticResource remix}"
|
||||
FontSize="18"
|
||||
Text="" />
|
||||
<TextBlock Text="{x:Static prop:Resources.nav_setting}" />
|
||||
</StackPanel>
|
||||
</ListBoxItem>
|
||||
<ListBoxItem>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock
|
||||
Margin="0,0,8,0"
|
||||
VerticalAlignment="Center"
|
||||
FontFamily="{StaticResource remix}"
|
||||
FontSize="18"
|
||||
Text="" />
|
||||
<TextBlock Text="{x:Static prop:Resources.nav_about}" />
|
||||
</StackPanel>
|
||||
</ListBoxItem>
|
||||
</ListBox>
|
||||
<Button
|
||||
Grid.Row="1"
|
||||
Width="50"
|
||||
Margin="16"
|
||||
Padding="8"
|
||||
HorizontalAlignment="Left"
|
||||
VerticalAlignment="Bottom"
|
||||
pu:ButtonHelper.ClickBackground="#88FFEBEE"
|
||||
pu:ButtonHelper.CornerRadius="18"
|
||||
pu:ButtonHelper.HoverBackground="#ffebee"
|
||||
Background="Transparent"
|
||||
BorderThickness="0"
|
||||
Click="Button_Click"
|
||||
FontFamily="{StaticResource remix}"
|
||||
FontSize="14"
|
||||
Foreground="#C62828">
|
||||
<!--<StackPanel Orientation="Horizontal">-->
|
||||
<TextBlock
|
||||
VerticalAlignment="Center"
|
||||
FontFamily="{StaticResource remix}"
|
||||
FontSize="18"
|
||||
Text="" />
|
||||
<!--<TextBlock Text="退出" />-->
|
||||
<!--</StackPanel>-->
|
||||
</Button>
|
||||
</Grid>
|
||||
|
||||
|
||||
<Grid
|
||||
x:Name="dialogHost"
|
||||
Grid.ColumnSpan="2"
|
||||
Panel.ZIndex="100">
|
||||
<control:ServerEditControl />
|
||||
</Grid>
|
||||
|
||||
<StackPanel
|
||||
xmlns:control="clr-namespace:Launcher.Control"
|
||||
x:Name="sb_container"
|
||||
Grid.ColumnSpan="2"
|
||||
Margin="20"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Bottom"
|
||||
Panel.ZIndex="10">
|
||||
|
||||
<control:SnackBar
|
||||
ActionStr="按钮"
|
||||
Msg="Message!!"
|
||||
Visibility="Collapsed" />
|
||||
|
||||
</StackPanel>
|
||||
<Frame
|
||||
Name="rootFrame"
|
||||
Grid.Column="1"
|
||||
NavigationUIVisibility="Hidden"
|
||||
Source="/View/Home.xaml" />
|
||||
</Grid>
|
||||
</Window>
|
54
MainWindow.xaml.cs
Normal file
54
MainWindow.xaml.cs
Normal file
|
@ -0,0 +1,54 @@
|
|||
using Launcher.Model;
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Threading;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace Launcher
|
||||
{
|
||||
/// <summary>
|
||||
/// MainWindow.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class MainWindow : Window
|
||||
{
|
||||
public static MainWindow Instance { get; private set; }
|
||||
|
||||
|
||||
public MainWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
Instance = this;
|
||||
|
||||
}
|
||||
|
||||
protected override void OnSourceInitialized(EventArgs e)
|
||||
{
|
||||
base.OnSourceInitialized(e);
|
||||
|
||||
}
|
||||
|
||||
private void Button_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
var lb = sender as ListBox;
|
||||
|
||||
if (rootFrame == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (lb.SelectedIndex)
|
||||
{
|
||||
case 0: rootFrame.Navigate(new Uri("View/Home.xaml", UriKind.Relative)); break;
|
||||
case 1: rootFrame.Navigate(new Uri("View/Setting.xaml", UriKind.Relative)); break;
|
||||
case 2: rootFrame.Navigate(new Uri("View/About.xaml", UriKind.Relative)); break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
79
Model/GameInfo.cs
Normal file
79
Model/GameInfo.cs
Normal file
|
@ -0,0 +1,79 @@
|
|||
using System.IO;
|
||||
|
||||
namespace Launcher.Model
|
||||
{
|
||||
//public enum GameVer
|
||||
//{
|
||||
// OSRELWin3_2_0,
|
||||
// CNRELWin3_2_0
|
||||
//}
|
||||
|
||||
public class GameInfo
|
||||
{
|
||||
public string GameExeFolder
|
||||
{
|
||||
get
|
||||
{
|
||||
return Path.GetDirectoryName(GameExePath);
|
||||
}
|
||||
}
|
||||
|
||||
public string GetGameDataFolder()
|
||||
{
|
||||
var dataDirName = string.Empty;
|
||||
switch (GetGameType())
|
||||
{
|
||||
case GameType.CN:
|
||||
dataDirName = "YuanShen_Data";
|
||||
break;
|
||||
case GameType.OS:
|
||||
dataDirName = "GenshinImpact_Data";
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return Path.Combine(GameExeFolder, dataDirName);
|
||||
}
|
||||
|
||||
//public GameVer? Version { get; set; }
|
||||
|
||||
public GameInfo(string gameExePath)
|
||||
{
|
||||
GameExePath = gameExePath;
|
||||
|
||||
//Version = null;
|
||||
//GameExeFolder = Path.GetDirectoryName(gameExePath);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public enum GameType
|
||||
{
|
||||
CN,
|
||||
OS,
|
||||
UnKnown,
|
||||
}
|
||||
|
||||
public GameType GetGameType()
|
||||
{
|
||||
GameType gameType = GameType.UnKnown;
|
||||
|
||||
if (Directory.Exists(Path.Combine(GameExeFolder, "YuanShen_Data")))
|
||||
{
|
||||
gameType = GameType.CN;
|
||||
}
|
||||
else if (Directory.Exists(Path.Combine(GameExeFolder, "GenshinImpact_Data")))
|
||||
{
|
||||
gameType = GameType.OS;
|
||||
}
|
||||
|
||||
return gameType;
|
||||
}
|
||||
|
||||
public string GameExePath { get; set; }
|
||||
|
||||
}
|
||||
}
|
92
Model/LauncherConfig.cs
Normal file
92
Model/LauncherConfig.cs
Normal file
|
@ -0,0 +1,92 @@
|
|||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using Newtonsoft.Json;
|
||||
using Panuon.WPF;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.IO;
|
||||
using static Org.BouncyCastle.Math.EC.ECCurve;
|
||||
|
||||
namespace Launcher.Model
|
||||
{
|
||||
public enum ProxyType
|
||||
{
|
||||
OFFICIAL,
|
||||
PRIVATE,
|
||||
PROXY_ONLY
|
||||
}
|
||||
|
||||
|
||||
public partial class LauncherConfig : ObservableObject
|
||||
{
|
||||
|
||||
|
||||
|
||||
public static LauncherConfig Load(string file)
|
||||
{
|
||||
if (File.Exists(file))
|
||||
{
|
||||
var content = File.ReadAllText(file);
|
||||
return JsonConvert.DeserializeObject<LauncherConfig>(content) ?? new LauncherConfig();
|
||||
}
|
||||
else
|
||||
{
|
||||
return new LauncherConfig();
|
||||
}
|
||||
}
|
||||
|
||||
public void Save(string file)
|
||||
{
|
||||
File.WriteAllText(file, JsonConvert.SerializeObject(this));
|
||||
}
|
||||
|
||||
|
||||
|
||||
//public GameInfo GameInfo { get; set; }
|
||||
//public ProxyType ProxyType { get; set; }
|
||||
//public ObservableCollection<ServerItem> Servers { get; set; }
|
||||
|
||||
public bool DebugMode { get; set; }
|
||||
|
||||
public string Language { get; set; }
|
||||
|
||||
|
||||
public string BgUrl { get; set; } = "https://i0.hdslb.com/bfs/new_dyn/be2c9d48dfa1e57161609e693b48982a401742377.png";
|
||||
|
||||
private GameInfo gameInfo;
|
||||
|
||||
private ProxyType pType;
|
||||
|
||||
public ProxyType ProxyType
|
||||
{
|
||||
get { return pType; }
|
||||
set { SetProperty(ref pType, value); }
|
||||
}
|
||||
|
||||
|
||||
public GameInfo GameInfo
|
||||
{
|
||||
get { return gameInfo; }
|
||||
set { SetProperty(ref gameInfo, value); }
|
||||
}
|
||||
|
||||
private int selectedSrvIndex;
|
||||
|
||||
public int SelectedSrvIndex
|
||||
{
|
||||
get { return selectedSrvIndex; }
|
||||
set { SetProperty(ref selectedSrvIndex , value); }
|
||||
}
|
||||
|
||||
|
||||
private ObservableCollection<ServerItem> servers = new ObservableCollection<ServerItem>();
|
||||
|
||||
public ObservableCollection<ServerItem> Servers
|
||||
{
|
||||
get { return servers; }
|
||||
set { SetProperty(ref servers, value); }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
22
Model/PkgVersionItem.cs
Normal file
22
Model/PkgVersionItem.cs
Normal file
|
@ -0,0 +1,22 @@
|
|||
using System;
|
||||
|
||||
namespace Launcher.Model
|
||||
{
|
||||
[Obsolete]
|
||||
public class PkgVersionItem
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public string remoteName { get; set; }
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public string md5 { get; set; }
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public int fileSize { get; set; }
|
||||
|
||||
}
|
||||
}
|
21
Model/ProxyConfig.cs
Normal file
21
Model/ProxyConfig.cs
Normal file
|
@ -0,0 +1,21 @@
|
|||
namespace Launcher.Model
|
||||
{
|
||||
public class ProxyConfig
|
||||
{
|
||||
|
||||
public ProxyConfig(string proxyServer, bool usehttp = false, string proxyPort = "25565")
|
||||
{
|
||||
ProxyServer = proxyServer;
|
||||
UseHttp = usehttp;
|
||||
ProxyPort = proxyPort;
|
||||
}
|
||||
|
||||
public string ProxyServer { get; set; }
|
||||
|
||||
public string ProxyPort { get; set; }
|
||||
|
||||
public bool UseHttp { get; set; }
|
||||
public bool ProxyEnable { get; internal set; }
|
||||
|
||||
}
|
||||
}
|
14
Model/ServerItem.cs
Normal file
14
Model/ServerItem.cs
Normal file
|
@ -0,0 +1,14 @@
|
|||
namespace Launcher.Model
|
||||
{
|
||||
public class ServerItem
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Description { get; set; }
|
||||
|
||||
public ProxyConfig proxy { get; set; }
|
||||
|
||||
public string RSAPublicKey { get; set; }
|
||||
|
||||
public string RSAPrivateKey { get; set; }
|
||||
}
|
||||
}
|
201
MultilingualResources/Launcher.en.xlf
Normal file
201
MultilingualResources/Launcher.en.xlf
Normal file
|
@ -0,0 +1,201 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
|
||||
<file datatype="xml" source-language="zh-CN" target-language="en" original="LAUNCHER/PROPERTIES/RESOURCES.RESX" tool-id="MultilingualAppToolkit" product-name="n/a" product-version="n/a" build-num="n/a">
|
||||
<header>
|
||||
<tool tool-id="MultilingualAppToolkit" tool-name="Multilingual App Toolkit" tool-version="1.0.0.0" tool-company="Microsoft" />
|
||||
</header>
|
||||
<body>
|
||||
<group id="LAUNCHER/PROPERTIES/RESOURCES.RESX" datatype="resx">
|
||||
<trans-unit id="nav_about" translate="yes" xml:space="preserve">
|
||||
<source>关于</source>
|
||||
<target state="needs-review-translation" state-qualifier="tm-suggestion">About</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="nav_home" translate="yes" xml:space="preserve">
|
||||
<source>主页</source>
|
||||
<target state="needs-review-translation" state-qualifier="tm-suggestion">Home</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="nav_setting" translate="yes" xml:space="preserve">
|
||||
<source>设置</source>
|
||||
<target state="needs-review-translation" state-qualifier="tm-suggestion">Settings</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="about_desp" translate="yes" xml:space="preserve">
|
||||
<source>+ 支持的版本:3.1, 3.2, 3.2.50, 3.3, 与 gc-toolkit/RSAPatch 保持同步。</source>
|
||||
<target state="translated">+ Supported versions: 3.1, 3.2, 3.2.50, 3.3, Synchronized with gc toolkit/RSAPatch.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="btn_searchgame" translate="yes" xml:space="preserve">
|
||||
<source>自动搜索</source>
|
||||
<target state="needs-review-translation" state-qualifier="tm-suggestion">Auto Detect</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="btn_selectgame" translate="yes" xml:space="preserve">
|
||||
<source>手动选择</source>
|
||||
<target state="needs-review-translation" state-qualifier="tm-suggestion">Manual</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="cb_enabledebug" translate="yes" xml:space="preserve">
|
||||
<source>开启调试</source>
|
||||
<target state="translated">Enable DebugMode</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="h_about" translate="yes" xml:space="preserve">
|
||||
<source>关于</source>
|
||||
<target state="needs-review-translation" state-qualifier="tm-suggestion">About</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="h_develop" translate="yes" xml:space="preserve">
|
||||
<source>开发</source>
|
||||
<target state="needs-review-translation" state-qualifier="tm-suggestion">Development</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="h_general" translate="yes" xml:space="preserve">
|
||||
<source>常规</source>
|
||||
<target state="translated">General</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="repo1" translate="yes" xml:space="preserve">
|
||||
<source>[感谢]:https://github.com/34736384/RSAPatch</source>
|
||||
<target state="translated">[appreciate]:https://github.com/34736384/RSAPatch</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="repoinfo" translate="yes" xml:space="preserve">
|
||||
<source>[开源地址]:https://github.com/gc-toolkit/Launcher</source>
|
||||
<target state="translated">[Source Code]:https://github.com/gc-toolkit/Launcher</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tab_official" translate="yes" xml:space="preserve">
|
||||
<source>官方</source>
|
||||
<target state="translated">Official Mode</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tab_private" translate="yes" xml:space="preserve">
|
||||
<source>私有</source>
|
||||
<target state="translated">Private Mode</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tab_proxyonly" translate="yes" xml:space="preserve">
|
||||
<source>仅代理</source>
|
||||
<target state="translated">Proxy Only</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tbtip_bgurl" translate="yes" xml:space="preserve">
|
||||
<source>背景图片</source>
|
||||
<target state="translated">Background Image</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tbtip_gamepath" translate="yes" xml:space="preserve">
|
||||
<source>游戏路径</source>
|
||||
<target state="translated">GamePath</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tip_selectone" translate="yes" xml:space="preserve">
|
||||
<source>选择一个服务器</source>
|
||||
<target state="translated">Select a server</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="btn_running" translate="yes" xml:space="preserve">
|
||||
<source>正在运行</source>
|
||||
<target state="translated">Running</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="btn_startgame" translate="yes" xml:space="preserve">
|
||||
<source>开始游戏</source>
|
||||
<target state="needs-review-translation" state-qualifier="tm-suggestion">Play</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="btn_startproxy" translate="yes" xml:space="preserve">
|
||||
<source>开启代理</source>
|
||||
<target state="translated">StartProxy</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="btn_stopproxy" translate="yes" xml:space="preserve">
|
||||
<source>关闭代理</source>
|
||||
<target state="translated">StopProxy</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="cm_add" translate="yes" xml:space="preserve">
|
||||
<source>添加</source>
|
||||
<target state="translated">Add</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="cm_del" translate="yes" xml:space="preserve">
|
||||
<source>删除</source>
|
||||
<target state="translated">Delete</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="cm_edit" translate="yes" xml:space="preserve">
|
||||
<source>编辑</source>
|
||||
<target state="translated">Edit</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="cm_export" translate="yes" xml:space="preserve">
|
||||
<source>导出到剪贴板</source>
|
||||
<target state="translated">Export to Clipboard</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="cm_import" translate="yes" xml:space="preserve">
|
||||
<source>从剪贴板导入</source>
|
||||
<target state="translated">Import from clipboard</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="h_servers" translate="yes" xml:space="preserve">
|
||||
<source>可用服务器:</source>
|
||||
<target state="needs-review-translation" state-qualifier="tm-suggestion">Available servers:</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tip_correctgamepath" translate="yes" xml:space="preserve">
|
||||
<source>请设置正确的游戏路径!</source>
|
||||
<target state="translated">Please set the correct game path!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tip_exp_succ" translate="yes" xml:space="preserve">
|
||||
<source>导出成功!</source>
|
||||
<target state="translated">Export succeeded!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tip_imp_err" translate="yes" xml:space="preserve">
|
||||
<source>导入失败!</source>
|
||||
<target state="translated">Import failed!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tip_imp_succ" translate="yes" xml:space="preserve">
|
||||
<source>导入成功!</source>
|
||||
<target state="translated">Import succeeded!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tip_nostart" translate="yes" xml:space="preserve">
|
||||
<source>现在不能开始游戏!</source>
|
||||
<target state="translated">Can't start the game now!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tip_reqaddone" translate="yes" xml:space="preserve">
|
||||
<source>请至少添加并选择一个服务器!</source>
|
||||
<target state="translated">Please add and select at least one server!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tip_reqselectone" translate="yes" xml:space="preserve">
|
||||
<source>请选择一个服务器!</source>
|
||||
<target state="translated">Please select a server!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tip_setcfg" translate="yes" xml:space="preserve">
|
||||
<source>请先设置 游戏目录 和 游戏版本!</source>
|
||||
<target state="translated">Please set the game directory and game version first!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="cb_usehttp" translate="yes" xml:space="preserve">
|
||||
<source>使用http</source>
|
||||
<target state="translated">Use HTTP</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="h_serveredit" translate="yes" xml:space="preserve">
|
||||
<source>服务器编辑</source>
|
||||
<target state="translated">Server Profile Edit</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tip_search_err" translate="yes" xml:space="preserve">
|
||||
<source>搜索失败,注册表中没有相关信息!</source>
|
||||
<target state="translated">Detect failed, there is no relevant information in the registry!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tip_serach_succ" translate="yes" xml:space="preserve">
|
||||
<source>已找到位于{0}的游戏文件!</source>
|
||||
<target state="needs-review-translation">Found game file at {0}!</target>
|
||||
<note from="MultilingualUpdate" annotates="source" priority="2">Please verify the translation’s accuracy as the source string was updated after it was translated.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="tip_srvname" translate="yes" xml:space="preserve">
|
||||
<source>服务器名称</source>
|
||||
<target state="translated">Server Name</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="t_advanced" translate="yes" xml:space="preserve">
|
||||
<source>高级</source>
|
||||
<target state="translated">Advanced</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tb_ok" translate="yes" xml:space="preserve">
|
||||
<source>确定</source>
|
||||
<target state="translated">Apply</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tip_privatekey" translate="yes" xml:space="preserve">
|
||||
<source>PrivateKey,为空则禁用</source>
|
||||
<target state="translated">PrivateKey: If it is empty, it will be disabled.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tip_publickey" translate="yes" xml:space="preserve">
|
||||
<source>PublicKey,为空则选择割草机的key</source>
|
||||
<target state="translated">PublicKey: If it is empty, it will use grasscutter's ley.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tip_alreadyrunning" translate="yes" xml:space="preserve">
|
||||
<source>已经有一个启动器在运行</source>
|
||||
<target state="new">An instance is already running</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tip_crash_title" translate="yes" xml:space="preserve">
|
||||
<source>崩溃了</source>
|
||||
<target state="new">Crashed</target>
|
||||
</trans-unit>
|
||||
</group>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
53
Properties/AssemblyInfo.cs
Normal file
53
Properties/AssemblyInfo.cs
Normal file
|
@ -0,0 +1,53 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows;
|
||||
|
||||
// 有关程序集的一般信息由以下
|
||||
// 控制。更改这些特性值可修改
|
||||
// 与程序集关联的信息。
|
||||
[assembly: AssemblyTitle("Launcher")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("Launcher")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2022")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// 将 ComVisible 设置为 false 会使此程序集中的类型
|
||||
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
|
||||
//请将此类型的 ComVisible 特性设置为 true。
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
//若要开始生成可本地化的应用程序,请设置
|
||||
//.csproj 文件中的 <UICulture>CultureYouAreCodingWith</UICulture>
|
||||
//例如,如果您在源文件中使用的是美国英语,
|
||||
//使用的是美国英语,请将 <UICulture> 设置为 en-US。 然后取消
|
||||
//对以下 NeutralResourceLanguage 特性的注释。 更新
|
||||
//以下行中的“en-US”以匹配项目文件中的 UICulture 设置。
|
||||
|
||||
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
|
||||
|
||||
|
||||
[assembly: ThemeInfo(
|
||||
ResourceDictionaryLocation.None, //主题特定资源词典所处位置
|
||||
//(未在页面中找到资源时使用,
|
||||
//或应用程序资源字典中找到时使用)
|
||||
ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置
|
||||
//(未在页面中找到资源时使用,
|
||||
//、应用程序或任何主题专用资源字典中找到时使用)
|
||||
)]
|
||||
|
||||
|
||||
// 程序集的版本信息由下列四个值组成:
|
||||
//
|
||||
// 主版本
|
||||
// 次版本
|
||||
// 生成号
|
||||
// 修订号
|
||||
//
|
||||
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
|
||||
//通过使用 "*",如下所示:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
486
Properties/Resources.Designer.cs
generated
Normal file
486
Properties/Resources.Designer.cs
generated
Normal file
|
@ -0,0 +1,486 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// 此代码由工具生成。
|
||||
// 运行时版本:4.0.30319.42000
|
||||
//
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果
|
||||
// 重新生成代码,这些更改将会丢失。
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace Launcher.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 一个强类型的资源类,用于查找本地化的字符串等。
|
||||
/// </summary>
|
||||
// 此类是由 StronglyTypedResourceBuilder
|
||||
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
|
||||
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
|
||||
// (以 /str 作为命令选项),或重新生成 VS 项目。
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
public class Resources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 返回此类使用的缓存的 ResourceManager 实例。
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
public static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Launcher.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写当前线程的 CurrentUICulture 属性,对
|
||||
/// 使用此强类型资源类的所有资源查找执行重写。
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
public static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 + 支持的版本:3.1, 3.2, 3.2.50, 3.3, 与 gc-toolkit/RSAPatch 保持同步。 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string about_desp {
|
||||
get {
|
||||
return ResourceManager.GetString("about_desp", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 正在运行 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string btn_running {
|
||||
get {
|
||||
return ResourceManager.GetString("btn_running", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 自动搜索 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string btn_searchgame {
|
||||
get {
|
||||
return ResourceManager.GetString("btn_searchgame", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 手动选择 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string btn_selectgame {
|
||||
get {
|
||||
return ResourceManager.GetString("btn_selectgame", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 开始游戏 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string btn_startgame {
|
||||
get {
|
||||
return ResourceManager.GetString("btn_startgame", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 开启代理 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string btn_startproxy {
|
||||
get {
|
||||
return ResourceManager.GetString("btn_startproxy", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 关闭代理 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string btn_stopproxy {
|
||||
get {
|
||||
return ResourceManager.GetString("btn_stopproxy", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 开启调试 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string cb_enabledebug {
|
||||
get {
|
||||
return ResourceManager.GetString("cb_enabledebug", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 使用http 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string cb_usehttp {
|
||||
get {
|
||||
return ResourceManager.GetString("cb_usehttp", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 添加 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string cm_add {
|
||||
get {
|
||||
return ResourceManager.GetString("cm_add", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 删除 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string cm_del {
|
||||
get {
|
||||
return ResourceManager.GetString("cm_del", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 编辑 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string cm_edit {
|
||||
get {
|
||||
return ResourceManager.GetString("cm_edit", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 导出到剪贴板 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string cm_export {
|
||||
get {
|
||||
return ResourceManager.GetString("cm_export", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 从剪贴板导入 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string cm_import {
|
||||
get {
|
||||
return ResourceManager.GetString("cm_import", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 关于 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string h_about {
|
||||
get {
|
||||
return ResourceManager.GetString("h_about", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 开发 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string h_develop {
|
||||
get {
|
||||
return ResourceManager.GetString("h_develop", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 常规 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string h_general {
|
||||
get {
|
||||
return ResourceManager.GetString("h_general", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 服务器编辑 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string h_serveredit {
|
||||
get {
|
||||
return ResourceManager.GetString("h_serveredit", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 可用服务器: 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string h_servers {
|
||||
get {
|
||||
return ResourceManager.GetString("h_servers", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 关于 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string nav_about {
|
||||
get {
|
||||
return ResourceManager.GetString("nav_about", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 主页 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string nav_home {
|
||||
get {
|
||||
return ResourceManager.GetString("nav_home", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 设置 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string nav_setting {
|
||||
get {
|
||||
return ResourceManager.GetString("nav_setting", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 [感谢]:https://github.com/34736384/RSAPatch 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string repo1 {
|
||||
get {
|
||||
return ResourceManager.GetString("repo1", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 [开源地址]:https://github.com/gc-toolkit/Launcher 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string repoinfo {
|
||||
get {
|
||||
return ResourceManager.GetString("repoinfo", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 高级 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string t_advanced {
|
||||
get {
|
||||
return ResourceManager.GetString("t_advanced", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 官方 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tab_official {
|
||||
get {
|
||||
return ResourceManager.GetString("tab_official", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 私有 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tab_private {
|
||||
get {
|
||||
return ResourceManager.GetString("tab_private", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 仅代理 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tab_proxyonly {
|
||||
get {
|
||||
return ResourceManager.GetString("tab_proxyonly", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 确定 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tb_ok {
|
||||
get {
|
||||
return ResourceManager.GetString("tb_ok", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 背景图片 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tbtip_bgurl {
|
||||
get {
|
||||
return ResourceManager.GetString("tbtip_bgurl", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 游戏路径 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tbtip_gamepath {
|
||||
get {
|
||||
return ResourceManager.GetString("tbtip_gamepath", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 已经有一个启动器在运行 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tip_alreadyrunning {
|
||||
get {
|
||||
return ResourceManager.GetString("tip_alreadyrunning", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 请设置正确的游戏路径! 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tip_correctgamepath {
|
||||
get {
|
||||
return ResourceManager.GetString("tip_correctgamepath", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 崩溃了 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tip_crash_title {
|
||||
get {
|
||||
return ResourceManager.GetString("tip_crash_title", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 导出成功! 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tip_exp_succ {
|
||||
get {
|
||||
return ResourceManager.GetString("tip_exp_succ", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 导入失败! 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tip_imp_err {
|
||||
get {
|
||||
return ResourceManager.GetString("tip_imp_err", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 导入成功! 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tip_imp_succ {
|
||||
get {
|
||||
return ResourceManager.GetString("tip_imp_succ", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 现在不能开始游戏! 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tip_nostart {
|
||||
get {
|
||||
return ResourceManager.GetString("tip_nostart", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 PrivateKey,为空则禁用 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tip_privatekey {
|
||||
get {
|
||||
return ResourceManager.GetString("tip_privatekey", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 PublicKey,为空则选择割草机的key 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tip_publickey {
|
||||
get {
|
||||
return ResourceManager.GetString("tip_publickey", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 请至少添加并选择一个服务器! 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tip_reqaddone {
|
||||
get {
|
||||
return ResourceManager.GetString("tip_reqaddone", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 请选择一个服务器! 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tip_reqselectone {
|
||||
get {
|
||||
return ResourceManager.GetString("tip_reqselectone", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 搜索失败,注册表中没有相关信息! 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tip_search_err {
|
||||
get {
|
||||
return ResourceManager.GetString("tip_search_err", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 选择一个服务器 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tip_selectone {
|
||||
get {
|
||||
return ResourceManager.GetString("tip_selectone", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 已找到位于{0}的游戏文件! 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tip_serach_succ {
|
||||
get {
|
||||
return ResourceManager.GetString("tip_serach_succ", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 请先设置 游戏目录 和 游戏版本! 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tip_setcfg {
|
||||
get {
|
||||
return ResourceManager.GetString("tip_setcfg", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 服务器名称 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string tip_srvname {
|
||||
get {
|
||||
return ResourceManager.GetString("tip_srvname", resourceCulture);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
150
Properties/Resources.en.resx
Normal file
150
Properties/Resources.en.resx
Normal file
|
@ -0,0 +1,150 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="nav_about" xml:space="preserve">
|
||||
<value>About</value>
|
||||
</data>
|
||||
<data name="nav_home" xml:space="preserve">
|
||||
<value>Home</value>
|
||||
</data>
|
||||
<data name="nav_setting" xml:space="preserve">
|
||||
<value>Settings</value>
|
||||
</data>
|
||||
<data name="about_desp" xml:space="preserve">
|
||||
<value>+ Supported versions: 3.1, 3.2, 3.2.50, 3.3, Synchronized with gc toolkit/RSAPatch.</value>
|
||||
</data>
|
||||
<data name="btn_searchgame" xml:space="preserve">
|
||||
<value>Auto Detect</value>
|
||||
</data>
|
||||
<data name="btn_selectgame" xml:space="preserve">
|
||||
<value>Manual</value>
|
||||
</data>
|
||||
<data name="cb_enabledebug" xml:space="preserve">
|
||||
<value>Enable DebugMode</value>
|
||||
</data>
|
||||
<data name="h_about" xml:space="preserve">
|
||||
<value>About</value>
|
||||
</data>
|
||||
<data name="h_develop" xml:space="preserve">
|
||||
<value>Development</value>
|
||||
</data>
|
||||
<data name="h_general" xml:space="preserve">
|
||||
<value>General</value>
|
||||
</data>
|
||||
<data name="repo1" xml:space="preserve">
|
||||
<value>[appreciate]:https://github.com/34736384/RSAPatch</value>
|
||||
</data>
|
||||
<data name="repoinfo" xml:space="preserve">
|
||||
<value>[Source Code]:https://github.com/gc-toolkit/Launcher</value>
|
||||
</data>
|
||||
<data name="tab_official" xml:space="preserve">
|
||||
<value>Official Mode</value>
|
||||
</data>
|
||||
<data name="tab_private" xml:space="preserve">
|
||||
<value>Private Mode</value>
|
||||
</data>
|
||||
<data name="tab_proxyonly" xml:space="preserve">
|
||||
<value>Proxy Only</value>
|
||||
</data>
|
||||
<data name="tbtip_bgurl" xml:space="preserve">
|
||||
<value>Background Image</value>
|
||||
</data>
|
||||
<data name="tbtip_gamepath" xml:space="preserve">
|
||||
<value>GamePath</value>
|
||||
</data>
|
||||
<data name="tip_selectone" xml:space="preserve">
|
||||
<value>Select a server</value>
|
||||
</data>
|
||||
<data name="btn_running" xml:space="preserve">
|
||||
<value>Running</value>
|
||||
</data>
|
||||
<data name="btn_startgame" xml:space="preserve">
|
||||
<value>Play</value>
|
||||
</data>
|
||||
<data name="btn_startproxy" xml:space="preserve">
|
||||
<value>StartProxy</value>
|
||||
</data>
|
||||
<data name="btn_stopproxy" xml:space="preserve">
|
||||
<value>StopProxy</value>
|
||||
</data>
|
||||
<data name="cm_add" xml:space="preserve">
|
||||
<value>Add</value>
|
||||
</data>
|
||||
<data name="cm_del" xml:space="preserve">
|
||||
<value>Delete</value>
|
||||
</data>
|
||||
<data name="cm_edit" xml:space="preserve">
|
||||
<value>Edit</value>
|
||||
</data>
|
||||
<data name="cm_export" xml:space="preserve">
|
||||
<value>Export to Clipboard</value>
|
||||
</data>
|
||||
<data name="cm_import" xml:space="preserve">
|
||||
<value>Import from clipboard</value>
|
||||
</data>
|
||||
<data name="h_servers" xml:space="preserve">
|
||||
<value>Available servers:</value>
|
||||
</data>
|
||||
<data name="tip_correctgamepath" xml:space="preserve">
|
||||
<value>Please set the correct game path!</value>
|
||||
</data>
|
||||
<data name="tip_exp_succ" xml:space="preserve">
|
||||
<value>Export succeeded!</value>
|
||||
</data>
|
||||
<data name="tip_imp_err" xml:space="preserve">
|
||||
<value>Import failed!</value>
|
||||
</data>
|
||||
<data name="tip_imp_succ" xml:space="preserve">
|
||||
<value>Import succeeded!</value>
|
||||
</data>
|
||||
<data name="tip_nostart" xml:space="preserve">
|
||||
<value>Can't start the game now!</value>
|
||||
</data>
|
||||
<data name="tip_reqaddone" xml:space="preserve">
|
||||
<value>Please add and select at least one server!</value>
|
||||
</data>
|
||||
<data name="tip_reqselectone" xml:space="preserve">
|
||||
<value>Please select a server!</value>
|
||||
</data>
|
||||
<data name="tip_setcfg" xml:space="preserve">
|
||||
<value>Please set the game directory and game version first!</value>
|
||||
</data>
|
||||
<data name="cb_usehttp" xml:space="preserve">
|
||||
<value>Use HTTP</value>
|
||||
</data>
|
||||
<data name="h_serveredit" xml:space="preserve">
|
||||
<value>Server Profile Edit</value>
|
||||
</data>
|
||||
<data name="tip_search_err" xml:space="preserve">
|
||||
<value>Detect failed, there is no relevant information in the registry!</value>
|
||||
</data>
|
||||
<data name="tip_serach_succ" xml:space="preserve">
|
||||
<value>Found game file at {0}!</value>
|
||||
</data>
|
||||
<data name="tip_srvname" xml:space="preserve">
|
||||
<value>Server Name</value>
|
||||
</data>
|
||||
<data name="t_advanced" xml:space="preserve">
|
||||
<value>Advanced</value>
|
||||
</data>
|
||||
<data name="tb_ok" xml:space="preserve">
|
||||
<value>Apply</value>
|
||||
</data>
|
||||
<data name="tip_privatekey" xml:space="preserve">
|
||||
<value>PrivateKey: If it is empty, it will be disabled.</value>
|
||||
</data>
|
||||
<data name="tip_publickey" xml:space="preserve">
|
||||
<value>PublicKey: If it is empty, it will use grasscutter's ley.</value>
|
||||
</data>
|
||||
</root>
|
261
Properties/Resources.resx
Normal file
261
Properties/Resources.resx
Normal file
|
@ -0,0 +1,261 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="about_desp" xml:space="preserve">
|
||||
<value>+ 支持的版本:3.1, 3.2, 3.2.50, 3.3, 与 gc-toolkit/RSAPatch 保持同步。</value>
|
||||
</data>
|
||||
<data name="btn_running" xml:space="preserve">
|
||||
<value>正在运行</value>
|
||||
</data>
|
||||
<data name="btn_searchgame" xml:space="preserve">
|
||||
<value>自动搜索</value>
|
||||
</data>
|
||||
<data name="btn_selectgame" xml:space="preserve">
|
||||
<value>手动选择</value>
|
||||
</data>
|
||||
<data name="btn_startgame" xml:space="preserve">
|
||||
<value>开始游戏</value>
|
||||
</data>
|
||||
<data name="btn_startproxy" xml:space="preserve">
|
||||
<value>开启代理</value>
|
||||
</data>
|
||||
<data name="btn_stopproxy" xml:space="preserve">
|
||||
<value>关闭代理</value>
|
||||
</data>
|
||||
<data name="cb_enabledebug" xml:space="preserve">
|
||||
<value>开启调试</value>
|
||||
</data>
|
||||
<data name="cb_usehttp" xml:space="preserve">
|
||||
<value>使用http</value>
|
||||
</data>
|
||||
<data name="cm_add" xml:space="preserve">
|
||||
<value>添加</value>
|
||||
</data>
|
||||
<data name="cm_del" xml:space="preserve">
|
||||
<value>删除</value>
|
||||
</data>
|
||||
<data name="cm_edit" xml:space="preserve">
|
||||
<value>编辑</value>
|
||||
</data>
|
||||
<data name="cm_export" xml:space="preserve">
|
||||
<value>导出到剪贴板</value>
|
||||
</data>
|
||||
<data name="cm_import" xml:space="preserve">
|
||||
<value>从剪贴板导入</value>
|
||||
</data>
|
||||
<data name="h_about" xml:space="preserve">
|
||||
<value>关于</value>
|
||||
</data>
|
||||
<data name="h_develop" xml:space="preserve">
|
||||
<value>开发</value>
|
||||
</data>
|
||||
<data name="h_general" xml:space="preserve">
|
||||
<value>常规</value>
|
||||
</data>
|
||||
<data name="h_serveredit" xml:space="preserve">
|
||||
<value>服务器编辑</value>
|
||||
</data>
|
||||
<data name="h_servers" xml:space="preserve">
|
||||
<value>可用服务器:</value>
|
||||
</data>
|
||||
<data name="nav_about" xml:space="preserve">
|
||||
<value>关于</value>
|
||||
</data>
|
||||
<data name="nav_home" xml:space="preserve">
|
||||
<value>主页</value>
|
||||
</data>
|
||||
<data name="nav_setting" xml:space="preserve">
|
||||
<value>设置</value>
|
||||
</data>
|
||||
<data name="repo1" xml:space="preserve">
|
||||
<value>[感谢]:https://github.com/34736384/RSAPatch</value>
|
||||
</data>
|
||||
<data name="repoinfo" xml:space="preserve">
|
||||
<value>[开源地址]:https://github.com/gc-toolkit/Launcher</value>
|
||||
</data>
|
||||
<data name="tab_official" xml:space="preserve">
|
||||
<value>官方</value>
|
||||
</data>
|
||||
<data name="tab_private" xml:space="preserve">
|
||||
<value>私有</value>
|
||||
</data>
|
||||
<data name="tab_proxyonly" xml:space="preserve">
|
||||
<value>仅代理</value>
|
||||
</data>
|
||||
<data name="tbtip_bgurl" xml:space="preserve">
|
||||
<value>背景图片</value>
|
||||
</data>
|
||||
<data name="tbtip_gamepath" xml:space="preserve">
|
||||
<value>游戏路径</value>
|
||||
</data>
|
||||
<data name="tb_ok" xml:space="preserve">
|
||||
<value>确定</value>
|
||||
</data>
|
||||
<data name="tip_alreadyrunning" xml:space="preserve">
|
||||
<value>已经有一个启动器在运行</value>
|
||||
</data>
|
||||
<data name="tip_correctgamepath" xml:space="preserve">
|
||||
<value>请设置正确的游戏路径!</value>
|
||||
</data>
|
||||
<data name="tip_crash_title" xml:space="preserve">
|
||||
<value>崩溃了</value>
|
||||
</data>
|
||||
<data name="tip_exp_succ" xml:space="preserve">
|
||||
<value>导出成功!</value>
|
||||
</data>
|
||||
<data name="tip_imp_err" xml:space="preserve">
|
||||
<value>导入失败!</value>
|
||||
</data>
|
||||
<data name="tip_imp_succ" xml:space="preserve">
|
||||
<value>导入成功!</value>
|
||||
</data>
|
||||
<data name="tip_nostart" xml:space="preserve">
|
||||
<value>现在不能开始游戏!</value>
|
||||
</data>
|
||||
<data name="tip_privatekey" xml:space="preserve">
|
||||
<value>PrivateKey,为空则禁用</value>
|
||||
</data>
|
||||
<data name="tip_publickey" xml:space="preserve">
|
||||
<value>PublicKey,为空则选择割草机的key</value>
|
||||
</data>
|
||||
<data name="tip_reqaddone" xml:space="preserve">
|
||||
<value>请至少添加并选择一个服务器!</value>
|
||||
</data>
|
||||
<data name="tip_reqselectone" xml:space="preserve">
|
||||
<value>请选择一个服务器!</value>
|
||||
</data>
|
||||
<data name="tip_search_err" xml:space="preserve">
|
||||
<value>搜索失败,注册表中没有相关信息!</value>
|
||||
</data>
|
||||
<data name="tip_selectone" xml:space="preserve">
|
||||
<value>选择一个服务器</value>
|
||||
</data>
|
||||
<data name="tip_serach_succ" xml:space="preserve">
|
||||
<value>已找到位于{0}的游戏文件!</value>
|
||||
</data>
|
||||
<data name="tip_setcfg" xml:space="preserve">
|
||||
<value>请先设置 游戏目录 和 游戏版本!</value>
|
||||
</data>
|
||||
<data name="tip_srvname" xml:space="preserve">
|
||||
<value>服务器名称</value>
|
||||
</data>
|
||||
<data name="t_advanced" xml:space="preserve">
|
||||
<value>高级</value>
|
||||
</data>
|
||||
</root>
|
30
Properties/Settings.Designer.cs
generated
Normal file
30
Properties/Settings.Designer.cs
generated
Normal file
|
@ -0,0 +1,30 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace Launcher.Properties
|
||||
{
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
|
||||
{
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
|
||||
public static Settings Default
|
||||
{
|
||||
get
|
||||
{
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
7
Properties/Settings.settings
Normal file
7
Properties/Settings.settings
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
|
||||
<Profiles>
|
||||
<Profile Name="(Default)" />
|
||||
</Profiles>
|
||||
<Settings />
|
||||
</SettingsFile>
|
32
README.md
Normal file
32
README.md
Normal file
|
@ -0,0 +1,32 @@
|
|||
# Launcher
|
||||
> 新一代的游戏启动器
|
||||
|
||||
|
||||
# ✨ 功能
|
||||
+ 提供 http / https 代理转向
|
||||
+ 防止游戏出现4214错误 (多种key切换,支持 publickey 和 privatekey)
|
||||
+ 多服务器支持
|
||||
+ 不需更改客户端内任何文件
|
||||
+ 多种启动方式支持 [官方| 割草机| 仅代理]
|
||||
|
||||
|
||||
# 🖼️预览
|
||||
![image](https://user-images.githubusercontent.com/68674499/206622660-9c1590d3-8adb-4d1f-aed9-17639eca9c67.png)
|
||||
|
||||
![image](https://user-images.githubusercontent.com/68674499/206622695-99204b8e-047d-45e3-be9b-d9aed97fd72d.png)
|
||||
|
||||
|
||||
# 🎁使用
|
||||
|
||||
1. 前往 [Release](https://github.com/gc-toolkit/Launcher/releases) 下载
|
||||
2. 放到到任意目录
|
||||
3. 双击运行
|
||||
|
||||
# 🐛常见问题
|
||||
|
||||
前往 [Issues](https://github.com/gc-toolkit/Launcher/issues) 具体描述你遇到的问题
|
||||
|
||||
# 🙇感谢
|
||||
|
||||
[https://github.com/34736384/RSAPatch](https://github.com/34736384/RSAPatch)
|
||||
[akebi](/)
|
1
RSAPatch/PublicKey.txt
Normal file
1
RSAPatch/PublicKey.txt
Normal file
|
@ -0,0 +1 @@
|
|||
<RSAKeyValue><Modulus>xbbx2m1feHyrQ7jP+8mtDF/pyYLrJWKWAdEv3wZrOtjOZzeLGPzsmkcgncgoRhX4dT+1itSMR9j9m0/OwsH2UoF6U32LxCOQWQD1AMgIZjAkJeJvFTrtn8fMQ1701CkbaLTVIjRMlTw8kNXvNA/A9UatoiDmi4TFG6mrxTKZpIcTInvPEpkK2A7Qsp1E4skFK8jmysy7uRhMaYHtPTsBvxP0zn3lhKB3W+HTqpneewXWHjCDfL7Nbby91jbz5EKPZXWLuhXIvR1Cu4tiruorwXJxmXaP1HQZonytECNU/UOzP6GNLdq0eFDE4b04Wjp396551G99YiFP2nqHVJ5OMQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>
|
BIN
RSAPatch/RSAPatch.dll
Normal file
BIN
RSAPatch/RSAPatch.dll
Normal file
Binary file not shown.
BIN
RSAPatch/rsa.dll.bak
Normal file
BIN
RSAPatch/rsa.dll.bak
Normal file
Binary file not shown.
BIN
Res/remixicon.ttf
Normal file
BIN
Res/remixicon.ttf
Normal file
Binary file not shown.
4
Style/IconButtonStyle.xaml
Normal file
4
Style/IconButtonStyle.xaml
Normal file
|
@ -0,0 +1,4 @@
|
|||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
|
||||
</ResourceDictionary>
|
87
Style/NavigationItemContainerStyle.xaml
Normal file
87
Style/NavigationItemContainerStyle.xaml
Normal file
|
@ -0,0 +1,87 @@
|
|||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
|
||||
<Style x:Key="FocusVisual">
|
||||
<Setter Property="Control.Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate>
|
||||
<Rectangle
|
||||
Margin="2"
|
||||
SnapsToDevicePixels="true"
|
||||
Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"
|
||||
StrokeDashArray="1 2"
|
||||
StrokeThickness="1" />
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
<SolidColorBrush x:Key="Item.MouseOver.Background" Color="#e6e9ee" />
|
||||
<SolidColorBrush x:Key="Item.MouseOver.Border" Color="#a826A0Da" />
|
||||
<SolidColorBrush x:Key="Item.SelectedActive.Background" Color="#b8dbf1" />
|
||||
<SolidColorBrush x:Key="Item.SelectedActive.Border" Color="#FF26A0DA" />
|
||||
<SolidColorBrush x:Key="Item.SelectedInactive.Background" Color="#b8dbf1" />
|
||||
<SolidColorBrush x:Key="Item.SelectedInactive.Border" Color="#FFDADADA" />
|
||||
<Style x:Key="NavigationItemContainerStyle" TargetType="{x:Type ListBoxItem}">
|
||||
<Setter Property="SnapsToDevicePixels" Value="True" />
|
||||
<Setter Property="Padding" Value="20,10" />
|
||||
<Setter Property="FontSize" Value="14" />
|
||||
<Setter Property="Margin" Value="10,0" />
|
||||
|
||||
<Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
|
||||
<Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
|
||||
<Setter Property="Background" Value="Transparent" />
|
||||
<Setter Property="BorderBrush" Value="Transparent" />
|
||||
<Setter Property="BorderThickness" Value="0" />
|
||||
<Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}" />
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="{x:Type ListBoxItem}">
|
||||
<Border
|
||||
x:Name="Bd"
|
||||
Padding="{TemplateBinding Padding}"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}"
|
||||
CornerRadius="20"
|
||||
SnapsToDevicePixels="true">
|
||||
<ContentPresenter
|
||||
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
|
||||
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
|
||||
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<MultiTrigger>
|
||||
<MultiTrigger.Conditions>
|
||||
<Condition Property="IsMouseOver" Value="True" />
|
||||
</MultiTrigger.Conditions>
|
||||
<Setter TargetName="Bd" Property="Background" Value="{StaticResource Item.MouseOver.Background}" />
|
||||
<Setter TargetName="Bd" Property="BorderBrush" Value="{StaticResource Item.MouseOver.Border}" />
|
||||
</MultiTrigger>
|
||||
<MultiTrigger>
|
||||
<MultiTrigger.Conditions>
|
||||
<Condition Property="Selector.IsSelectionActive" Value="False" />
|
||||
<Condition Property="IsSelected" Value="True" />
|
||||
</MultiTrigger.Conditions>
|
||||
<Setter Property="FontWeight" Value="Bold" />
|
||||
<Setter Property="Foreground" Value="#111d35" />
|
||||
<Setter TargetName="Bd" Property="Background" Value="{StaticResource Item.SelectedInactive.Background}" />
|
||||
<Setter TargetName="Bd" Property="BorderBrush" Value="{StaticResource Item.SelectedInactive.Border}" />
|
||||
</MultiTrigger>
|
||||
<MultiTrigger>
|
||||
<MultiTrigger.Conditions>
|
||||
<Condition Property="Selector.IsSelectionActive" Value="True" />
|
||||
<Condition Property="IsSelected" Value="True" />
|
||||
</MultiTrigger.Conditions>
|
||||
<Setter Property="FontWeight" Value="Bold" />
|
||||
<Setter Property="Foreground" Value="#111d35" />
|
||||
<Setter TargetName="Bd" Property="Background" Value="{StaticResource Item.SelectedActive.Background}" />
|
||||
<Setter TargetName="Bd" Property="BorderBrush" Value="{StaticResource Item.SelectedActive.Border}" />
|
||||
</MultiTrigger>
|
||||
<Trigger Property="IsEnabled" Value="False">
|
||||
<Setter TargetName="Bd" Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
</ResourceDictionary>
|
44
View/About.xaml
Normal file
44
View/About.xaml
Normal file
|
@ -0,0 +1,44 @@
|
|||
<Page
|
||||
x:Class="Launcher.View.About"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Launcher.View"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:prop="clr-namespace:Launcher.Properties"
|
||||
Title="About"
|
||||
d:DesignHeight="450"
|
||||
d:DesignWidth="800"
|
||||
FontSize="14"
|
||||
mc:Ignorable="d">
|
||||
|
||||
<StackPanel Margin="20,40,20,20">
|
||||
|
||||
<TextBlock
|
||||
FontSize="20"
|
||||
FontWeight="Bold"
|
||||
Text="{x:Static prop:Resources.h_about}" />
|
||||
|
||||
|
||||
<TextBlock Margin="0,10,0,5" Text="Launcher by SwetyCore" />
|
||||
|
||||
<TextBlock Margin="0,5" Text="{x:Static prop:Resources.about_desp}" />
|
||||
|
||||
<TextBlock
|
||||
Margin="0,5"
|
||||
Cursor="Hand"
|
||||
Foreground="#FF006DFF"
|
||||
MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"
|
||||
Tag="https://github.com/gc-toolkit/Launcher"
|
||||
Text="{x:Static prop:Resources.repoinfo}" />
|
||||
|
||||
<TextBlock
|
||||
Margin="0,5"
|
||||
Cursor="Hand"
|
||||
Foreground="#FF006DFF"
|
||||
MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"
|
||||
Tag="https://github.com/34736384/RSAPatch"
|
||||
Text="{x:Static prop:Resources.repo1}" />
|
||||
|
||||
</StackPanel>
|
||||
</Page>
|
35
View/About.xaml.cs
Normal file
35
View/About.xaml.cs
Normal file
|
@ -0,0 +1,35 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace Launcher.View
|
||||
{
|
||||
/// <summary>
|
||||
/// About.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class About : Page
|
||||
{
|
||||
public About()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void TextBlock_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
var tb = sender as TextBlock;
|
||||
Process.Start("explorer.exe", tb.Tag.ToString());
|
||||
}
|
||||
}
|
||||
}
|
300
View/Home.xaml
Normal file
300
View/Home.xaml
Normal file
|
@ -0,0 +1,300 @@
|
|||
<Page
|
||||
x:Class="Launcher.View.Home"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Launcher.View"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:prop="clr-namespace:Launcher.Properties"
|
||||
xmlns:pu="clr-namespace:Panuon.WPF.UI;assembly=Panuon.WPF.UI"
|
||||
xmlns:viewmodel="clr-namespace:Launcher.ViewModel"
|
||||
Title="Home"
|
||||
d:DataContext="{d:DesignInstance Type=viewmodel:HomeVM}"
|
||||
d:DesignHeight="500"
|
||||
d:DesignWidth="600"
|
||||
mc:Ignorable="d">
|
||||
|
||||
<Grid Margin="20">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="40" />
|
||||
|
||||
<RowDefinition />
|
||||
<RowDefinition Height="auto" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<ListBox
|
||||
x:Name="pt"
|
||||
pu:ListBoxHelper.CornerRadius="20"
|
||||
pu:ListBoxHelper.ItemsCornerRadius="20"
|
||||
pu:ListBoxHelper.ItemsHeight="40"
|
||||
pu:ListBoxHelper.ItemsHoverBackground="#a0b8dbf1"
|
||||
pu:ListBoxHelper.ItemsPadding="20 0"
|
||||
pu:ListBoxHelper.ItemsSelectedBackground="#b8dbf1"
|
||||
pu:ListBoxHelper.ShadowColor="Gray"
|
||||
pu:ShadowHelper.Opacity="0.2"
|
||||
Background="#f3f6fc"
|
||||
BorderThickness="0"
|
||||
FontSize="14"
|
||||
FontWeight="Bold"
|
||||
IsEnabled="{Binding CanChangeProxyType}"
|
||||
SelectionChanged="ListBox_SelectionChanged">
|
||||
<ListBox.ItemsPanel>
|
||||
<ItemsPanelTemplate>
|
||||
<UniformGrid Columns="3" IsItemsHost="True" />
|
||||
</ItemsPanelTemplate>
|
||||
</ListBox.ItemsPanel>
|
||||
<ListBoxItem>
|
||||
<TextBlock HorizontalAlignment="Center" Text="{x:Static prop:Resources.tab_official}" />
|
||||
</ListBoxItem>
|
||||
<ListBoxItem>
|
||||
<TextBlock Text="{x:Static prop:Resources.tab_private}" />
|
||||
</ListBoxItem>
|
||||
<ListBoxItem>
|
||||
<TextBlock Text="{x:Static prop:Resources.tab_proxyonly}" />
|
||||
</ListBoxItem>
|
||||
</ListBox>
|
||||
|
||||
<Grid Grid.Row="1" Margin="0,10,0,0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="180" />
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Grid Margin="0,0,10,0" Panel.ZIndex="2">
|
||||
|
||||
<Border CornerRadius="20" />
|
||||
<Border
|
||||
Margin="0,10,20,0"
|
||||
Padding="4"
|
||||
HorizontalAlignment="Right"
|
||||
VerticalAlignment="Top"
|
||||
Background="#66E3F2FD"
|
||||
CornerRadius="4">
|
||||
|
||||
<TextBlock FontSize="14" ToolTip="Fake">
|
||||
<Run Text="Online:" />
|
||||
<Run Text="30" />
|
||||
<Run Text="/" />
|
||||
<Run Text="120" />
|
||||
</TextBlock>
|
||||
</Border>
|
||||
|
||||
|
||||
<StackPanel
|
||||
Name="srv_list"
|
||||
Margin="20"
|
||||
VerticalAlignment="Bottom">
|
||||
<Border
|
||||
Height="160"
|
||||
Background="#aaE3F2FD"
|
||||
CornerRadius="15 15 15 15">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="auto" />
|
||||
<RowDefinition />
|
||||
</Grid.RowDefinitions>
|
||||
<ToggleButton
|
||||
Margin="10,10,0,0"
|
||||
HorizontalAlignment="Left"
|
||||
VerticalAlignment="Top"
|
||||
Background="Transparent"
|
||||
BorderThickness="0"
|
||||
Content="{x:Static prop:Resources.h_servers}"
|
||||
FontSize="16"
|
||||
FontWeight="Bold" />
|
||||
<ListBox
|
||||
Grid.Row="2"
|
||||
Padding="4"
|
||||
pu:ListBoxHelper.ItemsCornerRadius="16"
|
||||
pu:ListBoxHelper.ItemsHoverBackground="#88b8dbf1"
|
||||
pu:ListBoxHelper.ItemsPadding="8"
|
||||
pu:ListBoxHelper.ItemsSelectedBackground="#b8dbf1"
|
||||
pu:ScrollBarHelper.HoverThumbBackground="#b8dbf1"
|
||||
pu:ScrollBarHelper.ThumbBackground="#aab8dbf1"
|
||||
pu:ScrollBarHelper.ThumbBorderThickness="2 0 0 4"
|
||||
pu:ScrollBarHelper.ThumbCornerRadius="4"
|
||||
Background="Transparent"
|
||||
BorderThickness="0"
|
||||
FontSize="14"
|
||||
ItemsSource="{Binding LauncherConfig.Servers}"
|
||||
SelectedIndex="{Binding LauncherConfig.SelectedSrvIndex}"
|
||||
SelectedValue="{Binding SelectedSrv}">
|
||||
<pu:ListBoxHelper.EmptyContent>
|
||||
<Grid>
|
||||
<TextBlock
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
FontSize="16"
|
||||
Text="空" />
|
||||
</Grid>
|
||||
</pu:ListBoxHelper.EmptyContent>
|
||||
<ListBox.ContextMenu>
|
||||
<ContextMenu
|
||||
MinWidth="240"
|
||||
Padding="0"
|
||||
pu:ContextMenuHelper.CornerRadius="20"
|
||||
pu:ContextMenuHelper.ItemsHeight="36"
|
||||
pu:ContextMenuHelper.ItemsHoverBackground="#b8dbf1"
|
||||
pu:ContextMenuHelper.ShadowColor="Gray"
|
||||
pu:ShadowHelper.Opacity="0.2"
|
||||
Background="#f3f6fc"
|
||||
BorderThickness="0"
|
||||
FontSize="14">
|
||||
<MenuItem Command="{Binding EditCommand}" Header="{x:Static prop:Resources.cm_edit}" />
|
||||
<MenuItem Command="{Binding AddCommand}" Header="{x:Static prop:Resources.cm_add}" />
|
||||
<MenuItem Command="{Binding DeleteCommand}" Header="{x:Static prop:Resources.cm_del}" />
|
||||
<MenuItem Command="{Binding ExportCommand}" Header="{x:Static prop:Resources.cm_export}" />
|
||||
<MenuItem Command="{Binding ImportCommand}" Header="{x:Static prop:Resources.cm_import}" />
|
||||
</ContextMenu>
|
||||
</ListBox.ContextMenu>
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="auto" />
|
||||
<ColumnDefinition />
|
||||
<ColumnDefinition Width="auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock
|
||||
Margin="4,0,4,0"
|
||||
VerticalAlignment="Center"
|
||||
FontSize="16">
|
||||
|
||||
<Run FontFamily="{StaticResource remix}" Text="" />
|
||||
</TextBlock>
|
||||
<TextBlock Grid.Column="1">
|
||||
<Run Text="{Binding Name}" />
|
||||
</TextBlock>
|
||||
<StackPanel Grid.Column="2" Orientation="Horizontal">
|
||||
|
||||
<!--<Button
|
||||
HorizontalAlignment="Right"
|
||||
pu:ButtonHelper.ClickBackground="#30EF5350"
|
||||
pu:ButtonHelper.CornerRadius="4"
|
||||
Background="Transparent"
|
||||
FontFamily="{StaticResource remix}"
|
||||
FontSize="18">
|
||||

|
||||
</Button>-->
|
||||
</StackPanel>
|
||||
|
||||
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</ListBox.ItemTemplate>
|
||||
</ListBox>
|
||||
</Grid>
|
||||
|
||||
|
||||
</Border>
|
||||
</StackPanel>
|
||||
|
||||
</Grid>
|
||||
|
||||
<Border
|
||||
Grid.ColumnSpan="2"
|
||||
CornerRadius="20"
|
||||
Effect="{StaticResource defaultShadow}"
|
||||
RenderOptions.BitmapScalingMode="HighQuality">
|
||||
<Border.Background>
|
||||
<ImageBrush ImageSource="{Binding LauncherConfig.BgUrl}" Stretch="UniformToFill" />
|
||||
</Border.Background>
|
||||
<Border
|
||||
Margin="350,0,0,0"
|
||||
Padding="20"
|
||||
Background="#88E3F2FD"
|
||||
CornerRadius="0 20 20 0">
|
||||
|
||||
|
||||
<Grid>
|
||||
|
||||
<TextBlock TextWrapping="Wrap">
|
||||
<Run
|
||||
FontSize="30"
|
||||
FontWeight="Bold"
|
||||
Text="{Binding SelectedSrv.Name, FallbackValue={x:Static prop:Resources.tip_selectone}}" />
|
||||
<LineBreak />
|
||||
<Run>
|
||||
Styles are the visual aspects of a UI that give it a distinct look and feel.
|
||||
</Run>
|
||||
</TextBlock>
|
||||
|
||||
<UniformGrid VerticalAlignment="Bottom" Columns="2">
|
||||
<StackPanel>
|
||||
<Button
|
||||
Width="50"
|
||||
Height="30"
|
||||
Margin="4"
|
||||
pu:ButtonHelper.CornerRadius="15"
|
||||
Background="#C2E7FF"
|
||||
Cursor="Hand">
|
||||
<TextBlock
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
FontFamily="{StaticResource remix}"
|
||||
FontSize="20"
|
||||
Text="" />
|
||||
</Button>
|
||||
<TextBlock HorizontalAlignment="Center" Text="Github" />
|
||||
|
||||
</StackPanel>
|
||||
<StackPanel>
|
||||
<Button
|
||||
Width="50"
|
||||
Height="30"
|
||||
Margin="4"
|
||||
pu:ButtonHelper.CornerRadius="15"
|
||||
Background="#C2E7FF"
|
||||
Cursor="Hand">
|
||||
<TextBlock
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
FontFamily="{StaticResource remix}"
|
||||
FontSize="20"
|
||||
Text="" />
|
||||
</Button>
|
||||
<TextBlock HorizontalAlignment="Center" Text="Discord" />
|
||||
|
||||
</StackPanel>
|
||||
</UniformGrid>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
</Border>
|
||||
|
||||
</Grid>
|
||||
|
||||
|
||||
|
||||
|
||||
<Grid Grid.Row="2" Margin="0,10,0,0">
|
||||
|
||||
<Button
|
||||
Width="140"
|
||||
Height="50"
|
||||
HorizontalAlignment="Right"
|
||||
pu:ButtonHelper.CornerRadius="25"
|
||||
pu:ButtonHelper.HoverBackground="#ee2a73c5"
|
||||
pu:ButtonHelper.HoverShadowColor="#b8dbf1"
|
||||
pu:ButtonHelper.ShadowColor="Gray"
|
||||
pu:ShadowHelper.Opacity="0.4"
|
||||
Background="#1867c0"
|
||||
Command="{Binding StartGameCommand}"
|
||||
Cursor="Hand"
|
||||
FontSize="18"
|
||||
FontWeight="Bold"
|
||||
Foreground="White">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock
|
||||
Margin="0,0,8,0"
|
||||
VerticalAlignment="Center"
|
||||
FontFamily="{StaticResource remix}"
|
||||
FontSize="20"
|
||||
Text="" />
|
||||
<TextBlock Text="{Binding StartBtn_txt, FallbackValue={x:Static prop:Resources.btn_startgame}}" />
|
||||
</StackPanel>
|
||||
</Button>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Page>
|
43
View/Home.xaml.cs
Normal file
43
View/Home.xaml.cs
Normal file
|
@ -0,0 +1,43 @@
|
|||
using System.Windows.Controls;
|
||||
|
||||
namespace Launcher.View
|
||||
{
|
||||
/// <summary>
|
||||
/// Home.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class Home : Page
|
||||
{
|
||||
public Home()
|
||||
{
|
||||
InitializeComponent();
|
||||
DataContext = ViewModel.HomeVM.Instacne;
|
||||
pt.SelectedIndex = (int)ViewModel.HomeVM.Instacne.LauncherConfig.ProxyType;
|
||||
}
|
||||
|
||||
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
var list = (ListBox)sender;
|
||||
|
||||
|
||||
ViewModel.HomeVM.Instacne.LauncherConfig.ProxyType = (Model.ProxyType)list.SelectedIndex;
|
||||
|
||||
switch (ViewModel.HomeVM.Instacne.LauncherConfig.ProxyType)
|
||||
{
|
||||
case Model.ProxyType.OFFICIAL:
|
||||
ViewModel.HomeVM.Instacne.StartBtn_txt = Properties.Resources.btn_startgame;
|
||||
break;
|
||||
case Model.ProxyType.PRIVATE:
|
||||
|
||||
ViewModel.HomeVM.Instacne.StartBtn_txt = Properties.Resources.btn_startgame;
|
||||
|
||||
break;
|
||||
case Model.ProxyType.PROXY_ONLY:
|
||||
ViewModel.HomeVM.Instacne.StartBtn_txt = Properties.Resources.btn_startproxy;
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
136
View/Setting.xaml
Normal file
136
View/Setting.xaml
Normal file
|
@ -0,0 +1,136 @@
|
|||
<Page
|
||||
x:Class="Launcher.View.Setting"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Launcher.View"
|
||||
xmlns:m="clr-namespace:Launcher.Model"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:prop="clr-namespace:Launcher.Properties"
|
||||
xmlns:pu="clr-namespace:Panuon.WPF.UI;assembly=Panuon.WPF.UI"
|
||||
xmlns:viewmodel="clr-namespace:Launcher.ViewModel"
|
||||
Title="Setting"
|
||||
d:DataContext="{d:DesignInstance Type=viewmodel:SettingVM}"
|
||||
d:DesignHeight="500"
|
||||
d:DesignWidth="600"
|
||||
mc:Ignorable="d">
|
||||
|
||||
<Grid Margin="20,40,20,20">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition />
|
||||
<RowDefinition Height="auto" />
|
||||
</Grid.RowDefinitions>
|
||||
<ItemsControl Background="Transparent" BorderThickness="0">
|
||||
<TextBlock
|
||||
Margin="0,0,0,5"
|
||||
FontSize="20"
|
||||
FontWeight="Bold"
|
||||
Foreground="#111d35"
|
||||
Text="{x:Static prop:Resources.h_general}" />
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="auto" />
|
||||
|
||||
<ColumnDefinition />
|
||||
<ColumnDefinition Width="auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock
|
||||
Margin="0,0,10,0"
|
||||
VerticalAlignment="Center"
|
||||
FontSize="14"
|
||||
Text="{x:Static prop:Resources.tbtip_gamepath}" />
|
||||
<TextBox
|
||||
xmlns:Model="clr-namespace:Launcher.Model"
|
||||
Grid.Column="1"
|
||||
MinWidth="100"
|
||||
Margin="0,5,5,5"
|
||||
Padding="8"
|
||||
pu:TextBoxHelper.CornerRadius="4"
|
||||
pu:TextBoxHelper.FocusedBorderBrush="#2a73c5"
|
||||
pu:TextBoxHelper.Watermark="游戏路径"
|
||||
Background="Transparent"
|
||||
BorderThickness="1"
|
||||
FontSize="14"
|
||||
Text="{Binding LauncherConfig.GameInfo.GameExePath}" />
|
||||
<StackPanel Grid.Column="2" Orientation="Horizontal">
|
||||
|
||||
<Button
|
||||
Margin="5"
|
||||
Padding="8,0"
|
||||
pu:ButtonHelper.CornerRadius="6"
|
||||
Background="#2a73c5"
|
||||
Command="{Binding SearchGameFileCommand}"
|
||||
Content="{x:Static prop:Resources.btn_searchgame}"
|
||||
Foreground="White" />
|
||||
<Button
|
||||
Margin="5"
|
||||
Padding="8,0"
|
||||
pu:ButtonHelper.CornerRadius="6"
|
||||
pu:ButtonHelper.HoverBackground="#302a73c5"
|
||||
Background="Transparent"
|
||||
BorderBrush="#2a73c5"
|
||||
BorderThickness="1"
|
||||
Command="{Binding SetGameExePathCommand}"
|
||||
Content="{x:Static prop:Resources.btn_selectgame}"
|
||||
Foreground="#2a73c5" />
|
||||
</StackPanel>
|
||||
|
||||
</Grid>
|
||||
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="auto" />
|
||||
|
||||
<ColumnDefinition />
|
||||
<ColumnDefinition Width="auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock
|
||||
Margin="0,0,10,0"
|
||||
VerticalAlignment="Center"
|
||||
FontSize="14"
|
||||
Text="{x:Static prop:Resources.tbtip_bgurl}" />
|
||||
<TextBox
|
||||
xmlns:Model="clr-namespace:Launcher.Model"
|
||||
Grid.Column="1"
|
||||
MinWidth="100"
|
||||
Margin="0,5,5,5"
|
||||
Padding="8"
|
||||
pu:TextBoxHelper.CornerRadius="4"
|
||||
pu:TextBoxHelper.FocusedBorderBrush="#2a73c5"
|
||||
pu:TextBoxHelper.Watermark="游戏路径"
|
||||
Background="Transparent"
|
||||
BorderThickness="1"
|
||||
FontSize="14"
|
||||
Text="{Binding LauncherConfig.BgUrl}" />
|
||||
|
||||
</Grid>
|
||||
|
||||
<TextBlock
|
||||
Margin="0,0,0,5"
|
||||
FontSize="20"
|
||||
FontWeight="Bold"
|
||||
Foreground="#111d35"
|
||||
Text="{x:Static prop:Resources.h_develop}" />
|
||||
|
||||
<Grid>
|
||||
|
||||
<CheckBox
|
||||
VerticalContentAlignment="Center"
|
||||
pu:CheckBoxHelper.BoxHeight="20"
|
||||
pu:CheckBoxHelper.BoxWidth="20"
|
||||
pu:CheckBoxHelper.CheckedGlyphBrush="#558fd1"
|
||||
pu:CheckBoxHelper.CornerRadius="4"
|
||||
pu:CheckBoxHelper.GlyphThickness="3"
|
||||
pu:CheckBoxHelper.HoverBorderBrush="#558fd1"
|
||||
BorderThickness="1"
|
||||
Content="{x:Static prop:Resources.cb_enabledebug}"
|
||||
Cursor="Hand"
|
||||
FontSize="16"
|
||||
IsChecked="{Binding LauncherConfig.DebugMode}" />
|
||||
|
||||
</Grid>
|
||||
|
||||
</ItemsControl>
|
||||
|
||||
</Grid>
|
||||
</Page>
|
21
View/Setting.xaml.cs
Normal file
21
View/Setting.xaml.cs
Normal file
|
@ -0,0 +1,21 @@
|
|||
using System.Windows.Controls;
|
||||
|
||||
namespace Launcher.View
|
||||
{
|
||||
/// <summary>
|
||||
/// Setting.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class Setting : Page
|
||||
{
|
||||
public Setting()
|
||||
{
|
||||
InitializeComponent();
|
||||
DataContext = ViewModel.SettingVM.Instacne;
|
||||
|
||||
|
||||
|
||||
//Visibility = Visibility.Hidden;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
347
ViewModel/HomeVM.cs
Normal file
347
ViewModel/HomeVM.cs
Normal file
|
@ -0,0 +1,347 @@
|
|||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using Launcher.Model;
|
||||
using System.Diagnostics;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Windows;
|
||||
using Launcher.Common;
|
||||
using static Launcher.Common.ProxyHelper;
|
||||
using System.Net.Http.Headers;
|
||||
using Launcher.Control;
|
||||
using System.Windows.Input;
|
||||
using System.Linq;
|
||||
using static System.Net.Mime.MediaTypeNames;
|
||||
using Newtonsoft.Json;
|
||||
using System.Text;
|
||||
|
||||
namespace Launcher.ViewModel
|
||||
{
|
||||
internal class HomeVM : ObservableObject
|
||||
{
|
||||
public static HomeVM Instacne = new HomeVM();
|
||||
|
||||
public LauncherConfig LauncherConfig
|
||||
{
|
||||
get { return App.launcherConfig; }
|
||||
set { SetProperty(ref App.launcherConfig, value); }
|
||||
}
|
||||
|
||||
public HomeVM()
|
||||
{
|
||||
if (LauncherConfig == null)
|
||||
{
|
||||
LauncherConfig = new LauncherConfig();
|
||||
|
||||
LauncherConfig.Servers.Add(new ServerItem()
|
||||
{
|
||||
Name = "TestServer",
|
||||
Description = "Styles are the visual aspects of a UI that give it a distinct look and feel.",
|
||||
|
||||
proxy = new ProxyConfig("127.0.0.1", true, "25566")
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public RelayCommand StartGameCommand => new RelayCommand(StartGame);
|
||||
|
||||
public ProxyController proxyController;
|
||||
|
||||
private string startBtn_txt = Properties.Resources.btn_startgame;
|
||||
|
||||
public string StartBtn_txt
|
||||
{
|
||||
get { return startBtn_txt; }
|
||||
set { SetProperty(ref startBtn_txt, value); }
|
||||
}
|
||||
bool CanStart = true;
|
||||
|
||||
private bool canChangeProxyType = true;
|
||||
|
||||
public bool CanChangeProxyType
|
||||
{
|
||||
get { return canChangeProxyType; }
|
||||
set { SetProperty(ref canChangeProxyType,value); }
|
||||
}
|
||||
|
||||
#region 启动游戏
|
||||
|
||||
private void StartGame()
|
||||
{
|
||||
|
||||
if (!CanStart)
|
||||
{
|
||||
|
||||
SnackBar.Show(Properties.Resources.tip_nostart,null);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (LauncherConfig.GameInfo==null||
|
||||
LauncherConfig.GameInfo.GameExePath == null )
|
||||
//LauncherConfig.GameInfo.Version == null
|
||||
|
||||
{
|
||||
SnackBar.Show(Properties.Resources.tip_setcfg,new RelayCommand(() =>
|
||||
{
|
||||
//MainWindow.Instance.rootFrame.Navigate(new Uri("/View/Setting.xaml", UriKind.Relative));
|
||||
MainWindow.Instance.nav.SelectedIndex = 1;
|
||||
}));
|
||||
return;
|
||||
}
|
||||
var fp = LauncherConfig.GameInfo.GameExePath;
|
||||
try
|
||||
{
|
||||
|
||||
fp = Path.GetFullPath(fp);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
SnackBar.Show(ex.Message, new RelayCommand(() =>
|
||||
{
|
||||
MainWindow.Instance.nav.SelectedIndex = 1;
|
||||
}));
|
||||
return;
|
||||
}
|
||||
var fd = LauncherConfig.GameInfo.GameExeFolder;
|
||||
if (!File.Exists(fp)&&LauncherConfig.ProxyType!=ProxyType.PROXY_ONLY)
|
||||
{
|
||||
|
||||
SnackBar.Show(Properties.Resources.tip_correctgamepath, new RelayCommand(() =>
|
||||
{
|
||||
//MainWindow.Instance.rootFrame.Navigate(new Uri("/View/Setting.xaml", UriKind.Relative));
|
||||
MainWindow.Instance.nav.SelectedIndex = 1;
|
||||
}));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
switch (LauncherConfig.ProxyType)
|
||||
{
|
||||
case ProxyType.OFFICIAL:
|
||||
ProcessStartInfo startInfo = new ProcessStartInfo()
|
||||
{
|
||||
CreateNoWindow = true,
|
||||
FileName = fp,
|
||||
UseShellExecute = true,
|
||||
};
|
||||
try
|
||||
{
|
||||
Process.Start(startInfo);
|
||||
|
||||
StartBtn_txt = Properties.Resources.btn_running;
|
||||
|
||||
CanStart = false;
|
||||
|
||||
CanChangeProxyType = false;
|
||||
|
||||
new ProcessWatcher(new EventHandler(pro_Exited)).Watch();
|
||||
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
break;
|
||||
case ProxyType.PRIVATE:
|
||||
{
|
||||
if (LauncherConfig.Servers.Count==0)
|
||||
{
|
||||
SnackBar.Show(Properties.Resources.tip_reqaddone, null);
|
||||
return;
|
||||
}
|
||||
if (SelectedSrv==null)
|
||||
{
|
||||
SnackBar.Show(Properties.Resources.tip_reqselectone, null);
|
||||
return;
|
||||
}
|
||||
var SelectedProxy_C = SelectedSrv.proxy;
|
||||
proxyController = new ProxyController(SelectedProxy_C.ProxyPort, SelectedProxy_C.ProxyServer,SelectedProxy_C.UseHttp);
|
||||
proxyController.Start();
|
||||
|
||||
|
||||
|
||||
var dll = RSAPatchHelper.WriteMhypbaseAllTo(SelectedSrv); ;
|
||||
if (dll != null)
|
||||
{
|
||||
GameHelper.StartGame(fp, dll);
|
||||
}
|
||||
CanChangeProxyType = false;
|
||||
CanStart = false;
|
||||
StartBtn_txt = Properties.Resources.btn_running;
|
||||
new ProcessWatcher(new EventHandler(pro_Exited)).Watch();
|
||||
|
||||
break;
|
||||
}
|
||||
case ProxyType.PROXY_ONLY:
|
||||
{
|
||||
if (LauncherConfig.Servers.Count == 0||SelectedSrv==null)
|
||||
{
|
||||
SnackBar.Show(Properties.Resources.tip_reqaddone, null);
|
||||
return;
|
||||
}
|
||||
var SelectedProxy_C = SelectedSrv.proxy;
|
||||
|
||||
|
||||
if (proxyController!=null&&proxyController._IsRun)
|
||||
{
|
||||
CanChangeProxyType = true;
|
||||
|
||||
proxyController.Stop();
|
||||
|
||||
StartBtn_txt = Properties.Resources.btn_startproxy;
|
||||
}
|
||||
else
|
||||
{
|
||||
CanChangeProxyType = false;
|
||||
|
||||
proxyController = new ProxyController(SelectedProxy_C.ProxyPort, SelectedProxy_C.ProxyServer, SelectedProxy_C.UseHttp);
|
||||
|
||||
proxyController.Start();
|
||||
|
||||
StartBtn_txt = Properties.Resources.btn_stopproxy;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void pro_Exited(object sender, EventArgs e)
|
||||
{
|
||||
//MessageBox.Show("游戏退出!");
|
||||
|
||||
|
||||
CanStart = true;
|
||||
|
||||
switch (LauncherConfig.ProxyType)
|
||||
{
|
||||
case ProxyType.OFFICIAL:
|
||||
StartBtn_txt = Properties.Resources.btn_startgame;
|
||||
|
||||
CanChangeProxyType = true;
|
||||
break;
|
||||
case ProxyType.PRIVATE:
|
||||
|
||||
StartBtn_txt = Properties.Resources.btn_startgame;
|
||||
|
||||
proxyController.Stop();
|
||||
|
||||
CanChangeProxyType = true;
|
||||
|
||||
//var inif = System.IO.Path.Combine(LauncherConfig.GameInfo.GameExeFolder, "mhypbase.ini");
|
||||
|
||||
//if (File.Exists(inif))
|
||||
//{
|
||||
// File.Delete(inif);
|
||||
//}
|
||||
|
||||
break;
|
||||
case ProxyType.PROXY_ONLY:
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
public ICommand AddCommand => new RelayCommand(Add);
|
||||
public ICommand DeleteCommand => new RelayCommand(Delete);
|
||||
public ICommand EditCommand => new RelayCommand(Edit);
|
||||
public ICommand ImportCommand => new RelayCommand(Import);
|
||||
public ICommand ExportCommand => new RelayCommand(Export);
|
||||
|
||||
private void Export()
|
||||
{
|
||||
if (SelectedSrv!=null)
|
||||
{
|
||||
byte[] bytes = Encoding.Default.GetBytes(JsonConvert.SerializeObject(SelectedSrv));
|
||||
string str = Convert.ToBase64String(bytes);
|
||||
Clipboard.SetDataObject(str, true);
|
||||
SnackBar.Show(Properties.Resources.tip_exp_succ, null);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void Import()
|
||||
{
|
||||
try
|
||||
{
|
||||
IDataObject data = Clipboard.GetDataObject();
|
||||
string srv = (string)data.GetData(typeof(string));
|
||||
byte[] outputb = Convert.FromBase64String(srv);
|
||||
string orgStr = Encoding.Default.GetString(outputb);
|
||||
LauncherConfig.Servers.Add(JsonConvert.DeserializeObject<ServerItem>(orgStr));
|
||||
|
||||
SnackBar.Show(Properties.Resources.tip_imp_succ, null);
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
SnackBar.Show(Properties.Resources.tip_imp_err, null);
|
||||
}
|
||||
}
|
||||
|
||||
private ServerItem selectedSrv;
|
||||
|
||||
public ServerItem SelectedSrv
|
||||
{
|
||||
get { return selectedSrv; }
|
||||
set { SetProperty(ref selectedSrv , value); }
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void Add()
|
||||
{
|
||||
|
||||
var item = new ServerItem()
|
||||
{
|
||||
proxy = new ProxyConfig("127.0.0.1")
|
||||
};
|
||||
|
||||
ServerEditControl.instance.ServerItem = item;
|
||||
ServerEditControl.Show();
|
||||
|
||||
LauncherConfig.Servers.Add(item);
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void Delete()
|
||||
{
|
||||
if (SelectedSrv==null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
LauncherConfig.Servers.Remove(SelectedSrv);
|
||||
|
||||
if (LauncherConfig.SelectedSrvIndex>0)
|
||||
{
|
||||
LauncherConfig.SelectedSrvIndex -= 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void Edit()
|
||||
{
|
||||
if (SelectedSrv == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ServerEditControl.instance.ServerItem = SelectedSrv;
|
||||
ServerEditControl.Show();
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
67
ViewModel/SettingVM.cs
Normal file
67
ViewModel/SettingVM.cs
Normal file
|
@ -0,0 +1,67 @@
|
|||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using Launcher.Common;
|
||||
using Launcher.Model;
|
||||
using Microsoft.Win32;
|
||||
using System.IO;
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace Launcher.ViewModel
|
||||
{
|
||||
internal class SettingVM : ObservableObject
|
||||
{
|
||||
public static SettingVM Instacne = new SettingVM();
|
||||
|
||||
|
||||
public SettingVM()
|
||||
{
|
||||
if (LauncherConfig == null)
|
||||
{
|
||||
LauncherConfig = new LauncherConfig();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public LauncherConfig LauncherConfig
|
||||
{
|
||||
get { return App.launcherConfig; }
|
||||
set { SetProperty(ref App.launcherConfig, value); }
|
||||
}
|
||||
|
||||
public ICommand SearchGameFileCommand => new RelayCommand(SearchGameFile);
|
||||
|
||||
public ICommand SetGameExePathCommand => new RelayCommand(SetGameExePath);
|
||||
|
||||
|
||||
|
||||
public void SearchGameFile()
|
||||
{
|
||||
LauncherConfig.GameInfo = new GameInfo(GameHelper.GameRegReader.GetGameExePath());
|
||||
if (File.Exists(LauncherConfig.GameInfo.GameExePath))
|
||||
{
|
||||
MessageBox.Show(string.Format(Properties.Resources.tip_serach_succ,LauncherConfig.GameInfo.GameExeFolder));
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show(Properties.Resources.tip_search_err);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void SetGameExePath()
|
||||
{
|
||||
OpenFileDialog openFileDialog = new OpenFileDialog();
|
||||
openFileDialog.Filter = "原神游戏程序(YuanShen.exe)|YuanShen.exe|原神游戏程序(GenshinImpact.exe)|GenshinImpact.exe";
|
||||
openFileDialog.Multiselect = false;
|
||||
if (openFileDialog.ShowDialog() == true)
|
||||
{
|
||||
|
||||
LauncherConfig.GameInfo = new GameInfo(openFileDialog.FileName);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
81
app.manifest
Normal file
81
app.manifest
Normal file
|
@ -0,0 +1,81 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
|
||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||
<security>
|
||||
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<!-- UAC 清单选项
|
||||
如果想要更改 Windows 用户帐户控制级别,请使用
|
||||
以下节点之一替换 requestedExecutionLevel 节点。
|
||||
|
||||
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
||||
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
|
||||
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
|
||||
|
||||
指定 requestedExecutionLevel 元素将禁用文件和注册表虚拟化。
|
||||
如果你的应用程序需要此虚拟化来实现向后兼容性,则移除此
|
||||
元素。
|
||||
-->
|
||||
<!--<requestedExecutionLevel level="asInvoker" uiAccess="false" />-->
|
||||
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
|
||||
|
||||
</requestedPrivileges>
|
||||
</security>
|
||||
</trustInfo>
|
||||
|
||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||
<application>
|
||||
<!-- 设计此应用程序与其一起工作且已针对此应用程序进行测试的
|
||||
Windows 版本的列表。取消评论适当的元素,
|
||||
Windows 将自动选择最兼容的环境。 -->
|
||||
|
||||
<!-- Windows Vista -->
|
||||
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
|
||||
|
||||
<!-- Windows 7 -->
|
||||
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
|
||||
|
||||
<!-- Windows 8 -->
|
||||
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
|
||||
|
||||
<!-- Windows 8.1 -->
|
||||
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
|
||||
|
||||
<!-- Windows 10 -->
|
||||
<!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
|
||||
|
||||
</application>
|
||||
</compatibility>
|
||||
|
||||
<!-- 指示该应用程序可感知 DPI 且 Windows 在 DPI 较高时将不会对其进行
|
||||
自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI,无需
|
||||
选择加入。选择加入此设置的 Windows 窗体应用程序(面向 .NET Framework 4.6)还应
|
||||
在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"。
|
||||
|
||||
将应用程序设为感知长路径。请参阅 https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation -->
|
||||
<!--
|
||||
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<windowsSettings>
|
||||
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
|
||||
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
|
||||
</windowsSettings>
|
||||
</application>
|
||||
-->
|
||||
|
||||
<!-- 启用 Windows 公共控件和对话框的主题(Windows XP 和更高版本) -->
|
||||
<!--
|
||||
<dependency>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity
|
||||
type="win32"
|
||||
name="Microsoft.Windows.Common-Controls"
|
||||
version="6.0.0.0"
|
||||
processorArchitecture="*"
|
||||
publicKeyToken="6595b64144ccf1df"
|
||||
language="*"
|
||||
/>
|
||||
</dependentAssembly>
|
||||
</dependency>
|
||||
-->
|
||||
|
||||
</assembly>
|
BIN
favicon.ico
Normal file
BIN
favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
1
key/GC-Dispatch.txt
Normal file
1
key/GC-Dispatch.txt
Normal file
|
@ -0,0 +1 @@
|
|||
<RSAKeyValue><Modulus>xbbx2m1feHyrQ7jP+8mtDF/pyYLrJWKWAdEv3wZrOtjOZzeLGPzsmkcgncgoRhX4dT+1itSMR9j9m0/OwsH2UoF6U32LxCOQWQD1AMgIZjAkJeJvFTrtn8fMQ1701CkbaLTVIjRMlTw8kNXvNA/A9UatoiDmi4TFG6mrxTKZpIcTInvPEpkK2A7Qsp1E4skFK8jmysy7uRhMaYHtPTsBvxP0zn3lhKB3W+HTqpneewXWHjCDfL7Nbby91jbz5EKPZXWLuhXIvR1Cu4tiruorwXJxmXaP1HQZonytECNU/UOzP6GNLdq0eFDE4b04Wjp396551G99YiFP2nqHVJ5OMQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>
|
68
packages.config
Normal file
68
packages.config
Normal file
|
@ -0,0 +1,68 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="BrotliSharpLib" version="0.3.3" targetFramework="net472" />
|
||||
<package id="CommunityToolkit.Mvvm" version="8.0.0" targetFramework="net472" />
|
||||
<package id="Costura.Fody" version="5.7.0" targetFramework="net472" developmentDependency="true" />
|
||||
<package id="Fody" version="6.5.5" targetFramework="net472" developmentDependency="true" />
|
||||
<package id="Microsoft.Bcl.AsyncInterfaces" version="6.0.0" targetFramework="net472" />
|
||||
<package id="Microsoft.NETCore.Platforms" version="1.1.0" targetFramework="net472" />
|
||||
<package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="net472" />
|
||||
<package id="Microsoft.Win32.Registry" version="5.0.0" targetFramework="net472" />
|
||||
<package id="NETStandard.Library" version="1.6.1" targetFramework="net472" />
|
||||
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net472" />
|
||||
<package id="Panuon.WPF" version="1.0.1" targetFramework="net472" />
|
||||
<package id="Panuon.WPF.UI" version="1.1.6.5" targetFramework="net472" />
|
||||
<package id="Portable.BouncyCastle" version="1.8.8" targetFramework="net472" />
|
||||
<package id="System.AppContext" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Buffers" version="4.5.1" targetFramework="net472" />
|
||||
<package id="System.Collections" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Collections.Concurrent" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.ComponentModel.Annotations" version="5.0.0" targetFramework="net472" />
|
||||
<package id="System.Console" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Diagnostics.DiagnosticSource" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Diagnostics.Tracing" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Globalization" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Globalization.Calendars" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.IO" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.IO.Compression" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.IO.Compression.ZipFile" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.IO.FileSystem" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Linq" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Linq.Expressions" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Memory" version="4.5.5" targetFramework="net472" />
|
||||
<package id="System.Net.Http" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Net.Primitives" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Net.Sockets" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net472" />
|
||||
<package id="System.ObjectModel" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Reflection" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Reflection.Extensions" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Reflection.Primitives" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Runtime" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net472" />
|
||||
<package id="System.Runtime.Extensions" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Runtime.Handles" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Runtime.Numerics" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Security.AccessControl" version="5.0.0" targetFramework="net472" />
|
||||
<package id="System.Security.Cryptography.Algorithms" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Security.Principal.Windows" version="5.0.0" targetFramework="net472" />
|
||||
<package id="System.Text.Encoding" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Text.RegularExpressions" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Threading" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Threading.Tasks" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net472" />
|
||||
<package id="System.Threading.Timer" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Xml.ReaderWriter" version="4.3.0" targetFramework="net472" />
|
||||
<package id="System.Xml.XDocument" version="4.3.0" targetFramework="net472" />
|
||||
<package id="Titanium.Web.Proxy" version="3.2.0" targetFramework="net472" />
|
||||
</packages>
|
Loading…
Reference in a new issue