龙腾猫跃 1 год назад
Родитель
Сommit
70636a9a77
25 измененных файлов с 303 добавлено и 279 удалено
  1. 2 2
      Plain Craft Launcher 2/App.config
  2. 7 0
      Plain Craft Launcher 2/FormMain.xaml.vb
  3. 5 6
      Plain Craft Launcher 2/Modules/Base/ModBase.vb
  4. 3 2
      Plain Craft Launcher 2/Modules/Base/ModNet.vb
  5. 10 21
      Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb
  6. 73 83
      Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb
  7. 14 11
      Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb
  8. 13 5
      Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb
  9. 8 6
      Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb
  10. 16 12
      Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb
  11. 5 0
      Plain Craft Launcher 2/Modules/ModDevelop.vb
  12. 2 2
      Plain Craft Launcher 2/My Project/AssemblyInfo.vb
  13. 1 1
      Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb
  14. 0 1
      Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml
  15. 1 1
      Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb
  16. 3 3
      Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb
  17. 5 0
      Plain Craft Launcher 2/Pages/PageLaunch/PageLoginLegacy.xaml.vb
  18. 112 99
      Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml
  19. 7 9
      Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml
  20. 2 2
      Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb
  21. 1 1
      Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml
  22. 2 2
      Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb
  23. 3 3
      Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb
  24. BIN
      Plain Craft Launcher 2/Resources/Help.zip
  25. 8 7
      Plain Craft Launcher 2/app.manifest

+ 2 - 2
Plain Craft Launcher 2/App.config

@@ -9,8 +9,8 @@
         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>
     </startup>
   <runtime>
-    <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false"/>
-    <AppContextSwitchOverrides value="Switch.System.Windows.DoNotScaleForDpiChanges=false"/>
+	<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false" />
+	<AppContextSwitchOverrides value="Switch.System.Windows.DoNotScaleForDpiChanges=false"/> <!-- #5337 -->
     <generatePublisherEvidence enabled="false"/>
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       <dependentAssembly>

+ 7 - 0
Plain Craft Launcher 2/FormMain.xaml.vb

@@ -90,6 +90,13 @@ Public Class FormMain
         '3:BUG+ IMP* FEAT-
         '2:BUG* IMP-
         '1:BUG-
+        If LastVersion < 346 Then 'Snapshot 2.8.13
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化网络环境不佳时,Mod、整合包页面的加载速度"))
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复部分电脑无法打开程序的 Bug"))
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复可能无法识别、更新 Mod 的 Bug"))
+            FeatureCount += 6
+            BugCount += 14
+        End If
         If LastVersion < 346 Then 'Snapshot 2.8.12
             If LastVersion = 345 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复帮助页面报错的 Bug"))
         End If

+ 5 - 6
Plain Craft Launcher 2/Modules/Base/ModBase.vb

@@ -12,13 +12,13 @@ Public Module ModBase
 #Region "声明"
 
     '下列版本信息由更新器自动修改
-    Public Const VersionBaseName As String = "2.8.12" '不含分支前缀的显示用版本名
-    Public Const VersionStandardCode As String = "2.8.12." & VersionBranchCode '标准格式的四段式版本号
+    Public Const VersionBaseName As String = "2.8.13" '不含分支前缀的显示用版本名
+    Public Const VersionStandardCode As String = "2.8.13." & VersionBranchCode '标准格式的四段式版本号
     Public Const CommitHash As String = "" 'Commit Hash,由 GitHub Workflow 自动替换
 #If BETA Then
     Public Const VersionCode As Integer = 347 'Release
 #Else
-    Public Const VersionCode As Integer = 346 'Snapshot
+    Public Const VersionCode As Integer = 348 'Snapshot
 #End If
     '自动生成的版本信息
     Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName
@@ -1975,13 +1975,12 @@ RetryDir:
     End Function
 
     ''' <summary>
-    ''' 判断当前系统语言是否为中文(中国大陆)。
+    ''' 判断当前系统语言是否为 zh-CN。
     ''' </summary>
     Public Function IsSystemLanguageChinese() As Boolean
         Return CultureInfo.CurrentCulture.Name = "zh-CN" OrElse CultureInfo.CurrentUICulture.Name = "zh-CN"
     End Function
 
