龙腾猫跃 3 年 前
親
コミット
79778490d5

+ 6 - 6
Plain Craft Launcher 2/Controls/MyHint.xaml.vb

@@ -11,17 +11,17 @@
             If _IsWarn = value Then Exit Property
             If _IsWarn = value Then Exit Property
             _IsWarn = value
             _IsWarn = value
             If _IsWarn Then
             If _IsWarn Then
-                BorderBrush = New MyColor("#99FF4444")
-                Gradient1.Color = New MyColor("#88FFBBBB")
-                Gradient2.Color = New MyColor("#88FF8888")
+                BorderBrush = New MyColor("#CCFF4444")
+                Gradient1.Color = New MyColor("#BBFFBBBB")
+                Gradient2.Color = New MyColor("#BBFF8888")
                 Path.Fill = New MyColor("#BF0000")
                 Path.Fill = New MyColor("#BF0000")
                 LabText.Foreground = New MyColor("#BF0000")
                 LabText.Foreground = New MyColor("#BF0000")
                 BtnClose.Foreground = New MyColor("#BF0000")
                 BtnClose.Foreground = New MyColor("#BF0000")
                 Path.Data = (New GeometryConverter).ConvertFromString("F1 M 58.5832,55.4172L 17.4169,55.4171C 15.5619,53.5621 15.5619,50.5546 17.4168,48.6996L 35.201,15.8402C 37.056,13.9852 40.0635,13.9852 41.9185,15.8402L 58.5832,48.6997C 60.4382,50.5546 60.4382,53.5622 58.5832,55.4172 Z M 34.0417,25.7292L 36.0208,41.9584L 39.9791,41.9583L 41.9583,25.7292L 34.0417,25.7292 Z M 38,44.3333C 36.2511,44.3333 34.8333,45.7511 34.8333,47.5C 34.8333,49.2489 36.2511,50.6667 38,50.6667C 39.7489,50.6667 41.1666,49.2489 41.1666,47.5C 41.1666,45.7511 39.7489,44.3333 38,44.3333 Z ")
                 Path.Data = (New GeometryConverter).ConvertFromString("F1 M 58.5832,55.4172L 17.4169,55.4171C 15.5619,53.5621 15.5619,50.5546 17.4168,48.6996L 35.201,15.8402C 37.056,13.9852 40.0635,13.9852 41.9185,15.8402L 58.5832,48.6997C 60.4382,50.5546 60.4382,53.5622 58.5832,55.4172 Z M 34.0417,25.7292L 36.0208,41.9584L 39.9791,41.9583L 41.9583,25.7292L 34.0417,25.7292 Z M 38,44.3333C 36.2511,44.3333 34.8333,45.7511 34.8333,47.5C 34.8333,49.2489 36.2511,50.6667 38,50.6667C 39.7489,50.6667 41.1666,49.2489 41.1666,47.5C 41.1666,45.7511 39.7489,44.3333 38,44.3333 Z ")
             Else
             Else
-                BorderBrush = New MyColor("#994D76FF")
-                Gradient1.Color = New MyColor("#88B0D0FF")
-                Gradient2.Color = New MyColor("#889EBAFF")
+                BorderBrush = New MyColor("#CC4D76FF")
+                Gradient1.Color = New MyColor("#BBB0D0FF")
+                Gradient2.Color = New MyColor("#BB9EBAFF")
                 Path.Fill = New MyColor("#0062BF")
                 Path.Fill = New MyColor("#0062BF")
                 LabText.Foreground = New MyColor("#0062BF")
                 LabText.Foreground = New MyColor("#0062BF")
                 BtnClose.Foreground = New MyColor("#0062BF")
                 BtnClose.Foreground = New MyColor("#0062BF")

+ 24 - 6
Plain Craft Launcher 2/Controls/MyIconButton.xaml.vb

@@ -50,13 +50,31 @@
 
 
     '触发点击事件
     '触发点击事件
     Private Sub Button_MouseUp(sender As Object, e As MouseButtonEventArgs) Handles Me.MouseLeftButtonUp
     Private Sub Button_MouseUp(sender As Object, e As MouseButtonEventArgs) Handles Me.MouseLeftButtonUp
-        If IsMouseDown Then
-            Log("[Control] 按下图标按钮" & If(String.IsNullOrEmpty(Name), "", ":" & Name))
-            RaiseEvent Click(sender, e)
-            e.Handled = True
-            Button_MouseUp()
-        End If
+        If Not IsMouseDown Then Return
+        Log("[Control] 按下图标按钮" & If(String.IsNullOrEmpty(Name), "", ":" & Name))
+        RaiseEvent Click(sender, e)
+        e.Handled = True
+        Button_MouseUp()
+        ModEvent.TryStartEvent(EventType, EventData)
     End Sub
     End Sub
+    Public Property EventType As String
+        Get
+            Return GetValue(EventTypeProperty)
+        End Get
+        Set(value As String)
+            SetValue(EventTypeProperty, value)
+        End Set
+    End Property
+    Public Shared ReadOnly EventTypeProperty As DependencyProperty = DependencyProperty.Register("EventType", GetType(String), GetType(MyIconButton), New PropertyMetadata(Nothing))
+    Public Property EventData As String
+        Get
+            Return GetValue(EventDataProperty)
+        End Get
+        Set(value As String)
+            SetValue(EventDataProperty, value)
+        End Set
+    End Property
+    Public Shared ReadOnly EventDataProperty As DependencyProperty = DependencyProperty.Register("EventData", GetType(String), GetType(MyIconButton), New PropertyMetadata(Nothing))
 
 
     '鼠标点击判定(务必放在点击事件之后,以使得 Button_MouseUp 先于 Button_MouseLeave 执行)
     '鼠标点击判定(务必放在点击事件之后,以使得 Button_MouseUp 先于 Button_MouseLeave 执行)
     Private IsMouseDown As Boolean = False
     Private IsMouseDown As Boolean = False

+ 6 - 2
Plain Craft Launcher 2/Controls/MyIconTextButton.xaml.vb

@@ -73,6 +73,10 @@
         IsMouseDown = True
         IsMouseDown = True
         RefreshColor()
         RefreshColor()
     End Sub
     End Sub
+    Private Sub MyIconTextButton_MouseLeave() Handles Me.MouseLeave
+        IsMouseDown = False
+        RefreshColor()
+    End Sub
     Public Property EventType As String
     Public Property EventType As String
         Get
         Get
             Return GetValue(EventTypeProperty)
             Return GetValue(EventTypeProperty)
@@ -96,7 +100,7 @@
 
 
     Private Const AnimationTimeOfMouseIn As Integer = 100 '鼠标指向动画长度
     Private Const AnimationTimeOfMouseIn As Integer = 100 '鼠标指向动画长度
     Private Const AnimationTimeOfMouseOut As Integer = 150 '鼠标移出动画长度
     Private Const AnimationTimeOfMouseOut As Integer = 150 '鼠标移出动画长度
-    Private Sub RefreshColor(Optional obj = Nothing, Optional e = Nothing) Handles Me.MouseEnter, Me.MouseLeave, Me.Loaded, Me.IsEnabledChanged
+    Private Sub RefreshColor(Optional obj = Nothing, Optional e = Nothing) Handles Me.MouseEnter, Me.Loaded, Me.IsEnabledChanged
         Try
         Try
             If IsLoaded AndAlso AniControlEnabled = 0 AndAlso Not False.Equals(e) Then '防止默认属性变更触发动画,若强制不执行动画,则 e 为 False
             If IsLoaded AndAlso AniControlEnabled = 0 AndAlso Not False.Equals(e) Then '防止默认属性变更触发动画,若强制不执行动画,则 e 为 False
 
 
@@ -173,7 +177,7 @@
 
 
             End If
             End If
         Catch ex As Exception
         Catch ex As Exception
-            Log(ex, "刷新按钮颜色出错")
+            Log(ex, "刷新带图标按钮颜色出错")
         End Try
         End Try
     End Sub
     End Sub
 
 

+ 2 - 0
Plain Craft Launcher 2/Controls/MyPageRight.vb

@@ -152,6 +152,7 @@
     ''' </summary>
     ''' </summary>
     Public Sub PageOnExit()
     Public Sub PageOnExit()
         If ModeDebug Then Log("[UI] 已触发 PageOnExit")
         If ModeDebug Then Log("[UI] 已触发 PageOnExit")
+        RaiseEvent PageExit()
         Select Case PageState
         Select Case PageState
             Case PageStates.ContentEnter, PageStates.ContentStay
             Case PageStates.ContentEnter, PageStates.ContentStay
                 PageState = PageStates.PageExit
                 PageState = PageStates.PageExit
@@ -168,6 +169,7 @@
             Case PageStates.PageExit, PageStates.Empty
             Case PageStates.PageExit, PageStates.Empty
         End Select
         End Select
     End Sub
     End Sub
+    Public Event PageExit()
     ''' <summary>
     ''' <summary>
     ''' 即将切换到其他页面,需要强制完成页面状态清理。
     ''' 即将切换到其他页面,需要强制完成页面状态清理。
     ''' 需要立即切换至 Empty。
     ''' 需要立即切换至 Empty。

+ 1 - 1
Plain Craft Launcher 2/Controls/MyRadioButton.xaml.vb

@@ -252,7 +252,7 @@
 
 
             End If
             End If
         Catch ex As Exception
         Catch ex As Exception
-            Log(ex, "刷新按钮颜色出错")
+            Log(ex, "刷新单选按钮颜色出错")
         End Try
         End Try
     End Sub
     End Sub
 
 

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

@@ -116,6 +116,12 @@ Public Class FormMain
         '3:BUG+ IMP* FEAT-
         '3:BUG+ IMP* FEAT-
         '2:BUG* IMP-
         '2:BUG* IMP-
         '1:BUG-
         '1:BUG-
+        If LastVersion < 299 Then 'Snapshot 2.6.5
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "支持选择多种预设的主页"))
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化联网获取的主页的加载与缓存"))
+            FeatureCount += 18
+            BugCount += 13
+        End If
         If LastVersion < 298 Then 'Snapshot 2.6.4
         If LastVersion < 298 Then 'Snapshot 2.6.4
             FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "Mod 管理中允许多选 Mod 进行批量操作"))
             FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "Mod 管理中允许多选 Mod 进行批量操作"))
             FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化崩溃分析,添加多种崩溃情况的判断"))
             FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化崩溃分析,添加多种崩溃情况的判断"))
@@ -824,6 +830,7 @@ Public Class FormMain
                                        RunInUi(Sub()
                                        RunInUi(Sub()
                                                    Setup.Set("UiCustomType", 1)
                                                    Setup.Set("UiCustomType", 1)
                                                    FrmLaunchRight.ForceRefresh()
                                                    FrmLaunchRight.ForceRefresh()
+                                                   Hint("已加载主页自定义文件!", HintType.Finish)
                                                End Sub)
                                                End Sub)
                                        Exit Sub
                                        Exit Sub
                                    End If
                                    End If

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

@@ -11,12 +11,12 @@ Public Module ModBase
 #Region "声明"
 #Region "声明"
 
 
     '下列版本信息由更新器自动修改
     '下列版本信息由更新器自动修改
-    Public Const VersionBaseName As String = "2.6.4" '不含分支前缀的显示用版本名
-    Public Const VersionStandardCode As String = "2.6.4." & VersionBranchCode '标准格式的四段式版本号
+    Public Const VersionBaseName As String = "2.6.5" '不含分支前缀的显示用版本名
+    Public Const VersionStandardCode As String = "2.6.5." & VersionBranchCode '标准格式的四段式版本号
 #If BETA Then
 #If BETA Then
     Public Const VersionCode As Integer = 296 'Release
     Public Const VersionCode As Integer = 296 'Release
 #Else
 #Else
-    Public Const VersionCode As Integer = 298 'Snapshot
+    Public Const VersionCode As Integer = 299 'Snapshot
 #End If
 #End If
     '自动生成的版本信息
     '自动生成的版本信息
     Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName
     Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName

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

@@ -106,15 +106,15 @@ Retry:
 Retry:
 Retry:
             Select Case RetryCount
             Select Case RetryCount
                 Case 0 '正常尝试
                 Case 0 '正常尝试
-                    Return NetGetCodeRequest(Url, Encode, 10000, IsJson, Accept)
+                    Return NetGetCodeByRequestOnce(Url, Encode, 10000, IsJson, Accept)
                 Case 1 '慢速重试
                 Case 1 '慢速重试
                     Thread.Sleep(500)
                     Thread.Sleep(500)
-                    Return NetGetCodeRequest(If(BackupUrl, Url), Encode, 30000, IsJson, Accept)
+                    Return NetGetCodeByRequestOnce(If(BackupUrl, Url), Encode, 30000, IsJson, Accept)
                 Case Else '快速重试
                 Case Else '快速重试
                     If GetTimeTick() - StartTime > 5500 Then
                     If GetTimeTick() - StartTime > 5500 Then
                         '若前两次加载耗费 5 秒以上,才进行重试
                         '若前两次加载耗费 5 秒以上,才进行重试
                         Thread.Sleep(500)
                         Thread.Sleep(500)
-                        Return NetGetCodeRequest(If(BackupUrl, Url), Encode, 4000, IsJson, Accept)
+                        Return NetGetCodeByRequestOnce(If(BackupUrl, Url), Encode, 4000, IsJson, Accept)
                     Else
                     Else
                         Throw RetryException
                         Throw RetryException
                     End If
                     End If
