7`>QuG~iq%7^&25AKf)*gH<4
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
literal 0
HcmV?d00001
diff --git a/FodyWeavers.xml b/FodyWeavers.xml
new file mode 100644
index 0000000..943538d
--- /dev/null
+++ b/FodyWeavers.xml
@@ -0,0 +1,7 @@
+
+
+
+ InjectorLib
+
+
+
\ No newline at end of file
diff --git a/Launcher.csproj b/Launcher.csproj
new file mode 100644
index 0000000..f450fa7
--- /dev/null
+++ b/Launcher.csproj
@@ -0,0 +1,404 @@
+
+
+
+
+
+ Debug
+ AnyCPU
+ {D3AA2F83-0262-4994-928F-497847A6C8EC}
+ WinExe
+ Launcher
+ Launcher
+ v4.7.2
+ 512
+ {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ 4
+ true
+ true
+
+
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ app.manifest
+
+
+ true
+ bin\x64\Debug\
+ DEBUG;TRACE
+ full
+ x64
+ 7.3
+ prompt
+ true
+
+
+ bin\x64\Release\
+ TRACE
+ true
+ pdbonly
+ x64
+ 7.3
+ prompt
+ true
+
+
+ 4.0
+ zh-CN
+ true
+ true
+
+
+
+ packages\Portable.BouncyCastle.1.8.8\lib\net40\BouncyCastle.Crypto.dll
+
+
+ packages\BrotliSharpLib.0.3.3\lib\net451\BrotliSharpLib.dll
+
+
+ packages\CommunityToolkit.Mvvm.8.0.0\lib\netstandard2.0\CommunityToolkit.Mvvm.dll
+
+
+ packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll
+
+
+ .\InjectorLib.dll
+
+
+ packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll
+
+
+ packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll
+ True
+ True
+
+
+ packages\Microsoft.Win32.Registry.5.0.0\lib\net461\Microsoft.Win32.Registry.dll
+
+
+ packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll
+
+
+ packages\Panuon.WPF.1.0.1\lib\net472\Panuon.WPF.dll
+
+
+ packages\Panuon.WPF.UI.1.1.6.5\lib\net472\Panuon.WPF.UI.dll
+
+
+
+ packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll
+ True
+ True
+
+
+ packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll
+
+
+ packages\System.ComponentModel.Annotations.5.0.0\lib\net461\System.ComponentModel.Annotations.dll
+
+
+
+
+ packages\System.Console.4.3.0\lib\net46\System.Console.dll
+ True
+ True
+
+
+
+ packages\System.Diagnostics.DiagnosticSource.4.3.0\lib\net46\System.Diagnostics.DiagnosticSource.dll
+
+
+ packages\System.Diagnostics.Tracing.4.3.0\lib\net462\System.Diagnostics.Tracing.dll
+ True
+ True
+
+
+ packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll
+ True
+ True
+
+
+ packages\System.IO.4.3.0\lib\net462\System.IO.dll
+ True
+ True
+
+
+ packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll
+ True
+ True
+
+
+
+ packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll
+ True
+ True
+
+
+ packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll
+ True
+ True
+
+
+ packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll
+ True
+ True
+
+
+ packages\System.Linq.4.3.0\lib\net463\System.Linq.dll
+ True
+ True
+
+
+ packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll
+ True
+ True
+
+
+ packages\System.Memory.4.5.5\lib\net461\System.Memory.dll
+
+
+ packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll
+ True
+ True
+
+
+ packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll
+ True
+ True
+
+
+
+ packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll
+
+
+ packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll
+ True
+ True
+
+
+ packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll
+ True
+ True
+
+
+ packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll
+
+
+ packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll
+ True
+ True
+
+
+ packages\System.Runtime.InteropServices.4.3.0\lib\net463\System.Runtime.InteropServices.dll
+ True
+ True
+
+
+ packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll
+ True
+ True
+
+
+ packages\System.Security.AccessControl.5.0.0\lib\net461\System.Security.AccessControl.dll
+
+
+ packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll
+ True
+ True
+
+
+ packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll
+ True
+ True
+
+
+ packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll
+ True
+ True
+
+
+ packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll
+ True
+ True
+
+
+ packages\System.Security.Principal.Windows.5.0.0\lib\net461\System.Security.Principal.Windows.dll
+
+
+ packages\System.Text.RegularExpressions.4.3.0\lib\net463\System.Text.RegularExpressions.dll
+ True
+ True
+
+
+ packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll
+
+
+
+
+
+
+
+ 4.0
+
+
+ packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll
+ True
+ True
+
+
+ packages\Titanium.Web.Proxy.3.2.0\lib\net461\Titanium.Web.Proxy.dll
+
+
+
+
+
+
+
+ MSBuild:Compile
+ Designer
+
+
+
+
+
+
+
+ ServerEditControl.xaml
+
+
+ SnackBar.xaml
+
+
+
+
+
+
+
+
+
+ About.xaml
+
+
+ Home.xaml
+
+
+ Setting.xaml
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+ Designer
+
+
+ App.xaml
+ Code
+
+
+ MainWindow.xaml
+ Code
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+
+
+ Code
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ Settings.settings
+ True
+
+
+
+ PublicResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Launcher.sln b/Launcher.sln
new file mode 100644
index 0000000..efdc592
--- /dev/null
+++ b/Launcher.sln
@@ -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
diff --git a/MainWindow.xaml b/MainWindow.xaml
new file mode 100644
index 0000000..630feeb
--- /dev/null
+++ b/MainWindow.xaml
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs
new file mode 100644
index 0000000..fa3c0c1
--- /dev/null
+++ b/MainWindow.xaml.cs
@@ -0,0 +1,54 @@
+using Launcher.Model;
+using System;
+using System.Globalization;
+using System.Threading;
+using System.Windows;
+using System.Windows.Controls;
+
+namespace Launcher
+{
+ ///
+ /// MainWindow.xaml 的交互逻辑
+ ///
+ 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;
+ }
+ }
+ }
+}
diff --git a/Model/GameInfo.cs b/Model/GameInfo.cs
new file mode 100644
index 0000000..9120379
--- /dev/null
+++ b/Model/GameInfo.cs
@@ -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; }
+
+ }
+}
diff --git a/Model/LauncherConfig.cs b/Model/LauncherConfig.cs
new file mode 100644
index 0000000..6333f50
--- /dev/null
+++ b/Model/LauncherConfig.cs
@@ -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(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 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 servers = new ObservableCollection();
+
+ public ObservableCollection Servers
+ {
+ get { return servers; }
+ set { SetProperty(ref servers, value); }
+ }
+
+
+
+
+ }
+}
diff --git a/Model/PkgVersionItem.cs b/Model/PkgVersionItem.cs
new file mode 100644
index 0000000..813267e
--- /dev/null
+++ b/Model/PkgVersionItem.cs
@@ -0,0 +1,22 @@
+using System;
+
+namespace Launcher.Model
+{
+ [Obsolete]
+ public class PkgVersionItem
+ {
+ ///
+ ///
+ ///
+ public string remoteName { get; set; }
+ ///
+ ///
+ ///
+ public string md5 { get; set; }
+ ///
+ ///
+ ///
+ public int fileSize { get; set; }
+
+ }
+}
diff --git a/Model/ProxyConfig.cs b/Model/ProxyConfig.cs
new file mode 100644
index 0000000..6c8a48e
--- /dev/null
+++ b/Model/ProxyConfig.cs
@@ -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; }
+
+ }
+}
diff --git a/Model/ServerItem.cs b/Model/ServerItem.cs
new file mode 100644
index 0000000..a751962
--- /dev/null
+++ b/Model/ServerItem.cs
@@ -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; }
+ }
+}
diff --git a/MultilingualResources/Launcher.en.xlf b/MultilingualResources/Launcher.en.xlf
new file mode 100644
index 0000000..66ebacb
--- /dev/null
+++ b/MultilingualResources/Launcher.en.xlf
@@ -0,0 +1,201 @@
+
+
+
+
+
+
+
+
+ About
+
+
+
+ Home
+
+
+
+ Settings
+
+
+
+ + Supported versions: 3.1, 3.2, 3.2.50, 3.3, Synchronized with gc toolkit/RSAPatch.
+
+
+
+ Auto Detect
+
+
+
+ Manual
+
+
+
+ Enable DebugMode
+
+
+
+ About
+
+
+
+ Development
+
+
+
+ General
+
+
+
+ [appreciate]:https://github.com/34736384/RSAPatch
+
+
+
+ [Source Code]:https://github.com/gc-toolkit/Launcher
+
+
+
+ Official Mode
+
+
+
+ Private Mode
+
+
+
+ Proxy Only
+
+
+
+ Background Image
+
+
+
+ GamePath
+
+
+
+ Select a server
+
+
+
+ Running
+
+
+
+ Play
+
+
+
+ StartProxy
+
+
+
+ StopProxy
+
+
+
+ Add
+
+
+
+ Delete
+
+
+
+ Edit
+
+
+
+ Export to Clipboard
+
+
+
+ Import from clipboard
+
+
+
+ Available servers:
+
+
+
+ Please set the correct game path!
+
+
+
+ Export succeeded!
+
+
+
+ Import failed!
+
+
+
+ Import succeeded!
+
+
+
+ Can't start the game now!
+
+
+
+ Please add and select at least one server!
+
+
+
+ Please select a server!
+
+
+
+ Please set the game directory and game version first!
+
+
+
+ Use HTTP
+
+
+
+ Server Profile Edit
+
+
+
+ Detect failed, there is no relevant information in the registry!
+
+
+
+ Found game file at {0}!
+ Please verify the translation’s accuracy as the source string was updated after it was translated.
+
+
+
+ Server Name
+
+
+
+ Advanced
+
+
+
+ Apply
+
+
+
+ PrivateKey: If it is empty, it will be disabled.
+
+
+
+ PublicKey: If it is empty, it will use grasscutter's ley.
+
+
+
+ An instance is already running
+
+
+
+ Crashed
+
+
+
+
+
\ No newline at end of file
diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..324d404
--- /dev/null
+++ b/Properties/AssemblyInfo.cs
@@ -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 文件中的 CultureYouAreCodingWith
+//例如,如果您在源文件中使用的是美国英语,
+//使用的是美国英语,请将 设置为 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")]
diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..0dcc418
--- /dev/null
+++ b/Properties/Resources.Designer.cs
@@ -0,0 +1,486 @@
+//------------------------------------------------------------------------------
+//
+// 此代码由工具生成。
+// 运行时版本:4.0.30319.42000
+//
+// 对此文件的更改可能会导致不正确的行为,并且如果
+// 重新生成代码,这些更改将会丢失。
+//
+//------------------------------------------------------------------------------
+
+namespace Launcher.Properties {
+ using System;
+
+
+ ///
+ /// 一个强类型的资源类,用于查找本地化的字符串等。
+ ///
+ // 此类是由 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() {
+ }
+
+ ///
+ /// 返回此类使用的缓存的 ResourceManager 实例。
+ ///
+ [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;
+ }
+ }
+
+ ///
+ /// 重写当前线程的 CurrentUICulture 属性,对
+ /// 使用此强类型资源类的所有资源查找执行重写。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ public static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// 查找类似 + 支持的版本:3.1, 3.2, 3.2.50, 3.3, 与 gc-toolkit/RSAPatch 保持同步。 的本地化字符串。
+ ///
+ public static string about_desp {
+ get {
+ return ResourceManager.GetString("about_desp", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 正在运行 的本地化字符串。
+ ///
+ public static string btn_running {
+ get {
+ return ResourceManager.GetString("btn_running", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 自动搜索 的本地化字符串。
+ ///
+ public static string btn_searchgame {
+ get {
+ return ResourceManager.GetString("btn_searchgame", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 手动选择 的本地化字符串。
+ ///
+ public static string btn_selectgame {
+ get {
+ return ResourceManager.GetString("btn_selectgame", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 开始游戏 的本地化字符串。
+ ///
+ public static string btn_startgame {
+ get {
+ return ResourceManager.GetString("btn_startgame", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 开启代理 的本地化字符串。
+ ///
+ public static string btn_startproxy {
+ get {
+ return ResourceManager.GetString("btn_startproxy", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 关闭代理 的本地化字符串。
+ ///
+ public static string btn_stopproxy {
+ get {
+ return ResourceManager.GetString("btn_stopproxy", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 开启调试 的本地化字符串。
+ ///
+ public static string cb_enabledebug {
+ get {
+ return ResourceManager.GetString("cb_enabledebug", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 使用http 的本地化字符串。
+ ///
+ public static string cb_usehttp {
+ get {
+ return ResourceManager.GetString("cb_usehttp", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 添加 的本地化字符串。
+ ///
+ public static string cm_add {
+ get {
+ return ResourceManager.GetString("cm_add", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 删除 的本地化字符串。
+ ///
+ public static string cm_del {
+ get {
+ return ResourceManager.GetString("cm_del", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 编辑 的本地化字符串。
+ ///
+ public static string cm_edit {
+ get {
+ return ResourceManager.GetString("cm_edit", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 导出到剪贴板 的本地化字符串。
+ ///
+ public static string cm_export {
+ get {
+ return ResourceManager.GetString("cm_export", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 从剪贴板导入 的本地化字符串。
+ ///
+ public static string cm_import {
+ get {
+ return ResourceManager.GetString("cm_import", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 关于 的本地化字符串。
+ ///
+ public static string h_about {
+ get {
+ return ResourceManager.GetString("h_about", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 开发 的本地化字符串。
+ ///
+ public static string h_develop {
+ get {
+ return ResourceManager.GetString("h_develop", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 常规 的本地化字符串。
+ ///
+ public static string h_general {
+ get {
+ return ResourceManager.GetString("h_general", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 服务器编辑 的本地化字符串。
+ ///
+ public static string h_serveredit {
+ get {
+ return ResourceManager.GetString("h_serveredit", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 可用服务器: 的本地化字符串。
+ ///
+ public static string h_servers {
+ get {
+ return ResourceManager.GetString("h_servers", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 关于 的本地化字符串。
+ ///
+ public static string nav_about {
+ get {
+ return ResourceManager.GetString("nav_about", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 主页 的本地化字符串。
+ ///
+ public static string nav_home {
+ get {
+ return ResourceManager.GetString("nav_home", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 设置 的本地化字符串。
+ ///
+ public static string nav_setting {
+ get {
+ return ResourceManager.GetString("nav_setting", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 [感谢]:https://github.com/34736384/RSAPatch 的本地化字符串。
+ ///
+ public static string repo1 {
+ get {
+ return ResourceManager.GetString("repo1", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 [开源地址]:https://github.com/gc-toolkit/Launcher 的本地化字符串。
+ ///
+ public static string repoinfo {
+ get {
+ return ResourceManager.GetString("repoinfo", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 高级 的本地化字符串。
+ ///
+ public static string t_advanced {
+ get {
+ return ResourceManager.GetString("t_advanced", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 官方 的本地化字符串。
+ ///
+ public static string tab_official {
+ get {
+ return ResourceManager.GetString("tab_official", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 私有 的本地化字符串。
+ ///
+ public static string tab_private {
+ get {
+ return ResourceManager.GetString("tab_private", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 仅代理 的本地化字符串。
+ ///
+ public static string tab_proxyonly {
+ get {
+ return ResourceManager.GetString("tab_proxyonly", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 确定 的本地化字符串。
+ ///
+ public static string tb_ok {
+ get {
+ return ResourceManager.GetString("tb_ok", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 背景图片 的本地化字符串。
+ ///
+ public static string tbtip_bgurl {
+ get {
+ return ResourceManager.GetString("tbtip_bgurl", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 游戏路径 的本地化字符串。
+ ///
+ public static string tbtip_gamepath {
+ get {
+ return ResourceManager.GetString("tbtip_gamepath", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 已经有一个启动器在运行 的本地化字符串。
+ ///
+ public static string tip_alreadyrunning {
+ get {
+ return ResourceManager.GetString("tip_alreadyrunning", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 请设置正确的游戏路径! 的本地化字符串。
+ ///
+ public static string tip_correctgamepath {
+ get {
+ return ResourceManager.GetString("tip_correctgamepath", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 崩溃了 的本地化字符串。
+ ///
+ public static string tip_crash_title {
+ get {
+ return ResourceManager.GetString("tip_crash_title", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 导出成功! 的本地化字符串。
+ ///
+ public static string tip_exp_succ {
+ get {
+ return ResourceManager.GetString("tip_exp_succ", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 导入失败! 的本地化字符串。
+ ///
+ public static string tip_imp_err {
+ get {
+ return ResourceManager.GetString("tip_imp_err", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 导入成功! 的本地化字符串。
+ ///
+ public static string tip_imp_succ {
+ get {
+ return ResourceManager.GetString("tip_imp_succ", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 现在不能开始游戏! 的本地化字符串。
+ ///
+ public static string tip_nostart {
+ get {
+ return ResourceManager.GetString("tip_nostart", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 PrivateKey,为空则禁用 的本地化字符串。
+ ///
+ public static string tip_privatekey {
+ get {
+ return ResourceManager.GetString("tip_privatekey", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 PublicKey,为空则选择割草机的key 的本地化字符串。
+ ///
+ public static string tip_publickey {
+ get {
+ return ResourceManager.GetString("tip_publickey", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 请至少添加并选择一个服务器! 的本地化字符串。
+ ///
+ public static string tip_reqaddone {
+ get {
+ return ResourceManager.GetString("tip_reqaddone", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 请选择一个服务器! 的本地化字符串。
+ ///
+ public static string tip_reqselectone {
+ get {
+ return ResourceManager.GetString("tip_reqselectone", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 搜索失败,注册表中没有相关信息! 的本地化字符串。
+ ///
+ public static string tip_search_err {
+ get {
+ return ResourceManager.GetString("tip_search_err", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 选择一个服务器 的本地化字符串。
+ ///
+ public static string tip_selectone {
+ get {
+ return ResourceManager.GetString("tip_selectone", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 已找到位于{0}的游戏文件! 的本地化字符串。
+ ///
+ public static string tip_serach_succ {
+ get {
+ return ResourceManager.GetString("tip_serach_succ", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 请先设置 游戏目录 和 游戏版本! 的本地化字符串。
+ ///
+ public static string tip_setcfg {
+ get {
+ return ResourceManager.GetString("tip_setcfg", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 服务器名称 的本地化字符串。
+ ///
+ public static string tip_srvname {
+ get {
+ return ResourceManager.GetString("tip_srvname", resourceCulture);
+ }
+ }
+ }
+}
diff --git a/Properties/Resources.en.resx b/Properties/Resources.en.resx
new file mode 100644
index 0000000..3e01ea7
--- /dev/null
+++ b/Properties/Resources.en.resx
@@ -0,0 +1,150 @@
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ About
+
+
+ Home
+
+
+ Settings
+
+
+ + Supported versions: 3.1, 3.2, 3.2.50, 3.3, Synchronized with gc toolkit/RSAPatch.
+
+
+ Auto Detect
+
+
+ Manual
+
+
+ Enable DebugMode
+
+
+ About
+
+
+ Development
+
+
+ General
+
+
+ [appreciate]:https://github.com/34736384/RSAPatch
+
+
+ [Source Code]:https://github.com/gc-toolkit/Launcher
+
+
+ Official Mode
+
+
+ Private Mode
+
+
+ Proxy Only
+
+
+ Background Image
+
+
+ GamePath
+
+
+ Select a server
+
+
+ Running
+
+
+ Play
+
+
+ StartProxy
+
+
+ StopProxy
+
+
+ Add
+
+
+ Delete
+
+
+ Edit
+
+
+ Export to Clipboard
+
+
+ Import from clipboard
+
+
+ Available servers:
+
+
+ Please set the correct game path!
+
+
+ Export succeeded!
+
+
+ Import failed!
+
+
+ Import succeeded!
+
+
+ Can't start the game now!
+
+
+ Please add and select at least one server!
+
+
+ Please select a server!
+
+
+ Please set the game directory and game version first!
+
+
+ Use HTTP
+
+
+ Server Profile Edit
+
+
+ Detect failed, there is no relevant information in the registry!
+
+
+ Found game file at {0}!
+
+
+ Server Name
+
+
+ Advanced
+
+
+ Apply
+
+
+ PrivateKey: If it is empty, it will be disabled.
+
+
+ PublicKey: If it is empty, it will use grasscutter's ley.
+
+
\ No newline at end of file
diff --git a/Properties/Resources.resx b/Properties/Resources.resx
new file mode 100644
index 0000000..554657a
--- /dev/null
+++ b/Properties/Resources.resx
@@ -0,0 +1,261 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ + 支持的版本:3.1, 3.2, 3.2.50, 3.3, 与 gc-toolkit/RSAPatch 保持同步。
+
+
+ 正在运行
+
+
+ 自动搜索
+
+
+ 手动选择
+
+
+ 开始游戏
+
+
+ 开启代理
+
+
+ 关闭代理
+
+
+ 开启调试
+
+
+ 使用http
+
+
+ 添加
+
+
+ 删除
+
+
+ 编辑
+
+
+ 导出到剪贴板
+
+
+ 从剪贴板导入
+
+
+ 关于
+
+
+ 开发
+
+
+ 常规
+
+
+ 服务器编辑
+
+
+ 可用服务器:
+
+
+ 关于
+
+
+ 主页
+
+
+ 设置
+
+
+ [感谢]:https://github.com/34736384/RSAPatch
+
+
+ [开源地址]:https://github.com/gc-toolkit/Launcher
+
+
+ 官方
+
+
+ 私有
+
+
+ 仅代理
+
+
+ 背景图片
+
+
+ 游戏路径
+
+
+ 确定
+
+
+ 已经有一个启动器在运行
+
+
+ 请设置正确的游戏路径!
+
+
+ 崩溃了
+
+
+ 导出成功!
+
+
+ 导入失败!
+
+
+ 导入成功!
+
+
+ 现在不能开始游戏!
+
+
+ PrivateKey,为空则禁用
+
+
+ PublicKey,为空则选择割草机的key
+
+
+ 请至少添加并选择一个服务器!
+
+
+ 请选择一个服务器!
+
+
+ 搜索失败,注册表中没有相关信息!
+
+
+ 选择一个服务器
+
+
+ 已找到位于{0}的游戏文件!
+
+
+ 请先设置 游戏目录 和 游戏版本!
+
+
+ 服务器名称
+
+
+ 高级
+
+
\ No newline at end of file
diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..2ae0089
--- /dev/null
+++ b/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// 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.
+//
+//------------------------------------------------------------------------------
+
+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;
+ }
+ }
+ }
+}
diff --git a/Properties/Settings.settings b/Properties/Settings.settings
new file mode 100644
index 0000000..033d7a5
--- /dev/null
+++ b/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ad2aab7
--- /dev/null
+++ b/README.md
@@ -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](/)
diff --git a/RSAPatch/PublicKey.txt b/RSAPatch/PublicKey.txt
new file mode 100644
index 0000000..8777005
--- /dev/null
+++ b/RSAPatch/PublicKey.txt
@@ -0,0 +1 @@
+xbbx2m1feHyrQ7jP+8mtDF/pyYLrJWKWAdEv3wZrOtjOZzeLGPzsmkcgncgoRhX4dT+1itSMR9j9m0/OwsH2UoF6U32LxCOQWQD1AMgIZjAkJeJvFTrtn8fMQ1701CkbaLTVIjRMlTw8kNXvNA/A9UatoiDmi4TFG6mrxTKZpIcTInvPEpkK2A7Qsp1E4skFK8jmysy7uRhMaYHtPTsBvxP0zn3lhKB3W+HTqpneewXWHjCDfL7Nbby91jbz5EKPZXWLuhXIvR1Cu4tiruorwXJxmXaP1HQZonytECNU/UOzP6GNLdq0eFDE4b04Wjp396551G99YiFP2nqHVJ5OMQ==AQAB
\ No newline at end of file
diff --git a/RSAPatch/RSAPatch.dll b/RSAPatch/RSAPatch.dll
new file mode 100644
index 0000000000000000000000000000000000000000..a980fc303456fe9e5e4ad3e31dd6ebce8c3af441
GIT binary patch
literal 80896
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 |