-
     Private Uuid As Integer = 1
     Private UuidLock As Object
     ''' <summary>
@@ -2865,4 +2864,4 @@ Retry:
 
 #End Region
 
-End Module
+End Module

+ 3 - 2
Plain Craft Launcher 2/Modules/Base/ModNet.vb

@@ -1819,6 +1819,7 @@ Retry:
         Private Sub RefreshStat()
             Try
                 Dim DeltaTime As Long = GetTimeTick() - RefreshStatLast
+                If DeltaTime = 0 Then Return
                 RefreshStatLast += DeltaTime
 #Region "刷新整体速度"
                 '计算瞬时速度
@@ -1884,7 +1885,7 @@ Retry:
                         For Each File As NetFile In WaitingFiles
                             If NetTaskThreadCount >= NetTaskThreadLimit Then Continue While '最大线程数检查
                             Dim NewThread = File.TryBeginThread()
-                            If NewThread IsNot Nothing AndAlso NewThread.Source.Url.Contains("bmclapi") Then Thread.Sleep(70) '减少 BMCLAPI 请求频率,避免 Too Many Requests
+                            If NewThread IsNot Nothing AndAlso NewThread.Source.Url.Contains("bmclapi") Then Thread.Sleep(100) '减少 BMCLAPI 请求频率,避免 Too Many Requests
                         Next
                         '为进行中的文件追加线程
                         If Speed >= NetTaskSpeedLimitLow Then Continue While '下载速度足够,无需新增
@@ -1904,7 +1905,7 @@ Retry:
                             '新增线程
                             If PreparingCount > DownloadingCount Then Continue For '准备中的线程已多于下载中的线程,不再新增
                             Dim NewThread = File.TryBeginThread()
-                            If NewThread IsNot Nothing AndAlso NewThread.Source.Url.Contains("bmclapi") Then Thread.Sleep(70) '减少 BMCLAPI 请求频率,避免 Too Many Requests
+                            If NewThread IsNot Nothing AndAlso NewThread.Source.Url.Contains("bmclapi") Then Thread.Sleep(100) '减少 BMCLAPI 请求频率,避免 Too Many Requests
                         Next
                     End While
                 Catch ex As Exception

+ 10 - 21
Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb

@@ -434,11 +434,8 @@
         Public Function ToCompItem(ShowMcVersionDesc As Boolean, ShowLoaderDesc As Boolean) As MyCompItem
             '获取版本描述
             Dim GameVersionDescription As String
-            Dim AllSnapshot As Boolean = GameVersions.All(Function(v) RegexCheck(v, "[0-9]{2}w[0-9]{2}[a-z]{1}"))
-            If AllSnapshot Then
-                GameVersionDescription = "仅快照版本"
-            ElseIf GameVersions Is Nothing OrElse Not GameVersions.Any() Then
-                GameVersionDescription = "未知"
+            If GameVersions Is Nothing OrElse Not GameVersions.Any() Then
+                GameVersionDescription = "仅快照版本" '#5412
             Else
                 Dim SpaVersions As New List(Of String)
                 Dim IsOld As Boolean = False
@@ -496,17 +493,11 @@
                     ModLoaderDescriptionFull = "仅 " & ModLoadersForDesc.Single.ToString
                     ModLoaderDescriptionPart = ModLoadersForDesc.Single.ToString
                 Case Else
-                    If ModLoaders.Contains(CompModLoaderType.Forge) AndAlso Not AllSnapshot AndAlso
-                       (GameVersions.Max < 14 OrElse ModLoaders.Contains(CompModLoaderType.Fabric)) AndAlso
-                       (GameVersions.Max < 20 OrElse ModLoaders.Contains(CompModLoaderType.NeoForge)) AndAlso
-                       (GameVersions.Max < 14 OrElse ModLoaders.Contains(CompModLoaderType.Quilt) OrElse Setup.Get("ToolDownloadIgnoreQuilt")) Then
-                        ModLoaderDescriptionFull = "任意"
-                        ModLoaderDescriptionPart = ""
-                    ElseIf AllSnapshot AndAlso
-                        ModLoaders.Contains(CompModLoaderType.Forge) AndAlso
-                        ModLoaders.Contains(CompModLoaderType.Fabric) AndAlso
-                        ModLoaders.Contains(CompModLoaderType.NeoForge) AndAlso
-                        (ModLoaders.Contains(CompModLoaderType.Quilt) OrElse Setup.Get("ToolDownloadIgnoreQuilt")) Then
+                    Dim MaxVersion As Integer = If(GameVersions.Any, GameVersions.Max, 99)
+                    If ModLoaders.Contains(CompModLoaderType.Forge) AndAlso
+                       (MaxVersion < 14 OrElse ModLoaders.Contains(CompModLoaderType.Fabric)) AndAlso
+                       (MaxVersion < 20 OrElse ModLoaders.Contains(CompModLoaderType.NeoForge)) AndAlso
+                       (MaxVersion < 14 OrElse ModLoaders.Contains(CompModLoaderType.Quilt) OrElse Setup.Get("ToolDownloadIgnoreQuilt")) Then
                         ModLoaderDescriptionFull = "任意"
                         ModLoaderDescriptionPart = ""
                     Else
@@ -1083,7 +1074,7 @@ Retry:
 
         If RealResults.Count + Storage.Results.Count < Task.Input.TargetResultCount Then
             Log($"[Comp] 总结果数需求最少 {Task.Input.TargetResultCount} 个,仅获得了 {RealResults.Count + Storage.Results.Count} 个")
-            If Task.Input.CanContinue Then
+            If Task.Input.CanContinue AndAlso [Error] Is Nothing Then '如果有下载源失败则不再重试,这时候重试可能导致无限循环
                 Log("[Comp] 将继续尝试加载下一页")
                 GoTo Retry
             Else
@@ -1491,10 +1482,8 @@ Retry:
         If Deps.Any Then
             For Each DepProject In Deps.Where(Function(id) CompProjectCache.ContainsKey(id)).Select(Function(id) CompProjectCache(id))
                 For Each File In CompFilesCache(ProjectId)
-                    If File.RawDependencies.Contains(DepProject.Id) AndAlso
-                    DepProject.Id <> ProjectId AndAlso 
-                    Not File.Dependencies.Contains(DepProject.Id) Then
-                        File.Dependencies.Add(DepProject.Id)
+                    If File.RawDependencies.Contains(DepProject.Id) AndAlso DepProject.Id <> ProjectId Then
+                        If Not File.Dependencies.Contains(DepProject.Id) Then File.Dependencies.Add(DepProject.Id)
                     End If
                 Next
             Next

+ 73 - 83
Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb

@@ -1098,39 +1098,27 @@
     ''' 调用 NetGetCodeByRequest。
     ''' </summary>
     Public Function DlModRequest(Url As String, Optional IsJson As Boolean = False) As Object
-        Dim McimUrl As String = DlSourceModGet(Url)
         Dim Urls As New List(Of KeyValuePair(Of String, Integer))
-        If McimUrl <> Url Then
-            Select Case Setup.Get("ToolDownloadMod")
-                'TODO: 在 MCIM 源稳定后回调
-                Case 0
-                    If ModeDebug Then
-                        Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
-                        Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 20))
-                        Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
-                        Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60))
-                        Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60))
-                    Else
-                        Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5))
-                        Urls.Add(New KeyValuePair(Of String, Integer)(Url, 20))
-                        Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
-                        Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60))
-                        Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60))
-                    End If
-                Case 1
-                    Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5))
-                    Urls.Add(New KeyValuePair(Of String, Integer)(Url, 20))
-                    Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
-                    Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60))
-                    Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60))
-                Case Else
-                    Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5))
-                    Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
-                    Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60))
-                    Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60))
-                    Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60))
-            End Select
-        End If
+        Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5))
+        Urls.Add(New KeyValuePair(Of String, Integer)(Url, 15))
+        'Dim McimUrl As String = DlSourceModGet(Url)
+        'If McimUrl <> Url Then
+        '    Select Case Setup.Get("ToolDownloadMod")
+        '        Case 0
+        '            Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 5))
+        '            Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
+        '            Urls.Add(New KeyValuePair(Of String, Integer)(Url, 15))
+        '        Case 1
+        '            Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5))
+        '            Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 5))
+        '            Urls.Add(New KeyValuePair(Of String, Integer)(Url, 15))
+        '            Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
+        '        Case Else
+        '            Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5))
+        '            Urls.Add(New KeyValuePair(Of String, Integer)(Url, 15))
+        '            Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
+        '    End Select
+        'End If
         Dim Exs As String = ""
         For Each Source In Urls
             Try
@@ -1147,39 +1135,27 @@
     ''' 调用 NetRequest。
     ''' </summary>
     Public Function DlModRequest(Url As String, Method As String, Data As String, ContentType As String) As String
-        Dim McimUrl As String = DlSourceModGet(Url)
         Dim Urls As New List(Of KeyValuePair(Of String, Integer))
-        If McimUrl <> Url Then
-            Select Case Setup.Get("ToolDownloadMod")
-                'TODO: 在 MCIM 源稳定后回调
-                Case 0
-                    If ModeDebug Then
-                        Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
-                        Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 20))
-                        Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
-                        Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60))
-                        Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60))
-                    Else
-                        Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5))
-                        Urls.Add(New KeyValuePair(Of String, Integer)(Url, 20))
-                        Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
-                        Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60))
-                        Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60))
-                    End If
-                Case 1
-                    Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5))
-                    Urls.Add(New KeyValuePair(Of String, Integer)(Url, 20))
-                    Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
-                    Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60))
-                    Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60))
-                Case Else
-                    Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5))
-                    Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
-                    Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60))
-                    Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60))
-                    Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60))
-            End Select
-        End If
+        Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5))
+        Urls.Add(New KeyValuePair(Of String, Integer)(Url, 15))
+        'Dim McimUrl As String = DlSourceModGet(Url)
+        'If McimUrl <> Url Then
+        '   Select Case Setup.Get("ToolDownloadMod")
+        '       Case 0
+        '           Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 5))
+        '           Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
+        '           Urls.Add(New KeyValuePair(Of String, Integer)(Url, 15))
+        '       Case 1
+        '           Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5))
+        '           Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 5))
+        '           Urls.Add(New KeyValuePair(Of String, Integer)(Url, 15))
+        '           Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
+        '       Case Else
+        '           Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5))
+        '           Urls.Add(New KeyValuePair(Of String, Integer)(Url, 15))
+        '           Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
+        '   End Select
+        'End If
         Dim Exs As String = ""
         For Each Source In Urls
             Try
@@ -1207,28 +1183,42 @@
     End Function
 
     Public Function DlSourceLibraryGet(Original As String) As String()
-        Return {
-            Original.
-                Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/maven").
-                Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/maven").
-                Replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/maven"),
-            Original.
-                Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/libraries").
-                Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/libraries").
-                Replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/libraries"),
-            Original
-        }
+        If {"minecraftforge", "fabricmc", "neoforged"}.Any(Function(k) Original.Contains(k)) Then '不添加原版源
+            Return {
+                Original.
+                    Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/maven").
+                    Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/maven").
+                    Replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/maven"),
+                Original.
+                    Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/libraries").
+                    Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/libraries").
+                    Replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/libraries")
+            }
+        Else
+            Return {
+                Original.
+                    Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/maven").
+                    Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/maven").
+                    Replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/maven"),
+                Original.
+                    Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/libraries").
+                    Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/libraries").
+                    Replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/libraries"),
+                Original
+            }
+        End If
     End Function
 
     Public Function DlSourceModGet(Original As String) As String
-        Return Original.
-            Replace("api.modrinth.com", "mod.mcimirror.top/modrinth").
-            Replace("staging-api.modrinth.com", "mod.mcimirror.top/modrinth").
-            Replace("cdn.modrinth.com", "mod.mcimirror.top").
-            Replace("api.curseforge.com", "mod.mcimirror.top/curseforge").
-            Replace("edge.forgecdn.net", "mod.mcimirror.top").
-            Replace("mediafilez.forgecdn.net", "mod.mcimirror.top").
-            Replace("media.forgecdn.net", "mod.mcimirror.top")
+        Return Original
+        'Return Original.
+        '    Replace("api.modrinth.com", "mod.mcimirror.top/modrinth").
+        '    Replace("staging-api.modrinth.com", "mod.mcimirror.top/modrinth").
+        '    Replace("cdn.modrinth.com", "mod.mcimirror.top").
+        '    Replace("api.curseforge.com", "mod.mcimirror.top/curseforge").
+        '    Replace("edge.forgecdn.net", "mod.mcimirror.top").
+        '    Replace("mediafilez.forgecdn.net", "mod.mcimirror.top").
+        '    Replace("media.forgecdn.net", "mod.mcimirror.top")
     End Function
 
     Public Function DlSourceLauncherOrMetaGet(Original As String) As String()

+ 14 - 11
Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb

@@ -236,15 +236,18 @@ NextInner:
         '正版购买提示
         If Not Setup.Get("HintBuy") AndAlso Setup.Get("LoginType") <> McLoginType.Ms Then
             If IsSystemLanguageChinese() Then
-                Select Case Setup.Get("SystemLaunchCount")
-                    Case 3, 8, 15, 30, 50, 70, 90, 110, 130, 180, 220, 280, 330, 380, 450, 550, 660, 750, 880, 950, 1100, 1300, 1500, 1700, 1900
-                        If MyMsgBox("你已经启动了 " & Setup.Get("SystemLaunchCount") & " 次 Minecraft 啦!" & vbCrLf &
-                                    "如果觉得 Minecraft 还不错,可以购买正版支持一下,毕竟开发游戏也真的很不容易……不要一直白嫖啦。" & vbCrLf & vbCrLf &
-                                    "在登录一次正版账号后,就不会再出现这个提示了!",
-                                    "考虑一下正版?", "支持正版游戏!", "下次一定") = 1 Then
-                            OpenWebsite("https://www.xbox.com/zh-cn/games/store/minecraft-java-bedrock-edition-for-pc/9nxp44l49shj")
-                        End If
-                End Select
+                RunInNewThread(
+                Sub()
+                    Select Case Setup.Get("SystemLaunchCount")
+                        Case 3, 8, 15, 30, 50, 70, 90, 110, 130, 180, 220, 280, 330, 380, 450, 550, 660, 750, 880, 950, 1100, 1300, 1500, 1700, 1900
+                            If MyMsgBox("你已经启动了 " & Setup.Get("SystemLaunchCount") & " 次 Minecraft 啦!" & vbCrLf &
+                                "如果觉得 Minecraft 还不错,可以购买正版支持一下,毕竟开发游戏也真的很不容易……不要一直白嫖啦。" & vbCrLf & vbCrLf &
+                                "在登录一次正版账号后,就不会再出现这个提示了!",
+                                "考虑一下正版?", "支持正版游戏!", "下次一定") = 1 Then
+                                OpenWebsite("https://www.xbox.com/zh-cn/games/store/minecraft-java-bedrock-edition-for-pc/9nxp44l49shj")
+                            End If
+                    End Select
+                End Sub, "Buy Minecraft")
             ElseIf Setup.Get("LoginType") = McLoginType.Legacy Then
                 Select Case MyMsgBox("你必须先登录正版账号,才能进行离线登录!", "正版验证", "购买正版", "试玩", "返回",
                     Button1Action:=Sub() OpenWebsite("https://www.xbox.com/zh-cn/games/store/minecraft-java-bedrock-edition-for-pc/9nxp44l49shj"))
@@ -2045,8 +2048,8 @@ IgnoreCustomSkin:
                 "@echo off" & vbCrLf &
                 "title 启动 - " & McVersionCurrent.Name & vbCrLf &
                 "echo 游戏正在启动,请稍候。" & vbCrLf &
-                "set APPDATA=""" & PathMcFolder & """" & vbCrLf &
-                "cd /D """ & PathMcFolder & """" & vbCrLf &
+                "set APPDATA=""" & McVersionCurrent.PathIndie & """" & vbCrLf &
+                "cd /D """ & McVersionCurrent.PathIndie & """" & vbCrLf &
                 CustomCommandGlobal & vbCrLf &
                 CustomCommandVersion & vbCrLf &
                 """" & McLaunchJavaSelected.PathJava & """ " & McLaunchArgument & vbCrLf &

+ 13 - 5
Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb

@@ -2037,8 +2037,12 @@ OnLoaded:
             If Checker.Check(Token.LocalPath) Is Nothing Then Continue For
             '文件不符合,添加下载
             Dim Urls As New List(Of String)
+            If Token.Url Is Nothing AndAlso Token.Name = "net.minecraftforge:forge:universal" Then
+                '特判修复 Forge 部分 universal 文件缺失 URL(#5455)
+                Token.Url = "https://maven.minecraftforge.net" & Token.LocalPath.Replace(If(Token.IsJumpLoader, JumpLoaderFolder, CustomMcFolder) & "libraries", "").Replace("\", "/")
+            End If
             If Token.Url IsNot Nothing Then
-                '获取 Url 的真实地址
+                '获取 URL 的真实地址
                 Urls.Add(Token.Url)
                 If Token.Url.Contains("launcher.mojang.com/v1/objects") OrElse Token.Url.Contains("client.txt") OrElse
                    Token.Url.Contains(".tsrg") Then
@@ -2080,10 +2084,14 @@ OnLoaded:
         McLibGet = If(WithHead, CustomMcFolder & "libraries\", "") &
                    Splited(0).Replace(".", "\") & "\" & Splited(1) & "\" & Splited(2) & "\" & Splited(1) & "-" & Splited(2) & ".jar"
         '判断 OptiFine 是否应该使用 installer
-        If McLibGet.Contains("optifine\OptiFine\1.12") AndAlso '仅在 1.12 OptiFine 可重现
-           File.Exists(CustomMcFolder & "libraries\" & Splited(0).Replace(".", "\") & "\" & Splited(1) & "\" & Splited(2) & "\" & Splited(1) & "-" & Splited(2) & "-installer.jar") Then
-            Log("[Launch] 已将 " & Original & " 特判替换为对应的 Installer 文件", LogLevel.Debug)
-            McLibGet = McLibGet.Replace(".jar", "-installer.jar")
+        If McLibGet.Contains("optifine\OptiFine\1.") AndAlso Splited(2).Split(".").Count > 1 Then
+            Dim MajorVersion As Integer = Val(Splited(2).Split(".")(1))
+            Dim MinorVersion As Integer = If(Splited(2).Split(".").Count > 1, Val(Splited(2).Split(".")(2).BeforeFirst("_")), 0)
+            If (MajorVersion = 12 OrElse (MajorVersion = 20 AndAlso MinorVersion >= 4) OrElse MajorVersion >= 21) AndAlso '仅在 1.12 (无法追溯) 和 1.20.4+ (#5376) 遇到此问题
+                File.Exists($"{CustomMcFolder}libraries\{Splited(0).Replace(".", "\")}\{Splited(1)}\{Splited(2)}\{Splited(1)}-{Splited(2)}-installer.jar") Then
+                McLaunchLog("已将 " & Original & " 替换为对应的 Installer 文件")
+                McLibGet = McLibGet.Replace(".jar", "-installer.jar")
+            End If
         End If
     End Function
 

+ 8 - 6
Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb

@@ -241,9 +241,7 @@ Retry:
             '获取 Mod 下载信息
             ModDownloadLoaders.Add(New LoaderTask(Of Integer, JArray)("获取 Mod 下载信息",
             Sub(Task As LoaderTask(Of Integer, JArray))
-                '由于 MCIM 缺少下载信息,只使用官方源获取列表
-                'TODO: 在 MCIM 源稳定后回调回 DlModRequest
-                Task.Output = GetJson(NetRequestRetry("https://api.curseforge.com/v1/mods/files", "POST", "{""fileIds"": [" & Join(ModList, ",") & "]}", "application/json"))("data")
+                Task.Output = GetJson(DlModRequest("https://api.curseforge.com/v1/mods/files", "POST", "{""fileIds"": [" & Join(ModList, ",") & "]}", "application/json"))("data")
                 '如果文件已被删除,则 API 会跳过那一项
                 If ModList.Count > Task.Output.Count Then Throw New Exception("整合包中的部分 Mod 版本已被 Mod 作者删除,所以没法继续安装了,请向整合包作者反馈该问题")
             End Sub) With {.ProgressWeight = ModList.Count / 10}) '每 10 Mod 需要 1s
@@ -798,14 +796,18 @@ Retry:
                 Thread.Sleep(400) '避免文件争用
                 '查找解压后的 exe 文件
                 Dim Launcher As String = Nothing
-                For Each ExeFile In Directory.GetFiles(TargetFolder, "*.exe", SearchOption.AllDirectories)
+                For Each ExeFile In Directory.GetFiles(TargetFolder, "*.exe", SearchOption.TopDirectoryOnly)
                     Dim Info = FileVersionInfo.GetVersionInfo(ExeFile)
                     Log($"[Modpack] 文件 {ExeFile} 的产品名标识为 {Info.ProductName}")
                     If Info.ProductName = "Plain Craft Launcher" Then
                         Launcher = ExeFile
-                    ElseIf (Info.ProductName.ContainsF("Launcher", True) OrElse Info.ProductName.ContainsF("启动器", True)) AndAlso
+                        Log($"[Modpack] 发现整合包附带的 PCL 启动器:{ExeFile}")
+                    ElseIf (Info.ProductName.ContainsF("Launcher", True) OrElse Info.ProductName.ContainsF("启动", True)) AndAlso
                         Not Info.ProductName = "Plain Craft Launcher Admin Manager" Then
-                        If Launcher Is Nothing Then Launcher = ExeFile
+                        If Launcher Is Nothing Then
+                            Launcher = ExeFile
+                            Log($"[Modpack] 发现整合包附带的疑似第三方启动器:{ExeFile}")
+                        End If
                     End If
                 Next
                 Task.Progress = 0.95

+ 16 - 12
Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb

@@ -137,18 +137,14 @@ Public Class MyLocalModItem
             Exit Sub
         End If
         '计算滑动范围
-        Dim Index = CType(Parent, StackPanel).Children.IndexOf(Me)
-        If Index < 0 OrElse Index >= CType(Parent, StackPanel).Children.Count Then Exit Sub
-        SwipeStart = Math.Min(SwipeStart, Index)
-        SwipeEnd = Math.Max(SwipeEnd, Index)
-        If SwipeStart < 0 Then SwipeStart = 0
-        If SwipeEnd < 0 Then SwipeEnd = 0
-        If SwipeStart >= CType(Parent, StackPanel).Children.Count Then SwipeStart = CType(Parent, StackPanel).Children.Count - 1
-        If SwipeEnd >= CType(Parent, StackPanel).Children.Count Then SwipeEnd = CType(Parent, StackPanel).Children.Count - 1
+        Dim Elements = CType(Parent, StackPanel).Children
+        Dim Index As Integer = Elements.IndexOf(Me)
+        SwipeStart = MathClamp(Math.Min(SwipeStart, Index), 0, Elements.Count - 1)
+        SwipeEnd = MathClamp(Math.Max(SwipeEnd, Index), 0, Elements.Count - 1)
         '勾选所有范围中的项
         If SwipeStart = SwipeEnd Then Exit Sub
         For i = SwipeStart To SwipeEnd
-            Dim Item As MyLocalModItem = CType(Parent, StackPanel).Children(i)
+            Dim Item As MyLocalModItem = Elements(i)
             Item.InitLate(Item, e)
             Item.Checked = SwipToState
         Next
@@ -466,8 +462,11 @@ Public Class MyLocalModItem
     End Sub
 
     '显示更新日志
-    Private Sub ShowUpdateLog(sender As Object, e As MouseButtonEventArgs) Handles BtnUpdate.PreviewMouseRightButtonUp
+    Private Sub BtnUpdate_PreviewMouseRightButtonUp(sender As Object, e As MouseButtonEventArgs) Handles BtnUpdate.PreviewMouseRightButtonUp
         e.Handled = True
+        ShowUpdateLog()
+    End Sub
+    Private Sub ShowUpdateLog()
         Dim CurseForgeUrl As String = Entry.ChangelogUrls.FirstOrDefault(Function(x) x.Contains("curseforge.com"))
         Dim ModrinthUrl As String = Entry.ChangelogUrls.FirstOrDefault(Function(x) x.Contains("modrinth.com"))
         If CurseForgeUrl Is Nothing OrElse ModrinthUrl Is Nothing Then
@@ -484,8 +483,13 @@ Public Class MyLocalModItem
 
     '触发更新
     Private Sub BtnUpdate_Click(sender As Object, e As EventArgs) Handles BtnUpdate.Click
-        If MyMsgBox($"是否要更新 {Entry.Name}?{vbCrLf}{vbCrLf}{GetUpdateCompareDescription()}", "Mod 更新确认", "更新", "取消") = 2 Then Return
-        FrmVersionMod.UpdateMods({Entry})
+        Select Case MyMsgBox($"是否要更新 {Entry.Name}?{vbCrLf}{vbCrLf}{GetUpdateCompareDescription()}", "Mod 更新确认", "更新", "查看更新日志", "取消")
+            Case 1 '更新
+                FrmVersionMod.UpdateMods({Entry})
+            Case 2 '查看更新日志
+                ShowUpdateLog()
+            Case 3 '取消
+        End Select
     End Sub
 
     '自适应(#4465)

+ 5 - 0
Plain Craft Launcher 2/Modules/ModDevelop.vb

@@ -1,3 +1,8 @@
 Public Module ModDevelop
 
+#If DEBUG Then
+    Public Sub Start()
+    End Sub
+#End If
+
 End Module

+ 2 - 2
Plain Craft Launcher 2/My Project/AssemblyInfo.vb

@@ -51,6 +51,6 @@ Imports System.Runtime.InteropServices
 ' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
 ' 方法是按如下所示使用“*”
 
-<Assembly: AssemblyVersion("2.8.12.0")>
-<Assembly: AssemblyFileVersion("2.8.12.0")>
+<Assembly: AssemblyVersion("2.8.13.0")>
+<Assembly: AssemblyFileVersion("2.8.13.0")>
 <Assembly: NeutralResourcesLanguage("")>

+ 1 - 1
Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb

@@ -1353,7 +1353,7 @@ Retry:
                     '去除其中的原始 Forgelike 项
                     For i = 0 To Libs.Count - 1
                         If Libs(i).LocalPath.EndsWithF($"{LoaderName.ToLower}-{Inherit}-{LoaderVersion}.jar") OrElse
-Libs(i).LocalPath.EndsWithF($"{LoaderName.ToLower}-{Inherit}-{LoaderVersion}-client.jar") Then
+                           Libs(i).LocalPath.EndsWithF($"{LoaderName.ToLower}-{Inherit}-{LoaderVersion}-client.jar") Then
                             Log($"[Download] 已从待下载 {LoaderName} 支持库中移除:" & Libs(i).LocalPath, LogLevel.Debug)
                             Libs.RemoveAt(i)
                             Exit For

+ 0 - 1
Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml

@@ -9,7 +9,6 @@
             <Grid.RowDefinitions>
                 <RowDefinition Height="Auto" />
                 <RowDefinition Height="1*" />
-                <RowDefinition Height="Auto" />
             </Grid.RowDefinitions>
             <local:MyCard Margin="0,0,0,25" x:Name="CardIntro">
                 <StackPanel Margin="22,18,22,19" x:Name="PanIntro">

+ 1 - 1
Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb

@@ -242,7 +242,7 @@ Retry:
                             {"Vanilla", "原版披风"}, {"Minecon2011", "Minecon 2011 参与者披风"}, {"Minecon2012", "Minecon 2012 参与者披风"},
                             {"Minecon2013", "Minecon 2013 参与者披风"}, {"Minecon2015", "Minecon 2015 参与者披风"}, {"Minecon2016", "Minecon 2016 参与者披风"},
                             {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"},
-                            {"Follower's", "追随者披风"}, {"MCC 15th Year", "MCC 15 周年披风"}, {"Minecraft Experience", "村民救援披风"}, 
+                            {"Follower's", "追随者披风"}, {"MCC 15th Year", "MCC 15 周年披风"}, {"Minecraft Experience", "村民救援披风"},
                             {"Mojang Office", "Mojang 办公室披风"}
                         }
                         Dim SelectionControl As New List(Of IMyRadio) From {New MyRadioBox With {.Text = "无披风"}}

+ 3 - 3
Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb

@@ -109,11 +109,11 @@ Download:
                         GoTo Download
                     Case 7
                         Log("[Page] 主页预设:主页市场")
-                        Url = "https://homepage-market.pages.dev/Custom.xaml"
+                        Url = "https://pclhomeplazaoss.lingyunawa.top:26994/d/Homepages/JingHai-Lingyun/Custom.xaml"
                         GoTo Download
                     Case 8
                         Log("[Page] 主页预设:更新日志")
-                        Url = "https://updatehomepage.pages.dev/UpdateHomepage.xaml"
+                        Url = "https://pclhomeplazaoss.lingyunawa.top:26994/d/Homepages/Joker2184/UpdateHomepage.xaml"
                         GoTo Download
                     Case 9
                         Log("[Page] 主页预设:PCL 新功能说明书")
@@ -125,7 +125,7 @@ Download:
                         GoTo Download
                     Case 11
                         Log("[Page] 主页预设:杂志主页")
-                        Url = "http://pclhomeplazaoss.lingyunawa.top:26994/d/Homepages/Ext1nguisher/Custom.xaml"
+                        Url = "https://pclhomeplazaoss.lingyunawa.top:26994/d/Homepages/Ext1nguisher/Custom.xaml"
                         GoTo Download
                 End Select
         End Select

+ 5 - 0
Plain Craft Launcher 2/Pages/PageLaunch/PageLoginLegacy.xaml.vb

@@ -44,6 +44,11 @@ Public Class PageLoginLegacy
     Public Shared Function IsVaild(LoginData As McLoginLegacy) As String
         If LoginData.UserName.Trim = "" Then Return "玩家名不能为空!"
         If LoginData.UserName.Contains("""") Then Return "玩家名不能包含英文引号!"
+        If McVersionCurrent IsNot Nothing AndAlso
+           ((McVersionCurrent.Version.McCodeMain = 20 AndAlso McVersionCurrent.Version.McCodeSub >= 3) OrElse McVersionCurrent.Version.McCodeMain > 20) AndAlso
+           LoginData.UserName.Trim.Length > 16 Then
+            Return "自 1.20.3 起,玩家名至多只能包含 16 个字符!"
+        End If
         Return ""
     End Function
     Public Function IsVaild() As String

+ 112 - 99
Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml

@@ -104,107 +104,120 @@
             </local:MyCard>
             <local:MyCard Margin="0,0,0,15" Title="赞助者">
                 <StackPanel Margin="25,40,10,20">
-                    <TextBlock HorizontalAlignment="Left" Text="以下是 2024 年 11 月的高级赞助者们!感谢各位对 PCL 和伟大的咕咕咕事业的支持!" Margin="0,0,25,5.5" TextTrimming="None" TextWrapping="WrapWithOverflow" />
+                    <TextBlock HorizontalAlignment="Left" Text="以下是 2024 年 12 月的高级赞助者们!感谢各位对 PCL 和伟大的咕咕咕事业的支持!" Margin="0,0,25,5.5" TextTrimming="None" TextWrapping="WrapWithOverflow" />
                     <WrapPanel Margin="0,0,0,10">
-                        <TextBlock Width="120" Margin="0,1.5" Text="枫星Maplestar" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="阿道" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="GuZhuJing" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="情鼠啾啾" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="蛇蛇W" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="蜜汁青柠檬" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="纸先生" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="CLOUD079" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="xiaoioax" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="CH土块警长" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="CHENJUN551" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Ezzo" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="夜抱?吃火炉" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Rn_Og" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="六个芙桃" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="月月月子喵" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Kuang3lian" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="烨芽" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="王ZEAN" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="CCYY" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="19921454753" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="房非缝" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Ashburn" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="绯念" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="PseudoStar" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="符之渡尘" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="singegg" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="白泽麒麟" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="拥抱烟霞不太专心" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="风起" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="白羽" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="所求化如愿" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="小小抱枕" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Horrizen" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="浮光" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="songhy" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="任我被回忆捉弄" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="飘飘ppiao" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="EnerG4" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="tiredl" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="有梦想的罐头" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Hasturnyth" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="犇犇" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="初晴" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="just ugly" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="宇ovo" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="斑马" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="? AXH" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="璃音233" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="凌源羡辰" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="雨巷" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="NoDoors" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="幕若" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="星期六" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="感念" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="凉城uwu" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="栀玖夕夏" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="X11aou" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Bobo_s1" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="玛卡巴卡" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="鸱影" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="一曲明清" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="曹予" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="kk" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="XDDDD" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="梵星" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="梦师A" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="傻傻" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="西柚味儿小猫" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="樱花成雨(烟雨)" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="瑞云生" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="桑什么鸟" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="桂花" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="stone devil" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="乄心" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="渡白" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="鬼鬼" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="菠萝飞走惹" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="陆山君" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="张无忧" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="缄默" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="影铉" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="酸菜鱼鱼" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="哈哈哈嗝" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="鸡逆苔煤" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="许柯" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="ChuaLinyZ" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="墨依小夕" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="柚可喝" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="m1350096708" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="猫南北丶QAQ" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="此时彼刻" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Yukino" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Paveway" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="明月栞那" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="默默无为" />
                         <TextBlock Width="120" Margin="0,1.5" Text="屑喵" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="DN_TheColdWinter" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="小康康" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="李白" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Gim" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="秋前盛夏" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="默然" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="zyx1998" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="阿龟" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="麟兮" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="天龙" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="that month" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Hipop" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="落天邪" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="星尘想睡觉" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="滑天下之大稽" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="机械之咒" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="虐猫达人薛定谔" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Superafei" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="范UP" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="cfgfnh" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="南瓜派不好吃吐了" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="又许江南月" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="我有鱼鱼枕" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="万能充" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="小黄" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="咸鱼淡鹤" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="cen_yi123456" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="折鹤z" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="吴风诗" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="MM775" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="鸽王" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="血月无华" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="小石头" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="intogo" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="清初凉宫" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="时光回执" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="tangfg" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="zzz" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="红枣列巴" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="VERNON" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="このdioた" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="潜凉" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Pinuo_0" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="被打穿的四号坦克" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="太微" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Suspect" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="龙舞猫跃" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Lotus" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="薄暮之国的希里斯" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Stone0829" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="古冰语" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="甲申道格" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Percy" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="传说中的山羊" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="TARDIS" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="dawa" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="轻梦" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="景景景景景景色分明" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="yaemikosdog" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="乜常青" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="TMOFFMY" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="参差荇菜" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="At sea" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="MRailgun" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="mason_73" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="赵怀民" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="闲的无聊" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="剑歌时亦" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="BartenderJ" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="鱼兔兔" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="豆杀" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="风都未见君" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="重生开大运撞大运" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="小林一直睡不醒" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Amorcks" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="陌生少年" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="hh-245" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="wang" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="魔鬼Devil_Tenth" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="星辰追梦者" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="caicai7162" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="redccol" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Zero_z1" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="上玄天" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="老师看我毕设惊了" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="32cc" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="上条真" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="天宇灵TUL" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="龙猫的狗" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="瀚海生辉" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Truman" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="TianChi_廻天" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="土豆明和" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="我好迷丶" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="水蓝蝾螈猫" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="mofacker" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="炎羽尘歌" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="枫雪" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="孩子气" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="纳西妲的狗" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Barb" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="小镰刀菌" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="DiceA" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="朴振澈" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="YinYang_SHI" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="网底游鱼" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="xc_xiaoxian" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="playermin" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="祈听神命" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="嘎子" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="柠檬爱恰柠檬水" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="游戏人生" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Lunaunde" />
                     </WrapPanel>
                     <Grid Height="35">
                         <Grid.ColumnDefinitions>

+ 7 - 9
Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml

@@ -54,31 +54,29 @@
                             <RowDefinition Height="7" />
                             <RowDefinition Height="28" />
                             <RowDefinition Height="7" />
-                            <RowDefinition Height="28" />
-                            <RowDefinition Height="7" />
                             <RowDefinition Height="Auto" />
                         </Grid.RowDefinitions>
-                        <TextBlock Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Left" Text="下载源" Margin="0,0,25,0" />
+                        <!--<TextBlock Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Left" Text="下载源" Margin="0,0,25,0" />
                         <local:MyComboBox x:Name="ComboDownloadMod" Grid.Row="0" Grid.ColumnSpan="2" Tag="ToolDownloadMod" Grid.Column="1">
                             <local:MyComboBoxItem Content="尽量使用镜像源(暂时无效)" />
                             <local:MyComboBoxItem Content="仅在官方源加载缓慢时改用镜像源" />
                             <local:MyComboBoxItem Content="尽量使用官方源" IsSelected="True" />
-                        </local:MyComboBox>
-                        <TextBlock Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="下载文件名" Margin="0,0,25,0" />
-                        <local:MyComboBox Grid.Row="2" x:Name="ComboDownloadTranslate" Grid.ColumnSpan="2" Tag="ToolDownloadTranslate" Grid.Column="1" 
+                        </local:MyComboBox>-->
+                        <TextBlock Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Left" Text="下载文件名" Margin="0,0,25,0" />
+                        <local:MyComboBox Grid.Row="0" x:Name="ComboDownloadTranslate" Grid.ColumnSpan="2" Tag="ToolDownloadTranslate" Grid.Column="1" 
                                           ToolTip="下载 Mod 时,Mod 的默认文件名中,中文译名应该放在哪个位置">
                             <local:MyComboBoxItem Content="译名位于文件名开头:[遗物] relics-0.1.14" IsSelected="True" />
                             <local:MyComboBoxItem Content="译名位于文件名开头:遗物-relics-0.1.14" />
                             <local:MyComboBoxItem Content="译名位于文件名末尾:relics-0.1.14-遗物" />
                             <local:MyComboBoxItem Content="不添加中文译名:relics-0.1.14" />
                         </local:MyComboBox>
-                        <TextBlock Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Left" Text="Mod 管理样式" Margin="0,0,25,0" />
-                        <local:MyComboBox Grid.Row="4" x:Name="ComboModLocalNameStyle" Grid.ColumnSpan="2" Tag="ToolModLocalNameStyle" Grid.Column="1" 
+                        <TextBlock Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="Mod 管理样式" Margin="0,0,25,0" />
+                        <local:MyComboBox Grid.Row="2" x:Name="ComboModLocalNameStyle" Grid.ColumnSpan="2" Tag="ToolModLocalNameStyle" Grid.Column="1" 
                                           ToolTip="在 Mod 管理页面中,Mod 项的显示方式">
                             <local:MyComboBoxItem Content="标题显示译名,详情显示文件名" IsSelected="True" />
                             <local:MyComboBoxItem Content="标题显示文件名,详情显示译名" />
                         </local:MyComboBox>
-                        <local:MyCheckBox Margin="0,2,0,4" Text="显示 Mod 加载器时忽略 Quilt" Grid.Row="6" Height="22" Grid.ColumnSpan="2"
+                        <local:MyCheckBox Margin="0,2,0,4" Text="显示 Mod 加载器时忽略 Quilt" Grid.Row="4" Height="22" Grid.ColumnSpan="2"
                                           x:Name="CheckDownloadIgnoreQuilt" Tag="ToolDownloadIgnoreQuilt" />
                     </Grid>
                 </StackPanel>

+ 2 - 2
Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb

@@ -34,7 +34,7 @@
 
         'Mod 与整合包
         ComboDownloadTranslate.SelectedIndex = Setup.Get("ToolDownloadTranslate")
-        ComboDownloadMod.SelectedIndex = Setup.Get("ToolDownloadMod")
+        'ComboDownloadMod.SelectedIndex = Setup.Get("ToolDownloadMod")
         ComboModLocalNameStyle.SelectedIndex = Setup.Get("ToolModLocalNameStyle")
         CheckDownloadIgnoreQuilt.Checked = Setup.Get("ToolDownloadIgnoreQuilt")
 
@@ -96,7 +96,7 @@
     Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderDebugAnim.Change, SliderDownloadThread.Change, SliderDownloadSpeed.Change
         If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value)
     End Sub
-    Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboDownloadVersion.SelectionChanged, ComboModLocalNameStyle.SelectionChanged, ComboDownloadTranslate.SelectionChanged, ComboSystemUpdate.SelectionChanged, ComboSystemActivity.SelectionChanged, ComboDownloadMod.SelectionChanged
+    Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboDownloadVersion.SelectionChanged, ComboModLocalNameStyle.SelectionChanged, ComboDownloadTranslate.SelectionChanged, ComboSystemUpdate.SelectionChanged, ComboSystemActivity.SelectionChanged
         If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex)
     End Sub
     Private Shared Sub TextBoxChange(sender As MyTextBox, e As Object) Handles TextSystemCache.ValidatedTextChanged

+ 1 - 1
Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml

@@ -245,7 +245,7 @@
                             <local:MyComboBoxItem Content="Minecraft 皮肤推荐(作者:wkea)" />
                             <local:MyComboBoxItem Content="OpenBMCLAPI 仪表盘 Lite(作者:Silverteal、Mxmilu666)" />
                             <local:MyComboBoxItem Content="PCL 主页市场(作者:凌云)" />
-                            <local:MyComboBoxItem Content="PCL 更新日志(作者:Joker2184)" />
+                            <local:MyComboBoxItem Content="PCL 新闻速报(作者:Joker2184)" />
                             <local:MyComboBoxItem Content="PCL 新功能说明书(作者:WForst-Breeze)" />
                             <local:MyComboBoxItem Content="OpenMCIM 仪表盘(作者:SALTWOOD)" />
                             <local:MyComboBoxItem Content="杂志主页(作者:CreeperIsASpy)" />

+ 2 - 2
Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb

@@ -42,8 +42,8 @@
         '设置解锁
         If Not RadioLauncherTheme8.IsEnabled Then LabLauncherTheme8Copy.ToolTip = "累积赞助达到 ¥23.33 后,在爱发电私信发送【解锁码】以解锁。" & vbCrLf & "右键打开赞助页面,如果觉得 PCL 做得还不错就支持一下吧 =w=!"
         RadioLauncherTheme8.ToolTip = "累积赞助达到 ¥23.33 后,在爱发电私信发送【解锁码】以解锁"
-        If Not RadioLauncherTheme9.IsEnabled Then LabLauncherTheme9Copy.ToolTip = "· 反馈一个 Bug,在标记为 [完成] 后回复识别码要求解锁(右键打开反馈页面)" & vbCrLf & "· 提交一个 Pull Request,在合并后回复识别码要求解锁"
-        RadioLauncherTheme9.ToolTip = "· 反馈一个 Bug,在标记为 [完成] 后回复识别码要求解锁" & vbCrLf & "· 提交一个 Pull Request,在合并后回复识别码要求解锁"
+        If Not RadioLauncherTheme9.IsEnabled Then LabLauncherTheme9Copy.ToolTip = "· 反馈一个 Bug,在标记为 [完成] 后回复识别码要求解锁(右键打开反馈页面)" & vbCrLf & "· 提交一个 Pull Request 或主页预设,在标记为 [完成] 后回复识别码要求解锁"
+        RadioLauncherTheme9.ToolTip = "· 反馈一个 Bug,在标记为 [完成] 后回复识别码要求解锁" & vbCrLf & "· 提交一个 Pull Request 或主页预设,在标记为 [完成] 后回复识别码要求解锁"
         '极客蓝的处理在 ThemeCheck 中
 
     End Sub

+ 3 - 3
Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb

@@ -356,12 +356,12 @@
 Install:
             Try
                 For Each ModFile In FilePathList
-                    Dim NewFileName = GetFileNameFromPath(ModFile).Replace(".disabled", "")
+                    Dim NewFileName = GetFileNameFromPath(ModFile).Replace(".disabled", "").Replace(".old", "")
                     If Not NewFileName.Contains(".") Then NewFileName += ".jar" '#4227
                     CopyFile(ModFile, TargetVersion.PathIndie & "mods\" & NewFileName)
                 Next
                 If FilePathList.Count = 1 Then
-                    Hint($"已安装 {GetFileNameFromPath(FilePathList.First).Replace(".disabled", "")}!", HintType.Finish)
+                    Hint($"已安装 {GetFileNameFromPath(FilePathList.First).Replace(".disabled", "").Replace(".old", "")}!", HintType.Finish)
                 Else
                     Hint($"已安装 {FilePathList.Count} 个 Mod!", HintType.Finish)
                 End If
@@ -388,7 +388,7 @@ Install:
 
 #Region "选择"
 
-    '选择的 Mod 的路径(不含 .disabled)
+    '选择的 Mod 的路径(不含 .disabled 和 .old)
     Public SelectedMods As New List(Of String)
 
     '单项切换选择状态

BIN
Plain Craft Launcher 2/Resources/Help.zip


+ 8 - 7
Plain Craft Launcher 2/app.manifest

@@ -48,14 +48,15 @@
        自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI,无需
        选择加入。选择加入此设置的 Windows 窗体应用程序(目标设定为 .NET Framework 4.6 )还应
        在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"。-->
+  <!-- 更改原因见 #5337 -->
   <application xmlns="urn:schemas-microsoft-com:asm.v3">
-    <windowsSettings>
-      <!-- The combination of below two tags have the following effect : 
-           1. Per-Monitor for >= Windows 10 Anniversary Update
-           2. System < Windows 10 Anniversary Update -->
-      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
-      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
-    </windowsSettings>
+  	<windowsSettings>
+  		<!-- The combination of below two tags have the following effect : 
+            1. Per-Monitor for >= Windows 10 Anniversary Update
+            2. System < Windows 10 Anniversary Update -->
+  		<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
+  		<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
+  	</windowsSettings>
   </application>
 
   <!-- 启用 Windows 公共控件和对话框的主题(Windows XP 和更高版本) -->