@@ -148,7 +148,7 @@ Retry:
         For i = 1 To 4
         For i = 1 To 4
             Dim th As New Thread(Sub()
             Dim th As New Thread(Sub()
                                      Try
                                      Try
-                                         RequestResult = NetGetCodeRequest(Url, Encode, 30000, IsJson, Accept)
+                                         RequestResult = NetGetCodeByRequestOnce(Url, Encode, 30000, IsJson, Accept)
                                      Catch ex As Exception
                                      Catch ex As Exception
                                          FailCount += 1
                                          FailCount += 1
                                          RequestEx = ex
                                          RequestEx = ex
@@ -182,10 +182,10 @@ RequestFinished:
         Loop
         Loop
         Throw New Exception("未知错误")
         Throw New Exception("未知错误")
     End Function
     End Function
-    Private Function NetGetCodeRequest(Url As String, Encode As Encoding, Timeout As Integer, IsJson As Boolean, Accept As String)
+    Public Function NetGetCodeByRequestOnce(Url As String, Optional Encode As Encoding = Nothing, Optional Timeout As Integer = 30000, Optional IsJson As Boolean = False, Optional Accept As String = "")
         If RunInUi() AndAlso Not Url.Contains("//127.") Then Throw New Exception("在 UI 线程执行了网络请求")
         If RunInUi() AndAlso Not Url.Contains("//127.") Then Throw New Exception("在 UI 线程执行了网络请求")
         Url = SecretCdnSign(Url)
         Url = SecretCdnSign(Url)
-        Log("[Net] 获取网络结果:" & Url & ",最大超时 " & Timeout)
+        Log($"[Net] 获取网络结果:{Url},超时 {Timeout}ms{If(IsJson, ",要求 json", "")}")
         Dim Request As HttpWebRequest = WebRequest.Create(Url)
         Dim Request As HttpWebRequest = WebRequest.Create(Url)
         Dim Result As New List(Of Byte)
         Dim Result As New List(Of Byte)
         Try
         Try
@@ -269,6 +269,8 @@ RequestFinished:
         '下载
         '下载
         Using Client As New WebClient
         Using Client As New WebClient
             Try
             Try
+                Client.Headers(HttpRequestHeader.UserAgent) = "PCL2/" & VersionStandardCode & " Mozilla/5.0 AppleWebKit/537.36 Chrome/63.0.3239.132 Safari/537.36"
+                Client.Headers(HttpRequestHeader.Referer) = "http://" & VersionCode & ".pcl2.server/"
                 Client.DownloadFile(Url, LocalFile)
                 Client.DownloadFile(Url, LocalFile)
             Catch ex As Exception
             Catch ex As Exception
                 Throw New WebException("直接下载文件失败(" & Url & ")。", ex)
                 Throw New WebException("直接下载文件失败(" & Url & ")。", ex)

+ 9 - 7
Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb

@@ -111,8 +111,9 @@
                 IsJre = Not File.Exists(PathFolder & "javac.exe")
                 IsJre = Not File.Exists(PathFolder & "javac.exe")
                 '运行 -version
                 '运行 -version
                 Output = ShellAndGetOutput(PathFolder & "java.exe", "-version", 15000).ToLower
                 Output = ShellAndGetOutput(PathFolder & "java.exe", "-version", 15000).ToLower
-                If Output = "" Then Throw New Exception("尝试运行该 Java 失败")
+                If Output = "" Then Throw New ApplicationException("尝试运行该 Java 失败")
                 If ModeDebug Then Log("[Java] Java 检查输出:" & PathFolder & "java.exe" & vbCrLf & Output)
                 If ModeDebug Then Log("[Java] Java 检查输出:" & PathFolder & "java.exe" & vbCrLf & Output)
+                If Output.Contains("/lib/ext exists") Then Throw New ApplicationException("无法运行该 Java,请在删除 Java 文件夹中的 /lib/ext 文件夹后再试")
                 '获取详细信息
                 '获取详细信息
                 Dim VersionString = If(RegexSeek(Output, "(?<=version "")[^""]+"), If(RegexSeek(Output, "(?<=openjdk )[0-9]+"), "")).Replace("_", ".").Split("-").First
                 Dim VersionString = If(RegexSeek(Output, "(?<=version "")[^""]+"), If(RegexSeek(Output, "(?<=openjdk )[0-9]+"), "")).Replace("_", ".").Split("-").First
                 Do While VersionString.Split(".").Count < 4
                 Do While VersionString.Split(".").Count < 4
@@ -122,6 +123,7 @@
                         VersionString = "1." & VersionString
                         VersionString = "1." & VersionString
                     End If
                     End If
                 Loop
                 Loop
+                If VersionString = "" Then Throw New ApplicationException($"未找到该 Java 的版本号{If(Output.Length < 500, $"{vbCrLf}输出为:{vbCrLf}{Output}", "")}")
                 Version = New Version(VersionString)
                 Version = New Version(VersionString)
                 If Version.Minor = 0 Then
                 If Version.Minor = 0 Then
                     Log("[Java] 疑似 X.0.X.X 格式版本号:" & Version.ToString)
                     Log("[Java] 疑似 X.0.X.X 格式版本号:" & Version.ToString)
@@ -129,10 +131,10 @@
                 End If
                 End If
                 Is64Bit = Output.Contains("64-bit")
                 Is64Bit = Output.Contains("64-bit")
                 If Version.Minor <= 4 OrElse Version.Minor >= 25 Then Throw New Exception("分析详细信息失败,获取的版本为 " & Version.ToString)
                 If Version.Minor <= 4 OrElse Version.Minor >= 25 Then Throw New Exception("分析详细信息失败,获取的版本为 " & Version.ToString)
-                '基于 #2249 发现的 JRE 17 似乎也导致了 Forge 安装失败,干脆禁用更多版本的 JRE
-                If IsJre AndAlso VersionCode >= 16 Then Throw New Exception("由于高版本 JRE 对 Minecraft 的兼容性很差,因此不再允许使用")
-                ''无论如何不允许使用 JRE 16,它完全是炸的,安 OptiFine、Forge 和启动 MC 都会炸
-                'If IsJre AndAlso VersionCode = 16 Then Throw New Exception("由于 JRE 16 对 Minecraft 的兼容性很差,因此不再允许使用")
+                '基于 #2249 发现 JRE 17 似乎也导致了 Forge 安装失败,干脆禁用更多版本的 JRE
+                If IsJre AndAlso VersionCode >= 16 Then Throw New Exception("由于高版本 JRE 对游戏的兼容性很差,因此不再允许使用。你可以使用对应版本的 JDK,而非 JRE!")
+            Catch ex As ApplicationException
+                Throw ex
             Catch ex As Exception
             Catch ex As Exception
                 Log("[Java] 检查失败的 Java 输出:" & PathFolder & "java.exe" & vbCrLf & If(Output, "无程序输出"))
                 Log("[Java] 检查失败的 Java 输出:" & PathFolder & "java.exe" & vbCrLf & If(Output, "无程序输出"))
                 Throw New Exception("检查 Java 失败(" & If(PathJavaw, "Nothing") & ")", ex)
                 Throw New Exception("检查 Java 失败(" & If(PathJavaw, "Nothing") & ")", ex)
@@ -659,7 +661,7 @@ Wait:
                         SearchEntry.Contains("java") OrElse SearchEntry.Contains("jdk") OrElse SearchEntry.Contains("env") OrElse
                         SearchEntry.Contains("java") OrElse SearchEntry.Contains("jdk") OrElse SearchEntry.Contains("env") OrElse
                         SearchEntry.Contains("环境") OrElse SearchEntry.Contains("run") OrElse SearchEntry.Contains("软件") OrElse
                         SearchEntry.Contains("环境") OrElse SearchEntry.Contains("run") OrElse SearchEntry.Contains("软件") OrElse
                         SearchEntry.Contains("jre") OrElse SearchEntry = "bin" OrElse SearchEntry.Contains("mc") OrElse
                         SearchEntry.Contains("jre") OrElse SearchEntry = "bin" OrElse SearchEntry.Contains("mc") OrElse
-                        SearchEntry.Contains("software") OrElse SearchEntry.Contains("cache") OrElse SearchEntry.Contains("temp") OrElse
+                        SearchEntry.Contains("soft") OrElse SearchEntry.Contains("cache") OrElse SearchEntry.Contains("temp") OrElse
                         SearchEntry.Contains("corretto") OrElse SearchEntry.Contains("roaming") OrElse SearchEntry.Contains("users") OrElse
                         SearchEntry.Contains("corretto") OrElse SearchEntry.Contains("roaming") OrElse SearchEntry.Contains("users") OrElse
                         SearchEntry.Contains("craft") OrElse SearchEntry.Contains("program") OrElse SearchEntry.Contains("世界") OrElse
                         SearchEntry.Contains("craft") OrElse SearchEntry.Contains("program") OrElse SearchEntry.Contains("世界") OrElse
                         SearchEntry.Contains("net") OrElse SearchEntry.Contains("游戏") OrElse SearchEntry.Contains("oracle") OrElse
                         SearchEntry.Contains("net") OrElse SearchEntry.Contains("游戏") OrElse SearchEntry.Contains("oracle") OrElse
@@ -675,7 +677,7 @@ Wait:
                         SearchEntry.Contains("mod") OrElse SearchEntry.Contains("高清") OrElse SearchEntry.Contains("download") OrElse
                         SearchEntry.Contains("mod") OrElse SearchEntry.Contains("高清") OrElse SearchEntry.Contains("download") OrElse
                         SearchEntry.Contains("launch") OrElse SearchEntry.Contains("程序") OrElse SearchEntry.Contains("path") OrElse
                         SearchEntry.Contains("launch") OrElse SearchEntry.Contains("程序") OrElse SearchEntry.Contains("path") OrElse
                         SearchEntry.Contains("version") OrElse SearchEntry.Contains("baka") OrElse SearchEntry.Contains("pcl") OrElse
                         SearchEntry.Contains("version") OrElse SearchEntry.Contains("baka") OrElse SearchEntry.Contains("pcl") OrElse
-                        SearchEntry.Contains("local") OrElse SearchEntry.Contains("packages") OrElse SearchEntry.Contains("4297127D64EC6") OrElse '官启文件夹
+                        SearchEntry.Contains("local") OrElse SearchEntry.Contains("packages") OrElse SearchEntry.Contains("4297127d64ec6") OrElse '官启文件夹
                         SearchEntry.Contains("国服") OrElse SearchEntry.Contains("网易") OrElse SearchEntry.Contains("ext") OrElse '网易 Java 文件夹名
                         SearchEntry.Contains("国服") OrElse SearchEntry.Contains("网易") OrElse SearchEntry.Contains("ext") OrElse '网易 Java 文件夹名
                         SearchEntry.Contains("netease") OrElse SearchEntry.Contains("1.") OrElse SearchEntry.Contains("启动") Then
                         SearchEntry.Contains("netease") OrElse SearchEntry.Contains("1.") OrElse SearchEntry.Contains("启动") Then
                     JavaSearchFolder(FolderInfo, Results, Source)
                     JavaSearchFolder(FolderInfo, Results, Source)

+ 10 - 6
Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb

@@ -1120,8 +1120,8 @@ SystemBrowser:
             ElseIf McVersionCurrent.Version.McCodeMain >= 8 AndAlso McVersionCurrent.Version.McCodeMain <= 11 Then
             ElseIf McVersionCurrent.Version.McCodeMain >= 8 AndAlso McVersionCurrent.Version.McCodeMain <= 11 Then
                 '1.8 - 1.11:必须恰好 Java 8
                 '1.8 - 1.11:必须恰好 Java 8
                 MinVer = New Version(1, 8, 0, 0) : MaxVer = New Version(1, 8, 999, 999)
                 MinVer = New Version(1, 8, 0, 0) : MaxVer = New Version(1, 8, 999, 999)
-            ElseIf McVersionCurrent.Version.McCodeMain = 12 AndAlso McVersionCurrent.Version.HasForge Then
-                '1.12:若安装了 Forge,最高 Java 8
+            ElseIf McVersionCurrent.Version.McCodeMain = 12 Then
+                '1.12:最高 Java 8
                 MaxVer = New Version(1, 8, 999, 999)
                 MaxVer = New Version(1, 8, 999, 999)
             End If
             End If
         End If
         End If
@@ -1843,10 +1843,14 @@ NextVersion:
                         Else
                         Else
                             PackFormat = 12
                             PackFormat = 12
                         End If
                         End If
-                    Case 20, 99 '99 是快照版
-                        PackFormat = 15
-                    Case Else
-                        PackFormat = 16
+                    Case 20
+                        If McVersionCurrent.Version.McCodeSub <= 1 Then
+                            PackFormat = 15
+                        Else
+                            PackFormat = 17
+                        End If
+                    Case Else '快照版是 99
+                        PackFormat = 17
                         'https://minecraft.fandom.com/zh/wiki/数据包#数据包版本
                         'https://minecraft.fandom.com/zh/wiki/数据包#数据包版本
                 End Select
                 End Select
                 McLaunchLog("正在构建自定义皮肤资源包,格式为:" & PackFormat)
                 McLaunchLog("正在构建自定义皮肤资源包,格式为:" & PackFormat)

+ 1 - 4
Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb

@@ -1,7 +1,4 @@
-Imports System.IO.Compression
-Imports NAudio.Gui
-
-Public Module ModMinecraft
+Public Module ModMinecraft
 
 
 #Region "文件夹"
 #Region "文件夹"
 
 

+ 2 - 1
Plain Craft Launcher 2/Modules/Minecraft/ModWatcher.vb

@@ -272,7 +272,7 @@
                 If Not MinecraftWindowName.StartsWith("FML") Then
                 If Not MinecraftWindowName.StartsWith("FML") Then
                     '已找到 Minecraft 窗口
                     '已找到 Minecraft 窗口
                     WindowHandle = MinecraftWindowHandle
                     WindowHandle = MinecraftWindowHandle
-                    WatcherLog("Minecraft 窗口已加载:" & MinecraftWindowName & "(" & MinecraftWindowHandle.ToInt64 & ")")
+                    WatcherLog($"Minecraft 窗口已加载:{MinecraftWindowName}({MinecraftWindowHandle.ToInt64})")
                     IsWindowFinished = True
                     IsWindowFinished = True
                     '最大化
                     '最大化
                     If Setup.Get("LaunchArgumentWindowType") = 4 Then
                     If Setup.Get("LaunchArgumentWindowType") = 4 Then
@@ -282,6 +282,7 @@
                                                '……虽然我很想这样说,但总有人反馈,算了
                                                '……虽然我很想这样说,但总有人反馈,算了
                                                Thread.Sleep(2000)
                                                Thread.Sleep(2000)
                                                ShowWindow(WindowHandle, 3)
                                                ShowWindow(WindowHandle, 3)
+                                               WatcherLog($"已最大化 Minecraft 窗口:{MinecraftWindowHandle.ToInt64}")
                                            Catch ex As Exception
                                            Catch ex As Exception
                                                Log(ex, "最大化 Minecraft 窗口时出现错误")
                                                Log(ex, "最大化 Minecraft 窗口时出现错误")
                                            End Try
                                            End Try

+ 4 - 4
Plain Craft Launcher 2/Modules/ModEvent.vb

@@ -23,11 +23,9 @@
                 Case "打开文件", "打开帮助"
                 Case "打开文件", "打开帮助"
                     RunInThread(Sub()
                     RunInThread(Sub()
                                     Try
                                     Try
-
                                         '确认实际路径
                                         '确认实际路径
                                         Dim ActualPaths = GetEventAbsoluteUrls(Data(0), Type)
                                         Dim ActualPaths = GetEventAbsoluteUrls(Data(0), Type)
                                         Dim Location = ActualPaths(0), WorkingDir = ActualPaths(1)
                                         Dim Location = ActualPaths(0), WorkingDir = ActualPaths(1)
-
                                         '执行
                                         '执行
                                         If Type = "打开文件" Then
                                         If Type = "打开文件" Then
                                             Dim Info As New ProcessStartInfo With {
                                             Dim Info As New ProcessStartInfo With {
@@ -39,13 +37,14 @@
                                         Else '打开帮助
                                         Else '打开帮助
                                             PageOtherHelp.EnterHelpPage(Location)
                                             PageOtherHelp.EnterHelpPage(Location)
                                         End If
                                         End If
-
                                     Catch ex As Exception
                                     Catch ex As Exception
                                         Log(ex, "执行打开类自定义事件失败", LogLevel.Msgbox)
                                         Log(ex, "执行打开类自定义事件失败", LogLevel.Msgbox)
                                     End Try
                                     End Try
                                 End Sub)
                                 End Sub)
+
                 Case "启动游戏"
                 Case "启动游戏"
-                    If McLaunchStart(New McLaunchOptions With {.ServerIp = If(Data.Length >= 2, Data(1), Nothing), .Version = New McVersion(Data(0))}) Then
+                    If McLaunchStart(New McLaunchOptions With
+                                     {.ServerIp = If(Data.Length >= 2, Data(1), Nothing), .Version = New McVersion(Data(0))}) Then
                         Hint("正在启动 " & Data(0) & "……")
                         Hint("正在启动 " & Data(0) & "……")
                     End If
                     End If
 
 
@@ -54,6 +53,7 @@
 
 
                 Case "刷新主页"
                 Case "刷新主页"
                     FrmLaunchRight.ForceRefresh()
                     FrmLaunchRight.ForceRefresh()
+                    If Data(0) = "" Then Hint("已刷新主页!", HintType.Finish)
 
 
                 Case "刷新帮助"
                 Case "刷新帮助"
                     PageOtherLeft.RefreshHelp()
                     PageOtherLeft.RefreshHelp()

+ 14 - 14
Plain Craft Launcher 2/Modules/ModMusic.vb

@@ -5,7 +5,7 @@
     ''' <summary>
     ''' <summary>
     ''' 接下来要播放的音乐文件路径。未初始化时为 Nothing。
     ''' 接下来要播放的音乐文件路径。未初始化时为 Nothing。
     ''' </summary>
     ''' </summary>
-    Public MusicToplayList As List(Of String) = Nothing
+    Public MusicWaitingList As List(Of String) = Nothing
     ''' <summary>
     ''' <summary>
     ''' 全部音乐文件路径。未初始化时为 Nothing。
     ''' 全部音乐文件路径。未初始化时为 Nothing。
     ''' </summary>
     ''' </summary>
@@ -31,11 +31,11 @@
                 Next
                 Next
             End If
             End If
             '打乱顺序播放
             '打乱顺序播放
-            MusicToplayList = If(Setup.Get("UiMusicRandom"), Shuffle(New List(Of String)(MusicAllList)), New List(Of String)(MusicAllList))
-            If Not IgnoreFirst = "" AndAlso Not MusicToplayList.Count = 0 AndAlso MusicToplayList(0) = IgnoreFirst Then
+            MusicWaitingList = If(Setup.Get("UiMusicRandom"), Shuffle(New List(Of String)(MusicAllList)), New List(Of String)(MusicAllList))
+            If Not IgnoreFirst = "" AndAlso Not MusicWaitingList.Count = 0 AndAlso MusicWaitingList(0) = IgnoreFirst Then
                 '若需要避免成为第一项的为第一项,则将它放在最后
                 '若需要避免成为第一项的为第一项,则将它放在最后
-                MusicToplayList.RemoveAt(0)
-                MusicToplayList.Add(IgnoreFirst)
+                MusicWaitingList.RemoveAt(0)
+                MusicWaitingList.Add(IgnoreFirst)
             End If
             End If
         Catch ex As Exception
         Catch ex As Exception
             Log(ex, "初始化音乐列表失败", LogLevel.Feedback)
             Log(ex, "初始化音乐列表失败", LogLevel.Feedback)
@@ -46,12 +46,11 @@
     ''' </summary>
     ''' </summary>
     Private Function DequeueNextMusicAddress() As String
     Private Function DequeueNextMusicAddress() As String
         '初始化,确保存在音乐
         '初始化,确保存在音乐
-        If MusicAllList Is Nothing Then MusicListInit(False)
-        If MusicAllList.Count = 0 Then Throw New Exception("在没有音乐时尝试获取音乐路径")
+        If MusicAllList Is Nothing OrElse MusicAllList.Count = 0 Then MusicListInit(False)
         '出列下一个音乐,如果出列结束则生成新列表
         '出列下一个音乐,如果出列结束则生成新列表
-        DequeueNextMusicAddress = MusicToplayList(0)
-        MusicToplayList.RemoveAt(0)
-        If MusicToplayList.Count = 0 Then MusicListInit(False, DequeueNextMusicAddress)
+        DequeueNextMusicAddress = MusicWaitingList(0)
+        MusicWaitingList.RemoveAt(0)
+        If MusicWaitingList.Count = 0 Then MusicListInit(False, DequeueNextMusicAddress)
     End Function
     End Function
 
 
 #End Region
 #End Region
@@ -106,7 +105,8 @@
                 Case MusicStates.Play
                 Case MusicStates.Play
                     MusicPause()
                     MusicPause()
                 Case Else
                 Case Else
-                    Hint("音乐目前为停止状态!", HintType.Critical)
+                    Log("[Music] 音乐目前为停止状态,已强制尝试开始播放", LogLevel.Debug)
+                    MusicRefreshPlay(False)
             End Select
             End Select
         End If
         End If
     End Sub
     End Sub
@@ -212,15 +212,15 @@
     ''' 继续音乐播放,返回是否成功切换了状态。
     ''' 继续音乐播放,返回是否成功切换了状态。
     ''' </summary>
     ''' </summary>
     Public Function MusicResume() As Boolean
     Public Function MusicResume() As Boolean
-        If MusicState = MusicStates.Pause Then
+        If MusicState = MusicStates.Play Then
+            Return False
+        Else
             RunInThread(Sub()
             RunInThread(Sub()
                             MusicNAudio.Play()
                             MusicNAudio.Play()
                             MusicRefreshUI()
                             MusicRefreshUI()
                             Log("[Music] 已恢复播放")
                             Log("[Music] 已恢复播放")
                         End Sub)
                         End Sub)
             Return True
             Return True
-        Else
-            Return False
         End If
         End If
     End Function
     End Function
 
 

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

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

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

@@ -10,9 +10,12 @@
             <StackPanel x:Name="PanCustom">
             <StackPanel x:Name="PanCustom">
             </StackPanel>
             </StackPanel>
             <local:MyCard Margin="0,0,0,15" Title="快照版提示" x:Name="PanHint">
             <local:MyCard Margin="0,0,0,15" Title="快照版提示" x:Name="PanHint">
-                <StackPanel Margin="25,40,23,12">
-                    <TextBlock x:Name="LabHint1" TextWrapping="Wrap" Margin="0,0,0,2" />
-                    <TextBlock x:Name="LabHint2" TextWrapping="Wrap" Margin="0,0,0,2" />
+                <local:MyIconButton LogoScale="1.1" Logo="F1 M2,0 L0,2 8,10 0,18 2,20 10,12 18,20 20,18 12,10 20,2 18,0 10,8 2,0Z"
+                                    Height="20" Margin="10" HorizontalAlignment="Right" VerticalAlignment="Top"
+                                    x:Name="BtnHintClose" />
+                <StackPanel Margin="25,38,23,15">
+                    <TextBlock x:Name="LabHint1" TextWrapping="Wrap" Margin="0,0,0,2" FontSize="13.5" />
+                    <TextBlock x:Name="LabHint2" TextWrapping="Wrap" Margin="0,0,0,2" FontSize="13.5" />
                 </StackPanel>
                 </StackPanel>
             </local:MyCard>
             </local:MyCard>
             <local:MyCard Margin="0,0,0,15" Title="启动日志" x:Name="PanLog">
             <local:MyCard Margin="0,0,0,15" Title="启动日志" x:Name="PanLog">

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

@@ -3,100 +3,206 @@
     Private Sub Init() Handles Me.Loaded
     Private Sub Init() Handles Me.Loaded
         PanBack.ScrollToHome()
         PanBack.ScrollToHome()
         PanLog.Visibility = If(ModeDebug, Visibility.Visible, Visibility.Collapsed)
         PanLog.Visibility = If(ModeDebug, Visibility.Visible, Visibility.Collapsed)
-        '刷新主页
-        If ShouldRefresh Then
-            ShouldRefresh = False
-            RefreshCustom()
-        End If
         '快照版提示
         '快照版提示
 #If BETA Then
 #If BETA Then
         PanHint.Visibility = Visibility.Collapsed
         PanHint.Visibility = Visibility.Collapsed
 #Else
 #Else
-        PanHint.Title = "快照版提示"
         PanHint.Visibility = If(ThemeCheckGold(), Visibility.Collapsed, Visibility.Visible)
         PanHint.Visibility = If(ThemeCheckGold(), Visibility.Collapsed, Visibility.Visible)
-        LabHint1.Text = "快照版包含尚未在正式版发布的测试性功能,仅用于赞助者本人尝鲜。所以请不要发给其他人或者用于制作整合包哦!如果发现了 Bug,可以在 更多 → 反馈 中提交!"
-        LabHint2.Text = "你可以通过赞助¥23.33 档位换取解锁码来隐藏这个提示。"
+        LabHint1.Text = "快照版包含尚未正式发布的测试功能,仅用于赞助者本人尝鲜。请不要发给其他人或者用来制作整合包哦!"
+        LabHint2.Text = $"若已累积赞助¥23.33,在爱发电私信发送 {vbLQ}解锁码{vbRQ} 即可永久隐藏此提示。"
 #End If
 #End If
     End Sub
     End Sub
 
 
-    Private LatestFileContent As String = ""
-    Private LatestFileLink As String = Nothing
-    Private IsRefreshing As Boolean = False
-    Public ShouldRefresh As Boolean = True
+    '暂时关闭快照版提示
+#If Not BETA Then
+    Private Sub BtnHintClose_Click(sender As Object, e As EventArgs) Handles BtnHintClose.Click
+        AniDispose(PanHint, True)
+    End Sub
+#End If
+
+#Region "自定义主页"
+
     ''' <summary>
     ''' <summary>
-    ''' 刷新自定义的主页。返回是否成功。
+    ''' 刷新自定义主页。
     ''' </summary>
     ''' </summary>
-    Private Sub RefreshCustom()
-        If IsRefreshing Then
-            ShouldRefresh = True
-            Exit Sub
-        End If
+    Private Sub Refresh() Handles Me.Loaded
+        RunInNewThread(Sub()
+                           Try
+                               SyncLock RefreshLock
+                                   RefreshReal()
+                               End SyncLock
+                           Catch ex As Exception
+                               Log(ex, "加载 PCL 主页自定义信息失败", LogLevel.Msgbox)
+                           End Try
+                       End Sub, $"刷新自定义主页 #{GetUuid()}")
+    End Sub
+    Private Sub RefreshReal()
+        Dim Content As String = ""
+        Dim Url As String
+        Select Case Setup.Get("UiCustomType")
+            Case 1
+                '加载本地文件
+                Log("[Page] 主页自定义数据来源:本地文件")
+                Content = ReadFile(Path & "PCL\Custom.xaml") 'ReadFile 会进行存在检测
+            Case 2
+                Url = Setup.Get("UiCustomNet")
+Download:
+                '加载联网文件
+                If String.IsNullOrWhiteSpace(Url) Then Exit Select
+                If Url = Setup.Get("CacheSavedPageUrl") AndAlso File.Exists(PathTemp & "Cache\Custom.xaml") Then
+                    '缓存可用
+                    Log("[Page] 主页自定义数据来源:联网缓存文件")
+                    Content = ReadFile(PathTemp & "Cache\Custom.xaml")
+                    '后台更新缓存
+                    OnlineLoader.Start(Url)
+                Else
+                    '缓存不可用
+                    Log("[Page] 主页自定义数据来源:联网全新下载")
+                    Hint("正在加载主页……")
+                    RunInUiWait(Sub() LoadContent("")) '在加载结束前清空页面
+                    Setup.Set("CacheSavedPageVersion", "")
+                    OnlineLoader.Start(Url) '下载完成后将会再次触发更新
+                    Exit Sub
+                End If
+            Case 3
+                Select Case Setup.Get("UiCustomPreset")
+                    Case 0 '你知道吗
+                        Log("[Page] 主页预设:你知道吗")
+                        Content = "
+                            <local:MyCard Title=""你知道吗?"" Margin=""0,0,0,15"">
+                                <TextBlock Margin=""25,38,23,15"" FontSize=""13.5"" IsHitTestVisible=""False"" Text=""{hint}"" TextWrapping=""Wrap"" Foreground=""{DynamicResource ColorBrush1}"" />
+                                <local:MyIconButton Height=""22"" Width=""22"" Margin=""9"" VerticalAlignment=""Top"" HorizontalAlignment=""Right"" 
+                                    EventType=""刷新主页"" EventData=""/""
+                                    Logo=""M875.52 148.48C783.36 56.32 655.36 0 512 0 291.84 0 107.52 138.24 30.72 332.8l122.88 46.08C204.8 230.4 348.16 128 512 128c107.52 0 199.68 40.96 271.36 112.64L640 384h384V0L875.52 148.48zM512 896c-107.52 0-199.68-40.96-271.36-112.64L384 640H0v384l148.48-148.48C240.64 967.68 368.64 1024 512 1024c220.16 0 404.48-138.24 481.28-332.8L870.4 645.12C819.2 793.6 675.84 896 512 896z"" />
+                            </local:MyCard>"
+                    Case 1 '回声洞
+                        Log("[Page] 主页预设:回声洞")
+                        Content = "
+                            <local:MyCard Title=""回声洞"" Margin=""0,0,0,15"">
+                                <TextBlock Margin=""25,38,23,15"" FontSize=""13.5"" IsHitTestVisible=""False"" Text=""{cave}"" TextWrapping=""Wrap"" Foreground=""{DynamicResource ColorBrush1}"" />
+                                <local:MyIconButton Height=""22"" Width=""22"" Margin=""9"" VerticalAlignment=""Top"" HorizontalAlignment=""Right"" 
+                                    EventType=""刷新主页"" EventData=""/""
+                                    Logo=""M875.52 148.48C783.36 56.32 655.36 0 512 0 291.84 0 107.52 138.24 30.72 332.8l122.88 46.08C204.8 230.4 348.16 128 512 128c107.52 0 199.68 40.96 271.36 112.64L640 384h384V0L875.52 148.48zM512 896c-107.52 0-199.68-40.96-271.36-112.64L384 640H0v384l148.48-148.48C240.64 967.68 368.64 1024 512 1024c220.16 0 404.48-138.24 481.28-332.8L870.4 645.12C819.2 793.6 675.84 896 512 896z"" />
+                            </local:MyCard>"
+                    Case 2 '新闻主页
+                        Log("[Page] 主页预设:Minecraft 新闻")
+                        Url = "https://news.bugjump.net"
+                        GoTo Download
+                End Select
+        End Select
+        RunInUi(Sub() LoadContent(Content))
+    End Sub
+    Private RefreshLock As New Object
+
+    '联网获取自定义主页文件
+    Private OnlineLoader As New LoaderTask(Of String, Integer)("自定义主页获取", AddressOf OnlineLoaderSub) With {.ReloadTimeout = 10 * 60 * 1000}
+    Private Sub OnlineLoaderSub(Task As LoaderTask(Of String, Integer))
         Try
         Try
-            IsRefreshing = True
-            PanCustom.Children.Clear()
-            RunInNewThread(Sub()
-                               Dim FileContent As String = ""
-                               Select Case Setup.Get("UiCustomType")
-                                   Case 0
-                                       '啥也不干
-                                   Case 1
-                                       '加载本地文件
-                                       FileContent = ReadFile(Path & "PCL\Custom.xaml") 'ReadFile 会进行存在检测
-                                       Log("[System] 尝试从本地文件读取主页自定义数据(" & FileContent.Length & ")")
-                                   Case 2
-                                       '加载联网文件
-                                       Try
-                                           Dim Link As String = Setup.Get("UiCustomNet")
-                                           If Link = LatestFileLink Then
-                                               FileContent = LatestFileContent
-                                               Log("[System] 尝试缓存加载主页自定义数据(" & FileContent.Length & ")")
-                                           ElseIf Not String.IsNullOrWhiteSpace(Link) Then
-                                               Log("[System] 开始从网络读取主页自定义数据(" & Link & ")")
-                                               FileContent = NetGetCodeByRequestRetry(Link)
-                                               Log("[System] 尝试从网络读取主页自定义数据(" & FileContent.Length & ")")
-                                           End If
-                                           LatestFileLink = Link
-                                           LatestFileContent = FileContent
-                                       Catch ex As Exception
-                                           Log(ex, "获取 PCL 主页自定义信息失败", LogLevel.Msgbox)
-                                           LatestFileLink = ""
-                                       End Try
-                               End Select
-                               If FileContent = "" Then
-                                   IsRefreshing = False
-                                   Exit Sub
-                               End If
-                               FileContent = "<StackPanel xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" xmlns:local=""clr-namespace:PCL;assembly=Plain Craft Launcher 2"">" & FileContent & "</StackPanel>"
-                               FileContent = FileContent.Replace("{path}", Path)
-                               RunInUi(Sub()
-                                           Try
-                                               Log("[System] 加载主页自定义数据")
-                                               PanCustom.Children.Add(GetObjectFromXML(FileContent))
-                                               IsRefreshing = False
-                                           Catch ex As Exception
-                                               IsRefreshing = False
-                                               Log("[System] 自定义信息内容:" & vbCrLf & FileContent)
-                                               If MyMsgBox(ex.Message, "加载自定义主页失败", "重试", "取消") = 1 Then
-                                                   LatestFileLink = Nothing
-                                                   LatestFileContent = ""
-                                                   RefreshCustom()
-                                               End If
-                                           End Try
-                                       End Sub)
-                           End Sub, "主页自定义刷新")
+            '获取版本校验地址
+            Dim VersionAddress As String
+            If Task.Input.Contains(".xaml") Then
+                VersionAddress = Task.Input.Replace(".xaml", ".xaml.ini")
+            Else
+                VersionAddress = Task.Input.Split("?").First
+                If Not VersionAddress.EndsWith("/") Then VersionAddress += "/"
+                VersionAddress += "version"
+                If Task.Input.Contains("?") Then VersionAddress += Task.Input.Split("?").Last
+            End If
+            '校验版本
+            Dim Version As String = ""
+            Dim NeedDownload As Boolean = True
+            Try
+                Version = NetGetCodeByRequestOnce(VersionAddress, Timeout:=10000)
+                If Version.Length > 100 Then Throw New Exception($"获取的自定义主页版本过长({Version.Length} 字符)")
+                Dim CurrentVersion As String = Setup.Get("CacheSavedPageVersion")
+                If Version <> "" AndAlso CurrentVersion <> "" AndAlso Version = CurrentVersion Then
+                    Log($"[Page] 当前缓存的自定义主页已为最新,当前版本:{Version},检查源:{VersionAddress}")
+                    NeedDownload = False
+                Else
+                    Log($"[Page] 需要下载联网自定义主页,当前版本:{Version},检查源:{VersionAddress}")
+                End If
+            Catch exx As Exception
+                Log(exx, $"联网获取自定义主页版本失败", LogLevel.Developer)
+                Log($"[Page] 无法检查联网自定义主页版本,将直接下载,检查源:{VersionAddress}")
+            End Try
+            '实际下载
+            If NeedDownload Then
+                Dim FileContent As String = NetGetCodeByRequestRetry(Task.Input)
+                Log($"[Page] 已联网下载自定义主页,内容长度:{FileContent.Length},来源:{Task.Input}")
+                Setup.Set("CacheSavedPageUrl", Task.Input)
+                Setup.Set("CacheSavedPageVersion", Version)
+                WriteFile(PathTemp & "Cache\Custom.xaml", FileContent)
+            End If
+            '要求刷新
+            Refresh()
         Catch ex As Exception
         Catch ex As Exception
-            Log(ex, "加载 PCL 主页自定义信息失败", LogLevel.Msgbox)
-            IsRefreshing = False
+            Log(ex, $"联网下载自定义主页失败({Task.Input})", LogLevel.Hint)
+            Task.Input = ""
         End Try
         End Try
     End Sub
     End Sub
 
 
-    Public Sub ForceRefresh(Optional ShowHint As Boolean = True)
-        ShouldRefresh = True
-        LatestFileContent = ""
-        LatestFileLink = Nothing
-        If ShowHint Then Hint("已刷新主页!", HintType.Finish)
-        FrmMain.PageChange(FormMain.PageType.Launch)
-        Init()
+    ''' <summary>
+    ''' 立即强制刷新自定义主页。
+    ''' 必须在 UI 线程调用。
+    ''' </summary>
+    Public Sub ForceRefresh()
+        Log("[Page] 要求强制刷新自定义主页")
+        ClearCache()
+        '实际的刷新
+        If FrmMain.PageCurrent.Page = FormMain.PageType.Launch Then
+            PanBack.ScrollToHome()
+            Refresh()
+        Else
+            FrmMain.PageChange(FormMain.PageType.Launch)
+        End If
+    End Sub
+
+    ''' <summary>
+    ''' 清空自定义主页缓存信息。
+    ''' </summary>
+    Private Sub ClearCache()
+        LoadedContentHash = -1
+        OnlineLoader.Input = ""
+        Setup.Set("CacheSavedPageUrl", "")
+        Setup.Set("CacheSavedPageVersion", "")
+        Log("[Page] 已清空自定义主页缓存")
     End Sub
     End Sub
 
 
+    ''' <summary>
+    ''' 从文本内容中加载自定义主页。
+    ''' 必须在 UI 线程调用。
+    ''' </summary>
+    Private Sub LoadContent(Content As String)
+        SyncLock LoadContentLock
+            '如果加载目标内容一致则不加载
+            Dim Hash = Content.GetHashCode()
+            If Hash = LoadedContentHash Then Exit Sub
+            LoadedContentHash = Hash
+            '实际加载内容
+            PanCustom.Children.Clear()
+            If String.IsNullOrWhiteSpace(Content) Then
+                Log($"[Page] 实例化:清空自定义主页 UI,来源为空")
+                Return
+            End If
+            Content = "<StackPanel xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" xmlns:local=""clr-namespace:PCL;assembly=Plain Craft Launcher 2"">" & Content & "</StackPanel>"
+            Content = Content.Replace("{path}", Path).Replace("{hint}", PageOtherTest.GetRandomHint()).Replace("{cave}", PageOtherTest.GetRandomCave())
+            Log($"[Page] 实例化:加载自定义主页 UI,最终内容长度:{Content.Count}")
+            Try
+                PanCustom.Children.Add(GetObjectFromXML(Content))
+            Catch ex As Exception
+                Log("[Page] 加载失败的自定义主页内容:" & vbCrLf & Content)
+                If MyMsgBox($"自定义主页内容编写有误,请根据下列错误信息进行检查:{vbCrLf}{ex.Message}", "加载自定义主页失败", "重试", "取消") = 1 Then
+                    GoTo Refresh '防止 SyncLock 死锁
+                End If
+            End Try
+        End SyncLock
+        Return
+Refresh:
+        ForceRefresh()
+    End Sub
+    Private LoadedContentHash As Integer = -1
+    Private LoadContentLock As New Object
+
+#End Region
+
 End Class
 End Class

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

@@ -213,7 +213,7 @@
                     </Grid>
                     </Grid>
                 </StackPanel>
                 </StackPanel>
             </local:MyCard>
             </local:MyCard>
-            <local:MyCard Margin="0,0,0,15" Title="高级设置" IsSwaped="True" CanSwap="True">
+            <local:MyCard Margin="0,0,0,15" Title="高级启动选项" IsSwaped="True" CanSwap="True">
                 <Grid Margin="25,40,25,15">
                 <Grid Margin="25,40,25,15">
                     <Grid.ColumnDefinitions>
                     <Grid.ColumnDefinitions>
                         <ColumnDefinition Width="Auto" SharedSizeGroup="Name" />
                         <ColumnDefinition Width="Auto" SharedSizeGroup="Name" />

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

@@ -1,7 +1,4 @@
-Imports System.Security.Principal
-Imports PCL.MyLoading
-
-Public Class PageVersionMod
+Public Class PageVersionMod
 
 
 #Region "初始化"
 #Region "初始化"
 
 
@@ -336,8 +333,14 @@ Public Class PageVersionMod
         '更新下边栏 UI
         '更新下边栏 UI
         RefreshBottomBar()
         RefreshBottomBar()
     End Sub
     End Sub
-    Private Sub Load_State(sender As Object, newState As MyLoadingState, oldState As MyLoadingState) Handles Load.StateChanged
+    Private Sub UnselectedAllWithAnimation() Handles Load.StateChanged, Me.PageExit
+        Dim CacheAniControlEnabled = AniControlEnabled
+        AniControlEnabled = 0
         ChangeAllSelected(False)
         ChangeAllSelected(False)
+        AniControlEnabled += CacheAniControlEnabled
+    End Sub
+    Private Sub PageVersionMod_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
+        If My.Computer.Keyboard.CtrlKeyDown AndAlso e.Key = Key.A Then ChangeAllSelected(True)
     End Sub
     End Sub
 
 
 #End Region
 #End Region

BIN
Plain Craft Launcher 2/Resources/Help.zip


+ 454 - 81
Plain Craft Launcher 2/Resources/ModData.txt

@@ -1,6 +1,6 @@
 
 
-industrial-craft|工业时代2 (Industrial Craft 2)|515771
-@redpower2-core|红石力量2 (RedPower2)|71843
+industrial-craft|工业时代2 (Industrial Craft 2)|515771¨@industrial-craft|工业时代2 (Industrial Craft 2)|515771
+
 buildcraft@|建筑 (BuildCraft)|884720
 buildcraft@|建筑 (BuildCraft)|884720
 forestry@|林业*|708812
 forestry@|林业*|708812
 railcraft|铁路*|603270
 railcraft|铁路*|603270
@@ -37,7 +37,7 @@ player-api|玩家API (Player API) - 1.6-1.12.1¨playerapi|玩家API (Player API)
 
 
 
 
 
 
-
+ic2-classic|工业时代2经典版 (IC2 Classic)|1407663
 not-enough-items-1-8|NEI物品管理器 (Not Enough Items) - 1.8+|389937¨notenoughitems|NEI物品管理器 (Not Enough Items) - <1.8|389937
 not-enough-items-1-8|NEI物品管理器 (Not Enough Items) - 1.8+|389937¨notenoughitems|NEI物品管理器 (Not Enough Items) - <1.8|389937
 
 
 
 
@@ -114,7 +114,7 @@ bibliocraft|收藏馆 (BiblioCraft)|644088
 natura|自然*
 natura|自然*
 atomic-science|原子科学*
 atomic-science|原子科学*
 
 
-atum|阿图姆:沙漠之旅/亚图姆:金沙之旅 (Atum 2: Return to the Sands)|1207987
+
 blockphysics_by_id_miner|方块物理学 (BlockPhysics)
 blockphysics_by_id_miner|方块物理学 (BlockPhysics)
 
 
 
 
@@ -165,7 +165,7 @@ project-red-core|红石计划 (ProjectRed)¨project-red-base|红石计划 (Proje
 
 
 dimensionaldoors|次元门 (Dimensional Doors)|896027
 dimensionaldoors|次元门 (Dimensional Doors)|896027
 chickenchunks|区块载入器 (ChickenChunks)
 chickenchunks|区块载入器 (ChickenChunks)
-
+dlt2|动态蓄水槽 (Dynamic Liquid Tanks)
 
 
 webdisplays-remasterd|内置网页浏览器 (WebDisplays)|778743
 webdisplays-remasterd|内置网页浏览器 (WebDisplays)|778743
 morph|变身*
 morph|变身*
@@ -257,7 +257,7 @@ redstone-arsenal|红石兵工厂*¨@redstone-arsenal|红石兵工厂 (Redstone A
 big-reactors|大型反应堆*|348989
 big-reactors|大型反应堆*|348989
 
 
 endertanks|末影水槽 (Ender Tanks) - Forge¨endertanks-fabric|末影水槽 (Ender Tanks) - Fabric
 endertanks|末影水槽 (Ender Tanks) - Forge¨endertanks-fabric|末影水槽 (Ender Tanks) - Fabric
-applied-energistics-2@ae2|应用能源2*|798231
+
 hopper-ducts|漏斗管道*
 hopper-ducts|漏斗管道*
 autofish|自动钓鱼*|630098
 autofish|自动钓鱼*|630098
 mrcrayfish-furniture-mod|MrCrayfish 的家具 (MrCrayfish's Furniture Mod)|321693
 mrcrayfish-furniture-mod|MrCrayfish 的家具 (MrCrayfish's Furniture Mod)|321693
@@ -350,7 +350,7 @@ ex-aliquo
 steves-carts-2|史蒂夫矿车2 (Steve's Carts 2)
 steves-carts-2|史蒂夫矿车2 (Steve's Carts 2)
 mariculture|海洋物语*|321251
 mariculture|海洋物语*|321251
 evilcraft|邪恶工艺 (EvilCraft)
 evilcraft|邪恶工艺 (EvilCraft)
-
+projecte|等价交换重制版 (ProjectE)|1109380
 falling-meteors-mod|陨石 (Falling Meteors)
 falling-meteors-mod|陨石 (Falling Meteors)
 
 
 
 
@@ -384,7 +384,7 @@ pchan3-steamship-steamboat-pirates|飞艇与汽船 (SteamShip - SteamBoat and Pi
 
 
 thaumic-energistics|神秘能源*|791638
 thaumic-energistics|神秘能源*|791638
 
 
-chisel|凿子*|641383
+
 nuclearcraft-mod|核电工艺 (NuclearCraft)
 nuclearcraft-mod|核电工艺 (NuclearCraft)
 opencomputers|开放式电脑 (Open Computers)|618383
 opencomputers|开放式电脑 (Open Computers)|618383
 elemental-stones|元素之石*
 elemental-stones|元素之石*
@@ -393,7 +393,7 @@ waila-nbt|万用高亮显示 (Waila NBT)
 thaumcraft-node-tracker|神秘节点追踪*
 thaumcraft-node-tracker|神秘节点追踪*
 geochests|箱载世界*
 geochests|箱载世界*
 parachutemod|降落伞 (Parachute)
 parachutemod|降落伞 (Parachute)
-
+gem-buffs-infinite-potion-effects|宝石效果/增益宝石 (Gem Buffs)
 rftools@|RF工具箱 (RFTools)|416167
 rftools@|RF工具箱 (RFTools)|416167
 atomicstrykers-magic-yarn|AtomicStryker的魔法线 (AtomicStryker's Magic Yarn)
 atomicstrykers-magic-yarn|AtomicStryker的魔法线 (AtomicStryker's Magic Yarn)
 
 
@@ -544,7 +544,7 @@ dragonapi
 electricraft|电力工艺 (ElectriCraft)
 electricraft|电力工艺 (ElectriCraft)
 candycraft|糖果世界 (CandyCraft)|459723
 candycraft|糖果世界 (CandyCraft)|459723
 
 
-
+minefantasy2|我的幻想2 (MineFantasy2)
 
 
 rails-of-war|铁路战争 (Rails of War)
 rails-of-war|铁路战争 (Rails of War)
 actually-additions|实用拓展*|841281
 actually-additions|实用拓展*|841281
@@ -574,12 +574,12 @@ llibrary
 
 
 
 
 
 
-projecte|等价交换重制版 (ProjectE)|1109380
 
 
-customthings|自定义物品 (CustomThings)
+@redpower2-core|红石力量2 (RedPower2)|71843
 
 
+applied-energistics-2@ae2|应用能源2*|798231
 automagy|自动化魔法*
 automagy|自动化魔法*
-minefantasy2|我的幻想2 (MineFantasy2)
+
 environmental-tech@|环境科技*|644622
 environmental-tech@|环境科技*|644622
 
 
 magic-cookies|魔法饼干*|710008
 magic-cookies|魔法饼干*|710008
@@ -613,7 +613,7 @@ worldeditcui||1013295¨worldeditcui-fabric||1013295
 ztones
 ztones
 
 
 dummycore¨dummycore-unofficial
 dummycore¨dummycore-unofficial
-extra-utilities|更多实用设备*|868981
+extra-utilities|更多实用设备*|377817
 openmodslib|开放式模组库 (OpenModsLib)
 openmodslib|开放式模组库 (OpenModsLib)
 embers|余烬*
 embers|余烬*
 neat|极简血量显示* - Forge|938958¨neat-fabric-quilt|极简血量显示 (Neat) - Fabric & Quilt|938958¨@neat|极简血量显示 (Neat)|938958
 neat|极简血量显示* - Forge|938958¨neat-fabric-quilt|极简血量显示 (Neat) - Fabric & Quilt|938958¨@neat|极简血量显示 (Neat)|938958
@@ -832,7 +832,7 @@ re-zero-kara-hajimeru-isekai-seikatsu|RE:从零开始的异世界 (Re: Zero kara
 minewatch||730508
 minewatch||730508
 thaumcraft-inventory-scanning|神秘时代物品栏扫描*
 thaumcraft-inventory-scanning|神秘时代物品栏扫描*
 cyclic|循环*|648189
 cyclic|循环*|648189
-
+chisel|凿子*|641383
 redstoneplusplus|红石++ (Redstone++)
 redstoneplusplus|红石++ (Redstone++)
 ctm|连接纹理 (ConnectedTexturesMod)
 ctm|连接纹理 (ConnectedTexturesMod)
 simulated-nights|夜晚模拟*
 simulated-nights|夜晚模拟*
@@ -1018,7 +1018,7 @@ wrapup
 nuclear-physics
 nuclear-physics
 wither-skeleton-tweaks|凋灵骷髅调整*
 wither-skeleton-tweaks|凋灵骷髅调整*
 heat-and-climate|热量与气候*
 heat-and-climate|热量与气候*
-
+customthings|自定义物品 (CustomThings)
 exgregilo|格雷矿筛 (ExGregilo)
 exgregilo|格雷矿筛 (ExGregilo)
 placebo
 placebo
 plants
 plants
@@ -1027,7 +1027,7 @@ chinjufumod|镇守府 (ChinjufuMod +JapaneseBlock)|776626
 track-api
 track-api
 immersive-railroading|沉浸铁路*|783016
 immersive-railroading|沉浸铁路*|783016
 
 
-custom-main-menu|自定义主菜单*|769607
+
 
 
 wildycraft||526348
 wildycraft||526348
 
 
@@ -1050,7 +1050,7 @@ biobomb|生物炸弹 (BioBomb)|785148
 ender-hopper|末影漏斗*|784833
 ender-hopper|末影漏斗*|784833
 mine-souls|黑魂战斗*|683570
 mine-souls|黑魂战斗*|683570
 radixcore
 radixcore
-dlt2|动态蓄水槽 (Dynamic Liquid Tanks)
+
 familiar-fauna|熟悉的动物*|785558
 familiar-fauna|熟悉的动物*|785558
 
 
 tinkers-tool-leveling|匠魂工具升级 (Tinkers' Tool Leveling)|646118
 tinkers-tool-leveling|匠魂工具升级 (Tinkers' Tool Leveling)|646118
@@ -1068,7 +1068,7 @@ spawncontroller|自定义怪物生成 (SpawnController)|786558
 wearable-backpacks|可穿戴背包*|664777
 wearable-backpacks|可穿戴背包*|664777
 heart-drop|生命汲取*
 heart-drop|生命汲取*
 omlib|开放式炮台库 (OMLib)
 omlib|开放式炮台库 (OMLib)
-
+dynamictrees|动态的树/有活力的树 (Dynamic Trees)|771545
 merry-christmas|圣诞箱子 (Merry Christmas!)|786210
 merry-christmas|圣诞箱子 (Merry Christmas!)|786210
 cloud-control|可控制的云*|785903
 cloud-control|可控制的云*|785903
 zombie-ore|矿石僵尸 (Zombie ore)|786883
 zombie-ore|矿石僵尸 (Zombie ore)|786883
@@ -1183,22 +1183,22 @@ infinity-item-editor|无尽物品编辑器*|791937
 extra-rails|更多功能铁轨*|607938
 extra-rails|更多功能铁轨*|607938
 gregtania
 gregtania
 origin
 origin
-minecraft-transport-simulator@immersive-vehicles|沉浸车辆 (Immersive Vehicles)
+minecraft-transport-simulator@immersive-vehicles|沉浸车辆 (Immersive Vehicles)|946737
 chest-transporter|搬箱器*|467680
 chest-transporter|搬箱器*|467680
 i18nupdatemod@|自动汉化更新 (I18nUpdateMod)|1424533
 i18nupdatemod@|自动汉化更新 (I18nUpdateMod)|1424533
 realistic-item-drops|真实物品掉落*
 realistic-item-drops|真实物品掉落*
 pixelmon|像素精灵宝可梦 重铸*|291020
 pixelmon|像素精灵宝可梦 重铸*|291020
-controlling|键位冲突显示* - Forge/Fabric版|713187¨controlling-for-fabric|键位冲突显示 (Controlling) - Fabric|713187
+@controlling|键位冲突显示 (Controlling)|713187
 
 
 
 
 simpleleather|腐肉烧皮革 (SimpleLeather)|660382
 simpleleather|腐肉烧皮革 (SimpleLeather)|660382
 sync|克隆*|300110
 sync|克隆*|300110
 chiseled-me|超级变变变*
 chiseled-me|超级变变变*
 progressive-automation-early-miner|进阶自动化 (Progressive Automation)
 progressive-automation-early-miner|进阶自动化 (Progressive Automation)
-matmos|真实环境音效 (MAtmos)
+matmos|真实环境音效 (MAtmos)|805720
 ye-olde-tanks|水箱*
 ye-olde-tanks|水箱*
 improving-minecraft|改善的世界*
 improving-minecraft|改善的世界*
-wawla|Wawla高亮显示 (What Are We Looking At)
+wawla@|Wawla高亮显示 (What Are We Looking At)
 lightarea|点亮区域 (LightArea)|806149
 lightarea|点亮区域 (LightArea)|806149
 @replaymod|录像回放 (Replay Mod)|952909
 @replaymod|录像回放 (Replay Mod)|952909
 stellar-sky|群星璀璨*|502403
 stellar-sky|群星璀璨*|502403
@@ -1207,7 +1207,7 @@ nei-addons|NEI扩充 (NEI Addons)
 cucumber@
 cucumber@
 hunting-dimension|狩猎维度*|800351
 hunting-dimension|狩猎维度*|800351
 runes-of-wizardry|符文魔法 (Runes-of-Wizardry)
 runes-of-wizardry|符文魔法 (Runes-of-Wizardry)
-dynamictrees|动态的树/有活力的树 (Dynamic Trees)|771545
+
 coffee-workshop|咖啡工坊*|808472
 coffee-workshop|咖啡工坊*|808472
 in-game-account-switcher@|游戏内账号切换 (In-Game Account Switcher)|1211916
 in-game-account-switcher@|游戏内账号切换 (In-Game Account Switcher)|1211916
 consecration@|圣化*|849160
 consecration@|圣化*|849160
@@ -1237,7 +1237,7 @@ dragontech|龙之科技/龙鳞实验版 (DragonTech/Dragon Scales EX)
 gravityfalls-mod|怪诞小镇 (Gravity Falls)
 gravityfalls-mod|怪诞小镇 (Gravity Falls)
 tfcbotania|TFC植物魔法 (TFCBotania)
 tfcbotania|TFC植物魔法 (TFCBotania)
 no-recipe-guide|没有合成指南*|811530
 no-recipe-guide|没有合成指南*|811530
-takumi-craft|爬行者世界/苦力怕世界* - curseforge上的原贴,现已删除¨takumicraft|爬行者世界/苦力怕世界 (Takumi Craft) - 新贴
+takumi-craft|爬行者世界/苦力怕世界* - curseforge上的原贴,现已删除¨takumicraft|爬行者世界/苦力怕世界 (Takumi Craft) - 新贴,现已失效
 the-mists-of-riov|神秘世界 (The Mists of RioV Mod)
 the-mists-of-riov|神秘世界 (The Mists of RioV Mod)
 
 
 nsr-no-respawn-screen|无重生屏幕 (No Respawn Screen)|793776
 nsr-no-respawn-screen|无重生屏幕 (No Respawn Screen)|793776
@@ -1266,7 +1266,7 @@ refraction|折射*
 librarianlib|图书馆 (LibrarianLib)
 librarianlib|图书馆 (LibrarianLib)
 creeper-confetti@|烟花苦力怕*|775377
 creeper-confetti@|烟花苦力怕*|775377
 funnels|液体漏斗*
 funnels|液体漏斗*
-advent-of-ascension-nevermine@adventofascension|虚无世界 (Nevermine)|325420
+advent-of-ascension-nevermine@adventofascension|虚无世界 (Nevermine)|290532
 toroquest|托罗探索 (Toro Quest)|818183
 toroquest|托罗探索 (Toro Quest)|818183
 
 
 rikmulds-core-mod
 rikmulds-core-mod
@@ -1287,7 +1287,7 @@ mobdrops|更多掉落 (MobDrops)
 states|城邦*|819991
 states|城邦*|819991
 modular-machinery|模块化机械*
 modular-machinery|模块化机械*
 compositegear|复合齿轮/复合装甲 (Composite Gear)
 compositegear|复合齿轮/复合装甲 (Composite Gear)
-kiwi¨kiwi-fabric
+kiwi¨kiwi-fabric¨@kiwi
 cuisine|料理工艺 🍳 (Cuisine 🍳)|821999
 cuisine|料理工艺 🍳 (Cuisine 🍳)|821999
 world-control|世界控制*
 world-control|世界控制*
 
 
@@ -1328,7 +1328,7 @@ shields-plus|更多盾牌*
 ghost-buster
 ghost-buster
 culinary-construct@|自定义三明治*
 culinary-construct@|自定义三明治*
 armoreablemobs|怪物装备自定义 (ArmoreableMobs)
 armoreablemobs|怪物装备自定义 (ArmoreableMobs)
-gem-buffs-infinite-potion-effects|宝石效果/增益宝石 (Gem Buffs)
+
 
 
 advanced-inventory
 advanced-inventory
 
 
@@ -1390,7 +1390,7 @@ patchouli|帕秋莉手册* - Forge¨patchouli-fabric|帕秋莉手册 (Patchouli)
 gases-framework
 gases-framework
 ranged-pumps|范围泵*|668293
 ranged-pumps|范围泵*|668293
 bagginses|背包*|628505
 bagginses|背包*|628505
-ic2-classic|工业时代2经典版 (IC2 Classic)|1407663
+
 
 
 cubicworldgen
 cubicworldgen
 rally-health
 rally-health
@@ -1407,7 +1407,7 @@ sound-physics-fabric|物理声效 (Sound Physics)|676189
 plethora-peripherals
 plethora-peripherals
 simple-flight|简单的飞行*|374613
 simple-flight|简单的飞行*|374613
 factory-tech|工厂科技 (FactoryTech)
 factory-tech|工厂科技 (FactoryTech)
-block-renderer¨blockrenderer
+
 
 
 mysticallib
 mysticallib
 crissaegrim
 crissaegrim
@@ -1423,7 +1423,7 @@ u-team-core
 ftb-quests|FTB任务 (FTB Quests) - Forge|849746¨ftb-quests-fabric|FTB任务 (FTB Quests) - Fabric|849746
 ftb-quests|FTB任务 (FTB Quests) - Forge|849746¨ftb-quests-fabric|FTB任务 (FTB Quests) - Fabric|849746
 texfix|材质修复 (TexFix)|771588
 texfix|材质修复 (TexFix)|771588
 mapmakers-gadgets|地图作者小帮手 (Mapmaker's Gadgets)
 mapmakers-gadgets|地图作者小帮手 (Mapmaker's Gadgets)
-travellers-gear|旅者之器 (Traveller's Gear)
+
 ceramics|陶瓷器*
 ceramics|陶瓷器*
 slashblade-japanese-addon-pack|拔刀剑日系附属包 (SlashBlade Japanese Addon Pack)|1230741
 slashblade-japanese-addon-pack|拔刀剑日系附属包 (SlashBlade Japanese Addon Pack)|1230741
 
 
@@ -1538,7 +1538,7 @@ just-enough-energistics-jee
 ironman|钢铁侠 (IronMan)
 ironman|钢铁侠 (IronMan)
 chunk-animator|区块加载动画*
 chunk-animator|区块加载动画*
 craftstudio-api
 craftstudio-api
-
+travellers-gear|旅者之器 (Traveller's Gear)
 fisks-superheroes-2|菲斯克的超级英雄 (Fisk's Superheroes)|806138
 fisks-superheroes-2|菲斯克的超级英雄 (Fisk's Superheroes)|806138
 
 
 aiot-botania|植物魔法全能工具 (AIOT Botania)
 aiot-botania|植物魔法全能工具 (AIOT Botania)
@@ -1744,7 +1744,7 @@ giacomos-fishing-net
 the-hospital-mod|医院Mod*|873210¨hospital-mod-facilities-pack|医院Mod (The Hospital Mod) - 设施包1.12.2|873210¨hospital-mod-theatres-pack|医院Mod (The Hospital Mod) - 墙壁和地板包1.12.2|873210¨hospital-mod-pharmacy-pack|医院Mod (The Hospital Mod) - 药房设施包1.12.2,1.14.4|873210
 the-hospital-mod|医院Mod*|873210¨hospital-mod-facilities-pack|医院Mod (The Hospital Mod) - 设施包1.12.2|873210¨hospital-mod-theatres-pack|医院Mod (The Hospital Mod) - 墙壁和地板包1.12.2|873210¨hospital-mod-pharmacy-pack|医院Mod (The Hospital Mod) - 药房设施包1.12.2,1.14.4|873210
 more-charcoal|更多木炭*
 more-charcoal|更多木炭*
 born-in-a-barn
 born-in-a-barn
-
+aqua-acrobatics|水游技艺*
 better-animations-collection@|更好的动物动作*
 better-animations-collection@|更好的动物动作*
 
 
 quality-tools|工具品质*
 quality-tools|工具品质*
@@ -1753,7 +1753,7 @@ pollutant-pump|污染泵*
 infinite-pollution-filter|无限污染过滤器*
 infinite-pollution-filter|无限污染过滤器*
 jei-hider
 jei-hider
 fastflyblockbreaking|飞行速破 (Fast Fly Block Breaking)
 fastflyblockbreaking|飞行速破 (Fast Fly Block Breaking)
-
+exhausted-stamina|竭力攻击*
 planttech-2|植物科技2 (PlantTech 2)|905616
 planttech-2|植物科技2 (PlantTech 2)|905616
 toast-control|消息框控制*
 toast-control|消息框控制*
 
 
@@ -1774,7 +1774,7 @@ up-and-down-and-all-around|颠倒世界*
 lost-souls@|失落的灵魂*
 lost-souls@|失落的灵魂*
 intelligent-energistics|智能能源*
 intelligent-energistics|智能能源*
 ender-compass|末影指南针*|785069
 ender-compass|末影指南针*|785069
-
+ic2-tweaker
 thaumic-gadgets|神秘宝具*
 thaumic-gadgets|神秘宝具*
 multi-mine|多人开采*
 multi-mine|多人开采*
 extra-foam-for-liteloader|Liteloader修复 (Extra Foam For LiteLoader)|982739
 extra-foam-for-liteloader|Liteloader修复 (Extra Foam For LiteLoader)|982739
@@ -1797,7 +1797,7 @@ touhou-little-maid|车万女仆*|882845
 
 
 eureka
 eureka
 lazy-ae2|懒人AE2 (Lazy AE2)
 lazy-ae2|懒人AE2 (Lazy AE2)
-
+libnine
 equaldragons
 equaldragons
 berries
 berries
 infinity-gauntlet-mod|无限手套 (Infinity Gauntlet)
 infinity-gauntlet-mod|无限手套 (Infinity Gauntlet)
@@ -1810,7 +1810,7 @@ the-ultimate-dimension|究极次元*|885906
 advanced-mortars|更好的研钵*
 advanced-mortars|更好的研钵*
 
 
 crafttweaker-utils
 crafttweaker-utils
-
+atum|阿图姆:沙漠之旅/亚图姆:金沙之旅 (Atum 2: Return to the Sands)|1207987
 
 
 fps-reducer|FPS减速器 (FPS Reducer)
 fps-reducer|FPS减速器 (FPS Reducer)
 freelook|自由视角 (FreeLook)
 freelook|自由视角 (FreeLook)
@@ -1930,7 +1930,7 @@ damage-control|伤害控制*
 prestige|成就点*
 prestige|成就点*
 
 
 yukarilib
 yukarilib
-energy-converters|能量桥接器*
+
 signpost|路标*
 signpost|路标*
 diagonal-panes|对角线玻璃板*
 diagonal-panes|对角线玻璃板*
 forgelin
 forgelin
@@ -2094,7 +2094,7 @@ healing-campfire|治愈营火* - Forge¨healing-campfire-fabric|治愈营火 (He
 jetif|物品丢入流体 (Just Enough Throwing In Fluids)
 jetif|物品丢入流体 (Just Enough Throwing In Fluids)
 rftools-base@|RF工具:基础 (RFTools Base)
 rftools-base@|RF工具:基础 (RFTools Base)
 flopper|流体漏斗*
 flopper|流体漏斗*
-exhausted-stamina|竭力攻击*
+
 staminaplus|耐力值 (StaminaPlus)
 staminaplus|耐力值 (StaminaPlus)
 enhanced-armaments|增强装备*|898546
 enhanced-armaments|增强装备*|898546
 spatialcompat|空间兼容 (SpatialCompat)
 spatialcompat|空间兼容 (SpatialCompat)
@@ -2284,7 +2284,7 @@ mahou-tsukai@|魔法使*|929252
 moar-tinkers
 moar-tinkers
 baubley-heart-canisters|心之容器*|795294
 baubley-heart-canisters|心之容器*|795294
 jaopcasingularities|JAOPCA的奇点 (JAOPCA Singularities)|958964
 jaopcasingularities|JAOPCA的奇点 (JAOPCA Singularities)|958964
-
+energy-converters|能量桥接器*
 
 
 
 
 
 
@@ -2301,8 +2301,8 @@ incorporeal|幻想多媒体*
 amun-ra
 amun-ra
 
 
 mysterious-mountain-lib|妖怪之山通用库 (MysteriousMountainLib)
 mysterious-mountain-lib|妖怪之山通用库 (MysteriousMountainLib)
-
-
+loottweaker
+rediscovered|特性重现*|359096
 kitchen-mod|厨房 (The Kitchen Mod)|295019
 kitchen-mod|厨房 (The Kitchen Mod)|295019
 
 
 baubles-reborn|饰品栏重置版*
 baubles-reborn|饰品栏重置版*
@@ -2322,7 +2322,7 @@ spartan-and-fire|斯巴达之冰与火 (Spartan and Fire)
 beacons-for-all¨beacons-for-all-fabric¨@beacons-for-all
 beacons-for-all¨beacons-for-all-fabric¨@beacons-for-all
 
 
 more-flowers|更多功能花*
 more-flowers|更多功能花*
-
+enchanting-with-thaumcraft|神秘附魔学*
 buzzier-bees
 buzzier-bees
 
 
 lollipop|棒棒糖*
 lollipop|棒棒糖*
@@ -2331,7 +2331,7 @@ thaumic-restoration|神秘复辟*
 
 
 
 
 primal-boat|原始船舶*
 primal-boat|原始船舶*
-
+eyes-in-the-darkness
 thaumic-augmentation|神秘进阶*|1063250
 thaumic-augmentation|神秘进阶*|1063250
 lost-magic|失落的魔法*
 lost-magic|失落的魔法*
 thaumic-arcana
 thaumic-arcana
@@ -2441,7 +2441,7 @@ gottschcore
 not-enough-crashes|崩溃优化* - Fabric|1097535¨not-enough-crashes-forge|崩溃优化 (Not Enough Crashes) - Forge|1097535¨@notenoughcrashes|崩溃优化 (Not Enough Crashes)|1097535
 not-enough-crashes|崩溃优化* - Fabric|1097535¨not-enough-crashes-forge|崩溃优化 (Not Enough Crashes) - Forge|1097535¨@notenoughcrashes|崩溃优化 (Not Enough Crashes)|1097535
 crash-to-main-menu|崩溃返回主菜单*
 crash-to-main-menu|崩溃返回主菜单*
 tinkers-jei
 tinkers-jei
-loottweaker
+
 better-questing-quest-book|更好的任务-任务书 (Better Questing - Quest Book)
 better-questing-quest-book|更好的任务-任务书 (Better Questing - Quest Book)
 engineers-doors|工程师的门 (Engineer's Doors)
 engineers-doors|工程师的门 (Engineer's Doors)
 tps-generator|TPS发电机 (TPS Generator)
 tps-generator|TPS发电机 (TPS Generator)
@@ -2464,7 +2464,7 @@ moddirector
 function-api
 function-api
 targetingapi
 targetingapi
 re-targetingapi
 re-targetingapi
-libnine
+
 dominionlib
 dominionlib
 
 
 endergetic|末地拓展 (The Endergetic Expansion)
 endergetic|末地拓展 (The Endergetic Expansion)
@@ -2554,7 +2554,7 @@ bloomful
 pick-pocketer|扒手*
 pick-pocketer|扒手*
 terraforged||1157666
 terraforged||1157666
 rad-metabolosis
 rad-metabolosis
-mmd-orespawn
+
 tragicmc3|悲惨世界3 (TragicMC 3)|1233212
 tragicmc3|悲惨世界3 (TragicMC 3)|1233212
 
 
 not-enough-rtgs|更多RTG (Not Enough RTGs)
 not-enough-rtgs|更多RTG (Not Enough RTGs)
@@ -2723,7 +2723,7 @@ nocurse|不诅咒 (NoCurse)|1066483
 pretty-beaches||1113121¨pretty-beaches-fabric||1113121
 pretty-beaches||1113121¨pretty-beaches-fabric||1113121
 qing_gong|轻功 (qing_gong)|1065957
 qing_gong|轻功 (qing_gong)|1065957
 remnants|腐败*
 remnants|腐败*
-rediscovered|特性重现*|359096
+
 pane-in-the-glass
 pane-in-the-glass
 dynamic-dynamos|能源炉动画*
 dynamic-dynamos|能源炉动画*
 trophy-slots
 trophy-slots
@@ -2784,7 +2784,7 @@ mekanism-fluxified|“通量”机械*
 stepup|平滑自动上坡 (StepUp)
 stepup|平滑自动上坡 (StepUp)
 @sodium|钠 (Sodium)|1079347¨sodium|钠*|1079347
 @sodium|钠 (Sodium)|1079347¨sodium|钠*|1079347
 
 
-netherlicious||1104913
+
 yungs-better-mineshafts-forge|YUNG的矿井优化 (YUNG's Better Mineshafts) - Forge¨yungs-better-mineshafts-fabric|YUNG的矿井优化 (YUNG's Better Mineshafts) - Fabric¨@yungs-better-mineshafts|YUNG的矿井优化 (YUNG's Better Mineshafts)
 yungs-better-mineshafts-forge|YUNG的矿井优化 (YUNG's Better Mineshafts) - Forge¨yungs-better-mineshafts-fabric|YUNG的矿井优化 (YUNG's Better Mineshafts) - Fabric¨@yungs-better-mineshafts|YUNG的矿井优化 (YUNG's Better Mineshafts)
 terrible-chest|可怕的箱子/可怖箱子*|922554
 terrible-chest|可怕的箱子/可怖箱子*|922554
 spartan-shields|斯巴达之盾*|672959
 spartan-shields|斯巴达之盾*|672959
@@ -2819,7 +2819,7 @@ crash-utilities
 eldritch-mobs
 eldritch-mobs
 farmers-delight@|农夫乐事 (Farmer's Delight) - Forge¨farmers-delight-fabric@|农夫乐事 (Farmer's Delight) - Fabric
 farmers-delight@|农夫乐事 (Farmer's Delight) - Forge¨farmers-delight-fabric@|农夫乐事 (Farmer's Delight) - Fabric
 artifacts|奇异饰品* - Forge¨artifacts-fabric|奇异饰品 (Artifacts) - Fabric¨@artifacts|奇异饰品 (Artifacts)
 artifacts|奇异饰品* - Forge¨artifacts-fabric|奇异饰品 (Artifacts) - Fabric¨@artifacts|奇异饰品 (Artifacts)
-mechanized-steam-power|机械化蒸汽动力*
+
 dynamictreestfc|动态的树:群峦传说附属 (Dynamic Trees-TFC)
 dynamictreestfc|动态的树:群峦传说附属 (Dynamic Trees-TFC)
 
 
 dynamic-trees-the-twilight-forest|动态的树:暮色森林附属 (Dynamic Trees-The Twilight Forest)
 dynamic-trees-the-twilight-forest|动态的树:暮色森林附属 (Dynamic Trees-The Twilight Forest)
@@ -2843,7 +2843,7 @@ survival-utilities|生存工具*
 slashblade|拔刀剑 (SlashBlade)|726664
 slashblade|拔刀剑 (SlashBlade)|726664
 portal-blocks-2-0|传送门方块 (Portal Blocks)|1077770
 portal-blocks-2-0|传送门方块 (Portal Blocks)|1077770
 slimecraft-add-tools-etc
 slimecraft-add-tools-etc
-
+mechanized-steam-power|机械化蒸汽动力*
 moreswordonline|动漫神域 (SwordCraftOnline)
 moreswordonline|动漫神域 (SwordCraftOnline)
 camera-mod|照相机*|1162901
 camera-mod|照相机*|1162901
 heartdrops|生命汲取 (Heart Drops)
 heartdrops|生命汲取 (Heart Drops)
@@ -2860,7 +2860,7 @@ project-red-illumination|红石计划:照明 (Project Red - Illumination)¨pro
 project-red-world|红石计划:探索 (Project Red - World)
 project-red-world|红石计划:探索 (Project Red - World)
 project-red-compat|红石计划:兼容性 (Project Red - Compat)
 project-red-compat|红石计划:兼容性 (Project Red - Compat)
 canvas-renderer|Canvas渲染器*|1211675¨@canvas|Canvas渲染器 (Canvas Renderer)|1211675
 canvas-renderer|Canvas渲染器*|1211675¨@canvas|Canvas渲染器 (Canvas Renderer)|1211675
-
+custom-main-menu|自定义主菜单*|769607
 coolfood|冷饮 (CoolFood)
 coolfood|冷饮 (CoolFood)
 infinitevillagertrading@|无限村民交易 (InfiniteVillagerTrading)
 infinitevillagertrading@|无限村民交易 (InfiniteVillagerTrading)
 infinite-trading|无限交易* - Forge¨infinite-trading-fabric|无限交易 (Infinite Trading) - Fabric¨@infinite-trading|无限交易 (Infinite Trading)
 infinite-trading|无限交易* - Forge¨infinite-trading-fabric|无限交易 (Infinite Trading) - Fabric¨@infinite-trading|无限交易 (Infinite Trading)
@@ -2908,7 +2908,7 @@ drcyanos-lootable-bodies|可拾取尸体 (DrCyano's Lootable Bodies)|406482
 simply-cats
 simply-cats
 pams-harvestcraft-2-crops|潘马斯农场2 - 作物 (Pam's HarvestCraft 2 - Crops)|1000336
 pams-harvestcraft-2-crops|潘马斯农场2 - 作物 (Pam's HarvestCraft 2 - Crops)|1000336
 base-metals|基础金属*
 base-metals|基础金属*
-
+mmd-orespawn
 mmdlib
 mmdlib
 just-poop-mod|屎! (Poop Mod!)
 just-poop-mod|屎! (Poop Mod!)
 costumes|服装*
 costumes|服装*
@@ -2932,7 +2932,7 @@ pams-harvestcraft-2-food-extended|潘马斯农场2 - 食物拓展 (Pam's Harvest
 pams-harvestcraft-2-trees|潘马斯农场2 - 果树 (Pam's HarvestCraft 2 - Trees)|1000336
 pams-harvestcraft-2-trees|潘马斯农场2 - 果树 (Pam's HarvestCraft 2 - Trees)|1000336
 minecart-direction-follow¨better-minecart-rotation-forge
 minecart-direction-follow¨better-minecart-rotation-forge
 modern-metals|现代金属*
 modern-metals|现代金属*
-
+block-renderer¨blockrenderer
 blockus
 blockus
 conjurers-cookbook
 conjurers-cookbook
 color-unchained
 color-unchained
@@ -2955,7 +2955,7 @@ lambdynamiclights@|Lambda的动态光源 (LambDynamicLights)|1082100
 realistic-torches|真实火把*|566201
 realistic-torches|真实火把*|566201
 
 
 durability-viewer|耐久显示器*|1086168
 durability-viewer|耐久显示器*|1086168
-
+netherlicious||1104913
 
 
 
 
 ground-item-highlighting|地面物品高光显示*|1084931
 ground-item-highlighting|地面物品高光显示*|1084931
@@ -2976,7 +2976,7 @@ packagedexcrafting|封包合成拓展 (PackagedExCrafting)
 
 
 compactstorage|紧凑存储 (compactstorage)
 compactstorage|紧凑存储 (compactstorage)
 useful-backpacks|实用背包*
 useful-backpacks|实用背包*
-@conquest-reforged|征服者 (ConquestReforged)|1431287
+conquest-reforged|征服者 (ConquestReforged)|1431287
 steelseries-gamesense
 steelseries-gamesense
 pizzaatimes-timber-mod
 pizzaatimes-timber-mod
 tellme
 tellme
@@ -3059,7 +3059,7 @@ entity-culling|实体渲染机制优化*
 hammerandvil|锻造锤与锤锻台 (HammerAndVil)
 hammerandvil|锻造锤与锤锻台 (HammerAndVil)
 
 
 simply-backpacks|简易背包*
 simply-backpacks|简易背包*
-@mermod
+mermod-fabric¨mermod-forge|Mermod / Mermaid Tail Mod - 1.19.2~1.18.2 Forge版本
 better-placement|更好的放置*|730136
 better-placement|更好的放置*|730136
 fat-cat|大资本家*
 fat-cat|大资本家*
 waystones2waypoints|传送石碑路径点 (Waystones2Waypoints)
 waystones2waypoints|传送石碑路径点 (Waystones2Waypoints)
@@ -3143,7 +3143,7 @@ demagnetize|消磁*
 
 
 
 
 
 
-
+controlling|键位冲突显示* - Forge/Fabric版|713187¨controlling-for-fabric|键位冲突显示 (Controlling) - Fabric|713187
 cinderscapes|余烬奇景*
 cinderscapes|余烬奇景*
 tfc-homestead
 tfc-homestead
 tfctinkers|群峦与匠魂 (TFC Tinkers)
 tfctinkers|群峦与匠魂 (TFC Tinkers)
@@ -3190,7 +3190,7 @@ ambience-extras|环境音乐:附加 (Ambience - Extras)
 additions-mod
 additions-mod
 extracpus|更多CPU (Extra CPUs)
 extracpus|更多CPU (Extra CPUs)
 extra-crafting-storage
 extra-crafting-storage
-conquest-reforged|征服者 (ConquestReforged)|1431287
+@conquest-reforged|征服者 (ConquestReforged)|1431287
 underground-city-engineering@|地下城市工程*|943842
 underground-city-engineering@|地下城市工程*|943842
 essentials
 essentials
 soul-shards-respawn
 soul-shards-respawn
@@ -3246,7 +3246,7 @@ randompatches-integration
 bubble-column-elevator-backport|1.13水域机制 (1.13 Water Mechanics)
 bubble-column-elevator-backport|1.13水域机制 (1.13 Water Mechanics)
 basic-nether-ores|基础下界矿石*|1136294
 basic-nether-ores|基础下界矿石*|1136294
 nuclearcraft-reactor-builder|核电工艺反应堆建造机 (NuclearCraft Reactor Builder)
 nuclearcraft-reactor-builder|核电工艺反应堆建造机 (NuclearCraft Reactor Builder)
-pams-harvestcraft-2-food-core|潘马斯农场2 - 食物核心 (Pam's HarvestCraft 2 - Food Core)|1000336
+pams-harvestcraft-2-food-core|潘马斯农场2 - 食物核心 (Pam's HarvestCraft 2 - Food Core)|1313245
 eki-lib
 eki-lib
 
 
 nodami|伤害免疫机制移除 (No Damage Immunity)
 nodami|伤害免疫机制移除 (No Damage Immunity)
@@ -3265,7 +3265,7 @@ devtech|GTCEu-CrT开发套件*
 jurassic-world-reborn-mod|侏罗纪世界重生*
 jurassic-world-reborn-mod|侏罗纪世界重生*
 
 
 cardboard@
 cardboard@
-enchanting-with-thaumcraft|神秘附魔学*
+
 crimson-revelations|血腥启示 (Crimson Revelation)
 crimson-revelations|血腥启示 (Crimson Revelation)
 environmental-core@
 environmental-core@
 bigger-crafting-tables
 bigger-crafting-tables
@@ -3303,7 +3303,7 @@ suspended-server|挂起服务器*
 starlight@|星光* - Fabric|1216316¨starlight-forge@|星光 (Starlight) - Forge|1216316
 starlight@|星光* - Fabric|1216316¨starlight-forge@|星光 (Starlight) - Forge|1216316
 research-table|研究台 🔬 (Research Table 🔬)|871188
 research-table|研究台 🔬 (Research Table 🔬)|871188
 shoulder-surfing-reloaded|越肩视角重制*|985499
 shoulder-surfing-reloaded|越肩视角重制*|985499
-aqua-acrobatics|水游技艺*
+
 silents-mechanisms|寂静机械 (Silent Mechanisms)
 silents-mechanisms|寂静机械 (Silent Mechanisms)
 project-potman|背锅人计划 (ProjectPotman)
 project-potman|背锅人计划 (ProjectPotman)
 nbt-crafting@|数据包NBT合并*
 nbt-crafting@|数据包NBT合并*
@@ -3358,7 +3358,7 @@ vanilla-hammers|原版材质锤* - Fabric¨vanilla-hammers-forge|原版材质锤
 imblocker|输入法冲突修复 (IMBlocker)|935619
 imblocker|输入法冲突修复 (IMBlocker)|935619
 hardcore-map-reset
 hardcore-map-reset
 tfc-aged-drinks|群峦陈酿 (TFC Aged Drinks)
 tfc-aged-drinks|群峦陈酿 (TFC Aged Drinks)
-buildcraft-rf
+
 youtubers-lucky-blocks|Youtuber的幸运方块 (Youtuber's Lucky Blocks)
 youtubers-lucky-blocks|Youtuber的幸运方块 (Youtuber's Lucky Blocks)
 wandering-trapper|流浪猎人*
 wandering-trapper|流浪猎人*
 chocolate-fix
 chocolate-fix
@@ -3757,7 +3757,7 @@ loading-timer@|加载时长显示*
 ocrocketry
 ocrocketry
 chime-fabric@chime
 chime-fabric@chime
 witherite@|凋灵合金*
 witherite@|凋灵合金*
-mermod-fabric¨mermaid-tail-mod|人鱼尾*¨mermod-forge|Mermod / Mermaid Tail Mod - 1.19.2~1.18.2 Forge版本
+mermaid-tail-mod|人鱼尾*¨@mermod
 astromine-core|天体矿工:核心 (Astromine: Core)
 astromine-core|天体矿工:核心 (Astromine: Core)
 dungeondq
 dungeondq
 dynamic-trees-integrated-dynamics|动态的树:动态联合/集成动力附属 (Dynamic Trees - Integrated Dynamics)
 dynamic-trees-integrated-dynamics|动态的树:动态联合/集成动力附属 (Dynamic Trees - Integrated Dynamics)
@@ -4085,7 +4085,7 @@ ticktock@servertick
 
 
 fps-reducre-for-fabric|FPS减速器(Fabric) (FPS Reducer (For Fabric))
 fps-reducre-for-fabric|FPS减速器(Fabric) (FPS Reducer (For Fabric))
 art-artillery|艺术?火炮! (Art? Artillery!)
 art-artillery|艺术?火炮! (Art? Artillery!)
-minemenufabric@|我的菜单 Fabric 版 (MineMenuFabric)
+minemenu-refabricated@minemenufabric|我的菜单 Fabric 版 (MineMenuFabric)
 @tabtps
 @tabtps
 @afkpeace¨afkpeace
 @afkpeace¨afkpeace
 
 
@@ -4099,7 +4099,7 @@ searchable-containers|可搜索容器*
 
 
 
 
 integrated-additions|集成扩展*
 integrated-additions|集成扩展*
-matchlock-guns|火绳枪*
+
 fabric-autoswitch@autoswitch|自动切换工具 (AutoSwitch)
 fabric-autoswitch@autoswitch|自动切换工具 (AutoSwitch)
 inventory-profiles-next@|一键背包整理Next*
 inventory-profiles-next@|一键背包整理Next*
 drill|钻头*
 drill|钻头*
@@ -4112,7 +4112,7 @@ village-employment|村庄就业*
 
 
 deathlog@|死亡日志*
 deathlog@|死亡日志*
 automatic-elytra|自动鞘翅*
 automatic-elytra|自动鞘翅*
-axolotl-bucket-fix|美西螈桶修复*
+
 xks-decoration|XK的装饰 (XK's Deco)|1214362
 xks-decoration|XK的装饰 (XK's Deco)|1214362
 endgame-materials-addons|更多终局材料*
 endgame-materials-addons|更多终局材料*
 ravage-and-cabbage
 ravage-and-cabbage
@@ -4556,7 +4556,7 @@ multi-world
 
 
 terralith¨@terralith
 terralith¨@terralith
 overworld-two¨overworld-two-forge
 overworld-two¨overworld-two-forge
-xl-packets|XL数据包 (XL Packets) - Forge¨xl-packets-fabric|XL数据包 (XL Packets) - Fabric
+
 rftools-storage@|RF工具:存储 (RFTools Storage)
 rftools-storage@|RF工具:存储 (RFTools Storage)
 rftools-builder@|RF工具:建造机 (RFTools Builder)
 rftools-builder@|RF工具:建造机 (RFTools Builder)
 
 
@@ -4604,7 +4604,7 @@ morevanillaarmor|更多原版盔甲 (MoreVanillaArmor)
 eternal-tales@
 eternal-tales@
 oh-the-biomes-youll-go-fixes|“你将去的生物群系”修复模组 (Oh The Biomes You'll Go Fixes)
 oh-the-biomes-youll-go-fixes|“你将去的生物群系”修复模组 (Oh The Biomes You'll Go Fixes)
 wild-world
 wild-world
-eyes-in-the-darkness
+
 miskatonic-mysteries¨miskatonic-mysteries-legacy|Miskatonic Mysteries - Forge,未完成且已停更
 miskatonic-mysteries¨miskatonic-mysteries-legacy|Miskatonic Mysteries - Forge,未完成且已停更
 harvesters-night|收割者之夜 (Harvester's Night)
 harvesters-night|收割者之夜 (Harvester's Night)
 slotlock@|锁定槽 (SlotLock)
 slotlock@|锁定槽 (SlotLock)
@@ -4963,7 +4963,7 @@ one-block-forge
 human-reborn
 human-reborn
 @addadd|额外扩展 (Additional Additions)|1427321¨additional-additions|额外扩展* - Fabric|1427321¨additional-additions-forge|额外扩展 (Additional Additions) - Forge|1427321
 @addadd|额外扩展 (Additional Additions)|1427321¨additional-additions|额外扩展* - Fabric|1427321¨additional-additions-forge|额外扩展 (Additional Additions) - Forge|1427321
 earlygame@
 earlygame@
-
+happiness-is-a-warm-gun@
 
 
 kvc-blocks|蛋挞君的原版补全方块篇 (KVCBlocks)|1239534
 kvc-blocks|蛋挞君的原版补全方块篇 (KVCBlocks)|1239534
 enigtech2-util
 enigtech2-util
@@ -5581,7 +5581,7 @@ radium-reforged|镭*
 backpackmod@
 backpackmod@
 
 
 untamedwilds|不羁野性 (Untamed Wilds)|1211422
 untamedwilds|不羁野性 (Untamed Wilds)|1211422
-
+advancements-tracker@|进度追踪器概览 (Advancements Tracker and Overview)
 no-null-processors
 no-null-processors
 
 
 ma-enchants|Ma 附魔*
 ma-enchants|Ma 附魔*
@@ -5952,7 +5952,7 @@ fabricskyboxes@
 @fvt
 @fvt
 blue_skies_tcon
 blue_skies_tcon
 tdv-tweaks
 tdv-tweaks
-ic2-tweaker
+
 picture-in-picture-pip
 picture-in-picture-pip
 guilt-trip
 guilt-trip
 parcool|跑酷! (ParCool!)
 parcool|跑酷! (ParCool!)
@@ -6659,7 +6659,7 @@ astemirs-fireflies
 ender-crop¨@ender-crop
 ender-crop¨@ender-crop
 modupdater
 modupdater
 fivehead
 fivehead
-
+axolotl-bucket-fix|美西螈桶修复*
 attained-drops|可种植掉落物*
 attained-drops|可种植掉落物*
 attained-drops-2|可种植掉落物2*
 attained-drops-2|可种植掉落物2*
 
 
@@ -6823,7 +6823,7 @@ dumplings-delight@|饺子乐事*
 thermal_extra
 thermal_extra
 nether-sky-block@|下界空岛*
 nether-sky-block@|下界空岛*
 arte-magicum
 arte-magicum
-
+tinkers-craft|工匠创意 (Tinkers' Craft)
 ocean-blender|海洋搅拌机 (OceanBlender)
 ocean-blender|海洋搅拌机 (OceanBlender)
 buildcraft-fluxified
 buildcraft-fluxified
 brewin-and-chewin|饮酒作乐 (Brewin' And Chewin')
 brewin-and-chewin|饮酒作乐 (Brewin' And Chewin')
@@ -7815,7 +7815,7 @@ advancedshader|光影前向兼容 (AdvancedShader)
 the-wools|羊毛! (The Wools!)¨@the-wools|羊毛! (The Wools!)
 the-wools|羊毛! (The Wools!)¨@the-wools|羊毛! (The Wools!)
 fabric-enchantments
 fabric-enchantments
 glued
 glued
-tinkers-craft|工匠创意 (Tinkers' Craft)
+
 tinker-leveling
 tinker-leveling
 gtce-tj-edition|格雷科技社区版:TJ版 (GregTech Community Edition: TJ Edition)
 gtce-tj-edition|格雷科技社区版:TJ版 (GregTech Community Edition: TJ Edition)
 upc
 upc
@@ -8090,7 +8090,7 @@ mob-catcher
 
 
 guns-rpg-waystone-addon
 guns-rpg-waystone-addon
 biospheres-fabric|现代生物圈 (Modern Biospheres)
 biospheres-fabric|现代生物圈 (Modern Biospheres)
-better-snowball-fight-2@better-snowball-fight|更好的打雪仗 (Better Snowball Fight)|1323495
+better-snowball-fight-2@better-snowball-fight|更好的打雪仗 (Better Snowball Fight)|1396154
 feathers
 feathers
 brb@|更好的配方书 (Better Recipe Book)
 brb@|更好的配方书 (Better Recipe Book)
 boatoverhaul-forge|行船机制修改 (Boat Overhaul) - Forge¨boatoverhaul-fabric|行船机制修改 (Boat Overhaul) - Fabric
 boatoverhaul-forge|行船机制修改 (Boat Overhaul) - Forge¨boatoverhaul-fabric|行船机制修改 (Boat Overhaul) - Fabric
@@ -8833,7 +8833,7 @@ kubejs-offline|KubeJS离线文档 (KubeJS Offline Documentation)
 
 
 
 
 
 
-advancements-tracker@|进度追踪器概览 (Advancements Tracker and Overview)
+
 memory-settings|内存设置*
 memory-settings|内存设置*
 tiny-item-animations@
 tiny-item-animations@
 more-plates-revamped@|更多金属板重置版*
 more-plates-revamped@|更多金属板重置版*
@@ -9078,7 +9078,7 @@ commandspy
 slimyfloor
 slimyfloor
 daily-dad@|每日冷笑话*¨daily-dad-server@|每日冷笑话 (Daily Dad) - Daily Dad - Server
 daily-dad@|每日冷笑话*¨daily-dad-server@|每日冷笑话 (Daily Dad) - Daily Dad - Server
 good-ending
 good-ending
-
+xl-packets|XL数据包 (XL Packets) - Forge¨xl-packets-fabric|XL数据包 (XL Packets) - Fabric
 creeper-nuggets
 creeper-nuggets
 coherent-villages
 coherent-villages
 
 
@@ -9960,7 +9960,7 @@ enderio-unofficial|末影接口非官方版 (EnderIO Unofficial)
 
 
 dimensional-gravity
 dimensional-gravity
 
 
-happiness-is-a-warm-gun@
+
 bring-color-to-my-skies
 bring-color-to-my-skies
 portal-dungeons
 portal-dungeons
 
 
@@ -10571,7 +10571,7 @@ warrior-rage@
 
 
 pokefood
 pokefood
 armor-souls-reforged
 armor-souls-reforged
-
+matchlock-guns|火绳枪*
 @the-aether-redux|天境:新生代 (The Aether: Redux)
 @the-aether-redux|天境:新生代 (The Aether: Redux)
 @banner||1447687
 @banner||1447687
 staaaaaaaaaaaack@
 staaaaaaaaaaaack@
@@ -11197,4 +11197,377 @@ hunger-reworked
 armor-status-hud-renewed|耐久信息显示:重生 (Armor Status HUD Renewed)
 armor-status-hud-renewed|耐久信息显示:重生 (Armor Status HUD Renewed)
 boblib
 boblib
 placeable-mobs
 placeable-mobs
-potion-blender
+potion-blender
+t6-auto-attack-mod@t6-auto-attack
+forceasciifont-backport
+@vmupdate|VM汉化更新 (VMTranslationUpdate)
+trample-no-more@
+
+directional-damage-indicator
+
+digs-dnd-origins
+superior-flat
+fungal-infection-spore
+@easy-tweak
+
+netherless-quartz
+@maple-api
+@reforged-fabric-api
+caffeinated
+buildcraft-rf
+gilded-ingot
+chatpatches@|聊天补丁 (Chat Patches)
+@burning-furnace
+shadowizardlib@
+ants-unleashed
+@seaborgium
+gold-fish
+pipeplus@
+
+
+deuf-refabricated
+
+runic-items@
+twist|诡变*
+@serverlistbufferfixer
+oil-refinery
+themangonewadvent
+@worthy-food
+
+
+better-nether-continuation|更好的下界延续 (BetterNether Continuing)
+stygian-end-continuation|末地:生物群系扩展延续*
+skill-slots¨skill-slots-fabric
+novam-terram-continuation
+@jade-feet|玉足 (Jade Feet)
+
+cutting-edge
+xp-from-harvest-forked
+
+
+mob-options
+mod-sets@|模组集*
+
+
+hold-that-chunk@
+dark-matter@
+@steal_dogs|偷狗 (Steal Dogs)
+@faster-random
+
+
+simply-steel-continued@
+simple-corinthium
+chidori-origins-collection
+enhancedp2p|增强的P2P (EnhancedP2P)
+custom-de-upgrade-recipes|自定义 DE 升级配方 (Custom DE Upgrade Recipes)
+mode-switch
+better-clouds-forge
+@better-clouds
+@easymapdownload
+
+client-crafting
+anvil-repairing@
+headcrabs
+kubejs-industrial-foregoing
+
+recipe-book-delight@|配方书乐事*
+chest-hoppers
+@gravy-delight
+@ubes-delight
+torcherino-unofficial
+more-bows-and-arrows
+xp-shop
+acclaimed-origins@
+replanter
+zombie-infection-vaccine
+simple-achievements
+achievement-books
+
+invocore-utility-mod
+saljus-quill
+
+derelict
+@charged-charms
+custom-villagers|自定义村民*
+turtlematic
+remove-base-origins
+@cobblemon-delights|方块宝可梦乐事 (Cobblemon Delights)
+redirectionor|异引定址*
+villager-mantle-fix|村民帽子修复*
+rechiseled-create@
+xaeroplus@|Xaero的地图增强 (XaeroPlus)
+cosmetic-nametags@
+thirdlife-rts@
+@real-peaceful-mode|真正的和平模式 (Real Peaceful Mode)
+niftyblocks
+elfs-dark-dimension
+xaeros-minimap-world-map-waystones-compability
+jagms-kiwis@
+@masaadditions
+@improved-trident-enchantments
+mystic-bows
+forgiving-world
+@skillcloaks
+swordinthestone@
+lazy-ae2-patch|懒人AE2补丁 (Lazy AE2 Patch)
+
+yamato-gun-mod@yamato-gun
+
+ars-mage-fight
+
+epicfight-pirates
+kubejs-entity-events-extension
+mc-dungeons-enchantments@
+rei-custom-command
+copperative@|铜心协力*
+growable-storage-cells
+growable-cells-2
+cinchcraft
+day-counter@ag-day-counter
+
+
+
+sculk-redstone-components@sculkredstonecomponents
+toggle-enchantments
+unbreakable-enchantment-forge@unbreakable-enchantment
+immersive-portal-gun@portal-gun|沉浸式传送枪*
+tac-craft-tactical-armor-pack
+@flexible-arms|灵巧双手 (Flexible Arms)
+boat-tweaks
+@effect-descriptions
+@diagonal-windows
+
+illager-invasion@
+
+
+@touhou-origins-blessings
+
+altorigingui@
+dynamic-trees-pams-harvestcraft-2
+dynamic-trees-hexerei
+@minium-stone
+
+@fastrtp
+@tech-decorators|科技装饰商 (Tech Decorators)
+dynamic-trees-ars-nouveau
+
+@kazzmons-magecraft
+@metal-bundles
+
+
+
+
+
+cute-kiwi-birds-new-animal
+moremobheads
+@ouchies
+@traditional-asphalt
+@thaumic_boots
+carpeted-stairs@
+just-enough-archaeology
+bedrock_world
+
+@world-preview
+
+the-five-nights-at-freddys-mod@the-five-nights-at-freddys-mod#all-versions|玩具熊的五夜后宫 (The Five Nights at Freddy's Mod)
+easylan@|自定义LAN局域网联机服务器 (EasyLAN)
+pelagic-prehistory
+@minerally
+better-jukeboxes
+patboxs-brewery@brewery
+
+stackable-stew-and-soup
+mindful-darkness@
+@sbet
+nature-arise@
+
+more-beautiful-torches
+quality-crops
+@individual-keep-inventory
+permanent-sponges@
+hang-glider@
+@auto-twerk
+block-beams@
+adorabuild-structures
+
+moogs-end-structures
+@brew-guide
+@oneclickcrafting
+@genshin-ui
+fenomena-structures@phenomena-structures
+first-join-message
+expansive-weaponry
+wabi-sabi-structures-forge¨wabi-sabi-structures-fabric
+@jobsaddon
+@partyaddon
+
+loading-backgrounds
+cuisine-delight@|料理乐事*
+iron-bookshelves@
+@dimensional-expansion
+danger-close
+hardcore-wither
+get-off-my-lawn-reserved@goml-reserved
+
+dangerousstonecutter@
+normal-damage
+
+crabbers-delight
+slot-cycler
+resource-pack-overrides@
+
+arcane-lanterns
+
+@crashma
+
+blackwolf-library¨blackwolf-library-fabric
+blues-scape-and-run-bosses
+gigeresque
+lookaround
+projectileimmunityfix
+@betterzoom
+@player-visibility
+bag-of-holding-forge@bag-of-holding
+
+
+
+fish-of-thieves@
+qualitys-delight
+arrows-info
+godly-vampirism
+itemlocks
+pick-block-pro@|选择方块专业版*
+skin-and-bones
+@pet-armor
+
+@more-nugget|更多矿物粒 (More Nugget)
+dual-swords@
+organizable-play-screens@
+labelling-containers@
+inventory-pause-forge@
+ready-player-fun
+condensed-creative@
+leaves-us-in-peace@
+yellow-snow@
+no-tnt-griefing@
+monster-plus
+ilmusu-enchantments@ilmusuenchantments
+
+desired-servers@
+attributizer@
+reactive@
+simple-deepslate
+minunrpg
+more-sheep-wools
+maturi-delight@
+
+forgified-fabric-api@
+artisanat
+devmode
+better-trims@bettertrims
+@doggo-mod-overhauled
+traders-nightmare
+command-block-ide@
+
+green-thing-mod
+lmft@
+peripheralium@
+@resource-switcher|资源切换器 (ResourceSwitcher)|1460184
+
+clutter@
+no-enchantment-cap-1-12-2-backport
+
+dimension-viewer@
+@more-food|更多食物 (More Food)
+tfcgyres-orehints
+badstdout@
+
+multiworld-mod
+miaooo
+pipeblocker@
+moa-decor-lights
+craft-saddles-forge-1-16-5
+
+@elytra-fix
+@ho-library
+
+riskofrainmod|雨中冒险 (Risk of Rain Mod)
+
+baddie-mobs-uwu
+beacons-revisioned
+silence-mobs@
+
+utilitix@
+
+tiny-coal@
+replay-mod-for-forge-reborn
+flib
+
+copper-revisioned
+
+fine-tuned-calibration@finetunedcalibration
+third-person-maps@
+carpet-minitweaks@minitweaks
+
+time-in-a-bottle-forge
+seared-ladder-backport@seared-ladder-(backport)
+wall-jumped@
+red-core@
+
+record-days-survived@
+veinminer-companion
+
+@leashable-players
+snowballs-freeze-mobs@
+guinea-pigs
+
+
+vault-research
+the-chaser
+bandaging
+enchanted-charms
+@nether-api
+mother-silverfish
+
+
+little-botanics
+ex-pattern-provider
+@integrated-circuit
+creative-disk
+engineers-construct
+@botools|假人映射 (Botools)
+witch-mobility
+gravestones-die-classy||530045
+
+
+
+@pebbles-begone
+eternal-eats
+zombiegame|僵尸游戏 (Zombie Game)
+effect-overhaul
+
+
+eidolon-patches
+fruity-random-teleport|紫颂果味随机传送*
+pipe-master-2000|管道专家 2000 (Pipe Master 2000 / Pipe Googles)
+@command-macros|命令宏 (Command Macros)
+@shwetro|上海地铁装饰组件 (The Shanghai Wetro Mod)
+
+tactical-aid|战术医疗*
+@clear-enchanting
+fishing-bobber-detector
+
+create-balanced-flight
+brewin-and-chewin-remastered
+cupboard
+mcinstance-loader@
+pre-fish-feed|打窝*
+armor-trim-item-fix@
+waffles-moss
+delightful-cuisine-for-woodheads
+towers-of-the-wild-modded|旷野之息高塔:再重制 (Towers of the Wild Modded)
+
+waffles-terracotta-plaster
+watermedia@
+@inverse-phantoms
+@cactus-storage