From c23fecfe1437f68ec91148bf9a6f1106a6df5f2e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=BE=99=E8=85=BE=E7=8C=AB=E8=B7=83?= <1043137532@qq.com>
Date: Sun, 26 May 2024 23:53:25 +0800
Subject: [PATCH] =?UTF-8?q?=E5=85=AC=E5=BC=80=E6=9B=B4=E5=A4=9A=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 8 +-
Plain Craft Launcher 2.sln | 45 ++
Plain Craft Launcher 2/Application.xaml.vb | 2 +-
.../Modules/Base/ModBase.vb | 6 +-
.../Modules/Base/ModValidate.vb | 23 -
Plain Craft Launcher 2/Modules/ModSecret.vb | 239 ++++++
.../Pages/PageLink/PageLinkIoi.xaml.vb | 3 -
.../Pages/PageOther/PageOtherAbout.xaml | 332 +++++++++
.../Pages/PageOther/PageOtherAbout.xaml.vb | 40 +
.../Pages/PageOther/PageOtherTest.xaml | 12 +
.../Pages/PageOther/PageOtherTest.xaml.vb | 27 +
.../Pages/PageSetup/ModSetup.vb | 691 +++++++++++++++++
.../Pages/PageSetup/PageSetupLink.xaml | 1 -
.../Pages/PageSetup/PageSetupSystem.xaml.vb | 2 +-
.../Pages/PageSetup/PageSetupUI.xaml | 295 ++++++++
.../Pages/PageSetup/PageSetupUI.xaml.vb | 705 ++++++++++++++++++
.../Plain Craft Launcher 2.vbproj | 11 +
17 files changed, 2403 insertions(+), 39 deletions(-)
create mode 100644 Plain Craft Launcher 2.sln
create mode 100644 Plain Craft Launcher 2/Modules/ModSecret.vb
create mode 100644 Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml
create mode 100644 Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml.vb
create mode 100644 Plain Craft Launcher 2/Pages/PageOther/PageOtherTest.xaml
create mode 100644 Plain Craft Launcher 2/Pages/PageOther/PageOtherTest.xaml.vb
create mode 100644 Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb
create mode 100644 Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml
create mode 100644 Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb
diff --git a/.gitignore b/.gitignore
index 3ee9b08..88fa390 100644
--- a/.gitignore
+++ b/.gitignore
@@ -343,11 +343,5 @@ healthchecksdb
# ------------------------------------------------------------
-# 包含主题解锁、加密解密等部分的代码
-ModSecret.vb
-ModSetup.vb
-PageOtherAbout.*
-PageOtherTest.*
-PageSetupUI.*
-# 开发者工具
+MaskFiles/
ModDevelop.vb
diff --git a/Plain Craft Launcher 2.sln b/Plain Craft Launcher 2.sln
new file mode 100644
index 0000000..8d103b8
--- /dev/null
+++ b/Plain Craft Launcher 2.sln
@@ -0,0 +1,45 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.2.32616.157
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Plain Craft Launcher 2", "Plain Craft Launcher 2\Plain Craft Launcher 2.vbproj", "{4499F2D2-18EF-4238-B1F0-7BD547AFF925}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Releaser", "Releaser", "{0FB7B07C-83E1-477E-B05B-C298304748BC}"
+ ProjectSection(SolutionItems) = preProject
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "解决方案项", "解决方案项", "{E9455DAD-1E69-4848-98A3-528C8DD5517C}"
+ ProjectSection(SolutionItems) = preProject
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Beta|Any CPU = Beta|Any CPU
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ ReleaseUpdate|Any CPU = ReleaseUpdate|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {4499F2D2-18EF-4238-B1F0-7BD547AFF925}.Beta|Any CPU.ActiveCfg = BETA|Any CPU
+ {4499F2D2-18EF-4238-B1F0-7BD547AFF925}.Beta|Any CPU.Build.0 = BETA|Any CPU
+ {4499F2D2-18EF-4238-B1F0-7BD547AFF925}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4499F2D2-18EF-4238-B1F0-7BD547AFF925}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4499F2D2-18EF-4238-B1F0-7BD547AFF925}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4499F2D2-18EF-4238-B1F0-7BD547AFF925}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4499F2D2-18EF-4238-B1F0-7BD547AFF925}.ReleaseUpdate|Any CPU.ActiveCfg = ReleaseUpdate|Any CPU
+ {4499F2D2-18EF-4238-B1F0-7BD547AFF925}.ReleaseUpdate|Any CPU.Build.0 = ReleaseUpdate|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {838A572E-025C-4A2B-B682-68732EC0FE76}
+ EndGlobalSection
+ GlobalSection(Performance) = preSolution
+ HasPerformanceSessions = true
+ EndGlobalSection
+ GlobalSection(Performance) = preSolution
+ HasPerformanceSessions = true
+ EndGlobalSection
+EndGlobal
diff --git a/Plain Craft Launcher 2/Application.xaml.vb b/Plain Craft Launcher 2/Application.xaml.vb
index 32909e7..eb34ceb 100644
--- a/Plain Craft Launcher 2/Application.xaml.vb
+++ b/Plain Craft Launcher 2/Application.xaml.vb
@@ -12,7 +12,7 @@ Public Class Application
Try
ModDevelop.Start()
Catch ex As Exception
- Log(ex, "开发者模式测试出错", LogLevel.Feedback)
+ Log(ex, "开发者模式测试出错", LogLevel.Msgbox)
End Try
End Sub
#End If
diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb
index e07e1eb..ef3f749 100644
--- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb
+++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb
@@ -595,7 +595,7 @@ Public Module ModBase
Try
Dim parentKey As Microsoft.Win32.RegistryKey, softKey As Microsoft.Win32.RegistryKey
parentKey = My.Computer.Registry.CurrentUser
- softKey = parentKey.OpenSubKey("Software\PCL", True)
+ softKey = parentKey.OpenSubKey("Software\" & RegFolder, True)
If softKey Is Nothing Then
ReadReg = DefaultValue '不存在则返回默认值
Else
@@ -616,8 +616,8 @@ Public Module ModBase
Try
Dim parentKey As Microsoft.Win32.RegistryKey, softKey As Microsoft.Win32.RegistryKey
parentKey = My.Computer.Registry.CurrentUser
- softKey = parentKey.OpenSubKey("Software\PCL", True)
- If softKey Is Nothing Then softKey = parentKey.CreateSubKey("Software\PCL") '如果不存在就创建
+ softKey = parentKey.OpenSubKey("Software\" & RegFolder, True)
+ If softKey Is Nothing Then softKey = parentKey.CreateSubKey("Software\" & RegFolder) '如果不存在就创建
softKey.SetValue(Key, Value)
Catch ex As Exception
Log(ex, "写入注册表出错:" & Key, If(ShowException, LogLevel.Hint, LogLevel.Developer))
diff --git a/Plain Craft Launcher 2/Modules/Base/ModValidate.vb b/Plain Craft Launcher 2/Modules/Base/ModValidate.vb
index 154e950..b7f818b 100644
--- a/Plain Craft Launcher 2/Modules/Base/ModValidate.vb
+++ b/Plain Craft Launcher 2/Modules/Base/ModValidate.vb
@@ -355,26 +355,3 @@ Fin:
Return ""
End Function
End Class
-
-'''
-''' 敏感词过滤。
-'''
-Public Class ValidateFilter
- Inherits Validate
- Private Shared Excepts As String() = SecretDecrypt(SecretSensitiveWordsRaw).Split("|")
- Public Sub New()
- End Sub '用于 XAML 初始化
- Public Overrides Function Validate(Str As String) As String
- '提取无间隔符的字符串
- Dim RealStr As String = ""
- For Each St In If(Str, "").ToLower
- If String.IsNullOrWhiteSpace(St.ToString) OrElse ("!@#$%^&*()_+-={}[]|\;':"",./<>? ~ ·!¥…()—,。、《》?‘;:【】{}" & vbLQ & vbRQ).ToCharArray.Contains(St) Then Continue For
- RealStr += St
- Next
- '检查
- For Each Except In Excepts
- If RealStr.Contains(Except) Then Return "存在敏感内容!"
- Next
- Return ""
- End Function
-End Class
diff --git a/Plain Craft Launcher 2/Modules/ModSecret.vb b/Plain Craft Launcher 2/Modules/ModSecret.vb
new file mode 100644
index 0000000..28cc899
--- /dev/null
+++ b/Plain Craft Launcher 2/Modules/ModSecret.vb
@@ -0,0 +1,239 @@
+'由于包含加解密等安全信息,本文件中的部分代码已被删除
+
+Imports System.Net
+Imports System.Reflection
+Imports System.Security.Cryptography
+
+Friend Module ModSecret
+
+#Region "杂项"
+
+ '在开源内容的注册表键与普通内容的注册表键隔离
+ Public Const RegFolder As String = "PCLDebug"
+
+ Friend Sub SecretOnApplicationStart()
+ '提升 UI 线程优先级
+ Thread.CurrentThread.Priority = ThreadPriority.Highest
+ '确保 .NET Framework 版本
+ Try
+ Dim VersionTest As New FormattedText("", Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, Fonts.SystemTypefaces.First, 96, New MyColor, DPI)
+ Catch ex As UriFormatException '修复 #3555
+ Environment.SetEnvironmentVariable("windir", Environment.GetEnvironmentVariable("SystemRoot"), EnvironmentVariableTarget.User)
+ Dim VersionTest As New FormattedText("", Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, Fonts.SystemTypefaces.First, 96, New MyColor, DPI)
+ End Try
+ '检测当前文件夹权限
+ Try
+ Directory.CreateDirectory(Path & "PCL")
+ Catch ex As Exception
+ MsgBox($"PCL 无法创建 PCL 文件夹({Path & "PCL"}),请尝试:" & vbCrLf &
+ "1. 将 PCL 移动到其他文件夹" & If(Path.StartsWithF("C:", True), ",例如 C 盘和桌面以外的其他位置。", "。") & vbCrLf &
+ "2. 删除当前目录中的 PCL 文件夹,然后再试。" & vbCrLf &
+ "3. 右键 PCL 选择属性,打开 兼容性 中的 以管理员身份运行此程序。",
+ MsgBoxStyle.Critical, "运行环境错误")
+ Environment.[Exit](Result.Cancel)
+ End Try
+ If Not CheckPermission(Path & "PCL") Then
+ MsgBox("PCL 没有对当前文件夹的写入权限,请尝试:" & vbCrLf &
+ "1. 将 PCL 移动到其他文件夹" & If(Path.StartsWithF("C:", True), ",例如 C 盘和桌面以外的其他位置。", "。") & vbCrLf &
+ "2. 删除当前目录中的 PCL 文件夹,然后再试。" & vbCrLf &
+ "3. 右键 PCL 选择属性,打开 兼容性 中的 以管理员身份运行此程序。",
+ MsgBoxStyle.Critical, "运行环境错误")
+ Environment.[Exit](Result.Cancel)
+ End If
+ '开源版本提示
+ MsgBox($"该版本中不包含以下特性:
+- CurseForge 查询:需要 API Key(你可以申请一个,然后添加到 SecretHeadersSign 方法中)
+- 更新与联网通知:避免滥用隐患
+- 主题切换:这是需要赞助解锁的纪念性质的功能,别让赞助者太伤心啦
+- 百宝箱:开发早期往里面塞了些开发工具,整理起来太麻烦了,干脆噶了", MsgBoxStyle.Information, "开源版本说明")
+ End Sub
+
+ '''
+ ''' 获取设备标识码。
+ '''
+ Friend Function SecretGetUniqueAddress() As String
+ Return "0000-0000-0000-0000"
+ End Function
+
+ Friend Sub SecretLaunchJvmArgs(ByRef DataList As List(Of String))
+ Dim DataJvmCustom As String = Setup.Get("VersionAdvanceJvm", Version:=McVersionCurrent)
+ DataList.Insert(0, If(DataJvmCustom = "", Setup.Get("LaunchAdvanceJvm"), DataJvmCustom)) '可变 JVM 参数
+ McLaunchLog("当前剩余内存:" & Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024 * 10) / 10 & "G")
+ DataList.Add("-Xmn" & Math.Floor(PageVersionSetup.GetRam(McVersionCurrent) * 1024 * 0.15) & "m")
+ DataList.Add("-Xmx" & Math.Floor(PageVersionSetup.GetRam(McVersionCurrent) * 1024) & "m")
+ If Not DataList.Any(Function(d) d.Contains("-Dlog4j2.formatMsgNoLookups=true")) Then DataList.Add("-Dlog4j2.formatMsgNoLookups=true")
+ End Sub
+
+ '''
+ ''' 打码字符串中的 AccessToken。
+ '''
+ Friend Function SecretFilter(Raw As String, FilterChar As Char) As String
+ '打码 "accessToken " 后的内容
+ If Raw.Contains("accessToken ") Then
+ For Each Token In RegexSearch(Raw, "(?<=accessToken ([^ ]{5}))[^ ]+(?=[^ ]{5})")
+ Raw = Raw.Replace(Token, New String(FilterChar, Token.Count))
+ Next
+ End If
+ '打码当前登录的结果
+ Dim AccessToken As String = McLoginLoader.Output.AccessToken
+ If AccessToken Is Nothing OrElse AccessToken.Length < 10 OrElse Not Raw.ContainsF(AccessToken, True) OrElse
+ McLoginLoader.Output.Uuid = McLoginLoader.Output.AccessToken Then 'UUID 和 AccessToken 一样则不打码
+ Return Raw
+ Else
+ Return Raw.Replace(AccessToken, Left(AccessToken, 5) & New String(FilterChar, AccessToken.Length - 10) & Right(AccessToken, 5))
+ End If
+ End Function
+
+#End Region
+
+#Region "网络鉴权"
+
+ Friend Function SecretCdnSign(UrlWithMark As String)
+ '只处理以 {CDN} 结尾的链接
+ If Not UrlWithMark.EndsWithF("{CDN}") Then Return UrlWithMark
+ Return UrlWithMark.Replace("{CDN}", "").Replace(" ", "%20")
+ End Function
+ '''
+ ''' 设置 Headers 的 UA、Referer。
+ '''
+ Friend Sub SecretHeadersSign(Url As String, ByRef Client As CookieWebClient, Optional UseBrowserUserAgent As Boolean = False)
+ If ApplicationStartTick < 1 Then Return '禁止在没有运行程序的情况下通过反射调用
+ If UseBrowserUserAgent Then
+ Client.Headers("User-Agent") = "PCL2/" & VersionStandardCode & " Mozilla/5.0 AppleWebKit/537.36 Chrome/63.0.3239.132 Safari/537.36"
+ Else
+ Client.Headers("User-Agent") = "PCL2/" & VersionStandardCode
+ End If
+ Client.Headers("Referer") = "http://" & VersionCode & ".pcl2.server/"
+ '如果你有 CurseForge API Key,请添加到 Headers 中,以恢复对 CurseForge 的访问
+ End Sub
+ '''
+ ''' 设置 Headers 的 UA、Referer。
+ '''
+ Friend Sub SecretHeadersSign(Url As String, ByRef Request As HttpWebRequest, Optional UseBrowserUserAgent As Boolean = False)
+ If ApplicationStartTick < 1 Then Return '禁止在没有运行程序的情况下通过反射调用
+ If UseBrowserUserAgent Then
+ Request.UserAgent = "PCL2/" & VersionStandardCode & " Mozilla/5.0 AppleWebKit/537.36 Chrome/63.0.3239.132 Safari/537.36"
+ Else
+ Request.UserAgent = "PCL2/" & VersionStandardCode
+ End If
+ Request.Referer = "http://" & VersionCode & ".pcl2.server/"
+ '如果你有 CurseForge API Key,请添加到 Headers 中,以恢复对 CurseForge 的访问
+ End Sub
+
+#End Region
+
+#Region "字符串加解密"
+
+ '''
+ ''' 获取八位密钥。
+ '''
+ Private Function SecretKeyGet(Key As String) As String
+ Return "00000000"
+ End Function
+ '''
+ ''' 加密字符串。
+ '''
+ Friend Function SecretEncrypt(SourceString As String, Optional Key As String = "") As String
+ Key = SecretKeyGet(Key)
+ Dim btKey As Byte() = Encoding.UTF8.GetBytes(Key)
+ Dim btIV As Byte() = Encoding.UTF8.GetBytes("87160295")
+ Dim des As New DESCryptoServiceProvider
+ Using MS As New MemoryStream
+ Dim inData As Byte() = Encoding.UTF8.GetBytes(SourceString)
+ Using cs As New CryptoStream(MS, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write)
+ cs.Write(inData, 0, inData.Length)
+ cs.FlushFinalBlock()
+ Return Convert.ToBase64String(MS.ToArray())
+ End Using
+ End Using
+ End Function
+ '''
+ ''' 解密字符串。
+ '''
+ Friend Function SecretDecrypt(SourceString As String, Optional Key As String = "") As String
+ Key = SecretKeyGet(Key)
+ Dim btKey As Byte() = Encoding.UTF8.GetBytes(Key)
+ Dim btIV As Byte() = Encoding.UTF8.GetBytes("87160295")
+ Dim des As New DESCryptoServiceProvider
+ Using MS As New MemoryStream
+ Dim inData As Byte() = Convert.FromBase64String(SourceString)
+ Using cs As New CryptoStream(MS, des.CreateDecryptor(btKey, btIV), CryptoStreamMode.Write)
+ cs.Write(inData, 0, inData.Length)
+ cs.FlushFinalBlock()
+ Return Encoding.UTF8.GetString(MS.ToArray())
+ End Using
+ End Using
+ End Function
+
+#End Region
+
+#Region "主题"
+
+ Public Color1 As New MyColor(52, 61, 74)
+ Public Color2 As New MyColor(11, 91, 203)
+ Public Color3 As New MyColor(19, 112, 243)
+ Public Color4 As New MyColor(72, 144, 245)
+ Public Color5 As New MyColor(150, 192, 249)
+ Public Color6 As New MyColor(213, 230, 253)
+ Public Color7 As New MyColor(222, 236, 253)
+ Public Color8 As New MyColor(234, 242, 254)
+ Public ColorBg0 As New MyColor(150, 192, 249)
+ Public ColorBg1 As New MyColor(190, Color7)
+ Public ColorGray1 As New MyColor(64, 64, 64)
+ Public ColorGray2 As New MyColor(115, 115, 115)
+ Public ColorGray3 As New MyColor(140, 140, 140)
+ Public ColorGray4 As New MyColor(166, 166, 166)
+ Public ColorGray5 As New MyColor(204, 204, 204)
+ Public ColorGray6 As New MyColor(235, 235, 235)
+ Public ColorGray7 As New MyColor(240, 240, 240)
+ Public ColorGray8 As New MyColor(245, 245, 245)
+ Public ColorSemiTransparent As New MyColor(1, Color8)
+
+ Public ThemeNow As Integer = -1
+ Public ColorHue As Integer = 210, ColorSat As Integer = 85, ColorLightAdjust As Integer = 0, ColorHueTopbarDelta As Object = 0
+ Public ThemeDontClick As Integer = 0
+
+ Public Sub ThemeRefresh(Optional NewTheme As Integer = -1)
+ Hint("该版本中不包含主题功能……")
+ End Sub
+ Public Sub ThemeRefreshMain()
+ End Sub
+ Public Sub ThemeCheckAll(EffectSetup As Boolean)
+ End Sub
+ Public Function ThemeCheckOne(Id As Integer) As Boolean
+ Return True
+ End Function
+ Friend Function ThemeUnlock(Id As Integer, Optional ShowDoubleHint As Boolean = True, Optional UnlockHint As String = Nothing) As Boolean
+ Return False
+ End Function
+ Public Function ThemeCheckGold(Optional Code As String = Nothing) As Boolean
+ Return False
+ End Function
+ Public Function DonateCodeInput() As Boolean?
+ End Function
+
+#End Region
+
+#Region "更新"
+
+ Public IsUpdateStarted As Boolean = False
+ Public IsUpdateWaitingRestart As Boolean = False
+ Public Sub UpdateCheckByButton()
+ Hint("该版本中不包含更新功能……")
+ End Sub
+ Public Sub UpdateStart(BaseUrl As String, Slient As Boolean, Optional ReceivedKey As String = Nothing, Optional ForceValidated As Boolean = False)
+ End Sub
+ Public Sub UpdateRestart(TriggerRestartAndByEnd As Boolean)
+ End Sub
+ Public Sub UpdateReplace(ProcessId As Integer, OldFileName As String, NewFileName As String, TriggerRestart As Boolean)
+ End Sub
+
+#End Region
+
+#Region "联网通知"
+
+ Public ServerLoader As New LoaderTask(Of Integer, Integer)("PCL 服务", Sub() Log("[Server] 该版本中不包含更新通知功能……"), Priority:=ThreadPriority.BelowNormal)
+
+#End Region
+
+End Module
diff --git a/Plain Craft Launcher 2/Pages/PageLink/PageLinkIoi.xaml.vb b/Plain Craft Launcher 2/Pages/PageLink/PageLinkIoi.xaml.vb
index c6f1214..f0a318f 100644
--- a/Plain Craft Launcher 2/Pages/PageLink/PageLinkIoi.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageLink/PageLinkIoi.xaml.vb
@@ -149,9 +149,6 @@ Public Class PageLinkIoi
''' 检查某个玩家名是否合法。
'''
Private Shared Function IsPlayerNameValid(Name As String) As Boolean
- For Each ValidateRule As Validate In {New ValidateNullOrWhiteSpace, New ValidateLength(0, 20), New ValidateFilter}
- If Not String.IsNullOrEmpty(ValidateRule.Validate(Name)) Then Return False
- Next
Return True
End Function
diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml
new file mode 100644
index 0000000..a404b44
--- /dev/null
+++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml
@@ -0,0 +1,332 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml.vb b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml.vb
new file mode 100644
index 0000000..40afd2e
--- /dev/null
+++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml.vb
@@ -0,0 +1,40 @@
+Public Class PageOtherAbout
+
+ Private Shadows IsLoaded As Boolean = False
+ Private Sub PageOtherAbout_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
+
+ '重复加载部分
+ PanBack.ScrollToHome()
+
+ '非重复加载部分
+ If IsLoaded Then Exit Sub
+ IsLoaded = True
+
+ ItemAboutPcl.Info = ItemAboutPcl.Info.Replace("%VERSION%", VersionDisplayName).Replace("%VERSIONCODE%", VersionCode).Replace("%BRANCH%", VersionBranchCode)
+#If DEBUG Then
+ BtnDonateDonate.Visibility = Visibility.Collapsed
+ BtnDonateOutput.Visibility = Visibility.Visible
+#End If
+
+ End Sub
+
+ Private Sub BtnAboutBmclapi_Click(sender As Object, e As EventArgs) Handles BtnAboutBmclapi.Click
+ OpenWebsite("https://afdian.net/a/bangbang93")
+ End Sub
+ Private Sub BtnAboutWiki_Click(sender As Object, e As EventArgs) Handles BtnAboutWiki.Click
+ OpenWebsite("https://www.mcmod.cn")
+ End Sub
+ Public Shared Sub CopyUniqueAddress() Handles BtnDonateCopy.Click
+ ClipboardSet(UniqueAddress)
+ End Sub
+ Private Sub DonateCodeInput() Handles BtnDonateInput.Click
+ DonateCodeInput()
+ End Sub
+
+#If DEBUG Then
+ Private Sub BtnDonateOutput_Click(sender As Object, e As EventArgs) Handles BtnDonateOutput.Click
+ DonateCodeGenerate()
+ End Sub
+#End If
+
+End Class
diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherTest.xaml b/Plain Craft Launcher 2/Pages/PageOther/PageOtherTest.xaml
new file mode 100644
index 0000000..9623808
--- /dev/null
+++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherTest.xaml
@@ -0,0 +1,12 @@
+
+
+
+
+
diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherTest.xaml.vb b/Plain Craft Launcher 2/Pages/PageOther/PageOtherTest.xaml.vb
new file mode 100644
index 0000000..af35b45
--- /dev/null
+++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherTest.xaml.vb
@@ -0,0 +1,27 @@
+Public Class PageOtherTest
+
+ Public Shared Sub StartCustomDownload(Url As String, FileName As String, Optional Folder As String = Nothing)
+ Hint("为便于维护,开源内容中不包含百宝箱功能……")
+ End Sub
+ Public Shared Sub Jrrp()
+ Hint("为便于维护,开源内容中不包含百宝箱功能……")
+ End Sub
+ Public Shared Sub RubbishClear()
+ Hint("为便于维护,开源内容中不包含百宝箱功能……")
+ End Sub
+ Public Shared Sub MemoryOptimize(ShowHint As Boolean)
+ If ShowHint Then Hint("为便于维护,开源内容中不包含百宝箱功能……")
+ End Sub
+ Public Shared Sub MemoryOptimizeInternal()
+ End Sub
+ Public Shared Function GetRandomCave() As String
+ Return "为便于维护,开源内容中不包含百宝箱功能……"
+ End Function
+ Public Shared Function GetRandomHint() As String
+ Return "为便于维护,开源内容中不包含百宝箱功能……"
+ End Function
+ Public Shared Function GetRandomPresetHint() As String
+ Return "为便于维护,开源内容中不包含百宝箱功能……"
+ End Function
+
+End Class
diff --git a/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb b/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb
new file mode 100644
index 0000000..faef9cc
--- /dev/null
+++ b/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb
@@ -0,0 +1,691 @@
+Public Class ModSetup
+
+ '''
+ ''' 设置的更新号。
+ '''
+ Public Const VersionSetup As Integer = 1
+ '''
+ ''' 设置列表。
+ '''
+ Private ReadOnly SetupDict As New Dictionary(Of String, SetupEntry) From {
+ {"Identify", New SetupEntry("", Source:=SetupSource.Registry)},
+ {"HintDownloadThread", New SetupEntry(False, Source:=SetupSource.Registry)},
+ {"HintNotice", New SetupEntry(0, Source:=SetupSource.Registry)},
+ {"HintDownload", New SetupEntry(0, Source:=SetupSource.Registry)},
+ {"HintInstallBack", New SetupEntry(False, Source:=SetupSource.Registry)},
+ {"HintHide", New SetupEntry(False, Source:=SetupSource.Registry)},
+ {"HintHandInstall", New SetupEntry(False, Source:=SetupSource.Registry)},
+ {"HintBuy", New SetupEntry(False, Source:=SetupSource.Registry)},
+ {"HintClearRubbish", New SetupEntry(0, Source:=SetupSource.Registry)},
+ {"HintUpdateMod", New SetupEntry(False, Source:=SetupSource.Registry)},
+ {"TestSetupReader", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"SystemEula", New SetupEntry(False, Source:=SetupSource.Registry)},
+ {"SystemCount", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
+ {"SystemLaunchCount", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
+ {"SystemLastVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
+ {"SystemHighestBetaVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
+ {"SystemHighestAlphaVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
+ {"SystemSetupVersionReg", New SetupEntry(VersionSetup, Source:=SetupSource.Registry)},
+ {"SystemSetupVersionIni", New SetupEntry(VersionSetup)},
+ {"SystemHelpVersion", New SetupEntry(0, Source:=SetupSource.Registry)},
+ {"SystemDebugMode", New SetupEntry(False, Source:=SetupSource.Registry)},
+ {"SystemDebugAnim", New SetupEntry(9, Source:=SetupSource.Registry)},
+ {"SystemDebugDelay", New SetupEntry(False, Source:=SetupSource.Registry)},
+ {"SystemDebugSkipCopy", New SetupEntry(False, Source:=SetupSource.Registry)},
+ {"SystemSystemCache", New SetupEntry("", Source:=SetupSource.Registry)},
+ {"SystemSystemUpdate", New SetupEntry(0)},
+ {"SystemSystemActivity", New SetupEntry(0)},
+ {"CacheSavedPageUrl", New SetupEntry("", Source:=SetupSource.Registry)},
+ {"CacheSavedPageVersion", New SetupEntry("", Source:=SetupSource.Registry)},
+ {"CacheMsOAuthRefresh", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheMsAccess", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheMsProfileJson", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheMsUuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheMsName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheNideAccess", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheNideClient", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheNideUuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheNideName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheNideUsername", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheNidePass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheNideServer", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheAuthAccess", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheAuthClient", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheAuthUuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheAuthName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheAuthUsername", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheAuthPass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheAuthServerServer", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheAuthServerName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheAuthServerRegister", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"CacheDownloadFolder", New SetupEntry("", Source:=SetupSource.Registry)},
+ {"CacheJavaListVersion", New SetupEntry(0, Source:=SetupSource.Registry)},
+ {"LoginRemember", New SetupEntry(True, Source:=SetupSource.Registry, Encoded:=True)},
+ {"LoginLegacyName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"LoginMsJson", New SetupEntry("{}", Source:=SetupSource.Registry, Encoded:=True)}, '{UserName: OAuthToken, ...}
+ {"LoginNideEmail", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"LoginNidePass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"LoginAuthEmail", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"LoginAuthPass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"LoginType", New SetupEntry(McLoginType.Legacy, Source:=SetupSource.Registry)},
+ {"LoginPageType", New SetupEntry(0)},
+ {"LaunchSkinID", New SetupEntry("", Source:=SetupSource.Registry)},
+ {"LaunchSkinType", New SetupEntry(0, Source:=SetupSource.Registry)},
+ {"LaunchSkinSlim", New SetupEntry(False, Source:=SetupSource.Registry)},
+ {"LaunchVersionSelect", New SetupEntry("")},
+ {"LaunchFolderSelect", New SetupEntry("")},
+ {"LaunchFolders", New SetupEntry("", Source:=SetupSource.Registry)},
+ {"LaunchArgumentTitle", New SetupEntry("")},
+ {"LaunchArgumentInfo", New SetupEntry("PCL")},
+ {"LaunchArgumentJavaSelect", New SetupEntry("", Source:=SetupSource.Registry)},
+ {"LaunchArgumentJavaAll", New SetupEntry("[]", Source:=SetupSource.Registry)},
+ {"LaunchArgumentIndie", New SetupEntry(0)},
+ {"LaunchArgumentVisible", New SetupEntry(5, Source:=SetupSource.Registry)},
+ {"LaunchArgumentPriority", New SetupEntry(1, Source:=SetupSource.Registry)},
+ {"LaunchArgumentWindowWidth", New SetupEntry(854)},
+ {"LaunchArgumentWindowHeight", New SetupEntry(480)},
+ {"LaunchArgumentWindowType", New SetupEntry(1)},
+ {"LaunchArgumentRam", New SetupEntry(False, Source:=SetupSource.Registry)},
+ {"LaunchAdvanceJvm", New SetupEntry("-XX:+UseG1GC -XX:-UseAdaptiveSizePolicy -XX:-OmitStackTraceInFastThrow -Dfml.ignoreInvalidMinecraftCertificates=True -Dfml.ignorePatchDiscrepancies=True -Dlog4j2.formatMsgNoLookups=true")},
+ {"LaunchAdvanceGame", New SetupEntry("")},
+ {"LaunchAdvanceRun", New SetupEntry("")},
+ {"LaunchAdvanceRunWait", New SetupEntry(True)},
+ {"LaunchAdvanceAssets", New SetupEntry(False)},
+ {"LaunchAdvanceJava", New SetupEntry(False)},
+ {"LaunchRamType", New SetupEntry(0)},
+ {"LaunchRamCustom", New SetupEntry(15)},
+ {"LinkEula", New SetupEntry(False, Source:=SetupSource.Registry)},
+ {"LinkName", New SetupEntry("", Source:=SetupSource.Registry)},
+ {"LinkHiperCertLast", New SetupEntry("", Source:=SetupSource.Registry)},
+ {"LinkHiperCertTime", New SetupEntry("", Source:=SetupSource.Registry)},
+ {"LinkHiperCertWarn", New SetupEntry(True, Source:=SetupSource.Registry)},
+ {"LinkIoiVersion", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
+ {"ToolHelpChinese", New SetupEntry(True, Source:=SetupSource.Registry)},
+ {"ToolDownloadThread", New SetupEntry(63, Source:=SetupSource.Registry)},
+ {"ToolDownloadSpeed", New SetupEntry(42, Source:=SetupSource.Registry)},
+ {"ToolDownloadVersion", New SetupEntry(0, Source:=SetupSource.Registry)},
+ {"ToolDownloadTranslate", New SetupEntry(0, Source:=SetupSource.Registry)},
+ {"ToolDownloadKeepModpack", New SetupEntry(False, Source:=SetupSource.Registry)},
+ {"ToolDownloadIgnoreQuilt", New SetupEntry(True, Source:=SetupSource.Registry)},
+ {"ToolDownloadCert", New SetupEntry(True, Source:=SetupSource.Registry)},
+ {"ToolUpdateAlpha", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
+ {"ToolUpdateRelease", New SetupEntry(False, Source:=SetupSource.Registry)},
+ {"ToolUpdateSnapshot", New SetupEntry(False, Source:=SetupSource.Registry)},
+ {"ToolUpdateReleaseLast", New SetupEntry("", Source:=SetupSource.Registry)},
+ {"ToolUpdateSnapshotLast", New SetupEntry("", Source:=SetupSource.Registry)},
+ {"UiLauncherTransparent", New SetupEntry(600)}, '避免与 PCL1 设置冲突(UiLauncherOpacity)
+ {"UiLauncherHue", New SetupEntry(180)},
+ {"UiLauncherSat", New SetupEntry(80)},
+ {"UiLauncherDelta", New SetupEntry(90)},
+ {"UiLauncherLight", New SetupEntry(20)},
+ {"UiLauncherTheme", New SetupEntry(0)},
+ {"UiLauncherThemeGold", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
+ {"UiLauncherThemeHide", New SetupEntry("0|1|2|3|4", Source:=SetupSource.Registry, Encoded:=True)},
+ {"UiLauncherThemeHide2", New SetupEntry("0|1|2|3|4", Source:=SetupSource.Registry, Encoded:=True)},
+ {"UiLauncherLogo", New SetupEntry(True)},
+ {"UiLauncherEmail", New SetupEntry(False)},
+ {"UiBackgroundColorful", New SetupEntry(True)},
+ {"UiBackgroundOpacity", New SetupEntry(1000)},
+ {"UiBackgroundBlur", New SetupEntry(0)},
+ {"UiBackgroundSuit", New SetupEntry(0)},
+ {"UiCustomType", New SetupEntry(0)},
+ {"UiCustomPreset", New SetupEntry(0)},
+ {"UiCustomNet", New SetupEntry("")},
+ {"UiLogoType", New SetupEntry(1)},
+ {"UiLogoText", New SetupEntry("")},
+ {"UiLogoLeft", New SetupEntry(False)},
+ {"UiMusicVolume", New SetupEntry(500)},
+ {"UiMusicStop", New SetupEntry(False)},
+ {"UiMusicStart", New SetupEntry(False)},
+ {"UiMusicRandom", New SetupEntry(True)},
+ {"UiMusicAuto", New SetupEntry(True)},
+ {"UiHiddenPageDownload", New SetupEntry(False)},
+ {"UiHiddenPageLink", New SetupEntry(False)},
+ {"UiHiddenPageSetup", New SetupEntry(False)},
+ {"UiHiddenPageOther", New SetupEntry(False)},
+ {"UiHiddenFunctionSelect", New SetupEntry(False)},
+ {"UiHiddenFunctionHidden", New SetupEntry(False)},
+ {"UiHiddenSetupLaunch", New SetupEntry(False)},
+ {"UiHiddenSetupUi", New SetupEntry(False)},
+ {"UiHiddenSetupLink", New SetupEntry(False)},
+ {"UiHiddenSetupSystem", New SetupEntry(False)},
+ {"UiHiddenOtherHelp", New SetupEntry(False)},
+ {"UiHiddenOtherFeedback", New SetupEntry(False)},
+ {"UiHiddenOtherVote", New SetupEntry(False)},
+ {"UiHiddenOtherAbout", New SetupEntry(False)},
+ {"UiHiddenOtherTest", New SetupEntry(False)},
+ {"VersionAdvanceJvm", New SetupEntry("", Source:=SetupSource.Version)},
+ {"VersionAdvanceGame", New SetupEntry("", Source:=SetupSource.Version)},
+ {"VersionAdvanceAssets", New SetupEntry(0, Source:=SetupSource.Version)},
+ {"VersionAdvanceAssetsV2", New SetupEntry(False, Source:=SetupSource.Version)},
+ {"VersionAdvanceJava", New SetupEntry(False, Source:=SetupSource.Version)},
+ {"VersionAdvanceRun", New SetupEntry("", Source:=SetupSource.Version)},
+ {"VersionAdvanceRunWait", New SetupEntry(True, Source:=SetupSource.Version)},
+ {"VersionRamType", New SetupEntry(2, Source:=SetupSource.Version)},
+ {"VersionRamCustom", New SetupEntry(15, Source:=SetupSource.Version)},
+ {"VersionArgumentTitle", New SetupEntry("", Source:=SetupSource.Version)},
+ {"VersionArgumentInfo", New SetupEntry("", Source:=SetupSource.Version)},
+ {"VersionArgumentIndie", New SetupEntry(-1, Source:=SetupSource.Version)},
+ {"VersionArgumentJavaSelect", New SetupEntry("使用全局设置", Source:=SetupSource.Version)},
+ {"VersionServerEnter", New SetupEntry("", Source:=SetupSource.Version)},
+ {"VersionServerLogin", New SetupEntry(0, Source:=SetupSource.Version)},
+ {"VersionServerNide", New SetupEntry("", Source:=SetupSource.Version)},
+ {"VersionServerAuthRegister", New SetupEntry("", Source:=SetupSource.Version)},
+ {"VersionServerAuthName", New SetupEntry("", Source:=SetupSource.Version)},
+ {"VersionServerAuthServer", New SetupEntry("", Source:=SetupSource.Version)}
+ }
+
+#Region "基础"
+
+ Private Enum SetupSource
+ Normal
+ Registry
+ Version
+ End Enum
+ Private Class SetupEntry
+
+ Public Encoded As Boolean
+ Public DefaultValue
+ Public DefaultValueEncoded
+ Public Value
+ Public Source As SetupSource
+
+ '加载状态:0/未读取 1/已读取未处理 2/已处理
+ Public State As Byte = 0
+ Public Type
+
+ Public Sub New(Value, Optional Source = SetupSource.Normal, Optional Encoded = False)
+ Me.DefaultValue = Value
+ Me.DefaultValueEncoded = If(Encoded, SecretEncrypt(Value, "PCL" & UniqueAddress), Value)
+ Me.Encoded = Encoded
+ Me.Value = Value
+ Me.Source = Source
+ Type = If(Value, New Object).GetType
+ End Sub
+
+ End Class
+
+ '''
+ ''' 改变某个设置项的值。
+ '''
+ Public Sub [Set](Key As String, Value As Object, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing)
+ [Set](Key, Value, SetupDict(Key), ForceReload, Version)
+ End Sub
+ Private Sub [Set](Key As String, Value As Object, E As SetupEntry, ForceReload As Boolean, Version As McVersion)
+ Try
+
+ Value = CTypeDynamic(Value, E.Type)
+ If E.State = 2 Then
+ '如果已应用,且值相同,则无需再次更改
+ If E.Value = Value AndAlso Not ForceReload Then Exit Sub
+ Else
+ '如果未应用,则直接更改并应用
+ If E.Source <> SetupSource.Version Then E.State = 2
+ End If
+ '设置新值
+ E.Value = Value
+ '写入值
+ If E.Encoded Then
+ Try
+ If Value Is Nothing Then Value = ""
+ Value = SecretEncrypt(Value, "PCL" & UniqueAddress)
+ Catch ex As Exception
+ Log(ex, "加密设置失败:" & Key, LogLevel.Developer)
+ End Try
+ End If
+ Select Case E.Source
+ Case SetupSource.Normal
+ WriteIni("Setup", Key, Value)
+ Case SetupSource.Registry
+ WriteReg(Key, Value)
+ Case SetupSource.Version
+ If Version Is Nothing Then
+ Throw New Exception("更改版本设置 " & Key & " 时未提供目标版本")
+ Else
+ WriteIni(Version.Path & "PCL\Setup.ini", Key, Value)
+ End If
+ End Select
+ '应用
+ '例如 VersionServerLogin 要求在设置之后再引发事件
+ Dim Method As Reflection.MethodInfo = GetType(ModSetup).GetMethod(Key)
+ If Method IsNot Nothing Then Method.Invoke(Me, {Value})
+
+ Catch ex As Exception
+ Log(ex, "设置设置项时出错(" & Key & ", " & Value & ")", LogLevel.Feedback)
+ End Try
+ End Sub
+
+ '''
+ ''' 应用某个设置项的值。
+ '''
+ Public Function Load(Key As String, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing)
+ Return Load(Key, SetupDict(Key), ForceReload, Version)
+ End Function
+ Private Function Load(Key As String, E As SetupEntry, ForceReload As Boolean, Version As McVersion)
+ '如果已经应用过,则什么也不干
+ If E.State = 2 AndAlso Not ForceReload Then Return E.Value
+ '读取,应用并设置状态
+ Read(Key, E, Version)
+ If E.Source <> SetupSource.Version Then E.State = 2
+ Dim Method As Reflection.MethodInfo = GetType(ModSetup).GetMethod(Key)
+ If Method IsNot Nothing Then Method.Invoke(Me, {E.Value})
+ Return E.Value
+ End Function
+
+ '''
+ ''' 获取某个设置项的值。
+ '''
+ Public Function [Get](Key As String, Optional Version As McVersion = Nothing)
+ If Not SetupDict.ContainsKey(Key) Then Throw New KeyNotFoundException("未找到设置项:" & Key) With {.Source = Key}
+ Return [Get](Key, SetupDict(Key), Version)
+ End Function
+ Private Function [Get](Key As String, E As SetupEntry, Version As McVersion)
+ '获取强制值
+ Dim Force As String = ForceValue(Key)
+ If Force IsNot Nothing Then
+ E.Value = CTypeDynamic(Force, E.Type)
+ E.State = 1
+ End If
+ '如果尚未读取过,则读取
+ If E.State = 0 Then
+ Read(Key, E, Version)
+ If E.Source <> SetupSource.Version Then E.State = 1
+ End If
+ '返回现在的值
+ Return E.Value
+ End Function
+
+ '''
+ ''' 初始化某个设置项的值。
+ '''
+ Public Sub Reset(Key As String, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing)
+ Dim E As SetupEntry = SetupDict(Key)
+ [Set](Key, E.DefaultValue, E, ForceReload, Version)
+ End Sub
+
+ Private Sub Read(Key As String, ByRef E As SetupEntry, Version As McVersion)
+ Try
+ If Not E.State = 0 Then Exit Sub
+ Dim SourceValue As String '先用 String 储存,避免类型转换
+ Select Case E.Source
+ Case SetupSource.Normal
+ SourceValue = ReadIni("Setup", Key, E.DefaultValueEncoded)
+ Case SetupSource.Registry
+ SourceValue = ReadReg(Key, E.DefaultValueEncoded)
+ Case Else 'SetupSource.Version
+ If Version Is Nothing Then
+ Throw New Exception("读取版本设置 " & Key & " 时未提供目标版本")
+ Else
+ SourceValue = ReadIni(Version.Path & "PCL\Setup.ini", Key, E.DefaultValueEncoded)
+ End If
+ End Select
+ If E.Encoded Then
+ If SourceValue.Equals(E.DefaultValueEncoded) Then
+ SourceValue = E.DefaultValue
+ Else
+ Try
+ SourceValue = SecretDecrypt(SourceValue, "PCL" & UniqueAddress)
+ Catch ex As Exception
+ Log(ex, "解密设置失败:" & Key, LogLevel.Developer)
+ SourceValue = E.DefaultValue
+ Setup.Set(Key, E.DefaultValue, True)
+ End Try
+ End If
+ End If
+ E.Value = CTypeDynamic(SourceValue, E.Type)
+ Catch ex As Exception
+ Log(ex, "读取设置失败:" & Key, LogLevel.Hint)
+ E.Value = CTypeDynamic(E.DefaultValue, E.Type)
+ End Try
+ End Sub
+
+ '对部分设置强制赋值
+ Private Function ForceValue(Key As String) As String
+#If BETA Then
+ If Key = "UiLauncherTheme" Then Return "0"
+#End If
+ If Key = "UiHiddenPageLink" Then Return True
+ If Key = "UiHiddenSetupLink" Then Return True
+ Return Nothing
+ End Function
+
+#End Region
+
+#Region "Launch"
+
+ '切换选择
+ Public Sub LaunchVersionSelect(Value As String)
+ Log("[Setup] 当前选择的 Minecraft 版本:" & Value)
+ WriteIni(PathMcFolder & "PCL.ini", "Version", If(IsNothing(McVersionCurrent), "", McVersionCurrent.Name))
+ End Sub
+ Public Sub LaunchFolderSelect(Value As String)
+ Log("[Setup] 当前选择的 Minecraft 文件夹:" & Value.ToString.Replace("$", Path))
+ PathMcFolder = Value.ToString.Replace("$", Path)
+ End Sub
+
+ '游戏内存
+ Public Sub LaunchRamType(Type As Integer)
+ If FrmSetupLaunch Is Nothing Then Exit Sub
+ FrmSetupLaunch.RamType(Type)
+ End Sub
+
+ '离线皮肤
+ Public Sub LaunchSkinType(Value As Integer)
+ RunInUi(Sub()
+ If Not IsNothing(FrmSetupLaunch) Then
+ Select Case Value
+ Case 0, 1, 2 '默认
+ FrmSetupLaunch.PanSkinID.Visibility = Visibility.Collapsed
+ FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Collapsed
+ Case 3 '正版
+ FrmSetupLaunch.PanSkinID.Visibility = Visibility.Visible
+ FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Collapsed
+ Case 4 '自定义
+ FrmSetupLaunch.PanSkinID.Visibility = Visibility.Collapsed
+ FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Visible
+ End Select
+ FrmSetupLaunch.CardSkin.TriggerForceResize()
+ End If
+ PageLaunchLeft.SkinLegacy.Start()
+ End Sub)
+ End Sub
+ Public Sub LaunchSkinID(Value As String)
+ PageLaunchLeft.SkinLegacy.Start()
+ End Sub
+
+#End Region
+
+#Region "Tool"
+
+ Public Sub ToolDownloadThread(Value As Integer)
+ NetTaskThreadLimit = Value + 1
+ End Sub
+ Public Sub ToolDownloadCert(Value As Boolean)
+ Net.ServicePointManager.ServerCertificateValidationCallback =
+ If(Value, Nothing, New Net.Security.RemoteCertificateValidationCallback(Function() True))
+ End Sub
+ Public Sub ToolDownloadSpeed(Value As Integer)
+ If Value <= 14 Then
+ NetTaskSpeedLimitHigh = (Value + 1) * 0.1 * 1024 * 1024L
+ ElseIf Value <= 31 Then
+ NetTaskSpeedLimitHigh = (Value - 11) * 0.5 * 1024 * 1024L
+ ElseIf Value <= 41 Then
+ NetTaskSpeedLimitHigh = (Value - 21) * 1024 * 1024L
+ Else
+ NetTaskSpeedLimitHigh = -1
+ End If
+ End Sub
+
+#End Region
+
+#Region "UI"
+
+ '启动器
+ Public Sub UiLauncherTransparent(Value As Integer)
+ FrmMain.Opacity = Value / 1000 + 0.4
+ End Sub
+#If Not BETA Then
+ Public Sub UiLauncherTheme(Value As Integer)
+ ThemeRefresh(Value)
+ End Sub
+#End If
+ Public Sub UiBackgroundColorful(Value As Boolean)
+ ThemeRefresh()
+ End Sub
+
+ '背景图片
+ Public Sub UiBackgroundOpacity(Value As Integer)
+ FrmMain.ImgBack.Opacity = Value / 1000
+ End Sub
+ Public Sub UiBackgroundBlur(Value As Integer)
+ If Value = 0 Then
+ FrmMain.ImgBack.Effect = Nothing
+ Else
+ FrmMain.ImgBack.Effect = New Effects.BlurEffect With {.Radius = Value + 1}
+ End If
+ FrmMain.ImgBack.Margin = New Thickness(-(Value + 1) / 1.8)
+ End Sub
+ Public Sub UiBackgroundSuit(Value As Integer)
+ If IsNothing(FrmMain.ImgBack.Background) Then Exit Sub
+ Dim Width As Double = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
+ Dim Height As Double = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
+ If Value = 0 Then
+ '智能:当图片较小时平铺,较大时适应
+ If Width < FrmMain.PanMain.ActualWidth / 2 AndAlso Height < FrmMain.PanMain.ActualHeight / 2 Then
+ Value = 4 '平铺
+ Else
+ Value = 2 '适应
+ End If
+ End If
+ CType(FrmMain.ImgBack.Background, ImageBrush).TileMode = TileMode.None
+ CType(FrmMain.ImgBack.Background, ImageBrush).Viewport = New Rect(0, 0, 1, 1)
+ CType(FrmMain.ImgBack.Background, ImageBrush).ViewportUnits = BrushMappingMode.RelativeToBoundingBox
+ Select Case Value
+ Case 1 '居中
+ FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Center
+ FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Center
+ CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
+ FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
+ FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
+ Case 2 '适应
+ FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch
+ FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch
+ CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.UniformToFill
+ FrmMain.ImgBack.Width = Double.NaN
+ FrmMain.ImgBack.Height = Double.NaN
+ Case 3 '拉伸
+ FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch
+ FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch
+ CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.Fill
+ FrmMain.ImgBack.Width = Double.NaN
+ FrmMain.ImgBack.Height = Double.NaN
+ Case 4 '平铺
+ FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch
+ FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch
+ CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
+ CType(FrmMain.ImgBack.Background, ImageBrush).TileMode = TileMode.Tile
+ CType(FrmMain.ImgBack.Background, ImageBrush).Viewport = New Rect(0, 0, CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width, CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height)
+ CType(FrmMain.ImgBack.Background, ImageBrush).ViewportUnits = BrushMappingMode.Absolute
+ FrmMain.ImgBack.Width = Double.NaN
+ FrmMain.ImgBack.Height = Double.NaN
+ Case 5 '左上
+ FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Left
+ FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Top
+ CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
+ FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
+ FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
+ Case 6 '右上
+ FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Right
+ FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Top
+ CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
+ FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
+ FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
+ Case 7 '左下
+ FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Left
+ FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Bottom
+ CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
+ FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
+ FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
+ Case 8 '右下
+ FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Right
+ FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Bottom
+ CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
+ FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
+ FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
+ End Select
+ End Sub
+
+ '主页
+ Public Sub UiCustomType(Value As Integer)
+ If FrmSetupUI Is Nothing Then Exit Sub
+ Select Case Value
+ Case 0 '无
+ FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed
+ FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed
+ FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed
+ FrmSetupUI.HintCustom.Visibility = Visibility.Collapsed
+ Case 1 '本地
+ FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed
+ FrmSetupUI.PanCustomLocal.Visibility = Visibility.Visible
+ FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed
+ FrmSetupUI.HintCustom.Visibility = Visibility.Visible
+ FrmSetupUI.HintCustom.Text = $"从 PCL 文件夹下的 Custom.xaml 读取主页内容。{vbCrLf}你可以手动编辑该文件,向主页添加文本、图片、常用网站、快捷启动等功能。"
+ FrmSetupUI.HintCustom.EventType = ""
+ FrmSetupUI.HintCustom.EventData = ""
+ Case 2 '联网
+ FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed
+ FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed
+ FrmSetupUI.PanCustomNet.Visibility = Visibility.Visible
+ FrmSetupUI.HintCustom.Visibility = Visibility.Visible
+ FrmSetupUI.HintCustom.Text = $"从指定网址联网获取主页内容。服主也可以用于动态更新服务器公告。{vbCrLf}如果你制作了稳定运行的联网主页,可以点击这条提示投稿,若合格即可加入预设!"
+ FrmSetupUI.HintCustom.EventType = "打开网页"
+ FrmSetupUI.HintCustom.EventData = "https://github.com/Hex-Dragon/PCL2/discussions/2528"
+ Case 3 '预设
+ FrmSetupUI.PanCustomPreset.Visibility = Visibility.Visible
+ FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed
+ FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed
+ FrmSetupUI.HintCustom.Visibility = Visibility.Collapsed
+ End Select
+ FrmSetupUI.CardCustom.TriggerForceResize()
+ End Sub
+
+ '顶部栏
+ Public Sub UiLogoType(Value As Integer)
+ Select Case Value
+ Case 0 '无
+ FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed
+ FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed
+ FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed
+ If Not IsNothing(FrmSetupUI) Then
+ FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Visible
+ FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed
+ FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed
+ End If
+ Case 1 '默认
+ FrmMain.ShapeTitleLogo.Visibility = Visibility.Visible
+ FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed
+ FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed
+ If Not IsNothing(FrmSetupUI) Then
+ FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed
+ FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed
+ FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed
+ End If
+ Case 2 '文本
+ FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed
+ FrmMain.LabTitleLogo.Visibility = Visibility.Visible
+ FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed
+ If Not IsNothing(FrmSetupUI) Then
+ FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed
+ FrmSetupUI.PanLogoText.Visibility = Visibility.Visible
+ FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed
+ End If
+ Setup.Load("UiLogoText", True)
+ Case 3 '图片
+ FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed
+ FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed
+ FrmMain.ImageTitleLogo.Visibility = Visibility.Visible
+ If Not IsNothing(FrmSetupUI) Then
+ FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed
+ FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed
+ FrmSetupUI.PanLogoChange.Visibility = Visibility.Visible
+ End If
+ Try
+ FrmMain.ImageTitleLogo.Source = New MyBitmap(Path & "PCL\Logo.png")
+ Catch ex As Exception
+ FrmMain.ImageTitleLogo.Source = Nothing
+ Log(ex, "显示标题栏图片失败", LogLevel.Msgbox)
+ End Try
+ End Select
+ Setup.Load("UiLogoLeft", True)
+ If Not IsNothing(FrmSetupUI) Then FrmSetupUI.CardLogo.TriggerForceResize()
+ End Sub
+ Public Sub UiLogoText(Value As String)
+ FrmMain.LabTitleLogo.Text = Value
+ End Sub
+ Public Sub UiLogoLeft(Value As Boolean)
+ FrmMain.PanTitleMain.ColumnDefinitions(0).Width = New GridLength(If(Value AndAlso (Setup.Get("UiLogoType") = 0), 0, 1), GridUnitType.Star)
+ End Sub
+
+ '功能隐藏
+ Public Sub UiHiddenPageLink(Value As Boolean)
+ PageSetupUI.HiddenRefresh()
+ End Sub
+ Public Sub UiHiddenPageDownload(Value As Boolean)
+ PageSetupUI.HiddenRefresh()
+ End Sub
+ Public Sub UiHiddenPageSetup(Value As Boolean)
+ PageSetupUI.HiddenRefresh()
+ End Sub
+ Public Sub UiHiddenPageOther(Value As Boolean)
+ PageSetupUI.HiddenRefresh()
+ End Sub
+ Public Sub UiHiddenFunctionSelect(Value As Boolean)
+ PageSetupUI.HiddenRefresh()
+ End Sub
+ Public Sub UiHiddenFunctionHidden(Value As Boolean)
+ PageSetupUI.HiddenRefresh()
+ End Sub
+ Public Sub UiHiddenSetupLaunch(Value As Boolean)
+ PageSetupUI.HiddenRefresh()
+ End Sub
+ Public Sub UiHiddenSetupUi(Value As Boolean)
+ PageSetupUI.HiddenRefresh()
+ End Sub
+ Public Sub UiHiddenSetupLink(Value As Boolean)
+ PageSetupUI.HiddenRefresh()
+ End Sub
+ Public Sub UiHiddenSetupSystem(Value As Boolean)
+ PageSetupUI.HiddenRefresh()
+ End Sub
+ Public Sub UiHiddenOtherHelp(Value As Boolean)
+ PageSetupUI.HiddenRefresh()
+ End Sub
+ Public Sub UiHiddenOtherFeedback(Value As Boolean)
+ PageSetupUI.HiddenRefresh()
+ End Sub
+ Public Sub UiHiddenOtherVote(Value As Boolean)
+ PageSetupUI.HiddenRefresh()
+ End Sub
+ Public Sub UiHiddenOtherAbout(Value As Boolean)
+ PageSetupUI.HiddenRefresh()
+ End Sub
+ Public Sub UiHiddenOtherTest(Value As Boolean)
+ PageSetupUI.HiddenRefresh()
+ End Sub
+
+
+#End Region
+
+#Region "System"
+
+ '调试选项
+ Public Sub SystemDebugMode(Value As Boolean)
+ ModeDebug = Value
+ End Sub
+ Public Sub SystemDebugAnim(Value As Integer)
+ AniSpeed = If(Value >= 30, 200, MathClamp(Value * 0.1 + 0.1, 0.1, 3))
+ End Sub
+
+#End Region
+
+#Region "Version"
+
+ '游戏内存
+ Public Sub VersionRamType(Type As Integer)
+ If FrmVersionSetup Is Nothing Then Exit Sub
+ FrmVersionSetup.RamType(Type)
+ End Sub
+
+ '服务器
+ Public Sub VersionServerLogin(Type As Integer)
+ If FrmVersionSetup Is Nothing Then Exit Sub
+ '为第三方登录清空缓存以更新描述
+ WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "")
+ If PageVersionLeft.Version Is Nothing Then Exit Sub
+ PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
+ LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
+ End Sub
+
+#End Region
+
+End Class
diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLink.xaml b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLink.xaml
index a4798ad..4780c9d 100644
--- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLink.xaml
+++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLink.xaml
@@ -28,7 +28,6 @@
-
diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb
index 9ec4061..5156d1f 100644
--- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb
@@ -156,7 +156,7 @@
PageOtherAbout.CopyUniqueAddress()
End Sub
Private Sub BtnSystemUnlock_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnSystemUnlock.Click
- PageOtherAbout.DonateCodeInput()
+ DonateCodeInput()
End Sub
'调试模式
diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml
new file mode 100644
index 0000000..7f6436b
--- /dev/null
+++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml
@@ -0,0 +1,295 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb
new file mode 100644
index 0000000..181eb95
--- /dev/null
+++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb
@@ -0,0 +1,705 @@
+Public Class PageSetupUI
+
+ Public Shadows IsLoaded As Boolean = False
+
+ Private Sub PageSetupUI_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
+
+ '重复加载部分
+ PanBack.ScrollToHome()
+ ThemeCheckAll(True)
+
+ If ThemeDontClick <> 0 Then
+ Dim NewText As String
+ Select Case ThemeDontClick
+ Case 1
+ NewText = "眼瞎白"
+ Case 2
+ NewText = "真·滑稽彩"
+ Case Else
+ NewText = "???"
+ End Select
+ For Each Control In PanLauncherTheme.Children
+ If (TypeOf Control Is MyRadioBox) AndAlso CType(Control, MyRadioBox).IsEnabled Then
+ CType(Control, MyRadioBox).Text = NewText
+ End If
+ Next
+ End If
+
+ '非重复加载部分
+ If IsLoaded Then Exit Sub
+ IsLoaded = True
+
+ AniControlEnabled += 1
+ SliderLoad()
+ Reload()
+ AniControlEnabled -= 1
+
+#If BETA Then
+ PanLauncherHide.Visibility = Visibility.Visible
+#End If
+
+ '设置解锁
+ If Not RadioLauncherTheme8.IsEnabled Then LabLauncherTheme8Copy.ToolTip = "累积赞助达到 ¥23.33 后,在爱发电私信发送【解锁码】以解锁。" & vbCrLf & "右键打开赞助页面,如果觉得 PCL 做得还不错就支持一下吧 =w=!"
+ RadioLauncherTheme8.ToolTip = "累积赞助达到 ¥23.33 后,在爱发电私信发送【解锁码】以解锁"
+ If Not RadioLauncherTheme9.IsEnabled Then LabLauncherTheme9Copy.ToolTip = "· 反馈一个 Bug,在 Issue 标记为 [已完成] 后回复 Issue 要求解锁(右键打开反馈页面)" & vbCrLf & "· 向帮助库提交 Pull Request,在龙猫合并后解锁"
+ RadioLauncherTheme9.ToolTip = "· 反馈一个 Bug,在反馈标记为 [完成] 后回复 Issue 要求解锁" & vbCrLf & "· 向帮助库提交 Pull Request,在龙猫合并后解锁"
+ '极客蓝的处理在 ThemeCheck 中
+
+ End Sub
+ Public Sub Reload()
+ Try
+
+ '启动器
+ SliderLauncherOpacity.Value = Setup.Get("UiLauncherTransparent")
+ SliderLauncherHue.Value = Setup.Get("UiLauncherHue")
+ SliderLauncherSat.Value = Setup.Get("UiLauncherSat")
+ SliderLauncherDelta.Value = Setup.Get("UiLauncherDelta")
+ SliderLauncherLight.Value = Setup.Get("UiLauncherLight")
+ If Setup.Get("UiLauncherTheme") <= 14 Then CType(FindName("RadioLauncherTheme" & Setup.Get("UiLauncherTheme")), MyRadioBox).Checked = True
+ CheckLauncherLogo.Checked = Setup.Get("UiLauncherLogo")
+ CheckLauncherEmail.Checked = Setup.Get("UiLauncherEmail")
+
+ '背景图片
+ SliderBackgroundOpacity.Value = Setup.Get("UiBackgroundOpacity")
+ SliderBackgroundBlur.Value = Setup.Get("UiBackgroundBlur")
+ ComboBackgroundSuit.SelectedIndex = Setup.Get("UiBackgroundSuit")
+ CheckBackgroundColorful.Checked = Setup.Get("UiBackgroundColorful")
+ BackgroundRefresh(False, False)
+
+ '标题栏
+ CType(FindName("RadioLogoType" & Setup.Get("UiLogoType")), MyRadioBox).Checked = True
+ CheckLogoLeft.Visibility = If(RadioLogoType0.Checked, Visibility.Visible, Visibility.Collapsed)
+ PanLogoText.Visibility = If(RadioLogoType2.Checked, Visibility.Visible, Visibility.Collapsed)
+ PanLogoChange.Visibility = If(RadioLogoType3.Checked, Visibility.Visible, Visibility.Collapsed)
+ TextLogoText.Text = Setup.Get("UiLogoText")
+ CheckLogoLeft.Checked = Setup.Get("UiLogoLeft")
+
+ '背景音乐
+ CheckMusicRandom.Checked = Setup.Get("UiMusicRandom")
+ CheckMusicAuto.Checked = Setup.Get("UiMusicAuto")
+ CheckMusicStop.Checked = Setup.Get("UiMusicStop")
+ CheckMusicStart.Checked = Setup.Get("UiMusicStart")
+ SliderMusicVolume.Value = Setup.Get("UiMusicVolume")
+ MusicRefreshUI()
+
+ '主页
+ ComboCustomPreset.SelectedIndex = Setup.Get("UiCustomPreset")
+ CType(FindName("RadioCustomType" & Setup.Load("UiCustomType")), MyRadioBox).Checked = True
+ TextCustomNet.Text = Setup.Get("UiCustomNet")
+
+ '功能隐藏
+ CheckHiddenPageDownload.Checked = Setup.Get("UiHiddenPageDownload")
+ CheckHiddenPageLink.Checked = Setup.Get("UiHiddenPageLink")
+ CheckHiddenPageSetup.Checked = Setup.Get("UiHiddenPageSetup")
+ CheckHiddenPageOther.Checked = Setup.Get("UiHiddenPageOther")
+ CheckHiddenFunctionSelect.Checked = Setup.Get("UiHiddenFunctionSelect")
+ CheckHiddenFunctionHidden.Checked = Setup.Get("UiHiddenFunctionHidden")
+ CheckHiddenSetupLaunch.Checked = Setup.Get("UiHiddenSetupLaunch")
+ CheckHiddenSetupUI.Checked = Setup.Get("UiHiddenSetupUi")
+ CheckHiddenSetupLink.Checked = Setup.Get("UiHiddenSetupLink")
+ CheckHiddenSetupSystem.Checked = Setup.Get("UiHiddenSetupSystem")
+ CheckHiddenOtherAbout.Checked = Setup.Get("UiHiddenOtherAbout")
+ CheckHiddenOtherFeedback.Checked = Setup.Get("UiHiddenOtherFeedback")
+ CheckHiddenOtherVote.Checked = Setup.Get("UiHiddenOtherVote")
+ CheckHiddenOtherHelp.Checked = Setup.Get("UiHiddenOtherHelp")
+ CheckHiddenOtherTest.Checked = Setup.Get("UiHiddenOtherTest")
+
+ Catch ex As NullReferenceException
+ Log(ex, "个性化设置项存在异常,已被自动重置", LogLevel.Msgbox)
+ Reset()
+ Catch ex As Exception
+ Log(ex, "重载个性化设置时出错", LogLevel.Feedback)
+ End Try
+ End Sub
+
+ '初始化
+ Public Sub Reset()
+ Try
+ Setup.Reset("UiLauncherTransparent")
+ Setup.Reset("UiLauncherTheme")
+ Setup.Reset("UiLauncherLogo")
+ Setup.Reset("UiLauncherHue")
+ Setup.Reset("UiLauncherSat")
+ Setup.Reset("UiLauncherDelta")
+ Setup.Reset("UiLauncherLight")
+ Setup.Reset("UiLauncherEmail")
+ Setup.Reset("UiBackgroundColorful")
+ Setup.Reset("UiBackgroundOpacity")
+ Setup.Reset("UiBackgroundBlur")
+ Setup.Reset("UiBackgroundSuit")
+ Setup.Reset("UiLogoType")
+ Setup.Reset("UiLogoText")
+ Setup.Reset("UiLogoLeft")
+ Setup.Reset("UiMusicVolume")
+ Setup.Reset("UiMusicStop")
+ Setup.Reset("UiMusicStart")
+ Setup.Reset("UiMusicRandom")
+ Setup.Reset("UiMusicAuto")
+ Setup.Reset("UiCustomType")
+ Setup.Reset("UiCustomPreset")
+ Setup.Reset("UiCustomNet")
+ Setup.Reset("UiHiddenPageDownload")
+ Setup.Reset("UiHiddenPageLink")
+ Setup.Reset("UiHiddenPageSetup")
+ Setup.Reset("UiHiddenPageOther")
+ Setup.Reset("UiHiddenFunctionSelect")
+ Setup.Reset("UiHiddenFunctionHidden")
+ Setup.Reset("UiHiddenSetupLaunch")
+ Setup.Reset("UiHiddenSetupUi")
+ Setup.Reset("UiHiddenSetupLink")
+ Setup.Reset("UiHiddenSetupSystem")
+ Setup.Reset("UiHiddenOtherAbout")
+ Setup.Reset("UiHiddenOtherFeedback")
+ Setup.Reset("UiHiddenOtherVote")
+ Setup.Reset("UiHiddenOtherHelp")
+ Setup.Reset("UiHiddenOtherTest")
+
+ Log("[Setup] 已初始化个性化设置!")
+ Hint("已初始化个性化设置", HintType.Finish, False)
+ Catch ex As Exception
+ Log(ex, "初始化个性化设置失败", LogLevel.Msgbox)
+ End Try
+
+ Reload()
+ End Sub
+
+ '将控件改变路由到设置改变
+ Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderBackgroundOpacity.Change, SliderBackgroundBlur.Change, SliderLauncherOpacity.Change, SliderMusicVolume.Change, SliderLauncherHue.Change, SliderLauncherLight.Change, SliderLauncherSat.Change, SliderLauncherDelta.Change
+ If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value)
+ End Sub
+ Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboBackgroundSuit.SelectionChanged, ComboCustomPreset.SelectionChanged
+ If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex)
+ End Sub
+ Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckMusicStop.Change, CheckMusicRandom.Change, CheckMusicAuto.Change, CheckBackgroundColorful.Change, CheckLogoLeft.Change, CheckLauncherLogo.Change, CheckHiddenFunctionHidden.Change, CheckHiddenFunctionSelect.Change, CheckHiddenPageDownload.Change, CheckHiddenPageLink.Change, CheckHiddenPageOther.Change, CheckHiddenPageSetup.Change, CheckHiddenSetupLaunch.Change, CheckHiddenSetupSystem.Change, CheckHiddenSetupLink.Change, CheckHiddenSetupUI.Change, CheckHiddenOtherAbout.Change, CheckHiddenOtherFeedback.Change, CheckHiddenOtherVote.Change, CheckHiddenOtherHelp.Change, CheckHiddenOtherTest.Change, CheckMusicStart.Change, CheckLauncherEmail.Change
+ If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked)
+ End Sub
+ Private Shared Sub TextBoxChange(sender As MyTextBox, e As Object) Handles TextLogoText.ValidatedTextChanged, TextCustomNet.ValidatedTextChanged
+ If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Text)
+ End Sub
+ Private Shared Sub RadioBoxChange(sender As MyRadioBox, e As Object) Handles RadioLogoType0.Check, RadioLogoType1.Check, RadioLogoType2.Check, RadioLogoType3.Check, RadioLauncherTheme0.Check, RadioLauncherTheme1.Check, RadioLauncherTheme2.Check, RadioLauncherTheme3.Check, RadioLauncherTheme4.Check, RadioLauncherTheme5.Check, RadioLauncherTheme6.Check, RadioLauncherTheme7.Check, RadioLauncherTheme8.Check, RadioLauncherTheme9.Check, RadioLauncherTheme10.Check, RadioLauncherTheme11.Check, RadioLauncherTheme12.Check, RadioLauncherTheme13.Check, RadioLauncherTheme14.Check, RadioCustomType0.Check, RadioCustomType1.Check, RadioCustomType2.Check, RadioCustomType3.Check
+ If AniControlEnabled = 0 Then Setup.Set(sender.Tag.ToString.Split("/")(0), Val(sender.Tag.ToString.Split("/")(1)))
+ End Sub
+
+ '背景图片
+ Private Sub BtnUIBgOpen_Click(sender As Object, e As EventArgs) Handles BtnBackgroundOpen.Click
+ OpenExplorer("""" & Path & "PCL\Pictures""")
+ End Sub
+ Private Sub BtnBackgroundRefresh_Click(sender As Object, e As EventArgs) Handles BtnBackgroundRefresh.Click
+ BackgroundRefresh(True, True)
+ End Sub
+ Public Sub BackgroundRefreshUI(Show As Boolean, Count As Integer)
+ If IsNothing(PanBackgroundOpacity) Then Exit Sub
+ If Show Then
+ PanBackgroundOpacity.Visibility = Visibility.Visible
+ PanBackgroundBlur.Visibility = Visibility.Visible
+ PanBackgroundSuit.Visibility = Visibility.Visible
+ BtnBackgroundClear.Visibility = Visibility.Visible
+ CardBackground.Title = "背景图片(" & Count & " 张)"
+ Else
+ PanBackgroundOpacity.Visibility = Visibility.Collapsed
+ PanBackgroundBlur.Visibility = Visibility.Collapsed
+ PanBackgroundSuit.Visibility = Visibility.Collapsed
+ BtnBackgroundClear.Visibility = Visibility.Collapsed
+ CardBackground.Title = "背景图片"
+ End If
+ CardBackground.TriggerForceResize()
+ End Sub
+ Private Sub BtnBackgroundClear_Click(sender As Object, e As EventArgs) Handles BtnBackgroundClear.Click
+ If MyMsgBox("即将删除背景图片文件夹中的所有文件。" & vbCrLf & "此操作不可撤销,是否确定?", "警告",, "取消", IsWarn:=True) = 1 Then
+ DeleteDirectory(Path & "PCL\Pictures")
+ BackgroundRefresh(False, True)
+ Hint("背景图片已清空!", HintType.Finish)
+ End If
+ End Sub
+ '''
+ ''' 刷新背景图片及设置页 UI。
+ '''
+ ''' 是否显示刷新提示。
+ ''' 是否刷新图片显示。
+ Public Shared Sub BackgroundRefresh(IsHint As Boolean, Refresh As Boolean)
+ Try
+
+ '获取可用的图片文件
+ Directory.CreateDirectory(Path & "PCL\Pictures\")
+ Dim Pic As New List(Of String)
+ For Each File In EnumerateFiles(Path & "PCL\Pictures\")
+ If File.Extension.ToLower <> ".ini" AndAlso File.Extension.ToLower <> ".db" Then '文件夹可能会被加入 .ini 和 thumbs.db
+ Pic.Add(File.FullName)
+ End If
+ Next
+ '加载
+ If Not Pic.Any() Then
+ If Refresh Then
+ If FrmMain.ImgBack.Visibility = Visibility.Collapsed Then
+ If IsHint Then Hint("未检测到可用背景图片!", HintType.Critical)
+ Else
+ FrmMain.ImgBack.Visibility = Visibility.Collapsed
+ If IsHint Then Hint("背景图片已清除!", HintType.Finish)
+ End If
+ End If
+ If Not IsNothing(FrmSetupUI) Then FrmSetupUI.BackgroundRefreshUI(False, 0)
+ Else
+ If Refresh Then
+ Dim Address As String = RandomOne(Pic)
+ Try
+ Log("[UI] 加载背景图片:" & Address)
+ FrmMain.ImgBack.Background = New MyBitmap(Address)
+ Setup.Load("UiBackgroundSuit", True)
+ FrmMain.ImgBack.Visibility = Visibility.Visible
+ If IsHint Then Hint("背景图片已刷新:" & GetFileNameFromPath(Address), HintType.Finish, False)
+ Catch ex As Exception
+ If ex.Message.Contains("参数无效") Then
+ Log("刷新背景图片失败,该图片文件可能并非标准格式。" & vbCrLf &
+ "你可以尝试使用画图打开该文件并重新保存,这会让图片变为标准格式。" & vbCrLf &
+ "文件:" & Address, LogLevel.Msgbox)
+ Else
+ Log(ex, "刷新背景图片失败(" & Address & ")", LogLevel.Msgbox)
+ End If
+ End Try
+ End If
+ If Not IsNothing(FrmSetupUI) Then FrmSetupUI.BackgroundRefreshUI(True, Pic.Count)
+ End If
+
+ Catch ex As Exception
+ Log(ex, "刷新背景图片时出现未知错误", LogLevel.Feedback)
+ End Try
+ End Sub
+
+
+ '顶部栏
+ Private Sub BtnLogoChange_Click(sender As Object, e As EventArgs) Handles BtnLogoChange.Click
+ Dim FileName As String = SelectFile("常用图片文件(*.png;*.jpg;*.gif)|*.png;*.jpg;*.gif", "选择图片")
+ If FileName = "" Then Exit Sub
+ Try
+ '拷贝文件
+ File.Delete(Path & "PCL\Logo.png")
+ CopyFile(FileName, Path & "PCL\Logo.png")
+ '设置当前显示
+ FrmMain.ImageTitleLogo.Source = New MyBitmap(Path & "PCL\Logo.png")
+ Catch ex As Exception
+ If ex.Message.Contains("参数无效") Then
+ Log("改变标题栏图片失败,该图片文件可能并非标准格式。" & vbCrLf &
+ "你可以尝试使用画图打开该文件并重新保存,这会让图片变为标准格式。", LogLevel.Msgbox)
+ Else
+ Log(ex, "设置标题栏图片失败", LogLevel.Msgbox)
+ End If
+ FrmMain.ImageTitleLogo.Source = Nothing
+ End Try
+ End Sub
+ Private Sub RadioLogoType3_Check(sender As Object, e As RouteEventArgs) Handles RadioLogoType3.PreviewCheck
+ If Not (AniControlEnabled = 0 AndAlso e.RaiseByMouse) Then Exit Sub
+Refresh:
+ '已有图片则不再选择
+ If File.Exists(Path & "PCL\Logo.png") Then
+ Try
+ FrmMain.ImageTitleLogo.Source = New MyBitmap(Path & "PCL\Logo.png")
+ Catch ex As Exception
+ If ex.Message.Contains("参数无效") Then
+ Log("调整标题栏图片失败,该图片文件可能并非标准格式。" & vbCrLf &
+ "你可以尝试使用画图打开该文件并重新保存,这会让图片变为标准格式。", LogLevel.Msgbox)
+ Else
+ Log(ex, "调整标题栏图片失败", LogLevel.Msgbox)
+ End If
+ FrmMain.ImageTitleLogo.Source = Nothing
+ e.Handled = True
+ Try
+ File.Delete(Path & "PCL\Logo.png")
+ Catch exx As Exception
+ Log(exx, "清理错误的标题栏图片失败", LogLevel.Msgbox)
+ End Try
+ End Try
+ Exit Sub
+ End If
+ '没有图片则要求选择
+ Dim FileName As String = SelectFile("常用图片文件(*.png;*.jpg;*.gif)|*.png;*.jpg;*.gif", "选择图片")
+ If FileName = "" Then
+ FrmMain.ImageTitleLogo.Source = Nothing
+ e.Handled = True
+ Else
+ Try
+ '拷贝文件
+ File.Delete(Path & "PCL\Logo.png")
+ CopyFile(FileName, Path & "PCL\Logo.png")
+ GoTo Refresh
+ Catch ex As Exception
+ Log(ex, "复制标题栏图片失败", LogLevel.Msgbox)
+ End Try
+ End If
+ End Sub
+ Private Sub BtnLogoDelete_Click(sender As Object, e As EventArgs) Handles BtnLogoDelete.Click
+ Try
+ File.Delete(Path & "PCL\Logo.png")
+ RadioLogoType1.SetChecked(True, True, True)
+ Hint("标题栏图片已清空!", HintType.Finish)
+ Catch ex As Exception
+ Log(ex, "清空标题栏图片失败", LogLevel.Msgbox)
+ End Try
+ End Sub
+
+ '背景音乐
+ Private Sub BtnMusicOpen_Click(sender As Object, e As EventArgs) Handles BtnMusicOpen.Click
+ OpenExplorer("""" & Path & "PCL\Musics""")
+ End Sub
+ Private Sub BtnMusicRefresh_Click(sender As Object, e As EventArgs) Handles BtnMusicRefresh.Click
+ MusicRefreshPlay(True)
+ End Sub
+ Public Sub MusicRefreshUI()
+ If PanBackgroundOpacity Is Nothing Then Exit Sub
+ If MusicAllList.Any Then
+ PanMusicVolume.Visibility = Visibility.Visible
+ PanMusicDetail.Visibility = Visibility.Visible
+ BtnMusicClear.Visibility = Visibility.Visible
+ CardMusic.Title = "背景音乐(" & EnumerateFiles(Path & "PCL\Musics\").Count & " 首)"
+ Else
+ PanMusicVolume.Visibility = Visibility.Collapsed
+ PanMusicDetail.Visibility = Visibility.Collapsed
+ BtnMusicClear.Visibility = Visibility.Collapsed
+ CardMusic.Title = "背景音乐"
+ End If
+ CardMusic.TriggerForceResize()
+ End Sub
+ Private Sub BtnMusicClear_Click(sender As Object, e As EventArgs) Handles BtnMusicClear.Click
+ If MyMsgBox("即将删除背景音乐文件夹中的所有文件。" & vbCrLf & "此操作不可撤销,是否确定?", "警告",, "取消", IsWarn:=True) = 1 Then
+ RunInThread(Sub()
+ Hint("正在删除背景音乐……")
+ '停止播放音乐
+ MusicNAudio = Nothing
+ MusicWaitingList = New List(Of String)
+ MusicAllList = New List(Of String)
+ Thread.Sleep(200)
+ '删除文件
+ Try
+ DeleteDirectory(Path & "PCL\Musics")
+ Hint("背景音乐已删除!", HintType.Finish)
+ Catch ex As Exception
+ Log(ex, "删除背景音乐失败", LogLevel.Msgbox)
+ End Try
+ Try
+ Directory.CreateDirectory(Path & "PCL\Musics")
+ RunInUi(Sub() MusicRefreshPlay(False))
+ Catch ex As Exception
+ Log(ex, "重建背景音乐文件夹失败", LogLevel.Msgbox)
+ End Try
+ End Sub)
+ End If
+ End Sub
+ Private Sub CheckMusicStart_Change() Handles CheckMusicStart.Change
+ If AniControlEnabled <> 0 Then Exit Sub
+ If CheckMusicStart.Checked Then CheckMusicStop.Checked = False
+ End Sub
+ Private Sub CheckMusicStop_Change() Handles CheckMusicStop.Change
+ If AniControlEnabled <> 0 Then Exit Sub
+ If CheckMusicStop.Checked Then CheckMusicStart.Checked = False
+ End Sub
+
+ '主页
+ Private Sub BtnCustomFile_Click(sender As Object, e As EventArgs) Handles BtnCustomFile.Click
+ Try
+ If File.Exists(Path & "PCL\Custom.xaml") Then
+ If MyMsgBox("当前已存在布局文件,继续生成教学文件将会覆盖现有布局文件!", "覆盖确认", "继续", "取消", IsWarn:=True) = 2 Then Exit Sub
+ End If
+ WriteFile(Path & "PCL\Custom.xaml", GetResources("Custom"))
+ Hint("教学文件已生成!", HintType.Finish)
+ OpenExplorer("/select,""" & Path & "PCL\Custom.xaml""")
+ Catch ex As Exception
+ Log(ex, "生成教学文件失败", LogLevel.Feedback)
+ End Try
+ End Sub
+ Private Sub BtnCustomRefresh_Click() Handles BtnCustomRefresh.Click
+ FrmLaunchRight.ForceRefresh()
+ Hint("已刷新主页!", HintType.Finish)
+ End Sub
+ Private Sub BtnCustomTutorial_Click(sender As Object, e As EventArgs) Handles BtnCustomTutorial.Click
+ MyMsgBox("1. 点击 生成教学文件 按钮,这会在 PCL 文件夹下生成 Custom.xaml 布局文件。" & vbCrLf &
+ "2. 使用记事本等工具打开这个文件并进行修改,修改完记得保存。" & vbCrLf &
+ "3. 点击 刷新主页 按钮,查看主页现在长啥样了。" & vbCrLf &
+ vbCrLf &
+ "你可以在生成教学文件后直接刷新主页,对照着进行修改,更有助于理解。" & vbCrLf &
+ "直接将自定义主页文件拖进 PCL 窗口也可以快捷加载。", "主页自定义教程")
+ End Sub
+
+ '主题
+ Private Sub LabLauncherTheme5Unlock_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles LabLauncherTheme5Unlock.MouseLeftButtonUp
+ RadioLauncherTheme5Gray.Opacity -= 0.23
+ RadioLauncherTheme5.Opacity += 0.23
+ AniStart({
+ AaOpacity(RadioLauncherTheme5Gray, 1, 1000),
+ AaOpacity(RadioLauncherTheme5, -1, 1000)
+ }, "ThemeUnlock")
+ If RadioLauncherTheme5Gray.Opacity < 0.08 Then
+ ThemeUnlock(5, UnlockHint:="隐藏主题 玄素黑 已解锁!")
+ AniStop("ThemeUnlock")
+ RadioLauncherTheme5.Checked = True
+ End If
+ End Sub
+ Private Sub LabLauncherTheme11Click_MouseLeftButtonUp() Handles LabLauncherTheme11Click.MouseLeftButtonUp, RadioLauncherTheme11.MouseRightButtonUp
+ If LabLauncherTheme11Click.Visibility = Visibility.Collapsed OrElse LabLauncherTheme11Click.ToolTip.ToString.Contains("点击") Then
+ If MyMsgBox(
+ "1. 不爬取或攻击相关服务或网站,不盗取相关账号,没有谜题可以或需要以此来解决。" & vbCrLf &
+ "2. 不得篡改或损毁相关公开信息,请尽量让它们保持原状。" & vbCrLf &
+ "3. 在你感到迷茫的时候,看看回声洞可能会给你带来惊喜。" & vbCrLf & vbCrLf &
+ "若违规,可能会被从任意相关群中踢出!",
+ "解密游戏的基本规则", "我知道了", "恕我拒绝") = 1 Then
+ MyMsgBox("你需要用自己的智慧来找到下一步的线索……" & vbCrLf &
+ "初始线索:gnp.dorC61\60\20\0202\moc.x1xa.2s\\:sp" & "T".ToLower & "th", "解密游戏") '防止触发病毒检测规则
+ End If
+ End If
+ End Sub
+ Private Sub LabLauncherTheme8Copy_MouseRightButtonUp() Handles LabLauncherTheme8Copy.MouseRightButtonUp
+ OpenWebsite("https://afdian.net/a/LTCat")
+ End Sub
+ Private Sub LabLauncherTheme9Copy_MouseRightButtonUp() Handles LabLauncherTheme9Copy.MouseRightButtonUp
+ PageOtherLeft.TryFeedback()
+ End Sub
+
+ '主题自定义
+ Private Sub RadioLauncherTheme14_Change(sender As Object, e As RouteEventArgs) Handles RadioLauncherTheme14.Changed
+ If RadioLauncherTheme14.Checked Then
+ If LabLauncherHue.Visibility = Visibility.Visible Then Exit Sub
+ LabLauncherHue.Visibility = Visibility.Visible
+ SliderLauncherHue.Visibility = Visibility.Visible
+ LabLauncherSat.Visibility = Visibility.Visible
+ SliderLauncherSat.Visibility = Visibility.Visible
+ LabLauncherDelta.Visibility = Visibility.Visible
+ SliderLauncherDelta.Visibility = Visibility.Visible
+ LabLauncherLight.Visibility = Visibility.Visible
+ SliderLauncherLight.Visibility = Visibility.Visible
+ Else
+ If LabLauncherHue.Visibility = Visibility.Collapsed Then Exit Sub
+ LabLauncherHue.Visibility = Visibility.Collapsed
+ SliderLauncherHue.Visibility = Visibility.Collapsed
+ LabLauncherSat.Visibility = Visibility.Collapsed
+ SliderLauncherSat.Visibility = Visibility.Collapsed
+ LabLauncherDelta.Visibility = Visibility.Collapsed
+ SliderLauncherDelta.Visibility = Visibility.Collapsed
+ LabLauncherLight.Visibility = Visibility.Collapsed
+ SliderLauncherLight.Visibility = Visibility.Collapsed
+ End If
+ CardLauncher.TriggerForceResize()
+ End Sub
+ Private Sub HSL_Change() Handles SliderLauncherHue.Change, SliderLauncherLight.Change, SliderLauncherSat.Change, SliderLauncherDelta.Change
+ If AniControlEnabled <> 0 OrElse SliderLauncherSat Is Nothing OrElse Not SliderLauncherSat.IsLoaded Then Exit Sub
+ ThemeRefresh()
+ End Sub
+
+#Region "功能隐藏"
+
+ Private Shared _HiddenForceShow As Boolean = False
+ '''
+ ''' 是否强制显示被禁用的功能。
+ '''
+ Public Shared Property HiddenForceShow As Boolean
+ Get
+ Return _HiddenForceShow
+ End Get
+ Set(value As Boolean)
+ _HiddenForceShow = value
+ HiddenRefresh()
+ End Set
+ End Property
+
+ '''
+ ''' 更新功能隐藏带来的显示变化。
+ '''
+ Public Shared Sub HiddenRefresh() Handles Me.Loaded
+ If FrmMain.PanTitleSelect Is Nothing OrElse Not FrmMain.PanTitleSelect.IsLoaded Then Exit Sub
+ Try
+ '顶部栏
+ If Not HiddenForceShow AndAlso Setup.Get("UiHiddenPageDownload") AndAlso Setup.Get("UiHiddenPageLink") AndAlso Setup.Get("UiHiddenPageSetup") AndAlso Setup.Get("UiHiddenPageOther") Then
+ '顶部栏已被全部隐藏
+ FrmMain.PanTitleSelect.Visibility = Visibility.Collapsed
+ Else
+ '顶部栏未被全部隐藏
+ FrmMain.PanTitleSelect.Visibility = Visibility.Visible
+ FrmMain.BtnTitleSelect1.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenPageDownload"), Visibility.Collapsed, Visibility.Visible)
+ FrmMain.BtnTitleSelect2.Visibility = Visibility.Collapsed 'If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenPageLink"), Visibility.Collapsed, Visibility.Visible)
+ FrmMain.BtnTitleSelect3.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenPageSetup"), Visibility.Collapsed, Visibility.Visible)
+ FrmMain.BtnTitleSelect4.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenPageOther"), Visibility.Collapsed, Visibility.Visible)
+ End If
+ '功能
+ FrmLaunchLeft.RefreshButtonsUI()
+ If FrmSetupUI IsNot Nothing Then
+ FrmSetupUI.CardSwitch.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenFunctionHidden"), Visibility.Collapsed, Visibility.Visible)
+ End If
+ '设置子页面
+ If FrmSetupLeft IsNot Nothing Then
+ FrmSetupLeft.ItemLaunch.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenSetupLaunch"), Visibility.Collapsed, Visibility.Visible)
+ FrmSetupLeft.ItemUI.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenSetupUi"), Visibility.Collapsed, Visibility.Visible)
+ FrmSetupLeft.ItemLink.Visibility = Visibility.Collapsed 'If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenSetupLink"), Visibility.Collapsed, Visibility.Visible)
+ FrmSetupLeft.ItemSystem.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenSetupSystem"), Visibility.Collapsed, Visibility.Visible)
+ '隐藏左边选择卡
+ Dim AvaliableCount As Integer = 0
+ If Not Setup.Get("UiHiddenSetupLaunch") Then AvaliableCount += 1
+ If Not Setup.Get("UiHiddenSetupUi") Then AvaliableCount += 1
+ If Not Setup.Get("UiHiddenSetupLink") Then AvaliableCount += 1
+ If Not Setup.Get("UiHiddenSetupSystem") Then AvaliableCount += 1
+ FrmSetupLeft.PanItem.Visibility = If(AvaliableCount < 2 AndAlso Not HiddenForceShow, Visibility.Collapsed, Visibility.Visible)
+ End If
+ '更多子页面
+ Dim OtherAvaliableCount As Integer = 0
+ If Not Setup.Get("UiHiddenOtherHelp") Then OtherAvaliableCount += 1
+ If Not Setup.Get("UiHiddenOtherAbout") Then OtherAvaliableCount += 1
+ If Not Setup.Get("UiHiddenOtherTest") Then OtherAvaliableCount += 1
+ If Not Setup.Get("UiHiddenOtherFeedback") Then OtherAvaliableCount += 1
+ If Not Setup.Get("UiHiddenOtherVote") Then OtherAvaliableCount += 1
+ If FrmOtherLeft IsNot Nothing Then
+ FrmOtherLeft.ItemHelp.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenOtherHelp"), Visibility.Collapsed, Visibility.Visible)
+ FrmOtherLeft.ItemFeedback.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenOtherFeedback"), Visibility.Collapsed, Visibility.Visible)
+ FrmOtherLeft.ItemVote.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenOtherVote"), Visibility.Collapsed, Visibility.Visible)
+ FrmOtherLeft.ItemAbout.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenOtherAbout"), Visibility.Collapsed, Visibility.Visible)
+ FrmOtherLeft.ItemTest.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenOtherTest"), Visibility.Collapsed, Visibility.Visible)
+ '隐藏左边选择卡
+ FrmOtherLeft.PanItem.Visibility = If(OtherAvaliableCount < 2 AndAlso Not HiddenForceShow, Visibility.Collapsed, Visibility.Visible)
+ End If
+ If OtherAvaliableCount = 1 AndAlso Not HiddenForceShow Then
+ If Not Setup.Get("UiHiddenOtherHelp") Then
+ FrmMain.BtnTitleSelect4.Text = "帮助"
+ ElseIf Not Setup.Get("UiHiddenOtherAbout") Then
+ FrmMain.BtnTitleSelect4.Text = "关于"
+ Else
+ FrmMain.BtnTitleSelect4.Text = "百宝箱"
+ End If
+ Else
+ FrmMain.BtnTitleSelect4.Text = "更多"
+ End If
+ '各个页面的入口
+ If FrmMain.PageCurrent = FormMain.PageType.VersionSelect Then FrmSelectRight.BtnEmptyDownload_Loaded()
+ If FrmMain.PageCurrent = FormMain.PageType.Launch Then FrmLaunchLeft.RefreshButtonsUI()
+ If FrmMain.PageCurrent = FormMain.PageType.VersionSetup AndAlso FrmVersionModDisabled IsNot Nothing Then FrmVersionModDisabled.BtnDownload_Loaded()
+ '备注
+ If FrmSetupUI IsNot Nothing Then FrmSetupUI.CardSwitch.Title = If(HiddenForceShow, "功能隐藏(已暂时关闭,按 F12 以重新启用)", "功能隐藏")
+ Catch ex As Exception
+ Log(ex, "刷新功能隐藏项目失败", LogLevel.Feedback)
+ End Try
+ End Sub
+
+ 'UI 协同改变
+ Private Sub HiddenSetupMain() Handles CheckHiddenPageSetup.Change
+ '设置主页面
+ If CheckHiddenPageSetup.Checked Then
+ '开启
+ CheckHiddenSetupLaunch.Checked = True
+ CheckHiddenSetupSystem.Checked = True
+ CheckHiddenSetupLink.Checked = True
+ CheckHiddenSetupUI.Checked = True
+ Else
+ '关闭
+ If Setup.Get("UiHiddenSetupLaunch") AndAlso Setup.Get("UiHiddenSetupUi") AndAlso Setup.Get("UiHiddenSetupSystem") AndAlso Setup.Get("UiHiddenSetupLink") Then
+ CheckHiddenSetupLaunch.Checked = False
+ CheckHiddenSetupSystem.Checked = False
+ CheckHiddenSetupLink.Checked = False
+ CheckHiddenSetupUI.Checked = False
+ End If
+ End If
+ End Sub
+ Private Sub HiddenSetupSub() Handles CheckHiddenSetupLaunch.Change, CheckHiddenSetupSystem.Change, CheckHiddenSetupLink.Change, CheckHiddenSetupUI.Change
+ '设置子页面
+ If Setup.Get("UiHiddenSetupLaunch") AndAlso Setup.Get("UiHiddenSetupUi") AndAlso Setup.Get("UiHiddenSetupSystem") AndAlso Setup.Get("UiHiddenSetupLink") Then
+ '已被全部隐藏
+ CheckHiddenPageSetup.Checked = True
+ Else
+ '未被全部隐藏
+ CheckHiddenPageSetup.Checked = False
+ End If
+ End Sub
+ Private Sub HiddenOtherMain() Handles CheckHiddenPageOther.Change
+ '更多主页面
+ If CheckHiddenPageOther.Checked Then
+ '开启
+ CheckHiddenOtherAbout.Checked = True
+ CheckHiddenOtherTest.Checked = True
+ CheckHiddenOtherFeedback.Checked = True
+ CheckHiddenOtherVote.Checked = True
+ CheckHiddenOtherHelp.Checked = True
+ Else
+ '关闭
+ If Setup.Get("UiHiddenOtherHelp") AndAlso Setup.Get("UiHiddenOtherAbout") AndAlso Setup.Get("UiHiddenOtherTest") AndAlso
+ Setup.Get("UiHiddenOtherVote") AndAlso Setup.Get("UiHiddenOtherFeedback") Then
+ CheckHiddenOtherAbout.Checked = False
+ CheckHiddenOtherTest.Checked = False
+ CheckHiddenOtherFeedback.Checked = False
+ CheckHiddenOtherVote.Checked = False
+ CheckHiddenOtherHelp.Checked = False
+ End If
+ End If
+ End Sub
+ Private Sub HiddenOtherSub(sender As Object, user As Boolean) Handles CheckHiddenOtherHelp.Change, CheckHiddenOtherAbout.Change, CheckHiddenOtherTest.Change
+ '更多子页面(有具体内容的)
+ If Setup.Get("UiHiddenOtherHelp") AndAlso Setup.Get("UiHiddenOtherAbout") AndAlso Setup.Get("UiHiddenOtherTest") Then
+ '已被全部隐藏
+ CheckHiddenPageOther.Checked = True
+ Else
+ '未被全部隐藏
+ CheckHiddenPageOther.Checked = False
+ End If
+ '修改无具体内容的项
+ If Not user Then Exit Sub
+ If Setup.Get("UiHiddenOtherHelp") AndAlso Setup.Get("UiHiddenOtherAbout") AndAlso Setup.Get("UiHiddenOtherTest") Then
+ CheckHiddenOtherFeedback.Checked = True
+ CheckHiddenOtherVote.Checked = True
+ End If
+ End Sub
+ Private Sub HiddenOtherNet(sender As Object, user As Boolean) Handles CheckHiddenOtherFeedback.Change, CheckHiddenOtherVote.Change
+ '更多子页面(无具体内容的)
+ If Not user Then Exit Sub
+ If Setup.Get("UiHiddenOtherHelp") AndAlso Setup.Get("UiHiddenOtherAbout") AndAlso Setup.Get("UiHiddenOtherTest") AndAlso
+ (Not Setup.Get("UiHiddenOtherFeedback") OrElse Not Setup.Get("UiHiddenOtherVote")) Then
+ CheckHiddenOtherAbout.Checked = False
+ CheckHiddenOtherTest.Checked = False
+ CheckHiddenOtherHelp.Checked = False
+ End If
+ End Sub
+
+ '警告提示
+ Private Sub HiddenHint(sender As Object, user As Boolean) Handles CheckHiddenFunctionHidden.Change, CheckHiddenPageSetup.Change, CheckHiddenSetupUI.Change
+ If AniControlEnabled = 0 AndAlso sender.Checked Then Hint("按 F12 即可暂时关闭功能隐藏设置。千万别忘了,要不然设置就改不回来了……")
+ End Sub
+
+#End Region
+
+ '公开预览版
+ Private Sub BtnLauncherDonate_Click(sender As Object, e As EventArgs) Handles BtnLauncherDonate.Click
+ OpenWebsite("https://afdian.net/a/LTCat")
+ End Sub
+
+ '滑动条
+ Private Sub SliderLoad()
+ SliderMusicVolume.GetHintText = Function(Value As Integer)
+ Return Math.Ceiling(Value * 0.1) & "%"
+ End Function
+ SliderLauncherOpacity.GetHintText = Function(Value As Integer)
+ Return Math.Round(40 + Value * 0.1) & "%"
+ End Function
+ SliderLauncherHue.GetHintText = Function(Value As Integer)
+ Return Value & "°"
+ End Function
+ SliderLauncherSat.GetHintText = Function(Value As Integer)
+ Return Value & "%"
+ End Function
+ SliderLauncherDelta.GetHintText = Function(Value As Integer)
+ If Value > 90 Then
+ Return "+" & (Value - 90)
+ ElseIf Value = 90 Then
+ Return 0
+ Else
+ Return Value - 90
+ End If
+ End Function
+ SliderLauncherLight.GetHintText = Function(Value As Integer)
+ If Value > 20 Then
+ Return "+" & (Value - 20)
+ ElseIf Value = 20 Then
+ Return 0
+ Else
+ Return Value - 20
+ End If
+ End Function
+ SliderBackgroundOpacity.GetHintText = Function(Value As Integer)
+ Return Math.Round(Value * 0.1) & "%"
+ End Function
+ SliderBackgroundBlur.GetHintText = Function(Value As Integer)
+ Return Value & " 像素"
+ End Function
+ End Sub
+
+End Class
diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj
index 4df8c36..418d8c7 100644
--- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj
+++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj
@@ -185,6 +185,10 @@
MyIconTextButton.xaml
+
+ PageOtherTest.xaml
+
+
@@ -466,6 +470,10 @@
FormMain.xaml
Code
+
+ MSBuild:Compile
+ Designer
+
MSBuild:Compile
Designer
@@ -916,5 +924,8 @@
+
+
+
\ No newline at end of file