diff --git a/.github/workflows/dotnet-desktop.yml b/.github/workflows/dotnet-desktop.yml new file mode 100644 index 0000000..91acc60 --- /dev/null +++ b/.github/workflows/dotnet-desktop.yml @@ -0,0 +1,60 @@ +name: .NET Core Desktop + +on: + push: + paths: + - 'Plain Craft Launcher 2.sln' + - 'Plain Craft Launcher 2/**' + - '.github/workflows/**' + pull_request: + paths: + - 'Plain Craft Launcher 2.sln' + - 'Plain Craft Launcher 2/**' + - '.github/workflows/**' + +jobs: + + build: + + strategy: + matrix: + configuration: [Beta, Debug, Release, ReleaseUpdate] + + runs-on: windows-latest + + env: + Solution_Name: Plain Craft Launcher 2.sln + Wap_Project_Directory: Plain Craft Launcher 2 + Wap_Project_Path: Plain Craft Launcher 2\Plain Craft Launcher 2.vbproj + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # Add MSBuild to the PATH: https://github.com/microsoft/setup-msbuild + - name: Setup MSBuild.exe + uses: microsoft/setup-msbuild@v2 + + # Restore the application to populate the obj folder with RuntimeIdentifiers + - name: Restore the application + run: msbuild $env:Solution_Name /t:Restore /p:Configuration=$env:Configuration + env: + Configuration: ${{ matrix.configuration }} + + # Create the app package by building and packaging the Windows Application Packaging project + - name: Create the app package + run: msbuild $env:Wap_Project_Path /p:Configuration=$env:Configuration /p:UapAppxPackageBuildMode=$env:Appx_Package_Build_Mode /p:AppxBundle=$env:Appx_Bundle + env: + Appx_Bundle: Always + Appx_Bundle_Platforms: x86|x64|ARM|ARM64 + Appx_Package_Build_Mode: StoreUpload + Configuration: ${{ matrix.configuration }} + + # Upload the MSIX package: https://github.com/marketplace/actions/upload-a-build-artifact + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.configuration }} + path: ${{ env.Wap_Project_Directory }}\obj\${{ matrix.configuration }}\Plain Craft Launcher 2.exe \ No newline at end of file diff --git a/.gitignore b/.gitignore index efe225f..06b35b0 100644 --- a/.gitignore +++ b/.gitignore @@ -341,15 +341,4 @@ ASALocalRun/ # BeatPulse healthcheck temp database healthchecksdb -# ------------------------------------------------------------ - -# 包含主题解锁、加密解密等部分的代码 -ModSecret.vb -ModSetup.vb -PageOtherAbout.* -PageOtherTest.* -PageSetupUI.* -# 开发者工具 -ModDevelop.vb -# 不公开底层函数库,以免抄袭 -ModMain.vb +MaskFiles/ diff --git a/LICENCE b/LICENCE index 784dda8..08b1719 100644 --- a/LICENCE +++ b/LICENCE @@ -1,15 +1,21 @@ -本文件不是法律文件或开源协议。 -龙腾猫跃(下文简称为龙猫)承诺在您遵守本文件指引的情况下,不会追究您的法律责任,但裁量您 “是否遵守本文件指引” 的最终权利由龙猫保留。 +本文件仅作为指引您合理使用本存储库内容的指南,不是法律文件或协议。 -1、本存储库中的内容以帮助公共研究为目的而公开。 -2、在没有附加许可的情况下,龙猫仍然对本存储库的内容保留所有权利,故以下所有允许性表述均无法作出永久性保证。 -3、不允许以本存储库的内容作为内容主体创建、发布、传播其衍生作品,且您不可以发布本存储库及其相关作品的修改版。 -4、在满足第 3 款,且在可见位置标注内容来源(即本存储库链接)的前提下,您可以使用或引用本存储库的小部分内容或是其实现思路。 -5、龙猫可能随时修改本文件,且可能不会提前通知。本文件不是法律文件或开源协议,故本文件的修改不构成与您法律关系的改变。 +一、承诺。 +  开发者承诺,在您遵守本指南的情况下,不会追究您的法律责任,但是否遵守的最终裁量权由开发者保留。 +二、若大量使用,则不能分发。 +  如果您再混合、转换、或者基于该存储库创作,除非满足第三款(少量使用),否则您不可以分发修改后的内容。 +三、可少量使用,但必须署名。 +  如果您仅使用了本存储库的少量内容或是实现思路,您必须给出适当的署名,且提供指向本存储库的链接。 +  您可以用任何合理的方式来署名,但是不得以任何方式暗示开发者为您或您的使用背书。 +四、标注修改内容。 +  如果您要发布任何修改后的版本的衍生内容,您必须给出适当的说明,表示这不是官方版本。 +五、保留权利。 +  除上述表述外,开发者对本存储库保留所有权利(All Rights Reserved),且开发者可能随时修改本指南,上述表述均无法作出永久性保证。 -—————— +———————————— -说人话就是,随便你参考这堆代码的思路,乃至复制一两个函数什么的也可以,别太过火就行,顺便记得声明一下这段是从这里来的。 -不过,你不能把它们直接复制下来然后再小修小补,就说这是你自己的东西。也不能把其中一小部分单独抠出来说是你自己的东西。 -没有法律顾问,所以这只是明确说明一下,你可以借鉴其中的小部分内容,我也不会且懒得因此找你麻烦。 -如果有专业人士愿意帮帮忙把这堆东西写得专业一点我也很乐意…… \ No newline at end of file +说人话版本: +因为没有法律专业人士检查,所以这不敢作为正式的法律协议,如果有专业人士愿意帮忙改一改我也很乐意…… +如果你只是想参考一下,或者使用一小部分代码,署个名就行,不必担心。 +如果你整了个魔改版,你不能把它发给其他人,但可以私下使用;如果要用魔改版来录视频、发图片什么的,你必须标注这是魔改版,不是官方版本。 +这个指南主要是为了阻止恶意的使用和 “山寨版” 的出现,常规、善意的使用都问题不大,放心吧…… diff --git a/Plain Craft Launcher 2.sln b/Plain Craft Launcher 2.sln new file mode 100644 index 0000000..b10e79d --- /dev/null +++ b/Plain Craft Launcher 2.sln @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32616.157 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Plain Craft Launcher 2", "Plain Craft Launcher 2\Plain Craft Launcher 2.vbproj", "{4499F2D2-18EF-4238-B1F0-7BD547AFF925}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Beta|Any CPU = Beta|Any CPU + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + ReleaseUpdate|Any CPU = ReleaseUpdate|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4499F2D2-18EF-4238-B1F0-7BD547AFF925}.Beta|Any CPU.ActiveCfg = BETA|Any CPU + {4499F2D2-18EF-4238-B1F0-7BD547AFF925}.Beta|Any CPU.Build.0 = BETA|Any CPU + {4499F2D2-18EF-4238-B1F0-7BD547AFF925}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4499F2D2-18EF-4238-B1F0-7BD547AFF925}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4499F2D2-18EF-4238-B1F0-7BD547AFF925}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4499F2D2-18EF-4238-B1F0-7BD547AFF925}.Release|Any CPU.Build.0 = Release|Any CPU + {4499F2D2-18EF-4238-B1F0-7BD547AFF925}.ReleaseUpdate|Any CPU.ActiveCfg = ReleaseUpdate|Any CPU + {4499F2D2-18EF-4238-B1F0-7BD547AFF925}.ReleaseUpdate|Any CPU.Build.0 = ReleaseUpdate|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {838A572E-025C-4A2B-B682-68732EC0FE76} + EndGlobalSection + GlobalSection(Performance) = preSolution + HasPerformanceSessions = true + EndGlobalSection + GlobalSection(Performance) = preSolution + HasPerformanceSessions = true + EndGlobalSection +EndGlobal diff --git a/Plain Craft Launcher 2/Application.xaml.vb b/Plain Craft Launcher 2/Application.xaml.vb index 6c9a97d..eb34ceb 100644 --- a/Plain Craft Launcher 2/Application.xaml.vb +++ b/Plain Craft Launcher 2/Application.xaml.vb @@ -12,26 +12,21 @@ Public Class Application Try ModDevelop.Start() Catch ex As Exception - Log(ex, "开发者模式测试出错", LogLevel.Feedback) + Log(ex, "开发者模式测试出错", LogLevel.Msgbox) End Try End Sub #End If '开始 Private Sub Application_Startup(sender As Object, e As StartupEventArgs) Handles Me.Startup - ApplicationStartTick = GetTimeTick() - SecretOnApplicationStart() Try + SecretOnApplicationStart() '检查参数调用 If e.Args.Length > 0 Then If e.Args(0) = "--update" Then '自动更新 UpdateReplace(e.Args(1), e.Args(2).Trim(""""), e.Args(3).Trim(""""), e.Args(4)) Environment.Exit(Result.Cancel) - 'ElseIf e.Args(0).StartsWithF("--link") Then - ' '稍作等待后切换到联机页面 - ' Thread.Sleep(1000) - ' FormMain.IsLinkRestart = True ElseIf e.Args(0).StartsWithF("--memory") Then '内存优化 Dim Ram = My.Computer.Info.AvailablePhysicalMemory @@ -104,9 +99,10 @@ Public Class Application '日志初始化 LogStart() '添加日志 - Log("[Start] 程序版本:" & VersionDisplayName & "(" & VersionCode & ")") - Log("[Start] 识别码:" & UniqueAddress & If(ThemeCheckOne(9), ",已解锁反馈主题", "")) - Log("[Start] 程序路径:" & PathWithName) + Log($"[Start] 程序版本:{VersionDisplayName} ({VersionCode})") + Log($"[Start] 识别码:{UniqueAddress}{If(ThemeCheckOne(9), ",已解锁反馈主题", "")}") + Log($"[Start] 程序路径:{PathWithName}") + Log($"[Start] 系统编码:{Encoding.Default} ({Encoding.Default.CodePage}, GBK={IsGBKEncoding})") '检测压缩包运行 If Path.Contains(IO.Path.GetTempPath()) OrElse Path.Contains("AppData\Local\Temp\") Then MyMsgBox("PCL 正在临时文件夹运行,设置、游戏存档等很可能无法保存,且部分功能会无法使用或出错。" & vbCrLf & "请将 PCL 从压缩文件中解压,或是更换文件夹后再继续使用!", "环境警告", "我知道了", IsWarn:=True) @@ -129,7 +125,12 @@ Public Class Application #End If AniControlEnabled += 1 Catch ex As Exception - MsgBox(GetExceptionDetail(ex, True), MsgBoxStyle.Critical, "PCL 初始化错误") + Dim FilePath As String = Nothing + Try + FilePath = PathWithName + Catch + End Try + MsgBox(GetExceptionDetail(ex, True) & vbCrLf & "PCL 所在路径:" & If(String.IsNullOrEmpty(FilePath), "获取失败", FilePath), MsgBoxStyle.Critical, "PCL 初始化错误") FormMain.EndProgramForce(Result.Exception) End Try End Sub @@ -212,6 +213,7 @@ Public Class Application Dim MsJson As JObject = GetJson(Setup.Get("LoginMsJson")) MsJson.Remove(sender.Tag) Setup.Set("LoginMsJson", MsJson.ToString(Newtonsoft.Json.Formatting.None)) + If FrmLoginMs.ComboAccounts.SelectedItem Is sender.Parent Then FrmLoginMs.ComboAccounts.SelectedIndex = 0 FrmLoginMs.ComboAccounts.Items.Remove(sender.Parent) Case McLoginType.Legacy '离线 @@ -220,7 +222,7 @@ Public Class Application Names.Remove(sender.Tag) Setup.Set("LoginLegacyName", Join(Names, "¨")) FrmLoginLegacy.ComboName.ItemsSource = Names - FrmLoginLegacy.ComboName.Text = If(Names.Count > 0, Names(0), "") + FrmLoginLegacy.ComboName.Text = If(Names.Any, Names(0), "") Case Else '第三方 Dim Token As String = GetStringFromEnum(Setup.Get("LoginType")) @@ -238,12 +240,12 @@ Public Class Application Select Case Token Case "Nide" FrmLoginNide.ComboName.ItemsSource = Dict.Keys - FrmLoginNide.ComboName.Text = If(Dict.Keys.Count > 0, Dict.Keys(0), "") - FrmLoginNide.TextPass.Password = If(Dict.Values.Count > 0, Dict.Values(0), "") + FrmLoginNide.ComboName.Text = If(Dict.Keys.Any, Dict.Keys(0), "") + FrmLoginNide.TextPass.Password = If(Dict.Values.Any, Dict.Values(0), "") Case "Auth" FrmLoginAuth.ComboName.ItemsSource = Dict.Keys - FrmLoginAuth.ComboName.Text = If(Dict.Keys.Count > 0, Dict.Keys(0), "") - FrmLoginAuth.TextPass.Password = If(Dict.Values.Count > 0, Dict.Values(0), "") + FrmLoginAuth.ComboName.Text = If(Dict.Keys.Any, Dict.Keys(0), "") + FrmLoginAuth.TextPass.Password = If(Dict.Values.Any, Dict.Values(0), "") End Select End Select End Sub diff --git a/Plain Craft Launcher 2/Controls/MyCard.vb b/Plain Craft Launcher 2/Controls/MyCard.vb index 9674ca8..11b7669 100644 --- a/Plain Craft Launcher 2/Controls/MyCard.vb +++ b/Plain Craft Launcher 2/Controls/MyCard.vb @@ -13,8 +13,26 @@ MainBorder.Child = value End Set End Property - Public MainTextBlock As TextBlock - Public MainSwap As Shapes.Path + Private _MainTextBlock As TextBlock + Public Property MainTextBlock As TextBlock + Get + Init() '当父级触发 Loaded 时,本卡片可能尚未触发 Loaded(该事件从父级向子级调用),因此这会是 null。手动触发以确保控件已加载。 + Return _MainTextBlock + End Get + Set(value As TextBlock) + _MainTextBlock = value + End Set + End Property + Private _MainSwap As Shapes.Path + Public Property MainSwap As Shapes.Path + Get + Init() + Return _MainSwap + End Get + Set(value As Shapes.Path) + _MainSwap = value + End Set + End Property '属性 Public Uuid As Integer = GetUuid() @@ -24,7 +42,7 @@ End Get Set(value As String) SetValue(TitleProperty, value) - If MainTextBlock IsNot Nothing Then MainTextBlock.Text = value + If _MainTextBlock IsNot Nothing Then MainTextBlock.Text = value End Set End Property Public Shared ReadOnly TitleProperty As DependencyProperty = DependencyProperty.Register("Title", GetType(String), GetType(MyCard), New PropertyMetadata("")) @@ -40,10 +58,11 @@ Children.Add(MainGrid) End Sub Private IsLoad As Boolean = False - Private Sub MyCard_Loaded() Handles Me.Loaded + Private Sub Init() Handles Me.Loaded If IsLoad Then Exit Sub + IsLoad = True '初次加载限定 - If Not Title = "" AndAlso IsNothing(MainTextBlock) Then + If Title <> "" AndAlso MainTextBlock Is Nothing Then MainTextBlock = New TextBlock With {.HorizontalAlignment = HorizontalAlignment.Left, .VerticalAlignment = VerticalAlignment.Top, .Margin = New Thickness(15, 12, 0, 0), .FontWeight = FontWeights.Bold, .FontSize = 13, .IsHitTestVisible = False} MainTextBlock.SetResourceReference(TextBlock.ForegroundProperty, "ColorBrush1") MainTextBlock.SetBinding(TextBlock.TextProperty, New Binding("Title") With {.Source = Me, .Mode = BindingMode.OneWay}) @@ -55,7 +74,6 @@ MainSwap.SetResourceReference(Shapes.Path.FillProperty, "ColorBrush1") MainGrid.Children.Add(MainSwap) End If - IsLoad = True '改变默认的折叠 If IsSwaped AndAlso SwapControl IsNot Nothing Then MainSwap.RenderTransform = New RotateTransform(If(SwapLogoRight, 270, 0)) @@ -130,7 +148,7 @@ FrmDownloadInstall.MinecraftSelected(sender, e) End Sub, False)) Case 8 - If Distinct(CType(Stack.Tag, List(Of CompFile)), Function(a, b) a.DisplayName = b.DisplayName).Count <> + If CType(Stack.Tag, List(Of CompFile)).Distinct(Function(a, b) a.DisplayName = b.DisplayName).Count <> CType(Stack.Tag, List(Of CompFile)).Count Then '存在重复的名称(#1344) Stack.Children.Add(CType(Data, CompFile).ToListItem(AddressOf FrmDownloadCompDetail.Save_Click, BadDisplayName:=True)) @@ -139,7 +157,7 @@ Stack.Children.Add(CType(Data, CompFile).ToListItem(AddressOf FrmDownloadCompDetail.Save_Click)) End If Case 9 - If Distinct(CType(Stack.Tag, List(Of CompFile)), Function(a, b) a.DisplayName = b.DisplayName).Count <> + If CType(Stack.Tag, List(Of CompFile)).Distinct(Function(a, b) a.DisplayName = b.DisplayName).Count <> CType(Stack.Tag, List(Of CompFile)).Count Then '存在重复的名称(#1344) Stack.Children.Add(CType(Data, CompFile).ToListItem(AddressOf FrmDownloadCompDetail.Install_Click, AddressOf FrmDownloadCompDetail.Save_Click, BadDisplayName:=True)) diff --git a/Plain Craft Launcher 2/Controls/MyListItem.xaml.vb b/Plain Craft Launcher 2/Controls/MyListItem.xaml.vb index 68866e6..60706f9 100644 --- a/Plain Craft Launcher 2/Controls/MyListItem.xaml.vb +++ b/Plain Craft Launcher 2/Controls/MyListItem.xaml.vb @@ -656,9 +656,9 @@ SetResourceReference(ForegroundProperty, "ColorBrush1") End If ColumnPaddingRight.Width = New GridLength(MinPaddingRight) - If EventType = "打开帮助" Then + If EventType = "打开帮助" AndAlso Not (Title <> "" AndAlso Info <> "") Then '#3266 Try - Dim NewElem = New HelpEntry(GetEventAbsoluteUrls(EventData, EventType)(0)).SetToListItem(Me) + Dim Unused = New HelpEntry(GetEventAbsoluteUrls(EventData, EventType)(0)).SetToListItem(Me) Catch ex As Exception Log(ex, "设置帮助 MyListItem 失败", LogLevel.Msgbox) End Try diff --git a/Plain Craft Launcher 2/Controls/MyScrollViewer.vb b/Plain Craft Launcher 2/Controls/MyScrollViewer.vb index b341275..beaeb1c 100644 --- a/Plain Craft Launcher 2/Controls/MyScrollViewer.vb +++ b/Plain Craft Launcher 2/Controls/MyScrollViewer.vb @@ -8,10 +8,12 @@ Private Sub MyScrollViewer_PreviewMouseWheel(sender As Object, e As MouseWheelEventArgs) Handles Me.PreviewMouseWheel If e.Delta = 0 OrElse ActualHeight = 0 OrElse ScrollableHeight = 0 Then Exit Sub Dim SourceType = e.Source.GetType - If Content.TemplatedParent Is Nothing AndAlso - ((GetType(ComboBox).IsAssignableFrom(SourceType) AndAlso CType(e.Source, ComboBox).IsDropDownOpen) OrElse - (GetType(TextBox).IsAssignableFrom(SourceType) AndAlso CType(e.Source, TextBox).AcceptsReturn) OrElse - GetType(ComboBoxItem).IsAssignableFrom(SourceType)) Then + If Content.TemplatedParent Is Nothing AndAlso ( + (GetType(ComboBox).IsAssignableFrom(SourceType) AndAlso CType(e.Source, ComboBox).IsDropDownOpen) OrElse + (GetType(TextBox).IsAssignableFrom(SourceType) AndAlso CType(e.Source, TextBox).AcceptsReturn) OrElse + GetType(ComboBoxItem).IsAssignableFrom(SourceType) OrElse + TypeOf e.Source Is CheckBox + ) Then '如果当前是在对有滚动条的下拉框或文本框执行,则不接管操作 Exit Sub End If diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index 941e7f6..5ed09e6 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -10,6 +10,18 @@ Public Class FormMain Dim FeatureList As New List(Of KeyValuePair(Of Integer, String)) '统计更新日志条目 #If BETA Then + If LastVersion < 323 Then 'Release 2.7.3 + FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "添加 启动游戏前进行内存优化 设置")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化 MC 性能")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复安装 OptiFine 有概率失败的 Bug")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复启动 Fabric 1.20.5+ 时无法正确选择 Java 的 Bug")) + FeatureCount += 22 + BugCount += 21 + End If + If LastVersion < 321 Then 'Release 2.7.1 + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复启动部分整合包导致设置丢失的 Bug")) + BugCount += 1 + End If If LastVersion < 319 Then 'Release 2.7.0 FeatureList.Add(New KeyValuePair(Of Integer, String)(5, "支持更新 Mod")) FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "支持查看可更新的 Mod 的更新日志")) @@ -96,7 +108,25 @@ Public Class FormMain '3:BUG+ IMP* FEAT- '2:BUG* IMP- '1:BUG- - If LastVersion < 318 Then 'Snapshot 2.7.1 + If LastVersion < 325 Then 'Snapshot 2.7.4 + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "会自动隐藏明显不可用的自动安装选项")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化正版登录流程和 MC 性能")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复正版登录时弹出脚本错误提示的 Bug")) + FeatureCount += 17 + BugCount += 19 + End If + If LastVersion < 324 Then 'Snapshot 2.7.3 + FeatureCount += 4 + BugCount += 3 + End If + If LastVersion < 322 Then 'Snapshot 2.7.2 + FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "添加 启动游戏前进行内存优化 设置")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复安装 OptiFine 有概率失败的 Bug")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复启动 Fabric 1.20.5+ 时无法正确选择 Java 的 Bug")) + FeatureCount += 18 + BugCount += 18 + End If + If LastVersion < 320 Then 'Snapshot 2.7.1 FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复启动部分整合包导致设置丢失的 Bug")) BugCount += 1 End If @@ -229,7 +259,7 @@ Public Class FormMain Next If SortedFeatures.Count > 10 Then FeatureCount += SortedFeatures.Count - 10 If FeatureCount > 0 OrElse BugCount > 0 Then - ContentList.Add(If(FeatureCount > 0, "其他 " & FeatureCount & " 项小调整与修改", "") & + ContentList.Add(If(FeatureCount > 0, FeatureCount & " 项小调整与修改", "") & If(FeatureCount > 0 AndAlso BugCount > 0, ",", "") & If(BugCount > 0, "修复了 " & BugCount & " 个 Bug", "") & ",详见完整更新日志") @@ -306,7 +336,7 @@ Public Class FormMain Setup.Load("UiBackgroundBlur") Setup.Load("UiLogoType") Setup.Load("UiHiddenPageDownload") - BackgroundRefresh(False, True) + PageSetupUI.BackgroundRefresh(False, True) MusicRefreshPlay(False, True) '扩展按钮 BtnExtraDownload.ShowCheck = AddressOf BtnExtraDownload_ShowCheck @@ -352,44 +382,46 @@ Public Class FormMain AaOpacity(Me, Setup.Get("UiLauncherTransparent") / 1000 + 0.4, 250, 100), AaDouble(Sub(i) TransformPos.Y += i, -TransformPos.Y, 600, 100, New AniEaseOutBack(AniEasePower.Weak)), AaDouble(Sub(i) TransformRotate.Angle += i, -TransformRotate.Angle, 500, 100, New AniEaseOutBack(AniEasePower.Weak)), - AaCode(Sub() - PanBack.RenderTransform = Nothing - IsWindowLoadFinished = True - Log($"[System] DPI:{DPI},系统版本:{OsVersion},PCL 位置:{PathWithName}") - End Sub, , True) + AaCode( + Sub() + PanBack.RenderTransform = Nothing + IsWindowLoadFinished = True + Log($"[System] DPI:{DPI},系统版本:{OsVersion},PCL 位置:{PathWithName}") + End Sub, , True) }, "Form Show") 'Timer 启动 AniStart() TimerMainStart() '加载池 - RunInNewThread(Sub() - 'EULA 提示 - If Not Setup.Get("SystemEula") Then - Select Case MyMsgBox("在使用 PCL 前,请同意 PCL 的用户协议与免责声明。", "协议授权", "同意", "拒绝", "查看用户协议与免责声明", + RunInNewThread( + Sub() + 'EULA 提示 + If Not Setup.Get("SystemEula") Then + Select Case MyMsgBox("在使用 PCL 前,请同意 PCL 的用户协议与免责声明。", "协议授权", "同意", "拒绝", "查看用户协议与免责声明", Button3Action:=Sub() OpenWebsite("https://shimo.im/docs/rGrd8pY8xWkt6ryW")) - Case 1 - Setup.Set("SystemEula", True) - Case 2 - EndProgram(False) - End Select - End If - '启动加载器池 - Try - JavaListInit() '延后到同意协议后再执行,避免在初次启动时进行进程操作 - Thread.Sleep(200) - DlClientListMojangLoader.Start(1) - RunCountSub() - ServerLoader.Start(1) - Catch ex As Exception - Log(ex, "初始化加载池运行失败", LogLevel.Feedback) - End Try - '清理自动更新文件 - Try - If File.Exists(Path & "PCL\Plain Craft Launcher 2.exe") Then File.Delete(Path & "PCL\Plain Craft Launcher 2.exe") - Catch ex As Exception - Log(ex, "清理自动更新文件失败") - End Try - End Sub, "Start Loader", ThreadPriority.Lowest) + Case 1 + Setup.Set("SystemEula", True) + Case 2 + EndProgram(False) + End Select + End If + '启动加载器池 + Try + JavaListInit() '延后到同意协议后再执行,避免在初次启动时进行进程操作 + Thread.Sleep(200) + DlClientListMojangLoader.Start(1) + RunCountSub() + ServerLoader.Start(1) + Catch ex As Exception + Log(ex, "初始化加载池运行失败", LogLevel.Feedback) + End Try + '清理自动更新文件 + Try + If File.Exists(Path & "PCL\Plain Craft Launcher 2.exe") Then File.Delete(Path & "PCL\Plain Craft Launcher 2.exe") + Catch ex As Exception + Log(ex, "清理自动更新文件失败") + End Try + End Sub, "Start Loader", ThreadPriority.Lowest) Log("[Start] 第三阶段加载用时:" & GetTimeTick() - ApplicationStartTick & " ms") End Sub @@ -430,6 +462,8 @@ Public Class FormMain Log("[Start] 最高版本号从 " & LowerVersionCode & " 升高到 " & VersionCode) End If #End If + '被移除的窗口设置选项 + If Setup.Get("LaunchArgumentWindowType") = 5 Then Setup.Set("LaunchArgumentWindowType", 1) '修改主题设置项名称 If LowerVersionCode <= 207 Then Dim UnlockedTheme As New List(Of String) From {"2"} @@ -495,12 +529,13 @@ Public Class FormMain If SendWarning AndAlso HasDownloadingTask() Then If MyMsgBox("还有下载任务尚未完成,是否确定退出?", "提示", "确定", "取消") = 1 Then '强行结束下载任务 - RunInNewThread(Sub() - Log("[System] 正在强行停止任务") - For Each Task As LoaderBase In LoaderTaskbar.ToArray - Task.Abort() - Next - End Sub, "强行停止下载任务") + RunInNewThread( + Sub() + Log("[System] 正在强行停止任务") + For Each Task As LoaderBase In LoaderTaskbar.ToArray + Task.Abort() + Next + End Sub, "强行停止下载任务") Else Exit Sub End If @@ -516,17 +551,19 @@ Public Class FormMain PanBack.RenderTransform = New TransformGroup() With {.Children = New TransformCollection({TransformRotate, TransformPos, TransformScale})} AniStart({ AaOpacity(Me, -Opacity, 140, 40, New AniEaseOutFluent(AniEasePower.Weak)), - AaDouble(Sub(i) - TransformScale.ScaleX += i - TransformScale.ScaleY += i - End Sub, 0.88 - TransformScale.ScaleX, 180), + AaDouble( + Sub(i) + TransformScale.ScaleX += i + TransformScale.ScaleY += i + End Sub, 0.88 - TransformScale.ScaleX, 180), AaDouble(Sub(i) TransformPos.Y += i, 20 - TransformPos.Y, 180, 0, New AniEaseOutFluent(AniEasePower.Weak)), AaDouble(Sub(i) TransformRotate.Angle += i, 0.6 - TransformRotate.Angle, 180, 0, New AniEaseInoutFluent(AniEasePower.Weak)), - AaCode(Sub() - IsHitTestVisible = False - Top = -10000 - ShowInTaskbar = False - End Sub, 210), + AaCode( + Sub() + IsHitTestVisible = False + Top = -10000 + ShowInTaskbar = False + End Sub, 210), AaCode(AddressOf EndProgramForce, 230) }, "Form Close") Else @@ -653,7 +690,7 @@ Public Class FormMain If e.ChangedButton = MouseButton.XButton1 OrElse e.ChangedButton = MouseButton.XButton2 Then TriggerPageBack() End Sub Private Sub TriggerPageBack() - If PageCurrent = PageType.Download AndAlso PageCurrentSub = PageSubType.DownloadInstall Then + If PageCurrent = PageType.Download AndAlso PageCurrentSub = PageSubType.DownloadInstall AndAlso FrmDownloadInstall.IsInSelectPage Then FrmDownloadInstall.ExitSelectPage() Else PageBack() @@ -761,7 +798,7 @@ Public Class FormMain RunInNewThread( Sub() Dim FilePath As String = FilePathList.First - Log("[System] 接受文件拖拽:" & FilePath & If(FilePathList.Count > 0, $" 等 {FilePathList.Count} 个文件", ""), LogLevel.Developer) + Log("[System] 接受文件拖拽:" & FilePath & If(FilePathList.Any, $" 等 {FilePathList.Count} 个文件", ""), LogLevel.Developer) '基础检查 If Directory.Exists(FilePathList.First) AndAlso Not File.Exists(FilePathList.First) Then Hint("请拖入一个文件,而非文件夹!", HintType.Critical) @@ -774,14 +811,14 @@ Public Class FormMain If FilePathList.Count > 1 Then '必须要求全部为 jar 文件 For Each File In FilePathList - If Not {"jar", "litemod", "disabled", "old"}.Contains(File.Split(".").Last.ToLower) Then + If Not {"jar", "litemod", "disabled", "old"}.Contains(File.After(".").ToLower) Then Hint("一次请只拖入一个文件!", HintType.Critical) Exit Sub End If Next End If '自定义主页 - Dim Extension As String = FilePath.Split(".").Last.ToLower + Dim Extension As String = FilePath.After(".").ToLower If Extension = "xaml" Then Log("[System] 文件后缀为 XAML,作为自定义主页加载") If File.Exists(Path & "PCL\Custom.xaml") Then @@ -1176,8 +1213,11 @@ Install: ''' 通过点击返回按钮或手动触发返回来改变页面。 ''' Public Sub PageBack() Handles BtnTitleInner.Click - If Not PageStack.Any() Then Exit Sub - PageChangeActual(PageStack(0)) + If PageStack.Any() Then + PageChangeActual(PageStack(0)) + Else + PageChange(PageType.Launch) + End If End Sub '实际处理页面切换 @@ -1357,23 +1397,22 @@ Install: End Sub Private Sub PanMainLeft_Resize(NewWidth As Double) Dim Delta As Double = NewWidth - RectLeftBackground.Width - If Math.Abs(Delta) < 0.1 Then Exit Sub - If AniControlEnabled = 0 Then + If Math.Abs(Delta) > 0.1 AndAlso AniControlEnabled = 0 Then If PanMain.Opacity < 0.1 Then PanMainLeft.IsHitTestVisible = False '避免左边栏指向背景未能完美覆盖左边栏 If NewWidth > 0 Then '宽度足够,显示 AniStart({ - AaWidth(RectLeftBackground, NewWidth - RectLeftBackground.Width, 400,, New AniEaseOutFluent(AniEasePower.ExtraStrong)), - AaOpacity(RectLeftShadow, 1 - RectLeftShadow.Opacity, 200), - AaCode(Sub() PanMainLeft.IsHitTestVisible = True, 250) - }, "FrmMain LeftChange", True) + AaWidth(RectLeftBackground, NewWidth - RectLeftBackground.Width, 400,, New AniEaseOutFluent(AniEasePower.ExtraStrong)), + AaOpacity(RectLeftShadow, 1 - RectLeftShadow.Opacity, 200), + AaCode(Sub() PanMainLeft.IsHitTestVisible = True, 250) + }, "FrmMain LeftChange", True) Else '宽度不足,隐藏 AniStart({ - AaWidth(RectLeftBackground, -RectLeftBackground.Width, 200,, New AniEaseOutFluent), - AaOpacity(RectLeftShadow, -RectLeftShadow.Opacity, 200), - AaCode(Sub() PanMainLeft.IsHitTestVisible = True, 170) - }, "FrmMain LeftChange", True) + AaWidth(RectLeftBackground, -RectLeftBackground.Width, 200,, New AniEaseOutFluent), + AaOpacity(RectLeftShadow, -RectLeftShadow.Opacity, 200), + AaCode(Sub() PanMainLeft.IsHitTestVisible = True, 170) + }, "FrmMain LeftChange", True) End If Else RectLeftBackground.Width = NewWidth diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index 7ec28b6..57a27cd 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -11,12 +11,12 @@ Public Module ModBase #Region "声明" '下列版本信息由更新器自动修改 - Public Const VersionBaseName As String = "2.7.1" '不含分支前缀的显示用版本名 - Public Const VersionStandardCode As String = "2.7.1." & VersionBranchCode '标准格式的四段式版本号 + Public Const VersionBaseName As String = "2.7.4" '不含分支前缀的显示用版本名 + Public Const VersionStandardCode As String = "2.7.4." & VersionBranchCode '标准格式的四段式版本号 #If BETA Then - Public Const VersionCode As Integer = 319 'Release + Public Const VersionCode As Integer = 323 'Release #Else - Public Const VersionCode As Integer = 320 'Snapshot + Public Const VersionCode As Integer = 325 'Snapshot #End If '自动生成的版本信息 Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName @@ -26,7 +26,7 @@ Public Module ModBase #ElseIf BETA Then Public Const VersionBranchName As String = "Release" Public Const VersionBranchCode As String = "50" -#ElseIf DEBUG Then +#Else Public Const VersionBranchName As String = "Debug" Public Const VersionBranchCode As String = "100" #End If @@ -58,7 +58,7 @@ Public Module ModBase ''' ''' 程序的打开计时。 ''' - Public ApplicationStartTick As Long + Public ApplicationStartTick As Long = GetTimeTick() ''' ''' 程序打开时的时间。 ''' @@ -76,6 +76,10 @@ Public Module ModBase ''' Public Is32BitSystem As Boolean = Not Environment.Is64BitOperatingSystem ''' + ''' 是否使用 GBK 编码。 + ''' + Public IsGBKEncoding As Boolean = Encoding.Default.CodePage = 936 + ''' ''' 操作系统版本。Win10 为 10.0。 ''' Public OsVersion As Version = Environment.OSVersion.Version @@ -591,7 +595,7 @@ Public Module ModBase Try Dim parentKey As Microsoft.Win32.RegistryKey, softKey As Microsoft.Win32.RegistryKey parentKey = My.Computer.Registry.CurrentUser - softKey = parentKey.OpenSubKey("Software\PCL", True) + softKey = parentKey.OpenSubKey("Software\" & RegFolder, True) If softKey Is Nothing Then ReadReg = DefaultValue '不存在则返回默认值 Else @@ -612,8 +616,8 @@ Public Module ModBase Try Dim parentKey As Microsoft.Win32.RegistryKey, softKey As Microsoft.Win32.RegistryKey parentKey = My.Computer.Registry.CurrentUser - softKey = parentKey.OpenSubKey("Software\PCL", True) - If softKey Is Nothing Then softKey = parentKey.CreateSubKey("Software\PCL") '如果不存在就创建 + softKey = parentKey.OpenSubKey("Software\" & RegFolder, True) + If softKey Is Nothing Then softKey = parentKey.CreateSubKey("Software\" & RegFolder) '如果不存在就创建 softKey.SetValue(Key, Value) Catch ex As Exception Log(ex, "写入注册表出错:" & Key, If(ShowException, LogLevel.Hint, LogLevel.Developer)) @@ -726,8 +730,8 @@ Public Module ModBase Public Function GetFileNameFromPath(FilePath As String) As String FilePath = FilePath.Replace("/", "\") If FilePath.EndsWithF("\") Then Throw New Exception("不包含文件名:" & FilePath) - If FilePath.Contains("\") Then FilePath = FilePath.Substring(FilePath.LastIndexOfF("\") + 1) If FilePath.Contains("?") Then FilePath = FilePath.Substring(0, FilePath.IndexOfF("?")) '去掉网络参数后的 ? + If FilePath.Contains("\") Then FilePath = FilePath.Substring(FilePath.LastIndexOfF("\") + 1) Dim length As Integer = FilePath.Length If length = 0 Then Throw New Exception("不包含文件名:" & FilePath) If length > 250 Then Throw New PathTooLongException("文件名过长:" & FilePath) @@ -1215,43 +1219,35 @@ Re: ''' ''' 尝试根据后缀名判断文件种类并解压文件,支持 gz 与 zip,会尝试将 jar 以 zip 方式解压。 ''' 会尝试创建,但不会清空目标文件夹。 - ''' 成功返回 True,并非压缩文件或失败返回 False。 ''' - Public Function ExtractFile(CompressFilePath As String, DestDirectory As String, Optional Encode As Encoding = Nothing) As Boolean - Try - Directory.CreateDirectory(DestDirectory) - If CompressFilePath.EndsWithF(".gz", True) Then - '以 gz 方式解压 - Dim stream As New GZipStream(New FileStream(CompressFilePath, FileMode.Open, FileAccess.ReadWrite), CompressionMode.Decompress) - Dim decompressedFile As New FileStream(DestDirectory & GetFileNameFromPath(CompressFilePath).ToLower.Replace(".tar", "").Replace(".gz", ""), FileMode.OpenOrCreate, FileAccess.Write) - Dim data As Integer = stream.ReadByte() - While data <> -1 - decompressedFile.WriteByte(data) - data = stream.ReadByte() - End While - decompressedFile.Close() - stream.Close() - Return True - Else - '以 zip 方式解压 - Using Archive = ZipFile.Open(CompressFilePath, ZipArchiveMode.Read, If(Encode, Encoding.GetEncoding("GB18030"))) - For Each Entry As ZipArchiveEntry In Archive.Entries - Dim DestinationPath As String = IO.Path.Combine(DestDirectory, Entry.FullName) - If DestinationPath.EndsWithF("\") OrElse DestinationPath.EndsWithF("/") Then - Continue For '不创建空文件夹 - Else - Directory.CreateDirectory(GetPathFromFullPath(DestinationPath)) - Entry.ExtractToFile(DestinationPath, True) - End If - Next - End Using - Return True - End If - Catch ex As Exception - Log(ex, "尝试解压文件失败") - Return False - End Try - End Function + Public Sub ExtractFile(CompressFilePath As String, DestDirectory As String, Optional Encode As Encoding = Nothing) + Directory.CreateDirectory(DestDirectory) + If CompressFilePath.EndsWithF(".gz", True) Then + '以 gz 方式解压 + Dim stream As New GZipStream(New FileStream(CompressFilePath, FileMode.Open, FileAccess.ReadWrite), CompressionMode.Decompress) + Dim decompressedFile As New FileStream(DestDirectory & GetFileNameFromPath(CompressFilePath).ToLower.Replace(".tar", "").Replace(".gz", ""), FileMode.OpenOrCreate, FileAccess.Write) + Dim data As Integer = stream.ReadByte() + While data <> -1 + decompressedFile.WriteByte(data) + data = stream.ReadByte() + End While + decompressedFile.Close() + stream.Close() + Else + '以 zip 方式解压 + Using Archive = ZipFile.Open(CompressFilePath, ZipArchiveMode.Read, If(Encode, Encoding.GetEncoding("GB18030"))) + For Each Entry As ZipArchiveEntry In Archive.Entries + Dim DestinationPath As String = IO.Path.Combine(DestDirectory, Entry.FullName) + If DestinationPath.EndsWithF("\") OrElse DestinationPath.EndsWithF("/") Then + Continue For '不创建空文件夹 + Else + Directory.CreateDirectory(GetPathFromFullPath(DestinationPath)) + Entry.ExtractToFile(DestinationPath, True) + End If + Next + End Using + End If + End Sub ''' ''' 删除文件夹,返回删除的文件个数。通过参数选择是否抛出异常。 @@ -1342,7 +1338,7 @@ Re: Loop DescList = DescList.Distinct.ToList Dim Desc As String = Join(DescList, vbCrLf & "→ ") - Dim Stack As String = If(StackList.Count > 0, vbCrLf & Join(StackList, vbCrLf), "") + Dim Stack As String = If(StackList.Any, vbCrLf & Join(StackList, vbCrLf), "") '常见错误(记得同时修改下面的) Dim CommonReason As String = Nothing @@ -1455,7 +1451,8 @@ Re: Try Return JsonConvert.DeserializeObject(Data, New JsonSerializerSettings With {.DateTimeZoneHandling = DateTimeZoneHandling.Local}) Catch ex As Exception - Throw New Exception("格式化 json 对象失败:" & If(If(Data, "").Length > 10000, Data.Substring(0, 100) & "...", Data)) + Dim Length As Integer = If(Data, "").Length + Throw New Exception("格式化 json 对象失败:" & If(Length > 10000, Data.Substring(0, 100) & $"...(全长 {Length} 个字符)..." & Right(Data, 100), Data)) End Try End Function @@ -1541,6 +1538,57 @@ Re: Next Return tmp.ToString() End Function + ''' + ''' 检查字符串中的字符是否均为 ASCII 字符。 + ''' + Public Function IsASCII(Input As String) As Boolean + Return Input.All(Function(c) AscW(c) < 128) + End Function + + ''' + ''' 获取在子字符串之前的部分。 + ''' 会裁切尽可能多的内容,但如果未找到子字符串则不裁切。 + ''' + Public Function Before(Str As String, Text As String, Optional IgnoreCase As Boolean = False) As String + Dim Pos As Integer = If(String.IsNullOrEmpty(Text), -1, Str.IndexOfF(Text, IgnoreCase)) + If Pos >= 0 Then + Return Str.Substring(0, Pos) + Else + Return Str + End If + End Function + ''' + ''' 获取在子字符串之后的部分。 + ''' 会裁切尽可能多的内容,但如果未找到子字符串则不裁切。 + ''' + Public Function After(Str As String, Text As String, Optional IgnoreCase As Boolean = False) As String + Dim Pos As Integer = If(String.IsNullOrEmpty(Text), -1, Str.LastIndexOfF(Text, IgnoreCase)) + If Pos >= 0 Then + Return Str.Substring(Pos + Text.Length) + Else + Return Str + End If + End Function + ''' + ''' 获取处于两个子字符串之间的部分。 + ''' 会裁切尽可能多的内容:匹配开始使用 LastIndexOf,匹配结束使用 IndexOf,但如果未找到子字符串则不裁切。 + ''' + Public Function Between(Str As String, Before As String, After As String, Optional IgnoreCase As Boolean = False) As String + Dim StartPos As Integer = If(String.IsNullOrEmpty(Before), -1, Str.LastIndexOfF(Before, IgnoreCase)) + If StartPos >= 0 Then + StartPos += Before.Length + Else + StartPos = 0 + End If + Dim EndPos As Integer = If(String.IsNullOrEmpty(After), -1, Str.IndexOfF(After, StartPos, IgnoreCase)) + If EndPos >= 0 Then + Return Str.Substring(StartPos, EndPos - StartPos) + ElseIf StartPos > 0 Then + Return Str.Substring(StartPos) + Else + Return Str + End If + End Function ''' ''' 高速的 StartsWith。 @@ -1571,12 +1619,26 @@ Re: Return Str.IndexOf(SubStr, If(IgnoreCase, StringComparison.OrdinalIgnoreCase, StringComparison.Ordinal)) End Function ''' + ''' 高速的 IndexOf。 + ''' + + Public Function IndexOfF(Str As String, SubStr As String, StartIndex As Integer, Optional IgnoreCase As Boolean = False) As Integer + Return Str.IndexOf(SubStr, StartIndex, If(IgnoreCase, StringComparison.OrdinalIgnoreCase, StringComparison.Ordinal)) + End Function + ''' ''' 高速的 LastIndexOf。 ''' Public Function LastIndexOfF(Str As String, SubStr As String, Optional IgnoreCase As Boolean = False) As Integer Return Str.LastIndexOf(SubStr, If(IgnoreCase, StringComparison.OrdinalIgnoreCase, StringComparison.Ordinal)) End Function + ''' + ''' 高速的 LastIndexOf。 + ''' + + Public Function LastIndexOfF(Str As String, SubStr As String, StartIndex As Integer, Optional IgnoreCase As Boolean = False) As Integer + Return Str.LastIndexOf(SubStr, StartIndex, If(IgnoreCase, StringComparison.OrdinalIgnoreCase, StringComparison.Ordinal)) + End Function ''' ''' 输入 And 字符不会报错的 Val。 @@ -1815,15 +1877,11 @@ Re: ''' ''' 数组去重。 ''' - Public Function Distinct(Of T)(Arr As ICollection(Of T), Optional IsEqual As CompareThreadStart(Of T) = Nothing) As List(Of T) + Public Function Distinct(Of T)(Arr As ICollection(Of T), IsEqual As CompareThreadStart(Of T)) As List(Of T) Dim ResultArray As New List(Of T) For i = 0 To Arr.Count - 1 For ii = i + 1 To Arr.Count - 1 - If IsEqual Is Nothing Then - If Arr(i).Equals(Arr(ii)) Then GoTo NextElement - Else - If IsEqual(Arr(i), Arr(ii)) Then GoTo NextElement - End If + If IsEqual(Arr(i), Arr(ii)) Then GoTo NextElement Next ResultArray.Add(Arr(i)) NextElement: @@ -2071,9 +2129,9 @@ NextElement: ''' 按照既定的函数进行选择排序。 ''' ''' 传入两个对象,若第一个对象应该排在前面,则返回 True。 - Public Function Sort(Of T)(List As IList(Of T), SortRule As CompareThreadStart(Of T)) As List(Of T) + Public Function Sort(Of T)(List As IList(Of T), SortRule As CompareThreadStart(Of T)) As List(Of T) Dim NewList As New List(Of T) - While List.Count > 0 + While List.Any Dim Highest = List(0) For i = 1 To List.Count - 1 If SortRule(List(i), Highest) Then Highest = List(i) @@ -2646,7 +2704,7 @@ Retry: ''' Public Function Shuffle(Of T)(array As IList(Of T)) As IList(Of T) Shuffle = New List(Of T) - Do While array.Count > 0 + Do While array.Any Dim i As Integer = RandomInteger(0, array.Count - 1) Shuffle.Add(array(i)) array.RemoveAt(i) diff --git a/Plain Craft Launcher 2/Modules/Base/ModLoader.vb b/Plain Craft Launcher 2/Modules/Base/ModLoader.vb index f2bf1b4..18ed602 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModLoader.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModLoader.vb @@ -266,7 +266,7 @@ Public Output As OutputType = Nothing '获取输入 - Public Function StartGetInput(Optional Input As InputType = Nothing, Optional InputDelegate As Func(Of Object) = Nothing) As InputType + Public Function StartGetInput(Optional Input As InputType = Nothing, Optional InputDelegate As Func(Of Object) = Nothing) As InputType 'InputDelegate 参数存在匿名调用 If InputDelegate Is Nothing Then InputDelegate = Me.InputDelegate Dim NewInput As InputType = Nothing '若 InputType 不能为 Nothing,则会导致 Input Is Nothing 永远失败,因此需要额外判断 If (Input Is Nothing OrElse (NewInput IsNot Nothing AndAlso Input.Equals(NewInput))) AndAlso InputDelegate IsNot Nothing Then @@ -571,7 +571,7 @@ Restart: Public LoaderTaskbarProgress As Double = 0 '平滑后的进度 Private LoaderTaskbarProgressLast As Shell.TaskbarItemProgressState = Shell.TaskbarItemProgressState.None - Public Sub LoaderTaskbarAdd(Loader As LoaderBase) + Public Sub LoaderTaskbarAdd(Of T)(Loader As LoaderCombo(Of T)) If FrmSpeedLeft IsNot Nothing Then FrmSpeedLeft.TaskRemove(Loader) SyncLock LoaderTaskbarLock LoaderTaskbar.Add(Loader) @@ -587,11 +587,11 @@ Restart: '外显任务是否已经全部完成 Dim IsAllDownloadTaskCompleted As Boolean = True For Each Loader In LoaderTaskbar - If Loader.Show AndAlso Loader.State = LoadState.Loading Then IsAllDownloadTaskCompleted = False + If Loader.State = LoadState.Loading Then IsAllDownloadTaskCompleted = False Next '若单个任务已中止或全部任务已完成,则刷新并移除 For Each Task In LoaderTaskbar.ToList() - If (IsAllDownloadTaskCompleted OrElse Task.State = LoadState.Aborted OrElse Task.State = LoadState.Waiting) AndAlso Task.Show Then + If IsAllDownloadTaskCompleted OrElse Task.State = LoadState.Aborted OrElse Task.State = LoadState.Waiting Then If FrmSpeedLeft IsNot Nothing Then FrmSpeedLeft.TaskRefresh(Task) LoaderTaskbar.Remove(Task) Log($"[Taskbar] {Task.Name} 已移出任务列表") @@ -628,7 +628,6 @@ Restart: Dim Total As Double = 0, Count As Integer = 0 SyncLock LoaderTaskbarLock For Each Task In LoaderTaskbar.ToList - If Not Task.Show Then Continue For Total += Task.Progress Count += 1 '避免多线程影响导致计数出错 Next diff --git a/Plain Craft Launcher 2/Modules/Base/ModNet.vb b/Plain Craft Launcher 2/Modules/Base/ModNet.vb index 5bdf83a..de97191 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModNet.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModNet.vb @@ -1,4 +1,5 @@ Imports System.Net +Imports PCL.ModNet Public Module ModNet Public Const NetDownloadEnd As String = ".PCLDownloading" @@ -235,11 +236,11 @@ RequestFinished: ''' 以多线程下载网页文件的方式获取网页源代码。 ''' ''' 网页的 Url 列表。 - Public Function NetGetCodeByDownload(Urls As String(), Optional Timeout As Integer = 45000, Optional IsJson As Boolean = False, Optional UseBrowserUserAgent As Boolean = False) As String - Dim Temp As String = PathTemp & "Cache\Code\" & Urls(0).GetHashCode() & "_" & GetUuid() + Public Function NetGetCodeByDownload(Urls As IEnumerable(Of String), Optional Timeout As Integer = 45000, Optional IsJson As Boolean = False, Optional UseBrowserUserAgent As Boolean = False) As String + Dim Temp As String = PathTemp & "Cache\Code\" & Urls.First.GetHashCode() & "_" & GetUuid() Dim NewTask As New LoaderDownload("源码获取 " & GetUuid() & "#", New List(Of NetFile) From {New NetFile(Urls, Temp, New FileChecker With {.IsJson = IsJson}, UseBrowserUserAgent)}) Try - NewTask.WaitForExitTime(Timeout, TimeoutMessage:="连接服务器超时(第一下载源:" & Urls(0) & ")") + NewTask.WaitForExitTime(Timeout, TimeoutMessage:="连接服务器超时(第一下载源:" & Urls.First & ")") NetGetCodeByDownload = ReadFile(Temp) File.Delete(Temp) Finally @@ -448,7 +449,7 @@ RequestFinished: ''' ''' 速度下限。 ''' - Public NetTaskSpeedLimitLow As Long = 1024 * 1024L + Public NetTaskSpeedLimitLow As Long = 256 * 1024L '256K/s ''' ''' 速度上限。若无限制则为 -1。 ''' @@ -516,7 +517,7 @@ RequestFinished: ''' Finish = 6 ''' - ''' 已失败。 + ''' 已失败或中断。 ''' [Error] = 7 End Enum @@ -601,7 +602,7 @@ RequestFinished: SyncLock Task.LockChain If NextThread Is Nothing Then If Task.IsUnknownSize Then - Return 1024 * 1024 * 1024 '1G + Return 5 * 1024 * 1024 * 1024L '5G Else Return Task.FileSize - 1 End If @@ -616,7 +617,7 @@ RequestFinished: ''' Public ReadOnly Property DownloadUndone As Long Get - Return DownloadEnd + 1 - (DownloadStart + DownloadDone) + Return DownloadEnd - (DownloadStart + DownloadDone) + 1 End Get End Property ''' @@ -715,7 +716,7 @@ RequestFinished: CurrentSource = Sources(Id) End While Return CurrentSource - ElseIf SourcesOnce.Count > 0 Then + ElseIf SourcesOnce.Any Then '仅存在单线程可用源 Return SourcesOnce(0) Else @@ -728,7 +729,7 @@ RequestFinished: ''' 是否已经没有可用源了。 ''' Public Function IsSourceFailed(Optional AllowOnceSource As Boolean = True) As Boolean - If AllowOnceSource AndAlso SourcesOnce.Count > 0 Then Return False + If AllowOnceSource AndAlso SourcesOnce.Any Then Return False SyncLock LockSource For Each Source As NetSource In Sources If Not Source.IsFailed Then Return False @@ -754,15 +755,12 @@ RequestFinished: ''' 导致下载失败的原因。 ''' Public Ex As New List(Of Exception) - '''' - '''' 文件进行整体重试的计数。 - '''' - 'Private RetryCount As Integer = 0 ''' ''' 作为文件组成部分的线程链表。 + ''' 如果没有线程,可以为 Nothing。 ''' - Private Threads As NetThread + Public Threads As NetThread ''' ''' 文件的总大小。若为 -2 则为未获取,若为 -1 则为无法获取准确大小。 @@ -783,7 +781,7 @@ RequestFinished: ''' ''' 为不需要分割的小文件进行临时存储。 ''' - Private SmailFileCache As List(Of Byte) + Private SmailFileCache As Queue(Of Byte) ''' ''' 文件的已下载大小。 @@ -844,10 +842,10 @@ RequestFinished: Case NetState.Get Return 0.04 Case NetState.Download - '正在下载中,对应 5% ~ 99% + '正在下载中,对应 5% ~ 98% Dim OriginalProgress As Double = If(IsUnknownSize, 0.5, DownloadDone / Math.Max(FileSize, 1)) OriginalProgress = 1 - (1 - OriginalProgress) ^ 0.9 - Return OriginalProgress * 0.94 + 0.05 + Return OriginalProgress * 0.93 + 0.05 Case NetState.Merge Return 0.99 Case NetState.Finish, NetState.Error @@ -878,14 +876,13 @@ RequestFinished: End Property Private Const FilePieceLimit As Long = 256 * 1024 - Public ReadOnly RandomCode As Integer = RandomInteger(0, 999999) Public ReadOnly LockCount As New Object Public ReadOnly LockState As New Object Public ReadOnly LockChain As New Object Public ReadOnly LockSource As New Object Public ReadOnly LockTasks As New Object - Private ReadOnly Uuid As Integer = GetUuid() + Public ReadOnly Uuid As Integer = GetUuid() Public Overrides Function Equals(obj As Object) As Boolean Dim file = TryCast(obj, NetFile) Return file IsNot Nothing AndAlso Uuid = file.Uuid @@ -914,14 +911,15 @@ RequestFinished: ''' ''' 尝试开始一个新的下载线程。 + ''' 如果失败,返回 Nothing。 ''' - Public Function TryBeginThread() As Boolean + Public Function TryBeginThread() As NetThread Try '条件检测 If NetTaskThreadCount >= NetTaskThreadLimit OrElse IsSourceFailed() OrElse - (IsNoSplit AndAlso Threads IsNot Nothing AndAlso Threads.State <> NetState.Error) Then Return False - If State >= NetState.Merge OrElse State = NetState.WaitForCheck Then Return False + (IsNoSplit AndAlso Threads IsNot Nothing AndAlso Threads.State <> NetState.Error) Then Return Nothing + If State >= NetState.Merge OrElse State = NetState.WaitForCheck Then Return Nothing SyncLock LockState If State < NetState.Connect Then State = NetState.Connect End SyncLock @@ -936,7 +934,7 @@ RequestFinished: '单线程 If IsSourceFailed(False) Then '确认没有其他线程正使用此点 - If SourcesOnce(0).Thread IsNot Nothing AndAlso SourcesOnce(0).Thread.State <> NetState.Error Then Return False + If SourcesOnce(0).Thread IsNot Nothing AndAlso SourcesOnce(0).Thread.State <> NetState.Error Then Return Nothing '占用此点 Capture: SmailFileCache = Nothing @@ -952,14 +950,8 @@ Capture: If Threads Is Nothing Then StartPosition = 0 StartSource = GetSource(FirstThreadSource) - If StartSource Is Nothing Then - '没有可用源了 - Throw New Exception("无可用源,请反馈此问题。") - Else - '有可用源 - FirstThreadSource = StartSource.Id + 1 - GoTo StartThread - End If + FirstThreadSource = StartSource.Id + 1 + GoTo StartThread End If '寻找失败点 For Each Thread As NetThread In Threads @@ -971,24 +963,25 @@ Capture: Next '是否禁用多线程,以及规定碎片大小 Dim TargetUrl As String = GetSource().Url - If TargetUrl.Contains("pcl2-server") OrElse TargetUrl.Contains("gitcode.net") OrElse TargetUrl.Contains("github.com") Then Return False + If TargetUrl.Contains("pcl2-server") OrElse TargetUrl.Contains("gitcode.net") OrElse TargetUrl.Contains("github.com") OrElse TargetUrl.Contains("modrinth.com") Then Return Nothing '寻找最大碎片 + 'FUTURE: 下载引擎重做,计算下载源平均链接时间和线程下载速度,按最高时间节省来开启多线程 Dim FilePieceMax As NetThread = Threads For Each Thread As NetThread In Threads If Thread.DownloadUndone > FilePieceMax.DownloadUndone Then FilePieceMax = Thread Next - If FilePieceMax Is Nothing OrElse FilePieceMax.DownloadUndone < FilePieceLimit Then Return False + If FilePieceMax Is Nothing OrElse FilePieceMax.DownloadUndone < FilePieceLimit Then Return Nothing StartPosition = FilePieceMax.DownloadEnd - FilePieceMax.DownloadUndone * 0.4 StartSource = GetSource() '开始线程 StartThread: - If (StartPosition > FileSize AndAlso FileSize >= 0 AndAlso Not IsUnknownSize) OrElse StartPosition < 0 OrElse IsNothing(StartSource) Then Return False + If (StartPosition > FileSize AndAlso FileSize >= 0 AndAlso Not IsUnknownSize) OrElse StartPosition < 0 OrElse IsNothing(StartSource) Then Return Nothing '构建线程 Dim ThreadUuid As Integer = GetUuid() SyncLock LockTasks - If Not Tasks.Any() Then Return False '由于中断,已没有可用任务 - Th = New Thread(AddressOf Thread) With {.Name = "NetTask " & Tasks(0).Uuid & "/" & Uuid & " Download " & ThreadUuid & "#", .Priority = ThreadPriority.BelowNormal} + If Not Tasks.Any() Then Return Nothing '由于中断,已没有可用任务 + Th = New Thread(AddressOf Thread) With {.Name = $"NetTask {Tasks(0).Uuid}/{Uuid} Download {ThreadUuid}#", .Priority = ThreadPriority.BelowNormal} End SyncLock ThreadInfo = New NetThread With {.Uuid = ThreadUuid, .DownloadStart = StartPosition, .Thread = Th, .Source = StartSource, .Task = Me, .State = NetState.WaitForDownload} '链表处理 @@ -1012,11 +1005,11 @@ StartThread: If IsSourceFailed(False) Then SourcesOnce(0).Thread = ThreadInfo End SyncLock Th.Start(ThreadInfo) - Return True + Return ThreadInfo Catch ex As Exception Log(ex, "尝试开始下载线程失败(" & If(LocalName, "Nothing") & ")", LogLevel.Hint) - Return False + Return Nothing End Try End Function ''' @@ -1040,35 +1033,45 @@ StartThread: HttpRequest.Timeout = Timeout HttpRequest.AddRange(Info.DownloadStart) SecretHeadersSign(Info.Source.Url, HttpRequest, UseBrowserUserAgent) + Dim ContentLength As Long = 0 Using HttpResponse As HttpWebResponse = HttpRequest.GetResponse() + If State = NetState.Error Then GoTo SourceBreak '快速中断 + If ModeDebug AndAlso HttpResponse.ResponseUri.OriginalString <> Info.Source.Url Then + Log($"[Download] {LocalName} {Info.Uuid}#:重定向至 {HttpResponse.ResponseUri.OriginalString}") + End If '文件大小校验 - Dim ThreadFileSize = HttpResponse.ContentLength - If ThreadFileSize = -1 Then + ContentLength = HttpResponse.ContentLength + If ContentLength = -1 Then If FileSize > 1 Then - Log("[Download] " & LocalName & " " & Info.Uuid & "#:文件大小未知,但已从其他下载源获取,不作处理") + If Info.DownloadStart = 0 Then + Log($"[Download] {LocalName} {Info.Uuid}#:文件大小未知,但已从其他下载源获取,不作处理") + Else + Log($"[Download] {LocalName} {Info.Uuid}#:ContentLength 返回了 -1,无法确定是否支持分段下载,视作不支持") + GoTo NotSupportRange + End If Else FileSize = -1 : IsUnknownSize = True - Log("[Download] " & LocalName & " " & Info.Uuid & "#:文件大小未知") + Log($"[Download] {LocalName} {Info.Uuid}#:文件大小未知") End If - ElseIf ThreadFileSize < 0 Then - Throw New Exception("获取片大小失败,结果为 " & ThreadFileSize & "。") + ElseIf ContentLength < 0 Then + Throw New Exception("获取片大小失败,结果为 " & ContentLength & "。") ElseIf Info.IsFirstThread Then If Check IsNot Nothing Then - If ThreadFileSize < Check.MinSize AndAlso Check.MinSize > 0 Then - Throw New Exception("文件大小不足,获取结果为 " & ThreadFileSize & ",要求至少为 " & Check.MinSize & "。") + If ContentLength < Check.MinSize AndAlso Check.MinSize > 0 Then + Throw New Exception($"文件大小不足,获取结果为 {ContentLength},要求至少为 {Check.MinSize}。") End If - If ThreadFileSize <> Check.ActualSize AndAlso Check.ActualSize > 0 Then - Throw New Exception("文件大小不一致,获取结果为 " & ThreadFileSize & ",要求必须为 " & Check.ActualSize & "。") + If ContentLength <> Check.ActualSize AndAlso Check.ActualSize > 0 Then + Throw New Exception($"文件大小不一致,获取结果为 {ContentLength},要求必须为 {Check.ActualSize}。") End If End If - FileSize = ThreadFileSize : IsUnknownSize = False - Log("[Download] " & LocalName & ":文件大小 " & ThreadFileSize & " B" & "(" & GetString(ThreadFileSize) & ")") + FileSize = ContentLength : IsUnknownSize = False + Log($"[Download] {LocalName} {Info.Uuid}#:文件大小 {ContentLength}({GetString(ContentLength)})") '若文件大小大于 50 M,进行剩余磁盘空间校验 - If ThreadFileSize > 50 * 1024 * 1024 Then + If ContentLength > 50 * 1024 * 1024 Then For Each Drive As DriveInfo In DriveInfo.GetDrives Dim DriveName As String = Drive.Name.First.ToString - Dim RequiredSpace = If(PathTemp.StartsWithF(DriveName), ThreadFileSize * 1.1, 0) + - If(LocalPath.StartsWithF(DriveName), ThreadFileSize + 5 * 1024 * 1024, 0) + Dim RequiredSpace = If(PathTemp.StartsWithF(DriveName), ContentLength * 1.1, 0) + + If(LocalPath.StartsWithF(DriveName), ContentLength + 5 * 1024 * 1024, 0) If Drive.TotalFreeSpace < RequiredSpace Then Throw New Exception(DriveName & " 盘空间不足,无法进行下载。" & vbCrLf & "需要至少 " & GetString(RequiredSpace) & " 空间,但当前仅剩余 " & GetString(Drive.TotalFreeSpace) & "。" & If(PathTemp.StartsWithF(DriveName), vbCrLf & vbCrLf & "下载时需要与文件同等大小的空间存放缓存,你可以在设置中调整缓存文件夹的位置。", "")) @@ -1076,8 +1079,9 @@ StartThread: Next End If ElseIf FileSize < 0 Then - Throw New Exception("非首线程运行时,尚未获取文件大小。") - ElseIf Info.DownloadStart > 0 AndAlso ThreadFileSize = FileSize Then + Throw New Exception("非首线程运行时,尚未获取文件大小") + ElseIf Info.DownloadStart > 0 AndAlso ContentLength = FileSize Then +NotSupportRange: SyncLock LockSource If SourcesOnce.Contains(Info.Source) Then GoTo SourceBreak @@ -1085,10 +1089,11 @@ StartThread: SourcesOnce.Add(Info.Source) End If End SyncLock - Throw New WebException("该下载源不支持断点续传。") - ElseIf Not FileSize - Info.DownloadStart = ThreadFileSize Then - Throw New WebException("获取到的片大小不一致:线程结果为 " & ThreadFileSize & " B,任务结果为 " & FileSize & "B,起点为 " & Info.DownloadStart & "B。") + Throw New WebException($"该下载源不支持分段下载:Range 起始于 {Info.DownloadStart},预期 ContentLength 为 {FileSize - Info.DownloadStart},返回 ContentLength 为 {ContentLength},总文件大小 {FileSize}") + ElseIf Not FileSize - Info.DownloadStart = ContentLength Then + Throw New WebException($"获取到的分段大小不一致:Range 起始于 {Info.DownloadStart},预期 ContentLength 为 {FileSize - Info.DownloadStart},返回 ContentLength 为 {ContentLength},总文件大小 {FileSize}") End If + 'Log($"[Download] {LocalName} {Info.Uuid}#:通过大小检查,文件大小 {FileSize},起始点 {Info.DownloadStart},ContentLength {ContentLength}") Info.State = NetState.Get SyncLock LockState If State < NetState.Get Then State = NetState.Get @@ -1096,7 +1101,7 @@ StartThread: '创建缓存文件 If IsNoSplit Then Info.Temp = Nothing - SmailFileCache = New List(Of Byte) + SmailFileCache = New Queue(Of Byte) Else Info.Temp = PathTemp & "Download\" & Uuid & "_" & Info.Uuid & "_" & RandomInteger(0, 999999) & ".tmp" ResultStream = New FileStream(Info.Temp, FileMode.Create, FileAccess.Write, FileShare.Read) @@ -1108,7 +1113,7 @@ StartThread: Dim HttpData As Byte() = New Byte(16384) {} HttpDataCount = HttpStream.Read(HttpData, 0, 16384) While (IsUnknownSize OrElse Info.DownloadUndone > 0) AndAlso '判断是否下载完成 - HttpDataCount > 0 AndAlso Not IsProgramEnded AndAlso State < NetState.Merge AndAlso (Not Info.Source.IsFailed OrElse Info.Equals(Info.Source.Thread)) + HttpDataCount > 0 AndAlso Not IsProgramEnded AndAlso State < NetState.Merge AndAlso (Not Info.Source.IsFailed OrElse Info.Equals(Info.Source.Thread)) '限速 While NetTaskSpeedLimitHigh > 0 AndAlso NetTaskSpeedLimitLeft <= 0 Threading.Thread.Sleep(16) @@ -1147,9 +1152,15 @@ StartThread: Info.DownloadDone += RealDataCount If IsNoSplit Then If HttpData.Count = RealDataCount Then - SmailFileCache.AddRange(HttpData) + 'SmailFileCache.AddRange(HttpData) + For Each B In HttpData + SmailFileCache.Enqueue(B) + Next Else - SmailFileCache.AddRange(HttpData.ToList.GetRange(0, RealDataCount)) + 'SmailFileCache.AddRange(HttpData.ToList.GetRange(0, RealDataCount)) + For i = 0 To RealDataCount - 1 + SmailFileCache.Enqueue(HttpData(i)) + Next End If Else ResultStream.Write(HttpData, 0, RealDataCount) @@ -1170,17 +1181,17 @@ StartThread: End Using End Using SourceBreak: - If HttpDataCount = 0 AndAlso Info.DownloadUndone > 0 AndAlso Not IsUnknownSize Then - '服务器无返回数据 - Throw New Exception("服务器无返回数据,但下载尚未完成") - ElseIf State = NetState.Error OrElse Info.Source.IsFailed OrElse (Info.DownloadUndone > 0 AndAlso Not IsUnknownSize) Then + If State = NetState.Error OrElse Info.Source.IsFailed OrElse (Info.DownloadUndone > 0 AndAlso Not IsUnknownSize) Then '被外部中断 Info.State = NetState.Error - Log("[Download] " & LocalName & " " & Info.Uuid & "#:中断") + Log($"[Download] {LocalName} {Info.Uuid}#:中断") + ElseIf HttpDataCount = 0 AndAlso Info.DownloadUndone > 0 AndAlso Not IsUnknownSize Then + '服务器无返回数据 + Throw New Exception($"返回的 ContentLength 过多:ContentLength 为 {ContentLength},但获取到的总数据量仅为 {Info.DownloadDone}(全文件总数据量 {DownloadDone})") Else '本线程完成 Info.State = NetState.Finish - If ModeDebug Then Log("[Download] " & LocalName & " " & Info.Uuid & "#:完成,已下载 " & GetString(Info.DownloadDone)) + If ModeDebug Then Log($"[Download] {LocalName} {Info.Uuid}#:完成,已下载 {Info.DownloadDone}") End If Catch ex As Exception '状态变更 @@ -1212,11 +1223,11 @@ SourceBreak: 'End SyncLock Info.Source.Ex = ex '根据情况判断,是否在多线程下禁用下载源(连续错误过多,或不支持断点续传) - 'BMCLAPI 的部分源在高频率请求下会返回 403,所以不应因此禁用下载源 If ex.Message.Contains("该下载源不支持") OrElse ex.Message.Contains("未能解析") OrElse ex.Message.Contains("(404)") OrElse - ex.Message.Contains("(502)") OrElse ex.Message.Contains("无返回数据") OrElse ex.Message.Contains("空间不足") OrElse ex.Message.Contains("获取到的片大小不一致") OrElse - (Info.Source.FailCount >= MathClamp(NetTaskThreadLimit, 5, 40) AndAlso DownloadDone < 1) OrElse - Info.Source.FailCount > NetTaskThreadLimit Then + ex.Message.Contains("(502)") OrElse ex.Message.Contains("无返回数据") OrElse ex.Message.Contains("空间不足") OrElse ex.Message.Contains("获取到的分段大小不一致") OrElse + (ex.Message.Contains("(403)") AndAlso Not Info.Source.Url.ContainsF("bmclapi")) OrElse 'BMCLAPI 的部分源在高频率请求下会返回 403,所以不应因此禁用下载源 + (Info.Source.FailCount >= MathClamp(NetTaskThreadLimit, 5, 30) AndAlso DownloadDone < 1) OrElse + Info.Source.FailCount > NetTaskThreadLimit + 2 Then Dim IsThisFail As Boolean = False SyncLock LockSource If Info.Source.Thread IsNot Nothing AndAlso Info.Source.Thread.Equals(Info) Then @@ -1232,8 +1243,8 @@ Wrong: End SyncLock '本线程引发下载源被禁用 If IsThisFail Then - Log("[Download] " & LocalName & " " & Uuid & "#:下载源被禁用(" & Info.Source.Id & "):" & Info.Source.Url) - Log(ex, "下载源 " & Info.Source.Id & " 已被禁用", If(ex.Message.Contains("不支持断点续传") OrElse ex.Message.Contains("(404)") OrElse ex.Message.Contains("(416)"), LogLevel.Developer, LogLevel.Debug)) + Log($"[Download] {LocalName} {Info.Uuid}#:下载源被禁用({Info.Source.Id}):{Info.Source.Url}") + Log(ex, "下载源 " & Info.Source.Id & " 已被禁用", If(ex.Message.Contains("不支持分段下载") OrElse ex.Message.Contains("(404)") OrElse ex.Message.Contains("(416)"), LogLevel.Developer, LogLevel.Debug)) If IsSourceFailed() Then '没有可用源 Log("[Download] 文件 " & LocalName & " 已无可用下载源") @@ -1265,6 +1276,7 @@ Wrong: SyncLock NetTaskThreadCountLock NetTaskThreadCount -= 1 End SyncLock + '可能在没有下载完的时候开始合并文件了,这造成了大多数合并失败 If ((FileSize >= 0 AndAlso DownloadDone >= FileSize) OrElse (FileSize = -1 AndAlso DownloadDone > 0)) AndAlso State < NetState.Merge Then Merge() End Try End Sub @@ -1287,7 +1299,6 @@ Wrong: Try Retry: SyncLock LockChain - If ModeDebug Then Log("[Download] " & LocalName & ":正在合并文件") '创建文件夹 If File.Exists(LocalPath) Then File.Delete(LocalPath) Dim Info As New FileInfo(LocalPath) @@ -1295,6 +1306,7 @@ Retry: '合并文件 If IsNoSplit Then '仅有一个线程,从缓存中输出 + If ModeDebug Then Log($"[Download] {LocalName}:下载结束,从缓存输出文件") MergeFile = New FileStream(LocalPath, FileMode.Create) AddWriter = New BinaryWriter(MergeFile) AddWriter.Write(SmailFileCache.ToArray) @@ -1302,17 +1314,19 @@ Retry: MergeFile.Dispose() : MergeFile = Nothing ElseIf Threads.DownloadDone = DownloadDone AndAlso Threads.Temp IsNot Nothing Then '仅有一个文件,直接复制 + If ModeDebug Then Log($"[Download] {LocalName}:下载结束,仅有一个文件,无需合并") CopyFile(Threads.Temp, LocalPath) Else '有多个线程,合并 + If ModeDebug Then Log($"[Download] {LocalName}:下载结束,开始合并文件") MergeFile = New FileStream(LocalPath, FileMode.Create) AddWriter = New BinaryWriter(MergeFile) For Each Thread As NetThread In Threads If Thread.DownloadDone = 0 OrElse Thread.Temp Is Nothing Then Continue For Using fs As New FileStream(Thread.Temp, FileMode.Open, FileAccess.Read, FileShare.Read) - Dim TempReader As New BinaryReader(fs) - AddWriter.Write(TempReader.ReadBytes(fs.Length)) - TempReader.Close() + Using TempReader As New BinaryReader(fs) + AddWriter.Write(TempReader.ReadBytes(Thread.DownloadDone)) + End Using End Using Next AddWriter.Dispose() : AddWriter = Nothing @@ -1329,9 +1343,9 @@ Retry: '检查文件 Dim CheckResult As String = Check?.Check(LocalPath) If CheckResult IsNot Nothing Then - Log("[Download] " & Uuid & "# 的下载线程细节:") + Log($"[Download] {LocalName} 合并文件失败,下载线程细节:") For Each Th As NetThread In Threads - Log("[Download] " & Th.Uuid & "#,状态 " & GetStringFromEnum(CType(Th.State, [Enum])) & ",字节范围 " & Th.DownloadStart & "~" & (Th.DownloadStart + Th.DownloadDone) & ",字节剩余 " & Th.DownloadUndone) + Log($"[Download] {Th.Uuid}#,状态 {GetStringFromEnum(Th.State)},范围 {Th.DownloadStart}~{Th.DownloadStart + Th.DownloadDone},完成 {Th.DownloadDone},剩余 {Th.DownloadUndone}") Next Throw New Exception(CheckResult) End If @@ -1372,19 +1386,7 @@ Retry: '凉凉 State = NetState.Error End SyncLock - Try - If File.Exists(LocalPath) Then File.Delete(LocalPath) - Catch - End Try - SyncLock NetManager.LockRemain - NetManager.FileRemain -= 1 - Log("[Download] " & LocalName & ":已失败,剩余文件 " & NetManager.FileRemain) - 'If NetManage.FileRemainList.Contains(LocalPath) Then - ' NetManage.FileRemainList.Remove(LocalPath) - 'Else - ' Log("ERROR " & LocalPath) - 'End If - End SyncLock + InterruptAndDelete() For Each Task In Tasks Task.OnFileFail(Me) Next @@ -1393,24 +1395,24 @@ Retry: ''' 下载中断。 ''' Public Sub Abort(CausedByTask As LoaderDownload) - '确认任务移除 + '从特定任务中移除,如果它还属于其他任务,则继续下载 SyncLock LockTasks Tasks.Remove(CausedByTask) - If Tasks.Count > 0 Then Exit Sub + If Tasks.Any Then Exit Sub End SyncLock '确认中断 SyncLock LockState If State >= NetState.Finish Then Exit Sub State = NetState.Error End SyncLock + InterruptAndDelete() + End Sub + Private Sub InterruptAndDelete() + On Error Resume Next + If File.Exists(LocalPath) Then File.Delete(LocalPath) SyncLock NetManager.LockRemain NetManager.FileRemain -= 1 - If ModeDebug Then Log("[Download] " & LocalName & ":已取消,剩余文件 " & NetManager.FileRemain) - 'If NetManage.FileRemainList.Contains(LocalPath) Then - ' NetManage.FileRemainList.Remove(LocalPath) - 'Else - ' Log("ERROR " & LocalPath) - 'End If + Log($"[Download] {LocalName}:状态 {State},剩余文件 {NetManager.FileRemain}") End SyncLock End Sub @@ -1426,11 +1428,6 @@ Retry: SyncLock NetManager.LockRemain NetManager.FileRemain -= 1 If PrintLog Then Log("[Download] " & LocalName & ":已完成,剩余文件 " & NetManager.FileRemain) - 'If NetManage.FileRemainList.Contains(LocalPath) Then - ' NetManage.FileRemainList.Remove(LocalPath) - 'Else - ' Log("ERROR " & LocalPath) - 'End If End SyncLock SyncLock LockTasks For Each Task In Tasks @@ -1465,7 +1462,9 @@ Retry: Public Overrides Property Progress As Double Get If State >= LoadState.Finished Then Return 1 - If Not Files.Any() Then Return 0 '必须返回 0,否则在获取列表的时候会错觉已经下载完了 + SyncLock FilesLock + If Not Files.Any() Then Return 0 '必须返回 0,否则在获取列表的时候会错觉已经下载完了 + End SyncLock Return _Progress End Get Set(value As Double) @@ -1507,7 +1506,7 @@ FinishExCatch: #End Region ''' - ''' 刷新公开属性。由 NetManager 每 0.2 秒调用一次。 + ''' 刷新公开属性。由 NetManager 每 0.1 秒调用一次。 ''' Public Sub RefreshStat() '计算进度 @@ -1519,15 +1518,15 @@ FinishExCatch: NewProgress += File.Progress * 0.2 TotalProgress += 0.2 Else - NewProgress += File.Progress '* If(File.Progress < 1, 0.9, 1) + NewProgress += File.Progress TotalProgress += 1 End If Next End SyncLock If TotalProgress > 0 Then NewProgress /= TotalProgress '刷新进度 - If NewProgress < 1 AndAlso NewProgress > 0 Then NewProgress = 1 - (1 - NewProgress) ^ 0.9 'MathBezier(NewProgress, 0, 0.05, 1, 0.8, 0.0001) - _Progress = NewProgress * 0.99 + 0.01 + If NewProgress < 1 AndAlso NewProgress > 0 Then NewProgress = 2 * (NewProgress ^ 3) - 3 * (NewProgress ^ 2) + 2 * NewProgress '2x^3-3x^2+2x,模拟开头和结尾更慢的情况 + _Progress = NewProgress End Sub Public Sub New(Name As String, FileTasks As List(Of NetFile)) @@ -1556,71 +1555,72 @@ NextElement: End SyncLock State = LoadState.Loading '开始执行 - RunInNewThread(Sub() - Try - '输入检测 - If Not Files.Any() Then - OnFinish() - Exit Sub - End If - For Each File As NetFile In Files - If File Is Nothing Then Throw New ArgumentException("存在空文件请求!") - For Each Source As NetSource In File.Sources - If Not (Source.Url.StartsWithF("https://", True) OrElse Source.Url.StartsWithF("http://", True)) Then - Source.Ex = New ArgumentException("输入的下载链接不正确!") - Source.IsFailed = True - End If - Next - If File.IsSourceFailed() Then Throw New ArgumentException("输入的下载链接不正确!") - If Not File.LocalPath.ToLower.Contains(":\") Then Throw New ArgumentException("输入的本地文件地址不正确!") - If File.LocalPath.EndsWithF("\") Then Throw New ArgumentException("请输入含文件名的完整文件路径!") - '文件夹检测 - Dim DirPath As String = New FileInfo(File.LocalPath).Directory.FullName - If Not Directory.Exists(DirPath) Then Directory.CreateDirectory(DirPath) - Next - '接入下载管理器 - NetManager.Start(Me) - '将文件分配给多个线程以进行已存在查找 - Dim Folders As New List(Of String) '可能会用于已存在查找的文件夹列表 - Dim FoldersFinal As New List(Of String) '最终用于查找的列表 - If Not Setup.Get("SystemDebugSkipCopy") Then '在设置中禁用复制 - Folders.Add(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\.minecraft\") '总是添加官启文件夹,因为 HMCL 会把所有文件存在这里 - For Each Folder In McFolderList - Folders.Add(Folder.Path) - Next - Folders = Folders.Distinct.ToList - For Each Folder In Folders - If Folder <> PathMcFolder AndAlso Directory.Exists(Folder) Then FoldersFinal.Add(Folder) - Next - End If - '最多 5 个线程,最少每个线程分配 10 个文件 - SyncLock FilesLock - Dim FilesPerThread As Integer = Math.Max(5, Files.Count / 10 + 1) - Dim FilesInThread As New List(Of NetFile) - For Each File In Files - FilesInThread.Add(File) - If FilesInThread.Count = FilesPerThread Then - Dim FilesToRun As New List(Of NetFile) - FilesToRun.AddRange(FilesInThread) - RunInNewThread(Sub() StartCopy(FilesToRun, FoldersFinal), "NetTask FileCopy " & Uuid) - FilesInThread.Clear() - End If - Next - If FilesInThread.Count > 0 Then - Dim FilesToRun As New List(Of NetFile) - FilesToRun.AddRange(FilesInThread) - RunInNewThread(Sub() StartCopy(FilesToRun, FoldersFinal), "NetTask FileCopy " & Uuid) - FilesInThread.Clear() - End If - End SyncLock - Catch ex As Exception - OnFail(New List(Of Exception) From {ex}) - End Try - End Sub, "NetTask " & Uuid & " Main") + RunInNewThread( + Sub() + Try + '输入检测 + If Not Files.Any() Then + OnFinish() + Exit Sub + End If + For Each File As NetFile In Files + If File Is Nothing Then Throw New ArgumentException("存在空文件请求!") + For Each Source As NetSource In File.Sources + If Not (Source.Url.StartsWithF("https://", True) OrElse Source.Url.StartsWithF("http://", True)) Then + Source.Ex = New ArgumentException("输入的下载链接不正确!") + Source.IsFailed = True + End If + Next + If File.IsSourceFailed() Then Throw New ArgumentException("输入的下载链接不正确!") + If Not File.LocalPath.ToLower.Contains(":\") Then Throw New ArgumentException("输入的本地文件地址不正确!") + If File.LocalPath.EndsWithF("\") Then Throw New ArgumentException("请输入含文件名的完整文件路径!") + '文件夹检测 + Dim DirPath As String = New FileInfo(File.LocalPath).Directory.FullName + If Not Directory.Exists(DirPath) Then Directory.CreateDirectory(DirPath) + Next + '接入下载管理器 + NetManager.Start(Me) + '将文件分配给多个线程以进行已存在查找 + Dim Folders As New List(Of String) '可能会用于已存在查找的文件夹列表 + Dim FoldersFinal As New List(Of String) '最终用于查找的列表 + If Not Setup.Get("SystemDebugSkipCopy") Then '在设置中禁用复制 + Folders.Add(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\.minecraft\") '总是添加官启文件夹,因为 HMCL 会把所有文件存在这里 + For Each Folder In McFolderList + Folders.Add(Folder.Path) + Next + Folders = Folders.Distinct.ToList + For Each Folder In Folders + If Folder <> PathMcFolder AndAlso Directory.Exists(Folder) Then FoldersFinal.Add(Folder) + Next + End If + '最多 5 个线程,最少每个线程分配 10 个文件 + SyncLock FilesLock + Dim FilesPerThread As Integer = Math.Max(5, Files.Count / 10 + 1) + Dim FilesInThread As New List(Of NetFile) + For Each File In Files + FilesInThread.Add(File) + If FilesInThread.Count = FilesPerThread Then + Dim FilesToRun As New List(Of NetFile) + FilesToRun.AddRange(FilesInThread) + RunInNewThread(Sub() StartCopy(FilesToRun, FoldersFinal), "NetTask FileCopy " & Uuid) + FilesInThread.Clear() + End If + Next + If FilesInThread.Any Then + Dim FilesToRun As New List(Of NetFile) + FilesToRun.AddRange(FilesInThread) + RunInNewThread(Sub() StartCopy(FilesToRun, FoldersFinal), "NetTask FileCopy " & Uuid) + FilesInThread.Clear() + End If + End SyncLock + Catch ex As Exception + OnFail(New List(Of Exception) From {ex}) + End Try + End Sub, "NetTask " & Uuid & " Main") End Sub Private Sub StartCopy(Files As List(Of NetFile), FolderList As List(Of String)) Try - If ModeDebug Then Log("[Download] 检查线程分配文件数:" & Files.Count) + If ModeDebug Then Log("[Download] 检查线程分配文件数:" & Files.Count & ",线程名:" & Thread.CurrentThread.Name) '试图从已存在的 Minecraft 文件夹中寻找目标文件 Dim ExistFiles As New List(Of KeyValuePair(Of NetFile, String)) '{NetFile, Target As String} For Each File As NetFile In Files @@ -1702,14 +1702,13 @@ Retry: If ExList Is Nothing OrElse Not ExList.Any() Then ExList = New List(Of Exception) From {New Exception("未知错误!")} '寻找第一个不是 404 的下载源 Dim UsefulExs = ExList.Where(Function(e) Not e.Message.Contains("(404)")).ToList - [Error] = If(UsefulExs.Count > 0, UsefulExs(0), ExList(0)) + [Error] = If(UsefulExs.Any, UsefulExs(0), ExList(0)) '获取实际失败的文件 SyncLock FilesLock For Each File In Files If File.State = NetState.Error Then [Error] = New Exception("文件下载失败:" & File.LocalPath & vbCrLf & Join( - File.Sources.Select(Function(s) If(s.Ex Is Nothing, s.Url, s.Ex.Message & "(" & s.Url & ")")).ToList(), - vbCrLf), [Error]) + File.Sources.Select(Function(s) If(s.Ex Is Nothing, s.Url, s.Ex.Message & "(" & s.Url & ")")), vbCrLf), [Error]) Exit For End If Next @@ -1794,9 +1793,9 @@ Retry: ''' Private SpeedLastDone As Long = 0 ''' - ''' 最近 10 次下载速度的记录,较新的在后面。间隔为 0.2 秒,故记录了 2 秒的速度。 + ''' 至多最近 30 次下载速度的记录,较新的在前面。 ''' - Public SpeedLast As New List(Of Long) From {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + Private SpeedLast As New List(Of Long) '这些属性由 RefreshStat 刷新 ''' ''' 当前的全局下载速度,单位为 Byte / 秒。 @@ -1808,28 +1807,29 @@ Retry: #End Region ''' - ''' 进度与下载速度由下载管理线程每隔约 0.2 秒刷新一次。 + ''' 进度与下载速度由下载管理线程每隔约 0.1 秒刷新一次。 ''' Private Sub RefreshStat() Try Dim DeltaTime As Long = GetTimeTick() - RefreshStatLast RefreshStatLast += DeltaTime #Region "刷新整体速度" - '计算即时速度 + '计算瞬时速度 Dim ActualSpeed As Double = Math.Max(0, (DownloadDone - SpeedLastDone) / (DeltaTime / 1000)) - SpeedLast.Add(ActualSpeed) - SpeedLast.RemoveAt(0) + SpeedLast.Insert(0, ActualSpeed) + If SpeedLast.Count >= 31 Then SpeedLast.RemoveAt(30) SpeedLastDone = DownloadDone '计算用于显示的速度 - 'If SpeedLast(9) = 0 Then - ' Speed = 0 - 'Else - Speed = (SpeedLast(9) + SpeedLast(8) * 0.9 + SpeedLast(7) * 0.8 + SpeedLast(6) * 0.7 + SpeedLast(5) * 0.6 + SpeedLast(4) * 0.5 + SpeedLast(3) * 0.4 + SpeedLast(2) * 0.3 + SpeedLast(1) * 0.2 + SpeedLast(0) * 0.1) / 5.5 - 'End If + Dim SpeedSum As Long = 0, SpeedDiv As Long = 0, Weight = SpeedLast.Count + For Each SpeedRecord In SpeedLast + SpeedSum += SpeedRecord * Weight + SpeedDiv += Weight + Weight -= 1 + Next + Speed = If(SpeedDiv > 0, SpeedSum / SpeedDiv, 0) '计算新的速度下限 - SpeedLast.Add(ActualSpeed) - SpeedLast.RemoveAt(0) - Dim Limit As Long = Math.Min(Math.Min(Math.Min(Math.Min(SpeedLast(5), SpeedLast(6)), SpeedLast(7)), SpeedLast(8)), SpeedLast(9)) * 0.9 + Dim Limit As Long = 0 + If SpeedLast.Count >= 10 Then Limit = SpeedLast.Take(10).Average * 0.85 '取近 1 秒的平均速度的 85% If Limit > NetTaskSpeedLimitLow Then NetTaskSpeedLimitLow = Limit Log("[Download] " & "速度下限已提升到 " & GetString(Limit)) @@ -1854,128 +1854,65 @@ Retry: Private Sub StartManager() If IsManagerStarted Then Exit Sub IsManagerStarted = True - RunInNewThread( - Sub() + Dim ThreadStarter = + Sub(Id As Integer) '0 或 1 Try - Dim LastLoopTime As Long While True - LastLoopTime = GetTimeTick() + Thread.Sleep(20) '若已完成,则清空 - If FileRemain = 0 AndAlso Files.Count > 0 Then + If Id = 0 AndAlso FileRemain = 0 AndAlso Files.Any() Then SyncLock LockFiles Files.Clear() End SyncLock End If - '开启新线程 - If Speed < NetTaskSpeedLimitLow OrElse FileRemain > NetTaskThreadLimit Then - '速度小于下限或剩余文件还贼多,尝试开启线程 - Dim IsSuccess As Boolean = False - Dim NewThreadCount As Integer - '确定最大线程追加数 - NewThreadCount = Math.Max(FileRemain, MathClamp(NetTaskThreadCount / 2, 1, 4)) - NewThreadCount = Math.Floor(NewThreadCount / 2) '双线程启用减半 - NewThreadCount = MathClamp(NewThreadCount, 1, NetTaskThreadLimit) - '循环追加 - Do - IsSuccess = False - '启动 Wait 的文件后立即会变成 Connect,导致第二次循环再次调用,所以需要先暂时存储进去…… - '此外为了减少 LockFiles 的占用时间,所以先遍历列表再开始 - Dim FilesWaiting As New List(Of NetFile) - Dim FilesLoading As New List(Of NetFile) - SyncLock LockFiles - For Each File As NetFile In Files.Values - If File.RandomCode Mod 2 = 0 Then Continue For - If File.State = NetState.WaitForDownload Then - FilesWaiting.Add(File) - ElseIf File.State < NetState.Merge Then - FilesLoading.Add(File) - End If - Next - End SyncLock - '为文件列表中的文件开始线程 - For Each File As NetFile In FilesWaiting - If NewThreadCount = 0 Then Exit For - If File.TryBeginThread() Then - IsSuccess = True - NewThreadCount -= 1 + '获取文件列表 + Dim AllFiles As List(Of NetFile) + SyncLock LockFiles + AllFiles = Files.Values.ToList() + End SyncLock + Dim WaitingFiles As New List(Of NetFile) + Dim OngoingFiles As New List(Of NetFile) + For Each File As NetFile In AllFiles + If File.Uuid Mod 2 = Id Then Continue For + If File.State = NetState.WaitForDownload Then + WaitingFiles.Add(File) + ElseIf File.State < NetState.Merge Then + OngoingFiles.Add(File) + End If + Next + '为等待中的文件开始线程 + For Each File As NetFile In WaitingFiles + If NetTaskThreadCount >= NetTaskThreadLimit Then Continue While '最大线程数检查 + Dim NewThread = File.TryBeginThread() + If NewThread IsNot Nothing AndAlso NewThread.Source.Url.Contains("bmclapi.") Then Thread.Sleep(40) '减少 BMCLAPI 请求频率,避免 Too Many Requests + Next + '为进行中的文件追加线程 + If Speed >= NetTaskSpeedLimitLow Then Continue While '下载速度足够,无需新增 + For Each File As NetFile In OngoingFiles + If NetTaskThreadCount >= NetTaskThreadLimit Then Continue While '最大线程数检查 + '线程种类计数 + Dim PreparingCount = 0, DownloadingCount = 0 + If File.Threads IsNot Nothing Then + For Each Thread As NetThread In File.Threads.ToList + If Thread.State < NetState.Download Then + PreparingCount += 1 + ElseIf Thread.State = NetState.Download Then + DownloadingCount += 1 End If Next - For Each File As NetFile In FilesLoading - If NewThreadCount = 0 Then Exit For - If File.TryBeginThread() Then - IsSuccess = True - NewThreadCount -= 1 - End If - Next - '等待 40 ms:BMCLAPI 部分时候有 20QPS 的限制 - Thread.Sleep(40) - Loop While NewThreadCount > 0 AndAlso IsSuccess - End If - '等待 40 ms - Thread.Sleep(40) + End If + '新增线程 + If PreparingCount > DownloadingCount Then Continue For '准备中的线程已多于下载中的线程,不再新增 + Dim NewThread = File.TryBeginThread() + If NewThread IsNot Nothing AndAlso NewThread.Source.Url.Contains("bmclapi.") Then Thread.Sleep(40) '减少 BMCLAPI 请求频率,避免 Too Many Requests + Next End While Catch ex As Exception - Log(ex, "下载管理启动线程 1 出错", LogLevel.Assert) + Log(ex, $"下载管理启动线程 {Id} 出错", LogLevel.Assert) End Try - End Sub, "NetManager ThreadStarter Single") - RunInNewThread( - Sub() - Try - Dim LastLoopTime As Long - While True - LastLoopTime = GetTimeTick() - '开启新线程 - If Speed < NetTaskSpeedLimitLow OrElse FileRemain > NetTaskThreadLimit Then - '速度小于下限或剩余文件还贼多,尝试开启线程 - Dim IsSuccess As Boolean = False - Dim NewThreadCount As Integer - '确定最大线程追加数 - NewThreadCount = Math.Max(FileRemain, MathClamp(NetTaskThreadCount / 2, 1, 4)) - NewThreadCount = Math.Floor(NewThreadCount / 2) '双线程启用减半 - NewThreadCount = MathClamp(NewThreadCount, 1, NetTaskThreadLimit) - '循环追加 - Do - IsSuccess = False - '启动 Wait 的文件后立即会变成 Connect,导致第二次循环再次调用,所以需要先暂时存储进去…… - '此外为了减少 LockFiles 的占用时间,所以先遍历列表再开始 - Dim FilesWaiting As New List(Of NetFile) - Dim FilesLoading As New List(Of NetFile) - SyncLock LockFiles - For Each File As NetFile In Files.Values - If File.RandomCode Mod 2 = 1 Then Continue For - If File.State = NetState.WaitForDownload Then - FilesWaiting.Add(File) - ElseIf File.State < NetState.Merge Then - FilesLoading.Add(File) - End If - Next - End SyncLock - '为文件列表中的文件开始线程 - For Each File As NetFile In FilesWaiting - If NewThreadCount = 0 Then Exit For - If File.TryBeginThread() Then - IsSuccess = True - NewThreadCount -= 1 - End If - Next - For Each File As NetFile In FilesLoading - If NewThreadCount = 0 Then Exit For - If File.TryBeginThread() Then - IsSuccess = True - NewThreadCount -= 1 - End If - Next - '等待 40 ms:BMCLAPI 部分时候有 20QPS 的限制 - Thread.Sleep(40) - Loop While NewThreadCount > 0 AndAlso IsSuccess - End If - '等待 40 ms - Thread.Sleep(40) - End While - Catch ex As Exception - Log(ex, "下载管理启动线程 2 出错", LogLevel.Assert) - End Try - End Sub, "NetManager ThreadStarter Odd") + End Sub + RunInNewThread(Sub() ThreadStarter(0), "NetManager ThreadStarter 0") + RunInNewThread(Sub() ThreadStarter(1), "NetManager ThreadStarter 1") RunInNewThread( Sub() Try @@ -1989,8 +1926,8 @@ Retry: NetTaskSpeedLimitLeftLast = TimeNow '刷新公开属性 RefreshStat() - '等待直至 170 ms - Do While GetTimeTick() - LastLoopTime < 170 + '等待直至 80 ms + Do While GetTimeTick() - LastLoopTime < 80 Thread.Sleep(10) Loop End While diff --git a/Plain Craft Launcher 2/Modules/Base/ModValidate.vb b/Plain Craft Launcher 2/Modules/Base/ModValidate.vb index a89dcc3..b7f818b 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModValidate.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModValidate.vb @@ -149,7 +149,7 @@ Public Class ValidateExcept End Sub Public Overrides Function Validate(Str As String) As String For Each Ch As String In Excepts - If Str.IndexOfF(Ch, StringComparison.OrdinalIgnoreCase) >= 0 Then + If Str.IndexOfF(Ch, True) >= 0 Then If IsNothing(ErrorMessage) Then ErrorMessage = "" Return ErrorMessage.Replace("%", Ch) End If @@ -355,26 +355,3 @@ Fin: Return "" End Function End Class - -''' -''' 敏感词过滤。 -''' -Public Class ValidateFilter - Inherits Validate - Private Shared Excepts As String() = SecretDecrypt(SecretSensitiveWordsRaw).Split("|") - Public Sub New() - End Sub '用于 XAML 初始化 - Public Overrides Function Validate(Str As String) As String - '提取无间隔符的字符串 - Dim RealStr As String = "" - For Each St In If(Str, "").ToLower - If String.IsNullOrWhiteSpace(St.ToString) OrElse ("!@#$%^&*()_+-={}[]|\;':"",./<>? ~ ·!¥…()—,。、《》?‘;:【】{}" & vbLQ & vbRQ).ToCharArray.Contains(St) Then Continue For - RealStr += St - Next - '检查 - For Each Except In Excepts - If RealStr.Contains(Except) Then Return "存在敏感内容!" - Next - Return "" - End Function -End Class diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb index cc112ad..39dbf53 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb @@ -265,7 +265,7 @@ Next CurseForgeFileIds = Files.Select(Function(f) f.Key).Distinct.ToList GameVersions = Files.SelectMany(Function(f) f.Value).Where(Function(v) v.StartsWithF("1.")). - Select(Function(v) CInt(Val(v.Split(".")(1).Split("-").First))).Where(Function(v) v > 0). + Select(Function(v) CInt(Val(v.Split(".")(1).Before("-")))).Where(Function(v) v > 0). Distinct.OrderByDescending(Function(v) v).ToList ModLoaders = ModLoaders.Distinct.OrderBy(Of Integer)(Function(t) t).ToList 'Type @@ -342,7 +342,7 @@ '搜索结果的键为 versions,获取特定工程的键为 game_versions GameVersions = If(CType(If(Data("game_versions"), Data("versions")), JArray), New JArray). Select(Function(v) v.ToString).Where(Function(v) v.StartsWithF("1.")). - Select(Of Integer)(Function(v) Val(v.Split(".")(1).Split("-").First)).Where(Function(v) v > 0). + Select(Of Integer)(Function(v) Val(v.Split(".")(1).Before("-"))).Where(Function(v) v > 0). Distinct.OrderByDescending(Function(v) v).ToList 'Type Select Case Data("project_type").ToString @@ -414,10 +414,10 @@ Json("Website") = Website If LastUpdate IsNot Nothing Then Json("LastUpdate") = LastUpdate Json("DownloadCount") = DownloadCount - If ModLoaders IsNot Nothing AndAlso ModLoaders.Count > 0 Then Json("ModLoaders") = New JArray(ModLoaders.Select(Function(m) CInt(m))) + If ModLoaders IsNot Nothing AndAlso ModLoaders.Any Then Json("ModLoaders") = New JArray(ModLoaders.Select(Function(m) CInt(m))) Json("Tags") = New JArray(Tags) If LogoUrl IsNot Nothing Then Json("LogoUrl") = LogoUrl - If GameVersions.Count > 0 Then Json("GameVersions") = New JArray(GameVersions) + If GameVersions.Any Then Json("GameVersions") = New JArray(GameVersions) Json("CacheTime") = Date.Now '用于检查缓存时间 Return Json End Function @@ -576,9 +576,9 @@ '有中文翻译 '尝试将文本分为三段:Title (EnglishName) - Suffix '检查时注意 Carpet:它没有中文译名,但有 Suffix - Title = TranslatedName.Split(" (").First.Split(" - ").First + Title = TranslatedName.Before(" (").Before(" - ") Dim Suffix As String = "" - If TranslatedName.Split(")").Last.Contains(" - ") Then Suffix = TranslatedName.Split(")").Last.Split(" - ").Last + If TranslatedName.After(")").Contains(" - ") Then Suffix = TranslatedName.After(")").After(" - ") Dim EnglishName As String = TranslatedName If Suffix <> "" Then EnglishName = EnglishName.Replace(" - " & Suffix, "") EnglishName = EnglishName.Replace(Title, "").Trim("("c, ")"c, " "c) @@ -593,10 +593,10 @@ '添加后缀 If Suffix <> "" Then SubtitleList.Add(Suffix) End If - SubtitleList = SubtitleList.Distinct().ToList() + SubtitleList = SubtitleList.Distinct.ToList() '设置标题与描述 Dim Subtitle As String = "" - If SubtitleList.Count > 0 Then + If SubtitleList.Any Then For Each Ex In SubtitleList Dim IsModLoaderDescription As Boolean = Ex.ToLower.Contains("forge") OrElse Ex.ToLower.Contains("fabric") OrElse Ex.ToLower.Contains("quilt") @@ -751,7 +751,7 @@ NoSubtitle: Case CompType.ResourcePack 'FUTURE: Res End Select - Address += "&categoryId=" & If(Tag = "", "0", Tag.Split("/").First) + Address += "&categoryId=" & If(Tag = "", "0", Tag.Before("/")) If ModLoader <> CompModLoaderType.Any Then Address += "&modLoaderType=" & CType(ModLoader, Integer) If Not String.IsNullOrEmpty(GameVersion) Then Address += "&gameVersion=" & GameVersion If Not String.IsNullOrEmpty(SearchText) Then Address += "&searchFilter=" & Net.WebUtility.UrlEncode(SearchText) @@ -772,7 +772,7 @@ NoSubtitle: 'facets=[["categories:'game-mechanics'"],["categories:'forge'"],["versions:1.19.3"],["project_type:mod"]] Dim Facets As New List(Of String) Facets.Add($"[""project_type:{GetStringFromEnum(Type).ToLower}""]") - If Not String.IsNullOrEmpty(Tag) Then Facets.Add($"[""categories:'{Tag.Split("/").Last}'""]") + If Not String.IsNullOrEmpty(Tag) Then Facets.Add($"[""categories:'{Tag.After("/")}'""]") If ModLoader <> CompModLoaderType.Any Then Facets.Add($"[""categories:'{GetStringFromEnum(ModLoader).ToLower}'""]") If Not String.IsNullOrEmpty(GameVersion) Then Facets.Add($"[""versions:'{GameVersion}'""]") Address += "&facets=[" & String.Join(",", Facets) & "]" @@ -880,7 +880,7 @@ NoSubtitle: If Not SearchResults(i).AbsoluteRight AndAlso i >= Math.Min(2, SearchResults.Count - 1) Then Exit For '把 3 个结果拼合以提高准确度 If SearchResults(i).Item.CurseForgeSlug IsNot Nothing Then SearchResult += SearchResults(i).Item.CurseForgeSlug.Replace("-", " ").Replace("/", " ") & " " If SearchResults(i).Item.ModrinthSlug IsNot Nothing Then SearchResult += SearchResults(i).Item.ModrinthSlug.Replace("-", " ").Replace("/", " ") & " " - SearchResult += SearchResults(i).Item.ChineseName.Split(" (").Last.TrimEnd(") ").Split(" - ").First. + SearchResult += SearchResults(i).Item.ChineseName.After(" (").TrimEnd(") ").Before(" - "). Replace(":", "").Replace("(", "").Replace(")", "").ToLower.Replace("/", " ") & " " Next Log("[Comp] 中文搜索原始关键词:" & SearchResult, LogLevel.Developer) @@ -1046,7 +1046,7 @@ Retry: '这样做的话,去重后将优先保留 CurseForge 内容(考虑到 CurseForge 热度更高) RawResults = RawResults.Where(Function(x) Not x.FromCurseForge).Concat(RawResults.Where(Function(x) x.FromCurseForge)).ToList 'RawResults 去重 - RawResults = Distinct(RawResults, Function(a, b) a.IsLike(b)) + RawResults = RawResults.Distinct(Function(a, b) a.IsLike(b)) '已有内容去重 RawResults = RawResults.Where(Function(r) Not RealResults.Any(Function(b) r.IsLike(b)) AndAlso Not Storage.Results.Any(Function(b) r.IsLike(b))).ToList @@ -1133,7 +1133,7 @@ Retry: '描述性信息 ''' - ''' 文件描述名(并非文件名,是自定义的字段)。 + ''' 文件描述名(并非文件名,是自定义的字段)。对很多 Mod,这会给出 Mod 版本号。 ''' Public DisplayName As String ''' @@ -1305,7 +1305,7 @@ Retry: 'GameVersions Dim RawVersions As List(Of String) = Data("game_versions").Select(Function(t) t.ToString.Trim.ToLower).ToList GameVersions = RawVersions.Where(Function(v) v.StartsWithF("1.") OrElse v.StartsWithF("b1.")). - Select(Function(v) If(v.Contains("-"), v.Split("-").First & " 快照", If(v.StartsWithF("b1."), "远古版本", v))).ToList + Select(Function(v) If(v.Contains("-"), v.Before("-") & " 快照", If(v.StartsWithF("b1."), "远古版本", v))).ToList If GameVersions.Count > 1 Then GameVersions = Sort(GameVersions, AddressOf VersionSortBoolean).ToList If Type = CompType.ModPack Then GameVersions = New List(Of String) From {GameVersions(0)} @@ -1356,9 +1356,9 @@ Retry: Dim Info As String = "" Select Case Type Case CompType.Mod - Info += If(ModLoaders.Count > 0, + Info += If(ModLoaders.Any, "适用于 " & Join(ModLoaders.Select(Function(m) GetStringFromEnum(m)).ToList, "/") & ",", "") - Info += If(ModeDebug AndAlso Dependencies.Count > 0, Dependencies.Count & " 个前置 Mod,", "") + Info += If(ModeDebug AndAlso Dependencies.Any, Dependencies.Count & " 个前置 Mod,", "") Case CompType.ModPack If GameVersions.All(Function(v) v.Contains("w")) Then Info += $"游戏版本 {Join(GameVersions, "、")}," @@ -1403,7 +1403,7 @@ Retry: '辅助函数 Public Overrides Function ToString() As String - Return $"{Id}: {DisplayName}" + Return $"{Id}: {FileName}" End Function End Class @@ -1444,15 +1444,15 @@ Retry: 'Modrinth ResultJsonArray = NetGetCodeByRequestRetry($"https://api.modrinth.com/v2/project/{ProjectId}/version", Accept:="application/json", IsJson:=True) End If - CompFilesCache(ProjectId) = Distinct(ResultJsonArray.Select(Function(a) New CompFile(a, TargetProject.Type)). - Where(Function(a) a.Available).ToList, Function(a, b) a.Id = b.Id) 'CurseForge 可能会重复返回相同项(#1330) + CompFilesCache(ProjectId) = ResultJsonArray.Select(Function(a) New CompFile(a, TargetProject.Type)). + Where(Function(a) a.Available).ToList.Distinct(Function(a, b) a.Id = b.Id) 'CurseForge 可能会重复返回相同项(#1330) '获取前置 Mod 列表 If TargetProject.Type <> CompType.Mod Then Return CompFilesCache(ProjectId) Dim Deps As List(Of String) = CompFilesCache(ProjectId). SelectMany(Function(f) f.RawDependencies).Distinct().ToList Dim UndoneDeps = Deps.Where(Function(f) Not CompProjectCache.ContainsKey(f)).ToList '获取前置 Mod 工程信息 - If UndoneDeps.Count > 0 Then + If UndoneDeps.Any Then Log($"[Comp] {ProjectId} 文件列表中还需要获取信息的前置 Mod:{Join(UndoneDeps, ",")}") Dim Projects As JArray If TargetProject.FromCurseForge Then @@ -1467,7 +1467,7 @@ Retry: Next End If '更新前置 Mod 信息 - If Deps.Count > 0 Then + If Deps.Any Then For Each DepProject In Deps.Select(Function(id) CompProjectCache(id)) For Each File In CompFilesCache(ProjectId) If File.RawDependencies.Contains(DepProject.Id) AndAlso DepProject.Id <> ProjectId Then diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb index 01bba12..ef52547 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb @@ -94,7 +94,7 @@ Log(ex, "读取可能的崩溃日志文件失败(" & FilePath & ")") End Try Next - If LatestLog IsNot Nothing AndAlso LatestLog.Count > 0 Then + If LatestLog IsNot Nothing AndAlso LatestLog.Any Then Dim RawOutput As String = Join(LatestLog, vbCrLf) Log("[Crash] 以下为游戏输出的最后一段内容:" & vbCrLf & RawOutput) WriteFile(TempFolder & "RawOutput.log", RawOutput) @@ -110,21 +110,20 @@ Public Sub Import(FilePath As String) Log("[Crash] 步骤 1:自主导入日志文件") - '解压压缩包 + '尝试视作压缩包解压 Try Dim Info As New FileInfo(FilePath) - If Not Info.Exists OrElse Info.Length = 0 Then Exit Try - If Not FilePath.EndsWithF(".jar", True) AndAlso ExtractFile(FilePath, TempFolder & "Temp\") Then - '解压成功 + If Info.Exists AndAlso Info.Length > 0 AndAlso Not FilePath.EndsWithF(".jar", True) Then + ExtractFile(FilePath, TempFolder & "Temp\") Log("[Crash] 已解压导入的日志文件:" & FilePath) - Else - '解压失败 - CopyFile(FilePath, TempFolder & "Temp\" & GetFileNameFromPath(FilePath)) - Log("[Crash] 已复制导入的日志文件:" & FilePath) + GoTo Extracted End If - Catch ex As Exception - Log(ex, "解压导入文件中的压缩包失败") + Catch End Try + '并非压缩包 + CopyFile(FilePath, TempFolder & "Temp\" & GetFileNameFromPath(FilePath)) + Log("[Crash] 已复制导入的日志文件:" & FilePath) +Extracted: '导入其中的日志文件 For Each TargetFile As FileInfo In New DirectoryInfo(TempFolder & "Temp\").EnumerateFiles.ToList() @@ -313,16 +312,30 @@ End Function ''' - ''' 输出字符串的前后某些行,并统一行尾为 vbLf (\r)、删除空行。 + ''' 输出字符串的前后某些行,并统一行尾为 vbLf (正则 \n)、删除空行和重复行。 ''' Private Function GetHeadTailLines(Raw As String(), HeadLines As Integer, TailLines As Integer) As String - If Raw.Length <= HeadLines + TailLines Then Return Join(Raw, vbLf) + If Raw.Length <= HeadLines + TailLines Then Return Join(Raw.Distinct, vbLf) + Dim Lines As New List(Of String) + Dim RealHeadLines As Integer = 0, ViewedLines As Integer + For ViewedLines = 0 To Raw.Length - 1 + If Lines.Contains(Raw(ViewedLines)) Then Continue For + RealHeadLines += 1 + Lines.Add(Raw(ViewedLines)) + If RealHeadLines >= HeadLines Then Exit For + Next + Dim RealTailLines = 0 + For i = Raw.Length - 1 To ViewedLines Step -1 + If Lines.Contains(Raw(i)) Then Continue For + RealTailLines += 1 + Lines.Insert(RealHeadLines, Raw(i)) + If RealTailLines >= TailLines Then Exit For + Next Dim Result As New StringBuilder - For i = 0 To Raw.Count - 1 - If i < HeadLines OrElse Raw.Count - i < TailLines Then - If Raw(i) = "" Then Continue For - Result.Append(Raw(i) & vbLf) - End If + For Each Line In Lines + If Line = "" Then Continue For + Result.Append(Line) + Result.Append(vbLf) Next Return Result.ToString End Function @@ -354,6 +367,7 @@ 光影或资源包导致OpenGL1282错误 文件或内容校验失败 确定Mod导致游戏崩溃 + 怀疑Mod导致游戏崩溃 Mod配置文件导致游戏崩溃 ModMixin失败 Mod加载器报错 @@ -389,9 +403,9 @@ '1. 精准日志匹配,中/高优先级 AnalyzeCrit1() - If CrashReasons.Count > 0 Then GoTo Done + If CrashReasons.Any Then GoTo Done AnalyzeCrit2() - If CrashReasons.Count > 0 Then GoTo Done + If CrashReasons.Any Then GoTo Done '2. 堆栈分析 If LogAll.Contains("orge") OrElse LogAll.Contains("abric") OrElse LogAll.Contains("uilt") OrElse LogAll.Contains("iteloader") Then @@ -399,27 +413,25 @@ '崩溃日志 If LogCrash IsNot Nothing Then Log("[Crash] 开始进行崩溃日志堆栈分析") - Dim StackLogs As String = LogCrash.Split("System Details").First - Keywords.AddRange(AnalyzeStackKeyword(StackLogs)) + Keywords.AddRange(AnalyzeStackKeyword(LogCrash.Before("System Details"))) End If 'Minecraft 日志 If LogMc IsNot Nothing Then - Dim Fatals = RegexSearch(LogMc, "/FATAL] [\w\W]+?(?=[\n]+\[)") + Dim Fatals As List(Of String) = RegexSearch(LogMc, "/FATAL] .+?(?=[\n]+\[)") + If LogMc.Contains("Unreported exception thrown!") Then Fatals.Add(LogMc.Between("Unreported exception thrown!", "at oolloo.jlw.Wrapper")) Log("[Crash] 开始进行 Minecraft 日志堆栈分析,发现 " & Fatals.Count & " 个报错项") - If Fatals.Count > 0 Then - For Each Fatal In Fatals - Keywords.AddRange(AnalyzeStackKeyword(Fatal)) - Next - End If + For Each Fatal In Fatals + Keywords.AddRange(AnalyzeStackKeyword(Fatal)) + Next End If '虚拟机日志 If LogHs IsNot Nothing Then Log("[Crash] 开始进行虚拟机堆栈分析") - Dim StackLogs As String = LogHs.Split("Registers:").First.Split("T H R E A D").Last + Dim StackLogs As String = LogHs.Between("T H R E A D", "Registers:") Keywords.AddRange(AnalyzeStackKeyword(StackLogs)) End If 'Mod 名称分析 - If Keywords.Count > 0 Then + If Keywords.Any Then Dim Names = AnalyzeModName(Keywords) If Names Is Nothing Then AppendReason(CrashReason.堆栈分析发现关键字, Keywords) @@ -442,7 +454,7 @@ Done: Else Log("[Crash] 步骤 3:分析崩溃原因完成,找到 " & CrashReasons.Count & " 条可能的原因") For Each Reason In CrashReasons - Log("[Crash] - " & GetStringFromEnum(Reason.Key) & If(Reason.Value.Count > 0, "(" & Join(Reason.Value, ";") & ")", "")) + Log("[Crash] - " & GetStringFromEnum(Reason.Key) & If(Reason.Value.Any, "(" & Join(Reason.Value, ";") & ")", "")) Next End If End Sub @@ -458,7 +470,7 @@ Done: Else CrashReasons.Add(Reason, New List(Of String)(If(Additional, {}))) End If - Log("[Crash] 可能的崩溃原因:" & GetStringFromEnum(Reason) & If(Additional IsNot Nothing AndAlso Additional.Count > 0, "(" & Join(Additional, ";") & ")", "")) + Log("[Crash] 可能的崩溃原因:" & GetStringFromEnum(Reason) & If(Additional IsNot Nothing AndAlso Additional.Any, "(" & Join(Additional, ";") & ")", "")) End Sub Private Sub AppendReason(Reason As CrashReason, Additional As String) AppendReason(Reason, If(String.IsNullOrEmpty(Additional), Nothing, New List(Of String) From {Additional})) @@ -503,7 +515,7 @@ Done: If LogMc.Contains("Extracted mod jars found, loading will NOT continue") Then AppendReason(CrashReason.Mod文件被解压) If LogMc.Contains("java.lang.ClassNotFoundException: org.spongepowered.asm.launch.MixinTweaker") Then AppendReason(CrashReason.MixinBootstrap缺失) If LogMc.Contains("Couldn't set pixel format") Then AppendReason(CrashReason.显卡驱动不支持导致无法设置像素格式) - If LogMc.Contains("java.lang.OutOfMemoryError") Then AppendReason(CrashReason.内存不足) + If LogMc.Contains("java.lang.OutOfMemoryError") OrElse LogMc.Contains("an out of memory error") Then AppendReason(CrashReason.内存不足) If LogMc.Contains("java.lang.RuntimeException: Shaders Mod detected. Please remove it, OptiFine has built-in support for shaders.") Then AppendReason(CrashReason.ShadersMod与Optifine同时安装) If LogMc.Contains("java.lang.NoSuchMethodError: sun.security.util.ManifestEntryVerifier") Then AppendReason(CrashReason.低版本Forge与高版本Java不兼容) If LogMc.Contains("1282: Invalid operation") Then AppendReason(CrashReason.光影或资源包导致OpenGL1282错误) @@ -531,6 +543,7 @@ Done: 'Mod 重复安装 If LogMc.Contains("DuplicateModsFoundException") Then AppendReason(CrashReason.Mod重复安装, RegexSearch(LogMc, "(?<=\n\t[\w]+ : [A-Z]{1}:[^\n]+(/|\\))[^/\\\n]+?.jar", RegularExpressions.RegexOptions.IgnoreCase)) If LogMc.Contains("Found a duplicate mod") Then AppendReason(CrashReason.Mod重复安装, RegexSearch(If(RegexSeek(LogMc, "Found a duplicate mod[^\n]+"), ""), "[^\\/]+.jar", RegularExpressions.RegexOptions.IgnoreCase)) + If LogMc.Contains("Found duplicate mods") Then AppendReason(CrashReason.Mod重复安装, RegexSearch(LogMc, "(?<=Mod ID: ')\w+?(?=' from mod files:)").Distinct.ToList) If LogMc.Contains("ModResolutionException: Duplicate") Then AppendReason(CrashReason.Mod重复安装, RegexSearch(If(RegexSeek(LogMc, "ModResolutionException: Duplicate[^\n]+"), ""), "[^\\/]+.jar", RegularExpressions.RegexOptions.IgnoreCase)) 'Mod 缺少前置 If LogMc.Contains("Missing or unsupported mandatory dependencies:") Then @@ -557,17 +570,16 @@ Done: If LogCrash.Contains("java.lang.OutOfMemoryError") Then AppendReason(CrashReason.内存不足) If LogCrash.Contains("Pixel format not accelerated") Then AppendReason(CrashReason.显卡驱动不支持导致无法设置像素格式) If LogCrash.Contains("Manually triggered debug crash") Then AppendReason(CrashReason.玩家手动触发调试崩溃) + If LogCrash.Contains("has mods that were not found") AndAlso RegexCheck(LogCrash, "The Mod File [^\n]+optifine\\OptiFine[^\n]+ has mods that were not found") Then AppendReason(CrashReason.OptiFine与Forge不兼容) 'Mod 导致的崩溃 If LogCrash.Contains("-- MOD ") Then - Dim LogLeft = LogCrash.Split("-- MOD").Last - If LogLeft.Contains("Failure message: MISSING") Then + If LogCrash.Between("-- MOD ", "Failure message:").ContainsF(".jar", True) Then AppendReason(CrashReason.确定Mod导致游戏崩溃, If(RegexSeek(LogCrash, "(?<=Mod File: ).+"), "").TrimEnd((vbCrLf & " ").ToCharArray)) Else AppendReason(CrashReason.Mod加载器报错, If(RegexSeek(LogCrash, "(?<=Failure message: )[\w\W]+?(?=\tMod)"), "").Replace(vbTab, " ").TrimEnd((vbCrLf & " ").ToCharArray)) End If End If If LogCrash.Contains("Multiple entries with same key: ") Then AppendReason(CrashReason.确定Mod导致游戏崩溃, TryAnalyzeModName(If(RegexSeek(LogCrash, "(?<=Multiple entries with same key: )[^=]+"), "").TrimEnd((vbCrLf & " ").ToCharArray))) - If LogCrash.Contains("due to errors, provided by ") Then AppendReason(CrashReason.确定Mod导致游戏崩溃, TryAnalyzeModName(If(RegexSeek(LogCrash, "(?<=due to errors, provided by ')[^']+"), "").TrimEnd((vbCrLf & " ").ToCharArray))) If LogCrash.Contains("LoaderExceptionModCrash: Caught exception from ") Then AppendReason(CrashReason.确定Mod导致游戏崩溃, TryAnalyzeModName(If(RegexSeek(LogCrash, "(?<=LoaderExceptionModCrash: Caught exception from )[^\n]+"), "").TrimEnd((vbCrLf & " ").ToCharArray))) If LogCrash.Contains("Failed loading config file ") Then AppendReason(CrashReason.Mod配置文件导致游戏崩溃, {TryAnalyzeModName(If(RegexSeek(LogCrash, "(?<=Failed loading config file .+ for modid )[^\n]+"), "").TrimEnd(vbCrLf)).First, If(RegexSeek(LogCrash, "(?<=Failed loading config file ).+(?= of type)"), "").TrimEnd(vbCrLf)}) End If @@ -586,19 +598,9 @@ Done: If LogMc.Contains("A potential solution has been determined:") Then AppendReason(CrashReason.Fabric报错并给出解决方案, Join(RegexSearch(If(RegexSeek(LogMc, "(?<=A potential solution has been determined:\n)((\t)+ - [^\n]+\n)+"), ""), "(?<=(\t)+)[^\n]+"), vbLf)) If LogMc.Contains("A potential solution has been determined, this may resolve your problem:") Then AppendReason(CrashReason.Fabric报错并给出解决方案, Join(RegexSearch(If(RegexSeek(LogMc, "(?<=A potential solution has been determined, this may resolve your problem:\n)((\t)+ - [^\n]+\n)+"), ""), "(?<=(\t)+)[^\n]+"), vbLf)) If LogMc.Contains("确定了一种可能的解决方法,这样做可能会解决你的问题:") Then AppendReason(CrashReason.Fabric报错并给出解决方案, Join(RegexSearch(If(RegexSeek(LogMc, "(?<=确定了一种可能的解决方法,这样做可能会解决你的问题:\n)((\t)+ - [^\n]+\n)+"), ""), "(?<=(\t)+)[^\n]+"), vbLf)) - End If - - End Sub - ''' - ''' 进行精准日志匹配。匹配优先级低于堆栈分析的崩溃。 - ''' - Private Sub AnalyzeCrit3() - - '游戏日志分析 - If LogMc IsNot Nothing Then 'Mixin 崩溃 If LogMc.Contains("Mixin prepare failed ") OrElse LogMc.Contains("Mixin apply failed ") OrElse LogMc.Contains("MixinApplyError") OrElse - LogMc.Contains("mixin.injection.throwables.") OrElse LogMc.Contains(".mixins.json] FAILED during )") Then + LogMc.Contains("mixin.injection.throwables.") OrElse LogMc.Contains(".json] FAILED during )") Then Dim ModId As String = RegexSeek(LogMc, "(?<=in )[^./ ]+(?=.mixins.json.+failed injection check)") If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<=in mixins.)[^./ ]+(?=.json.+failed injection check)") If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<= failed .+ in )[^./ ]+(?=.mixins.json)") @@ -612,7 +614,28 @@ Done: If ModId Is Nothing Then ModId = RegexSeek(LogMc, "[^./ \]]+(?=.mixins.json)") If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<=mixins.)[^./ \]]+(?=.json)") AppendReason(CrashReason.ModMixin失败, TryAnalyzeModName(If(ModId, "").TrimEnd((vbCrLf & " ").ToCharArray))) + Else + '在 #3104 的情况下,这一句导致 OptiFabric 的 Mixin 失败错判为 Fabric Loader 加载失败 + If LogMc.Contains("due to errors, provided by ") Then AppendReason(CrashReason.确定Mod导致游戏崩溃, TryAnalyzeModName(If(RegexSeek(LogMc, "(?<=due to errors, provided by ')[^']+"), "").TrimEnd((vbCrLf & " ").ToCharArray))) End If + End If + + '崩溃报告分析 + If LogCrash IsNot Nothing Then + If LogCrash.Contains("Suspected Mod") Then + Dim Suspects = RegexSearch(LogCrash.Between("Suspected Mod", "Stacktrace"), "(?<=\n\t[^(\t]+\()[^)\n]+") + If Suspects.Any Then AppendReason(CrashReason.怀疑Mod导致游戏崩溃, TryAnalyzeModName(Suspects)) + End If + End If + + End Sub + ''' + ''' 进行精准日志匹配。匹配优先级低于堆栈分析的崩溃。 + ''' + Private Sub AnalyzeCrit3() + + '游戏日志分析 + If LogMc IsNot Nothing Then '极短的程序输出 If Not (LogMc.Contains("at net.") OrElse LogMc.Contains("INFO]")) AndAlso LogHs Is Nothing AndAlso LogCrash Is Nothing AndAlso LogMc.Length < 100 Then AppendReason(CrashReason.极短的程序输出, LogMc) @@ -633,9 +656,13 @@ Done: ''' 从堆栈中提取 Mod ID 关键字。若失败则返回空列表。 ''' Private Function AnalyzeStackKeyword(ErrorStack As String) As List(Of String) + ErrorStack = vbLf & If(ErrorStack, "") & vbLf '进行正则匹配 - Dim StackSearchResults As List(Of String) = RegexSearch(If(ErrorStack, "") & vbCrLf, "(?<=\n[^{]+)[a-zA-Z]+\w+\.[a-zA-Z]+[\w\.]+(?=\.[\w\.$]+\.)") + Dim StackSearchResults As New List(Of String) + StackSearchResults.AddRange(RegexSearch(ErrorStack, "(?<=\n[^{]+)[a-zA-Z_]+\w+\.[a-zA-Z_]+[\w\.]+(?=\.[\w\.$]+\.)")) + StackSearchResults.AddRange(RegexSearch(ErrorStack, "(?<=at [^(]+?\.\w+\$\w+\$)[\w\$]+?(?=\$\w+\()").Select(Function(s) s.Replace("$", "."))) 'Mixin 堆栈:xxx.xxx.xxxx$xxxx$xxx + StackSearchResults = StackSearchResults.Distinct.ToList '检查堆栈开头 Dim PossibleStacks As New List(Of String) @@ -648,7 +675,7 @@ Done: "MojangTricksIntelDriversForPerformance_javaw"} If Stack.StartsWithF(IgnoreStack) Then GoTo NextStack Next - PossibleStacks.Add(Stack.Trim) '.Split("$").First) + PossibleStacks.Add(Stack.Trim) NextStack: Next PossibleStacks = PossibleStacks.Distinct.ToList @@ -665,20 +692,20 @@ NextStack: For i = 0 To Math.Min(3, Splited.Count - 1) '最多取前 4 节 Dim Word As String = Splited(i) If Word.Length <= 2 OrElse Word.StartsWithF("func_") Then Continue For - If {"com", "org", "net", "asm", "fml", "mod", "jar", "sun", "lib", "map", "gui", "dev", "nio", "api", "dsi", "top", - "core", "init", "mods", "main", "file", "game", "load", "read", "done", "util", "tile", "item", "base", "oshi", - "forge", "setup", "block", "model", "mixin", "event", "unimi", "netty", - "gitlab", "common", "server", "config", "loader", "launch", "entity", "assist", "client", "plugin", "modapi", "mojang", "shader", "events", "github", "recipe", - "preinit", "preload", "machine", "reflect", "channel", "general", "handler", "content", "systems", "modules", - "fastutil", "optifine", "internal", "platform", "override", - "listeners", "scheduler", "minecraft", "transformers", "universal", "multipart", "minecraftforge", "blockentity" + If {"com", "org", "net", "asm", "fml", "mod", "jar", "sun", "lib", "map", "gui", "dev", "nio", "api", "dsi", "top", "mcp", + "core", "init", "mods", "main", "file", "game", "load", "read", "done", "util", "tile", "item", "base", "oshi", "impl", "data", "pool", "task", + "forge", "setup", "block", "model", "mixin", "event", "unimi", "netty", "world", + "gitlab", "common", "server", "config", "loader", "launch", "entity", "assist", "client", "plugin", "modapi", "mojang", "shader", "events", "github", "recipe", "render", "packet", "events", + "preinit", "preload", "machine", "reflect", "channel", "general", "handler", "content", "systems", "modules", "service", + "fastutil", "optifine", "internal", "platform", "override", "fabricmc", + "injection", "listeners", "scheduler", "minecraft", "transformer", "transformers", "universal", "multipart", "minecraftforge", "blockentity", "spongepowered", "electronwill" }.Contains(Word.ToLower) Then Continue For PossibleWords.Add(Word.Trim) Next Next PossibleWords = PossibleWords.Distinct.ToList Log("[Crash] 从堆栈信息中找到 " & PossibleWords.Count & " 个可能的 Mod ID 关键词") - If PossibleWords.Count > 0 Then Log("[Crash] - " & Join(PossibleWords, ", ")) + If PossibleWords.Any Then Log("[Crash] - " & Join(PossibleWords, ", ")) If PossibleWords.Count > 10 Then Log("[Crash] 关键词过多,考虑匹配出错,不纳入考虑") Return New List(Of String) @@ -711,7 +738,7 @@ NextStack: Details = Details.Replace("Fabric Mods", "¨") Log("[Crash] 崩溃报告中检测到 Fabric Mod 信息格式") End If - Details = Details.Split("¨").Last + Details = Details.After("¨") '[Forge] 获取所有包含 .jar 的行 '[Fabric] 获取所有包含 Mod 信息的行 @@ -794,13 +821,20 @@ NextStack: End If End Function ''' - ''' 尝试获取 Mod 名称,若失败则返回原关键字。 + ''' 尝试从关键字获取 Mod 名称,若失败则返回原关键字。 ''' - Private Function TryAnalyzeModName(Keywords As String) As List(Of String) - Dim RawList As New List(Of String) From {If(Keywords, "")} - If String.IsNullOrEmpty(Keywords) Then Return RawList + Private Function TryAnalyzeModName(Keyword As String) As List(Of String) + Dim RawList As New List(Of String) From {If(Keyword, "")} + If String.IsNullOrEmpty(Keyword) Then Return RawList Return If(AnalyzeModName(RawList), RawList) End Function + ''' + ''' 尝试从关键字获取 Mod 名称,若失败则返回原关键字。 + ''' + Private Function TryAnalyzeModName(Keywords As List(Of String)) As List(Of String) + If Not Keywords.Any Then Return Keywords + Return If(AnalyzeModName(Keywords), Keywords) + End Function '4:根据原因输出信息 Private OutputFiles As New List(Of String) @@ -813,7 +847,7 @@ NextStack: Dim ShowLog As Action = Sub() If File.Exists(DirectFile.Value.Key) Then - ShellOnly(DirectFile.Value.Key) + ShellOnly("notepad", DirectFile.Value.Key) Else Dim FilePath As String = PathTemp & "Crash.txt" WriteFile(FilePath, Join(DirectFile.Value.Value, vbCrLf)) @@ -847,7 +881,7 @@ NextStack: FileName = "游戏崩溃前的输出.txt" End Select If File.Exists(OutputFile) Then - WriteFile(TempFolder & "Report\" & FileName, SecretFilter(ReadFile(OutputFile))) + WriteFile(TempFolder & "Report\" & FileName, SecretFilter(ReadFile(OutputFile), If(FileName = "启动脚本.bat", "F", "*"))) End If Next '导出报告 @@ -903,46 +937,46 @@ NextStack: Results.Add("你正在使用 32 位的操作系统,这会导致 Minecraft 无法使用所需的内存,进而造成崩溃。\n\n你或许只能重装 64 位的操作系统来解决此问题。\n如果你的电脑内存在 2GB 以内,那或许只能换台电脑了……\h") End If Case CrashReason.Mod缺少前置或MC版本错误 - If Additional.Count > 0 Then + If Additional.Any Then Results.Add("由于未满足 Mod 的依赖项,导致游戏退出。\n未满足的依赖项:\n - " & Join(Additional, "\n - ") & "\n\n请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。") Else Results.Add("由于未满足 Mod 的依赖项,导致游戏退出。\n请根据错误报告中的日志信息进行对应处理,如果看不懂英文可以使用翻译软件。\h") End If Case CrashReason.堆栈分析发现关键字 If Additional.Count = 1 Then - Results.Add("你的游戏遇到了一些问题,这可能是某些 Mod 所引起的,PCL 找到了一个可疑的关键词:" & Additional.First & "。\n\n如果你知道它对应的 Mod,那么有可能就是它引起的错误,你也可以查看错误报告获取详情。\h") + Results.Add("你的游戏遇到了一些问题,PCL 为此找到了一个可疑的关键词:" & Additional.First & "。\n\n如果你知道某个关键词对应的 Mod,那么有可能就是它引起的错误,你也可以查看错误报告获取详情。\h") Else - Results.Add("你的游戏遇到了一些问题,这可能是某些 Mod 所引起的,PCL 找到了以下可疑的关键词:\n - " & Join(Additional, ", ") & "\n\n如果你知道这些关键词对应的 Mod,那么有可能就是它引起的错误,你也可以查看错误报告获取详情。\h") + Results.Add("你的游戏遇到了一些问题,PCL 为此找到了以下可疑的关键词:\n - " & Join(Additional, ", ") & "\n\n如果你知道某个关键词对应的 Mod,那么有可能就是它引起的错误,你也可以查看错误报告获取详情。\h") End If - Case CrashReason.堆栈分析发现Mod名称 + Case CrashReason.堆栈分析发现Mod名称, CrashReason.怀疑Mod导致游戏崩溃 If Additional.Count = 1 Then - Results.Add("名为 " & Additional.First & " 的 Mod 可能导致了游戏出错。\n\e\h") + Results.Add("PCL 怀疑名为 " & Additional.First & " 的 Mod 导致了游戏出错,但不能完全确定。\n你可以尝试禁用此 Mod,然后观察游戏是否还会崩溃。\n\e\h") Else - Results.Add("可能是以下 Mod 导致了游戏出错:\n - " & Join(Additional, "\n - ") & "\n\e\h") + Results.Add("PCL 怀疑以下 Mod 导致了游戏出错,但不能完全确定:\n - " & Join(Additional, "\n - ") & "\n\n你可以尝试依次禁用上述 Mod,然后观察游戏是否还会崩溃。\n\e\h") End If Case CrashReason.确定Mod导致游戏崩溃 If Additional.Count = 1 Then - Results.Add("名称或 ID 为 " & Additional.First & " 的 Mod 导致了游戏出错。\n\e\h") + Results.Add("名为 " & Additional.First & " 的 Mod 导致了游戏出错。\n你可以尝试禁用此 Mod,然后观察游戏是否还会崩溃。\n\e\h") Else - Results.Add("以下 Mod 导致了游戏出错:\n - " & Join(Additional, "\n - ") & "\n\e\h") + Results.Add("以下 Mod 导致了游戏出错:\n - " & Join(Additional, "\n - ") & "\n\n你可以尝试依次禁用上述 Mod,然后观察游戏是否还会崩溃。\n\e\h") End If Case CrashReason.ModMixin失败 If Additional.Count = 1 Then - Results.Add("名称或 ID 为 " & Additional.First & " 的 Mod 注入失败,导致游戏出错。\n这一般代表着该 Mod 存在 Bug,或与当前环境不兼容。\n\e\h") + Results.Add("名为 " & Additional.First & " 的 Mod 注入失败,导致游戏出错。\n这一般代表着它与其他 Mod 或当前环境不兼容,或是它存在 Bug。\n你可以尝试禁用此 Mod,然后观察游戏是否还会崩溃。\n\e\h") Else - Results.Add("以下 Mod 导致了游戏出错:\n - " & Join(Additional, "\n - ") & "\n这一般代表着这些 Mod 存在 Bug,或与当前环境不兼容。\n\e\h") + Results.Add("以下 Mod 导致了游戏出错:\n - " & Join(Additional, "\n - ") & "\n这一般代表着它们与其他 Mod 或当前环境不兼容,或是它存在 Bug。\n你可以尝试依次禁用上述 Mod,然后观察游戏是否还会崩溃。\n\e\h") End If Case CrashReason.Mod配置文件导致游戏崩溃 If Additional(1) Is Nothing Then - Results.Add("名称或 ID 为 " & Additional.First & " 的 Mod 导致了游戏出错。\n\e\h") + Results.Add("名为 " & Additional.First & " 的 Mod 导致了游戏出错。\n\e\h") Else - Results.Add("名称或 ID 为 " & Additional.First & " 的 Mod 导致了游戏出错:\n其配置文件 " & Additional(1) & " 存在异常,无法读取。") + Results.Add("名为 " & Additional.First & " 的 Mod 导致了游戏出错:\n其配置文件 " & Additional(1) & " 存在异常,无法读取。") End If Case CrashReason.Mod初始化失败 If Additional.Count = 1 Then - Results.Add("名为 " & Additional.First & " 的 Mod 初始化失败,导致游戏无法继续加载。\n\e\h") + Results.Add("名为 " & Additional.First & " 的 Mod 初始化失败,导致游戏无法继续加载。\n你可以尝试禁用此 Mod,然后观察游戏是否还会崩溃。\n\e\h") Else - Results.Add("以下 Mod 初始化失败,导致游戏无法继续加载:\n - " & Join(Additional, "\n - ") & "\n\e\h") + Results.Add("以下 Mod 初始化失败,导致游戏无法继续加载:\n - " & Join(Additional, "\n - ") & "\n\n你可以尝试依次禁用上述 Mod,然后观察游戏是否还会崩溃。\n\e\h") End If Case CrashReason.特定方块导致崩溃 If Additional.Count = 1 Then @@ -1027,8 +1061,6 @@ NextStack: End Select Next - '整理多个原因 - IsHandAnalyze = False Return Join(Results, "\n\n此外,"). Replace("\n", vbCrLf). Replace("\h", ""). @@ -1038,7 +1070,7 @@ NextStack: If(Not Results.Any(Function(r) r.EndsWithF("\h")) OrElse IsHandAnalyze, "", vbCrLf & "如果要寻求帮助,请向他人发送错误报告文件,而不是发送这个窗口的截图。" & If(If(PageSetupSystem.IsLauncherNewest(), True), "", - vbCrLf & vbCrLf & "此外,你正在使用老版本 PCL,更新到最新版可能会修复这个问题。" & vbCrLf & "你可以点击 设置 → 启动器 → 检查更新 来更新 PCL。")) + vbCrLf & vbCrLf & "此外,你正在使用老版本 PCL,更新 PCL 或许也能解决这个问题。" & vbCrLf & "你可以点击 设置 → 启动器 → 检查更新 来更新 PCL。")) End Function End Class diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 1419ced..10cfdbb 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -98,6 +98,11 @@ TempAddress = PathTemp & "Cache\" & BackAssetsFile.LocalName BackAssetsFile.LocalPath = TempAddress Task.Output = New List(Of NetFile) From {BackAssetsFile} + '检查是否需要更新:每天只更新一次 + If File.Exists(RealAddress) AndAlso Math.Abs((File.GetLastWriteTime(RealAddress).Date - Now.Date).TotalDays) < 1 Then + Log("[Download] 无需更新资源文件索引") + Task.Abort() + End If End Sub)) LoadersAssetsUpdate.Add(New LoaderDownload("后台下载资源文件索引", New List(Of NetFile))) LoadersAssetsUpdate.Add(New LoaderTask(Of List(Of NetFile), String)("后台复制资源文件索引", @@ -106,7 +111,7 @@ McLaunchLog("后台更新资源文件索引成功:" & TempAddress) End Sub)) Dim Updater As New LoaderCombo(Of String)("后台更新资源文件索引", LoadersAssetsUpdate) - Log("[Download] 开始后台更新资源文件索引") + Log("[Download] 开始后台检查资源文件索引") Updater.Start() End If '获取资源文件地址 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb index 9a725c5..7767f6b 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb @@ -1,5 +1,5 @@ Public Module ModJava - Public JavaListCacheVersion As Integer = 5 + Public JavaListCacheVersion As Integer = 6 ''' ''' 目前所有可用的 Java。 @@ -79,7 +79,7 @@ Public Overrides Function ToString() As String Dim VersionString = Version.ToString If VersionString.StartsWithF("1.") Then VersionString = Mid(VersionString, 3) - Return If(IsJre, "JRE ", "JDK ") & VersionCode & " (" & VersionString & ")," & If(Is64Bit, "64", "32") & " 位" & If(IsUserImport, ",手动导入", "") & ":" & PathFolder + Return If(IsJre, "JRE ", "JDK ") & VersionCode & " (" & VersionString & ")" & If(Is64Bit, "", ",32 位") & If(IsUserImport, ",手动导入", "") & ":" & PathFolder End Function '构造 @@ -131,7 +131,9 @@ Version = New Version(1, Version.Major, Version.Build, Version.Revision) End If 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 ApplicationException("分析详细信息失败,获取的版本为 " & Version.ToString) + '基于 #3649,在 64 位系统上禁用 32 位 Java + If Not Is64Bit AndAlso Not Is32BitSystem Then Throw New Exception("该 Java 为 32 位版本,请安装 64 位的 Java") '基于 #2249 发现 JRE 17 似乎也导致了 Forge 安装失败,干脆禁用更多版本的 JRE If IsJre AndAlso VersionCode >= 16 Then Throw New Exception("由于高版本 JRE 对游戏的兼容性很差,因此不再允许使用。你可以使用对应版本的 JDK,而非 JRE!") Catch ex As ApplicationException @@ -197,10 +199,15 @@ Setup.Set("LaunchArgumentJavaAll", "[]") End Try End Sub + + ''' + ''' 防止多个需要 Java 的部分同时要求下载 Java(#3797)。 + ''' + Public JavaLock As New Object ''' ''' 根据要求返回最适合的 Java,若找不到则返回 Nothing。 ''' 最小与最大版本在与输入相同时也会通过。 - ''' 必须在工作线程调用。 + ''' 必须在工作线程调用,且必须包括 SyncLock JavaLock。 ''' Public Function JavaSelect(CancelException As String, Optional MinVersion As Version = Nothing, Optional MaxVersion As Version = Nothing, Optional RelatedVersion As McVersion = Nothing) As JavaEntry @@ -220,7 +227,7 @@ Next '检查特定的 Java - If TargetJavaList.Count > 0 Then + If TargetJavaList.Any Then TargetJavaList = JavaCheckList(TargetJavaList) Log("[Java] 检查后找到 " & TargetJavaList.Count & " 个特定路径下的 Java:") For Each Java In TargetJavaList @@ -460,8 +467,8 @@ NoUserJava: If Not Left.IsJre AndAlso Right.IsJre Then Return False '4. Java 大版本 If Left.VersionCode <> Right.VersionCode Then - ' Java 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21... - Dim Weight = {0, 1, 2, 3, 4, 5, 6, 14, 30, 10, 12, 15, 13, 9, 8, 7, 11, 31, 29, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28} + ' Java 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23... + Dim Weight = {0, 1, 2, 3, 4, 5, 6, 14, 30, 10, 12, 15, 13, 9, 8, 7, 11, 31, 29, 16, 17, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18} Return Weight.ElementAtOrDefault(Left.VersionCode) >= Weight.ElementAtOrDefault(Right.VersionCode) End If '5. 最次级版本号更接近 51 @@ -534,7 +541,7 @@ NoUserJava: Log("[Java] 位于 " & Folder & " 的 Java 不含符号链接") JavaWithoutReparse.Add(Pair.Key, Pair.Value) Next - If JavaWithoutReparse.Count > 0 Then JavaPreList = JavaWithoutReparse + If JavaWithoutReparse.Any Then JavaPreList = JavaWithoutReparse '若不全为特殊引用,则清除特殊引用的地址 Dim JavaWithoutInherit As New Dictionary(Of String, Boolean) @@ -546,7 +553,7 @@ NoUserJava: JavaWithoutInherit.Add(Pair.Key, Pair.Value) End If Next - If JavaWithoutInherit.Count > 0 Then JavaPreList = JavaWithoutInherit + If JavaWithoutInherit.Any Then JavaPreList = JavaWithoutInherit #End Region @@ -567,7 +574,7 @@ NoUserJava: '确保可用并获取详细信息,转入正式列表 Dim NewJavaList As New List(Of JavaEntry) - For Each Entry In Distinct(JavaPreList.ToList, Function(a, b) a.Key.ToLower = b.Key.ToLower) '#794 + For Each Entry In JavaPreList.Distinct(Function(a, b) a.Key.ToLower = b.Key.ToLower) '#794 NewJavaList.Add(New JavaEntry(Entry.Key, Entry.Value)) Next NewJavaList = Sort(JavaCheckList(NewJavaList), AddressOf JavaSorter) @@ -601,22 +608,23 @@ NoUserJava: '启动检查线程 Dim CheckThreads As New List(Of Thread) For Each Entry In JavaEntries - Dim CheckThread As New Thread(Sub() - Try - Entry.Check() - If ModeDebug Then Log("[Java] - " & Entry.ToString) - SyncLock ListLock - JavaCheckList.Add(Entry) - End SyncLock - Catch ex As ThreadInterruptedException - Catch ex As Exception - If Entry.IsUserImport Then - Log(ex, "位于 " & Entry.PathFolder & " 的 Java 存在异常,将被自动移除", LogLevel.Hint) - Else - Log(ex, "位于 " & Entry.PathFolder & " 的 Java 存在异常") - End If - End Try - End Sub) + Dim CheckThread As New Thread( + Sub() + Try + Entry.Check() + If ModeDebug Then Log("[Java] - " & Entry.ToString) + SyncLock ListLock + JavaCheckList.Add(Entry) + End SyncLock + Catch ex As ThreadInterruptedException + Catch ex As Exception + If Entry.IsUserImport Then + Log(ex, "位于 " & Entry.PathFolder & " 的 Java 存在异常,将被自动移除", LogLevel.Hint) + Else + Log(ex, "位于 " & Entry.PathFolder & " 的 Java 存在异常") + End If + End Try + End Sub) CheckThreads.Add(CheckThread) CheckThread.Start() Next @@ -719,12 +727,25 @@ Wait: ''' 获取下载 Java 8/14/17/21 的加载器。需要开启 IsForceRestart 以正常刷新 Java 列表。 ''' Public Function JavaFixLoaders(Version As Integer) As LoaderCombo(Of Integer) - Return New LoaderCombo(Of Integer)($"下载 Java {Version}", { + Dim JavaDownloadLoader As New LoaderDownload("下载 Java 文件", New List(Of NetFile)) With {.ProgressWeight = 10} + Dim Loader = New LoaderCombo(Of Integer)($"下载 Java {Version}", { New LoaderTask(Of Integer, List(Of NetFile))("获取 Java 下载信息", AddressOf JavaFileList) With {.ProgressWeight = 2}, - New LoaderDownload("下载 Java 文件", New List(Of NetFile)) With {.ProgressWeight = 10}, + JavaDownloadLoader, JavaSearchLoader }) + AddHandler JavaDownloadLoader.OnStateChangedThread, + Sub(Raw As LoaderBase, NewState As LoadState, OldState As LoadState) + If (NewState = LoadState.Failed OrElse NewState = LoadState.Aborted) AndAlso LastJavaBaseDir IsNot Nothing Then + Log($"[Java] 由于下载未完成,清理未下载完成的 Java 文件:{LastJavaBaseDir}", LogLevel.Debug) + DeleteDirectory(LastJavaBaseDir) + ElseIf NewState = LoadState.Finished Then + LastJavaBaseDir = Nothing + End If + End Sub + JavaDownloadLoader.HasOnStateChangedThread = True + Return Loader End Function + Private LastJavaBaseDir As String = Nothing '用于在下载中断或失败时删除未完成下载的 Java 文件夹,防止残留只下了一半但 -version 能跑的 Java Private Sub JavaFileList(Loader As LoaderTask(Of Integer, List(Of NetFile))) Log("[Java] 开始获取 Java 下载信息") Dim IndexFileStr As String = NetGetCodeByDownload( @@ -739,25 +760,23 @@ Wait: Dim Address As String = TargetEntry.Value("manifest")("url") Log($"[Java] 准备下载 Java {TargetEntry.Value("version")("name")}({TargetEntry.Key}):{Address}") '获取文件列表 - Dim ListFileStr As String = NetGetCodeByDownload( - {Address.Replace("piston-meta.mojang.com", "bmclapi2.bangbang93.com"), - Address}, - IsJson:=True) - Dim BaseDir As String = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\.minecraft\runtime\" & TargetEntry.Key & "\" + Dim ListFileStr As String = NetGetCodeByDownload({Address.Replace("piston-meta.mojang.com", "bmclapi2.bangbang93.com"), Address}, IsJson:=True) + LastJavaBaseDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\.minecraft\runtime\" & TargetEntry.Key & "\" Dim Results As New List(Of NetFile) For Each File As JProperty In CType(GetJson(ListFileStr), JObject)("files") If CType(File.Value, JObject)("downloads")?("raw") Is Nothing Then Continue For Dim Info As JObject = CType(File.Value, JObject)("downloads")("raw") Dim Checker As New FileChecker(ActualSize:=Info("size"), Hash:=Info("sha1")) - If Checker.Check(BaseDir & File.Name) Is Nothing Then Continue For '跳过已存在的文件 + If Checker.Hash = "12976a6c2b227cbac58969c1455444596c894656" OrElse Checker.Hash = "c80e4bab46e34d02826eab226a4441d0970f2aba" OrElse Checker.Hash = "84d2102ad171863db04e7ee22a259d1f6c5de4a5" Then + '跳过 3 个无意义大量重复文件(#3827) + Continue For + End If + If Checker.Check(LastJavaBaseDir & File.Name) Is Nothing Then Continue For '跳过已存在的文件 Dim Url As String = Info("url") - Results.Add(New NetFile( - {Url.Replace("piston-data.mojang.com", "bmclapi2.bangbang93.com"), - Url}, - BaseDir & File.Name, Checker)) + Results.Add(New NetFile({Url.Replace("piston-data.mojang.com", "bmclapi2.bangbang93.com"), Url}, LastJavaBaseDir & File.Name, Checker)) Next Loader.Output = Results - Log($"[Java] 需要下载 {Results.Count} 个文件,目标文件夹:{BaseDir}") + Log($"[Java] 需要下载 {Results.Count} 个文件,目标文件夹:{LastJavaBaseDir}") End Sub #End Region diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb index 383eb9a..48a8228 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb @@ -62,7 +62,7 @@ Public Module ModLaunch ''' 记录启动日志。 ''' Public Sub McLaunchLog(Text As String) - Text = SecretFilter(Text) + Text = SecretFilter(Text, "*") RunInUi(Sub() FrmLaunchRight.LabLog.Text += vbCrLf & "[" & GetTimeNow() & "] " & Text) Log("[Launch] " & Text) End Sub @@ -101,10 +101,10 @@ Public Module ModLaunch '正式加载 Try '构造主加载器 - Dim LaunchLoader As New LoaderCombo(Of Object)("Minecraft 启动", { - New LoaderTask(Of Integer, Integer)("获取 Java", AddressOf McLaunchJava) With {.ProgressWeight = 4, .Block = False, .Show = False}, + Dim Loaders As New List(Of LoaderBase) From { + New LoaderTask(Of Integer, Integer)("获取 Java", AddressOf McLaunchJava) With {.ProgressWeight = 4, .Block = False}, McLoginLoader, - New LoaderCombo(Of String)("补全文件", DlClientFix(McVersionCurrent, False, AssetsIndexExistsBehaviour.DownloadInBackground, True)) With {.ProgressWeight = 15, .Show = False, .Block = True}, + New LoaderCombo(Of String)("补全文件", DlClientFix(McVersionCurrent, False, AssetsIndexExistsBehaviour.DownloadInBackground, True)) With {.ProgressWeight = 15, .Show = False}, New LoaderTask(Of String, List(Of McLibToken))("获取启动参数", AddressOf McLaunchArgumentMain) With {.ProgressWeight = 2}, New LoaderTask(Of List(Of McLibToken), Integer)("解压文件", AddressOf McLaunchNatives) With {.ProgressWeight = 2}, New LoaderTask(Of Integer, Integer)("预启动处理", AddressOf McLaunchPrerun) With {.ProgressWeight = 1}, @@ -112,7 +112,12 @@ Public Module ModLaunch New LoaderTask(Of Integer, Process)("启动进程", AddressOf McLaunchRun) With {.ProgressWeight = 2}, New LoaderTask(Of Process, Integer)("等待游戏窗口出现", AddressOf McLaunchWait) With {.ProgressWeight = 1}, New LoaderTask(Of Integer, Integer)("结束处理", AddressOf McLaunchEnd) With {.ProgressWeight = 1} - }) With {.Show = False} + } + If Setup.Get("LaunchArgumentRam") Then + CType(Loaders(2), LoaderCombo(Of String)).Block = False + Loaders.Insert(3, New LoaderTask(Of Integer, Integer)("内存优化", AddressOf McLaunchMemoryOptimize) With {.ProgressWeight = 30}) + End If + Dim LaunchLoader As New LoaderCombo(Of Object)("Minecraft 启动", Loaders) With {.Show = False} If McLoginLoader.State = LoadState.Finished Then McLoginLoader.State = LoadState.Waiting '要求重启登录主加载器,它会自行决定是否启动副加载器 '等待加载器执行并更新 UI McLaunchLoaderReal = LaunchLoader @@ -163,6 +168,28 @@ NextInner: #End Region +#Region "内存优化" + + Private Sub McLaunchMemoryOptimize(Loader As LoaderTask(Of Integer, Integer)) + McLaunchLog("内存优化开始") + Dim Finished As Boolean = False + RunInNewThread( + Sub() + PageOtherTest.MemoryOptimize(False) + Finished = True + End Sub, "Launch Memory Optimize") + Do While Not Finished AndAlso Not Loader.IsAborted + If Loader.Progress < 0.7 Then + Loader.Progress += 0.007 '10s + Else + Loader.Progress += (0.95 - Loader.Progress) * 0.02 '最快 += 0.005 + End If + Thread.Sleep(100) + Loop + End Sub + +#End Region + #Region "预检测" Private Sub McLaunchPrecheck() @@ -247,7 +274,7 @@ NextInner: ''' Public BaseUrl As String ''' - ''' 登录所使用的标识符,如 “Mojang”、“Nide”,用于存储缓存等。 + ''' 登录所使用的标识符,目前只可能为 “Auth” 或 “Nide”,用于存储缓存等。 ''' Public Token As String ''' @@ -331,7 +358,7 @@ NextInner: Case McLoginType.Ms If Setup.Get("CacheMsName") <> "" Then Return Setup.Get("CacheMsName") Case McLoginType.Legacy - If Setup.Get("LoginLegacyName") <> "" Then Return Setup.Get("LoginLegacyName").ToString.Split("¨")(0) + If Setup.Get("LoginLegacyName") <> "" Then Return Setup.Get("LoginLegacyName").ToString.Before("¨") Case McLoginType.Nide If Setup.Get("CacheNideName") <> "" Then Return Setup.Get("CacheNideName") Case McLoginType.Auth @@ -341,7 +368,7 @@ NextInner: If Setup.Get("CacheMsName") <> "" Then Return Setup.Get("CacheMsName") If Setup.Get("CacheNideName") <> "" Then Return Setup.Get("CacheNideName") If Setup.Get("CacheAuthName") <> "" Then Return Setup.Get("CacheAuthName") - If Setup.Get("LoginLegacyName") <> "" Then Return Setup.Get("LoginLegacyName").ToString.Split("¨")(0) + If Setup.Get("LoginLegacyName") <> "" Then Return Setup.Get("LoginLegacyName").ToString.Before("¨") Return Nothing End Function ''' @@ -497,7 +524,10 @@ Relogin: Dim AccessToken As String = MsLoginStep5(Tokens) Data.Progress = 0.8 If Data.IsAborted Then Throw New ThreadInterruptedException - Dim Result = MsLoginStep6(AccessToken) + MsLoginStep6(AccessToken) + Data.Progress = 0.9 + If Data.IsAborted Then Throw New ThreadInterruptedException + Dim Result = MsLoginStep7(AccessToken) '输出登录结果 Setup.Set("CacheMsOAuthRefresh", OAuthRefreshToken) Setup.Set("CacheMsAccess", AccessToken) @@ -513,7 +543,7 @@ Relogin: SkipLogin: McLaunchLog("微软登录完成") Setup.Set("HintBuy", True) '关闭正版购买提示 - Data.Progress = 0.95 + Data.Progress = 0.98 If ThemeUnlock(10, False) Then MyMsgBox("感谢你对正版游戏的支持!" & vbCrLf & "隐藏主题 跳票红 已解锁!", "提示") End Sub Private Sub McLoginServerStart(Data As LoaderTask(Of McLoginServer, McLoginResult)) @@ -526,7 +556,13 @@ SkipLogin: McLaunchLog("登录方式:" & Input.Description & "(" & LogUsername & ")") Data.Progress = 0.05 '尝试登录 - If (Not Data.Input.ForceReselectProfile) AndAlso Setup.Get("Cache" & Input.Token & "Username") = Data.Input.UserName AndAlso Setup.Get("Cache" & Input.Token & "Pass") = Data.Input.Password AndAlso Not Setup.Get("Cache" & Input.Token & "Access") = "" AndAlso Not Setup.Get("Cache" & Input.Token & "Client") = "" AndAlso Not Setup.Get("Cache" & Input.Token & "Uuid") = "" AndAlso Not Setup.Get("Cache" & Input.Token & "Name") = "" Then + If (Not Data.Input.ForceReselectProfile) AndAlso + Setup.Get("Cache" & Input.Token & "Username") = Data.Input.UserName AndAlso + Setup.Get("Cache" & Input.Token & "Pass") = Data.Input.Password AndAlso + Setup.Get("Cache" & Input.Token & "Access") <> "" AndAlso + Setup.Get("Cache" & Input.Token & "Client") <> "" AndAlso + Setup.Get("Cache" & Input.Token & "Uuid") <> "" AndAlso + Setup.Get("Cache" & Input.Token & "Name") <> "" Then '尝试验证登录 Try If Data.IsAborted Then Throw New ThreadInterruptedException @@ -764,14 +800,14 @@ LoginFinish: '微软登录步骤 1:打开网页认证,获取 OAuth Code Private Function MsLoginStep1(Data As LoaderTask(Of McLoginMs, McLoginResult)) As String McLaunchLog("开始微软登录步骤 1") - If OsVersion <= New Version(10, 0, 17763, 0) Then + If True OrElse OsVersion <= New Version(10, 0, 17763, 0) Then '由于 #3849,WebBrowser 已经无法正常加载微软登录网页了 SystemBrowser: 'Windows 7 或老版 Windows 10 登录 OpenWebsite(FormLoginOAuth.LoginUrl1) Dim Result As String = MyMsgBoxInput("等待网页登录", - "在登录成功后,网页会变成一片空白,请将该空白页面的网址复制到下面的框中。" & vbCrLf & - "如果网络环境不佳,登录网页可能一直加载不出来,此时请尝试使用 VPN 或加速器,然后再试。", + "登录完成后,网页会变得完全空白,把那个空白网页的网址复制到下面的框中就行了!" & vbCrLf & + "如果网络环境不佳,它可能一直加载不出来,那就只能试试用 VPN 或加速器了。", ValidateRules:=New ObjectModel.Collection(Of Validate) From {New ValidateRegex("(?<=code\=)[^&]+", "返回网址应以 https://login.live.com/oauth20_desktop.srf?code= 开头")}, HintText:="https://login.live.com/oauth20_desktop.srf?code=XXXXXX") If Result Is Nothing Then @@ -780,7 +816,7 @@ SystemBrowser: Else Return RegexSeek(Result, "(?<=code\=)[^&]+") End If - Hint("网页登录已完成,你现在可以关闭浏览器上的那个网页了", HintType.Finish) + Hint("网页登录成功,你可以关闭浏览器啦!", HintType.Finish) Else 'Windows 10 登录 Dim ReturnCode As String = Nothing @@ -893,12 +929,18 @@ SystemBrowser: Try Result = NetRequestMulty("https://xsts.auth.xboxlive.com/xsts/authorize", "POST", Request, "application/json", 3) Catch ex As Net.WebException - If ex.Message.Contains("2148916233") Then - If MyMsgBox("该微软账号尚未购买 Minecraft Java 版,或尚未注册 Xbox 账户。" & vbCrLf & - "如果你确定该账号完成了上述步骤,请先在游戏官网登录一次,然后再在启动器登录。", "登录提示", "打开游戏官网", "取消") = 1 Then - OpenWebsite("https://www.minecraft.net/") + '参考 https://github.com/PrismarineJS/prismarine-auth/blob/master/src/common/Constants.js + If ex.Message.Contains("2148916227") Then + MyMsgBox("该账号似乎已被微软封禁,无法登录。", "登录失败", "我知道了", IsWarn:=True) + Throw New Exception("$$") + ElseIf ex.Message.Contains("2148916233") Then + If MyMsgBox("你尚未注册 Xbox 账户,请在注册后再登录。", "登录提示", "注册", "取消") = 1 Then + OpenWebsite("https://signup.live.com/signup") End If Throw New Exception("$$") + ElseIf ex.Message.Contains("2148916235") Then + MyMsgBox($"你的网络所在的国家或地区无法登录微软账号。{vbCrLf}请尝试使用加速器或 VPN。", "登录失败", "我知道了") + Throw New Exception("$$") ElseIf ex.Message.Contains("2148916238") Then If MyMsgBox("该账号年龄不足,你需要先修改出生日期,然后才能登录。" & vbCrLf & "该账号目前填写的年龄是否在 13 岁以上?", "登录提示", "13 岁以上", "12 岁以下", "我不知道") = 1 Then @@ -946,29 +988,46 @@ SystemBrowser: Dim AccessToken As String = ResultJson("access_token").ToString Return AccessToken End Function - '微软登录步骤 6:从 Minecraft AccessToken 获取 {UUID, UserName, ProfileJson} - Private Function MsLoginStep6(AccessToken As String) As String() + '微软登录步骤 6:验证微软账号是否持有 MC,这也会刷新 XGP + Private Sub MsLoginStep6(AccessToken As String) McLaunchLog("开始微软登录步骤 6") + Dim Result As String = NetRequestMulty("https://api.minecraftservices.com/entitlements/mcstore", "GET", "", "application/json", 2, New Dictionary(Of String, String) From {{"Authorization", "Bearer " & AccessToken}}) + Try + Dim ResultJson As JObject = GetJson(Result) + If Not (ResultJson.ContainsKey("items") AndAlso ResultJson("items").Any) Then + Select Case MyMsgBox("你尚未购买正版 Minecraft,或者 Xbox Game Pass 已到期。", "登录失败", "购买 Minecraft", "取消") + Case 1 + OpenWebsite("https://www.xbox.com/zh-cn/games/store/minecraft-java-bedrock-edition-for-pc/9nxp44l49shj") + End Select + Throw New Exception("$$") + End If + Catch ex As Exception + Log(ex, "微软登录第 6 步异常:" & Result) + Throw + End Try + End Sub + '微软登录步骤 7:从 Minecraft AccessToken 获取 {UUID, UserName, ProfileJson} + Private Function MsLoginStep7(AccessToken As String) As String() + McLaunchLog("开始微软登录步骤 7") + Dim Result As String Try Result = NetRequestMulty("https://api.minecraftservices.com/minecraft/profile", "GET", "", "application/json", 2, New Dictionary(Of String, String) From {{"Authorization", "Bearer " & AccessToken}}) Catch ex As Net.WebException Dim Message As String = GetExceptionSummary(ex) If Message.Contains("(429)") Then - Log(ex, "微软登录第 6 步汇报 429") + Log(ex, "微软登录第 7 步汇报 429") Throw New Exception("$登录尝试太过频繁,请等待几分钟后再试!") ElseIf Message.Contains("(404)") Then - Log(ex, "微软登录第 6 步汇报 404") - RunInNewThread(Sub() - Select Case MyMsgBox("你可能没有创建 Minecraft 玩家档案、Xbox Game Pass 已到期,或者还没有购买 Minecraft。" & vbCrLf & - "请先使用官方启动器登录一次,之后即可使用 PCL 登录。", "登录失败", "创建档案", "购买 Minecraft", "取消") - Case 1 - OpenWebsite("https://www.minecraft.net/zh-hans/msaprofile/mygames/editprofile") - Case 2 - OpenWebsite("https://www.xbox.com/zh-cn/games/store/minecraft-java-bedrock-edition-for-pc/9nxp44l49shj") - End Select - End Sub, "Login Failed: Create Profile") + Log(ex, "微软登录第 7 步汇报 404") + RunInNewThread( + Sub() + Select Case MyMsgBox("请先创建 Minecraft 玩家档案,然后再重新登录。", "登录失败", "创建档案", "取消") + Case 1 + OpenWebsite("https://www.minecraft.net/zh-hans/msaprofile/mygames/editprofile") + End Select + End Sub, "Login Failed: Create Profile") Throw New Exception("$$") Else Throw @@ -990,14 +1049,14 @@ SystemBrowser: Case 1 'Steve Do Until McSkinSex(Uuid) = "Steve" - If Uuid.EndsWithF("FFFFF") Then Uuid = Mid(Uuid, 1, 32 - 5) & "00000" - Uuid = Mid(Uuid, 1, 32 - 5) & (Long.Parse(Right(Uuid, 5), Globalization.NumberStyles.AllowHexSpecifier) + 1).ToString("X") + If Uuid.EndsWithF("FFFFF") Then Uuid = Uuid.Substring(0, 27) & "00000" + Uuid = Uuid.Substring(0, 27) & (Long.Parse(Uuid.Substring(27), Globalization.NumberStyles.AllowHexSpecifier) + 1).ToString("X").PadLeft(5, "0") Loop Case 2 'Alex Do Until McSkinSex(Uuid) = "Alex" - If Uuid.EndsWithF("FFFFF") Then Uuid = Mid(Uuid, 1, 32 - 5) & "00000" - Uuid = Mid(Uuid, 1, 32 - 5) & (Long.Parse(Right(Uuid, 5), Globalization.NumberStyles.AllowHexSpecifier) + 1).ToString("X") + If Uuid.EndsWithF("FFFFF") Then Uuid = Uuid.Substring(0, 27) & "00000" + Uuid = Uuid.Substring(0, 27) & (Long.Parse(Uuid.Substring(27), Globalization.NumberStyles.AllowHexSpecifier) + 1).ToString("X").PadLeft(5, "0") Loop Case 3 '使用正版用户名 @@ -1096,22 +1155,25 @@ SystemBrowser: If McVersionCurrent.Version.HasForge Then If McVersionCurrent.Version.McName = "1.7.2" Then '1.7.2:必须 Java 7 - MinVer = New Version(1, 7, 0, 0) : MaxVer = New Version(1, 7, 999, 999) + MinVer = If(New Version(1, 7, 0, 0) > MinVer, New Version(1, 7, 0, 0), MinVer) + MaxVer = If(New Version(1, 7, 999, 999) < MaxVer, New Version(1, 7, 999, 999), MaxVer) ElseIf McVersionCurrent.Version.McCodeMain <= 12 AndAlso McVersionCurrent.Version.McCodeMain > 0 Then '<=1.12:Java 8 MaxVer = New Version(1, 8, 999, 999) ElseIf McVersionCurrent.Version.McCodeMain <= 14 AndAlso McVersionCurrent.Version.McCodeMain >= 13 Then '1.13 - 1.14:Java 8 - 10 - MinVer = New Version(1, 8, 0, 0) : MaxVer = New Version(1, 10, 999, 999) + MinVer = If(New Version(1, 8, 0, 0) > MinVer, New Version(1, 8, 0, 0), MinVer) + MaxVer = If(New Version(1, 10, 999, 999) < MaxVer, New Version(1, 10, 999, 999), MaxVer) ElseIf McVersionCurrent.Version.McCodeMain = 15 Then '1.15:Java 8 - 15 - MinVer = New Version(1, 8, 0, 0) : MaxVer = New Version(1, 15, 999, 999) + MinVer = If(New Version(1, 8, 0, 0) > MinVer, New Version(1, 8, 0, 0), MinVer) + MaxVer = If(New Version(1, 15, 999, 999) < MaxVer, New Version(1, 15, 999, 999), MaxVer) ElseIf VersionSortBoolean(McVersionCurrent.Version.ForgeVersion, "34.0.0") AndAlso VersionSortBoolean("36.2.25", McVersionCurrent.Version.ForgeVersion) Then '1.16,Forge 34.X ~ 36.2.25:最高 Java 8u320 - MaxVer = New Version(1, 8, 0, 320) + MaxVer = If(New Version(1, 8, 0, 320) < MaxVer, New Version(1, 8, 0, 320), MaxVer) ElseIf McVersionCurrent.Version.McCodeMain >= 18 AndAlso McVersionCurrent.Version.McCodeMain < 19 AndAlso McVersionCurrent.Version.HasOptiFine Then '#305 '1.18:若安装了 OptiFine,最高 Java 18 - MaxVer = New Version(1, 18, 999, 999) + MaxVer = If(New Version(1, 18, 999, 999) < MaxVer, New Version(1, 18, 999, 999), MaxVer) End If End If @@ -1119,10 +1181,10 @@ SystemBrowser: If McVersionCurrent.Version.HasFabric Then If McVersionCurrent.Version.McCodeMain >= 15 AndAlso McVersionCurrent.Version.McCodeMain <= 16 AndAlso McVersionCurrent.Version.McCodeMain <> -1 Then '1.15 - 1.16:Java 8+ - MinVer = New Version(1, 8, 0, 0) + MinVer = If(New Version(1, 8, 0, 0) > MinVer, New Version(1, 8, 0, 0), MinVer) ElseIf McVersionCurrent.Version.McCodeMain >= 18 AndAlso McVersionCurrent.Version.McCodeMain < 99 Then '1.18+:Java 17+ - MinVer = New Version(1, 17, 0, 0) + MinVer = If(New Version(1, 17, 0, 0) > MinVer, New Version(1, 17, 0, 0), MinVer) End If End If @@ -1132,63 +1194,68 @@ SystemBrowser: MinVer = If(New Version(1, 8, 0, 101) > MinVer, New Version(1, 8, 0, 101), MinVer) End If - '选择 Java - McLaunchLog("Java 版本需求:最低 " & MinVer.ToString & ",最高 " & MaxVer.ToString) - McLaunchJavaSelected = JavaSelect("$$", MinVer, MaxVer, McVersionCurrent) - If Task.IsAborted Then Exit Sub - If McLaunchJavaSelected IsNot Nothing Then - McLaunchLog("选择的 Java:" & McLaunchJavaSelected.ToString) - Exit Sub - End If + SyncLock JavaLock - '无合适的 Java - If Task.IsAborted Then Exit Sub '中断加载会导致 JavaSelect 异常地返回空值,误判找不到 Java - McLaunchLog("无合适的 Java,需要确认是否自动下载") - Dim JavaCode As String - If MinVer >= New Version(1, 21, 0, 0) Then - JavaCode = 21 - If Not JavaDownloadConfirm("Java 21") Then Throw New Exception("$$") - ElseIf MinVer >= New Version(1, 9, 0, 0) Then - JavaCode = 17 - If Not JavaDownloadConfirm("Java 17") Then Throw New Exception("$$") - ElseIf MaxVer < New Version(1, 8, 0, 0) Then - JavaCode = 7 - If Not JavaDownloadConfirm("Java 7") Then Throw New Exception("$$") - ElseIf MinVer > New Version(1, 8, 0, 100) AndAlso MaxVer < New Version(1, 8, 0, 321) Then - JavaCode = "8u101" - JavaDownloadConfirm("Java 8.0.101 ~ 8.0.320", True) - Throw New Exception("$$") - ElseIf MinVer > New Version(1, 8, 0, 100) Then - JavaCode = "8u101" - JavaDownloadConfirm("Java 8.0.101 或更高版本的 Java 8", True) - Throw New Exception("$$") - ElseIf MaxVer < New Version(1, 8, 0, 321) Then - JavaCode = 8 - If Not JavaDownloadConfirm("Java 8.0.320 或更低版本的 Java 8") Then Throw New Exception("$$") - Else - JavaCode = 8 - If Not JavaDownloadConfirm("Java 8") Then Throw New Exception("$$") - End If + '选择 Java + McLaunchLog("Java 版本需求:最低 " & MinVer.ToString & ",最高 " & MaxVer.ToString) + McLaunchJavaSelected = JavaSelect("$$", MinVer, MaxVer, McVersionCurrent) + If Task.IsAborted Then Exit Sub + If McLaunchJavaSelected IsNot Nothing Then + McLaunchLog("选择的 Java:" & McLaunchJavaSelected.ToString) + Exit Sub + End If - '开始自动下载 - Dim JavaLoader = JavaFixLoaders(JavaCode) - JavaLoader.Start(JavaCode, IsForceRestart:=True) - Do While JavaLoader.State = LoadState.Loading AndAlso Not Task.IsAborted - Task.Progress = JavaLoader.Progress - Thread.Sleep(10) - Loop + '无合适的 Java + If Task.IsAborted Then Exit Sub '中断加载会导致 JavaSelect 异常地返回空值,误判找不到 Java + McLaunchLog("无合适的 Java,需要确认是否自动下载") + Dim JavaCode As String + If MinVer >= New Version(1, 21, 0, 0) Then + JavaCode = 21 + If Not JavaDownloadConfirm("Java 21") Then Throw New Exception("$$") + ElseIf MinVer >= New Version(1, 9, 0, 0) Then + JavaCode = 17 + If Not JavaDownloadConfirm("Java 17") Then Throw New Exception("$$") + ElseIf MaxVer < New Version(1, 8, 0, 0) Then + JavaCode = 7 + If Not JavaDownloadConfirm("Java 7", True) Then Throw New Exception("$$") + ElseIf MinVer > New Version(1, 8, 0, 100) AndAlso MaxVer < New Version(1, 8, 0, 321) Then + JavaCode = "8u101" + If Not JavaDownloadConfirm("Java 8.0.101 ~ 8.0.320", True) Then Throw New Exception("$$") + ElseIf MinVer > New Version(1, 8, 0, 100) Then + JavaCode = "8u101" + If Not JavaDownloadConfirm("Java 8.0.101 或更高版本的 Java 8", True) Then Throw New Exception("$$") + ElseIf MaxVer < New Version(1, 8, 0, 321) Then + JavaCode = 8 + If Not JavaDownloadConfirm("Java 8.0.320 或更低版本的 Java 8") Then Throw New Exception("$$") + Else + JavaCode = 8 + If Not JavaDownloadConfirm("Java 8") Then Throw New Exception("$$") + End If - '检查下载结果 - If JavaSearchLoader.State <> LoadState.Loading Then JavaSearchLoader.State = LoadState.Waiting '2872# - McLaunchJavaSelected = JavaSelect("$$", MinVer, MaxVer, McVersionCurrent) - If Task.IsAborted Then Exit Sub - If McLaunchJavaSelected IsNot Nothing Then - McLaunchLog("选择的 Java:" & McLaunchJavaSelected.ToString) - Else - Hint("没有可用的 Java,已取消启动!", HintType.Critical) - Throw New Exception("$$") - End If + '开始自动下载 + Dim JavaLoader = JavaFixLoaders(JavaCode) + Try + JavaLoader.Start(JavaCode, IsForceRestart:=True) + Do While JavaLoader.State = LoadState.Loading AndAlso Not Task.IsAborted + Task.Progress = JavaLoader.Progress + Thread.Sleep(10) + Loop + Finally + JavaLoader.Abort() '确保取消时中止 Java 下载 + End Try + '检查下载结果 + If JavaSearchLoader.State <> LoadState.Loading Then JavaSearchLoader.State = LoadState.Waiting '2872# + McLaunchJavaSelected = JavaSelect("$$", MinVer, MaxVer, McVersionCurrent) + If Task.IsAborted Then Exit Sub + If McLaunchJavaSelected IsNot Nothing Then + McLaunchLog("选择的 Java:" & McLaunchJavaSelected.ToString) + Else + Hint("没有可用的 Java,已取消启动!", HintType.Critical) + Throw New Exception("$$") + End If + + End SyncLock End Sub #End Region @@ -1202,17 +1269,20 @@ SystemBrowser: ''' Public Function ExtractJavaWrapper() As String Dim WrapperPath As String = GetJavaWrapperDir() & "\JavaWrapper.jar" - WriteFile(WrapperPath, GetResources("JavaWrapper")) + SyncLock ExtractJavaWrapperLock '避免 OptiFine 和 Forge 安装时同时释放 Java Wrapper 导致冲突 + WriteFile(WrapperPath, GetResources("JavaWrapper")) + End SyncLock Log("[Java] 已释放 Java Wrapper:" & WrapperPath) Return WrapperPath End Function + Private ExtractJavaWrapperLock As New Object ''' ''' 获取 Java Wrapper 所在的文件夹,不以 \ 结尾。 ''' Public Function GetJavaWrapperDir() As String - If Encoding.UTF8.GetByteCount(PathAppdata) = PathAppdata.Length Then + If PathAppdata.IsASCII() Then Return PathAppdata.TrimEnd("\") - ElseIf Encoding.UTF8.GetByteCount(PathTemp) = PathTemp.Length Then + ElseIf PathTemp.IsASCII() Then Log("[Java] Wrapper:AppData 路径中包含非 ASCII 字符,换用 Temp 目录") Return PathTemp.TrimEnd("\") Else @@ -1276,9 +1346,7 @@ SystemBrowser: '不包含端口号 Arguments += " --server " & Server & " --port 25565" End If - If McVersionCurrent.Version.HasOptiFine Then 'OptiFine 警告 - Hint("OptiFine 与自动进入服务器可能不兼容,有概率导致材质丢失甚至游戏崩溃!", HintType.Critical) - End If + If McVersionCurrent.Version.HasOptiFine Then Hint("OptiFine 与自动进入服务器可能不兼容,有概率导致材质丢失甚至游戏崩溃!", HintType.Critical) End If End If '自定义 @@ -1300,10 +1368,11 @@ SystemBrowser: Dim ArgumentJvm As String = Setup.Get("VersionAdvanceJvm", Version:=McVersionCurrent) If ArgumentJvm = "" Then ArgumentJvm = Setup.Get("LaunchAdvanceJvm") If Not ArgumentJvm.Contains("-Dlog4j2.formatMsgNoLookups=true") Then ArgumentJvm += " -Dlog4j2.formatMsgNoLookups=true" + ArgumentJvm = ArgumentJvm.Replace(" -XX:MaxDirectMemorySize=256M", "") '#3511 的清理 DataList.Insert(0, ArgumentJvm) '可变 JVM 参数 - DataList.Add("-Xmn256m") + DataList.Add("-Xmn" & Math.Floor(PageVersionSetup.GetRam(McVersionCurrent, Not McLaunchJavaSelected.Is64Bit) * 1024 * 0.15) & "m") DataList.Add("-Xmx" & Math.Floor(PageVersionSetup.GetRam(McVersionCurrent, Not McLaunchJavaSelected.Is64Bit) * 1024) & "m") - DataList.Add("""-Djava.library.path=" & Version.Path & Version.Name & "-natives""") + DataList.Add("""-Djava.library.path=" & GetNativesFolder() & """") DataList.Add("-cp ${classpath}") '把支持库添加进启动参数表 '统一通行证 @@ -1415,6 +1484,9 @@ NextVersion: DeDuplicateDataList.Add(CurrentEntry.Trim.Replace("McEmu= ", "McEmu=")) Next + '#3511 的清理 + DeDuplicateDataList.Remove("-XX:MaxDirectMemorySize=256M") + '去重 Dim Result As String = Join(DeDuplicateDataList.Distinct.ToList, " ") @@ -1535,7 +1607,7 @@ NextVersion: '基础参数 GameArguments.Add("${classpath_separator}", ";") - GameArguments.Add("${natives_directory}", Version.Path & Version.Name & "-natives") + GameArguments.Add("${natives_directory}", GetNativesFolder()) GameArguments.Add("${library_directory}", PathMcFolder & "libraries") GameArguments.Add("${libraries_directory}", PathMcFolder & "libraries") GameArguments.Add("${launcher_name}", "PCL") @@ -1552,9 +1624,27 @@ NextVersion: GameArguments.Add("${access_token}", McLoginLoader.Output.AccessToken) GameArguments.Add("${auth_session}", McLoginLoader.Output.AccessToken) GameArguments.Add("${user_type}", "msa") '#1221 - Dim GameSize As Size = Setup.GetLaunchArgumentWindowSize() - GameArguments.Add("${resolution_width}", GameSize.Width) - GameArguments.Add("${resolution_height}", GameSize.Height) + + '窗口尺寸参数 + Dim GameSize As Size + Select Case Setup.Get("LaunchArgumentWindowType") + Case 2 + Dim Result As Size + RunInUiWait(Sub() Result = New Size(GetPixelSize(FrmMain.PanForm.ActualWidth), GetPixelSize(FrmMain.PanForm.ActualHeight))) + GameSize = Result + Case 3 + GameSize = New Size(Math.Max(100, Setup.Get("LaunchArgumentWindowWidth") - 2), Math.Max(100, Setup.Get("LaunchArgumentWindowHeight") - 2)) + Case Else + GameSize = New Size(875 - 2, 540 - 2) + End Select + GameSize.Height -= 29.5 * DPI / 96 '标题栏高度 + If McVersionCurrent.Version.McCodeMain <= 12 AndAlso McLaunchJavaSelected.VersionCode <= 8 AndAlso + Not McVersionCurrent.Version.HasOptiFine AndAlso Not McVersionCurrent.Version.HasForge Then '修复 #3463:1.12.2-,JRE 8 下窗口大小为设置大小的 DPI% 倍 + GameSize.Width /= DPI / 96 + GameSize.Height /= DPI / 96 + End If + GameArguments.Add("${resolution_width}", Math.Round(GameSize.Width)) + GameArguments.Add("${resolution_height}", Math.Round(GameSize.Height)) 'Assets 相关参数 GameArguments.Add("${game_assets}", PathMcFolder & "assets\virtual\legacy") '1.5.2 的 pre-1.6 资源索引应与 legacy 合并 @@ -1586,7 +1676,8 @@ NextVersion: Private Sub McLaunchNatives(Loader As LoaderTask(Of List(Of McLibToken), Integer)) '创建文件夹 - Directory.CreateDirectory(McVersionCurrent.Path & McVersionCurrent.Name & "-natives") + Dim Target As String = GetNativesFolder() & "\" + Directory.CreateDirectory(Target) '解压文件 McLaunchLog("正在解压 Natives 文件") @@ -1605,7 +1696,7 @@ NextVersion: Dim FileName As String = Entry.FullName If FileName.EndsWithF(".dll", True) Then '实际解压文件的步骤 - Dim FilePath As String = McVersionCurrent.Path & McVersionCurrent.Name & "-natives\" & FileName + Dim FilePath As String = Target & FileName ExistFiles.Add(FilePath) Dim OriginalFile As New FileInfo(FilePath) If OriginalFile.Exists Then @@ -1631,7 +1722,7 @@ NextVersion: Next '删除多余文件 - For Each FileName As String In Directory.GetFiles(McVersionCurrent.Path & McVersionCurrent.Name & "-natives") + For Each FileName As String In Directory.GetFiles(Target) If ExistFiles.Contains(FileName) Then Continue For Try McLaunchLog("删除:" & FileName) @@ -1644,6 +1735,16 @@ NextVersion: Next End Sub + ''' + ''' 获取 Natives 文件夹路径,不以 \ 结尾。 + ''' + Private Function GetNativesFolder() As String + Dim Result As String = McVersionCurrent.Path & McVersionCurrent.Name & "-natives" + If IsGBKEncoding OrElse Result.IsASCII() Then Return Result + Result = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\.minecraft\bin\natives" + If Result.IsASCII() Then Return Result + Return OsDrive & "ProgramData\PCL\natives" + End Function #End Region @@ -1737,13 +1838,14 @@ NextVersion: '1.11 ~ 12:zh_cn 时正常,zh_CN 时虽然显示了中文但语言设置会错误地显示选择英文 '1.13+ :zh_cn 时正常,zh_CN 时自动切换为英文 Dim CurrentLang As String = ReadIni(SetupFileAddress, "lang", "none") - Dim RequiredLang As String = If(CurrentLang = "none", If(Setup.Get("ToolHelpChinese"), "zh_cn", "en_us"), CurrentLang.ToLower) + Dim RequiredLang As String = If(CurrentLang = "none" OrElse Not Directory.Exists(McVersionCurrent.PathIndie & "saves"), '#3844,整合包可能已经自带了 options.txt + If(Setup.Get("ToolHelpChinese"), "zh_cn", "en_us"), CurrentLang.ToLower) If McVersionCurrent.Version.McCodeMain < 12 Then '注意老版本(包含 MC 1.1)的 McCodeMain 可能为 -1 '将最后两位改为大写,前面的部分保留 RequiredLang = RequiredLang.Substring(0, RequiredLang.Length - 2) & RequiredLang.Substring(RequiredLang.Length - 2).ToUpper End If If CurrentLang = RequiredLang Then - McLaunchLog($"当前语言为 {CurrentLang},无需修改") + McLaunchLog($"需要的语言为 {RequiredLang},当前语言为 {CurrentLang},无需修改") Else WriteIni(SetupFileAddress, "lang", "-") '触发缓存更改,避免删除后重新下载残留缓存 WriteIni(SetupFileAddress, "lang", RequiredLang) @@ -1758,7 +1860,7 @@ NextVersion: Select Case Setup.Get("LaunchArgumentWindowType") Case 0 '全屏 WriteIni(SetupFileAddress, "fullscreen", "true") - Case 5 '保持默认 + Case 1 '默认 Case Else '其他 WriteIni(SetupFileAddress, "fullscreen", "false") End Select @@ -1936,7 +2038,7 @@ IgnoreCustomSkin: """" & McLaunchJavaSelected.PathJava & """ " & McLaunchArgument & vbCrLf & "echo 游戏已退出。" & vbCrLf & "pause" - WriteFile(If(McLaunchLoader.Input.SaveBatch, Path & "PCL\LatestLaunch.bat"), SecretFilter(CmdString), + WriteFile(If(McLaunchLoader.Input.SaveBatch, Path & "PCL\LatestLaunch.bat"), SecretFilter(CmdString, "F"), Encoding:=If(Encoding.Default.Equals(Encoding.UTF8), Encoding.UTF8, Encoding.GetEncoding("GB18030"))) If McLaunchLoader.Input.SaveBatch IsNot Nothing Then McLaunchLog("导出启动脚本完成,强制结束启动过程") @@ -2058,7 +2160,7 @@ IgnoreCustomSkin: McLaunchLog("") McLaunchLog("~ 基础参数 ~") McLaunchLog("PCL 版本:" & VersionDisplayName & " (" & VersionCode & ")") - McLaunchLog("游戏版本:" & McVersionCurrent.Version.ToString & "(" & McVersionCurrent.Version.McCodeMain & "." & McVersionCurrent.Version.McCodeSub & ")") + McLaunchLog("游戏版本:" & McVersionCurrent.Version.ToString & "(识别为 1." & McVersionCurrent.Version.McCodeMain & "." & McVersionCurrent.Version.McCodeSub & ")") McLaunchLog("资源版本:" & McAssetsGetIndexName(McVersionCurrent)) McLaunchLog("版本继承:" & If(McVersionCurrent.InheritVersion = "", "无", McVersionCurrent.InheritVersion)) McLaunchLog("分配的内存:" & PageVersionSetup.GetRam(McVersionCurrent, Not McLaunchJavaSelected.Is64Bit) & " GB(" & Math.Round(PageVersionSetup.GetRam(McVersionCurrent, Not McLaunchJavaSelected.Is64Bit) * 1024) & " MB)") @@ -2068,6 +2170,7 @@ IgnoreCustomSkin: McLaunchLog("HMCL 格式:" & McVersionCurrent.IsHmclFormatJson) McLaunchLog("Java 信息:" & If(McLaunchJavaSelected IsNot Nothing, McLaunchJavaSelected.ToString, "无可用 Java")) McLaunchLog("环境变量:" & If(McLaunchJavaSelected IsNot Nothing, If(McLaunchJavaSelected.HasEnvironment, "已设置", "未设置"), "未设置")) + McLaunchLog("Natives 文件夹:" & GetNativesFolder()) McLaunchLog("") McLaunchLog("~ 登录参数 ~") McLaunchLog("玩家用户名:" & McLoginLoader.Output.Name) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb index 1f25858..458a42a 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb @@ -1,4 +1,6 @@ -Public Module ModMinecraft +Imports System.IO.Compression + +Public Module ModMinecraft #Region "文件夹" @@ -149,7 +151,7 @@ #Region "版本处理" - Public Const McVersionCacheVersion As Integer = 27 + Public Const McVersionCacheVersion As Integer = 29 Private _McVersionCurrent As McVersion Private _McVersionLast = 0 '为 0 以保证与 Nothing 不相同,使得 UI 显示可以正常初始化 @@ -181,7 +183,7 @@ If AniControlEnabled = 0 AndAlso Setup.Get("VersionServerAuthServer", Version:=value) <> Setup.Get("CacheAuthServerServer") AndAlso Setup.Get("VersionServerLogin", Version:=value) = 4 Then - Setup.Set("CacheNideServer", "") + Setup.Set("CacheAuthAccess", "") Log("[Launch] 服务器改变,要求重新登录 Authlib-Injector") End If If Setup.Get("VersionServerLogin", Version:=value) = 4 Then @@ -216,8 +218,8 @@ '尚未判断 Dim ModFolder As New DirectoryInfo(Path & "mods\") Dim SaveFolder As New DirectoryInfo(Path & "saves\") - If (ModFolder.Exists AndAlso ModFolder.EnumerateFiles.Count > 0) OrElse - (SaveFolder.Exists AndAlso SaveFolder.EnumerateFiles.Count > 0) Then + If (ModFolder.Exists AndAlso ModFolder.EnumerateFiles.Any) OrElse + (SaveFolder.Exists AndAlso SaveFolder.EnumerateFiles.Any) Then '自动开启 Setup.Set("VersionArgumentIndie", 1, Version:=Me) Log("[Setup] 已自动开启单版本隔离:" & Name) @@ -391,6 +393,29 @@ _Version.McName = JsonObject("jar").ToString GoTo VersionSearchFinish End If + '从 jar 文件的 version.json 中获取版本号 + If File.Exists(Path & Name & ".jar") Then + Try + Using JarArchive As New ZipArchive(New FileStream(Path & Name & ".jar", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + Dim VersionJson As ZipArchiveEntry = JarArchive.GetEntry("version.json") + If VersionJson IsNot Nothing Then + Using VersionJsonStream As New StreamReader(VersionJson.Open) + Dim VersionJsonObj As JObject = GetJson(VersionJsonStream.ReadToEnd) + If VersionJsonObj("id") IsNot Nothing Then + Dim VersionId As String = VersionJsonObj("id").ToString + If VersionId.Length < 32 Then '因为 wiki 说这玩意儿可能是个 hash,虽然我没发现 + _Version.McName = VersionId + Log("[Minecraft] 从版本 jar 中的 version.json 获取到版本号:" & VersionId) + GoTo VersionSearchFinish + End If + End If + End Using + End If + End Using + Catch ex As Exception + Log(ex, "从版本 jar 中的 version.json 获取版本号失败") + End Try + End If '非准确的版本判断警告 Log("[Minecraft] 无法完全确认 MC 版本号的版本:" & Name) '从文件夹名中获取 @@ -1034,7 +1059,7 @@ ExitDataLoad: Dim Path As String = Loader.Input Try '初始化 - McVersionList.Clear() + McVersionList = New Dictionary(Of McVersionCardType, List(Of McVersion)) '检测缓存是否需要更新 Dim FolderList As New List(Of String) @@ -1075,10 +1100,10 @@ Reload: '改变当前选择的版本 OnLoaded: - If McVersionList.Any(Function(v) v.Key <> McVersionCardType.Error) Then '不能判断 Count = 0,这在只有错误版本时导致了误判 + If McVersionList.Any(Function(v) v.Key <> McVersionCardType.Error) Then '尝试读取已储存的选择 Dim SavedSelection As String = ReadIni(Path & "PCL.ini", "Version") - If Not SavedSelection = "" Then + If SavedSelection <> "" Then For Each Card As KeyValuePair(Of McVersionCardType, List(Of McVersion)) In McVersionList For Each Version As McVersion In Card.Value If Version.Name = SavedSelection AndAlso Not Version.State = McVersionState.Error Then @@ -1190,7 +1215,7 @@ OnLoaded: End Try Next - ResultVersionList.Add(CardType, VersionList) + If VersionList.Any Then ResultVersionList.Add(CardType, VersionList) Next Return ResultVersionList Catch ex As Exception @@ -1200,10 +1225,14 @@ OnLoaded: End Function Private Function McVersionListLoadNoCache(Path As String) As Dictionary(Of McVersionCardType, List(Of McVersion)) Dim VersionList As New List(Of McVersion) - Dim ResultVersionList As New Dictionary(Of McVersionCardType, List(Of McVersion)) + #Region "循环加载每个版本的信息" Dim Dirs As DirectoryInfo() = New DirectoryInfo(Path & "versions").GetDirectories For Each Folder As DirectoryInfo In Dirs + If Not Folder.EnumerateFiles.Any Then + Log("[Minecraft] 跳过空文件夹:" & Folder.FullName) + Continue For + End If If (Folder.Name = "cache" OrElse Folder.Name = "BLClient" OrElse Folder.Name = "PCL") AndAlso Not File.Exists(Folder.FullName & "\" & Folder.Name & ".json") Then Log("[Minecraft] 跳过可能不是版本文件夹的项目:" & Folder.FullName) Continue For @@ -1223,6 +1252,9 @@ OnLoaded: Version.Load() Next #End Region + + Dim ResultVersionList As New Dictionary(Of McVersionCardType, List(Of McVersion)) + #Region "将版本分类到各个卡片" Try @@ -1234,9 +1266,9 @@ OnLoaded: For Each Version As McVersion In VersionList If Version.IsStar AndAlso Not Version.DisplayType = McVersionCardType.Hidden Then StaredVersions.Add(Version) Next - If StaredVersions.Count > 0 Then VersionListOriginal.Add(McVersionCardType.Star, StaredVersions) + If StaredVersions.Any Then VersionListOriginal.Add(McVersionCardType.Star, StaredVersions) - '预先筛选出愚人节的版本 + '预先筛选出愚人节和错误的版本 McVersionFilter(VersionList, VersionListOriginal, {McVersionState.Error}, McVersionCardType.Error) McVersionFilter(VersionList, VersionListOriginal, {McVersionState.Fool}, McVersionCardType.Fool) @@ -1308,8 +1340,8 @@ OnLoaded: '将剩余的东西添加进去 VersionRubbish.AddRange(VersionList) - If VersionUseful.Count > 0 Then VersionListOriginal.Add(McVersionCardType.OriginalLike, VersionUseful) - If VersionRubbish.Count > 0 Then VersionListOriginal.Add(McVersionCardType.Rubbish, VersionRubbish) + If VersionUseful.Any Then VersionListOriginal.Add(McVersionCardType.OriginalLike, VersionUseful) + If VersionRubbish.Any Then VersionListOriginal.Add(McVersionCardType.Rubbish, VersionRubbish) '按照自定义版本分类重新添加 For Each VersionPair In VersionListOriginal @@ -1347,9 +1379,7 @@ OnLoaded: Next If Not IsNothing(Snapshot) Then OldList.Remove(Snapshot) '按版本号排序 - Dim NewList As List(Of McVersion) = Sort(OldList, Function(Left As McVersion, Right As McVersion) - Return Left.Version.McCodeMain > Right.Version.McCodeMain - End Function) + Dim NewList As List(Of McVersion) = Sort(OldList, Function(Left, Right) Left.Version.McCodeMain > Right.Version.McCodeMain) '回设 If Not IsNothing(Snapshot) Then NewList.Insert(0, Snapshot) ResultVersionList(McVersionCardType.OriginalLike) = NewList @@ -1357,43 +1387,45 @@ OnLoaded: '不常用版本:按发布时间新旧排序,如果不可用则按名称排序 If ResultVersionList.ContainsKey(McVersionCardType.Rubbish) Then - ResultVersionList(McVersionCardType.Rubbish) = Sort(ResultVersionList(McVersionCardType.Rubbish), Function(Left As McVersion, Right As McVersion) - Dim LeftYear As Integer = Left.ReleaseTime.Year '+ If(Left.State = McVersionState.Original OrElse Left.Version.HasOptiFine, 100, 0) - Dim RightYear As Integer = Right.ReleaseTime.Year '+ If(Right.State = McVersionState.Original OrElse Left.Version.HasOptiFine, 100, 0) - If LeftYear > 2000 AndAlso RightYear > 2000 Then - If LeftYear <> RightYear Then - Return LeftYear > RightYear - Else - Return Left.ReleaseTime > Right.ReleaseTime - End If - ElseIf LeftYear > 2000 AndAlso RightYear < 2000 Then - Return True - ElseIf LeftYear < 2000 AndAlso RightYear > 2000 Then - Return False - Else - Return Left.Name > Right.Name - End If - End Function) + ResultVersionList(McVersionCardType.Rubbish) = Sort(ResultVersionList(McVersionCardType.Rubbish), + Function(Left As McVersion, Right As McVersion) + Dim LeftYear As Integer = Left.ReleaseTime.Year '+ If(Left.State = McVersionState.Original OrElse Left.Version.HasOptiFine, 100, 0) + Dim RightYear As Integer = Right.ReleaseTime.Year '+ If(Right.State = McVersionState.Original OrElse Left.Version.HasOptiFine, 100, 0) + If LeftYear > 2000 AndAlso RightYear > 2000 Then + If LeftYear <> RightYear Then + Return LeftYear > RightYear + Else + Return Left.ReleaseTime > Right.ReleaseTime + End If + ElseIf LeftYear > 2000 AndAlso RightYear < 2000 Then + Return True + ElseIf LeftYear < 2000 AndAlso RightYear > 2000 Then + Return False + Else + Return Left.Name > Right.Name + End If + End Function) End If 'API 版本:优先按版本排序,此后【先放 Fabric,再放 Forge(按版本号从高到低排序),最后放 LiteLoader(按名称排序)】 If ResultVersionList.ContainsKey(McVersionCardType.API) Then - ResultVersionList(McVersionCardType.API) = Sort(ResultVersionList(McVersionCardType.API), Function(Left As McVersion, Right As McVersion) - Dim Basic = VersionSortInteger(Left.Version.McName, Right.Version.McName) - If Basic <> 0 Then - Return Basic > 0 - Else - If Left.Version.HasFabric Xor Right.Version.HasFabric Then - Return Left.Version.HasFabric - ElseIf Left.Version.HasForge Xor Right.Version.HasForge Then - Return Left.Version.HasForge - ElseIf Not Left.Version.SortCode <> Right.Version.SortCode Then - Return Left.Version.SortCode > Right.Version.SortCode - Else - Return Left.Name > Right.Name - End If - End If - End Function) + ResultVersionList(McVersionCardType.API) = Sort(ResultVersionList(McVersionCardType.API), + Function(Left As McVersion, Right As McVersion) + Dim Basic = VersionSortInteger(Left.Version.McName, Right.Version.McName) + If Basic <> 0 Then + Return Basic > 0 + Else + If Left.Version.HasFabric Xor Right.Version.HasFabric Then + Return Left.Version.HasFabric + ElseIf Left.Version.HasForge Xor Right.Version.HasForge Then + Return Left.Version.HasForge + ElseIf Not Left.Version.SortCode <> Right.Version.SortCode Then + Return Left.Version.SortCode > Right.Version.SortCode + Else + Return Left.Name > Right.Name + End If + End If + End Function) End If #End Region @@ -1417,19 +1449,9 @@ OnLoaded: ''' 需要筛选出的版本类型。-2 代表隐藏的版本。 ''' 卡片的名称。 Private Sub McVersionFilter(ByRef VersionList As List(Of McVersion), ByRef Target As Dictionary(Of McVersionCardType, List(Of McVersion)), Formula As McVersionState(), CardType As McVersionCardType) - '将某种版本筛选出来 - Dim KeepList As New List(Of McVersion) - For Each Version As McVersion In VersionList - For Each Type As Integer In Formula - If Type = Version.State Then - KeepList.Add(Version) - GoTo NextVersion - End If - Next -NextVersion: - Next + Dim KeepList = VersionList.Where(Function(v) Formula.Contains(v.State)).ToList '加入版本列表,并从剩余中删除 - If KeepList.Count > 0 Then + If KeepList.Any Then Target.Add(CardType, KeepList) For Each Version As McVersion In KeepList VersionList.Remove(Version) @@ -1443,14 +1465,9 @@ NextVersion: ''' 需要筛选出的版本类型。-2 代表隐藏的版本。 ''' 传入需要增加入的列表。 Private Sub McVersionFilter(ByRef VersionList As List(Of McVersion), Formula As McVersionState(), ByRef KeepList As List(Of McVersion)) - For Each Version As McVersion In VersionList - For Each Type As McVersionState In Formula - If Type <> Version.State Then Continue For - KeepList.Add(Version) : Exit For - Next -NextVersion: - Next - If KeepList.Count > 0 Then + KeepList.AddRange(VersionList.Where(Function(v) Formula.Contains(v.State))) + '加入版本列表,并从剩余中删除 + If KeepList.Any Then For Each Version As McVersion In KeepList VersionList.Remove(Version) Next @@ -1515,7 +1532,7 @@ NextVersion: ''' Public Function McSkinGetAddress(Uuid As String, Type As String) As String If Uuid = "" Then Throw New Exception("Uuid 为空。") - If Uuid.StartsWithF("000000") Then Throw New Exception("离线 Uuid 无正版皮肤文件。") + If Uuid.StartsWithF("00000") Then Throw New Exception("离线 Uuid 无正版皮肤文件。") '尝试读取缓存 Dim CacheSkinAddress As String = ReadIni(PathTemp & "Cache\Skin\Index" & Type & ".ini", Uuid) If Not CacheSkinAddress = "" Then Return CacheSkinAddress @@ -2001,7 +2018,7 @@ NextVersion: Result.Add(New NetFile(Urls.Distinct.ToArray, Token.LocalPath, Checker)) Next '去重并返回 - Return Distinct(Result, Function(a, b) a.LocalPath = b.LocalPath) + Return Result.Distinct(Function(a, b) a.LocalPath = b.LocalPath) End Function ''' ''' 获取对应的支持库文件地址。 @@ -2048,8 +2065,7 @@ NextVersion: If Version.InheritVersion = "" Then Exit Do Version = New McVersion(PathMcFolder & "versions\" & Version.InheritVersion) Loop - Catch ex As Exception - Log(ex, "获取资源文件索引下载地址失败") + Catch End Try '无法获取到下载地址 If ReturnLegacyOnError Then @@ -2239,10 +2255,11 @@ NextVersion: '弹窗结果 If MsgResult = 2 Then '下载 - RunInUi(Sub() - PageDownloadInstall.McVersionWaitingForSelect = VersionName - FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadInstall) - End Sub) + RunInUi( + Sub() + PageDownloadInstall.McVersionWaitingForSelect = VersionName + FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadInstall) + End Sub) End If Catch ex As Exception diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb index 1a05fe3..348d3cb 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb @@ -337,7 +337,7 @@ Public Module ModMod For Each Token In AuthorJson Author.Add(Token.ToString) Next - If Author.Count > 0 Then Authors = Join(Author, ", ") + If Author.Any Then Authors = Join(Author, ", ") End If Dim Reqs As JArray = InfoObject("requiredMods") If Reqs IsNot Nothing Then @@ -393,7 +393,7 @@ GotFabric: For Each Token In AuthorJson Author.Add(Token.ToString) Next - If Author.Count > 0 Then Authors = Join(Author, ", ") + If Author.Any Then Authors = Join(Author, ", ") End If 'If (Not FabricObject.ContainsKey("serverSideOnly")) OrElse FabricObject("serverSideOnly")("value").ToObject(Of Boolean) = False Then ' '添加 Minecraft 依赖 @@ -438,7 +438,7 @@ GotFabric: Line = Line.Substring(0, Line.IndexOfF("#")) End If Line = Line.Trim(New Char() {" "c, " "c, " "c}) '去除头尾的空格 - If Line.Count > 0 Then Lines.Add(Line) '去除空行 + If Line.Any Then Lines.Add(Line) '去除空行 Next '读取文件数据 Dim TomlData As New List(Of KeyValuePair(Of String, Dictionary(Of String, Object))) From {New KeyValuePair(Of String, Dictionary(Of String, Object))("", New Dictionary(Of String, Object))} @@ -887,11 +887,11 @@ Finished: ModList.Add(ModEntry) '读取 Comp 缓存 If ModEntry.State = McMod.McModState.Unavaliable Then Continue For - Dim Hash = ModEntry.ModrinthHash - If Cache.ContainsKey(Hash) Then - ModEntry.FromJson(Cache(Hash)) + Dim CacheKey = ModEntry.ModrinthHash & PageVersionLeft.Version.Version.McName + If Cache.ContainsKey(CacheKey) Then + ModEntry.FromJson(Cache(CacheKey)) '如果缓存中的信息在 6 小时以内更新过,则无需重新获取 - If ModEntry.CompLoaded AndAlso Date.Now - Cache(Hash)("Comp")("CacheTime").ToObject(Of Date) < New TimeSpan(6, 0, 0) Then Continue For + If ModEntry.CompLoaded AndAlso Date.Now - Cache(CacheKey)("Comp")("CacheTime").ToObject(Of Date) < New TimeSpan(6, 0, 0) Then Continue For End If ModUpdateList.Add(ModEntry) Next @@ -925,7 +925,7 @@ Finished: End Sub '联网加载 Mod 详情 - Private Const LocalModCacheVersion As Integer = 2 + Private Const LocalModCacheVersion As Integer = 4 Public McModDetailLoader As New LoaderTask(Of KeyValuePair(Of List(Of McMod), JObject), Integer)("Mod List Detail Loader", AddressOf McModDetailLoad) Private Sub McModDetailLoad(Loader As LoaderTask(Of KeyValuePair(Of List(Of McMod), JObject), Integer)) Dim Mods As List(Of McMod) = Loader.Input.Key @@ -937,7 +937,7 @@ Finished: If TargetMcVersion.HasFabric Then ModLoaders.Add(CompModLoaderType.Fabric) If TargetMcVersion.HasLiteLoader Then ModLoaders.Add(CompModLoaderType.LiteLoader) If Not ModLoaders.Any() Then ModLoaders.AddRange({CompModLoaderType.Forge, CompModLoaderType.Fabric, CompModLoaderType.LiteLoader, CompModLoaderType.Quilt}) - Dim McVersions As New List(Of String) From {TargetMcVersion.McName} + Dim McVersion = TargetMcVersion.McName '暂不向下扩展检查的 MC 小版本 '例如:Mod 在更新 1.16.5 后,对早期的 1.16.2 版本发布了修补补丁,这会导致 PCL 将 1.16.5 版本的 Mod 降级到 1.16.2 'If TargetMcVersion.McCodeMain > 0 AndAlso TargetMcVersion.McCodeMain < 99 Then @@ -948,7 +948,7 @@ Finished: 'End If 'McVersions = McVersions.Distinct().ToList() '开始网络获取 - Log($"[Mod] 目标加载器:{ModLoaders.Join("/")},版本:{McVersions.Join("/")}") + Log($"[Mod] 目标加载器:{ModLoaders.Join("/")},版本:{McVersion}") Dim EndedThreadCount As Integer = 0, SucceedThreadCount As Integer = 0 Dim MainThread As Thread = Thread.CurrentThread '从 Modrinth 获取信息 @@ -965,6 +965,7 @@ Finished: Dim ModrinthMapping As New Dictionary(Of String, List(Of McMod)) For Each Entry In Mods If Not ModrinthVersion.ContainsKey(Entry.ModrinthHash) Then Continue For + If ModrinthVersion(Entry.ModrinthHash)("files")(0)("hashes")("sha1") <> Entry.ModrinthHash Then Continue For Dim ProjectId = ModrinthVersion(Entry.ModrinthHash)("project_id").ToString If CompProjectCache.ContainsKey(ProjectId) AndAlso Entry.Comp Is Nothing Then Entry.Comp = CompProjectCache(ProjectId) '读取已加载的缓存,加快结果出现速度 If Not ModrinthMapping.ContainsKey(ProjectId) Then ModrinthMapping(ProjectId) = New List(Of McMod) @@ -990,8 +991,8 @@ Finished: Log($"[Mod] 已从 Modrinth 获取本地 Mod 信息,继续获取更新信息") '步骤 4:获取更新信息 Dim ModrinthUpdate = CType(GetJson(NetRequestRetry("https://api.modrinth.com/v2/version_files/update", "POST", - $"{{""hashes"": [""{ModrinthHashes.Join(""",""")}""], ""algorithm"": ""sha1"", - ""loaders"": [""{ModLoaders.Join(""",""").ToLower}""],""game_versions"": [""{McVersions.Join(""",""")}""]}}", "application/json")), JObject) + $"{{""hashes"": [""{ModrinthMapping.SelectMany(Function(l) l.Value.Select(Function(m) m.ModrinthHash)).Join(""",""")}""], ""algorithm"": ""sha1"", + ""loaders"": [""{ModLoaders.Join(""",""").ToLower}""],""game_versions"": [""{McVersion}""]}}", "application/json")), JObject) For Each Entry In Mods If Not ModrinthUpdate.ContainsKey(Entry.ModrinthHash) OrElse Entry.CompFile Is Nothing Then Continue For Dim UpdateFile As New CompFile(ModrinthUpdate(Entry.ModrinthHash), CompType.Mod) @@ -1000,11 +1001,11 @@ Finished: If Entry.CompFile.ReleaseDate >= UpdateFile.ReleaseDate OrElse Entry.CompFile.Hash = UpdateFile.Hash Then Continue For '设置更新日志与更新文件 If Entry.UpdateFile IsNot Nothing AndAlso UpdateFile.Hash = Entry.UpdateFile.Hash Then '合并 - Entry.ChangelogUrls.Add($"https://modrinth.com/mod/{ModrinthUpdate(Entry.ModrinthHash)("project_id")}/changelog?{McVersions.Select(Function(v) $"g={v}&").Join("")}") + Entry.ChangelogUrls.Add($"https://modrinth.com/mod/{ModrinthUpdate(Entry.ModrinthHash)("project_id")}/changelog?g={McVersion}") UpdateFile.DownloadUrls.AddRange(Entry.UpdateFile.DownloadUrls) '合并下载源 Entry.UpdateFile = UpdateFile '优先使用 Modrinth 的文件 ElseIf Entry.UpdateFile Is Nothing OrElse UpdateFile.ReleaseDate >= Entry.UpdateFile.ReleaseDate Then '替换 - Entry.ChangelogUrls = New List(Of String) From {$"https://modrinth.com/mod/{ModrinthUpdate(Entry.ModrinthHash)("project_id")}/changelog?{McVersions.Select(Function(v) $"g={v}&").Join("")}"} + Entry.ChangelogUrls = New List(Of String) From {$"https://modrinth.com/mod/{ModrinthUpdate(Entry.ModrinthHash)("project_id")}/changelog?g={McVersion}"} Entry.UpdateFile = UpdateFile End If Next @@ -1072,7 +1073,7 @@ Finished: For Each IndexEntry In ProjectJson("latestFilesIndexes") If ModLoaders.Single <> IndexEntry("modLoader")?.ToObject(Of Integer) Then Continue For 'ModLoader 唯一且匹配 Dim IndexVersion As String = IndexEntry("gameVersion") - If Not McVersions.Contains(IndexVersion) Then Continue For 'MC 版本匹配 + If McVersion <> IndexVersion Then Continue For 'MC 版本匹配 '由于 latestFilesIndexes 是按时间从新到老排序的,所以只需取第一个;如果需要检查多个 releaseType 下的文件,将 > -1 改为 = 1,但这应当并不会获取到更新的文件 If NewestVersion IsNot Nothing AndAlso VersionSortInteger(NewestVersion, IndexVersion) > -1 Then Continue For '只保留最新 MC 版本 If NewestVersion <> IndexVersion Then @@ -1135,7 +1136,7 @@ Finished: If Not Mods.Any() Then Exit Sub For Each Entry In Mods 'TODO: Bookshelf 的 Logo 会在两个网站间横跳 Entry.CompLoaded = SucceedThreadCount = 2 - Cache(Entry.ModrinthHash) = Entry.ToJson() + Cache(Entry.ModrinthHash & McVersion) = Entry.ToJson() Next WriteFile(PathTemp & "Cache\LocalMod.json", Cache.ToString(If(ModeDebug, Newtonsoft.Json.Formatting.Indented, Newtonsoft.Json.Formatting.None))) End Sub diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 9cc2d6f..bcd878c 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -244,16 +244,17 @@ Retry: ModList.Add(ModEntry("fileID")) If ModEntry("required") IsNot Nothing AndAlso Not ModEntry("required").ToObject(Of Boolean) Then ModOptionalList.Add(ModEntry("fileID")) Next - If ModList.Count > 0 Then + If ModList.Any Then + Dim ModDownloadLoaders As New List(Of LoaderBase) '获取 Mod 下载信息 - InstallLoaders.Add(New LoaderTask(Of Integer, JArray)("获取 Mod 下载信息", + ModDownloadLoaders.Add(New LoaderTask(Of Integer, JArray)("获取 Mod 下载信息", Sub(Task As LoaderTask(Of Integer, JArray)) Task.Output = GetJson(NetRequestRetry("https://api.curseforge.com/v1/mods/files", "POST", "{""fileIds"": [" & Join(ModList, ",") & "]}", "application/json"))("data") '如果文件已被删除,则 API 会跳过那一项 If ModList.Count > Task.Output.Count Then Throw New Exception("整合包所需要的部分 Mod 版本已被 Mod 作者删除,因此无法完成整合包安装,请联系整合包作者更新整合包中的 Mod 版本") End Sub) With {.ProgressWeight = ModList.Count / 10}) '每 10 Mod 需要 1s '构造 NetFile - InstallLoaders.Add(New LoaderTask(Of JArray, List(Of NetFile))("构造 Mod 下载信息", + ModDownloadLoaders.Add(New LoaderTask(Of JArray, List(Of NetFile))("构造 Mod 下载信息", Sub(Task As LoaderTask(Of JArray, List(Of NetFile))) Dim FileList As New Dictionary(Of Integer, NetFile) For Each ModJson In Task.Input @@ -288,7 +289,10 @@ Retry: Task.Output = FileList.Values.ToList End Sub) With {.ProgressWeight = ModList.Count / 200, .Show = False}) '每 200 Mod 需要 1s '下载 Mod 文件 - InstallLoaders.Add(New LoaderDownload("下载 Mod", New List(Of NetFile)) With {.ProgressWeight = ModList.Count * 1.5}) '每个 Mod 需要 1.5s + ModDownloadLoaders.Add(New LoaderDownload("下载 Mod", New List(Of NetFile)) With {.ProgressWeight = ModList.Count * 1.5}) '每个 Mod 需要 1.5s + '构造加载器 + InstallLoaders.Add(New LoaderCombo(Of Integer)("下载 Mod(主加载器)", ModDownloadLoaders) With + {.Show = False, .ProgressWeight = ModDownloadLoaders.Sum(Function(l) l.ProgressWeight)}) End If '构造加载器 @@ -299,43 +303,35 @@ Retry: .ForgeVersion = ForgeVersion, .FabricVersion = FabricVersion } - Dim InstallExpectTime As Double = 0 - For Each InstallLoader In InstallLoaders - InstallExpectTime += InstallLoader.ProgressWeight - Next Dim MergeLoaders As List(Of LoaderBase) = McInstallLoader(Request, True) If MergeLoaders Is Nothing Then Exit Sub - Dim MergeExpectTime As Double = 0 - For Each MergeLoader In MergeLoaders - MergeExpectTime += MergeLoader.ProgressWeight - Next - '构造 Libraries 加载器(为了使得 Mods 下载结束后再构造,这样才会下载 JumpLoader 文件) + '构造 Libraries 加载器 Dim LoadersLib As New List(Of LoaderBase) LoadersLib.Add(New LoaderTask(Of String, List(Of NetFile))("分析游戏支持库文件(副加载器)", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = McLibFix(New McVersion(VersionName))) With {.ProgressWeight = 1, .Show = False}) LoadersLib.Add(New LoaderDownload("下载游戏支持库文件(副加载器)", New List(Of NetFile)) With {.ProgressWeight = 7, .Show = False}) '构造总加载器 Dim Loaders As New List(Of LoaderBase) - Loaders.Add(New LoaderCombo(Of String)("整合包安装", InstallLoaders) With {.Show = False, .Block = False, .ProgressWeight = InstallExpectTime}) - Loaders.Add(New LoaderCombo(Of String)("游戏安装", MergeLoaders) With {.Show = False, .ProgressWeight = MergeExpectTime}) + Loaders.Add(New LoaderCombo(Of String)("整合包安装", InstallLoaders) With {.Show = False, .Block = False, .ProgressWeight = InstallLoaders.Sum(Function(l) l.ProgressWeight)}) + Loaders.Add(New LoaderCombo(Of String)("游戏安装", MergeLoaders) With {.Show = False, .ProgressWeight = MergeLoaders.Sum(Function(l) l.ProgressWeight)}) Loaders.Add(New LoaderCombo(Of String)("下载游戏支持库文件", LoadersLib) With {.ProgressWeight = 8}) Loaders.Add(New LoaderTask(Of String, String)("最终整理文件", - Sub(Task As LoaderTask(Of String, String)) - '设置图标 - Dim VersionFolder As String = PathMcFolder & "versions\" & VersionName & "\" - If Logo IsNot Nothing AndAlso File.Exists(Logo) Then - File.Copy(Logo, VersionFolder & "PCL\Logo.png", True) - WriteIni(VersionFolder & "PCL\Setup.ini", "Logo", "PCL\Logo.png") - WriteIni(VersionFolder & "PCL\Setup.ini", "LogoCustom", "True") - Log("[ModPack] 已设置整合包 Logo:" & Logo) - End If - '删除原始整合包文件 - For Each Target As String In {VersionFolder & "原始整合包.zip", VersionFolder & "原始整合包.mrpack"} - If Not Setup.Get("ToolDownloadKeepModpack") AndAlso File.Exists(Target) Then - Log("[ModPack] 根据设置要求删除原始整合包文件:" & Target) - File.Delete(Target) - End If - Next - End Sub) With {.ProgressWeight = 0.1, .Show = False}) + Sub(Task As LoaderTask(Of String, String)) + '设置图标 + Dim VersionFolder As String = PathMcFolder & "versions\" & VersionName & "\" + If Logo IsNot Nothing AndAlso File.Exists(Logo) Then + File.Copy(Logo, VersionFolder & "PCL\Logo.png", True) + WriteIni(VersionFolder & "PCL\Setup.ini", "Logo", "PCL\Logo.png") + WriteIni(VersionFolder & "PCL\Setup.ini", "LogoCustom", "True") + Log("[ModPack] 已设置整合包 Logo:" & Logo) + End If + '删除原始整合包文件 + For Each Target As String In {VersionFolder & "原始整合包.zip", VersionFolder & "原始整合包.mrpack"} + If Not Setup.Get("ToolDownloadKeepModpack") AndAlso File.Exists(Target) Then + Log("[ModPack] 根据设置要求删除原始整合包文件:" & Target) + File.Delete(Target) + End If + Next + End Sub) With {.ProgressWeight = 0.1, .Show = False}) '重复任务检查 Dim LoaderName As String = "CurseForge 整合包安装:" & VersionName & " " @@ -438,10 +434,10 @@ Retry: End If '添加下载文件 FileList.Add(New NetFile(File("downloads").Select(Function(t) t.ToString.Replace("://edge.forgecdn", "://media.forgecdn")).ToArray, '修复 #2390 - PathMcFolder & "versions\" & VersionName & "\" & File("path").ToString, - New FileChecker(ActualSize:=File("fileSize").ToObject(Of Long), Hash:=File("hashes")("sha1").ToString), True)) + PathMcFolder & "versions\" & VersionName & "\" & File("path").ToString, + New FileChecker(ActualSize:=File("fileSize").ToObject(Of Long), Hash:=File("hashes")("sha1").ToString), True)) Next - If FileList.Count > 0 Then + If FileList.Any Then InstallLoaders.Add(New LoaderDownload("下载额外文件", FileList) With {.ProgressWeight = FileList.Count * 1.5}) '每个 Mod 需要 1.5s End If @@ -453,43 +449,35 @@ Retry: .ForgeVersion = ForgeVersion, .FabricVersion = FabricVersion } - Dim InstallExpectTime As Double = 0 - For Each InstallLoader In InstallLoaders - InstallExpectTime += InstallLoader.ProgressWeight - Next Dim MergeLoaders As List(Of LoaderBase) = McInstallLoader(Request, True) If MergeLoaders Is Nothing Then Exit Sub - Dim MergeExpectTime As Double = 0 - For Each MergeLoader In MergeLoaders - MergeExpectTime += MergeLoader.ProgressWeight - Next - '构造 Libraries 加载器(为了使得 Mods 下载结束后再构造,这样才会下载 JumpLoader 文件) + '构造 Libraries 加载器 Dim LoadersLib As New List(Of LoaderBase) LoadersLib.Add(New LoaderTask(Of String, List(Of NetFile))("分析游戏支持库文件(副加载器)", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = McLibFix(New McVersion(VersionName))) With {.ProgressWeight = 1, .Show = False}) LoadersLib.Add(New LoaderDownload("下载游戏支持库文件(副加载器)", New List(Of NetFile)) With {.ProgressWeight = 7, .Show = False}) '构造总加载器 Dim Loaders As New List(Of LoaderBase) - Loaders.Add(New LoaderCombo(Of String)("整合包安装", InstallLoaders) With {.Show = False, .Block = False, .ProgressWeight = InstallExpectTime}) - Loaders.Add(New LoaderCombo(Of String)("游戏安装", MergeLoaders) With {.Show = False, .ProgressWeight = MergeExpectTime}) + Loaders.Add(New LoaderCombo(Of String)("整合包安装", InstallLoaders) With {.Show = False, .Block = False, .ProgressWeight = InstallLoaders.Sum(Function(l) l.ProgressWeight)}) + Loaders.Add(New LoaderCombo(Of String)("游戏安装", MergeLoaders) With {.Show = False, .ProgressWeight = MergeLoaders.Sum(Function(l) l.ProgressWeight)}) Loaders.Add(New LoaderCombo(Of String)("下载游戏支持库文件", LoadersLib) With {.ProgressWeight = 8}) Loaders.Add(New LoaderTask(Of String, String)("最终整理文件", - Sub(Task As LoaderTask(Of String, String)) - '设置图标 - Dim VersionFolder As String = PathMcFolder & "versions\" & VersionName & "\" - If Logo IsNot Nothing AndAlso File.Exists(Logo) Then - File.Copy(Logo, VersionFolder & "PCL\Logo.png", True) - WriteIni(VersionFolder & "PCL\Setup.ini", "Logo", "PCL\Logo.png") - WriteIni(VersionFolder & "PCL\Setup.ini", "LogoCustom", "True") - Log("[ModPack] 已设置整合包 Logo:" & Logo) - End If - '删除原始整合包文件 - For Each Target As String In {VersionFolder & "原始整合包.zip", VersionFolder & "原始整合包.mrpack"} - If Not Setup.Get("ToolDownloadKeepModpack") AndAlso File.Exists(Target) Then - Log("[ModPack] 根据设置要求删除原始整合包文件:" & Target) - File.Delete(Target) - End If - Next - End Sub) With {.ProgressWeight = 0.1, .Show = False}) + Sub(Task As LoaderTask(Of String, String)) + '设置图标 + Dim VersionFolder As String = PathMcFolder & "versions\" & VersionName & "\" + If Logo IsNot Nothing AndAlso File.Exists(Logo) Then + File.Copy(Logo, VersionFolder & "PCL\Logo.png", True) + WriteIni(VersionFolder & "PCL\Setup.ini", "Logo", "PCL\Logo.png") + WriteIni(VersionFolder & "PCL\Setup.ini", "LogoCustom", "True") + Log("[ModPack] 已设置整合包 Logo:" & Logo) + End If + '删除原始整合包文件 + For Each Target As String In {VersionFolder & "原始整合包.zip", VersionFolder & "原始整合包.mrpack"} + If Not Setup.Get("ToolDownloadKeepModpack") AndAlso File.Exists(Target) Then + Log("[ModPack] 根据设置要求删除原始整合包文件:" & Target) + File.Delete(Target) + End If + Next + End Sub) With {.ProgressWeight = 0.1, .Show = False}) '重复任务检查 Dim LoaderName As String = "Modrinth 整合包安装:" & VersionName & " " @@ -554,16 +542,8 @@ Retry: .TargetVersionFolder = $"{PathMcFolder}versions\{VersionName}\", .MinecraftName = Json("gameVersion").ToString } - Dim InstallExpectTime As Double = 0 - For Each InstallLoader In InstallLoaders - InstallExpectTime += InstallLoader.ProgressWeight - Next Dim MergeLoaders As List(Of LoaderBase) = McInstallLoader(Request, True) If MergeLoaders Is Nothing Then Exit Sub - Dim MergeExpectTime As Double = 0 - For Each MergeLoader In MergeLoaders - MergeExpectTime += MergeLoader.ProgressWeight - Next '构造 Libraries 加载器(为了使得 Mods 下载结束后再构造,这样才会下载 JumpLoader 文件) Dim LoadersLib As New List(Of LoaderBase) LoadersLib.Add(New LoaderTask(Of String, String)("重命名版本 Json(副加载器)", @@ -584,8 +564,8 @@ Retry: LoadersLib.Add(New LoaderDownload("下载游戏支持库文件(副加载器)", New List(Of NetFile)) With {.ProgressWeight = 7, .Show = False}) '构造总加载器 Dim Loaders As New List(Of LoaderBase) From { - New LoaderCombo(Of String)("游戏安装", MergeLoaders) With {.Show = False, .Block = False, .ProgressWeight = MergeExpectTime}, - New LoaderCombo(Of String)("整合包安装", InstallLoaders) With {.Show = False, .ProgressWeight = InstallExpectTime}, + New LoaderCombo(Of String)("游戏安装", MergeLoaders) With {.Show = False, .Block = False, .ProgressWeight = MergeLoaders.Sum(Function(l) l.ProgressWeight)}, + New LoaderCombo(Of String)("整合包安装", InstallLoaders) With {.Show = False, .ProgressWeight = InstallLoaders.Sum(Function(l) l.ProgressWeight)}, New LoaderCombo(Of String)("下载游戏支持库文件", LoadersLib) With {.ProgressWeight = 8} } @@ -704,24 +684,16 @@ Retry: End Select Next '构造加载器 - Dim InstallExpectTime As Double = 0 - For Each InstallLoader In InstallLoaders - InstallExpectTime += InstallLoader.ProgressWeight - Next Dim MergeLoaders As List(Of LoaderBase) = McInstallLoader(Request, True) If MergeLoaders Is Nothing Then Exit Sub - Dim MergeExpectTime As Double = 0 - For Each MergeLoader In MergeLoaders - MergeExpectTime += MergeLoader.ProgressWeight - Next - '构造 Libraries 加载器(为了使得 Mods 下载结束后再构造,这样才会下载 JumpLoader 文件) + '构造 Libraries 加载器 Dim LoadersLib As New List(Of LoaderBase) LoadersLib.Add(New LoaderTask(Of String, List(Of NetFile))("分析游戏支持库文件(副加载器)", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = McLibFix(New McVersion(VersionName))) With {.ProgressWeight = 1, .Show = False}) LoadersLib.Add(New LoaderDownload("下载游戏支持库文件(副加载器)", New List(Of NetFile)) With {.ProgressWeight = 7, .Show = False}) '构造总加载器 Dim Loaders As New List(Of LoaderBase) - Loaders.Add(New LoaderCombo(Of String)("游戏安装", MergeLoaders) With {.Show = False, .Block = False, .ProgressWeight = MergeExpectTime}) - Loaders.Add(New LoaderCombo(Of String)("整合包安装", InstallLoaders) With {.Show = False, .ProgressWeight = InstallExpectTime}) + Loaders.Add(New LoaderCombo(Of String)("游戏安装", MergeLoaders) With {.Show = False, .Block = False, .ProgressWeight = MergeLoaders.Sum(Function(l) l.ProgressWeight)}) + Loaders.Add(New LoaderCombo(Of String)("整合包安装", InstallLoaders) With {.Show = False, .ProgressWeight = InstallLoaders.Sum(Function(l) l.ProgressWeight)}) Loaders.Add(New LoaderCombo(Of String)("下载游戏支持库文件", LoadersLib) With {.ProgressWeight = 8}) '重复任务检查 @@ -802,24 +774,16 @@ Retry: .ForgeVersion = If(Addons.ContainsKey("forge"), Addons("forge"), Nothing), .FabricVersion = If(Addons.ContainsKey("fabric"), Addons("fabric"), Nothing) } - Dim InstallExpectTime As Double = 0 - For Each InstallLoader In InstallLoaders - InstallExpectTime += InstallLoader.ProgressWeight - Next Dim MergeLoaders As List(Of LoaderBase) = McInstallLoader(Request, True) If MergeLoaders Is Nothing Then Exit Sub - Dim MergeExpectTime As Double = 0 - For Each MergeLoader In MergeLoaders - MergeExpectTime += MergeLoader.ProgressWeight - Next - '构造 Libraries 加载器(为了使得 Mods 下载结束后再构造,这样才会下载 JumpLoader 文件) + '构造 Libraries 加载器 Dim LoadersLib As New List(Of LoaderBase) LoadersLib.Add(New LoaderTask(Of String, List(Of NetFile))("分析游戏支持库文件(副加载器)", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = McLibFix(New McVersion(VersionName))) With {.ProgressWeight = 1, .Show = False}) LoadersLib.Add(New LoaderDownload("下载游戏支持库文件(副加载器)", New List(Of NetFile)) With {.ProgressWeight = 7, .Show = False}) '构造总加载器 Dim Loaders As New List(Of LoaderBase) - Loaders.Add(New LoaderCombo(Of String)("游戏安装", MergeLoaders) With {.Show = False, .Block = False, .ProgressWeight = MergeExpectTime}) - Loaders.Add(New LoaderCombo(Of String)("整合包安装", InstallLoaders) With {.Show = False, .ProgressWeight = InstallExpectTime}) + Loaders.Add(New LoaderCombo(Of String)("游戏安装", MergeLoaders) With {.Show = False, .Block = False, .ProgressWeight = MergeLoaders.Sum(Function(l) l.ProgressWeight)}) + Loaders.Add(New LoaderCombo(Of String)("整合包安装", InstallLoaders) With {.Show = False, .ProgressWeight = InstallLoaders.Sum(Function(l) l.ProgressWeight)}) Loaders.Add(New LoaderCombo(Of String)("下载游戏支持库文件", LoadersLib) With {.ProgressWeight = 8}) '重复任务检查 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModWatcher.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModWatcher.vb index 2c63b18..9d16fd2 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModWatcher.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModWatcher.vb @@ -276,17 +276,18 @@ IsWindowFinished = True '最大化 If Setup.Get("LaunchArgumentWindowType") = 4 Then - RunInNewThread(Sub() - Try - '如果最大化导致屏幕渲染大小不对,那是 MC 的 Bug,不是我的 Bug - '……虽然我很想这样说,但总有人反馈,算了 - Thread.Sleep(2000) - ShowWindow(WindowHandle, 3) - WatcherLog($"已最大化 Minecraft 窗口:{MinecraftWindowHandle.ToInt64}") - Catch ex As Exception - Log(ex, "最大化 Minecraft 窗口时出现错误") - End Try - End Sub, "MinecraftWindowMaximize") + RunInNewThread( + Sub() + Try + '如果最大化导致屏幕渲染大小不对,那是 MC 的 Bug,不是我的 Bug + '……虽然我很想这样说,但总有人反馈,算了 + Thread.Sleep(2000) + ShowWindow(WindowHandle, 3) + WatcherLog($"已最大化 Minecraft 窗口:{MinecraftWindowHandle.ToInt64}") + Catch ex As Exception + Log(ex, "最大化 Minecraft 窗口时出现错误") + End Try + End Sub, "MinecraftWindowMaximize") End If ElseIf Not IsWindowAppeared Then '已找到 FML 窗口 @@ -347,6 +348,7 @@ '崩溃分析 WatcherLog("Minecraft 已崩溃,将在 2 秒后开始崩溃分析") Hint("检测到 Minecraft 出现错误,错误分析已开始……") + FeedbackInfo() RunInNewThread(Sub() Try Thread.Sleep(2000) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb b/Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb index 7b48d21..016f81a 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb @@ -195,6 +195,7 @@ RetryStart: Private Shared Swiping As Boolean = False Private Shared SwipToState As Boolean '被滑动到的目标应将 Checked 改为此值 Private Sub Button_MouseSwipeStart(sender As Object, e As Object) Handles Me.MouseLeftButtonDown + If Parent Is Nothing Then Exit Sub 'Mod 可能已被删除(#3824) '开始滑动 Dim Index = CType(Parent, StackPanel).Children.IndexOf(Me) SwipeStart = Index @@ -204,6 +205,7 @@ RetryStart: FrmVersionMod.CardSelect.IsHitTestVisible = False '暂时禁用下边栏 End Sub Private Sub Button_MouseSwipe(sender As Object, e As Object) Handles Me.MouseEnter, Me.MouseLeave, Me.MouseLeftButtonUp + If Parent Is Nothing Then Exit Sub 'Mod 可能已被删除(#3824) '结束滑动 If Mouse.LeftButton <> MouseButtonState.Pressed OrElse Not Swiping Then Swiping = False diff --git a/Plain Craft Launcher 2/Modules/ModDevelop.vb b/Plain Craft Launcher 2/Modules/ModDevelop.vb new file mode 100644 index 0000000..8f630e5 --- /dev/null +++ b/Plain Craft Launcher 2/Modules/ModDevelop.vb @@ -0,0 +1,3 @@ +Public Module ModDevelop + +End Module diff --git a/Plain Craft Launcher 2/Modules/ModEvent.vb b/Plain Craft Launcher 2/Modules/ModEvent.vb index dddef07..aa09e79 100644 --- a/Plain Craft Launcher 2/Modules/ModEvent.vb +++ b/Plain Craft Launcher 2/Modules/ModEvent.vb @@ -73,8 +73,8 @@ Case "切换页面" FrmMain.PageChange(Val(Data(0)), Val(Data(1))) - Case "导入整合包" - RunInThread(Sub() ModpackInstall()) + Case "导入整合包", "安装整合包" + RunInUi(Sub() ModpackInstall()) Case "下载文件" Data(0) = Data(0).Replace("\", "/") @@ -101,8 +101,7 @@ '网页确认 If RelativeUrl.StartsWithF("http", True) Then If RunInUi() Then - Throw New Exception("MyListItem 在界面初始化时就需要获取帮助标题等信息,这会导致程序在网络请求时卡死。" & vbCrLf & - "因此,请换用 MyListItem 以外的控件(例如 MyButton)作为联网帮助页面的入口!") + Throw New Exception("能打开联网帮助页面的 MyListItem 必须手动设置 Title、Info 属性!") End If '获取文件名 Dim RawFileName As String diff --git a/Plain Craft Launcher 2/Modules/ModMain.vb b/Plain Craft Launcher 2/Modules/ModMain.vb new file mode 100644 index 0000000..e2b797c --- /dev/null +++ b/Plain Craft Launcher 2/Modules/ModMain.vb @@ -0,0 +1,877 @@ +Imports System.Windows.Interop +Imports System.Windows.Threading + +Public Module ModMain + +#Region "弹出提示" + + ''' + ''' 提示信息的种类。 + ''' + Public Enum HintType + ''' + ''' 信息,通常是蓝色的“i”。 + ''' + ''' + Info + ''' + ''' 已完成,通常是绿色的“√”。 + ''' + ''' + Finish + ''' + ''' 错误,通常是红色的“×”。 + ''' + ''' + Critical + End Enum + Private Structure HintMessage + Public Text As String + Public Type As HintType + Public Log As Boolean + End Structure + + ''' + ''' 等待弹出的提示列表。以 {String, HintType, Log As Boolean} 形式存储为数组。 + ''' + Private HintWaiting As List(Of HintMessage) = If(HintWaiting, New List(Of HintMessage)) + ''' + ''' 在窗口左下角弹出提示文本。 + ''' + Public Sub Hint(Text As String, Optional Type As HintType = HintType.Info, Optional Log As Boolean = True) + If HintWaiting Is Nothing Then HintWaiting = New List(Of HintMessage) + HintWaiting.Add(New HintMessage With {.Text = If(Text, ""), .Type = Type, .Log = Log}) + End Sub + + Private Sub HintTick() + Try + + 'Tag 存储了:{ 是否可以重用, Uuid } + If Not HintWaiting.Any() Then Exit Sub + Do While HintWaiting.Any + ''清除空提示 + 'If IsNothing(HintWaiting(0)) OrElse IsNothing(HintWaiting(0)(0)) Then + ' HintWaiting.RemoveAt(0) + ' Continue Do + 'End If + Dim CurrentHint = HintWaiting(0) + '去回车 + CurrentHint.Text = CurrentHint.Text.Replace(vbCrLf, " ").Replace(vbCr, " ").Replace(vbLf, " ") + '超量提示直接忽略 + If FrmMain.PanHint.Children.Count >= 20 Then GoTo EndHint + '检查是否有重复提示 + Dim DoubleStack As Border = Nothing + For Each stack As Border In FrmMain.PanHint.Children + If stack.Tag(0) AndAlso CType(stack.Child, TextBlock).Text = CurrentHint.Text Then DoubleStack = stack + Next + '获取渐变颜色 + Dim TargetColor0, TargetColor1 As MyColor + Dim Percent As Double = 0.3 + Select Case CurrentHint.Type + Case HintType.Info + TargetColor0 = New MyColor(37, 155, 252) + TargetColor1 = New MyColor(10, 142, 252) + Case HintType.Finish + TargetColor0 = New MyColor(33, 177, 33) + TargetColor1 = New MyColor(29, 160, 29) + Case Else 'HintType.Critical + TargetColor0 = New MyColor(255, 53, 11) + TargetColor1 = New MyColor(255, 43, 0) + End Select + If Not IsNothing(DoubleStack) Then + '有重复提示,且该提示的进入动画已播放 + If Not AniIsRun("Hint Show " & DoubleStack.Tag(1)) Then + AniStop("Hint Hide " & DoubleStack.Tag(1)) + Dim Delay As Double = (800 + MathClamp(CurrentHint.Text.Length, 5, 23) * 180) * AniSpeed + AniStart({ + AaX(DoubleStack, -12 - DoubleStack.Margin.Left, 50,, New AniEaseOutFluent), + AaX(DoubleStack, -8, 50, 50, New AniEaseInFluent), + AaX(DoubleStack, 8, 50, 100, New AniEaseOutFluent), + AaX(DoubleStack, -8, 50, 150, New AniEaseInFluent), + AaDouble(Sub(i) + Percent += i + Dim Gradient As LinearGradientBrush = DoubleStack.Background + Gradient.GradientStops(0).Color = TargetColor0 * Percent + New MyColor(255, 255, 255) * (1 - Percent) + Gradient.GradientStops(1).Color = TargetColor1 * Percent + New MyColor(255, 255, 255) * (1 - Percent) + End Sub, 0.7, 250), + AaX(DoubleStack, -50, 200, Delay, New AniEaseInFluent), + AaOpacity(DoubleStack, -1, 150, Delay), + AaCode(Sub() DoubleStack.Tag(0) = False, Delay), + AaHeight(DoubleStack, -26, 100,, New AniEaseOutFluent, True), + AaCode(Sub() FrmMain.PanHint.Children.Remove(DoubleStack), , True) + }, "Hint Hide " & DoubleStack.Tag(1)) + End If + Else + '准备控件 + Dim NewHintControl As New Border With {.Tag = {True, GetUuid()}, .Margin = New Thickness(-70, 0, 20, 0), .Opacity = 0, .Height = 0, .HorizontalAlignment = HorizontalAlignment.Left, .CornerRadius = New CornerRadius(0, 6, 6, 0)} + NewHintControl.Background = New LinearGradientBrush(New GradientStopCollection(New List(Of GradientStop) From { + New GradientStop(TargetColor0 * Percent + New MyColor(255, 255, 255) * (1 - Percent), 0), + New GradientStop(TargetColor1 * Percent + New MyColor(255, 255, 255) * (1 - Percent), 1)}), 90) + NewHintControl.Child = New TextBlock With {.TextTrimming = TextTrimming.CharacterEllipsis, .FontSize = 13, .Text = CurrentHint.Text, .Foreground = New MyColor(255, 255, 255), .Margin = New Thickness(33, 5, 8, 5)} + 'AddHandler NewHintControl.MouseLeftButtonDown, AddressOf HideAllHint + FrmMain.PanHint.Children.Add(NewHintControl) + '控件动画 + Dim Animations As New List(Of AniData) + If FrmMain.PanHint.Children.Count > 1 Then + '已有提示 + Animations.Add(AaHeight(NewHintControl, 26, 150, , New AniEaseOutFluent)) + Else + '是唯一提示 + NewHintControl.Height = 26 + End If + '开始动画 + Animations.AddRange({ + AaX(NewHintControl, 30, 400, , New AniEaseOutElastic(AniEasePower.Weak)), + AaX(NewHintControl, 20, 200, , New AniEaseOutFluent), + AaOpacity(NewHintControl, 1, 100), + AaDouble(Sub(i) + Percent += i + Dim Gradient As LinearGradientBrush = NewHintControl.Background + Gradient.GradientStops(0).Color = TargetColor0 * Percent + New MyColor(255, 255, 255) * (1 - Percent) + Gradient.GradientStops(1).Color = TargetColor1 * Percent + New MyColor(255, 255, 255) * (1 - Percent) + End Sub, 0.7, 250, 100) + }) + AniStart(Animations, "Hint Show " & NewHintControl.Tag(1)) + '结束动画 + Dim Delay As Double = (800 + MathClamp(CurrentHint.Text.Length, 5, 23) * 180) * AniSpeed + AniStart({ + AaX(NewHintControl, -50, 200, Delay, New AniEaseInFluent), + AaOpacity(NewHintControl, -1, 150, Delay), + AaCode(Sub() NewHintControl.Tag(0) = False, Delay), + AaHeight(NewHintControl, -26, 100,, New AniEaseOutFluent, True), + AaCode(Sub() FrmMain.PanHint.Children.Remove(NewHintControl), , True) + }, "Hint Hide " & NewHintControl.Tag(1)) + End If + '结束处理 +EndHint: + If CurrentHint.Log Then Log("[UI] 弹出提示:" & CurrentHint.Text) + HintWaiting.RemoveAt(0) + Loop + Catch ex As Exception + Log(ex, "显示弹出提示失败", LogLevel.Normal) + End Try + End Sub + Private Sub HideAllHint() + For Each Control As Border In FrmMain.PanHint.Children + Control.IsHitTestVisible = False + AniStart({ + AaX(Control, -50, 200, , New AniEaseInFluent), + AaOpacity(Control, -1, 150, , New AniEaseInFluent), + AaCode(Sub() Control.Tag(0) = False), + AaHeight(Control, -26, 100,, New AniEaseOutFluent, True), + AaCode(Sub() FrmMain.PanHint.Children.Remove(Control), , True) + }, "Hint Hide " & Control.Tag(1)) + Next + End Sub + +#End Region + +#Region "弹窗" + + ''' + ''' 存储弹窗信息的转换器。 + ''' + Public Class MyMsgBoxConverter + Public Type As MyMsgBoxType + Public Title As String + Public Text As String + ''' + ''' 输入框模式:文本框的文本;选择模式:需要放进去的 List(Of MyListItem)。 + ''' + Public Content As Object + ''' + ''' 仅输入框模式:输入验证规则。 + ''' + Public ValidateRules As ObjectModel.Collection(Of Validate) + ''' + ''' 仅输入框模式:提示文本。 + ''' + Public HintText As String = "" + ''' + ''' 有多个按钮时,是否给第一个按钮加高亮。 + ''' + Public HighLight As Boolean + Public Button1 As String = "确定" + Public Button2 As String = "" + Public Button3 As String = "" + ''' + ''' 点击第一个按钮将执行该方法,不关闭弹窗。 + ''' + Public Button1Action As Action = Nothing + ''' + ''' 点击第二个按钮将执行该方法,不关闭弹窗。 + ''' + Public Button2Action As Action = Nothing + ''' + ''' 点击第三个按钮将执行该方法,不关闭弹窗。 + ''' + Public Button3Action As Action = Nothing + Public IsWarn As Boolean = False + Public ForceWait As Boolean = False + Public WaitFrame As New DispatcherFrame(True) + ''' + ''' 弹窗是否已经关闭。 + ''' + Public IsExited As Boolean = False + ''' + ''' 点击的按钮编号或输入的文本。若输入弹窗点击了非第一个按钮,则为 Nothing。 + ''' + Public Result As Object + End Class + Public Enum MyMsgBoxType + Text + [Select] + Input + End Enum + + ''' + ''' 显示弹窗,返回点击按钮的编号(从 1 开始)。 + ''' + ''' 弹窗的标题。 + ''' 弹窗的内容。 + ''' 显示的第一个按钮,默认为“确定”。 + ''' 显示的第二个按钮,默认为空。 + ''' 显示的第三个按钮,默认为空。 + ''' 点击第一个按钮将执行该方法,不关闭弹窗。 + ''' 点击第二个按钮将执行该方法,不关闭弹窗。 + ''' 点击第三个按钮将执行该方法,不关闭弹窗。 + ''' 是否为警告弹窗,若为 True,弹窗配色和背景会变为红色。 + Public Function MyMsgBox(Caption As String, Optional Title As String = "提示", + Optional Button1 As String = "确定", Optional Button2 As String = "", Optional Button3 As String = "", + Optional IsWarn As Boolean = False, Optional HighLight As Boolean = True, Optional ForceWait As Boolean = False, + Optional Button1Action As Action = Nothing, Optional Button2Action As Action = Nothing, Optional Button3Action As Action = Nothing) As Integer + '将弹窗列入队列 + Dim Converter As New MyMsgBoxConverter With {.Type = MyMsgBoxType.Text, .Button1 = Button1, .Button2 = Button2, .Button3 = Button3, .Text = Caption, .IsWarn = IsWarn, .Title = Title, .HighLight = HighLight, .ForceWait = True, .Button1Action = Button1Action, .Button2Action = Button2Action, .Button3Action = Button3Action} + WaitingMyMsgBox.Add(Converter) + If RunInUi() Then + '若为 UI 线程,立即执行弹窗刻, 避免快速(连点器)点击时多次弹窗 + MyMsgBoxTick() + End If + If Button2.Length > 0 OrElse ForceWait Then + '若有多个按钮则开始等待 + If FrmMain Is Nothing OrElse FrmMain.PanMsg Is Nothing AndAlso RunInUi() Then + '主窗体尚未加载,用老土的弹窗来替代 + WaitingMyMsgBox.Remove(Converter) + If Button2.Length > 0 Then + Dim RawResult As MsgBoxResult = MsgBox(Caption, If(Button3.Length > 0, MsgBoxStyle.YesNoCancel, MsgBoxStyle.YesNo) + If(IsWarn, MsgBoxStyle.Critical, MsgBoxStyle.Question), Title) + Select Case RawResult + Case MsgBoxResult.Yes + Converter.Result = 1 + Case MsgBoxResult.No + Converter.Result = 2 + Case MsgBoxResult.Cancel + Converter.Result = 3 + End Select + Else + MsgBox(Caption, MsgBoxStyle.OkOnly + If(IsWarn, MsgBoxStyle.Critical, MsgBoxStyle.Question), Title) + Converter.Result = 1 + End If + Log("[Control] 主窗体加载完成前出现意料外的等待弹窗:" & Button1 & "," & Button2 & "," & Button3, LogLevel.Debug) + Else + Try + FrmMain.DragStop() + ComponentDispatcher.PushModal() + Dispatcher.PushFrame(Converter.WaitFrame) + Finally + ComponentDispatcher.PopModal() + End Try + End If + Log("[Control] 普通弹框返回:" & If(Converter.Result, "null")) + Return Converter.Result + Else + '不进行等待,直接返回 + Return 1 + End If + End Function + ''' + ''' 显示输入框并返回输入的文本。若点击第二个按钮,则返回 Nothing。 + ''' + ''' 弹窗的标题。 + ''' 文本框的输入检测。 + ''' 弹窗的介绍文本。 + ''' 文本框的默认内容。 + ''' 文本框的提示内容。 + ''' 显示的第一个按钮,默认为“确定”。 + ''' 显示的第二个按钮,默认为“取消”。 + ''' 是否为警告弹窗,若为 True,弹窗配色和背景会变为红色。 + Public Function MyMsgBoxInput(Title As String, Optional Text As String = "", Optional DefaultInput As String = "", Optional ValidateRules As ObjectModel.Collection(Of Validate) = Nothing, Optional HintText As String = "", Optional Button1 As String = "确定", Optional Button2 As String = "取消", Optional IsWarn As Boolean = False) As String + '将弹窗列入队列 + Dim Converter As New MyMsgBoxConverter With {.Text = Text, .HintText = HintText, .Type = MyMsgBoxType.Input, .ValidateRules = If(ValidateRules, New ObjectModel.Collection(Of Validate)), .Button1 = Button1, .Button2 = Button2, .Content = DefaultInput, .IsWarn = IsWarn, .Title = Title} + WaitingMyMsgBox.Add(Converter) + '虽然我也不知道这是啥但是能用就成了 :) + Try + If FrmMain IsNot Nothing Then FrmMain.DragStop() + ComponentDispatcher.PushModal() + Dispatcher.PushFrame(Converter.WaitFrame) + Finally + ComponentDispatcher.PopModal() + End Try + Log("[Control] 输入弹框返回:" & If(Converter.Result, "null")) + Return Converter.Result + End Function + ''' + ''' 显示选择框并返回选择的第几项(从 0 开始)。若点击第二个按钮,则返回 Nothing。 + ''' + ''' 弹窗的标题。 + ''' 显示的第一个按钮,默认为 “确定”。 + ''' 显示的第二个按钮,默认为空。 + ''' 是否为警告弹窗,若为 True,弹窗配色和背景会变为红色。 + Public Function MyMsgBoxSelect(Selections As List(Of IMyRadio), Optional Title As String = "提示", Optional Button1 As String = "确定", Optional Button2 As String = "", Optional IsWarn As Boolean = False) As Integer? + '将弹窗列入队列 + Dim Converter As New MyMsgBoxConverter With {.Type = MyMsgBoxType.Select, .Button1 = Button1, .Button2 = Button2, .Content = Selections, .IsWarn = IsWarn, .Title = Title} + WaitingMyMsgBox.Add(Converter) + '虽然我也不知道这是啥但是能用就成了 :) + Try + If FrmMain IsNot Nothing Then FrmMain.DragStop() + ComponentDispatcher.PushModal() + Dispatcher.PushFrame(Converter.WaitFrame) + Finally + ComponentDispatcher.PopModal() + End Try + Log("[Control] 选择弹框返回:" & If(Converter.Result, "null")) + Return Converter.Result + End Function + + ''' + ''' 等待显示的弹窗。 + ''' + Public WaitingMyMsgBox As List(Of MyMsgBoxConverter) = If(WaitingMyMsgBox, New List(Of MyMsgBoxConverter)) + Public Sub MyMsgBoxTick() + Try + If FrmMain Is Nothing OrElse FrmMain.PanMsg Is Nothing OrElse FrmMain.WindowState = WindowState.Minimized Then Exit Sub + If FrmMain.PanMsg.Children.Count > 0 Then + '弹窗中 + FrmMain.PanMsg.Visibility = Visibility.Visible + ElseIf WaitingMyMsgBox.Any Then + '没有弹窗,显示一个等待的弹窗 + FrmMain.PanMsg.Visibility = Visibility.Visible + Select Case CType(WaitingMyMsgBox(0), MyMsgBoxConverter).Type + Case MyMsgBoxType.Input + FrmMain.PanMsg.Children.Add(New MyMsgInput(WaitingMyMsgBox(0))) + Case MyMsgBoxType.Select + FrmMain.PanMsg.Children.Add(New MyMsgSelect(WaitingMyMsgBox(0))) + Case MyMsgBoxType.Text + FrmMain.PanMsg.Children.Add(New MyMsgText(WaitingMyMsgBox(0))) + End Select + WaitingMyMsgBox.RemoveAt(0) + Else + '没有弹窗,没有等待的弹窗 + If Not FrmMain.PanMsg.Visibility = Visibility.Collapsed Then FrmMain.PanMsg.Visibility = Visibility.Collapsed + End If + Catch ex As Exception + Log(ex, "处理等待中的弹窗失败", LogLevel.Feedback) + End Try + End Sub + +#End Region + +#Region "页面声明" + '在最后进行页面声明,避免颜色尚未加载完毕 + + '窗体声明 + Public FrmMain As FormMain + Public FrmStart As SplashScreen + + '页面声明(出于单元测试考虑,初始化页面已转入 FormMain 中) + Public FrmLaunchLeft As PageLaunchLeft + Public FrmLaunchRight As PageLaunchRight + Public FrmSelectLeft As PageSelectLeft + Public FrmSelectRight As PageSelectRight + Public FrmSpeedLeft As PageSpeedLeft + Public FrmSpeedRight As PageSpeedRight + + '联机页面声明 + Public FrmLinkLeft As PageLinkLeft + Public FrmLinkIoi As PageLinkIoi + Public FrmLinkHiper As PageLinkHiper + Public FrmLinkHelp As PageOtherHelpDetail + Public FrmLinkFeedback As PageLinkFeedback + + '下载页面声明 + Public FrmDownloadLeft As PageDownloadLeft + Public FrmDownloadInstall As PageDownloadInstall + Public FrmDownloadClient As PageDownloadClient + Public FrmDownloadOptiFine As PageDownloadOptiFine + Public FrmDownloadLiteLoader As PageDownloadLiteLoader + Public FrmDownloadForge As PageDownloadForge + Public FrmDownloadFabric As PageDownloadFabric + Public FrmDownloadMod As PageDownloadMod + Public FrmDownloadPack As PageDownloadPack + + '设置页面声明 + Public FrmSetupLeft As PageSetupLeft + Public FrmSetupLaunch As PageSetupLaunch + Public FrmSetupUI As PageSetupUI + Public FrmSetupSystem As PageSetupSystem + Public FrmSetupLink As PageSetupLink + + '其他页面声明 + Public FrmOtherLeft As PageOtherLeft + Public FrmOtherHelp As PageOtherHelp + Public FrmOtherAbout As PageOtherAbout + Public FrmOtherTest As PageOtherTest + + '登录页面声明 + Public FrmLoginLegacy As PageLoginLegacy + Public FrmLoginNide As PageLoginNide + Public FrmLoginNideSkin As PageLoginNideSkin + Public FrmLoginAuth As PageLoginAuth + Public FrmLoginAuthSkin As PageLoginAuthSkin + Public FrmLoginMs As PageLoginMs + Public FrmLoginMsSkin As PageLoginMsSkin + + '版本设置页面声明 + Public FrmVersionLeft As PageVersionLeft + Public FrmVersionOverall As PageVersionOverall + Public FrmVersionMod As PageVersionMod + Public FrmVersionModDisabled As PageVersionModDisabled + Public FrmVersionSetup As PageVersionSetup + + '资源信息分页声明 + Public FrmDownloadCompDetail As PageDownloadCompDetail + +#End Region + +#Region "帮助" + + Public Class HelpEntry + + '基础 + + ''' + ''' 显示标题。 + ''' + Public Title As String + ''' + ''' 显示描述。 + ''' + Public Desc As String + ''' + ''' 检索关键字。 + ''' + Public Search As String + ''' + ''' 用于分类的标签列表。 + ''' + Public Types As List(Of String) + + '显示(可选) + + ''' + ''' 帮助项的自定义图标。可能为 Nothing。 + ''' + Public Logo As String = Nothing + ''' + ''' 是否显示在搜索结果。默认为 True。 + ''' + Public ShowInSearch As Boolean = True + ''' + ''' 是否在公开版的 PCL 中显示(这会影响主页与搜索)。默认为 True。 + ''' + Public ShowInPublic As Boolean = True + ''' + ''' 是否在快照版的 PCL 中显示(这会影响主页与搜索)。默认为 True。 + ''' + Public ShowInSnapshot As Boolean = True + + '动作 + + ''' + ''' 是否为 “执行事件”。 + ''' + Public IsEvent As Boolean + Public EventType As String + Public EventData As String + ''' + ''' 若非执行事件,其对应的 .xaml 本地文件内容。 + ''' + Public XamlContent As String + + '转换 + + ''' + ''' 从文件初始化 HelpEntry 对象,失败会抛出异常。 + ''' + Public Sub New(FilePath As String) + Dim JsonData As JObject = GetJson(HelpArgumentReplace(ReadFile(FilePath))) + If JsonData Is Nothing Then Throw New FileNotFoundException("未找到帮助文件:" & FilePath, FilePath) + '加载常规信息 + If JsonData("Title") IsNot Nothing Then + Title = JsonData("Title") + Else + Throw New ArgumentException("未找到 Title 项") + End If + Desc = If(JsonData("Description"), "") + Search = If(JsonData("Keywords"), "") + Logo = JsonData("Logo") '为保持 Nothing,不要加 If + ShowInSearch = If(JsonData("ShowInSearch"), ShowInSearch) + ShowInPublic = If(JsonData("ShowInPublic"), ShowInPublic) + ShowInSnapshot = If(JsonData("ShowInSnapshot"), ShowInSnapshot) + Types = New List(Of String) + For Each NameOfType In If(JsonData("Types"), GetJson("[]")) + Types.Add(NameOfType) + Next + '加载事件信息 + If If(JsonData("IsEvent"), False) Then + EventType = JsonData("EventType") + If EventType Is Nothing Then Throw New ArgumentException("未找到 EventType 项") + EventData = If(JsonData("EventData"), "") + IsEvent = True + Else + Dim XamlAddress As String = FilePath.ToLower.Replace(".json", ".xaml") + If File.Exists(XamlAddress) Then + XamlContent = ReadFile(XamlAddress) + IsEvent = False + Else + Throw New FileNotFoundException("未找到帮助条目 .json 对应的 .xaml 文件(" & XamlAddress & ")") + End If + End If + End Sub + ''' + ''' 获取该 HelpEntry 对应的 MyListItem。 + ''' + Public Function ToListItem() As MyListItem + Return SetToListItem(New MyListItem) + End Function + ''' + ''' 将属性设置入一个现有的 ListItem。 + ''' + Public Function SetToListItem(Item As MyListItem) As MyListItem + Dim Logo As String + If IsEvent Then + If EventType = "弹出窗口" Then + Logo = PathImage & "Blocks/GrassPath.png" + Else + Logo = PathImage & "Blocks/CommandBlock.png" + End If + Else + Logo = PathImage & "Blocks/Grass.png" + End If + '设置属性 + With Item + .SnapsToDevicePixels = True + .Title = Title + .Info = Desc + .Logo = If(Me.Logo, Logo) + .Height = 42 + .Type = MyListItem.CheckType.Clickable + .Tag = Me + .EventType = Nothing + .EventData = Nothing + End With + '项目的点击事件 + AddHandler Item.Click, Sub(sender, e) PageOtherHelp.OnItemClick(sender.Tag) + Return Item + End Function + + End Class + + Public HelpLoader As New LoaderTask(Of Integer, List(Of HelpEntry))("Help Page", AddressOf HelpLoad,, ThreadPriority.BelowNormal) + Private ReadOnly HelpLoadLock As New Object + ''' + ''' 初始化帮助列表对象。 + ''' + Private Sub HelpLoad(Loader As LoaderTask(Of Integer, List(Of HelpEntry))) + SyncLock HelpLoadLock '避免重复解压文件导致出错 + Try + + '解压内置文件 + HelpTryExtract() + + '遍历文件 + Dim FileList As New List(Of String) + Try + Dim IgnoreList As New List(Of String) + '读取自定义文件 + If Directory.Exists(Path & "PCL\Help\") Then + For Each File In EnumerateFiles(Path & "PCL\Help\") + Select Case File.Extension.ToLower + Case ".helpignore" + '加载忽略列表 + Log("[Help] 发现 .helpignore 文件:" & File.FullName) + For Each Line In ReadFile(File.FullName).Split(vbCrLf.ToCharArray) + Dim RealString As String = Line.Before("#").Trim + If String.IsNullOrWhiteSpace(RealString) Then Continue For + IgnoreList.Add(RealString) + If ModeDebug Then Log("[Help] > " & RealString) + Next + Case ".json" + FileList.Add(File.FullName) + End Select + Next + End If + Log("[Help] 已扫描 PCL 文件夹下的帮助文件,目前总计 " & FileList.Count & " 条") + '读取自带文件 + For Each File In EnumerateFiles(PathTemp & "Help") + '跳过非 json 文件与以 . 开头的文件夹 + If File.Extension.ToLower <> ".json" OrElse File.Directory.FullName.Replace(PathTemp & "Help", "").Contains("\.") Then Continue For + '检查忽略列表 + Dim RealPath As String = File.FullName.Replace(PathTemp & "Help\", "") + For Each Ignore In IgnoreList + If RegexCheck(RealPath, Ignore) Then + If ModeDebug Then Log("[Help] 已忽略 " & RealPath & ":" & Ignore) + GoTo NextFile + End If + Next + FileList.Add(File.FullName) +NextFile: + Next + Log("[Help] 已扫描缓存文件夹下的帮助文件,目前总计 " & FileList.Count & " 条") + Catch ex As Exception + Log(ex, "检查帮助文件夹失败", LogLevel.Msgbox) + End Try + If Loader.IsAborted Then Exit Sub + + '将文件实例化 + Dim Dict As New List(Of HelpEntry) + For Each FilePath As String In FileList + Try + Dim Entry As New HelpEntry(FilePath) + Dict.Add(Entry) + If ModeDebug Then Log("[Help] 已加载的帮助条目:" & Entry.Title & " ← " & FilePath) + Catch ex As Exception + Log(ex, "初始化帮助条目失败(" & FilePath & ")", LogLevel.Msgbox) + End Try + Next + + '回设 + If Not Dict.Any() Then Throw New Exception("未找到可用的帮助;若不需要帮助页面,可以在 设置 → 个性化 → 功能隐藏 中将其隐藏") + If Loader.IsAborted Then Exit Sub + Loader.Output = Dict + + Catch ex As Exception + Log(ex, "帮助列表初始化失败") + Throw + End Try + End SyncLock + End Sub + ''' + ''' 尝试解压内置帮助文件。 + ''' + Public Sub HelpTryExtract() + If Setup.Get("SystemHelpVersion") <> VersionCode OrElse Not File.Exists(PathTemp & "Help\启动器\备份设置.xaml") Then + DeleteDirectory(PathTemp & "Help") + Directory.CreateDirectory(PathTemp & "Help") + WriteFile(PathTemp & "Cache\Help.zip", GetResources("Help")) + ExtractFile(PathTemp & "Cache\Help.zip", PathTemp & "Help", Encoding.UTF8) + Setup.Set("SystemHelpVersion", VersionCode) + Log("[Help] 已解压内置帮助文件,目前状态:" & File.Exists(PathTemp & "Help\启动器\备份设置.xaml"), LogLevel.Debug) + End If + End Sub + ''' + ''' 对帮助文件约定的替换标记进行处理,如果遇到需要转义的字符会进行转义。 + ''' + Public Function HelpArgumentReplace(Xaml As String) As String + Dim Result = Xaml.Replace("{path}", EscapeXML(Path)) + Result = RegexReplaceEach(Result, Function() EscapeXML(PageOtherTest.GetRandomHint()), "\{hint\}") + Result = RegexReplaceEach(Result, Function() EscapeXML(PageOtherTest.GetRandomCave()), "\{cave\}") + Return Result + End Function + +#End Region + +#Region "愚人节" + + Public IsAprilEnabled As Boolean = Date.Now.Month = 4 AndAlso Date.Now.Day = 1 + Public IsAprilGiveup As Boolean = False + Private AprilSpeed As New Vector(0, 0) + Private AprilIdieCount As Integer = 0, AprilMousePosLast As New Point(0, 0) + Private AprilDistance As Integer = 0 + Private Sub TimerFool() + Try + If FrmLaunchLeft Is Nothing OrElse FrmLaunchLeft.AprilPosTrans Is Nothing OrElse FrmMain.lastMouseArg Is Nothing Then Exit Sub + If IsAprilGiveup OrElse FrmMain.PageCurrent <> FormMain.PageType.Launch OrElse AniControlEnabled <> 0 OrElse Not FrmLaunchLeft.BtnLaunch.IsLoaded Then Exit Sub + + '计算是否空闲 + Dim MousePos = FrmMain.lastMouseArg.GetPosition(FrmMain) + If MousePos = AprilMousePosLast Then + AprilIdieCount += 1 + Else + AprilMousePosLast = MousePos + AprilIdieCount = 0 + End If + '计算躲避移动 + Dim Direction As Vector + Dim Distance As Double + Dim ButtonWidth = FrmLaunchLeft.BtnLaunch.ActualWidth / 2, ButtonHeight = FrmLaunchLeft.BtnLaunch.ActualHeight / 2 + Dim Vec As Vector = FrmMain.lastMouseArg.GetPosition(FrmLaunchLeft.BtnLaunch) - New Vector(ButtonWidth, ButtonHeight) + Dim Dir As New Vector(Vec.X, Vec.Y) + Dir.Normalize() + Direction = -Dir + Distance = New Vector(Math.Max(0, Math.Abs(Vec.X) - ButtonWidth), Math.Max(0, Math.Abs(Vec.Y) - ButtonHeight)).Length + Dim BreathScale = Math.Sin(Timer150Count / 37.5 * Math.PI) + Dim Acc = Math.Max(0, BreathScale * 0.25 - 0.65 - Math.Log((Distance + 0.4) / 200)) * Direction '加速度 + '计算回归移动 + If AprilIdieCount >= 64 * 5 Then + Dim SafeDist As Vector = FrmMain.lastMouseArg.GetPosition(FrmMain.PanMain) - New Vector(ButtonWidth, FrmMain.PanMain.ActualHeight - ButtonHeight * 3) + Dim Back As New Vector(FrmLaunchLeft.AprilPosTrans.X, FrmLaunchLeft.AprilPosTrans.Y) + If SafeDist.Length > 250 AndAlso Back.Length > 0.4 Then + Acc -= Back * 0.0005 + Back.Normalize() + Acc -= Back * 0.15 + End If + End If + '回到边界 + Dim Relative As Point = FrmLaunchLeft.BtnLaunch.TranslatePoint(New Point(0, 0), FrmMain.PanForm) + If Relative.X < -ButtonWidth * 2 Then + FrmLaunchLeft.AprilPosTrans.X += FrmMain.PanForm.ActualWidth + ButtonWidth * 2 '离开左边界 + AprilSpeed.X -= 80 + If Relative.Y < 0 Then + FrmLaunchLeft.AprilPosTrans.Y += ButtonHeight * 2.5 + ElseIf Relative.Y > FrmMain.PanForm.ActualHeight - ButtonHeight * 2 Then + FrmLaunchLeft.AprilPosTrans.Y -= ButtonHeight * 2.5 + End If + ElseIf Relative.X > FrmMain.PanForm.ActualWidth Then + FrmLaunchLeft.AprilPosTrans.X -= FrmMain.PanForm.ActualWidth + ButtonWidth * 2 '离开右边界 + AprilSpeed.X += 80 + If Relative.Y < 0 Then + FrmLaunchLeft.AprilPosTrans.Y += ButtonHeight * 2.5 + ElseIf Relative.Y > FrmMain.PanForm.ActualHeight - ButtonHeight * 2 Then + FrmLaunchLeft.AprilPosTrans.Y -= ButtonHeight * 2.5 + End If + ElseIf Relative.Y < -ButtonHeight * 2 Then + FrmLaunchLeft.AprilPosTrans.Y += FrmMain.PanForm.ActualHeight + ButtonHeight * 2 '离开上边界 + AprilSpeed.Y -= 25 + If Relative.X < 0 Then + FrmLaunchLeft.AprilPosTrans.X += ButtonWidth * 2 + ElseIf Relative.X > FrmMain.PanForm.ActualWidth - ButtonWidth * 2 Then + FrmLaunchLeft.AprilPosTrans.X -= ButtonWidth * 2 + End If + ElseIf Relative.Y > FrmMain.PanForm.ActualHeight Then + FrmLaunchLeft.AprilPosTrans.Y -= FrmMain.PanForm.ActualHeight + ButtonHeight * 2 '离开下边界 + AprilSpeed.Y += 25 + If Relative.X < 0 Then + FrmLaunchLeft.AprilPosTrans.X += ButtonWidth * 2 + ElseIf Relative.X > FrmMain.PanForm.ActualWidth - ButtonWidth * 2 Then + FrmLaunchLeft.AprilPosTrans.X -= ButtonWidth * 2 + End If + End If + '移动 + AprilSpeed = AprilSpeed * 0.8 + Acc + Dim SpeedValue = Math.Min(60, AprilSpeed.Length) + If SpeedValue < 0.01 Then Exit Sub + AprilSpeed.Normalize() + AprilSpeed *= SpeedValue + AprilDistance += SpeedValue + FrmLaunchLeft.AprilPosTrans.X += AprilSpeed.X + FrmLaunchLeft.AprilPosTrans.Y += AprilSpeed.Y + '大小改变 + FrmLaunchLeft.AprilScaleTrans.ScaleX = MathClamp(1 - (Math.Abs(Direction.X) - Math.Abs(Direction.Y)) * (SpeedValue / 160), 0.2, 1.8) + FrmLaunchLeft.AprilScaleTrans.ScaleY = MathClamp(1 - (Math.Abs(Direction.Y) - Math.Abs(Direction.X)) * (SpeedValue / 100), 0.2, 1.8) + '放弃提示 + If AprilDistance > 4000 Then + AprilDistance = -4000 + Select Case RandomInteger(0, 3) + Case 0 + Hint("放弃吧!只需要点一下右下角的小白旗……") + Case 1 + Hint("看到右下角的那面小白旗了吗?") + Case 2 + Hint("这里建议点一下右下角的小白旗投降呢.jpg") + Case 3 + Hint("右下角的小白旗永远等着你……") + End Select + End If + + Catch ex As Exception + Log(ex, "愚人节移动出错", LogLevel.Feedback) + End Try + End Sub + +#End Region + +#Region "系统" + + ''' + ''' 把某个 PCL 窗口拖到最前面。 + ''' + Public Sub ShowWindowToTop(Handle As IntPtr) + Try + PostMessage(Handle, 400 * 16 + 2, 0, 0) + SetForegroundWindow(Handle) '不在这里放不行,神秘 WinAPI,建议别动 + Catch ex As Exception + Log(ex, "设置窗口置顶失败", LogLevel.Hint) + End Try + End Sub + Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ClassName As String, WindowName As String) As IntPtr + Public Declare Function SetForegroundWindow Lib "user32" (hWnd As IntPtr) As Integer + Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (hWnd As IntPtr, msg As UInteger, wParam As Long, lParam As Long) As Boolean + +#End Region + + Public DragControl = Nothing + Private Timer4Count As Integer = 0 + Private Timer150Count As Integer = 0 + Private Sub TimerMain() + Try +#Region "每 50ms 执行一次的代码" + HintTick() + MyMsgBoxTick() + FrmMain.DragTick() + LoaderTaskbarProgressRefresh() + If ThemeDontClick = 2 Then ThemeRefresh() +#End Region + Catch ex As Exception + Log(ex, "短程主时钟执行异常", LogLevel.Assert) + End Try + Timer4Count += 1 + If Timer4Count = 4 Then + Timer4Count = 0 + Try +#Region "每 250ms 执行一次的代码" + If ThemeNow = 12 Then ThemeRefresh() +#End Region + Catch ex As Exception + Log(ex, "中程主时钟执行异常", LogLevel.Debug) + End Try + End If + Timer150Count += 1 + If Timer150Count = 150 Then + Timer150Count = 0 + Try +#Region "每 7.5s 执行一次的代码" + If FrmMain.BtnExtraApril_ShowCheck AndAlso AprilDistance <> 0 Then FrmMain.BtnExtraApril.Ribble() + '以未知原因窗口被丢到一边去的修复(Top、Left = -25600),还有 #745 + RunInUi(Sub() + If Not FrmMain.Hidden Then + If FrmMain.Top < -9000 Then FrmMain.Top = 100 + If FrmMain.Left < -9000 Then FrmMain.Left = 100 '窗口拉至最大时 Left = -18.8 + End If + End Sub) +#End Region + Catch ex As Exception + Log(ex, "长程主时钟执行异常", LogLevel.Assert) + End Try + End If + End Sub + Public Sub TimerMainStart() + RunInNewThread( + Sub() + Try + Do While True + RunInUiWait(AddressOf TimerMain) + Thread.Sleep(50 * 0.98) + Loop + Catch ex As Exception + Log(ex, "程序主时钟出错", LogLevel.Feedback) + End Try + End Sub, "Timer Main") + If Not IsAprilEnabled Then Exit Sub + RunInNewThread( + Sub() + Try + Dim LastTime = My.Computer.Clock.TickCount + Do While True + If LastTime <> My.Computer.Clock.TickCount Then + LastTime = My.Computer.Clock.TickCount + RunInUiWait(AddressOf TimerFool) + End If + Thread.Sleep(1) + Loop + Catch ex As Exception + Log(ex, "愚人节主时钟出错", LogLevel.Feedback) + End Try + End Sub, "Timer Main Fool") + End Sub + +End Module diff --git a/Plain Craft Launcher 2/Modules/ModMusic.vb b/Plain Craft Launcher 2/Modules/ModMusic.vb index aecafd2..8377aef 100644 --- a/Plain Craft Launcher 2/Modules/ModMusic.vb +++ b/Plain Craft Launcher 2/Modules/ModMusic.vb @@ -1,6 +1,4 @@ -Imports System.Security.Cryptography - -Public Module ModMusic +Public Module ModMusic #Region "播放列表" @@ -199,13 +197,15 @@ Public Module ModMusic ''' Public Function MusicPause() As Boolean If MusicState = MusicStates.Play Then - RunInThread(Sub() - MusicNAudio.Pause() - MusicRefreshUI() - Log("[Music] 已暂停播放") - End Sub) + RunInThread( + Sub() + Log("[Music] 已暂停播放") + MusicNAudio?.Pause() + MusicRefreshUI() + End Sub) Return True Else + Log($"[Music] 无需暂停播放,当前状态为 {MusicState}") Return False End If End Function @@ -214,13 +214,15 @@ Public Module ModMusic ''' Public Function MusicResume() As Boolean If MusicState = MusicStates.Play OrElse Not MusicAllList.Any() Then + Log($"[Music] 无需继续播放,当前状态为 {MusicState}") Return False Else - RunInThread(Sub() - MusicNAudio.Play() - MusicRefreshUI() - Log("[Music] 已恢复播放") - End Sub) + RunInThread( + Sub() + Log("[Music] 已恢复播放") + MusicNAudio?.Play() + MusicRefreshUI() + End Sub) Return True End If End Function @@ -266,7 +268,7 @@ Public Module ModMusic Thread.Sleep(100) End While '当前音乐已播放结束,继续下一曲 - If CurrentWave.PlaybackState = NAudio.Wave.PlaybackState.Stopped AndAlso MusicAllList.Count > 0 Then MusicStartPlay(DequeueNextMusicAddress) + If CurrentWave.PlaybackState = NAudio.Wave.PlaybackState.Stopped AndAlso MusicAllList.Any Then MusicStartPlay(DequeueNextMusicAddress) Catch ex As Exception Log("[Music] 播放音乐失败的文件完整路径:" & MusicCurrent) If TypeOf ex Is NAudio.MmException AndAlso (ex.Message.Contains("NoDriver") OrElse ex.Message.Contains("BadDeviceId")) Then diff --git a/Plain Craft Launcher 2/Modules/ModSecret.vb b/Plain Craft Launcher 2/Modules/ModSecret.vb new file mode 100644 index 0000000..d60f952 --- /dev/null +++ b/Plain Craft Launcher 2/Modules/ModSecret.vb @@ -0,0 +1,281 @@ +'由于包含加解密等安全信息,本文件中的部分代码已被删除 + +Imports System.Net +Imports System.Reflection +Imports System.Security.Cryptography + +Friend Module ModSecret + +#Region "杂项" + + '在开源内容的注册表键与普通内容的注册表键隔离 + Public Const RegFolder As String = "PCLDebug" + + Friend Sub SecretOnApplicationStart() + '提升 UI 线程优先级 + Thread.CurrentThread.Priority = ThreadPriority.Highest + '确保 .NET Framework 版本 + Try + Dim VersionTest As New FormattedText("", Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, Fonts.SystemTypefaces.First, 96, New MyColor, DPI) + Catch ex As UriFormatException '修复 #3555 + Environment.SetEnvironmentVariable("windir", Environment.GetEnvironmentVariable("SystemRoot"), EnvironmentVariableTarget.User) + Dim VersionTest As New FormattedText("", Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, Fonts.SystemTypefaces.First, 96, New MyColor, DPI) + End Try + '检测当前文件夹权限 + Try + Directory.CreateDirectory(Path & "PCL") + Catch ex As Exception + MsgBox($"PCL 无法创建 PCL 文件夹({Path & "PCL"}),请尝试:" & vbCrLf & + "1. 将 PCL 移动到其他文件夹" & If(Path.StartsWithF("C:", True), ",例如 C 盘和桌面以外的其他位置。", "。") & vbCrLf & + "2. 删除当前目录中的 PCL 文件夹,然后再试。" & vbCrLf & + "3. 右键 PCL 选择属性,打开 兼容性 中的 以管理员身份运行此程序。", + MsgBoxStyle.Critical, "运行环境错误") + Environment.[Exit](Result.Cancel) + End Try + If Not CheckPermission(Path & "PCL") Then + MsgBox("PCL 没有对当前文件夹的写入权限,请尝试:" & vbCrLf & + "1. 将 PCL 移动到其他文件夹" & If(Path.StartsWithF("C:", True), ",例如 C 盘和桌面以外的其他位置。", "。") & vbCrLf & + "2. 删除当前目录中的 PCL 文件夹,然后再试。" & vbCrLf & + "3. 右键 PCL 选择属性,打开 兼容性 中的 以管理员身份运行此程序。", + MsgBoxStyle.Critical, "运行环境错误") + Environment.[Exit](Result.Cancel) + End If + '开源版本提示 + MyMsgBox($"该版本中不包含以下特性: +- CurseForge 查询:需要 API Key(你可以申请一个,然后添加到 SecretHeadersSign 方法中) +- 更新与联网通知:避免滥用隐患 +- 主题切换:这是需要赞助解锁的纪念性质的功能,别让赞助者太伤心啦…… +- 百宝箱:开发早期往里面塞了些开发工具,整理起来太麻烦了", "开源版本说明") + End Sub + + ''' + ''' 获取设备标识码。 + ''' + Friend Function SecretGetUniqueAddress() As String + Return "0000-0000-0000-0000" + End Function + + Friend Sub SecretLaunchJvmArgs(ByRef DataList As List(Of String)) + Dim DataJvmCustom As String = Setup.Get("VersionAdvanceJvm", Version:=McVersionCurrent) + DataList.Insert(0, If(DataJvmCustom = "", Setup.Get("LaunchAdvanceJvm"), DataJvmCustom)) '可变 JVM 参数 + McLaunchLog("当前剩余内存:" & Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024 * 10) / 10 & "G") + DataList.Add("-Xmn" & Math.Floor(PageVersionSetup.GetRam(McVersionCurrent) * 1024 * 0.15) & "m") + DataList.Add("-Xmx" & Math.Floor(PageVersionSetup.GetRam(McVersionCurrent) * 1024) & "m") + If Not DataList.Any(Function(d) d.Contains("-Dlog4j2.formatMsgNoLookups=true")) Then DataList.Add("-Dlog4j2.formatMsgNoLookups=true") + End Sub + + ''' + ''' 打码字符串中的 AccessToken。 + ''' + Friend Function SecretFilter(Raw As String, FilterChar As Char) As String + '打码 "accessToken " 后的内容 + If Raw.Contains("accessToken ") Then + For Each Token In RegexSearch(Raw, "(?<=accessToken ([^ ]{5}))[^ ]+(?=[^ ]{5})") + Raw = Raw.Replace(Token, New String(FilterChar, Token.Count)) + Next + End If + '打码当前登录的结果 + Dim AccessToken As String = McLoginLoader.Output.AccessToken + If AccessToken Is Nothing OrElse AccessToken.Length < 10 OrElse Not Raw.ContainsF(AccessToken, True) OrElse + McLoginLoader.Output.Uuid = McLoginLoader.Output.AccessToken Then 'UUID 和 AccessToken 一样则不打码 + Return Raw + Else + Return Raw.Replace(AccessToken, Left(AccessToken, 5) & New String(FilterChar, AccessToken.Length - 10) & Right(AccessToken, 5)) + End If + End Function + +#End Region + +#Region "网络鉴权" + + Friend Function SecretCdnSign(UrlWithMark As String) + '只处理以 {CDN} 结尾的链接 + If Not UrlWithMark.EndsWithF("{CDN}") Then Return UrlWithMark + Return UrlWithMark.Replace("{CDN}", "").Replace(" ", "%20") + End Function + ''' + ''' 设置 Headers 的 UA、Referer。 + ''' + Friend Sub SecretHeadersSign(Url As String, ByRef Client As CookieWebClient, Optional UseBrowserUserAgent As Boolean = False) + If ApplicationStartTick < 1 Then Return '禁止在没有运行程序的情况下通过反射调用 + If UseBrowserUserAgent Then + Client.Headers("User-Agent") = "PCL2/" & VersionStandardCode & " Mozilla/5.0 AppleWebKit/537.36 Chrome/63.0.3239.132 Safari/537.36" + Else + Client.Headers("User-Agent") = "PCL2/" & VersionStandardCode + End If + Client.Headers("Referer") = "http://" & VersionCode & ".pcl2.server/" + '如果你有 CurseForge API Key,请添加到 Headers 中,以恢复对 CurseForge 的访问 + End Sub + ''' + ''' 设置 Headers 的 UA、Referer。 + ''' + Friend Sub SecretHeadersSign(Url As String, ByRef Request As HttpWebRequest, Optional UseBrowserUserAgent As Boolean = False) + If ApplicationStartTick < 1 Then Return '禁止在没有运行程序的情况下通过反射调用 + If UseBrowserUserAgent Then + Request.UserAgent = "PCL2/" & VersionStandardCode & " Mozilla/5.0 AppleWebKit/537.36 Chrome/63.0.3239.132 Safari/537.36" + Else + Request.UserAgent = "PCL2/" & VersionStandardCode + End If + Request.Referer = "http://" & VersionCode & ".pcl2.server/" + '如果你有 CurseForge API Key,请添加到 Headers 中,以恢复对 CurseForge 的访问 + End Sub + +#End Region + +#Region "字符串加解密" + + ''' + ''' 获取八位密钥。 + ''' + Private Function SecretKeyGet(Key As String) As String + Return "00000000" + End Function + ''' + ''' 加密字符串。 + ''' + Friend Function SecretEncrypt(SourceString As String, Optional Key As String = "") As String + Key = SecretKeyGet(Key) + Dim btKey As Byte() = Encoding.UTF8.GetBytes(Key) + Dim btIV As Byte() = Encoding.UTF8.GetBytes("87160295") + Dim des As New DESCryptoServiceProvider + Using MS As New MemoryStream + Dim inData As Byte() = Encoding.UTF8.GetBytes(SourceString) + Using cs As New CryptoStream(MS, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write) + cs.Write(inData, 0, inData.Length) + cs.FlushFinalBlock() + Return Convert.ToBase64String(MS.ToArray()) + End Using + End Using + End Function + ''' + ''' 解密字符串。 + ''' + Friend Function SecretDecrypt(SourceString As String, Optional Key As String = "") As String + Key = SecretKeyGet(Key) + Dim btKey As Byte() = Encoding.UTF8.GetBytes(Key) + Dim btIV As Byte() = Encoding.UTF8.GetBytes("87160295") + Dim des As New DESCryptoServiceProvider + Using MS As New MemoryStream + Dim inData As Byte() = Convert.FromBase64String(SourceString) + Using cs As New CryptoStream(MS, des.CreateDecryptor(btKey, btIV), CryptoStreamMode.Write) + cs.Write(inData, 0, inData.Length) + cs.FlushFinalBlock() + Return Encoding.UTF8.GetString(MS.ToArray()) + End Using + End Using + End Function + +#End Region + +#Region "主题" + + Public Color1 As New MyColor(52, 61, 74) + Public Color2 As New MyColor(11, 91, 203) + Public Color3 As New MyColor(19, 112, 243) + Public Color4 As New MyColor(72, 144, 245) + Public Color5 As New MyColor(150, 192, 249) + Public Color6 As New MyColor(213, 230, 253) + Public Color7 As New MyColor(222, 236, 253) + Public Color8 As New MyColor(234, 242, 254) + Public ColorBg0 As New MyColor(150, 192, 249) + Public ColorBg1 As New MyColor(190, Color7) + Public ColorGray1 As New MyColor(64, 64, 64) + Public ColorGray2 As New MyColor(115, 115, 115) + Public ColorGray3 As New MyColor(140, 140, 140) + Public ColorGray4 As New MyColor(166, 166, 166) + Public ColorGray5 As New MyColor(204, 204, 204) + Public ColorGray6 As New MyColor(235, 235, 235) + Public ColorGray7 As New MyColor(240, 240, 240) + Public ColorGray8 As New MyColor(245, 245, 245) + Public ColorSemiTransparent As New MyColor(1, Color8) + + Public ThemeNow As Integer = -1 + Public ColorHue As Integer = 210, ColorSat As Integer = 85, ColorLightAdjust As Integer = 0, ColorHueTopbarDelta As Object = 0 + Public ThemeDontClick As Integer = 0 + + Public Sub ThemeRefresh(Optional NewTheme As Integer = -1) + Hint("该版本中不包含主题功能……") + End Sub + Public Sub ThemeRefreshMain() + RunInUi( + Sub() + If Not FrmMain.IsLoaded Then Exit Sub + '顶部条背景 + Dim Brush = New LinearGradientBrush With {.EndPoint = New Point(1, 0), .StartPoint = New Point(0, 0)} + If ThemeNow = 5 Then + Brush.GradientStops.Add(New GradientStop With {.Offset = 0, .Color = New MyColor().FromHSL2(ColorHue, ColorSat, 25)}) + Brush.GradientStops.Add(New GradientStop With {.Offset = 0.5, .Color = New MyColor().FromHSL2(ColorHue, ColorSat, 15)}) + Brush.GradientStops.Add(New GradientStop With {.Offset = 1, .Color = New MyColor().FromHSL2(ColorHue, ColorSat, 25)}) + FrmMain.PanTitle.Background = Brush + FrmMain.PanTitle.Background.Freeze() + ElseIf Not (ThemeNow = 12 OrElse ThemeDontClick = 2) Then + If TypeOf ColorHueTopbarDelta Is Integer Then + Brush.GradientStops.Add(New GradientStop With {.Offset = 0, .Color = New MyColor().FromHSL2(ColorHue - ColorHueTopbarDelta, ColorSat, 48 + ColorLightAdjust)}) + Brush.GradientStops.Add(New GradientStop With {.Offset = 0.5, .Color = New MyColor().FromHSL2(ColorHue, ColorSat, 54 + ColorLightAdjust)}) + Brush.GradientStops.Add(New GradientStop With {.Offset = 1, .Color = New MyColor().FromHSL2(ColorHue + ColorHueTopbarDelta, ColorSat, 48 + ColorLightAdjust)}) + Else + Brush.GradientStops.Add(New GradientStop With {.Offset = 0, .Color = New MyColor().FromHSL2(ColorHue + ColorHueTopbarDelta(0), ColorSat, 48 + ColorLightAdjust)}) + Brush.GradientStops.Add(New GradientStop With {.Offset = 0.5, .Color = New MyColor().FromHSL2(ColorHue + ColorHueTopbarDelta(1), ColorSat, 54 + ColorLightAdjust)}) + Brush.GradientStops.Add(New GradientStop With {.Offset = 1, .Color = New MyColor().FromHSL2(ColorHue + ColorHueTopbarDelta(2), ColorSat, 48 + ColorLightAdjust)}) + End If + FrmMain.PanTitle.Background = Brush + FrmMain.PanTitle.Background.Freeze() + Else + Brush.GradientStops.Add(New GradientStop With {.Offset = 0, .Color = New MyColor().FromHSL2(ColorHue - 21, ColorSat, 53 + ColorLightAdjust)}) + Brush.GradientStops.Add(New GradientStop With {.Offset = 0.33, .Color = New MyColor().FromHSL2(ColorHue - 7, ColorSat, 47 + ColorLightAdjust)}) + Brush.GradientStops.Add(New GradientStop With {.Offset = 0.67, .Color = New MyColor().FromHSL2(ColorHue + 7, ColorSat, 47 + ColorLightAdjust)}) + Brush.GradientStops.Add(New GradientStop With {.Offset = 1, .Color = New MyColor().FromHSL2(ColorHue + 21, ColorSat, 53 + ColorLightAdjust)}) + FrmMain.PanTitle.Background = Brush + End If + '主页面背景 + If Setup.Get("UiBackgroundColorful") Then + Brush = New LinearGradientBrush With {.EndPoint = New Point(0.1, 1), .StartPoint = New Point(0.9, 0)} + Brush.GradientStops.Add(New GradientStop With {.Offset = -0.1, .Color = New MyColor().FromHSL2(ColorHue - 20, Math.Min(60, ColorSat) * 0.5, 80)}) + Brush.GradientStops.Add(New GradientStop With {.Offset = 0.4, .Color = New MyColor().FromHSL2(ColorHue, ColorSat * 0.9, 90)}) + Brush.GradientStops.Add(New GradientStop With {.Offset = 1.1, .Color = New MyColor().FromHSL2(ColorHue + 20, Math.Min(60, ColorSat) * 0.5, 80)}) + FrmMain.PanForm.Background = Brush + Else + FrmMain.PanForm.Background = New MyColor(245, 245, 245) + End If + FrmMain.PanForm.Background.Freeze() + End Sub) + End Sub + Public Sub ThemeCheckAll(EffectSetup As Boolean) + End Sub + Public Function ThemeCheckOne(Id As Integer) As Boolean + Return True + End Function + Friend Function ThemeUnlock(Id As Integer, Optional ShowDoubleHint As Boolean = True, Optional UnlockHint As String = Nothing) As Boolean + Return False + End Function + Public Function ThemeCheckGold(Optional Code As String = Nothing) As Boolean + Return False + End Function + Public Function DonateCodeInput() As Boolean? + End Function + +#End Region + +#Region "更新" + + Public IsUpdateStarted As Boolean = False + Public IsUpdateWaitingRestart As Boolean = False + Public Sub UpdateCheckByButton() + Hint("该版本中不包含更新功能……") + End Sub + Public Sub UpdateStart(BaseUrl As String, Slient As Boolean, Optional ReceivedKey As String = Nothing, Optional ForceValidated As Boolean = False) + End Sub + Public Sub UpdateRestart(TriggerRestartAndByEnd As Boolean) + End Sub + Public Sub UpdateReplace(ProcessId As Integer, OldFileName As String, NewFileName As String, TriggerRestart As Boolean) + End Sub + +#End Region + +#Region "联网通知" + + Public ServerLoader As New LoaderTask(Of Integer, Integer)("PCL 服务", Sub() Log("[Server] 该版本中不包含更新通知功能……"), Priority:=ThreadPriority.BelowNormal) + +#End Region + +End Module diff --git a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb index 49ea2bc..885e140 100644 --- a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb +++ b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb @@ -8,11 +8,11 @@ Imports System.Runtime.InteropServices '查看程序集特性的值 - + - - + + @@ -51,6 +51,6 @@ Imports System.Runtime.InteropServices ' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 ' 方法是按如下所示使用“*” - - + + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 48560e0..3b02dc6 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -384,20 +384,27 @@ Public Module ModDownloadLib End Sub Private Sub McDownloadOptiFineInstall(BaseMcFolderHome As String, Target As String, Task As LoaderTask(Of List(Of NetFile), Boolean), UseJavaWrapper As Boolean) '选择 Java - Dim Java = JavaSelect("已取消安装。", New Version(1, 8, 0, 0)) - If Java Is Nothing Then - If Not JavaDownloadConfirm("Java 8 或更高版本") Then Throw New Exception("由于未找到 Java,已取消安装。") - '开始自动下载 - Dim JavaLoader = JavaFixLoaders(17) - JavaLoader.Start(17, IsForceRestart:=True) - Do While JavaLoader.State = LoadState.Loading AndAlso Not Task.IsAborted - Thread.Sleep(10) - Loop - '检查下载结果 + Dim Java As JavaEntry + SyncLock JavaLock Java = JavaSelect("已取消安装。", New Version(1, 8, 0, 0)) - If Task.IsAborted Then Exit Sub - If Java Is Nothing Then Throw New Exception("由于未找到 Java,已取消安装。") - End If + If Java Is Nothing Then + If Not JavaDownloadConfirm("Java 8 或更高版本") Then Throw New Exception("由于未找到 Java,已取消安装。") + '开始自动下载 + Dim JavaLoader = JavaFixLoaders(17) + Try + JavaLoader.Start(17, IsForceRestart:=True) + Do While JavaLoader.State = LoadState.Loading AndAlso Not Task.IsAborted + Thread.Sleep(10) + Loop + Finally + JavaLoader.Abort() '确保取消时中止 Java 下载 + End Try + '检查下载结果 + Java = JavaSelect("已取消安装。", New Version(1, 8, 0, 0)) + If Task.IsAborted Then Exit Sub + If Java Is Nothing Then Throw New Exception("由于未找到 Java,已取消安装。") + End If + End SyncLock '添加 Java Wrapper 作为主 Jar Dim Arguments As String If UseJavaWrapper Then @@ -487,7 +494,7 @@ Public Module ModDownloadLib outputWaitHandle.WaitOne(10000) errorWaitHandle.WaitOne(10000) process.Dispose() - If TotalLength < 1000 Then Throw New Exception("安装器运行出错,末行为 " & LastResult) + If TotalLength < 1000 OrElse LastResult.Contains("at ") Then Throw New Exception("安装器运行出错,末行为 " & LastResult) End Using End Using End SyncLock @@ -538,7 +545,7 @@ Public Module ModDownloadLib 'OptiFine 中文镜像源 Sources.Add("https://optifine.cn/download/" & DownloadInfo.NameFile) '构造文件请求 - Task.Output = New List(Of NetFile) From {New NetFile(Sources.ToArray, Target, New FileChecker(MinSize:=64 * 1024))} + Task.Output = New List(Of NetFile) From {New NetFile(Sources.ToArray, Target, New FileChecker(MinSize:=300 * 1024))} End Sub) With {.ProgressWeight = 8}) Loaders.Add(New LoaderDownload("下载 OptiFine 主文件", New List(Of NetFile)) With {.ProgressWeight = 8}) Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("等待原版下载", @@ -548,8 +555,8 @@ Public Module ModDownloadLib Dim TargetLoaders As List(Of LoaderBase) = ClientDownloadLoader.GetLoaderList.Where(Function(l) l.Name = McDownloadClientLibName OrElse l.Name = McDownloadClientJsonName). Where(Function(l) l.State <> LoadState.Finished).ToList - If TargetLoaders.Count > 0 Then Log("[Download] OptiFine 安装正在等待原版文件下载完成") - Do While TargetLoaders.Count > 0 AndAlso Not Task.IsAborted + If TargetLoaders.Any Then Log("[Download] OptiFine 安装正在等待原版文件下载完成") + Do While TargetLoaders.Any AndAlso Not Task.IsAborted TargetLoaders = TargetLoaders.Where(Function(l) l.State <> LoadState.Finished).ToList Thread.Sleep(50) Loop @@ -560,12 +567,10 @@ Public Module ModDownloadLib Dim ClientName As String = GetFolderNameFromPath(ClientFolder) Directory.CreateDirectory(McFolder & "versions\" & DownloadInfo.Inherit) If Not File.Exists(McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".json") Then - CopyFile(ClientFolder & ClientName & ".json", - McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".json") + CopyFile($"{ClientFolder}{ClientName}.json", $"{McFolder}versions\{DownloadInfo.Inherit}\{DownloadInfo.Inherit}.json") End If If Not File.Exists(McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".jar") Then - CopyFile(ClientFolder & ClientName & ".jar", - McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".jar") + CopyFile($"{ClientFolder}{ClientName}.jar", $"{McFolder}versions\{DownloadInfo.Inherit}\{DownloadInfo.Inherit}.jar") End If End SyncLock End Sub) With {.ProgressWeight = 0.1, .Show = False}) @@ -1109,20 +1114,27 @@ Retry: Private Sub ForgeInjector(Target As String, Task As LoaderTask(Of Boolean, Boolean), McFolder As String, UseJavaWrapper As Boolean) '选择 Java - Dim Java = JavaSelect("已取消安装。", New Version(1, 8, 0, 60)) - If Java Is Nothing Then - If Not JavaDownloadConfirm("Java 8 或更高版本") Then Throw New Exception("由于未找到 Java,已取消安装。") - '开始自动下载 - Dim JavaLoader = JavaFixLoaders(17) - JavaLoader.Start(17, IsForceRestart:=True) - Do While JavaLoader.State = LoadState.Loading AndAlso Not Task.IsAborted - Thread.Sleep(10) - Loop - '检查下载结果 + Dim Java As JavaEntry + SyncLock JavaLock Java = JavaSelect("已取消安装。", New Version(1, 8, 0, 60)) - If Task.IsAborted Then Exit Sub - If Java Is Nothing Then Throw New Exception("由于未找到 Java,已取消安装。") - End If + If Java Is Nothing Then + If Not JavaDownloadConfirm("Java 8 或更高版本") Then Throw New Exception("由于未找到 Java,已取消安装。") + '开始自动下载 + Dim JavaLoader = JavaFixLoaders(17) + Try + JavaLoader.Start(17, IsForceRestart:=True) + Do While JavaLoader.State = LoadState.Loading AndAlso Not Task.IsAborted + Thread.Sleep(10) + Loop + Finally + JavaLoader.Abort() '确保取消时中止 Java 下载 + End Try + '检查下载结果 + Java = JavaSelect("已取消安装。", New Version(1, 8, 0, 60)) + If Task.IsAborted Then Exit Sub + If Java Is Nothing Then Throw New Exception("由于未找到 Java,已取消安装。") + End If + End SyncLock '添加 Java Wrapper 作为主 Jar Dim Arguments As String If UseJavaWrapper Then @@ -1269,8 +1281,8 @@ Retry: McFolder = If(McFolder, PathMcFolder) If Version.StartsWithF("1.") AndAlso Version.Contains("-") Then '类似 1.19.3-41.2.8 格式,优先使用 Version 中要求的版本而非 Inherit(例如 1.19.3 却使用了 1.19 的 Forge) - Inherit = Version.Split("-").First - Version = Version.Split("-").Last + Inherit = Version.Before("-") + Version = Version.After("-") End If Dim IsCustomFolder As Boolean = McFolder <> PathMcFolder Dim Id As String = Inherit & "-forge-" & Version @@ -1283,20 +1295,20 @@ Retry: '获取下载信息 If DownloadInfo Is Nothing Then Loaders.Add(New LoaderTask(Of String, String)("获取 Mod 加载器详细信息", - Sub(Task As LoaderTask(Of String, String)) - '获取 Forge 版本列表 - Dim ForgeLoader = New LoaderTask(Of String, List(Of DlForgeVersionEntry))("McDownloadForgeLoader " & Inherit, AddressOf DlForgeVersionMain) - ForgeLoader.WaitForExit(Inherit) - Task.Progress = 0.8 - '查找对应版本 - For Each ForgeVersion In ForgeLoader.Output - If ForgeVersion.Version = Version Then - DownloadInfo = ForgeVersion - Exit Sub - End If - Next - Throw New Exception("未能找到 Forge " & Inherit & "-" & Version & " 的详细信息!") - End Sub) With {.ProgressWeight = 3}) + Sub(Task As LoaderTask(Of String, String)) + '获取 Forge 版本列表 + Dim ForgeLoader = New LoaderTask(Of String, List(Of DlForgeVersionEntry))("McDownloadForgeLoader " & Inherit, AddressOf DlForgeVersionMain) + ForgeLoader.WaitForExit(Inherit) + Task.Progress = 0.8 + '查找对应版本 + For Each ForgeVersion In ForgeLoader.Output + If ForgeVersion.Version = Version Then + DownloadInfo = ForgeVersion + Exit Sub + End If + Next + Throw New Exception("未能找到 Forge " & Inherit & "-" & Version & " 的详细信息!") + End Sub) With {.ProgressWeight = 3}) End If '下载 Forge 主文件 Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("准备 Mod 加载器下载", @@ -1316,7 +1328,7 @@ Retry: Loaders.Add(New LoaderDownload("下载 Mod 加载器主文件", New List(Of NetFile)) With {.ProgressWeight = 9}) '安装(仅在新版安装时需要原版 Jar) - If Version.Split(".")(0) >= 20 Then + If Version.Before(".") >= 20 Then Log("[Download] 检测为新版 Forge:" & Version) Dim Libs As List(Of McLibToken) = Nothing Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 Mod 加载器支持库文件", @@ -1338,7 +1350,7 @@ Retry: Task.Progress = 0.4 Dim RawJson As JObject = GetJson(NetGetCodeByDownload(DlSourceLauncherOrMetaGet(DlClientListGet(Inherit)), IsJson:=True)) '[net.minecraft:client:1.17.1-20210706.113038:mappings@txt] 或 @tsrg] - Dim OriginalName As String = Json("data")("MOJMAPS")("client").ToString.Trim("[]".ToCharArray()).Split("@")(0) + Dim OriginalName As String = Json("data")("MOJMAPS")("client").ToString.Trim("[]".ToCharArray()).Before("@") Dim Address = McLibGet(OriginalName).Replace(".jar", "-mappings." & Json("data")("MOJMAPS")("client").ToString.Trim("[]".ToCharArray()).Split("@")(1)) Libs.Add(New McLibToken With {.IsJumpLoader = False, .IsNatives = False, .LocalPath = Address, .OriginalName = OriginalName, .Url = RawJson("downloads")("client_mappings")("url"), .Size = RawJson("downloads")("client_mappings")("size"), .SHA1 = RawJson("downloads")("client_mappings")("sha1")}) @@ -1383,8 +1395,8 @@ Retry: Dim TargetLoaders As List(Of LoaderBase) = ClientDownloadLoader.GetLoaderList.Where(Function(l) l.Name = McDownloadClientLibName OrElse l.Name = McDownloadClientJsonName). Where(Function(l) l.State <> LoadState.Finished).ToList - If TargetLoaders.Count > 0 Then Log("[Download] Forge 安装正在等待原版文件下载完成") - Do While TargetLoaders.Count > 0 AndAlso Not Task.IsAborted + If TargetLoaders.Any Then Log("[Download] Forge 安装正在等待原版文件下载完成") + Do While TargetLoaders.Any AndAlso Not Task.IsAborted TargetLoaders = TargetLoaders.Where(Function(l) l.State <> LoadState.Finished).ToList Thread.Sleep(50) Loop @@ -1441,7 +1453,7 @@ Retry: End Try '拷贝新增的版本 Json Dim DeltaList = New DirectoryInfo(McFolder & "versions\").EnumerateDirectories. - SkipWhile(Function(i) OldList.Contains(i.FullName)).ToList() + SkipWhile(Function(i) OldList.Contains(i.FullName)).ToList() If DeltaList.Count > 1 Then '它可能和 OptiFine 安装同时运行,导致增加的文件不止一个(这导致了 #151) '也可能是因为 Forge 安装器的 Bug,生成了一个名字错误的文件夹,所以需要检查文件夹是否为空 @@ -1537,7 +1549,7 @@ Retry: Public Sub ForgeDownloadListItemPreload(Stack As StackPanel, Entrys As List(Of DlForgeVersionEntry), OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean) '获取推荐版本与最新版本 Dim FreshVersion As DlForgeVersionEntry = Nothing - If Entrys.Count > 0 Then + If Entrys.Any Then FreshVersion = Entrys(0) Else Log("[System] 未找到可用的 Forge 版本", LogLevel.Debug) @@ -1782,7 +1794,7 @@ Retry: Public Function FabricApiDownloadListItem(Entry As CompFile, OnClick As MyListItem.ClickEventHandler) As MyListItem '建立控件 Dim NewItem As New MyListItem With { - .Title = Entry.DisplayName.Split("]")(1).Replace("Fabric API ", "").Replace(" build ", ".").Split("+").First.Trim, .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Entry, + .Title = Entry.DisplayName.Split("]")(1).Replace("Fabric API ", "").Replace(" build ", ".").Before("+").Trim, .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Entry, .Info = Entry.StatusDescription & ",发布于 " & Entry.ReleaseDate.ToString("yyyy'/'MM'/'dd HH':'mm"), .Logo = PathImage & "Blocks/Fabric.png" } @@ -1972,7 +1984,7 @@ Retry: If Directory.Exists(TempMcFolder) Then DeleteDirectory(TempMcFolder) Dim OptiFineFolder As String = Nothing If Request.OptiFineVersion IsNot Nothing Then - If Request.OptiFineVersion.Contains("_HD_U_") Then Request.OptiFineVersion = "HD_U_" & Request.OptiFineVersion.Split("_HD_U_").Last '#735 + If Request.OptiFineVersion.Contains("_HD_U_") Then Request.OptiFineVersion = "HD_U_" & Request.OptiFineVersion.After("_HD_U_") '#735 Request.OptiFineEntry = New DlOptiFineListEntry With { .NameDisplay = Request.MinecraftName & " " & Request.OptiFineVersion.Replace("HD_U_", "").Replace("_", "").Replace("pre", " pre"), .Inherit = Request.MinecraftName, @@ -2014,7 +2026,7 @@ Retry: Dim LoaderList As New List(Of LoaderBase) '添加忽略标识 - LoaderList.Add(New LoaderTask(Of Integer, Integer)("添加忽略标识", Sub() WriteFile(OutputFolder & ".pclignore", "用于临时地 PCL 的版本列表中屏蔽此版本。")) With {.Show = False, .Block = False}) + LoaderList.Add(New LoaderTask(Of Integer, Integer)("添加忽略标识", Sub() WriteFile(OutputFolder & ".pclignore", "用于临时地在 PCL 的版本列表中屏蔽此版本。")) With {.Show = False, .Block = False}) 'Fabric API If Request.FabricApi IsNot Nothing Then LoaderList.Add(New LoaderDownload("下载 Fabric API", New List(Of NetFile) From {Request.FabricApi.ToNetFile(New McVersion(OutputFolder).GetPathIndie(True) & "mods\")}) With {.ProgressWeight = 3, .Block = False}) @@ -2056,7 +2068,7 @@ Retry: End Sub) With {.ProgressWeight = 2, .Block = True}) '补全文件 If Not DontFixLibraries AndAlso - (Request.OptiFineEntry IsNot Nothing OrElse (Request.ForgeVersion IsNot Nothing AndAlso Request.ForgeVersion.Split(".")(0) >= 20) OrElse Request.FabricVersion IsNot Nothing OrElse Request.LiteLoaderEntry IsNot Nothing) Then + (Request.OptiFineEntry IsNot Nothing OrElse (Request.ForgeVersion IsNot Nothing AndAlso Request.ForgeVersion.Before(".") >= 20) OrElse Request.FabricVersion IsNot Nothing OrElse Request.LiteLoaderEntry IsNot Nothing) Then Dim LoadersLib As New List(Of LoaderBase) LoadersLib.Add(New LoaderTask(Of String, List(Of NetFile))("分析游戏支持库文件(副加载器)", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = McLibFix(New McVersion(OutputFolder))) With {.ProgressWeight = 1, .Show = False}) LoadersLib.Add(New LoaderDownload("下载游戏支持库文件(副加载器)", New List(Of NetFile)) With {.ProgressWeight = 7, .Show = False}) @@ -2164,7 +2176,7 @@ Retry: For i = 0 To RawArguments.Count - 1 If RawArguments(i).StartsWithF("-") Then SplitArguments.Add(RawArguments(i)) - ElseIf SplitArguments.Count > 0 AndAlso SplitArguments.Last.StartsWithF("-") AndAlso Not SplitArguments.Last.Contains(" ") Then + ElseIf SplitArguments.Any AndAlso SplitArguments.Last.StartsWithF("-") AndAlso Not SplitArguments.Last.Contains(" ") Then SplitArguments(SplitArguments.Count - 1) = SplitArguments.Last & " " & RawArguments(i) Else SplitArguments.Add(RawArguments(i)) @@ -2172,6 +2184,7 @@ Retry: Next Dim RealArguments As String = Join(SplitArguments.Distinct.ToList, " ") '合并 + '相关讨论见 #2801 OutputJson = MinecraftJson If HasOptiFine Then '合并 OptiFine diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb index 2434192..1fa91e3 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb @@ -210,10 +210,10 @@ If Project.Type = CompType.Mod Then '获取 Mod 所需的加载器种类 Dim AllowForge As Boolean? = Nothing, AllowFabric As Boolean? = Nothing - If File.ModLoaders.Count > 0 Then '从文件中获取 + If File.ModLoaders.Any Then '从文件中获取 AllowForge = File.ModLoaders.Contains(CompModLoaderType.Forge) AllowFabric = File.ModLoaders.Contains(CompModLoaderType.Fabric) - ElseIf Project.ModLoaders.Count > 0 Then '从工程中获取 + ElseIf Project.ModLoaders.Any Then '从工程中获取 AllowForge = Project.ModLoaders.Contains(CompModLoaderType.Forge) AllowFabric = Project.ModLoaders.Contains(CompModLoaderType.Fabric) End If @@ -275,7 +275,7 @@ If Project.TranslatedName = Project.RawName Then FileName = File.FileName Else - Dim ChineseName As String = Project.TranslatedName.Split(" (").First.Split(" - ").First. + Dim ChineseName As String = Project.TranslatedName.Before(" (").Before(" - "). Replace("\", "\").Replace("/", "/").Replace("|", "|").Replace(":", ":").Replace("<", "<").Replace(">", ">").Replace("*", "*").Replace("?", "?").Replace("""", "").Replace(": ", ":") Select Case Setup.Get("ToolDownloadTranslate") Case 0 @@ -299,7 +299,7 @@ If(File.FileName.EndsWith(".mrpack"), "*.mrpack", "*.zip")), DefaultFolder) If Not Target.Contains("\") Then Exit Sub '构造步骤加载器 - Dim LoaderName As String = Desc & "下载:" & File.DisplayName & " " + Dim LoaderName As String = Desc & "下载:" & GetFileNameWithoutExtentionFromPath(Target) & " " If Target <> DefaultFolder AndAlso Project.Type = CompType.Mod Then CachedFolder = GetPathFromFullPath(Target) Dim Loaders As New List(Of LoaderBase) Loaders.Add(New LoaderDownload("下载文件", New List(Of NetFile) From {File.ToNetFile(Target)}) With {.ProgressWeight = 6, .Block = True}) diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml index ec68dd9..b6b6dc5 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml @@ -20,7 +20,7 @@ - + @@ -61,26 +61,6 @@ - - - - - - - - - - - - - - - - - - - @@ -135,6 +115,26 @@ Data="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" /> + + + + + + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb index 108e699..cdbbdc9 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -32,7 +32,7 @@ #Region "页面切换" '页面切换动画 - Private IsInSelectPage As Boolean = False + Public IsInSelectPage As Boolean = False Private IsFirstLoaded As Boolean = False Private Sub EnterSelectPage() If IsInSelectPage Then Exit Sub @@ -273,11 +273,13 @@ End If End Sub + Private IsReloading As Boolean = False '#3742 中,LoadOptiFineGetError 会初始化 LoadOptiFine,触发事件 LoadOptiFine.StateChanged,导致再次调用 SelectReload ''' ''' 重载已选择的项目的显示。 ''' Private Sub SelectReload() Handles CardOptiFine.Swap, LoadOptiFine.StateChanged, CardForge.Swap, LoadForge.StateChanged, CardFabric.Swap, LoadFabric.StateChanged, CardFabricApi.Swap, LoadFabricApi.StateChanged, CardOptiFabric.Swap, LoadOptiFabric.StateChanged, CardLiteLoader.Swap, LoadLiteLoader.StateChanged - If SelectedMinecraftId Is Nothing Then Exit Sub + If SelectedMinecraftId Is Nothing OrElse IsReloading Then Exit Sub + IsReloading = True '主预览 SelectNameUpdate() ItemSelect.Title = TextSelectName.Text @@ -303,20 +305,25 @@ LabOptiFine.Foreground = ColorGray1 End If 'LiteLoader - Dim LiteLoaderError As String = LoadLiteLoaderGetError() - CardLiteLoader.MainSwap.Visibility = If(LiteLoaderError Is Nothing, Visibility.Visible, Visibility.Collapsed) - If LiteLoaderError IsNot Nothing Then CardLiteLoader.IsSwaped = True '例如在同时展开卡片时选择了不兼容项则强制折叠 - SetLiteLoaderInfoShow(CardLiteLoader.IsSwaped) - If SelectedLiteLoader Is Nothing Then - BtnLiteLoaderClear.Visibility = Visibility.Collapsed - ImgLiteLoader.Visibility = Visibility.Collapsed - LabLiteLoader.Text = If(LiteLoaderError, "点击选择") - LabLiteLoader.Foreground = ColorGray4 + If Not SelectedMinecraftId.Contains("1.") OrElse Val(SelectedMinecraftId.Split(".")(1)) > 12 Then + CardLiteLoader.Visibility = Visibility.Collapsed Else - BtnLiteLoaderClear.Visibility = Visibility.Visible - ImgLiteLoader.Visibility = Visibility.Visible - LabLiteLoader.Text = SelectedLiteLoader.Inherit - LabLiteLoader.Foreground = ColorGray1 + CardLiteLoader.Visibility = Visibility.Visible + Dim LiteLoaderError As String = LoadLiteLoaderGetError() + CardLiteLoader.MainSwap.Visibility = If(LiteLoaderError Is Nothing, Visibility.Visible, Visibility.Collapsed) + If LiteLoaderError IsNot Nothing Then CardLiteLoader.IsSwaped = True '例如在同时展开卡片时选择了不兼容项则强制折叠 + SetLiteLoaderInfoShow(CardLiteLoader.IsSwaped) + If SelectedLiteLoader Is Nothing Then + BtnLiteLoaderClear.Visibility = Visibility.Collapsed + ImgLiteLoader.Visibility = Visibility.Collapsed + LabLiteLoader.Text = If(LiteLoaderError, "点击选择") + LabLiteLoader.Foreground = ColorGray4 + Else + BtnLiteLoaderClear.Visibility = Visibility.Visible + ImgLiteLoader.Visibility = Visibility.Visible + LabLiteLoader.Text = SelectedLiteLoader.Inherit + LabLiteLoader.Foreground = ColorGray1 + End If End If 'Forge Dim ForgeError As String = LoadForgeGetError() @@ -335,67 +342,87 @@ LabForge.Foreground = ColorGray1 End If 'Fabric - Dim FabricError As String = LoadFabricGetError() - CardFabric.MainSwap.Visibility = If(FabricError Is Nothing, Visibility.Visible, Visibility.Collapsed) - If FabricError IsNot Nothing Then CardFabric.IsSwaped = True - SetFabricInfoShow(CardFabric.IsSwaped) - If SelectedFabric Is Nothing Then - BtnFabricClear.Visibility = Visibility.Collapsed - ImgFabric.Visibility = Visibility.Collapsed - LabFabric.Text = If(FabricError, "点击选择") - LabFabric.Foreground = ColorGray4 + If SelectedMinecraftId.Contains("1.") AndAlso Val(SelectedMinecraftId.Split(".")(1)) <= 13 Then + CardFabric.Visibility = Visibility.Collapsed Else - BtnFabricClear.Visibility = Visibility.Visible - ImgFabric.Visibility = Visibility.Visible - LabFabric.Text = SelectedFabric.Replace("+build", "") - LabFabric.Foreground = ColorGray1 + CardFabric.Visibility = Visibility.Visible + Dim FabricError As String = LoadFabricGetError() + CardFabric.MainSwap.Visibility = If(FabricError Is Nothing, Visibility.Visible, Visibility.Collapsed) + If FabricError IsNot Nothing Then CardFabric.IsSwaped = True + SetFabricInfoShow(CardFabric.IsSwaped) + If SelectedFabric Is Nothing Then + BtnFabricClear.Visibility = Visibility.Collapsed + ImgFabric.Visibility = Visibility.Collapsed + LabFabric.Text = If(FabricError, "点击选择") + LabFabric.Foreground = ColorGray4 + Else + BtnFabricClear.Visibility = Visibility.Visible + ImgFabric.Visibility = Visibility.Visible + LabFabric.Text = SelectedFabric.Replace("+build", "") + LabFabric.Foreground = ColorGray1 + End If End If 'FabricApi - Dim FabricApiError As String = LoadFabricApiGetError() - CardFabricApi.MainSwap.Visibility = If(FabricApiError Is Nothing, Visibility.Visible, Visibility.Collapsed) - If FabricApiError IsNot Nothing OrElse SelectedFabric Is Nothing Then CardFabricApi.IsSwaped = True - SetFabricApiInfoShow(CardFabricApi.IsSwaped) - If SelectedFabricApi Is Nothing Then - BtnFabricApiClear.Visibility = Visibility.Collapsed - ImgFabricApi.Visibility = Visibility.Collapsed - LabFabricApi.Text = If(FabricApiError, "点击选择") - LabFabricApi.Foreground = ColorGray4 + If SelectedFabric Is Nothing Then + CardFabricApi.Visibility = Visibility.Collapsed Else - BtnFabricApiClear.Visibility = Visibility.Visible - ImgFabricApi.Visibility = Visibility.Visible - LabFabricApi.Text = SelectedFabricApi.DisplayName.Split("]")(1).Replace("Fabric API ", "").Replace(" build ", ".").Split("+").First.Trim - LabFabricApi.Foreground = ColorGray1 + CardFabricApi.Visibility = Visibility.Visible + Dim FabricApiError As String = LoadFabricApiGetError() + CardFabricApi.MainSwap.Visibility = If(FabricApiError Is Nothing, Visibility.Visible, Visibility.Collapsed) + If FabricApiError IsNot Nothing OrElse SelectedFabric Is Nothing Then CardFabricApi.IsSwaped = True + SetFabricApiInfoShow(CardFabricApi.IsSwaped) + If SelectedFabricApi Is Nothing Then + BtnFabricApiClear.Visibility = Visibility.Collapsed + ImgFabricApi.Visibility = Visibility.Collapsed + LabFabricApi.Text = If(FabricApiError, "点击选择") + LabFabricApi.Foreground = ColorGray4 + Else + BtnFabricApiClear.Visibility = Visibility.Visible + ImgFabricApi.Visibility = Visibility.Visible + LabFabricApi.Text = SelectedFabricApi.DisplayName.Split("]")(1).Replace("Fabric API ", "").Replace(" build ", ".").Split("+").First.Trim + LabFabricApi.Foreground = ColorGray1 + End If End If 'OptiFabric - Dim OptiFabricError As String = LoadOptiFabricGetError() - CardOptiFabric.MainSwap.Visibility = If(OptiFabricError Is Nothing, Visibility.Visible, Visibility.Collapsed) - If OptiFabricError IsNot Nothing OrElse SelectedFabric Is Nothing Then CardOptiFabric.IsSwaped = True - SetOptiFabricInfoShow(CardOptiFabric.IsSwaped) - If SelectedOptiFabric Is Nothing Then - BtnOptiFabricClear.Visibility = Visibility.Collapsed - ImgOptiFabric.Visibility = Visibility.Collapsed - LabOptiFabric.Text = If(OptiFabricError, "点击选择") - LabOptiFabric.Foreground = ColorGray4 + If SelectedFabric Is Nothing OrElse SelectedOptiFine Is Nothing Then + CardOptiFabric.Visibility = Visibility.Collapsed Else - BtnOptiFabricClear.Visibility = Visibility.Visible - ImgOptiFabric.Visibility = Visibility.Visible - LabOptiFabric.Text = SelectedOptiFabric.DisplayName.ToLower.Replace("optifabric-", "").Replace(".jar", "").Trim.TrimStart("v") - LabOptiFabric.Foreground = ColorGray1 + CardOptiFabric.Visibility = Visibility.Visible + Dim OptiFabricError As String = LoadOptiFabricGetError() + CardOptiFabric.MainSwap.Visibility = If(OptiFabricError Is Nothing, Visibility.Visible, Visibility.Collapsed) + If OptiFabricError IsNot Nothing OrElse SelectedFabric Is Nothing Then CardOptiFabric.IsSwaped = True + SetOptiFabricInfoShow(CardOptiFabric.IsSwaped) + If SelectedOptiFabric Is Nothing Then + BtnOptiFabricClear.Visibility = Visibility.Collapsed + ImgOptiFabric.Visibility = Visibility.Collapsed + LabOptiFabric.Text = If(OptiFabricError, "点击选择") + LabOptiFabric.Foreground = ColorGray4 + Else + BtnOptiFabricClear.Visibility = Visibility.Visible + ImgOptiFabric.Visibility = Visibility.Visible + LabOptiFabric.Text = SelectedOptiFabric.DisplayName.ToLower.Replace("optifabric-", "").Replace(".jar", "").Trim.TrimStart("v") + LabOptiFabric.Foreground = ColorGray1 + End If End If '主警告 - HintFabricAPI.Visibility = If(SelectedFabric IsNot Nothing AndAlso SelectedFabricApi Is Nothing, Visibility.Visible, Visibility.Collapsed) + If SelectedFabric IsNot Nothing AndAlso SelectedFabricApi Is Nothing Then + HintFabricAPI.Visibility = Visibility.Visible + Else + HintFabricAPI.Visibility = Visibility.Collapsed + End If If SelectedFabric IsNot Nothing AndAlso SelectedOptiFine IsNot Nothing AndAlso SelectedOptiFabric Is Nothing Then - If SelectedMinecraftId.StartsWith("1.14") OrElse SelectedMinecraftId.StartsWith("1.15") Then - HintOptiFabric.Visibility = Visibility.Collapsed - HintOptiFabricOld.Visibility = Visibility.Visible - Else - HintOptiFabric.Visibility = Visibility.Visible - HintOptiFabricOld.Visibility = Visibility.Collapsed - End If + HintOptiFabric.Visibility = Visibility.Visible Else HintOptiFabric.Visibility = Visibility.Collapsed - HintOptiFabricOld.Visibility = Visibility.Collapsed End If + If SelectedMinecraftId.Contains("1.") AndAlso Val(SelectedMinecraftId.Split(".")(1)) >= 16 AndAlso SelectedOptiFine IsNot Nothing AndAlso + (SelectedForge IsNot Nothing OrElse SelectedFabric IsNot Nothing) Then + HintModOptiFine.Visibility = Visibility.Visible + Else + HintModOptiFine.Visibility = Visibility.Collapsed + End If + '结束 + IsReloading = False End Sub ''' ''' 清空已选择的项目。 @@ -643,7 +670,7 @@ Return (OptiFine.RequiredForgeVersion.Contains(".") AndAlso 'XX.X.XXX VersionSortInteger(Forge.Version, OptiFine.RequiredForgeVersion) >= 0) OrElse (Not OptiFine.RequiredForgeVersion.Contains(".") AndAlso '#XXXX - VersionSortInteger(Forge.Version.Split(".").Last, OptiFine.RequiredForgeVersion) >= 0) + Forge.Version.After(".") >= OptiFine.RequiredForgeVersion) End Function '限制展开 @@ -920,12 +947,12 @@ If DisplayName.StartsWith("[" & MinecraftVersion & "]") Then Return True If Not DisplayName.Contains("/") OrElse Not DisplayName.Contains("]") Then Return False '直接的判断(例如 1.18.1/22w03a) - For Each Part As String In DisplayName.Split("]")(0).TrimStart("[").Split("/") + For Each Part As String In DisplayName.Before("]").TrimStart("[").Split("/") If Part = MinecraftVersion Then Return True Next '将版本名分割语素(例如 1.16.4/5) - Dim Lefts = RegexSearch(DisplayName.Split("]")(0), "[a-z/]+|[0-9/]+") - Dim Rights = RegexSearch(MinecraftVersion.Split("]")(0), "[a-z/]+|[0-9/]+") + Dim Lefts = RegexSearch(DisplayName.Before("]"), "[a-z/]+|[0-9/]+") + Dim Rights = RegexSearch(MinecraftVersion.Before("]"), "[a-z/]+|[0-9/]+") '对每段进行判断 Dim i As Integer = 0 While True @@ -1045,7 +1072,6 @@ ''' 获取 OptiFabric 的加载异常信息。若正常则返回 Nothing。 ''' Private Function LoadOptiFabricGetError() As String - If SelectedMinecraftId.StartsWith("1.14") OrElse SelectedMinecraftId.StartsWith("1.15") Then Return "不兼容老版本 Fabric,请手动下载 OptiFabric Origins" If LoadOptiFabric Is Nothing OrElse LoadOptiFabric.State.LoadingState = MyLoading.MyLoadingState.Run Then Return "正在获取版本列表……" If LoadOptiFabric.State.LoadingState = MyLoading.MyLoadingState.Error Then Return "获取版本列表失败:" & CType(LoadOptiFabric.State, Object).Error.Message If DlOptiFabricLoader.Output Is Nothing Then diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml index d71309b..814d1c8 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml @@ -33,23 +33,19 @@ - + - - - + - - diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml index 91565ef..a59954f 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml @@ -32,23 +32,19 @@ - + - - - + - - diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/FormLoginOAuth.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/FormLoginOAuth.xaml.vb index 86fd7a5..35cd847 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/FormLoginOAuth.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/FormLoginOAuth.xaml.vb @@ -93,7 +93,7 @@ Public Class FormLoginOAuth If Not IsLoginSuccessed Then RaiseEvent OnLoginCanceled(IsSwitch) FrmMain.Focus() End Sub - Private Sub HintSwitch_Click(sender As Object, e As EventArgs) Handles HintSwitch.Click + Private Sub HintSwitch_Click() Handles HintSwitch.Click IsSwitch = True Close() End Sub diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb index f0edcd9..692bf17 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb @@ -241,7 +241,7 @@ Retry: {"Translator-Chinese", "Crowdin 中文翻译者披风"}, {"Translator", "Crowdin 翻译者披风"}, {"Cobalt", "Cobalt 披风"}, {"Vanilla", "原版披风"}, {"Minecon2011", "Minecon 2011 参与者披风"}, {"Minecon2012", "Minecon 2012 参与者披风"}, {"Minecon2013", "Minecon 2013 参与者披风"}, {"Minecon2015", "Minecon 2015 参与者披风"}, {"Minecon2016", "Minecon 2016 参与者披风"}, - {"Cherry Blossom", "樱花披风"} + {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"} } Dim SelectionControl As New List(Of IMyRadio) From {New MyRadioBox With {.Text = "无披风"}} For Each Cape In SkinData("capes") diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb index 8ea7421..c7da13c 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb @@ -19,51 +19,53 @@ RefreshButtonsUI() '加载版本 - RunInNewThread(Sub() - '确认 Minecraft 文件夹存在 - PathMcFolder = Setup.Get("LaunchFolderSelect").ToString.Replace("$", Path) - If PathMcFolder = "" OrElse Not Directory.Exists(PathMcFolder) Then - '无效的文件夹 - If PathMcFolder = "" Then - Log("[Launch] 没有已储存的 Minecraft 文件夹") - Else - Log("[Launch] Minecraft 文件夹无效,该文件夹已不存在:" & PathMcFolder, LogLevel.Debug) - End If - McFolderListLoader.WaitForExit(IsForceRestart:=True) - Setup.Set("LaunchFolderSelect", McFolderList(0).Path.Replace(Path, "$")) - End If - Log("[Launch] Minecraft 文件夹:" & PathMcFolder) - If Setup.Get("SystemDebugDelay") Then Thread.Sleep(RandomInteger(500, 3000)) - '确认 Minecraft 版本存在 - Dim Selection As String = Setup.Get("LaunchVersionSelect") - Dim Version As McVersion - If Selection = "" Then - Version = Nothing - Else - Version = New McVersion(Selection) - End If - If IsNothing(Version) OrElse Not (Version.Path.StartsWith(PathMcFolder) AndAlso Version.Check) Then - '无效的版本 - Log("[Launch] Minecraft 版本无效" & If(IsNothing(Version), ",没有有效版本", ":" & Version.Path), If(IsNothing(Version), LogLevel.Normal, LogLevel.Debug)) - If Not McVersionListLoader.State = LoadState.Finished Then LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\", WaitForExit:=True) - If Not McVersionList.Any() OrElse McVersionList.First.Value(0).Logo.Contains("RedstoneBlock") Then - Version = Nothing - Setup.Set("LaunchVersionSelect", "") - Log("[Launch] 无可用 Minecraft 版本") - Else - Version = McVersionList.First.Value(0) - Setup.Set("LaunchVersionSelect", Version.Name) - Log("[Launch] 自动选择 Minecraft 版本:" & Version.Path) - End If - End If - RunInUi(Sub() - McVersionCurrent = Version '绕这一圈是为了避免 McVersionCheck 触发第二次版本改变 - IsLoadFinished = True - RefreshButtonsUI() - RefreshPage(False, False) '有可能选择的版本变化了,需要重新刷新 - If McLoginAble() = "" Then McLoginLoader.Start() '自动登录 - End Sub) - End Sub, "Version Check", ThreadPriority.AboveNormal) + RunInNewThread( + Sub() + '确认 Minecraft 文件夹存在 + PathMcFolder = Setup.Get("LaunchFolderSelect").ToString.Replace("$", Path) + If PathMcFolder = "" OrElse Not Directory.Exists(PathMcFolder) Then + '无效的文件夹 + If PathMcFolder = "" Then + Log("[Launch] 没有已储存的 Minecraft 文件夹") + Else + Log("[Launch] Minecraft 文件夹无效,该文件夹已不存在:" & PathMcFolder, LogLevel.Debug) + End If + McFolderListLoader.WaitForExit(IsForceRestart:=True) + Setup.Set("LaunchFolderSelect", McFolderList(0).Path.Replace(Path, "$")) + End If + Log("[Launch] Minecraft 文件夹:" & PathMcFolder) + If Setup.Get("SystemDebugDelay") Then Thread.Sleep(RandomInteger(500, 3000)) + '确认 Minecraft 版本存在 + Dim Selection As String = Setup.Get("LaunchVersionSelect") + Dim Version As McVersion + If Selection = "" Then + Version = Nothing + Else + Version = New McVersion(Selection) + End If + If IsNothing(Version) OrElse Not (Version.Path.StartsWith(PathMcFolder) AndAlso Version.Check) Then + '无效的版本 + Log("[Launch] Minecraft 版本无效" & If(IsNothing(Version), ",没有有效版本", ":" & Version.Path), If(IsNothing(Version), LogLevel.Normal, LogLevel.Debug)) + If Not McVersionListLoader.State = LoadState.Finished Then LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\", WaitForExit:=True) + If Not McVersionList.Any() OrElse McVersionList.First.Value(0).Logo.Contains("RedstoneBlock") Then + Version = Nothing + Setup.Set("LaunchVersionSelect", "") + Log("[Launch] 无可用 Minecraft 版本") + Else + Version = McVersionList.First.Value(0) + Setup.Set("LaunchVersionSelect", Version.Name) + Log("[Launch] 自动选择 Minecraft 版本:" & Version.Path) + End If + End If + RunInUi( + Sub() + McVersionCurrent = Version '绕这一圈是为了避免 McVersionCheck 触发第二次版本改变 + IsLoadFinished = True + RefreshButtonsUI() + RefreshPage(False, False) '有可能选择的版本变化了,需要重新刷新 + If McLoginAble() = "" Then McLoginLoader.Start() '自动登录 + End Sub) + End Sub, "Version Check", ThreadPriority.AboveNormal) '改变页面 Dim LoginType As McLoginType = Setup.Get("LoginType") @@ -398,7 +400,7 @@ Finish: ElseIf Setup.Get("LoginLegacyName") = "" Then Return New EqualableList(Of String) From {0, ""} Else - Return New EqualableList(Of String) From {0, If(Setup.Get("LoginLegacyName").ToString.Split("¨")(0), "")} + Return New EqualableList(Of String) From {0, If(Setup.Get("LoginLegacyName").ToString.Before("¨"), "")} End If Case 3 Return New EqualableList(Of String) From {3, Setup.Get("LaunchSkinID")} diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb index bae5e07..8da1fc5 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb @@ -67,7 +67,7 @@ Download: End If Case 3 Select Case Setup.Get("UiCustomPreset") - Case 0 '你知道吗 + Case 0 Log("[Page] 主页预设:你知道吗") Content = " @@ -76,7 +76,7 @@ Download: 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"" /> " - Case 1 '回声洞 + Case 1 Log("[Page] 主页预设:回声洞") Content = " @@ -85,17 +85,21 @@ Download: 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"" /> " - Case 2 '新闻 + Case 2 Log("[Page] 主页预设:Minecraft 新闻") Url = "http://pcl.mcnews.thestack.top" GoTo Download - Case 3 '简单主页 + Case 3 Log("[Page] 主页预设:简单主页") Url = "https://gitee.com/mfn233/PCL-Mainpage/raw/main/Custom.xaml" GoTo Download - Case 4 '历史上的今天 - Log("[Page] 主页预设:历史上的今天") - Url = "https://pclnews.52chye.cn/custom.xaml" + Case 4 + Log("[Page] 主页预设:每日整合包推荐") + Url = "https://pclsub.sodamc.com/" + GoTo Download + Case 5 + Log("[Page] 主页预设:Minecraft 皮肤推荐") + Url = "https://forgepixel.com/pcl_sub_file" GoTo Download End Select End Select @@ -106,16 +110,17 @@ Download: '联网获取自定义主页文件 Private OnlineLoader As New LoaderTask(Of String, Integer)("自定义主页获取", AddressOf OnlineLoaderSub) With {.ReloadTimeout = 10 * 60 * 1000} Private Sub OnlineLoaderSub(Task As LoaderTask(Of String, Integer)) + Dim Address As String = Task.Input '#3721 中连续触发两次导致内容变化 Try '获取版本校验地址 Dim VersionAddress As String - If Task.Input.Contains(".xaml") Then - VersionAddress = Task.Input.Replace(".xaml", ".xaml.ini") + If Address.Contains(".xaml") Then + VersionAddress = Address.Replace(".xaml", ".xaml.ini") Else - VersionAddress = Task.Input.Split("?").First + VersionAddress = Address.Before("?") If Not VersionAddress.EndsWith("/") Then VersionAddress += "/" VersionAddress += "version" - If Task.Input.Contains("?") Then VersionAddress += Task.Input.Split("?").Last + If Address.Contains("?") Then VersionAddress += Address.After("?") End If '校验版本 Dim Version As String = "" @@ -136,9 +141,9 @@ Download: End Try '实际下载 If NeedDownload Then - Dim FileContent As String = NetGetCodeByRequestRetry(Task.Input) - Log($"[Page] 已联网下载自定义主页,内容长度:{FileContent.Length},来源:{Task.Input}") - Setup.Set("CacheSavedPageUrl", Task.Input) + Dim FileContent As String = NetGetCodeByRequestRetry(Address) + Log($"[Page] 已联网下载自定义主页,内容长度:{FileContent.Length},来源:{Address}") + Setup.Set("CacheSavedPageUrl", Address) Setup.Set("CacheSavedPageVersion", Version) WriteFile(PathTemp & "Cache\Custom.xaml", FileContent) End If @@ -146,11 +151,11 @@ Download: Refresh() Catch ex As Exception If Setup.Get("CacheSavedPageVersion") = "" Then - Log(ex, $"联网下载自定义主页失败({Task.Input})", LogLevel.Msgbox) + Log(ex, $"联网下载自定义主页失败({Address})", LogLevel.Msgbox) Else - Log(ex, $"联网下载自定义主页失败({Task.Input})") + Log(ex, $"联网下载自定义主页失败({Address})") End If - Task.Input = "" + Address = "" End Try End Sub @@ -208,6 +213,7 @@ Download: GoTo Refresh '防止 SyncLock 死锁 End If End Try + Log($"[Page] 实例化:加载自定义主页 UI 完成") End SyncLock Return Refresh: diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb index 7445bd6..b5422ae 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb @@ -17,8 +17,8 @@ ComboName.ItemsSource = Nothing Else ComboName.ItemsSource = Setup.Get("LoginAuthEmail").ToString.Split("¨") - ComboName.Text = Setup.Get("LoginAuthEmail").ToString.Split("¨")(0) - If Setup.Get("LoginRemember") Then TextPass.Password = Setup.Get("LoginAuthPass").ToString.Split("¨")(0).Trim + ComboName.Text = Setup.Get("LoginAuthEmail").ToString.Before("¨") + If Setup.Get("LoginRemember") Then TextPass.Password = Setup.Get("LoginAuthPass").ToString.Before("¨").Trim End If End If IsFirstLoad = False diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginLegacy.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginLegacy.xaml.vb index 7b3f408..0c47882 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginLegacy.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginLegacy.xaml.vb @@ -26,7 +26,7 @@ Public Class PageLoginLegacy ComboName.ItemsSource = Nothing Else ComboName.ItemsSource = Setup.Get("LoginLegacyName").ToString.Split("¨") - ComboName.Text = Setup.Get("LoginLegacyName").ToString.Split("¨")(0).Trim + ComboName.Text = Setup.Get("LoginLegacyName").ToString.Before("¨").Trim End If End If IsReloaded = True diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb index dc6b007..4bf92e2 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb @@ -67,39 +67,43 @@ ComboAccounts.IsEnabled = False BtnLogin.IsEnabled = False BtnLogin.Text = "0%" - RunInNewThread(Sub() - Try - McLoginMsLoader.Start(GetLoginData(), IsForceRestart:=True) - Do While McLoginMsLoader.State = LoadState.Loading - RunInUi(Sub() BtnLogin.Text = Math.Round(McLoginMsLoader.Progress * 100) & "%") - Thread.Sleep(50) - Loop - If McLoginMsLoader.State = LoadState.Finished Then - RunInUi(Sub() FrmLaunchLeft.RefreshPage(False, True)) - ElseIf McLoginMsLoader.State = LoadState.Aborted Then - Throw New ThreadInterruptedException - ElseIf McLoginMsLoader.Error Is Nothing Then - Throw New Exception("未知错误!") - Else - Throw New Exception(McLoginMsLoader.Error.Message, McLoginMsLoader.Error) - End If - Catch ex As ThreadInterruptedException - Hint("已取消登录!") - Catch ex As Exception - If ex.Message = "$$" Then - ElseIf ex.Message.StartsWith("$") Then - Hint(ex.Message.TrimStart("$"), HintType.Critical) - Else - Log(ex, "微软登录尝试失败", LogLevel.Msgbox) - End If - Finally - RunInUi(Sub() - ComboAccounts.IsEnabled = True - BtnLogin.IsEnabled = True - BtnLogin.Text = "登录" - End Sub) - End Try - End Sub, "Ms Login") + RunInNewThread( + Sub() + Try + McLoginMsLoader.Start(GetLoginData(), IsForceRestart:=True) + Do While McLoginMsLoader.State = LoadState.Loading + RunInUi(Sub() BtnLogin.Text = Math.Round(McLoginMsLoader.Progress * 100) & "%") + Thread.Sleep(50) + Loop + If McLoginMsLoader.State = LoadState.Finished Then + RunInUi(Sub() FrmLaunchLeft.RefreshPage(False, True)) + ElseIf McLoginMsLoader.State = LoadState.Aborted Then + Throw New ThreadInterruptedException + ElseIf McLoginMsLoader.Error Is Nothing Then + Throw New Exception("未知错误!") + Else + Throw New Exception(McLoginMsLoader.Error.Message, McLoginMsLoader.Error) + End If + Catch ex As ThreadInterruptedException + Hint("已取消登录!") + Catch ex As Exception + If ex.Message = "$$" Then + ElseIf ex.Message.StartsWith("$") Then + Hint(ex.Message.TrimStart("$"), HintType.Critical) + ElseIf TypeOf ex Is Security.Authentication.AuthenticationException AndAlso ex.Message.ContainsF("SSL/TLS") Then + Log(ex, "正版登录验证失败,请尝试在 [设置 → 启动器] 中关闭 [验证 SSL 证书] 然后再试。" & vbCrLf & vbCrLf & "原始错误信息:", LogLevel.Msgbox) + Else + Log(ex, "正版登录尝试失败", LogLevel.Msgbox) + End If + Finally + RunInUi( + Sub() + ComboAccounts.IsEnabled = True + BtnLogin.IsEnabled = True + BtnLogin.Text = "登录" + End Sub) + End Try + End Sub, "Ms Login") End Sub End Class diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml.vb index 6d3ee42..15a3581 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml.vb @@ -85,50 +85,51 @@ Hint("正在更改皮肤……") IsChanging = True '开始实际获取 - RunInNewThread(Async Sub() - Try + RunInNewThread( + Async Sub() + Try Retry: - If McLoginMsLoader.State = LoadState.Loading Then McLoginMsLoader.WaitForExit() '等待登录结束 - Dim AccessToken As String = Setup.Get("CacheMsAccess") - Dim Uuid As String = Setup.Get("CacheMsUuid") + If McLoginMsLoader.State = LoadState.Loading Then McLoginMsLoader.WaitForExit() '等待登录结束 + Dim AccessToken As String = Setup.Get("CacheMsAccess") + Dim Uuid As String = Setup.Get("CacheMsUuid") - Dim Client As New Net.Http.HttpClient With {.Timeout = New TimeSpan(0, 0, 30)} - Client.DefaultRequestHeaders.Authorization = New Net.Http.Headers.AuthenticationHeaderValue("Bearer", AccessToken) - Client.DefaultRequestHeaders.Accept.Add(New Net.Http.Headers.MediaTypeWithQualityHeaderValue("*/*")) - Client.DefaultRequestHeaders.UserAgent.Add(New Net.Http.Headers.ProductInfoHeaderValue("MojangSharp", "0.1")) - Dim Contents As New Net.Http.MultipartFormDataContent From { - {New Net.Http.StringContent(If(SkinInfo.IsSlim, "slim", "classic")), "variant"}, - {New Net.Http.ByteArrayContent(File.ReadAllBytes(SkinInfo.LocalFile)), "file", GetFileNameFromPath(SkinInfo.LocalFile)} - } - Dim Result As String = Await (Await Client.PostAsync(New Uri("https://api.minecraftservices.com/minecraft/profile/skins"), Contents)).Content.ReadAsStringAsync - If Result.Contains("request requires user authentication") Then - Hint("正在登录,将在登录完成后继续更改皮肤……") - McLoginMsLoader.Start(GetLoginData(), IsForceRestart:=True) - GoTo Retry - ElseIf Result.Contains("""error""") Then - Hint("更改皮肤失败:" & GetJson(Result)("error"), HintType.Critical) - Exit Sub - End If - '获取新皮肤地址 - Log("[Skin] 皮肤修改返回值:" & vbCrLf & Result) - Dim ResultJson As JObject = GetJson(Result) - For Each Skin As JObject In ResultJson("skins") - If Skin("state").ToString = "ACTIVE" Then - MySkin.ReloadCache(Skin("url")) - Exit Sub - End If - Next - Throw New Exception("未知错误(" & Result & ")") - Catch ex As Exception - If ex.GetType.Equals(GetType(Tasks.TaskCanceledException)) Then - Hint("更改皮肤失败:与 Mojang 皮肤服务器的连接超时,请检查你的网络是否通畅!", HintType.Critical) - Else - Log(ex, "更改皮肤失败", LogLevel.Hint) - End If - Finally - IsChanging = False - End Try - End Sub, "Ms Skin Upload") + Dim Client As New Net.Http.HttpClient With {.Timeout = New TimeSpan(0, 0, 30)} + Client.DefaultRequestHeaders.Authorization = New Net.Http.Headers.AuthenticationHeaderValue("Bearer", AccessToken) + Client.DefaultRequestHeaders.Accept.Add(New Net.Http.Headers.MediaTypeWithQualityHeaderValue("*/*")) + Client.DefaultRequestHeaders.UserAgent.Add(New Net.Http.Headers.ProductInfoHeaderValue("MojangSharp", "0.1")) + Dim Contents As New Net.Http.MultipartFormDataContent From { + {New Net.Http.StringContent(If(SkinInfo.IsSlim, "slim", "classic")), "variant"}, + {New Net.Http.ByteArrayContent(File.ReadAllBytes(SkinInfo.LocalFile)), "file", GetFileNameFromPath(SkinInfo.LocalFile)} + } + Dim Result As String = Await (Await Client.PostAsync(New Uri("https://api.minecraftservices.com/minecraft/profile/skins"), Contents)).Content.ReadAsStringAsync + If Result.Contains("request requires user authentication") Then + Hint("正在登录,将在登录完成后继续更改皮肤……") + McLoginMsLoader.Start(GetLoginData(), IsForceRestart:=True) + GoTo Retry + ElseIf Result.Contains("""error""") Then + Hint("更改皮肤失败:" & GetJson(Result)("error"), HintType.Critical) + Exit Sub + End If + '获取新皮肤地址 + Log("[Skin] 皮肤修改返回值:" & vbCrLf & Result) + Dim ResultJson As JObject = GetJson(Result) + For Each Skin As JObject In ResultJson("skins") + If Skin("state").ToString = "ACTIVE" Then + MySkin.ReloadCache(Skin("url")) + Exit Sub + End If + Next + Throw New Exception("未知错误(" & Result & ")") + Catch ex As Exception + If ex.GetType.Equals(GetType(Tasks.TaskCanceledException)) Then + Hint("更改皮肤失败:与 Mojang 皮肤服务器的连接超时,请检查你的网络是否通畅!", HintType.Critical) + Else + Log(ex, "更改皮肤失败", LogLevel.Hint) + End If + Finally + IsChanging = False + End Try + End Sub, "Ms Skin Upload") End Sub '保存皮肤 diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginNide.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginNide.xaml.vb index 70a971b..0e327d0 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginNide.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginNide.xaml.vb @@ -17,8 +17,8 @@ ComboName.ItemsSource = Nothing Else ComboName.ItemsSource = Setup.Get("LoginNideEmail").ToString.Split("¨") - ComboName.Text = Setup.Get("LoginNideEmail").ToString.Split("¨")(0) - If Setup.Get("LoginRemember") Then TextPass.Password = Setup.Get("LoginNidePass").ToString.Split("¨")(0).Trim + ComboName.Text = Setup.Get("LoginNideEmail").ToString.Before("¨") + If Setup.Get("LoginRemember") Then TextPass.Password = Setup.Get("LoginNidePass").ToString.Before("¨").Trim End If End If IsFirstLoad = False diff --git a/Plain Craft Launcher 2/Pages/PageLink/PageLinkIoi.xaml.vb b/Plain Craft Launcher 2/Pages/PageLink/PageLinkIoi.xaml.vb index c6f1214..f0a318f 100644 --- a/Plain Craft Launcher 2/Pages/PageLink/PageLinkIoi.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLink/PageLinkIoi.xaml.vb @@ -149,9 +149,6 @@ Public Class PageLinkIoi ''' 检查某个玩家名是否合法。 ''' Private Shared Function IsPlayerNameValid(Name As String) As Boolean - For Each ValidateRule As Validate In {New ValidateNullOrWhiteSpace, New ValidateLength(0, 20), New ValidateFilter} - If Not String.IsNullOrEmpty(ValidateRule.Validate(Name)) Then Return False - Next Return True End Function diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml new file mode 100644 index 0000000..a404b44 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml.vb b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml.vb new file mode 100644 index 0000000..40afd2e --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml.vb @@ -0,0 +1,40 @@ +Public Class PageOtherAbout + + Private Shadows IsLoaded As Boolean = False + Private Sub PageOtherAbout_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded + + '重复加载部分 + PanBack.ScrollToHome() + + '非重复加载部分 + If IsLoaded Then Exit Sub + IsLoaded = True + + ItemAboutPcl.Info = ItemAboutPcl.Info.Replace("%VERSION%", VersionDisplayName).Replace("%VERSIONCODE%", VersionCode).Replace("%BRANCH%", VersionBranchCode) +#If DEBUG Then + BtnDonateDonate.Visibility = Visibility.Collapsed + BtnDonateOutput.Visibility = Visibility.Visible +#End If + + End Sub + + Private Sub BtnAboutBmclapi_Click(sender As Object, e As EventArgs) Handles BtnAboutBmclapi.Click + OpenWebsite("https://afdian.net/a/bangbang93") + End Sub + Private Sub BtnAboutWiki_Click(sender As Object, e As EventArgs) Handles BtnAboutWiki.Click + OpenWebsite("https://www.mcmod.cn") + End Sub + Public Shared Sub CopyUniqueAddress() Handles BtnDonateCopy.Click + ClipboardSet(UniqueAddress) + End Sub + Private Sub DonateCodeInput() Handles BtnDonateInput.Click + DonateCodeInput() + End Sub + +#If DEBUG Then + Private Sub BtnDonateOutput_Click(sender As Object, e As EventArgs) Handles BtnDonateOutput.Click + DonateCodeGenerate() + End Sub +#End If + +End Class diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherTest.xaml b/Plain Craft Launcher 2/Pages/PageOther/PageOtherTest.xaml new file mode 100644 index 0000000..9623808 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherTest.xaml @@ -0,0 +1,12 @@ + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherTest.xaml.vb b/Plain Craft Launcher 2/Pages/PageOther/PageOtherTest.xaml.vb new file mode 100644 index 0000000..af35b45 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherTest.xaml.vb @@ -0,0 +1,27 @@ +Public Class PageOtherTest + + Public Shared Sub StartCustomDownload(Url As String, FileName As String, Optional Folder As String = Nothing) + Hint("为便于维护,开源内容中不包含百宝箱功能……") + End Sub + Public Shared Sub Jrrp() + Hint("为便于维护,开源内容中不包含百宝箱功能……") + End Sub + Public Shared Sub RubbishClear() + Hint("为便于维护,开源内容中不包含百宝箱功能……") + End Sub + Public Shared Sub MemoryOptimize(ShowHint As Boolean) + If ShowHint Then Hint("为便于维护,开源内容中不包含百宝箱功能……") + End Sub + Public Shared Sub MemoryOptimizeInternal() + End Sub + Public Shared Function GetRandomCave() As String + Return "为便于维护,开源内容中不包含百宝箱功能……" + End Function + Public Shared Function GetRandomHint() As String + Return "为便于维护,开源内容中不包含百宝箱功能……" + End Function + Public Shared Function GetRandomPresetHint() As String + Return "为便于维护,开源内容中不包含百宝箱功能……" + End Function + +End Class diff --git a/Plain Craft Launcher 2/Pages/PageSelectLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageSelectLeft.xaml.vb index 9848581..1ef40df 100644 --- a/Plain Craft Launcher 2/Pages/PageSelectLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSelectLeft.xaml.vb @@ -237,7 +237,7 @@ If Not Version.Modable Then Continue For '4. 该版本的隔离文件夹下不存在 mods Dim ModIndieFolder As New DirectoryInfo(Version.Path & "mods\") - If ModIndieFolder.Exists AndAlso ModIndieFolder.EnumerateFiles.Count > 0 Then Exit Sub + If ModIndieFolder.Exists AndAlso ModIndieFolder.EnumerateFiles.Any Then Exit Sub '满足以上全部条件则视为根目录整合包 Setup.Set("VersionArgumentIndie", 2, Version:=Version) Log("[Setup] 已自动关闭单版本隔离:" & Version.Name, LogLevel.Debug) @@ -295,7 +295,7 @@ For i = 0 To Folders.Count - 1 If Folders(i) = "" Then Exit For If Folders(i).ToString.EndsWith(Folder.Path) Then - Name = Folders(i).ToString.Split(">")(0) + Name = Folders(i).ToString.Before(">") Folders.RemoveAt(i) Exit For End If @@ -320,7 +320,7 @@ For i = 0 To Folders.Count - 1 If Folders(i) = "" Then Exit For If Folders(i).ToString.EndsWith(Folder.Path) Then - 'Name = Folders(i).ToString.Split(">")(0) + 'Name = Folders(i).ToString.Before(">") Folders.RemoveAt(i) Exit For End If diff --git a/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb b/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb new file mode 100644 index 0000000..faef9cc --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb @@ -0,0 +1,691 @@ +Public Class ModSetup + + ''' + ''' 设置的更新号。 + ''' + Public Const VersionSetup As Integer = 1 + ''' + ''' 设置列表。 + ''' + Private ReadOnly SetupDict As New Dictionary(Of String, SetupEntry) From { + {"Identify", New SetupEntry("", Source:=SetupSource.Registry)}, + {"HintDownloadThread", New SetupEntry(False, Source:=SetupSource.Registry)}, + {"HintNotice", New SetupEntry(0, Source:=SetupSource.Registry)}, + {"HintDownload", New SetupEntry(0, Source:=SetupSource.Registry)}, + {"HintInstallBack", New SetupEntry(False, Source:=SetupSource.Registry)}, + {"HintHide", New SetupEntry(False, Source:=SetupSource.Registry)}, + {"HintHandInstall", New SetupEntry(False, Source:=SetupSource.Registry)}, + {"HintBuy", New SetupEntry(False, Source:=SetupSource.Registry)}, + {"HintClearRubbish", New SetupEntry(0, Source:=SetupSource.Registry)}, + {"HintUpdateMod", New SetupEntry(False, Source:=SetupSource.Registry)}, + {"TestSetupReader", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"SystemEula", New SetupEntry(False, Source:=SetupSource.Registry)}, + {"SystemCount", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)}, + {"SystemLaunchCount", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)}, + {"SystemLastVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)}, + {"SystemHighestBetaVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)}, + {"SystemHighestAlphaVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)}, + {"SystemSetupVersionReg", New SetupEntry(VersionSetup, Source:=SetupSource.Registry)}, + {"SystemSetupVersionIni", New SetupEntry(VersionSetup)}, + {"SystemHelpVersion", New SetupEntry(0, Source:=SetupSource.Registry)}, + {"SystemDebugMode", New SetupEntry(False, Source:=SetupSource.Registry)}, + {"SystemDebugAnim", New SetupEntry(9, Source:=SetupSource.Registry)}, + {"SystemDebugDelay", New SetupEntry(False, Source:=SetupSource.Registry)}, + {"SystemDebugSkipCopy", New SetupEntry(False, Source:=SetupSource.Registry)}, + {"SystemSystemCache", New SetupEntry("", Source:=SetupSource.Registry)}, + {"SystemSystemUpdate", New SetupEntry(0)}, + {"SystemSystemActivity", New SetupEntry(0)}, + {"CacheSavedPageUrl", New SetupEntry("", Source:=SetupSource.Registry)}, + {"CacheSavedPageVersion", New SetupEntry("", Source:=SetupSource.Registry)}, + {"CacheMsOAuthRefresh", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheMsAccess", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheMsProfileJson", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheMsUuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheMsName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheNideAccess", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheNideClient", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheNideUuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheNideName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheNideUsername", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheNidePass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheNideServer", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheAuthAccess", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheAuthClient", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheAuthUuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheAuthName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheAuthUsername", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheAuthPass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheAuthServerServer", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheAuthServerName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheAuthServerRegister", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"CacheDownloadFolder", New SetupEntry("", Source:=SetupSource.Registry)}, + {"CacheJavaListVersion", New SetupEntry(0, Source:=SetupSource.Registry)}, + {"LoginRemember", New SetupEntry(True, Source:=SetupSource.Registry, Encoded:=True)}, + {"LoginLegacyName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"LoginMsJson", New SetupEntry("{}", Source:=SetupSource.Registry, Encoded:=True)}, '{UserName: OAuthToken, ...} + {"LoginNideEmail", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"LoginNidePass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"LoginAuthEmail", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"LoginAuthPass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"LoginType", New SetupEntry(McLoginType.Legacy, Source:=SetupSource.Registry)}, + {"LoginPageType", New SetupEntry(0)}, + {"LaunchSkinID", New SetupEntry("", Source:=SetupSource.Registry)}, + {"LaunchSkinType", New SetupEntry(0, Source:=SetupSource.Registry)}, + {"LaunchSkinSlim", New SetupEntry(False, Source:=SetupSource.Registry)}, + {"LaunchVersionSelect", New SetupEntry("")}, + {"LaunchFolderSelect", New SetupEntry("")}, + {"LaunchFolders", New SetupEntry("", Source:=SetupSource.Registry)}, + {"LaunchArgumentTitle", New SetupEntry("")}, + {"LaunchArgumentInfo", New SetupEntry("PCL")}, + {"LaunchArgumentJavaSelect", New SetupEntry("", Source:=SetupSource.Registry)}, + {"LaunchArgumentJavaAll", New SetupEntry("[]", Source:=SetupSource.Registry)}, + {"LaunchArgumentIndie", New SetupEntry(0)}, + {"LaunchArgumentVisible", New SetupEntry(5, Source:=SetupSource.Registry)}, + {"LaunchArgumentPriority", New SetupEntry(1, Source:=SetupSource.Registry)}, + {"LaunchArgumentWindowWidth", New SetupEntry(854)}, + {"LaunchArgumentWindowHeight", New SetupEntry(480)}, + {"LaunchArgumentWindowType", New SetupEntry(1)}, + {"LaunchArgumentRam", New SetupEntry(False, Source:=SetupSource.Registry)}, + {"LaunchAdvanceJvm", New SetupEntry("-XX:+UseG1GC -XX:-UseAdaptiveSizePolicy -XX:-OmitStackTraceInFastThrow -Dfml.ignoreInvalidMinecraftCertificates=True -Dfml.ignorePatchDiscrepancies=True -Dlog4j2.formatMsgNoLookups=true")}, + {"LaunchAdvanceGame", New SetupEntry("")}, + {"LaunchAdvanceRun", New SetupEntry("")}, + {"LaunchAdvanceRunWait", New SetupEntry(True)}, + {"LaunchAdvanceAssets", New SetupEntry(False)}, + {"LaunchAdvanceJava", New SetupEntry(False)}, + {"LaunchRamType", New SetupEntry(0)}, + {"LaunchRamCustom", New SetupEntry(15)}, + {"LinkEula", New SetupEntry(False, Source:=SetupSource.Registry)}, + {"LinkName", New SetupEntry("", Source:=SetupSource.Registry)}, + {"LinkHiperCertLast", New SetupEntry("", Source:=SetupSource.Registry)}, + {"LinkHiperCertTime", New SetupEntry("", Source:=SetupSource.Registry)}, + {"LinkHiperCertWarn", New SetupEntry(True, Source:=SetupSource.Registry)}, + {"LinkIoiVersion", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)}, + {"ToolHelpChinese", New SetupEntry(True, Source:=SetupSource.Registry)}, + {"ToolDownloadThread", New SetupEntry(63, Source:=SetupSource.Registry)}, + {"ToolDownloadSpeed", New SetupEntry(42, Source:=SetupSource.Registry)}, + {"ToolDownloadVersion", New SetupEntry(0, Source:=SetupSource.Registry)}, + {"ToolDownloadTranslate", New SetupEntry(0, Source:=SetupSource.Registry)}, + {"ToolDownloadKeepModpack", New SetupEntry(False, Source:=SetupSource.Registry)}, + {"ToolDownloadIgnoreQuilt", New SetupEntry(True, Source:=SetupSource.Registry)}, + {"ToolDownloadCert", New SetupEntry(True, Source:=SetupSource.Registry)}, + {"ToolUpdateAlpha", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)}, + {"ToolUpdateRelease", New SetupEntry(False, Source:=SetupSource.Registry)}, + {"ToolUpdateSnapshot", New SetupEntry(False, Source:=SetupSource.Registry)}, + {"ToolUpdateReleaseLast", New SetupEntry("", Source:=SetupSource.Registry)}, + {"ToolUpdateSnapshotLast", New SetupEntry("", Source:=SetupSource.Registry)}, + {"UiLauncherTransparent", New SetupEntry(600)}, '避免与 PCL1 设置冲突(UiLauncherOpacity) + {"UiLauncherHue", New SetupEntry(180)}, + {"UiLauncherSat", New SetupEntry(80)}, + {"UiLauncherDelta", New SetupEntry(90)}, + {"UiLauncherLight", New SetupEntry(20)}, + {"UiLauncherTheme", New SetupEntry(0)}, + {"UiLauncherThemeGold", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, + {"UiLauncherThemeHide", New SetupEntry("0|1|2|3|4", Source:=SetupSource.Registry, Encoded:=True)}, + {"UiLauncherThemeHide2", New SetupEntry("0|1|2|3|4", Source:=SetupSource.Registry, Encoded:=True)}, + {"UiLauncherLogo", New SetupEntry(True)}, + {"UiLauncherEmail", New SetupEntry(False)}, + {"UiBackgroundColorful", New SetupEntry(True)}, + {"UiBackgroundOpacity", New SetupEntry(1000)}, + {"UiBackgroundBlur", New SetupEntry(0)}, + {"UiBackgroundSuit", New SetupEntry(0)}, + {"UiCustomType", New SetupEntry(0)}, + {"UiCustomPreset", New SetupEntry(0)}, + {"UiCustomNet", New SetupEntry("")}, + {"UiLogoType", New SetupEntry(1)}, + {"UiLogoText", New SetupEntry("")}, + {"UiLogoLeft", New SetupEntry(False)}, + {"UiMusicVolume", New SetupEntry(500)}, + {"UiMusicStop", New SetupEntry(False)}, + {"UiMusicStart", New SetupEntry(False)}, + {"UiMusicRandom", New SetupEntry(True)}, + {"UiMusicAuto", New SetupEntry(True)}, + {"UiHiddenPageDownload", New SetupEntry(False)}, + {"UiHiddenPageLink", New SetupEntry(False)}, + {"UiHiddenPageSetup", New SetupEntry(False)}, + {"UiHiddenPageOther", New SetupEntry(False)}, + {"UiHiddenFunctionSelect", New SetupEntry(False)}, + {"UiHiddenFunctionHidden", New SetupEntry(False)}, + {"UiHiddenSetupLaunch", New SetupEntry(False)}, + {"UiHiddenSetupUi", New SetupEntry(False)}, + {"UiHiddenSetupLink", New SetupEntry(False)}, + {"UiHiddenSetupSystem", New SetupEntry(False)}, + {"UiHiddenOtherHelp", New SetupEntry(False)}, + {"UiHiddenOtherFeedback", New SetupEntry(False)}, + {"UiHiddenOtherVote", New SetupEntry(False)}, + {"UiHiddenOtherAbout", New SetupEntry(False)}, + {"UiHiddenOtherTest", New SetupEntry(False)}, + {"VersionAdvanceJvm", New SetupEntry("", Source:=SetupSource.Version)}, + {"VersionAdvanceGame", New SetupEntry("", Source:=SetupSource.Version)}, + {"VersionAdvanceAssets", New SetupEntry(0, Source:=SetupSource.Version)}, + {"VersionAdvanceAssetsV2", New SetupEntry(False, Source:=SetupSource.Version)}, + {"VersionAdvanceJava", New SetupEntry(False, Source:=SetupSource.Version)}, + {"VersionAdvanceRun", New SetupEntry("", Source:=SetupSource.Version)}, + {"VersionAdvanceRunWait", New SetupEntry(True, Source:=SetupSource.Version)}, + {"VersionRamType", New SetupEntry(2, Source:=SetupSource.Version)}, + {"VersionRamCustom", New SetupEntry(15, Source:=SetupSource.Version)}, + {"VersionArgumentTitle", New SetupEntry("", Source:=SetupSource.Version)}, + {"VersionArgumentInfo", New SetupEntry("", Source:=SetupSource.Version)}, + {"VersionArgumentIndie", New SetupEntry(-1, Source:=SetupSource.Version)}, + {"VersionArgumentJavaSelect", New SetupEntry("使用全局设置", Source:=SetupSource.Version)}, + {"VersionServerEnter", New SetupEntry("", Source:=SetupSource.Version)}, + {"VersionServerLogin", New SetupEntry(0, Source:=SetupSource.Version)}, + {"VersionServerNide", New SetupEntry("", Source:=SetupSource.Version)}, + {"VersionServerAuthRegister", New SetupEntry("", Source:=SetupSource.Version)}, + {"VersionServerAuthName", New SetupEntry("", Source:=SetupSource.Version)}, + {"VersionServerAuthServer", New SetupEntry("", Source:=SetupSource.Version)} + } + +#Region "基础" + + Private Enum SetupSource + Normal + Registry + Version + End Enum + Private Class SetupEntry + + Public Encoded As Boolean + Public DefaultValue + Public DefaultValueEncoded + Public Value + Public Source As SetupSource + + '加载状态:0/未读取 1/已读取未处理 2/已处理 + Public State As Byte = 0 + Public Type + + Public Sub New(Value, Optional Source = SetupSource.Normal, Optional Encoded = False) + Me.DefaultValue = Value + Me.DefaultValueEncoded = If(Encoded, SecretEncrypt(Value, "PCL" & UniqueAddress), Value) + Me.Encoded = Encoded + Me.Value = Value + Me.Source = Source + Type = If(Value, New Object).GetType + End Sub + + End Class + + ''' + ''' 改变某个设置项的值。 + ''' + Public Sub [Set](Key As String, Value As Object, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing) + [Set](Key, Value, SetupDict(Key), ForceReload, Version) + End Sub + Private Sub [Set](Key As String, Value As Object, E As SetupEntry, ForceReload As Boolean, Version As McVersion) + Try + + Value = CTypeDynamic(Value, E.Type) + If E.State = 2 Then + '如果已应用,且值相同,则无需再次更改 + If E.Value = Value AndAlso Not ForceReload Then Exit Sub + Else + '如果未应用,则直接更改并应用 + If E.Source <> SetupSource.Version Then E.State = 2 + End If + '设置新值 + E.Value = Value + '写入值 + If E.Encoded Then + Try + If Value Is Nothing Then Value = "" + Value = SecretEncrypt(Value, "PCL" & UniqueAddress) + Catch ex As Exception + Log(ex, "加密设置失败:" & Key, LogLevel.Developer) + End Try + End If + Select Case E.Source + Case SetupSource.Normal + WriteIni("Setup", Key, Value) + Case SetupSource.Registry + WriteReg(Key, Value) + Case SetupSource.Version + If Version Is Nothing Then + Throw New Exception("更改版本设置 " & Key & " 时未提供目标版本") + Else + WriteIni(Version.Path & "PCL\Setup.ini", Key, Value) + End If + End Select + '应用 + '例如 VersionServerLogin 要求在设置之后再引发事件 + Dim Method As Reflection.MethodInfo = GetType(ModSetup).GetMethod(Key) + If Method IsNot Nothing Then Method.Invoke(Me, {Value}) + + Catch ex As Exception + Log(ex, "设置设置项时出错(" & Key & ", " & Value & ")", LogLevel.Feedback) + End Try + End Sub + + ''' + ''' 应用某个设置项的值。 + ''' + Public Function Load(Key As String, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing) + Return Load(Key, SetupDict(Key), ForceReload, Version) + End Function + Private Function Load(Key As String, E As SetupEntry, ForceReload As Boolean, Version As McVersion) + '如果已经应用过,则什么也不干 + If E.State = 2 AndAlso Not ForceReload Then Return E.Value + '读取,应用并设置状态 + Read(Key, E, Version) + If E.Source <> SetupSource.Version Then E.State = 2 + Dim Method As Reflection.MethodInfo = GetType(ModSetup).GetMethod(Key) + If Method IsNot Nothing Then Method.Invoke(Me, {E.Value}) + Return E.Value + End Function + + ''' + ''' 获取某个设置项的值。 + ''' + Public Function [Get](Key As String, Optional Version As McVersion = Nothing) + If Not SetupDict.ContainsKey(Key) Then Throw New KeyNotFoundException("未找到设置项:" & Key) With {.Source = Key} + Return [Get](Key, SetupDict(Key), Version) + End Function + Private Function [Get](Key As String, E As SetupEntry, Version As McVersion) + '获取强制值 + Dim Force As String = ForceValue(Key) + If Force IsNot Nothing Then + E.Value = CTypeDynamic(Force, E.Type) + E.State = 1 + End If + '如果尚未读取过,则读取 + If E.State = 0 Then + Read(Key, E, Version) + If E.Source <> SetupSource.Version Then E.State = 1 + End If + '返回现在的值 + Return E.Value + End Function + + ''' + ''' 初始化某个设置项的值。 + ''' + Public Sub Reset(Key As String, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing) + Dim E As SetupEntry = SetupDict(Key) + [Set](Key, E.DefaultValue, E, ForceReload, Version) + End Sub + + Private Sub Read(Key As String, ByRef E As SetupEntry, Version As McVersion) + Try + If Not E.State = 0 Then Exit Sub + Dim SourceValue As String '先用 String 储存,避免类型转换 + Select Case E.Source + Case SetupSource.Normal + SourceValue = ReadIni("Setup", Key, E.DefaultValueEncoded) + Case SetupSource.Registry + SourceValue = ReadReg(Key, E.DefaultValueEncoded) + Case Else 'SetupSource.Version + If Version Is Nothing Then + Throw New Exception("读取版本设置 " & Key & " 时未提供目标版本") + Else + SourceValue = ReadIni(Version.Path & "PCL\Setup.ini", Key, E.DefaultValueEncoded) + End If + End Select + If E.Encoded Then + If SourceValue.Equals(E.DefaultValueEncoded) Then + SourceValue = E.DefaultValue + Else + Try + SourceValue = SecretDecrypt(SourceValue, "PCL" & UniqueAddress) + Catch ex As Exception + Log(ex, "解密设置失败:" & Key, LogLevel.Developer) + SourceValue = E.DefaultValue + Setup.Set(Key, E.DefaultValue, True) + End Try + End If + End If + E.Value = CTypeDynamic(SourceValue, E.Type) + Catch ex As Exception + Log(ex, "读取设置失败:" & Key, LogLevel.Hint) + E.Value = CTypeDynamic(E.DefaultValue, E.Type) + End Try + End Sub + + '对部分设置强制赋值 + Private Function ForceValue(Key As String) As String +#If BETA Then + If Key = "UiLauncherTheme" Then Return "0" +#End If + If Key = "UiHiddenPageLink" Then Return True + If Key = "UiHiddenSetupLink" Then Return True + Return Nothing + End Function + +#End Region + +#Region "Launch" + + '切换选择 + Public Sub LaunchVersionSelect(Value As String) + Log("[Setup] 当前选择的 Minecraft 版本:" & Value) + WriteIni(PathMcFolder & "PCL.ini", "Version", If(IsNothing(McVersionCurrent), "", McVersionCurrent.Name)) + End Sub + Public Sub LaunchFolderSelect(Value As String) + Log("[Setup] 当前选择的 Minecraft 文件夹:" & Value.ToString.Replace("$", Path)) + PathMcFolder = Value.ToString.Replace("$", Path) + End Sub + + '游戏内存 + Public Sub LaunchRamType(Type As Integer) + If FrmSetupLaunch Is Nothing Then Exit Sub + FrmSetupLaunch.RamType(Type) + End Sub + + '离线皮肤 + Public Sub LaunchSkinType(Value As Integer) + RunInUi(Sub() + If Not IsNothing(FrmSetupLaunch) Then + Select Case Value + Case 0, 1, 2 '默认 + FrmSetupLaunch.PanSkinID.Visibility = Visibility.Collapsed + FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Collapsed + Case 3 '正版 + FrmSetupLaunch.PanSkinID.Visibility = Visibility.Visible + FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Collapsed + Case 4 '自定义 + FrmSetupLaunch.PanSkinID.Visibility = Visibility.Collapsed + FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Visible + End Select + FrmSetupLaunch.CardSkin.TriggerForceResize() + End If + PageLaunchLeft.SkinLegacy.Start() + End Sub) + End Sub + Public Sub LaunchSkinID(Value As String) + PageLaunchLeft.SkinLegacy.Start() + End Sub + +#End Region + +#Region "Tool" + + Public Sub ToolDownloadThread(Value As Integer) + NetTaskThreadLimit = Value + 1 + End Sub + Public Sub ToolDownloadCert(Value As Boolean) + Net.ServicePointManager.ServerCertificateValidationCallback = + If(Value, Nothing, New Net.Security.RemoteCertificateValidationCallback(Function() True)) + End Sub + Public Sub ToolDownloadSpeed(Value As Integer) + If Value <= 14 Then + NetTaskSpeedLimitHigh = (Value + 1) * 0.1 * 1024 * 1024L + ElseIf Value <= 31 Then + NetTaskSpeedLimitHigh = (Value - 11) * 0.5 * 1024 * 1024L + ElseIf Value <= 41 Then + NetTaskSpeedLimitHigh = (Value - 21) * 1024 * 1024L + Else + NetTaskSpeedLimitHigh = -1 + End If + End Sub + +#End Region + +#Region "UI" + + '启动器 + Public Sub UiLauncherTransparent(Value As Integer) + FrmMain.Opacity = Value / 1000 + 0.4 + End Sub +#If Not BETA Then + Public Sub UiLauncherTheme(Value As Integer) + ThemeRefresh(Value) + End Sub +#End If + Public Sub UiBackgroundColorful(Value As Boolean) + ThemeRefresh() + End Sub + + '背景图片 + Public Sub UiBackgroundOpacity(Value As Integer) + FrmMain.ImgBack.Opacity = Value / 1000 + End Sub + Public Sub UiBackgroundBlur(Value As Integer) + If Value = 0 Then + FrmMain.ImgBack.Effect = Nothing + Else + FrmMain.ImgBack.Effect = New Effects.BlurEffect With {.Radius = Value + 1} + End If + FrmMain.ImgBack.Margin = New Thickness(-(Value + 1) / 1.8) + End Sub + Public Sub UiBackgroundSuit(Value As Integer) + If IsNothing(FrmMain.ImgBack.Background) Then Exit Sub + Dim Width As Double = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width + Dim Height As Double = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height + If Value = 0 Then + '智能:当图片较小时平铺,较大时适应 + If Width < FrmMain.PanMain.ActualWidth / 2 AndAlso Height < FrmMain.PanMain.ActualHeight / 2 Then + Value = 4 '平铺 + Else + Value = 2 '适应 + End If + End If + CType(FrmMain.ImgBack.Background, ImageBrush).TileMode = TileMode.None + CType(FrmMain.ImgBack.Background, ImageBrush).Viewport = New Rect(0, 0, 1, 1) + CType(FrmMain.ImgBack.Background, ImageBrush).ViewportUnits = BrushMappingMode.RelativeToBoundingBox + Select Case Value + Case 1 '居中 + FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Center + FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Center + CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None + FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width + FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height + Case 2 '适应 + FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch + FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch + CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.UniformToFill + FrmMain.ImgBack.Width = Double.NaN + FrmMain.ImgBack.Height = Double.NaN + Case 3 '拉伸 + FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch + FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch + CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.Fill + FrmMain.ImgBack.Width = Double.NaN + FrmMain.ImgBack.Height = Double.NaN + Case 4 '平铺 + FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch + FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch + CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None + CType(FrmMain.ImgBack.Background, ImageBrush).TileMode = TileMode.Tile + CType(FrmMain.ImgBack.Background, ImageBrush).Viewport = New Rect(0, 0, CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width, CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height) + CType(FrmMain.ImgBack.Background, ImageBrush).ViewportUnits = BrushMappingMode.Absolute + FrmMain.ImgBack.Width = Double.NaN + FrmMain.ImgBack.Height = Double.NaN + Case 5 '左上 + FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Left + FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Top + CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None + FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width + FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height + Case 6 '右上 + FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Right + FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Top + CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None + FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width + FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height + Case 7 '左下 + FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Left + FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Bottom + CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None + FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width + FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height + Case 8 '右下 + FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Right + FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Bottom + CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None + FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width + FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height + End Select + End Sub + + '主页 + Public Sub UiCustomType(Value As Integer) + If FrmSetupUI Is Nothing Then Exit Sub + Select Case Value + Case 0 '无 + FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed + FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed + FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed + FrmSetupUI.HintCustom.Visibility = Visibility.Collapsed + Case 1 '本地 + FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed + FrmSetupUI.PanCustomLocal.Visibility = Visibility.Visible + FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed + FrmSetupUI.HintCustom.Visibility = Visibility.Visible + FrmSetupUI.HintCustom.Text = $"从 PCL 文件夹下的 Custom.xaml 读取主页内容。{vbCrLf}你可以手动编辑该文件,向主页添加文本、图片、常用网站、快捷启动等功能。" + FrmSetupUI.HintCustom.EventType = "" + FrmSetupUI.HintCustom.EventData = "" + Case 2 '联网 + FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed + FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed + FrmSetupUI.PanCustomNet.Visibility = Visibility.Visible + FrmSetupUI.HintCustom.Visibility = Visibility.Visible + FrmSetupUI.HintCustom.Text = $"从指定网址联网获取主页内容。服主也可以用于动态更新服务器公告。{vbCrLf}如果你制作了稳定运行的联网主页,可以点击这条提示投稿,若合格即可加入预设!" + FrmSetupUI.HintCustom.EventType = "打开网页" + FrmSetupUI.HintCustom.EventData = "https://github.com/Hex-Dragon/PCL2/discussions/2528" + Case 3 '预设 + FrmSetupUI.PanCustomPreset.Visibility = Visibility.Visible + FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed + FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed + FrmSetupUI.HintCustom.Visibility = Visibility.Collapsed + End Select + FrmSetupUI.CardCustom.TriggerForceResize() + End Sub + + '顶部栏 + Public Sub UiLogoType(Value As Integer) + Select Case Value + Case 0 '无 + FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed + FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed + FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed + If Not IsNothing(FrmSetupUI) Then + FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Visible + FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed + FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed + End If + Case 1 '默认 + FrmMain.ShapeTitleLogo.Visibility = Visibility.Visible + FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed + FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed + If Not IsNothing(FrmSetupUI) Then + FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed + FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed + FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed + End If + Case 2 '文本 + FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed + FrmMain.LabTitleLogo.Visibility = Visibility.Visible + FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed + If Not IsNothing(FrmSetupUI) Then + FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed + FrmSetupUI.PanLogoText.Visibility = Visibility.Visible + FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed + End If + Setup.Load("UiLogoText", True) + Case 3 '图片 + FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed + FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed + FrmMain.ImageTitleLogo.Visibility = Visibility.Visible + If Not IsNothing(FrmSetupUI) Then + FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed + FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed + FrmSetupUI.PanLogoChange.Visibility = Visibility.Visible + End If + Try + FrmMain.ImageTitleLogo.Source = New MyBitmap(Path & "PCL\Logo.png") + Catch ex As Exception + FrmMain.ImageTitleLogo.Source = Nothing + Log(ex, "显示标题栏图片失败", LogLevel.Msgbox) + End Try + End Select + Setup.Load("UiLogoLeft", True) + If Not IsNothing(FrmSetupUI) Then FrmSetupUI.CardLogo.TriggerForceResize() + End Sub + Public Sub UiLogoText(Value As String) + FrmMain.LabTitleLogo.Text = Value + End Sub + Public Sub UiLogoLeft(Value As Boolean) + FrmMain.PanTitleMain.ColumnDefinitions(0).Width = New GridLength(If(Value AndAlso (Setup.Get("UiLogoType") = 0), 0, 1), GridUnitType.Star) + End Sub + + '功能隐藏 + Public Sub UiHiddenPageLink(Value As Boolean) + PageSetupUI.HiddenRefresh() + End Sub + Public Sub UiHiddenPageDownload(Value As Boolean) + PageSetupUI.HiddenRefresh() + End Sub + Public Sub UiHiddenPageSetup(Value As Boolean) + PageSetupUI.HiddenRefresh() + End Sub + Public Sub UiHiddenPageOther(Value As Boolean) + PageSetupUI.HiddenRefresh() + End Sub + Public Sub UiHiddenFunctionSelect(Value As Boolean) + PageSetupUI.HiddenRefresh() + End Sub + Public Sub UiHiddenFunctionHidden(Value As Boolean) + PageSetupUI.HiddenRefresh() + End Sub + Public Sub UiHiddenSetupLaunch(Value As Boolean) + PageSetupUI.HiddenRefresh() + End Sub + Public Sub UiHiddenSetupUi(Value As Boolean) + PageSetupUI.HiddenRefresh() + End Sub + Public Sub UiHiddenSetupLink(Value As Boolean) + PageSetupUI.HiddenRefresh() + End Sub + Public Sub UiHiddenSetupSystem(Value As Boolean) + PageSetupUI.HiddenRefresh() + End Sub + Public Sub UiHiddenOtherHelp(Value As Boolean) + PageSetupUI.HiddenRefresh() + End Sub + Public Sub UiHiddenOtherFeedback(Value As Boolean) + PageSetupUI.HiddenRefresh() + End Sub + Public Sub UiHiddenOtherVote(Value As Boolean) + PageSetupUI.HiddenRefresh() + End Sub + Public Sub UiHiddenOtherAbout(Value As Boolean) + PageSetupUI.HiddenRefresh() + End Sub + Public Sub UiHiddenOtherTest(Value As Boolean) + PageSetupUI.HiddenRefresh() + End Sub + + +#End Region + +#Region "System" + + '调试选项 + Public Sub SystemDebugMode(Value As Boolean) + ModeDebug = Value + End Sub + Public Sub SystemDebugAnim(Value As Integer) + AniSpeed = If(Value >= 30, 200, MathClamp(Value * 0.1 + 0.1, 0.1, 3)) + End Sub + +#End Region + +#Region "Version" + + '游戏内存 + Public Sub VersionRamType(Type As Integer) + If FrmVersionSetup Is Nothing Then Exit Sub + FrmVersionSetup.RamType(Type) + End Sub + + '服务器 + Public Sub VersionServerLogin(Type As Integer) + If FrmVersionSetup Is Nothing Then Exit Sub + '为第三方登录清空缓存以更新描述 + WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") + If PageVersionLeft.Version Is Nothing Then Exit Sub + PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load() + LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\") + End Sub + +#End Region + +End Class diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml index 8e9be7c..a1957fe 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml @@ -81,7 +81,7 @@ - + @@ -115,7 +115,7 @@ - + @@ -125,11 +125,10 @@ - - - + + + - @@ -138,7 +137,7 @@ + ToolTip="Forge 1.12.2 等个别版本存在 Bug,会导致高度设定无效" ToolTipService.Placement="Right" ToolTipService.HorizontalOffset="5"> @@ -175,11 +174,16 @@ + + + @@ -229,7 +233,7 @@ - diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb index 20e888e..99b962a 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb @@ -38,6 +38,7 @@ ComboArgumentWindowType.SelectedIndex = Setup.Get("LaunchArgumentWindowType") TextArgumentWindowWidth.Text = Setup.Get("LaunchArgumentWindowWidth") TextArgumentWindowHeight.Text = Setup.Get("LaunchArgumentWindowHeight") + CheckArgumentRam.Checked = Setup.Get("LaunchArgumentRam") RefreshJavaComboBox() '游戏内存 @@ -71,6 +72,7 @@ Setup.Reset("LaunchArgumentWindowWidth") Setup.Reset("LaunchArgumentWindowHeight") Setup.Reset("LaunchArgumentPriority") + Setup.Reset("LaunchArgumentRam") Setup.Reset("LaunchRamType") Setup.Reset("LaunchRamCustom") Setup.Reset("LaunchSkinType") @@ -108,7 +110,7 @@ Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboArgumentIndie.SelectionChanged, ComboArgumentVisibie.SelectionChanged, ComboArgumentWindowType.SelectionChanged, ComboArgumentPriority.SelectionChanged If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex) End Sub - Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckAdvanceAssets.Change, CheckAdvanceJava.Change, CheckAdvanceRunWait.Change + Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckAdvanceAssets.Change, CheckAdvanceJava.Change, CheckAdvanceRunWait.Change, CheckArgumentRam.Change If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked) End Sub @@ -352,19 +354,19 @@ '可安装 Mod 的版本 Dim ModDir As New DirectoryInfo(Version.PathIndie & "mods\") Dim ModCount As Integer = If(ModDir.Exists, ModDir.GetFiles.Length, 0) - RamMininum = 0.4 + ModCount / 150 - RamTarget1 = 1.5 + ModCount / 100 - RamTarget2 = 3 + ModCount / 60 - RamTarget3 = 6 + ModCount / 30 + RamMininum = 0.5 + ModCount / 150 + RamTarget1 = 1.5 + ModCount / 90 + RamTarget2 = 2.7 + ModCount / 50 + RamTarget3 = 4.5 + ModCount / 25 ElseIf Version IsNot Nothing AndAlso Version.Version.HasOptiFine Then 'OptiFine 版本 - RamMininum = 0.3 + RamMininum = 0.5 RamTarget1 = 1.5 RamTarget2 = 3 - RamTarget3 = 6 + RamTarget3 = 5 Else '普通版本 - RamMininum = 0.3 + RamMininum = 0.5 RamTarget1 = 1.5 RamTarget2 = 2.5 RamTarget3 = 4 @@ -372,27 +374,23 @@ Dim RamDelta As Double '预分配内存,阶段一,0 ~ T1,100% RamDelta = RamTarget1 - RamAvailable = Math.Max(0, RamAvailable - 0.1) - RamGive += Math.Min(RamAvailable * 1, RamDelta) - RamAvailable -= RamDelta / 1 + 0.1 + RamGive += Math.Min(RamAvailable, RamDelta) + RamAvailable -= RamDelta If RamAvailable < 0.1 Then GoTo PreFin - '预分配内存,阶段二,T1 ~ T2,80% + '预分配内存,阶段二,T1 ~ T2,70% RamDelta = RamTarget2 - RamTarget1 - RamAvailable = Math.Max(0, RamAvailable - 0.1) - RamGive += Math.Min(RamAvailable * 0.8, RamDelta) - RamAvailable -= RamDelta / 0.8 + 0.1 + RamGive += Math.Min(RamAvailable * 0.7, RamDelta) + RamAvailable -= RamDelta / 0.7 If RamAvailable < 0.1 Then GoTo PreFin - '预分配内存,阶段三,T2 ~ T3,60% + '预分配内存,阶段三,T2 ~ T3,40% RamDelta = RamTarget3 - RamTarget2 - RamAvailable = Math.Max(0, RamAvailable - 0.2) - RamGive += Math.Min(RamAvailable * 0.6, RamDelta) - RamAvailable -= RamDelta / 0.6 + 0.2 - If RamAvailable < 0.1 Then GoTo PreFin - '预分配内存,阶段四,T3 ~ T3 * 2,40% - RamDelta = RamTarget3 - RamAvailable = Math.Max(0, RamAvailable - 0.3) RamGive += Math.Min(RamAvailable * 0.4, RamDelta) - RamAvailable -= RamDelta / 0.4 + 0.3 + RamAvailable -= RamDelta / 0.4 + If RamAvailable < 0.1 Then GoTo PreFin + '预分配内存,阶段四,T3 ~ T3 * 2,15% + RamDelta = RamTarget3 + RamGive += Math.Min(RamAvailable * 0.15, RamDelta) + RamAvailable -= RamDelta / 0.15 If RamAvailable < 0.1 Then GoTo PreFin PreFin: '不低于最低值 @@ -444,7 +442,7 @@ PreFin: Log(ex, "更新设置 Java 下拉框失败", LogLevel.Feedback) End Try '更新选择项 - If SelectedItem Is Nothing AndAlso JavaList.Count > 0 Then SelectedItem = ComboArgumentJava.Items(0) '选中 “自动选择” + If SelectedItem Is Nothing AndAlso JavaList.Any Then SelectedItem = ComboArgumentJava.Items(0) '选中 “自动选择” ComboArgumentJava.SelectedItem = SelectedItem '结束处理 If SelectedItem Is Nothing Then @@ -515,15 +513,16 @@ PreFin: Hint("正在搜索 Java,请稍候!", HintType.Critical) Exit Sub End If - RunInThread(Sub() - Hint("正在搜索 Java!") - JavaSearchLoader.WaitForExit(IsForceRestart:=True) - If Not JavaList.Any() Then - Hint("未找到可用的 Java!", HintType.Critical) - Else - Hint("已找到 " & JavaList.Count & " 个 Java,请检查下拉框查看列表!", HintType.Finish) - End If - End Sub) + RunInThread( + Sub() + Hint("正在搜索 Java!") + JavaSearchLoader.WaitForExit(IsForceRestart:=True) + If Not JavaList.Any() Then + Hint("未找到可用的 Java!", HintType.Critical) + Else + Hint("已找到 " & JavaList.Count & " 个 Java,请检查下拉框查看列表!", HintType.Finish) + End If + End Sub) End Sub #End Region @@ -548,12 +547,24 @@ PreFin: If AniControlEnabled <> 0 Then Exit Sub If ComboArgumentVisibie.SelectedIndex = 0 Then If MyMsgBox("若在游戏启动后立即关闭启动器,崩溃检测、更改游戏标题等功能将失效。" & vbCrLf & - "如果想保留这些功能,可以选择让启动器在游戏启动后隐藏,游戏退出后自动关闭。", "提示", "继续", "取消") = 2 Then + "如果想保留这些功能,可以选择让启动器在游戏启动后隐藏,游戏退出后自动关闭。", "提醒", "继续", "取消") = 2 Then ComboArgumentVisibie.SelectedItem = e.RemovedItems(0) End If End If End Sub + '开启自动内存优化的警告 + Private Sub CheckArgumentRam_Change() Handles CheckArgumentRam.Change + If AniControlEnabled <> 0 Then Exit Sub + If Not CheckArgumentRam.Checked Then Return + If MyMsgBox("内存优化耗时较长,这会拖慢游戏的启动过程,建议仅在电脑内存不充裕时开启此选项。" & vbCrLf & + "如果你在使用机械硬盘,这还可能会导致一小段时间的严重卡顿。" & + If(IsAdmin(), "", $"{vbCrLf}{vbCrLf}每次启动游戏,PCL 都需要申请管理员权限以进行内存优化。{vbCrLf}若想自动授予权限,可以右键 PCL,打开 属性 → 兼容性 → 以管理员身份运行此程序。"), + "提醒", "确定", "取消") = 2 Then + CheckArgumentRam.Checked = False + End If + End Sub + #End Region #Region "高级设置" diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLink.xaml b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLink.xaml index a4798ad..4780c9d 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLink.xaml +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLink.xaml @@ -28,7 +28,6 @@ - diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml index f235841..325c1f6 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml @@ -58,7 +58,7 @@ ToolTip="下载 Mod 时,若该 Mod 支持 Forge 和 Fabric,则显示为支持任意 Mod 加载器。 例如,开启时 JEI 显示支持全版本,关闭后 JEI 就会显示仅支持 Forge / Fabric 全版本。" /> + ToolTip="验证证书会提高安全性,但疑似有概率导致正版登录失败(#3018)。 如果在正版登录时因为 [根据验证过程,远程证书无效] 失败,可以尝试关闭此项。" /> diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb index 14dbfef..5156d1f 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb @@ -126,23 +126,21 @@ '滑动条 Private Sub SliderLoad() - SliderDownloadThread.GetHintText = Function(Value As Integer) - Return Value + 1 - End Function - SliderDownloadSpeed.GetHintText = Function(Value As Integer) - If Value <= 14 Then - Return (Value + 1) * 0.1 & " M/s" - ElseIf Value <= 31 Then - Return (Value - 11) * 0.5 & " M/s" - ElseIf Value <= 41 Then - Return (Value - 21) & " M/s" - Else - Return "无限制" - End If - End Function - SliderDebugAnim.GetHintText = Function(Value As Integer) - Return If(Value > 29, "关闭", (Value / 10 + 0.1) & "x") - End Function + SliderDownloadThread.GetHintText = Function(v) v + 1 + SliderDownloadSpeed.GetHintText = + Function(v) + Select Case v + Case Is <= 14 + Return (v + 1) * 0.1 & " M/s" + Case Is <= 31 + Return (v - 11) * 0.5 & " M/s" + Case Is <= 41 + Return (v - 21) & " M/s" + Case Else + Return "无限制" + End Select + End Function + SliderDebugAnim.GetHintText = Function(v) If(v > 29, "关闭", (v / 10 + 0.1) & "x") End Sub Private Sub SliderDownloadThread_PreviewChange(sender As Object, e As RouteEventArgs) Handles SliderDownloadThread.PreviewChange If SliderDownloadThread.Value < 100 Then Exit Sub @@ -158,7 +156,7 @@ PageOtherAbout.CopyUniqueAddress() End Sub Private Sub BtnSystemUnlock_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnSystemUnlock.Click - PageOtherAbout.DonateCodeInput() + DonateCodeInput() End Sub '调试模式 diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml new file mode 100644 index 0000000..7f6436b --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml @@ -0,0 +1,295 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb new file mode 100644 index 0000000..181eb95 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb @@ -0,0 +1,705 @@ +Public Class PageSetupUI + + Public Shadows IsLoaded As Boolean = False + + Private Sub PageSetupUI_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded + + '重复加载部分 + PanBack.ScrollToHome() + ThemeCheckAll(True) + + If ThemeDontClick <> 0 Then + Dim NewText As String + Select Case ThemeDontClick + Case 1 + NewText = "眼瞎白" + Case 2 + NewText = "真·滑稽彩" + Case Else + NewText = "???" + End Select + For Each Control In PanLauncherTheme.Children + If (TypeOf Control Is MyRadioBox) AndAlso CType(Control, MyRadioBox).IsEnabled Then + CType(Control, MyRadioBox).Text = NewText + End If + Next + End If + + '非重复加载部分 + If IsLoaded Then Exit Sub + IsLoaded = True + + AniControlEnabled += 1 + SliderLoad() + Reload() + AniControlEnabled -= 1 + +#If BETA Then + PanLauncherHide.Visibility = Visibility.Visible +#End If + + '设置解锁 + If Not RadioLauncherTheme8.IsEnabled Then LabLauncherTheme8Copy.ToolTip = "累积赞助达到 ¥23.33 后,在爱发电私信发送【解锁码】以解锁。" & vbCrLf & "右键打开赞助页面,如果觉得 PCL 做得还不错就支持一下吧 =w=!" + RadioLauncherTheme8.ToolTip = "累积赞助达到 ¥23.33 后,在爱发电私信发送【解锁码】以解锁" + If Not RadioLauncherTheme9.IsEnabled Then LabLauncherTheme9Copy.ToolTip = "· 反馈一个 Bug,在 Issue 标记为 [已完成] 后回复 Issue 要求解锁(右键打开反馈页面)" & vbCrLf & "· 向帮助库提交 Pull Request,在龙猫合并后解锁" + RadioLauncherTheme9.ToolTip = "· 反馈一个 Bug,在反馈标记为 [完成] 后回复 Issue 要求解锁" & vbCrLf & "· 向帮助库提交 Pull Request,在龙猫合并后解锁" + '极客蓝的处理在 ThemeCheck 中 + + End Sub + Public Sub Reload() + Try + + '启动器 + SliderLauncherOpacity.Value = Setup.Get("UiLauncherTransparent") + SliderLauncherHue.Value = Setup.Get("UiLauncherHue") + SliderLauncherSat.Value = Setup.Get("UiLauncherSat") + SliderLauncherDelta.Value = Setup.Get("UiLauncherDelta") + SliderLauncherLight.Value = Setup.Get("UiLauncherLight") + If Setup.Get("UiLauncherTheme") <= 14 Then CType(FindName("RadioLauncherTheme" & Setup.Get("UiLauncherTheme")), MyRadioBox).Checked = True + CheckLauncherLogo.Checked = Setup.Get("UiLauncherLogo") + CheckLauncherEmail.Checked = Setup.Get("UiLauncherEmail") + + '背景图片 + SliderBackgroundOpacity.Value = Setup.Get("UiBackgroundOpacity") + SliderBackgroundBlur.Value = Setup.Get("UiBackgroundBlur") + ComboBackgroundSuit.SelectedIndex = Setup.Get("UiBackgroundSuit") + CheckBackgroundColorful.Checked = Setup.Get("UiBackgroundColorful") + BackgroundRefresh(False, False) + + '标题栏 + CType(FindName("RadioLogoType" & Setup.Get("UiLogoType")), MyRadioBox).Checked = True + CheckLogoLeft.Visibility = If(RadioLogoType0.Checked, Visibility.Visible, Visibility.Collapsed) + PanLogoText.Visibility = If(RadioLogoType2.Checked, Visibility.Visible, Visibility.Collapsed) + PanLogoChange.Visibility = If(RadioLogoType3.Checked, Visibility.Visible, Visibility.Collapsed) + TextLogoText.Text = Setup.Get("UiLogoText") + CheckLogoLeft.Checked = Setup.Get("UiLogoLeft") + + '背景音乐 + CheckMusicRandom.Checked = Setup.Get("UiMusicRandom") + CheckMusicAuto.Checked = Setup.Get("UiMusicAuto") + CheckMusicStop.Checked = Setup.Get("UiMusicStop") + CheckMusicStart.Checked = Setup.Get("UiMusicStart") + SliderMusicVolume.Value = Setup.Get("UiMusicVolume") + MusicRefreshUI() + + '主页 + ComboCustomPreset.SelectedIndex = Setup.Get("UiCustomPreset") + CType(FindName("RadioCustomType" & Setup.Load("UiCustomType")), MyRadioBox).Checked = True + TextCustomNet.Text = Setup.Get("UiCustomNet") + + '功能隐藏 + CheckHiddenPageDownload.Checked = Setup.Get("UiHiddenPageDownload") + CheckHiddenPageLink.Checked = Setup.Get("UiHiddenPageLink") + CheckHiddenPageSetup.Checked = Setup.Get("UiHiddenPageSetup") + CheckHiddenPageOther.Checked = Setup.Get("UiHiddenPageOther") + CheckHiddenFunctionSelect.Checked = Setup.Get("UiHiddenFunctionSelect") + CheckHiddenFunctionHidden.Checked = Setup.Get("UiHiddenFunctionHidden") + CheckHiddenSetupLaunch.Checked = Setup.Get("UiHiddenSetupLaunch") + CheckHiddenSetupUI.Checked = Setup.Get("UiHiddenSetupUi") + CheckHiddenSetupLink.Checked = Setup.Get("UiHiddenSetupLink") + CheckHiddenSetupSystem.Checked = Setup.Get("UiHiddenSetupSystem") + CheckHiddenOtherAbout.Checked = Setup.Get("UiHiddenOtherAbout") + CheckHiddenOtherFeedback.Checked = Setup.Get("UiHiddenOtherFeedback") + CheckHiddenOtherVote.Checked = Setup.Get("UiHiddenOtherVote") + CheckHiddenOtherHelp.Checked = Setup.Get("UiHiddenOtherHelp") + CheckHiddenOtherTest.Checked = Setup.Get("UiHiddenOtherTest") + + Catch ex As NullReferenceException + Log(ex, "个性化设置项存在异常,已被自动重置", LogLevel.Msgbox) + Reset() + Catch ex As Exception + Log(ex, "重载个性化设置时出错", LogLevel.Feedback) + End Try + End Sub + + '初始化 + Public Sub Reset() + Try + Setup.Reset("UiLauncherTransparent") + Setup.Reset("UiLauncherTheme") + Setup.Reset("UiLauncherLogo") + Setup.Reset("UiLauncherHue") + Setup.Reset("UiLauncherSat") + Setup.Reset("UiLauncherDelta") + Setup.Reset("UiLauncherLight") + Setup.Reset("UiLauncherEmail") + Setup.Reset("UiBackgroundColorful") + Setup.Reset("UiBackgroundOpacity") + Setup.Reset("UiBackgroundBlur") + Setup.Reset("UiBackgroundSuit") + Setup.Reset("UiLogoType") + Setup.Reset("UiLogoText") + Setup.Reset("UiLogoLeft") + Setup.Reset("UiMusicVolume") + Setup.Reset("UiMusicStop") + Setup.Reset("UiMusicStart") + Setup.Reset("UiMusicRandom") + Setup.Reset("UiMusicAuto") + Setup.Reset("UiCustomType") + Setup.Reset("UiCustomPreset") + Setup.Reset("UiCustomNet") + Setup.Reset("UiHiddenPageDownload") + Setup.Reset("UiHiddenPageLink") + Setup.Reset("UiHiddenPageSetup") + Setup.Reset("UiHiddenPageOther") + Setup.Reset("UiHiddenFunctionSelect") + Setup.Reset("UiHiddenFunctionHidden") + Setup.Reset("UiHiddenSetupLaunch") + Setup.Reset("UiHiddenSetupUi") + Setup.Reset("UiHiddenSetupLink") + Setup.Reset("UiHiddenSetupSystem") + Setup.Reset("UiHiddenOtherAbout") + Setup.Reset("UiHiddenOtherFeedback") + Setup.Reset("UiHiddenOtherVote") + Setup.Reset("UiHiddenOtherHelp") + Setup.Reset("UiHiddenOtherTest") + + Log("[Setup] 已初始化个性化设置!") + Hint("已初始化个性化设置", HintType.Finish, False) + Catch ex As Exception + Log(ex, "初始化个性化设置失败", LogLevel.Msgbox) + End Try + + Reload() + End Sub + + '将控件改变路由到设置改变 + Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderBackgroundOpacity.Change, SliderBackgroundBlur.Change, SliderLauncherOpacity.Change, SliderMusicVolume.Change, SliderLauncherHue.Change, SliderLauncherLight.Change, SliderLauncherSat.Change, SliderLauncherDelta.Change + If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value) + End Sub + Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboBackgroundSuit.SelectionChanged, ComboCustomPreset.SelectionChanged + If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex) + End Sub + Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckMusicStop.Change, CheckMusicRandom.Change, CheckMusicAuto.Change, CheckBackgroundColorful.Change, CheckLogoLeft.Change, CheckLauncherLogo.Change, CheckHiddenFunctionHidden.Change, CheckHiddenFunctionSelect.Change, CheckHiddenPageDownload.Change, CheckHiddenPageLink.Change, CheckHiddenPageOther.Change, CheckHiddenPageSetup.Change, CheckHiddenSetupLaunch.Change, CheckHiddenSetupSystem.Change, CheckHiddenSetupLink.Change, CheckHiddenSetupUI.Change, CheckHiddenOtherAbout.Change, CheckHiddenOtherFeedback.Change, CheckHiddenOtherVote.Change, CheckHiddenOtherHelp.Change, CheckHiddenOtherTest.Change, CheckMusicStart.Change, CheckLauncherEmail.Change + If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked) + End Sub + Private Shared Sub TextBoxChange(sender As MyTextBox, e As Object) Handles TextLogoText.ValidatedTextChanged, TextCustomNet.ValidatedTextChanged + If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Text) + End Sub + Private Shared Sub RadioBoxChange(sender As MyRadioBox, e As Object) Handles RadioLogoType0.Check, RadioLogoType1.Check, RadioLogoType2.Check, RadioLogoType3.Check, RadioLauncherTheme0.Check, RadioLauncherTheme1.Check, RadioLauncherTheme2.Check, RadioLauncherTheme3.Check, RadioLauncherTheme4.Check, RadioLauncherTheme5.Check, RadioLauncherTheme6.Check, RadioLauncherTheme7.Check, RadioLauncherTheme8.Check, RadioLauncherTheme9.Check, RadioLauncherTheme10.Check, RadioLauncherTheme11.Check, RadioLauncherTheme12.Check, RadioLauncherTheme13.Check, RadioLauncherTheme14.Check, RadioCustomType0.Check, RadioCustomType1.Check, RadioCustomType2.Check, RadioCustomType3.Check + If AniControlEnabled = 0 Then Setup.Set(sender.Tag.ToString.Split("/")(0), Val(sender.Tag.ToString.Split("/")(1))) + End Sub + + '背景图片 + Private Sub BtnUIBgOpen_Click(sender As Object, e As EventArgs) Handles BtnBackgroundOpen.Click + OpenExplorer("""" & Path & "PCL\Pictures""") + End Sub + Private Sub BtnBackgroundRefresh_Click(sender As Object, e As EventArgs) Handles BtnBackgroundRefresh.Click + BackgroundRefresh(True, True) + End Sub + Public Sub BackgroundRefreshUI(Show As Boolean, Count As Integer) + If IsNothing(PanBackgroundOpacity) Then Exit Sub + If Show Then + PanBackgroundOpacity.Visibility = Visibility.Visible + PanBackgroundBlur.Visibility = Visibility.Visible + PanBackgroundSuit.Visibility = Visibility.Visible + BtnBackgroundClear.Visibility = Visibility.Visible + CardBackground.Title = "背景图片(" & Count & " 张)" + Else + PanBackgroundOpacity.Visibility = Visibility.Collapsed + PanBackgroundBlur.Visibility = Visibility.Collapsed + PanBackgroundSuit.Visibility = Visibility.Collapsed + BtnBackgroundClear.Visibility = Visibility.Collapsed + CardBackground.Title = "背景图片" + End If + CardBackground.TriggerForceResize() + End Sub + Private Sub BtnBackgroundClear_Click(sender As Object, e As EventArgs) Handles BtnBackgroundClear.Click + If MyMsgBox("即将删除背景图片文件夹中的所有文件。" & vbCrLf & "此操作不可撤销,是否确定?", "警告",, "取消", IsWarn:=True) = 1 Then + DeleteDirectory(Path & "PCL\Pictures") + BackgroundRefresh(False, True) + Hint("背景图片已清空!", HintType.Finish) + End If + End Sub + ''' + ''' 刷新背景图片及设置页 UI。 + ''' + ''' 是否显示刷新提示。 + ''' 是否刷新图片显示。 + Public Shared Sub BackgroundRefresh(IsHint As Boolean, Refresh As Boolean) + Try + + '获取可用的图片文件 + Directory.CreateDirectory(Path & "PCL\Pictures\") + Dim Pic As New List(Of String) + For Each File In EnumerateFiles(Path & "PCL\Pictures\") + If File.Extension.ToLower <> ".ini" AndAlso File.Extension.ToLower <> ".db" Then '文件夹可能会被加入 .ini 和 thumbs.db + Pic.Add(File.FullName) + End If + Next + '加载 + If Not Pic.Any() Then + If Refresh Then + If FrmMain.ImgBack.Visibility = Visibility.Collapsed Then + If IsHint Then Hint("未检测到可用背景图片!", HintType.Critical) + Else + FrmMain.ImgBack.Visibility = Visibility.Collapsed + If IsHint Then Hint("背景图片已清除!", HintType.Finish) + End If + End If + If Not IsNothing(FrmSetupUI) Then FrmSetupUI.BackgroundRefreshUI(False, 0) + Else + If Refresh Then + Dim Address As String = RandomOne(Pic) + Try + Log("[UI] 加载背景图片:" & Address) + FrmMain.ImgBack.Background = New MyBitmap(Address) + Setup.Load("UiBackgroundSuit", True) + FrmMain.ImgBack.Visibility = Visibility.Visible + If IsHint Then Hint("背景图片已刷新:" & GetFileNameFromPath(Address), HintType.Finish, False) + Catch ex As Exception + If ex.Message.Contains("参数无效") Then + Log("刷新背景图片失败,该图片文件可能并非标准格式。" & vbCrLf & + "你可以尝试使用画图打开该文件并重新保存,这会让图片变为标准格式。" & vbCrLf & + "文件:" & Address, LogLevel.Msgbox) + Else + Log(ex, "刷新背景图片失败(" & Address & ")", LogLevel.Msgbox) + End If + End Try + End If + If Not IsNothing(FrmSetupUI) Then FrmSetupUI.BackgroundRefreshUI(True, Pic.Count) + End If + + Catch ex As Exception + Log(ex, "刷新背景图片时出现未知错误", LogLevel.Feedback) + End Try + End Sub + + + '顶部栏 + Private Sub BtnLogoChange_Click(sender As Object, e As EventArgs) Handles BtnLogoChange.Click + Dim FileName As String = SelectFile("常用图片文件(*.png;*.jpg;*.gif)|*.png;*.jpg;*.gif", "选择图片") + If FileName = "" Then Exit Sub + Try + '拷贝文件 + File.Delete(Path & "PCL\Logo.png") + CopyFile(FileName, Path & "PCL\Logo.png") + '设置当前显示 + FrmMain.ImageTitleLogo.Source = New MyBitmap(Path & "PCL\Logo.png") + Catch ex As Exception + If ex.Message.Contains("参数无效") Then + Log("改变标题栏图片失败,该图片文件可能并非标准格式。" & vbCrLf & + "你可以尝试使用画图打开该文件并重新保存,这会让图片变为标准格式。", LogLevel.Msgbox) + Else + Log(ex, "设置标题栏图片失败", LogLevel.Msgbox) + End If + FrmMain.ImageTitleLogo.Source = Nothing + End Try + End Sub + Private Sub RadioLogoType3_Check(sender As Object, e As RouteEventArgs) Handles RadioLogoType3.PreviewCheck + If Not (AniControlEnabled = 0 AndAlso e.RaiseByMouse) Then Exit Sub +Refresh: + '已有图片则不再选择 + If File.Exists(Path & "PCL\Logo.png") Then + Try + FrmMain.ImageTitleLogo.Source = New MyBitmap(Path & "PCL\Logo.png") + Catch ex As Exception + If ex.Message.Contains("参数无效") Then + Log("调整标题栏图片失败,该图片文件可能并非标准格式。" & vbCrLf & + "你可以尝试使用画图打开该文件并重新保存,这会让图片变为标准格式。", LogLevel.Msgbox) + Else + Log(ex, "调整标题栏图片失败", LogLevel.Msgbox) + End If + FrmMain.ImageTitleLogo.Source = Nothing + e.Handled = True + Try + File.Delete(Path & "PCL\Logo.png") + Catch exx As Exception + Log(exx, "清理错误的标题栏图片失败", LogLevel.Msgbox) + End Try + End Try + Exit Sub + End If + '没有图片则要求选择 + Dim FileName As String = SelectFile("常用图片文件(*.png;*.jpg;*.gif)|*.png;*.jpg;*.gif", "选择图片") + If FileName = "" Then + FrmMain.ImageTitleLogo.Source = Nothing + e.Handled = True + Else + Try + '拷贝文件 + File.Delete(Path & "PCL\Logo.png") + CopyFile(FileName, Path & "PCL\Logo.png") + GoTo Refresh + Catch ex As Exception + Log(ex, "复制标题栏图片失败", LogLevel.Msgbox) + End Try + End If + End Sub + Private Sub BtnLogoDelete_Click(sender As Object, e As EventArgs) Handles BtnLogoDelete.Click + Try + File.Delete(Path & "PCL\Logo.png") + RadioLogoType1.SetChecked(True, True, True) + Hint("标题栏图片已清空!", HintType.Finish) + Catch ex As Exception + Log(ex, "清空标题栏图片失败", LogLevel.Msgbox) + End Try + End Sub + + '背景音乐 + Private Sub BtnMusicOpen_Click(sender As Object, e As EventArgs) Handles BtnMusicOpen.Click + OpenExplorer("""" & Path & "PCL\Musics""") + End Sub + Private Sub BtnMusicRefresh_Click(sender As Object, e As EventArgs) Handles BtnMusicRefresh.Click + MusicRefreshPlay(True) + End Sub + Public Sub MusicRefreshUI() + If PanBackgroundOpacity Is Nothing Then Exit Sub + If MusicAllList.Any Then + PanMusicVolume.Visibility = Visibility.Visible + PanMusicDetail.Visibility = Visibility.Visible + BtnMusicClear.Visibility = Visibility.Visible + CardMusic.Title = "背景音乐(" & EnumerateFiles(Path & "PCL\Musics\").Count & " 首)" + Else + PanMusicVolume.Visibility = Visibility.Collapsed + PanMusicDetail.Visibility = Visibility.Collapsed + BtnMusicClear.Visibility = Visibility.Collapsed + CardMusic.Title = "背景音乐" + End If + CardMusic.TriggerForceResize() + End Sub + Private Sub BtnMusicClear_Click(sender As Object, e As EventArgs) Handles BtnMusicClear.Click + If MyMsgBox("即将删除背景音乐文件夹中的所有文件。" & vbCrLf & "此操作不可撤销,是否确定?", "警告",, "取消", IsWarn:=True) = 1 Then + RunInThread(Sub() + Hint("正在删除背景音乐……") + '停止播放音乐 + MusicNAudio = Nothing + MusicWaitingList = New List(Of String) + MusicAllList = New List(Of String) + Thread.Sleep(200) + '删除文件 + Try + DeleteDirectory(Path & "PCL\Musics") + Hint("背景音乐已删除!", HintType.Finish) + Catch ex As Exception + Log(ex, "删除背景音乐失败", LogLevel.Msgbox) + End Try + Try + Directory.CreateDirectory(Path & "PCL\Musics") + RunInUi(Sub() MusicRefreshPlay(False)) + Catch ex As Exception + Log(ex, "重建背景音乐文件夹失败", LogLevel.Msgbox) + End Try + End Sub) + End If + End Sub + Private Sub CheckMusicStart_Change() Handles CheckMusicStart.Change + If AniControlEnabled <> 0 Then Exit Sub + If CheckMusicStart.Checked Then CheckMusicStop.Checked = False + End Sub + Private Sub CheckMusicStop_Change() Handles CheckMusicStop.Change + If AniControlEnabled <> 0 Then Exit Sub + If CheckMusicStop.Checked Then CheckMusicStart.Checked = False + End Sub + + '主页 + Private Sub BtnCustomFile_Click(sender As Object, e As EventArgs) Handles BtnCustomFile.Click + Try + If File.Exists(Path & "PCL\Custom.xaml") Then + If MyMsgBox("当前已存在布局文件,继续生成教学文件将会覆盖现有布局文件!", "覆盖确认", "继续", "取消", IsWarn:=True) = 2 Then Exit Sub + End If + WriteFile(Path & "PCL\Custom.xaml", GetResources("Custom")) + Hint("教学文件已生成!", HintType.Finish) + OpenExplorer("/select,""" & Path & "PCL\Custom.xaml""") + Catch ex As Exception + Log(ex, "生成教学文件失败", LogLevel.Feedback) + End Try + End Sub + Private Sub BtnCustomRefresh_Click() Handles BtnCustomRefresh.Click + FrmLaunchRight.ForceRefresh() + Hint("已刷新主页!", HintType.Finish) + End Sub + Private Sub BtnCustomTutorial_Click(sender As Object, e As EventArgs) Handles BtnCustomTutorial.Click + MyMsgBox("1. 点击 生成教学文件 按钮,这会在 PCL 文件夹下生成 Custom.xaml 布局文件。" & vbCrLf & + "2. 使用记事本等工具打开这个文件并进行修改,修改完记得保存。" & vbCrLf & + "3. 点击 刷新主页 按钮,查看主页现在长啥样了。" & vbCrLf & + vbCrLf & + "你可以在生成教学文件后直接刷新主页,对照着进行修改,更有助于理解。" & vbCrLf & + "直接将自定义主页文件拖进 PCL 窗口也可以快捷加载。", "主页自定义教程") + End Sub + + '主题 + Private Sub LabLauncherTheme5Unlock_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles LabLauncherTheme5Unlock.MouseLeftButtonUp + RadioLauncherTheme5Gray.Opacity -= 0.23 + RadioLauncherTheme5.Opacity += 0.23 + AniStart({ + AaOpacity(RadioLauncherTheme5Gray, 1, 1000), + AaOpacity(RadioLauncherTheme5, -1, 1000) + }, "ThemeUnlock") + If RadioLauncherTheme5Gray.Opacity < 0.08 Then + ThemeUnlock(5, UnlockHint:="隐藏主题 玄素黑 已解锁!") + AniStop("ThemeUnlock") + RadioLauncherTheme5.Checked = True + End If + End Sub + Private Sub LabLauncherTheme11Click_MouseLeftButtonUp() Handles LabLauncherTheme11Click.MouseLeftButtonUp, RadioLauncherTheme11.MouseRightButtonUp + If LabLauncherTheme11Click.Visibility = Visibility.Collapsed OrElse LabLauncherTheme11Click.ToolTip.ToString.Contains("点击") Then + If MyMsgBox( + "1. 不爬取或攻击相关服务或网站,不盗取相关账号,没有谜题可以或需要以此来解决。" & vbCrLf & + "2. 不得篡改或损毁相关公开信息,请尽量让它们保持原状。" & vbCrLf & + "3. 在你感到迷茫的时候,看看回声洞可能会给你带来惊喜。" & vbCrLf & vbCrLf & + "若违规,可能会被从任意相关群中踢出!", + "解密游戏的基本规则", "我知道了", "恕我拒绝") = 1 Then + MyMsgBox("你需要用自己的智慧来找到下一步的线索……" & vbCrLf & + "初始线索:gnp.dorC61\60\20\0202\moc.x1xa.2s\\:sp" & "T".ToLower & "th", "解密游戏") '防止触发病毒检测规则 + End If + End If + End Sub + Private Sub LabLauncherTheme8Copy_MouseRightButtonUp() Handles LabLauncherTheme8Copy.MouseRightButtonUp + OpenWebsite("https://afdian.net/a/LTCat") + End Sub + Private Sub LabLauncherTheme9Copy_MouseRightButtonUp() Handles LabLauncherTheme9Copy.MouseRightButtonUp + PageOtherLeft.TryFeedback() + End Sub + + '主题自定义 + Private Sub RadioLauncherTheme14_Change(sender As Object, e As RouteEventArgs) Handles RadioLauncherTheme14.Changed + If RadioLauncherTheme14.Checked Then + If LabLauncherHue.Visibility = Visibility.Visible Then Exit Sub + LabLauncherHue.Visibility = Visibility.Visible + SliderLauncherHue.Visibility = Visibility.Visible + LabLauncherSat.Visibility = Visibility.Visible + SliderLauncherSat.Visibility = Visibility.Visible + LabLauncherDelta.Visibility = Visibility.Visible + SliderLauncherDelta.Visibility = Visibility.Visible + LabLauncherLight.Visibility = Visibility.Visible + SliderLauncherLight.Visibility = Visibility.Visible + Else + If LabLauncherHue.Visibility = Visibility.Collapsed Then Exit Sub + LabLauncherHue.Visibility = Visibility.Collapsed + SliderLauncherHue.Visibility = Visibility.Collapsed + LabLauncherSat.Visibility = Visibility.Collapsed + SliderLauncherSat.Visibility = Visibility.Collapsed + LabLauncherDelta.Visibility = Visibility.Collapsed + SliderLauncherDelta.Visibility = Visibility.Collapsed + LabLauncherLight.Visibility = Visibility.Collapsed + SliderLauncherLight.Visibility = Visibility.Collapsed + End If + CardLauncher.TriggerForceResize() + End Sub + Private Sub HSL_Change() Handles SliderLauncherHue.Change, SliderLauncherLight.Change, SliderLauncherSat.Change, SliderLauncherDelta.Change + If AniControlEnabled <> 0 OrElse SliderLauncherSat Is Nothing OrElse Not SliderLauncherSat.IsLoaded Then Exit Sub + ThemeRefresh() + End Sub + +#Region "功能隐藏" + + Private Shared _HiddenForceShow As Boolean = False + ''' + ''' 是否强制显示被禁用的功能。 + ''' + Public Shared Property HiddenForceShow As Boolean + Get + Return _HiddenForceShow + End Get + Set(value As Boolean) + _HiddenForceShow = value + HiddenRefresh() + End Set + End Property + + ''' + ''' 更新功能隐藏带来的显示变化。 + ''' + Public Shared Sub HiddenRefresh() Handles Me.Loaded + If FrmMain.PanTitleSelect Is Nothing OrElse Not FrmMain.PanTitleSelect.IsLoaded Then Exit Sub + Try + '顶部栏 + If Not HiddenForceShow AndAlso Setup.Get("UiHiddenPageDownload") AndAlso Setup.Get("UiHiddenPageLink") AndAlso Setup.Get("UiHiddenPageSetup") AndAlso Setup.Get("UiHiddenPageOther") Then + '顶部栏已被全部隐藏 + FrmMain.PanTitleSelect.Visibility = Visibility.Collapsed + Else + '顶部栏未被全部隐藏 + FrmMain.PanTitleSelect.Visibility = Visibility.Visible + FrmMain.BtnTitleSelect1.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenPageDownload"), Visibility.Collapsed, Visibility.Visible) + FrmMain.BtnTitleSelect2.Visibility = Visibility.Collapsed 'If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenPageLink"), Visibility.Collapsed, Visibility.Visible) + FrmMain.BtnTitleSelect3.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenPageSetup"), Visibility.Collapsed, Visibility.Visible) + FrmMain.BtnTitleSelect4.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenPageOther"), Visibility.Collapsed, Visibility.Visible) + End If + '功能 + FrmLaunchLeft.RefreshButtonsUI() + If FrmSetupUI IsNot Nothing Then + FrmSetupUI.CardSwitch.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenFunctionHidden"), Visibility.Collapsed, Visibility.Visible) + End If + '设置子页面 + If FrmSetupLeft IsNot Nothing Then + FrmSetupLeft.ItemLaunch.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenSetupLaunch"), Visibility.Collapsed, Visibility.Visible) + FrmSetupLeft.ItemUI.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenSetupUi"), Visibility.Collapsed, Visibility.Visible) + FrmSetupLeft.ItemLink.Visibility = Visibility.Collapsed 'If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenSetupLink"), Visibility.Collapsed, Visibility.Visible) + FrmSetupLeft.ItemSystem.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenSetupSystem"), Visibility.Collapsed, Visibility.Visible) + '隐藏左边选择卡 + Dim AvaliableCount As Integer = 0 + If Not Setup.Get("UiHiddenSetupLaunch") Then AvaliableCount += 1 + If Not Setup.Get("UiHiddenSetupUi") Then AvaliableCount += 1 + If Not Setup.Get("UiHiddenSetupLink") Then AvaliableCount += 1 + If Not Setup.Get("UiHiddenSetupSystem") Then AvaliableCount += 1 + FrmSetupLeft.PanItem.Visibility = If(AvaliableCount < 2 AndAlso Not HiddenForceShow, Visibility.Collapsed, Visibility.Visible) + End If + '更多子页面 + Dim OtherAvaliableCount As Integer = 0 + If Not Setup.Get("UiHiddenOtherHelp") Then OtherAvaliableCount += 1 + If Not Setup.Get("UiHiddenOtherAbout") Then OtherAvaliableCount += 1 + If Not Setup.Get("UiHiddenOtherTest") Then OtherAvaliableCount += 1 + If Not Setup.Get("UiHiddenOtherFeedback") Then OtherAvaliableCount += 1 + If Not Setup.Get("UiHiddenOtherVote") Then OtherAvaliableCount += 1 + If FrmOtherLeft IsNot Nothing Then + FrmOtherLeft.ItemHelp.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenOtherHelp"), Visibility.Collapsed, Visibility.Visible) + FrmOtherLeft.ItemFeedback.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenOtherFeedback"), Visibility.Collapsed, Visibility.Visible) + FrmOtherLeft.ItemVote.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenOtherVote"), Visibility.Collapsed, Visibility.Visible) + FrmOtherLeft.ItemAbout.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenOtherAbout"), Visibility.Collapsed, Visibility.Visible) + FrmOtherLeft.ItemTest.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenOtherTest"), Visibility.Collapsed, Visibility.Visible) + '隐藏左边选择卡 + FrmOtherLeft.PanItem.Visibility = If(OtherAvaliableCount < 2 AndAlso Not HiddenForceShow, Visibility.Collapsed, Visibility.Visible) + End If + If OtherAvaliableCount = 1 AndAlso Not HiddenForceShow Then + If Not Setup.Get("UiHiddenOtherHelp") Then + FrmMain.BtnTitleSelect4.Text = "帮助" + ElseIf Not Setup.Get("UiHiddenOtherAbout") Then + FrmMain.BtnTitleSelect4.Text = "关于" + Else + FrmMain.BtnTitleSelect4.Text = "百宝箱" + End If + Else + FrmMain.BtnTitleSelect4.Text = "更多" + End If + '各个页面的入口 + If FrmMain.PageCurrent = FormMain.PageType.VersionSelect Then FrmSelectRight.BtnEmptyDownload_Loaded() + If FrmMain.PageCurrent = FormMain.PageType.Launch Then FrmLaunchLeft.RefreshButtonsUI() + If FrmMain.PageCurrent = FormMain.PageType.VersionSetup AndAlso FrmVersionModDisabled IsNot Nothing Then FrmVersionModDisabled.BtnDownload_Loaded() + '备注 + If FrmSetupUI IsNot Nothing Then FrmSetupUI.CardSwitch.Title = If(HiddenForceShow, "功能隐藏(已暂时关闭,按 F12 以重新启用)", "功能隐藏") + Catch ex As Exception + Log(ex, "刷新功能隐藏项目失败", LogLevel.Feedback) + End Try + End Sub + + 'UI 协同改变 + Private Sub HiddenSetupMain() Handles CheckHiddenPageSetup.Change + '设置主页面 + If CheckHiddenPageSetup.Checked Then + '开启 + CheckHiddenSetupLaunch.Checked = True + CheckHiddenSetupSystem.Checked = True + CheckHiddenSetupLink.Checked = True + CheckHiddenSetupUI.Checked = True + Else + '关闭 + If Setup.Get("UiHiddenSetupLaunch") AndAlso Setup.Get("UiHiddenSetupUi") AndAlso Setup.Get("UiHiddenSetupSystem") AndAlso Setup.Get("UiHiddenSetupLink") Then + CheckHiddenSetupLaunch.Checked = False + CheckHiddenSetupSystem.Checked = False + CheckHiddenSetupLink.Checked = False + CheckHiddenSetupUI.Checked = False + End If + End If + End Sub + Private Sub HiddenSetupSub() Handles CheckHiddenSetupLaunch.Change, CheckHiddenSetupSystem.Change, CheckHiddenSetupLink.Change, CheckHiddenSetupUI.Change + '设置子页面 + If Setup.Get("UiHiddenSetupLaunch") AndAlso Setup.Get("UiHiddenSetupUi") AndAlso Setup.Get("UiHiddenSetupSystem") AndAlso Setup.Get("UiHiddenSetupLink") Then + '已被全部隐藏 + CheckHiddenPageSetup.Checked = True + Else + '未被全部隐藏 + CheckHiddenPageSetup.Checked = False + End If + End Sub + Private Sub HiddenOtherMain() Handles CheckHiddenPageOther.Change + '更多主页面 + If CheckHiddenPageOther.Checked Then + '开启 + CheckHiddenOtherAbout.Checked = True + CheckHiddenOtherTest.Checked = True + CheckHiddenOtherFeedback.Checked = True + CheckHiddenOtherVote.Checked = True + CheckHiddenOtherHelp.Checked = True + Else + '关闭 + If Setup.Get("UiHiddenOtherHelp") AndAlso Setup.Get("UiHiddenOtherAbout") AndAlso Setup.Get("UiHiddenOtherTest") AndAlso + Setup.Get("UiHiddenOtherVote") AndAlso Setup.Get("UiHiddenOtherFeedback") Then + CheckHiddenOtherAbout.Checked = False + CheckHiddenOtherTest.Checked = False + CheckHiddenOtherFeedback.Checked = False + CheckHiddenOtherVote.Checked = False + CheckHiddenOtherHelp.Checked = False + End If + End If + End Sub + Private Sub HiddenOtherSub(sender As Object, user As Boolean) Handles CheckHiddenOtherHelp.Change, CheckHiddenOtherAbout.Change, CheckHiddenOtherTest.Change + '更多子页面(有具体内容的) + If Setup.Get("UiHiddenOtherHelp") AndAlso Setup.Get("UiHiddenOtherAbout") AndAlso Setup.Get("UiHiddenOtherTest") Then + '已被全部隐藏 + CheckHiddenPageOther.Checked = True + Else + '未被全部隐藏 + CheckHiddenPageOther.Checked = False + End If + '修改无具体内容的项 + If Not user Then Exit Sub + If Setup.Get("UiHiddenOtherHelp") AndAlso Setup.Get("UiHiddenOtherAbout") AndAlso Setup.Get("UiHiddenOtherTest") Then + CheckHiddenOtherFeedback.Checked = True + CheckHiddenOtherVote.Checked = True + End If + End Sub + Private Sub HiddenOtherNet(sender As Object, user As Boolean) Handles CheckHiddenOtherFeedback.Change, CheckHiddenOtherVote.Change + '更多子页面(无具体内容的) + If Not user Then Exit Sub + If Setup.Get("UiHiddenOtherHelp") AndAlso Setup.Get("UiHiddenOtherAbout") AndAlso Setup.Get("UiHiddenOtherTest") AndAlso + (Not Setup.Get("UiHiddenOtherFeedback") OrElse Not Setup.Get("UiHiddenOtherVote")) Then + CheckHiddenOtherAbout.Checked = False + CheckHiddenOtherTest.Checked = False + CheckHiddenOtherHelp.Checked = False + End If + End Sub + + '警告提示 + Private Sub HiddenHint(sender As Object, user As Boolean) Handles CheckHiddenFunctionHidden.Change, CheckHiddenPageSetup.Change, CheckHiddenSetupUI.Change + If AniControlEnabled = 0 AndAlso sender.Checked Then Hint("按 F12 即可暂时关闭功能隐藏设置。千万别忘了,要不然设置就改不回来了……") + End Sub + +#End Region + + '公开预览版 + Private Sub BtnLauncherDonate_Click(sender As Object, e As EventArgs) Handles BtnLauncherDonate.Click + OpenWebsite("https://afdian.net/a/LTCat") + End Sub + + '滑动条 + Private Sub SliderLoad() + SliderMusicVolume.GetHintText = Function(Value As Integer) + Return Math.Ceiling(Value * 0.1) & "%" + End Function + SliderLauncherOpacity.GetHintText = Function(Value As Integer) + Return Math.Round(40 + Value * 0.1) & "%" + End Function + SliderLauncherHue.GetHintText = Function(Value As Integer) + Return Value & "°" + End Function + SliderLauncherSat.GetHintText = Function(Value As Integer) + Return Value & "%" + End Function + SliderLauncherDelta.GetHintText = Function(Value As Integer) + If Value > 90 Then + Return "+" & (Value - 90) + ElseIf Value = 90 Then + Return 0 + Else + Return Value - 90 + End If + End Function + SliderLauncherLight.GetHintText = Function(Value As Integer) + If Value > 20 Then + Return "+" & (Value - 20) + ElseIf Value = 20 Then + Return 0 + Else + Return Value - 20 + End If + End Function + SliderBackgroundOpacity.GetHintText = Function(Value As Integer) + Return Math.Round(Value * 0.1) & "%" + End Function + SliderBackgroundBlur.GetHintText = Function(Value As Integer) + Return Value & " 像素" + End Function + End Sub + +End Class diff --git a/Plain Craft Launcher 2/Pages/PageSpeedLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageSpeedLeft.xaml.vb index db5f4f2..18c7270 100644 --- a/Plain Craft Launcher 2/Pages/PageSpeedLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSpeedLeft.xaml.vb @@ -1,4 +1,6 @@ -Public Class PageSpeedLeft +Imports System.Threading.Tasks + +Public Class PageSpeedLeft Private Const WatcherInterval As Integer = 300 '初始化 @@ -59,8 +61,8 @@ If FrmSpeedRight Is Nothing OrElse FrmSpeedRight.PanMain Is Nothing Then Exit Sub Try SyncLock LoaderTaskbarLock - For i = 0 To LoaderTaskbar.Count - 1 - TaskRefresh(LoaderTaskbar(i)) + For Each Loader In LoaderTaskbar.ToList + TaskRefresh(Loader) Next End SyncLock Catch ex As Exception @@ -110,7 +112,7 @@ #Region "进度不同,更新卡片" Try If Card.Children.Count < LoaderList.Count * 2 Then - Log("刷新下载管理卡片失败:卡片中仅有 " & Card.Children.Count & " 个子项", LogLevel.Debug) + Log($"[Watcher] 刷新下载管理卡片 {Loader.Name} 失败:卡片中仅有 {Card.Children.Count} 个子项,要求至少有 {LoaderList.Count * 2} 个子项", LogLevel.Debug) Exit Try End If Dim Row As Integer = 0 @@ -137,7 +139,7 @@ Row += 1 Next Catch ex As Exception - Log(ex, "刷新下载管理卡片失败", LogLevel.Feedback) + Log(ex, $"刷新下载管理卡片 {Loader.Name} 失败", LogLevel.Feedback) End Try #End Region End Select @@ -191,13 +193,18 @@ '添加取消按钮 Dim Cancel As New MyIconButton With {.Name = "BtnCancel", .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 = New Thickness(0, 10, 10, 0), .LogoScale = 1.1, .HorizontalAlignment = HorizontalAlignment.Right, .VerticalAlignment = VerticalAlignment.Top} Card.Children.Add(Cancel) - AddHandler Cancel.Click, Sub(sender As MyIconButton, e As EventArgs) - AniDispose(sender, False) - AniDispose(Card, True, Sub() If FrmSpeedRight.PanMain.Children.Count = 0 AndAlso FrmMain.PageCurrent = FormMain.PageType.DownloadManager Then FrmMain.PageBack()) - RightCards.Remove(Loader.Name) - Log($"[Watcher] 关闭下载管理卡片:{Loader.Name}") - RunInThread(Sub() Loader.Abort()) - End Sub + AddHandler Cancel.Click, + Sub(sender As MyIconButton, e As EventArgs) + AniDispose(sender, False) + AniDispose(Card, True, Sub() If FrmSpeedRight.PanMain.Children.Count = 0 AndAlso FrmMain.PageCurrent = FormMain.PageType.DownloadManager Then FrmMain.PageBack()) + RightCards.Remove(Loader.Name) + SyncLock LoaderTaskbarLock + LoaderTaskbar.Remove(Loader) + Log($"[Taskbar] 由于下载管理卡片关闭,{Loader.Name} 已移出任务列表") + End SyncLock + Log($"[Watcher] 关闭下载管理卡片:{Loader.Name}") + RunInThread(Sub() Loader.Abort()) + End Sub '如果已经失败,再刷新一次,修改成失败的控件 If Loader.State = LoadState.Failed Then Card.Tag = Nothing '避免重复导致刷新无效 diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb index ce03d0d..9af7c14 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb @@ -177,7 +177,7 @@ Private Sub BtnManageCheck_Click(sender As Object, e As EventArgs) Handles BtnManageCheck.Click Try Dim Result = McModCheck(PageVersionLeft.Version, McModLoader.Output) - If Result.Count > 0 Then + If Result.Any Then MyMsgBox(Join(Result, vbCrLf & vbCrLf), "Mod 检查结果") Else Hint("Mod 检查完成,未发现任何问题!", HintType.Finish) @@ -620,13 +620,13 @@ If ModEntry.ModId IsNot Nothing Then DebugInfo.Add("Mod ID:" & ModEntry.ModId) End If - If ModEntry.Dependencies.Count > 0 Then + If ModEntry.Dependencies.Any Then DebugInfo.Add("依赖于:") For Each Dep In ModEntry.Dependencies DebugInfo.Add(" - " & Dep.Key & If(Dep.Value Is Nothing, "", ",版本:" & Dep.Value)) Next End If - If DebugInfo.Count > 0 Then + If DebugInfo.Any Then ContentLines.Add("") ContentLines.AddRange(DebugInfo) End If diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb index b54cc26..ad72125 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb @@ -33,7 +33,7 @@ If Indie = -1 Then Dim ModFolder As New DirectoryInfo(PageVersionLeft.Version.Path & "mods\") Dim SaveFolder As New DirectoryInfo(PageVersionLeft.Version.Path & "saves\") - If (ModFolder.Exists AndAlso ModFolder.EnumerateFiles.Count > 0) OrElse (SaveFolder.Exists AndAlso SaveFolder.EnumerateFiles.Count > 0) Then + If (ModFolder.Exists AndAlso ModFolder.EnumerateFiles.Any) OrElse (SaveFolder.Exists AndAlso SaveFolder.EnumerateFiles.Any) Then '自动开启 Setup.Set("VersionArgumentIndie", 1, Version:=PageVersionLeft.Version) Log("[Setup] 已自动开启单版本隔离:" & PageVersionLeft.Version.Name) @@ -438,7 +438,7 @@ PreFin: Log(ex, "更新版本设置 Java 下拉框失败", LogLevel.Feedback) End Try '更新选择项 - If SelectedItem Is Nothing AndAlso JavaList.Count > 0 Then + If SelectedItem Is Nothing AndAlso JavaList.Any Then If SelectedBySetup = "" Then SelectedItem = ComboArgumentJava.Items(1) '选中 “自动选择” Else diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 4df8c36..72db688 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -35,7 +35,7 @@ AnyCPU true full - true + false false true D:\Minecraft\程序\ @@ -185,6 +185,9 @@ MyIconTextButton.xaml + + + @@ -466,6 +469,7 @@ FormMain.xaml Code + MSBuild:Compile Designer @@ -916,5 +920,9 @@ + + + + \ No newline at end of file diff --git a/Plain Craft Launcher 2/Resources/Help.zip b/Plain Craft Launcher 2/Resources/Help.zip index d00647e..c55c8d3 100644 Binary files a/Plain Craft Launcher 2/Resources/Help.zip and b/Plain Craft Launcher 2/Resources/Help.zip differ diff --git a/Plain Craft Launcher 2/Resources/ModData.txt b/Plain Craft Launcher 2/Resources/ModData.txt index cb989b8..822f369 100644 --- a/Plain Craft Launcher 2/Resources/ModData.txt +++ b/Plain Craft Launcher 2/Resources/ModData.txt @@ -1,12 +1,12 @@  -industrial-craft|工业时代2 (Industrial Craft 2)¨@industrial-craft|工业时代2 (Industrial Craft 2) - +industrial-craft@|工业时代2 (Industrial Craft 2) +@redpower2-core|红石力量2 (RedPower2) buildcraft@|建筑 (BuildCraft) forestry@|林业* -railcraft|铁路*¨railcraft-reborn@|铁路 (Railcraft) - +railcraft@railcraft-reborn|铁路*¨railcraft-reborn|铁路 (Railcraft) +@ee2|等价交换2 (Equivalent Exchange 2) touhou-item-mod|辉夜姬的五难题 (五つの難題MOD+ ~ Touhou Items) secretroomsmod|密室 (SecretRoomsMod) @@ -17,7 +17,7 @@ powerconverters-portablejims-fork|能源转换 (PowerConverters) modular-forcefield-system|模块化力场系统* minechem-recompile|化学 (MineChem) - 非官方重编译版¨73373|化学 (MineChem) - 已失效 -iron-chests|更多箱子* - Forge¨iron-chests-for-fabric@cyberanner-ironchest|更多箱子 (Iron Chests)¨iron-chests-fabric@|更多箱子 (Iron Chests) +iron-chests@cyberanner-ironchest|更多箱子*¨iron-chests-for-fabric|更多箱子 (Iron Chests)¨iron-chests-fabric@|更多箱子 (Iron Chests) balkons-weaponmod|更多武器 (Balkon's WeaponMod) advanced-machines|高级机械 (AdvancedMachines) advanced-solar-panels|高级太阳能* @@ -31,14 +31,14 @@ flans-mod-5-5-2|Flan 的枪械 (Flan's Mod) ee3|等价交换3 (Equivalent Exchange 3) minefactory-reloaded|我的工厂 (MineFactory) -render-player-api|玩家渲染API (Render Player API) - 已失效¨renderplayerapi|玩家渲染API (Render Player API) - 1.12.2续作 -playerapi|玩家API (Player API) +render-player-api|玩家渲染API (Render Player API) - 已失效¨renderplayerapi|玩家渲染API (Render Player API) +player-api|玩家API (Player API)¨playerapi|玩家API (Player API) -ic2-classic|工业时代2经典版 (IC2 Classic) -not-enough-items-1-8|NEI物品管理器 (Not Enough Items) - 1.8+¨notenoughitems|NEI物品管理器 (Not Enough Items) - 1.7.10及以下¨@nei|NEI物品管理器 (Not Enough Items) + +not-enough-items-1-8@nei|NEI物品管理器 (Not Enough Items)¨notenoughitems|NEI物品管理器 (Not Enough Items) @@ -62,7 +62,7 @@ the-twilight-forest|暮色森林* portal-gun|传送枪* simpleores@|简单矿石 (SimpleOres) -smart-moving-reboot|灵活动作 (Smart Moving) +smart-moving|灵活动作*¨smart-moving-reboot|灵活动作 (Smart Moving) easycrafting|轻松合成 (Easy Crafting) @@ -73,7 +73,7 @@ computercraft@|电脑 (Computer Craft) inventory-tweaks|R键整理* minecraft-minions|召唤奴仆* -ender-storage|末影存储* +ender-storage@|末影存储*¨ender-storage-1-8|末影存储 (Ender Storage) @@ -84,7 +84,7 @@ forge-nbtedit-for-1-7-10|内置NBT编辑器 (In-Game NBTEdit) rotarycraft|旋转工艺 (RotaryCraft) -applied-energistics-1|应用能源 (Applied Energistics) +applied-energistics-1@ae1|应用能源* @@ -100,9 +100,9 @@ custom-recipes|自定义合成表* minecraft-comes-alive-mca|虚拟人生/凡家物语 (Minecraft Comes Alive) -forge-essentials-74735 +forge-essentials-74735@forge-essentials -translocators|转运器*¨translocators-1-8|转运器 (Translocators) - 1.8以上 +translocators@|转运器*¨translocators-1-8|转运器 (Translocators) craftguide|G键合成表 (CraftGuide) biomes-o-plenty@|超多生物群系 (Biomes O' Plenty) @@ -132,7 +132,7 @@ modular-powersuits|模块化动力套装* @redlogic|红石逻辑 (RedLogic) obsidiplates|黑曜石压力板 (ObsidiPlates) - +@infinitubes|终极管道 (InfiniTubes) flatsigns|平置牌子 (FlatSigns) switches|按钮开关* artifice|工匠的手艺* @@ -147,7 +147,7 @@ logistics-pipes|物流管道* magic-bees|魔法蜜蜂* carpenters-blocks|木匠方块 (Carpenter's Blocks) -mystcraft|神秘岛* +mystcraft@|神秘岛* @@ -164,14 +164,14 @@ minechess|国际象棋 (MineChess) project-red-base|红石计划 (ProjectRed) - 基础¨project-red-illumination|红石计划:照明 (Project Red - Illumination)¨project-red-core|红石计划 (ProjectRed) dimensionaldoors|次元门 (Dimensional Doors) -chickenchunks|区块载入器 (ChickenChunks)¨@chicken-chunks|区块载入器 (ChickenChunks) +chickenchunks@chicken-chunks|区块载入器 (ChickenChunks)¨chicken-chunks-1-8|区块载入器 (ChickenChunks) dlt2|动态蓄水槽 (Dynamic Liquid Tanks) webdisplays-remasterd|内置网页浏览器 (WebDisplays) morph|变身* - +extracells2|更多存储单元2 (Extra Cells 2) billund-223258|乐高 (Billund) @@ -183,7 +183,7 @@ ender-io@enderio|末影接口 (Ender IO) electrodynamics|电动力学* -mc-1-6-4-solar-apocalypse +elite-armageddon¨mc-1-6-4-solar-apocalypse mekanism@|通用机械* @@ -198,7 +198,7 @@ galacticraft-legacy@|星系 (GalactiCraft) journeymap@|旅行地图 (JourneyMap) -underground-biomes|科学地质* - 1.12.2+¨undergroundbiomesconstructs|科学地质 (Underground Biomes) - 1.6.4-1.11.2 +underground-biomes|科学地质*¨undergroundbiomesconstructs|科学地质 (Underground Biomes) fpsplus-lagfixes|FPS优化 (FPS Plus) ars-magica-2|魔法艺术2* @@ -209,7 +209,7 @@ plasmacraft|电浆工艺 (PlasmaCraft) fossils@fossils-and-archeology-revival|考古与化石 (Fossils and Archeology Revival) glenns-gases|格林的气体 (Glenn's Gases) the-lord-of-the-rings-mod-legacy|魔戒:传承 (The Lord of the Rings Mod: Legacy) -thaumic-tinkerer|神秘工匠* +thaumic-tinkerer|神秘工匠*¨thaumic-tinkerer-unofficial|神秘工匠 (Thaumic Tinkerer)¨ichorium-kit|神秘工匠 (Thaumic Tinkerer) @@ -221,7 +221,7 @@ opis openblocks|开放式方块 (OpenBlocks) -water-power|水力科技* + randomcraft-v0-1-0|随机工艺 (RandomCraft) @@ -232,7 +232,7 @@ animal-bikes|动物坐骑* electro-magic-tools|电力魔法工具 (Electro-Magic Tools) forbidden-magic|禁忌魔法* mobtalker2|怪物交谈2 (MobTalker 2) -icbm-classic|洲际导弹 (ICBM)¨icbm|洲际导弹 (ICBM) - 当前版本(已停更) +icbm-classic|洲际导弹 (ICBM)¨icbm|洲际导弹 (ICBM) - 已停更 thaumic-infusion|神秘注魔* thaumic-exploration|神秘探险* deconstruction-table|解构工作台* @@ -245,7 +245,7 @@ b0bgarys-growable-ores|可生长矿石 (B0bGary's Growable Ores) waila|高亮信息拓展 (What am I looking at) chaoscraft-2|混沌工艺 (ChaosCraft) - +scenter-mod|矿物追踪 (Scenter) ex-nihilo|无中生有* reactorcraft|反应堆工艺 (ReactorCraft) @@ -253,25 +253,25 @@ bctools|BC扩展:更多工具 (Buildcraft Tools) additional-buildcraft-objects|更多管道* foundry|金属工坊* gravitation-suite|重力装甲* -redstone-arsenal|红石兵工厂*¨@redstone-arsenal|红石兵工厂 (Redstone Arsenal) +redstone-arsenal@|红石兵工厂* big-reactors|大型反应堆* -endertanks|末影水槽 (Ender Tanks) - Forge¨endertanks-fabric|末影水槽 (Ender Tanks) - Fabric¨@endertanks|末影水槽 (Ender Tanks) +endertanks@|末影水槽 (Ender Tanks)¨endertanks-fabric|末影水槽 (Ender Tanks) applied-energistics-2@ae2|应用能源2* hopper-ducts|漏斗管道* autofish|自动钓鱼* mrcrayfish-furniture-mod|MrCrayfish 的家具 (MrCrayfish's Furniture Mod) -wireless-redstone-cbe|无线红石 (Wireless Redstone)¨wr-cbe-universal|无线红石 (Wireless Redstone) - 1.7.10及以下版本 +wireless-redstone-cbe|无线红石 (Wireless Redstone)¨wr-cbe-universal|无线红石 (Wireless Redstone) per-fabrica-ad-astra-geologica|自合成至星辰:真实地理 (Per Fabrica Ad Astra: Geologica) redstone-furnace|红石炉* -pneumaticcraft-repressurized|气动工艺 (PneumaticCraft: Repressurized)¨@pneumaticcraft-repressurized|气动工艺 (PneumaticCraft: Repressurized) - +pneumaticcraft@pneumaticcraft-repressurized|气动工艺 (PneumaticCraft: Repressurized)¨pneumaticcraft-repressurized|气动工艺 (PneumaticCraft: Repressurized) +thirst-mod|饮水* tubes|管道 (Tubes!) - +pchan3-steamship-steamboat-pirates|飞艇与汽船 (SteamShip - SteamBoat and Pirates) betterfarming|农业增强 (Better Farming) @@ -283,21 +283,21 @@ project-bench|高级工作台* apples-plus|更多苹果 (Apples+) - +qcraft|量子物理 (QCraft) mad-science|疯狂科学* enviromine|更多生存要素 (EnviroMine) the-erebus|混沌之地* -emerald-mod|绿宝石Mod* +emerald-mod|绿宝石 Mod* lucky-block-official|幸运方块 (Lucky Block) dynamic-lights|动态光源* - +yarr-cute-mob-models-remake|怪物娘化 (Yarr Cute Mob Models - Remake) monster-hunter-frontier-craft|怪物猎人边境工艺* zombie-awareness|僵尸意识* remote-io|远程接口 (Remote IO) - +electrical-age|电力时代* minor-alchemy|小型炼金术* @@ -323,13 +323,13 @@ metallurgy|冶金* school-mod-forge-1-14|学校 (School Mod) witchery|巫术* -growthcraft|生长工艺 (GrowthCraft) - 1.5.2、1.6.4¨growthcraft-community-edition|生长工艺 (GrowthCraft) - 1.7.10及以上 - +growthcraft|生长工艺 (GrowthCraft)¨growthcraft-community-edition|生长工艺 (GrowthCraft) +gregtech-5-unofficial|格雷科技5 (GregTech 5) mantle@|地幔* customoregen|自定义矿物生成 (Custom Ore Generation) littlemaidmobx|女仆 (LittleMaidMob) -botania|植物魔法* - Forge¨botania-fabric|植物魔法 (Botania) - Fabric¨@botania|植物魔法 (Botania) +botania@|植物魔法*¨botania-fabric|植物魔法 (Botania) alternate-terrain-generation|交替性地形生成* gendustry|基因工业* @@ -350,31 +350,31 @@ ex-aliquo steves-carts-2|史蒂夫矿车2 (Steve's Carts 2) mariculture|海洋物语* evilcraft|邪恶工艺 (EvilCraft) - +projecte|等价交换重制版 (ProjectE) falling-meteors-mod|陨石 (Falling Meteors) - - +glacia-dimension|冰河时代 (Glacia) +water-power|水力科技* realtrainmod|真实火车 (RealTrainMod) applemilktea2|苹果奶茶2 (AppleMilkTea2) flaxbeards-steam-power@|FSP蒸汽动力 (Flaxbeard's Steam Power) -steves-factory-manager|史蒂夫工厂管理 (Steve's Factory Manager) - 1.7.10¨steves-factory-manager-reborn|史蒂夫工厂管理 (Steve's Factory Manager) - 1.10.2+ - +steves-factory-manager|史蒂夫工厂管理 (Steve's Factory Manager)¨steves-factory-manager-reborn|史蒂夫工厂管理 (Steve's Factory Manager) +thaumcraftgates|奥法管道 (ThaumcraftGates) player-heads-forge|玩家死亡掉头 (Player Heads) notenoughkeys|更好的按键控制 (Not Enough Keys) +pet-bats|宠物蝙蝠* - - +crafting-pillar-mod|合成柱* ultratech|次元科技 (UltraTech) atomicstrykers-infernal-mobs|稀有精英怪 (AtomicStryker's Infernal Mobs) @@ -405,24 +405,24 @@ the-spice-of-life|生活调味料 (The Spice of Life) -storage-drawers|储物抽屉* +storage-drawers@storagedrawers|储物抽屉* wintercraft-gruntpie224|冬天的世界 (Wintercraft) -shincollecraft|深海舰队收藏 (ShinColle) - 1.12.2 版本¨shincolle|深海舰队收藏 (ShinColle) - 1.7.10 & 1.10.2 版本 +shincollecraft|深海舰队收藏 (ShinColle)¨shincolle|深海舰队收藏 (ShinColle) unicode-font-fixer|Unicode字体修复 (UnicodeFontFixer) lanteacraft|星际之门 (LanteaCraft) -matteroverdrive-17-edition|超能物质 (Matter Overdrive) - 1.7版本¨matteroverdrive-legacy|超能物质 (Matter Overdrive) - 1.12版本 +matteroverdrive-17-edition|超能物质 (Matter Overdrive)¨matteroverdrive-legacy|超能物质 (Matter Overdrive) tainted-magic|污秽魔法* - +minetweaker3 treecapitator|砍树 (Tree Capitator) insta-house|即时建造* multi-page-chest|多页箱子 (Multi-Page Chest) draconic-evolution|龙之进化/龙之研究* galacticraft-add-on-more-planets@more-planets|更多行星 (More Planets) -thermal-foundation@|热力基本* + ding|界面进入提醒* @@ -444,7 +444,7 @@ security-craft@|安全工艺* buildcraft-additions|建筑扩充* bedrockium-mod|基岩工艺* blocksteps -@thaumic-horizons|神秘视界 (Thaumic Horizons) +thaumic-horizons@|神秘视界* modtweaker@ lootbags|战利品 (Loot Bags) compact-lava-generator|高级地热发电机* @@ -464,15 +464,15 @@ immersive-engineering@immersiveengineering|沉浸工程* armourers-workshop@|时装工坊 (Armourer's Workshop) slash|命令强化* - -cooking-for-blockheads|傻瓜烹饪/懒人厨房 (Cooking for Blockheads) - Forge¨cooking-for-blockheads-fabric|傻瓜烹饪/懒人厨房 (Cooking for Blockheads) - Fabric¨@cooking-for-blockheads|傻瓜烹饪/懒人厨房 (Cooking for Blockheads) +et-futurum|把未来带回现实* +cooking-for-blockheads@|傻瓜烹饪/懒人厨房 (Cooking for Blockheads)¨cooking-for-blockheads-fabric|傻瓜烹饪/懒人厨房 (Cooking for Blockheads) psi@ good-nights-sleep|夜眠梦境/晚安的梦境 (Good Night's Sleep) binnies-mods@|宾尼的模组合集 (Binnie's Mods) baubles|饰品栏* more-swords-mod|更多剑 (MoreSwords) -thaumic-bases|神秘基础学* - 官方版1.7.10¨thaumic-bases-unofficial|神秘基础学 (Thaumic Bases) - 非官方版1.12.2 +thaumic-bases|神秘基础学*¨thaumic-bases-unofficial|神秘基础学 (Thaumic Bases) essentialcraft-3|源质魔法3 (EssentialCraft 3) hardcore-questing-mode|困难任务* @@ -484,9 +484,9 @@ thaumic-revelations|神秘启示录* warp-book|传送书* ex-compressum|压缩工具* - +simply-jetpacks|简易喷气背包* blood-arsenal|血液兵工厂* - +sim-u-kraft-old|模拟城市 (Sim-U-Kraft) superheroes-unlimited|超级英雄无限* oceancraft-mod|海洋世界 (Oceancraft) @@ -496,21 +496,21 @@ witching-gadgets|巫师宝具* buildcraft-compat@|建筑兼容* extrabotany|额外植物学 (ExtraBotany) botania-unofficial|植物魔法非官方版 (Botania Unoffical) -angry-pixel-the-betweenlands-mod|交错次元/黑暗沼泽 (The Betweenlands) +angry-pixel-the-betweenlands-mod|交错次元 (The Betweenlands) real-first-person-render|真实的第一人称 (Real First Person 2) custom-stuff-3|自定义物品3* lockdown|地图生成锁定* -avaritia|无尽贪婪* - 1.7.10¨avaritia-1-10|无尽贪婪 (Avaritia) - 1.10.2-1.18.2 -minecraft-flight-simulator|飞行模拟*¨transport-simulator-official-vehicle-set|飞行模拟 (Minecraft Flight Simulator) - 官方认证续写模组 +avaritia|无尽贪婪*¨avaritia-1-10|无尽贪婪 (Avaritia) +minecraft-flight-simulator|飞行模拟*¨transport-simulator-official-vehicle-set|飞行模拟 (Minecraft Flight Simulator) - 官方认证续写 essential-thaumaturgy|源质神秘学* abyssalcraft|深渊国度 (AbyssalCraft) calculator|运算工艺* sextiarysector2 warpdrive|曲率驱动 (WarpDrive) -futurepack|飞向未来 (Futurepack Mod)¨@futurepack|飞向未来 (Futurepack Mod) -hbms-nuclear-tech-mod|HBM的核科技 (HBM's Nuclear Tech)¨@ntm|HBM的核科技 (HBM's Nuclear Tech) +futurepack@|飞向未来 (Futurepack Mod) +hbms-nuclear-tech-mod@ntm|HBM的核科技 (HBM's Nuclear Tech Mod) agricraft@|农业工艺 (AgriCraft) arcane-engineering|奥法工程学* immersive-integration @@ -522,11 +522,11 @@ inventory-pets|背包宠物* levels|装备等级* keeping-inventory orespawn|矿石菌种 (OreSpawn) -reliquary-v1-3|圣遗物 (Reliquary Reincarnations (Reliquary) / Xeno's Reliquary) - 1.8.9~最新版¨reliquary|圣遗物 (Reliquary Reincarnations* / Xeno's Reliquary) - 1.5.2和1.7.10 +reliquary-v1-3|圣遗物 (Reliquary Reincarnations (Reliquary) / Xeno's Reliquary)¨reliquary|圣遗物 (Reliquary Reincarnations* / Xeno's Reliquary) mo-bends|更多弯曲 (Mo' Bends) quark@|夸克* -official-divinerpg|神圣RPG (DivineRPG)¨@divinerpg|神圣RPG (DivineRPG) +official-divinerpg@divinerpg|神圣RPG (DivineRPG) harvest-festival|丰收物语* tough-as-nails@|意志坚定* non-update|不再有更新* @@ -537,7 +537,7 @@ bspkrscore|bspkrs核心 (bspkrsCore)¨bspkrscore-updated|bspkrs核心 (bspkrsCor techguns|科技枪* Iron-Backpacks|特殊背包* openmodularturrets|开放式炮台 (OpenModularTurrets) - +technomancy|量子魔法* quantumflux|量子通量 (QuantumFlux) blocksniffer|方块探测 (Block Sniffer) dragonapi @@ -559,14 +559,14 @@ techreborn|科技复兴 (Tech Reborn) infusinbrewing|注魔酿造 (Infusion Brewing) jurassicraft|侏罗纪时代 (JurassiCraft) eternal-singularity|永恒奇点* -codechicken-lib-1-8 -@codechicken-core|鸡块核心 (CodeChickenCore)¨codechicken-core-1-8|鸡块核心 (CodeChickenCore) - 1.8+版本¨codechickencore|鸡块核心 (CodeChickenCore) - 1.8前版本 +codechicken-lib-1-8@codechicken-lib +codechicken-core-1-8@codechicken-core|鸡块核心 (CodeChickenCore)¨codechickencore|鸡块核心 (CodeChickenCore) automagy|自动化魔法* aobd-singularities|AOBD的奇点 (AOBD Singularities) universal-singularities|通用奇点* academy-monster|超能力怪物* sonar-core|声呐核心* -armorstatushud-updated|耐久信息显示 (ArmorStatusHUD) - 1.8.9+¨armorstatushud|耐久信息显示 (ArmorStatusHUD) - 1.5.0-1.8 +armorstatushud-updated|耐久信息显示 (ArmorStatusHUD)¨armorstatushud|耐久信息显示 (ArmorStatusHUD) wanionlib llibrary @@ -574,8 +574,8 @@ llibrary -projecte|等价交换重制版 (ProjectE) -@redpower2-core|红石力量2 (RedPower2) + + @@ -588,12 +588,12 @@ torcherino@|加速火把* craftable-nether-star veinminer|连锁采矿/矿脉矿工 (Vein Miner) - +another-one-bites-the-dust mine-mine-no-mi@|恶魔果实 (Mine Mine no Mi) advanced-rocketry|高级火箭* vics-modern-warfare-mod|维克的现代战争 (Vic's Modern Warfare Mod) -chance-cubes|机会方块* +chance-cubes@|机会方块* gun-customization endercore@|末影核心 (EnderCore) brandons-core @@ -609,30 +609,30 @@ better-records|更好的播放器* worldedit|创世神 (WorldEdit) -worldeditcui¨worldeditcui-fabric¨@worldedit-cui +worldeditcui¨worldeditcui-fabric@worldedit-cui ztones dummycore¨dummycore-unofficial extra-utilities|更多实用设备* openmodslib|开放式模组库 (OpenModsLib) embers|余烬* -neat|极简血量显示* - Forge¨neat-fabric-quilt|极简血量显示 (Neat) - Fabric & Quilt¨@neat|极简血量显示 (Neat) +neat@|极简血量显示*¨neat-fabric-quilt|极简血量显示 (Neat) mob-properties|怪物属性* - +ganys-surface|Gany的世界 (Gany's Surface) ezstorage|EZ存储 (EZStorage) ichunutil intangible -forge-multipart-cbe|CB Multipart / Forge Multipart CBE / ForgeMultipart - 1.10.2及以上版本¨forge-multi-part|CB Multipart / Forge Multipart CBE / ForgeMultipart - 1.7.10及以下版本 +forge-multipart-cbe¨forge-multi-part the-titans-mod|泰坦生物 (The Titans) enchiridion - +stimmedcow-nomorerecipeconflict|合成冲突消除 (NoMoreRecipeConflict) tinker-i-o|工匠接口 (Tinker I/O) woot|生物工厂* -realistic-terrain-generation|真实地形生成* +realistic-terrain-generation|真实地形生成*¨realistic-terrain-generation-plus|真实地形生成 (Realistic Terrain Generation) - RTG原作者继续开发的分支 mob-rebirth|怪物重生* diseasecraft|疾病 (Disease Craft) zombie-infection|僵尸感染* @@ -643,7 +643,7 @@ bookshelf-api-library movingworld botania-garden-of-glass|水晶花园 (Garden of Glass) - +@tubestuff|RP增强 (Tube Stuff) tiny-progressions|微型自动化* baubles-stuff|更多首饰* @@ -697,16 +697,16 @@ clockwork-phase|时之沙* autoreglib@ roots|根源魔法* -guide-api|指南 (Guide-Api)¨@guide-api-legacy|指南 (Guide-Api) +guide-api|指南 (Guide-Api)¨@guide-api-legacy|指南 (Guide-Api) - Archive fraghappy-reborn genetics-reborn|基因重生* router-reborn|路由重生* -coroutil¨@coroutil +coroutil@ vanilla-magic|原生魔法* taoism|御灵* - +essentialcraft-4-unofficial|源质魔法4非官方版 (EssentialCraft 4 Unofficial) celestial-craft|天体* lost-thaumaturgy|失落神秘 (Pengu's Lost Thaumaturgy) compact-machines|更多空间/压缩空间* @@ -723,7 +723,7 @@ extraplanets|额外行星 (Extra Planets) xtracraft-mod|X工艺 (XtraCraft Mod) - +formivore-generators-walled-city-great-wall-ca|城墙城市生成 (Cellular Automata Generator/Great Wall Mod/Walled City Generator) voltz-engine blocklings|方块酱* @@ -753,7 +753,7 @@ thaumores|奥能矿物 (ThaumOres) notenoughthaumcrafttabs|无限神秘标签页 (Not Enough Thaumcraft Tabs) natures-compass@|自然罗盘/生物群系指南针 (Nature's Compass) warp-theory|神秘扭曲学* -hammer-lib|锤子核心 (Hammer Core/Hammer Lib) +hammer-lib@|锤子核心 (Hammer Core/Hammer Lib) thermal-casting|热力铸造室* thermal-smeltery-redux|热力冶炼厂重置版* @@ -786,29 +786,29 @@ snad|子沙* storage-drawers-extras solar-flux-reborn|日光通量:重制版* simple-void-world|简单虚空世界* -shetiphiancore¨shetiphiancore-fabric¨@shetiphiancore +shetiphiancore@¨shetiphiancore-fabric shadowmc scannable|扫描器* rebornstorage|存储重置 (Reborn Storage) quantumstorage|量子存储 (QuantumStorage) - +p455w0rds-library mtlib open-glider|滑翔翼* mputils shadowfacts-forgelin eleccore -infinitylib¨@infinitylib +infinitylib@ dark-utilities@ flux-networks|通量网络* -flat-colored-blocks-forge|平滑色块 (Flat Colored Blocks) - Forge¨flat-colored-blocks-fabric|平滑色块 (Flat Colored Blocks) - Fabric +flat-colored-blocks-forge|平滑色块 (Flat Colored Blocks)¨flat-colored-blocks-fabric|平滑色块 (Flat Colored Blocks) jei-bees -chisels-bits|雕凿工艺 (Chisels & Bits) - Forge¨chisels-bits-for-fabric|雕凿工艺 (Chisels & Bits) - Fabric +chisels-bits|雕凿工艺 (Chisels & Bits)¨chisels-bits-for-fabric|雕凿工艺 (Chisels & Bits) architecturecraft|建筑师工艺 (Architecture Craft) chameleon|变色龙* mrtjpcore cyclops-core@ -netherportalfix|下界传送门修正 (NetherPortalFix) - Forge¨netherportalfix-fabric|下界传送门修正 (NetherPortalFix) - Fabric¨@netherportalfix|下界传送门修正 (NetherPortalFix) +netherportalfix@|下界传送门修正 (NetherPortalFix)¨netherportalfix-fabric|下界传送门修正 (NetherPortalFix) rftools-dimensions@|RF工具:维度 (RFTools Dimensions) signals|信号* extreme-reactors@|极限反应堆* @@ -854,17 +854,17 @@ afsu-mod lightningcraft|雷电工艺 (LightningCraft) just-enough-resources-jer@ morpheus -wall-jump|飞檐走壁* - Forge¨wall-jump-fabric|飞檐走壁 (Wall Jump) - Fabric +wall-jump|飞檐走壁*¨wall-jump-fabric|飞檐走壁 (Wall Jump) condensed-block-mod-reborn|凝结成块* refined-avaritia -weather-storms-tornadoes|局部气候&风暴 (Weather, Storms & Tornadoes)¨@weather-storms-tornadoes|局部气候&风暴 (Weather, Storms & Tornadoes) +weather-storms-tornadoes@|局部气候&风暴 (Weather, Storms & Tornadoes) new-things survivalist|生存主义* mystic-divination|秘契占星术* cofh-lib tabula-rasa cofhtweaks -ender-io-zoo|末影动物园 (Ender IO Zoo/Ender Zoo) - 作为末影接口拓展模组的 Ender IO Zoo¨ender-zoo|末影动物园 (Ender IO Zoo/Ender Zoo) - 独立的 Ender Zoo¨@enderio-zoo|末影动物园 (Ender IO Zoo/Ender Zoo) +ender-io-zoo@enderio-zoo|末影动物园 (Ender IO Zoo/Ender Zoo)¨ender-zoo|末影动物园 (Ender IO Zoo/Ender Zoo) - 独立的 Ender Zoo simple-usage-log|简易日志* omnis-core auto-paths|自动路径* @@ -875,9 +875,9 @@ Leather-Works|皮革加工厂* cyberware|机械改造* thermal-cultivation@|热力农业* better-builders-wands|更好的建筑之杖 (Better Builder's Wands) -jaopca +jaopca@ chickens|更多鸡* -tragicmc2|悲惨世界2 (TragicMC2) +tragicmc2|悲惨世界2 (TragicMC 2) mobdrip customskinloader@|万用皮肤补丁 (CustomSkinLoader) @@ -894,7 +894,7 @@ darkcore|暗黑核心* tardis-mod|时间和空间的相对维度 (TARDIS MOD) - +another-one-bites-the-dust-berry-bushes gokistats|天赋技能树 (GokiStats) tropicraft|热带世界* @@ -911,7 +911,7 @@ back-to-eco|生态回归 (Back to Eco) world-of-warcraft|魔兽世界* the-witcher-adventure|猎魔人* fancy-battleaxes@|华丽战斧* - +zora-no-densha|Zora的电车 (Zora no Densha) roguelike-dungeons|冒险地牢* first-aid@firstaid|急救/医疗护理* bonfires@|篝火* @@ -983,7 +983,7 @@ voxelmap|体素地图 (VoxelMap) mowzies-mobs|Mowzie的生物 (Mowzie's Mobs) thaumcraft-mob-aspects - +magical-psi starcraft-mod-scmc|星际争霸2 (StarCraft II in MineCraft) covens-reborn grappling-hook-mod@|抓钩* @@ -1061,14 +1061,14 @@ lovelyrobot|萌化机器人 (LovelyRobot) tameable-arachne|萌化女妖* skillable lunatriuscore - +spin-to-win|旋转剑技 (Spin to Win) soft-blocks|柔软方块* heartblock|生命方块 (HeartBlock) spawncontroller|自定义怪物生成 (SpawnController) wearable-backpacks@wearablebackpacks|可穿戴背包* heart-drop|生命汲取* omlib|开放式炮台库 (OMLib) - +dynamictrees@|动态的树/有活力的树 (Dynamic Trees) merry-christmas|圣诞箱子 (Merry Christmas!) cloud-control|可控制的云* zombie-ore|矿石僵尸 (Zombie ore) @@ -1079,10 +1079,10 @@ rough-tweaks|难度调整* the-disenchanter-mod|祛魔台 (The Disenchanter) carry-on@|搬运* -better-than-llamas|更好看的羊驼* - Forge¨better-than-llamas-fabric|更好看的羊驼 (Better Than Llamas) - Fabric -dynamic-surroundings|动态环境/动态环绕* - Forge¨dynamic-surroundings-fabric-edition@dynamicsurroundingsfabric|动态环境/动态环绕 (Dynamic Surroundings) +better-than-llamas|更好看的羊驼*¨better-than-llamas-fabric|更好看的羊驼 (Better Than Llamas) +dynamic-surroundings@dynamicsurroundingsfabric|动态环境/动态环绕*¨dynamic-surroundings-fabric-edition|动态环境/动态环绕 (Dynamic Surroundings) alfheim|亚尔夫海姆* -mob-battle-mod|怪物大乱斗* - Forge¨mob-battle-mod-fabric|怪物大乱斗 (Mob Battle Mod) - Fabric¨@mob-battle-mod|怪物大乱斗 (Mob Battle Mod) +mob-battle-mod@|怪物大乱斗*¨mob-battle-mod-fabric|怪物大乱斗 (Mob Battle Mod) smooth-font|平滑字体* reskillable @@ -1107,7 +1107,7 @@ bonsai-trees|盆栽* misty-world@|朦胧世界* -beta-kathairis|卡塞瑞斯 (Kathairis/Kether) - 1.12.x¨kathairis-alive|卡塞瑞斯 (Kathairis/Kether) - 1.13+ +beta-kathairis|卡塞瑞斯 (Kathairis/Kether)¨kathairis-alive|卡塞瑞斯 (Kathairis/Kether) manametal|魔法金属 (ManaMetalMod) avaritiaddons|无尽收容 / 更多空间箱子* base @@ -1116,7 +1116,7 @@ immersive-cables|沉浸线缆* better-title-screen|更好的标题页* sound-filters|声音滤波器* lambda-craft|半条命 (LambdaCraft) -vivecraft@¨vivecraft-forge-extensions|Vivecraft - 本模组的 Forge 服务端支持,非模组本体 +vivecraft@¨vivecraft-forge-extensions super-sound-muffler|超级消音器* armorplus@|装备扩充 (ArmorPlus) inspirations|灵感* @@ -1124,17 +1124,17 @@ tree-growing-simulator|跳舞树成长* personal-cars thermal-innovation@|热力革新* -bewitchment-legacy|巫师之路 (Bewitchment) - 1.12¨bewitchment|巫师之路* - 1.16+¨@bewitchment|巫师之路 (Bewitchment) +bewitchment-legacy@bewitchment|巫师之路 (Bewitchment)¨bewitchment|巫师之路* better-foliage|更好的树叶* creative-plus|创造+* just-a-few-fish|只是一些鱼 (Just a Few Fish) ynot serene-seasons@|静谧四季/季节* realm-of-the-dragons-rotd|龙之领域 (Realm Of The Dragons) -rockhounding-mod-core|地质探秘/岩石狩猎 (RockHounding) - Mod核心-几乎没有添加物品,相当于前置¨rockhounding-mod-chemistry|地质探秘/岩石狩猎 (RockHounding) - 化学分包-添加了大量机器与金属元素¨rockhounding-mod-rocks|地质探秘/岩石狩猎 (RockHounding) - 岩石分包-添加了大量岩石与有关装饰方块¨rockhounding-mod-surface|地质探秘/岩石狩猎 (RockHounding) - 地表分包-添加了大量会在自然环境中出现的地表事物¨rockhounding-mod-ore-tiers|地质探秘/岩石狩猎 (RockHounding) - 矿物分包-修改了铁矿与煤矿的生成方式与冶炼方式¨rockhounding-fluid-pipeline|地质探秘/岩石狩猎 (RockHounding) - 管道分包-添加了一套独立于化学分包的管道系统¨rockhounding-mod|地质探秘/岩石狩猎 (RockHounding) - 地质探秘的1.7和1.8版本 +rockhounding-mod-core|地质探秘/岩石狩猎 (RockHounding) - Mod核心-几乎没有添加物品,相当于前置¨rockhounding-mod-chemistry|地质探秘/岩石狩猎 (RockHounding) - 化学分包-添加了大量机器与金属元素¨rockhounding-mod-rocks|地质探秘/岩石狩猎 (RockHounding) - 岩石分包-添加了大量岩石与有关装饰方块¨rockhounding-mod-surface|地质探秘/岩石狩猎 (RockHounding)¨rockhounding-mod-ore-tiers|地质探秘/岩石狩猎 (RockHounding)¨rockhounding-fluid-pipeline|地质探秘/岩石狩猎 (RockHounding)¨rockhounding-mod|地质探秘/岩石狩猎 (RockHounding) fancy-block-particles|梦幻方块效果* thaumic-katana|神秘之日本刀* -the-aether-ii|天境二 (The Aether II)¨@aether-ii|天境二 (The Aether II) +the-aether-ii@aether-ii|天境二 (The Aether II) visibleraygenerator|永久光发电机 (VisibleRay Generator) mmmmmmmmmmmm@|试验假人 (MmmMmmMmmMmm / Target Dummy) aromabackup|存档备份 (AromaBackup) @@ -1166,10 +1166,10 @@ hexxit-gear|Hexxit装备* magic-clover|幸运四叶草* inventory-crafting-grid|背包工作台* -kleeslabs|更好地破坏半砖 (KleeSlabs) - Forge¨kleeslabs-fabric|更好地破坏半砖 (KleeSlabs) - Fabric¨@kleeslabs|更好地破坏半砖 (KleeSlabs) -opencubicchunks +kleeslabs@|更好地破坏半砖 (KleeSlabs)¨kleeslabs-fabric|更好地破坏半砖 (KleeSlabs) + gregtechce|格雷科技社区版 (GregTech Community Edition) -blur|界面背景模糊* - Forge¨blur-fabric@|界面背景模糊 (Blur) +blur@blur-fabric|界面背景模糊*¨blur-fabric|界面背景模糊 (Blur) fast-leaf-decay|树叶快速腐烂* enable-cheats|开启作弊模式* findit|找到它 (Findit!) @@ -1182,19 +1182,19 @@ historicized-medicine|历史化医学* infinity-item-editor|无尽物品编辑器* extra-rails|更多功能铁轨* gregtania - +origin minecraft-transport-simulator@immersive-vehicles|沉浸车辆 (Immersive Vehicles) chest-transporter|搬箱器* i18nupdatemod@|自动汉化更新 (I18nUpdateMod) realistic-item-drops|真实物品掉落* pixelmon@|像素精灵宝可梦 重铸* -@controlling|键位冲突显示 (Controlling) +controlling@|键位冲突显示*¨controlling-for-fabric|键位冲突显示 (Controlling) simpleleather|腐肉烧皮革 (SimpleLeather) sync|克隆* chiseled-me|超级变变变* - +progressive-automation-early-miner|进阶自动化 (Progressive Automation) matmos|真实环境音效 (MAtmos) ye-olde-tanks|水箱* improving-minecraft|改善的世界* @@ -1207,7 +1207,7 @@ nei-addons|NEI扩充 (NEI Addons) cucumber@ hunting-dimension|狩猎维度* runes-of-wizardry|符文魔法 (Runes-of-Wizardry) -dynamictrees@|动态的树/有活力的树 (Dynamic Trees) + coffee-workshop|咖啡工坊* in-game-account-switcher@|游戏内账号切换 (In-Game Account Switcher) consecration@|圣化* @@ -1222,7 +1222,7 @@ tough-expansion|意志坚定:热力附属* mystical-agradditions@|神秘农业扩展* vanillafix|原版修复 (VanillaFix) just-enough-harvestcraft|更多潘马斯配方查询 (Just Enough HarvestCraft) -charcoal-pit¨@charcoal_pit +charcoal-pit@charcoal_pit uncomplication|IC2exp还原* the-wings-of-alfheim-1-7-10|亚尔夫海姆之翼 (The Wings of Alfheim) @@ -1254,7 +1254,7 @@ numina|模块化动力装甲前置* tinkers-complement@|匠魂补充 (Tinkers' Complement) everlastingabilities|永恒能力 (EverlastingAbilities) abyssalcraft-heads|深渊国度头颅 (AbyssalCraft Heads) -overlord|不死者之王*¨@overlord|不死者之王 (Overlord) +overlord@|不死者之王* multifarm-crops|多功能农场兼容* forestry-fermenter-addon|更多生物质* dakimakura-mod|抱枕* @@ -1287,7 +1287,7 @@ mobdrops|更多掉落 (MobDrops) states|城邦* modular-machinery|模块化机械* compositegear|复合齿轮/复合装甲 (Composite Gear) -kiwi¨kiwi-fabric¨@kiwi +kiwi@¨kiwi-fabric cuisine|料理工艺 🍳 (Cuisine 🍳) world-control|世界控制* @@ -1315,7 +1315,7 @@ enchanting-plus@|高级附魔台* stick-of-death|死亡之棍 (The Stick Of Death) godweapons|神的武器 (Gods' Weapons) sekwah41s-naruto-mod|sekwah41的火影忍者 (sekwah41's Naruto Mod) -constructs-armory|匠魂盔甲 (Construct's Armory)¨@constructs-armory|匠魂盔甲 (Construct's Armory) +constructs-armory@|匠魂盔甲 (Construct's Armory) undertale-mod|传说之下* globe|水晶球* @@ -1331,12 +1331,12 @@ armoreablemobs|怪物装备自定义 (ArmoreableMobs) advanced-inventory -crafting-pillar-mod|合成柱* + pollution-of-the-realms|环境污染/领域的污染 (Pollution of the Realms) heat-and-climate-lib -waystones|传送石碑/指路石* - Forge¨waystones-fabric|传送石碑/指路石 (Waystones) - Fabric¨@waystones|传送石碑/指路石 (Waystones) +waystones@|传送石碑/指路石*¨waystones-fabric|传送石碑/指路石 (Waystones) thaumic-calculations|神秘计算器* pams-weee-flowers|潘马斯花园 (Pam's Weee! Flowers) @@ -1367,33 +1367,33 @@ gemulation silents-gems-extra-parts|寂静宝石:额外部件 (Silent's Gems: Extra Parts) fun-ores|趣味矿石* solar-furnaces|简易太阳能 (Simple Solar Panels) -vanilladeathchest|原版死亡箱子 (Vanilla Death Chest) - Forge¨vanilladeathchest-fabric@vanilladeathchest|原版死亡箱子 (Vanilla Death Chest) +vanilladeathchest@|原版死亡箱子 (Vanilla Death Chest)¨vanilladeathchest-fabric|原版死亡箱子 (Vanilla Death Chest) arachnophobia|蜘蛛恐惧症* abyssalcraft-integration|深渊国度联动 (AbyssalCraft Integration) -prefab|预制建筑* - Forge¨prefab-fabric@prefab|预制建筑 (Prefab) +prefab@|预制建筑*¨prefab-fabric|预制建筑 (Prefab) haunch-hud absent-by-design@ no-nv-flash@|无夜视闪烁 (No Night Vision Flashing) arcade-mod|街机* -asmodeuscore +asmodeuscore@ building-gadgets|建筑小帮手* dooglamoo-worlds|Dooglamoo的世界* scp-lockdown|SCP基金会:封锁 (SCP: Lockdown) middle-earth-thaumaturgy|中土神秘学 (Middle-Earth Thaumaturgy) structpro-mod-fast-schematic-spawning-system|自然神殿 (Structpro) betterfps|更好的FPS (BetterFPS) - -reap-mod|收获 (Reap) +sky-compression +reap-mod@|收获 (Reap) geolosys|地质矿脉* -patchouli|帕秋莉手册* - Forge¨patchouli-fabric|帕秋莉手册 (Patchouli) - Fabric/Quilt¨@patchouli|帕秋莉手册 (Patchouli) - +patchouli@|帕秋莉手册*¨patchouli-fabric|帕秋莉手册 (Patchouli) +jeid gases-framework ranged-pumps@|范围泵* bagginses|背包* - - +ic2-classic|工业时代2经典版 (IC2 Classic) +opencubicchunks cubicworldgen - +rally-health open-terrain-generator|开放式地形生成器* noshelter|无庇护所 (NoShelter) @@ -1407,20 +1407,20 @@ sound-physics-fabric|物理声效 (Sound Physics) plethora-peripherals simple-flight|简单的飞行* factory-tech|工厂科技 (FactoryTech) -block-renderer¨blockrenderer + mysticallib crissaegrim -traverse-reforged|遍历 (Traverse) - Forge版[1.12.X~1.16.5, 1.18.2,1.19.2]¨traverse|遍历* - Fabric版[1.14.X~1.20]¨@traverse-legacy|遍历 (Traverse) - Forge 1.11.2 和 1.12.2¨@traverse|遍历 (Traverse) - Fabric - +traverse-reforged@traverse-legacy|遍历 (Traverse)¨traverse@|遍历* +winter-wonder-land|霏雪寄语之地* road-stuff@|道路2 (Road Stuff2) ae2wtlib real-filing-cabinet|仿真档案柜* hycrafthds-wtf-ic2-addon|WTF 工业拓展 (WTF Ic2 Addon) u-team-core -ftb-quests|FTB任务 (FTB Quests) - Forge¨ftb-quests-fabric|FTB任务 (FTB Quests) - Fabric +ftb-quests|FTB任务 (FTB Quests)¨ftb-quests-fabric|FTB任务 (FTB Quests) texfix@|材质修复 (TexFix) mapmakers-gadgets|地图作者小帮手 (Mapmaker's Gadgets) travellers-gear|旅者之器 (Traveller's Gear) @@ -1457,7 +1457,7 @@ thedragonlib@ repose|自动上坡* botanic-additions|植物学拓展* -veggieway-fabric|素食主义者 (The Veggie Way) - Fabric¨the-veggie-way|素食主义者* - Forge +veggieway-fabric|素食之道 (The Veggie Way)¨the-veggie-way|素食之道* gargoyles-mod|石像鬼 (Gargoyles) hydrophobia|恐水症* dimensional-edibles|维度食物* @@ -1477,8 +1477,8 @@ orelib tick-dynamic|动态Tick (Tick-Dynamic) surge@|潮涌* more-avaritia -ai-improvements|AI改进 (AI Improvements)¨@ai-improvements|AI改进 (AI Improvements) -project-ex|等价交换升级 (FTB Project EX/ExtendedExchange) - 1.16.5 及以下¨extendedexchange|等价交换升级 (FTB Project EX/ExtendedExchange) - 1.18.2 +ai-improvements@|AI改进 (AI Improvements) +project-ex|等价交换升级 (FTB Project EX/ExtendedExchange)¨extendedexchange|等价交换升级 (FTB Project EX/ExtendedExchange) xaeros-world-map@|Xaero的世界地图 (Xaero's World Map) wizardry-mod|巫师艺术 (Wizardry) @@ -1498,7 +1498,7 @@ contenttweaker@ from-the-ground-up|白手起家* clumps@|经验机制改革* dynamic-surroundings-huds|动态环境:信息显示 (Dynamic Surroundings: HUDs) -crafting-tweaks|合成辅助* - Forge¨crafting-tweaks-fabric|合成辅助 (Crafting Tweaks) - Fabric¨@crafting-tweaks|合成辅助 (Crafting Tweaks) +crafting-tweaks@|合成辅助*¨crafting-tweaks-fabric|合成辅助 (Crafting Tweaks) limelib sparks-hammers|重锤火花* deadly-monsters|致命怪物* @@ -1506,7 +1506,7 @@ vanillaautomation|原版自动化 (VanillaAutomation) tickprofiler|Tick分析器 (TickProfiler) vanilla-immersion|立体工具方块* earthworks|土方工程* -terraqueous|地灵云心/海树山花* - Forge¨terraqueous-fabric|地灵云心/海树山花 (Terraqueous) - Fabric +terraqueous|地灵云心/海树山花*¨terraqueous-fabric|地灵云心/海树山花 (Terraqueous) initial-inventory|自定义初始物品* interaction-wheel@ water-strainer|滤水器* @@ -1516,7 +1516,7 @@ xl-food-mod|超多食物 (XL Food Mod) soot|烟尘* hp-spells|哈利·波特:法术 (Harry Potter Spells) recurrent-complex|自然建筑生成* - +capabilityproxy|功能代理 (CapabilityProxy) reauth¨reauth-fabric autoverse transprot|运输* @@ -1529,7 +1529,7 @@ valkyrien-warfare@valkyrien-skies|瓦尔基里天空/瓦尔基里战争 (Valkyri item-scroller|物品滚轮* better-advancements@|更好的进度* lucraft-core -progressive-bosses|进化的BOSS* - Forge¨fabric-progressive-bosses|进化的BOSS (Progressive Bosses) - Fabric¨@progressive-bosses|进化的BOSS (Progressive Bosses) +progressive-bosses@|进化的BOSS*¨fabric-progressive-bosses|进化的BOSS (Progressive Bosses) persistent-bits rc-roads|真实公路 (RC Roads) emoticons|动作表情* @@ -1558,7 +1558,7 @@ simple-login|简单登录* grim-pack|Grim的Mod整合* artisan-worktables|工匠之作/工匠工作台* ptrlib - +creeper-awareness|爬行者意识* what-fluid-fix blue-skies@|蔚蓝浩空* project-vibrant-journeys|活力之旅 (Project: Vibrant Journeys) @@ -1584,7 +1584,7 @@ fence-jumper|越过栅栏* enchantments-exchanger|便携附魔替换台* additional-enchanted-miner@ treasure-bags|宝藏袋* - +stevecraft-by-owenpsteve2|史蒂夫工艺 (SteveCraft) hunger-games|饥饿游戏 (The Hunger Games) tfctech-addon|群峦工业 (TFCTech Addon) yunomakegoodmap @@ -1602,10 +1602,10 @@ littletiles@|LT小方块 (LittleTiles) extended-crafting@|合成拓展* prodigy-tech|奇才妙械* -item-filters|物品过滤器 (Item Filters​) - Forge;Fabric,NEW¨item-filters-fabric|物品过滤器 (Item Filters​) - Fabric,OLD¨@item-filters|物品过滤器 (Item Filters​) +item-filters@|物品过滤器 (Item Filters​)¨item-filters-fabric|物品过滤器 (Item Filters​) eblib notenoughcodecs -future-mc|未来的MC (Future MC)¨@future-mc|未来的MC (Future MC) +future-mc@|未来的MC (Future MC) rope-bridge|索桥* sbm-oil-ore|油矿石 (Oil Ore) redstone-minus-redstone|红石减红石* @@ -1615,7 +1615,7 @@ integrated-terminals@|集成终端* mekanism-tools@|通用机械工具* roboticparts|机械改造1.12+ (Robotic Parts) rewired -oh-the-biomes-youll-go|你将去的生物群系 (Oh The Biomes You'll Go) - Forge¨oh-the-biomes-youll-go-fabric|你将去的生物群系 (Oh The Biomes You'll Go) - Fabric +oh-the-biomes-youll-go@biomesyougo|你将去的生物群系 (Oh The Biomes You'll Go)¨oh-the-biomes-youll-go-fabric|你将去的生物群系 (Oh The Biomes You'll Go) vertically-stacked-dimensions|垂直堆叠的世界* malisisswitches @@ -1635,7 +1635,7 @@ electroblobs-wizardry|巫术学 (Electroblob's Wizardry) moarsigns|更多告示牌 (MoarSigns) kamen-rider-craft|假面骑士工艺 (KamenRiderCraft) avaritia-io|无尽贪婪:接口 (Avaritia IO) -dense-neutron-collectors|致密中子态素收集器* - 1.12.2¨dense-neutron-collectors-1-7|致密中子态素收集器 (Dense Neutron Collectors) - 1.7.10 +dense-neutron-collectors|致密中子态素收集器*¨dense-neutron-collectors-1-7|致密中子态素收集器 (Dense Neutron Collectors) pubgmc-mod mobultion|进化怪物 (mobultion) waddles @@ -1644,7 +1644,7 @@ thutcore resource-pack-organizer@|资源包管理器* morcant-ore|莫桑矿石* force-void-world|强制虚空世界* -i-am-very-smart-forge|我很聪明 (I Am Very Smart) - Forge¨i-am-very-smart|我很聪明* - Fabric +i-am-very-smart-forge|我很聪明 (I Am Very Smart)¨i-am-very-smart|我很聪明* far-from-home|背井离乡* cotton oxygen-teleportation @@ -1653,7 +1653,7 @@ lead-villagers|带领村民* delta-hard-mode|Delta 困难模式* id-squeezer-tweak food-ores|食物矿石* -sit|席地而坐* - Forge¨sit-fabric|席地而坐 (Sit) - Fabric¨@bl4cks-sit|席地而坐 (Sit) +sit@bl4cks-sit|席地而坐*¨sit-fabric|席地而坐 (Sit) @@ -1667,12 +1667,12 @@ musiccraft-mod|音乐工艺 (MusicCraft mod) hardcore-darkness|真实的黑夜* cola-craft|可乐工艺* -backstab|背刺 (BackStab) +backstab|背刺* dynamic-stealth|动态潜行* roughly-enough-items@rei|REI物品管理器* -modmenu|模组菜单 (Mod Menu) +modmenu@|模组菜单 (Mod Menu) architectury-quilt illuminations¨illuminations-forge mappy @@ -1681,14 +1681,14 @@ mrcrayfishs-vehicle-mod|MrCrayfish的载具 (MrCrayfish's Vehicle Mod) cc-tweaked@ aliensvspredator|异形大战铁血战士 (AliensVsPredator) dragon-murder -refined-machinery|精致机械* + birds-nests|鸟巢* minecraft-animated +refined-machinery|精致机械* -@modmenu|模组菜单 (Mod Menu) magicalsculpture|魔法雕像 (MagicalSculpture) ash-another-simple-hud|另一个简单的HUD (Another Simple HUD) -custom-selection-box-port|自定义选择框 (Custom Selection Box)¨customselectionbox|自定义选择框 (Custom Selection Box) - 1.7.10~1.8 +customselectionbox|自定义选择框 (Custom Selection Box)¨custom-selection-box-port|自定义选择框 (Custom Selection Box) - 已失效 librikka-api not-enough-wands@|更多魔杖* deep-mob-learning-blood-magic-addon|深度怪物知识-血魔法插件 (Deep Mob Learning - Blood Magic Addon) @@ -1706,7 +1706,7 @@ the-emerald-haven|翡翠天堂* simple-grinder@simplegrinder|简易研磨机* redstone-gauges-and-switches|红石测量与开关 (Gauges and Switches) apotheosis|神化* -lighting-wand|照明魔杖 🌟 (Lighting Wand 🌟) - Forge¨lighting-wand-fabric|照明魔杖 🌟 (Lighting Wand 🌟) - Fabric +lighting-wand|照明魔杖 🌟 (Lighting Wand 🌟)¨lighting-wand-fabric|照明魔杖 🌟 (Lighting Wand 🌟) terrarium|地球* climatic-biomes howling-moon|狼人* @@ -1723,13 +1723,13 @@ rats@|老鼠* serversync|服务器同步 (ServerSync) auxilium-equivalence|等价交换辅助 (Auxilium Equivalence / Auxilium) -bionisation-4|细菌病毒 (Bionisation) - 细菌病毒4 1.16.5+¨bionisation-3|细菌病毒 (Bionisation) - 细菌病毒3 1.11 - 1.12¨bionisation-2|细菌病毒 (Bionisation) - 细菌病毒2 1.9 - 1.11¨bionisation|细菌病毒* - 细菌病毒1 1.7.10¨@bionisation-4|细菌病毒 (Bionisation) +bionisation-4|细菌病毒 (Bionisation)¨bionisation-3|细菌病毒 (Bionisation)¨bionisation-2|细菌病毒 (Bionisation)¨bionisation|细菌病毒*¨@bionisation-4|细菌病毒 (Bionisation) tiny-mob-farm|迷你刷怪场* soulus sanlib -travelers-backpack|旅行者背包 (Traveler's Backpack) - Forge¨travelers-backpack-fabric|旅行者背包 (Traveler's Backpack) - Fabric¨@travelersbackpack|旅行者背包 (Traveler's Backpack) +travelers-backpack@travelersbackpack|旅行者背包 (Traveler's Backpack)¨travelers-backpack-fabric|旅行者背包 (Traveler's Backpack) gregtech-classic|格雷科技经典版 (GregTech Classic) aperture combo-armors|组合装甲 (IC2ComboArmors) @@ -1741,19 +1741,19 @@ ping the-legends-mod bad-wither-no-cookie-reloaded¨bad-wither-no-cookie-reloaded-fabric giacomos-fishing-net -the-hospital-mod|医院Mod*¨hospital-mod-facilities-pack|医院Mod (The Hospital Mod) - 设施包1.12.2¨hospital-mod-theatres-pack|医院Mod (The Hospital Mod) - 墙壁和地板包1.12.2¨hospital-mod-pharmacy-pack|医院Mod (The Hospital Mod) - 药房设施包1.12.2,1.14.4 +the-hospital-mod|医院Mod*¨hospital-mod-facilities-pack|医院Mod (The Hospital Mod)¨hospital-mod-theatres-pack|医院Mod (The Hospital Mod)¨hospital-mod-pharmacy-pack|医院Mod (The Hospital Mod) more-charcoal|更多木炭* born-in-a-barn@ better-animations-collection@|更好的动物动作* quality-tools|工具品质* - +toolscombine|工具组合 (Tools Combine) pollutant-pump|污染泵* infinite-pollution-filter|无限污染过滤器* jei-hider fastflyblockbreaking|飞行速破 (Fast Fly Block Breaking) -exhausted-stamina|竭力攻击* + planttech-2|植物科技2 (PlantTech 2) toast-control|消息框控制* @@ -1763,10 +1763,10 @@ classic-combat|经典战斗* less-lag|较少的滞后* goodbye-grass|没有草丛 (Grassta la Vista) -phosphor@|磷*¨phosphor-forge|磷 (Phosphor) - Forge +phosphor@|磷*¨phosphor-forge|磷 (Phosphor) clay-bucket|粘土桶* extra-anvils|更多铁砧/更多砧 (Extra anvils) -glassential|精致玻璃* - Forge¨glassential-fabric|精致玻璃 (Glassential) - Fabric/Quilt +glassential|精致玻璃*¨glassential-fabric|精致玻璃 (Glassential) tinkers-addons@|匠魂拓展 (Tinkers' Addons) barrels-drums-storage-more|桶,圆桶,存储&更多 (Barrels, Drums, Storage & More) wings|翅膀* @@ -1791,13 +1791,13 @@ dm2|龙骑士2 (Dragon Mounts 2) tiquality loot-capacitor-tooltips|电容信息显示* classic-bars|经典状态条* -@biomesyougo|你将去的生物群系 (Oh The Biomes You'll Go) + overground-ores|地表矿石* -touhou-little-maid|车万女仆* +touhou-little-maid@|车万女仆* eureka lazy-ae2|懒人AE2 (Lazy AE2) - +libnine equaldragons berries infinity-gauntlet-mod|无限手套 (Infinity Gauntlet) @@ -1814,9 +1814,9 @@ crafttweaker-utils fps-reducer@|FPS减速器 (FPS Reducer) freelook|自由视角 (FreeLook) -spacecraftx|航天高科X (SpaceCraftX) - 1.10.2 ~ 1.12.2 原版¨spacecraftx-reloaded|航天高科X (SpaceCraftX) - 1.12.2 重置版 +spacecraftx@spacecraftx-reloaded|航天高科X (SpaceCraftX)¨spacecraftx-reloaded|航天高科X (SpaceCraftX) -bamboo-everything|竹子制品* - Forge 及 Fabric 1.18+¨bamboo-everything-fabric|竹子制品 (Bamboo Everything) - Fabric 1.16 以下¨@bamboo-everything|竹子制品 (Bamboo Everything) +bamboo-everything@|竹子制品*¨bamboo-everything-fabric|竹子制品 (Bamboo Everything) nofog@no_fog|没有雾 (NoFog) essentia-brazier|源质火盆* antipotionmod-1-12-2|无药水效果 (AntiPotionMod) @@ -1841,17 +1841,17 @@ super-factory-manager@|超级工厂管理* sakura|樱* sips|更多液体容器* gregs-construct|格雷与匠魂 (Greg's Construct) -ultra-awesome-tools-mod|超级工具 (Super Tools) +ultra-awesome-tools-mod|超级工具 (Super Tools / Ultra Awesome Tools Mod) locks|锁* special-mobs|特殊怪物* -adorn-for-forge¨adorn¨@adorn +adorn-for-forge@adorn¨adorn missingbits @quickcarpet locky baubleshud -winter-wonder-land|霏雪寄语之地* + @@ -1861,14 +1861,14 @@ ruins-structure-spawning-system|遗迹 (Ruins) armory-expansion|匠魂盔甲扩展* wg-block-replacer|方块生成替换器 (WorldGen Block Replacer) multi-mob-core -jeid + structurize|结构化* improvable-skills|技能进阶 (Improvable Skills 3) bounding-box-outline-reloaded@bbor|自然生成建筑结构显示* sauceconstruct -colorful-hearts|更美观的血条 (Health Overlay/Colorful Hearts) - Forge & Fabric(Colorful Hearts)¨health-overlay-fabric|更美观的血条 (Health Overlay/Colorful Hearts) - Fabric版(Health Overlay)¨health-overlay|更美观的血条 (Health Overlay/Colorful Hearts) - Forge版(Health Overlay)¨@colorful-hearts|更美观的血条 (Health Overlay/Colorful Hearts) +colorful-hearts@|更美观的血条 (Health Overlay/Colorful Hearts)¨health-overlay-fabric|更美观的血条 (Health Overlay/Colorful Hearts)¨health-overlay|更美观的血条 (Health Overlay/Colorful Hearts) auto-feeder-helmet|自动进食头盔* cc-tweaked-fabric simple-farming|简单农业* @@ -1876,7 +1876,7 @@ bigger-packets-please lockyz-extra-dimensions-mod|更多维度世界 (Lockyz Extra Dimensions) psi-combat-magic dtphc|动态的树:潘马斯附属 (Dynamic Trees - Pam's Harvestcraft Compat) -largefluidtank|大型储罐 (Large Fluid Tank) - Forge¨largefluidtank-fabric|大型储罐 (Large Fluid Tank) - Fabric¨@large-fluid-tank|大型储罐 (Large Fluid Tank) +largefluidtank@large-fluid-tank|大型储罐 (Large Fluid Tank)¨largefluidtank-fabric|大型储罐 (Large Fluid Tank) tumbleweed@|风滚草* cubicdynamictreescompat thermallogistics|热力物流学 (Thermal Logistics) @@ -1887,11 +1887,11 @@ magical-instruments|魔法乐器* enderspawn|末影龙再生成 (EnderSpawn) animus scootys-scp-lockdown-extras|SCP重型收容区扩展 (SCP: Lockdown Heavy Containment Zone Expansion) - +modern-glass-doors|时尚玻璃门* lemonlib|柠檬库 (LemonLib) statues-rechiseled|雕像:重置 (Statues: Rechiseled) -trashslot|垃圾槽 (TrashSlot) - Forge¨trashslot-fabric-edition|垃圾槽 (TrashSlot) - Fabric¨@trashslot|垃圾槽 (TrashSlot) -player-plates-forge|更多压力板 (Player Plates) - forge版,fabric版1.19.2/1.20.1¨player-plates-fabric|更多压力板 (Player Plates) - fabric版1.14.x +trashslot@|垃圾槽 (TrashSlot)¨trashslot-fabric-edition|垃圾槽 (TrashSlot) +player-plates-forge|更多压力板 (Player Plates)¨player-plates-fabric|更多压力板 (Player Plates) just-sleep|我就睡个觉* auto-network-lib click-machine|自动连点器* @@ -1901,11 +1901,11 @@ killing-fall more-dogs|更多狗狗* snow-variants|更好的雪* searchable-chests|箱子搜索栏* -bad-mobs¨@bad-mobs +bad-mobs@ mc-paint@mcpaint|涂鸦 (MC Paint) -goprone|匍匐前进 (GoProne) - Forge¨goprone-fabric|匍匐前进 (GoProne) - Fabric +goprone|匍匐前进 (GoProne)¨goprone-fabric|匍匐前进 (GoProne) ceiling-torch@|倒置火把* -air-hop|多段跳* - Forge和Fabric¨air-hop-fabric|多段跳 (Air Hop) - Fabric(1.18~1.18.2)¨@air-hop|多段跳 (Air Hop) +air-hop@|多段跳*¨air-hop-fabric|多段跳 (Air Hop) better-combat-mod|更好的战斗* ftb-money|FTB交易 (FTB Money) restricted-portals|传送门限制* @@ -1917,27 +1917,27 @@ inworldcrafting|世界合成 (InWorldCrafting) food-editor|食物编辑器* custom-starter-gear|自定义初始装备* ct-tinycoal|CT 小型煤炭 (CT TinyCoal) - +tweaker-gui crafttweaker-editor|CraftTweaker 编辑器 (CraftTweaker Editor) unforgiving-void|不那么仁慈的虚空* moretweaker riteclicker-mod|小石子 (RiteClicker Mod) -forgiving-void|仁慈的虚空* - Forge¨forgiving-void-fabric|仁慈的虚空 (Forgiving Void) - Fabric +forgiving-void|仁慈的虚空*¨forgiving-void-fabric|仁慈的虚空 (Forgiving Void) bread-craft|面包工艺* -alchemistry|炼金化学* - Forge¨alchemistry-fabric|炼金化学 (Alchemistry) - Fabric +alchemistry|炼金化学*¨alchemistry-fabric|炼金化学 (Alchemistry) damage-control|伤害控制* prestige|成就点* -yukarilib +energy-converters|能量桥接器* signpost|路标* diagonal-panes|对角线玻璃板* forgelin alchemylib exp-ore-block-mod|经验矿石 (Exp Ore) more-glowstone|更多荧石* - +yukarilib gregic-additions instantlava|无限岩浆 (InstantLava) @@ -1948,14 +1948,14 @@ dttc|动态的树:神秘时代附属 (Dynamic Trees - Thaumcraft Compat) dtbop|动态的树:超多生物群系附属 (Dynamic Trees - Biomes O' Plenty Compat) dynamic-trees-compatibility-for-climatic-biomes|动态的树:气候生态群系附属 (Dynamic Trees Compatibility for Climatic Biomes) capability-adapter|ME功能适配器 (ME Capability Adapter) - +tf2-stuff-mod|军团要塞2 (TF2 stuff mod) mob-control-wands|怪物控制魔杖* -athenaeum¨athenaeum-1-16|Athenaeum - 1.16版 -ore-excavation|矿石挖掘* +athenaeum¨athenaeum-1-16 +ore-excavation@|矿石挖掘* stone-chests|石箱子* kjlib|KJ库 (KJLib) - +iron-chest-minecarts|更多箱子矿车* nether-chest|下界箱子* mob-kill-messages|击杀信息通知* @@ -1968,7 +1968,7 @@ mycommands|我的命令 (MyCommands) hearth-well tea-and-biscuits|茶和饼干* -controllable|手柄控制*¨controllable-fabric|手柄控制 (Controllable) - Fabric +controllable|手柄控制*¨controllable-fabric|手柄控制 (Controllable) genetic-animals|遗传动物* stone-chest|石头箱子* iron-shulker-boxes@|更多潜影盒* @@ -1976,9 +1976,9 @@ mob-dismemberment|怪物肢解* zoo-wild-animals-rebuild|野生动物园:重制版 (Zoo & Wild Animals Rebuilt) kottle customdrones|自定义无人机 (Custom Drones) -call-to-battle-2-authentic-world-war-2-experience|战争召唤2 (Call To Battle 2)¨call-to-battle-the-wwii-mod|战争召唤2 (Call To Battle 2) - 远古版本 +call-to-battle-2-authentic-world-war-2-experience|战争召唤2 (Call To Battle 2)¨call-to-battle-the-wwii-mod|战争召唤2 (Call To Battle 2) - 远古 some-like-it-dry -yungs-better-caves|YUNG的洞穴优化 (YUNG's Better Caves) - Forge¨yungs-better-caves-fabric|YUNG的洞穴优化 (YUNG's Better Caves) - Fabric +yungs-better-caves|YUNG的洞穴优化 (YUNG's Better Caves)¨yungs-better-caves-fabric|YUNG的洞穴优化 (YUNG's Better Caves) resynth|神农科技* flatworld|开山棒 (Flat World) pymtech|皮姆科技 (PymTech) @@ -2005,11 +2005,11 @@ world-primer bookworm openeye|错误报告器 (OpenEye) -let-sleeping-dogs-lie|嘘,别吵醒狗狗* - Forge¨let-sleeping-dogs-lie-for-fabric|嘘,别吵醒狗狗 (Let Sleeping Dogs Lie) - Fabric +let-sleeping-dogs-lie|嘘,别吵醒狗狗*¨let-sleeping-dogs-lie-for-fabric|嘘,别吵醒狗狗 (Let Sleeping Dogs Lie) super-ores|超级矿石* -gravelminer|沙砾终结者 (GravelMiner) - Forge¨gravelminer-fabric|沙砾终结者 (GravelMiner) - Fabric -client-tweaks|客户端微调* - Forge¨client-tweaks-fabric|客户端微调 (Client Tweaks) - Fabric¨@client-tweaks|客户端微调 (Client Tweaks) +gravelminer@|沙砾终结者 (GravelMiner)¨gravelminer-fabric|沙砾终结者 (GravelMiner) +client-tweaks@|客户端微调*¨client-tweaks-fabric|客户端微调 (Client Tweaks) single-use-crafting-table-mod|一次性工作台 (Single-Use Crafting Table Mod) get-back-to-home|回家 (Get Back to Home) expanded-equivalence@|等价扩展* @@ -2018,16 +2018,16 @@ scp-craft-decline|SCPCraft - 下降 (SCPCraft - Decline) tetra@ minestrappolation-5 underwater-biome|深海生态* -create-fabric@|机械动力 (Create)¨create|机械动力* - Forge +create@|机械动力*¨create-fabric@|机械动力 (Create) energeticsheep|脉冲羊 (EnergeticSheep) - +ensorcellation|万象* inventory-sorter|物品分拣* speedster-heroes|闪电侠* -curios¨curios-fabric¨@curios -village-spawn-point|村庄出生点* - Forge¨village-spawn-point-fabric|村庄出生点 (Village Spawn Point) - Fabric¨@village-spawn-point|村庄出生点 (Village Spawn Point) +curios@¨curios-fabric +village-spawn-point@|村庄出生点*¨village-spawn-point-fabric|村庄出生点 (Village Spawn Point) spawnercraft|刷怪笼合成 (SpawnerCraft) openfm|开放电台 (OpenFM) the-dalek-mod @@ -2039,14 +2039,14 @@ magic-kingdoms-mod|魔法王国 (Magic Kingdoms Mod/Schools of Magic Mod) zollern-galaxy|卓伦星系* macaws-bridges|Macaw的桥梁 (Macaw's Bridges) -trample-stopper|防止踩踏* - Forge & Fabric (1.20及以上)¨trample-stopper-fabric|防止踩踏 (Trample Stopper) - Fabric (1.16.5~1.14) +trample-stopper|防止踩踏*¨trample-stopper-fabric|防止踩踏 (Trample Stopper) macaws-roofs|Macaw的屋顶 (Macaw's Roofs) shadows-of-greg|格雷之影 (Shadows of Greg) loottabletweaker@ rockycore tree-tweaker worleys-caves|沃利的洞穴 (Worley's Caves) -additional-structures|失落废墟 (Additional Structures/Rex's Additional Structures) - Forge¨additional-structures-fabric|失落废墟 (Additional Structures/Rex's Additional Structures) - Fabric¨@additional-structures|失落废墟 (Additional Structures/Rex's Additional Structures) +additional-structures@|失落废墟 (Additional Structures/Rex's Additional Structures)¨additional-structures-fabric|失落废墟 (Additional Structures/Rex's Additional Structures) @@ -2054,7 +2054,7 @@ additional-structures|失落废墟 (Additional Structures/Rex's Additional Struc enhancedvisuals@|增强视觉效果/拓展视觉效果 (EnhancedVisuals) potion-fingers-redux|药剂环/药水指环 (Potion Rings) balloon-sheep|气球羊* -farming-for-blockheads|农场贸易 (Farming for Blockheads) - Forge¨farming-for-blockheads-fabric|农场贸易 (Farming for Blockheads) - Fabric¨@farming-for-blockheads|农场贸易 (Farming for Blockheads) +farming-for-blockheads@|农场贸易 (Farming for Blockheads)¨farming-for-blockheads-fabric|农场贸易 (Farming for Blockheads) oreexcavation-integration|矿物开凿 (Ore Excavation Integration) engineers-workshop|工程师工作站* the_legend_of_the_brave|勇者传说 (The Legend of The Brave) @@ -2066,8 +2066,8 @@ reactor-stuff|反应堆材料* traitors-better-swampland-mod|更好的沼泽 (Traitor's Better Swamplands Mod) soviet-abandoned-lab-mod@soviet-era|苏维埃风格装饰 (Soviet Era Mod(earlier Soviet Lab)) -charm¨charm-reforged|Charm - 重置版 Forge 1.16+¨@charm -village-names|村庄名字* - Forge¨villager-names-fabric|村庄名字 (Village Names) - Fabric +charm@¨charm-reforged +village-names@|村庄名字*¨villager-names-fabric|村庄名字 (Village Names) advanced-rocketry-tweaker alternating-flux|交变磁通* projectextended|等价交换扩展 (ProjectExtended) @@ -2088,14 +2088,14 @@ bee-angry-est|愤怒的蜜蜂 (Bee Angry-est) titanium|钛* chemlib¨chemlib-fabric carrots-lib|胡萝卜库 (Carrots Library) -no-hostiles-around-campfire|围火无怪* - Forge / Fabric (1.18+) / Quilt¨no-hostiles-around-campfire-fabric|围火无怪 (No Hostiles Around Campfire) - Fabric 1.16-1.17 (Legacy)¨@no-hostiles-around-campfire|围火无怪 (No Hostiles Around Campfire) -healing-campfire|治愈营火* - Forge¨healing-campfire-fabric|治愈营火 (Healing Campfire) - Fabric¨@healing-campfire|治愈营火 (Healing Campfire) +no-hostiles-around-campfire@|围火无怪*¨no-hostiles-around-campfire-fabric|围火无怪 (No Hostiles Around Campfire) +healing-campfire@|治愈营火*¨healing-campfire-fabric|治愈营火 (Healing Campfire) 231455-minetunes jetif|物品丢入流体 (Just Enough Throwing In Fluids) rftools-base@|RF工具:基础 (RFTools Base) flopper|流体漏斗* - - +exhausted-stamina|竭力攻击* +staminaplus|耐力值 (StaminaPlus) enhanced-armaments|增强装备* spatialcompat|空间兼容 (SpatialCompat) extended-reach @@ -2103,8 +2103,8 @@ no-recipe-book|没有配方书* darknesslib tfcraft@terrafirmacraft|群峦传说 (TerraFirmaCraft) redstone-control|红石控制* -snow-real-magic|雪!真实的魔法!⛄ (Snow! Real Magic! ⛄) - Forge¨snow-real-magic-fabric|雪!真实的魔法!⛄ (Snow! Real Magic! ⛄) - Fabric¨@snow-real-magic|雪!真实的魔法!⛄ (Snow! Real Magic! ⛄) -comforts|舒适用品* - Forge / Fabric / Quilt¨comforts-fabric|舒适用品 (Comforts) - Fabric 1.16.5-1.19.2¨@comforts|舒适用品 (Comforts) +snow-real-magic@|雪!真实的魔法!⛄ (Snow! Real Magic! ⛄)¨snow-real-magic-fabric|雪!真实的魔法!⛄ (Snow! Real Magic! ⛄) +comforts@|舒适用品*¨comforts-fabric|舒适用品 (Comforts) plasmacannon|等离子炮 (PlasmaCannon) plasmaengines|等离子引擎 (PlasmaEngines) bonny-food @@ -2118,7 +2118,7 @@ wesleys-roguelike-dungeons|Wesley的冒险地牢 (Wesley's Roguelike Dungeons) xp-tome@|经验之书* varied-commodities tinkers-things|匠魂扩增 (Tinkers' Things) - +just-enough-buttons|更多的按钮* clock-hud|时间显示器 (Clock HUD) tektopia|桃花源记/特克托皮亚 (TekTopia) @@ -2168,7 +2168,7 @@ ore-core@|矿石核心* ordinary-coins|普通硬币 (Ordinary Coin) peanut-mod|花生! (Peanuts!) - +in-game-wiki-mod betterbedrockgen|更好的基岩 (Better Bedrock Gen) wsbim-legacy-blocks-and-items storage-items-mod @@ -2189,8 +2189,8 @@ glibys-physics|Gliby的物理 (Gliby's Physics) electro-magic-tools-ic2-classic|电子神秘工具 (Electro-Thaumic Tools - IC2 Classic) forceasciifont|强制ASCII字体 (ForceASCIIFont) skewers|烤串* -get-in-the-bucket-mod|进入水桶* - Forge¨get-in-the-bucket-mod-fabric|进入水桶 (Get In The Bucket Mod) - Fabric -fertilization|施肥* - Forge¨fertilization-fabric|施肥 (Fertilization) - Fabric +get-in-the-bucket-mod|进入水桶*¨get-in-the-bucket-mod-fabric|进入水桶 (Get In The Bucket Mod) +fertilization|施肥*¨fertilization-fabric|施肥 (Fertilization) additional-banners|更多旗帜* dropt the-elven-forest|精灵森林 (The Elven Forest​) @@ -2225,7 +2225,7 @@ parabox sky-grid forbidden-arcanus|禁忌与奥秘 (Forbidden and Arcanus) mysticalmechanics|奇械学 (Mystical Mechanics API) -backpacked|背包* - Forge¨backpacked-fabric|背包 (Backpacked) - Fabric +backpacked|背包*¨backpacked-fabric|背包 (Backpacked) starship|星舰 (StarShip) tweakeroo integrated-rest@ @@ -2233,11 +2233,11 @@ citadel@ screenshot-browser|内置截图管理器* -curio-of-undying|不死图腾插槽 (Curio of Undying/Trinket of Undying/Charm of Undying) - Fabric/Forge/Quilt¨curio-of-undying-fabric|不死图腾插槽 (Curio of Undying/Trinket of Undying/Charm of Undying) - Fabric1.16.1-1.19.2¨@charm-of-undying|不死图腾插槽 (Curio of Undying/Trinket of Undying/Charm of Undying) +curio-of-undying@charm-of-undying|不死图腾插槽 (Curio of Undying/Trinket of Undying/Charm of Undying)¨curio-of-undying-fabric|不死图腾插槽 (Curio of Undying/Trinket of Undying/Charm of Undying) explorercraft-worldexpansion|探险者 (Explorercraft) enigmatic-legacy@|神秘遗物* -end-reborn|末地:重生 (End: Reborn) +end-reborn@endorium|末地:重生 (Endorium)¨end-rebellion|末地:重生 (Endorium) ezstorage-2|EZ存储2 (EZStorage 2) more-chickens|更多鸡扩展* @@ -2248,9 +2248,9 @@ jojo-hamon-era@|JoJo-波纹时代 (JoJo-Hamon Era) OpenSecurity|开放式防卫* the-legend-era|传说纪元* -level-up-hp-forge|生命提升 (Level Up HP) - Forge¨level-up-hp|生命提升 (Level Up HP) - Fabric +level-up-hp-forge|生命提升 (Level Up HP)¨level-up-hp|生命提升 (Level Up HP) more-planet-extras -randompatches|随意修复 (RandomPatches) - Forge¨randompatches-fabric|随意修复 (RandomPatches) - Fabric¨@randompatches|随意修复 (RandomPatches) +randompatches@|随意修复 (RandomPatches)¨randompatches-fabric|随意修复 (RandomPatches) ships-mod|船* tfc-metric|公制重量转换 (TFC Metric) @@ -2258,13 +2258,13 @@ tfc-metric|公制重量转换 (TFC Metric) tfc-additions|群峦附加 (TFC-Additions) raolcraft-w -litematica-forge|投影 (Litematica) - Forge(长期但非稳定更新)¨litematica|投影* - Fabric(长期稳定更新) +litematica-forge|投影 (Litematica)¨litematica|投影* telepastries|传送蛋糕 (TelePastries) heroesexpansion|超级英雄拓展 (HeroesExpansion) attributefix@|属性修复 (AttributeFix) dynamic-transport|动态运输* tool-builder|铸器师* -bountifulbaubles|丰富的饰品 (Bountiful Baubles) - Forge¨bountifulbaubles-fabric|丰富的饰品 (Bountiful Baubles) - Fabric +bountifulbaubles|丰富的饰品 (Bountiful Baubles)¨bountifulbaubles-fabric|丰富的饰品 (Bountiful Baubles) manacraft|魔能工艺 (ManaCraft) @@ -2282,14 +2282,14 @@ gregtech6-unofficial|格雷科技6非官方版 (GregTech 6 Unofficial) mahou-tsukai@|魔法使* moar-tinkers -baubley-heart-canisters|心之容器*¨@baubley-heart-canisters|心之容器 (Baubley Heart Canisters) +baubley-heart-canisters@|心之容器* jaopcasingularities|JAOPCA的奇点 (JAOPCA Singularities) -energy-converters|能量桥接器* + labymod guidebook -lithium|锂* - Fabric(不再更新,请转向)¨lithium-forge|锂 (Lithium) - Forge¨@lithium|锂 (Lithium) +lithium@|锂*¨lithium-forge|锂 (Lithium) left-2-mine|求生之路* worldeditcui-forge-edition-2 world-book @@ -2319,11 +2319,11 @@ simply-light|更好的灯* lightning-bolt-mod|雷电攻击* spartan-and-fire|斯巴达之冰与火 (Spartan and Fire) -beacons-for-all¨beacons-for-all-fabric¨@beacons-for-all +beacons-for-all@¨beacons-for-all-fabric +more-flowers|更多功能花* -enchanting-with-thaumcraft|神秘附魔学* -buzzier-bees +buzzier-bees@ lollipop|棒棒糖* enemyz|敌意显示* @@ -2331,7 +2331,7 @@ thaumic-restoration|神秘复辟* primal-boat|原始船舶* - +eyes-in-the-darkness thaumic-augmentation|神秘进阶* lost-magic|失落的魔法* thaumic-arcana @@ -2343,14 +2343,14 @@ multiverse-pouch|多元宇宙袋* electroblobs-wizardry-twilight-forest-spell-pack|巫术学:暮色森林法术包 (Electroblob's Wizardry: Twilight Forest Spell Pack) blockbuster fishs-undead-rising|Fish的不死崛起/Fish的亡灵崛起 (Fish's Undead Rising) -@cloth-config¨cloth-config +cloth-config@ just-map too-realistic-inventory|真实背包 (Realistic Inventory) mob-farm|生物农场 (Mob farm) acceleratorcraft|加速器工艺 (AcceleratorCraft) minecraft-spongebob-squarepants-mod-for-the-1-7-10 utility-worlds|实用世界* -goblin-traders|哥布林商人* - Forge¨goblintraders-fabric|哥布林商人 (Goblin Traders) - Fabric +goblin-traders|哥布林商人*¨goblintraders-fabric|哥布林商人 (Goblin Traders) divine-favor|神的恩惠* volumetric-flask|量瓶* loot-bag-mod|战利品包* @@ -2358,19 +2358,19 @@ loot-bag-mod|战利品包* minecraft-dungeons-mod|我的世界地下城* seasonal-bees|季节性蜜蜂* -carpet|地毯*¨@carpet|地毯 (Carpet) +carpet@|地毯* handmadegunsmodex|自定义枪械 (HandmadeGuns) equivalent-additions@|等价拓展* mixinbootstrap@ powah natural-pledge|自然誓约* -more-berries|更多浆果* +more-berries@|更多浆果* zeiyocraft time-stages|阶段时间* additional-events artemislib - +easy-retrogen|简易重生成* extraplayerrenderer@|额外玩家渲染 (Extra Player Renderer) rwbym libnonymous @@ -2378,14 +2378,14 @@ shattered-moon tinkersurvival|匠魂生存 (Tinkers' Survival) portablecraft|便携物品 (PortableCraft) -better-than-bunnies|给兔子戴上礼帽* - Forge¨better-than-bunnies-fabric|给兔子戴上礼帽 (Better Than Bunnies) - Fabric¨@better-than-bunnies|给兔子戴上礼帽 (Better Than Bunnies) +better-than-bunnies@|给兔子戴上礼帽*¨better-than-bunnies-fabric|给兔子戴上礼帽 (Better Than Bunnies) arcane-essentials|奥术精要* the-aurorian@|极光幽境* egg-auto-hatch|鸡蛋自动孵化* performant|性能优化* tube-transport-system|管道传输系统* -transmutation-alchemy +transmutation-alchemy¨transmutation-alchemy-revival extra-spells-electroblobs-wizardry|额外咒语 (Extra Spells) ancient-spellcraft|古代咒法* moving-elevators@ @@ -2399,7 +2399,7 @@ beyond-the-veil|帷幕彼端* maple-syrup|枫糖* blood-particles|血液粒子效果* nyx -lieutenant +lieutenant@ matthews-difficulty-mod old-combat-system|旧版战斗系统* vampires-need-umbrellas @@ -2407,15 +2407,15 @@ hypnotics|安眠药 (hypnotics) villager-market|村民市场* linear|线性放置* -immersive-portals-for-forge|沉浸式传送门 (Immersive Portals) - Forge(1.16.5/1.18.2/1.19.2/1.19.3)¨immersive-portals-mod|沉浸式传送门 (Immersive Portals) - Fabric(1.17.1/1.18.2/1.19.3)¨@immersiveportals|沉浸式传送门 (Immersive Portals) +immersive-portals-for-forge@immersiveportals|沉浸式传送门 (Immersive Portals)¨immersive-portals-mod|沉浸式传送门 (Immersive Portals) universalbestiary -autumnity|秋原* +autumnity@|秋原* worldgeneration-profiler chunk-in-a-globe|球内区块* dragon-mounts-legacy@|龙骑士重置版 (Dragon Mounts: Legacy) fruit-trees@fruitful-fun|妙趣果园 🍊 (Fruitful Fun 🍊) -journey-into-the-light-mod|光明之旅·神之本质 (Journey Into the Light · Essence of the Gods) - +journey-into-the-light-mod@jitl|光明之旅·神之本质 (Journey Into the Light · Essence of the Gods) +kitchen-mod|厨房 (The Kitchen Mod) more-dungeons|更多地牢* voyage idealland|理想境* @@ -2438,7 +2438,7 @@ mekanism-additions@|通用机械附加 (Mekanism Addition) signpicture|告示牌图片 (Sign Picture) vampirism-integrations@|吸血鬼联动* gottschcore -not-enough-crashes|崩溃优化* - Fabric¨not-enough-crashes-forge|崩溃优化 (Not Enough Crashes) - Forge¨@notenoughcrashes|崩溃优化 (Not Enough Crashes) +not-enough-crashes@notenoughcrashes|崩溃优化*¨not-enough-crashes-forge|崩溃优化 (Not Enough Crashes) crash-to-main-menu|崩溃返回主菜单* tinkers-jei @@ -2446,16 +2446,16 @@ better-questing-quest-book|更好的任务-任务书 (Better Questing - Quest Bo engineers-doors|工程师的门 (Engineer's Doors) tps-generator|TPS发电机 (TPS Generator) better-drowning|更好的溺水* -bibliotheca¨getting-started -kubejs¨kubejs-fabric|KubeJS - Fabric (旧版本) +bibliotheca +kubejs@¨kubejs-fabric tickcentral lowocalizatiwn redlib -modern-ui|现代化 UI (Modern UI)¨@modern-ui|现代化 UI (Modern UI) +modern-ui|现代化 UI (Modern UI) - 主页¨@modern-ui|现代化 UI (Modern UI) auto-config-updated-api medieval-madness|中世纪的疯狂* -unionlib@ -caelus¨caelus-fabric¨@caelus + +caelus@¨caelus-fabric xeocore wtbw_lib dev-world-fabric @@ -2464,11 +2464,11 @@ moddirector function-api targetingapi re-targetingapi -libnine + dominionlib -endergetic|末地拓展 (The Endergetic Expansion) -swamp-expansion +endergetic@|末地拓展 (The Endergetic Expansion) +swamp-expansion@ galactictweaks@ dungeon-tactics|地牢战术* villagers-nose|村民的鼻子 (Villager's Nose) @@ -2482,11 +2482,11 @@ aether-lost-content@|天境: 遗失之物 (Aether: Lost Content) gunpowderlib nuclearcraft-overhauled@|核电工艺:重制版 (NuclearCraft: Overhauled) nei-lotr|魔戒NEI插件 (NEI LotR) -modern-glass-doors|时尚玻璃门* + adventure-backpack|探索者背包* speed-illusion supertic|匠魂药水效果 (SuperTiC) -the-bumblezone-forge@the-bumblezone|蜜蜂领域/黄蜂领域 (The Bumblezone) - Forge/NeoForge¨the-bumblezone-fabric@|蜜蜂领域/黄蜂领域 (The Bumblezone) - Fabric/Quilt +the-bumblezone-forge@the-bumblezone|蜜蜂领域/黄蜂领域 (The Bumblezone)¨the-bumblezone-fabric@|蜜蜂领域/黄蜂领域 (The Bumblezone) beesourceful middle-earth-industry|中洲工业 (Middle-Earth Industry) thut-wearables @@ -2497,7 +2497,7 @@ climate-control-geographicraft|气候控制/地理世界 (Climate Control/Geogra cosmetic-armor-reworked|时装盔甲重置版* efab¨@efab -potion-of-bees|蜂群药水 (Potion of Bees) - Forge¨potion-of-bees-fabric|蜂群药水 (Potion of Bees) - Fabric¨@potion-of-bees|蜂群药水 (Potion of Bees) +potion-of-bees@|蜂群药水 (Potion of Bees)¨potion-of-bees-fabric|蜂群药水 (Potion of Bees) wyrmroost@|猛龙之居* productivebees@|资源蜜蜂 (Productive Bees) gkolivers-super-tic @@ -2505,12 +2505,12 @@ gkolivers-super-tic songs-of-war-mod|战争之歌 (Songs of War) fluidict squidcraft@|鱿鱼工艺 (SquidCraft) -clothesline|晾衣绳 (ClothesLine) - Forge¨clothesline-fabric|晾衣绳 (ClothesLine) - Fabric +clothesline|晾衣绳 (ClothesLine)¨clothesline-fabric|晾衣绳 (ClothesLine) siege fermion-core omnitranslation|万能翻译 (OmniTranslation) the-egg-came-first|先有蛋* - +nuclearcraft-helper|核电助手 (NuclearCraft Helper) the-hive-more-bee-content tinkersmiddleearth|中洲匠魂 (Tinker's Middleearth) inventory-pause @@ -2518,7 +2518,7 @@ snowy-leaves|霜花叶* materialis@ tesseract@|超立方体* carrier-bees|物流蜜蜂* -tinkers-reforged@|工匠再锻 (Tinkers' Reforged) +tinkers-reforged@|工匠再锻* mystical-world|魔幻世界* recipes-for-all|配方书全解锁 (Recipes for All) gregicality @@ -2535,22 +2535,22 @@ steamweapon|梗多武器 (StemWeapon) counter-guns gregtech-chill-edition|格雷科技轻松版 (GregTech: Chill Edition) -custom-player-model-cpm|自定义玩家模型 (Custom Player Model) - 1.12.2-1.14.4¨custom-player-model-cpm-remake|自定义玩家模型 (Custom Player Model) - 1.14.4-1.16.5 +custom-player-model-cpm|自定义玩家模型 (Custom Player Model)¨custom-player-model-cpm-remake|自定义玩家模型 (Custom Player Model) roughly-enough-resources -so-many-enchantments|更多附魔*¨@so-many-enchantments|更多附魔 (So Many Enchantments) -ensorcellation|万象* +so-many-enchantments@|更多附魔* + sisser hxcenchants|多样化附魔 (HxCEnchants) better-dropped-items|更好的掉落物* hxc-core surrounding-indicators@ - +gobber-fabric|戈伯2 (Gobber2) gobber|戈伯* iblis|恶魔* the-king-of-the-villagers|村民之王 (The King of the Villagers) bring-me-the-rings -bloomful +bloomful@ pick-pocketer|扒手* terraforged rad-metabolosis @@ -2572,9 +2572,9 @@ sunscreen-gel|防晒霜* muya1-7-10|姆亚核心 (MuyaCore) macaws-furniture|Macaw的家具 (Macaw's Furniture) macaws-doors|Macaw的门 (Macaw's Doors) -blueprint +blueprint@ geyser-mod -not-enough-pets|更多宠物* +not-enough-pets@|更多宠物* potionextension torchslabs-mod|更好的火把放置 (Torch Slabs Mod) routerrebornlib @@ -2592,16 +2592,16 @@ energy-control|能源控制* gulliver-reborn rationcraft -default-options¨default-options-fabric +default-options@¨default-options-fabric ender-mail|末影邮递* more-overlays -stefinus-3d-guns-mod|3D枪械 (New Stefinus Guns) - 1.7.10¨stefinus-3d-guns-mod-s3dgm|3D枪械 (New Stefinus Guns) - 1.5.X +stefinus-3d-guns-mod|3D枪械 (New Stefinus Guns)¨stefinus-3d-guns-mod-s3dgm|3D枪械 (New Stefinus Guns) moderncraft-core lang_magic|言灵 (lang_magic) noexpensive@|不昂贵 (NoExpensive) rough-mobs-revamped|粗暴的怪物重置版* - +fullbright|充满光明* backpacks|背包! (backpacks!) living-enchantment|生命附魔* @@ -2618,7 +2618,7 @@ stupid-things more-gems-fabric|更多宝石 (More Gems) minewars gregicadditionscompatibility - +combined-potions|组合药水* plusticminusbad baileys-dailies joshuas-christmas-mod @@ -2642,22 +2642,22 @@ pams-desertcraft|潘马斯沙漠工艺 (Pam's DesertCraft) pams-bonecraft|潘马斯骨头工艺 (Pam's BoneCraft) thermal-singularities|热力奇点* minejurassic -terraria-craft|泰拉瑞亚世界* -colytra|鞘翅胸甲* - Forge¨colytra-fabric|鞘翅胸甲 (Colytra) - Fabric¨@colytra|鞘翅胸甲 (Colytra) +terraria-craft@terrariacraft|泰拉瑞亚世界 (TerrariaCraft 🌳) +colytra@|鞘翅胸甲*¨colytra-fabric|鞘翅胸甲 (Colytra) insects|昆虫* sound-reloader|声音重载* tool-belt|工具皮带* argentina-food-mod|阿根廷的食物* -pet-names|宠物名字* - Forge¨pet-names-fabric|宠物名字 (Pet Names) - Fabric¨@pet-names|宠物名字 (Pet Names) -collective¨collective-fabric¨@collective -giselbaers-durability-viewer@durabilityviewer|耐久信息显示 (Durability Viewer) +pet-names@|宠物名字*¨pet-names-fabric|宠物名字 (Pet Names) +collective@¨collective-fabric +giselbaers-durability-viewer@durabilityviewer|耐久指示器 (Durability Viewer) more-cookies|更多饼干* apple-carrot|苹果胡萝卜* eat-yo-veg -bountiful|赏金* - Forge¨bountiful-fabric|赏金 (Bountiful) - Fabric¨@bountiful|赏金 (Bountiful) +bountiful@|赏金*¨bountiful-fabric|赏金 (Bountiful) betterenchantment|更好的附魔 (BetterEnchantment) -purified-flesh-mod|纯净的腐肉* -gotminecraftmod|权力的游戏 (Game of Thrones Mod) +purified-flesh-mod@|纯净的腐肉* +gotminecraftmod@|权力的游戏 (Game of Thrones Mod) nosleep|禁止睡觉 (No Sleep) minersadvantage|矿工的优势 (MinersAdvantage) @@ -2665,7 +2665,7 @@ simple-backpack-fabric|简单背包 (Simple Backpack) gas-conduits|气体导管* handgun-from-terraria - +more-discs-mod|更多唱片 (More discs mod) edible-honeycombs emerald-and-ruby craftable-nametag|可合成的命名牌* @@ -2677,17 +2677,17 @@ eat-eggs wool-plates|羊毛压力板* more-berry-uses|更多浆果用途* elemental-blades|元素之刃 (Elemental Blades / Elementium) -beyond-earth|飞越地球 (Beyond Earth/Space-BossTools) - Forge¨beyond-earth-fabric|飞越地球 (Beyond Earth/Space-BossTools) - Fabric¨@beyond-earth|飞越地球 (Beyond Earth/Space-BossTools) -simple-planes|简单飞机* - Forge¨simple-planes-fabric|简单飞机 (Simple Planes) - Fabric -world-tooltips|显示掉落物信息* +beyond-earth@|飞越地球 (Beyond Earth/Space-BossTools)¨beyond-earth-fabric|飞越地球 (Beyond Earth/Space-BossTools) +simple-planes|简单飞机*¨simple-planes-fabric|简单飞机 (Simple Planes) +world-tooltips|掉落物信息显示* extra-arcane-knowledge-electroblobs-wizardry|额外巫术知识 (Extra Arcane Knowledge) -bacterium|细菌重置版* - Fabric¨bacteriums|细菌重置版 (Bacterium) - forge/fabric版 +bacteriums|细菌重置版 (Bacterium)¨bacterium|细菌重置版* pillagers|掠夺者* guard-villagers@|警卫村民* simple-machinery|简单机器* bridge-maker@|桥梁制造者* - +craft-your-saddle no-pvp-cooldown never-break|损坏防护* simple-villager-spawn-egg @@ -2695,8 +2695,8 @@ banana-decor-forge immersive-metal|沉浸金属* coffee-time drink-mod|饮料模组* -more-zombie-villagers|更多僵尸村民* - Forge¨more-zombie-villagers-fabric|更多僵尸村民 (More Zombie Villagers) - Fabric¨@more-zombie-villagers|更多僵尸村民 (More Zombie Villagers) -naturally-charged-creepers|自然生成闪电苦力怕* - Forge¨naturally-charged-creepers-fabric|自然生成闪电苦力怕 (Naturally Charged Creepers) - Fabric¨@naturally-charged-creepers|自然生成闪电苦力怕 (Naturally Charged Creepers) +more-zombie-villagers@|更多僵尸村民*¨more-zombie-villagers-fabric|更多僵尸村民 (More Zombie Villagers) +naturally-charged-creepers@|自然生成闪电苦力怕*¨naturally-charged-creepers-fabric|自然生成闪电苦力怕 (Naturally Charged Creepers) skinport dynamic-surroundings-soundcontrol|动态环境:音效控制 (Dynamic Surroundings: SoundControl) @@ -2728,11 +2728,11 @@ pane-in-the-glass dynamic-dynamos|能源炉动画* trophy-slots -replanting-crops|补种农作物* - Forge¨replanting-crops-fabric|补种农作物 (Replanting Crops) - Fabric¨@replanting-crops|补种农作物 (Replanting Crops) +replanting-crops@|补种农作物*¨replanting-crops-fabric|补种农作物 (Replanting Crops) complex-crops -screenshot-to-clipboard|截图到剪贴板 (Screenshot to Clipboard) - Forge¨screenshot-to-clipboard-fabric|截图到剪贴板 (Screenshot to Clipboard) - Fabric¨@screenshot-to-clipboard|截图到剪贴板 (Screenshot to Clipboard) +screenshot-to-clipboard@|截图到剪贴板 (Screenshot to Clipboard)¨screenshot-to-clipboard-fabric|截图到剪贴板 (Screenshot to Clipboard) hide-armor|隐藏盔甲* -hunterillager@hunter-illager|邪猎者 (HunterIllager) +hunterillager@hunters-return|邪猎者 (HunterIllager) pocket-apocalypse-mod|便携式天灾 (Pocket Apocalypse mod) compass|指南针 (compass) @@ -2748,7 +2748,7 @@ dothack-hack-weapons immersive-energy|沉浸能源* crimson-moon|绯红之月* mobs-attempt-parkour@ -identity|化身*¨identity-on-forge|化身 (Identity) - 仅Forge版(1.17.1) +identity|化身*¨identity-on-forge|化身 (Identity) industrial-revolution|工业革命* art-of-alchemy|炼金艺术 (Art of Alchemy) lan-server-properties|自定义局域网联机* @@ -2770,7 +2770,7 @@ valhelsia-structures just-enough-reactors aoa-infobundle|虚无世界信息包 (AoA InfoBundle) -mana-and-artifice|魔法艺术3:巧工魔艺 (Mana and Artifice)¨@mana-and-artifice|魔法艺术3:巧工魔艺 (Mana and Artifice) +mana-and-artifice|魔法艺术3:巧工魔艺 (Mana and Artifice) - 官方主要渠道¨@mana-and-artifice|魔法艺术3:巧工魔艺 (Mana and Artifice) slab-helper|半砖小帮手* @@ -2785,7 +2785,7 @@ stepup|平滑自动上坡 (StepUp) sodium@|钠* netherlicious -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@yungs-better-mineshafts|YUNG的矿井优化 (YUNG's Better Mineshafts)¨yungs-better-mineshafts-fabric|YUNG的矿井优化 (YUNG's Better Mineshafts) terrible-chest|可怕的箱子/可怖箱子* spartan-shields@|斯巴达之盾* silent-gear@|寂静装备* @@ -2806,7 +2806,7 @@ simpledifficulty|坚定意志 (SimpleDifficulty) minema tfctech-unofficial|群峦工业非官方版 (TFCTech Unofficial) @ee1|等价交换 (Equivalent Exchange) -invmove|边拿边走 (InvMove) - 重置版(1.16-1.19.2+)¨invmove-fabric|边拿边走 (InvMove) - 旧版Fabric(~1.18.2)¨invmove-forge|边拿边走 (InvMove) - 旧版Forge(~1.18.2)¨@invmove|边拿边走 (InvMove) +invmove@|边拿边走 (InvMove)¨invmove-fabric|边拿边走 (InvMove)¨invmove-forge|边拿边走 (InvMove) autofish-for-forge|自动钓鱼Forge版 (AutoFish for Forge) industrial-upgrade|工业升级* rpgstats@ @@ -2817,13 +2817,13 @@ ama-damage-indicator magic-circle|阵法* crash-utilities eldritch-mobs@ -farmers-delight@|农夫乐事 (Farmer's Delight) - Forge¨farmers-delight-fabric@|农夫乐事 (Farmer's Delight) - Fabric -artifacts|奇异饰品* - Forge¨artifacts-fabric|奇异饰品 (Artifacts) - Fabric¨@artifacts|奇异饰品 (Artifacts) -mechanized-steam-power|机械化蒸汽动力* +farmers-delight@|农夫乐事 (Farmer's Delight)¨farmers-delight-fabric@|农夫乐事 (Farmer's Delight) +artifacts@|奇异饰品*¨artifacts-fabric|奇异饰品 (Artifacts) + dynamictreestfc|动态的树:群峦传说附属 (Dynamic Trees-TFC) dynamic-trees-the-twilight-forest|动态的树:暮色森林附属 (Dynamic Trees-The Twilight Forest) -drp-global-datapack@globalpacks|全局数据包 (DRP - Global Data Pack) +drp-global-datapack@globalpacks|全局数据包 (Global Data & Resourcepacks) mob-farm-nerfer blood-in-the-water bio-technik @@ -2843,14 +2843,14 @@ survival-utilities|生存工具* slashblade|拔刀剑 (SlashBlade) portal-blocks-2-0|传送门方块 (Portal Blocks) slimecraft-add-tools-etc - +mechanized-steam-power|机械化蒸汽动力* moreswordonline|动漫神域 (SwordCraftOnline) camera-mod@|照相机* heartdrops|生命汲取 (Heart Drops) observerlib zen-summoning -campanion|野营物品* - Farbic¨campanion-forge|野营物品 (Campanion) - Forge¨@campanion|野营物品 (Campanion) -wolves-with-armor|狼铠* - Fabric¨wolves-with-armor-forge|狼铠 (Wolves With Armor) - Forge +campanion|野营物品* - Farbic¨campanion-forge@campanion|野营物品 (Campanion) +wolves-with-armor|狼铠*¨wolves-with-armor-forge|狼铠 (Wolves With Armor) get-exp-for-everything|万物皆可获得经验 (Get exp for everything) jei-enchantment-info|JEI附魔信息 (JEI Enchantment Info) @@ -2859,11 +2859,11 @@ project-red-integration|红石计划:集成 (Project Red - Integration) project-red-world|红石计划:探索 (Project Red - World) project-red-compat|红石计划:兼容性 (Project Red - Compat) -canvas-renderer|Canvas渲染器*¨@canvas|Canvas渲染器 (Canvas Renderer) +canvas-renderer@canvas|Canvas渲染器* coolfood|冷饮 (CoolFood) infinitevillagertrading@|无限村民交易 (InfiniteVillagerTrading) -infinite-trading|无限交易* - Forge¨infinite-trading-fabric|无限交易 (Infinite Trading) - Fabric¨@infinite-trading|无限交易 (Infinite Trading) +infinite-trading@|无限交易*¨infinite-trading-fabric|无限交易 (Infinite Trading) better-loading-screen|自定义加载画面 (Custom Loading Screen) extended-lights-mod|灯具拓展 (Extended Lights) more-swords-legacy@|更多剑:传承* @@ -2871,15 +2871,15 @@ the-undergarden@|深暗之园* allure|诱惑* glibys-voice-chat-reloaded|Gliby的语音聊天重置版 (Gliby's Voice Chat Reloaded) -greater-eye-of-ender-fabric|高级末影之眼 (Greater Eye of Ender) - Fabric¨greater-eye-of-ender-forge|高级末影之眼 (Greater Eye of Ender) - Forge +greater-eye-of-ender-fabric|高级末影之眼 (Greater Eye of Ender)¨greater-eye-of-ender-forge|高级末影之眼 (Greater Eye of Ender) project-red-mechanical|红石计划:机械 (Project Red - Mechanical) neon-craft-mod|霓虹灯艺* arrows-ignite-tnt -enderite-mod-for-forge|末影合金 (Enderite Mod) - Forge¨enderite-mod-for-fabric|末影合金 (Enderite Mod) - Fabric +enderite-mod-for-forge|末影合金 (Enderite Mod)¨enderite-mod-for-fabric|末影合金 (Enderite Mod) dynamic-trees-industrial-craft-2|动态的树:工业2附属 (Dynamic Trees - Industrial Craft 2) dynamic-trees-tinkers-construct|动态的树:匠魂附属 (Dynamic Trees - Tinker's Construct) -ex-nihilo-sequentia|无中生有:传承 (Ex Nihilo: Sequentia)¨@ex-nihilo-sequentia|无中生有:传承 (Ex Nihilo: Sequentia) -@toms-storage|汤姆的简易存储 (Tom's Simple Storage Mod)¨toms-storage|汤姆的简易存储 (Tom's Simple Storage Mod) - Forge / NeoForge¨toms-storage-fabric|汤姆的简易存储 (Tom's Simple Storage Mod) - Fabric / Quilt +ex-nihilo-sequentia@exnihilosequentia|无中生有:传承 (Ex Nihilo: Sequentia) +toms-storage@|汤姆的简易存储 (Tom's Simple Storage Mod)¨toms-storage-fabric|汤姆的简易存储 (Tom's Simple Storage Mod) fishing-real@|更真实的钓鱼* maessentials lingering-loot @@ -2892,7 +2892,7 @@ fabric-zero towers-of-the-wild|旷野之塔* sausagecore|香肠核心 (SausageCore) shadowlands@|暗影之地* -polymorph|多态合成* - Fabric/Forge/Quilt¨polymorph-fabric|多态合成 (Polymorph) - Fabric 1.16.1 - 1.19.2¨@polymorph|多态合成 (Polymorph) +polymorph@|多态合成*¨polymorph-fabric|多态合成 (Polymorph) scalable-cats-force@ otyacraft-engine omega-craft-mod @@ -2902,10 +2902,10 @@ music-layer colored-lux|彩色照明* corsair-mccue@ right-click-clear|右键文本清除* - +wtfs-expedition-cavebiomes-ores-trees-and-tweaks guide-api-village-and-pillage@guide-api drcyanos-lootable-bodies|可拾取尸体 (DrCyano's Lootable Bodies) -simply-cats +simply-cats@ pams-harvestcraft-2-crops|潘马斯农场2 - 作物 (Pam's HarvestCraft 2 - Crops) base-metals|基础金属* @@ -2913,7 +2913,7 @@ mmdlib just-poop-mod|屎! (Poop Mod!) costumes|服装* eyemod-a-phone-mod -upgrade-aquatic|碧海新生* +upgrade-aquatic@|碧海新生* tfc-ambiental macaws-trapdoors|Macaw的活板门 (Macaw's Trapdoors) zenutil @@ -2921,18 +2921,18 @@ zenutil better-beacon-effect|更好的信标效果* netherite-horse-armor@netherite_horse_armor|下界合金马铠* tacocraft-fabric -lootr¨lootr-fabric¨@lootr +lootr@¨lootr-fabric biolib@bio-library -scavenge¨documentation|Scavenge - WIKI: 模组文档(1.10.2-1.12.2) - +scavenge +heaven-earth-ring|乾坤戒指* pams-harvestcraft-2-food-extended|潘马斯农场2 - 食物拓展 (Pam's HarvestCraft 2 - Food Extended) pams-harvestcraft-2-trees|潘马斯农场2 - 果树 (Pam's HarvestCraft 2 - Trees) minecart-direction-follow¨better-minecart-rotation-forge modern-metals|现代金属* - +block-renderer¨blockrenderer blockus@ conjurers-cookbook color-unchained @@ -2947,7 +2947,7 @@ furbishcraft ambientsounds@|自然音效 (AmbientSounds) ordinary-firearms|普通枪械2 (Ordinary Firearms 2) territory|领地 (MineTerritory) -better-ping-display@|更好的延迟显示* - Forge¨better-ping-display-fabric@|更好的延迟显示 (Better Ping Display) - Fabric +better-ping-display@better-ping-display-fabric|更好的延迟显示*¨better-ping-display-fabric@better-ping-display|更好的延迟显示 (Better Ping Display) turned-the-changed-mod survival-tweaks|生存微调* melon-slabs|西瓜台阶* @@ -2976,7 +2976,7 @@ packagedexcrafting|封包合成拓展 (PackagedExCrafting) compactstorage@compact_storage|紧凑存储 (compactstorage) useful-backpacks|实用背包* -@conquest-reforged|征服者 (Conquest Reforged) +conquest-reforged@|征服者* steelseries-gamesense pizzaatimes-timber-mod tellme @@ -2986,12 +2986,12 @@ minerva-library edit-sign@editsign|编辑告示牌* logistical-automation -dynamic-view|动态视距* - Forge¨dynamic-view-fabric|动态视距 (Dynamic View) - Fabric +dynamic-view|动态视距*¨dynamic-view-fabric|动态视距 (Dynamic View) -instrumental-mobs|乐器怪物* +instrumental-mobs@|乐器怪物* finder-compass spacering|储物戒 (SpaceRing) -doot|Trumpet Skeleton - Forge 1.12 版本¨trumpet-skeleton-fabric|Trumpet Skeleton - Fabric 版本¨trumpet-skeleton-redooted|Trumpet Skeleton - Forge 1.15+ 版本 +doot¨trumpet-skeleton-redooted¨trumpet-skeleton-fabric emotes oc-sensors @@ -3001,11 +3001,11 @@ thaumic-periphery|神秘外饰* embellishcraft|装饰工艺 (EmbellishCraft) open-loader@|开放式加载* deep-mob-learning-refabricated@|深度怪物学习:重制版 (Deep Mob Learning: Refabricated) -ftb-ultimine-forge|连锁破坏 (FTB Ultimine) - Forge¨ftb-ultimine-fabric|连锁破坏 (FTB Ultimine) - Fabric +ftb-ultimine-forge|连锁破坏 (FTB Ultimine)¨ftb-ultimine-fabric|连锁破坏 (FTB Ultimine) server-translations -image2map¨@image2map -corpse|遗体* -ring-of-the-miner-fabric|矿工戒指 (Ring of the Miner) - Fabric¨ring-of-the-miner-forge|矿工戒指 (Ring of the Miner) - Forge +image2map@ +corpse@|遗体* +ring-of-the-miner-fabric|矿工戒指 (Ring of the Miner)¨ring-of-the-miner-forge|矿工戒指 (Ring of the Miner) instant-bubble-studio|瞬息气泡工坊* @@ -3016,7 +3016,7 @@ kaleido crock-pot|烹饪锅* -heaven-earth-ring|乾坤戒指* + @@ -3024,16 +3024,16 @@ heaven-earth-ring|乾坤戒指* together-forever -iron-furnaces|更多熔炉* - Forge¨iron-furnaces-fabric|更多熔炉 (Iron Furnaces) - Fabric +iron-furnaces|更多熔炉*¨iron-furnaces-fabric|更多熔炉 (Iron Furnaces) lenient-creepers|仁慈的苦力怕* treasure2|寻宝记2 (Treasure2!) - +@autoreconnector-fabric|自动断线重连 (AutoReconnector-Fabric) structure-gel-api@ the-conjurer|魔术师* - - +ganys-nether|Gany的下界 (Gany's Nether) +ganys-end|Gany的末地 (Gany's End) epic-fight-mod@epic-fight|史诗战斗 (Epic Fight) attack-missed|攻击闪避* lava-monsters|熔岩怪* @@ -3059,24 +3059,24 @@ entity-culling|实体渲染机制优化* hammerandvil|锻造锤与锤锻台 (HammerAndVil) simply-backpacks|简易背包* -mermod-fabric¨mermod-forge|Mermod / Mermaid Tail Mod - 1.20.1~1.16.5 Forge版本 + better-placement|更好的放置* fat-cat|大资本家* waystones2waypoints|传送石碑路径点 (Waystones2Waypoints) beta-days@|B测往昔* -trajectory-preview|弹道预览* - Forge¨trajectory-preview-fabric|弹道预览 (Trajectory Preview) - Fabric +trajectory-preview|弹道预览*¨trajectory-preview-fabric|弹道预览 (Trajectory Preview) xp-spawner-control|刷怪笼经验控制* mob-spawner-control|刷怪箱控制与修改* refined-pipes|精致管道* singularities|奇点* -better-spawner-control|更好的刷怪笼控制* - Forge¨better-spawner-control-fabric|更好的刷怪笼控制 (Better Spawner Control) - Fabric¨@better-spawner-control|更好的刷怪笼控制 (Better Spawner Control) -crying-ghasts|哭泣的恶魂* - Forge¨crying-ghasts-fabric|哭泣的恶魂 (Crying Ghasts) - Fabric¨@crying-ghasts|哭泣的恶魂 (Crying Ghasts) +better-spawner-control@|更好的刷怪笼控制*¨better-spawner-control-fabric|更好的刷怪笼控制 (Better Spawner Control) +crying-ghasts@|哭泣的恶魂*¨crying-ghasts-fabric|哭泣的恶魂 (Crying Ghasts) dynamic-fps@|动态FPS (Dynamic FPS) compact-ores|致密矿石* thaumic-additions@|神秘领域 (Thaumcraft Addition) fabric-disable-custom-worlds-advice@dcwa|禁用自定义世界警告 (Disable Custom Worlds Advice) leaf-decay|树叶速腐Fabric版* -fast-furnace-for-fabric|熔炉性能优化Fabric版 (Fast Furnace for Fabric) +fast-furnace-for-fabric|熔炉性能优化 Fabric 版 (Fast Furnace for Fabric) diggus-maximus@|连锁挖掘* super-sentai-craft|超级战队工艺* wildly-eat|狼吞虎咽* @@ -3108,7 +3108,7 @@ iblis-headshots|爆头击杀* bee-barker sky-bonsais|天空盆景* -origins|起源 (Origins (Fabric))¨@origins|起源 (Origins (Fabric)) +origins@|起源 (Origins (Fabric)) alexiillib feed-a-friend @@ -3128,11 +3128,11 @@ cardinal-energy|能量基本* travel-anchors@|旅行锚* bnbgaminglib triumph -overloaded-armor-bar|护甲上限突破* - Forge¨overloaded-armor-bar-fabric|护甲上限突破 (Overloaded Armor Bar) - Fabric - +overloaded-armor-bar|护甲上限突破*¨overloaded-armor-bar-fabric|护甲上限突破 (Overloaded Armor Bar) +toomanydanyores glass-pipe|玻璃管道* origins-classes@|起源:职业 (Origins: Classes) -plonk|世界内物品放置* +plonk@|世界内物品放置* baritone-1-18-2 potionsmaster|魔药大师 (Potions Master) tinkered-hegemony@|匠器主导* @@ -3143,14 +3143,14 @@ demagnetize|消磁* -controlling|键位冲突显示* - Forge/Fabric版¨controlling-for-fabric|键位冲突显示 (Controlling) - Fabric + cinderscapes@|余烬奇景* tfc-homestead tfctinkers|群峦与匠魂 (TFC Tinkers) thick-font-fix dynamic-trees-traverse|动态的树:遍历附属 (Dynamic Trees - Traverse) -mcmt-multithreading¨mcmtfabric¨@mcmtfabric +mcmt-multithreading@mcmtfabric¨mcmtfabric bwm-core ice-ice-baby|冰术师* hardlib @@ -3159,13 +3159,13 @@ chlorine|氯* bedrock-miner@|基岩矿工* reasonable-realism|合理的现实主义* -passable-foliage|叶间穿行 🌳 (Passable Foliage 🌳) - Forge¨passable-foliage-fabric|叶间穿行 🌳 (Passable Foliage 🌳) - Fabric -betterend|更好的末地 (BetterEnd) - Fabric¨@betterend|更好的末地 (BetterEnd) +passable-foliage|叶间穿行 🌳 (Passable Foliage 🌳)¨passable-foliage-fabric|叶间穿行 🌳 (Passable Foliage 🌳) +betterend@|更好的末地 (BetterEnd) armor-chroma|盔甲颜色显示* interactions|自定义交互事件* lods-of-emone|很多钱 (Lods of Emone) fabric-language-scala -fluid-physics-forge|流体物理 (Fluid Physics) - Forge¨fluid-physics|流体物理* - Fabric +fluid-physics-forge|流体物理 (Fluid Physics)¨fluid-physics|流体物理* zettai-grimoires runorama|全景截图背景* item-stages|物品阶段* @@ -3176,13 +3176,13 @@ wizardry-fates the-mighty-architect phosphophyllite biggerreactors -ftb-teams-forge|FTB 团队 (FTB Teams) - Forge¨ftb-teams-fabric|FTB 团队 (FTB Teams) - Fabric +ftb-teams-forge|FTB 团队 (FTB Teams)¨ftb-teams-fabric|FTB 团队 (FTB Teams) waveaway|挥挥手 (WaveAway) no-advancements|移除进度机制* tfc_rocksplus|群峦岩石 (TFC Rocksplus) mars-mod-reborn ftb-library-forge¨ftb-library-fabric -crossroads-mc|交错道途 (Crossroads) +crossroads-mc@crossroads|交错道途 (Crossroads) config-checker|整合包配置检测 (Modpack Configuration Checker) thaumic-speedup armor-curve|盔甲曲线修改* @@ -3190,7 +3190,7 @@ ambience-extras|环境音乐:附加 (Ambience - Extras) additions-mod extracpus|更多CPU (Extra CPUs) extra-crafting-storage -conquest-reforged|征服者* + underground-city-engineering@|地下城市工程* essentials soul-shards-respawn @@ -3205,21 +3205,21 @@ pehkui@ jeitweaker yungs-law libx@ -atmospheric|悠然一派* +atmospheric@|悠然一派* monospace-font|等宽字体 (Monospace font) mana-liquidizer|魔力液化器* -neapolitan|那不勒斯风味* -clear-despawn-fabric¨@cleardespawn +neapolitan@|那不勒斯风味* +clear-despawn-fabric tinkers-modifier-modifier|匠魂强化修改 (Tinkers' Modifier Modifier) randomtweaks|随意微调 (RandomTweaks) zettai-magic -strawgolem-reborn|稻草傀儡重制版 (Straw Golem Reborn) - Forge¨straw-golem-reborn|稻草傀儡重制版* - Fabric¨@straw-golem|稻草傀儡重制版 (Straw Golem Reborn) +strawgolem-reborn@straw-golem|稻草傀儡重制版 (Straw Golem Reborn)¨straw-golem-reborn|稻草傀儡重制版* rare-ice@|冰中有宝* create-integration -the-magic-mirror|魔镜* +the-magic-mirror@|魔镜* -extra-boats@|额外船只 (Extra Boats / Boatload)¨boatload|额外船只 (Extra Boats / Boatload) +boatload@|额外船只 (Extra Boats / Boatload)¨extra-boats@|额外船只 (Extra Boats / Boatload) outvoted@|落选生物* attribute|属性修复 - Fabric版 (Attribute Fix {FABRIC}) @@ -3234,7 +3234,7 @@ memory-cleaner-mod|内存自动清理* ore-flowers|矿物花卉* aqua-creepers|水下苦力怕 (Aqua Creepers!) extrastorage|更多存储 (ExtraStorage) -thermal-locomotion@|热力运输* +thermal-locomotion@thermal-integration|热力运输* external-tweaker morebiomesxl notes@|笔记* @@ -3246,7 +3246,7 @@ randompatches-integration bubble-column-elevator-backport|1.13水域机制 (1.13 Water Mechanics) basic-nether-ores|基础下界矿石* nuclearcraft-reactor-builder|核电工艺反应堆建造机 (NuclearCraft Reactor Builder) -pams-harvestcraft-2-food-core|潘马斯农场2 - 食物核心 (Pam's HarvestCraft 2 - Food Core) +pams-harvestcraft-2-food-core@|潘马斯农场2 - 食物核心 (Pam's HarvestCraft 2 - Food Core) eki-lib @immibis-core nodami|伤害免疫机制移除 (No Damage Immunity) @@ -3265,7 +3265,7 @@ devtech|GTCEu-CrT开发套件* jurassic-world-reborn-mod|侏罗纪世界重生* cardboard@ - +enchanting-with-thaumcraft|神秘附魔学* crimson-revelations|血腥启示 (Crimson Revelation) environmental-core@ bigger-crafting-tables @@ -3300,7 +3300,7 @@ enderfuge|末影熔炉* calm-down-zombie-guy universal-mod-core@ suspended-server|挂起服务器* -starlight-forge@|星光 (Starlight) - Forge¨starlight@|星光* - Fabric¨starlight-neoforge@|星光 (Starlight) - NeoForge +starlight-forge@|星光 (Starlight)¨starlight@|星光*¨starlight-neoforge@|星光 (Starlight) research-table|研究台 🔬 (Research Table 🔬) shoulder-surfing-reloaded@|越肩视角重制* aqua-acrobatics|水游技艺* @@ -3318,7 +3318,7 @@ mob-drops|自定义生物战利品 (Mob Drops Your Way) alexs-mobs@|Alex 的生物 (Alex's Mobs) all-stackable@|可堆叠物品自定义* thermal-mj|热力MJ支持 (Thermal MJ) -ctd-core +ctd-core@ time-speed-mod|Minecraft地球自转/真实昼夜循环 (Вращение Земли Майнкрафтская (Accurate day/night-cycles Mod)) mineral-tracker @@ -3334,15 +3334,15 @@ shulkerboxviewer gameinfo|游戏信息 (GameInfo) arcaea|Arcaea韵律源点* advanced-tfc-tech|进阶群峦科技 (Advanced TFC Tech) -vanilla-enhanced@enriched|原版增强 (Enriched/Vanilla Enhanced) +enriched@|原版增强 (Enriched/Vanilla Enhanced) satisforestry -asmc +asmc@ simple-generators@|简易发电机* tfc-bonsai|群峦盆栽 (TFC Bonsai) tfc-drying-rack|群峦晾干架 (TFC Drying Rack) lumen|流明 (Lumen 🔥) -openblocks-elevator@elevatormod|开放式电梯 (OpenBlocks Elevator) +openblocks-elevator@elevatormod|开放式电梯 (OpenBlocks Elevator / ElevatorMod) crafttweaker-integration|CrT集成 (CraftTweaker Integration) spiders-2-0|蜘蛛行为增强 (Spiders 2.0) @@ -3354,23 +3354,23 @@ better-slimes|更好的史莱姆* windowlogging|玻璃板贴合* the-time-stop-mod|时间静止* -vanilla-hammers|原版材质锤* - Fabric¨vanilla-hammers-forge|原版材质锤 (Vanilla Hammers) - Forge¨@vanilla-hammers|原版材质锤 (Vanilla Hammers) +vanilla-hammers@|原版材质锤*¨vanilla-hammers-forge|原版材质锤 (Vanilla Hammers) imblocker@imblocker-original|输入法冲突修复 (IMBlocker) hardcore-map-reset tfc-aged-drinks|群峦陈酿 (TFC Aged Drinks) -youtubers-lucky-blocks|Youtuber的幸运方块 (Youtuber's Lucky Blocks) +youtubers-lucky-blocks|YouTuber的幸运方块 (Youtuber's Lucky Blocks) wandering-trapper|流浪猎人* chocolate-fix thaumcraft-4-scrolling@tc4tweaks orderly water-control-extreme variant16x -endremastered|末地:创世 (End Remastered) - Forge¨endremastered-fabric|末地:创世 (End Remastered) - Fabric¨@endrem|末地:创世 (End Remastered) +endremastered@endrem|末地:创世 (End Remastered)¨endremastered-fabric|末地:创世 (End Remastered) unique-crops|独特作物* -yungs-api¨yungs-api-fabric -dawn@ +yungs-api@¨yungs-api-fabric +dawn assembly-line-machines|装配线* netherending-ores Flex-FOV|扭曲视野* @@ -3399,12 +3399,12 @@ legacy-fabric-api@ krypton@|氪* mana-gear not-enough-enchantments -bon-appetit-forge|祝您好胃口 (Bon Appetit) - Forge¨bon-appetit-fabric|祝您好胃口 (Bon Appetit) - Fabric +bon-appetit-forge|祝您好胃口 (Bon Appetit)¨bon-appetit-fabric|祝您好胃口 (Bon Appetit) gugu-utils@|咕咕工具 (GuGu Utils) scuba-gear@|潜水装备* avatar-mod-2-out-of-the-iceberg|降世神通:突破冰山 (Avatar Mod 2: Out of the Iceberg) @hydrogen|氢 (Hydrogen) -lazydfu@|DFU载入优化 (LazyDFU)¨lazy-dfu-forge|DFU载入优化 (LazyDFU) - 非官方 Forge 版本 +lazydfu@|DFU载入优化 (LazyDFU) ridable-ender-pearls|可骑乘末影珍珠* gildedarmor|镀金盔甲 (GildedArmor) @@ -3419,7 +3419,7 @@ loot-overhaul miners-helmet@|矿工头盔 (Miner's Helmet) lightweight-blood-mechanics|轻量级流血机制* kbackup-fabric -smooth-boot@smoothboot-fabric|流畅加载*¨smooth-boot-forge|流畅加载 (Smooth Boot) - Forge +smooth-boot@smoothboot-fabric|流畅加载*¨smooth-boot-forge|流畅加载 (Smooth Boot) netherite-plus-mod@|下界合金拓展* chunkpregenerator|区块预生成器 (Chunk-Pregenerator) @@ -3449,26 +3449,26 @@ shutup-experimental-settings|禁用实验性设置警告 (Shutup Experimental Se datafixerslayer hexcraft police-mod|警察* -enhanced-celestials|月亮事件* - Forge¨enhanced-celestials-fabric|月亮事件 (Enhanced Celestials) - Fabric¨@enhanced-celestials|月亮事件 (Enhanced Celestials) -resourceful-bees|缤纷蜜蜂* +enhanced-celestials@|月亮事件*¨enhanced-celestials-fabric|月亮事件 (Enhanced Celestials) +resourceful-bees@|缤纷蜜蜂* held-item-info@|手持物品信息* cleancut|干净利落 (CleanCut) plus-tweaks -global-gamerules|全局游戏规则 (Global GameRules)¨@global-gamerules|全局游戏规则 (Global GameRules) +global-gamerules@|全局游戏规则 (Global GameRules) save-my-stronghold-fabric¨save-my-stronghold -physics-mod@physicsmod|真实物理 (Physics mod) +physics-mod@physicsmod|真实物理* bluemap dregora|德雷戈拉* k4lib deadly-end-phantoms spice-of-life-potato-edition|生活调味料:马铃薯版 (Spice of Life: Potato Edition) -easiervillagertrading@|简单村民交易 (EasierVillagerTrading)¨easiervillagertrading-2|简单村民交易 (EasierVillagerTrading) - Forge ≥1.18.2 +easiervillagertrading@|简单村民交易 (EasierVillagerTrading)¨easiervillagertrading-2|简单村民交易 (EasierVillagerTrading) wwta@|聊天栏时间显示 (When Was That Again) ars-nouveau@|新生魔艺* eidolon|幻梦* rats-ratlantis|老鼠:鼠西洲 (Rats: Ratlantis) -wthit¨wthit-forge¨@wthit +wthit@¨wthit-forge modern-industrialization@|现代工业化* chunk-pregenerator-fabric|区块预生成器(Fabric) (Fabric Chunk Pregenerator) jumploader @@ -3478,16 +3478,16 @@ better-animal-models|更真实的动物 (Better animal models) druidcraft|德鲁伊工艺* berry-good@ -savage-and-ravage|残暴与掠夺 (Savage & Ravage) +savage-and-ravage@|残暴与掠夺 (Savage & Ravage) jade@|玉 🔍 (Jade 🔍) somnia@|梦醒时分 (Somnia Awoken) industrial-reborn@ -mo-structures-forge|更多自然生成结构 (Mo' Structures) - Forge¨mo-structures@|更多自然生成结构 (Mo' Structures) +mo-structures-forge|更多自然生成结构 (Mo' Structures)¨mo-structures|更多自然生成结构 (Mo' Structures) wallpapercraft-a-fresh-roll|墙纸创造 (Wallpapercraft - A Fresh Roll) clear-despawn - +unionlib@ botany-trees@ better-third-person@ survive|生存要素* @@ -3503,9 +3503,9 @@ ultimate-solar-panels slight-gui-modifications@|界面微调 ('Slight' Gui Modifications) elemental-craft|元素工艺* just-another-rotten-flesh-to-leather-mod@jrftl|腐肉换皮革 (Just Another Rotten Flesh to Leather Mod) -spatial-harvesters-forge¨spatial-harvesters-fabric@ -emotecraft|表情工艺* - Fabric¨emotecraft-forge|表情工艺 (Emotecraft) - Forge¨@emotecraft|表情工艺 (Emotecraft) -pattysmorestuff +spatial-harvesters-forge@spatial-harvesters-fabric¨spatial-harvesters-fabric +emotecraft@|表情工艺*¨emotecraft-forge|表情工艺 (Emotecraft) +pattysmorestuff@ hats|帽子* smoother-bedrock|平滑基岩层* c2me-fabric@|C^2M 引擎 (C^2M-Engine/Concurrent Chunk Management Engine) @@ -3519,8 +3519,8 @@ cc-restitched@ wearables|可穿戴设备* @advancedfurnace|先进熔炉 (Advanced Furnace) -better-weather|更好的天气* - Forge¨better-weather-fabric|更好的天气 (Better Weather) - Fabric -ultimate-car-mod|终极汽车*¨@ultimate-car-mod|终极汽车 (Ultimate Car Mod) +better-weather|更好的天气*¨better-weather-fabric|更好的天气 (Better Weather) +ultimate-car-mod@|终极汽车* craft-time|耗时合成 (Craft Takes Time) betterf3@|更好的F3 (BetterF3) @@ -3544,8 +3544,8 @@ subterranean-wilderness construction-wand|建筑手杖* squeedometer -forgery -fabrication@ + +forgery@fabrication¨fabrication mcdj boost-boots better-sodium-video-settings-button@|更好的钠视频设置按钮* @@ -3564,31 +3564,31 @@ gymcraft infernal-expansion@|地狱扩展* -configurable-mob-potion-effects|怪物药水效果自定义* - Forge¨configurable-mob-potion-effects-fabric|怪物药水效果自定义 (Configurable Mob Potion Effects) - Fabric¨@configurable-mob-potion-effects|怪物药水效果自定义 (Configurable Mob Potion Effects) +configurable-mob-potion-effects@|怪物药水效果自定义*¨configurable-mob-potion-effects-fabric|怪物药水效果自定义 (Configurable Mob Potion Effects) sapience -netherite-nuggets-fabric|下界合金粒 (Netherite Nuggets) - Fabric¨netherite-nuggets-forge|下界合金粒 (Netherite Nuggets) - Forge -eroding-stone-entities¨eroding-stone-entities-fabric¨@eroding-stone-entities -direbats-forge¨direbats-fabric¨@direbats +netherite-nuggets-fabric@netherite-nuggets|下界合金粒 (Netherite Nuggets)¨netherite-nuggets-forge|下界合金粒 (Netherite Nuggets) +eroding-stone-entities@¨eroding-stone-entities-fabric +direbats-forge@direbats¨direbats-fabric advanced-electric-tools|高级电动工具* backpacker ynet simple-drawers|简单的抽屉* -charmonium¨charmonium-reforged¨@charmonium +charmonium¨charmonium-reforged@charmonium xnicex@ krate chickensshed|鸡棚重置版 (ChickensShed) chickenshed -@expanded-storage|扩展存储 (Expanded Storage)¨expanded-storage-fabric|扩展存储 (Expanded Storage) - Forge/Fabric/Quilt [已失效]¨expanded-storage-forge|扩展存储 (Expanded Storage) - Forge [已失效] +expanded-storage-fabric@expanded-storage|扩展存储 (Expanded Storage)¨expanded-storage-forge|扩展存储 (Expanded Storage)¨expanded-storage|扩展存储* project-mmo -abnormals-delight +abnormals-delight@ jojos-bizarre-survival somnus@ lost-trinkets|遗失饰物* lookingglass -environmental|自然环境* +environmental@|自然环境* golden-airport-pack-immersive-vehicles-content @@ -3604,11 +3604,11 @@ mob-origins@moborigins|生物起源* better-default-biomes|更好的默认生物群系* kaimyentity|KAI我的实体 (KAIMyEntity) tablechair|桌椅 (TableChair) -when-dungeons-arise|地牢浮现之时* - Forge¨when-dungeons-arise-fabric|地牢浮现之时 (When Dungeons Arise) - Fabric¨@when-dungeons-arise|地牢浮现之时 (When Dungeons Arise) +when-dungeons-arise@|地牢浮现之时*¨when-dungeons-arise-fabric|地牢浮现之时 (When Dungeons Arise) animal-feeding-trough@animal_feeding_trough|动物喂养槽* wiki-zoomer@ -personality -allurement +personality@personality! +allurement@allurement! dwarf-miner-totem|矮人矿工* yungs-better-portals|YUNG的传送门机制重构 (YUNG's Better Portals) german-road-signs-mod|德国交通标志* @@ -3620,8 +3620,8 @@ emendatus-enigmatica - -bamboo-blocks +jousting@|马术* +bamboo-blocks@ scape-and-run-parasites@scapeandrunparasites|逃逸:寄生体 (Scape and Run: Parasites) just-enough-drags|更多JEI拖拽* exnihilo-automation|无中生有:自动化 (Exnihilo: Automation) @@ -3642,13 +3642,13 @@ abundance@ just-enough-calculation mythicbotany|神话植物学 (MythicBotany) -improved-mobs|怪物增强* - Forge¨improved-mobs-fabric|怪物增强 (Improved Mobs) - Fabric +improved-mobs|怪物增强*¨improved-mobs-fabric|怪物增强 (Improved Mobs) limitless|无上限附魔* vpn-blocker|禁用VPN (VPN Blocker) premium-wood@ tenshilib¨tenshilib-fabric randomportals|随意传送门 (RandomPortals) -configured|配置界面*¨configured-fabric|配置界面 (Configured) - Fabric +configured|配置界面*¨configured-fabric|配置界面 (Configured) jellyfishing@|抓水母* accurate-block-placement @@ -3675,7 +3675,7 @@ easy-ladders beta-dannys-expansion inventory-tweaks-renewed arrp@|高级运行时资源包 (Advanced Runtime Resource Packs) -tougher-glass-forge|Tougher Glass - Forge 版本¨tougher-glass-fabric|Tougher Glass - Fabric 版本(1.16.5~1.17.1) +tougher-glass-forge¨tougher-glass-fabric differentiate cookie-core-fabric image-world-generator|图片地图转换器* @@ -3684,29 +3684,29 @@ inductive-logistics|集成物流* automatic-path morevanillalib@ -vanilla-excavators¨vanilla-excavators-forge@excavar +vanilla-excavators@excavar¨vanilla-excavators-forge dynagear morevanillatools@|更多原版工具 (MoreVanillaTools) colorful-health-bar tipline ultimate-plane-mod@|终极飞机* -simple-voice-chat|简单的语音聊天*¨@simple-voice-chat|简单的语音聊天 (Simple Voice Chat) +simple-voice-chat@|简单的语音聊天* not-enough-milk ewewukeks-musket-mod|ewewukek的火枪模组 (ewewukek's Musket mod) -@iris¨irisshaders +irisshaders@iris @dimthread|世界多线程化 (DimensionalThreading) chambers|处理仓* sodium-extra@|钠 · 扩展* -grind-enchantments|砂轮增强* +grind-enchantments@|砂轮增强* voice-chat|语音聊天* xnet-gases filing-cabinets-refurbished dropz@ -figura¨@figura +figura@ autopilot¨autopilot-fabric applied-energistics-2-wireless-terminals@|AE2无线终端* @@ -3718,14 +3718,14 @@ random-title|随机标题* astikorcarts @invsync|背包同步 (InvSync) jea@|JEI进度 (Just Enough Advancements) -et-futurum-requiem@etfuturum +et-futurum-requiem¨@etfuturum better-op|更好的OP* fastworkbench-minus-replacement crimson-compass|绯红指南针* tinkers-construct@|匠魂 (Tinkers' Construct) ryoramas-terraria-mod steves-workshop -upgraded-ender-chests|高级末影箱* +upgraded-ender-chests@|高级末影箱* ydm-ygo-dueling-mod-ii versioner|整合包版本工具* @@ -3740,24 +3740,24 @@ sophisticated-backpacks|精妙背包* age-of-exile whoosh gregtech-intergalactical|泛银河系格雷科技 (GregTech Intergalactical) -catalogue|模组目录* - Forge¨catalogue-fabric|模组目录 (Catalogue) - Fabric +catalogue|模组目录*¨catalogue-fabric|模组目录 (Catalogue) libblockattributes balance-of-exile dungeons-of-exile - +lots-more-food-forge@lots-more-food¨lots-more-food-fabric necromancy library-of-exile variegated - +chest-cavity@|胸腔* extended-note-block|音符盒扩展 (Extended Noteblocks) hbms-nuclear-tech-mod-reloaded|HBM的核科技重制版 (Hbm's Nuclear Tech Mod Reloaded) loading-timer@|加载时长显示* ocrocketry chime-fabric@chime witherite@|凋灵合金* -mermaid-tail-mod|人鱼尾*¨@mermod +mermod-fabric@mermod¨mermaid-tail-mod|人鱼尾*¨mermod-forge astromine-core|天体矿工:核心 (Astromine: Core) dungeondq dynamic-trees-integrated-dynamics|动态的树:动态联合/集成动力附属 (Dynamic Trees - Integrated Dynamics) @@ -3765,7 +3765,7 @@ skyblock-builder@|空岛建立者* antiportals|反传送门 (AntiPortals) trash-cans@|垃圾桶* mattdahepic-core -mob-farm-helpers-forge|刷怪塔小帮手 (Mob Farm Helpers) - Forge 版本¨mob-farm-helpers-fabric|刷怪塔小帮手 (Mob Farm Helpers) - Fabric 版本 +mob-farm-helpers-forge|刷怪塔小帮手 (Mob Farm Helpers)¨mob-farm-helpers-fabric|刷怪塔小帮手 (Mob Farm Helpers) metal-bushes|金属灌木* @@ -3776,7 +3776,7 @@ flower-seeds astemirs-forest-craft astromine-foundations|天体矿工:基础 (Astromine: Foundations) -create-stuff-additions|机械动力:物品附加 (Create Stuff & Additions) +create-stuff-additions@|机械动力:物品附加 (Create Stuff & Additions) slab-machines|台阶型设备* more-create-stuffs|更多机械动力物品* rsinfinitybooster|RS无限范围增幅卡 (RSInfinityBooster) @@ -3784,7 +3784,7 @@ cuneiform terraincognita cloth-api ingameime|游戏内输入法 (IngameIME) -yungs-better-strongholds|YUNG的要塞优化 (YUNG's Better Strongholds) - Forge¨yungs-better-strongholds-fabric|YUNG的要塞优化 (YUNG's Better Strongholds) - Fabric¨@yungs-better-strongholds|YUNG的要塞优化 (YUNG's Better Strongholds) +yungs-better-strongholds@|YUNG的要塞优化 (YUNG's Better Strongholds)¨yungs-better-strongholds-fabric|YUNG的要塞优化 (YUNG's Better Strongholds) mojangdark|暗色加载 (MojangDark) astromine-technologies|天体矿工:科技 (Astromine: Technologies) astromine-transportations|天体矿工:运输 (Astromine: Transportaions) @@ -3818,23 +3818,23 @@ hot-or-not playerpig tumble-dryer cat-jammies -rhino|犀牛*¨@rhino|犀牛 (Rhino) +rhino@|犀牛* fastsuite|配方性能优化 (FastSuite) twerkitmeal|跳舞生长一切 (Twerk To Grow All The Things) -thermal-expansion@|热力膨胀*¨thermal-integration@|热力集成* +thermal-expansion@thermal-foundation|热力膨胀*¨thermal-integration@thermal-locomotion|热力集成* piggybanks|存钱罐* in-control@ mystical-agriculture-refabricated|神秘农业:Fabric版 (Mystical Agriculture: Refabricated) pedestals aerial-affinity¨aerial-affinity-fabric communism-life-and-art|共产主义:生活与艺术 (Communism:Life and Art) -@project-war-dance|战舞计划 (Project: War Dance)¨project-war-dance|战舞计划 (Project: War Dance) +project-war-dance@|战舞计划 (Project: War Dance) faster-ladder-climbing|更快的爬梯* infinitymending@|无限+经验修补 (InfinityMending) better-than-mending@|更好的经验修补* elenai-dodge-2 -taterzens¨taterzens-forge¨@taterzens +taterzens@¨taterzens-forge dragons-survival|龙之生存 (Dragon Survival) @legacy-mod-menu no-lan-cheats@|禁用局域网作弊 (No LAN Cheats) @@ -3851,10 +3851,10 @@ ctm-fabric|连接纹理Fabric版 (ConnectedTexturesMod for Fabric) whats-that-slot@ pmmo-and-nbt-compat techstacks-heavy-machinery-mod -enhanced-mushrooms|蘑菇增强* - Forge版&Fabric1.18.2版¨enhanced-mushrooms-fabric|蘑菇增强 (Enhanced Mushrooms) - Fabric +enhanced-mushrooms|蘑菇增强*¨enhanced-mushrooms-fabric|蘑菇增强 (Enhanced Mushrooms) versatile-portals|通用传送门* spawn-egg-recipes|刷怪蛋配方注册* -configurable-extra-mob-drops|可配置的额外怪物掉落* - Forge¨configurable-extra-mob-drops-fabric|可配置的额外怪物掉落 (Configurable Extra Mob Drops) - Fabric¨@configurable-extra-mob-drops|可配置的额外怪物掉落 (Configurable Extra Mob Drops) +configurable-extra-mob-drops@|可配置的额外怪物掉落*¨configurable-extra-mob-drops-fabric|可配置的额外怪物掉落 (Configurable Extra Mob Drops) enhanced-mob-spawners@|刷怪笼增强* autorun @@ -3862,22 +3862,22 @@ animania-farm|动物谷:农场* animania-extra|动物谷:额外动物 (Animania Extra Animals) animania-cats-dogs|动物谷:猫猫狗狗 (Animania Cats & Dogs) better-foliage-renewed@|更好的树叶重制版* -@block-swap¨block-swap¨block-swap-fabric +block-swap@¨block-swap-fabric basalt-walker@|玄武岩行者* -endless-ocean-adventures|无尽海洋:冒险 (Endless Ocean: Adventures) - Forge¨endless-oceans-adventures-fabric|无尽海洋:冒险 (Endless Ocean: Adventures) - Fabric +endless-ocean-adventures|无尽海洋:冒险 (Endless Ocean: Adventures)¨endless-oceans-adventures-fabric|无尽海洋:冒险 (Endless Ocean: Adventures) bpm stone-circles phase-potion|相位药水* marblegates-exotic-enchantment-flowing-agony@flowing-agony|白门的奇异附魔:苦痛长河 (MarbleGate's Exotic Enchantment: Flowing Agony) measurements@ -visible-armor-slots|可见装备槽* - 官方版,适用于1.9-1.11.2¨visible-armor-slots-unofficial|可见装备槽 (Visible Armor Slots) - 国人非官方版重置,适用于1.12.2¨armor-slots-in-other-inventories|可见装备槽 (Visible Armor Slots) - 非官方版重置,适用于1.15.2-1.16.5 -moon-and-space-dimensions-fabric|星际次元 (Space Dimensions / Moon and Space Dimensions) - Fabric¨space-dimensions-forge|星际次元 (Space Dimensions / Moon and Space Dimensions) - Forge +visible-armor-slots|可见装备槽*¨visible-armor-slots-unofficial|可见装备槽 (Visible Armor Slots)¨armor-slots-in-other-inventories|可见装备槽 (Visible Armor Slots) +moon-and-space-dimensions-fabric|星际次元 (Space Dimensions / Moon and Space Dimensions)¨space-dimensions-forge|星际次元 (Space Dimensions / Moon and Space Dimensions) -winged +winged@ @slideshow-fabric|幻灯片 (Slide Show) mob-stages|生物阶段* -@refooled¨refooled +refooled@ fabric-seasons@ dehydration@|脱水* @@ -3885,7 +3885,7 @@ easy-villagers@|村民物品化/简单村民* largebar tis-3d entity-nan-health-fix|假死修复 (Entity NaN Health Fix) -@ferrite-core|铁氧体磁芯 (FerriteCore)¨ferritecore|铁氧体磁芯 (FerriteCore) - Forge¨ferritecore-fabric|铁氧体磁芯 (FerriteCore) - Fabric +ferritecore@ferrite-core|铁氧体磁芯 (FerriteCore)¨ferritecore-fabric|铁氧体磁芯 (FerriteCore) thaumcraft-research-patcher masterful-machinery minecraft-earth-mod|Derec的地球生物 (Derec's Earth Mobs) @@ -3900,16 +3900,16 @@ scootys-plants-vs-zombies|Scooty的植物大战僵尸重生 (Scootys Plants Vs. -custom-machinery +custom-machinery@ bonsai-tree-crops rpgz@ scavenge-timing-addon -cull-particles|粒子渲染机制优化* - Forge¨cull-particles-fabric|粒子渲染机制优化 (Cull Particles) - Fabric +cull-particles|粒子渲染机制优化*¨cull-particles-fabric|粒子渲染机制优化 (Cull Particles) majos-broom|魔女的扫帚 (Majo's broom) -seamless-loading-screen@|无缝加载界面*¨seamless-loading-screen-forge|无缝加载界面 (Seamless Loading Screen) - Forge +seamless-loading-screen@|无缝加载界面*¨seamless-loading-screen-forge|无缝加载界面 (Seamless Loading Screen) curios-quark-oddities-backpack|夸克背包饰品* nature-expansion @@ -3920,17 +3920,17 @@ the-elemelon-mod|元素西瓜* dcsp|钻石压缩 (Diamonds Compressor SP) corpse-complex@ modularvoicechat|模块化语音聊天 (ModularVoiceChat) -curious-elytra@elytra-slot|鞘翅插槽 (Curious Elytra / Elytra Trinket / Elytra Slot)¨curious-elytra-fabric|鞘翅插槽 (Curious Elytra / Elytra Trinket / Elytra Slot) - Fabric1.16.1-1.19.2 +curious-elytra@elytra-slot|鞘翅插槽 (Curious Elytra / Elytra Trinket / Elytra Slot)¨curious-elytra-fabric|鞘翅插槽 (Curious Elytra / Elytra Trinket / Elytra Slot) tconstructcompatible|匠魂兼容 (TConstructCompatible) -incubation +incubation@ create-goggles@ -coloured-tooltips¨@colored-tooltips-fabric +coloured-tooltips@colored-tooltips-fabric magicraft-magic|魔法材料 (Magical Materials) glowstone-ores|荧石矿石* more-wires @@ -3944,18 +3944,18 @@ forgerocks ballistix|弹道学* wireless-industry spice-of-life-tonio-edition|生活调味料:托尼欧版 (Spice of Life: Tonio Editon) -husk-spawn|尸壳生成微调* - Forge¨husk-spawn-fabric|尸壳生成微调 (Husk Spawn) - Fabric¨@husk-spawn|尸壳生成微调 (Husk Spawn) +husk-spawn@|尸壳生成微调*¨husk-spawn-fabric|尸壳生成微调 (Husk Spawn) artisan-tools-1-16|工匠工具 (Artisan Tools) -yttr¨@yttr +yttr|Yttr - 已失效¨@yttr wisla mixin-0-7-0-8-compatibility@mixincompat|兼容Mixin0.7-0.8 (Mixin 0.7-0.8 Compatibility) farplanetwo|远平面2 (Far Plane Two) xenoclus-one -satako-library +satako-library¨satako-fabric unique-enchantments-utils|独特的附魔:效用扩展 (Unique Enchantments - Utils) -ae2ao¨forge-ae2-additional-opportunity¨legacy-ae2-additional-opportunity|AE2 Additional Opportunity - Legacy版 (1.12.2)¨@ae2ao +forge-ae2-additional-opportunity@ae2ao¨ae2ao¨legacy-ae2-additional-opportunity iconexporter -curious-shulker-boxes|潜影盒插槽 (Shulker Box Slot) - Forge¨curious-shulker-boxes-fabric|潜影盒插槽 (Shulker Box Slot) - Fabric¨@shulker-box-slot|潜影盒插槽 (Shulker Box Slot) +curious-shulker-boxes@shulker-box-slot|潜影盒插槽 (Shulker Box Slot)¨curious-shulker-boxes-fabric|潜影盒插槽 (Shulker Box Slot) xenoclus-2 darker-depths|深岩之下* terracraft-journey @@ -3976,16 +3976,16 @@ doles-mod ex-nihilo-sequentia-thermal-addon|无中生有:传承 - 热力扩展 (Ex Nihilo: Sequentia - Thermal Addon) ex-naturae@|无中生有:传承 - 植物魔法扩展* ex-nihilo-sequentia-tinkers-addon|无中生有:传承 - 匠魂扩展 (Ex Nihilo: Sequentia - Tinkers Addon) -iron-jetpacks¨iron-jetpacks-fabric¨@iron-jetpacks +iron-jetpacks@¨iron-jetpacks-fabric playtime-counter-fabric|游戏时长计数器 (Playtime Counter) entity-banners|实体旗帜* curious-jetpacks -curious-armor-stands-fabric¨curious-armor-stands +curious-armor-stands@¨curious-armor-stands-fabric trinkets-fabric@trinkets occultism@|神秘学* -stray-spawn|流浪者生成微调* - Forge¨stray-spawn-fabric|流浪者生成微调 (Stray Spawn) - Fabric¨@stray-spawn|流浪者生成微调 (Stray Spawn) -mooshroom-spawn|哞菇生成微调* - Forge¨mooshroom-spawn-fabric|哞菇生成微调 (Mooshroom Spawn) - Fabric¨@mooshroom-spawn|哞菇生成微调 (Mooshroom Spawn) +stray-spawn@|流浪者生成微调*¨stray-spawn-fabric|流浪者生成微调 (Stray Spawn) +mooshroom-spawn@|哞菇生成微调*¨mooshroom-spawn-fabric|哞菇生成微调 (Mooshroom Spawn) cardinal-components@cardinal-components-api @@ -3994,7 +3994,7 @@ a-cobblestone-crafting-table|圆石工作台* colored-iron final-kobold ears@|耳朵* -wildfires-female-gender-mod-forge¨wildfires-female-gender-mod-fabric¨@female-gender +wildfires-female-gender-mod-forge@female-gender¨wildfires-female-gender-mod-fabric consistencyplus@ modularwarfare|模块化战争/模块化武装 (ModularWarfare) mputils-basic-tools @@ -4023,13 +4023,13 @@ simpleeco|简单经济 (SimpleEconomy) vistas@ fish-in-planks -fish-on-the-line¨fish-on-the-line-fabric¨@fish-on-the-line +fish-on-the-line@¨fish-on-the-line-fabric fish-traps|鱼栅* combustive-fishing@ fabric-survival-island@survival-island -@sonicraft|索尼克工艺 (SoniCraft)¨sonicraft|索尼克工艺 (SoniCraft) +sonicraft@|索尼克工艺 (SoniCraft) islands -origins-forge|起源非官方Forge版 (Origins (Forge)) +origins-forge@|起源非官方Forge版 (Origins (Forge)) magic-feather alet netheriteplus @@ -4050,7 +4050,7 @@ enderpig-mod|末影猪* atomic-bomb-1-16|枪,炮,原子弹! (Guns, Rockets and Atomic Explosions) se-sign-shop|简单经济:牌子商店 (SE: Sign Shop) -fancymenu-forge¨fancymenu-fabric¨@fancymenu +fancymenu@¨fancymenu-fabric halogen|卤素* zetamod@zetaforged|泽塔 (ZetaForged/Zeta's Mod) @@ -4061,12 +4061,12 @@ materialisation|物质化* recipebuffers|配方缓冲 (RecipeBuffers) portal-gun-fabric|传送枪 Fabric* -incendium¨@incendium - -cooperative-advancements|合作进度* - Forge¨cooperative-advancements-fabric|合作进度 (Cooperative Advancements) - Fabric +incendium@ +@new-frontier-craft +cooperative-advancements|合作进度*¨cooperative-advancements-fabric|合作进度 (Cooperative Advancements) lightstones openbackup -fat-experience-orbs|肥胖经验球 ([Fabric] Fat Experience Orbs)¨@fat-experience-orbs|肥胖经验球 ([Fabric] Fat Experience Orbs) +fat-experience-orbs|肥胖经验球 ([Fabric] Fat Experience Orbs) - 已失效¨@fat-experience-orbs|肥胖经验球 ([Fabric] Fat Experience Orbs) better-pipes|更好的管道* truetype-font-replacement fluidlogged-api@ @@ -4074,8 +4074,8 @@ spark@|火花 (spark) mco guardians-galore cogwheel-tweaker -ultra-amplified-mod|超大群系维度 (Ultra Amplified Dimension) - Forge¨ultra-amplified-dimension-fabric|超大群系维度 (Ultra Amplified Dimension) - Fabric¨@ultra-amplified-dimension|超大群系维度 (Ultra Amplified Dimension) -classical-art|经典艺术* - Forge¨classical-art-fabric|经典艺术 (Classical Art) - Fabric +ultra-amplified-mod@ultra-amplified-dimension|超大群系维度 (Ultra Amplified Dimension)¨ultra-amplified-dimension-fabric@|超大群系维度 (Ultra Amplified Dimension) +classical-art|经典艺术*¨classical-art-fabric|经典艺术 (Classical Art) emc-baubles|等价饰品 (EMC Baubles) lag-removal @@ -4087,10 +4087,10 @@ fps-reducre-for-fabric|FPS减速器(Fabric) (FPS Reducer (For Fabric)) art-artillery|艺术?火炮! (Art? Artillery!) minemenufabric@|我的菜单 Fabric 版 (MineMenuFabric) @tabtps -@afkpeace¨afkpeace +afkpeace@ -smooth-chunks@|平滑区块加载* +smooth-chunks|平滑区块加载*¨@smooth-chunks|平滑区块加载 (Smooth Chunks) - 已失效 saturationoverflow|饱和度溢出 (Saturation Over flow) phantom-blood@phantomblood|幻影之血* @@ -4108,14 +4108,14 @@ ferdinands-flowers clear-water@|清澈的水* applied-energistics-2-wireless-terminals-forge|AE2无线终端Forge版* ferroustry -@village-employment|村庄就业 (Village Employment)¨village-employment|村庄就业* +village-employment@|村庄就业* deathlog@|死亡日志* automatic-elytra|自动鞘翅* axolotl-bucket-fix|美西螈桶修复* xks-decoration|XK的装饰 (XK's Deco) endgame-materials-addons|更多终局材料* -ravage-and-cabbage +ravage-and-cabbage@ stackup simple-anti-x-ray@sax breakme@ @@ -4125,14 +4125,14 @@ buffed-tools|属性工具* thaumcraft-nei-plugin|神秘时代NEI插件 (Thaumcraft NEI Plugin) moarrecipes|更多的配方 (MoarRecipes) luminium -@better-nether-map +better-nether-map-port@better-nether-map iguanatweaks-reborn|生存重构/蜥蜴微调重生 (Survival Reimagined/IguanaTweaks Reborn) -enter-the-void|进入虚空 (Enter the void) +enter-the-void|进入虚空* tensura-mod-that-time-i-got-reincarnated-as-a-slime|关于我转生变成史莱姆这档事 (Tensura Mod -That time I got reincarnated as a Slime) speedometer@speedometer-cafeteria|速度表* -falling-leaves-forge@fallingleavesforge|落叶 (Falling Leaves (Forge)) +falling-leaves-forge@fallingleavesforge|落叶 (Falling Leaves (NeoForge/Forge)) custom-entity-models-cem@cem|自定义实体模型 (Custom Entity Models) @@ -4144,15 +4144,15 @@ crimson-nbt-tags water-physics-overhaul netherless -auto-ore-dictionary-converter -elytraboosters +auto-ore-dictionary-converter@aodc +elytraboosters@elytra-boosters cobblegenrandomizer unified-resources wooden-buckets|木桶* -no-nether-portals +no-nether-portals|没有下界传送门* beehivetooltips|蜂巢工具提示 (BeehiveTooltips) buddycards@|巴迪卡牌* -extended-caves|Expanded Caves - 旧版本Extended Caves 1.14-1.16¨expanded-caves|Expanded Caves - 新版本Expanded Caves 1.16-1.18¨@expanded-caves +extended-caves@expanded-caves¨expanded-caves inventorio¨inventorio-forge more-curios-totems-of-undying @@ -4167,7 +4167,7 @@ tamagotti signal|讯号* realistic-horse-genetics@|真实马匹遗传* -timeless-and-classic-guns|永恒枪械工坊 (Timeless and Classics Guns) +timeless-and-classic-guns@timeless-and-classics-guns|永恒枪械工坊 (Timeless and Classics Guns) tool-progression|工具进阶* @@ -4175,7 +4175,7 @@ a-paimon|派蒙* music-maker-mod penguin-lib -flywheel|飞轮*¨@flywheel|飞轮 (Flywheel) +flywheel@|飞轮* coralreef|珊瑚礁 (CoralReef) @@ -4184,7 +4184,7 @@ bclib@ actually-baubles|实用拓展饰品* alexs-mobs-battle-music lava-waders-bauble|熔岩魔靴饰品* -hardcore-revival|硬核复活* - Forge¨hardcore-revival-fabric|硬核复活 (Hardcore Revival) - Fabric +hardcore-revival@|硬核复活*¨hardcore-revival-fabric|硬核复活 (Hardcore Revival) additional-guns|更多的枪* oh-my-minecraft-client@ wooden-armors-stone-armor@woodenarmor|木制盔甲 (Wooden Armors Mod) @@ -4193,7 +4193,7 @@ insanelib@ daydreamer phantomfaces|幻灵接口* improved-villagers|改进的村民 (Improved Villager Mod) -equipment-compare|装备比较* - Forge¨equipment-compare-fabric|装备比较 (Equipment Compare) - Fabric +equipment-compare|装备比较*¨equipment-compare-fabric|装备比较 (Equipment Compare) PickupWidely @@ -4210,9 +4210,9 @@ infinity-water-bucket|无限水桶* tfc-caffeine-addon tfc-cellars-add-on boats-and-beeps -konkrete¨konkrete-fabric¨@konkrete +konkrete@¨konkrete-fabric xp-from-harvest|收获经验 (XP From Harvest) -modern-beta +modern-beta¨modern-beta-forge tfcflux tfc-medicinal water-flasks @@ -4225,15 +4225,15 @@ simple-big-backpack croptopia|作物盛景* firmalife@ supermartijn642s-core-lib@ -cherished-worlds|存档置顶* - Forge / Fabric / Quilt¨cherished-worlds-fabric|存档置顶 (Cherished Worlds) - Fabric 1.16.1 - 1.19.2(仅用于存档及维护1.19.2)¨@cherished-worlds|存档置顶 (Cherished Worlds) +cherished-worlds@|存档置顶*¨cherished-worlds-fabric|存档置顶 (Cherished Worlds) ironfist|铁拳* simply-acceleration|简单加速* creeper-habitats husbandry its-the-little-things -fruitful|硕果累累* - Forge¨fruitful-fabric|硕果累累 (Fruitful) - Fabric¨@fruitful|硕果累累 (Fruitful) -environmental-energy|环境科技-发电机*¨@environmental-energy|环境科技-发电机 (Environmental Energy) +fruitful@|硕果累累*¨fruitful-fabric|硕果累累 (Fruitful) +environmental-energy@|环境科技-发电机* nakranoths-herdcraft|群兽行为 (Nakranoth's Herdcraft) lambdabettergrass@|Lambda的更好的草方块 (LambdaBetterGrass) @client-commands @@ -4253,16 +4253,16 @@ legacyvault shopaholic ok-zoomer@ -untitled-duck-mod-forge|无题鸭 (Untitled Duck) - Forge¨untitled-duck-mod-fabric|无题鸭 (Untitled Duck) - Fabric¨@untitled-duck-mod|无题鸭 (Untitled Duck) +untitled-duck-mod-forge@untitled-duck-mod|无题鸭 (Untitled Duck)¨untitled-duck-mod-fabric|无题鸭 (Untitled Duck) v-tweaks@ fairenchanting|公平附魔 (FairEnchanting) -bedspreads¨bedspreads-fabric¨@bedspreads +bedspreads@¨bedspreads-fabric piglib -nether-portal-spread¨nether-portal-spread-fabric¨@nether-portal-spread +nether-portal-spread@¨nether-portal-spread-fabric x-hp mr-pineapples-toy-guns -magickcore|魔法核心 (MagickCore) +magickcore@|魔法核心 (MagickCore) feywild The-final-sword|最终之剑重置版 (The final sword) @@ -4273,22 +4273,22 @@ custom-entity-models-kaimyentity-reborn|自定义玩家和实体模型 / KAI我 miniutilities|迷你实用设备 (Mini Utilities) stumble-upon-campsites|邂逅:营地 (Stumble Upon: Campsites) nomad-books|游牧之书* -yungs-extras¨yungs-extras-fabric¨@yungs-extras -stoneholm-forge|地下村庄 (Stoneholm, Underground Villages) - Forge¨stoneholm@|地下村庄 (Stoneholm, Underground Villages) +yungs-extras@¨yungs-extras-fabric +stoneholm-forge@stoneholm|地下村庄 (Stoneholm, Underground Villages)¨stoneholm|地下村庄 (Stoneholm, Underground Villages) inspecio@ special-ai|特殊AI (Special AI) dream-waifu-mod|梦中情人 (Dream Waifu mod) help-wanted|求助* -off-hand-combat|副手战斗* - Forge¨off-hand-combat-fabric|副手战斗 (Off Hand Combat) - Fabric -reaping-mod-fabric|收割 (Reaping Mod) +off-hand-combat|副手战斗*¨off-hand-combat-fabric|副手战斗 (Off Hand Combat) +reaping-mod-fabric@reaping|收割 (Reaping) gilding|镀金* grims-transportables|格里姆的便捷交通工具 (Grim's Transportables) reroll|刷新附魔* -tax-free-levels|免税附魔* +tax-free-levels@|免税附魔* portable-dimensions|便携式传送门* stone-age-by-yanny -@terra¨terra-world-generator +terra-world-generator@terra omnis|灾厄村民拓展* omnis-backpacks @@ -4298,35 +4298,35 @@ better-combat-rebirth|更好的战斗:重生* iron-and-gold-from-1-17|来自 1.17 的铁和金 (iron and gold from 1.17) immersive-cooking|沉浸烹饪* structured-crafting -random-shulker-colours|随机潜影贝颜色* - Forge¨random-shulker-colours-fabric|随机潜影贝颜色 (Random Shulker Colours) - Fabric¨@random-shulker-colours|随机潜影贝颜色 (Random Shulker Colours) +random-shulker-colours@|随机潜影贝颜色*¨random-shulker-colours-fabric|随机潜影贝颜色 (Random Shulker Colours) create-automated -random-sheep-colours|随机绵羊颜色* - Forge¨random-sheep-colours-fabric|随机绵羊颜色 (Random Sheep Colours) - Fabric¨@random-sheep-colours|随机绵羊颜色 (Random Sheep Colours) -sleep-sooner|早点睡* - Forge¨sleep-sooner-fabric|早点睡 (Sleep Sooner) - Fabric¨@sleep-sooner|早点睡 (Sleep Sooner) -respawning-shulkers|潜影贝重生* - Forge¨respawning-shulkers-fabric|潜影贝重生 (Respawning Shulkers) - Fabric¨@respawning-shulkers|潜影贝重生 (Respawning Shulkers) -respawn-delay-fabric|延迟重生 (Respawn Delay)¨@respawn-delay|延迟重生 (Respawn Delay) +random-sheep-colours@|随机绵羊颜色*¨random-sheep-colours-fabric|随机绵羊颜色 (Random Sheep Colours) +sleep-sooner@|早点睡*¨sleep-sooner-fabric|早点睡 (Sleep Sooner) +respawning-shulkers@|潜影贝重生*¨respawning-shulkers-fabric|潜影贝重生 (Respawning Shulkers) +respawn-delay@|延迟重生*¨respawn-delay-fabric|延迟重生 (Respawn Delay) realistic-bees@|真实的蜜蜂* -recast|持续钓鱼* - Forge¨recast-fabric|持续钓鱼 (Recast) - Fabric¨@recast|持续钓鱼 (Recast) -softer-hay-bales|柔软的干草块* - Forge¨softer-hay-bales-fabric|柔软的干草块 (Softer Hay Bales) - Fabric 1.16-1.17.1¨@softer-hay-bales|柔软的干草块 (Softer Hay Bales) -portable-jukebox-forge|便携式唱片机 (Portable Jukebox) - Forge/Fabric/Quilt¨portable-jukebox-fabric|便携式唱片机 (Portable Jukebox) - Fabric(≤1.17) -spiders-produce-webs|蜘蛛吐网* - Forge¨spiders-produce-webs-fabric|蜘蛛吐网 (Spiders Produce Webs) - Fabric¨@spiders-produce-webs|蜘蛛吐网 (Spiders Produce Webs) +recast@|持续钓鱼*¨recast-fabric|持续钓鱼 (Recast) +softer-hay-bales@|柔软的干草块*¨softer-hay-bales-fabric|柔软的干草块 (Softer Hay Bales) +portable-jukebox-forge|便携式唱片机 (Portable Jukebox)¨portable-jukebox-fabric|便携式唱片机 (Portable Jukebox) +spiders-produce-webs@|蜘蛛吐网*¨spiders-produce-webs-fabric|蜘蛛吐网 (Spiders Produce Webs) assassins-creed-blocklegend|刺客信条:方块传奇 (Assassin's Creed Blocklegend) gravestone-mod-graves|墓碑坟墓 (Gravestone mod Graves) the-earth-mod|地球* lifts@|电梯* corail-recycler|Corail的回收站* move-minecarts@|可移动的矿车* -inventory-totem|更好的图腾* - Forge¨inventory-totem-fabric|更好的图腾 (Inventory Totem) - Fabric¨@inventory-totem|更好的图腾 (Inventory Totem) +inventory-totem@|更好的图腾*¨inventory-totem-fabric|更好的图腾 (Inventory Totem) lava-picker-upper|熔岩收集器* nethers-exoticism@ -everpotion|永恒药水 ⚗️ (EverPotion ⚗️) +everpotion@|永恒药水 ⚗️ (EverPotion ⚗️)¨everpotion-fabric|永恒药水 ⚗️ (EverPotion ⚗️) quick-shulker@quickshulker|快捷潜影盒* respawnable-pets@|宠物可重生* -schmucks|小阿呆 (Schmucks!) -automatic-doors|自动门* - Forge¨automatic-doors-fabric|自动门 (Automatic Doors) - Fabric¨@automatic-doors|自动门 (Automatic Doors) +schmucks@|小阿呆 (Schmucks!) +automatic-doors@|自动门*¨automatic-doors-fabric|自动门 (Automatic Doors) configurable-despawn-timer@ chunkmap@|区块加载小地图 (ChunkMap) inventory-tabs -bottle-your-xp|装瓶你的经验* - Forge & Fabric & Quilt¨bottle-your-xp-fabric|装瓶你的经验 (Bottle Your Xp) - Legacy Fabric¨@bottle-your-xp|装瓶你的经验 (Bottle Your Xp) +bottle-your-xp@|装瓶你的经验*¨bottle-your-xp-fabric|装瓶你的经验 (Bottle Your Xp) gravestone-mod-extended|墓碑坟墓 - 拓展 (Gravestone mod - Extended) better-enchanted-books@|更好的附魔书* easy-steel-forge @@ -4336,7 +4336,7 @@ fabric-waystones@fwaystones|Fabric版传送石碑* dark-enchanting@|暗黑附魔* better-wandering-traders|更好的流浪商人* -superflat-world-no-slimes|没有史莱姆的超平坦世界* - Forge¨superflat-world-no-slimes-fabric|没有史莱姆的超平坦世界 (Superflat World No Slimes) - Fabric¨@superflat-world-no-slimes|没有史莱姆的超平坦世界 (Superflat World No Slimes) +superflat-world-no-slimes@|没有史莱姆的超平坦世界*¨superflat-world-no-slimes-fabric|没有史莱姆的超平坦世界 (Superflat World No Slimes) scorge beaconoverhaul@|信标改革 (Beacon Overhaul) @@ -4380,7 +4380,7 @@ better-beacon|更好的信标与潮涌核心 (Better Beacon / Conduit) dungeon-now-loading simple-emerald-tools-fabric¨easy-emerald-tools -cold-sweat|冷汗* +cold-sweat@|冷汗* witchery-rewitched|巫术:重生 (Witchery: Rewitched) majou-densetsu-3d|魔城传说3D (Majou Denetsu 3D) icarus-wings|伊卡洛斯之翼* @@ -4389,7 +4389,7 @@ piscary storage-cabinet|储藏柜* first-person-model@|更真实的第一人称模型 (First-person Model) -@randore¨randore¨randore-forge +randore@¨randore-forge rising-uppercut|上勾拳* jackie-chan-s-weapon|成龙的武器 (Jackie Chan's weapon) explorers-compass@|探险者指南针 (Explorer's Compass) @@ -4426,13 +4426,13 @@ terracore seeker-compass ghosts-explosives power-drop@|蓄力投掷* -yungs-better-dungeons|YUNG的地牢优化 (YUNG's Better Dungeons) - Forge¨yungs-better-dungeons-fabric|YUNG的地牢优化 (YUNG's Better Dungeons) - Fabric¨@yungs-better-dungeons|YUNG的地牢优化 (YUNG's Better Dungeons) +yungs-better-dungeons@|YUNG的地牢优化 (YUNG's Better Dungeons)¨yungs-better-dungeons-fabric|YUNG的地牢优化 (YUNG's Better Dungeons) ore-controller morechickens@|更多鸡 (MoreChickens) ghosts-explosives-2 -weapon-throw|武器投掷* - Forge¨weaponthrowlite|武器投掷 (Weapon Throw) - Fabric -more-villagers|更多村民* - Forge¨more-villagers-fabric|更多村民 (More Villagers) - Fabric +weapon-throw|武器投掷*¨weaponthrowlite|武器投掷 (Weapon Throw) +more-villagers|更多村民*¨more-villagers-fabric|更多村民 (More Villagers) dungeons-mobs|地下城生物* @@ -4463,30 +4463,30 @@ neubulaeko-slime|星云子史莱姆* fantasysoup just-enough-professions-jep@|JEI工作方块 (Just Enough Professions) - +paimonfood|应急食品 (PaimonFood) plumed-belt better-with-minecolonies calemis-utilities|Calemi的实用设备 (Calemi's Utilities) botanical-cowardice -travelers-titles¨travelers-titles-fabric +travelers-titles@¨travelers-titles-fabric expand-chinese-sword|中式剑拓展 (Arsenal Integration) littleframes@littlepictureframes|小画 (LittleFrames) lavalogged-blocks|岩浆充填 (Lavalogged blocks) awoken-world -gt4-reimagined@gt4r|格雷科技4:重构想 (GregTech 4 Reimagined) +gt4-reimagined|格雷科技4:重构想 (GregTech 4 Reimagined) camouflaged-creepers ore-tweaker@ openpython jei-lotr capes@ attack-speed-enchantment|攻击速度附魔* -natures-minerals¨@natures-minerals -balm¨balm-fabric¨@balm +natures-minerals@ +balm@¨balm-fabric resource-hogs|资源猪 (Resourse Hogs) -advanced-xray|高级透视 (Advanced XRay) - Forge¨advanced-xray-fabric-edition|高级透视 (Advanced XRay) - Fabric +advanced-xray|高级透视 (Advanced XRay)¨advanced-xray-fabric-edition|高级透视 (Advanced XRay) -ring-of-attraction-forge|吸引戒指 (Ring of Attraction) - Forge¨ring-of-attraction-fabric|吸引戒指 (Ring of Attraction) - Fabric +ring-of-attraction-forge|吸引戒指 (Ring of Attraction)¨ring-of-attraction-fabric|吸引戒指 (Ring of Attraction) customhud@|自定义HUD (CustomHud) deadly-world|致命世界* fastdecay@ @@ -4508,14 +4508,14 @@ sync-fabric@|克隆(Fabric) (Sync (Fabric)) tale-of-kingdoms-a-new-conquest@|王国:新征程 (Tale of Kingdoms: A new Conquest) schwarz@|黑* -megane@ +megane@¨megane-forge crusade@ vending-machine|售货机* modernxl taiga2@|匠魂合金附加2 (Tinkers Alloying Addon Port) chunkgenlimited|区块生成限制 (ChunkGenLimiter) -more-crafting-tables-for-forge|更多工作台 (More Crafting Tables for Forge!)¨@more-crafting-tables|更多工作台 (More Crafting Tables for Forge!) -repurposed-structures@repurposed-structures-forge|结构变体* - Forge/NeoForge¨repurposed-structures-fabric@|结构变体 (Repurposed Structures) - Fabric/Quilt +more-crafting-tables-for-forge@more-crafting-tables|更多工作台 (More Crafting Tables for Forge!) +repurposed-structures@repurposed-structures-forge|结构变体*¨repurposed-structures-fabric@|结构变体 (Repurposed Structures) ezpas electrona @mcg @@ -4532,7 +4532,7 @@ the-abyss|深渊:远古 (The Abyss: Legacy) sekiro-sense-symbols lurker|Cold的潜伏者 (Colds: Lurker) cavebiomeapi¨cavebiomeapi-fabric -extended-block-shapes@extshape|扩展方块形状*¨extended-block-shapes-blockus@extshape_blockus|扩展方块形状 (Extended Block Shapes) - 与 Blockus 模组联动的部分(仅适用于 1.18.2 以上 Fabric 版本) +extended-block-shapes@extshape|扩展方块形状*¨extended-block-shapes-blockus@extshape_blockus|扩展方块形状 (Extended Block Shapes) passive-mobs@passivemobs sponsor|赞助者* @@ -4547,16 +4547,16 @@ better-furnaces-reforged@|更好的熔炉重铸版 (BetterFurnaces Reforged) schools-of-magic-second-semester|魔法学校:第二学期 (Schools of Magic: Second Semester) -dark-loading-screen|深色加载界面*¨@dark-loading-screen|深色加载界面 (Dark Loading Screen) +dark-loading-screen@|深色加载界面* hals-exploration-mod farmers-delight-cookbook-addon|农夫乐事:烹饪书拓展 (Farmer's Delight Cookbook Addon) heads-down-display@head-down-display mrcrayfish-more-furniture-mod|MrCrayfish 的更多家具 (MrCrayfish's More Furniture Mod) multi-world -terralith¨@terralith +terralith@ overworld-two-forge¨overworld-two - +xl-packets|XL数据包 (XL Packets)¨xl-packets-fabric|XL数据包 (XL Packets) rftools-storage@|RF工具:存储 (RFTools Storage) rftools-builder@|RF工具:建造机 (RFTools Builder) @@ -4576,18 +4576,18 @@ tinkers-planner|匠魂蓝图 (Tinker's Planner) playing-cards|扑克牌* rainbow-oak-trees-2|彩虹橡树2* mapfrontiers|地图边界 (MapFrontiers) -customizable-elytra|可自定义鞘翅* - Forge¨customizable-elytra-fabric|可自定义鞘翅 (Customizable Elytra) - Fabric -puzzles-lib¨puzzles-lib-fabric¨@puzzles-lib +customizable-elytra|可自定义鞘翅*¨customizable-elytra-fabric|可自定义鞘翅 (Customizable Elytra) +puzzles-lib@¨puzzles-lib-fabric unique-enchantments-base|独特的附魔:基础* ore-stages|矿石阶段* krays-magic-candles thaumcraft-localization-optimizer|神秘时代本地化优化* -drink-beer-fabric|喝啤酒啦 (Drink Beer) - Fabric¨drink-beer-forge|喝啤酒啦 (Drink Beer) - Forge +drink-beer-fabric|喝啤酒啦 (Drink Beer)¨drink-beer-forge|喝啤酒啦 (Drink Beer) emerald-tools-armour hidden-recipe-book@|隐藏配方书* kibe@|羊肉面饼实用设备 (Kibe Utilities) poisoncraft|毒药工艺 (PoisonCraft) -detail-armor-bar|细节盔甲* - Fabric 版本¨detail-armor-bar-forge|细节盔甲 (Detail Armor Bar) - Forge 版本¨@detail-armor-bar|细节盔甲 (Detail Armor Bar) +detail-armor-bar@|细节盔甲*¨detail-armor-bar-forge|细节盔甲 (Detail Armor Bar) wings-horns-hooves-the-ultimate-unicorn-mod project-rankine@rankine|兰金计划* tinkers-mechworks@ @@ -4604,26 +4604,26 @@ morevanillaarmor@|更多原版盔甲 (MoreVanillaArmor) eternal-tales@|永恒传说* oh-the-biomes-youll-go-fixes|“你将去的生物群系”修复模组 (Oh The Biomes You'll Go Fixes) wild-world -eyes-in-the-darkness -miskatonic-mysteries¨miskatonic-mysteries-legacy|Miskatonic Mysteries - Forge,未完成且已停更 + +miskatonic-mysteries¨miskatonic-mysteries-legacy harvesters-night|收割者之夜 (Harvester's Night) slotlock@|锁定槽 (SlotLock) panorama-tweaker@ simple-tomb|简单坟墓* -modern-life|摩登生活* -paxi-fabric¨paxi¨@paxi +modern-life@|摩登生活* +paxi-fabric@paxi¨paxi waveycapes@wavey-capes|飘扬披风 (Wavey Capes) -skin-layers-3d@3dskinlayers|3D皮肤层 (Skin Layers 3D) +skin-layers-3d@3dskinlayers|3D 皮肤层 (Skin Layers 3D) all-the-discs|唱片大全 (All the Discs) cryptic-cosmos -bayou-blues|长沼蓝调* - Forge¨bayou-blues-fabric|长沼蓝调 (Bayou Blues) - Fabric¨@bayou-blues|长沼蓝调 (Bayou Blues) +bayou-blues@|长沼蓝调*¨bayou-blues-fabric|长沼蓝调 (Bayou Blues) hex-lands|六边形地貌* fixrtm serene-tweaks ScalingGuis|界面缩放 (ScalingGUIs) -ide-better-command-block-forge-editor|更好的命令方块 (Better Command Block IDE) - Forge¨ide-better-command-block-fabric-editor|更好的命令方块 (Better Command Block IDE) - Fabric +ide-better-command-block-forge-editor|更好的命令方块 (Better Command Block IDE)¨ide-better-command-block-fabric-editor|更好的命令方块 (Better Command Block IDE) @breakfree|自由破坏 (Break Free) tinkers-mechworks-fork extended-nether-backport @@ -4637,7 +4637,7 @@ never-enough-currency-lite|货币多多:精简版* create-chunkloading name-pain wireless-chargers@|无线充电器* -bouncier-beds|弹力床* - Forge¨bouncier-beds-fabric|弹力床 (Bouncier Beds) - Fabric版1.16-1.17¨@bouncier-beds|弹力床 (Bouncier Beds) +bouncier-beds@|弹力床*¨bouncier-beds-fabric|弹力床 (Bouncier Beds) hexlands-ii|六边形地貌 2 (HexLands II) gold-in-river-mod|河中淘金* @@ -4651,10 +4651,10 @@ tomb-many-graves-2 fins-and-tails|鳍和尾巴 (Fins and Tails) smarter-farmers-farmers-replant@|更聪明的农夫 (Smarter Farmers/Farmers Replant) peculiars|独特风味* -draggable-resource-packs|可拖动列表/可拖动资源包 (Draggable Lists/Draggable Resource Packs)¨@draggable-lists|可拖动列表/可拖动资源包 (Draggable Lists/Draggable Resource Packs) -fastchest|快速箱子渲染 (FastChest)¨@fastchest|快速箱子渲染 (FastChest) -yuushya-townscape-fabric|方块小镇 (Yuushya Townscape) -architects-palette-fabric@|建筑师的调色板 (Architect's Palette)¨architects-palette|建筑师的调色板 (Architect's Palette) - Forge +draggable-resource-packs@draggable-lists|可拖动列表/可拖动资源包 (Draggable Lists/Draggable Resource Packs) +fastchest|快速箱子渲染 (FastChest) - 已不再更新¨@fastchest|快速箱子渲染 (FastChest) +yuushya-townscape-fabric@yuushya-townscape|方块小镇 (Yuushya Townscape) +architects-palette-fabric@|建筑师的调色板 (Architect's Palette)¨architects-palette@architects-palette#all-versions|建筑师的调色板 (Architect's Palette) whisperwoods|低语之森* dimensional-dungeons@|维度地牢* bosses-of-mass-destruction@ @@ -4663,10 +4663,10 @@ dustrial-decor feders-scarecrows|Feder的稻草人 (Feder's Scarecrows) zetter@zetter-painting-mod mystical-pumpkins|神秘南瓜* -skinned-lanterns|灯笼皮肤* - Forge¨skinned-lanterns-fabric@|灯笼皮肤 (Skinned Lanterns) -scarecrows|稻草人* -seasonals|季节风味* -mimi-mod +skinned-lanterns@skinned-lanterns-fabric|灯笼皮肤*¨skinned-lanterns-fabric|灯笼皮肤 (Skinned Lanterns) +scarecrows@|稻草人* +seasonals@|季节风味* +mimi-mod@mimi blocktuner@|音符盒调音助手 (BlockTuner) caged-mobs|笼中生物* advanced-rifles @@ -4701,7 +4701,7 @@ modular-controller|模块化控制器* Item-Collectors@item-collectors gamemodeoverhaul|旧版指令 (GamemodeOverhaul) -dash +dash@ minecraft-dungeons-content|地下城内容 (Dungeons Content) old-beacon|旧信标* oc2|开放式电脑 II (OpenComputers II) @@ -4715,23 +4715,23 @@ steamcraft2 boilerplate meldexuns-crystalic-void recipes-and-more -llama-steeds-forge|骑羊驼 (Llama Steeds) - Forge¨llama-steeds|骑羊驼* - Fabric¨@llama-steeds|骑羊驼 (Llama Steeds) -levellib +llama-steeds-forge@llama-steeds|骑羊驼 (Llama Steeds)¨llama-steeds|骑羊驼* +levellib@657400 enigmatic-graves -boat-item-view-forge|边划边看 (Boat Item View) - Forge¨boat-item-view|边划边看* - Fabric¨@boat-item-view|边划边看 (Boat Item View) +boat-item-view-forge@boat-item-view|边划边看 (Boat Item View)¨boat-item-view|边划边看* forge-creeper-heal-unofficial|Forge苦力怕坑修复[非官方版] (Forge Creeper Heal [Unofficial]) -desolation-forge|荒芜 (Desolation) - Forge¨desolation@|荒芜* +desolation-forge@desolation|荒芜 (Desolation)¨desolation|荒芜* ma-astral zaraklib chipped@ -chest-cavity@|胸腔* + mending-for-1-7-10|给老版本的经验修补 (Mending for Older Version) unreachable-fantasy-mod ai-reducer|AI减速器 (AI Reducer) -simple-teleporters|简易传送器* - Forge版和Fabric1.14.1版¨simple-teleporters-fabric|简易传送器 (Simple Teleporters) - Fabric -killmods¨@657399 +simple-teleporters|简易传送器*¨simple-teleporters-fabric|简易传送器 (Simple Teleporters) +killmods@657399 big-brain@ -adaptive-performance-tweaks|适应性性能调整* +adaptive-performance-tweaks@|适应性性能调整*¨@adaptive-performance-tweaks-core|适应性性能调整 (Adaptive Performance Tweaks) - 模块化版核心¨@adaptive-performance-tweaks-items|适应性性能调整 (Adaptive Performance Tweaks) - 模块化版物品优化¨@adaptive-performance-tweaks-gamerules|适应性性能调整 (Adaptive Performance Tweaks) - 模块化版游戏规则优化¨@adaptive-performance-tweaks-player|适应性性能调整 (Adaptive Performance Tweaks) - 模块化版玩家优化¨@adaptive-performance-tweaks-spawn|适应性性能调整 (Adaptive Performance Tweaks) - 模块化版生物生成优化 rltweaker multibags|多重背包 (MultiBags) lavalib @@ -4739,7 +4739,7 @@ ftb-banners-forge overpowered-armor-bar tinkers-rapier|匠魂西洋剑 (Tinkers' Rapier) earth-reworked|土方工程重制版* -cinderscapes-reforged|余烬奇景Forge版* +cinderscapes-reforged@|余烬奇景Forge版* better-diving|水世界/更好的潜水* auto-sprint|自动冲刺:一键切换 (Auto Sprint : key toggle) nebula-rpg @@ -4756,7 +4756,7 @@ castle-dungeons mobs-properties-randomness iguana-tweaks|蜥蜴微调* enhanced-ai -vulcanite|软碲铜 (vulcanite) - Forge¨vulcanite-fabric|软碲铜 (vulcanite) - Fabric +vulcanite|软碲铜 (vulcanite)¨vulcanite-fabric|软碲铜 (vulcanite) ziheasymodding path-to-dirt dirt2path @@ -4773,14 +4773,14 @@ neverdark stats-keeper¨stats-keeper-fabric vanillatweaks@ bacodifficulty -immersiveposts|沉浸长杆 (Immersive Posts) +immersiveposts@|沉浸长杆 (Immersive Posts) fyres-youwilldiemod|必死无疑 (The "You Will Die" Mod) old-walking-animation@|旧版行走动画* enders-magic|末影魔法 (Ender's magic) anvil-patch-lawful elegant-networking gemsplusplus|宝石++ (GemsPlusPlus) -defaultsettings|默认设置 (DefaultSettings) - Forge¨defaultsettings-fabric|默认设置 (DefaultSettings) - Fabric +defaultsettings|默认设置 (DefaultSettings)¨defaultsettings-fabric|默认设置 (DefaultSettings) draylars-battle-towers|Draylar的战斗高塔 (Draylar's Battle Towers) leos-craftable-chainmail|可制作的锁链甲 (Leo's Craftable Chainmail) @@ -4792,7 +4792,7 @@ the-deep-dark-ocean-dimension online-picture-frame@modern-online-picture-frames|在线相框显示2 (Modern Online Picture Frame) pyromancer|炽焰术师* mekanism-fission-recipe -macaws-fences-and-walls|Macaw的栅栏与墙 (Macaw's Fences and Walls) +macaws-fences-and-walls@|Macaw的栅栏与墙 (Macaw's Fences and Walls) lunae-silva @@ -4825,7 +4825,7 @@ ee3-helper save-your-pets|拯救你的宠物* main-menu-scale potion-fingers -reload-audio-driver-rad|音频驱动重载 (Reload Audio Driver) - Forge(已停更)¨reload-audio-driver-fabric|音频驱动重载 (Reload Audio Driver) - Fabric/Quilt +reload-audio-driver-rad|音频驱动重载 (Reload Audio Driver)¨reload-audio-driver-fabric|音频驱动重载 (Reload Audio Driver) shieldbreak@ holiday-helper fabric-tickratechanger-mod|Fabric版运算变速 (Fabric TickRateChanger) @@ -4852,7 +4852,7 @@ milk-all-the-mobs¨milk-all-the-mobs-fabric roadrunner pokecube-aoi grim-statues|Grim的雕像* -oauth¨oauth-fabric¨@oauth +oauth@¨oauth-fabric omaypaty-japan-mod demon-slayer-mod-kimetu-no-yaiba|鬼灭之刃 (DEMON SLAYER MOD) tipthescales@ @@ -4866,8 +4866,8 @@ journeymap-integration@ damage-tint@|伤害色调* mo-spells -prehistoric-nature@|史前自然*¨prehistoric-flora|史前自然 (Prehistoric Nature) -blade-works|剑制* +prehistoric-flora|史前自然 (Prehistoric Nature)¨prehistoric-nature@|史前自然* +blade-works|剑制 (Blade Works/nikgub_'s Blades+) create-confectionery|机械动力:甜食* @@ -4889,7 +4889,7 @@ canals|水渠* underground-loot-crates|地下战利品箱* -smooth-scrolling-everywhere|平滑滚动* - Forge¨smooth-scrolling-everywhere-fabric|平滑滚动 (Smooth Scrolling Everywhere) - Fabric +smooth-scrolling-everywhere|平滑滚动*¨smooth-scrolling-everywhere-fabric|平滑滚动 (Smooth Scrolling Everywhere) sword-blocking@|持剑格挡* better-mount-hud@|更好的骑乘HUD* fire-overlay-controller@|火焰叠加层调整* @@ -4918,7 +4918,7 @@ asphaltmod|沥青 (Asphalt Mod) reroll-forge|刷新附魔Forge版 (Reroll-Forge) swordenlarger|剑模型扩大 (SwordEnlarger) castle-in-the-sky-the-fairytale-of-laputa|天空之城 (Castle in the Sky) -dimensionalores|维度矿石 (DimensionalOres) - Fabric¨dimore|维度矿石 (DimensionalOres) - Forge +dimensionalores|维度矿石 (DimensionalOres)¨dimore|维度矿石 (DimensionalOres) illagers@illagers+|更多的灾厄村民 (Illagers+) @@ -4928,18 +4928,18 @@ villagers-follow-emeralds-fabric@|村民跟随绿宝石 (Villagers follow Emeral diabloloot|暗黑破坏神战利品 (DiabloLoot) yggdrasil|世界树* ftb-dripper-forge -forge-snad|子沙1.14+ (Snad) - Forge¨fabric-snad|子沙1.14+ (Snad) - Fabric +forge-snad|子沙1.14+ (Snad)¨fabric-snad|子沙1.14+ (Snad) opentoall - +net-music@|网络音乐机* torchbowmod|火把弓 (TorchBowMod) esencia weirdmobs@ydms-weirdmobs -enchantment-level-language-patch|附魔等级语言补丁 (EnchLevel-LangPatch)¨@enchlevel-langpatch|附魔等级语言补丁 (EnchLevel-LangPatch) +enchantment-level-language-patch@enchlevel-langpatch|附魔等级语言补丁 (EnchLevel-LangPatch) open-to-lan -simple-translation|简单翻译* - +simple-translation@|简单翻译* +fx-control@|效果控制 (Fx control) what-are-you-voting-for@ steam-powered-create|蒸汽动力 (Create: Steam Powered) creepers-burn@CreepersBurn @@ -4948,20 +4948,20 @@ pretty-game-enhhancing-gobblet-pgeg-remake|魔法森林重置版 (Pretty, Game-E kvc-equipment|蛋挞君的原版补全装备篇 (KVCEquipment) mooshroomcraft|哞菇工艺* -unearthed|出土* - Forge / Fabric¨unearthed-fabric|出土 (Unearthed) - 1.1.1<= Fabric +unearthed|出土*¨unearthed-fabric|出土 (Unearthed) terrestria@¨terrestria-reforged simplex-terrain-generation|Simplex地形生成器* enderscape@ goblin-traders-fabric@|哥布林商人Fabric版 (Goblin Traders (Fabric)) -@lakeside|湖畔 (Lakeside)¨lakeside|湖畔* +lakeside@|湖畔* chenziqius-originality|CHENZIQIU的创意 (CHENZIQIU's Originality) -@alloy-forgery¨alloy-forgery +alloy-forgery@ mechanical-tech@|机械科技* hadesgame|阴间游戏 (HadesGame) one-block-forge -human-reborn -additional-additions-forge|额外扩展 (Additional Additions) - Forge¨additional-additions|额外扩展* - Fabric¨@addadd|额外扩展 (Additional Additions) +human-reborn@ +additional-additions-forge@addadd|额外扩展 (Additional Additions)¨additional-additions|额外扩展* earlygame@ happiness-is-a-warm-gun@ @@ -4970,12 +4970,12 @@ enigtech2-util environmental-creepers|环保型苦力怕* look-at-that -advanced-peripherals +advanced-peripherals@advancedperipherals|高级外设* nether-chest-fabric@nether-chest @essentialaddons levelz@ betterend-re-forked|更好的末地Forge重铸版 (BetterEnd Reforked) -mining-gadgets|采矿小工具* - Forge¨mining-gadgets-fabric|采矿小工具 (Mining Gadgets) - Fabric +mining-gadgets|采矿小工具*¨mining-gadgets-fabric|采矿小工具 (Mining Gadgets) ponderjs majrusz-library ydms-coppergolem@ydms-copper-golem|YDM的铜傀儡 (YDM's CopperGolem) @@ -4985,10 +4985,10 @@ travel-huts expandability squirrels|松鼠* ftb-power-pots -the-graveyard-forge|墓园 (The Graveyard) - Forge¨the-graveyard-fabric|墓园 (The Graveyard) - Fabric +the-graveyard-forge@|墓园 (The Graveyard)¨the-graveyard-fabric@|墓园 (The Graveyard) nether-agriculture|下界农业* conjuring@ -awesome-dungeon-forge¨awesome-dungeon-fabric¨@awesome-dungeon-forge|Awesome Dungeon - Forge (已失效)¨@awesome-dungeon-fabric|Awesome Dungeon - Fabric (已失效) +awesome-dungeon-forge@¨awesome-dungeon-fabric@ out-of-sight@ decorative-blocks-modded-compat|装饰方块模组兼容 (Decorative Blocks modded compat) camp-chair @@ -5005,14 +5005,14 @@ tarot|塔罗* forcecraft|力量工艺 (ForceCraft) right-click-harvest@|右击收割 (Right-Click-Harvest) custom-content-packs -cake-chomps¨cake-chomps-fabric¨@cake-chomps -lod-level-of-detail@distanthorizons +cake-chomps@¨cake-chomps-fabric +distant-horizons@distanthorizons betterp2p|更好的P2P支持 (Better P2P) -ob-aquamirae|海灵物语 (Aquamirae Mod) - Forge¨aquamirae-fabric|海灵物语 (Aquamirae Mod) - Fabric¨@aquamirae|海灵物语 (Aquamirae Mod) +ob-aquamirae@aquamirae|海灵物语 (Aquamirae Mod)¨aquamirae-fabric|海灵物语 (Aquamirae Mod) nuclear-tfc -just-more-cakes|只是更多的蛋糕! (Just More Cakes!) - Forge¨just-more-cakes-fabric|只是更多的蛋糕! (Just More Cakes!) - Fabric¨@just-more-cakes|只是更多的蛋糕! (Just More Cakes!) +just-more-cakes@|只是更多的蛋糕! (Just More Cakes!)¨just-more-cakes-fabric|只是更多的蛋糕! (Just More Cakes!) image-mod -reinforced-barrels|增强木桶*¨@reinforced-barrels|增强木桶 (Reinforced Barrels) +reinforced-barrels@|增强木桶* spyglass-zoom|望远镜变焦* npc-variety-port|NPC变体 (NPC Variety) just-enough-effects @@ -5023,12 +5023,12 @@ worldshape rslargepatterns|精致存储大样板 (Refined Storage Large Patterns) gendustry-jei-addon statement -mutant-more@|更多突变生物* - 旧版本¨new-mutant-more@|更多突变生物 (Mutant More) - 新版本 +mutant-more@|更多突变生物* - 旧¨new-mutant-more@|更多突变生物 (Mutant More) - 新 just-enough-keg paleolithic-revolution better-shields|更好的盾牌* -@yungs-bridges|YUNG的桥 (YUNG's Bridges)¨yungs-bridges|YUNG的桥 (YUNG's Bridges) - Forge¨yungs-bridges-fabric|YUNG的桥 (YUNG's Bridges) - Fabric +yungs-bridges@|YUNG的桥 (YUNG's Bridges)¨yungs-bridges-fabric|YUNG的桥 (YUNG's Bridges) project-red-transmission|红石计划:传导 (ProjectRed - Transmission) day-dream savage-ender-dragon|更凶猛的末影龙* @@ -5070,19 +5070,19 @@ undo|撤销! (Undo!) unnamed-animal-mod|无名动物模组* camels|骆驼* food-effects@ -item-borders|物品边框* - Forge¨item-borders-fabric|物品边框 (Item Borders) - Fabric¨@item-borders|物品边框 (Item Borders) -iceberg|冰山* - Forge¨iceberg-fabric|冰山 (Iceberg) - Fabric¨@iceberg|冰山 (Iceberg) +item-borders@|物品边框*¨item-borders-fabric|物品边框 (Item Borders) +iceberg@|冰山*¨iceberg-fabric|冰山 (Iceberg) + -worldeditcui-forge-edition-3 enhanced-farming@|增强农业* -lava-clear-view|熔岩下清晰视野* - Forge¨lava-clear-view-fabric|熔岩下清晰视野 (Lava Clear View) - Fabric¨@lava-clear-view|熔岩下清晰视野 (Lava Clear View) +lava-clear-view@|熔岩下清晰视野*¨lava-clear-view-fabric|熔岩下清晰视野 (Lava Clear View) global-xp universal-graves@ more-bows-restrung@|更多弓:重振旗鼓! (More Bows: Restrung!) -nimble-fabric|灵活 (Nimble) - Fabric¨nimble|灵活* - Forge +nimble-fabric|灵活 (Nimble)¨nimble|灵活* metal-barrels|金属储物桶* @@ -5096,7 +5096,7 @@ fantastic-fish-alpha-v1-4|神奇的鱼 (Fantastic Fish) more-mounted-storages|更多存储挂载* -minecraft-comes-alive-testing@minecraft-comes-alive-reborn|凡家物语:重生 (MCA Reborn) +minecraft-comes-alive-reborn@|凡家物语:重生 (MCA Reborn) noodles-apex|面条的Apex系列 (Noodles'Apex Series) ftb-beast-coin-miner|货币矿机 (Beast Coin Miner) scape-and-run-parasites-addon-by-nocube @@ -5108,25 +5108,25 @@ extra-bit-manipulation spartan-weaponry-twilight-forest|斯巴达的武器:暮色森林 (Spartan Weaponry: Twilight Forest) iris-reforged additional-lanterns@|更多灯笼* -bottled-air|瓶装空气* - Forge¨bottled-air-fabric|瓶装空气 (Bottled Air) - Fabric¨@bottled-air|瓶装空气 (Bottled Air) +bottled-air@|瓶装空气*¨bottled-air-fabric|瓶装空气 (Bottled Air) fabricproxy-lite@ abyssal-depths tomes|秘典* budschies-morph-mod@ -pswg|帕尔奇的星球大战 (Parzi's Star Wars Mod) - Fabric¨parzis-star-wars-mod|帕尔奇的星球大战 (Parzi's Star Wars Mod) - Forge +pswg|帕尔奇的星球大战 (Parzi's Star Wars Mod)¨parzis-star-wars-mod|帕尔奇的星球大战 (Parzi's Star Wars Mod) aquatic-abyss slimier-slimes wacky-weapons slime-carnage|史莱姆杀戮* portal-tags -eden-ring|伊甸星环* +eden-ring@eden-ring-reforked|伊甸星环* placement-tweaks|放置调整* kimetsu-animation-demon-slayer-animation|鬼灭动作 (Kimetsu Animation) hals-enhanced-biomes improvedbackpacks|改良背包 (Improved Backpacks) ender-skills|末影技能* useful-railroads|实用铁轨* -voluminous-energy +voluminous-energy@voluminous_energy flaminco simple-graves @@ -5134,14 +5134,14 @@ simple-graves wi-zoom@|WI变焦 (WI Zoom) forge-carpet@ -fabric-tree-chopper|砍树*¨@fabric-tree-chopper|砍树 (Fabric Tree Chopper) +fabric-tree-chopper@|砍树* i-see-lava@ dual-riders refined-relocation-2|简单分类2* ftb-sluice -sky-villages-forge|天空村庄 (Sky Villages) - Forge¨sky-villages-fabric@sky-villages|天空村庄 (Sky Villages) -gui-clock¨gui-clock-fabric-version¨@gui-clock -hand-over-your-items|Hand Over Your Items - Forge&fabric 1.18以上¨hand-over-your-items-fabric|Hand Over Your Items - Fabric 1.17.1及以下 +sky-villages-forge@sky-villages|天空村庄 (Sky Villages)¨sky-villages-fabric|天空村庄 (Sky Villages) +gui-clock@¨gui-clock-fabric-version +hand-over-your-items¨hand-over-your-items-fabric koopas-critters krypton-reforged|氪Forge版* item-counter|物品计数器* @@ -5159,7 +5159,7 @@ kubejs-ui-forge kubejs-thermal@ kubejs-immersive-engineering@ kubejs-mekanism@ -starter-kit|初始套件* - Forge¨starter-kit-fabric|初始套件 (Starter Kit) - Fabric¨@starter-kit|初始套件 (Starter Kit) +starter-kit@|初始套件*¨starter-kit-fabric|初始套件 (Starter Kit) stacker@ gcm @@ -5186,20 +5186,20 @@ mcdoom@|MC 毁灭战士 (MCDoom) bleach-weapons|死神装备* behgameon into-the-maelstrom|冒险漩涡* -create-deco¨create-deco-fabric +create-deco@¨create-deco-fabric warp-pipes fertile-farmland|沃壤千里* luckperms@ inv-view@invview ftb-industrial-contraptions|FTB工业奇械 (FTB Industrial Contraptions) -more-respawn-anchors|更多重生锚* - Fabric¨more-respawn-anchors-forge|更多重生锚 (More Respawn Anchors) - Forge +more-respawn-anchors|更多重生锚*¨more-respawn-anchors-forge|更多重生锚 (More Respawn Anchors) werewolves-become-a-beast@werewolves|狼人 (Werewolves) omnipotent-card@|万用卡牌* does-it-tick public-gui-announcement|公开GUI显示* wet-lava-sponge -ripples-of-the-past¨@ripples-of-the-past +ripples-of-the-past¨@ripples-of-the-past|Ripples of the Past - 最新版(包括公开测试版) cursor-mod@cursormod|自定义光标* amplified-nether@|放大化下界* @@ -5213,7 +5213,7 @@ calcium|钙* from-the-shadows l_ender-s-cataclysm@l_enders-cataclysm(cataclysm)|灾变 (L_Ender 's Cataclysm) brighter-block-light|亮光 (Brighter) -pick-up-notifier|拾取提示* - Forge版+Fabric1.19+¨pick-up-notifier-fabric|拾取提示 (Pick Up Notifier) - Fabric版1.17.1~1.18.2¨@pick-up-notifier|拾取提示 (Pick Up Notifier) +pick-up-notifier@|拾取提示*¨pick-up-notifier-fabric|拾取提示 (Pick Up Notifier) talkbubbles@ servux@ @@ -5249,12 +5249,12 @@ Dung-Pipe extra-armor|更多盔甲* pig-poop stupid-horse-stand-still -ceramic-bucket|陶瓷桶* +ceramic-bucket@|陶瓷桶* durability101@ ceramic-shears|陶瓷剪刀* torch-bandolier|火把弹药袋* rapid-leaf-decay@ - +netherite-horse-armor-mod|下界合金马铠* ambient-environment@ glass-cutter dicemc-tiered-armors @@ -5262,41 +5262,41 @@ tetranomicon more-observers|更多侦测器* villagers-respawn|村民重生* hot-swappable-armor|热切换护甲 (Hot-Swappable Armor) -advancement-plaques|进度牌匾* - Forge¨advancement-plaques-fabric|进度牌匾 (Advancement Plaques) - Fabric¨@advancement-plaques|进度牌匾 (Advancement Plaques) +advancement-plaques@|进度牌匾*¨advancement-plaques-fabric|进度牌匾 (Advancement Plaques) minceraft-mod alexs-delights|Alex乐事 (Alex's Delights) better-bedrock-generator¨better-bedrock-generator-fabric prehistoric-fauna@|史前生物* -better-conduit-placement|更好的潮涌核心放置* - Forge¨better-conduit-placement-fabric|更好的潮涌核心放置 (Better Conduit Placement) - Fabric¨@better-conduit-placement|更好的潮涌核心放置 (Better Conduit Placement) -death-counter|死亡计数器* - Forge¨death-counter-for-fabric|死亡计数器 (Death Counter) - Fabric¨@death-counter-ichun|死亡计数器 (Death Counter) +better-conduit-placement@|更好的潮涌核心放置*¨better-conduit-placement-fabric|更好的潮涌核心放置 (Better Conduit Placement) +death-counter@death-counter-ichun|死亡计数器*¨death-counter-for-fabric|死亡计数器 (Death Counter) dimension-stages|维度阶段* passive-dragon i-want-to-die-at-home -morevanillaweapons|更多原版武器 (MoreVanillaWeapons) -ore-tree-reborn|矿物树:重制 (Ore Tree:Reborn) - Forge¨ore-tree-reborn-fabric|矿物树:重制 (Ore Tree:Reborn) - Fabric +morevanillaweapons@|更多原版武器 (MoreVanillaWeapons) +ore-tree-reborn|矿物树:重制 (Ore Tree:Reborn)¨ore-tree-reborn-fabric|矿物树:重制 (Ore Tree:Reborn) player-tracking-compass tooltipfix|信息提示修复 (ToolTipFix) -extended-noteblock-forge|音符盒扩展 (Extended Noteblock) - Forge¨extended-noteblock-fabric|音符盒扩展 (Extended Noteblock) - Fabric -ore-prospecting-stick-forge|探矿之戒 (Rings Of Prospecting) - Forge¨ore-prospecting-stick-fabric|探矿之戒 (Rings Of Prospecting) - Fabric +extended-noteblock-forge|音符盒扩展 (Extended Noteblock)¨extended-noteblock-fabric|音符盒扩展 (Extended Noteblock) +ore-prospecting-stick-forge|探矿之戒 (Rings Of Prospecting)¨ore-prospecting-stick-fabric|探矿之戒 (Rings Of Prospecting) worldedit-express-forge¨worldedit-express-fabric -awesome-dungeon-edition-ocean-forge¨awesome-dungeon-edition-ocean-fabric¨@awesome-dungeon-ocean-forge|Awesome Dungeon Ocean Edition - Forge (已失效)¨@awesome-dungeon-ocean-fabric|Awesome Dungeon Ocean Edition - Fabric (已失效) +awesome-dungeon-edition-ocean-forge@awesome-dungeon-ocean-forge¨awesome-dungeon-edition-ocean-fabric@awesome-dungeon-ocean-fabric pistorder escape-rope-pokemon-item-forge¨escape-rope-pokemon-item-fabric -awesome-flooring-forge¨awesome-flooring-fabric¨@awesome-flooring-forge|Awesome Flooring - Forge,已失效¨@awesome-flooring-fabric|Awesome Flooring - Fabric,已失效 -medievial-entity-forge@medieval-entity-forge|中世纪生物 (Medieval Entity) - Forge¨medievial-entity-fabric@medieval-entity-fabric|中世纪生物 (Medieval Entity) - Fabric +awesome-flooring-forge@¨awesome-flooring-fabric@ +medievial-entity-forge@medieval-entity-forge|中世纪生物 (Medieval Entity)¨medievial-entity-fabric@medieval-entity-fabric|中世纪生物 (Medieval Entity) upgraded-shulkers|更多潜影盒* bobby@|服务器区块缓存* boosted-brightness@|亮度增强* -effective¨effective-forge¨@effective +effective@¨effective-forge -voidtotem|虚空图腾 (Void Totem) - Forge¨voidtotem-fabric|虚空图腾 (Void Totem) - Fabric -tool-leveling-plus¨tool-leveling-plus-fabric¨@tool-leveling +voidtotem|虚空图腾 (Void Totem)¨voidtotem-fabric|虚空图腾 (Void Totem) +tool-leveling-plus@tool-leveling¨tool-leveling-plus-fabric mythicmetals@|神话金属 (Mythic Metals) creeper-firework@|烟花苦力怕* -second-chance¨second-chance-forge¨@second-chance-forge +second-chance@second-chance-forge¨second-chance-forge promenade@ london-underground|伦敦地铁 (The London Underground) dynamiclights-reforged|镁/铷:动态光源 (Embeddium/Rubidium Dynamic Lights) @@ -5314,18 +5314,18 @@ chest-tracker@|箱子追踪* advancementinfo@|进度信息展示* animatica@ all-dimension-height-increase|全维度建筑高度提升* -merchant-markers|商人标记* - Forge¨merchant-markers-fabric|商人标记 (Merchant Markers) - Fabric¨@merchant-markers|商人标记 (Merchant Markers) +merchant-markers@|商人标记*¨merchant-markers-fabric|商人标记 (Merchant Markers) loot-bag|战利品袋子* miner-watcher|矿工监视者* memento-mori-remember-death|人终有一死/记住死亡 (Memento Mori / Remember Death) -not-enough-gamerules¨not-enough-gamerules-fabric¨@not-enough-gamerules +not-enough-gamerules@¨not-enough-gamerules-fabric @jsonem|Json格式化实体模型 (Json Entity Models) speedrunigt@ archmagus slimyboyos -fireplace-lib¨fireplace-lib-forge¨@fireplace-lib +fireplace-lib@¨fireplace-lib-forge immersive-geology|沉浸地质学* -wool-tweaks|羊毛调整* - Forge,Fabric&Quilt¨wool-tweaks-fabric|羊毛调整 (Wool Tweaks) - Fabric<=1.17.1¨@wool-tweaks|羊毛调整 (Wool Tweaks) +wool-tweaks@|羊毛调整*¨wool-tweaks-fabric|羊毛调整 (Wool Tweaks) tools-complement@ adventtic questionably-immersive @@ -5341,11 +5341,11 @@ playerex data-attributes hardcore-buoyance gregtech-ce-unofficial@|格雷科技社区版:非官方版 (GregTech CE: Unofficial) -eggtab-fabric|独立刷怪蛋列表 (Egg Tab) - Fabric¨eggtab-forge|独立刷怪蛋列表 (Egg Tab) - Forge -@always-a-wither-skull|必得凋灵骷髅头颅 (Always a Wither Skull)¨always-a-wither-skull|必得凋灵骷髅头颅 (Always a Wither Skull) - 除Fabric1.16~1.17以外的所有其他支持版本¨always-a-wither-skull-fabric|必得凋灵骷髅头颅 (Always a Wither Skull) - Fabric1.16~1.17 -anvil-restoration-fabric|铁砧修复 (Anvil Restoration) - Fabric¨anvil-restoration|铁砧修复* - Forge¨@anvil-restoration|铁砧修复 (Anvil Restoration) -hide-hands-fabric|隐藏主副手 (Hide Hands) - Fabric¨hide-hands|隐藏主副手* - Forge¨@hide-hands|隐藏主副手 (Hide Hands) -better-beacon-placement-fabric|更好的信标放置 (Better Beacon Placement) - Fabric¨better-beacon-placement|更好的信标放置* - Forge¨@better-beacon-placement|更好的信标放置 (Better Beacon Placement) +eggtab-fabric|独立刷怪蛋列表 (Egg Tab)¨eggtab-forge|独立刷怪蛋列表 (Egg Tab) +always-a-wither-skull@|必得凋灵骷髅头颅 (Always a Wither Skull)¨always-a-wither-skull-fabric|必得凋灵骷髅头颅 (Always a Wither Skull) +anvil-restoration-fabric@anvil-restoration|铁砧修复 (Anvil Restoration)¨anvil-restoration|铁砧修复* +hide-hands-fabric@hide-hands|隐藏主副手 (Hide Hands)¨hide-hands|隐藏主副手* +better-beacon-placement-fabric@better-beacon-placement|更好的信标放置 (Better Beacon Placement)¨better-beacon-placement|更好的信标放置* dead-totems functional-storage|功能性存储* the-wild-update|荒野更新1.19 (The Wild Update 1.19) @@ -5355,8 +5355,8 @@ trinkets-and-baubles|饰品与小玩意 (Trinkets and Baubles) rope-ladders|绳梯* skewers-updated|烤串更新版* -keep-my-soil-tilled-fabric|保持肥沃 (Keep My Soil Tilled) - Fabric (1.16.x - 1.17.1)¨keep-my-soil-tilled|保持肥沃* - Forge & Fabric & Quilt -double-doors@|双开门*¨double-doors-fabric|双开门 (Double Doors) - Fabric(1.16.5~1.17.1) +keep-my-soil-tilled-fabric|保持肥沃 (Keep My Soil Tilled)¨keep-my-soil-tilled|保持肥沃* +double-doors-fabric@double-doors|双开门 (Double Doors)¨double-doors|双开门* expanded-armor-enchanting@|盔甲附魔扩展* expanded-weapon-enchanting@|武器附魔扩展* expanded-axe-enchanting@|斧附魔扩展* @@ -5366,7 +5366,7 @@ pylons on-soul-fire@ wizard-staff kambrik -additional-bars|更多的栏杆* - Forge¨additional-bars-fabric|更多的栏杆 (Additional Bars) - Fabric¨@additionalbars|更多的栏杆 (Additional Bars) +additional-bars@additionalbars|更多的栏杆*¨additional-bars-fabric|更多的栏杆 (Additional Bars) leap@ cameraoverhaul@ enchantment-id-extender@eide @@ -5393,12 +5393,12 @@ mekanism-matter|通用机械:物质拓展* inzhefop-core -legendary-tooltips|传说工具提示* - Forge¨legendary-tooltips-fabric|传说工具提示 (Legendary Tooltips) - Fabric¨@legendary-tooltips|传说工具提示 (Legendary Tooltips) +legendary-tooltips@|传说工具提示*¨legendary-tooltips-fabric|传说工具提示 (Legendary Tooltips) myrtrees tiny-redstone -icarus-fabric@icarus|伊卡洛斯之翼Fabric版 (Icarus (Fabric)) +icarus-fabric@icarus the-splash-milk@|喷溅牛奶 (Splash Milk) fastbench-for-fabric|工作台性能优化Fabric版 (FastBench for Fabric) mob-buckets-fabric|生物桶 (Mob Buckets) @@ -5420,11 +5420,11 @@ compass-manhunt exlines-furniture@ tinkers-archery|工匠箭术 (Tinkers' Archery) designer-modeling|设计师建模* -netherite-horse-armor-mod|下界合金马铠* + netherite-horse-armor-fabric|下界合金马铠 (Netherite Horse Armor) netherite-elytra|下界合金鞘翅* -more-tcon|更多匠魂材料 (Moar TCon)¨@moar-tcon|更多匠魂材料 (Moar TCon) +more-tcon@moar-tcon|更多匠魂材料 (Moar TCon) exlines-emerald-equipment@emerald-equipment exlines-candy-mod renamer|代号名称* @@ -5433,7 +5433,7 @@ the-herobrine-mod-1-7-10 aquatic-armors immersive-industry|沉浸工业* lightmans-currency¨lightmans-currency-fabric -hellfire-fireball-launcher|地狱火:火焰弹发射器 (Hellfire: Fireball Launcher) - Forge¨hellfire-fireball-launcher-fabric|地狱火:火焰弹发射器 (Hellfire: Fireball Launcher) - Fabric +hellfire-fireball-launcher|地狱火:火焰弹发射器 (Hellfire: Fireball Launcher)¨hellfire-fireball-launcher-fabric|地狱火:火焰弹发射器 (Hellfire: Fireball Launcher) guild endless-deep-space|无尽深空* @@ -5468,7 +5468,7 @@ correlated@ no-mob-spawning-on-trees rf-lux@ -fx-control@|效果控制 (Fx control) + @roughly-enough-characters easy-normal-and-magic-foods @@ -5486,7 +5486,7 @@ giant-player-boss|巨人玩家Boss* set-bonus tntutils giant-swords|巨剑* -terrablender¨terrablender-fabric¨@terrablender +terrablender@¨terrablender-fabric commandhelper|命令助手 (CommandHelper) bilibili @@ -5499,7 +5499,7 @@ macaws-paintings|Macaw的画 (Macaw's Paintings) dyenamics multi-piston blood-magic@|血魔法* -resolutioncontrol|分辨率控制 (Resolution Control) - 1.16+¨resolution-control|分辨率控制* - 1.16 ~ 1.14 (停止更新版本)¨@resolution-control-plus|分辨率控制 (Resolution Control) +resolutioncontrol@resolution-control-plus|分辨率控制 (Resolution Control)¨resolution-control|分辨率控制* wdl|世界下载器 (World Downloader) @@ -5516,12 +5516,12 @@ oldjavawarning@|旧Java警告 (OldJavaWarning) mercurius all-the-swords pams-simple-recipes -bow-infinity-fix|无限附魔修复* +bow-infinity-fix@|无限附魔修复* -enchanting-infuser-forge|附魔灌注台 (Enchanting Infuser)¨@enchanting-infuser|附魔灌注台 (Enchanting Infuser) +enchanting-infuser-forge@enchanting-infuser|附魔灌注台 (Enchanting Infuser) menumobs|主菜单生物渲染 (MenuMobs) -tiny-skeletons-forge|小骷髅变种 (Tiny Skeletons) - Forge & Fabric¨tiny-skeletons-fabric|小骷髅变种 (Tiny Skeletons) - Fabric (1.17~1.18.2)¨@tiny-skeletons|小骷髅变种 (Tiny Skeletons) +tiny-skeletons-forge@tiny-skeletons|小骷髅变种 (Tiny Skeletons)¨tiny-skeletons-fabric|小骷髅变种 (Tiny Skeletons) matter-overdrive-community-edition@moce|超能物质 (Matter Overdrive) cavetweaks|洞穴调整 (CaveTweaks) @@ -5529,8 +5529,8 @@ cosmetic-armor-fabric@cosmetic-armor|时装盔甲 (Cosmetic Armor) crimson-chickens -drippy-loading-screen|自定义游戏加载界面* - Forge¨drippy-loading-screen-fabric|自定义游戏加载界面 (Drippy Loading Screen) - Fabric -extreme-sound-muffler¨extreme-sound-muffler-fabric-official +drippy-loading-screen@|自定义游戏加载界面*¨drippy-loading-screen-fabric|自定义游戏加载界面 (Drippy Loading Screen) +extreme-sound-muffler@extreme_sound_muffler¨extreme-sound-muffler-fabric-official dragonloot@|龙战利品 (DragonLoot) wtfcore ore-remover @@ -5556,7 +5556,7 @@ nullscape-end-reborn@nullscape|空无之景 (Nullscape) brutal-bosses-dungeon guerrilla-vs-command-mod-high-difficulty-addition|游击队员vs突击队员 (Guerrilla vs Command) super-tools-reloaded-reloaded|超级工具重置版重制版 (Super Tools Reloaded-Reloaded) -lychee¨lychee-fabric¨@lychee +lychee@¨lychee-fabric morepaths extended-mushrooms@ shear-madness @@ -5571,13 +5571,13 @@ bansoko|创可贴 (Bansōkō) inventory-backpack@inventory-backpack-mod -@drippy-loading-screen|自定义游戏加载界面 (Drippy Loading Screen) -reinforced-shulker-boxes|增强潜影盒*¨@reinforced-shulker-boxes|增强潜影盒 (Reinforced Shulker Boxes) + +reinforced-shulker-boxes@|增强潜影盒* fastopenlinksandfolders|快速打开链接和文件夹 (FastOpenLinksAndFolders) -reinforced-chests|增强箱子*¨@reinforced-chests|增强箱子 (Reinforced Chests) +reinforced-chests@|增强箱子* biome-staff dynamic-trees-quark@|动态的树:夸克附属 (Dynamic Trees - Quark) -radium-reforged|镭*¨@radium|镭 (Radium Reforged) +radium-reforged@radium|镭* backpackmod@ untamedwilds|不羁野性 (Untamed Wilds) @@ -5586,10 +5586,10 @@ no-null-processors ma-enchants|Ma 附魔* bits-and-chisels@ -trading-post|交易站* - Forge和Fabric¨trading-post-fabric|交易站 (Trading Post) - Fabric(1.17~1.18.2) -phantasmic¨@nourished-nether +trading-post|交易站*¨trading-post-fabric|交易站 (Trading Post) +phantasmic¨@nourished-nether|Nourished Nether/Phantasmic/Netherific - 已失效 furnus -permanent-light-generator|恒久光发电机* - Forge¨permanent-light-generator-fabric|恒久光发电机 (Permanent Light Generator) - Fabric¨@plg|恒久光发电机 (Permanent Light Generator) +permanent-light-generator@plg|恒久光发电机*¨permanent-light-generator-fabric|恒久光发电机 (Permanent Light Generator) immortuos-calyx claim-chunk @@ -5612,8 +5612,8 @@ jer-integration|JER集成 (JER Integration) just-enough-beacons|JEI信标* windowed-fullscreen -helpful-hitboxes-fabric -vein-mining|连锁采集* - Fabric/Forge/Quilt¨vein-mining-fabric|连锁采集 (Vein Mining) - Fabric 1.16.4 - 1.19.2¨@vein-mining|连锁采集 (Vein Mining) +helpful-hitboxes-forge¨helpful-hitboxes-fabric +vein-mining@|连锁采集*¨vein-mining-fabric|连锁采集 (Vein Mining) ars-creo@ it-fell-from-the-sky @@ -5637,13 +5637,13 @@ just-enough-piglin-bartering|JEI猪灵以物易物* primal-magick|原初魔法* ore-creeper|矿石苦力怕* panthalassa|泛古洋* -stardew-armory|星露谷武器* - Forge¨stardew-armory-fabric|星露谷武器 (Stardew Armory) - Fabric +stardew-armory|星露谷武器*¨stardew-armory-fabric|星露谷武器 (Stardew Armory) no-more-nether-desert-edition blaze-gear|烈焰装备* @aier|反内能革命 (Anti-internal Energy Revolution) rhodonite-tools-armour more-minecarts -corn-delight|玉米乐事* - Forge¨corn-delight-fabric|玉米乐事 (Corn Delight) - 他人移植的Fabric版本¨@corn-delight|玉米乐事 (Corn Delight) +corn-delight@|玉米乐事*¨corn-delight-fabric|玉米乐事 (Corn Delight) blast-craft|防爆工艺 (Blastcraft) @@ -5654,7 +5654,7 @@ ore-highlight|矿石发亮* sodium-shadowy-path-blocks@|钠 · 土径阴影* polymer@ -elytra-bombing|鞘翅轰炸* - Forge¨elytra-bombing-fabric|鞘翅轰炸 (Elytra Bombing) - Fabric +elytra-bombing|鞘翅轰炸*¨elytra-bombing-fabric|鞘翅轰炸 (Elytra Bombing) cuboiddroids-support-mod @@ -5706,12 +5706,12 @@ monke-madness put-ingot-down|把锭放在地上吧! (Put Ingot Down!) torchtools lottweaks -quests-additions-fabric|任务拓展 (Quests Additions) - Fabric¨quests-additions|任务拓展* - Forge +quests-additions-fabric|任务拓展 (Quests Additions)¨quests-additions|任务拓展* custom-mob-spawner|自定义生物生成器* -rpg-hud|RPG-Hud - Forge 版本¨rpg-hud-fabric|RPG-Hud - Fabric 版本¨@rpg-hud +rpg-hud@¨rpg-hud-fabric the-wild-update-concept-mod -sinocate|肴馔 (SinoCate) +sinocate@|肴馔 (SinoCate) oreregen|再生矿石 (OreRegen) eidolon_tweaker @@ -5719,7 +5719,7 @@ herodotusutils@herodotus-utils platypuses hostile-villages|敌对村庄* throwability|投掷* -biomeinfo|生物群系信息 (BiomeInfo) - Forge¨biomeinfo-fabric|生物群系信息 (BiomeInfo) - Fabric +biomeinfo|生物群系信息 (BiomeInfo)¨biomeinfo-fabric|生物群系信息 (BiomeInfo) clickable-advancements|可点击的进度 (Clickable advancements) factory0-resources epic-knights-armor-and-weapons@epic-knights-shields-armor-and-weapons|史诗骑士:盾牌,盔甲和武器 (Epic Knights: Shields, Armor and Weapons) @@ -5728,11 +5728,11 @@ dragon-mounts-3|龙骑士3* viaforge@ happy-trails|快乐小径* naturesaura_tweaker -death-finder|死亡溯源* - Forge&Fabric1.19+¨death-finder-fabric|死亡溯源 (Death Finder) - Fabric 1.18.1~1.18.2 +death-finder@|死亡溯源*¨death-finder-fabric|死亡溯源 (Death Finder) portable-craft|便携工艺* @polypack_host -etched +etched@ caves-cliffs-backport-additions cobblefordays admin-shop@shop|官方商店* @@ -5771,26 +5771,26 @@ psicaster tweakermore@ legacy-display@ the-backrooms|后室* -creatures-of-the-snow@creatures-from-the-snow-fabric|雪地里的生物! (Creatures From The Snow!)¨creatures-from-the-snow-forge|雪地里的生物! (Creatures From The Snow!) - Forge -collisions-lib¨@collisions-lib +creatures-of-the-snow@creatures-from-the-snow-fabric|雪地里的生物! (Creatures From The Snow!)¨creatures-from-the-snow-forge|雪地里的生物! (Creatures From The Snow!) +collisions-lib@ wooled-boots@|羊毛靴子* zawa-evolved|野生动物园:进化 (Zoo and Wild Animals: Evolved) bongo -impersonate¨@impersonate +impersonate@ calemi-core@ccore visual-workbench@|可视化工作台* -stylish-effects|Stylish Effects - Forge(1.18.1以上)和Fabric(1.19以上)¨stylish-effects-fabric|Stylish Effects - 旧版Fabric(1.17~1.18.2)¨@stylish-effects +stylish-effects@¨stylish-effects-fabric death-compass-forge¨death-compass-fabric portable-stonecutter|便携式切石机* enchanted-book-redesign¨enchanted-book-redesign-fabric - +quick-hotbar modular-augment lumberjack better-mods-button@|更好的模组按钮* -leave-my-bars-alone@ + advancement-frames@ dynmapforge @@ -5800,7 +5800,7 @@ bumpkinbatch beekeeper|养蜂人* some-assembly-required@ ladylucs-critters-mod - +@modmenu-beta better-signs @@ -5813,11 +5813,11 @@ better-signs create-irrigation -delete-worlds-to-trash-forge¨delete-worlds-to-trash-fabric +delete-worlds-to-trash-forge@delete-worlds-to-trash¨delete-worlds-to-trash-fabric simple-magnets@|简易磁铁* -guns-without-roses +guns-without-roses@ buddycards-expansions|巴迪卡牌扩展* zettai-ars cant-sleep-clowns-will-eat-me@|夜不能寐 (Can't Sleep Clowns Will Eat Me) @@ -5826,10 +5826,10 @@ autoharvest|自动收获 (AutoHarvest) realistic-block-physics domestication-innovation@|驯养革新* snuffles|魄罗* -flan-forge|Flan - 适用于 Forge¨flan|Flan - 适用于 Fabric +flan-forge@flan¨flan awesome-dungeon-the-end-forge@¨awesome-dungeon-the-end-fabric@ tehnuts-torcherino -library-ferret-forge¨library-ferret-fabric¨@library-ferret-forge|Library Ferret - Forge(已失效)¨@library-ferret-fabric|Library Ferret - Fabric(已失效) +library-ferret-forge@¨library-ferret-fabric@ awesome-dungeon-nether-forge@¨awesome-dungeon-nether-fabric@ ae2-extended-life|应用能源非官方延续版 (AE2 Unofficial Extended Life) @@ -5851,8 +5851,8 @@ iammusicplayer pirates|海盗* comics-bubbles-chat@ fabric-extended-armor-bars-forked -eating-animation-forge@eating-animations|进食动画 (Eating Animation) - Forge¨eating-animation-fabric@eating-animation|进食动画 (Eating Animation) - Fabric -waterdripsound¨dripsounds-fabric@¨@waterdripsound|Drip Sounds - Forge与Neoforge +eating-animation-forge@eating-animation|进食动画 (Eating Animation)¨eating-animation-fabric@eating-animations|进食动画 (Eating Animation) +waterdripsound@¨dripsounds-fabric@ better-horse-hud|更好的骑马HUD* thermopolium|汤饮铺* @@ -5862,7 +5862,7 @@ orderly-fabric-2-0 entity-texture-features-fabric@entitytexturefeatures sculk-plus creeper-confetti-fabric|烟花苦力怕Fabric版* -double-jump-attribute¨@double-jump-attribute +double-jump-attribute¨@double-jump-attribute|Double Jump Attribute - 已失效 overweight-farming@ healthcare@ betterloadingscreen|加载画面改良 (Better Loading Screen) @@ -5914,7 +5914,7 @@ game-stages-conditions tinkers-construct-tool-leveling-with-random odd-water-mobs glowsquids-begone@ -theundead +theundead@the-undead-revamped framedblocks@|框架方块 (FramedBlocks) nekos-enchanted-books@ istc|我说了算 (I Said The Calculation) @@ -5955,7 +5955,7 @@ tdv-tweaks picture-in-picture-pip guilt-trip -parcool|跑酷! (ParCool!) +parcool@|跑酷! (ParCool!) legacy-mc-kotlin minimepets ugly-scoreboard-fix@ @@ -5975,9 +5975,9 @@ nether-hexed-kingdom @paimonfoodreborn|应急食品:重制 (PaimonFood:Reborn) talking-ben-mod -@inbackpackeat|背包内食用 (In-backpack Eat)¨in-backpack-eat|背包内食用 (In-backpack Eat) +in-backpack-eat|背包内食用 (In-backpack Eat)¨@inbackpackeat|背包内食用 (In-backpack Eat) - 已失效 with-thursday|相约星期四 (WithThursday!) -smooth-swapping|平滑转移* - Fabric+Forge(官方)¨smooth-swapping-forge|平滑转移 (Smooth Swapping) - Forge(非官方)¨@smooth-swapping|平滑转移 (Smooth Swapping) +smooth-swapping@|平滑转移*¨smooth-swapping-forge|平滑转移 (Smooth Swapping) tinkering-with-blood-magic tinker-toolcasts thermal-tinkering @@ -5994,7 +5994,7 @@ millenaire-extended-maya oedldoedl-core oedldoedl-resources oedldoedl-gear -disguiseheads +disguiseheads@ simple-tcon enchanted-tooltips stackablepotions-forge¨stackablepotions @@ -6004,7 +6004,7 @@ harder-staged-difficulty material-changer tree-harvester¨tree-harvester-fabric itemfx -mekanism-ce@mekanism-community-edition|通用机械:社区版 (Mekanism Community Edition)¨mekanism-1-12-2-ce|通用机械:社区版 (Mekanism Community Edition) - 原1.12.2,现已合并 +mekanism-ce@mekanism-community-edition|通用机械:社区版 (Mekanism Community Edition)¨mekanism-1-12-2-ce|通用机械:社区版 (Mekanism Community Edition) property-modifier grimoire-of-tetra @@ -6035,14 +6035,14 @@ brewevolution|酿造进化🍺 (Brewevolution 🍺) devil-fruits|恶魔果实* trail-mix -multiplayer-server-pause-fabric|多人服务器暂停 (Multiplayer Server Pause) - Fabric¨multiplayer-server-pause-forge|多人服务器暂停 (Multiplayer Server Pause) - Forge +multiplayer-server-pause-fabric|多人服务器暂停 (Multiplayer Server Pause)¨multiplayer-server-pause-forge|多人服务器暂停 (Multiplayer Server Pause) noshelter-reborn|无庇护所:重生 (NoShelter Reborn) initial-spawn-dimension the-one-probe-fabric gehenna-super-spooky-nether-overhaul-for-forge draconicminus hygiene - +worldeditcui-forge-edition-3 external-view-reload fluid-drawers-legacy|储液抽屉:遗产* my-server-is-compatible @@ -6051,10 +6051,10 @@ leapoffaith-forge|信仰之跃 (Leap of Faith) top-plus refined-storage-fluxified@ quit-confirm -compressedcreativity|压缩动力 (Compressed Creativity) +compressedcreativity@|压缩动力 (Compressed Creativity) applied-mekanistics@|应用能源:通用机械附属* craftdumper -@immersive-weathering|沉浸式风化 (Immersive Weathering)¨immersive-weathering-fabric|沉浸式风化 (Immersive Weathering) - Fabric¨immersive-weathering-forge|沉浸式风化 (Immersive Weathering) - Forge +immersive-weathering-fabric@immersive-weathering|沉浸式风化 (Immersive Weathering)¨immersive-weathering-forge|沉浸式风化 (Immersive Weathering) replay-mod-for-forge bigtrees absolutely-not-a-zoom-mod@anazm|绝对不是一个缩放模组* @@ -6066,11 +6066,11 @@ weeping-angels-mod¨the-lonely-assassins hardcore-item-stages game-stages-viewer mpm-lotr -guard-villagers-fabric|警卫村民Fabric版 (Guard Villagers (Fabric))¨@guard-villagers-(fabricquilt)|警卫村民Fabric版 (Guard Villagers (Fabric)) +guard-villagers-fabric@guard-villagers-(fabricquilt)|警卫村民Fabric版 (Guard Villagers (Fabric)) -item-highlighter|物品高亮* - Forge¨item-highlighter-fabric|物品高亮 (Item Highlighter) - Fabric¨@item-highlighter|物品高亮 (Item Highlighter) +item-highlighter@|物品高亮*¨item-highlighter-fabric|物品高亮 (Item Highlighter) -environmental-armor¨origins-environmental-armor-1-18-1-port|Origins - Environmental Armor - 贡献者制作的 1.18.1 分支(已过时) +environmental-armor@¨origins-environmental-armor-1-18-1-port health-levels@ the-comfort-zone@ @@ -6079,15 +6079,15 @@ mekatweaker smithing-in-the-90s embellished-enchanting -better-snowball-fight|更好的打雪仗* - Forge¨better-snowball-fight-fabric|更好的打雪仗 (Better Snowball Fight) - Fabric -onastick-forge¨onastick¨@onastick +better-snowball-fight-fabric|更好的打雪仗 (Better Snowball Fight) +onastick-forge@onastick¨onastick tradernpcs more-pads|更多Pad* texture-dump spartan-weaponry-ice-and-fire|斯巴达的武器:冰火传说 (Spartan Weaponry: Ice and Fire) hefty-crops@ @strangefuelsmod|奇奇怪怪的燃料 (Strange Fuels Mod) -@custom-player-models|自定义玩家模型 (Customizable Player Models)¨custom-player-models|自定义玩家模型 (Customizable Player Models) - Forge / NeoForge¨custom-player-models-fabric|自定义玩家模型 (Customizable Player Models) - Fabric / Quilt +custom-player-models@|自定义玩家模型 (Customizable Player Models)¨custom-player-models-fabric|自定义玩家模型 (Customizable Player Models) extrachampions|强敌扩充 (ExtraChampions) @@ -6112,7 +6112,7 @@ ydms-weapon-master@weaponmaster|YDM的武器大师 (YDM's Weapon Master) galacticrafttweaker moreleads@|拴绳增强 (More Leads) -simple-discord-rpc +simple-discord-rpc@ excore messmod@ @@ -6126,7 +6126,7 @@ basement-origins no-weak-attack bettas|搏鱼* baby-fat|婴儿肥* -quickplant|顷刻吐芽 (QuickPlant) - Forge¨quickplant-fabric|顷刻吐芽 (QuickPlant) - Fabric +quickplant|顷刻吐芽 (QuickPlant)¨quickplant-fabric|顷刻吐芽 (QuickPlant) infinite-dungeons wpo-addon-mod just-the-binding-of-isaac-pills @@ -6136,10 +6136,10 @@ humbling-bundle@|慈善捆绑包* grindstone-sharper-tools-fabric¨grindstone-sharper-tools nutritious-milk¨nutritious-milk-fabric extract-poison¨extract-poison-fabric -zombie-villagers-from-spawner-fabric¨zombie-villagers-from-spawner¨@zombie-villagers-from-spawner +zombie-villagers-from-spawner-fabric@zombie-villagers-from-spawner¨zombie-villagers-from-spawner vine-climber -healing-soup¨healing-soup-fabric¨@healing-soup -idas@ +healing-soup@¨healing-soup-fabric +idas@|地牢建筑统合 (Integrated Dungeons and Structures) mob-sunscreen@ @dontstarvereborn|不要饿死:重生 (Don't Starve: Reborn) decorative-winter @@ -6175,7 +6175,7 @@ stackone-mod|禁止堆叠 (StackOne) spectrum@|光谱世界* kitteh6660s-morecraft angel-ring|天使指环* -@debugify +debugify@ nomowanderer allthecompressed cave-enhancements @@ -6204,7 +6204,7 @@ goblin-community kobolds-community mutant-villager pick-your-poison -illager-expansion-fabric¨@illager-expansion-forked|Illager Expansion - 由ZekeSmith创建的备份¨@illager-expansion-polymer|Illager Expansion - 现版本,由Patbox制作¨@illager-expansion-rematch|Illager Expansion - Safro 制作的修复版 +illager-expansion-fabric¨@illager-expansion-forked|Illager Expansion - 由ZekeSmith创建的备份¨@illager-expansion-polymer|Illager Expansion - 现,由Patbox制作¨@illager-expansion-rematch|Illager Expansion - Safro 制作的修复版 immersive-armors@|沉浸式盔甲* seeds@ unusual-drill @@ -6217,7 +6217,7 @@ atm-additions extra-tags|额外标签* advancedchatlog@AdvancedChatLog crafting-station|合成站* -sons-of-sins +sons-of-sins@ advancedchathud@AdvancedChatHUD fuzes-relics chirpys-wildlife@wildlife-fabric @@ -6228,15 +6228,15 @@ waila-stages steves-vanilla duckling@ -wandering-bag@ +wandering-bag@wandering-bags friends-and-foes-forge@¨friends-and-foes@ dynamic-trees-the-betweenlands|动态的树:交错次元附属 (Dynamic Trees - The Betweenlands) pyrologer-and-friends tree-hollows@|树洞* -solar-apocalypse-refabricated@solar-apocalypse¨@solar-apocalypse-reforged|Solar Apocalypse - 由ZX_or_移植的Forge版(仅1.18.2) -@icommon -chunky-pregenerator-forge|预生成区块 (Chunky) - Forge¨chunky-pregenerator|预生成区块 (Chunky) - Fabric¨@chunky|预生成区块 (Chunky) +solar-apocalypse-refabricated@solar-apocalypse¨@solar-apocalypse-reforged +icommonlib@icommon +chunky-pregenerator@chunky|预生成区块 (Chunky)¨chunky-pregenerator-forge|预生成区块 (Chunky) beast-slayer|上古凶灵/远古野兽 (Ancient Beasts/Beast Slayer) easyauth@ depth@ @@ -6264,7 +6264,7 @@ eye-of-dragons paperdoll@|纸娃娃 (PaperDoll) little-logistics show-me-what-you-got@ -herdspanic¨@herdspanic +herdspanic@ extrasounds@ brooms the-stormlight-archive-mod|飓光志* @@ -6281,13 +6281,13 @@ aeble trident-mod|三叉戟 (Trident) custom-professions|自定义村民职业 (Custom Villager Professions) -nextspring|化作春泥更护花 (NextSpring) - Forge¨nextspring-fabric|化作春泥更护花 (NextSpring) - Fabric +nextspring|化作春泥更护花 (NextSpring)¨nextspring-fabric|化作春泥更护花 (NextSpring) psionic-utilities lucent@ togglesneak iron-apples actually-additions-fluxified@ -dank-storage|Dank Storage - Forge和Fabric1.20及以上¨dank-storage-fabric|Dank Storage - Fabric1.20以下 +dank-storage¨dank-storage-fabric pixelgamewizards-banded-torches dynamic-trees-byg|动态的树:你将去的生物群系附属 (Dynamic Trees - Oh The Biomes You'll Go) @@ -6326,7 +6326,7 @@ edibles-fabric¨edibles reach-fix lootjs-forge chat-sounds@chatsounds -advancement-screenshot-fabric¨advancement-screenshot¨@advancement-screenshot +advancement-screenshot@¨advancement-screenshot-fabric all-loot-drops@ disc-jockey@ better-taskbar@|更好的任务栏* @@ -6373,17 +6373,17 @@ firesafety|安全用火 (FireSafety) pretty-pistons more-beautiful-trapdoors@ project-expansion@ -the-corners +the-corners@ deep-mob-learning-reforged|深度怪物学习:重铸 (Deep Mob Learning: Reforged) zenith@ extended-drawers@ equippable-utilities@utilities -never-enough-currency-2|货币多多2* - Forge¨never-enough-currency-fabric|货币多多2 (Never Enough Currency 2) - Fabric +never-enough-currency-2|货币多多2*¨never-enough-currency-fabric|货币多多2 (Never Enough Currency 2) quartz-chests|石英箱子* frozen-delight|冰封乐事* clean-creative-mod -this-rocks@|这就是石粒! (This Rocks!)¨this-rocks-forge|这就是石粒! (This Rocks!) - Forge +this-rocks@|这就是石粒! (This Rocks!)¨this-rocks-forge@|这就是石粒! (This Rocks!) motschens-puddles@puddles dense-ores-reborn|致密矿石:重生* @@ -6391,7 +6391,7 @@ tfctreatedwood|群峦·防腐木 (TFC Treated Wood) retro64¨retro64-fabric double-hotbar|双重快捷栏* lavatech|熔岩科技 (Lava Tech) -@with-pineapple-psychic|凤梨通灵术 (With Pineapple Psychic) +@with-pineapple-psychic|凤梨通灵术 (Pineapple Psychic) fragile-torches @time-changer come-closer @@ -6405,8 +6405,8 @@ ancient-classes bigger-stacks@biggerstacks silence@|快速静音 (Silence!) dynamic-trees-extra-utilities-2|动态的树:更多实用设备2附属 (Dynamic Trees - Extra Utilities 2) -platforms¨platforms-fabric¨@platforms -easierchests|简便箱子 (EasierChests)¨@easierchests|简便箱子 (EasierChests) +platforms@¨platforms-fabric +easierchests@|简便箱子 (EasierChests) crackers-wither-storm-mod@|Cracker的凋灵风暴 (Cracker's Wither Storm Mod) ore-canes-mod spartan-defiled @@ -6416,7 +6416,7 @@ dynamic-trees-voyage|动态的树:Voyage附属 (Dynamic Trees - Voyage) mystical-biomes forgero@ -disenchantingforge +disenchantingforge¨disenchantingfabric redstone-pen@redstonepen|红石笔* ae2things¨ae2-things-forge avaritia-endless|无尽贪婪·伪* @@ -6432,10 +6432,10 @@ goat-horns-copper-horns|山羊角与铜制号角 (Goat Horns & Copper Horns) mystical-powers damp|受潮* -wooden-bucket|木桶* +wooden-bucket@|木桶* compressed-barrels@compressed_barrels|压缩木桶* -advanced-netherite|高级下界合金* - Forge¨advanced-netherite-fabric|高级下界合金 (Advanced Netherite) - Fabric¨@advanced-netherite|高级下界合金 (Advanced Netherite) +advanced-netherite@|高级下界合金*¨advanced-netherite-fabric|高级下界合金 (Advanced Netherite) re-avaritia@|无尽贪婪:重生 (Re:Avaritia) simply-conveyors-more|简易传送带 (Simply Conveyors & More) porting-lib@porting_lib @@ -6470,7 +6470,7 @@ dungeons-libraries @fabricated-forge raknetify@ -@vmp-fabric¨@vmp-forge¨vmp-fabric +vmp-fabric@¨@vmp-forge flotage@|漂浮物* dynamic-trees-for-hungteens-plants-vs-zombies-mod|动态的树:HungTeen的植物大战僵尸附属 (Dynamic Trees for PVZ) antidrop@|防丢 (AntiDrop) @@ -6481,10 +6481,10 @@ boathud@ ninjaxxs-needs pixelmon-gui-blocks -more-mekanism-processing +more-mekanism-processing@ item-banning -probejs -impaled|更多三叉戟 (Impaled🔱)¨@impaled|更多三叉戟 (Impaled🔱) +probejs@ +impaled@|更多三叉戟 (Impaled🔱) laserio villager-tools@ @@ -6505,8 +6505,8 @@ tf2-engineer-buildings-mod kubejs-botania advancements-enlarger better-muffling|更好的消音器* -lightest-lamps¨lightest-lamps-fabric@lightest-lamps -bigbuckets|大铁桶 (Big Buckets) - Forge 和 Fabric/Quilt 1.19 及以上¨bigbuckets-fabric|大铁桶 (Big Buckets) - Fabric 1.14~1.16 +lightest-lamps@¨lightest-lamps-fabric +bigbuckets|大铁桶 (Big Buckets)¨bigbuckets-fabric|大铁桶 (Big Buckets) dimstorage spawner-imbuer@ @@ -6518,7 +6518,7 @@ mc-terrain-editor extra-gems@extragems|额外的宝石 (ExtraGems) various-world better-impaling-forge@|更好的穿刺Forge版* -bucketlib +bucketlib@ aquatic-torches@ better-sponges easyexcavate @@ -6529,7 +6529,7 @@ human-companions odysseyhud colorblindness@ aether-addon -@moonstone|月之石 (MoonStone) - Forge¨@moonfabric|月之石 (MoonStone) - Fabric +@moonstone|月之石 (MoonStone)¨@moonfabric|月之石 (MoonStone) server-redirect city-blocks @@ -6551,27 +6551,27 @@ op-items-tab thaumisc|神秘杂项学* -treechop +treechop@tIdTnzkf idwtialsimmoedm@ -entity-collision-fps-fix¨entity-collision-fps-fix-fabric¨@entity-collision-fps-fix +entity-collision-fps-fix@¨entity-collision-fps-fix-fabric hollowwoods dynamic-crosshair@dynamiccrosshair|动态准星* raiders better-animals-plus-plus block-overlay-fix -mini-effects¨mini-effects-fabric¨@mini-effects +mini-effects@¨mini-effects-fabric nature-overhaul ae2-fluid-crafting-rework@ae2-fluid-crafting|AE2流体合成套件重置 (AE2 Fluid Crafting Rework) moreculling@ -better-village-forge|更好的村庄 (Better Village) - Forge¨better-village-fabric|更好的村庄 (Better Village) - Fabric¨@better-villages-forge|更好的村庄 (Better Village) - Forge(已失效)¨@better-villages-fabric|更好的村庄 (Better Village) - Fabric(已失效) +better-village-forge@better-villages-forge|更好的村庄 (Better Village)¨better-village-fabric@better-villages-fabric|更好的村庄 (Better Village) trinkets-curios-theme@ -banilla-claws-forge@¨banilla-claws@ +banilla-claws-forge@banilla-claws¨banilla-claws@banilla-claws-forge -transparent-cosmetics¨@transparent-cosmetics -@more-geodes-reforged¨emerald-geodes@more-geodes +transparent-cosmetics|Transparent Cosmetics - 已失效¨@transparent-cosmetics +more-geodes-reforged@¨emerald-geodes@more-geodes right-click-get-crops@ oh-my-gourd better-block-sounds@bbs @@ -6590,7 +6590,7 @@ iron-backpacks-redone|特殊背包重做版* b0bgarys-biome-remover-v-1-0-0-1|B0bGary的生物群系禁用器 (B0bGary's Biome Remover) dualwielding@|双持 (DualWielding) malum-quilt@ -@memoryleakfix|内存泄漏修复 (Memory Leak Fix)¨memoryleakfix|内存泄漏修复 (Memory Leak Fix) +memoryleakfix|内存泄漏修复 (Memory Leak Fix) - 已停止支持¨@memoryleakfix|内存泄漏修复 (Memory Leak Fix) @axolotlviewer @compact-chat|紧凑聊天 (Compact Chat) language-reload@ @@ -6609,23 +6609,23 @@ powah-rearchitected@powah better-rocks horse-combat-controls libgui -simply-houses¨@simply-houses -yungs-better-desert-temples|YUNG的沙漠神殿优化 (YUNG's Better Desert Temples) - Forge¨yungs-better-desert-temples-fabric|YUNG的沙漠神殿优化 (YUNG's Better Desert Temples) - Fabric¨@yungs-better-desert-temples|YUNG的沙漠神殿优化 (YUNG's Better Desert Temples) +simply-houses@ +yungs-better-desert-temples@|YUNG的沙漠神殿优化 (YUNG's Better Desert Temples)¨yungs-better-desert-temples-fabric|YUNG的沙漠神殿优化 (YUNG's Better Desert Temples) modern-dynamics@|现代动力学* doggo-mod@ tan-huge-trees @wiangdtbisadtn|草我本来不想这么做的但是我这么做了啊啊啊啊啊啊啊啊啊啊啊啊啊啊 (Wait I Am Not Gonna Do This But I Somehow Accidentally Did This Nooooooooooooooo) -@yungs-better-witch-huts|YUNG的沼泽小屋优化 (YUNG's Better Witch Huts)¨yungs-better-witch-huts|YUNG的沼泽小屋优化 (YUNG's Better Witch Huts) - Forge¨yungs-better-witch-huts-fabric|YUNG的沼泽小屋优化 (YUNG's Better Witch Huts) - Fabric +yungs-better-witch-huts@|YUNG的沼泽小屋优化 (YUNG's Better Witch Huts)¨yungs-better-witch-huts-fabric|YUNG的沼泽小屋优化 (YUNG's Better Witch Huts) panorama-creator|全景图创建器* -ui-input-undo-fabric@|UI Input Undo - Fabric(已失效)¨ui-input-undo-forge@|UI Input Undo - Forge(已失效) +ui-input-undo-fabric@¨ui-input-undo-forge@ paimeng|应急食物 (PaiMeng) nyfs-quivers-expanded zoomify@ golemania@ -@vulkanmod¨vulkanmod +vulkanmod@ sledgehammer -@quilt-loading-screen|Quilt加载画面 (Quilt Loading Screen)¨quilt-loading-screen|Quilt加载画面* +quilt-loading-screen|Quilt加载画面* - 不再更新¨@quilt-loading-screen|Quilt加载画面 (Quilt Loading Screen) amethyst-imbuement@|紫晶魔艺* emi@ nuclear-contraptions @@ -6641,7 +6641,7 @@ armor-visibility@ the-chicken-came-first|先有鸡* hardcore-dungeons -block-relocation-forge +block-relocation-forge¨block-relocation norecipebook-fabric@|没有配方书Fabric版 (NoRecipeBook (Fabric)) @sort fpsdisplay@ @@ -6656,7 +6656,7 @@ nbttooltips@ upstream¨upstream-fabric astemirs-fireflies -ender-crop¨@ender-crop +ender-crop@ modupdater fivehead @@ -6716,7 +6716,7 @@ real-time-clock tardim@ -luckytnt +luckytnt@lucky-tnt-mod gamma-utils@|伽玛工具* pickle-tweaks@ dps-chaoscraft@ @@ -6739,7 +6739,7 @@ farmers-respite|农夫暇事 (Farmer's Respite) crafting-mania loot-goblins@ skylib@ -@dt3|不要饿死3 (DontStarve3)¨dt3|不要饿死3 (DontStarve3) +dt3|不要饿死3 (DontStarve3) - 暂停更新¨@dt3|不要饿死3 (DontStarve3) tbscclick modern-elevators-and-escalators@|现代电梯与扶梯 (Modern Elevators and Escalators) @@ -6750,7 +6750,7 @@ gobber-delight-a-farmers-delight-add-on|戈伯乐事 (Gobber Delight) extinguish-by-uss_shenzhou|灭 (Extinguish) -@biome-makeover|生物群系改造 (Biome Makeover)¨biome-makeover-forge|生物群系改造 (Biome Makeover) - Forge¨biome-makeover|生物群系改造* - Fabric +biome-makeover-forge@biome-makeover|生物群系改造 (Biome Makeover)¨biome-makeover|生物群系改造* throwable-blocks ancient-warfare-3@ancient-warfare|古代战争3* no-chat-reports@|禁用聊天举报* @@ -6775,7 +6775,7 @@ shulker-tooltip@ midnightlib@ - +just-backpacks doubledoors @mod-remapping-api tic-tooltips @@ -6834,7 +6834,7 @@ recipe-gui villager-hats-mod@villager-hats custom-damage-particles@|自定义伤害粒子* @aei|AEI物品管理器 (Always Enough Items) -cyan-warrior-swords-mod@¨wiki-115-112 +cyan-warrior-swords-mod@ plant-in-a-jar@ solid-mobs naturalist@|自然主义* @@ -6846,7 +6846,7 @@ zephs-excavators@zephsexcavators @technomodel cat-herder command-creative-tab -@umu-backpack¨umu-backpack +umu-backpack|UMU Backpack - 已失效¨@umu-backpack short-stacks smooth-boot-reloaded@|流畅加载重置版* @@ -6881,7 +6881,7 @@ actually-useful-stonecutter itemphysic-lite-fabric forgotten-treasures player-health-indicators@playerhealthindicators -displaycase|陈列柜 (Display Case) +displaycase@|陈列柜 (Display Case) auto-look grimoire-of-gaia|盖亚魔典 (Grimoire of Gaia) ftb-jar-mod-forge @@ -6892,7 +6892,7 @@ titlechanger@mctitlechanger|标题切换器 (TitleChanger) adobe-blocks-2 menacing-monsters packing-tape -the-graveyard-biomes-forge¨the-graveyard-biomes-fabric +the-graveyard-biomes-forge@nyctophobia¨the-graveyard-biomes-fabric cammies-minecart-tweaks@ renderlib @@ -6904,21 +6904,21 @@ randomium-ore@ degradeexplodedblocks zeras-scps -enderite-lieonlion +enderite-lieonlion@ advancedchatfilters@AdvancedChatFilters advancedchatmacros@AdvancedChatMacros aof-emotes grasslessdirtbackport dazzle-2 -smaller-nether-portals¨smaller-nether-portals-fabric¨@smaller-nether-portals +smaller-nether-portals@¨smaller-nether-portals-fabric basic-aiots pokeball@|精灵球 (PokeBall) -gravitychanger¨@gravitychanger +gravitychanger@ building-wands@ advancedchat@AdvancedChat aiots-expanded-fabric -moremcmeta¨moremcmeta-fabric¨@moremcmeta +moremcmeta@¨moremcmeta-fabric starry-skies flesh2leather-forge¨flesh2leather-fabric fall-damage-indicator @@ -6953,7 +6953,7 @@ waterlogged-redstone prehistoric-flora-integration better-bad-omen can-you-trash-it -croptopias-chocolaterie-forge|作物盛景:巧克力工坊 (Croptopia's Chocolaterie) - Forge¨croptopias-chocolaterie-fabric@croptopia-chocolaterie|作物盛景:巧克力工坊 (Croptopia's Chocolaterie) +croptopias-chocolaterie-forge@croptopia-chocolaterie|作物盛景:巧克力工坊 (Croptopia's Chocolaterie)¨croptopias-chocolaterie-fabric|作物盛景:巧克力工坊 (Croptopia's Chocolaterie) crawl@ fabric-chisel@chisel-reborn roost-ultimate@roostultimate @@ -6976,7 +6976,7 @@ dragon-fire-mod sandy-ores|沙子矿石* rainbowify@ be-quiet-please|请安静* -prehistoric-revival-a-prehistoric-fauna-add-on|史前复生 (Prehistoric Revival)¨issues|史前复生 (Prehistoric Revival) - Issues提交处 +prehistoric-revival-a-prehistoric-fauna-add-on|史前复生 (Prehistoric Revival) had-enough-characters medieval-origins @@ -6996,7 +6996,7 @@ mcda@|我的世界:地下城盔甲 (MC Dungeons Armors) sun-burns battle-tools -jobsplus¨@jobsplus +jobsplus@ towns-and-towers-structure-add-on@towns-and-towers drg-flares-forge¨drg-flares simple-uncrafting-table-fabric@simple-uncrafting-table @@ -7010,10 +7010,10 @@ haruhiism|春日主义* withcoffee|咖啡相伴/天堂之路 (WithCoffee) emeraldstuff grass-slabs-carpets-stairs -not-mutually-exclusive|不冲突*¨@not-mutually-exclusive|不冲突 (Not Mutually Exclusive) +not-mutually-exclusive|不冲突*¨@not-mutually-exclusive|不冲突 (Not Mutually Exclusive) - 已失效 builders-delight-forge miners-minerals@ -days-to-mine|七日杀 (7 Days to Mine) +days-to-mine@7-days-to-mine|七日杀 (7 Days to Mine) pieces-of-ore @fix-keyboard-on-linux @@ -7033,7 +7033,7 @@ rechiseled@ durability-tooltip@ oreganized-mod|井然有矿* - 旧版¨oreganized|井然有矿 (Oreganized Mod) - 2.0+版¨@oreganized|井然有矿 (Oreganized Mod) riding-utilities -compact-help-command¨compact-help-command-fabric¨@compact-help-command +compact-help-command@¨compact-help-command-fabric miners-lung|矿工之肺 (Miner's Lung) greenery|绿色植物🌿 (Greenery🌿) @@ -7042,7 +7042,7 @@ large-meals-an-add-on-for-farmers-delight explorers-delight@ the-irregular-chef compat-o-plenty -snow-pig@snowpig|雪猪* - Forge¨snow-pig-fabric@snowpig-fabric|雪猪 (Snow Pig) - Fabric +snow-pig@snowpig|雪猪*¨snow-pig-fabric@snowpig-fabric|雪猪 (Snow Pig) wandering-collector@ @@ -7056,7 +7056,7 @@ crafting-on-a-stick endlessids@ @cpm-fabric|压缩空间 Fabric (Compact Machines - Fabric) -cycle-paintings-fabric +cycle-paintings¨cycle-paintings-fabric fire-spread-tweaks¨fire-spread-tweaks-fabric anger-management @@ -7066,10 +7066,10 @@ light-meals@|轻食物语* lost-and-fished@lost-fished|失而钓得 (Lost and Fished) custom-backgrounds ydms-allay@|YDM的悦灵 (YDM's Allay) -starmaker +starmaker@ @swdheftpywaed|对不起,我们没有充足的资金为您提供一只末影龙 (Sorry We Don't Have Enough Funds To Provide You With An Ender Dragon) simply-snow -areas¨areas-fabric¨@areas +areas@¨areas-fabric emberroot-zoo mctimeextendsfabric l2library@ @@ -7078,7 +7078,7 @@ colorful-cut @fake-floader environmental-materials@ horse-tweaks -auto-workstations-fabric|自动化工作站 (Auto Workstations) +auto-workstations-fabric@auto-workstations|自动化工作站 (Auto Workstations) l2-backpack@l2backpack|莱特兰-背包* @mbp @@ -7098,7 +7098,7 @@ offline-mode ghastly-wail@ immersive-weapons#c71 -clear-skies¨@clear-skies +clear-skies@ ShretNether pling@ @@ -7107,10 +7107,10 @@ justthetips notenoughitems-gtnh@notenoughitems-unofficial|NEI物品管理器非官方版 (NotEnoughItems Unofficial) sketchbook-attributes -better-combat-by-daedelus¨better-combat-backport|Better Combat - 1.16, 由 MinikParadox 上传(已失效)¨@better-combat +better-combat-by-daedelus@better-combat¨better-combat-backport custom-stars -ice-and-fire-tweaker +ice-and-fire-tweaker@ soaring-clouds lapis-stays-in-the-enchanting-table goodall @@ -7134,7 +7134,7 @@ fogbox@ @hopper lots-of-shields timestopclock|Mega的时间静止 (MegaTimeStopMod) -@umu-little-maid¨umu-little-maid +umu-little-maid|UMU Little Maid - 已失效¨@umu-little-maid loot-games|战利品游戏* ydms-scorpions@|YDM的蝎子 (YDM's Scorpions) @@ -7164,14 +7164,14 @@ no-lag-tickratechanger@ alcocraft-beer-and-stuff simplevillagers@ -autoreconnect¨@autoreconnect +autoreconnect@ dusk copper-craft|铜制工艺* extrabotany2|额外植物学重置版 (ExtraBotany2) terramine@ aeinfinitybooster -endertech-infinity +endertech-infinity|Endertech Infinity - 已失效¨@endertech-infinity more-frogs-fabric|更多青蛙 (More Frogs) @@ -7179,7 +7179,7 @@ create-big-cannons@|机械动力:火炮* fastanim@ rubidium-extra@|铷 · 扩展 (Embeddium (Rubidium) Extra) less-feature|更少的特性 (Less Features) -mores-forge¨mores-fabric@mores +mores-forge@mores¨mores-fabric tactical-fishing token-enchanter igiexteneded|IGI 信息扩展 (IGIExteneded) @@ -7196,7 +7196,7 @@ sneak-through-berries@ winter-overhaul@|冬季改革* offlineskins¨offlineskins-fabric - +@xdi8aho-mod|灯纟火 (Xdi8Aho Mod) another-furniture@|别样家具* @@ -7257,10 +7257,10 @@ natural-decoration spice-of-fabric@ better-climbing@ dog-yeeter -mc122477fix¨@mc122477fix +mc122477fix@ armors-hud-revived-liteloader-only living-things@|自然生物* -beautify-decorate|美化! (Beautify !) +beautify-decorate@beautify|美化! (Beautify !) Voodoo@voodoo notenoughluck|更多幸运 (NotEnoughLuck) @@ -7278,12 +7278,12 @@ scift@ @ping-me @tool-rods the-squid-game-mod -datapack-portals@datapackportals +datapack-portals@datapackportals|数据包传送门* more-beautiful-walls@ -iris-flywheel-compat +iris-flywheel-compat@iris-flw-compat prism-lib¨prism-fabric -map-atlases-forge|地图册 (Map Atlases) - Forge¨map-atlases@|地图册* +map-atlases-forge@map-atlases|地图册 (Map Atlases)¨map-atlases|地图册* @eprr|额外玩家渲染Rift版 (ExtraPlayerRenderer-Rift) @@ -7291,19 +7291,19 @@ map-atlases-forge|地图册 (Map Atlases) - Forge¨map-atlases@|地图册* smartbrainlib@ twilight-tweaks aureus-simple-slabs -just-mob-heads¨just-mob-heads-fabric¨@just-mob-heads +just-mob-heads@¨just-mob-heads-fabric squid-game-mod quantum-querry-plus|量子采石场增强 (Quantum Quarry Plus) food-enhancements|食物扩增* @bindgg create-ore-excavation@|机械动力:矿石开掘* -just-player-heads¨just-player-heads-fabric¨@just-player-heads -survivalplus-lightsabers|生存加光剑 (SurvivalPlus Lightsabers) - Forge¨survivalplus-lightsabers-fabric|生存加光剑 (SurvivalPlus Lightsabers) - Fabric +just-player-heads@¨just-player-heads-fabric +survivalplus-lightsabers|生存加光剑 (SurvivalPlus Lightsabers)¨survivalplus-lightsabers-fabric|生存加光剑 (SurvivalPlus Lightsabers) fclib primitive-utilities guglecarpetaddition@gca|Gugle的Carpet附加包 (GugleCarpetAddition) -survivalplus|生存加 (SurvivalPlus) - Forge¨survivalplus-fabric|生存加 (SurvivalPlus) - Fabric +survivalplus|生存加 (SurvivalPlus)¨survivalplus-fabric|生存加 (SurvivalPlus) mrp-library bypass-anvil-restriction no-early-loading-progress @@ -7361,10 +7361,10 @@ instant-massive-structures-ims hunger-remover@ rad-enchants plus-the-end -runic¨@runic +runic@ broken-discs forgedfabric@ -create-extended-flywheels|机械动力:更多飞轮 (Create: Extended Flywheels) - Forge¨create-extended-flywheels-fabric|机械动力:更多飞轮 (Create: Extended Flywheels) - Fabric¨@extended-flywheels|机械动力:更多飞轮 (Create: Extended Flywheels) +create-extended-flywheels@extended-flywheels|机械动力:更多飞轮 (Create: Extended Flywheels)¨create-extended-flywheels-fabric|机械动力:更多飞轮 (Create: Extended Flywheels) piggy-bank deeperdarker@ @@ -7383,7 +7383,7 @@ fuelcanister@fuel-canister f5-begone@ -smartvision¨@smartvision +smartvision@ no-more-purple @@ -7402,7 +7402,7 @@ ice-fire-katanas brvsb@|更好的铷视频设置按钮 (Better Rubidium Video Settings Button) roughly-enough-trades@ simple-quarry -magitek-mechs +magitek-mechs|Magitek Mechs - 已停用¨@magitek-mechs infectum nocubes-sea-dwellers show-me-your-skin@ @@ -7421,7 +7421,7 @@ crafted-forge¨crafted cursery mirage-orb galacticborn-origin - +extra-recipe|更多配方* custom-window-title@ @@ -7459,14 +7459,14 @@ tools-for-caves-and-cliffs infinity-with-mending@|无限与经验修补* infinity-craft -hookshot¨@hookshot +hookshot@ custom-spawns create-misc-and-things|机械动力:实用物件 (Create : Misc & Things) low-fire@ infinity-buttons@infinitybuttons|无限按钮* i-know-what-im-doing-fabric skin-hotkey@ -dyeable-fishing-lines-fabric¨dyeable-fishing-lines-forge¨@dyeable-fishing-lines +dyeable-fishing-lines-fabric@dyeable-fishing-lines¨dyeable-fishing-lines-forge reciperemover@ roughly-enough-loot-tables@ @@ -7486,7 +7486,7 @@ nyx-rotn-edition playeranimator@ apathy-mod -auudio-forge¨auudio-fabric¨@auudio +auudio-forge@auudio¨auudio-fabric easy-shulker-boxes@ @@ -7496,10 +7496,10 @@ piercing-paxels@piercingpaxels icy-incitement@ visible-librarian-trades unlimited-chisel-works-tfc1 -enchantedshulkers|附魔潜影盒 (EnchantedShulkers) +enchantedshulkers@|附魔潜影盒 (EnchantedShulkers) noits-simple-sorting colds-gauntlets -level-one +level-one@ wilder-wild@ paintings-with-dragons more-redstone-lamps|更多红石灯* @@ -7523,7 +7523,7 @@ gateways-to-eterrnity|永恒之门 (Gateways to Eternity) gate-of-babylon-additions@|王之财宝附加 (Gate of Babylon Additions) hephaestus-fabric@hephaestus|匠神 (Hephaestus) crafting-bench@ -morebeeinfo +morebeeinfo@ bq-forestry|更好的任务-林业扩展 (Better Questing - Forestry) create-infinidrill @@ -7533,7 +7533,7 @@ create-infinidrill attribute-tooltip-fix@ -crumbs¨crumbs-fabric¨@crumbs +crumbs@¨crumbs-fabric italian-delights-add-on-for-farmers-delight immersivemc@|沉浸式MC (ImmersiveMC) mc-vr-api@ @@ -7551,13 +7551,13 @@ fishery-expansion arrowcamfabric overpowered-mending@overpoweredmending -woof -instant-blocks¨instant-blocks-fabric¨@instant-blocks -better-sprinting@ +woof@wolves-of-other-furs +instant-blocks@¨instant-blocks-fabric +better-sprinting@|更好的疾跑* rpglevels -snow-under-trees +snow-under-trees@ elytra-physics -scout +scout@ zenstages wondrous-wilds@ @@ -7591,7 +7591,7 @@ mushroom-additions project-the-void|项目 -虚空- (Project the Void) ice-and-fire-rotn-edition -minescript +minescript@ no-capes@|禁用披风* apocalypsecraft mcree_highnoons-enchantments|McRee_HighNoon的附魔 (McRee_HighNoon's Enchantments) @@ -7601,7 +7601,7 @@ zonkos-monsters tetratic-combat fastload@ dramatictrees@dtree -@robinhood¨robinhood +robinhood|Robin Hood - 已失效¨@robinhood trajans-core stop-hiding @@ -7609,7 +7609,7 @@ simple-world-timer recursive-resources@recursiveresources inventory-actions -haunted-harvest +haunted-harvest@ dungeonsenhanced create-crystal-clear@|机械动力:晶莹剔透 (Create: Crystal Clear) @create-crystal-clear-fabric @@ -7626,7 +7626,7 @@ fire-n-blood chunknogobyebye beaming-drops@loot-beams-backport|掉落物光束 (Beaming drops) protocharset@protocharset-rift -the-hordes +the-hordes@ @inventory-management soul-fired@soul-fire-d @@ -7643,19 +7643,19 @@ gempire sbm-bone-torch linkmyitem -sprout +sprout@ resourceful-lib@ marg -cozy +cozy@ better-piglin-trade|更好的猪灵交易* model-gap-fix@modelfix posture little-ants|小蚂蚁* -hardcore-torches|硬核火把* - Fabric¨hardcore-torches-forge|硬核火把 (Hardcore Torches) - Forge +hardcore-torches|硬核火把*¨hardcore-torches-forge|硬核火把 (Hardcore Torches) auto-torch nightlights@|小夜灯 (Night Lights) angry-mobs @@ -7685,7 +7685,7 @@ dogwhistle wilder-wilds @ae2-unpowered -better-respawn@ +better-respawn@|更好的重生* essentialgui@ elementary-staffs dragon-fight-config @@ -7693,10 +7693,10 @@ infused-foods@ what-meme shiny-gear would-you-shut-up-man -weaker-spiderwebs¨weaker-spiderwebs-fabric¨@weaker-spiderwebs +weaker-spiderwebs@¨weaker-spiderwebs-fabric netherbarrels wooden-elytra|木制鞘翅* -construction-site-deco +construction-site-deco@construction wthit-harvestability@ habitat @emicompat @@ -7707,7 +7707,7 @@ custom-cards|自定义卡牌* biome-cards|群系卡牌* bombinghud astral-dimension -@followers-teleport-too¨followers-teleport-too-fabric¨followers-teleport-too +followers-teleport-too-fabric@followers-teleport-too¨followers-teleport-too @citycraft|城市工艺 (City Craft) odysseymod libipn@ @@ -7733,7 +7733,7 @@ adapaxels@ fabrizoom@ json-things @origins-randomiser -simply-swords|简易刀剑* +simply-swords@|简易刀剑* kuayue@|跨越 (KuaYue) summoningrituals|召唤仪式 (Summoning Rituals) @@ -7746,7 +7746,7 @@ cave-generator|洞穴生成器* console-filter customized-dungeon-loot@ customquests -portal-cubed +portal-cubed@ pehkui-resizer @kaffees_dual_ride @sfreeze @@ -7769,14 +7769,14 @@ modget@ no-leaf-decay@ mysteriumlib@ @inrealtime -furnace-recycle¨furnace-recycle-fabric¨@furnace-recycle +furnace-recycle@¨furnace-recycle-fabric wild-lands noenchanting gregtech-experimental@ @cooldown-totem -almost-bedtime@ +almost-bedtime¨@almost-bedtime|Almost Bedtime - 已失效 catlib @mythicbotany_tweaker polaroid-camera@polaroidcamera|宝丽来相机* @@ -7812,9 +7812,9 @@ shield-mechanics|盾牌机制优化 (Shield mechanics) sun-and-moon-celestial-configuration@celestial-config chatsound advancedshader|光影前向兼容 (AdvancedShader) -the-wools|羊毛! (The Wools!)¨@the-wools|羊毛! (The Wools!) +the-wools@|羊毛! (The Wools!) fabric-enchantments -glued +glued@ tinkers-craft|工匠创意 (Tinkers' Craft) tinker-leveling gtce-tj-edition|格雷科技社区版:TJ版 (GregTech Community Edition: TJ Edition) @@ -7828,7 +7828,7 @@ pillar resound mob-plaques@ corail-scanner -space-ambient-addon-for-galacticraft +space-ambient-addon-for-galacticraft@space-ambient spiked-foods auraddons auracontrol @@ -7837,11 +7837,11 @@ the-otherside pogo-sticks tickrate-changer|运算变速* camcord@ -@modernkeybinding|现代化按键绑定 (Modern KeyBinding)¨modern-keybinding|现代化按键绑定 (Modern KeyBinding) - Forge¨modern-keybinding-fabric|现代化按键绑定 (Modern KeyBinding) - Fabric +modern-keybinding@modernkeybinding|现代化按键绑定 (Modern KeyBinding)¨modern-keybinding-fabric|现代化按键绑定 (Modern KeyBinding) make-bubbles-pop@make_bubbles_pop couplings@ mambience@ -elytra-aeronautics@¨elytra-aeronautics-forge|Elytra Aeronautics - Forge移植版 +elytra-aeronautics@¨elytra-aeronautics-forge infinitory loud-leads|拴绳音效* @@ -7850,7 +7850,7 @@ telepistons@ mariums-soulslike-weaponry@|Marium的魂类武器 (Marium's Soulslike Weaponry) lets-go-herping modularui -inventory-bogo-sorter +inventory-bogo-sorter@inventory-bogosorter gregtech-sieves|格雷矿石筛子 (GregTech Sieves) dynamic-trees-gregtech-ceu-rubber-tree|动态的树:格雷科技社区版:非官方版附属 (Dynamic Trees - GregTech CEu) fertility @@ -7869,9 +7869,9 @@ cannot-build-over-lava-source-blocks quark-rotn-edition inmisaddon@ pineapple-delight@|凤梨乐事* -woodworks +woodworks@ informational-accessories|信息饰品* -nyfs-spiders +nyfs-spiders@ illager-additions idolizing evocation-and-annihilation @@ -7889,7 +7889,7 @@ mob-vote-2022-forge¨mob-vote-2022 curious-lands cpmsvcc@|自定义玩家模型的简单的语音聊天兼容 (Customizable Player Models Simple Voice Chat compat) pettable@ -create-enchantment-industry@|机械动力:附魔工业* - Forge¨create-enchantment-industry-fabric@|机械动力:附魔工业 (Create Enchantment Industry) - Fabric +create-enchantment-industry@|机械动力:附魔工业*¨create-enchantment-industry-fabric@|机械动力:附魔工业 (Create Enchantment Industry) enchanted-witchcraft wyml @@ -7897,16 +7897,16 @@ bunch-o-bugs useless-reptile@ technomancy-2|量子魔法2 (Technomancy2) quickstore|快速贮藏重制版 (QuickStoreRemake) -your-items-are-safe¨your-items-are-safe-fabric¨@your-items-are-safe +your-items-are-safe@¨your-items-are-safe-fabric techemistry the-missing-villages continents@ -yungs-better-ocean-monuments|YUNG的海底神殿优化 (YUNG's Better Ocean Monuments) - Forge¨yungs-better-ocean-monuments-fabric|YUNG的海底神殿优化 (YUNG's Better Ocean Monuments) - Fabric¨@yungs-better-ocean-monuments|YUNG的海底神殿优化 (YUNG's Better Ocean Monuments) +yungs-better-ocean-monuments@|YUNG的海底神殿优化 (YUNG's Better Ocean Monuments)¨yungs-better-ocean-monuments-fabric|YUNG的海底神殿优化 (YUNG's Better Ocean Monuments) echoing-depths advanced-finders maple-forest|枫林* -@legacyinputpatch|Legacy Fabric输入补丁 (LegacyInputPatch) +@legacyinputpatch|Legacy Fabric 输入补丁 (LegacyInputPatch) droplight xanders-sodium-options@ entity-view-distance@ @@ -7925,7 +7925,7 @@ auto-hud@autohud camera-utils@ roughly-enough-items-server-component@ -daves-building-extended¨daves-building-extended-fabric|Dave's Building Extended - Fabric(非官方) +daves-building-extended¨daves-building-extended-fabric @rechiseled-bookshelves dimensional-pockets-ii|四次元口袋2 (Dimensional Pockets II) @@ -7933,13 +7933,13 @@ dimensional-pockets-ii|四次元口袋2 (Dimensional Pockets II) black-hole-storage|黑洞存储* hudtweaks@ mod-button -@opt-carpet-addition +opt-carpet-addition@ trees-do-not-float@ cosmos-library groovyscript -potion-ring-reforged|药剂环重铸 (Potion Rings - REFORGED) - Forge¨potion-ring-reforged-fabric|药剂环重铸 (Potion Rings - REFORGED) - Fabric¨@potion-ring-reforged|药剂环重铸 (Potion Rings - REFORGED) -scp-overtime +potion-ring-reforged@|药剂环重铸 (Potion Rings - REFORGED)¨potion-ring-reforged-fabric|药剂环重铸 (Potion Rings - REFORGED) +scp-overtime@ chubby-stuff-fabric better-brightness-slider@ open-parties-and-claims@ @@ -7949,26 +7949,26 @@ immediatelyfast@ opac-fabric-create-support@ steel-for-fabric@steel|钢 (Steel) mekanism-tweaks@ -changed-minecraft-mod +changed-minecraft-mod@ hello-crosshair@ bendy-lib@ enchantment-transfer-forge golden-crops -lil-wings +lil-wings@ @scp-sharp scary-mobs-and-bosses elytra-replace|鞘翅替换* -mt-garden-arsenal-forge|MT:花园军火库 (MT: GardenArsenal) - Forge¨mt-gardenarsenal-fabric|MT:花园军火库 (MT: GardenArsenal) - Fabric +mt-garden-arsenal-forge|MT:花园军火库 (MT: GardenArsenal)¨mt-gardenarsenal-fabric|MT:花园军火库 (MT: GardenArsenal) visual-overhaul@ drawerfps-legacy|储物抽屉渲染配置:遗产 (DrawerFPS Legacy) status-effect-timer@statuseffecttimer logical-zoom@ the-space-age-mod|太空时代* -touhou-origins|起源:东方project附加包*¨@touhou-origins|起源:东方project附加包 (Touhou Origins) +touhou-origins@|起源:东方project附加包* earth-mobs@earthmobs|地球生物* simpleores-tin @@ -8048,7 +8048,7 @@ berdinskiybears-armor-hud tiered-tooltips -rgb-blocks-forge +rgb-blocks-forge|调色方块 (RGB Blocks) quicksand-fabric|流沙 (Quicksand) better-durability|更好的耐久度* @@ -8056,7 +8056,7 @@ passthrough-signs excorrelation@ packet-size-doubler @packet-size-double-forge -arachnophobia-mode-for-minecraft¨@arachnophobia-mode +arachnophobia-mode-for-minecraft@arachnophobia-mode villagerconfig@|村民配置 (VillagerConfig) jasm paginated-advancements@paginatedadvancements|分页进度* @@ -8076,7 +8076,7 @@ another-liquid-milk@ dark-mode-everywhere-fabric@|夜间模式无处不在Fabric版 (Dark Mode Everywhere - Fabric) bartering-station@ -dark-paintings +dark-paintings@ filtpick@|拾取筛 (FiltPick) @@ -8090,10 +8090,10 @@ mob-catcher guns-rpg-waystone-addon biospheres-fabric|现代生物圈 (Modern Biospheres) -better-snowball-fight-2@better-snowball-fight|更好的打雪仗 (Better Snowball Fight) +better-snowball-fight@|更好的打雪仗* feathers@ brb@|更好的配方书 (Better Recipe Book) -boatoverhaul-forge|行船机制修改 (Boat Overhaul) - Forge¨boatoverhaul-fabric|行船机制修改 (Boat Overhaul) - Fabric +boatoverhaul-forge|行船机制修改 (Boat Overhaul)¨boatoverhaul-fabric|行船机制修改 (Boat Overhaul) sculk-warden better-questing-gamestages-expansion@|更好的任务-游戏阶段扩展 (Better Questing - Gamestages Expansion) omega-chips @@ -8159,49 +8159,49 @@ more-beautiful-buttons aoa-end-realmstone adaptive-tooltips@ -variant-barrels-fabric¨@variant-barrels -variant-crafting-tables-fabric¨@variant-craftingtables +variant-barrels-fabric¨@variant-barrels|Variant Barrels - 已失效 +variant-crafting-tables-fabric¨@variant-craftingtables|Variant Crafting Tables - 已失效 immersive-structures@ avaritia-port-fabric explorify -variant-bookshelves-fabric¨@variant-bookshelves -@variant-shields¨variant-tiered-shields-fabric +variant-bookshelves-fabric¨@variant-bookshelves|Variant Bookshelves - 已失效 +variant-tiered-shields-fabric¨@variant-shields|Variant Shields - 已失效 libertys-villagers@libertyvillagers|自由村民 (Liberty's Villagers) server-translation-api rough-mobs-2|粗暴的怪物2* barren-isles korgelin -variant-composters-fabric¨@variant-composters -variant-grindstones-fabric¨@variant-grindstones - +variant-composters-fabric¨@variant-composters|Variant Composters - 已失效 +variant-grindstones-fabric¨@variant-grindstones|Variant Grindstones - 已失效 +custom-villager-trades-new|自定义村民交易 (Custom Villager Trades) spice-of-life-apple-pie-edition|生活调味料:苹果派版 (Spice of Life: Apple Pie Edition) xp-obelisk|经验方尖碑 (XP Obelisk) enhanced-searchability@|搜索增强* compact-ui@ -lets-do-wine@vinery|葡园酒香 (Let's do Wine / Vinery) +lets-do-wine@lets-do-vinery|葡园酒香 (Let's do Wine / Vinery) wealthyandgrowth subtitle-highlight@|字幕高亮* clockhud@clock-hud -variant-lanterns-fabric¨@variant-lanterns +variant-lanterns-fabric¨@variant-lanterns|Variant Lanterns - 已失效 lanterns-bow@ auto-crouch@ my-village-pack -variant-sticks-stuff¨@variant-sticks-and-stuff +variant-sticks-stuff¨@variant-sticks-and-stuff|Variant Sticks & Stuff - 已失效 multiple-server-lists@ superflat-biomes combat-music@ yuoenchants|Yuo的更多附魔 (YuoEnchants) hibernal-herbs better-resource-pack-sorting@ -sound-physics-remastered|物理声效重制版*¨@sound-physics-remastered|物理声效重制版 (Sound Physics Remastered) +sound-physics-remastered@|物理声效重制版* @fix-quark-3951|Quark3951号issue修复 (FixQuark3951) starcoffee -seed-finder-mod +seed-finder-mod@seedfindermod potato-food compassplus -create-industry|机械动力:工业长路 (Create: Industry/Create: The Factory Must Grow) +create-industry@create-tfmg|机械动力:工业长路 (Create: Industry/Create: The Factory Must Grow) simple-splash-screen@ unusual-prehistory-forge biospheres|生物圈 (Biosphere) @@ -8213,7 +8213,7 @@ daylight-mobs-reborn@ toast-manager explosives-i-approve -miners-delight-plus|矿工乐事 (Miner's Delight) +miners-delight-plus@miners-delight|矿工乐事 (Miner's Delight) igniting-arrows rise-of-the-animagus lost-books @@ -8238,7 +8238,7 @@ qfapi-and-qsl-biomefix-1-18-2@qsl-biomefix @cotton honey-expansion-add-on-for-farmers-delight|蜂蜜拓展 (Honey Expansion) -moguns +moguns@mo-guns dayz-minecraft infusion-table@ backroomtastic @@ -8246,13 +8246,13 @@ xps-things|经验之谈 (XP's Things) gravityapi@gravity-api @super-secret-revival item-alchemy-fabric@item-alchemy -bat-elytra +bat-elytra@ super-secret-settings@ @plumeconfig geophilic@ critter-fights - +hypothermic@ nosecrets|不秘密 (NoSecrets) extra-creeper-types loot-casket @@ -8267,11 +8267,11 @@ space-bosstools-giselle-addon mined-rider-kuuga inventory-essentials¨inventory-essentials-fabric astral-additions|星辉附加* -simple-copper-pipes¨simple-copper-pipes-forge|Simple Copper Pipes - Forge,已失效¨@simple-copper-pipes +simple-copper-pipes@¨simple-copper-pipes-forge advanced-nbt-tooltips@|高级NBT提示工具 (Advanced NBT Tooltips) follow-me stabx-modern-guns -justhammers +justhammers@just-hammers reinforced-deepslate-crafting|强化深板岩的合成* jaopcacustom|JAOPCA自定义 (JAOPCA Custom) friendly-fire@ @@ -8283,13 +8283,13 @@ elemental-combat|元素战斗* roasted|烘烤* lotr-attack-indicator-addon@lotr-attack-indicator|魔戒攻击指示器 (LOTR Attack Indicator Addon) steels-delight -lotr-pouch-viewer-addon|魔戒口袋内容展示 (LOTR Pouch Viewer Addon) +lotr-pouch-viewer-addon@lotr-pouch-viewer|魔戒口袋内容展示 (LOTR Pouch Viewer Addon) fastfood-delight|快餐乐事 (FastFood Delight) festive-delight@|节日乐事* project-arsenal bathroom-blocks@ -galosphere -lazydfu-agent|DFU禁用器 (Lazydfu-agent) +galosphere@ +lazydfu-agent|DFU 禁用器 (Lazydfu-agent) nether-mushroom-stew|下界蘑菇煲* @@ -8318,19 +8318,19 @@ decoration-delight|装饰乐事 (Decoration Delight: Refurbished) @havio-cookbook|Havio的烹饪书 (Havio's Cookbook) formidablefarmland@ -@survivality +survivality@ dynamic-crosshair-compat@dynamiccrosshaircompat|动态准星兼容* litewolfcore vineyard-mod @affectionate -mo-colors¨@mo-colors +mo-colors@ peek@ fancy-dyes@ @extra-mod-integrations mod-settings@ @dont-dissapear -fastquit¨@fastquit +fastquit@ violeta-cannons war-of-valor @@ -8351,10 +8351,10 @@ masonry-blocks @sqlib mssql-jdbc packages@|自定义包裹* -giant-spawn¨giant-spawn-fabric¨@giant-spawn +giant-spawn@¨giant-spawn-fabric @mtr-nte|纸板箱的交通扩展 (Nemo's Transit Expansion) serene-shrubbery - +gardens-of-the-dead@ pirate-hats decor4fabric mob-skills @@ -8364,15 +8364,15 @@ whipdashing@ potiontimestacker-forge@timestacker breezy heart-balance -throwabletorch-fabric¨throwabletorch +throwabletorch-fabric@throwabletorch¨throwabletorch potion-descriptions¨potion-descriptions-fabric half-doors@halfdoors decor4forge mineterrariabosses -biomes-in-jars-forge|群系罐子 (Biomes in Jars) - Forge¨biomes-in-jars-fabric|群系罐子 (Biomes in Jars) - Fabric¨@biomes-in-jars|群系罐子 (Biomes in Jars) +biomes-in-jars-forge@biomes-in-jars|群系罐子 (Biomes in Jars)¨biomes-in-jars-fabric|群系罐子 (Biomes in Jars) @bocchitheblock -craftable-potion-combinations +craftable-potion-combinations@craftablepotioncombinations polylib @creeper-fire-charge-fix|Creeper火焰弹修复 (Creeper Fire Charge Fix) @tags-binder @@ -8383,7 +8383,7 @@ upgraded-netherite-spartan-weaponry|下界合金增强:斯巴达的武器 (Upg simple-jams nethers-cruelty - +atom-sweep|基石-清理 (Atom-Sweep) the-gold-rush optifabric-origins@ lng-deco @@ -8404,19 +8404,19 @@ potato-cooking clienttime mcpitanlibarch@ -manure-fabric|粪便 (Manure) - Fabric¨manure|粪便* - Forge¨@manure|粪便 (Manure) +manure-fabric@manure|粪便 (Manure)¨manure|粪便* well@ enderling-invaders@ proton zetter-gallery@zetter-gallery-share-paintings hedge-magic@ -arcane-additions +arcane-additions@arcaneadditions instrument@instrument%2B%2B|更多乐器 (Instrument++) rpg-gods - +mob-crossing just-enough-vehicles max-health-fix@ @@ -8435,7 +8435,7 @@ mine-piece mine-piece-animation hbms-nuclear-tech-mod-extended-edition custom-skyboxes -breedable-killer-rabbit|可繁殖的杀手兔* - Forge¨breedable-killer-rabbit-fabric|可繁殖的杀手兔 (Breedable Killer Rabbit) - Fabric¨@breedable-killer-rabbit|可繁殖的杀手兔 (Breedable Killer Rabbit) +breedable-killer-rabbit@|可繁殖的杀手兔*¨breedable-killer-rabbit-fabric|可繁殖的杀手兔 (Breedable Killer Rabbit) bqenergyexpansion magic-and-wand|法术与法杖 (Magic&Wand) re-ftbqkeys@|FTB任务本地化键:重置 (Re-FTBQLocalizationKeys) @@ -8447,21 +8447,21 @@ inmis-back-pack-mod-retextured thonkutil xp-storage@ xp-storage-trinkets@ -carpet-layers@ +carpet-layers¨@carpet-layers|Carpet Layers - 已失效 itemswapper@ @caxton treasure2-wizardry-loot-pack laser-creeper-robot-dino-riders-from-space|来自外太空的激光爬行者机器恐龙骑士* paladins-furniture@|Paladin的家具 (Paladin's Furniture) -compact-status-effects|迷你状态效果配置* - Fabric¨compact-status-effects-forge|迷你状态效果配置 (Compact Status Effects) - Forge +compact-status-effects|迷你状态效果配置*¨compact-status-effects-forge|迷你状态效果配置 (Compact Status Effects) end-goblin-traders-fabric|末地哥布林商人 (End Goblin Traders) @mikulib playersync|玩家数据同步 (PlayerSync) -@create-more-potatoes|机械动力:更多土豆 (Create: More potatoes)¨create-more-potatoes|机械动力:更多土豆 (Create: More potatoes) - Forge¨create-more-potatoes-fabric|机械动力:更多土豆 (Create: More potatoes) - Fabric/Quilt +create-more-potatoes@|机械动力:更多土豆 (Create: More potatoes)¨create-more-potatoes-fabric|机械动力:更多土豆 (Create: More potatoes) primitive-beasts -raided +raided@ moisturization-fabric@moisturization treasure2-twilight-forest-loot-pack sanity-and-insanity @@ -8471,8 +8471,8 @@ difficult-raids gag bleach-awaken-by-deephantom15 -kleiders-custom-renderer-api -chefs-delight-fabric¨chefs-delight-forge +kleiders-custom-renderer-api@ +chefs-delight-fabric@chefs-delight¨chefs-delight-forge mcgltf@ add-potion-into-your-food|给您下药了 (Add Potion into Your Food) @@ -8481,15 +8481,15 @@ add-potion-into-your-food|给您下药了 (Add Potion into Your Food) thaumic-energistics-extended-life|神秘能源延续版* create-ender-transmission@|机械动力:末影传输 (Create: Ender Transmission) horror-elements-mod -create-extended-cogs|机械动力:更多齿轮 (Create: Extended Cogwheels) - Forge¨create-extended-cogwheels-fabric|机械动力:更多齿轮 (Create: Extended Cogwheels) - Fabric¨@extended-cogwheels|机械动力:更多齿轮 (Create: Extended Cogwheels) +create-extended-cogs@extended-cogwheels|机械动力:更多齿轮 (Create: Extended Cogwheels)¨create-extended-cogwheels-fabric|机械动力:更多齿轮 (Create: Extended Cogwheels) create-connected-block-textures cccbridge@ -liquid-burner +liquid-burner@ create-electric-stonks create-mounted-storages|机械动力:更多存储挂载 (Create: Mounted Storages) -minecells@ +minecells@|我的细胞 (Mine Cells - Dead Cells Mod) @heatwaves|热浪 (Heatwaves) steves-mini-pouch infinite-abyss @@ -8508,7 +8508,7 @@ quest-plaques@|任务牌匾* video-player|视频播放器* stendhal@ -dynamic-surroundings-remastered-fabric-edition¨@dynamicsurroundings_remasteredfabric +dynamic-surroundings-remastered-fabric-edition@dynamicsurroundings_remasteredfabric terraplusplus blahaj@|布罗艾 (Blåhaj) tinkers-levelling-addon@ @@ -8517,8 +8517,8 @@ terramap@ villagemarkermod-for-liteloader @show-durability disable-enderman-picking-up-blocks@|禁用末影人搬运* -beautified-chat-server¨beautified-chat-server-fabric¨@beautified-chat-server -beautified-chat-client¨beautified-chat-client-fabric¨@beautified-chat-client +beautified-chat-server@¨beautified-chat-server-fabric +beautified-chat-client@¨beautified-chat-client-fabric axes-are-weapons@ @curse%2B|诅咒+ (Curse+) @@ -8527,7 +8527,7 @@ optifine-capes immersive-aircraft@|沉浸式飞机* default-world-generator - +pasterdream|帕斯特之梦 (PasterDream) animalistic @qdresloader @@ -8543,7 +8543,7 @@ render-360 async-locator@ minemention|提及 (MineMention) -umapyoi|马儿蹦跳* +umapyoi@|马儿蹦跳*¨@umapyoi-fabric|马儿蹦跳 (Umapyoi) origins-full-moon|起源:满月 (Origins: Full Moon) codechickenlib-unofficial@ codechickencore-unofficial@|鸡块核心非官方版 (CodeChickenCore Unofficial) @@ -8572,7 +8572,7 @@ farmers-delight-jei-plugin keybind-fix@ tales-of-villagers-the-infiltrators|村民之书:渗透者 (Tales of Villagers: The Infiltrators) @morecullingextra -carpet-fixes¨@carpet-fixes +carpet-fixes@ er-core|ER 核心 (ER Core) rings-of-ascension¨fabric-rings-of-ascension @@ -8602,7 +8602,7 @@ pangea-ultima table-top-craft¨table-top-craft-fabric ddyc@ @stonecutter-damage -shipping +shipping@ structureutils @cloudmusic|云音乐 (CloudMusic) i-like-wood @@ -8613,7 +8613,7 @@ news-pillagers rangers-haven heyberryshutup destroy-on-death -yes-steve-model|是,史蒂夫模型*¨@yes-steve-model|是,史蒂夫模型 (Yes Steve Model) +yes-steve-model@|是,史蒂夫模型* macaws-roofs-oh-the-biomes-youll-go|Macaw的屋顶:你将去的生物群系附属 (Macaw's Roofs - Oh The Biomes You'll Go) macaws-roofs-biomes-o-plenty|Macaw的屋顶:超多生物群系附属 (Macaw's Roofs - Biomes O' Plenty) configured-feature-saplings@ @@ -8638,10 +8638,10 @@ rlcraft-structures-not-official moving-sunflowers lunar-mana-generator|月光魔能制造器* ost-overhaul@ -chunk-by-chunk +chunk-by-chunk@chunkbychunk beyond-planets-core|飞越群星:核心 (Planeteer - Core) -webdisplays|内置网页浏览器* -mcef-forge|Minecraft Chromium嵌入式框架 (MCEF [Forge]) +webdisplays@|内置网页浏览器 (WebDisplays) +mcef-forge@mcef|Minecraft Chromium嵌入式框架 (MCEF [Forge]) @@ -8653,9 +8653,9 @@ text-utilities@ memorysweep|内存清扫 (Memory Sweep) @explosive-enhancement|爆炸动画增强 (Explosive Enhancement) autostereogram@ -@bounced¨bounced +bounced|Bounced! - 不活跃¨@bounced identifier-translation@|标识符翻译* -vanity +vanity@vanity-core reid@ its-been-twelve-years riftlin @@ -8695,15 +8695,15 @@ patchoulibutton|帕秋莉手册按钮 (PatchouliButton) sonorama vanity-dungeons-pack divinerpg-processing-compat -weapon-master|武器大师* +weapon-master@|武器大师* your-ideas|你的想法* vanity-ancient-tool-variants motion-capture-mod-mocap|动作捕捉 (Motion Capture) wormhole-portals|虫洞 (Wormhole) -dragon-magic-and-relics|神龙魔法与遗物* +dragon-magic-and-relics@|神龙魔法与遗物* yummy-foods-forked - -@fullblock-energistics +content-creator +fullblock-energistics@ youmatter@ vanity_battle_axes markdownmanual@|Markdown 手册(Markdown Manual) @@ -8713,7 +8713,7 @@ automatic-tool-swap@ knight-quest modernfix@|现代化修复 (ModernFix) blades-plus -homeostatic|稳态* +homeostatic@|稳态* super-saturation|超级饱和度* rpg-rpgae|RPG天启进化 (RPGApocalypticEvolution) @@ -8727,7 +8727,7 @@ moon-phase-info@ advanced-tweakery creeper-hector - +tightened-village-security @mcr_blahaj|布罗艾Fabric版 (Blahaj (Fabric))¨@bttf_blahaj|布罗艾Fabric版 (Blahaj (Fabric)) - 已失效 @blahaj-reforged|布罗艾:重铸 (Blåhaj - Reforged) buddingcrystals @@ -8759,26 +8759,26 @@ otg-skylands fxs-rail-optimization@rail-optimization morejs@ - +@moresnowballls|更多雪球 (MoreSnowballs) valkyrien-skies-control the-end-expanded-mod-ice-and-fire-addon -@vault-patcher|保险库补丁 (Vault Patcher) +vault-patcher@|保险库补丁* projectile-damage-attribute@ noteable@ deftulib@ -trofers -obscure-api¨obscure-api-fabric¨@obscure-api +trofers@ +obscure-api@¨obscure-api-fabric death-punishment@|死亡惩罚* inventory-tabs-forge -reaper -containersearcher¨@csearcher +reaper@ +containersearcher@csearcher screencapper@ valkyrien-skies-world lucky-tnt-lib -waffles-placeable-foods +waffles-placeable-foods@ otg-the-void otg-flatlands otg-dungeons @@ -8786,14 +8786,14 @@ otg-dungeons gtnhlib@ sculpt@ levelhearts@ -bring-back-luck¨forge-bring-back-luck¨@bringbackluck +bring-back-luck@bringbackluck¨forge-bring-back-luck teleport-master@|传送命令* @mufog|锻造 (Mufog) betterparry|更好的格挡 (BetterParry) rltweaker2 thaumcraft-aspect-creator|神秘时代要素创建器* vanity_katanas -pixels-character-models@|Pixel的角色模型 (Pixel's Character Models) +pixels-character-models@|Pixel 的角色模型 (Pixel's Character Models) l2-complements@|莱特兰-扩充* epicfight-auto-shouldersurfing zsrarity @@ -8802,9 +8802,9 @@ zentraits l2-archery|莱特兰-弓艺* vanity-metallurgical minespaceex - +gregious-maximus shut-up-model-loader -cultural-delights-fabric|多元乐事(Fabric版) (Cultural Delights [Fabric]) +cultural-delights-fabric@|多元乐事(Fabric版) (Cultural Delights [Fabric]) collectors-reap bones-and-swords vanity-shedds-mystical-toolsets-pack @@ -8813,8 +8813,8 @@ emc-builders-wand vanity-charcutier hunger-in-peace -lexicon¨lexicon-fabric¨@lexicon -scaffolding-drops-nearby¨scaffolding-drops-nearby-fabric¨@scaffolding-drops-nearby +lexicon@¨lexicon-fabric +scaffolding-drops-nearby@¨scaffolding-drops-nearby-fabric @fuel-info glacier-ice gtnhmixins@ @@ -8822,7 +8822,7 @@ dawn-to-dusk open-tower-defence@|开放式塔防* mtr-station-decoration@station-decoration perviaminvenire -hypothermic@ + silverbirch@silver-birch @flame-sweeping|烈焰横扫 (Flame Sweeping) @@ -8838,7 +8838,7 @@ memory-settings|内存设置* tiny-item-animations@ more-plates-revamped@|更多金属板重置版* extended-slabs-plus -brewin-and-chewin-fabric|饮酒作乐(Fabric版) (Brewin' And Chewin' [Fabric]) +brewin-and-chewin-fabric@|饮酒作乐(Fabric版) (Brewin' And Chewin' [Fabric]) particular longer-login-times broglis-plants @@ -8857,7 +8857,7 @@ cruelars-triforcemod @morespawneggs|更多刷怪蛋 (MoreSpawnEggs) beautify-refabricated@|美化!Fabric版 (Beautify: Refabricated) -manatweaks¨mana +manatweaks chicken-nugget goldfish-myth rezombies @@ -8868,13 +8868,13 @@ eyes-mod colorful-rods|缤纷彩烛* xp-plus - +jaffas no-holds-barred-halloween-mod @post-join-leave-message|发送加入信息与离开信息到网址 (Post Server Join & Leave Messages to URL) advanced-extended-creative-mode@act - +even-more-creatures-mod eerie-entities better-weather-revived @@ -8908,17 +8908,17 @@ clear-skies-forge-port spell-power@ morecrashinfo|更多崩溃报告信息 (MoreCrashInfo) -epicfight-saopack|史诗战斗:ACG附属包 (EpicFight ACG AddonPack) +epicfight-saopack@epicacg|史诗战斗:ACG附属包 (EpicFight ACG AddonPack) screenshot-viewer|截图查看器* gml @futurepack-additions|飞向未来附加 (Futurepack Additions) bee-fix|蜜蜂修复* spawner-fix|刷怪笼漏洞修复 (Spawner Bug Fix) block-limit-fix -nochatlag|聊天无卡顿 (NoChatLag) +nochatlag@|聊天无卡顿 (NoChatLag) spell-engine@|法术引擎* -spellblade-next -@netherite-road-2|下界之路2 (Netherite Road 2) +spellblade-next@spellblades-and-such +netherite-road-2@|下界之路2* @tileentity-reset-fix notenoughrecipebook@nerb urushi-mod|漆 (Urushi) @@ -8931,10 +8931,10 @@ floating-islands scorched-guns fred-qol@fred -mekanism-unofficial-edition-v10-edition|通用机械v10非官方版 (Mekanism Unofficial Edition: V10 Edition) +mekanism-ce-unofficial|通用机械社区版:非官方 (Mekanism CE Unofficial) guntopia-legend-of-the-guns -@carpet-ams-addition +carpet-ams-addition@ pixelmon-gameshark hidden-creepers-creepers-pretend-to-be-other-mobs ob-core @@ -8962,7 +8962,7 @@ loot-journal structure-floater-fabric applecore-unofficial@|苹果核非官方版* -drilling-veins +drilling-veins@ server-chat-history@|服务端聊天历史* scriptor-magicae|字符魔法师* json-entity-models-jems@|JSON实体模型 (JSON Entity Models) @@ -8976,14 +8976,14 @@ worldblender¨world-blender-fabric no-oceans|无海洋的世界* monoblocks tinkers-things-json@tinkers-things|匠魂杂物 (Tinkers' Things) -free-cam¨@freecam +free-cam¨@freecam|Freecam - 无作弊版 workings@ @mod-loading-screen lucky-cases atmosfera feruchemy-allomancy|藏金术 (Feruchemy) -alive-combat@|战斗生机* - +alive-combat|战斗生机* - 已不再使用¨@alive-combat|战斗生机 (Alive Combat) +dialog|对话框* @@ -9028,12 +9028,12 @@ chowder-express mod-browser|模组浏览器* fastback@ copper-hopper@|铜漏斗* -oxidized¨@oxidized +oxidized@ ping-wheel@ dark-waters@ sneak-tweak@ -serene-seasons-fix|静谧四季修复*¨@sereneseasonsfix|静谧四季修复 (Serene Seasons Fix) +serene-seasons-fix|静谧四季修复*¨@sereneseasonsfix|静谧四季修复 (Serene Seasons Fix) - 已失效 cross-dim-commands|跨维度指令 (Cross-Dim Commands) temporary-spawners slyde@ @@ -9053,18 +9053,18 @@ better-planting superfancyclouds-refabricated@|超级华丽云:重筑版 (SuperFancyClouds: Rearchitected) pet-tracker -@splashfox +@splashfox|狐狸加载界面 (SplashFox) @tap-tab mekanism-ce-tools|通用机械工具:社区版 (Mekanism Community Edition: TOOLS) mekanism-ce-generators|通用机械发电机:社区版 (Mekanism Community Edition: GENERATORS) @nbt-data-exporter|NBT数据导出 (NBT Data Exporter) -more-mobgriefing-options +more-mobgriefing-options@ cobalt-mod-think-blue@cobalt-mod graphutil@ comfy-sky@|舒适空岛* -entropy +entropy@ ngv-forge¨ngv-fabric world-of-wonder @@ -9077,8 +9077,8 @@ hightiercrops commandspy slimyfloor daily-dad@|每日冷笑话*¨daily-dad-server@|每日冷笑话 (Daily Dad) - Daily Dad - Server -good-ending -xl-packets|XL数据包 (XL Packets) - Forge¨xl-packets-fabric|XL数据包 (XL Packets) - Fabric +good-ending@ + creeper-nuggets coherent-villages @@ -9087,7 +9087,7 @@ terrains @bugtorch better-tridents@|更好的三叉戟* undead-unleashed -missing-wilds|遗落荒野* - Fabric&Quilt¨missing-wilds-forge|遗落荒野 (Missing Wilds) - Forge¨@missing-wilds|遗落荒野 (Missing Wilds) +missing-wilds@|遗落荒野*¨missing-wilds-forge|遗落荒野 (Missing Wilds) stellar-fluid-conduits|恒星流体导管* advancement-locator @@ -9097,10 +9097,10 @@ universal-tweaks@|通用修改* welcome-to-the-jungle|丛林传说 (Welcome to the Jungle) -transparent +transparent@ hopperplus-instant-hoppers sbm-merpig - +lwjgl3ify creates-delight@|机械动力乐事 (Create's Delight) @@ -9144,7 +9144,7 @@ convenient-decor@|精简锦饰* mixin-conflict-helper@ create-decoration-casing create-brass-coated|机械动力:黄铜覆壳 (Create: Brass Coated) -sculked +sculked|Sculked - 已失效¨@sculked better-mob-spawner|更好的刷怪笼* planeteer-dimensions|飞越群星:维度 (Planeteer - Dimensions) planeteer-machines|飞越群星:机器 (Planeteer - Machines) @@ -9177,9 +9177,9 @@ tfcm|群峦合金非官方版 (TFC Metallum U) tnt-time-mod drunken-mug cartoonish-horde-library -limited-lives|有限生命* - Forge¨limited-lives-fabric|有限生命 (Limited Lives) - Fabric +limited-lives|有限生命*¨limited-lives-fabric|有限生命 (Limited Lives) universe-box@ -invtweaks-emu-for-ipn¨@invtweaks-emu-for-ipn +invtweaks-emu-for-ipn@ create-compact-exp|机械动力:压缩经验* @@ -9189,7 +9189,7 @@ heat-and-processing skytheorylib ad-astra-giselle-addon shift-scroll-fix -gim|原神农业 +gim|原神农业 (Genshin Impact Cropper) oxygen-daily-rewards structure-compass|结构指南针* cold-snap-horde @@ -9204,20 +9204,20 @@ snowballing winter-essentials embeddium-extras|镁/铷附属:土豆版 (Magnesium/Rubidium Extra: Potato Editon*) @realistic-cruelty|真实残忍 (Realistic Cruelty) - +trapper-pelts@ workshops-of-doom@ -create-mechanical-spawner|机械动力:动力刷怪笼* +create-mechanical-spawner@|机械动力:动力刷怪笼* amethyst-core@ fzzy-core@ tnt-breaks-bedrock from-the-north -spruce-willis-the-xmas-tree +spruce-willis-the-xmas-tree@ sweet-potato-core-spc|地瓜核心 (Sweet Potato Core) merge-enchantments turkey|火鸡* nightmare-craft-legendary-gear|梦魇工艺:传奇装备 (Nightmare Craft: Legendary Gear) -snowy-weaponry +snowy-weaponry@ dungeon-mobs-reborn quickteleports powerfuljs @@ -9236,8 +9236,8 @@ nightmare-craft-decorations|梦魇工艺:装饰品 (Nightmare Craft: Decoratio functional_tfc better-end-potato-edition|更好的末地:土豆版* -bossbar-stack -@origins-umbrellas|起源:雨伞 (Origins: Umbrellas) +bossbar-stack@ +origins-umbrellas@|起源:雨伞 (Origins: Umbrellas) tfc_decoration shroom-dealers@shroom-dealers! nbtedit @@ -9246,25 +9246,25 @@ burlap-sack|粗麻布袋* animalnet biome-backlog -doespotatotick@does-potato-tick|远物停载:土豆版 (Does Potato Tick?) +doespotatotick|远物停载:土豆版 (Does Potato Tick?)¨@does-potato-tick|远物停载:土豆版 (Does Potato Tick?) - 已失效 -welcome-to-meadow@lets-do-cheese|青青草甸 (Let's do Cheese! / Meadow) -universal-enchants-forge@universal-enchants|通用附魔 (Universal Enchants)¨universal-enchants-fabric|通用附魔 (Universal Enchants) - Fabric < 1.19(Outdated) +welcome-to-meadow@lets-do-meadow|青青草甸 (Let's do Cheese! / Meadow)¨@lets-do-cheese|青青草甸 (Let's do Cheese! / Meadow) - 已失效 +universal-enchants-forge@universal-enchants|通用附魔 (Universal Enchants)¨universal-enchants-fabric|通用附魔 (Universal Enchants) aa-farmer-compat better-crates nightmare-craft-auto-factory -@vanillaicecreamfix -actually-unbreaking-fabric@actually-unbreaking +vanillaicecreamfix@ +actually-unbreaking-forge@actually-unbreaking¨actually-unbreaking-fabric handcrafted@|精巧手艺* - +no-nether-teleport@ crasher|崩溃机* easywhitelist@ -clayworks -miniscaled +clayworks@ +miniscaled@ lost-cities-potato-edition|失落的城市:土豆版 (Lost Cities: Potato Edition) endless-noend matmos-2 @@ -9278,9 +9278,9 @@ attack-on-christmas voxel-latest the-printer@ -flying-cullers +flying-cullers@ timeless-power - +create-deco-fabric-fixed calibrated frozen-memories atlantis-api@ @@ -9290,7 +9290,7 @@ nightmare-craft-mobs spectrum-jetpacks@ difficult-caves - +spartanlands-rereforged red-pandas@ simple-cobblestone-generator-forge @@ -9307,7 +9307,7 @@ nightmare-craft-guns-explosives easy-experience -full-turtle-armor¨@full-turtle-armor +full-turtle-armor@ tokusatsu-hero-completion-plan|特摄英雄补完计划* @@ -9322,15 +9322,15 @@ azurelib@ harder-monster-boats-finer-boat-control spyglass-improvements@|望远镜改进* vanilla-zoom@ - +time-in-a-bottled improved-end@ raw-block-smelting nocubes-better-blast-furnace -@bugjump +bugjump@ cluttered@ digitality - +nautral-decor-mod cobbled-deepslate-generator female-villagers|女性村民* @@ -9341,24 +9341,24 @@ leos-sans no-irom-farm amethyst-tools-mod @grate-blocks - +lush-forests retraining -ender-ore¨@enderore +ender-ore@enderore ars-instrumentum -easier-sleeping +easier-sleeping@ harder-farther custom-signposts galactic-research@ mining-dimensions-fabric bejs - +screenjs pioneer @sha1runtime night-vision-enchantment-forge galactic-computers@ mini-cites -ad-tetra +ad-tetra@ad-tetra! chest-cavity-forge-port|胸腔Forge版 (Chest Cavity - Forge Port) entity-lagfix-lag-fix audioplayer@ @@ -9369,7 +9369,7 @@ mcxr-play@ beneath-the-wetlands@ add-on-the-abyss-beginning -reusable-rockets +reusable-rockets@ item-info florist omni @@ -9377,11 +9377,11 @@ frostrealm nameless-trinkets unsafe-spawns -bubbles -@nan-health-fixer|假死修复:土豆版 (Potato NaN Health Fix) +bubbles@pop +nan-health-fixer@|假死修复:土豆版 (Potato NaN Health Fix) @voxelmap-updated blood-and-stuff@ -yungs-better-nether-fortresses|YUNG的下界要塞优化 (YUNG's Better Nether Fortresses) - Forge¨yungs-better-nether-fortresses-fabric|YUNG的下界要塞优化 (YUNG's Better Nether Fortresses) - Fabric¨@yungs-better-nether-fortresses|YUNG的下界要塞优化 (YUNG's Better Nether Fortresses) +yungs-better-nether-fortresses@|YUNG的下界要塞优化 (YUNG's Better Nether Fortresses)¨yungs-better-nether-fortresses-fabric|YUNG的下界要塞优化 (YUNG's Better Nether Fortresses) squidless enders-delight|末影乐事 (Ender's Delight) @@ -9397,9 +9397,9 @@ valkyrien-computers@ gems-jewels @angling -sync-potato-effect|药水效果同步:土豆版* +dimensional-sync-fixes@|维度同步修复* exhaustion-fatigue@ -chainmail-bucket +chainmail-bucket@ preciseblockplacing accurate-block-placement-reforged carpet-tctc-addition@ @@ -9410,14 +9410,14 @@ shield-expansion@ barbarians|野蛮人* minecraft-startup-sound-aka-mojaaaaaang realistic-terrain-generation-unofficial|真实地形生成非官方版* -combat-enchantments¨@combatenchantments +combat-enchantments@combatenchantments fastentitytransfer@ chalice one-twenty-update -minecraft-middle-ages +minecraft-middle-ages@days-in-the-middle-ages gibmemojangstudio -redwolf-music-expansion +redwolf-music-expansion@ @nameprotect gliders@ @no-teleport-cooldown @@ -9437,16 +9437,16 @@ ice-prevents-crop-growth@ glowing-ores|矿石发光* falsetweaks@ -metaworlds-unofficial|元世界:非官方版* -tslateffectslib -tslatentitystatus-tes +metaworlds-unofficial@metaworldsunofficial|元世界:非官方版* +tslateffectslib@ +tslatentitystatus-tes@tslatentitystatus @invisible-frames-mod elytra-capes - +config-swapper viafabricplus@ menu-companions entity-render-distance-extender -rpg-stamina +rpg-stamina|RPG 耐力 (RPG Stamina) mjs-animations deepslate-generator hairy-zombies @@ -9479,11 +9479,11 @@ peat-zombie ragna-goblin-updated|Ragna Goblin - 新¨ragna-goblin|Ragna Goblin - 旧(不再更新) demogorgon@ haunted-fields -@health-command +health-command@ splash-logo-color-fix frv-tools bombs-bandits -immersive-cavegen +immersive-cavegen@icg villager-brute exspiravit-magicae equiped @@ -9499,7 +9499,7 @@ nakaroths-herdcraft-l|群兽行为L* mystical-oak-tree ancient-trees-l butchercraft|屠宰工艺* -zombie-invasion +zombie-invasion@ clay-soldiers-reborn geore mt-claysoldiers2-forge @@ -9519,7 +9519,7 @@ chemcraft-core bonsai-man-mod|盆栽人* -pet-cemetery +pet-cemetery@ chemcraft-geocraft steamagerevolution|蒸汽时代革命 (SteamAgeRevolution) @@ -9533,7 +9533,7 @@ alkimicraft-part-i-project-oasis modest-mining vanilla-compats -vending-block-1-5|自动售货机 (Vending block) +vending-block|自动售货机 (Vending block)¨vending-block-1-5|自动售货机 (Vending block) vending-block-revived|自动售货机:重生* assortment @@ -9566,7 +9566,7 @@ nei-emmaitar magicrafted-rings-of-power skybox-loader-forge -easy-feed|简单饲养 (Easy feeding)¨@mcf-easyfeed|简单饲养 (Easy feeding) +easy-feed@mcf-easyfeed|简单饲养 (Easy feeding) create-buffers-beams small-boats-mod reimplemented @@ -9576,7 +9576,7 @@ crimsonsteves-more-mobs the-ulterlands mt-lotr asjcore -bane-tooltips-mod +bane-tooltips-mod|克星信息显示* lava-crystal literal-sky-block @literal-sky-block-fabric @@ -9629,7 +9629,7 @@ trimmable-tools all-the-fan-made-discs@ from-the-fog more-ladders@ -@reblured +reblured@ spellbound-weapons sword-parry @@ -9637,14 +9637,14 @@ sword-parry @minegpt respiteful@|闲暇风味* useful-slime¨useful-slime-fabric - +kelvins-better-player-animations tfc-casting-with-channels tfc-create max-health-fixer gjeb -bundled-delight +bundled-delight@ @travellerstoasts @@ -9654,32 +9654,32 @@ salt monobank sooty-chimneys areas-undefined - +trivialthoughts|魔金琐想 (TrivialThoughts) tfc-delight myssyheads-sculk-adventures waystone-towers@ -smitheesfoundry@¨guide +smitheesfoundry@ beach-slimes rideable-ravagers@|可骑乘的劫掠兽* splatcraft@splatcraft-forge|斯普拉遁* - +beneath-the-snow sea-creeps skills-v|技能:香草 (Skills: Vanilla) flower-foxes pack-it-up@ -mine-trading-cards-open-source-edition +mine-trading-cards-open-source-edition@mine-trading-cards chainsaw-man-csm superior-shields@ alternative-world-save-location@ skills-firearms|技能:枪械 (Skills: Firearms) - +tx-loader@ Reacharound@reacharound -variety-aquatic¨@variety-aquatic -blocks-booster¨@blocks-booster +variety-aquatic¨@variety-aquatic|Variety Aquatic - 已失效 +blocks-booster@ -tfc-cast-iron-grill|群峦铸铁烤架 (TFC Cast Iron Grill) +tfc-cast-iron-grill@|群峦铸铁烤架 (TFC Cast Iron Grill) tfc_metalwork|群峦金属加工 (TFC Metalwork) @@ -9690,7 +9690,7 @@ roof-compatibility-for-tfc-macaw|Macaw的屋顶:群峦传说附属 (Roof Compa tfc-supplementaries|群峦锦致装饰 (TFC Supplementaries) tfc-ie-crossover|群峦传说:沉浸工程兼容附属 (TFC + IE Crossover) bridging-mod@ -geode-plus|晶洞+ (Geode+)¨geodeplus-backport|晶洞+ (Geode+) - 官方 Backport(1.18.2) +geode-plus@|晶洞+ (Geode+)¨geodeplus-backport|晶洞+ (Geode+) cursed-difficulty@ @@ -9710,7 +9710,7 @@ subject-three-sweet-dreams@|科目三:甜蜜的梦 (Subject Three: Sweet Dream ocd-shaders-mod create-shrunk cherish -the-lost-castle|失落城堡* - Forge¨the-lost-castle-fabric|失落城堡 (The Lost Castle) - Fabric¨@the-lost-castle|失落城堡 (The Lost Castle) +the-lost-castle@|失落城堡*¨the-lost-castle-fabric|失落城堡 (The Lost Castle) llamarama|羊驼!* simple-conveyors itemupgrader-core @@ -9784,7 +9784,7 @@ mobcages you-win-button tea-anyone envirorot -the-seasons-mod +the-seasons-mod|四季模组* the-realistic-leaves-mod untitled-swans-forge @@ -9801,13 +9801,13 @@ create-encased@ @treeplacer death-knell moreiotas@ -numismatic-overhaul¨numismatic-overhaul-reforged¨@numismatic-overhaul +numismatic-overhaul@¨numismatic-overhaul-reforged @hexbound|咒法组构学 (Hexbound) vanity-druid-pack vanity-farcrs-colossal-weapons debris-chunk-raw-netherite-scrap@raw-netherite-scrap|残骸碎块 (Debris Chunk) malum-vestis -culllessleaves-reforged|更好的树叶渲染优化重铸版 (CullLessLeaves Reforged) +culllessleaves-reforged@cull-less-leaves-reforged|更好的树叶渲染优化重铸版 (CullLessLeaves Reforged) biome-music|生物群系音乐* agers-earthquake-generator vanity-black-gold @@ -9827,8 +9827,8 @@ vanity-steel-pack vanity-viking horse-expert@ snow-under-trees-remastered@ -oceans-delight@ -transcending-trident¨transcending-trident-fabric¨@transcending-trident +oceans-delight@|海洋乐事 (Ocean's Delight) +transcending-trident@¨transcending-trident-fabric snow-under-trees-fabric precision-enchanter @immersivethunder @@ -9849,24 +9849,24 @@ enchancement useful-spyglass@ -@moresnowballls|更多雪球 (MoreSnowballs) + befriendmobs-days-with-monster-girls|友好化生物:与怪物娘的日常 (BefriendMobs: Days with Monster Girls) launchgui villager-armor-layer@|村民盔甲显示* wasabi@ magnet-craft|磁铁工艺* -item-obliterator +item-obliterator@ you-shall-not-spawn@ hell-on-earth zombie-friends@ -trade-cycling -illager-revolution +trade-cycling@ +illager-revolution@ extra-trades blood-particles-mod @two-weeks-hud fazcraft-mod -mod-menu-no-more@ +mod-menu-no-more|Mod Menu No More - 已失效¨@mod-menu-no-more @slime-craft way2wayfabric@ cloche-profit-peripheral @@ -9886,18 +9886,18 @@ big-sip@ floating @blast-travel skygrid@ -disable-new-world-creation-screen-forge¨disable-new-world-creation-screen-fabric¨@disable-new-create-world-menu-forge|Disable New Create World Menu - Forge 已失效¨@disable-new-create-world-menu-fabric|Disable New Create World Menu - Fabric 已失效 +disable-new-world-creation-screen-forge@disable-new-create-world-menu-forge¨disable-new-world-creation-screen-fabric@disable-new-create-world-menu-fabric packagedmekemicals|封包通用机械 (PackagedMekemicals) packagedastral|封包星辉魔法 (PackagedAstral) mekanism-moresolarpanels@|通用机械-更多太阳能板 (Mekanism-MoreSolarPanels) paperandquill sneaky-curses-forge¨sneaky-curses-fabric -magnum-torch-forge@magnum-torch¨magnum-torch-fabric -universal-bone-meal-forge|通用骨粉 (Universal Bone Meal) - 无Fabric 1.18.2版¨universal-bone-meal-fabric|通用骨粉 (Universal Bone Meal) - Fabric 1.18.2¨@universal-bone-meal|通用骨粉 (Universal Bone Meal) +magnum-torch-forge@magnum-torch|卓越火炬 (Magnum Torch)¨magnum-torch-fabric|卓越火炬 (Magnum Torch) +universal-bone-meal-forge@universal-bone-meal|通用骨粉 (Universal Bone Meal)¨universal-bone-meal-fabric|通用骨粉 (Universal Bone Meal) @bottle-of-gender - +leave-my-bars-alone@ all-enchantments-for-trade i-need-block spiky-spikes@ @@ -9954,8 +9954,8 @@ apocalyptic-fortress@ unbreakabler -trails-and-tales-1-20¨trails-and-tales-fabric -tinkers-bounce-pad@|匠魂弹跳板* - Forge¨tinkers-bounce-pad-fabric@|匠魂弹跳板 (Tinkers Bounce Pad) - Fabric +trails-and-tales-fabric¨trails-and-tales-1-20¨various-update-1-20-backport +tinkers-bounce-pad@|匠魂弹跳板*¨tinkers-bounce-pad-fabric@|匠魂弹跳板 (Tinkers Bounce Pad) enderio-unofficial|末影接口非官方版 (EnderIO Unofficial) dimensional-gravity @@ -9978,11 +9978,11 @@ targetato tskimi-seirans-fruit-wine@tskimiseirans-fruit-wine|月见清兰的果酒 (Tskimi Seiran's Fruit Wine) -graduated-cylinders|刻度量筒* +graduated-cylinders@|刻度量筒* fps-monitor -stitch@athena-ctm - +athena@athena-ctm +calm-mornings fog-looks-good-now@ guarding@ cats-expanded@ @@ -9991,7 +9991,7 @@ experience-obelisk here-be-no-dragons gnumus-settlement fading-night-vision -mru +mru@ mute simple-knives iron-fishing-rods @@ -10018,7 +10018,7 @@ fog-looks-good-now-fabric@ thirst-was-taken@|口渴* unlimited-fluidity -@e4mc +e4mc@ late-game-golems iter-rpg @@ -10036,11 +10036,11 @@ candlelight-lets-do-a-candlelight-dinner@lets-do-candlelight|烛火晚宴 ([Let' let-me-play-iris dimensional-depths create-molten-vents@ -everything-as-a-hat¨@everything-as-a-hat +everything-as-a-hat¨@everything-as-a-hat|Everything as a Hat - 已失效 world-border-expander htmltech -extra-tan +extra-tan@ diamond-economy@|钻石经济* texels-paintings tinkers-expansion @@ -10088,7 +10088,7 @@ chatmove public-transport-mod mineral-chance@ random-bone-meal-flowers@ -now-playing-forge¨now-playing¨@now-playing +now-playing-forge@now-playing¨now-playing end-portal-recipe@|末地传送门配方* crying-portals@ dragon-drops-elytra@|末影龙掉落鞘翅* @@ -10106,9 +10106,9 @@ flowermap@|花卉地图 (Flower Map) hopo-better-mineshaft reforgium@ -@spoorn-weapon-attributes - +spoorn-weapon-attributes@ +fabrc-legacy-fixes @@ -10117,19 +10117,19 @@ moa-decor-bath stealing-the-villagers-forge@¨stealing-the-villagers-fabric@ spoorn-armorattributes@spoorn-armor-attributes connectedness@ -epic-samurais@|史诗武士 (Epic Samurai's) - Forge¨epic-samurais-fabric@epic-samruais-fabric|史诗武士 (Epic Samurai's) - Fabric +epic-samurais@|史诗武士 (Epic Samurai's)¨epic-samurais-fabric@epic-samruais-fabric|史诗武士 (Epic Samurai's) sandwiches-n-more enchantments-plus-fabric@enchantments-plus purpeille@ carpet-sky-additions@ -spice-of-life-carrot-edition-unofficial +spice-of-life-carrot-edition-unofficial|生活调味料:胡萝卜非官方版 (SOL - Carrot Unofficial) ender-dragon-egg-respawn-fabric personal-space|私人维度* held-item-tooltips@|手持物品信息显示* minecraft-shark-mod forgotten-delight -tx-loader@ +enhancedlootbags recipe-reshaper@ hellish-blahaj@|布罗艾 Hellish 版 (Hellish Blåhaj) amber-jade|琥珀 (Amber) @@ -10147,10 +10147,10 @@ the-forgotten-dimensions@ @the-sink|水槽 (The Sink) @stairjumper -watchdog-anti-cheat¨@watchdog-anticheat -@villagers-drop-emeralds-on-death - - +watchdog-anti-cheat@watchdog-anticheat +villagers-drop-emeralds-on-death@ +neydis-dragons +colourful-goats perfect-spawn infinity-pickaxe @@ -10162,7 +10162,7 @@ wearthat@ portable-crafting-table@|便携工作台* structory-towers everything-is-a-hat -skeletal-remains +skeletal-remains@ tidbits terrible-chest-potato-edition|可怖箱子:土豆版* @dryinglava @@ -10172,8 +10172,8 @@ blue-archive-halos @mana-visualizer mhcraft -irons-spells-n-spellbooks - +irons-spells-n-spellbooks@ +infernal-enchantments reimagined-world-menu@ origins-assassin peculia@ @@ -10200,10 +10200,10 @@ realms-button-remover@ manyideas-doors@ end-origins extra-classes-origins - +wire-decoration|电线装饰* optimizationsandtweaks@ - -tabfaces¨@tabfaces +the-flesh-that-hates@tfth +tabfaces¨@tabfaces|TabFaces - 已失效 mob-armor-mod-v2 umbral-skies recipes-library@ @@ -10213,7 +10213,7 @@ origins-gravity-enforcer snuffles-fabric@|魄罗Fabric版 (Snuffles (Fabric)) manyideas-halloween@ selectable-painting@ -boat-break-fix +boat-break-fix@ advanced-movement totem-overhaul mobs-no-render@ @@ -10226,17 +10226,17 @@ cc-rt manyideas-core@ multi-builder-tool@|多方块构建工具* ender-storage-1-12-continuation@ender-storage-continuation|末影存储:延续版 (Ender Storage continuation) -screenshots - +snail-mail +ancient-rituals colorful-anvils@colorfulanvils ecofriendly torchkey@ torch-key-forge@ - - +just-rose-gold +revolt-of-the-mobs improved-vanilla@ - +upgraded-netherite-aetherite betterwithpatches@ pickable-orbs @@ -10247,35 +10247,35 @@ mobneutralizer cloud-rider @assemblymod treasure2-bones - +ender-pearl-swap jer-ore-integration - +adorkable-dogs-pocky|DK狗的Pocky (Adorkable dog's Pocky) realistic-explosion-physics - - +nitwitification +items-to-mobs homespun@ primitive-start@ -@throwing-dynamite +throwing-dynamites@throwing-dynamite paladins-and-priests@ cataclysm-heaven-burner@|灾变:焚天神兵 (Cataclysm: Heaven Burner) -@echo-chest|回响箱子 (Echo Chest) +echo-chest@|回响箱子* - -@plenty-plates - -@paper-doll -@ender-zoology +new-nether-chest@|下界箱子 (Nether Chested) +plenty-plates@ +simple-sponge +new-paper-doll@paper-doll +ender-zoology@ vectorientation@ seven-days-to-fix-parasitus dtm-integrations @hdskins -bushier-flowers¨@bushier-flowers +bushier-flowers@ ender-space cataclysm-boss-bar@|灾变Boss血条显示* unusual-gifts - +building-blocks-overhaul-forge tick-info primal-stage@primalstage @@ -10285,71 +10285,71 @@ kubejs-ars-nouveau@ cataclysmweaponery twilight-paintings twilight-origins -@cpmoscc|自定义玩家模型OSC兼容 (Customizable Player Models OSC Compat) +cpmoscc@|自定义玩家模型OSC兼容 (Customizable Player Models OSC Compat) twilight-forest-portal-catalyst|暮色森林传送门催化石* - +better-fog tool-upgrades@|工具升级* visiblebarriers@ aether-gravitation@|天境之引* @sublanguage|首选语言 (Sublanguage) - +befriendmobs-api|友好化生物框架 (BefriendMobs Framework) better-potion-visuals@ modern-warfare-cubed@|现代战争方块化* - +extraordinary-extra-totems @squidfriends beachparty@lets-do-beachparty|沙滩派对 (Let's Do Beachparty) +s33r-more-food +froglight-backport - - -@exquisito|末域奇馔 (Exquisito) +exquisito@|末域奇馔* species@ - +cles-battleitems|战斗物品 (Cle's BattleItems) unu-parts-pack -@spleaves -@modern-world-creation¨modernworldcreation -@enchant-the-rainbow +spleaves@ +modernworldcreation@modern-world-creation +enchant-the-rainbow@ @muffins-songkran fixed-anvil-repair-cost@ sleep-tight@ -@random-crafting|随机合成表 (Random Crafting) +random-crafting@|随机合成表* fallout-inspired-power-amor infinitefluids|无限流体 (InfiniteFluids) upd8r@|整合包更新检查工具* - +old-guns-mod @vlzoomer vanilla-teleporters aquatic-frontiers@ - +lands-of-icaria wta@ @gtnh-no-nerf pickable-villagers@ pickable-piglins -@mc-book-of-blocks - - +book-of-blocks-fabric@mc-book-of-blocks +create-blue-skies-compat +dawncraft-mobs dawncraft-tweaks - +netherracked the-toolkits@ +immersive-structures-ii-nether-edition - - +mossier-deepslate celestial@ quest-giver @hextweaks|咒法调整 (HexTweaks) - +insects-recrafted@ better-boilers aether-plus crafttweaker-sixik-utils-aoa3-nevermine aether-expansion barrels-2012 @libzoomer - - +tfc-sample-drill +tfc-rosia aether-additions custom-portal-api-forge@customportalapi jaopca-extras @@ -10357,8 +10357,8 @@ jaopca-extras enclosure@ -isleofberk|博克岛 (Isle of Berk)¨@isle-of-berk|博克岛 (Isle of Berk) -patpatpat¨patpatpat-fabric¨@patpatpat +isleofberk|博克岛 (Isle of Berk) - 已失效¨@isle-of-berk|博克岛 (Isle of Berk) +patpatpat@¨patpatpat-fabric wildberries @@ -10370,7 +10370,7 @@ sublime spells-shields-x-tinkers-construct mowzies-mobs-the-broken-blade|断刃 (Mowzie's Mobs: The Broken Blade) - +water-source-ex|水源EX (Water Source EX) tinkers-calibration-tic3|匠魂校准 (Tinkers' Calibration) yamatomoveset-epicfight-addon engineers-delight@ @@ -10381,14 +10381,14 @@ mob-despawn-timers tfc-towerheat tfc-toohotaroundhere flower-patch -quickcure¨quickcure-fabric|Quick Cure - Fabric: 已停更 +quickcure¨quickcure-fabric spoiled@ @entity-specific-damage-invulnerability - +hungryanimals opolis-utilities better-breeding -frostiful@ -@camo-creepers +frostiful@|霜冻* +camo-creepers@ @coupons simple-bracers baby-delight @@ -10406,8 +10406,8 @@ custom-machinery-create armor-trims@ revised-phantoms@ choruslib@ - - +frogs-can-eat-any-hostile-mob +artificial-thunder rp-renames@ openblocks-trophies @shrug-it-off @@ -10421,12 +10421,12 @@ ornamental xaero-zoom-out@xaero-zoomout minecard -@ydms-custom-camera-view +ydms-custom-camera-view@ gravitational-modulating-additional-unit -@edgerunner-feature-fix|边缘行者 (Edgerunner) +edgerunner@edgerunner-feature-fix|边缘行者* nbt-autocomplete@ smells-fishy@entity-rain -@2primogem-craft|原石工艺 (Primogems Craft)¨primogem-craft|原石工艺 (Primogems Craft) +primogem-craft@2primogem-craft|原石工艺 (Primogems Craft) benched@ kubejs-tfc@ precision-prospecting@ @@ -10441,8 +10441,8 @@ fabric-seasons-croptopia-compat@ fabric-seasons-byg-compat@ sassot@ easyhopper@easy-hopper|轻松漏斗 (Easy Hopper) -@progressive-archery -@nonconflictkeys|全键无冲 (NonConflictKeys) +progressive-archery@ +nonconflictkeys@|全键无冲 (NonConflictKeys)¨nonconflictkeys-fabric|全键无冲 (NonConflictKeys) armor-restitched@ @pillager-queen @@ -10453,16 +10453,16 @@ easydropper|轻松投掷 (Easy Dropper) varied-adventure kubejs-delight block-physics-overhaul -searchlight-forge|探照灯 (Searchlight(& Wall Lights)) - Forge¨searchlight|探照灯 (Searchlight(& Wall Lights)) - Fabric +searchlight-forge|探照灯 (Searchlight(& Wall Lights))¨searchlight|探照灯 (Searchlight(& Wall Lights)) ancient-manuscripts@ gazebos@ scoreboard-get-time|记分板获取时间 (scoreboard get time) modern-keywizard|现代化按键精灵 (Modern KeyWizard) chunk-sending-forge-fabric +limitless-structure-blocks - - +advanced-spawn-control overworld-mirror no-sonic-boom-togglable@toggleable-sonic-boom quicksort@ @@ -10472,13 +10472,13 @@ continuumation ai-art-deco-1|AI装饰一号 (AI Art Deco 1) @occlusion-culling-fix-sodium easy-dungeons|简易地牢* -the-morbid-harvester-reborn-reborn|变态的凋灵收割者 (The Morbid Reborn Reborn) + ars-armiger bettergolem @end-poem-extension|终末之诗扩展补丁 (End Poem Extension) trampledisabler-fabric - -advanced-tfc-tech-unofficial|进阶群峦科技非官方版 (Advanced TFC Tech Unofficial) +spotting|索敌* +advanced-tfc-tech-unofficial@|进阶群峦科技非官方版 (Advanced TFC Tech Unofficial) impostore effishiency@ @@ -10508,10 +10508,10 @@ itemchat-fabric@itemchat crafttweaker-sixik-utils-ftb-quest wares@ - +difficult-spawners recoil-shotgun@ - -observed¨@observed +stratum +observed@ ex-sartagine-requiem@ giant-pacman-1-16-5 item-banning-fabric @@ -10524,7 +10524,7 @@ stat-check hit-indication@ multipart-machines-farming - +lotweakr tru-first-person-mod reduced-music-delay agers-giant-junkyard-dimension @@ -10537,18 +10537,18 @@ end-expansion-the-lamented-islands @compromise|折衷 (Compromise) - +brute-force-rendering-culling@|野蛮渲染剔除 (Brute force Rendering Culling) no-additional-repair-cost cave-dust@|洞穴尘埃* - - - +nocubes-better-grindstone +create-weaponry +nocubes-chinchillas create-applied-kinetics@|机械动力:应用机械 (Create: Applied Kinetics) nocubes-zombie-mobs create-gourmet medical yellowbrosss-extras -@simply-caterpillar +simply-caterpillar@ cataclysm-delight old-combat-mod@ pipe-connector@ @@ -10581,14 +10581,14 @@ satchels|挎包* matex weapons-of-the-apocalypse tis-advanced@ - +love-me-love-my-wolf|爱屋及呜 (Love me love my wolf) toroquest-revamped tis-create tektopia-trader @worldtime beasts -alphabet-speedrun|自定义速通挑战 (αβspeedrun)¨@alphabet-speedrun|自定义速通挑战 (αβspeedrun) +alphabet-speedrun@|自定义速通挑战 (αβspeedrun) @symlink-check|符号链接拦截 (Symlink Check) tis-stringify @@ -10609,13 +10609,13 @@ resourcify@ ioclias@ twilights-flavors-delight@twilight-delight|暮色风味乐事 (Twilight Flavors & Delight) @clean-f3 - +enchanted-lib architect-tools-converter-1-7-10|建筑师工具 - 转换器 (Architect Tools - Converter) @librarian-trade-finder server-resourcepack-checker@server-resource-pack-checker main-menu-credits@ -@photon-editor|光子 (Photon) +photon@photon-editor|光子* voice-chat-interaction@ replay-voice-chat@ ships-mod-unofficial|船:非官方版 (Cuchaz Ships Unofficial) @@ -10638,7 +10638,7 @@ su-addon-quests harder-hardcore argentinasdelight@argentinas-delight|阿根廷乐事 (Argentina's delight) colonies -@everythingcopper|万物皆铜 (Everything is Copper) +everythingcopper@|万物皆铜 (Everything is Copper) passive-endermen@|被动型末影人* elemental-aspects @@ -10669,10 +10669,10 @@ twilight-catalist|暮色催化石* extra-moas corruptional enablemultiplayermode@ -wizardy-delight +wizardy-delight@wizardry-delight -@tinyallies +tinyallies@ all-da-nuggets random-recipes starks|史塔克一家* @@ -10686,7 +10686,7 @@ mobification trimseffects@ tough-glass@ celestisynth|天神剑技* - +golems-plus-plus more-axolotls@more-axolotl perfect-accuracy@ @perfect-accuracy-forge @@ -10721,7 +10721,7 @@ armorpoints@ easy-enchanting@|轻松附魔* elitia cosmetic-wings - +deepspace|深空 (DeepSpace) death-backup@ bear-with-me create-diesel-generators@|机械动力:柴油动力 (Create: Diesel Generators) @@ -10729,7 +10729,7 @@ vintagefix@ nostalgic-tweaks@ suspicious-sand-maker -create-cobblemon-industrialized +create-cobblemon-industrialized@ create-pixelfactory ies-tweaks @haunt-furnace @@ -10751,7 +10751,7 @@ lost-features@lostfeatures bagus-lib@ @better-doors -@server-pack-unlocker¨3178320¨3178321 +3178320@server-pack-unlocker¨3178321 x-enchant @blahaj-remake @@ -10762,11 +10762,11 @@ better-chiseled-bookshelves|更好的雕纹书架* @shorks @missing-vanilla-recipes alcocraft@ - +silences-defense-tower mowlib - +advanced-backups|高级备份* not-just-biomes@ agricultural-enhancements@|农业增强* @@ -10787,7 +10787,7 @@ mushroom-villagers @litematica-server-paster s33r-butterfly-paintings @more-statistics -villager-see-villager-do¨@villager-see-villager-do +villager-see-villager-do@ industrybase|工业基石 (IndustryBase) silent-river-in-the-nether|炎液断蒸* ramel-reforged @@ -10817,10 +10817,10 @@ keepcuriosinventory|饰品栏优化 (KeepCuriosInventory) megachicken@mega-chicken s33r-iris-azalea-mod difficultyplus@difficulty+ -black-lung¨@blacklung +black-lung@blacklung friends-and-foes-beekeeper-hut-forge@¨friends-and-foes-beekeeper-hut-fabric@ friends-and-foes-flowery-mooblooms-forge@¨friends-and-foes-flowery-mooblooms-fabric@ -@random-looting|随机战利品表 (Random Looting) +random-looting@|随机战利品表* kubejs-botany-pots@ irons-rpg-tweaks@ @enchantips @@ -10830,7 +10830,7 @@ emogg@ elytra-trims@ benefits-of-reading|雕纹书架注魔/阅页读著 (Benefits of Reading) gothic-rpg -@arcadian-dream|幻想之梦 (Arcadian Dream) +arcadian-dream@|幻想之梦* dungeon-and-taverns elytra-trims-extensions@ @@ -10858,7 +10858,7 @@ plenty-of-golems @durability-viewer-updated puffish-skills@skills better-archeology@|更好的考古学* - +fake-people|假人* apoca-mobs @snow-sniffer @@ -10884,7 +10884,7 @@ create-air-forge inhibited@ - +china-railway-facilities|中国铁路设施 sekc-physics¨sekc-physics-fabric @artificial-lightning-mod do-api@ @@ -10893,30 +10893,30 @@ do-api@ grabby-mobs@ pandas-falling-trees@ iron-ender-chests -delightful-creators-fabric@ -@death-but-three|逝不过三 (Death But Three) +delightful-creators-fabric@|动力乐事 (Delightful Creators) +deathbutthree@death-but-three|逝不过三 (Death But Three) comparties|组队兼容* dusty-decorations@ simple-double-jump - +simple-ore-generation|简单的矿石生成* save-the-monument snifferiety@ light-the-night tweakerge@ terrafirmaships@ better-ocelots - +actually-useful-smithing-table denyblocks sculk-horn@-sculk-horn ydms-red-panda@ overworld-piglins@ -waveapi +waveapi@ modlist panorama-screens@ campfire-spawn-and-tweaks ghostz@ -better-totem-of-undying¨better-totem-of-undying-fabric¨@better-totem-of-undying-forge +better-totem-of-undying@better-totem-of-undying-forge¨better-totem-of-undying-fabric modonomicon@ moreyoyos effortless-fabric @@ -10934,12 +10934,12 @@ skinned-carts quick-effect@quickeffect block-log - +equipment-benediction|装备祝福* @gms|现代游戏模式选择器 (Modern Gamemode Switcher) dimension-localized-inventories skillcraft-modpack-tool - - +modern-inhibited +ghostjump|死者为大 (GhostJump) @notsoessential worldsalads-opulence @@ -10947,13 +10947,13 @@ worldsalads-opulence pearfection enderchests¨enderchests-fabric dragon-rider -create-utilities-fabric@create-utilities +create-utilities-fabric@create-utilities|机械动力:实用物品 (Create Utilities) creeperhost-presents-chickens inet@ - +safefall|你安星好啦* my-beloved-icon@ - +mob-catcher-fabric tetra-enlarged fruit-delight@|果品乐事* @idletweaks @@ -10962,9 +10962,9 @@ passive-skill-tree|被动技能树* villagertradefix - +bullet-chat|弹幕聊天* fishermans-trap -@removebats|禁止蝙蝠生成 (RemoveBats) +removebats@|禁止蝙蝠生成 (RemoveBats) nabba enchantdemon|附恶魔 (EnchantDemon) @@ -11001,7 +11001,7 @@ personality-rp@personality @fabric-yaml-configuration -comfy-beds +comfy-beds@ twerk-crop-dusting-mod-fabric extra-damage-enchantments@ lemon-core @@ -11012,7 +11012,7 @@ passive-charms@ linkart-updated@linkart jamlib@ -globalization +globalization@ renewable-spore-blossoms @paragraphs @@ -11041,31 +11041,31 @@ cultivatecraft rpgloot-patched fluidlogged create-foundry -@cobblemon-fight-or-flight -trapper-pelts@ +cobblemon-fight-or-flight@ + ender-magnet|末影磁铁* dead-guys-hallucination-nightmare -gardens-of-the-dead@ + simple-hot-air-balloons @toomuchrain -thirst-was-remade|口渴-重制*¨@thirst-was-remade|口渴-重制 (Thirst Was Remade) +thirst-was-remade|口渴-重制*¨@thirst-was-remade|口渴-重制 (Thirst Was Remade) - 已失效 ies-tweaks-fabric@ brown-mooshrooms @whetstones @better-log4j-config @harvest wooden-hoppers -skeleton-horse-spawn +skeleton-horse-spawn@ configanytime@ faster-crouching@ yeetusexperimentus xbob@|准星摇晃 (Crosshair Bobbing) -zombie-horse-spawn +zombie-horse-spawn@ tinkers-katanas fbp yeetem-potions@ -incapacitated¨@incapacitated +incapacitated@ @fys|锻汝砧上 (Forge Yourself) @mcopper|梧桐物语 (MCopper) no-ranged-knockback @@ -11083,10 +11083,10 @@ ventur-origin@venturorigin waterphysics ece-enhanced-celestial-enhancement|月亮事件扩展:第二月亮 (ECE - Enhanced Celestial Enhancement: The Second Moon) plants-vs-zombies-cubed@pvzcubed - - - - +moa-decor +moa-decor-toys +moa-decor-cookery +moa-decor-science create-guardian-beam-defense antisocial@ expanding-technologies@expandingtechnologies @@ -11095,29 +11095,29 @@ mob-death-messages chunkapi@ @betterwaystonesmenu @big-fish -@nulltal -@caffeinefilled +nulltal@ +caffeinefilled@ pet-transfer-trade-your-pets@pet-pass-trade-your-pets! -lets-do-bakery@ +lets-do-bakery@|馥郁烘焙 (Let's Do: Bakery) searchables@ dixtas-armory@ -@ingamestats +ingamestats@ hanger-system-overhaul -@isaidnosnow -jarsauth|客户端验证 (JarsAuth) -autoelytrapanic¨@autoelytrapanic +isaidnosnow@ +jarsauth|客户端验证 (JarsAuth) - 此已不受支持¨@jarsauth|客户端验证 (JarsAuth) - >= 4.0 +autoelytrapanic@ more-crossbows-cj multipart-machines-cooking thepeebrain-dream-dimension @chaos-world|混沌世界 (Chaos World) -@ochetgenyo -@qcraft|量子物理重构 (qCraft Reimagined) +ochetgenyo@ +qcraft-reimagined@qcraft|量子物理重构 (qCraft Reimagined) @todo-list|待办事项 (TODO List) @arst-armor-hud -@spice-of-life-onion|生活调味料:洋葱版 (Spice of Life Onion) +spice-of-life-onion@|生活调味料:洋葱版 (Spice of Life Onion) effect-berries@ tinkersworld @@ -11126,7 +11126,7 @@ ragdoll-corpses|布娃娃尸体* floatingruins|浮空遗迹 (FloatingRuins) creeper-backguard@creeperbackguard -audio-extension-for-fancymenu-forge¨@audio-extension-for-fancymenu +audio-extension-for-fancymenu-forge@audio-extension-for-fancymenu¨audio-extension-for-fancymenu-fabric stay-warm-together aeroblender@ ancient-aether@ @@ -11148,7 +11148,7 @@ curios-compat such-a-delight create-compressed emoji-type@ -@soulbound-enchantment|灵魂绑定 (SoulBound) +soul-bound-enchantment@soulbound-enchantment|灵魂绑定 (SoulBound) tower-defense-units barrier-block-mod|屏障方块* @simplehealthorbs @@ -11156,13 +11156,13 @@ misctweaks_ dynamic-music-updated@ spartan-netherite climb-ladders-fast -@custom-machinery-mekanism#all-versions +custom-machinery-mekanism@ @touhou-tweaks|东方改进 (Touhou Tweaks) -@noraidtotems +noraidtotems@ @snowballs_plus -bagus-mob +bagus-mob@ chat-twix@ shulker-meat accurate-block-placement-reborn @@ -11178,16 +11178,16 @@ remodified|你再造! (Remodifier) better-fusion-reactor-for-mekanism@ -@growableores +growableores@ golemsarefriends -@keepcommandhistory¨keep-command-history +keep-command-history@keepcommandhistory generatorgalore @map-shirts - +fireproof-boats dyenamicsandfriends @@ -11196,18 +11196,18 @@ bluebox hunger-reworked armor-status-hud-renewed|耐久信息显示:重生 (Armor Status HUD Renewed) boblib -placeable-mobs +placeable-mobs@placeble-mobs potion-blender t6-auto-attack-mod@t6-auto-attack forceasciifont-backport @vmupdate|VM汉化更新 (VM Translation Update) trample-no-more@ -directional-damage-indicator +jeremyseq-damage-indicator digs-dnd-origins superior-flat -fungal-infection-spore +fungal-infection-spore@fungal-infectionspore @easy-tweak netherless-quartz @@ -11237,14 +11237,14 @@ themangonewadvent better-nether-continuation|更好的下界延续 (BetterNether Continuing) stygian-end-continuation|末地:生物群系扩展延续* -skill-slots|技能槽* - Forge¨skill-slots-fabric|技能槽 (Skill Slots) - Fabric¨@skill-slots|技能槽 (Skill Slots) +skill-slots@|技能槽*¨skill-slots-fabric|技能槽 (Skill Slots) novam-terram-continuation @jade-feet|玉足 (Jade Feet) cutting-edge xp-from-harvest-forked - - +papi-project +eventhorizon|事件视界 (EventHorizon) mob-options mod-sets@|模组集* @@ -11264,7 +11264,7 @@ mode-switch better-clouds-forge @better-clouds @easymapdownload - +@dynamic-difficulty|动态难度 (Dynamic Difficulty) client-crafting anvil-repairing@ headcrabs @@ -11273,7 +11273,7 @@ gensokyo-ontology@|幻想存有论* recipe-book-delight@|配方书乐事* chest-hoppers|箱子漏斗* @gravy-delight -ubes-delight@ +ubes-delight@|香芋乐事 (Ube's Delight) torcherino-unofficial more-bows-and-arrows@ xp-shop @@ -11282,7 +11282,7 @@ replanter zombie-infection-vaccine simple-achievements achievement-books|成就书* - +villager-enchanter|村民附魔师 (VillagerEnchanter) invocore-utility-mod saljus-quill @@ -11292,13 +11292,13 @@ custom-villagers|自定义村民* turtlematic remove-base-origins @cobblemon-delights|方块宝可梦乐事 (Cobblemon Delights) -redirectionor|异引定址 (Redirector) - 1.16.5+¨redirectionor-retro|异引定址 (Redirector) - 1.12.2- +redirectionor|异引定址 (Redirector)¨redirectionor-retro|异引定址 (Redirector) villager-mantle-fix|村民帽子修复* rechiseled-create@ xaeroplus@|Xaero的地图增强 (XaeroPlus) cosmetic-nametags@ thirdlife-rts@ -@real-peaceful-mode|真正的和平模式 (Real Peaceful Mode) +real-peaceful-mode@|真正的和平模式* niftyblocks elfs-dark-dimension xaeros-minimap-world-map-waystones-compability @@ -11324,7 +11324,7 @@ growable-storage-cells growable-cells-2 cinchcraft day-counter@ag-day-counter - +makecold|冷境 (MakeCold) sculk-redstone-components@sculkredstonecomponents @@ -11334,7 +11334,7 @@ immersive-portal-gun@portal-gun|沉浸式传送枪* tac-craft-tactical-armor-pack @flexible-arms|灵巧双手 (Flexible Arms) boat-tweaks|船只调整* -@effect-descriptions +new-effect-descriptions@effect-descriptions @diagonal-windows illager-invasion@|灾厄侵扰* @@ -11348,7 +11348,7 @@ dynamic-trees-hexerei minium-stone@ @fastrtp -tech-decorators|科技装饰商*¨@tech-decorators|科技装饰商 (Tech Decorators) - Forge¨@tech-decorators-fabric|科技装饰商 (Tech Decorators) - Fabric +tech-decorators@|科技装饰商*¨@tech-decorators-fabric|科技装饰商 (Tech Decorators) dynamic-trees-ars-nouveau @kazzmons-magecraft @@ -11372,7 +11372,7 @@ 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 +minerally@ better-jukeboxes patboxs-brewery@brewery @@ -11380,7 +11380,7 @@ stackable-stew-and-soup mindful-darkness@ @sbet nature-arise@ - +compression-bag|压缩袋 (CompressionBag) more-beautiful-torches@ quality-crops @individual-keep-inventory @@ -11415,12 +11415,12 @@ ftb-xmod-compat crabbers-delight@|蟹农乐事 (Crabber's Delight) slot-cycler resource-pack-overrides@ -@respawning-animals|动物重生 (Respawning Animals) +respawning-animals@|动物重生* arcane-lanterns crashma@ -blackwolf-library¨blackwolf-library-fabric¨@blackwolf-library +blackwolf-library@¨blackwolf-library-fabric blues-scape-and-run-bosses gigeresque lookaround @@ -11439,8 +11439,8 @@ itemlocks@ pick-block-pro@|选择方块专业版* skin-and-bones @pet-armor - -@more-nugget|更多矿物粒 (More Nugget)¨more-nugget|更多矿物粒* - Forge¨more-nugget-fabric|更多矿物粒 (More Nugget) - Farbic +maxs-deco|Max的装饰 (Max's deco) +more-nugget@|更多矿物粒*¨more-nugget-fabric|更多矿物粒 (More Nugget) - Farbic dual-swords@ organizable-play-screens@ labelling-containers@ @@ -11459,7 +11459,7 @@ reactive@ simple-deepslate minunrpg more-sheep-wools -maturi-delight@ +maturi-delight@|祭典乐事* forgified-fabric-api@ artisanat @@ -11472,19 +11472,19 @@ command-block-ide@ green-thing-mod lmft@ peripheralium@ -@resource-switcher|资源切换器 (ResourceSwitcher) +resource-switcher@|资源切换器 (ResourceSwitcher) serializationisbad clutter@ no-enchantment-cap-1-12-2-backport survivingtheaftermath|劫后余生 (Surviving The Aftermath) dimension-viewer@ -@more-food|更多食物 (More Food) +foodmodmorefood@more-food|更多食物 (More Food) tfcgyres-orehints badstdout@ -multiworld-mod¨@multiworld +multiworld-mod@multiworld miaooo -@pipeblocker¨pipeblocker +pipeblocker@ moa-decor-lights craft-saddles-forge-1-16-5@craftsaddles @@ -11500,7 +11500,7 @@ silence-mobs@ utilitix@ tiny-coal@ -replay-mod-for-forge-reborn + flib@ copper-revisioned@ @@ -11516,7 +11516,7 @@ red-core@ record-days-survived@ veinminer-companion - +flightem|我要骑着你飞* @leashable-players snowballs-freeze-mobs@ guinea-pigs@guineapigs @@ -11565,7 +11565,7 @@ pre-fish-feed|打窝* armor-trim-item-fix@ waffles-moss delightful-cuisine-for-woodheads -towers-of-the-wild-modded|旷野之息高塔 : 再重制 (Towers of the Wild Modded) +towers-of-the-wild-modded@totw-modded|旷野之息高塔 : 再重制 (Towers of the Wild Modded) waffles-terracotta-plaster watermedia@ @@ -11577,8 +11577,8 @@ etcetera garnished@create-garnished|机械动力:装食 (Create: Garnished) just-a-well@ - - +siberiamod +spacetime|空之翼 (SpaceTime) @@ -11588,7 +11588,7 @@ mob-animations platter i-want-that-back presence-not-required -@wnboi +wnboi@ @biome-compass eye-collector-mod @@ -11598,12 +11598,12 @@ opolis-miners@ netherite-but-cheaper @fabric-hammers items-displayed-forge@¨items-displayed-fabric@items-displayed -63102-wood-converter-v2-8_2-v2-7_1 +wood-converter hammer-mod realisticsleepfabric@realisticsleep - -@hexgloop|咒法凝浆 (Hex Gloop) +zombies-actually-siege +hex-gloop@hexgloop|咒法凝浆* the-void the-shadowlands bloxys-structures@ @@ -11629,12 +11629,12 @@ noclip@ diamond-in-the-rough-as-in-obsidian@diamond-in-the-rough factioncraft@ better-ender - +mlmanimator playlist@ @villagers-far-from-home cultivationcraft|异道修仙 (CultivationCraft) - +@carpet-las-addition @whoami|我是谁? (Who am i?) @verticality the-slender-man @@ -11695,7 +11695,7 @@ curse-of-the-warden chatanimation@|聊天动画 (ChatAnimation) mobvote-rascal@rascal spotiforge -@indypets¨indypets +indypets@ minecraft-legends-golems create-sandpaper-overhaul@ vintage-gregtech @@ -11710,7 +11710,7 @@ trenzalore -creo-lib¨@creo-lib +creo-lib¨@creo-lib|Creo Lib - 已失效 highlight@ lost-libraries @plant-pearl @@ -11726,7 +11726,7 @@ ultimatebackportmod @sorted-enchants|附魔排序 (Sorted Enchants) -constructs-armory-1-18-2-port +constructs-armory-1-18-2-port@construct-armory-updated @videotape @enchantmenttweaker @@ -11829,7 +11829,7 @@ hammer-animations blueflame nocubes-craftable-music-discs enderlicious - +quarry-reborn morematerials@ @@ -11838,7 +11838,7 @@ cursed-mod-for-fabric@cursed weaponized-baseball epic-paragliders-but-sekiro|史诗狼之伞* visualores@ - +d-furnace flickerfix|闪烁修复 (FlickerFix) @spongesucc @phosphor-legacy @@ -11851,7 +11851,7 @@ immersive-melodies theobsidianboat dragon-survival-compatibility@|龙之生存:兼容* bettercookedaxolotls - +stateobserver mighty-mail¨mighty-mail-fabric nature-architect-plants-and-decorations better-berries-redux @@ -11874,14 +11874,14 @@ mimic-mod@mimic bocchium despawntweaker -@on1chest|唯一箱子 (Only Need One Chest) +on1chest@|唯一箱子 (Only Need One Chest) landmines@|地雷* packed-up-backpacks@ valhelsia-furniture dimension-remote -@bring-decay¨bring-decay +bring-decay@ rendertypecache autotag@ libz@ @@ -11897,14 +11897,14 @@ better-anvil@ bloxys-misc @find @elytra-recast -tieredz¨@tieredz +tieredz@ more-creepers|更多苦力怕* cryptic-registry@ level-text-fix binnies-mods-patched@ -cyanide-forge|氰化物 (Cyanide) - Forge¨cyanide-fabric|氰化物 (Cyanide) - Fabric +cyanide-forge|氰化物 (Cyanide)¨cyanide-fabric|氰化物 (Cyanide) @particlesenhanced @atum @worldpreview @@ -11915,16 +11915,16 @@ pro-sniper|专业狙击手* aether-gear-expansion aether-enhanced-extinguishing@ @recipebookmasscraft -create-new-age +create-new-age@|机械动力:电气时代 (Create: New Age) @universal-trading @sauces|涂酱 (Sauces) - +nekoui xpteleporters-2|经验传送器 (XPTeleporters 2) -@centered-plants|植物居中 (Centered Plants) +centered-plants@|植物居中* showkeybinds@ @lostera-coremod advanced-tooltips@ @@ -11933,7 +11933,7 @@ advanced-tooltips@ prehistoric-nature-cambrian-dimension @mushroom-mod better-end-sky¨better-end-sky-fabric -valkyrie¨@valkyrie +valkyrie@ soaring-structures-2 prehistoric-nature-ordovician-dimension fadeless@ @@ -11964,9 +11964,9 @@ eternal-winter move-boats@ omnom forest-x-reborn@ -exlines-bark-carpets +exlines-bark-carpets@bark-carpets exlines-more-carpets - +ne|猫艺:附魔 (NekoEnchantment) unearthed-journey|出土之旅* prehistoric-nature-devonian-dimension mwtis-stone-expansion@stone-expansion @@ -11976,14 +11976,14 @@ exstrangefood-reborn|更多奇怪的食物:重生 (ExStrangeFood:Reborn) frog-legs ohoy-scallywag ylf-your-flying-pet - +bedrock-edition-features|"基岩"特性 (Bedrock Editon Features) simply-hot-springs magma-monsters mystics-biomes@ super-block-world@ create-train-additions@ enchantery@ -replant-swamp-trees¨@replant-swamp-trees +replant-swamp-trees|Replant Swamp Trees - 仅有老旧的¨@replant-swamp-trees vehiclefix@ firework-frenzy@ prehistoric-nature-carboniferous-dimension @@ -12011,7 +12011,7 @@ cat-eyes-night-vision-toggle-mod@cat-eyes vtdownloader@ smithing-mod -the-doppelganger +the-doppelganger@ rail-wand tin-ore@tinore dark-elves-of-underdark @@ -12052,17 +12052,17 @@ startup-timer cc-mb|纸带八音盒 oryls-adventures elden-craft -@ruok|钌 (RuOK) +ruok@|钌 (RuOK) deep-dark-regrowth textrues-embeddium-options@|TexTrue的Embeddium视频界面 (TexTrue's Embeddium Options) silent-mine headhunter-mod@shadows-formidable-foes-the-headhunter -yungs-better-jungle-temples|YUNG的丛林神庙优化 (YUNG's Better Jungle Temples) - Forge¨yungs-better-jungle-temples-fabric|YUNG的丛林神庙优化 (YUNG's Better Jungle Temples) - Fabric¨@yungs-better-jungle-temples|YUNG的丛林神庙优化 (YUNG's Better Jungle Temples) +yungs-better-jungle-temples@|YUNG的丛林神庙优化 (YUNG's Better Jungle Temples)¨yungs-better-jungle-temples-fabric|YUNG的丛林神庙优化 (YUNG's Better Jungle Temples) forlorn-beasts harpiccore-mod poonggis-add-more-bosses rottenmod - +simpletweaker @no-spawning-on-ice-highways zens-mmorpg @@ -12075,7 +12075,7 @@ deathquotes-death-quotes saphyre gameblocks@ -@initial-house|初始房屋 (Initial House) +initial-house@|初始房屋* livingchest skibidi-toilet-stevebidop @@ -12099,10 +12099,10 @@ entity-detectors@ decorative-blocks-fork@decorative-blocks|装饰方块(分支版) (Decorative Blocks (Fork)) above-and-below@ -@freeze-it-and-heat-it|冷汗:食物冷冻与加热 (Freeze It, and Heat It!) +freeze-it-and-heat-it@|冷汗:食物冷冻与加热 (Freeze It, and Heat It!) @keybindsgalore-1.20.x-(hvb007) never-full -blooming-blossom@ +nemos-blooming-blossom@ legacies-and-legends@ @@ -12110,18 +12110,18 @@ your-log-saw-something-last-night@ tubes-reloaded@ -@natures-spirit|自然之灵 (Nature's Spirit)¨natures-spirit|自然之灵 (Nature's Spirit) +natures-spirit|自然之灵 (Nature's Spirit) - 已失效¨@natures-spirit|自然之灵 (Nature's Spirit) @natrium -bossominium +bossominium@ @sort-extension hostile-water-monsters slabs-layers@slabs-layers+ history-of-middle-earth-legacy|中洲历史:传承 (History of Middle-earth: Legacy) hostile-humans@ -@cssb|经典且简易的状态栏 (Classic and simple status bars) +classic-and-simple-status-bars@cssb|经典且简易的状态栏 (Classic and simple status bars) @turtle-charging-station @your-reputation - +futurediary|未来日记 (FutureDiary) infiniverse@ use-item-on-block-event@ genshin-instruments@ @@ -12132,7 +12132,7 @@ cropchance|IC2作物信息 (CropChance) freelook-fabric@freelook respawn@ infiniverse-utils -@coreextensions|核心拓展 (CoreExtensions) +coreextensions@|核心拓展 (CoreExtensions) @fast-items toad-terror @modern-industrialization-sound-addon @@ -12155,12 +12155,12 @@ boss-music-mod yippee friends-forever|永恒的伙伴* de-extinction-mod -@custom-world-generation|自定义世界生成 (Custom World Generation) -cataclysm-tweaks -@euphoria-patches -poke-ball|精灵球 (pokeballhv) -aquamirae-mod-music +custom-world-generation@|自定义世界生成* +euphoria-patches@ +poke-ball|精灵球 (pokeballhv) +aquamirae-mod-music@aquamirae-mod-extra-music +deathmatch @smooth-scroll|平滑滚动 (Smooth Scroll) toad-terror-battle-music @@ -12169,10 +12169,10 @@ fusion@ machines@ tenms-discs netherrocks@ -invasion-code-red + efw-forgotten-place @vulkanite-mod -yungs-better-end-island|YUNG的末地岛屿优化 (YUNG's Better End Island) - Forge¨yungs-better-end-island-fabric|YUNG的末地岛屿优化 (YUNG's Better End Island) - Fabric¨@yungs-better-end-island|YUNG的末地岛屿优化 (YUNG's Better End Island) +yungs-better-end-island@|YUNG的末地岛屿优化 (YUNG's Better End Island)¨yungs-better-end-island-fabric|YUNG的末地岛屿优化 (YUNG's Better End Island) bellsandwhistles@ daniinatorul @@ -12195,10 +12195,10 @@ combat-bash marbleds-villager-hats@ connector-extras@ -akkamaddis-simple-tungsten|Simple Tungsten - 新版本¨@akkamaddis-simple-tungsten +akkamaddis-simple-tungsten|Simple Tungsten - 新 just-enough-beacons-reforged -akkamaddis-additions@akkamaddis-steely-glint¨simple-cobalt|Simple Cobalt - 新版本¨@simple-cobalt +akkamaddis-additions@akkamaddis-simple-tungsten¨simple-cobalt|Simple Cobalt - 新 akkamaddis-ashenwheat@ prehistoriclegacy redyed @@ -12206,20 +12206,20 @@ enchantmentdisabler@enchantment-disabler miners-glasses relics-and-alchemy @greate - +advanced-world-selection accelerated-decay@ zots-only-silver@ iceandfire-rlcraft|冰火传说-RLCraft版 (I&F:RLCraft Edition) bqutweaker@ - +the-arbiter|调停者* builders-construct timelessivy|永恒常春藤 (TimelessIvy) -akkamaddis-hadite-coal|Hadite Coal - 新版本¨@akkamaddis-hadite-coal +akkamaddis-hadite-coal|Hadite Coal - 新 -akkamaddis-arsenic-and-lace|Arsenic and Lace - 新版本¨@akkamaddis-arsenic-and-lace +akkamaddis-arsenic-and-lace|Arsenic and Lace - 新 xiyus-exchanted-book|饩雨的附魔书 (xiyu's Exchanted book) la-abuelita @@ -12227,12 +12227,12 @@ rotted-forge rustic-furniture-compat @no-realms-button|Realms按钮移除 (No Realms Button) @benchantments -epic-fight-indestructible +epic-fight-indestructible|坚不可摧 (Epic Fight - Indestructible) -@catwalks-llc +catwalks-llc@ divine-quest-rpg @carpet-org-addition simply-headshots @@ -12252,11 +12252,11 @@ mcv-biome-makeover-lieonlion@ more-chest-variants-lieonlion@ more-crafting-tables-mct@more-crafting-tables-lieonlion @cobblemon-quests -akkamaddis-classical-alchemy|Classical Alchemy - 新版本¨@akkamaddis-classical-alchemy +akkamaddis-classical-alchemy|Classical Alchemy - 新 @big-pony|彩虹大马 (Big Pony) @theft -akkamaddis-golden-glitter|Golden Glitter - 新版本¨@1.20.1-5.0.0.0 +akkamaddis-golden-glitter|Golden Glitter - 新 @obsidianbucket enhanced-annihilation-planes akkamaddis-simple-cthon@ @@ -12265,7 +12265,7 @@ pooping-animals good-boy@ nethers-overhaul -@gregtech-ce-unofficial-child-happy-edition|格雷科技社区版非官方版儿童快乐版 (GregTech CE Unofficial : Child Happy Edition) +gregtech-ce-unofficial-child-happy-edition@|格雷科技社区版非官方版儿童快乐版 (GregTech CE Unofficial : Child Happy Edition) @axiom @@ -12273,14 +12273,14 @@ lilac@ colorful-enchantment|自定义附魔光效 (Custom Colorful Enchantment) rusticwitchcraft -sterling-and-black|Sterling and Black - 新版本¨@sterling-and-black +sterling-and-black|Sterling and Black - 新 boss-and-magic-raid-compat animated-mobs@boss-and-magic backlytra|鞘翅* - +neapolitans-quality rustic-bop-woods hedgehoggery yawctys-giant-squids @@ -12323,15 +12323,15 @@ cute-bears additional-fruits@ bigger-better-end-cities@ @some-peripherals -@reden +reden@ sparse-structures@sparsestructures - +persistentcooldowns|物品冷却持久化 (Persistent Cooldowns) @command_extractor advancement-based-spawning@ heroic-armory-legacy -yungs-menu-tweaks|YUNG的菜单调整 (YUNG's Menu Tweaks) - Forge¨yungs-menu-tweaks-fabric|YUNG的菜单调整 (YUNG's Menu Tweaks) - Fabric¨@yungs-menu-tweaks|YUNG的菜单调整 (YUNG's Menu Tweaks) - +yungs-menu-tweaks@|YUNG的菜单调整 (YUNG's Menu Tweaks)¨yungs-menu-tweaks-fabric|YUNG的菜单调整 (YUNG's Menu Tweaks) +entity-distance-1-12-2|实体距离 (Entity Distance) coolesthardcore@coolest-hardcore taxcastlepillager pesky-pirates@ @@ -12342,10 +12342,10 @@ darkfeather-golden-feather darkspawn-teleport-to-spawn darksmelting-smelt-armor-and-tools fast-build - +digi-applimobs|数码宝贝宇宙应用怪兽* duckies dimension-crystals@ - +mechanical-crafting @enhancedbookwriting player-events@ mushlings @@ -12403,7 +12403,7 @@ darkmobs-increase-mob-difficulty @apollo-the-parrot mob-variants galvanization -biome-grass-available +biome-grass-available@ pigment@ @sunrise-sunset-audio halloween-nighmare @@ -12437,7 +12437,7 @@ fishy-business-more-fish crab-mob-vote-2023 -enderswords¨@enderswords +enderswords@ lemons-halloween moon-reborn @@ -12448,7 +12448,7 @@ just-sword-blocking @blissful-butterflies - +mltpojectmonster|銘洛天的怪物增强 (MLTPojectMonster) @relics-of-the-sky|空岛遗物 (Relics of the Sky) ae2-stuff-extended @@ -12460,8 +12460,8 @@ simply-stacked-dimensions @what-are-you-voting-for-2022 immersive-electrocution additional-compression - -torcherino-community-edition|加速火把社区版* +team-projecte|等价交换团队 (Team ProjectE) +torcherino-community-edition@torcherino-ce|加速火把社区版* enchantgiver diabolical-delights@ @@ -12471,7 +12471,7 @@ ore-growth@ cropariaplus soularia@ -stemaria¨@stemaria +stemaria@ spelunkers-charm-ii structure-essentials-forge-fabric @@ -12483,11 +12483,11 @@ weapons-of-miracles-epicfight@weapons-of-miracles mcdar|我的世界:地下城法器 (MC Dungeons Artifacts) - +dnt-swamp-hut-overhaul jaopcagt smidgeon-o-bliss cable-flux@12.3.5 - +jet-and-elias-armors @@ -12496,10 +12496,10 @@ dragon-ice abnorlex-and-cryptids-delight tf2-stuff-reloaded|军团要塞2重制版 (TF2 Stuff - Reloaded) - +time-in-a-bottle-curio-support absolute-ultracraft@ more-layered-blocks@ -@hybrid-aquatic +hybrid-aquatic@ spectre-creep resource-chickens @@ -12519,11 +12519,11 @@ water-walking-fix@ water-walking-fix-forge@ @chicken-nerf @explosive-breeding -@squished +squished@ russtales-forge trident-alter disenchanter@ -mc-dungeons-artifacts +minecraft-dungeons-artifacts uniquedungeons @cobbledex cobblemon-info@ @@ -12548,10 +12548,10 @@ technique-to-kill-thrasher|毙鲨技 (technique to kill thrasher) @the-open-sauce-toast-killer @chicken-nerf-reforged regex-search@ -@better-wake-up-position|更好的起床位置 (Better Wake-up Position) -railroad-blocks-forge¨railroad-blocks¨@railroad-blocks +better-wake-up-position@|更好的起床位置 (Better Wake-up Position) +railroad-blocks-forge@railroad-blocks¨railroad-blocks -@fossilmon +fossilmon@ opack2reload|资源包惰性重载/抑验怠载 (OPack2Reload) @wits @motleys-music-discs @@ -12561,10 +12561,10 @@ patched@ @snakewheel-attack! -@configurable-falls -just-enough-mekanism-multiblocks -throwableslimeball|圆液多掷 (ThrowableSlimeball) -death-note +configurable-falls@ +just-enough-mekanism-multiblocks@ +throwableslimeball|可投掷黏液球/圆液多掷 (ThrowableSlimeball) +death-note|死亡笔记* icicle @@ -12573,7 +12573,7 @@ icicle surface-mushrooms@ dont-void-arrows@ potion-cauldron@ -hippo-keystrokes¨@hippo-keystrokes +hippo-keystrokes@ spiritcaller-backport kindled @@ -12588,7 +12588,7 @@ better-chunk-loading-forge-fabric mushroomified soul-like-boss-epic-fight-addon -moderately-enough-effect-descriptions-meed-a-jeed-addon +moderately-enough-effect-descriptions-meed-a-jeed-addon@moderately-enough-effect-descriptions-(meed)-jeed-addon alexs-caves@|Alex 的洞穴 (Alex's Caves) bow-spam-be-gone@ lmdcraft @@ -12601,11 +12601,11 @@ dynamic-village@ jammies@ dj-villager ars-energistique - +chatimages|聊天图片 (ChatImage) create-more-drill-heads@|机械动力:更多钻头 (Create: More Drill Heads) create-liquid-fuel@|机械动力:液体燃料 (Create: Liquid Fuel) @rays-cool-armor -eeeabs-mobs +eeeabs-mobs@eeeab-s-mobs @obfuscated-accessibility regional-chat@ zenith-attributes@ @@ -12615,25 +12615,25 @@ zenith-attributes@ selectlative|选择性成就共享* better-compressed-blocks@ fakerlib@ -jousting@|马术* + potion-id-packet-fixer@potion-fix omniwand@|全能魔杖* - +key-binding-patch|按键绑定补丁* packet-fixer@ new-xenchant@ more-brewable-potions@ forge-cit @diamethyst-golem -you-are-seeing-dungeons +you-are-seeing-dungeons@ just-leveling@ create-edible-belts tact -paimon|派蒙!* - Forge¨paimon-fabric|派蒙! (Paimon) - Fabric +paimon|派蒙!*¨paimon-fabric|派蒙! (Paimon) @cesium|铯 (Cesium Storage Format) salvage-furnace@ eager-beavers@ @@ -12646,10 +12646,10 @@ loot-crates-plus legendary-origins@ flow@ lit-it-up@ - +lucky-cat|招财猫* all-the-wizard-gear better-tools-and-armor -@berrfect|完莓无缺 (Berrfect) +berrfect@|完莓无缺* mazemanicore uncanney-valley @cannibal-conundrum @@ -12687,10 +12687,10 @@ corundum-guardian-reborn autofire-bow-enchant -rideableravagers +rideableravagers@ passive-searchbar|被动搜索栏 (Passive SearchBar) flower-mimics -vegan-delight +vegan-delight|纯素乐事* bloodmooncmsfix-bmcmsfix evoodooers giant-overhaul @@ -12730,7 +12730,7 @@ creepy-creepers modular-item-api@¨truly-modular-arsenal@¨truly-modular-archery@¨truly-modular-armory@ @actionhunger -trafficcraft +trafficcraft@ banilla-hammers@ @hira-hira @@ -12760,7 +12760,7 @@ berrybush-magic archers@ @packrule-menus|数据包/游戏规则菜单 (Datapack/Gamerule Menus) inventorylogger-backups -rideablepolarbears +rideablepolarbears@ cobblemon-lucky-blocks egg-delight@ portable-nether¨portable-nether-fabric @@ -12811,7 +12811,7 @@ rainbow-reef@ @advancement-no-more aqua-geode -medieval-buildings +medieval-buildings@ @you-thief-remastered-edition @@ -12823,22 +12823,22 @@ embeddium-plus@embeddiumplus aggro-indicator haveasoltime@ tothestars@ -@translater +translater@ localized-chat@ prominent-create bad-lightning-no-cookie equipment-standard@|装备标准 (EquipmentStandard) snowly@ -@advanced-enchantments|进阶附魔 (Advanced Enchantments) +advanced-enchantments@|进阶附魔* oaks-nature@ geophilic-reforged lglegacy@|延迟监视:移植版 (LagGogglesLegacy) @smooth-scrolling-refurbished medieval-weapons-pack@ - +celestial-artifacts|星月遗物* perfect-mob-farm -smartrender +smart-render¨smartrender power-adapters@ silk-api@|丝绸开发库 (Silk API) @mediaworks|媒质工程 (Mediaworks) @@ -12846,7 +12846,7 @@ chestesp @ruthenium|钌 (Ruthenium) spirit-walker@ -@gcyr +gcyr@ gregtechceu-modern@|格雷科技现代版 (GregTechCEu Modern) @intarsia|咒术器具 (Intarsia) instant-village-building @@ -12864,7 +12864,7 @@ airdrop-supply|空投供应* refined-proxy pickable-pets@ -snow-mercy-forge + bouncestyles@ @@ -12872,7 +12872,7 @@ bouncestyles@ untamed-delight|不羁乐事* monster-no-armor-in-slar -@dancing-hoppers|舞动的漏斗 (Dancing Hoppers) +dancing-hoppers@|舞动的漏斗* anvil-crafting@|铁砧配方* ender-chested@ @skull-vision @@ -12881,11 +12881,11 @@ rebirth@rebirth-paintings amethyst-tools-2|紫水晶工具2 (Amethyst Tools Mod 1.2x) mob-pets|驯兽师* -ultimate-compression¨@ultimate-compression +ultimate-compression@ farming-in-rain bosses-of-mass-destruction-forge@ -armor-set-bonuses¨armor-set-bonuses-fabric¨@armor-set-bonuses +armor-set-bonuses@¨armor-set-bonuses-fabric nemos-creatures@ immersive-jungles@ @@ -12906,7 +12906,7 @@ exposure@ @fast-portals pick-up-me-please@pickup-me bouncy-creepers -simple-death-chest +simple-death-chest@ @enhancer-mod headphones you-are-the-zombie @@ -12938,7 +12938,7 @@ go-fish-updated|一起钓鱼吧!(updated) (Go Fish (updated)) what-are-they-up-to@ @fumo @elytraplus -mcaic@mcaic-forge +mcaic@ @zombification @stutterfix extrasounds-forge@extrasoundsforge @@ -12958,7 +12958,7 @@ restriction dynamic-name-tags@ @profundis -ctlib +ctlib@ctlibmod dependencies styled-sidebars@ @@ -12979,9 +12979,9 @@ croptopia-additions@ corniergun better-flight-forge@betterflight -farmers-delight-cookbook-reforged|农夫乐事:烹饪书重制版 (Farmer's Delight: CookBook Reforged) -momentariycore@momentariycore2 - +farmers-delight-cookbook-reforged@|农夫乐事:烹饪书重制版 (Farmer's Delight: CookBook Reforged) +applications@ +k-clear-lag @hexdim|咒法维度 (Hexxy Dimensions) simple-backups@|简单备份* sky-guis@ @@ -13003,11 +13003,11 @@ beware-the-rain the-sasquatch potion-pizzas@potionpizzas|药水披萨* pot-breaker@|砸罐子* -@disable-vanilla-tool|禁用原版工具 (Disable Vanilla Tool) +disabletools@disable-tools|禁用工具 (Disable Tools) @humility-se -@push-everything-away|推开一切 (Push Everything Away) -create-power-loader@|机械动力:动力加载器 (Create: Power Loader) +push-everything-away@|推开一切* +create-power-loader@|机械动力:动力加载器 (Create: Power Loader)¨create-power-loader-fabric|机械动力:动力加载器 (Create: Power Loader) epiceldenringweaponsarmorandmobs restart-server@ @@ -13020,10 +13020,10 @@ everlasting-skins legacy-console-sounds@ eye-spy@ -@sonicraft-demons¨sonicraft-demons +sonicraft-demons@ @speech-manager-by-command-scoreboard|计分板禁言管理器 (Minecraft Command Speech Manager) flans-mod-reloaded|Flan的枪械重制版 (Flan's Mod: Reloaded) -@mod-whitelist|模组白名单 (Mod Whitelist) +mod-whitelist@|模组白名单* simpledeserteagle|简单沙鹰 (Simple Desert Eagle) dungeons-towers@dungeons+-towers dungeons-more-spawners@dungeons+-more-spawners @@ -13069,11 +13069,11 @@ geotagged-screenshots@ @legacy-optifabric oneironaut@ - +celestial-core|星月核心 (celestial_core) colorablefox|可染色狐狸/色绘你狐革 (Colorable Fox) -archaeology-api -rpg-parties + +rpg-parties@ astikor-carts-tfc nanexs-mobs no-feather-trample@ @@ -13122,21 +13122,21 @@ beans-backpacks@ randomjs@ @piston-push erinium-automation - +angelica@ explosiont spider-caves@ cams-lights lemon-kindom-artifacts|柠檬王国:传说之物 (Lemon Kindom: Artifacts) -when-dungeons-arise-seven-seas|地牢浮现之时 - 海洋扩展 (When Dungeons Arise - Seven Seas) +when-dungeons-arise-seven-seas@|地牢浮现之时 - 海洋扩展 (When Dungeons Arise - Seven Seas) mob-battle-extra -@lios-overhauled-villages +lios-overhauled-villages@ lost-relics@ provihealth@provis-health-bars metabolism@|新陈代谢* -@advancementjs¨adv-js +adv-js|Advancement JS - 更新较慢¨@advancementjs teleportcraft@ -frights-delight@ +frights-delight@|惊吓乐事 (Fright's Delight) travelers-compass @artemis-thin-logs configjs@ @@ -13177,10 +13177,10 @@ better-dogs-x-doggy-talents-next towntalk cumulus epherolib -@icterine +icterine@ notrample industrial-foregoing-souls -fuelgoeshere +fuelgoeshere@ initial-dimension youkais-homecoming|妖怪们的归家 (Youkai's Homecoming) utilitarian @@ -13203,15 +13203,15 @@ cenozoic-nightmare-the-horror-of-prehistory slashblade-japanese-addon-pack-reforked|拔刀剑日系附属重置版 (SlashBlade Japanese Addon Pack Reforked) @create-fabric-fixes -crate-delight-forge¨crate-delight¨@crate-delight +crate-delight-forge@crate-delight¨crate-delight cultural-creators-fabric-create-and-cultural shuffle@ probejs-legacy -create-destroy@destroy|坍毁化合 (Destroy) +create-destroy@destroy flourish@ -pitch-dark¨@pitch-dark +pitch-dark@ survival-debug-stick -cerbons-api-forge +cerbons-api-forge@cerbons-api arcane-apprentices kirara nether-gold @@ -13219,7 +13219,7 @@ create-interactive@interactive this-tsunami blendium@ awakened-bosses -@misc_twf|冬境边域:生存法则 (Survive in the Winter Frontier) +survive-in-the-winter-frontier@misc_twf|冬境边域:生存法则 (Survive in the Winter Frontier) toneko@tonekomod goldelight cosmos-portals @@ -13233,7 +13233,7 @@ dimensional-threads@ jonns-trophies@ @it-follows! @loggerhead-luminancies -asteorbar|Asteor的状态栏和血量显示 (AsteorBar) +asteorbar@|Asteor的状态栏和血量显示 (AsteorBar) better-f1-reborn@|更好的F1重制版* create-tipsy-n-dizzy@create-tipsy-n-high ars-expanded-combat@ec-ars-compat @@ -13241,7 +13241,7 @@ ars-expanded-combat@ec-ars-compat @fluiwid revamped-phantoms@revamped_phantoms defaultserverlist@ -green-delights|绿里乐事 (Green Delight) +green-delights|绿里乐事* @modmenu-ornithe lost-city digestive @@ -13257,7 +13257,7 @@ floatingitems ars-ocultas@ tetracelium@ -create-food-fabric +create-food-fabric@create-food a-block-of-charcoal|木炭块 (A Block of Charcoal) @@ -13276,7 +13276,7 @@ pi-privateisland|私人空岛 (PrivateIsland) i-didnt-mean-it-that-way@ finitewater@ serverstop¨serverstop-fabric -glassential-renewed +glassential-renewed@ tanukidecor cit-reforged @@ -13284,7 +13284,7 @@ ultreonlib@ undergarden-delight medieval-deco@ -lotrfixer + limi|轻量化模组名称显示 (Lightweight Mod Indicator) jtlunlocker ae2-stuff-unofficial @@ -13353,7 +13353,7 @@ gwyndolin-dark-souls-boss mceconomy2 forgeservertools|服务器工具-核心 (ServerTools-CORE) @replay-fps -quark-delight +quark-delight|夸克乐事* mmm-lib @crabmtr-transit-plus|螃蟹的MTR扩展 (CrabMTR Transit+) @@ -13392,7 +13392,7 @@ poof-sounds@ @crash-pipe gradeus-epic-fight-addon-soul-like-boss zombie-more -gunscraft|枪械工艺* +gunscraft|枪械工艺 (Guns Craft) audino@ tabbychat-unofficial@ heracles@ @@ -13412,17 +13412,17 @@ bed-is-never-too-far-away create-oxidized@create_oxidized green-soul -@everyxdance|一起跳舞! (EveryXDance) +everyxdance@|一起跳舞! (EveryXDance) applied-flux - +@tinkers-delight|匠魂乐事 (Tinkers' Delight) unnamed-desert-structures@ bloomingnature@lets-do-bloomingnature waila-inhibitors@ thingamabobs-and-doohickeys waila-events@ march-of-the-ents|恩特的进军* - +rndtp in-world-buoyancy @simply-starminer macos-input-fixes@ @@ -13450,7 +13450,7 @@ choups-drakvyrn-mod abyssal-decor reddens-stone-lanterns|Redden的石灯笼 (Redden's Stone Lanterns) - +heaven-burns-red|红烧天堂* apotheosis-modern-ragnarok|神化:现代诸神黄昏* @bedgoboom @@ -13459,15 +13459,15 @@ custom-chest-loot|自定义战利品箱* resource-pandas@ sniffs-weapons@ maxlermod - +seed-protect bow-overhaul|弓箭改革* - +zelda-sword-skills-addon|塞尔达剑技 - 拓展 (Zelda Sword Skills - Addon) narrus-yeetus@ login-shield - +blockinteraction|禁止右键方块 (BlockInteractionMod) linkart-fabric leftist-potions@ -more-delight-fabric@more-delight +more-delight-fabric@more-delight¨more-delight-forge mceconomy3 @antique-atlas-4 @@ -13478,11 +13478,11 @@ create-copies-cats@ chat-signing-hider@ gamma-creatures multipart-machines-mining - +high-version-better-structure-block|更好的结构方块1.20.1 @creeper-multidrop -the-man-from-the-fog@¨the-man-from-the-fog-fabric@ -sawmill +the-man-from-the-fog@|雾中人*¨the-man-from-the-fog-fabric@|雾中人 (The Man From The Fog) +sawmill@universal-sawmill|锯木机* @savemod @dudewhatsmygpu create-wizardry@ @@ -13547,7 +13547,7 @@ looking-at rftools-continuation better-with-everything@ -create-clockwork +create-clockwork@ lomlib @old-and-new @@ -13567,7 +13567,7 @@ hexagonal-heresy hardcore-spelunking dark-menagerie icarus-mod -epic-knightsnmages-fabric¨@epic-knightsnmages +epic-knightsnmages-fabric@epic-knightsnmages hotai|绷带* zeta@ taxtowncitizen @@ -13578,7 +13578,7 @@ astikor-carts-redux@astikorcarts-redux third-person-shooting|第三人称射击* sight|视域* @the-first-city -threetag-palladium@ +threetag-palladium@|钯 (Palladium) @@ -13590,24 +13590,24 @@ experienced-crops@experienced_crops medieval-seedbags fusionutil - +@compact-machines-infinite|压缩空间:无限 (Compact Machines: Infinite) thaumic-sanity tfc-thermal-deposits animals-trap-for-tfc - +zzzzz-custom-configs weird-happenings -nbc-heroes +nbc-heroes@ melody@ -cut-through +cut-through@ anvilfixreborn@anvil-fix-reborn|铁砧修复重生 (Anvil Fix Reborn) apothic-curios hbm-ntm-lucky-blocks thaumtweaks -no-baby-zombies@ -combat-nouveau +no-baby-zombies¨@no-baby-zombies|No Baby Zombies - 已失效 +combat-nouveau@ @hanging-on @@ -13638,13 +13638,13 @@ tfmg-virtual-oil-deposit|工业长路:虚拟油田 (TFMG: Virtual Oil Deposit) @alinlib croparia-if@|矿石作物/魔种之咏 IF版 (Croparia-IF) - +@actionlib simple-close-button@ godzilla-rising create-netherless -noguievolution|沉浸进化 (NoGuiEvolution) +noguievolution@no-gui-evolution|沉浸进化 (NoGuiEvolution) baseball-bats tfc-weather @@ -13654,7 +13654,7 @@ nendermoo forgedcarpet framed gear-core@ -@hidemodded|隐藏“已修改” (HideModded) +hideasterisk@hidemodded|隐藏“已修改” (HideModded) monster-eggs@ rain-shield@ cerbons-better-beacons@ @@ -13675,7 +13675,7 @@ helpfixer @expansive-lighting drippedout@dripped-out easter-rabbit-life@ -@sticker-frames +sticker-frames@ tnt-slimes@ armored-redstone bismuth-colors@bismuth-2|铋 (Bismuth) @@ -13696,7 +13696,7 @@ royal-guard|皇家守卫* themoreloyaltrident@|更忠诚的三叉戟/移运兜转 (TheMoreLoyalTrident) notenoughresources elenai-dodge -xenon +xenon@xenon-forge|氙* riftstorm-rpg @@ -13721,7 +13721,7 @@ mutant-iceologer@mutant-iceologer-mod @days-gone @extra-loot|额外战利品 (Extra Loot) relics-of-gaming-continued@ -endermen-plus +endermen-plus@ tiptapshow@ villager-gunners @@ -13732,7 +13732,7 @@ just-an-end-anchor@ memory-usage-title -@sweeper-maid|清洁女仆 (Sweeper Maid) +sweeper-maid@|清洁女仆* more-enchantments_|更多附魔 (More Enchantments) bow-scope @@ -13752,7 +13752,7 @@ nocubes-wilderness copper-great-swords @better-falling-block-particles zume@ -mobtimizations +mobtimizations@ illager-trader@ @damagenumbers toolendxp @@ -13775,16 +13775,16 @@ jump-sounds@ llamapalooza instant-drown acsguis -game-phase|游戏阶段*¨@game-phase|游戏阶段 (Game Phase) +game-phase@|游戏阶段* no-zombie-pandemic witcheroo@ totallybalancedcreativeflying heterorustichromia video-extension-for-fancymenu-forge¨video-extension-for-fancymenu-fabric -easy-npc +easy-npc@ -the-dawn-era-delight +the-dawn-era-delight@ dynamic-craft startinginventory wireless-speakers|无线扬声器* @@ -13797,13 +13797,13 @@ enchantable-spike xaeros-map-chest-tracker-integration@ warden-horn too-many-efficiency-losses -srp-addon-cotesia-glomerata +srp-addon-cotesia-glomerata@ damage-lock|磁场天锁 (DamageLock) modular-materials@modularmaterials|模块化材料* - -@custom-portals +minepal +custom-portals@|自定义传送门* dirty-lens@ @improved-anvils styled-player-list@styledplayerlist @@ -13812,12 +13812,12 @@ create-love-war chainmailed serious-player-animations@ abridged@ - +hexvr@ hearths prey-effect -@venturer +venturer@ wheres-my-wither-storm -alexs-mobs-interaction +alexs-mobs-interaction@ @@ -13827,4 +13827,984 @@ medieval-buildings-end-edition orpheus@ @create-sweets-and-treats -klsts-beyond-netherite \ No newline at end of file +klsts-beyond-netherite + +refined-polymorphism@ +cave-dweller +dweller-dweller@dwellerdweller +thermals-delight +@advanced-hud +better-farmers-combat + +simple-butchery@ +butchery + +enchantment-reveal@ + +copycats@ +the-great-alchemical-compendium +desperate-measures@ +block-slabs-mod +roost-re-hatched +lifedrain +mediethings +gastrolimital-bypass@no_player_limit + +epic-core-api|史诗核心API (Epic Core API) + +infinityrpg +super-water-block +@stop-repeating-command-block|停!循环型命令方块 (Stop Repeating Command Block) + +pressure|压强* +amendments +piglin-army +decorative-ladders@ +more-foods + +mordern-kitchen@modern-kitchen|现代厨房 (Modern Kitchen) +better-main-menu@bettermainmenu + +more-wizards +oldresearch@ +ascension-megamons@ +simply-sulphur@ +fabric-hider +custom-cursor@ +the-man-from-the-void +simpletms-tms-and-trs-for-cobblemon@ +cobblemizer@ +worldtools@ +particle-blocker@particles +vehicle-hunger-bar@ +spooky-scary-halloween + + + +sandbox-bootstrap +tetra-toolbooster +ad-astra-proxima-plus +ad-astra-extra-additions@ +infinite-fluid-bucket@|无限流体桶* + +@voxy +vmod@ +minestuck + +star-wars-planets-ad-astra@ +amethyst-equipment@ +the-whisperer + +epic-vinland-saga +cat_jam@ +remastered-structure +spacore +fancyvideo-api +the-goatman-by-flamco4 + +mineral-overhaul-shellstone-tuff +clear-gpu-cache|清除GPU缓存* +stalker-creepers +the-ghoul-remastered@ +@transitmanager +integrated-scripting@ +@nyc-mtr +@mtr-utility +creativetabsearch@|创造物品栏检索 (CreativeTabSearch) + +tetrachord-lib@|四弦琴* +screenshot-sharing|屏幕截图分享/移影睹展 (ScreenshotSharing) +leaf-pile@|落叶堆* +uwufied@ +sit-chill +blueprintvoid@create-blueprint-void|机械动力:蓝图空位 (Create:Blueprint Void) + +mo-creatures-legacy@ +sticky-hands +pandalib@ +inventory-spam +@mineproc +slime-merger +configurable-cane +hex-keys@hexkeys +sky-lands@ + +vocalized +@kaleidos|森罗万象 (Kaleidos) + +@advanced-framework|高级框架 (Advanced Framework) + +kubejs-irons-spells +revelationaryjs@ +arche +caverns-and-chasms@ + + +mixinbooster +block-crafting@|方块合成* +zombplayer@ +knighys-mystical-creatures +sign-button +startinv@ +@server-replay +ftb-stoneblock-companion +ash-of-sin-custom-anti-enchantment-entity|罪业余烬:自定义反附魔实体 (Ash Of Sin:Custom Anti Enchantment Entity) +ash-of-sin-anti-high-level-enchantment|罪业余烬:反高级附魔 (Ash Of Sin:Anti High Level Enchantment) +ash-of-sin-custom-anti-item-entity|罪业余烬:自定义反物品实体 (Ash Of Sin:Custom Anti Item Entity) +ash-of-sin-custom-anti-seat-entity|罪业余烬:自定义反坐垫实体 (Ash Of Sin:Custom Anti Seat Entity) +ash-of-sin-custom-entity-anti-effect|罪业余烬:自定义实体反状态效果 (Ash Of Sin:Custom Entity Anti Effect) +ash-of-sin-custom-entity-effect|罪业余烬:自定义实体状态效果 (Ash Of Sin:Custom Entity Effect) +ash-of-sin-custom-entity-item|罪业余烬:自定义实体装备 (Ash Of Sin:Custom Entity Item) +ash-of-sin-eternal-entity|罪业余烬:永恒实体 (Ash Of Sin:Eternal Entity) + +fundamental@ +wendigo +the-super-god-road@|超神之路 (TheSuperGodRoad) +@backrooms + + +storage-delight-forge@storage-delight|存储乐事 (Storage Delight)¨storage-delight-fabric|存储乐事 (Storage Delight) +lightshield@|光之护盾 (LightShield) +sophisticated-core-unofficial-fabric-port@sophisticated-core-(unofficial-fabric-port)|精妙核心(非官方 Fabric 移植) (Sophisticated Core (Unofficial Fabric port)) +sophisticated-backpacks-unofficial-fabric-port@sophisticated-backpacks-(unoffical-fabric-port)|精妙背包 (Sophisticated Backpacks) - 非官方 Fabric 版 +red-power + +@minihud-extra +sophisticated-storage-unofficial-fabric-port@sophisticated-storage-(unofficial-fabric-port)|精妙存储(非官方 Fabric 分支) (Sophisticated Storage (Unofficial Fabric port)) +@oldoredrops +rage-mod@|兴怒* +@disable-all-structures +composite-material|复合材料* +timerecorder@|光阴:莉拉提娅 (TimeRecorder) +bettersmithingtable@ +trajectory-estimation@|弹道估计* + + + + + + + +iron-repair-kits +@susinsert +critters-n-crawlers@ + +epic-stats +brew-chew@brewn-chew +@lummobs +create-ratatouille@|机械动力:齿轮与麦穗 (Create: Ratatouille) +jains-desserts@ +@drizzleproof +@thief-tweaks +the-long-story@ +simple-hud-enhanced@ +vocalized-ayachinene-voice-pack|Vocalized 绫地宁宁语音包 (VocalizedAyachiNeneVoicePack) +the-between-awakens +emc-interface@ +csgo-box|Csgo 箱子 (CsgoBox) +create-oppenheimered@|机械动力:原子计划 (Create: Oppenheimered) +dimension-update-fixer@ +dont-keep-vanishing-items@ +ore-processing-for-tfc +creativepagejump@|创造物品栏页码跳转 (CreativePageJump) +april-fools@ +exmoxl|极墨核心 (exmoxl) + +armortip@ +true-herobrine@ +oam-by-choupiclou2007@ore-and-more-(oam) +squat-grow@ +backported-wolves +betweenlands-extended-config + +deeper-caves@deeper_caves + + + +arborfirmacraft +enchanting-with-tfc +tfc-vessel-tooltip@ +nether-gold-ore +natural-nether-portals +@vanillapotions+ +@wait-of-the-world + +hotbaaaar@|忄夬扌疌木兰 (HotBaaaar) +ui@ui-lib +@random-items +lucky-clover +@better-portals|更好的传送门 (Better Portals) +social-distance@|社交距离* +gt@gtnn +hunger-plus@|饥饿+* +melee-ex-machina-meexma@melee-ex-machina + +arc@ +amlib + +@citymod|我的城市 (City Mod) +too-hard-to-dig@|隐岩砥凿 (Too Hard to Dig) +simplecobblestonegenerator@simple-cobble-gen +natural-baby-animals +essence-mod@essence +shield-expansion-expansion@ + +alexs-caves-trimmed +totem-of-immortality@ +crystalline-ender-eye|晶化末影之眼* +ars-caelum@ +elytra-chestplates|鞘翅之甲* +variants-and-ventures@ +horseshoes@ +questlines@ +endofherobrine@ +thirstcanteen@thirst-canteen|口渴-水壶 (ThirstCanteen) +thaumic-energistics-extended-life-fork + + +prehistoric-nature-decorations +tinyfoes +pyradium +anvilcraft@|铁砧工艺:原版科技 (AnvilCraft) +tiny-mob-farm-remastered@ +create-aquatic-ambitions@ +ffl-trinkets-compat +kaleidios-guns +mc-vr-playground +cosmopolis-mod@cosmopolis +caveopolis-mod@caveopolis_mod +flexipause@ +geysers|间歇泉* +@moar-enchantments +@lose-your-touch +man-of-many-planes@ +caliber-lib@ +@kriforfab +multiscoreboard@ +@minerally-me! +@cover-them-in-armor +jerotes-village|Jerotes村庄* +@a-cold-day-in-the-nether +@translucencyfix +create-ponder@|机械动力: 思索* +mopeds + +advanced-shulkerboxes@ + + +visible-shield-cooldown@|可视化盾牌冷却* +mns-moogs-nether-structures@ +bunker-down +just-enough-guns@ +buildify@ +@big-globe +dragon-finder +respackopts@ +fortuitous-feasts +monazite@|独居石* +music-control|音乐控制* - 不再更新¨@music-control|音乐控制 (Music Control) + + +ash-of-sin-custom-entity-attack-effect|罪业余烬:自定义实体攻击状态效果 (Ash Of Sin:Custom Entity Attack Effect) +ash-of-sin-soul-like-boss-battle|罪业余烬:类魂BOSS战 (Ash Of Sin:Soul Like Boss Battle) +wh40kmc-project + +pixelmon-bank|Pixelmon 银行* +@loosen-litematica +wsmc +no-gui-chest@|沉浸箱子* + +filedirector@ +extra-compat@extracompat +eu-converter@ +royal-variations + +temporal-api@ + + +callable-horse-unofficial-fabric-port|召之马来 Fabric版 (CallableHorse Unofficial Fabric port) + +shiny-horses-forge-enchantable-horse-armor +spartan-weaponry-simpleores|斯巴达的武器:简单矿石 (Spartan Weaponry: SimpleOres) + +dye-depot@ + +@autoharvest|自动收获-重制 (AutoHarvest-RE) +@nyan-cat-loading +@homeward-bound +sword-blocking-mechanics@ +electric-mace@ +mace-backport +@steve-eat-stew +imaginary +kuvalich|赤毒玄骸 (KuvaLich) +ae2-insert-export-card@ +@magick-experience + +@repairable-disc-11 + + +@khinkali-mod +configured-defaults@ +bens-sharks@ +@eqsequipset|装备预设 (EquipSet) +torches-in-water|水中火把 (Torches in Water) +@olderskins|还原旧皮肤 (OlderSkins) + +pigs-with-fireworks +infinityspell|无限魔咒 (InfinitySpell) +multipart-machines-grinding +ash-of-sin-custom-anti-high-atk-entity|罪业余烬:自定义反高攻击力实体 (Ash Of Sin:Custom Anti High ATK Entity) + +@bioforge +quad@ + +@removewelcomescreen|移除欢迎界面 (RemoveWelcomeScreen) + + + +makit-better +macaws-for-terrafirmacraft + + + +@blahaj-of-undying +corals-tfc@ +tfc-aged-alcohol +tfc-improved-badlands +@russian-metro-addon +winter-massacre +ghostlys|幽灵 (Ghostly) +tectonic-tweak +forge-essentials-client@ +@world-host + +spit-splat@ +maced|重锤一击* +nether-villager-trader +@no-exp-enchanting-reimagined +cadmus@ +argonauts@ +giacomos-travelogue +giacomos-maps +descension + +@startup-time|启动时间 (Startup Time) + + +toggledpickup|拾取控制 (Toggled Pickup) +farmers-delight-refabricated@|农夫乐事:重织 (Farmer's Delight Refabricated) +village-nullifier-terralith-mod +village-nullifier-mod +structure-credits-fabric-version@structure-credits +i-wanna-travel +simple-unbreakable-tools +cat-loaf@ +copper-tuff-backport-fabric +@f3scale +giacomos-teleport +giacomos-farmland +back-weapon-slot +chested-companions +create-train-perspective-fix@ +create-metalwork-fabric@create-metalwork + +tragicmc|悲惨世界1 (TragicMC) +auditory-continued@ + +create-more-copycats@ +farlands-reborn@modern-farlands-mod + + +momento@ +prometheus@ + +waystones-jawsawn-fork|传送石碑:Jawsawn版* +nautilium-spirits@|鹦鹉螺重置版* + +@telluriumforge +aquatweaks|水下微调 (AquaTweaks) +aquatweaks-compat|水下微调:兼容 (AquaTweaks Compat) +@potions-re-glint +simpletextoverlay@ +bountiful-fares@|丰饶食记* +@ancient-debris-tweak|远古残骸微调 (Ancient Debris Tweak) + + +crydolph +anti-id-conflict|反ID冲突* +confighelper|配置助手 (config helper) +better-boat|更好的船* +weighted-inventories|物品栏重量* +detected-setblock-be-gone@dsbg +@hexical +tabula-minecraft-modeler +glow-sticks@|荧光棒* +alt-hud + +furniture-expanded@ +celestora@ +geckolib-unofficial-1-7-10@geckolib-unofficial|Geckolib:非官方版 (Geckolib-Unofficial) +cnpc-custom-model-addon@customnpc-plus-gecko-addon|自定义NPC+: Gecko 附属 (CNPC+ Gecko Addon) +cnpc-armorers-workshop-addon@customnpc-plus-aw-addon|自定义NPC+ :时装工坊附属 (CNPC+ Armorer's Workshop Addon) + +fusion-smithing@|融锻* +leos-loot-bag@loot-bag|战利品袋 (Loot Bag) +adventure-dimensions|冒险维度* +simple-dimensions|简单维度* +portals-gui@|传送门GUI* +interworlds-splashscreens@|进入维度加载界面* +@creative-menu-tweaks +vampires-delight@ +thats-my-bed@ +caligo@ +@sharpenedswords + +donut-and-mochi +ducky@ducky! +lost-idols +simple-trashcan@ +darwin-water-ambience +decorative-wooden-lattices +apotheotic-additions +lithosphere + +build-your-campfire +biome-decoration-fix +simply-tools@ +immersive-snowgen@isg|沉浸式雪生成* +the-wandering-gambler +cheatdetector@|作弊检测器 (CheatDetector) +just-another-spawner +stack-size-edit-fabric@stack-size-edit +@remote-resource-pack|远程资源包 (Remote Resource Pack) + +battery-shield|电池护盾* +giacomos-chat-fix +giacomos-compass +giacomos-experience-drainer +@frank +load-my-resources-forge@load-my-resources¨load-my-resources-fabric +apotheotic-creation@apotheoticcreation + + +eiorecipesteinductionsmelter + +ash-of-sin-better-ai|罪业余烬:更好的AI (Ash Of Sin:Better AI) +dimensional-cake-rebuilt@dimensional-cake-rebaked +medieval-village-dimension +create-big-contraptions@big-contraptions + +rose-gold-equipment@ + +pantheonsent@ +@yukkuri + + +@moddetectionpreventer +dramatic-spawning +all-mobs-attack-villagers +cicada@ + +immersive-cvm +no-gui-fd@|沉浸乐事 (No Gui FD) +custom-credits@ +fishing-life|钓鱼生活 (FishingLife) + +@crystalcarpetaddition +hoes-are-scythes@ +@pehkuirandomsize +chat-ping@ping-santa + +damage-number|伤害数字显示* + +mineshot-reforged|高清截图Forge* +krysztal-language-scala@ +filters-api@ + +flavored@ +huesodewiki +platos-transporters +plushie-reeker-mod +semi-hardcore +placeables@ +bigbanana|🍌大香蕉🍌 (BigBanana) +@dabaosword|大宝刀 (DabaoSword) +@look +@salmonberry-addition +pet-collecting@ +@yummy_glass + +totallybalancedfallflying +giacomos-experience-seedling +@server-notify +config-api +nethers-delight-refabricated@|下界乐事:重织* +@pumpkin-pie-delight +tipsylib@ +dragon-mounts-more-dragons@|龙骑士附属:更多龙 (Dragon Mounts: More Dragons) + + +hey-wiki@|嘿Wiki* +turf@ +ad-extendra@ad_extendra +smava +zwieback +random-respawn +@telluriums-random-stuff +per-aspera@ +spice-of-life-valheim-edition@mKalCkNV +tfc-paths +binkers-bonstruct +ranged-weapon-api@ +numismatics@ + + +canned-foods-and-drinks +alexs-caves-dimension +villager-contracts@ +better-agriculture +soul-shards-respawn-patched +tfc-finger-in-the-wind +immersive-craft-patched +jockeys@ +disguiselib@ +@mtr-resource-protector|MTR 资源包保护工具 (MTR Resource Protector) +station-architecture + +enchantmentrequirements +enchantment-enhancements@ +mo-enchantments +soul-like-enchantment + +@blockbench-import-library +mrcrayfish-furniture-mod-legacy +btfixes +vmfixes +pillar-patched +novalogin|新星登录 (Nova Login) +tfc-desire-paths +tfc-ore-washing +tfc-hot-or-not +tfc-canes +lhmob-difficulty-increase|变强的怪物 (LH Mob Difficulty Increase) +@zombies-are-real-reforged +from-the-shadow-reborn +@life-crystals + +the-slumbering-omen@ + + +ftb-guides-forge¨ftb-guides-legacy-forge|FTB Guides - 旧版 +@titaniumod|钛 (Titanium) +caelum@ +clearspam +ad-astra-rocketed@ +soulbound-quilt@soulbound +tinyinv@¨tinyinv-fabric +animationjs@ +raids-backport +crossbows-backport +tfc-caelum +epic-compat-parcool +loqui@ +real-worlds + +dragonlib@ +andromeda@|群星* + +@superauth|超级授权 (SuperAuth) +mobdisguises@ +inventory-generators +creating-space-gravity-addon +alexs-caves-torpedoes@alexscaves-torpedoes + + +@slavic-cuisine +tfc-tumbleweed +tfc-barrens +chiselse-bits-for-tfc@chisels-bits-for-tfc +tfc-fresh-water-everywhere +tfc-more-swords +galleria@ +constructs-casting@ + + +delicious-delights +@vietnamsdelight +harvest-tweaks +decay-2012 +tfc-grooming-station +terrafirmagregtech-ores +blaze-map +epic-knights-japanese-armory +tfcpyros-adjustedgen +astikor-carts-tfc-florae +exp-counter-fabric-forge-neoforge@exp-counter +lightwithin@ +the-slenderman-mod@the-slenderman +flanchanmod + +cartography +laser-bridges-doors@wz31BboV +lukis-grand-capitals@ +fabric-create-netherless +create-connected-fabric-experimental@create-connected-fabric + +wastify@ +starter-structure@|初始建筑* + +mobblocker@ +giacomos-foundry +@blocky-bass +@toms-mobs +@homoium +alex-cave-addon + + +iced-lava@ +fabric-core-mods +the-tropics-telepastry +carrot-apple|胡萝卜苹果* +baked-delight|烘烤乐事* +create-basic-additions@ +horse-stats-and-more +giacomos-hud-overlays-configurator +giacomos-map-coloring +ec-epic-fight-compat@ec-ef-compat +easy-npc-epic-fight@ +puffish-attributes@attributes +pufferfishs-unofficial-additions@ +smart-completion +additional-attributes@ +@hexed + + + +suicide-key + +@mcrconvertlib +@annotationlib +@waxed +nether-overload +ender-relay@ender-relay-ff +enchanted-effects +emi-create-schematics@ +the-silence@ +infinite-music-fabric@infinite-music +kakapos@ +@tome-reader +scary-creepers@ +@show-my-skin-parts +sn0wfrogs-capybaras@sn0wfrogscapybaras +enemybanner@|敌怪旗 (EnemyBanner) + +souls-egg +barely-enough-enchantments +tool-kit@ +@filament +lijms-armory@ +tinker-delight +barbeques-delight@|烧烤乐事 (Barbeque's Delight) +coffeecraft-by-blockbrothers@coffeecraft +hearty-meals@ +@minecar-drill + +enderfake +@alwaysonline + + + +entityjs@ +@poem-of-star-wars +@hex-ways +vanity-aesthetic-armory@ +@muffins-thais-delight +@moreusefulcopper|更有用的铜 (MoreUsefulCopper) + +animals-plus +giacomos-map-merging +giacomos-spyglass-10-90x15 +exquisite-packing@|精致包装* +@la-cucaracha +grieflogger@ + +the-quest-of-entity-303 + +@quick-chat|快捷聊天 (Quick Chat) +magic-vibe-decorations@ +valentines-blessing@valentines-blessing-lilypads-roses +decent-biomes@ +d-placeable-food-fabric-forge@3d-placeable-food +fan-shaped-cake@fan-shaped-cake-mod +dried-spice@ +richards-coffee-tea-mod@richards-coffee-and-tea-mod +ribes-adventures@ + +@cell +packed-up@ +hexcircus@hex-circus +diamond-chest-shops@ + +better-clouds-reforged +excessive-building@ +modchu_modchulib +@samhackers-command-gui +no-slime-in-flat-world@ +icarae-origin@ + +@consoles + +fsit@ +carbon-config@ +productivetrees@ +@tsa-concrete +@tsa-planks +@tsa-stone +stellarview@ +biome-cows@ +simple-stopwatch +liolib@ +giacomos-better-dye +ash-of-sin-custom-anti-trap-cage-entity|罪业余烬:自定义反捕捉笼实体 (Ash Of Sin:Custom Anti Trap Cage Entity) +elementus@ +dedicated-bud + +vanity-twilight-zone@|Vanity:晨昏线 (Vanity: Twilight Zone) +tfc-barrels +melter@ +armour +speedometer-and-more +ash-of-sin-anti-same-modifier|罪业余烬:反重复修饰符 (Ash Of Sin:Anti Same Modifier) +giacomos-automatable-cauldrons +giacomos-bookshelf +no-outbreaks@ +nemos-woodcutter@ +command-button + + + +exp-ore@|经验矿石* +@hexpigmentplus +starcrop +the-social + +goety-mythical-addon +huge-structure-blocks@ + +bodyhygiene +cafes-birding@ +kafs-valentine-special@ +create-deepfried@ +sleepable-create +create-railways-navigator@ +speed-drifter@speed_drifters|MC飞车 (MCSpeed) + +rearmour +lionfish-api + +avaritia-universal +slash-blade-tweaker +guns-without-roses-additions@ +cleanview¨cleanview-fabric +built@ +diyotweaks +extra-spell-attributes@extra-rpg-attributes +@create-contraption-creatures +immersive-vehicles-iv-mts-texel-arsenal-pack@mts-ivv +creature-whisperer + + +create-molten-metals@ +create-optical +@farmers-delight-plus + + + +mob-battle-music@|战斗音乐* + + +@invisible-frames-for-forge +factions-and-curiosities@ +@anyfps +@create-amazing-trading + + +westeroscraft-worldeditcui + +durability-display@ +hardrock-samples-tfc + + + +treps-cars@ + +back-up-beds@ + + + + + + + +vinery-tfc +tkbs-campfires + + +whispers-of-the-wendigo@ +quartz-elevator@ +elytra-utilities@¨elytra-utilities-fabric + +kubejs-natures-aura@ +fancymenu-system-interactions-addon@ +control-engineering@ +wooden-furnace-fabric@woodenfurnace +jjthunder-to-the-max +telepass@ +offhandbanning|禁手令 (Off Hand Banning) +fantasy-craft|幻想工艺 (FantasyCraft) +breeding-potion@|繁殖药水* + +loading-tips|加载提示 (Loading Tips / Pineapple Tips) +@highernether|更高的下界 (Higher Nether) +better-one-block|更好的单方块* +the-fletching-table-mod@ +@create-militarized + + +sword-soaring|御剑飞行* +bigger-ae2@ +scalar +trials-towers@|试炼高塔* +blus-sign-pack-mts-iv +alexs-mediumcore@ +sherdsapi@ +@kontraption +musketeer-illager + + +bananarangs@ +remorphed@ +particle-core@ +fermiumbooter@ +ytech +@bbrb +@mcterra +siren-head-the-arrival +classic-musical-discs@ +music-notification@ +orechidendium|影矿兰 (Orechid Endium) +bones +my-nethers-delight@ +localizator@ +scorchful@|焦土* +marbleds-api-mapi@ + +magma-bucket|岩浆桶* +ropes +paniclecraft +cpmpvc@|自定义玩家名称Plasmo语音兼容 (Customizable Player Models Plasmo Voice compat) +ydms-gunblades-mod@ydms-gunblades +warp-pads@warppads +marbleds-arsenal@marbledsarsenal +@inventory-tabs +mob-spawning-fix +lh-miracle-road|奇迹之路之魂系加点 (LH Miracle Road) + +compatskills-fork +reskillable-fork + +@subtick +electroblobs-wizardry-continuation|巫术学:延续 (Electroblob's Wizardry Continuation) +agricraft-continuation +create-nuke@ +egg-particle-fix|鸡蛋粒子修复* +chicken-chunk-patcher +achievement-detection-fix|成就检测修复* +@auto-night-vision|自动夜视 (Auto Night Vision) +@chais-inventory-sorter + + + + + +witcherypatch@|巫术补丁 (WitcheryPatch) +pin +simple-pings@ +great-scrollable-tooltips +waterframes@ +eugenes-whistle-spur|友止殷的马哨和马刺 (Eugene's Whistle & Spur) + +minecraft-mineralogy +seed-delight|种子乐事* +transmog@|幻化* +nuclear-guitars +cubic-racers + +delightful-sandwiches@ +shader-fixer@|光影修复 (Shader fixer) +resiever@ +cartload@ +stewing-baking@|炖与烤 (Stewing & Baking) +am2playground@ +@astrocraft + +neat-shaders-fix@|极简血量显示 - 光影修复 (Neat - Shaders-Fix) +worldtooltips-shadersfix@|掉落物信息显示 - 光影修复 (WorldTooltips - ShadersFix) + +options-enforcer@ +macaws-bridges-biome-o-plenty@|Macaw的桥梁:超多生物群系附属 (Macaw's Bridges - Biomes O' Plenty) +renhider@ +itemframeremover@|物品展示框移除器 (ItemFrameRemover) +@legacy-debug-pause +trick-or-treat +ninjin-entities-by-hedaox +dangerrpg-continuation@|危险RPG:延续 (DangerRPG Continuation) +zelda-sword-skills-continuation@|塞尔达剑技:延续* +@forgotten-relics-unofficial|失落遗物学:非官方 (Forgotten Relics Unofficial) +mc-mods-enhanced|截图增强 (Screenshots Enhanced) +the-rings-of-power@|力量之戒/魔戒众戒 (The Rings of Power) + +@fancy-delight +@salt-fabric +suspicious-zombification@ + +ivtoolkit-arcana-rpg-continuation-edition|IvToolkit:延续 (IvToolkit Arcana Rpg Continuation Edition) + +@byzh-picgen|byzh's 麦块画图 (BYZH's Picgen) +tropicraft-continuation|热带世界:延续* +battle-tower-continuation|战斗高塔:延续* +kswitch +tfc-lumberjack +tfc-better-stone-tools +protons-additions +kinetic-anti-cheat@kac +where-are-the-ores@ +underp-hangables@ +doggy-talent-continuation@doggy-talents-continuation|小狗天才:延续 (Doggy Talents Continuation) +mod-observer@ +mineralogy-continuation@ +ubc-ore-registrar|科学地质:矿石注册 (UBC Ore Registrar) +genesis-2d|创世纪 (Genesis) + +radiation-zone|辐辽地带* + +adventure-backpacks-patched|探索者背包:延续* +@thaumcraftaltarcull + +bhops@ +from-spores +just-dire-things +hit-feedback|攻击反馈* +@hasoook +middle-earth@|中洲 (Middle-earth) +windows-keyboard-fixes-fixes-sticky-keys@|Windows 键盘修复 - 粘滞键 (Windows Keyboard Fixes - Fixes sticky keys) +statuesmod-fix@statuesmodfix|雕像模组-修复 (StatuesMod Fix) +@numericaltabping + +sanguine-arsenal-reforged|血染武装重铸版* +respawn-obelisks +flintandsteel-improve +forge-zombie-plague-mod-2-wip@zombie-plague-2-hardcore-zombie-apocalypse +colored-grasses +more-default-options \ No newline at end of file diff --git a/Plain Craft Launcher 2/app.manifest b/Plain Craft Launcher 2/app.manifest index bb8082f..2d4820f 100644 --- a/Plain Craft Launcher 2/app.manifest +++ b/Plain Craft Launcher 2/app.manifest @@ -29,8 +29,8 @@ - - + @@ -38,7 +38,7 @@ - + diff --git a/README.md b/README.md index 53b82ec..d5b2391 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,27 @@ -## Plain Craft Launcher 2 源代码库 +# Plain Craft Launcher 源代码库 + +[![Stars](https://img.shields.io/github/stars/Hex-Dragon/PCL2?style=flat&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTggLjI1YS43NS43NSAwIDAgMSAuNjczLjQxOGwxLjg4MiAzLjgxNSA0LjIxLjYxMmEuNzUuNzUgMCAwIDEgLjQxNiAxLjI3OWwtMy4wNDYgMi45Ny43MTkgNC4xOTJhLjc1MS43NTEgMCAwIDEtMS4wODguNzkxTDggMTIuMzQ3bC0zLjc2NiAxLjk4YS43NS43NSAwIDAgMS0xLjA4OC0uNzlsLjcyLTQuMTk0TC44MTggNi4zNzRhLjc1Ljc1IDAgMCAxIC40MTYtMS4yOGw0LjIxLS42MTFMNy4zMjcuNjY4QS43NS43NSAwIDAgMSA4IC4yNVoiIGZpbGw9IiNlYWM1NGYiLz48L3N2Zz4=&logoSize=auto&label=Stars&labelColor=666666&color=eac54f)](https://github.com/Hex-Dragon/PCL2/) +[![Issues](https://img.shields.io/github/issues/Hex-Dragon/PCL2?style=flat&label=Issues&labelColor=666666&color=1a7f37)](https://github.com/Hex-Dragon/PCL2/issues) +[![爱发电](https://img.shields.io/badge/赞助-%E7%88%B1%E5%8F%91%E7%94%B5-946ce6?style=flat&labelColor=666666&logoSize=auto)](https://afdian.net/@LTCat) + +
+ +## 介绍 这里提供了 PCL 的大多数源代码,包括 UI 库、动画模块、下载模块、Minecraft 启动模块等! -PCL 的代码绝大多数其实都是几年前学生时代的产物了……那时候英语还不过关……所以经常出现奇葩命名,还有令人高血压的高耦合啊,没做单例啊,瞎勾八乱糊啊之类的问题……额,我也不可能把这一堆玩意儿再从头写一次,各位就基于能跑就行的原则凑合凑合着看吧,求求别喷了(run +PCL 的代码绝大多数其实都是几年前学生时代的产物了……那时候英语还不过关……所以经常出现奇葩命名,还有令人高血压的高耦合啊,没做单例啊,瞎勾八乱糊啊之类的问题……额,我也不可能把这一堆玩意儿再从头写一次,各位就基于能跑就行的原则凑合凑合着看吧,求求别喷了…… -你也可以丢 Pull Request,虽然这个源代码库并不能直接编译,但一些简单的修改应该还是没问题的…… +
-  - -**相关内容:** +## 相关内容 - [PCL 功能投票](https://github.com/Hex-Dragon/PCL2/discussions/2):来参加投票吧,开发者会优先处理票数较高的帖子! - [程序下载](https://afdian.net/p/0164034c016c11ebafcb52540025c377):下载免费的正式版 PCL。 - [帮助文档库](https://github.com/LTCatt/PCL2Help):PCL 帮助文档在 GitHub 上的存储库(是的,帮助库在另一个 Repo……) -  +
-**一些无趣的小细节:** -- 别想在这里面找到解密游戏的线索,那部分的代码被我抠掉了(笑) -- 哦,对,解锁隐藏主题的相关代码也都被抠掉了,所以别想着用翻源代码这种歪门邪道来绕过解密了.jpg +## 一些无趣的小细节 +- 别想在这里面找到解密游戏的线索,那部分的代码被我抠掉了 +- 解锁隐藏主题的相关代码也被抠掉了,所以别想着用翻源代码这种歪门邪道来绕过解密了.jpg - 源代码库并不是即时更新的,而是在每次 PCL 发布更新时(手动)同步一次 diff --git a/最新正式版.zip b/最新正式版.zip index c2b3630..0f9b6af 100644 Binary files a/最新正式版.zip and b/最新正式版.zip differ