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