diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index f4820c8..1a92a45 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,3 @@ # These are supported funding model platforms -custom: ['https://afdian.com/a/LTCat'] +custom: ['https://meloong.com/afd/a/LTCat'] diff --git a/Plain Craft Launcher 2/Application.xaml b/Plain Craft Launcher 2/Application.xaml index 3d5488f..26d0ed6 100644 --- a/Plain Craft Launcher 2/Application.xaml +++ b/Plain Craft Launcher 2/Application.xaml @@ -365,7 +365,7 @@ - + diff --git a/Plain Craft Launcher 2/Application.xaml.vb b/Plain Craft Launcher 2/Application.xaml.vb index e2540b0..8f3548b 100644 --- a/Plain Craft Launcher 2/Application.xaml.vb +++ b/Plain Craft Launcher 2/Application.xaml.vb @@ -51,15 +51,6 @@ Public Class Application Else Environment.Exit((My.Computer.Info.AvailablePhysicalMemory - Ram) / 1024) '返回清理的内存量(K) End If -#If DEBUG Then - '制作更新包 - ElseIf e.Args(0) = "--edit1" Then - ExeEdit(e.Args(1), True) - Environment.Exit(ProcessReturnValues.TaskDone) - ElseIf e.Args(0) = "--edit2" Then - ExeEdit(e.Args(1), False) - Environment.Exit(ProcessReturnValues.TaskDone) -#End If End If End If '初始化文件结构 @@ -73,7 +64,7 @@ Public Class Application MyMsgBox("PCL 无法访问缓存文件夹,可能导致程序出错或无法正常使用!" & vbCrLf & vbCrLf & "错误原因:" & ex.GetDetail(), "缓存文件夹不可用") Else MyMsgBox("手动设置的缓存文件夹不可用,PCL 将使用默认缓存文件夹。" & vbCrLf & vbCrLf & "错误原因:" & ex.GetDetail(), "缓存文件夹不可用") - Setup.Set("SystemSystemCache", "") + Settings.Set("SystemSystemCache", "") PathTemp = IO.Path.GetTempPath() & "PCL\" End If End Try @@ -114,7 +105,7 @@ WaitRetry: ServicePointManager.EnableDnsRoundRobin = True ServicePointManager.ReusePort = True '设置初始窗口 - If Setup.Get("UiLauncherLogo") Then + If Settings.Get("UiLauncherLogo") Then FrmStart = New SplashScreen("Images\icon.ico") FrmStart.Show(False, True) End If @@ -132,18 +123,12 @@ WaitRetry: Log($"[Start] 管理员权限:{IsAdmin()}") '检测异常环境 If Path.Contains(IO.Path.GetTempPath()) OrElse Path.Contains("AppData\Local\Temp\") Then - MyMsgBox("请将 PCL 从压缩包中解压后再使用!" & vbCrLf & "如果不会解压,可以在网上寻找教程。", "尚未解压", "我知道了", IsWarn:=True) + MyMsgBox("请将 PCL 从压缩包中解压后再使用!" & vbCrLf & "如果不会解压,可以在网上寻找教程。", "需要解压!", "我知道了", IsWarn:=True, ForceWait:=True) FormMain.EndProgramForce(ProcessReturnValues.Cancel) End If If Is32BitSystem Then MyMsgBox("PCL 和新版 Minecraft 均不再支持 32 位系统,部分功能将无法使用。" & vbCrLf & "非常建议重装为 64 位系统后再进行游戏!", "环境警告", "我知道了", IsWarn:=True) End If - '设置初始化 - Setup.Load("SystemDebugMode") - Setup.Load("SystemDebugAnim") - Setup.Load("ToolDownloadThread") - Setup.Load("ToolDownloadCert") - Setup.Load("ToolDownloadSpeed") '计时 Log("[Start] 第一阶段加载用时:" & GetTimeMs() - ApplicationStartTick & " ms") ApplicationStartTick = GetTimeMs() @@ -165,7 +150,7 @@ WaitRetry: '结束 Private Sub Application_SessionEnding(sender As Object, e As SessionEndingCancelEventArgs) Handles Me.SessionEnding - FrmMain.EndProgram(False) + FrmMain?.EndProgram(False) End Sub '异常 @@ -228,36 +213,36 @@ WaitRetry: '控件模板事件 Private Sub MyIconButton_Click(sender As Object, e As EventArgs) - Select Case Setup.Get("LoginType") + Select Case Settings.Get("LoginType") Case McLoginType.Ms '微软 - Dim MsJson As JObject = GetJson(Setup.Get("LoginMsJson")) + Dim MsJson As JObject = GetJson(Settings.Get("LoginMsJson")) MsJson.Remove(sender.Tag) - Setup.Set("LoginMsJson", MsJson.ToString(Newtonsoft.Json.Formatting.None)) + Settings.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 '离线 Dim Names As New List(Of String) - Names.AddRange(Setup.Get("LoginLegacyName").ToString.Split("¨")) + Names.AddRange(Settings.Get("LoginLegacyName").ToString.Split("¨")) Names.Remove(sender.Tag) - Setup.Set("LoginLegacyName", Join(Names, "¨")) + Settings.Set("LoginLegacyName", Names.Join("¨"c)) FrmLoginLegacy.ComboName.ItemsSource = Names FrmLoginLegacy.ComboName.Text = If(Names.Any, Names(0), "") Case Else '第三方 - Dim Token As String = GetStringFromEnum(Setup.Get("LoginType")) + Dim Token As String = GetStringFromEnum(Settings.Get("LoginType")) Dim Dict As New Dictionary(Of String, String) Dim Names As New List(Of String) Dim Passs As New List(Of String) - If Not Setup.Get("Login" & Token & "Email") = "" Then Names.AddRange(Setup.Get("Login" & Token & "Email").ToString.Split("¨")) - If Not Setup.Get("Login" & Token & "Pass") = "" Then Passs.AddRange(Setup.Get("Login" & Token & "Pass").ToString.Split("¨")) + If Not Settings.Get("Login" & Token & "Email") = "" Then Names.AddRange(Settings.Get("Login" & Token & "Email").ToString.Split("¨")) + If Not Settings.Get("Login" & Token & "Pass") = "" Then Passs.AddRange(Settings.Get("Login" & Token & "Pass").ToString.Split("¨")) For i = 0 To Names.Count - 1 Dict.Add(Names(i), Passs(i)) Next Dict.Remove(sender.Tag) - Setup.Set("Login" & Token & "Email", Join(Dict.Keys, "¨")) - Setup.Set("Login" & Token & "Pass", Join(Dict.Values, "¨")) + Settings.Set("Login" & Token & "Email", Dict.Keys.Join("¨"c)) + Settings.Set("Login" & Token & "Pass", Dict.Values.Join("¨"c)) Select Case Token Case "Nide" FrmLoginNide.ComboName.ItemsSource = Dict.Keys diff --git a/Plain Craft Launcher 2/Controls/Behaviors/LazyLoadBehavior.vb b/Plain Craft Launcher 2/Controls/Behaviors/LazyLoadBehavior.vb index c9e2990..100bf59 100644 --- a/Plain Craft Launcher 2/Controls/Behaviors/LazyLoadBehavior.vb +++ b/Plain Craft Launcher 2/Controls/Behaviors/LazyLoadBehavior.vb @@ -1,18 +1,17 @@ -Public Module LazyLoadBehavior +Public Class LazyLoadBehavior ''' ''' 指定首次进入 ScrollViewer 的可视范围时执行的操作。 ''' - - Public Sub OnFirstEnterScrollViewerViewport(obj As DependencyObject, value As Action) + Public Shared Sub OnFirstEnterScrollViewerViewport(obj As DependencyObject, value As Action) obj.SetValue(IsInViewportProperty, value) End Sub - Private ReadOnly IsInViewportProperty As DependencyProperty = + Private Shared ReadOnly IsInViewportProperty As DependencyProperty = DependencyProperty.RegisterAttached("IsInViewport", GetType(Action), GetType(LazyLoadBehavior), New PropertyMetadata(Nothing, AddressOf OnIsInViewportChanged)) - Private Sub OnIsInViewportChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs) + Private Shared Sub OnIsInViewportChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs) Dim Element = TryCast(d, FrameworkElement) If Element Is Nothing OrElse e.NewValue Is Nothing Then Return @@ -36,7 +35,7 @@ AddHandler Element.LayoutUpdated, Handler End Sub - Private Function FindParentScrollViewer(d As DependencyObject) As ScrollViewer + Private Shared Function FindParentScrollViewer(d As DependencyObject) As ScrollViewer While d IsNot Nothing If TypeOf d Is ScrollViewer Then Return CType(d, ScrollViewer) d = VisualTreeHelper.GetParent(d) @@ -44,4 +43,4 @@ Return Nothing End Function -End Module +End Class diff --git a/Plain Craft Launcher 2/Controls/MyCheckBox.xaml.vb b/Plain Craft Launcher 2/Controls/MyCheckBox.xaml.vb index 3703419..bfcf1ea 100644 --- a/Plain Craft Launcher 2/Controls/MyCheckBox.xaml.vb +++ b/Plain Craft Launcher 2/Controls/MyCheckBox.xaml.vb @@ -2,6 +2,7 @@ Public Class MyCheckBox + Implements ISettingControl '基础 @@ -72,7 +73,7 @@ Public Class MyCheckBox AaScale(ShapeBorder, 6, AnimationTimeOfCheck * 2, AnimationTimeOfCheck * 0.7, New AniEaseOutBack, , True) }, "MyCheckBox Scale " & Uuid) AniStart({ - AaColor(ShapeBorder, Border.BorderBrushProperty, If(IsEnabled, If(IsMouseOver, "ColorBrush3", "ColorBrush2"), "ColorBrushGray4"), AnimationTimeOfCheck) + AaColor(ShapeBorder, Border.BorderBrushProperty, If(IsEnabled, If(IsMouseOver, "ColorBrush3", "ColorBrush2"), "ColorBrushGray5"), AnimationTimeOfCheck) }, "MyCheckBox BorderColor " & Uuid) AniStart({ AaCode(Sub() AllowMouseDown = True, AnimationTimeOfCheck * 2) @@ -85,7 +86,7 @@ Public Class MyCheckBox AaScale(ShapeBorder, 6, AnimationTimeOfCheck * 2, AnimationTimeOfCheck * 0.7, New AniEaseOutBack, , True) }, "MyCheckBox Scale " & Uuid) AniStart({ - AaColor(ShapeBorder, Border.BorderBrushProperty, If(IsEnabled, If(IsMouseOver, "ColorBrush3", "ColorBrush1"), "ColorBrushGray4"), AnimationTimeOfCheck) + AaColor(ShapeBorder, Border.BorderBrushProperty, If(IsEnabled, If(IsMouseOver, "ColorBrush3", "ColorBrush1"), "ColorBrushGray5"), AnimationTimeOfCheck) }, "MyCheckBox BorderColor " & Uuid) AniStart({ AaCode(Sub() AllowMouseDown = True, AnimationTimeOfCheck * 2) @@ -99,11 +100,11 @@ Public Class MyCheckBox If Checked Then CType(ShapeCheck.RenderTransform, ScaleTransform).ScaleX = 1 CType(ShapeCheck.RenderTransform, ScaleTransform).ScaleY = 1 - ShapeBorder.SetResourceReference(Border.BorderBrushProperty, If(IsEnabled, "ColorBrush2", "ColorBrushGray4")) + ShapeBorder.SetResourceReference(Border.BorderBrushProperty, If(IsEnabled, "ColorBrush2", "ColorBrushGray5")) Else CType(ShapeCheck.RenderTransform, ScaleTransform).ScaleX = 0 CType(ShapeCheck.RenderTransform, ScaleTransform).ScaleY = 0 - ShapeBorder.SetResourceReference(Border.BorderBrushProperty, If(IsEnabled, "ColorBrush1", "ColorBrushGray4")) + ShapeBorder.SetResourceReference(Border.BorderBrushProperty, If(IsEnabled, "ColorBrush1", "ColorBrushGray5")) End If End If End Sub @@ -178,18 +179,18 @@ Public Class MyCheckBox Else '不可用 AniStart({ - AaColor(ShapeBorder, Border.BorderBrushProperty, ColorGray4 - ShapeBorder.BorderBrush, AnimationTimeOfMouseOut) + AaColor(ShapeBorder, Border.BorderBrushProperty, ColorGray5 - ShapeBorder.BorderBrush, AnimationTimeOfMouseOut) }, "MyCheckBox BorderColor " & Uuid) AniStart({ - AaColor(LabText, TextBlock.ForegroundProperty, ColorGray4 - LabText.Foreground, AnimationTimeOfMouseOut) + AaColor(LabText, TextBlock.ForegroundProperty, ColorGray5 - LabText.Foreground, AnimationTimeOfMouseOut) }, "MyCheckBox TextColor " & Uuid) End If Else '无动画 AniStop("MyCheckBox TextColor " & Uuid) AniStop("MyCheckBox BorderColor " & Uuid) - LabText.SetResourceReference(TextBlock.ForegroundProperty, If(Me.IsEnabled, "ColorBrush1", "ColorBrushGray4")) - ShapeBorder.SetResourceReference(Border.BorderBrushProperty, If(Me.IsEnabled, If(Checked, "ColorBrush2", "ColorBrush1"), "ColorBrushGray4")) + LabText.SetResourceReference(TextBlock.ForegroundProperty, If(Me.IsEnabled, "ColorBrush1", "ColorBrushGray5")) + ShapeBorder.SetResourceReference(Border.BorderBrushProperty, If(Me.IsEnabled, If(Checked, "ColorBrush2", "ColorBrush1"), "ColorBrushGray5")) End If End Sub Private Sub Checkbox_MouseEnterAnimation() Handles Me.MouseEnter @@ -203,11 +204,27 @@ Public Class MyCheckBox Private Sub Checkbox_MouseLeaveAnimation() Handles Me.MouseLeave If Not IsEnabled Then Return 'MouseLeave 比 IsEnabledChanged 后执行,所以如果自定义事件修改了 IsEnabled,将导致显示错误 AniStart({ - AaColor(LabText, TextBlock.ForegroundProperty, If(Me.IsEnabled, "ColorBrush1", "ColorBrushGray4"), AnimationTimeOfMouseOut) + AaColor(LabText, TextBlock.ForegroundProperty, If(Me.IsEnabled, "ColorBrush1", "ColorBrushGray5"), AnimationTimeOfMouseOut) }, "MyCheckBox TextColor " & Uuid) AniStart({ - AaColor(ShapeBorder, Border.BorderBrushProperty, If(Me.IsEnabled, If(Checked, "ColorBrush2", "ColorBrush1"), "ColorBrushGray4"), AnimationTimeOfMouseOut) + AaColor(ShapeBorder, Border.BorderBrushProperty, If(Me.IsEnabled, If(Checked, "ColorBrush2", "ColorBrush1"), "ColorBrushGray5"), AnimationTimeOfMouseOut) }, "MyCheckBox BorderColor " & Uuid) End Sub +#Region "设置" + + Private Sub RefreshSetting(NewValue As String) Implements ISettingControl.RefreshSetting + Checked = Boolean.Parse(NewValue) + End Sub + + Private Function GetCurrentSetting() As String Implements ISettingControl.GetCurrentSetting + Return Checked.ToString + End Function + + Private Sub SaveSetting() Handles Me.Change + SettingService.SaveSetting(Me) + End Sub + +#End Region + End Class diff --git a/Plain Craft Launcher 2/Controls/MyComboBox.vb b/Plain Craft Launcher 2/Controls/MyComboBox.vb index 69f7ae2..db7ea71 100644 --- a/Plain Craft Launcher 2/Controls/MyComboBox.vb +++ b/Plain Craft Launcher 2/Controls/MyComboBox.vb @@ -1,5 +1,6 @@ Public Class MyComboBox Inherits ComboBox + Implements ISettingControl Public Event TextChanged(sender As Object, e As TextChangedEventArgs) '基础 @@ -137,4 +138,44 @@ If IsLoaded AndAlso AniControlEnabled = 0 Then RaiseCustomEvent() End Sub +#Region "设置" + + Private Sub RefreshSetting(NewValue As String) Implements ISettingControl.RefreshSetting + Dim TargetItem = Items.OfType(Of DependencyObject)().FirstOrDefault(Function(i) Val(If(SettingService.GetValue(i), -1)) = NewValue) + If TargetItem IsNot Nothing Then + SelectedItem = TargetItem + ElseIf Items.Count > NewValue Then + SelectedIndex = NewValue + Else + Log($"[Setting] 尝试显示设置 {SettingService.GetKey(Me)},但没有找到设置值 {NewValue} 的对应项", LogLevel.Debug) + SelectedIndex = -1 + SelectedItem = Nothing + 'Dim Key As String = SettingService.GetKey(Me) + 'Dim DefaultValue = Settings.GetDefault(Key) + 'If DefaultValue = NewValue Then + ' Log($"[Setting] 尝试显示设置 {Key},但没有找到设置值 {NewValue} 的对应项,这可能是因为程序版本太老了", LogLevel.Hint) + 'Else + ' Log($"[Setting] 尝试显示设置 {Key},但没有找到设置值 {NewValue} 的对应项,已重置该设置", LogLevel.Debug) + ' Settings.Reset(Key) + ' RefreshSetting(DefaultValue) + 'End If + End If + End Sub + + Private Function GetCurrentSetting() As String Implements ISettingControl.GetCurrentSetting + If SelectedItem Is Nothing Then Return Nothing + If TypeOf SelectedItem Is DependencyObject Then + Return Val(If(SettingService.GetValue(SelectedItem), SelectedIndex)) + Else + Return SelectedIndex + End If + End Function + + Private Sub SaveSetting() Handles Me.SelectionChanged + If SelectedItem Is Nothing Then Return + SettingService.SaveSetting(Me) + End Sub + +#End Region + End Class diff --git a/Plain Craft Launcher 2/Controls/MyHint.xaml.vb b/Plain Craft Launcher 2/Controls/MyHint.xaml.vb index 7171cab..9724691 100644 --- a/Plain Craft Launcher 2/Controls/MyHint.xaml.vb +++ b/Plain Craft Launcher 2/Controls/MyHint.xaml.vb @@ -99,19 +99,22 @@ Public Class MyHint End Property Public Property RelativeSetup As String = "" Private Sub MyHint_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded - If CanClose AndAlso Setup.Get(RelativeSetup) Then Visibility = Visibility.Collapsed + If CanClose AndAlso Settings.Get(RelativeSetup) Then Visibility = Visibility.Collapsed End Sub Private Sub BtnClose_Click(sender As Object, e As EventArgs) Handles BtnClose.Click - Setup.SetSafe(RelativeSetup, True) + Settings.SetSafe(RelativeSetup, True) AniDispose(Me, False) End Sub '触发点击事件 + Public Event Click(sender As Object, e As MouseButtonEventArgs) Private IsMouseDown As Boolean = False Private Sub MyHint_MouseUp(sender As Object, e As MouseButtonEventArgs) Handles Me.MouseLeftButtonUp If Not IsMouseDown Then Return IsMouseDown = False Log("[Control] 按下提示条" & If(String.IsNullOrEmpty(Name), "", ":" & Name)) + RaiseEvent Click(sender, e) + If e.Handled Then Return e.Handled = True RaiseCustomEvent() '自定义事件 End Sub diff --git a/Plain Craft Launcher 2/Controls/MyMenuItem.vb b/Plain Craft Launcher 2/Controls/MyMenuItem.vb index 4c22da3..629456a 100644 --- a/Plain Craft Launcher 2/Controls/MyMenuItem.vb +++ b/Plain Craft Launcher 2/Controls/MyMenuItem.vb @@ -7,7 +7,7 @@ If IconControl IsNot Nothing Then IconControl.Data = (New GeometryConverter).ConvertFromString(Icon) End If '对父级设置透明度 - CType(Parent, ContextMenu).Opacity = Setup.Get("UiLauncherTransparent") / 1000 + 0.4 + CType(Parent, ContextMenu).Opacity = Settings.Get("UiLauncherTransparent") / 1000 + 0.4 End Sub '基础 diff --git a/Plain Craft Launcher 2/Controls/MyPageRight.vb b/Plain Craft Launcher 2/Controls/MyPageRight.vb index b7ee462..ba337ce 100644 --- a/Plain Craft Launcher 2/Controls/MyPageRight.vb +++ b/Plain Craft Launcher 2/Controls/MyPageRight.vb @@ -129,7 +129,7 @@ RaiseEvent PageEnter() Select Case PageState Case PageStates.Empty - If PageLoader Is Nothing OrElse PageLoader.State = LoadState.Finished OrElse PageLoader.State = LoadState.Waiting OrElse PageLoader.State = LoadState.Aborted Then + If PageLoader Is Nothing OrElse PageLoader.State = LoadState.Finished OrElse PageLoader.State = LoadState.Waiting OrElse PageLoader.State = LoadState.Interrupted Then '如果加载器在进入页面时不启动(例如联机),那么在此时就会有 State = Waiting PageState = PageStates.ContentEnter TriggerEnterAnimation(PanAlways, If(PanContent, Child)) @@ -142,7 +142,7 @@ End If Case PageStates.ContentExit '和上面的一样,但是不管 PanAlways - If PageLoader Is Nothing OrElse PageLoader.State = LoadState.Finished OrElse PageLoader.State = LoadState.Waiting OrElse PageLoader.State = LoadState.Aborted Then + If PageLoader Is Nothing OrElse PageLoader.State = LoadState.Finished OrElse PageLoader.State = LoadState.Waiting OrElse PageLoader.State = LoadState.Interrupted Then PageState = PageStates.ContentEnter TriggerEnterAnimation(If(PanContent, Child)) ElseIf PageLoader.State = LoadState.Loading Then @@ -318,9 +318,9 @@ Case PageStates.LoaderExit PageState = PageStates.ContentExit End Select - Case LoadState.Finished, LoadState.Aborted, LoadState.Waiting + Case LoadState.Finished, LoadState.Interrupted, LoadState.Waiting If Not (OldState = LoadState.Failed OrElse OldState = LoadState.Loading) Then Return - If ModeDebug Then Log("[UI] 已触发 PageLoaderState (Stop/Abort)") + If ModeDebug Then Log("[UI] 已触发 PageLoaderState (Stop/Interrupt)") '运行结束 '需要从 LoaderWait 切换到 ContentEnter,或从 LoaderStay 切换到 LoaderExit Select Case PageState diff --git a/Plain Craft Launcher 2/Controls/MyRadioBox.xaml.vb b/Plain Craft Launcher 2/Controls/MyRadioBox.xaml.vb index e629808..59d55ff 100644 --- a/Plain Craft Launcher 2/Controls/MyRadioBox.xaml.vb +++ b/Plain Craft Launcher 2/Controls/MyRadioBox.xaml.vb @@ -2,7 +2,7 @@ Public Class MyRadioBox - Implements IMyRadio + Implements IMyRadio, ISettingControl '基础 @@ -116,7 +116,7 @@ Public Class MyRadioBox AaOpacity(ShapeDot, 1 - ShapeDot.Opacity, AnimationTimeOfCheck * 0.5, AnimationTimeOfCheck * 0.6) }, "MyRadioBox Dot " & Uuid) AniStart({ - AaColor(ShapeBorder, Ellipse.StrokeProperty, If(IsMouseOver, "ColorBrush3", If(IsEnabled, "ColorBrush2", "ColorBrushGray4")), AnimationTimeOfCheck) + AaColor(ShapeBorder, Ellipse.StrokeProperty, If(IsMouseOver, "ColorBrush3", If(IsEnabled, "ColorBrush2", "ColorBrushGray5")), AnimationTimeOfCheck) }, "MyRadioBox BorderColor " & Uuid) Else '由有变无 @@ -128,7 +128,7 @@ Public Class MyRadioBox AaOpacity(ShapeDot, -ShapeDot.Opacity, AnimationTimeOfCheck * 0.5, AnimationTimeOfCheck * 0.2) }, "MyRadioBox Dot " & Uuid) AniStart({ - AaColor(ShapeBorder, Ellipse.StrokeProperty, If(IsMouseOver, "ColorBrush3", If(IsEnabled, "ColorBrush1", "ColorBrushGray4")), AnimationTimeOfCheck) + AaColor(ShapeBorder, Ellipse.StrokeProperty, If(IsMouseOver, "ColorBrush3", If(IsEnabled, "ColorBrush1", "ColorBrushGray5")), AnimationTimeOfCheck) }, "MyRadioBox BorderColor " & Uuid) End If Else @@ -141,13 +141,13 @@ Public Class MyRadioBox ShapeDot.Height = 9 ShapeDot.Opacity = 1 ShapeDot.Margin = New Thickness(5.5, 0, 0, 0) - ShapeBorder.SetResourceReference(Ellipse.StrokeProperty, If(IsEnabled, "ColorBrush2", "ColorBrushGray4")) + ShapeBorder.SetResourceReference(Ellipse.StrokeProperty, If(IsEnabled, "ColorBrush2", "ColorBrushGray5")) Else ShapeDot.Width = 0 ShapeDot.Height = 0 ShapeDot.Opacity = 0 ShapeDot.Margin = New Thickness(10, 0, 0, 0) - ShapeBorder.SetResourceReference(Ellipse.StrokeProperty, If(IsEnabled, "ColorBrush1", "ColorBrushGray4")) + ShapeBorder.SetResourceReference(Ellipse.StrokeProperty, If(IsEnabled, "ColorBrush1", "ColorBrushGray5")) End If End If End Sub @@ -209,15 +209,15 @@ Public Class MyRadioBox Radiobox_MouseLeaveAnimation() Else '不可用 - AniStart(AaColor(ShapeBorder, Ellipse.StrokeProperty, ColorGray4 - ShapeBorder.Stroke, AnimationTimeOfMouseOut), "MyRadioBox BorderColor " & Uuid) - AniStart(AaColor(LabText, TextBlock.ForegroundProperty, ColorGray4 - LabText.Foreground, AnimationTimeOfMouseOut), "MyRadioBox TextColor " & Uuid) + AniStart(AaColor(ShapeBorder, Ellipse.StrokeProperty, ColorGray5 - ShapeBorder.Stroke, AnimationTimeOfMouseOut), "MyRadioBox BorderColor " & Uuid) + AniStart(AaColor(LabText, TextBlock.ForegroundProperty, ColorGray5 - LabText.Foreground, AnimationTimeOfMouseOut), "MyRadioBox TextColor " & Uuid) End If Else '无动画 AniStop("MyRadioBox BorderColor " & Uuid) AniStop("MyRadioBox TextColor " & Uuid) - LabText.SetResourceReference(TextBlock.ForegroundProperty, If(Me.IsEnabled, "ColorBrush1", "ColorBrushGray4")) - ShapeBorder.SetResourceReference(Ellipse.StrokeProperty, If(Me.IsEnabled, If(Checked, "ColorBrush2", "ColorBrush1"), "ColorBrushGray4")) + LabText.SetResourceReference(TextBlock.ForegroundProperty, If(Me.IsEnabled, "ColorBrush1", "ColorBrushGray5")) + ShapeBorder.SetResourceReference(Ellipse.StrokeProperty, If(Me.IsEnabled, If(Checked, "ColorBrush2", "ColorBrush1"), "ColorBrushGray5")) End If End Sub Private Sub Radiobox_MouseEnterAnimation() Handles Me.MouseEnter @@ -227,14 +227,30 @@ Public Class MyRadioBox Private Sub Radiobox_MouseLeaveAnimation() Handles Me.MouseLeave If Not Me.IsEnabled Then Return 'MouseLeave 比 IsEnabledChanged 后执行,所以如果自定义事件修改了 IsEnabled,将导致显示错误 If IsLoaded AndAlso AniControlEnabled = 0 Then - AniStart(AaColor(ShapeBorder, Ellipse.StrokeProperty, If(IsEnabled, If(Checked, "ColorBrush2", "ColorBrush1"), "ColorBrushGray4"), AnimationTimeOfMouseOut), "MyRadioBox BorderColor " & Uuid) - AniStart(AaColor(LabText, TextBlock.ForegroundProperty, If(IsEnabled, "ColorBrush1", "ColorBrushGray4"), AnimationTimeOfMouseOut), "MyRadioBox TextColor " & Uuid) + AniStart(AaColor(ShapeBorder, Ellipse.StrokeProperty, If(IsEnabled, If(Checked, "ColorBrush2", "ColorBrush1"), "ColorBrushGray5"), AnimationTimeOfMouseOut), "MyRadioBox BorderColor " & Uuid) + AniStart(AaColor(LabText, TextBlock.ForegroundProperty, If(IsEnabled, "ColorBrush1", "ColorBrushGray5"), AnimationTimeOfMouseOut), "MyRadioBox TextColor " & Uuid) Else AniStop("MyRadioBox BorderColor " & Uuid) AniStop("MyRadioBox TextColor " & Uuid) - ShapeBorder.SetResourceReference(Ellipse.StrokeProperty, If(IsEnabled, If(Checked, "ColorBrush2", "ColorBrush1"), "ColorBrushGray4")) - LabText.SetResourceReference(TextBlock.ForegroundProperty, If(IsEnabled, "ColorBrush1", "ColorBrushGray4")) + ShapeBorder.SetResourceReference(Ellipse.StrokeProperty, If(IsEnabled, If(Checked, "ColorBrush2", "ColorBrush1"), "ColorBrushGray5")) + LabText.SetResourceReference(TextBlock.ForegroundProperty, If(IsEnabled, "ColorBrush1", "ColorBrushGray5")) End If End Sub +#Region "设置" + + Private Sub RefreshSetting(NewValue As String) Implements ISettingControl.RefreshSetting + Checked = NewValue = SettingService.GetValue(Me) + End Sub + + Private Function GetCurrentSetting() As String Implements ISettingControl.GetCurrentSetting + Return If(Checked, SettingService.GetValue(Me), Nothing) + End Function + + Private Sub SaveSetting() Handles Me.Check + SettingService.SaveSetting(Me) + End Sub + +#End Region + End Class diff --git a/Plain Craft Launcher 2/Controls/MySlider.xaml.vb b/Plain Craft Launcher 2/Controls/MySlider.xaml.vb index 0a3b9ca..4077891 100644 --- a/Plain Craft Launcher 2/Controls/MySlider.xaml.vb +++ b/Plain Craft Launcher 2/Controls/MySlider.xaml.vb @@ -1,4 +1,5 @@ Public Class MySlider + Implements ISettingControl '基础 @@ -188,4 +189,20 @@ End If End Sub +#Region "设置" + + Private Sub RefreshSetting(NewValue As String) Implements ISettingControl.RefreshSetting + Value = Val(NewValue) + End Sub + + Private Function GetCurrentSetting() As String Implements ISettingControl.GetCurrentSetting + Return Value + End Function + + Private Sub SaveSetting() Handles Me.Change + SettingService.SaveSetting(Me) + End Sub + +#End Region + End Class \ No newline at end of file diff --git a/Plain Craft Launcher 2/Controls/MyTextBox.vb b/Plain Craft Launcher 2/Controls/MyTextBox.vb index 55a00b3..2b84873 100644 --- a/Plain Craft Launcher 2/Controls/MyTextBox.vb +++ b/Plain Craft Launcher 2/Controls/MyTextBox.vb @@ -1,5 +1,6 @@ Public Class MyTextBox Inherits TextBox + Implements ISettingControl '自定义属性 @@ -44,7 +45,13 @@ Public Uuid As Integer = GetUuid() Public Shared Event ValidateChanged(sender As Object, e As EventArgs) - Public ChangedEventList As New List(Of RoutedEventHandler) + Private _ChangedEventList As List(Of RoutedEventHandler) + Public ReadOnly Property ChangedEventList As List(Of RoutedEventHandler) + Get + If _ChangedEventList Is Nothing Then _ChangedEventList = New List(Of RoutedEventHandler) + Return _ChangedEventList + End Get + End Property Public Custom Event ValidatedTextChanged As RoutedEventHandler AddHandler(value As RoutedEventHandler) ChangedEventList.Add(value) @@ -295,4 +302,21 @@ Private Sub MyTextBox_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp If e.Key = Key.Enter Then RaiseCustomEvent() End Sub + +#Region "设置" + + Private Sub RefreshSetting(NewValue As String) Implements ISettingControl.RefreshSetting + Text = NewValue + End Sub + + Private Function GetCurrentSetting() As String Implements ISettingControl.GetCurrentSetting + Return Text + End Function + + Private Sub SaveSetting() Handles Me.ValidatedTextChanged + SettingService.SaveSetting(Me) + End Sub + +#End Region + End Class diff --git a/Plain Craft Launcher 2/Controls/MyVirtualizingElement.vb b/Plain Craft Launcher 2/Controls/MyVirtualizingElement.vb index 056cd9d..c9a5265 100644 --- a/Plain Craft Launcher 2/Controls/MyVirtualizingElement.vb +++ b/Plain Craft Launcher 2/Controls/MyVirtualizingElement.vb @@ -4,7 +4,7 @@ Private Initializer As Func(Of T) Public Sub New(Initializer As Func(Of T)) Me.Initializer = Initializer - OnFirstEnterScrollViewerViewport(AddressOf Init) + LazyLoadBehavior.OnFirstEnterScrollViewerViewport(Me, AddressOf Init) End Sub ''' @@ -34,7 +34,7 @@ Public Class MyVirtualizingElement Private Initializer As Func(Of FrameworkElement) Public Sub New(Initializer As Func(Of FrameworkElement)) Me.Initializer = Initializer - OnFirstEnterScrollViewerViewport(AddressOf Init) + LazyLoadBehavior.OnFirstEnterScrollViewerViewport(Me, AddressOf Init) End Sub ''' diff --git a/Plain Craft Launcher 2/FormMain.xaml b/Plain Craft Launcher 2/FormMain.xaml index 0582efb..1236d58 100644 --- a/Plain Craft Launcher 2/FormMain.xaml +++ b/Plain Craft Launcher 2/FormMain.xaml @@ -95,7 +95,8 @@ - + diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index 02435f0..fd8cee3 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -11,6 +11,38 @@ Public Class FormMain Dim FeatureList As New List(Of KeyValuePair(Of Integer, String)) '统计更新日志条目 #If BETA Then + If LastVersion < 391 Then 'Release 2.12.6.2 + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:会为部分 Forge / NeoForge 选择不支持的 Java")) + BugCount += 4 + End If + If LastVersion < 389 Then 'Release 2.12.6.1 + If LastVersion = 387 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:无法使用 Java 25+ 启动 Forge")) + FeatureCount += 4 + BugCount += 3 + End If + If LastVersion < 387 Then 'Release 2.12.6 + FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:降低 Minecraft 的内存占用")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:Minecraft 使用 Java 25+ 时的一个性能问题")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:无法下载 NeoForge 26.1")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:部分关键词搜不到资源,特别是中文 Mod 搜索经常没有结果")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:老版本 Windows 无法启动游戏")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:连接 Mojang 的服务可能失败,提示错误码 421")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:无法访问爱发电")) + FeatureCount += 24 + BugCount += 19 + End If + If LastVersion < 383 Then 'Release 2.12.3 + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:部分关键词搜不到资源,特别是中文 Mod 搜索经常没有结果")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:下载可能完全卡住,或是下载进度反复回退")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "新增:内存管理设置,可以选择 G1GC、ZGC 或分代 ZGC")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "优化:来自 Modrinth 的文件下载速度")) + FeatureCount += 15 + BugCount += 16 + End If + If LastVersion < 381 Then 'Release 2.12.2 + FeatureCount += 3 + BugCount += 13 + End If If LastVersion < 379 Then 'Release 2.12.1 If LastVersion >= 376 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(5, "删除:暂时隐藏联机入口……不过只是暂时关闭,它还会回来的!")) @@ -72,64 +104,54 @@ Public Class FormMain FeatureCount += 9 BugCount += 26 End If - If LastVersion < 355 Then 'Release 2.9.3 - FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:Minecraft 会优先使用独立显卡运行")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:简化下载新版本第二步的 UI")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:使用新的版本隔离策略")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:添加了在全局启动设置与版本独立设置之间互相跳转的按钮")) - FeatureCount += 20 - BugCount += 28 - End If - If LastVersion < 352 Then 'Release 2.9.1 - FeatureList.Add(New KeyValuePair(Of Integer, String)(5, "新增:导出整合包功能")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:支持在超长路径下安装、启动游戏")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:无法安装 1.21 OptiFine")) - FeatureCount += 23 - BugCount += 10 - End If - If LastVersion < 349 Then 'Release 2.8.13 - FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:网络环境不佳时,Mod、整合包页面的加载速度")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:部分电脑无法打开程序")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:可能无法识别、更新 Mod")) - FeatureCount += 6 - BugCount += 14 - End If - If LastVersion < 347 Then 'Release 2.8.12 - FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "新增:Mod 管理页面添加下载 Mod、安装 Mod 选项")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "新增:Mod 详情页面支持按加载器、游戏版本进行分类和筛选")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "新增:支持安装同时包含 modpack 文件和启动器的懒人包")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "优化:整合包导入流程")) - FeatureCount += 43 - BugCount += 37 - End If - If LastVersion < 342 Then 'Release 2.8.9 - FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "新增:支持下载原版服务端")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "新增:本地 Mod 的标题支持选择显示 Mod 原始文件名")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:搜索后启用/禁用 Mod 时出错")) - FeatureCount += 17 - BugCount += 13 - End If - If LastVersion < 340 Then 'Release 2.8.8 - If LastVersion = 338 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:数个与新正版登录相关的严重 Bug")) - FeatureCount += 3 - BugCount += 7 - End If - If LastVersion < 338 Then 'Release 2.8.7 - FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "优化:使用新的正版登录方式,以提高安全性")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:安装整合包、检索 Mod 的稳定性")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:无法加载部分 Mod 的图标")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:在 Mod 管理页面删除 Mod 导致报错")) - FeatureCount += 11 - BugCount += 21 - End If #Else '5: FEAT+ '4: IMP+ FEAT* '3:BUG+ IMP* FEAT- '2:BUG* IMP- '1:BUG- + If LastVersion < 390 Then 'Snapshot 2.12.6.2 + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:会为部分 Forge / NeoForge 选择不支持的 Java")) + BugCount += 4 + End If + If LastVersion < 388 Then 'Snapshot 2.12.6.1 + If LastVersion = 386 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:无法使用 Java 25+ 启动 Forge")) + FeatureCount += 4 + BugCount += 3 + End If + If LastVersion < 386 Then 'Snapshot 2.12.6 + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:Minecraft 使用 Java 25+ 时的一个性能问题")) + If LastVersion = 384 OrElse LastVersion = 385 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:无法正常重命名游戏版本")) + If LastVersion = 385 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:无法显示 Modrinth 整合包的版本列表")) + BugCount += 1 + End If + If LastVersion < 385 Then 'Snapshot 2.12.5 + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:无法下载 NeoForge 26.1")) + If LastVersion = 384 Then + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:下载可能失败,提示下载管理刷新线程出错")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:无法保存选择的 Minecraft 文件夹")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:使用中文搜索 Mod 时,部分结果会忽略筛选条件")) + End If + FeatureCount += 3 + BugCount += 6 + End If + If LastVersion < 384 Then 'Snapshot 2.12.4 + FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:降低 Minecraft 的内存占用")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:部分关键词搜不到资源,特别是中文 Mod 搜索经常没有结果")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:老版本 Windows 无法启动游戏")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:连接 Mojang 的服务可能失败,提示错误码 421")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:无法访问爱发电")) + FeatureCount += 21 + BugCount += 14 + End If + If LastVersion < 382 Then 'Snapshot 2.12.3 + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:下载可能完全卡住,或是下载进度反复回退")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "新增:内存管理设置,可以选择 G1GC、ZGC 或分代 ZGC")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "优化:来自 Modrinth 的文件下载速度")) + FeatureCount += 15 + BugCount += 16 + End If If LastVersion < 380 Then 'Snapshot 2.12.2 - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:无法搜索 CurseForge 上的社区资源")) FeatureCount += 3 BugCount += 13 End If @@ -235,81 +257,6 @@ Public Class FormMain FeatureCount += 9 BugCount += 26 End If - If LastVersion < 354 Then 'Snapshot 2.9.3 - If LastVersion = 352 Then - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:低版本 MC 没有声音")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:若不安装 Mod 加载器,则无法安装 OptiFine 1.14+")) - End If - FeatureCount += 8 - BugCount += 8 - End If - If LastVersion < 352 Then 'Snapshot 2.9.2 - FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:Minecraft 会优先使用独立显卡运行")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:简化下载新版本第二步的 UI")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:使用新的版本隔离策略")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:添加了在全局启动设置与版本独立设置之间互相跳转的按钮")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:使用快照版导出带 PCL 的整合包可能失败")) - FeatureCount += 12 - BugCount += 20 - End If - If LastVersion < 351 Then 'Snapshot 2.9.1 - If LastVersion = 350 Then - FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "优化:对导出整合包功能进行了 7 项优化,详见完整更新日志")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:无法进行第三方登录")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:在部分版本下,打开导出页面会导致启动器崩溃")) - BugCount += 1 - End If - BugCount += 2 - End If - If LastVersion < 350 Then 'Snapshot 2.9.0 - FeatureList.Add(New KeyValuePair(Of Integer, String)(5, "新增:导出整合包功能")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:支持在超长路径下安装、启动游戏")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:无法安装 1.21 OptiFine")) - FeatureCount += 21 - BugCount += 10 - End If - If LastVersion < 348 Then 'Snapshot 2.8.13 - FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:网络环境不佳时,Mod、整合包页面的加载速度")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:部分电脑无法打开程序")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:可能无法识别、更新 Mod")) - FeatureCount += 6 - BugCount += 14 - End If - If LastVersion < 346 Then 'Snapshot 2.8.12 - If LastVersion = 345 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:帮助页面报错")) - End If - If LastVersion < 345 Then 'Snapshot 2.8.11 - FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "新增:Mod 管理页面添加下载 Mod、安装 Mod 选项")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "新增:Mod 详情页面支持按加载器、游戏版本进行分类和筛选")) - FeatureCount += 23 - BugCount += 21 - End If - If LastVersion < 343 Then 'Snapshot 2.8.10 - FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "新增:支持安装同时包含 modpack 文件和启动器的懒人包")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "优化:整合包导入流程")) - FeatureCount += 20 - BugCount += 16 - End If - If LastVersion < 341 Then 'Snapshot 2.8.9 - FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "新增:支持下载原版服务端")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "新增:本地 Mod 的标题支持选择显示 Mod 原始文件名")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:搜索后启用/禁用 Mod 时出错")) - FeatureCount += 17 - BugCount += 13 - End If - If LastVersion < 339 Then 'Snapshot 2.8.8 - If LastVersion = 337 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:数个与新正版登录相关的严重 Bug")) - FeatureCount += 3 - BugCount += 7 - End If - If LastVersion < 337 Then 'Snapshot 2.8.7 - FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "优化:使用新的正版登录方式,以提高安全性")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:安装整合包、检索 Mod 的稳定性")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:无法加载部分 Mod 的图标")) - FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:在 Mod 管理页面删除 Mod 导致报错")) - FeatureCount += 11 - BugCount += 21 - End If #End If '整理更新日志文本 Dim ContentList As New List(Of String) @@ -325,12 +272,12 @@ Public Class FormMain If(BugCount > 0, "修复了 " & BugCount & " 个 Bug", "") & ",详见完整更新日志") End If - Dim Content As String = "· " & Join(ContentList, vbCrLf & "· ") + Dim Content As String = "· " & ContentList.Join(vbCrLf & "· ") '输出更新日志 RunInNewThread( Sub() - If MyMsgBox(Content, "PCL 已更新至 " & VersionDisplayName, "确定", "完整更新日志") = 2 Then - OpenWebsite("https://afdian.com/a/LTCat?tab=feed") + If MyMsgBox(Content, "PCL 已更新至" & VersionDisplayName, "确定", "完整更新日志") = 2 Then + OpenWebsite("https://meloong.com/afd/a/LTCat?tab=feed") End If End Sub, "UpdateLog Output") End Sub @@ -344,7 +291,7 @@ Public Class FormMain FrmLaunchLeft = New PageLaunchLeft FrmLaunchRight = New PageLaunchRight '版本号改变 - Dim LastVersion As Integer = Setup.Get("SystemLastVersionReg") + Dim LastVersion As Integer = Settings.Get("SystemLastVersionReg") If LastVersion < VersionCode Then '触发升级 UpgradeSub(LastVersion) @@ -353,21 +300,21 @@ Public Class FormMain DowngradeSub(LastVersion) End If '版本隔离设置迁移 - If Setup.IsUnset("LaunchArgumentIndieV2") Then - If Not Setup.IsUnset("LaunchArgumentIndie") Then + If Not Settings.HasSaved("LaunchArgumentIndieV2") Then + If Settings.HasSaved("LaunchArgumentIndie") Then Log("[Start] 从老 PCL 迁移版本隔离") - Setup.Set("LaunchArgumentIndieV2", Setup.Get("LaunchArgumentIndie")) - ElseIf Not Setup.IsUnset("LaunchVersionSelect") Then + Settings.Set("LaunchArgumentIndieV2", Settings.Get("LaunchArgumentIndie")) + ElseIf HasIniKey("Setup", "LaunchVersionSelect") Then Log("[Start] 从老 PCL 升级,但此前未调整版本隔离,使用老的版本隔离默认值") - Setup.Set("LaunchArgumentIndieV2", Setup.GetDefault("LaunchArgumentIndie")) + Settings.Set("LaunchArgumentIndieV2", Settings.GetDefault("LaunchArgumentIndie")) Else Log("[Start] 全新的 PCL,使用新的版本隔离默认值") - Setup.Set("LaunchArgumentIndieV2", Setup.GetDefault("LaunchArgumentIndieV2")) + Settings.Set("LaunchArgumentIndieV2", Settings.GetDefault("LaunchArgumentIndieV2")) End If End If '刷新主题 ThemeCheckAll(False) - Setup.Load("UiLauncherTheme") + ThemeRefresh(Settings.Get("UiLauncherTheme")) '注册拖拽事件(不能直接加 Handles,否则没用;#6340) [AddHandler](DragDrop.DragEnterEvent, New DragEventHandler(AddressOf HandleDrag), handledEventsToo:=True) [AddHandler](DragDrop.DragOverEvent, New DragEventHandler(AddressOf HandleDrag), handledEventsToo:=True) @@ -406,12 +353,10 @@ Public Class FormMain End Sub Private Sub FormMain_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded ApplicationStartTick = GetTimeMs() - Handle = New Interop.WindowInteropHelper(Me).Handle + Handle = New WindowInteropHelper(Me).Handle '读取设置 - Setup.Load("UiBackgroundOpacity") - Setup.Load("UiBackgroundBlur") - Setup.Load("UiLogoType") - Setup.Load("UiHiddenPageDownload") + UpdateBackgroundAndTitleBar() + PageSetupUI.HiddenRefresh() PageSetupUI.BackgroundRefresh(False, True) MusicRefreshPlay(False, True) '扩展按钮 @@ -437,8 +382,8 @@ Public Class FormMain '加载窗口 ThemeRefreshMain() Try - Height = Setup.Get("WindowHeight") - Width = Setup.Get("WindowWidth") + Height = Settings.Get("WindowHeight") + Width = Settings.Get("WindowWidth") Catch ex As Exception '修复 #2019 Log(ex, "读取窗口默认大小失败", LogLevel.Hint) Height = MinHeight + 100 @@ -459,7 +404,7 @@ Public Class FormMain HwndSource.AddHook(New Interop.HwndSourceHook(AddressOf WndProc)) AniStart({ AaCode(Sub() AniControlEnabled -= 1, 50), - AaOpacity(Me, Setup.Get("UiLauncherTransparent") / 1000 + 0.4, 250, 100), + AaOpacity(Me, Settings.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( @@ -477,15 +422,15 @@ Public Class FormMain Sub() 'EULA 提示 Const EulaVersion As Integer = 2 - If Setup.Get("SystemEulaVersion") < EulaVersion Then + If Settings.Get("SystemEulaVersion") < EulaVersion Then Select Case MyMsgBox( - If(Setup.Get("SystemEulaVersion") = 0, + If(Settings.Get("SystemEulaVersion") = 0, "在使用 PCL 前,请先阅读用户协议与免责声明。", $"PCL 的用户协议与免责声明已更新。{vbCrLf}请阅读更新后的用户协议与免责声明。"), "协议授权", "同意", "拒绝", "查看用户协议与免责声明", Button3Action:=Sub() OpenWebsite("https://shimo.im/docs/rGrd8pY8xWkt6ryW")) Case 1 - Setup.Set("SystemEulaVersion", EulaVersion) + Settings.Set("SystemEulaVersion", EulaVersion) Case 2 EndProgram(False) End Select @@ -515,15 +460,15 @@ Public Class FormMain End Sub '根据打开次数触发的事件 Private Sub RunCountSub() - Setup.Set("SystemCount", Setup.Get("SystemCount") + 1) + Settings.Set("SystemCount", Settings.Get("SystemCount") + 1) #If Not BETA Then - Select Case Setup.Get("SystemCount") + Select Case Settings.Get("SystemCount") Case 1 MyMsgBox("欢迎使用 PCL 快照版!" & vbCrLf & "快照版包含尚未在正式版发布的测试性功能,仅用于赞助者本人尝鲜。所以请不要发给其他人或者用于制作整合包哦!" & vbCrLf & "如果你并非通过赞助或赞助者本人邀请进群获得的本程序,那么可能是有人在违规传播,记得提醒他一下啦。", "快照版使用说明") End Select - If Setup.Get("SystemCount") >= 99 Then + If Settings.Get("SystemCount") >= 99 Then If ThemeUnlock(6, False) Then MyMsgBox("你已经使用了 99 次 PCL 啦,感谢你长期以来的支持!" & vbCrLf & "隐藏主题 铁杆粉 已解锁!", "提示") @@ -534,46 +479,44 @@ Public Class FormMain '升级与降级事件 Private Sub UpgradeSub(LastVersionCode As Integer) Log("[Start] 版本号从 " & LastVersionCode & " 升高到 " & VersionCode) - Setup.Set("SystemLastVersionReg", VersionCode) + Settings.Set("SystemLastVersionReg", VersionCode) '检查有记录的最高版本号 Dim LowerVersionCode As Integer #If BETA Then - LowerVersionCode = Setup.Get("SystemHighestBetaVersionReg") + LowerVersionCode = Settings.Get("SystemHighestBetaVersionReg") If LowerVersionCode < VersionCode Then - Setup.Set("SystemHighestBetaVersionReg", VersionCode) + Settings.Set("SystemHighestBetaVersionReg", VersionCode) Log("[Start] 最高版本号从 " & LowerVersionCode & " 升高到 " & VersionCode) End If #Else - LowerVersionCode = Setup.Get("SystemHighestAlphaVersionReg") + LowerVersionCode = Settings.Get("SystemHighestAlphaVersionReg") If LowerVersionCode < VersionCode Then - Setup.Set("SystemHighestAlphaVersionReg", VersionCode) + Settings.Set("SystemHighestAlphaVersionReg", VersionCode) Log("[Start] 最高版本号从 " & LowerVersionCode & " 升高到 " & VersionCode) End If #End If - '迁移 EULA 版本 - If Setup.Get("SystemEula") AndAlso Setup.Get("SystemEulaVersion") = 0 Then Setup.Set("SystemEulaVersion", 1) '被移除的窗口设置选项 - If Setup.Get("LaunchArgumentWindowType") = 5 Then Setup.Set("LaunchArgumentWindowType", 1) + If Settings.Get("LaunchArgumentWindowType") = 5 Then Settings.Set("LaunchArgumentWindowType", 1) '修改主题设置项名称 If LowerVersionCode <= 207 Then Dim UnlockedTheme As New List(Of String) From {"2"} - UnlockedTheme.AddRange(New List(Of String)(Setup.Get("UiLauncherThemeHide").ToString.Split("|"))) - UnlockedTheme.AddRange(New List(Of String)(Setup.Get("UiLauncherThemeHide2").ToString.Split("|"))) - Setup.Set("UiLauncherThemeHide2", Join(UnlockedTheme.Distinct.ToList, "|")) + UnlockedTheme.AddRange(New List(Of String)(Settings.Get("UiLauncherThemeHide").ToString.Split("|"))) + UnlockedTheme.AddRange(New List(Of String)(Settings.Get("UiLauncherThemeHide2").ToString.Split("|"))) + Settings.Set("UiLauncherThemeHide2", UnlockedTheme.Distinct.ToList.Join("|"c)) End If '重置欧皇彩 - If LastVersionCode <= 115 AndAlso Setup.Get("UiLauncherThemeHide2").ToString.Split("|").Contains("13") Then - Dim UnlockedTheme As New List(Of String)(Setup.Get("UiLauncherThemeHide2").ToString.Split("|")) + If LastVersionCode <= 115 AndAlso Settings.Get("UiLauncherThemeHide2").ToString.Split("|").Contains("13") Then + Dim UnlockedTheme As New List(Of String)(Settings.Get("UiLauncherThemeHide2").ToString.Split("|")) UnlockedTheme.Remove("13") - Setup.Set("UiLauncherThemeHide2", Join(UnlockedTheme, "|")) + Settings.Set("UiLauncherThemeHide2", UnlockedTheme.Join("|"c)) MyMsgBox("由于新版 PCL 修改了欧皇彩的解锁方式,你需要重新解锁欧皇彩。" & vbCrLf & "多谢各位的理解啦!", "重新解锁提醒") End If '重置滑稽彩 - If LastVersionCode <= 152 AndAlso Setup.Get("UiLauncherThemeHide2").ToString.Split("|").Contains("12") Then - Dim UnlockedTheme As New List(Of String)(Setup.Get("UiLauncherThemeHide2").ToString.Split("|")) + If LastVersionCode <= 152 AndAlso Settings.Get("UiLauncherThemeHide2").ToString.Split("|").Contains("12") Then + Dim UnlockedTheme As New List(Of String)(Settings.Get("UiLauncherThemeHide2").ToString.Split("|")) UnlockedTheme.Remove("12") - Setup.Set("UiLauncherThemeHide2", Join(UnlockedTheme, "|")) + Settings.Set("UiLauncherThemeHide2", UnlockedTheme.Join("|"c)) MyMsgBox("由于新版 PCL 修改了滑稽彩的解锁方式,你需要重新解锁滑稽彩。" & vbCrLf & "多谢各位的理解啦!", "重新解锁提醒") End If @@ -588,24 +531,30 @@ Public Class FormMain End If '解除帮助页面的隐藏 If LastVersionCode <= 205 Then - Setup.Set("UiHiddenOtherHelp", False) + Settings.Set("UiHiddenOtherHelp", False) Log("[Start] 已解除帮助页面的隐藏") End If '单向迁移微软登录结果(#4836) - If Not Setup.Get("CacheMsV2Migrated") Then - Setup.Set("CacheMsV2Migrated", True) - Setup.Set("CacheMsV2OAuthRefresh", Setup.Get("CacheMsOAuthRefresh")) - Setup.Set("CacheMsV2Access", Setup.Get("CacheMsAccess")) - Setup.Set("CacheMsV2ProfileJson", Setup.Get("CacheMsProfileJson")) - Setup.Set("CacheMsV2Uuid", Setup.Get("CacheMsUuid")) - Setup.Set("CacheMsV2Name", Setup.Get("CacheMsName")) + If Not Settings.Get("CacheMsV2Migrated") Then + Settings.Set("CacheMsV2Migrated", True) + Settings.Set("CacheMsV2OAuthRefresh", Settings.Get("CacheMsOAuthRefresh")) + Settings.Set("CacheMsV2Access", Settings.Get("CacheMsAccess")) + Settings.Set("CacheMsV2ProfileJson", Settings.Get("CacheMsProfileJson")) + Settings.Set("CacheMsV2Uuid", Settings.Get("CacheMsUuid")) + Settings.Set("CacheMsV2Name", Settings.Get("CacheMsName")) Log("[Start] 已从老版本迁移微软登录结果") End If 'Mod 命名设置迁移 - If Not Setup.IsUnset("ToolDownloadTranslate") AndAlso Setup.IsUnset("ToolDownloadTranslateV2") Then - Setup.Set("ToolDownloadTranslateV2", Setup.Get("ToolDownloadTranslate") + 1) + If Settings.HasSaved("ToolDownloadTranslate") AndAlso Not Settings.HasSaved("ToolDownloadTranslateV2") Then + Settings.Set("ToolDownloadTranslateV2", Settings.Get("ToolDownloadTranslate") + 1) Log("[Start] 已从老版本迁移 Mod 命名设置") End If + '重置 JVM 参数设置 + If LastVersionCode <= 381 AndAlso Settings.HasSaved("LaunchAdvanceJvm") AndAlso + Settings.Get("LaunchAdvanceJvm").ToString.Replace("-XX:+UseG1GC ", "").Replace("-XX:-UseAdaptiveSizePolicy ", "").Trim = Settings.GetDefault("LaunchAdvanceJvm") Then + Settings.Reset("LaunchAdvanceJvm") + Log("[Start] 已重置 JVM 参数设置") + End If '输出更新日志 If LastVersionCode <= 0 Then Return If LowerVersionCode >= VersionCode Then Return @@ -613,7 +562,7 @@ Public Class FormMain End Sub Private Sub DowngradeSub(LastVersionCode As Integer) Log("[Start] 版本号从 " & LastVersionCode & " 降低到 " & VersionCode) - Setup.Set("SystemLastVersionReg", VersionCode) + Settings.Set("SystemLastVersionReg", VersionCode) End Sub #End Region @@ -637,7 +586,7 @@ Public Class FormMain Sub() Log("[System] 正在强行停止任务") For Each Task As LoaderBase In LoaderTaskbar.ToList() - Task.Abort() + Task.Interrupt() Next End Sub, "强行停止下载任务") End If @@ -712,8 +661,8 @@ Public Class FormMain Public IsSizeSaveable As Boolean = False Private Sub FormMain_SizeChanged() Handles Me.SizeChanged, Me.Loaded If IsSizeSaveable Then - Setup.Set("WindowHeight", Height) - Setup.Set("WindowWidth", Width) + Settings.Set("WindowHeight", Height) + Settings.Set("WindowWidth", Width) End If RectForm.Rect = New Rect(0, 0, BorderForm.ActualWidth, BorderForm.ActualHeight) PanForm.Width = BorderForm.ActualWidth + 0.001 @@ -728,6 +677,131 @@ Public Class FormMain WindowState = WindowState.Minimized End Sub + '背景图片与标题栏 + Public Shared Sub UpdateBackgroundAndTitleBar(Value) '从设置更新 + If FrmMain Is Nothing OrElse Not FrmMain.IsLoaded Then Return + FrmMain.UpdateBackgroundAndTitleBar() + End Sub + Public Sub UpdateBackgroundAndTitleBar() + Log("[FormMain] 从设置更新背景图片与标题栏样式") + '背景图片透明度 + ImgBack.Opacity = Settings.Get("UiBackgroundOpacity") / 1000 + '背景图片模糊 + Dim BlurRadius As Double = Settings.Get("UiBackgroundBlur") + 1 + If BlurRadius = 1 Then + ImgBack.Effect = Nothing + Else + ImgBack.Effect = New Effects.BlurEffect With {.Radius = BlurRadius} + End If + ImgBack.Margin = New Thickness(-BlurRadius / 1.8) + '背景图片适应方式 + Dim BackgroundType As Integer = Settings.Get("UiBackgroundSuit") + If ImgBack.Background IsNot Nothing Then + Dim Brush As ImageBrush = CType(ImgBack.Background, ImageBrush) + If BackgroundType = 0 Then + '智能:当图片较小时平铺,较大时适应 + If Brush.ImageSource.Width < PanMain.ActualWidth / 2 AndAlso Brush.ImageSource.Height < PanMain.ActualHeight / 2 Then + BackgroundType = 4 '平铺 + Else + BackgroundType = 2 '适应 + End If + End If + Brush.Stretch = Stretch.UniformToFill + Brush.TileMode = TileMode.None + Brush.Viewport = New Rect(0, 0, 1, 1) + Brush.ViewportUnits = BrushMappingMode.RelativeToBoundingBox + Brush.AlignmentX = AlignmentX.Center + Brush.AlignmentY = AlignmentY.Center + Select Case BackgroundType + Case 1 '中 + Brush.Stretch = Stretch.None + Case 3 '拉伸 + Brush.Stretch = Stretch.Fill + Case 4 '平铺 + Brush.Stretch = Stretch.None + Brush.TileMode = TileMode.Tile + Brush.Viewport = New Rect(0, 0, Brush.ImageSource.Width, Brush.ImageSource.Height) + Brush.ViewportUnits = BrushMappingMode.Absolute + + Case 2 '适应 + Case 5 '左上 + Brush.AlignmentX = AlignmentX.Left + Brush.AlignmentY = AlignmentY.Top + Case 6 '右上 + Brush.AlignmentX = AlignmentX.Right + Brush.AlignmentY = AlignmentY.Top + Case 7 '左下 + Brush.AlignmentX = AlignmentX.Left + Brush.AlignmentY = AlignmentY.Bottom + Case 8 '右下 + Brush.AlignmentX = AlignmentX.Right + Brush.AlignmentY = AlignmentY.Bottom + Case 9 '左 + Brush.AlignmentX = AlignmentX.Left + Brush.AlignmentY = AlignmentY.Center + Case 10 '右 + Brush.AlignmentX = AlignmentX.Right + Brush.AlignmentY = AlignmentY.Center + Case 11 '上 + Brush.AlignmentX = AlignmentX.Center + Brush.AlignmentY = AlignmentY.Top + Case 12 '下 + Brush.AlignmentX = AlignmentX.Center + Brush.AlignmentY = AlignmentY.Bottom + End Select + End If + '标题栏显示类型 + Select Case Settings.Get("UiLogoType") + Case 0 '无 + ShapeTitleLogo.Visibility = Visibility.Collapsed + LabTitleLogo.Visibility = Visibility.Collapsed + ImageTitleLogo.Visibility = Visibility.Collapsed + If Not IsNothing(FrmSetupUI) Then 'TODO: 和 FrmSetupUI 解耦 + FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Visible + FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed + FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed + End If + Case 1 '默认 + ShapeTitleLogo.Visibility = Visibility.Visible + LabTitleLogo.Visibility = Visibility.Collapsed + 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 '文本 + ShapeTitleLogo.Visibility = Visibility.Collapsed + LabTitleLogo.Visibility = Visibility.Visible + 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 + Case 3 '图片 + ShapeTitleLogo.Visibility = Visibility.Collapsed + LabTitleLogo.Visibility = Visibility.Collapsed + 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 + ImageTitleLogo.Source = Path & "PCL\Logo.png" + Catch ex As Exception + ImageTitleLogo.Source = Nothing + Log(ex, "显示标题栏图片失败", LogLevel.Msgbox) + End Try + End Select + FrmSetupUI?.CardLogo.TriggerForceResize() + '标题栏文本 + LabTitleLogo.Text = Settings.Get("UiLogoText") + '标题栏文本是否居左 + PanTitleMain.ColumnDefinitions(0).Width = New GridLength(If(Settings.Get("UiLogoLeft") AndAlso Settings.Get("UiLogoType") = 0, 0, 1), GridUnitType.Star) + End Sub + #End Region #Region "窗体事件" @@ -819,13 +893,13 @@ Public Class FormMain Log(ex, "切回窗口时出错", LogLevel.Feedback) End Try '读取剪贴板,自动加入联机房间 + Return 'TODO: 联机复活赛 If PageLinkMain.LinkState <> PageLinkMain.LinkStates.Waiting Then Return '已启动联机 If PageCurrent = PageType.Link Then Return '已在联机界面 Dim Code = ClipboardGetText() : If Code Is Nothing Then Return '剪贴板无文本 - If Setup.Get("LinkLastAutoJoinInviteCode") = Code Then Return - ' If PageLinkMain.ValidateCodeFormat(Code) IsNot Nothing Then Return '不是邀请码 - Return '联机关闭 直接return - Setup.Set("LinkLastAutoJoinInviteCode", Code) + If Settings.Get("LinkLastAutoJoinInviteCode") = Code Then Return + If PageLinkMain.ValidateCodeFormat(Code) IsNot Nothing Then Return '不是邀请码 + Settings.Set("LinkLastAutoJoinInviteCode", Code) RunInThread( Sub() If MyMsgBox("嘿,是否使用复制的邀请码加入房间?", "加入联机房间", "加入", "取消") = 2 Then Return '防止弹窗阻碍主线程,所以必须放在工作线程 @@ -899,10 +973,10 @@ Public Class FormMain "你可以在 版本设置 → 设置 → 服务器选项 中修改登录方式。", "第三方登录开启确认", "确定", "取消") = 2 Then Return End If - Setup.Set("VersionServerLogin", 4, Instance:=Target) - Setup.Set("VersionServerAuthServer", "https://littleskin.cn/api/yggdrasil", Instance:=Target) - Setup.Set("VersionServerAuthRegister", "https://littleskin.cn/auth/register", Instance:=Target) - Setup.Set("VersionServerAuthName", "LittleSkin 登录", Instance:=Target) + Settings.Set("VersionServerLogin", 4, Instance:=Target) + Settings.Set("VersionServerAuthServer", "https://littleskin.cn/api/yggdrasil", Instance:=Target) + Settings.Set("VersionServerAuthRegister", "https://littleskin.cn/auth/register", Instance:=Target) + Settings.Set("VersionServerAuthName", "LittleSkin 登录", Instance:=Target) Else '第三方 Authlib 服务器 If MyMsgBox($"是否要在版本 {Target.Name} 中开启第三方登录?" & vbCrLf & @@ -910,10 +984,10 @@ Public Class FormMain "你可以在 版本设置 → 设置 → 服务器选项 中修改登录方式。", "第三方登录开启确认", "确定", "取消") = 2 Then Return End If - Setup.Set("VersionServerLogin", 4, Instance:=Target) - Setup.Set("VersionServerAuthServer", AuthlibServer, Instance:=Target) - Setup.Set("VersionServerAuthRegister", AuthlibServer.Replace("api/yggdrasil", "auth/register"), Instance:=Target) - Setup.Set("VersionServerAuthName", "", Instance:=Target) + Settings.Set("VersionServerLogin", 4, Instance:=Target) + Settings.Set("VersionServerAuthServer", AuthlibServer, Instance:=Target) + Settings.Set("VersionServerAuthRegister", AuthlibServer.Replace("api/yggdrasil", "auth/register"), Instance:=Target) + Settings.Set("VersionServerAuthName", "", Instance:=Target) End If If PageCurrent = PageType.InstanceSetup AndAlso PageCurrentSub = PageSubType.InstanceSetup Then '正在服务器选项页,需要刷新设置项显示 @@ -965,14 +1039,14 @@ Public Class FormMain If FilePathList.Count > 1 Then '必须要求全部为 jar 文件 For Each File In FilePathList - If Not {"jar", "litemod", "disabled", "old"}.Contains(File.AfterLast(".").ToLower) Then + If Not {"jar", "litemod", "disabled", "old"}.Contains(File.AfterLast(".").Lower) Then Hint("一次请只拖入一个文件!", HintType.Red) Return End If Next End If '主页 - Dim Extension As String = FilePath.AfterLast(".").ToLower + Dim Extension As String = FilePath.AfterLast(".").Lower If Extension = "xaml" Then Log("[System] 文件后缀为 XAML,作为主页加载") If File.Exists(Path & "PCL\Custom.xaml") Then @@ -983,7 +1057,7 @@ Public Class FormMain CopyFile(FilePath, Path & "PCL\Custom.xaml") RunInUi( Sub() - Setup.Set("UiCustomType", 1) + Settings.Set("UiCustomType", 1) FrmLaunchRight.ForceRefresh() Hint("已加载主页自定义文件!", HintType.Green) End Sub) @@ -1596,7 +1670,7 @@ Public Class FormMain '关闭 Minecraft Public Sub BtnExtraShutdown_Click() Handles BtnExtraShutdown.Click Try - If McLaunchLoaderReal IsNot Nothing Then McLaunchLoaderReal.Abort() + If McLaunchLoaderReal IsNot Nothing Then McLaunchLoaderReal.Interrupt() For Each Watcher In McWatcherList Watcher.Kill() Next diff --git a/Plain Craft Launcher 2/Modules/Base/ModAnimation.vb b/Plain Craft Launcher 2/Modules/Base/ModAnimation.vb index a1fb5cd..3064d4c 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModAnimation.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModAnimation.vb @@ -8,7 +8,12 @@ Public Module ModAnimation ''' ''' 动画速度。最大为 200。 ''' - Public AniSpeed As Double = 1 + Public ReadOnly Property AniSpeed As Double + Get + Dim Setting = PCL.Settings.Get("SystemDebugAnim") + Return If(Setting >= 30, 200, MathClamp(Setting * 0.1 + 0.1, 0.1, 3)) + End Get + End Property ''' ''' 动画组列表。 ''' diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index 1e8106d..9b5cc20 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -14,25 +14,24 @@ Public Module ModBase #Region "声明" '下列版本信息由更新器自动修改 - Public Const VersionBaseName As String = "2.12.2" '不含分支前缀的显示用版本名 - Public Const VersionStandardCode As String = "2.12.2." & VersionBranchCode '标准格式的四段式版本号 + Public Const VersionBaseName As String = "2.12.6.2" '显示用版本名 Public Const CommitHash As String = "" 'Commit Hash,由 GitHub Workflow 自动替换 #If BETA Then - Public Const VersionCode As Integer = 379 'Release + Public Const VersionCode As Integer = 391 '正式版 #Else - Public Const VersionCode As Integer = 380 'Snapshot + Public Const VersionCode As Integer = 390 '快照版 #End If '自动生成的版本信息 Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName #If RELEASE Then - Public Const VersionBranchName As String = "Snapshot" - Public Const VersionBranchCode As String = "0" + Public Const VersionBranchName As String = "快照版" + Public Const VersionBranchCode As Integer = 0 #ElseIf BETA Then - Public Const VersionBranchName As String = "Release" - Public Const VersionBranchCode As String = "50" + Public Const VersionBranchName As String = "正式版" + Public Const VersionBranchCode As Integer = 50 #Else - Public Const VersionBranchName As String = "Debug" - Public Const VersionBranchCode As String = "100" + Public Const VersionBranchName As String = "开发版" + Public Const VersionBranchCode As Integer = 100 #End If ''' @@ -56,10 +55,6 @@ Public Module ModBase ''' Public Lang As String = "zh_CN" ''' - ''' 设置对象。 - ''' - Public Setup As New ModSetup - ''' ''' 程序的打开计时。 ''' Public ApplicationStartTick As Long = GetTimeMs() @@ -86,11 +81,11 @@ Public Module ModBase ''' ''' 系统盘盘符,以 \ 结尾。例如 “C:\”。 ''' - Public OsDrive As String = Environment.GetLogicalDrives().Where(Function(p) Directory.Exists(p)).First.ToUpper.First & ":\" '#3799 + Public OsDrive As String = Environment.GetLogicalDrives().Where(Function(p) Directory.Exists(p)).First.Upper.First & ":\" '#3799 ''' ''' 程序的缓存文件夹路径,以 \ 结尾。 ''' - Public PathTemp As String = If(Setup.Get("SystemSystemCache") = "", IO.Path.GetTempPath() & "PCL\", Setup.Get("SystemSystemCache")).ToString.Replace("/", "\").TrimEnd("\") & "\" + Public PathTemp As String = If(Settings.Get("SystemSystemCache") = "", IO.Path.GetTempPath() & "PCL\", Settings.Get("SystemSystemCache")).ToString.Replace("/", "\").TrimEnd("\") & "\" ''' ''' AppData 中的 PCL 文件夹路径,以 \ 结尾。 ''' @@ -416,17 +411,13 @@ Public Module ModBase Loading Finished Failed - Aborted + Interrupted End Enum ''' ''' 执行返回值。 ''' Public Enum ProcessReturnValues - ''' - ''' 执行成功,或进程被中断。 - ''' - Aborted = -1 ''' ''' 执行成功。 ''' @@ -620,7 +611,8 @@ Public Module ModBase Public Sub DeleteReg(Key As String, Optional ThrowException As Boolean = False) Try Dim SubKey As Microsoft.Win32.RegistryKey = My.Computer.Registry.CurrentUser.OpenSubKey("Software\" & RegFolder, True) - SubKey?.DeleteValue(Key) + If SubKey?.GetValue(Key) Is Nothing Then Return + SubKey.DeleteValue(Key) Catch ex As Exception Log(ex, "删除注册表出错:" & Key, If(ThrowException, LogLevel.Hint, LogLevel.Developer)) If ThrowException Then Throw @@ -1071,25 +1063,25 @@ Public Module ModBase ''' 获取文件 MD5,若失败则返回空字符串。 ''' Public Function GetFileMD5(FilePath As String) As String - Dim Retry As Boolean = False + Dim Retried As Boolean = False Re: Try - '获取 MD5 - Dim Result As New StringBuilder() - Dim File As New FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) - Dim MD5 As MD5 = New MD5CryptoServiceProvider() - Dim Retval As Byte() = MD5.ComputeHash(File) - File.Close() - For i = 0 To Retval.Length - 1 - Result.Append(Retval(i).ToString("x2")) - Next - Return Result.ToString + Using File As New FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) + Using h = MD5Cng.Create() + Dim Retval As Byte() = h.ComputeHash(File) + Dim Result As New StringBuilder(Retval.Length * 2) + For i = 0 To Retval.Length - 1 + Result.Append(Retval(i).ToString("x2")) + Next + Return Result.ToString + End Using + End Using Catch ex As Exception - If Retry OrElse TypeOf ex Is FileNotFoundException Then + If Retried OrElse TypeOf ex Is FileNotFoundException Then Log(ex, "获取文件 MD5 失败:" & FilePath) Return "" Else - Retry = True + Retried = True Log(ex, "获取文件 MD5 可重试失败:" & FilePath, LogLevel.Normal) Thread.Sleep(RandomInteger(200, 500)) GoTo Re @@ -1100,27 +1092,25 @@ Re: ''' 获取文件 SHA512,若失败则返回空字符串。 ''' Public Function GetFileSHA512(FilePath As String) As String - Dim Retry As Boolean = False + Dim Retried As Boolean = False Re: Try - ''检测该文件是否在下载中,若在下载则放弃检测 - 'If IgnoreOnDownloading AndAlso NetManage.Files.ContainsKey(FilePath) AndAlso NetManage.Files(FilePath).State <= NetState.Merge Then Return "" - '获取 SHA512 - Dim file As New FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) - Dim sha512 As SHA512 = New SHA512CryptoServiceProvider() - Dim retval As Byte() = sha512.ComputeHash(file) - file.Close() - Dim Result As New StringBuilder() - For i As Integer = 0 To retval.Length - 1 - Result.Append(retval(i).ToString("x2")) - Next - Return Result.ToString + Using File As New FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) + Using h = SHA512Cng.Create() + Dim retval As Byte() = h.ComputeHash(File) + Dim Result As New StringBuilder(retval.Length * 2) + For i As Integer = 0 To retval.Length - 1 + Result.Append(retval(i).ToString("x2")) + Next + Return Result.ToString + End Using + End Using Catch ex As Exception - If Retry OrElse TypeOf ex Is FileNotFoundException Then + If Retried OrElse TypeOf ex Is FileNotFoundException Then Log(ex, "获取文件 SHA512 失败:" & FilePath) Return "" Else - Retry = True + Retried = True Log(ex, "获取文件 SHA512 可重试失败:" & FilePath, LogLevel.Normal) Thread.Sleep(RandomInteger(200, 500)) GoTo Re @@ -1134,18 +1124,16 @@ Re: Dim Retry As Boolean = False Re: Try - ''检测该文件是否在下载中,若在下载则放弃检测 - 'If IgnoreOnDownloading AndAlso NetManage.Files.ContainsKey(FilePath) AndAlso NetManage.Files(FilePath).State <= NetState.Merge Then Return "" - '获取 SHA256 - Dim file As New FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) - Dim sha256 As SHA256 = New SHA256CryptoServiceProvider() - Dim retval As Byte() = sha256.ComputeHash(file) - file.Close() - Dim Result As New StringBuilder() - For i As Integer = 0 To retval.Length - 1 - Result.Append(retval(i).ToString("x2")) - Next - Return Result.ToString + Using File As New FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) + Using h = SHA256Cng.Create() + Dim retval As Byte() = h.ComputeHash(File) + Dim Result As New StringBuilder(retval.Length * 2) + For i As Integer = 0 To retval.Length - 1 + Result.Append(retval(i).ToString("x2")) + Next + Return Result.ToString() + End Using + End Using Catch ex As Exception If Retry OrElse TypeOf ex Is FileNotFoundException Then Log(ex, "获取文件 SHA256 失败:" & FilePath) @@ -1165,16 +1153,16 @@ Re: Dim Retry As Boolean = False Re: Try - '获取 SHA1 - Dim file As New FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) - Dim sha1 As SHA1 = New SHA1CryptoServiceProvider() - Dim retval As Byte() = sha1.ComputeHash(file) - file.Close() - Dim Result As New StringBuilder() - For i As Integer = 0 To retval.Length - 1 - Result.Append(retval(i).ToString("x2")) - Next - Return Result.ToString + Using File As New FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) + Using h = SHA1Cng.Create() + Dim retval As Byte() = h.ComputeHash(File) + Dim Result As New StringBuilder(retval.Length * 2) + For i As Integer = 0 To retval.Length - 1 + Result.Append(retval(i).ToString("x2")) + Next + Return Result.ToString + End Using + End Using Catch ex As Exception If Retry OrElse TypeOf ex Is FileNotFoundException Then Log(ex, "获取文件 SHA1 失败:" & FilePath) @@ -1257,11 +1245,11 @@ Re: End If If Not String.IsNullOrEmpty(Hash) Then If Hash.Length < 35 Then 'MD5 - If Hash.ToLowerInvariant <> GetFileMD5(LocalPath) Then Return "文件 MD5 应为 " & Hash & ",实际为 " & GetFileMD5(LocalPath) + If Hash.Lower <> GetFileMD5(LocalPath) Then Return "文件 MD5 应为 " & Hash & ",实际为 " & GetFileMD5(LocalPath) ElseIf Hash.Length = 64 Then 'SHA256 - If Hash.ToLowerInvariant <> GetFileSHA256(LocalPath) Then Return "文件 SHA256 应为 " & Hash & ",实际为 " & GetFileSHA256(LocalPath) + If Hash.Lower <> GetFileSHA256(LocalPath) Then Return "文件 SHA256 应为 " & Hash & ",实际为 " & GetFileSHA256(LocalPath) Else 'SHA1 (40) - If Hash.ToLowerInvariant <> GetFileSHA1(LocalPath) Then Return "文件 SHA1 应为 " & Hash & ",实际为 " & GetFileSHA1(LocalPath) + If Hash.Lower <> GetFileSHA1(LocalPath) Then Return "文件 SHA1 应为 " & Hash & ",实际为 " & GetFileSHA1(LocalPath) End If End If If IsJson Then @@ -1281,6 +1269,7 @@ Re: End Function End Class + '压缩文件 ''' ''' 尝试根据后缀名判断文件种类并解压文件,支持 gz 与 zip,会尝试将 jar 以 zip 方式解压。 ''' 会尝试创建,但不会清空目标文件夹。 @@ -1291,7 +1280,7 @@ Re: '解压 gz(gz 不需要考虑编码) If CompressFilePath.EndsWithF(".gz", True) Then Using stream As New GZipStream(New FileStream(CompressFilePath, FileMode.Open, FileAccess.Read, FileShare.Read), CompressionMode.Decompress) - Using decompressedFile As New FileStream(DestDirectory & GetFileNameFromPath(CompressFilePath).ToLower.Replace(".tar", "").Replace(".gz", ""), + Using decompressedFile As New FileStream(DestDirectory & GetFileNameFromPath(CompressFilePath).Lower.Replace(".tar", "").Replace(".gz", ""), FileMode.OpenOrCreate, FileAccess.Write) Dim data As Integer = stream.ReadByte() While data <> -1 @@ -1319,7 +1308,7 @@ Re: End Using End Sub Try - TryExtractZip(Encoding.UTF8) + TryExtractZip(New UTF8Encoding(False, True)) Catch ex As Exception Log(ex, $"首次解压尝试失败,将更换编码并重试({CompressFilePath} → {DestDirectory})") Try @@ -1329,6 +1318,25 @@ Re: End Try End Try End Sub + ''' + ''' 将多个文件打包为一个压缩文件。 + ''' 这些文件会被直接放在压缩包根目录下。 + ''' + Public Sub CreateCompressedFile(OutputFullPath As String, SourceFiles As IEnumerable(Of String)) + Dim DirectoryPath = IO.Path.GetDirectoryName(OutputFullPath) + If Not Directory.Exists(DirectoryPath) Then Directory.CreateDirectory(DirectoryPath) + Using ZipStream As New FileStream(OutputFullPath, FileMode.Create) + Using Archive As New ZipArchive(ZipStream, ZipArchiveMode.Create) + For Each FilePath In SourceFiles + If Not File.Exists(FilePath) Then Return + Using SourceStream As New FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read), + EntryStream As Stream = Archive.CreateEntry(IO.Path.GetFileName(FilePath)).Open() + SourceStream.CopyTo(EntryStream) + End Using + Next + End Using + End Using + End Sub ''' ''' 删除文件夹,返回删除的文件个数。通过参数选择是否抛出异常。 @@ -1336,7 +1344,7 @@ Re: Public Function DeleteDirectory(Path As String, Optional IgnoreIssue As Boolean = False) As Integer If Not Directory.Exists(Path) Then Return 0 If Not Path.EndsWithF("\") Then Path &= "\" - If Path.EndsWith(":\") OrElse + If Path.EndsWithF(":\") OrElse Path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\" OrElse Path = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) & "\" OrElse Path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\" Then '#7030 @@ -1347,11 +1355,12 @@ Re: Dim Files As String() Try Files = Directory.GetFiles(Path) - Catch ex As DirectoryNotFoundException '#4549 - If Not Directory.Exists(Path) Then Return 0 '可能已被其他线程删除 - Log(ex, $"疑似为孤立符号链接,尝试直接删除({Path})", LogLevel.Developer) - Directory.Delete(Path) - Return 0 + Catch ex As DirectoryNotFoundException '#4549,也可能已被其他线程删除 + If Directory.Exists(Path) Then + Log(ex, $"疑似为孤立符号链接,尝试直接删除({Path})", LogLevel.Developer) + Directory.Delete(Path) + End If + Return DeletedCount End Try For Each FilePath As String In Files Dim RetriedFile As Boolean = False @@ -1359,6 +1368,8 @@ RetryFile: Try File.Delete(FilePath) DeletedCount += 1 + Catch ex As DirectoryNotFoundException + Return DeletedCount Catch ex As Exception If Not RetriedFile Then RetriedFile = True @@ -1420,17 +1431,25 @@ RetryDir: ''' ''' 若路径长度大于指定值,则将长路径转换为短路径。 - ''' 如果路径不存在,则返回原始路径。 ''' - Public Function ShortenPath(LongPath As String) As String - If LongPath.Length <= 200 OrElse LongPath.StartsWithF("http", True) Then Return LongPath - If Not Directory.Exists(LongPath) AndAlso Not File.Exists(LongPath) Then Return LongPath - Dim ShortPath As New StringBuilder(260) - GetShortPathName(LongPath.Replace("/", "\"), ShortPath, 260) '第一个参数也会在调用后被修改,使用 Replace 后不会影响原始字符串 - ShortenPath = ShortPath.ToString - If String.IsNullOrEmpty(ShortenPath) Then Return LongPath + Public Function ShortenPath(Raw As String) As String + If Raw.Length <= 200 OrElse Raw.StartsWithF("http", True) Then Return Raw + If Not Directory.Exists(Raw) AndAlso Not File.Exists(Raw) Then Return Raw + Dim PathToShorten As String, Ignored As String + If Not Directory.Exists(Raw) AndAlso Raw.EndsWithF(".jar", True) Then '只能缩短文件夹部分,必须保留 jar 文件名,否则会导致 Forge 1.20.1 无法通过文件名识别模块名 + PathToShorten = GetPathFromFullPath(Raw) + Ignored = GetFileNameFromPath(Raw) + Else + PathToShorten = Raw + Ignored = "" + End If + Dim ShortPathBuffer As New StringBuilder(260) + GetShortPathNameW(PathToShorten.Replace("/", "\"), ShortPathBuffer, 260) + Dim DirShortPath As String = ShortPathBuffer.ToString() + If String.IsNullOrEmpty(DirShortPath) Then Return Raw + Return If(String.IsNullOrEmpty(Ignored), DirShortPath, IO.Path.Combine(DirShortPath, Ignored)) End Function - Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (lpszLongPath As String, lpszShortPath As StringBuilder, cchBuffer As Integer) As Integer + Private Declare Unicode Function GetShortPathNameW Lib "kernel32" Alias "GetShortPathNameW" (lpszLongPath As String, lpszShortPath As StringBuilder, cchBuffer As Integer) As Integer #End Region @@ -1497,7 +1516,7 @@ RetryDir: Ex = Ex.InnerException Loop DescList = DescList.Distinct.ToList - Dim Desc As String = Join(DescList, vbCrLf & "→ ") + Dim Desc As String = DescList.Join(vbCrLf & "→ ") '构造输出信息 Dim UsualReason As String = AnalyzeUsualReason(InnerEx, OuterEx, DescList) @@ -1505,7 +1524,7 @@ RetryDir: Return UsualReason & "详细错误:" & DescList.First Else DescList.Reverse() '让最深层错误在最左边 - Return Join(DescList, " ← ") + Return DescList.Join(" ← ") End If End Function Private Function AnalyzeUsualReason(InnerEx As Exception, OuterEx As Exception, DescList As List(Of String)) As String @@ -1588,7 +1607,7 @@ RetryDir: ''' Public Function Capitalize(word As String) As String If String.IsNullOrEmpty(word) Then Return word - Return word.Substring(0, 1).ToUpperInvariant() & word.Substring(1).ToLowerInvariant() + Return word.Substring(0, 1).Upper() & word.Substring(1).Lower() End Function ''' @@ -1608,7 +1627,24 @@ RetryDir: ''' ''' 连接字符串。 ''' + Public Function Join(List As IEnumerable, Split As Char) As String + Dim Builder As New StringBuilder + Dim IsFirst As Boolean = True + For Each Element In List + If IsFirst Then + IsFirst = False + Else + Builder.Append(Split) + End If + If Element IsNot Nothing Then Builder.Append(Element) + Next + Return Builder.ToString + End Function + ''' + ''' 连接字符串。 + ''' Public Function Join(List As IEnumerable, Split As String) As String + If Split.IsSingle Then Return List.Join(Split(0)) Dim Builder As New StringBuilder Dim IsFirst As Boolean = True For Each Element In List @@ -1626,7 +1662,7 @@ RetryDir: ''' 若原始字符串为空,则返回 {""}。 ''' Public Function Split(FullStr As String, SplitStr As String) As String() - If SplitStr.Length = 1 Then + If SplitStr.IsSingle Then Return FullStr.Split(SplitStr(0)) Else Return FullStr.Split({SplitStr}, StringSplitOptions.None) @@ -1647,14 +1683,14 @@ RetryDir: ''' 获取字符串 MD5。 ''' Public Function GetStringMD5(Str As String) As String - Dim md5Hasher As New MD5CryptoServiceProvider - Dim hashedDataBytes As Byte() - hashedDataBytes = md5Hasher.ComputeHash(Encoding.GetEncoding("gb2312").GetBytes(Str)) - Dim tmp As New StringBuilder() - For Each i As Byte In hashedDataBytes - tmp.Append(i.ToString("x2")) - Next - Return tmp.ToString() + Using h = MD5Cng.Create() + Dim hashedDataBytes = h.ComputeHash(Encoding.GetEncoding("gb2312").GetBytes(Str)) + Dim tmp As New StringBuilder(hashedDataBytes.Length * 2) + For Each i As Byte In hashedDataBytes + tmp.Append(i.ToString("x2")) + Next + Return tmp.ToString() + End Using End Function ''' ''' 检查字符串中的字符是否均为 ASCII 字符。 @@ -1799,6 +1835,19 @@ RetryDir: End Try End Function + ''' + ''' 等效 ToLowerInvariant。 + ''' + Public Function Lower(Str As String) As String + Return Str.ToLowerInvariant() + End Function + ''' + ''' 等效 ToUpperInvariant。 + ''' + Public Function Upper(Str As String) As String + Return Str.ToUpperInvariant() + End Function + '转义 ''' ''' 为字符串进行 XML 转义。 @@ -1888,50 +1937,53 @@ RetryDir: ''' 被搜索的长内容。 ''' 用户输入的搜索文本。 Private Function SearchSimilarity(Source As String, Query As String) As Double + If String.IsNullOrEmpty(Source) OrElse String.IsNullOrEmpty(Query) Then Return 0 Dim qp As Integer = 0, lenSum As Double = 0 - Source = Source.ToLower.Replace(" ", "") - Query = Query.ToLower.Replace(" ", "") - Dim sourceLength As Integer = Source.Length, queryLength As Integer = Query.Length '用于计算最后因数的长度缓存 + Dim str As New StringBuilder(Source.Length) + str.Append(Source.Lower().Replace(" ", "")) + Query = Query.Lower().Replace(" ", "") + Dim sourceLength As Integer = str.Length, queryLength As Integer = Query.Length '用于计算最后因数的长度缓存 + If queryLength = 0 Then Return 0 Do While qp < queryLength '对 qp 作为开始位置计算 Dim sp As Integer = 0, lenMax As Integer = 0, spMax As Integer = 0 - '查找以 qp 为头的最大子串 - Do While sp < Source.Length - '对每个 sp 作为开始位置计算最大子串 + Dim currentSourceLength As Integer = str.Length + Do While sp < currentSourceLength Dim len As Integer = 0 - Do While (qp + len) < queryLength AndAlso (sp + len) < Source.Length AndAlso Source(sp + len) = Query(qp + len) + While (qp + len) < queryLength AndAlso (sp + len) < currentSourceLength AndAlso str(sp + len) = Query(qp + len) len += 1 - Loop + End While '存储 len If len > lenMax Then lenMax = len spMax = sp End If '根据结果增加 sp - sp += Math.Max(1, len) + sp += If(len > 0, len, 1) Loop If lenMax > 0 Then - Source = Source.Substring(0, spMax) & If(Source.Count > spMax + lenMax, Source.Substring(spMax + lenMax), String.Empty) '将源中的对应字段替换空 + str.Remove(spMax, lenMax) '将源中的对应字段移除 '存储 lenSum Dim IncWeight = (Math.Pow(1.4, 3 + lenMax) - 3.6) '根据长度加成 IncWeight *= 1 + 0.3 * Math.Max(0, 3 - Math.Abs(qp - spMax)) '根据位置加成 lenSum += IncWeight End If - '根据结果增加 qp - qp += Math.Max(1, lenMax) + qp += If(lenMax > 0, lenMax, 1) Loop '计算结果:重复字段量 × 源长度影响比例 - Return (lenSum / queryLength) * (3 / Math.Pow(sourceLength + 15, 0.5)) * If(queryLength <= 2, 3 - queryLength, 1) + Return (lenSum / queryLength) * (3 / Math.Sqrt(sourceLength + 15)) * If(queryLength <= 2, 3 - queryLength, 1) End Function ''' ''' 获取多段文本加权后的相似度。 ''' - Private Function SearchSimilarityWeighted(Source As List(Of KeyValuePair(Of String, Double)), Query As String) As Double + Private Function SearchSimilarityWeighted(Source As List(Of SearchSource), Query As String) As Double Dim TotalWeight As Double = 0 Dim Sum As Double = 0 For Each Pair In Source - Sum += SearchSimilarity(Pair.Key, Query) * Pair.Value - TotalWeight += Pair.Value + If Pair.Aliases.Any Then + Sum += Pair.Aliases.Max(Function(a) SearchSimilarity(a, Query)) * Pair.Weight + End If + TotalWeight += Pair.Weight Next Return Sum / TotalWeight End Function @@ -1944,9 +1996,10 @@ RetryDir: ''' Public Item As T ''' - ''' 该项目用于搜索的源。 + ''' 该项目用于搜索的文本源。 + ''' 在搜索时,会对每个文本源单独加权,但单个文本源内的多个别名只取最高的一个的相似度。 ''' - Public SearchSource As List(Of KeyValuePair(Of String, Double)) + Public SearchSource As List(Of SearchSource) ''' ''' 相似度。 ''' @@ -1955,9 +2008,29 @@ RetryDir: ''' 是否完全匹配。 ''' Public AbsoluteRight As Boolean + Public Overrides Function ToString() As String + Return Math.Round(Similarity, 3) & " - " & Item.ToString() + End Function + End Class + ''' + ''' 单个用于搜索的文本源。 + ''' + Public Class SearchSource + Public Aliases As String() + Public Weight As Double + Public Sub New(Aliases As String(), Optional Weight As Double = 1) + Me.Aliases = Aliases + Me.Weight = Weight + End Sub + Public Sub New(Text As String, Optional Weight As Double = 1) + Me.Aliases = {Text} + Me.Weight = Weight + End Sub End Class ''' ''' 进行多段文本加权搜索,获取相似度较高的数项结果。 + ''' 在搜索时,会对每个文本源单独加权,但单个文本源内的多个别名只取最高的一个的相似度。 + ''' 这会修改 Entries 中每项的 Similarity 与 AbsoluteRight 字段。 ''' ''' 返回的最大模糊结果数。 ''' 返回结果要求的最低相似度。 @@ -1966,29 +2039,26 @@ RetryDir: Dim ResultList As New List(Of SearchEntry(Of T)) If Not Entries.Any() Then Return ResultList '进行搜索,获取相似信息 + Dim QueryParts = Query.Split({" "c}, StringSplitOptions.RemoveEmptyEntries) + Dim Candidates As New List(Of SearchEntry(Of T)) For Each Entry In Entries Entry.Similarity = SearchSimilarityWeighted(Entry.SearchSource, Query) Entry.AbsoluteRight = - Query.Split(" ").All( '对于按空格分割的每一段 + QueryParts.All( '对于按空格分割的每一段 Function(QueryPart) Entry.SearchSource.Any( '若与任意一个搜索源完全匹配,则标记为完全匹配项 - Function(Source) Source.Key.Replace(" ", "").ContainsF(QueryPart, True))) + Function(Source) Source.Aliases.Any( + Function([Alias]) [Alias].Replace(" ", "").ContainsF(QueryPart, True)))) + If Entry.AbsoluteRight OrElse Entry.Similarity >= MinBlurSimilarity Then Candidates.Add(Entry) Next '按照相似度进行排序 - Entries = Entries.SortByComparison( - Function(Left, Right) As Boolean - If Left.AbsoluteRight Xor Right.AbsoluteRight Then - Return Left.AbsoluteRight - Else - Return Left.Similarity > Right.Similarity - End If - End Function) + Candidates = Candidates.SortByComparison(Function(Left, Right) If(Left.AbsoluteRight <> Right.AbsoluteRight, Left.AbsoluteRight, Left.Similarity > Right.Similarity)) '返回结果 Dim BlurCount As Integer = 0 - For Each Entry In Entries + For Each Entry In Candidates If Entry.AbsoluteRight Then ResultList.Add(Entry) '完全匹配,直接加入 Else - If Entry.Similarity < MinBlurSimilarity OrElse BlurCount = MaxBlurCount Then Exit For '模糊结果边界条件 + If BlurCount = MaxBlurCount Then Exit For ResultList.Add(Entry) BlurCount += 1 '模糊结果计数 End If @@ -2167,7 +2237,7 @@ RetryDir: ''' Public Function GetResultWithTimeout(Of T)(TargetTask As Task(Of T), TokenSource As CancellationTokenSource, TimeoutMs As Integer) As T Dim DelayTask = Task.Delay(TimeoutMs) - If Task.WhenAny(TargetTask, DelayTask).GetAwaiter().GetResult() Is DelayTask Then + If Task.WhenAny(TargetTask, DelayTask).ConfigureAwait(False).GetAwaiter().GetResult() Is DelayTask Then TokenSource.Cancel() Throw New TimeoutException($"任务超时({TimeoutMs} ms)") End If @@ -2178,7 +2248,7 @@ RetryDir: ''' Public Sub GetResultWithTimeout(TargetTask As Task, TokenSource As CancellationTokenSource, TimeoutMs As Integer) Dim DelayTask = Task.Delay(TimeoutMs) - If Task.WhenAny(TargetTask, DelayTask).GetAwaiter().GetResult() Is DelayTask Then + If Task.WhenAny(TargetTask, DelayTask).ConfigureAwait(False).GetAwaiter().GetResult() Is DelayTask Then TokenSource.Cancel() Throw New TimeoutException($"任务超时({TimeoutMs} ms)") End If @@ -2296,6 +2366,22 @@ NextElement: Return Arr?.Count > 0 End Function ''' + ''' 判断这是否是仅有一个元素的集合。 + ''' + Public Function IsSingle(Of T)(Source As IEnumerable(Of T)) As Boolean + If Source Is Nothing Then + Return False + ElseIf TypeOf Source Is IList(Of T) Then + Return DirectCast(Source, IList(Of T)).Count = 1 + Else + Using Enumerator = Source.GetEnumerator() + If Not Enumerator.MoveNext() Then Return False + If Enumerator.MoveNext() Then Return False + Return True + End Using + End If + End Function + ''' ''' 对集合的每个元素执行指定操作。 ''' Public Function ForEach(Of T)(Collection As IEnumerable(Of T), Action As Action(Of T)) As IEnumerable(Of T) @@ -2525,11 +2611,63 @@ NextElement: End If End Sub + ''' + ''' 选择所有最大值对应的对象。 + ''' 若没有元素则返回空列表。 + ''' + Public Function MaxByAll(Of T, C As IComparable(Of C))(Source As IEnumerable(Of T), Selector As Func(Of T, C)) As List(Of T) + Dim Results As New List(Of T) + Using Enumerator = Source.GetEnumerator() + If Not Enumerator.MoveNext() Then Return Results + Dim MaxItem As T = Enumerator.Current + Dim MaxValue As C = Selector(MaxItem) + Results.Add(MaxItem) + While Enumerator.MoveNext() + Dim CurrentItem = Enumerator.Current + Dim CurrentValue = Selector(CurrentItem) + Dim Comparison = CurrentValue.CompareTo(MaxValue) + If Comparison > 0 Then + MaxValue = CurrentValue + Results.Clear() + Results.Add(CurrentItem) + ElseIf Comparison = 0 Then + Results.Add(CurrentItem) + End If + End While + End Using + Return Results + End Function + ''' + ''' 选择所有最小值对应的对象。 + ''' 若没有元素则返回空列表。 + ''' + Public Function MinByAll(Of T, C As IComparable(Of C))(List As IEnumerable(Of T), Selector As Func(Of T, C)) As List(Of T) + Dim Results As New List(Of T) + Using Enumerator = List.GetEnumerator() + If Not Enumerator.MoveNext() Then Return Results + Dim MinItem As T = Enumerator.Current + Dim MinValue As C = Selector(MinItem) + Results.Add(MinItem) + While Enumerator.MoveNext() + Dim CurrentItem = Enumerator.Current + Dim CurrentValue = Selector(CurrentItem) + Dim Comparison = CurrentValue.CompareTo(MinValue) + If Comparison < 0 Then + MinValue = CurrentValue + Results.Clear() + Results.Add(CurrentItem) + ElseIf Comparison = 0 Then + Results.Add(CurrentItem) + End If + End While + End Using + Return Results + End Function ''' ''' 选择最大值对应的对象。 ''' 若没有元素则返回 Nothing。 ''' - Public Function MaxOf(Of T, C As IComparable(Of C))(Source As IEnumerable(Of T), Selector As Func(Of T, C)) As T + Public Function MaxBy(Of T, C As IComparable(Of C))(Source As IEnumerable(Of T), Selector As Func(Of T, C)) As T Using Enumerator = Source.GetEnumerator() If Not Enumerator.MoveNext() Then Return Nothing Dim MaxItem As T = Enumerator.Current @@ -2547,7 +2685,7 @@ NextElement: ''' 选择最小值对应的对象。 ''' 若没有元素则返回 Nothing。 ''' - Public Function MinOf(Of T, C As IComparable(Of C))(List As IEnumerable(Of T), Selector As Func(Of T, C)) As T + Public Function MinBy(Of T, C As IComparable(Of C))(List As IEnumerable(Of T), Selector As Func(Of T, C)) As T Using Enumerator = List.GetEnumerator() If Not Enumerator.MoveNext() Then Return Nothing Dim MinItem As T = Enumerator.Current @@ -2660,7 +2798,7 @@ NextElement: Try Location = Location.Replace("/", "\").Trim(" "c, """"c) Log("[System] 正在打开资源管理器:" & Location) - If Location.EndsWith("\") Then + If Location.EndsWithF("\") Then StartProcess(Location) Else StartProcess("explorer", $"/select,""{Location}""") @@ -2860,7 +2998,7 @@ Retry: '类型检查 Using Reader As New XamlXmlReader(Stream) While Reader.Read() - For Each BlackListType In {GetType(WebBrowser), GetType(Frame), GetType(MediaElement), GetType(ObjectDataProvider), GetType(XamlReader), GetType(Window), GetType(XmlDataProvider)} + For Each BlackListType In {GetType(WebBrowser), GetType(Frame), GetType(MediaElement), GetType(ObjectDataProvider), GetType(XamlReader), GetType(Window), GetType(XmlDataProvider), GetType(SettingService)} If Reader.Type IsNot Nothing AndAlso BlackListType.IsAssignableFrom(Reader.Type.UnderlyingType) Then Throw New UnauthorizedAccessException($"基于安全考虑,不允许使用 {BlackListType.Name} 类型。") If Reader.Value IsNot Nothing AndAlso Reader.Value = BlackListType.Name Then Throw New UnauthorizedAccessException($"基于安全考虑,不允许使用 {BlackListType.Name} 值。") Next @@ -2917,11 +3055,22 @@ Retry: Return formattedText.Width End Function + ''' + ''' 将布尔值转换为 Visibility。True 转换为 Visible,False 转换为 Collapsed。 + ''' + Public Function ToVisibility(IsVisible As Boolean) As Visibility + Return If(IsVisible, Visibility.Visible, Visibility.Collapsed) + End Function + #End Region #Region "Debug" - Public ModeDebug As Boolean = False + Public ReadOnly Property ModeDebug As Boolean + Get + Return Settings.Get("SystemDebugMode") + End Get + End Property 'Log Public Enum LogLevel @@ -3194,9 +3343,11 @@ Retry: '遥测 Public Sub Telemetry([Event] As String, ParamArray Datas As String()) - If Not Setup.Get("SystemSystemTelemetry") Then Return '用户关闭了遥测 +#If Not RELEASE And Not BETA Then + Return '开发版不上传遥测 +#End If + If Not Settings.Get("SystemSystemTelemetry") Then Return '用户关闭了遥测 If Not ClsBaseUrl.StartsWithF("http") Then Return '开源版没有设置遥测地址 - If VersionBranchName = "Debug" Then Return '开发版本不上传遥测 RunInNewThread( Sub() Try @@ -3214,10 +3365,10 @@ Retry: '获取当前的堆栈信息 Public Function GetStackTrace() As String - Dim Stack As New StackTrace() - Return Join(Stack.GetFrames().Skip(1).Select(Function(f) f.GetMethod). - Select(Function(f) f.Name & "(" & Join(f.GetParameters.Select(Function(p) p.ToString).ToList, ", ") & ") - " & f.Module.ToString).ToList, - vbCrLf).Replace(vbCrLf & vbCrLf, vbCrLf) + Return (New StackTrace).GetFrames().Skip(1). + Select(Function(f) f.GetMethod). + Select(Function(f) $"{f.Name}({f.GetParameters.Select(Function(p) p.ToString).Join(", ")}) - {f.Module}"). + Join(vbCrLf).Replace(vbCrLf & vbCrLf, vbCrLf) End Function #End Region diff --git a/Plain Craft Launcher 2/Modules/Base/ModLoader.vb b/Plain Craft Launcher 2/Modules/Base/ModLoader.vb index 0071a62..4dc8dd0 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModLoader.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModLoader.vb @@ -88,7 +88,7 @@ Set(value As LoadState) If _State = value Then Return Dim OldState = _State - If value = LoadState.Finished AndAlso Setup.Get("SystemDebugDelay") Then Thread.Sleep(RandomInteger(100, 2000)) + If value = LoadState.Finished AndAlso Settings.Get("SystemDebugDelay") Then Thread.Sleep(RandomInteger(100, 2000)) _State = value If Not LogBlackList.Contains(Name) Then Log($"[Loader] 加载器 {Name} 状态改变:{GetStringFromEnum(value)}") '实现 ILoadingTrigger 接口与 OnStateChanged 回调 @@ -149,7 +149,7 @@ Case LoadState.Waiting Return 0 Case LoadState.Loading - Return If(_Progress = -1, 0.02, _Progress) + Return If(_Progress = -1, 0, _Progress) Case Else Return 1 End Select @@ -170,7 +170,7 @@ '状态变化 Public MustOverride Sub Start(Optional Input As Object = Nothing, Optional IsForceRestart As Boolean = False) - Public MustOverride Sub Abort() + Public MustOverride Sub Interrupt() Public MustOverride Sub Failed(Ex As Exception) '等待结束 @@ -187,7 +187,7 @@ Loop If State = LoadState.Finished Then Return - ElseIf State = LoadState.Aborted Then + ElseIf State = LoadState.Interrupted Then Throw New ThreadInterruptedException("加载器执行已中断。") ElseIf IsNothing([Error]) Then Throw New Exception("未知错误!") @@ -210,7 +210,7 @@ Loop If State = LoadState.Finished Then Return - ElseIf State = LoadState.Aborted Then + ElseIf State = LoadState.Interrupted Then Throw New ThreadInterruptedException("加载器执行已中断。") ElseIf IsNothing([Error]) Then Throw New Exception("未知错误!") @@ -241,16 +241,16 @@ ''' ''' 当前执行线程是否应当中断。只应用在加载器的工作线程中判断,不可跨线程调用。 ''' - Public ReadOnly Property IsAborted As Boolean + Public ReadOnly Property IsInterrupted As Boolean Get - Return IsAbortedWithThread(Thread.CurrentThread) + Return IsInterruptedWithThread(Thread.CurrentThread) End Get End Property ''' ''' 当前执行线程是否应当中断。需要手动提供加载器线程,用于需要跨线程检查的情况。 ''' - Public Function IsAbortedWithThread(Thread As Thread) As Boolean - Return LastRunningThread Is Nothing OrElse Not ReferenceEquals(Thread, LastRunningThread) OrElse State = LoadState.Aborted + Public Function IsInterruptedWithThread(Thread As Thread) As Boolean + Return LastRunningThread Is Nothing OrElse Not ReferenceEquals(Thread, LastRunningThread) OrElse State = LoadState.Interrupted End Function ''' ''' 在输入相同时使用原有结果的超时,单位为毫秒。 @@ -305,7 +305,7 @@ '确认是否开始加载 If ShouldStart(Input, IsForceRestart) Then '输入不同或失败,开始加载 - If State = LoadState.Loading Then TriggerThreadAbort() + If State = LoadState.Loading Then TriggerThreadInterrupt() Me.Input = Input SyncLock LockState State = LoadState.Loading @@ -321,7 +321,7 @@ IsForceRestarting = IsForceRestart If ModeDebug AndAlso Not LogBlackList.Contains(Name) Then Log($"[Loader] 加载线程 {Name} ({Thread.CurrentThread.ManagedThreadId}) 已{If(IsForceRestarting, "强制", "")}启动") LoadDelegate(Me) - If IsAborted Then + If IsInterrupted Then Log($"[Loader] 加载线程 {Name} ({Thread.CurrentThread.ManagedThreadId}) 已中断但线程正常运行至结束,输出被弃用(最新线程:{If(LastRunningThread Is Nothing, -1, LastRunningThread.ManagedThreadId)})", LogLevel.Developer) Return End If @@ -331,18 +331,18 @@ LastFinishedTime = GetTimeMs() '未中断,本次输出有效 Catch ex As CancelledException If ModeDebug Then Log(ex, $"加载线程 {Name} ({Thread.CurrentThread.ManagedThreadId}) 已触发取消中断,已完成 {Math.Round(Progress * 100)}%") - If Not IsAborted Then State = LoadState.Aborted + If Not IsInterrupted Then State = LoadState.Interrupted Catch ex As ThreadInterruptedException If ModeDebug Then Log(ex, $"加载线程 {Name} ({Thread.CurrentThread.ManagedThreadId}) 已触发线程中断,已完成 {Math.Round(Progress * 100)}%") - '如果线程是因为判断到 IsAborted 而提前中止,则代表已有新线程被重启,此时不应当改为 Aborted - '如果线程是在没有 IsAborted 时手动引发了 ThreadInterruptedException,则代表没有重启线程,这通常代表用户手动取消,应当改为 Aborted - If Not IsAborted Then State = LoadState.Aborted + '如果线程是因为判断到 IsInterrupted 而提前中止,则代表已有新线程被重启,此时不应当改为 Interrupted + '如果线程是在没有 IsInterrupted 时手动引发了 ThreadInterruptedException,则代表没有重启线程,这通常代表用户手动取消,应当改为 Interrupted + If Not IsInterrupted Then State = LoadState.Interrupted Catch ex As Exception Failed(ex) End Try End Sub) With {.Name = "L/" & Name, .Priority = ThreadPriority} Try - LastRunningThread.Start() '不能使用 RunInNewThread,否则在函数返回前线程就会运行完,导致误判 IsAborted + LastRunningThread.Start() '不能使用 RunInNewThread,否则在函数返回前线程就会运行完,导致误判 IsInterrupted Catch ex As ThreadStateException '若遇到偶发的 “线程正在运行或被终止”,则等待后重试 Thread.Sleep(500) LastRunningThread.Start() @@ -351,20 +351,20 @@ Public Overrides Sub Failed(ex As Exception) [Error] = ex SyncLock LockState - If IsAborted OrElse State >= LoadState.Finished Then Return + If IsInterrupted OrElse State >= LoadState.Finished Then Return State = LoadState.Failed End SyncLock Log(ex, $"加载线程 {Name} ({Thread.CurrentThread.ManagedThreadId}) 出错,已完成 {Math.Round(Progress * 100)}%", LogLevel.Developer) - TriggerThreadAbort() + TriggerThreadInterrupt() End Sub - Public Overrides Sub Abort() + Public Overrides Sub Interrupt() SyncLock LockState If State <> LoadState.Loading Then Return - State = LoadState.Aborted + State = LoadState.Interrupted End SyncLock - TriggerThreadAbort() + TriggerThreadInterrupt() End Sub - Private Sub TriggerThreadAbort() + Private Sub TriggerThreadInterrupt() If LastRunningThread Is Nothing Then Return If LastRunningThread.IsAlive Then LastRunningThread.Interrupt() @@ -451,11 +451,11 @@ End If RunInThread(AddressOf Update) End Sub - Public Overrides Sub Abort() + Public Overrides Sub Interrupt() '改变状态 SyncLock LockState If State = LoadState.Loading OrElse State = LoadState.Waiting Then - State = LoadState.Aborted + State = LoadState.Interrupted Else Return End If @@ -464,7 +464,7 @@ Sub() '中断加载器 For Each Loader In Loaders - Loader.Abort() + Loader.Interrupt() Next End Sub) End Sub @@ -475,7 +475,7 @@ State = LoadState.Failed End SyncLock For Each Loader In Loaders - Loader.Abort() + Loader.Interrupt() Next FrmMain.BtnExtraDownload.ShowRefresh() End Sub @@ -493,9 +493,9 @@ Case LoadState.Finished '正常结束,触发刷新 Update() - Case LoadState.Aborted + Case LoadState.Interrupted '被中断,这个任务也中断 - Abort() + Interrupt() Case LoadState.Failed '完蛋,出错了 Failed(New Exception(Loader.Name & "失败", Loader.Error)) @@ -505,7 +505,7 @@ ''' 触发一次更新,以启动新加载器或完成。 ''' Private Sub Update() - If State = LoadState.Finished OrElse State = LoadState.Failed OrElse State = LoadState.Aborted Then Return + If State = LoadState.Finished OrElse State = LoadState.Failed OrElse State = LoadState.Interrupted Then Return Dim IsFinished As Boolean = True Dim Blocked As Boolean = False Dim Input As Object = Me.Input @@ -607,7 +607,7 @@ Restart: '若单个任务已中止,或全部任务已完成,则刷新并移除 For Each Task In LoaderTaskbar If LoaderTaskbar.All(Function(l) l.State <> LoadState.Loading) OrElse - (Task.State = LoadState.Waiting OrElse Task.State = LoadState.Aborted) Then + (Task.State = LoadState.Waiting OrElse Task.State = LoadState.Interrupted) Then FrmSpeedLeft?.TaskRefresh(Task) LoaderTaskbar.Remove(Task) Log($"[Taskbar] {Task.Name} 已移出任务列表") diff --git a/Plain Craft Launcher 2/Modules/Base/ModNet.vb b/Plain Craft Launcher 2/Modules/Base/ModNet.vb index dbfac3a..ed60a3c 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModNet.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModNet.vb @@ -1,5 +1,4 @@ -Imports System.Net.Http.Headers -Imports System.Net.Sockets +Imports System.Net.Sockets Imports System.Runtime.CompilerServices Imports System.Threading.Tasks @@ -161,7 +160,7 @@ RequestFinished: NetRequestByLoader = ReadFile(Temp) File.Delete(Temp) Finally - NewTask.Abort() + NewTask.Interrupt() End Try End Function @@ -183,10 +182,19 @@ RequestFinished: Throw New Exception($"预处理下载文件路径失败({LocalPath})", ex) End Try '下载 + Dim RetryCount As Integer = 0 +Retry: Try File.WriteAllBytes(LocalPath, SendRequest(Url, HttpMethod.Get, SimulateBrowserHeaders:=SimulateBrowserHeaders)) + Catch ex As ThreadInterruptedException + File.Delete(LocalPath) + Throw Catch ex As Exception File.Delete(LocalPath) + If RetryCount < 2 Then + RetryCount += 1 + GoTo Retry + End If Throw New WebException($"通过网络请求直接下载小文件失败({LocalPath})", ex) End Try End Sub @@ -209,7 +217,7 @@ RequestFinished: Catch ex As Exception Throw New WebException($"多线程直接下载文件失败(第一下载源:" & Urls.First() & ")", ex) Finally - NewTask.Abort() + NewTask.Interrupt() End Try End Sub @@ -239,7 +247,7 @@ RequestFinished: End If '写入 Headers For Each Header In If(Headers, New Dictionary(Of String, String)) - If Header.Key.ToLower = "content-type" Then + If Header.Key.Lower = "content-type" Then Request.Content?.Headers.TryAddWithoutValidation(Header.Key, Header.Value) Else Request.Headers.TryAddWithoutValidation(Header.Key, Header.Value) @@ -248,14 +256,13 @@ RequestFinished: SecretHeadersSign(Url, Request, SimulateBrowserHeaders) 'DNS 解析 CancelToken = New CancellationTokenSource(Timeout) - HostIp = DNSLookup(Request, CancelToken) + HostIp = DNSLookup(Request, CancelToken.Token) If HostIp IsNot Nothing AndAlso Not IPReliability.ContainsKey(HostIp) Then IPReliability(HostIp) = -0.01 '预先降低一点,这样快速的重复请求会使用不同的 IP 以提高成功率 End If '发送请求 SyncLock RequestClientLock - '延迟初始化,以避免在程序启动前加载 CacheCow 导致 DLL 加载失败 - If RequestClient Is Nothing Then + If RequestClient Is Nothing Then '延迟初始化,以避免在程序启动前加载 CacheCow 导致 DLL 加载失败 RequestClient = CacheCow.Client.ClientExtensions.CreateClient(New CacheCow.Client.FileCacheStore.FileStore(PathTemp & "Cache/Http/"), New HttpClientHandler With { .AutomaticDecompression = DecompressionMethods.Deflate Or DecompressionMethods.GZip, .UseCookies = False '不设为 False 就不能从 Header 手动传入 Cookies @@ -263,11 +270,12 @@ RequestFinished: End If End SyncLock Response = RequestClient.SendAsync(Request, HttpCompletionOption.ResponseHeadersRead, CancelToken.Token).GetResultWithTimeout(CancelToken, Timeout) - Dim ResponseStream = Response.Content.ReadAsStreamAsync().GetAwaiter().GetResult() Dim ResponseBytes As Byte() - Using Stream As New MemoryStream - ResponseStream.CopyToAsync(Stream, 81920, CancelToken.Token).GetResultWithTimeout(CancelToken, Timeout) - ResponseBytes = Stream.ToArray() + Using ResponseStream = Response.Content.ReadAsStreamAsync().GetResultWithTimeout(CancelToken, Timeout) + Using Stream As New MemoryStream + ResponseStream.CopyToAsync(Stream, 81920, CancelToken.Token).GetResultWithTimeout(CancelToken, Timeout) + ResponseBytes = Stream.ToArray() + End Using End Using '输出 If Response.IsSuccessStatusCode Then @@ -284,6 +292,9 @@ RequestFinished: Throw Catch ex As ResponsedWebException Throw + Catch ex As FileNotFoundException + '由于 CacheCow 读取缓存失败,然后系统调用不存在的 System.Net.Http.Formatting.resources 抛出(#8150) + Throw New Exception($"网络请求时读取缓存失败", ex) Catch ex As Exception RecordIPReliability(HostIp, -1) If TypeOf ex Is OperationCanceledException OrElse TypeOf ex Is TimeoutException Then 'CancellationToken 超时 @@ -304,12 +315,13 @@ RequestFinished: ''' ''' 进行 DNS 解析。它仅在选择的 IP 与系统默认的不一致时才对 URL 中的 Host 进行替换。 - ''' 返回请求时应使用的 IP;若为 IPv6,则加上了方括号。 - ''' 若解析失败,则返回 Nothing。 + ''' 返回请求时应使用的 IP。若解析失败,则返回 Nothing。 ''' - Private Function DNSLookup(Request As HttpRequestMessage, CancelToken As CancellationTokenSource) As String - '若一分钟内已失败过,则不再重复尝试解析,以减少断网时的 Exception 数量 + Private Function DNSLookup(Request As HttpRequestMessage, CancelToken As CancellationToken) As String Dim Host = Request.RequestUri.Host + '不对部分有严格 SNI 限制的域名进行 DNS 解析(#8295) + If {"mojang.com", "minecraft.net", "minecraftservices.com"}.Any(Function(h) Host.ContainsF(h, True)) Then Return Nothing + '若一分钟内已失败过,则不再重复尝试解析,以减少断网时的 Exception 数量 SyncLock DNSFailureRecord.SyncRoot If DNSFailureRecord.ContainsKey(Host) Then If Date.Now - DNSFailureRecord(Host) < New TimeSpan(0, 1, 0) Then @@ -320,43 +332,36 @@ RequestFinished: End If End SyncLock '初步 DNS 解析 - Dim DnsTask As Task(Of IPAddress()) = Nothing + Dim Candidates As IPAddress() Try - DnsTask = Dns.GetHostAddressesAsync(Host) - DnsTask.Wait(CancelToken.Token) + Dim AsyncResult = Dns.BeginGetHostAddresses(Host, Nothing, Nothing) + If WaitHandle.WaitAny(New WaitHandle() {AsyncResult.AsyncWaitHandle, CancelToken.WaitHandle}) Then Throw New TimeoutException("DNS 解析超时") + Candidates = Dns.EndGetHostAddresses(AsyncResult).Distinct.ToArray Catch ex As Exception Log(ex, $"DNS 解析失败({Host})") DNSFailureRecord(Host) = Date.Now Return Nothing End Try - Dim Candidates As IPAddress() = DnsTask.Result.ToArray If Not Candidates.Any Then Log($"[Net] DNS 解析无结果({Host})") Return Nothing End If '若同时存在 IPv4 和 IPv6 地址,仅选择其中一类(因为 GFW 可能只屏蔽了 IPv4 或 IPv6) - Dim GetIPReliability = Function(Key) IPReliability.GetOrDefault(Key.ToString, 0) + Dim Reliabilities = Candidates.ToDictionary(Function(i) i, Function(i) IPReliability.GetOrDefault(i.ToString, 0)) Dim IPv4Targets = Candidates.Where(Function(i) i.AddressFamily = AddressFamily.InterNetwork).ToArray Dim IPv6Targets = Candidates.Where(Function(i) i.AddressFamily = AddressFamily.InterNetworkV6).ToArray If IPv4Targets.Any AndAlso IPv6Targets.Any Then - Dim IPv4Reliability = IPv4Targets.Average(Function(i) GetIPReliability(i)) - Dim IPv6Reliability = IPv6Targets.Average(Function(i) GetIPReliability(i)) + Dim IPv4Reliability = IPv4Targets.Max(Function(i) Reliabilities(i)) + Dim IPv6Reliability = IPv6Targets.Max(Function(i) Reliabilities(i)) If Host = "api.modrinth.com" Then IPv6Reliability -= 0.1 '让 Modrinth 优先使用 IPv4 地址(#6887) + If ModeDebug Then Log($"[Net] DNS IPv4/IPv6 选择({Host}),IPv4 {IPv4Reliability:0.000},IPv6 {IPv6Reliability:0.000}") Candidates = If(IPv4Reliability >= IPv6Reliability, IPv4Targets, IPv6Targets) End If '选择可靠度最高的 IP - Dim MaxReliability As Double = Candidates.Max(Function(i) GetIPReliability(i)) - Dim Target As IPAddress = Candidates.First(Function(i) GetIPReliability(i) = MaxReliability) - Dim TargetIp As String = If(Target.AddressFamily = AddressFamily.InterNetworkV6, $"[{Target}]", Target.ToString) - If Target IsNot Candidates.First Then - '优选结果与系统默认 IP 不一致,替换域名并设置 Host 头 - If ModeDebug Then Log($"[Net] DNS 解析结果:{Host} → {Target},所有可能的 IP 与可靠度:{DnsTask.Result.Select(Function(i) $"{i} → {GetIPReliability(i):0.000}").Join(";")}") - Request.Headers.Host = Host - Dim Builder As New UriBuilder(Request.RequestUri) - Builder.Host = TargetIp - Request.RequestUri = Builder.Uri - End If - Return TargetIp + Dim Target As IPAddress = Candidates.MaxBy(Function(i) Reliabilities(i)) + Request.Headers.Host = Request.RequestUri.Authority + Request.RequestUri = (New UriBuilder(Request.RequestUri) With {.Host = If(Target.AddressFamily = AddressFamily.InterNetworkV6, $"[{Target}]", Target.ToString)}).Uri + Return Target.ToString End Function Private DNSFailureRecord As New SafeDictionary(Of String, Date) ''' @@ -369,8 +374,10 @@ RequestFinished: ''' Private Sub RecordIPReliability(IP As String, Result As Double) If IP Is Nothing Then Return - If Not IPReliability.ContainsKey(IP) Then IPReliability(IP) = 0 - IPReliability(IP) = (IPReliability(IP) + Result) / 2 + SyncLock IPReliability.SyncRoot + If Not IPReliability.ContainsKey(IP) Then IPReliability(IP) = 0 + IPReliability(IP) = (IPReliability(IP) + Result) / 2 + End SyncLock End Sub ''' @@ -405,7 +412,11 @@ RequestFinished: ''' ''' 最大线程数。 ''' - Public NetTaskThreadLimit As Integer + Public ReadOnly Property NetTaskThreadLimit As Integer + Get + Return Settings.Get("ToolDownloadThread") + 1 + End Get + End Property ''' ''' 速度下限。 ''' @@ -413,17 +424,35 @@ RequestFinished: ''' ''' 速度上限。若无限制则为 -1。 ''' - Public NetTaskSpeedLimitHigh As Long = -1 + Public ReadOnly Property NetTaskSpeedLimitHigh As Long + Get + If _NetTaskSpeedLimitHigh Is Nothing Then + Dim Setting As Integer = Settings.Get("ToolDownloadSpeed") + If Setting <= 14 Then + _NetTaskSpeedLimitHigh = (Setting + 1) * 0.1 * 1024 * 1024L + ElseIf Setting <= 31 Then + _NetTaskSpeedLimitHigh = (Setting - 11) * 0.5 * 1024 * 1024L + ElseIf Setting <= 41 Then + _NetTaskSpeedLimitHigh = (Setting - 21) * 1024 * 1024L + Else + _NetTaskSpeedLimitHigh = -1 + End If + End If + Return _NetTaskSpeedLimitHigh.Value + End Get + End Property + Private _NetTaskSpeedLimitHigh As Long? = Nothing + Public Sub UpdateNetTaskSpeedLimitHigh(Value As Integer) + _NetTaskSpeedLimitHigh = Nothing + End Sub ''' ''' 基于限速,当前可以下载的剩余量。 ''' Public NetTaskSpeedLimitLeft As Long = -1 - Private ReadOnly NetTaskSpeedLimitLeftLock As New Object ''' ''' 正在运行中的线程数。 ''' Public NetTaskThreadCount As Integer = 0 - Private ReadOnly NetTaskThreadCountLock As New Object ''' ''' 下载源。 @@ -760,7 +789,6 @@ RequestFinished: ''' 文件的已下载大小。 ''' Public DownloadDone As Long = 0 - Private ReadOnly LockDone As New Object ''' ''' 文件的校验规则。 ''' @@ -840,14 +868,12 @@ RequestFinished: ''' Private ReadOnly Property ConnectAverage As Integer Get - SyncLock LockCount - Return If(ConnectCount = 0, -1, ConnectTime / ConnectCount) - End SyncLock + Dim CurrentConnectCount As Integer = ConnectCount '防止竞态条件 + Return If(CurrentConnectCount = 0, -1, ConnectTime / CurrentConnectCount) End Get End Property Private Const FilePieceLimit As Long = 256 * 1024 - Public ReadOnly LockCount As New Object Public ReadOnly LockState As New Object Public ReadOnly LockChain As New Object Public ReadOnly LockSource As New Object @@ -928,8 +954,8 @@ StartSingleThreadDownload: Dim Source As NetSource = GetSource() If Source Is Nothing Then Return Nothing Dim TargetUrl As String = Source.Url - If TargetUrl.Contains("pcl2-server") OrElse TargetUrl.Contains("bmclapi") OrElse TargetUrl.Contains("github.com") OrElse - TargetUrl.Contains("optifine.net") OrElse TargetUrl.Contains("modrinth") OrElse TargetUrl.Contains("momot.rs") Then Return Nothing + If TargetUrl.Contains("pcl2-server") OrElse TargetUrl.Contains("meloong.com") OrElse TargetUrl.Contains("bmclapi") OrElse TargetUrl.Contains("github.com") OrElse + TargetUrl.Contains("optifine.net") OrElse TargetUrl.Contains("momot.rs") Then Return Nothing '寻找最大碎片 'FUTURE: 下载引擎重做,计算下载源平均链接时间和线程下载速度,按最高时间节省来开启多线程 Dim FilePieceMax As NetThread = Threads @@ -962,9 +988,7 @@ StartThread: End SyncLock '开始线程 - SyncLock NetTaskThreadCountLock - NetTaskThreadCount += 1 - End SyncLock + Interlocked.Increment(NetTaskThreadCount) SyncLock LockSource If Not HasAvailableSource(False) Then SourcesOnce.First.SingleThread = ThreadInfo End SyncLock @@ -986,7 +1010,7 @@ StartThread: CancelToken As CancellationTokenSource = Nothing, HostIp As String = Nothing '部分下载源真的特别慢,并且只需要一个请求,例如 Ping 为 20s,如果增长太慢,就会造成类似 2.5s 5s 7.5s 10s 12.5s... 的极大延迟 '延迟过长会导致某些特别慢的链接迟迟不被掐死 - Dim Timeout As Integer = Math.Min(Math.Max(ConnectAverage, 10000) * (1 + Th.Source.FailCount), 30000) + Dim Timeout As Integer = Math.Min(Math.Max(ConnectAverage, 15000) * (1 + Th.Source.FailCount), 30000) Th.State = NetState.Connecting Try Dim HttpDataCount As Integer = 0 @@ -994,8 +1018,8 @@ StartThread: HttpRequest = New HttpRequestMessage(HttpMethod.Get, Th.Source.Url) SecretHeadersSign(Th.Source.Url, HttpRequest, SimulateBrowserHeaders) CancelToken = New CancellationTokenSource(Timeout) - HostIp = DNSLookup(HttpRequest, CancelToken) 'DNS 预解析 - If Not Th.IsFirstThread Then HttpRequest.Headers.Range = New RangeHeaderValue(Th.DownloadStart, Nothing) + HostIp = DNSLookup(HttpRequest, CancelToken.Token) 'DNS 预解析 + If Not Th.IsFirstThread Then HttpRequest.Headers.Range = New Headers.RangeHeaderValue(Th.DownloadStart, Nothing) Dim ContentLength As Long = 0 Response = ThreadClient.SendAsync(HttpRequest, HttpCompletionOption.ResponseHeadersRead, CancelToken.Token).GetResultWithTimeout(CancelToken, Timeout) If Not Response.IsSuccessStatusCode Then Throw New Exception($"错误码 {Response.StatusCode} ({CInt(Response.StatusCode)}),{Th.Source.Url}") '状态码检查 @@ -1032,7 +1056,7 @@ StartThread: Dim DriveName As String = Drive.Name.First.ToString Dim RequiredSpace = If(PathTemp.StartsWithF(DriveName), ContentLength * 1.1, 0) + If(LocalPath.StartsWithF(DriveName), ContentLength + 5 * 1024 * 1024, 0) - If Drive.TotalFreeSpace < RequiredSpace Then + If RequiredSpace > 0 AndAlso Drive.TotalFreeSpace < RequiredSpace Then Throw New Exception(DriveName & " 盘空间不足,无法进行下载。" & vbCrLf & "需要至少 " & GetString(RequiredSpace) & " 空间,但当前仅剩余 " & GetString(Drive.TotalFreeSpace) & "。" & If(PathTemp.StartsWithF(DriveName), vbCrLf & vbCrLf & "下载时需要与文件同等大小的空间存放缓存,你可以在设置中调整缓存文件夹的位置。", "")) End If @@ -1040,7 +1064,7 @@ StartThread: End If ElseIf FileSize < 0 Then Throw New Exception("非首线程运行时,尚未获取文件大小") - ElseIf Th.DownloadStart > 0 AndAlso ContentLength = FileSize Then + ElseIf Th.DownloadStart > 0 AndAlso ContentLength >= FileSize Then NotSupportRange: SyncLock LockSource If SourcesOnce.Contains(Th.Source) Then GoTo SourceBreak @@ -1066,7 +1090,7 @@ NotSupportRange: End If '开始下载 ResponseStream = Response.Content.ReadAsStreamAsync().GetAwaiter().GetResult() - If Setup.Get("SystemDebugDelay") Then Threading.Thread.Sleep(RandomInteger(50, 3000)) + If Settings.Get("SystemDebugDelay") Then Threading.Thread.Sleep(RandomInteger(50, 3000)) Dim ResponseBytes As Byte() = New Byte(16384) {} HttpDataCount = ResponseStream.ReadAsync(ResponseBytes, 0, 16384, CancelToken.Token).GetResultWithTimeout(CancelToken, Timeout) While (IsUnknownSize OrElse Th.DownloadUndone > 0) AndAlso '判断是否下载完成 @@ -1076,11 +1100,9 @@ NotSupportRange: Threading.Thread.Sleep(16) End While Dim RealDataCount As Integer = If(IsUnknownSize, HttpDataCount, Math.Min(HttpDataCount, Th.DownloadUndone)) - SyncLock NetTaskSpeedLimitLeftLock - If NetTaskSpeedLimitHigh > 0 Then NetTaskSpeedLimitLeft -= RealDataCount - End SyncLock + If NetTaskSpeedLimitHigh > 0 Then Interlocked.Add(NetTaskSpeedLimitLeft, -RealDataCount) Dim DeltaTime = GetTimeMs() - Th.LastReceiveTime - If DeltaTime > 1000000 Then DeltaTime = 1 '避免时间刻反转导致出现极大值 + If DeltaTime > 100000000 Then DeltaTime = 1 '避免时间刻反转导致出现极大值 If RealDataCount > 0 Then '有数据 If Th.DownloadDone = 0 Then @@ -1089,27 +1111,21 @@ NotSupportRange: SyncLock LockState If State < NetState.Downloading Then State = NetState.Downloading End SyncLock - SyncLock LockCount - ConnectCount += 1 - ConnectTime += GetTimeMs() - Th.InitTime - End SyncLock + Interlocked.Increment(ConnectCount) + Interlocked.Add(ConnectTime, GetTimeMs() - Th.InitTime) End If - SyncLock LockCount - Th.Source.FailCount = 0 - For Each Task In Tasks - Task.FailCount = 0 - Next - End SyncLock - NetManager.DownloadDone += RealDataCount - SyncLock LockDone - DownloadDone += RealDataCount - End SyncLock + Th.Source.FailCount = 0 + For Each Task In Tasks + Task.FailCount = 0 + Next + Interlocked.Add(NetManager.DownloadDone, RealDataCount) + Interlocked.Add(DownloadDone, RealDataCount) Th.DownloadDone += RealDataCount ResultStream.Write(ResponseBytes, 0, RealDataCount) '已完成 If Th.DownloadUndone = 0 AndAlso Not IsUnknownSize Then Exit While '检查速度是否过慢 - If DeltaTime > 5000 AndAlso DeltaTime > RealDataCount AndAlso '数据包间隔大于 5s,且速度小于 1K/s + If Th.LastReceiveTime > 0 AndAlso DeltaTime > 5000 AndAlso DeltaTime > RealDataCount AndAlso '数据包间隔大于 5s,且速度小于 1K/s Th.Source.SingleThread Is Nothing Then '且并非单线程下载 Throw New TimeoutException("由于速度过慢断开链接,下载 " & RealDataCount & " B,消耗 " & DeltaTime & " ms。") End If @@ -1147,9 +1163,7 @@ SourceBreak: CancelToken?.Dispose() If Not IsNoSplit Then ResultStream?.Dispose() '改变计数 - SyncLock NetTaskThreadCountLock - NetTaskThreadCount -= 1 - End SyncLock + Interlocked.Decrement(NetTaskThreadCount) '合并 If ((FileSize >= 0 AndAlso DownloadDone >= FileSize) OrElse (FileSize = -1 AndAlso DownloadDone > 0)) AndAlso State < NetState.Merging AndAlso Th.State <> NetState.Interrupted Then Merge(Th) @@ -1157,12 +1171,10 @@ SourceBreak: End Sub Private Sub SourceFail(Th As NetThread, ex As Exception, IsMergeFailure As Boolean) '状态变更 - SyncLock LockCount - Th.Source.FailCount += 1 - For Each Task In Tasks - Task.FailCount += 1 - Next - End SyncLock + Interlocked.Increment(Th.Source.FailCount) + For Each Task In Tasks + Interlocked.Increment(Task.FailCount) + Next Th.State = NetState.Interrupted Th.Source.Ex = ex '根据情况判断,是否在多线程下禁用下载源(连续错误过多,或不支持断点续传) @@ -1170,7 +1182,7 @@ SourceBreak: If IsMergeFailure OrElse IsRangeNotSupported OrElse ex.Message.Contains("(502)") OrElse ex.Message.Contains("(404)") OrElse ex.Message.Contains("未能解析") OrElse ex.Message.Contains("无返回数据") OrElse ex.Message.Contains("空间不足") OrElse - ((ex.Message.Contains("(403)") OrElse ex.Message.Contains("(429)")) AndAlso Not Th.Source.Url.ContainsF("bmclapi")) OrElse 'BMCLAPI 的部分源在高频率请求下会返回 403/429,所以不应因此禁用下载源 + ((ex.Message.Contains("(403)") OrElse ex.Message.Contains("(429)")) AndAlso Not Th.Source.Url.Contains("bmclapi")) OrElse 'BMCLAPI 的部分源在高频率请求下会返回 403/429,所以不应因此禁用下载源 (Th.Source.FailCount >= MathClamp(NetTaskThreadLimit, 5, 30) AndAlso DownloadDone < 1) OrElse Th.Source.FailCount > NetTaskThreadLimit + 2 Then '当一个下载源有多个线程在下载时,只选择其中一个线程进行后续处理 Dim IsThisFail As Boolean = False @@ -1241,10 +1253,8 @@ SourceBreak: SyncLock LockChain Threads = Nothing End SyncLock - NetManager.DownloadDone -= DownloadDone - SyncLock LockDone - DownloadDone = 0 - End SyncLock + Interlocked.Add(NetManager.DownloadDone, -DownloadDone) + DownloadDone = 0 SpeedLastDone = 0 End Sub @@ -1271,7 +1281,7 @@ Retry: SyncLock LockChain '合并文件 If IsNoSplit Then - '仅有一个线程,从缓存中输出 + '仅有一个线程,从内存中输出 If ModeDebug Then Log($"[Download] {LocalName}:下载结束,从内存输出文件") Cache.Position = 0 WriteFile(LocalPath, Cache) @@ -1321,6 +1331,7 @@ Retry: End SyncLock Catch ex As Exception RetryCount += 1 + If State > NetState.Merging Then Return '通常是因为在合并时被中断了 Log(ex, $"合并文件出错,第 {RetryCount} 次尝试({LocalName})") '重新尝试合并 If RetryCount < 3 Then @@ -1349,7 +1360,7 @@ Retry: Log($"[Download] {LocalName}:已失败,当前状态 {State}") State = NetState.Interrupted End SyncLock - AbortInternal() + InterruptInternal() For Each Task In Tasks Task.OnFileFail(Me) Next @@ -1357,9 +1368,9 @@ Retry: ''' ''' 下载中断。 ''' - Public Sub Abort(AbortedTask As LoaderDownload) + Public Sub Interrupt(InterruptedTask As LoaderDownload) '从特定任务中移除,如果它还属于其他任务,则继续下载 - Tasks.Remove(AbortedTask) + Tasks.Remove(InterruptedTask) If Tasks.Any Then Return '确认中断 SyncLock LockState @@ -1367,14 +1378,12 @@ Retry: Log($"[Download] {LocalName}:已中断,当前状态 {State}") State = NetState.Interrupted End SyncLock - AbortInternal() + InterruptInternal() End Sub - Private Sub AbortInternal() + Private Sub InterruptInternal() On Error Resume Next Reset() - SyncLock NetManager.LockRemain - NetManager.FileRemain -= 1 - End SyncLock + Interlocked.Decrement(NetManager.FileRemain) End Sub '状态改变接口 @@ -1386,9 +1395,7 @@ Retry: If State >= NetState.Finished Then Return State = NetState.Finished End SyncLock - SyncLock NetManager.LockRemain - NetManager.FileRemain -= 1 - End SyncLock + Interlocked.Decrement(NetManager.FileRemain) If PrintLog Then Log($"[Download] {LocalName}:已完成") For Each Task In Tasks Task.OnFileFinish(Me) @@ -1518,12 +1525,12 @@ FinishExCatch: Next If Not File.HasAvailableSource() Then Throw New ArgumentException("输入的下载链接不正确!") File.LocalPath = File.LocalPath.Replace("/", "\") - If Not File.LocalPath.ToLower.Contains(":\") Then Throw New ArgumentException("输入的本地文件地址不正确:" & File.LocalPath) + If Not File.LocalPath.Lower.Contains(":\") Then Throw New ArgumentException("输入的本地文件地址不正确:" & File.LocalPath) If File.LocalPath.EndsWithF("\") Then Throw New ArgumentException("请输入含文件名的完整文件路径:" & File.LocalPath) Directory.CreateDirectory(GetPathFromFullPath(File.LocalPath)) '创建目标文件夹 Next - '接入下载管理器 - NetManager.Start(Me) + '接入下载管理器,获取新开始下载的文件列表 + Dim NewFiles = NetManager.Start(Me) '==================================== ' 已存在文件查找 @@ -1531,9 +1538,8 @@ FinishExCatch: '整理允许进行查找的文件 Dim FilesToCheck As New List(Of NetFile) - Dim DisabledCopy As Boolean = Setup.Get("SystemDebugSkipCopy") '在设置中禁用了复制 - For Each File In Files - If Not DisabledCopy AndAlso File.Check?.CanUseExistsFile Then + For Each File In NewFiles + If File.Check?.CanUseExistsFile Then FilesToCheck.Add(File) Else '不允许,直接开始下载 SyncLock LockState @@ -1570,7 +1576,7 @@ FinishExCatch: End Sub Private Sub CheckExistingFiles(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}") '列出 MC 文件夹中的各个版本文件夹 Dim VersionFolders As New List(Of String) For Each McFolder In FolderList @@ -1584,7 +1590,7 @@ FinishExCatch: '处理每个文件 For Each File As NetFile In Files Dim Target As String = CheckExistingFile(FolderList, VersionFolders, File) - If File.State >= NetState.WaitingToDownload Then Return '中断 + If File.State >= NetState.WaitingToDownload Then Continue For '中断 '已找到相同文件 If Target IsNot Nothing Then File.IsCopy = True @@ -1594,6 +1600,8 @@ Retry: If Target <> File.LocalPath Then Log($"[Download] 复制已存在的文件:{Target} → {File.LocalPath}") CopyFile(Target, File.LocalPath) + Else + If ModeDebug Then Log($"[Download] 需要下载的文件已存在,并通过校验:{Target}") End If File.Finish(False) Continue For @@ -1619,6 +1627,8 @@ Retry: Private Function CheckExistingFile(FolderList As List(Of String), VersionFolders As List(Of String), File As NetFile) As String '目标文件已存在 If File.Check.Check(File.LocalPath) Is Nothing Then Return File.LocalPath + '在设置中禁用了复制 + If Settings.Get("SystemDebugSkipCopy") Then Return Nothing '没有可用的检查规则,只能开始下载 If File.Check.Hash Is Nothing AndAlso File.Check.ActualSize < 0 Then Return Nothing '大致判断文件类别 @@ -1633,7 +1643,7 @@ Retry: Return Nothing End If End If - Dim Type = TypeIndexes.MaxOf(Function(kv) kv.Item2).FolderName.TrimStart("\"c) + Dim Type = TypeIndexes.MaxBy(Function(kv) kv.Item2).FolderName.TrimStart("\"c) '根据类别进行查找 Static Sizes As New SafeDictionary(Of String, Long) Select Case Type @@ -1647,7 +1657,7 @@ Retry: '版本 jar 或 json:查找 MC 文件夹下的各个版本文件夹 For Each VersionFolder In VersionFolders For Each Candidate In Directory.GetFiles(VersionFolder, - "*." & GetFileNameFromPath(File.LocalPath).AfterLast(".").ToLower, SearchOption.TopDirectoryOnly) + "*." & GetFileNameFromPath(File.LocalPath).AfterLast(".").Lower, SearchOption.TopDirectoryOnly) '快速进行大小校验 If Not Sizes.ContainsKey(Candidate) Then Sizes(Candidate) = New FileInfo(Candidate).Length If File.Check.ActualSize <> Sizes(Candidate) Then Continue For @@ -1709,7 +1719,7 @@ Retry: For Each File In Files If File.State <> NetState.Interrupted Then Continue For If File.Sources.All(Function(s) TypeOf s.Ex Is OperationCanceledException OrElse TypeOf s.Ex Is TimeoutException OrElse TypeOf s.Ex Is ThreadInterruptedException) Then Continue For - Dim Detail As String = Join(File.Sources.Select(Function(s) $"{If(s.Ex Is Nothing, "无错误信息。", s.Ex.GetBrief())}({s.Url})"), vbCrLf) + Dim Detail As String = File.Sources.Select(Function(s) $"{If(s.Ex Is Nothing, "无错误信息。", s.Ex.GetBrief())}({s.Url})").Join(vbCrLf) [Error] = New Exception("文件下载失败:" & File.LocalPath & vbCrLf & "各下载源的错误如下:" & vbCrLf & Detail, [Error]) '上报 @@ -1723,24 +1733,24 @@ Retry: End SyncLock '中断所有文件 For Each TaskFile In Files - TaskFile.Abort(Me) + TaskFile.Interrupt(Me) Next '在退出同步锁后再进行日志输出 Dim ErrOutput As New List(Of String) For Each Ex As Exception In ExList ErrOutput.Add(Ex.GetDetail()) Next - Log("[Download] " & Join(ErrOutput.Distinct.ToArray, vbCrLf)) + Log("[Download] " & ErrOutput.Distinct.Join(vbCrLf)) End Sub - Public Overrides Sub Abort() + Public Overrides Sub Interrupt() SyncLock LockState If State >= LoadState.Finished Then Return - State = LoadState.Aborted + State = LoadState.Interrupted End SyncLock Log("[Download] " & Name & " 已取消!") '中断所有文件 For Each TaskFile In Files - TaskFile.Abort(Me) + TaskFile.Interrupt(Me) Next End Sub @@ -1757,8 +1767,7 @@ Retry: ''' ''' 需要下载的文件。为“本地地址 - 文件对象”键值对。 ''' - Public Files As New Dictionary(Of String, NetFile) - Public ReadOnly LockFiles As New Object + Public AllFiles As New SafeDictionary(Of String, NetFile) ''' ''' 当前的所有下载任务。 @@ -1768,25 +1777,12 @@ Retry: ''' ''' 已下载完成的大小。 ''' - Public Property DownloadDone As Long - Get - Return _DownloadDone - End Get - Set(value As Long) - SyncLock LockDone - _DownloadDone = value - End SyncLock - End Set - End Property - Private _DownloadDone As Long = 0 - Private ReadOnly LockDone As New Object - + Public DownloadDone As Long = 0 ''' ''' 尚未完成下载的文件数。 ''' Public FileRemain As Integer = 0 - Public ReadOnly LockRemain As New Object '这些属性由 RefreshStat 刷新 ''' @@ -1855,9 +1851,9 @@ Retry: Thread.Sleep(20) '获取文件列表 Dim AllFiles As List(Of NetFile) - SyncLock LockFiles - If Id = 0 AndAlso FileRemain = 0 AndAlso Files.Any() Then Files.Clear() '若已完成,则清空 - AllFiles = Files.Values.ToList() + SyncLock Me.AllFiles.SyncRoot + If Id = 0 AndAlso FileRemain = 0 AndAlso Me.AllFiles.Any() Then Me.AllFiles.Clear() '若已完成,则清空 + AllFiles = Me.AllFiles.Values.ToList() End SyncLock Dim WaitingFiles As New List(Of NetFile) Dim OngoingFiles As New List(Of NetFile) @@ -1865,7 +1861,7 @@ Retry: If File.Uuid Mod 2 = Id Then Continue For If File.State = NetState.WaitingToDownload Then WaitingFiles.Add(File) - ElseIf File.State < NetState.Merging Then + ElseIf File.State < NetState.Merging AndAlso File.State >= NetState.WaitingToDownload Then OngoingFiles.Add(File) End If Next @@ -1908,7 +1904,7 @@ Retry: Dim NextTick As Long = GetTimeMs() While True '增加限速余量 - If NetTaskSpeedLimitHigh > 0 Then NetTaskSpeedLimitLeft = NetTaskSpeedLimitHigh / 10 + If NetTaskSpeedLimitHigh > 0 Then Interlocked.Add(NetTaskSpeedLimitLeft, CLng(NetTaskSpeedLimitHigh / 10)) '刷新公开属性 RefreshStat() '等待 100 ms @@ -1931,7 +1927,7 @@ Retry: ''' ''' 开始一个下载任务。 ''' - Public Sub Start(Task As LoaderDownload) + Public Function Start(Task As LoaderDownload) As List(Of NetFile) StartManager() '清理缓存 SyncLock DownloadCacheLock '防止同时开启多个下载任务时重复清理 @@ -1943,45 +1939,30 @@ Retry: Catch ex As Exception Log(ex, "清理下载缓存失败") End Try + IsDownloadCacheCleared = True End If - IsDownloadCacheCleared = True - End SyncLock - '文件处理 - SyncLock LockFiles - '添加每个文件 - For i = 0 To Task.Files.Count - 1 - Dim File = Task.Files(i) - If Files.ContainsKey(File.LocalPath) Then - '已有该文件 - If Files(File.LocalPath).State >= NetState.Finished Then - '该文件已经下载过一次,且下载完成 - '将已下载的文件替换成当前文件,重新下载 - File.Tasks.Add(Task) - Files(File.LocalPath) = File - SyncLock LockRemain - FileRemain += 1 - End SyncLock - If ModeDebug Then Log($"[Download] {File.LocalName}:重新加入下载列表,目标 {File.LocalPath}") - Else - '该文件正在下载中 - '将当前文件替换成下载中的文件,即两个任务指向同一个文件 - File = Files(File.LocalPath) - File.Tasks.Add(Task) - End If - Else - '没有该文件 - File.Tasks.Add(Task) - Files.Add(File.LocalPath, File) - SyncLock LockRemain - FileRemain += 1 - End SyncLock - If ModeDebug Then Log($"[Download] {File.LocalName}:已加入下载列表,目标 {File.LocalPath}") - End If - Task.Files(i) = File '回设 - Next End SyncLock + '添加每个文件 + Dim NewFiles As New List(Of NetFile) + For i = 0 To Task.Files.Count - 1 + Dim File As NetFile = Task.Files(i) + If AllFiles.ContainsKey(File.LocalPath) AndAlso AllFiles(File.LocalPath).State < NetState.Finished Then + '该文件正在被另一个任务下载 + If ModeDebug Then Log($"[Download] {File.LocalName}:无需开始,该文件已在下载中,目标 {File.LocalPath}") + File = AllFiles(File.LocalPath) '将列表中的文件替换成下载中的文件,即两个任务指向同一个文件;抛弃现在的 File 对象 + Task.Files(i) = File + Else + '常规情况(该文件可能已在其他任务中下载完成,但这并不影响) + If ModeDebug Then Log($"[Download] {File.LocalName}:开始,目标 {File.LocalPath}") + AllFiles(File.LocalPath) = File + NewFiles.Add(File) + Interlocked.Increment(FileRemain) + End If + File.Tasks.Add(Task) + Next Tasks.Add(Task) - End Sub + Return NewFiles + End Function End Class @@ -1989,13 +1970,9 @@ Retry: ''' 是否有正在进行中、需要在下载管理页面显示的下载任务? ''' Public Function HasDownloadingTask(Optional IgnoreCustomDownload As Boolean = False) As Boolean - For Each Task In LoaderTaskbar.ToList() - If (Task.Show AndAlso Task.State = LoadState.Loading) AndAlso - (Not IgnoreCustomDownload OrElse Not Task.Name.ToString.Contains("自定义下载")) Then - Return True - End If - Next - Return False + Return LoaderTaskbar.Any( + Function(Task) Task.Show AndAlso Task.State = LoadState.Loading AndAlso + (Not IgnoreCustomDownload OrElse Not Task.Name.ToString.Contains("自定义下载"))) End Function #End Region @@ -2079,4 +2056,24 @@ Retry: }.Any(Function(k) Detail.ContainsF(k, True)) End Function + ''' + ''' 设置是否应当在正版登录时校验 SSL 证书。 + ''' + Public Sub ShouldValidateSslCertificateOnLogin(Enabled As Boolean) + ServicePointManager.ServerCertificateValidationCallback = + Function(Sender, Certificate, Chain, Failure) + Dim Request As HttpWebRequest = TryCast(Sender, HttpWebRequest) + If Failure = Net.Security.SslPolicyErrors.None Then Return True '已通过验证 + '基于 #3018 和 #5879,只在访问正版登录 API 时跳过证书验证 + Log($"[System] 未通过 SSL 证书验证({Failure}),提供的证书为 {Certificate?.Subject},URL:{Request?.Address}", LogLevel.Debug) + If Request Is Nothing Then + Return Not Enabled + ElseIf Request.Address.Host.Contains("xboxlive") OrElse Request.Address.Host.Contains("minecraftservices") Then + Return Not Enabled '根据设置决定是否忽略错误 + Else + Return False + End If + End Function + End Sub + End Module diff --git a/Plain Craft Launcher 2/Modules/Base/ModValidate.vb b/Plain Craft Launcher 2/Modules/Base/ModValidate.vb index 2be9f8a..7a5f35e 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModValidate.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModValidate.vb @@ -208,7 +208,7 @@ Public Class ValidateExceptSame If Str Is Nothing Then Return ErrorMessage.Replace("%", "null") For Each Ch As String In Excepts If IgnoreCase Then - If Str.ToLower = Ch.ToLower Then Return ErrorMessage.Replace("%", Ch) + If Str.Lower = Ch.Lower Then Return ErrorMessage.Replace("%", Ch) Else If Str.Equals(Ch) Then Return ErrorMessage.Replace("%", Ch) '使用 = 不确定是否会忽略大小写 End If @@ -218,6 +218,27 @@ Public Class ValidateExceptSame End Class +''' +''' 必须为特定字符串。 +''' +Public Class ValidateSame + Inherits Validate + Public Property Required As String + Public Property ErrorMessage As String + Public Property IgnoreCase As Boolean = False + Public Sub New() + End Sub + Public Sub New(Required As String, Optional ErrorMessage As String = "输入内容有误", Optional IgnoreCase As Boolean = False) + Me.Required = Required + Me.ErrorMessage = ErrorMessage + Me.IgnoreCase = IgnoreCase + End Sub + Public Overrides Function Validate(Str As String) As String + Return If(String.Compare(Str, Required, IgnoreCase) = 0, "", ErrorMessage) + End Function + +End Class + ''' ''' 对文件夹名的粗略的特化检测。 ''' @@ -355,7 +376,7 @@ Public Class ValidateFolderPath '检查开头 If Str.StartsWithF("\\Mac\") Then GoTo Fin For Each Drive As DriveInfo In My.Computer.FileSystem.Drives - If Str.ToUpper = Drive.Name Then Return "" + If Str.Upper = Drive.Name Then Return "" If Str.StartsWithF(Drive.Name, True) Then GoTo Fin Next Return "文件夹路径头存在错误!" diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb index 42a29d2..481c3ba 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb @@ -1,35 +1,40 @@ -Public Module ModComp +Imports System.IO.Compression - Public Enum CompType - ''' - ''' 允许任意种类,或种类未知。 - ''' - Any = -1 +Public Module ModComp + + Public Enum CompType ''' ''' Mod。 ''' - [Mod] = 0 + [Mod] = 1 ''' ''' 整合包。 ''' - ModPack = 1 + ModPack = 2 ''' ''' 资源包。 ''' - ResourcePack = 2 + ResourcePack = 4 ''' ''' 光影包。 ''' - Shader = 3 + Shader = 8 ''' - ''' CurseForge:数据包。 - ''' Modrinth:数据包,或数据包与 Mod 的混合。 + ''' 数据包。 ''' - DataPack = 4 + DataPack = 16 ''' ''' 服务端插件。 ''' - Plugin = 5 + Plugin = 32 + ''' + ''' 同时包含数据包以及 Mod。 + ''' + ModOrDataPack = [Mod] Or DataPack + ''' + ''' 允许任意种类,或种类未知。 + ''' + Any = [Mod] Or ModPack Or ResourcePack Or Shader Or DataPack Or Plugin End Enum Public Enum CompModLoaderType 'https://docs.curseforge.com/?http#tocS_ModLoaderType @@ -55,36 +60,39 @@ '初始化数据库 _CompDatabase = New List(Of CompDatabaseEntry) Dim i As Integer = 0 - For Each Line In DecodeBytes(GetResources("ModData")).Replace(vbCrLf, vbLf).Replace(vbCr, "").Split(vbLf) - i += 1 - If Line = "" Then Continue For - For Each EntryData As String In Line.Split("¨") - Dim Entry = New CompDatabaseEntry - Dim SplitedLine = EntryData.Split("|") - If SplitedLine(0).StartsWithF("@") Then - Entry.CurseForgeSlug = Nothing - Entry.ModrinthSlug = SplitedLine(0).Replace("@", "") - ElseIf SplitedLine(0).EndsWithF("@") Then - Entry.CurseForgeSlug = SplitedLine(0).TrimEnd("@") - Entry.ModrinthSlug = Entry.CurseForgeSlug - ElseIf SplitedLine(0).Contains("@") Then - Entry.CurseForgeSlug = SplitedLine(0).Split("@")(0) - Entry.ModrinthSlug = SplitedLine(0).Split("@")(1) - Else - Entry.CurseForgeSlug = SplitedLine(0) - Entry.ModrinthSlug = Nothing - End If - Entry.WikiId = i - If SplitedLine.Count >= 2 Then - Entry.ChineseName = SplitedLine(1) - If Entry.ChineseName.Contains("*") Then '处理 * - Entry.ChineseName = Entry.ChineseName.Replace("*", - $" ({If(Entry.CurseForgeSlug, Entry.ModrinthSlug).Replace("-", " ").Capitalize})") + Using Archive As New ZipArchive(New MemoryStream(GetResources("ModData")), ZipArchiveMode.Read) + For Each Line In ReadFile(Archive.GetEntry("moddata.txt").Open(), Encoding.UTF8).Replace(vbCrLf, vbLf).Replace(vbCr, "").Split(vbLf) + i += 1 + If Line = "" Then Continue For + For Each EntryData As String In Line.Split("¨") + Dim Entry = New CompDatabaseEntry + Dim Splited = EntryData.Split("|") + Entry.Popularity = Val(Splited(0)) + If Splited(1).StartsWithF("@") Then + Entry.CurseForgeSlug = Nothing + Entry.ModrinthSlug = Splited(1).Replace("@", "") + ElseIf Splited(1).EndsWithF("@") Then + Entry.CurseForgeSlug = Splited(1).TrimEnd("@") + Entry.ModrinthSlug = Entry.CurseForgeSlug + ElseIf Splited(1).Contains("@") Then + Entry.CurseForgeSlug = Splited(1).Split("@")(0) + Entry.ModrinthSlug = Splited(1).Split("@")(1) + Else + Entry.CurseForgeSlug = Splited(1) + Entry.ModrinthSlug = Nothing End If - End If - _CompDatabase.Add(Entry) + Entry.WikiId = i + If Splited.Count >= 3 Then + Entry.ChineseName = Splited.Last + If Entry.ChineseName.Contains("*") Then '处理 * + Entry.ChineseName = Entry.ChineseName.Replace("*", + $" ({If(Entry.CurseForgeSlug, Entry.ModrinthSlug).Replace("-", " ").Capitalize})") + End If + End If + _CompDatabase.Add(Entry) + Next Next - Next + End Using Return _CompDatabase End Get End Property @@ -106,9 +114,13 @@ ''' Modrinth Slug(例如 advanced-solar-panels)。 ''' Public ModrinthSlug As String = Nothing + ''' + ''' MC 百科的浏览量逆序排行,1 代表浏览量最低。 + ''' + Public Popularity As Integer Public Overrides Function ToString() As String - Return If(CurseForgeSlug, "") & "&" & If(ModrinthSlug, "") & "|" & WikiId & "|" & ChineseName + Return If(CurseForgeSlug, "") & "&" & If(ModrinthSlug, "") & "|" & WikiId & "|" & ChineseName & ", Rank " & Popularity End Function End Class @@ -127,10 +139,10 @@ ''' Public ReadOnly FromCurseForge As Boolean ''' - ''' 工程的种类。 - ''' 由于 Modrinth 混合使用 Mod 和数据包,结果不一定准确。 + ''' 工程中包含的文件种类。 + ''' 若为 Modrinth 工程,可能为 Mod 或 数据包。 ''' - Public ReadOnly Type As CompType + Public ReadOnly Types As CompType ''' ''' 工程的短名。例如 technical-enchant。 ''' @@ -161,9 +173,9 @@ ''' Public ReadOnly Website As String ''' - ''' 最后一次更新的时间。可能为 Nothing。 + ''' 最后一次更新的时间。 ''' - Public ReadOnly LastUpdate As Date? = Nothing + Public ReadOnly LastUpdate As Date ''' ''' 下载量计数。注意,该计数仅为一个来源,无法反应两边加起来的下载量! ''' @@ -186,6 +198,12 @@ ''' 例如:261(26.1.x)、180(1.18.x)。 ''' Public ReadOnly Drops As List(Of Integer) + ''' + ''' Modrinth API 返回的原始版本列表。 + ''' 仅用于 Modrinth 工程的二次筛选,不会被缓存,不会被预处理。 + ''' 若非从 Modrinth 获取则为 Nothing。 + ''' + Public ReadOnly UnsafeGameVersions As List(Of String) '数据库信息 @@ -198,7 +216,7 @@ Get If Not LoadedDatabase Then LoadedDatabase = True - If Type = CompType.Mod OrElse Type = CompType.DataPack Then + If Types.HasFlag(CompType.Mod) OrElse Types.HasFlag(CompType.DataPack) Then _DatabaseEntry = CompDatabase.FirstOrDefault(Function(c) If(FromCurseForge, c.CurseForgeSlug, c.ModrinthSlug) = Slug) End If End If @@ -235,14 +253,14 @@ If Data.ContainsKey("Tags") Then #Region "CompJson" FromCurseForge = Data("DataSource") = "CurseForge" - Type = Data("Type").ToObject(Of Integer) + Types = Data("Types").ToObject(Of Integer) Slug = Data("Slug") Id = Data("Id") If Data.ContainsKey("CurseForgeFileIds") Then CurseForgeFileIds = CType(Data("CurseForgeFileIds"), JArray).Select(Function(t) t.ToObject(Of Integer)).ToList RawName = Data("RawName") Description = Data("Description") Website = Data("Website") - If Data.ContainsKey("LastUpdate") Then LastUpdate = Data("LastUpdate") + LastUpdate = Data("LastUpdate") DownloadCount = Data("DownloadCount") If Data.ContainsKey("ModLoaders") Then ModLoaders = CType(Data("ModLoaders"), JArray).Select(Function(t) CType(t.ToObject(Of Integer), CompModLoaderType)).ToList @@ -279,23 +297,23 @@ If LogoUrl = "" Then LogoUrl = Nothing 'Type If Website.Contains("/mc-mods/") OrElse Website.Contains("/mod/") Then - Type = CompType.Mod + Types = CompType.Mod ElseIf Website.Contains("/modpacks/") Then - Type = CompType.ModPack + Types = CompType.ModPack ElseIf Website.Contains("/resourcepacks/") Then - Type = CompType.ResourcePack + Types = CompType.ResourcePack ElseIf Website.Contains("/texture-packs/") Then - Type = CompType.ResourcePack + Types = CompType.ResourcePack ElseIf Website.Contains("/shaders/") Then - Type = CompType.Shader + Types = CompType.Shader Else - Type = CompType.DataPack + Types = CompType.DataPack End If 'FileIndexes / VanillaMajorVersions / ModLoaders ModLoaders = New List(Of CompModLoaderType) Dim Files As New List(Of KeyValuePair(Of Integer, List(Of String))) 'FileId, GameVersions For Each File In If(Data("latestFiles"), New JArray) - Dim NewFile As New CompFile(File, Type) + Dim NewFile As New CompFile(File, Types) If Not NewFile.Available Then Continue For ModLoaders.AddRange(NewFile.ModLoaders) Dim GameVersions = File("gameVersions").ToObject(Of List(Of String)) @@ -308,7 +326,7 @@ Next CurseForgeFileIds = Files.Select(Function(f) f.Key).Distinct.ToList Drops = Files.SelectMany(Function(f) f.Value). - Select(Function(v) McVersion.VersionToDrop(v)).Where(Function(v) v > 0).Distinct.OrderByDescending(Function(v) v).ToList + Select(Function(v) McVersion.VersionToDrop(v)).Where(Function(v) v <> 209).Distinct.OrderByDescending(Function(v) v).ToList ModLoaders = ModLoaders.Distinct.OrderBy(Of Integer)(Function(t) t).ToList 'Tags Tags = New List(Of String) @@ -396,21 +414,21 @@ Slug = Data("slug") RawName = Data("title") Description = Data("description") - LastUpdate = Data("date_modified") + LastUpdate = If(Data("date_modified"), Data("updated")) DownloadCount = Data("downloads") LogoUrl = Data("icon_url") If LogoUrl = "" Then LogoUrl = Nothing Website = $"https://modrinth.com/{Data("project_type")}/{Slug}" 'GameVersions '搜索结果的键为 versions,获取特定工程的键为 game_versions - Drops = If(CType(If(Data("game_versions"), Data("versions")), JArray), New JArray). - Select(Function(v) McVersion.VersionToDrop(v)).Where(Function(v) v > 0).Distinct.OrderByDescending(Function(v) v).ToList + UnsafeGameVersions = If(CType(If(Data("game_versions"), Data("versions")), JArray), New JArray).Select(Function(v) v.ToString).Distinct.ToList + Drops = UnsafeGameVersions.Select(Function(v) McVersion.VersionToDrop(v)).Where(Function(v) v <> 209).Distinct.OrderByDescending(Function(v) v).ToList 'Type Select Case Data("project_type").ToString - Case "modpack" : Type = CompType.ModPack - Case "resourcepack" : Type = CompType.ResourcePack - Case "shader" : Type = CompType.Shader - Case Else : Type = CompType.Mod 'Modrinth 将数据包标为 Mod + Case "modpack" : Types = CompType.ModPack + Case "resourcepack" : Types = CompType.ResourcePack + Case "shader" : Types = CompType.Shader + Case Else : Types = CompType.Mod 'Modrinth 将数据包标为 Mod,但 categories 字段里有 datapack End Select 'Tags & ModLoaders Tags = New List(Of String) @@ -432,7 +450,7 @@ Case "fabric" : ModLoaders.Add(CompModLoaderType.Fabric) Case "quilt" : ModLoaders.Add(CompModLoaderType.Quilt) Case "neoforge" : ModLoaders.Add(CompModLoaderType.NeoForge) - Case "datapack" : Type = CompType.DataPack '若包含数据包版本,则优先标为 DataPack + Case "datapack" : Types = CompType.DataPack '共用 Case "technology" : Tags.Add("科技") Case "magic" : Tags.Add("魔法") @@ -447,9 +465,9 @@ Case "game-mechanics" : Tags.Add("游戏机制") Case "transportation" : Tags.Add("运输") Case "storage" : Tags.Add("仓储") - Case "decoration" : If Type <> CompType.ResourcePack Then Tags.Add("装饰") - Case "mobs" : If Type <> CompType.ResourcePack Then Tags.Add("生物") - Case "equipment" : If Type <> CompType.ResourcePack Then Tags.Add("装备") + Case "decoration" : If Types <> CompType.ResourcePack Then Tags.Add("装饰") + Case "mobs" : If Types <> CompType.ResourcePack Then Tags.Add("生物") + Case "equipment" : If Types <> CompType.ResourcePack Then Tags.Add("装备") Case "social" : Tags.Add("服务器") Case "library" : Tags.Add("支持库") '整合包 @@ -499,6 +517,7 @@ Case "vanilla" : Tags.Add("原版可用") End Select Next + If Types = CompType.DataPack AndAlso ModLoaders.Any Then Types = CompType.DataPack Or CompType.Mod #End Region End If If Not Tags.Any() Then Tags.Add("其他") @@ -514,14 +533,14 @@ Public Function ToJson() As JObject Dim Json As New JObject Json("DataSource") = If(FromCurseForge, "CurseForge", "Modrinth") - Json("Type") = CInt(Type) + Json("Types") = CInt(Types) Json("Slug") = Slug Json("Id") = Id If CurseForgeFileIds IsNot Nothing Then Json("CurseForgeFileIds") = New JArray(CurseForgeFileIds) Json("RawName") = RawName Json("Description") = Description Json("Website") = Website - If LastUpdate IsNot Nothing Then Json("LastUpdate") = LastUpdate + Json("LastUpdate") = LastUpdate Json("DownloadCount") = DownloadCount If ModLoaders IsNot Nothing AndAlso ModLoaders.Any Then Json("ModLoaders") = New JArray(ModLoaders.Select(Function(m) CInt(m))) Json("Tags") = New JArray(Tags) @@ -544,7 +563,7 @@ For i = 0 To Drops.Count - 1 '版本号一定为降序 '获取当前连续的版本号段 Dim StartDrop As Integer = Drops(i), EndDrop As Integer = Drops(i) - If StartDrop < 100 Then '如果支持新版本,则不显示 1.9- + If StartDrop < 120 Then '如果支持新版本,则不显示 1.11- If Segments.Any() AndAlso Not IsOld Then Exit For Else @@ -562,14 +581,14 @@ If StartDrop = EndDrop Then Segments.Add(StartName) ElseIf AllDrops IsNot Nothing AndAlso StartDrop >= AllDrops.First Then - If EndDrop < 100 Then + If EndDrop < 120 Then Segments.Clear() Segments.Add("全版本") Exit For Else Segments.Add(EndName & "+") End If - ElseIf EndDrop < 100 Then + ElseIf EndDrop < 120 Then Segments.Add(StartName & "-") Exit For ElseIf AllDrops Is Nothing OrElse AllDrops.IndexOf(EndDrop) - AllDrops.IndexOf(StartDrop) = 1 Then @@ -583,10 +602,10 @@ '获取 Mod 加载器描述 Dim ModLoaderDescriptionFull As String, ModLoaderDescriptionPart As String Dim ModLoadersForDesc As New List(Of CompModLoaderType)(ModLoaders) - If Setup.Get("ToolDownloadIgnoreQuilt") Then ModLoadersForDesc.Remove(CompModLoaderType.Quilt) + If Settings.Get("ToolDownloadIgnoreQuilt") Then ModLoadersForDesc.Remove(CompModLoaderType.Quilt) Select Case ModLoadersForDesc.Count Case 0 - If ModLoaders.Count = 1 Then + If ModLoaders.IsSingle Then ModLoaderDescriptionFull = "仅 " & ModLoaders.Single.ToString ModLoaderDescriptionPart = ModLoaders.Single.ToString Else @@ -601,7 +620,7 @@ If ModLoaders.Contains(CompModLoaderType.Forge) AndAlso (NewestDrop < 140 OrElse ModLoaders.Contains(CompModLoaderType.Fabric)) AndAlso (NewestDrop < 200 OrElse ModLoaders.Contains(CompModLoaderType.NeoForge)) AndAlso - (NewestDrop < 140 OrElse ModLoaders.Contains(CompModLoaderType.Quilt) OrElse Setup.Get("ToolDownloadIgnoreQuilt")) Then + (NewestDrop < 140 OrElse ModLoaders.Contains(CompModLoaderType.Quilt) OrElse Settings.Get("ToolDownloadIgnoreQuilt")) Then ModLoaderDescriptionFull = "任意" ModLoaderDescriptionPart = "" Else @@ -614,12 +633,12 @@ Function() Dim NewItem As New MyCompItem With {.Tag = Me} ApplyLogoToMyImage(NewItem.PathLogo) - Dim Title = GetControlTitle(True) - NewItem.Title = Title.Key - If Title.Value = "" Then + Dim Titles = GetControlTitle(True) + NewItem.Title = Titles.Title + If Titles.SubTitle = "" Then CType(NewItem.LabTitleRaw.Parent, StackPanel).Children.Remove(NewItem.LabTitleRaw) Else - NewItem.SubTitle = Title.Value + NewItem.SubTitle = Titles.SubTitle End If NewItem.Tags = Tags NewItem.Description = Description.Replace(vbCr, "").Replace(vbLf, "") @@ -642,17 +661,10 @@ NewItem.LabVersion.Text = ModLoaderDescriptionFull End If NewItem.LabSource.Text = If(FromCurseForge, "CurseForge", "Modrinth") - If LastUpdate IsNot Nothing Then - NewItem.LabTime.Text = GetTimeSpanString(LastUpdate - Date.Now, True) - Else - NewItem.LabTime.Visibility = Visibility.Collapsed - NewItem.ColumnTime1.Width = New GridLength(0) - NewItem.ColumnTime2.Width = New GridLength(0) - NewItem.ColumnTime3.Width = New GridLength(0) - End If + NewItem.LabTime.Text = GetTimeSpanString(LastUpdate - Date.Now, True) NewItem.LabDownload.Text = If(DownloadCount > 100000000, Math.Round(DownloadCount / 100000000, 2) & " 亿", - If(DownloadCount > 100000, Math.Floor(DownloadCount / 10000) & " 万", DownloadCount)) + If(DownloadCount > 100000, Math.Floor(DownloadCount / 10000) & " 万", DownloadCount)) Return NewItem End Function) With {.Height = 64} End Function @@ -664,7 +676,7 @@ Img.FallbackSource = DlSourceModGet(LogoUrl) End If End Sub - Public Function GetControlTitle(HasModLoaderDescription As Boolean) As KeyValuePair(Of String, String) + Public Function GetControlTitle(HasModLoaderDescription As Boolean) As (Title As String, SubTitle As String) '检查下列代码时可以参考 #1567 的测试例 Dim Title As String = RawName Dim SubtitleList As List(Of String) @@ -672,18 +684,18 @@ '没有中文翻译 '将所有名称分段 Dim NameLists = TranslatedName.Split({" | ", " - ", "(", ")", "[", "]", "{", "}"}, StringSplitOptions.RemoveEmptyEntries). - Select(Function(s) s.Trim(" /\".ToCharArray)).Where(Function(w) Not String.IsNullOrEmpty(w)).ToList - If NameLists.Count = 1 Then GoTo NoSubtitle + Select(Function(s) s.Trim(" /\".ToCharArray)).Where(Function(w) Not String.IsNullOrEmpty(w)) + If NameLists.IsSingle Then GoTo NoSubtitle '查找其中的缩写、Forge/Fabric 等版本标记 SubtitleList = New List(Of String) Dim NormalNameList = New List(Of String) For Each Name In NameLists - Dim LowerName As String = Name.ToLower - If Name.ToUpper = Name AndAlso Name <> "FPS" AndAlso Name <> "HUD" Then + Dim LowerName As String = Name.Lower + If Name = Name.Upper AndAlso Name <> "FPS" AndAlso Name <> "HUD" Then '缩写 SubtitleList.Add(Name) - ElseIf (LowerName.Contains("forge") OrElse LowerName.Contains("fabric") OrElse LowerName.Contains("quilt")) AndAlso - Not RegexCheck(LowerName.Replace("forge", "").Replace("fabric", "").Replace("quilt", ""), "[a-z]+") Then '去掉关键词后没有其他字母 + ElseIf {"neoforge", "forge", "fabric", "quilt"}.Any(Function(l) LowerName.Contains(l)) AndAlso + Not RegexCheck(LowerName.Replace("neoforge", "").Replace("forge", "").Replace("fabric", "").Replace("quilt", ""), "[a-z]+") Then '去掉关键词后没有其他字母 'Forge/Fabric 等版本标记 SubtitleList.Add(Name) Else @@ -698,8 +710,8 @@ Else '有中文翻译 '尝试将文本分为三段:Title (EnglishName) - Suffix - '检查时注意 Carpet:它没有中文译名,但有 Suffix - Title = TranslatedName.BeforeFirst(" (").BeforeFirst(" - ") + '检查时注意 Carpet(它没有中文译名,但有 Suffix)和 “汤姆存储 - 星的奇妙优化 (Tom's balabala)” + Title = If(TranslatedName.Contains(" ("), TranslatedName.BeforeFirst(" ("), TranslatedName.BeforeLast(" - ")) Dim Suffix As String = "" If TranslatedName.AfterLast(")").Contains(" - ") Then Suffix = TranslatedName.AfterLast(")").AfterLast(" - ") Dim EnglishName As String = TranslatedName @@ -709,8 +721,8 @@ SubtitleList = EnglishName.Split({" | ", " - ", "(", ")", "[", "]", "{", "}"}, StringSplitOptions.RemoveEmptyEntries). Select(Function(s) s.Trim(" /".ToCharArray)).Where(Function(w) Not String.IsNullOrEmpty(w)).ToList If SubtitleList.Count > 1 AndAlso - Not SubtitleList.Any(Function(s) s.ToLower.Contains("forge") OrElse s.ToLower.Contains("fabric") OrElse s.ToLower.Contains("quilt")) AndAlso '不是标注 XX 版 - Not (SubtitleList.Count = 2 AndAlso SubtitleList.Last.ToUpper = SubtitleList.Last) Then '不是缩写 + Not SubtitleList.Any(Function(s) s.Lower.Contains("forge") OrElse s.Lower.Contains("fabric") OrElse s.Lower.Contains("quilt")) AndAlso '不是标注 XX 版 + Not (SubtitleList.Count = 2 AndAlso SubtitleList.Last.Upper = SubtitleList.Last) Then '不是缩写 SubtitleList = New List(Of String) From {EnglishName} '使用原名 End If '添加后缀 @@ -722,25 +734,25 @@ 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") + Ex.Lower.Contains("neoforge") OrElse Ex.Lower.Contains("forge") OrElse Ex.Lower.Contains("fabric") OrElse Ex.Lower.Contains("quilt") '是否显示 ModLoader 信息 If Not HasModLoaderDescription AndAlso IsModLoaderDescription Then Continue For '去除 “Forge/Fabric” 这一无意义提示 - If Ex.Length < 16 AndAlso Ex.ToLower.Contains("fabric") AndAlso Ex.ToLower.Contains("forge") Then Continue For + If Ex.Length < 16 AndAlso Ex.Lower.Contains("fabric") AndAlso Ex.Lower.Contains("forge") Then Continue For '将 “Forge” 等提示改为 “Forge 版” If IsModLoaderDescription AndAlso Not Ex.Contains("版") AndAlso - Ex.ToLower.Replace("forge", "").Replace("fabric", "").Replace("quilt", "").Length <= 3 Then + Ex.Lower.Replace("neoforge", "").Replace("forge", "").Replace("fabric", "").Replace("quilt", "").Length <= 3 Then Ex = Ex.Replace("Edition", "").Replace("edition", "").Trim.Capitalize & " 版" End If '将 “forge” 等词语的首字母大写 - Ex = Ex.Replace("forge", "Forge").Replace("neo", "Neo").Replace("fabric", "Fabric").Replace("quilt", "Quilt") + Ex = Ex.Replace("neoforge", "NeoForge").Replace("forge", "Forge").Replace("neo", "Neo").Replace("fabric", "Fabric").Replace("quilt", "Quilt") Subtitle &= " | " & Ex.Trim Next Else NoSubtitle: Subtitle = "" End If - Return New KeyValuePair(Of String, String)(Title, Subtitle) + Return (Title, Subtitle) End Function '辅助函数 @@ -757,17 +769,16 @@ NoSubtitle: For Each r As Char In Data.Where(Function(c) Char.IsLetterOrDigit(c)) Result.Append(r) Next - Return Result.ToString.ToLower + Return Result.ToString.Lower End Function '来自不同的网站 If FromCurseForge = Project.FromCurseForge Then Return False 'Mod 加载器一致 If ModLoaders.Count <> Project.ModLoaders.Count OrElse ModLoaders.Except(Project.ModLoaders).Any() Then Return False '若不为光影,则要求 MC 版本一致 - If Type <> CompType.Shader AndAlso (Drops.Count <> Project.Drops.Count OrElse Drops.Except(Project.Drops).Any()) Then Return False + If Types <> CompType.Shader AndAlso (Drops.Count <> Project.Drops.Count OrElse Drops.Except(Project.Drops).Any()) Then Return False '最近更新时间差距在一周以内 - If LastUpdate IsNot Nothing AndAlso Project.LastUpdate IsNot Nothing AndAlso - Math.Abs((LastUpdate - Project.LastUpdate).Value.TotalDays) > 7 Then Return False + If Math.Abs((LastUpdate - Project.LastUpdate).TotalDays) > 7 Then Return False 'MCMOD 翻译名 / 原名 / 描述文本 / Slug 的英文部分相同 If TranslatedName = Project.TranslatedName OrElse RawName = Project.RawName OrElse Description = Project.Description OrElse @@ -816,8 +827,8 @@ NoSubtitle: ''' Public ReadOnly Property CanContinue As Boolean Get - If Tag.StartsWithF("/") OrElse Not Source.HasFlag(CompSourceType.CurseForge) Then Storage.CurseForgeTotal = 0 - If Tag.EndsWithF("/") OrElse Not Source.HasFlag(CompSourceType.Modrinth) Then Storage.ModrinthTotal = 0 + If Tag.StartsWithF("/") OrElse Not Sources.HasFlag(CompSourceType.CurseForge) Then Storage.CurseForgeTotal = 0 + If Tag.EndsWithF("/") OrElse Not Sources.HasFlag(CompSourceType.Modrinth) Then Storage.ModrinthTotal = 0 If Storage.CurseForgeTotal = -1 OrElse Storage.ModrinthTotal = -1 Then Return True Return Storage.CurseForgeOffset < Storage.CurseForgeTotal OrElse Storage.ModrinthOffset < Storage.ModrinthTotal End Get @@ -842,16 +853,13 @@ NoSubtitle: ''' Public GameVersion As String = Nothing ''' - ''' 搜索的文本内容。 + ''' 搜索的初始内容。 ''' Public SearchText As String = Nothing ''' ''' 允许的来源。 ''' - Public Source As CompSourceType = CompSourceType.Any - ''' - ''' 构造函数。 - ''' + Public Sources As CompSourceType = CompSourceType.Any Public Sub New(Type As CompType, Storage As CompProjectStorage, TargetResultCount As Integer) Me.Type = Type Me.Storage = Storage @@ -861,14 +869,12 @@ NoSubtitle: '构造请求 ''' - ''' 获取对应的 CurseForge API 请求链接。若返回 Nothing 则为不进行 CurseForge 请求。 + ''' 获取对应的 CurseForge API 请求链接。 ''' - Public Function GetCurseForgeAddress() As String - If Not Source.HasFlag(CompSourceType.CurseForge) Then Return Nothing + Public Function GetCurseForgeAddress(SearchText As String, IgnoreModLoaderFilter As Boolean) As String If Tag.StartsWithF("/") Then Storage.CurseForgeTotal = 0 - If Storage.CurseForgeTotal > -1 AndAlso Storage.CurseForgeTotal <= Storage.CurseForgeOffset Then Return Nothing '应用筛选参数 - Dim Address As String = $"https://api.curseforge.com/v1/mods/search?gameId=432&sortField=2&sortOrder=desc&pageSize={CompPageSize}" + Dim Address As String = $"https://api.curseforge.com/v1/mods/search?gameId=432&sortField=2&sortOrder=desc&pageSize={COMP_PAGE_SIZE}" Select Case Type Case CompType.Mod Address += "&classId=6" @@ -882,28 +888,26 @@ NoSubtitle: Address += "&classId=12" End Select If Tag <> "" Then Address += "&categoryId=" & Tag.BeforeFirst("/") - If ModLoader <> CompModLoaderType.Any Then Address += "&modLoaderType=" & CType(ModLoader, Integer) + If ModLoader <> CompModLoaderType.Any AndAlso Not IgnoreModLoaderFilter 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) If Storage.CurseForgeOffset > 0 Then Address += "&index=" & Storage.CurseForgeOffset Return Address End Function ''' - ''' 获取对应的 Modrinth API 请求链接。若返回 Nothing 则为不进行 Modrinth 请求。 + ''' 获取对应的 Modrinth API 请求链接。 ''' - Public Function GetModrinthAddress() As String - If Not Source.HasFlag(CompSourceType.Modrinth) Then Return Nothing + Public Function GetModrinthAddress(SearchText As String, IgnoreModLoaderFilter As Boolean) As String If Tag.EndsWithF("/") Then Storage.ModrinthTotal = 0 - If Storage.ModrinthTotal > -1 AndAlso Storage.ModrinthTotal <= Storage.ModrinthOffset Then Return Nothing '应用筛选参数 - Dim Address As String = $"https://api.modrinth.com/v2/search?limit={CompPageSize}&index=relevance" + Dim Address As String = $"https://api.modrinth.com/v2/search?limit={COMP_PAGE_SIZE}&index=relevance" If Not String.IsNullOrEmpty(SearchText) Then Address += "&query=" & Net.WebUtility.UrlEncode(SearchText) If Storage.ModrinthOffset > 0 Then Address += "&offset=" & Storage.ModrinthOffset '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}""]") + Facets.Add($"[""project_type:{GetStringFromEnum(Type).Lower}""]") If Not String.IsNullOrEmpty(Tag) Then Facets.Add($"[""categories:'{Tag.AfterLast("/")}'""]") - If ModLoader <> CompModLoaderType.Any Then Facets.Add($"[""categories:'{GetStringFromEnum(ModLoader).ToLower}'""]") + If ModLoader <> CompModLoaderType.Any AndAlso Not IgnoreModLoaderFilter Then Facets.Add($"[""categories:'{GetStringFromEnum(ModLoader).Lower}'""]") If Not String.IsNullOrEmpty(GameVersion) Then Facets.Add($"[""versions:'{GameVersion}'""]") Address += "&facets=[" & String.Join(",", Facets) & "]" Return Address @@ -914,7 +918,7 @@ NoSubtitle: Dim request = TryCast(obj, CompProjectRequest) Return request IsNot Nothing AndAlso Type = request.Type AndAlso TargetResultCount = request.TargetResultCount AndAlso - Tag = request.Tag AndAlso ModLoader = request.ModLoader AndAlso Source = request.Source AndAlso + Tag = request.Tag AndAlso ModLoader = request.ModLoader AndAlso Sources = request.Sources AndAlso GameVersion = request.GameVersion AndAlso SearchText = request.SearchText End Function Public Shared Operator =(left As CompProjectRequest, right As CompProjectRequest) As Boolean @@ -923,6 +927,9 @@ NoSubtitle: Public Shared Operator <>(left As CompProjectRequest, right As CompProjectRequest) As Boolean Return Not left = right End Operator + Public Overrides Function GetHashCode() As Integer + Return (Type, Tag, ModLoader, GameVersion, SearchText, Sources).GetHashCode() + End Function End Class Public Class CompProjectStorage @@ -950,7 +957,8 @@ NoSubtitle: '实际的获取 - Private Const CompPageSize = 40 + Private Const COMP_PAGE_SIZE = 40 + Private Const MSG_NO_CHINESE_SEARCH_RESULT As String = "无搜索结果,请尝试搜索其英文名称" ''' ''' 已知工程信息的缓存。 ''' @@ -960,133 +968,156 @@ NoSubtitle: ''' Public Sub CompProjectsGet(Task As LoaderTask(Of CompProjectRequest, Integer)) Dim Request As CompProjectRequest = Task.Input - Dim Storage = Request.Storage '避免多线程问题 + Dim Storage = Request.Storage '避免其他线程对 Request.Storage 重新进行了赋值 - If Request.Storage.Results.Count >= Request.TargetResultCount Then - Log($"[Comp] 已有 {Request.Storage.Results.Count} 个结果,多于所需的 {Request.TargetResultCount} 个结果,结束处理") +#Region "前置检查" + + If Storage.Results.Count >= Request.TargetResultCount Then + Log($"[Comp] 已有 {Storage.Results.Count} 个结果,多于所需的 {Request.TargetResultCount} 个结果,结束处理") Return ElseIf Not Request.CanContinue Then - If Not Request.Storage.Results.Any() Then + If Not Storage.Results.Any() Then Throw New Exception("没有符合条件的结果") Else - Log($"[Comp] 已有 {Request.Storage.Results.Count} 个结果,少于所需的 {Request.TargetResultCount} 个结果,但无法继续获取,结束处理") + Log($"[Comp] 已有 {Storage.Results.Count} 个结果,少于所需的 {Request.TargetResultCount} 个结果,但无法继续获取,结束处理") Return End If End If -#Region "拒绝 1.13- Quilt(这个版本根本没有 Quilt)" - + '拒绝 1.13- Quilt(这个版本根本没有 Quilt) If Request.ModLoader = CompModLoaderType.Quilt AndAlso CompareVersion(If(Request.GameVersion, "1.15"), "1.14") = -1 Then Throw New Exception("Quilt 不支持 Minecraft " & Request.GameVersion) End If #End Region -#Region "处理搜索文本,赋值回 Task.Input.SearchText" +#Region "中文搜索" - Dim RawFilter As String = If(Request.SearchText, "").Trim - Request.SearchText = RawFilter - RawFilter = RawFilter.ToLower - Log("[Comp] 工程列表搜索原始文本:" & RawFilter) + Dim RawSearchText As String = If(Request.SearchText, "").Trim + RawSearchText = RawSearchText.Lower + Log("[Comp] 工程列表搜索原始文本:" & RawSearchText) - '中文请求关键字处理 - Dim IsChineseSearch As Boolean = RegexCheck(RawFilter, "[\u4e00-\u9fbb]") AndAlso Not String.IsNullOrEmpty(RawFilter) - If IsChineseSearch AndAlso (Request.Type = CompType.Mod OrElse Request.Type = CompType.DataPack) Then - '构造搜索请求 - Dim SearchEntries As New List(Of SearchEntry(Of CompDatabaseEntry)) - For Each Entry In CompDatabase - If Entry.ChineseName.Contains("动态的树") Then Continue For '这玩意儿附属太多了 - SearchEntries.Add(New SearchEntry(Of CompDatabaseEntry) With { + Dim IsChineseSearch As Boolean = + RegexCheck(RawSearchText, "[\u4e00-\u9fbb]") AndAlso Not String.IsNullOrEmpty(RawSearchText) AndAlso + (Request.Type = CompType.Mod OrElse Request.Type = CompType.DataPack) '目前仅对 Mod 和数据包进行中文搜索,注意整合包的名称可能已经有中文了 + Dim CurseForgeAltSearchText As String = Nothing, ModrinthAltSearchText As String = Nothing, ModrinthSlugs As New List(Of String) '从中文转为英文的替代搜索内容 + If IsChineseSearch Then + '帮助方法:从搜索项提取可能的英文单词 + Dim ExtractWords = + Function(Result As SearchEntry(Of CompDatabaseEntry), Source As CompSourceType) As IEnumerable(Of String) + '从各个可能的来源提取候选 + Dim Candidates As New List(Of String) + If Result.Item.CurseForgeSlug IsNot Nothing AndAlso Source = CompSourceType.CurseForge Then + Candidates.Add(Result.Item.CurseForgeSlug.Replace("-", " ").Replace("/", " ")) + End If + If Result.Item.ModrinthSlug IsNot Nothing AndAlso Source = CompSourceType.Modrinth Then + Candidates.Add(Result.Item.ModrinthSlug.Replace("-", " ").Replace("/", " ")) + End If + Candidates.Add(Result.Item.ChineseName.AfterLast(" (").TrimEnd(") ").BeforeFirst(" - "). + Replace("-", " ").Replace("/", " ").Replace(":", " ").Replace("(", " ").Replace(")", "")) + '分词、清洗、去重 + Candidates = Candidates. + SelectMany(Function(c) c.Split(" ")). + Select(Function(w) w.TrimStart("{[(").TrimEnd("}])").Lower). + Where( + Function(w) + If w.Length <= 1 Then Return False '单字或空白 + If {"the", "of", "mod", "and", "forge", "fabric", "for", "quilt", "neoforge"}.Contains(w) Then Return False '常见词 + If Val(w) > 0 Then Return False '数字 + Return True + End Function).Distinct.ToList + '如果一个词可以由其他词拼成,则去掉这个词(例如将 ender io enderio 的 enderio 剔除,只保留 ender io) + Dim CanForm As Func(Of String, Boolean) = Nothing + CanForm = Function(s) Candidates.Contains(s) OrElse Candidates.Any(Function(c) s.StartsWith(c) AndAlso CanForm(s.Substring(c.Length))) + Candidates = Candidates.Where(Function(w) Not Candidates.Any(Function(c) c.Length < w.Length AndAlso w.StartsWith(c) AndAlso CanForm(w.Substring(c.Length)))).ToList() + Return Candidates + End Function + 'CurseForge + If Request.Sources.HasFlag(CompSourceType.CurseForge) Then + '数据库搜索 + Static CurseForgeSearchEntries As List(Of SearchEntry(Of CompDatabaseEntry)) = + CompDatabase.Where(Function(Entry) Entry.CurseForgeSlug IsNot Nothing).Select( + Function(Entry) New SearchEntry(Of CompDatabaseEntry) With { .Item = Entry, - .SearchSource = New List(Of KeyValuePair(Of String, Double)) From { - New KeyValuePair(Of String, Double)(Entry.ChineseName & If(Entry.CurseForgeSlug, "") & If(Entry.ModrinthSlug, ""), 1) - } - }) - Next - '获取搜索结果 - Dim SearchResults = Search(SearchEntries, Request.SearchText, 3) - If Not SearchResults.Any() Then Throw New Exception("无搜索结果,请尝试搜索英文名称") - Dim SearchResult As String = "" - For i = 0 To Math.Min(4, SearchResults.Count - 1) '就算全是准确的,也最多只要 5 个 - 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.AfterLast(" (").TrimEnd(") ").BeforeFirst(" - "). - Replace(":", "").Replace("(", "").Replace(")", "").ToLower.Replace("/", " ") & " " - Next - Log("[Comp] 中文搜索原始关键词:" & SearchResult, LogLevel.Developer) - '去除常见连接词 - Dim RealFilter As String = "" - For Each Word In SearchResult.Split(" ") - If {"the", "of", "a", "mod", "and"}.Contains(Word.ToLowerInvariant) OrElse Val(Word) > 0 Then Continue For - If SearchResult.Split(" ").Count > 3 AndAlso {"ftb"}.Contains(Word.ToLower) Then Continue For - RealFilter += Word.TrimStart("{[(").TrimEnd("}])") & " " - Next - Request.SearchText = RealFilter - Log("[Comp] 中文搜索最终关键词:" & RealFilter, LogLevel.Developer) - End If - - '驼峰英文请求关键字处理 - Dim SpacedKeywords = Request.SearchText.RegexReplace("([A-Z]+|[a-z]+?)(?=[A-Z]+[a-z]+[a-z ]*)", "$& ") - Dim ConnectedKeywords = Request.SearchText.Replace(" ", "") - Dim AllPossibleKeywords = (SpacedKeywords & " " & If(IsChineseSearch, Request.SearchText, ConnectedKeywords & " " & RawFilter)).ToLower - - '最终处理关键字:分割、去重 - Dim RightKeywords As New List(Of String) - For Each Keyword In AllPossibleKeywords.Split(" ") - Keyword = Keyword.Trim("["c, "]"c) - If Keyword = "" Then Continue For - If {"forge", "fabric", "for", "mod", "quilt"}.Contains(Keyword) Then '#208 - Log("[Comp] 已跳过搜索关键词:" & Keyword, LogLevel.Developer) - Continue For + .SearchSource = New List(Of SearchSource) From { + New SearchSource(Entry.ChineseName.BeforeFirst(" (").Split({"/"c}, StringSplitOptions.RemoveEmptyEntries), 1), '部分 Mod 有别名 + New SearchSource(Entry.ChineseName.AfterFirst(" (") & Entry.CurseForgeSlug, 0.5)} + }).ToList + Dim CurseForgeSearchResults = Search(CurseForgeSearchEntries, RawSearchText, 100, 0.25) + If CurseForgeSearchResults.Any Then + '选取目标(CurseForge 要求每个词都必须匹配上,所以只能选择一个 Mod 进行搜索) + Dim CurseForgeTarget = + If(CurseForgeSearchResults.First.AbsoluteRight, + CurseForgeSearchResults.Where(Function(s) s.AbsoluteRight).ToList, '优先使用所有完全匹配的 + CurseForgeSearchResults.MaxByAll(Function(s) s.Similarity)). '其次使用所有相似度最高的 + MaxBy(Function(s) s.Item.Popularity) '然后从中选择最受欢迎的那一个 + '后处理 + CurseForgeAltSearchText = ExtractWords(CurseForgeTarget, CompSourceType.CurseForge).Join(" ") + Log("[Comp] 中文搜索关键词(CurseForge):" & CurseForgeAltSearchText, LogLevel.Debug) + End If + End If + 'Modrinth + If Request.Sources.HasFlag(CompSourceType.Modrinth) Then + '数据库搜索 + Static ModrinthSearchEntries As List(Of SearchEntry(Of CompDatabaseEntry)) = + CompDatabase.Where(Function(Entry) Entry.ModrinthSlug IsNot Nothing).Select( + Function(Entry) New SearchEntry(Of CompDatabaseEntry) With { + .Item = Entry, + .SearchSource = New List(Of SearchSource) From { + New SearchSource(Entry.ChineseName.BeforeFirst(" (").Split({"/"c}, StringSplitOptions.RemoveEmptyEntries), 1), '部分 Mod 有别名 + New SearchSource(Entry.ChineseName.AfterFirst(" (") & Entry.ModrinthSlug, 0.5)} + }).ToList + Dim ModrinthSearchResults = Search(ModrinthSearchEntries, RawSearchText, 100, 0.25) + If ModrinthSearchResults.Any Then + '分词 + Dim WordWeights As New Dictionary(Of String, Double) '各个单词及其出现的权重 + For Each Result In ModrinthSearchResults + For Each Word In ExtractWords(Result, CompSourceType.Modrinth) + If Not WordWeights.ContainsKey(Word) Then WordWeights.Add(Word, 0) + Dim Similarity = If(Result.SearchSource.Any(Function(s) s.Aliases.Contains(RawSearchText)), 1000, Result.Similarity) '完全匹配为 1000 + WordWeights(Word) += Similarity * Result.Item.Popularity '权重 += 相似度 * 受欢迎程度 + Next + Next + ModrinthAltSearchText = WordWeights.MaxBy(Function(w) w.Value).Key + Log("[Comp] 中文搜索关键词(Modrinth):" & ModrinthAltSearchText, LogLevel.Debug) + '直接请求工程 + ModrinthSlugs = ModrinthSearchResults.Take(100).Select(Function(r) r.Item.ModrinthSlug).ToList + End If + End If + '结束 + If String.IsNullOrEmpty(CurseForgeAltSearchText) AndAlso String.IsNullOrEmpty(ModrinthAltSearchText) AndAlso Not ModrinthSlugs.Any Then + Throw New Exception(MSG_NO_CHINESE_SEARCH_RESULT) End If - RightKeywords.Add(Keyword) - Next - If RawFilter.Length > 0 AndAlso Not RightKeywords.Any() Then - Request.SearchText = RawFilter '全都被过滤掉了 - Else - Request.SearchText = Join(RightKeywords.Distinct.ToList, " ").ToLower End If - - '例外项:OptiForge、OptiFabric(拆词后因为包含 Forge/Fabric 导致无法搜到实际的 Mod) - If RawFilter.Replace(" ", "").ContainsF("optiforge", True) Then Request.SearchText = "optiforge" - If RawFilter.Replace(" ", "").ContainsF("optifabric", True) Then Request.SearchText = "optifabric" - Log("[Comp] 工程列表搜索最终文本:" & Request.SearchText, LogLevel.Debug) - Task.Progress = 0.1 + Task.Progress = 0.05 #End Region Dim RealResults As New List(Of CompProject) -Retry: - Dim RawResults As New List(Of CompProject) - Dim [Error] As Exception = Nothing +NextPage: + Dim RawResults As New SafeList(Of CompProject) #Region "从 CurseForge 和 Modrinth 获取结果列表,存储于 RawResults" - Dim CurseForgeThread As Thread = Nothing - Dim ModrinthThread As Thread = Nothing - Dim ResultsLock As New Object + Dim WorkThreads As New List(Of Thread) + Dim Errors As New SafeList(Of (Ex As Exception, Source As CompSourceType)) '在 1.14-,部分老 Mod 没有设置支持的加载器,因此添加 Forge 筛选就会出现遗漏 '所以,在发起请求时不筛选加载器,然后在返回的结果中自行筛除不是 Forge 的 Mod - Dim IsOldForgeRequest = Request.ModLoader = CompModLoaderType.Forge AndAlso McVersion.VersionToDrop(Request.GameVersion, True) < 140 - If IsOldForgeRequest Then Request.ModLoader = CompModLoaderType.Any - Dim CurseForgeUrl As String = Request.GetCurseForgeAddress() - Dim ModrinthUrl As String = Request.GetModrinthAddress() - If IsOldForgeRequest Then Request.ModLoader = CompModLoaderType.Forge '设置回去 - + Dim IgnoreModLoaderFilter = Request.ModLoader = CompModLoaderType.Forge AndAlso McVersion.VersionToDrop(Request.GameVersion) < 140 Try - '启动 CurseForge 线程 - Dim CurseForgeFailed As Boolean = False - If CurseForgeUrl IsNot Nothing Then - CurseForgeThread = RunInNewThread( + 'CurseForge 搜索 + If Request.Sources.HasFlag(CompSourceType.CurseForge) AndAlso + Not (Storage.CurseForgeTotal > -1 AndAlso Storage.CurseForgeTotal <= Storage.CurseForgeOffset) AndAlso '剩余的未显示的搜索结果不足 + (Not IsChineseSearch OrElse (IsChineseSearch AndAlso Not String.IsNullOrEmpty(CurseForgeAltSearchText))) Then '如果是中文搜索,就只在有对应搜索关键词的时候才继续 + WorkThreads.Add(RunInNewThread( Sub() Try '获取工程列表 - Log("[Comp] 开始从 CurseForge 获取工程列表:" & CurseForgeUrl) + Dim CurseForgeUrl As String = Request.GetCurseForgeAddress(If(CurseForgeAltSearchText, RawSearchText), IgnoreModLoaderFilter) + Log("[Comp] 开始 CurseForge 搜索:" & CurseForgeUrl) Dim RequestResult As JObject = DlModRequest(CurseForgeUrl) - Task.Progress += 0.2 Dim ProjectList As New List(Of CompProject) For Each JsonEntry As JObject In RequestResult("data") Dim Project As New CompProject(JsonEntry) @@ -1094,82 +1125,111 @@ Retry: ProjectList.Add(Project) Next '更新结果 - SyncLock ResultsLock - RawResults.AddRange(ProjectList) - End SyncLock - Storage.CurseForgeOffset += ProjectList.Count + ProjectList.ForEach(Sub(p) RawResults.Add(p)) + Storage.CurseForgeOffset += RequestResult("data").Count Storage.CurseForgeTotal = RequestResult("pagination")("totalCount").ToObject(Of Integer) - Log($"[Comp] 从 CurseForge 获取到了 {ProjectList.Count} 个工程(已获取 {Storage.CurseForgeOffset} 个,共 {Storage.CurseForgeTotal} 个)") + Log($"[Comp] 从 CurseForge 搜索到了 {ProjectList.Count} 个工程(总计已获取 {Storage.CurseForgeOffset} 个,共 {Storage.CurseForgeTotal} 个)") Catch ex As Exception - Log(ex, "从 CurseForge 获取工程列表失败") - Storage.CurseForgeTotal = -1 'Storage.CurseForgeOffset - [Error] = ex - CurseForgeFailed = True + Log(ex, "CurseForge 搜索失败") + Storage.CurseForgeTotal = -1 + Errors.Add((ex, CompSourceType.CurseForge)) End Try - End Sub, "CurseForge Project Request") + If Task.Progress < 0.75 Then Task.Progress += 0.25 '可能重复加载多页,所以不能直接给够 + End Sub, "CurseForge Search")) End If - '启动 Modrinth 线程 - Dim ModrinthFailed As Boolean = False - If ModrinthUrl IsNot Nothing Then - ModrinthThread = RunInNewThread( + 'Modrinth 搜索 + If Request.Sources.HasFlag(CompSourceType.Modrinth) AndAlso + Not (Storage.ModrinthTotal > -1 AndAlso Storage.ModrinthTotal <= Storage.ModrinthOffset) AndAlso '剩余的未显示的搜索结果不足 + (Not IsChineseSearch OrElse (IsChineseSearch AndAlso Not String.IsNullOrEmpty(ModrinthAltSearchText))) Then '如果是中文搜索,就只在有对应搜索关键词的时候才继续 + WorkThreads.Add(RunInNewThread( Sub() Try - Log("[Comp] 开始从 Modrinth 获取工程列表:" & ModrinthUrl) + Dim ModrinthUrl As String = Request.GetModrinthAddress(If(ModrinthAltSearchText, RawSearchText), IgnoreModLoaderFilter) + Log("[Comp] 开始 Modrinth 搜索:" & ModrinthUrl) Dim RequestResult As JObject = DlModRequest(ModrinthUrl) - Task.Progress += 0.2 Dim ProjectList As New List(Of CompProject) For Each JsonEntry As JObject In RequestResult("hits") ProjectList.Add(New CompProject(JsonEntry)) Next '更新结果 - SyncLock ResultsLock - For Each Project In ProjectList - RawResults.Add(Project) - Next - End SyncLock - Storage.ModrinthOffset += ProjectList.Count + ProjectList.ForEach(Sub(p) RawResults.Add(p)) + Storage.ModrinthOffset += RequestResult("hits").Count Storage.ModrinthTotal = RequestResult("total_hits").ToObject(Of Integer) - Log($"[Comp] 从 Modrinth 获取到了 {ProjectList.Count} 个工程(已获取 {Storage.ModrinthOffset} 个,共 {Storage.ModrinthTotal} 个)") + Log($"[Comp] 从 Modrinth 搜索到了 {ProjectList.Count} 个工程(总计已获取 {Storage.ModrinthOffset} 个,共 {Storage.ModrinthTotal} 个)") Catch ex As Exception - Log(ex, "从 Modrinth 获取工程列表失败") - Storage.ModrinthTotal = -1 'Storage.ModrinthOffset - [Error] = ex - ModrinthFailed = True + Log(ex, "Modrinth 搜索失败") + Storage.ModrinthTotal = -1 + Errors.Add((ex, CompSourceType.Modrinth)) End Try - End Sub, "Modrinth Project Request") + If Task.Progress < 0.75 Then Task.Progress += 0.25 '可能重复加载多页,所以不能直接给够 + End Sub, "Modrinth Search")) + End If + + 'Modrinth 直接获取工程 + If Request.Sources.HasFlag(CompSourceType.Modrinth) AndAlso + Not (Storage.ModrinthTotal > -1 AndAlso Storage.ModrinthTotal <= Storage.ModrinthOffset) AndAlso '剩余的未显示的搜索结果不足 + ModrinthSlugs.Any Then '有直接获取的 Slug + WorkThreads.Add(RunInNewThread( + Sub() + Try + Dim ModrinthUrl As String = $"https://api.modrinth.com/v2/projects?ids=[""{ModrinthSlugs.Join(""",""")}""]" + Log("[Comp] 开始 Modrinth 直接获取:" & ModrinthUrl) + Dim ProjectList As New List(Of CompProject) + For Each JsonEntry As JObject In DlModRequest(ModrinthUrl) + Dim Project As New CompProject(JsonEntry) + '应用筛选 + If Request.Type <> CompType.Any AndAlso Not Project.Types.HasFlag(Request.Type) Then Continue For + If Not String.IsNullOrEmpty(Request.Tag) AndAlso + Not JsonEntry("categories").Any(Function(c) c.ToString = Request.Tag.AfterLast("/")) Then Continue For 'Project.Tags 已经转换成中文了,只能从 json 判 + If Request.ModLoader <> CompModLoaderType.Any AndAlso Not IgnoreModLoaderFilter AndAlso + Not Project.ModLoaders.Any(Function(m) m = Request.ModLoader) Then Continue For + If Not String.IsNullOrEmpty(Request.GameVersion) AndAlso + Not Project.UnsafeGameVersions.Any(Function(d) d = Request.GameVersion) Then Continue For + ProjectList.Add(Project) + Next + '更新结果 + ProjectList.ForEach(Sub(p) RawResults.Add(p)) + Log($"[Comp] 从 Modrinth 直接获取到了 {ProjectList.Count} 个工程") + ModrinthSlugs.Clear() '防止重试/加载下一页时重复获取 + Catch ex As Exception + Log(ex, "Modrinth 直接获取失败") + Errors.Add((ex, CompSourceType.Modrinth)) + End Try + If Task.Progress < 0.75 Then Task.Progress += 0.25 '可能重复加载多页,所以不能直接给够 + End Sub, "Modrinth Get")) End If '等待线程结束 - If CurseForgeThread IsNot Nothing Then CurseForgeThread.Join() - If Task.IsAborted Then Return '会自动触发 Finally - If ModrinthThread IsNot Nothing Then ModrinthThread.Join() - If Task.IsAborted Then Return + For Each Thread In WorkThreads + Thread.Join() + If Task.IsInterrupted Then Return '会自动触发 Finally 以清理线程 + Next '筛除不是 Forge 的 Mod - If IsOldForgeRequest Then + If IgnoreModLoaderFilter Then RawResults = RawResults.Where(Function(p) Not p.ModLoaders.Any() OrElse p.ModLoaders.Contains(CompModLoaderType.Forge)).ToList End If '确保存在结果 Storage.ErrorMessage = Nothing If Not RawResults.Any() Then - If [Error] IsNot Nothing Then - Throw [Error] + If Errors.Any() Then + Throw Errors.First.Ex Else If IsChineseSearch AndAlso Not (Request.Type = CompType.Mod OrElse Request.Type = CompType.DataPack) Then - Throw New Exception("没有搜索结果,请尝试使用英文搜索") - ElseIf Request.Source = CompSourceType.CurseForge AndAlso Request.Tag.StartsWithF("/") Then + Throw New Exception(MSG_NO_CHINESE_SEARCH_RESULT) + ElseIf Request.Sources = CompSourceType.CurseForge AndAlso Request.Tag.StartsWithF("/") Then Throw New Exception("CurseForge 不兼容所选的类型") - ElseIf Request.Source = CompSourceType.Modrinth AndAlso Request.Tag.EndsWithF("/") Then + ElseIf Request.Sources = CompSourceType.Modrinth AndAlso Request.Tag.EndsWithF("/") Then Throw New Exception("Modrinth 不兼容所选的类型") Else Throw New Exception("没有搜索结果") End If End If - ElseIf [Error] IsNot Nothing Then + ElseIf Errors.Any() Then '有结果但是有错误 - If CurseForgeFailed Then + If Errors.Any(Function(e) e.Source = CompSourceType.CurseForge) Then Storage.ErrorMessage = $"无法连接到 CurseForge,所以目前仅显示了来自 Modrinth 的内容,搜索结果可能不全。{vbCrLf}请稍后再试,或使用 VPN 改善网络环境。" Else Storage.ErrorMessage = $"无法连接到 Modrinth,所以目前仅显示了来自 CurseForge 的内容,搜索结果可能不全。{vbCrLf}请稍后再试,或使用 VPN 改善网络环境。" @@ -1177,8 +1237,9 @@ Retry: End If Finally - CurseForgeThread?.Interrupt() - ModrinthThread?.Interrupt() + For Each Thread In WorkThreads + If Thread.IsAlive Then Thread.Interrupt() + Next End Try #End Region @@ -1186,16 +1247,15 @@ Retry: #Region "提取非重复项,存储于 RealResults" '将 CurseForge 排在 Modrinth 的前面,避免加载结束顺序不同导致排名不同 - '这样做的话,去重后将优先保留 Modrinth 的内容 RawResults = RawResults.Where(Function(x) x.FromCurseForge).Concat(RawResults.Where(Function(x) Not x.FromCurseForge)).ToList - 'RawResults 去重 + '去重 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 '加入列表 RealResults.AddRange(RawResults) - Log($"[Comp] 去重、筛选后累计新增结果 {RealResults.Count} 个") + Log($"[Comp] 去重、筛选后累计新增结果 {RealResults.Count} 个(目前已有结果 {Storage.Results.Count} 个)") #End Region @@ -1203,9 +1263,9 @@ Retry: If RealResults.Count + Storage.Results.Count < Request.TargetResultCount Then Log($"[Comp] 总结果数需求最少 {Request.TargetResultCount} 个,仅获得了 {RealResults.Count + Storage.Results.Count} 个") - If Request.CanContinue AndAlso [Error] Is Nothing Then '如果有下载源失败则不再重试,这时候重试可能导致无限循环 + If Request.CanContinue AndAlso Not Errors.Any Then '如果有某个源失败则不再重试,这时候重试可能导致无限循环 Log("[Comp] 将继续尝试加载下一页") - GoTo Retry + GoTo NextPage Else Log("[Comp] 无法继续加载,将强制结束") End If @@ -1229,28 +1289,31 @@ Retry: Return 1 End Select End Function - If String.IsNullOrEmpty(Request.SearchText) Then + If String.IsNullOrEmpty(RawSearchText) Then '如果没有搜索文本,按下载量将结果排序 For Each Result As CompProject In RealResults - Scores.Add(Result, Result.DownloadCount * GetDownloadCountMult(Result)) + Scores(Result) = Result.DownloadCount * GetDownloadCountMult(Result) Next Else '如果有搜索文本,按关联度将结果排序 '排序分 = 搜索相对相似度 (1) + 下载量权重 (对数,10 亿时为 1) + 有中文名 (0.2) - Dim Entry As New List(Of SearchEntry(Of CompProject)) + Dim SearchEntries As New List(Of SearchEntry(Of CompProject)) For Each Result As CompProject In RealResults - Scores.Add(Result, If(Result.WikiId > 0, 0.2, 0) + - Math.Log10(Math.Max(Result.DownloadCount, 1) * GetDownloadCountMult(Result)) / 9) - Entry.Add(New SearchEntry(Of CompProject) With {.Item = Result, .SearchSource = New List(Of KeyValuePair(Of String, Double)) From { - New KeyValuePair(Of String, Double)(If(IsChineseSearch, Result.TranslatedName, Result.RawName), 1), - New KeyValuePair(Of String, Double)(Result.Description, 0.05)}}) + Scores(Result) = If(Result.WikiId > 0, 0.2, 0) + + Math.Log10(Math.Max(Result.DownloadCount, 1) * GetDownloadCountMult(Result)) / 9 + SearchEntries.Add(New SearchEntry(Of CompProject) With {.Item = Result, .SearchSource = New List(Of SearchSource) From { + New SearchSource(If(IsChineseSearch, Result.TranslatedName, Result.RawName).Split({"/"c}, StringSplitOptions.RemoveEmptyEntries), 1), + New SearchSource(Result.Description, 0.05)}}) Next - Dim SearchResult = Search(Entry, RawFilter, 101, -1) + Dim SearchResult = Search(SearchEntries, RawSearchText, 10000, -1) For Each OneResult In SearchResult - Scores(OneResult.Item) += OneResult.Similarity / SearchResult(0).Similarity '最高 1 分的相似度分 + Scores(OneResult.Item) += + If(OneResult.AbsoluteRight, 10, OneResult.Similarity) / + If(SearchResult.First.AbsoluteRight, 10, SearchResult.First.Similarity) '最高 1 分的相似度分 Next End If '根据排序分得出结果并添加 + If Task.IsInterrupted Then Throw New ThreadInterruptedException '#8246 Storage.Results.AddRange( Scores.OrderByDescending(Function(s) s.Value).Select(Function(r) r.Key)) @@ -1378,7 +1441,7 @@ Retry: '实例化 ''' - ''' 从文件 Json 中初始化实例。若出错会抛出异常。 + ''' 从 json 中初始化实例。若出错会抛出异常。 ''' Public Sub New(Data As JObject, DefaultType As CompType) Type = DefaultType @@ -1429,13 +1492,16 @@ Retry: Select(Function(d) d("modId").ToString).ToList End If 'GameVersions - Dim RawVersions As List(Of String) = Data("gameVersions").Select(Function(t) t.ToString.Trim.ToLower).ToList - GameVersions = RawVersions.Where(Function(v) McVersion.IsFormatFit(v)).Select(Function(v) v.Replace("-snapshot", " 预览版")).ToList - If GameVersions.Count > 1 Then + Dim RawVersions As List(Of String) = Data("gameVersions").Select(Function(t) t.ToString.Trim.Lower).ToList + GameVersions = RawVersions. + Where(Function(v) McVersion.IsFormatFit(v)). + Select(Function(v) v.Replace("-snapshot", " 预览版")). + Distinct.ToList + If GameVersions.IsSingle Then + GameVersions = GameVersions.ToList + ElseIf GameVersions.Count > 1 Then GameVersions = GameVersions.SortByComparison(AddressOf CompareVersionGE).ToList If Type = CompType.ModPack Then GameVersions = New List(Of String) From {GameVersions(0)} '整合包理应只 “支持” 一个版本 - ElseIf GameVersions.Count = 1 Then - GameVersions = GameVersions.ToList Else GameVersions = New List(Of String) From {"未知版本"} End If @@ -1462,24 +1528,19 @@ Retry: Size = File("size") Hash = File("hashes")("sha1") End If - 'ModLoaders + 'Loaders '结果可能混杂着 Mod、数据包和服务端插件 Dim RawLoaders As List(Of String) = Data("loaders").Select(Function(v) v.ToString).ToList ModLoaders = New List(Of CompModLoaderType) - If Type = CompType.Mod Then '以尽量宽容的方式检测加载器,以免同时兼容两种的项被删除 + If Type.HasFlag(CompType.Mod) OrElse Type.HasFlag(CompType.DataPack) Then If RawLoaders.Intersect({"bukkit", "folia", "paper", "purpur", "spigot"}).Any() Then Type = CompType.Plugin 'Veinminer Enchantment 同时支持服务端与 Fabric If RawLoaders.Contains("datapack") Then Type = CompType.DataPack If RawLoaders.Contains("forge") Then ModLoaders.Add(CompModLoaderType.Forge) : Type = CompType.Mod If RawLoaders.Contains("neoforge") Then ModLoaders.Add(CompModLoaderType.NeoForge) : Type = CompType.Mod If RawLoaders.Contains("fabric") Then ModLoaders.Add(CompModLoaderType.Fabric) : Type = CompType.Mod If RawLoaders.Contains("quilt") Then ModLoaders.Add(CompModLoaderType.Quilt) : Type = CompType.Mod - ElseIf Type = CompType.DataPack Then - If RawLoaders.Intersect({"bukkit", "folia", "paper", "purpur", "spigot"}).Any() Then Type = CompType.Plugin - If RawLoaders.Contains("forge") Then ModLoaders.Add(CompModLoaderType.Forge) : Type = CompType.Mod - If RawLoaders.Contains("neoforge") Then ModLoaders.Add(CompModLoaderType.NeoForge) : Type = CompType.Mod - If RawLoaders.Contains("fabric") Then ModLoaders.Add(CompModLoaderType.Fabric) : Type = CompType.Mod - If RawLoaders.Contains("quilt") Then ModLoaders.Add(CompModLoaderType.Quilt) : Type = CompType.Mod - If RawLoaders.Contains("datapack") Then Type = CompType.DataPack + Else + '使用传入的类别,不作修改(#8377) End If 'Dependencies If Data.ContainsKey("dependencies") Then @@ -1490,14 +1551,15 @@ Retry: Select(Function(d) d("project_id").ToString).ToList End If 'GameVersions - Dim RawVersions As List(Of String) = Data("game_versions").Select(Function(t) t.ToString.Trim.ToLower).ToList + Dim RawVersions As List(Of String) = Data("game_versions").Select(Function(t) t.ToString.Trim.Lower).ToList GameVersions = RawVersions.Where(Function(v) v.Contains(".")). - Select(Function(v) If(v.Contains("-"), v.BeforeFirst("-") & " 预览版", If(v.StartsWithF("b1."), "远古版本", v))).ToList - If GameVersions.Count > 1 Then + Select(Function(v) If(v.Contains("-"), v.BeforeFirst("-") & " 预览版", If(v.StartsWithF("b1."), "远古版本", v))). + Distinct.ToList + If GameVersions.IsSingle Then + '无需处理 + ElseIf GameVersions.Count > 1 Then GameVersions = GameVersions.SortByComparison(AddressOf CompareVersionGE).ToList If Type = CompType.ModPack Then GameVersions = New List(Of String) From {GameVersions(0)} '整合包理应只 “支持” 一个版本 - ElseIf GameVersions.Count = 1 Then - '无需处理 ElseIf RawVersions.Any(Function(v) RegexCheck(v, "[0-9]{2}w[0-9]{2}[a-z]")) Then GameVersions = RawVersions.Where(Function(v) RegexCheck(v, "[0-9]{2}w[0-9]{2}[a-z]")).ToList Else @@ -1558,7 +1620,7 @@ Retry: If GameVersions.All( Function(VerName) Return Not VerName.Contains(".") OrElse {"w", "snapshot", "rc", "pre", "experimental", "-"}.Any(Function(s) VerName.ContainsF(s, True)) - End Function) Then Info.Add($"游戏版本 {Join(GameVersions, "、")}") + End Function) Then Info.Add($"游戏版本 {GameVersions.Join("、"c)}") If DownloadCount > 0 Then 'CurseForge 的下载次数经常错误地返回 0 Info.Add("下载 " & If(DownloadCount > 100000, Math.Round(DownloadCount / 10000) & " 万次", DownloadCount & " 次")) End If @@ -1569,7 +1631,7 @@ Retry: Dim NewItem As New MyListItem With { .Title = Title, .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Me, - .Info = Info.Join(",") + .Info = Info.Join(","c) } Select Case Status Case CompFileStatus.Release @@ -1648,9 +1710,9 @@ Retry: Next Else 'Modrinth - ResultJsonArray = DlModRequest($"https://api.modrinth.com/v2/project/{ProjectId}/version") + ResultJsonArray = DlModRequest($"https://api.modrinth.com/v2/project/{ProjectId}/version?include_changelog=false") End If - CompFilesCache(ProjectId) = ResultJsonArray.Select(Function(a) New CompFile(a, TargetProject.Type)). + CompFilesCache(ProjectId) = ResultJsonArray.Select(Function(a) New CompFile(a, TargetProject.Types)). Where(Function(a) a.Available).ToList. Distinct(Function(a, b) a.Id = b.Id) 'CurseForge 可能会重复返回相同项(#1330) End If @@ -1659,13 +1721,13 @@ Retry: Dim UndoneDeps = Deps.Where(Function(f) Not CompProjectCache.ContainsKey(f)).ToList '获取前置工程信息 If UndoneDeps.Any Then - Log($"[Comp] {ProjectId} 文件列表中还需要获取信息的前置:{Join(UndoneDeps, ",")}") + Log($"[Comp] {ProjectId} 文件列表中还需要获取信息的前置:{UndoneDeps.Join(","c)}") Dim Projects As JArray If TargetProject.FromCurseForge Then Projects = DlModRequest("https://api.curseforge.com/v1/mods", - HttpMethod.Post, "{""modIds"": [" & Join(UndoneDeps, ",") & "]}", "application/json")("data") + HttpMethod.Post, "{""modIds"": [" & UndoneDeps.Join(","c) & "]}", "application/json")("data") Else - Projects = DlModRequest($"https://api.modrinth.com/v2/projects?ids=[""{Join(UndoneDeps, """,""")}""]") + Projects = DlModRequest($"https://api.modrinth.com/v2/projects?ids=[""{UndoneDeps.Join(""",""")}""]") End If For Each Project In Projects Dim Unused As New CompProject(Project) '在 New 的时候会添加缓存以便之后读取 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb index 45f9fdd..5363333 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb @@ -79,7 +79,7 @@ End Try Next If LatestLog IsNot Nothing AndAlso LatestLog.Any Then - Dim RawOutput As String = Join(LatestLog, vbCrLf) + Dim RawOutput As String = LatestLog.Join(vbCrLf) Log("[Crash] 以下为游戏输出的最后一段内容:" & vbCrLf & RawOutput) WriteFile(TempFolder & "RawOutput.log", RawOutput) AnalyzeRawFiles.Add(New KeyValuePair(Of String, String())(TempFolder & "RawOutput.log", LatestLog.ToArray)) @@ -113,7 +113,7 @@ Extracted: For Each TargetFile As FileInfo In New DirectoryInfo(TempFolder & "Temp\").EnumerateFiles.ToList() Try If Not TargetFile.Exists OrElse TargetFile.Length = 0 Then Continue For - Dim Ext As String = TargetFile.Extension.ToLower + Dim Ext As String = TargetFile.Extension.Lower If Ext = ".log" OrElse Ext = ".txt" Then AnalyzeRawFiles.Add(New KeyValuePair(Of String, String())(TargetFile.FullName, ReadFile(TargetFile.FullName).Split(vbCrLf.ToCharArray))) Else @@ -147,7 +147,7 @@ Extracted: DirectFile = Nothing Dim AllFiles As New List(Of KeyValuePair(Of AnalyzeFileType, KeyValuePair(Of String, String()))) For Each LogFile In AnalyzeRawFiles - Dim MatchName As String = GetFileNameFromPath(LogFile.Key).ToLower + Dim MatchName As String = GetFileNameFromPath(LogFile.Key).Lower Dim TargetType As AnalyzeFileType If MatchName.StartsWithF("hs_err") Then TargetType = AnalyzeFileType.HsErr @@ -229,7 +229,7 @@ Extracted: '创建文件名词典 Dim FileNameDict As New Dictionary(Of String, KeyValuePair(Of String, String())) For Each SelectedFile In SelectedFiles - FileNameDict(GetFileNameFromPath(SelectedFile.Key).ToLower) = SelectedFile + FileNameDict(GetFileNameFromPath(SelectedFile.Key).Lower) = SelectedFile OutputFiles.Add(SelectedFile.Key) Log("[Crash] 输出报告:" & SelectedFile.Key & ",作为 Minecraft 或启动器日志") Next @@ -307,7 +307,7 @@ Extracted: ''' 输出字符串的前后某些行,并统一行尾为 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.Distinct, vbLf) + If Raw.Length <= HeadLines + TailLines Then Return Raw.Distinct.Join(vbLf) Dim Lines As New List(Of String) Dim RealHeadLines As Integer = 0, ViewedLines As Integer For ViewedLines = 0 To Raw.Length - 1 @@ -448,7 +448,7 @@ Done: Else Log("[Crash] 步骤 3:分析崩溃原因完成,找到 " & CrashReasons.Count & " 条可能的原因") For Each Reason In CrashReasons - Log("[Crash] - " & GetStringFromEnum(Reason.Key) & If(Reason.Value.Any, "(" & Join(Reason.Value, ";") & ")", "")) + Log("[Crash] - " & GetStringFromEnum(Reason.Key) & If(Reason.Value.Any, "(" & Reason.Value.Join(";"c) & ")", "")) Next End If End Sub @@ -464,7 +464,7 @@ Done: Else CrashReasons.Add(Reason, New List(Of String)(If(Additional, {}))) End If - Log("[Crash] 可能的崩溃原因:" & GetStringFromEnum(Reason) & If(Additional IsNot Nothing AndAlso Additional.Any, "(" & Join(Additional, ";") & ")", "")) + Log("[Crash] 可能的崩溃原因:" & GetStringFromEnum(Reason) & If(Additional IsNot Nothing AndAlso Additional.Any, "(" & Additional.Join(";"c) & ")", "")) End Sub Private Sub AppendReason(Reason As CrashReason, Additional As String) AppendReason(Reason, If(String.IsNullOrEmpty(Additional), Nothing, New List(Of String) From {Additional})) @@ -623,9 +623,9 @@ Done: Dim IsMixin As Boolean = MixinAnalyze(LogMc) '常规信息 If LogMc.Contains("An exception was thrown, the game will display an error screen and halt.") Then AppendReason(CrashReason.Forge报错, RegexSeek(LogMc, "(?<=the game will display an error screen and halt.[\n\r]+[^\n]+?Exception: )[\s\S]+?(?=\n\tat)")?.Trim(vbCrLf)) - 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)(\s+ - [^\n]+\n)+"), ""), "(?<=\s+)[^\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)(\s+ - [^\n]+\n)+"), ""), "(?<=\s+)[^\n]+"), vbLf)) - If LogMc.Contains("确定了一种可能的解决方法,这样做可能会解决你的问题:") Then AppendReason(CrashReason.Fabric报错并给出解决方案, Join(RegexSearch(If(RegexSeek(LogMc, "(?<=确定了一种可能的解决方法,这样做可能会解决你的问题:\n)(\s+ - [^\n]+\n)+"), ""), "(?<=\s+)[^\n]+"), vbLf)) + If LogMc.Contains("A potential solution has been determined:") Then AppendReason(CrashReason.Fabric报错并给出解决方案, RegexSearch(If(RegexSeek(LogMc, "(?<=A potential solution has been determined:\n)(\s+ - [^\n]+\n)+"), ""), "(?<=\s+)[^\n]+").Join(vbLf)) + If LogMc.Contains("A potential solution has been determined, this may resolve your problem:") Then AppendReason(CrashReason.Fabric报错并给出解决方案, RegexSearch(If(RegexSeek(LogMc, "(?<=A potential solution has been determined, this may resolve your problem:\n)(\s+ - [^\n]+\n)+"), ""), "(?<=\s+)[^\n]+").Join(vbLf)) + If LogMc.Contains("确定了一种可能的解决方法,这样做可能会解决你的问题:") Then AppendReason(CrashReason.Fabric报错并给出解决方案, RegexSearch(If(RegexSeek(LogMc, "(?<=确定了一种可能的解决方法,这样做可能会解决你的问题:\n)(\s+ - [^\n]+\n)+"), ""), "(?<=\s+)[^\n]+").Join(vbLf)) If Not IsMixin AndAlso LogMc.Contains("due to errors, provided by ") Then '在 #3104 的情况下,这一句导致 OptiFabric 的 Mixin 失败错判为 Fabric Loader 加载失败 AppendReason(CrashReason.确定Mod导致游戏崩溃, TryAnalyzeModName(If(RegexSeek(LogMc, "(?<=due to errors, provided by ')[^']+"), "").TrimEnd((vbCrLf & " ").ToCharArray))) End If @@ -714,18 +714,18 @@ NextStack: 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", "fake", "oshi", "impl", "data", "pool", "task", "forge", "setup", "block", "model", "mixin", "event", "unimi", "netty", "world", "lwjgl", "fakes", - "gitlab", "common", "server", "config", "mixins", "compat", "loader", "launch", "script", "entity", "assist", "client", "plugin", "modapi", "mojang", "shader", "events", "github", "recipe", "render", "packet", "events", + "fabric", "gitlab", "common", "server", "config", "mixins", "compat", "loader", "launch", "script", "entity", "assist", "client", "plugin", "modapi", "mojang", "shader", "events", "github", "recipe", "render", "packet", "events", "preinit", "preload", "machine", "reflect", "channel", "general", "handler", "content", "systems", "modules", "service", "scripts", "network", "fastutil", "optifine", "internal", "platform", "override", "fabricmc", "neoforge", "external", "injection", "listeners", "scheduler", "minecraft", "universal", "multipart", "neoforged", "microsoft", "transformer", "transformers", "minecraftforge", "blockentity", "spongepowered", "electronwill", "concurrent" - }.Contains(Word.ToLower) Then Continue For + }.Contains(Word.Lower) Then Continue For PossibleWords.Add(Word.Trim) Next Next PossibleWords = PossibleWords.Distinct.ToList Log("[Crash] 从堆栈信息中找到 " & PossibleWords.Count & " 个可能的 Mod ID 关键词") - If PossibleWords.Any Then Log("[Crash] - " & Join(PossibleWords, ", ")) + If PossibleWords.Any Then Log("[Crash] - " & PossibleWords.Join(", ")) If PossibleWords.Count > 10 Then Log("[Crash] 关键词过多,考虑匹配出错,不纳入考虑") Return New List(Of String) @@ -773,8 +773,8 @@ NextStack: Dim HintLines As New List(Of String) For Each KeyWord As String In Keywords For Each ModString As String In ModNameLines - Dim RealModString As String = ModString.ToLower.Replace("_", "") - If Not RealModString.Contains(KeyWord.ToLower.Replace("_", "")) Then Continue For + Dim RealModString As String = ModString.Lower.Replace("_", "") + If Not RealModString.Contains(KeyWord.Lower.Replace("_", "")) Then Continue For If RealModString.Contains("minecraft.jar") OrElse RealModString.Contains(" forge-") OrElse RealModString.Contains(" mixin-") Then Continue For HintLines.Add(ModString.Trim(vbCrLf.ToCharArray)) Exit For @@ -874,7 +874,7 @@ NextStack: StartProcess(DirectFile.Value.Key) Else Dim FilePath As String = PathTemp & "Crash.txt" - WriteFile(FilePath, Join(DirectFile.Value.Value, vbCrLf)) + WriteFile(FilePath, DirectFile.Value.Value.Join(vbCrLf)) StartProcess(FilePath) End If End Sub)) @@ -974,35 +974,35 @@ NextStack: End If Case CrashReason.Mod缺少前置或MC版本错误 If Additional.Any Then - Results.Add("由于未安装正确的前置 Mod,导致游戏退出。\n缺失的依赖项:\n - " & Join(Additional, "\n - ") & "\n\n请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。") + Results.Add("由于未安装正确的前置 Mod,导致游戏退出。\n缺失的依赖项:\n - " & Additional.Join("\n - ") & "\n\n请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。") Else Results.Add("由于未安装正确的前置 Mod,导致游戏退出。\n请根据错误报告中的日志信息进行对应处理,如果看不懂英文可以使用翻译软件。\h") End If Case CrashReason.堆栈分析发现关键字 - If Additional.Count = 1 Then + If Additional.IsSingle Then Results.Add("你的游戏遇到了一些问题,PCL 为此找到了一个可疑的关键词:" & Additional.First & "。\n\n如果你知道某个关键词对应的 Mod,那么有可能就是它引起的错误,你也可以查看错误报告获取详情。\h") Else - Results.Add("你的游戏遇到了一些问题,PCL 为此找到了以下可疑的关键词:\n - " & Join(Additional, ", ") & "\n\n如果你知道某个关键词对应的 Mod,那么有可能就是它引起的错误,你也可以查看错误报告获取详情。\h") + Results.Add("你的游戏遇到了一些问题,PCL 为此找到了以下可疑的关键词:\n - " & Additional.Join(", ") & "\n\n如果你知道某个关键词对应的 Mod,那么有可能就是它引起的错误,你也可以查看错误报告获取详情。\h") End If Case CrashReason.堆栈分析发现Mod名称, CrashReason.怀疑Mod导致游戏崩溃 - If Additional.Count = 1 Then + If Additional.IsSingle Then Results.Add("PCL 怀疑名为 " & Additional.First & " 的 Mod 导致了游戏出错,但不能完全确定。\n你可以尝试禁用此 Mod,然后观察游戏是否还会崩溃。\n\e\h") Else - Results.Add("PCL 怀疑以下 Mod 导致了游戏出错,但不能完全确定:\n - " & Join(Additional, "\n - ") & "\n\n你可以尝试依次禁用上述 Mod,然后观察游戏是否还会崩溃。\n\e\h") + Results.Add("PCL 怀疑以下 Mod 导致了游戏出错,但不能完全确定:\n - " & Additional.Join("\n - ") & "\n\n你可以尝试依次禁用上述 Mod,然后观察游戏是否还会崩溃。\n\e\h") End If Case CrashReason.确定Mod导致游戏崩溃 - If Additional.Count = 1 Then + If Additional.IsSingle Then Results.Add("名为 " & Additional.First & " 的 Mod 导致了游戏出错。\n你可以尝试禁用此 Mod,然后观察游戏是否还会崩溃。\n\e\h") Else - Results.Add("以下 Mod 导致了游戏出错:\n - " & Join(Additional, "\n - ") & "\n\n你可以尝试依次禁用上述 Mod,然后观察游戏是否还会崩溃。\n\e\h") + Results.Add("以下 Mod 导致了游戏出错:\n - " & Additional.Join("\n - ") & "\n\n你可以尝试依次禁用上述 Mod,然后观察游戏是否还会崩溃。\n\e\h") End If Case CrashReason.ModMixin失败 If Additional.Count = 0 Then Results.Add("部分 Mod 注入失败,导致游戏出错。\n这一般代表着部分 Mod 与其他 Mod 或当前环境不兼容,或是它存在 Bug。\n你可以尝试逐步禁用 Mod,然后观察游戏是否还会崩溃,以此定位导致崩溃的 Mod。\n\e\h") - ElseIf Additional.Count = 1 Then + ElseIf Additional.IsSingle Then 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你可以尝试依次禁用上述 Mod,然后观察游戏是否还会崩溃。\n\e\h") + Results.Add("以下 Mod 导致了游戏出错:\n - " & Additional.Join("\n - ") & "\n这一般代表着它们与其他 Mod 或当前环境不兼容,或是它存在 Bug。\n你可以尝试依次禁用上述 Mod,然后观察游戏是否还会崩溃。\n\e\h") End If Case CrashReason.Mod配置文件导致游戏崩溃 If Additional(1) Is Nothing Then @@ -1011,25 +1011,25 @@ NextStack: Results.Add("名为 " & Additional.First & " 的 Mod 导致了游戏出错:\n其配置文件 " & Additional(1) & " 存在异常,无法读取。") End If Case CrashReason.Mod初始化失败 - If Additional.Count = 1 Then + If Additional.IsSingle Then Results.Add("名为 " & Additional.First & " 的 Mod 初始化失败,导致游戏无法继续加载。\n你可以尝试禁用此 Mod,然后观察游戏是否还会崩溃。\n\e\h") Else - Results.Add("以下 Mod 初始化失败,导致游戏出错:\n - " & Join(Additional, "\n - ") & "\n\n你可以尝试依次禁用上述 Mod,然后观察游戏是否还会崩溃。\n\e\h") + Results.Add("以下 Mod 初始化失败,导致游戏出错:\n - " & Additional.Join("\n - ") & "\n\n你可以尝试依次禁用上述 Mod,然后观察游戏是否还会崩溃。\n\e\h") End If Case CrashReason.特定方块导致崩溃 - If Additional.Count = 1 Then + If Additional.IsSingle Then Results.Add("游戏似乎因为方块 " & Additional.First & " 出现了问题。\n\n你可以创建一个新世界,并观察游戏的运行情况:\n - 若正常运行,则是该方块导致出错,你或许需要使用一些方式删除此方块。\n - 若仍然出错,问题就可能来自其他原因……\h") Else Results.Add("游戏似乎因为世界中的某些方块出现了问题。\n\n你可以创建一个新世界,并观察游戏的运行情况:\n - 若正常运行,则是某些方块导致出错,你或许需要删除该世界。\n - 若仍然出错,问题就可能来自其他原因……\h") End If Case CrashReason.Mod重复安装 If Additional.Count >= 2 Then - Results.Add("你重复安装了多个相同的 Mod:\n - " & Join(Additional, "\n - ") & "\n\n每个 Mod 只能出现一次,请删除重复的 Mod,然后再启动游戏。") + Results.Add("你重复安装了多个相同的 Mod:\n - " & Additional.Join("\n - ") & "\n\n每个 Mod 只能出现一次,请删除重复的 Mod,然后再启动游戏。") Else Results.Add("你可能重复安装了多个相同的 Mod,导致游戏出错。\n\n每个 Mod 只能出现一次,请删除重复的 Mod,然后再启动游戏。\e\h") End If Case CrashReason.特定实体导致崩溃 - If Additional.Count = 1 Then + If Additional.IsSingle Then If Additional.First.Contains("minecraft:player") Then If Additional.First.Contains(" ") Then Results.Add($"游戏因为位于 {Additional.First.AfterFirst(" ")} 的玩家实体导致了崩溃。\h") @@ -1040,7 +1040,7 @@ NextStack: Results.Add($"游戏因为实体 {Additional.First} 导致了崩溃。\h") End If Else - Results.Add($"游戏因为下列实体导致了崩溃:{Additional.Join("、")}\h") + Results.Add($"游戏因为下列实体导致了崩溃:{Additional.Join("、"c)}\h") End If Case CrashReason.OptiFine与Forge不兼容 Results.Add("由于 OptiFine 与当前版本的 Forge 不兼容,导致了游戏崩溃。\n\n请前往 OptiFine 官网(https://optifine.net/downloads)查看 OptiFine 所兼容的 Forge 版本,并严格按照对应版本重新安装游戏。") @@ -1077,31 +1077,31 @@ NextStack: Case CrashReason.Forge安装不完整 Results.Add("由于安装的 Forge 文件丢失,导致游戏无法正常运行。\n请重新安装一次相同版本的 Forge,然后再启动游戏。\n在打包游戏时删除 libraries 文件夹可能导致此错误。\h") Case CrashReason.Fabric报错 - If Additional.Count = 1 Then + If Additional.IsSingle Then Results.Add("Fabric 提供了以下错误信息:\n" & Additional.First & "\n\n请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。") Else Results.Add("Fabric 可能已经提供了错误信息,请根据错误报告中的日志信息进行对应处理,如果看不懂英文可以使用翻译软件。\h") End If Case CrashReason.Mod互不兼容 - If Additional.Count = 1 Then + If Additional.IsSingle Then Results.Add("你所安装的 Mod 不兼容:\n" & Additional.First & "\n\n请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。") Else Results.Add("你所安装的 Mod 不兼容,Mod 加载器可能已经提供了错误信息,请根据错误报告中的日志信息进行对应处理,如果看不懂英文可以使用翻译软件。\h") End If Case CrashReason.Mod加载器报错 - If Additional.Count = 1 Then + If Additional.IsSingle Then Results.Add("Mod 加载器提供了以下错误信息:\n" & Additional.First & "\n\n请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。") Else Results.Add("Mod 加载器可能已经提供了错误信息,请根据错误报告中的日志信息进行对应处理,如果看不懂英文可以使用翻译软件。\h") End If Case CrashReason.Fabric报错并给出解决方案 - If Additional.Count = 1 Then + If Additional.IsSingle Then Results.Add("Fabric 提供了以下解决方案:\n" & Additional.First & "\n\n请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。") Else Results.Add("Fabric 可能已经提供了解决方案,请根据错误报告中的日志信息进行对应处理,如果看不懂英文可以使用翻译软件。\h") End If Case CrashReason.Forge报错 - If Additional.Count = 1 Then + If Additional.IsSingle Then Results.Add("Forge 提供了以下错误信息:\n" & Additional.First & "\n\n请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。") Else Results.Add("Forge 可能已经提供了错误信息,请根据错误报告中的日志信息进行对应处理,如果看不懂英文可以使用翻译软件。\h") @@ -1113,7 +1113,7 @@ NextStack: End Select Next - Return Join(Results, "\n\n此外,"). + Return Results.Join("\n\n此外,"). Replace("\n", vbCrLf). Replace("\h", ""). Replace("\e", If(IsHandAnalyze, "", vbCrLf & "你可以查看错误报告了解错误具体是如何发生的。")). diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 30c7569..52c5a06 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -97,7 +97,7 @@ Dim BackAssetsFile As NetFile = DlClientAssetIndexGet(Instance) If BackAssetsFile Is Nothing Then Log("[Download] 未找到版本 " & Instance.Name & " 的合适的资源索引下载地址,游戏 assets 可能缺失", LogLevel.Debug) - Task.Abort() + Task.Interrupt() Throw New ThreadInterruptedException End If RealAddress = BackAssetsFile.LocalPath @@ -107,7 +107,7 @@ '检查是否需要更新:每天只更新一次 If File.Exists(RealAddress) AndAlso Math.Abs((File.GetLastWriteTime(RealAddress).Date - Now.Date).TotalDays) < 1 Then Log("[Download] 无需更新资源文件索引,取消") - Task.Abort() + Task.Interrupt() End If End Sub)) LoadersAssetsUpdate.Add(New LoaderDownload("后台下载资源文件索引", New List(Of NetFile))) @@ -158,14 +158,14 @@ Public Property AllDrops As List(Of Integer) Get If _AllDrops Is Nothing Then - _AllDrops = Setup.Get("CacheDrops").ToString. + _AllDrops = Settings.Get("CacheDrops").ToString. Split(",".ToCharArray, StringSplitOptions.RemoveEmptyEntries).Select(Function(d) CInt(Val(d))).ToList() End If Return If(_AllDrops.Any, _AllDrops, Nothing) '不要将 _AllDrops 再设为 Nothing,以防止反复获取设置尝试初始化 End Get Set(value As List(Of Integer)) _AllDrops = value - Setup.Set("CacheDrops", value.Join(",")) + Settings.Set("CacheDrops", value.Join(","c)) End Set End Property Private _AllDrops As List(Of Integer) = Nothing @@ -191,7 +191,7 @@ ''' Public DlClientListLoader As New LoaderTask(Of String, DlClientListResult)("DlClientList Main", AddressOf DlClientListMain) Private Sub DlClientListMain(Loader As LoaderTask(Of String, DlClientListResult)) - Select Case Setup.Get("ToolDownloadVersion") + Select Case Settings.Get("ToolDownloadVersion") Case 0 DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of String, DlClientListResult), Integer)) From { New KeyValuePair(Of LoaderTask(Of String, DlClientListResult), Integer)(DlClientListBmclapiLoader, 30), @@ -211,7 +211,9 @@ '提取所有 Drop 序数 Dim Drops As New List(Of Integer) For Each Version As JObject In Loader.Output.Value("versions") - Drops.Add(McVersion.VersionToDrop(Version("id"))) + Dim Drop As Integer = McVersion.VersionToDrop(Version("id")) + If Drop = 209 Then Continue For + Drops.Add(Drop) Next AllDrops = Drops.Distinct.OrderByDescending(Function(d) d).ToList() End Sub @@ -242,20 +244,20 @@ Dim Version As String '快照版 Version = Json("latest")("snapshot") - If Setup.Get("ToolUpdateSnapshot") AndAlso Not Setup.Get("ToolUpdateSnapshotLast") = "" AndAlso - Setup.Get("ToolUpdateSnapshotLast") <> Version AndAlso Not IsHinted Then + If Settings.Get("ToolUpdateSnapshot") AndAlso Not Settings.Get("ToolUpdateSnapshotLast") = "" AndAlso + Settings.Get("ToolUpdateSnapshotLast") <> Version AndAlso Not IsHinted Then IsHinted = True McDownloadClientUpdateHint(Version, Json) End If - Setup.Set("ToolUpdateSnapshotLast", If(Version, "Nothing")) + Settings.Set("ToolUpdateSnapshotLast", If(Version, "Nothing")) '正式版 Version = Json("latest")("release") - If Setup.Get("ToolUpdateRelease") AndAlso Not Setup.Get("ToolUpdateReleaseLast") = "" AndAlso - Setup.Get("ToolUpdateReleaseLast") <> Version AndAlso Not IsHinted Then + If Settings.Get("ToolUpdateRelease") AndAlso Not Settings.Get("ToolUpdateReleaseLast") = "" AndAlso + Settings.Get("ToolUpdateReleaseLast") <> Version AndAlso Not IsHinted Then IsHinted = True McDownloadClientUpdateHint(Version, Json) End If - Setup.Set("ToolUpdateReleaseLast", Version) + Settings.Set("ToolUpdateReleaseLast", Version) Catch ex As Exception Throw New Exception("Minecraft 官方源版本列表解析失败", ex) End Try @@ -304,7 +306,7 @@ DlClientListLoader.WaitForExit(Id, IsForceRestart:=True) Case LoadState.Loading DlClientListLoader.WaitForExit(Id) - Case LoadState.Failed, LoadState.Aborted, LoadState.Waiting + Case LoadState.Failed, LoadState.Interrupted, LoadState.Waiting DlClientListLoader.WaitForExit(Id, IsForceRestart:=True) End Select '重新查找版本 @@ -383,7 +385,7 @@ ''' Public DlOptiFineListLoader As New LoaderTask(Of Integer, DlOptiFineListResult)("DlOptiFineList Main", AddressOf DlOptiFineListMain) Private Sub DlOptiFineListMain(Loader As LoaderTask(Of Integer, DlOptiFineListResult)) - Select Case Setup.Get("ToolDownloadVersion") + Select Case Settings.Get("ToolDownloadVersion") Case 0 DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of Integer, DlOptiFineListResult), Integer)) From { New KeyValuePair(Of LoaderTask(Of Integer, DlOptiFineListResult), Integer)(DlOptiFineListBmclapiLoader, 30), @@ -423,7 +425,7 @@ Name(i) = Name(i).Replace("_", " ") Dim Entry As New DlOptiFineListEntry With { .DisplayName = Name(i).Replace("HD U ", "").Replace(".0 ", " "), - .ReleaseTime = Join({ReleaseTime(i).Split(".")(2), ReleaseTime(i).Split(".")(1), ReleaseTime(i).Split(".")(0)}, "/"), + .ReleaseTime = {ReleaseTime(i).Split(".")(2), ReleaseTime(i).Split(".")(1), ReleaseTime(i).Split(".")(0)}.Join("/"c), .IsPreview = Name(i).ContainsF("pre", True), .Inherit = Name(i).ToString.Split(" ")(0), .FileName = If(Name(i).ContainsF("pre", True), "preview_", "") & "OptiFine_" & Name(i).Replace(" ", "_") & ".jar", @@ -489,7 +491,7 @@ ''' Public DlForgeListLoader As New LoaderTask(Of Integer, DlForgeListResult)("DlForgeList Main", AddressOf DlForgeListMain) Private Sub DlForgeListMain(Loader As LoaderTask(Of Integer, DlForgeListResult)) - Select Case Setup.Get("ToolDownloadVersion") + Select Case Settings.Get("ToolDownloadVersion") Case 0 DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of Integer, DlForgeListResult), Integer)) From { New KeyValuePair(Of LoaderTask(Of Integer, DlForgeListResult), Integer)(DlForgeListBmclapiLoader, 30), @@ -638,7 +640,7 @@ Public Sub DlForgeVersionMain(Loader As LoaderTask(Of String, List(Of DlForgeVersionEntry))) Dim DlForgeVersionOfficialLoader As New LoaderTask(Of String, List(Of DlForgeVersionEntry))("DlForgeVersion Official", AddressOf DlForgeVersionOfficialMain) Dim DlForgeVersionBmclapiLoader As New LoaderTask(Of String, List(Of DlForgeVersionEntry))("DlForgeVersion Bmclapi", AddressOf DlForgeVersionBmclapiMain) - Select Case Setup.Get("ToolDownloadVersion") + Select Case Settings.Get("ToolDownloadVersion") Case 0 DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of String, List(Of DlForgeVersionEntry)), Integer)) From { New KeyValuePair(Of LoaderTask(Of String, List(Of DlForgeVersionEntry)), Integer)(DlForgeVersionBmclapiLoader, 30), @@ -849,7 +851,7 @@ VersionName = ApiName.Replace("1.20.1-", "") Version = New Version("19." & VersionName) Inherit = "1.20.1" - ElseIf ApiName.StartsWith("0.") Then '0.25w14craftmine.3-beta + ElseIf ApiName.StartsWithF("0.") Then '0.25w14craftmine.3-beta VersionName = ApiName Dim Segments = ApiName.BeforeFirst("-").Split("."c) Version = New Version(0, 0, Segments.Last) @@ -858,10 +860,11 @@ VersionName = ApiName Version = New Version(ApiName.BeforeFirst("-")) If Version.Major >= 24 Then - Inherit = Version.ToString.Replace(".0", "") + Inherit = $"{Version.Major}.{Version.Minor}.{Version.Build}" Else - Inherit = "1." & Version.Major & If(Version.Minor > 0, "." & Version.Minor, "") + Inherit = $"1.{Version.Major}.{Version.Minor}" End If + If Inherit.EndsWithF(".0") Then Inherit = Left(Inherit, Inherit.Length - 2) If VersionName.Contains("+") Then Inherit &= "-" & VersionName.AfterFirst("+") End If End Sub @@ -872,7 +875,7 @@ ''' Public DlNeoForgeListLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Main", AddressOf DlNeoForgeListMain) Private Sub DlNeoForgeListMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult)) - Select Case Setup.Get("ToolDownloadVersion") + Select Case Settings.Get("ToolDownloadVersion") Case 0 DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)) From { New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListBmclapiLoader, 30), @@ -997,7 +1000,7 @@ ''' Public DlLiteLoaderListLoader As New LoaderTask(Of Integer, DlLiteLoaderListResult)("DlLiteLoaderList Main", AddressOf DlLiteLoaderListMain) Private Sub DlLiteLoaderListMain(Loader As LoaderTask(Of Integer, DlLiteLoaderListResult)) - Select Case Setup.Get("ToolDownloadVersion") + Select Case Settings.Get("ToolDownloadVersion") Case 0 DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of Integer, DlLiteLoaderListResult), Integer)) From { New KeyValuePair(Of LoaderTask(Of Integer, DlLiteLoaderListResult), Integer)(DlLiteLoaderListBmclapiLoader, 30), @@ -1031,7 +1034,7 @@ Versions.Add(New DlLiteLoaderListEntry With { .Inherit = Pair.Key, .IsLegacy = Pair.Key.Split(".")(1) < 8, - .IsPreview = RealEntry("stream").ToString.ToLower = "snapshot", + .IsPreview = RealEntry("stream").ToString.Lower = "snapshot", .FileName = "liteloader-installer-" & Pair.Key & If(Pair.Key = "1.8" OrElse Pair.Key = "1.9", ".0", "") & "-00-SNAPSHOT.jar", .MD5 = RealEntry("md5"), .ReleaseTime = GetLocalTime(GetDate(RealEntry("timestamp"))).ToString("yyyy'/'MM'/'dd HH':'mm"), @@ -1059,7 +1062,7 @@ Versions.Add(New DlLiteLoaderListEntry With { .Inherit = Pair.Key, .IsLegacy = Pair.Key.Split(".")(1) < 8, - .IsPreview = RealEntry("stream").ToString.ToLower = "snapshot", + .IsPreview = RealEntry("stream").ToString.Lower = "snapshot", .FileName = "liteloader-installer-" & Pair.Key & If(Pair.Key = "1.8" OrElse Pair.Key = "1.9", ".0", "") & "-00-SNAPSHOT.jar", .MD5 = RealEntry("md5"), .ReleaseTime = GetLocalTime(GetDate(RealEntry("timestamp"))).ToString("yyyy'/'MM'/'dd HH':'mm"), @@ -1096,7 +1099,7 @@ ''' Public DlFabricListLoader As New LoaderTask(Of Integer, DlFabricListResult)("DlFabricList Main", AddressOf DlFabricListMain) Private Sub DlFabricListMain(Loader As LoaderTask(Of Integer, DlFabricListResult)) - Select Case Setup.Get("ToolDownloadVersion") + Select Case Settings.Get("ToolDownloadVersion") Case 0 DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of Integer, DlFabricListResult), Integer)) From { New KeyValuePair(Of LoaderTask(Of Integer, DlFabricListResult), Integer)(DlFabricListBmclapiLoader, 30), @@ -1170,23 +1173,23 @@ Dim Urls As New List(Of KeyValuePair(Of String, Integer)) Dim McimUrl As String = DlSourceModGet(Url) If McimUrl <> Url Then - Select Case Setup.Get("ToolDownloadMod") + Select Case Settings.Get("ToolDownloadMod") Case 0 Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10)) Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10)) Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) Case 1 - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10)) '至少 10s,要不然有时候远端服务器来不及完成 + Urls.Add(New KeyValuePair(Of String, Integer)(Url, If(Url.Contains("modrinth"), 20, 10))) '至少 20s,要不然 Modrinth 返回不过来 Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10)) Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30)) Case Else - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10)) + Urls.Add(New KeyValuePair(Of String, Integer)(Url, If(Url.Contains("modrinth"), 20, 10))) Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30)) End Select Else - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10)) + Urls.Add(New KeyValuePair(Of String, Integer)(Url, If(Url.Contains("modrinth"), 20, 10))) Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) End If Dim Exs As String = "" @@ -1210,7 +1213,7 @@ ''' Public ReadOnly Property DlSourcePreferMojang As Boolean Get - Return Setup.Get("ToolDownloadSource") = 2 OrElse (Setup.Get("ToolDownloadSource") = 1 AndAlso DlPreferMojang) + Return Settings.Get("ToolDownloadSource") = 2 OrElse (Settings.Get("ToolDownloadSource") = 1 AndAlso DlPreferMojang) End Get End Property ''' @@ -1224,7 +1227,7 @@ ''' Public ReadOnly Property DlVersionListPreferMojang As Boolean Get - Return Setup.Get("ToolDownloadVersion") = 2 OrElse (Setup.Get("ToolDownloadVersion") = 1 AndAlso DlPreferMojang) + Return Settings.Get("ToolDownloadVersion") = 2 OrElse (Settings.Get("ToolDownloadVersion") = 1 AndAlso DlPreferMojang) End Get End Property ''' @@ -1323,7 +1326,7 @@ If SubLoader.Key.State = LoadState.Finished Then '检查加载器成功 MainLoader.Output = SubLoader.Key.Output - DlSourceLoaderAbort(LoaderList) + DlSourceLoaderInterrupt(LoaderList) Return ElseIf BeforeLoadersAllFailed Then '此前的加载器全部失败,直接启动后续加载器 @@ -1355,7 +1358,7 @@ End If Next If ErrorInfo Is Nothing Then ErrorInfo = New TimeoutException("下载源连接超时") - DlSourceLoaderAbort(LoaderList) + DlSourceLoaderInterrupt(LoaderList) Throw ErrorInfo End If Exit For @@ -1364,15 +1367,15 @@ Thread.Sleep(10) WaitCycle += 1 '检查父加载器中断 - If MainLoader.IsAborted Then - DlSourceLoaderAbort(LoaderList) + If MainLoader.IsInterrupted Then + DlSourceLoaderInterrupt(LoaderList) Return End If Loop End Sub - Private Sub DlSourceLoaderAbort(Of InputType, OutputType)(LoaderList As List(Of KeyValuePair(Of LoaderTask(Of InputType, OutputType), Integer))) + Private Sub DlSourceLoaderInterrupt(Of InputType, OutputType)(LoaderList As List(Of KeyValuePair(Of LoaderTask(Of InputType, OutputType), Integer))) For Each Loader In LoaderList - If Loader.Key.State = LoadState.Loading Then Loader.Key.Abort() + If Loader.Key.State = LoadState.Loading Then Loader.Key.Interrupt() Next End Sub diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb index 3a49edc..eea492f 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb @@ -95,10 +95,11 @@ Try '确定文件存在 If Not File.Exists(PathJava) Then Throw New FileNotFoundException("未找到 java.exe 文件", PathJava) + If {"finalshell", "Paranoia File"}.Any(Function(n) PathJava.ContainsF(n, True)) Then Throw New Exception("不兼容该精简版 Java") '#2249、#8080 If File.Exists(PathFolder & "pdf-bookmark") Then Throw New Exception("不兼容 PDF Bookmark 的 Java") '#5326 IsJre = Not File.Exists(PathFolder & "javac.exe") '运行 -version - Output = StartProcessAndGetOutput(PathJava, "-version", 15000).ToLower + Output = StartProcessAndGetOutput(PathJava, "-version", 15000).Lower If Output = "" Then Throw New ApplicationException("尝试运行该 Java 失败") If ModeDebug Then Log("[Java] Java 检查输出:" & PathJava & vbCrLf & Output) If Output.Contains("/lib/ext exists") Then Throw New ApplicationException("无法运行该 Java,请在删除 Java 文件夹中的 /lib/ext 文件夹后再试") @@ -123,8 +124,6 @@ If Version.Minor <= 4 OrElse Version.Minor >= 100 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 MajorVersion >= 16 Then Throw New Exception("由于高版本 JRE 对游戏的兼容性很差,因此不再允许使用。你可以使用对应版本的 JDK,而非 JRE!") Catch ex As ApplicationException Throw ex Catch ex As ThreadInterruptedException @@ -166,13 +165,13 @@ Public Sub JavaListInit() JavaList = New List(Of JavaEntry) Try - If Setup.Get("CacheJavaListVersion") < JavaListCacheVersion Then + If Settings.Get("CacheJavaListVersion") < JavaListCacheVersion Then '不使用缓存 Log("[Java] 要求 Java 列表缓存更新") - Setup.Set("CacheJavaListVersion", JavaListCacheVersion) + Settings.Set("CacheJavaListVersion", JavaListCacheVersion) Else '使用缓存 - For Each JsonEntry In GetJson(Setup.Get("LaunchArgumentJavaAll")) + For Each JsonEntry In GetJson(Settings.Get("LaunchArgumentJavaAll")) JavaList.Add(JavaEntry.FromJson(JsonEntry)) Next End If @@ -185,7 +184,7 @@ End If Catch ex As Exception Log(ex, "初始化 Java 列表失败", LogLevel.Feedback) - Setup.Set("LaunchArgumentJavaAll", "[]") + Settings.Set("LaunchArgumentJavaAll", "[]") End Try End Sub @@ -233,7 +232,7 @@ '获取版本独立设置中指定的 Java Dim VersionSelect As String = "" If GameInstance IsNot Nothing Then - VersionSelect = Setup.Get("VersionArgumentJavaSelect", Instance:=GameInstance) + VersionSelect = Settings.Get("VersionArgumentJavaSelect", Instance:=GameInstance) If VersionSelect.StartsWithF("{") Then Try UserJava = JavaEntry.FromJson(GetJson(VersionSelect)) @@ -242,22 +241,22 @@ Throw Catch ex As Exception UserJava = Nothing - Setup.Reset("VersionArgumentJavaSelect", Instance:=GameInstance) + Settings.Reset("VersionArgumentJavaSelect", Instance:=GameInstance) Log(ex, "版本独立设置中指定的 Java 已无法使用,此设置已重置", LogLevel.Hint) End Try End If End If '获取全局设置中指定的 Java - If UserJava Is Nothing AndAlso VersionSelect <> "" AndAlso Setup.Get("LaunchArgumentJavaSelect") <> "" Then + If UserJava Is Nothing AndAlso VersionSelect <> "" AndAlso Settings.Get("LaunchArgumentJavaSelect") <> "" Then Try - UserJava = JavaEntry.FromJson(GetJson(Setup.Get("LaunchArgumentJavaSelect"))) + UserJava = JavaEntry.FromJson(GetJson(Settings.Get("LaunchArgumentJavaSelect"))) UserJava.Check() Catch ex As ThreadInterruptedException Throw Catch ex As Exception UserJava = Nothing - Setup.Reset("LaunchArgumentJavaSelect") + Settings.Reset("LaunchArgumentJavaSelect") Log(ex, "全局设置中指定的 Java 已无法使用,此设置已重置", LogLevel.Hint) End Try End If @@ -276,7 +275,7 @@ RetryGet: Select Case JavaSearchLoader.State Case LoadState.Failed Throw JavaSearchLoader.Error - Case LoadState.Aborted + Case LoadState.Interrupted Throw New ThreadInterruptedException("Java 搜索加载器已中断") End Select @@ -331,7 +330,7 @@ RetryGet: Requirement = "需要 Java " & If(Left = Right, Left, Left & " ~ " & Right) End If Dim JavaCurrent As String = UserJava.MajorVersion & If(ShowRevision, "." & UserJava.Version.MajorRevision & "." & UserJava.Version.MinorRevision, "") - If GameInstance IsNot Nothing AndAlso Setup.Get("VersionAdvanceJava", GameInstance) Then + If GameInstance IsNot Nothing AndAlso Settings.Get("VersionAdvanceJava", GameInstance) Then '直接跳过弹窗 Log("[Java] 设置中指定了使用 Java " & JavaCurrent & ",但当前版本" & Requirement & ",这可能会导致游戏崩溃!", LogLevel.Debug) AllowedJavaList = New List(Of JavaEntry) From {UserJava} @@ -411,9 +410,9 @@ UserPass: Public Function JavaIs64Bit(Optional GameInstance As McInstance = Nothing) As Boolean Try '检查强制指定 - Dim UserSetup As String = Setup.Get("LaunchArgumentJavaSelect") + Dim UserSetup As String = Settings.Get("LaunchArgumentJavaSelect") If GameInstance IsNot Nothing Then - Dim UserSetupVersion As String = Setup.Get("VersionArgumentJavaSelect", Instance:=GameInstance) + Dim UserSetupVersion As String = Settings.Get("VersionArgumentJavaSelect", Instance:=GameInstance) If UserSetupVersion <> "使用全局设置" Then UserSetup = UserSetupVersion End If If UserSetup <> "" Then @@ -422,7 +421,7 @@ UserPass: UserJava = JavaEntry.FromJson(GetJson(UserSetup)) Catch ex As Exception Log(ex, "版本指定的 Java 信息已损坏,已重置版本设置中指定的 Java") - Setup.Set("VersionArgumentJavaSelect", "使用全局设置", Instance:=GameInstance) + Settings.Set("VersionArgumentJavaSelect", "使用全局设置", Instance:=GameInstance) GoTo NoUserJava End Try For Each Java In JavaList @@ -437,7 +436,7 @@ NoUserJava: Return False Catch ex As Exception Log(ex, "检查 Java 类别时出错", LogLevel.Feedback) - Setup.Set("LaunchArgumentJavaSelect", "") + Settings.Set("LaunchArgumentJavaSelect", "") Return True End Try End Function @@ -518,17 +517,14 @@ NoUserJava: If Disk.DriveType = DriveType.Network Then Continue For '跳过网络驱动器(#3705) JavaSearchFolder(Disk.Name, JavaPreList, False) Next - '查找 .jdks 文件夹中的 Java - JavaSearchFolder(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) & "\.jdks\", JavaPreList, False, True) - '查找 APPDATA 文件夹中的 Java - JavaSearchFolder(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\", JavaPreList, False) - JavaSearchFolder(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) & "\", JavaPreList, False) + '查找用户文件夹中的 Java + JavaSearchFolder(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), JavaPreList, False) + JavaSearchFolder(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) & "\.jdks\", JavaPreList, False, IsFullSearch:=True) + JavaSearchFolder(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) & "\.sdkman\candidates\java\", JavaPreList, False, IsFullSearch:=True) '查找启动器目录中的 Java JavaSearchFolder(Path, JavaPreList, False, IsFullSearch:=True) '查找所选 Minecraft 文件夹中的 Java - If Not String.IsNullOrWhiteSpace(McFolderSelected) AndAlso Path <> McFolderSelected Then - JavaSearchFolder(McFolderSelected, JavaPreList, False, IsFullSearch:=True) - End If + If Not String.IsNullOrWhiteSpace(McFolderSelected) AndAlso Path <> McFolderSelected Then JavaSearchFolder(McFolderSelected, JavaPreList, False, IsFullSearch:=True) '若不全为符号链接,则清除符号链接的地址 Dim JavaWithoutReparse As New Dictionary(Of String, Boolean) @@ -562,7 +558,7 @@ NoUserJava: #Region "添加玩家手动导入的 Java" - Dim ImportedJava As String = Setup.Get("LaunchArgumentJavaAll") + Dim ImportedJava As String = Settings.Get("LaunchArgumentJavaAll") Try For Each JavaJsonObject In GetJson(ImportedJava) Dim Entry = JavaEntry.FromJson(JavaJsonObject) @@ -570,14 +566,14 @@ NoUserJava: Next Catch ex As Exception Log(ex, "Java 列表已损坏", LogLevel.Feedback) - Setup.Set("LaunchArgumentJavaAll", "[]") + Settings.Set("LaunchArgumentJavaAll", "[]") End Try #End Region '确保可用并获取详细信息,转入正式列表 Dim NewJavaList As New List(Of JavaEntry) - For Each Entry In JavaPreList.Distinct(Function(a, b) a.Key.ToLower = b.Key.ToLower) '#794 + For Each Entry In JavaPreList.Distinct(Function(a, b) a.Key.Lower = b.Key.Lower) '#794 NewJavaList.Add(New JavaEntry(Entry.Key, Entry.Value)) Next NewJavaList = JavaCheckList(NewJavaList).SortByComparison(AddressOf JavaSorter) @@ -587,7 +583,7 @@ NoUserJava: For Each Java In NewJavaList AllList.Add(Java.ToJson) Next - Setup.Set("LaunchArgumentJavaAll", AllList.ToString(Newtonsoft.Json.Formatting.None)) + Settings.Set("LaunchArgumentJavaAll", AllList.ToString(Newtonsoft.Json.Formatting.None)) JavaList = NewJavaList Catch ex As Exception @@ -596,7 +592,7 @@ NoUserJava: End Try Log("[Java] Java 搜索完成,发现 " & JavaList.Count & " 个 Java") - If FrmSetupLaunch IsNot Nothing Then RunInUi(Sub() FrmSetupLaunch.RefreshJavaComboBox()) + If FrmSetupLaunch IsNot Nothing Then RunInUi(Sub() FrmSetupLaunch.UpdateJavaComboBox()) If FrmInstanceSetup IsNot Nothing Then RunInUi(Sub() FrmInstanceSetup.RefreshJavaComboBox()) End Sub @@ -669,18 +665,18 @@ Wait: If File.Exists(Path & "javaw.exe") Then Results(Path) = Source '查找其下的所有文件夹 '不应使用网易的 Java:https://github.com/Meloong-Git/PCL/issues/1279#issuecomment-2761489121 - Dim Keywords = {"java", "jdk", "env", "环境", "run", "软件", "jre", "mc", "dragon", "bin", - "soft", "cache", "temp", "corretto", "roaming", "users", "craft", "program", "世界", "net", - "游戏", "oracle", "game", "file", "data", "jvm", "服务", "server", "客户", "client", "整合", - "应用", "运行", "前置", "mojang", "官启", "新建文件夹", "eclipse", "microsoft", "hotspot", - "runtime", "x86", "x64", "forge", "原版", "optifine", "官方", "启动", "hmcl", "mod", "高清", - "download", "launch", "程序", "path", "version", "baka", "pcl", "zulu", "local", "packages", - "4297127d64ec6", "1.", "启动", "jbr"} + Static Keywords As String() = { + "java", "jdk", "jre", "env", "环境", "run", "软件", "mc", "dragon", "well", "bin", "sdk", "candidate", "current", + "software", "cache", "temp", "corretto", "roaming", "users", "craft", "program", "世界", "net", + "游戏", "oracle", "game", "file", "data", "jvm", "服务", "server", "客户", "client", "整合", + "应用", "运行", "前置", "mojang", "官启", "官方", "新建文件夹", "eclipse", "microsoft", "hotspot", + "runtime", "x86", "x64", "arm", "forge", "原版", "optifine", "官方", "启动", "hmcl", "mod", "forge", "fabric", + "download", "launch", "程序", "path", "version", "baka", "pcl", "zulu", "local", "packages", "4297127d64ec6", "1.", "启动", "jbr"} For Each FolderInfo As DirectoryInfo In OriginalPath.EnumerateDirectories If FolderInfo.Attributes.HasFlag(FileAttributes.ReparsePoint) Then Continue For '跳过符号链接 - Dim SearchEntry = GetFolderNameFromPath(FolderInfo.Name).ToLower '用于搜索的字符串 + Dim SearchEntry = GetFolderNameFromPath(FolderInfo.Name).Lower '用于搜索的字符串 If IsFullSearch OrElse - OriginalPath.Name.ToLower = "users" OrElse Val(SearchEntry) > 0 OrElse Keywords.Any(Function(w) SearchEntry.Contains(w)) OrElse SearchEntry = "bin" Then + OriginalPath.Name.Lower = "users" OrElse Val(SearchEntry) > 0 OrElse Keywords.Any(Function(w) SearchEntry.Contains(w)) OrElse SearchEntry = "bin" Then JavaSearchFolder(FolderInfo, Results, Source) End If Next @@ -707,7 +703,7 @@ Wait: }) 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 + If (NewState = LoadState.Failed OrElse NewState = LoadState.Interrupted) AndAlso LastJavaBaseDir IsNot Nothing Then Log($"[Java] 由于下载未完成,清理未下载完成的 Java 文件:{LastJavaBaseDir}", LogLevel.Debug) DeleteDirectory(LastJavaBaseDir) ElseIf NewState = LoadState.Finished Then diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb index 5b6bd49..c684380 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb @@ -24,7 +24,7 @@ Public Module ModLaunch ''' ''' 额外的启动参数。 ''' - Public ExtraArgs As New List(Of String) + Public ExtraGameArgs As New List(Of String) End Class ''' ''' 尝试启动 Minecraft。必须在 UI 线程调用。 @@ -56,7 +56,6 @@ Public Module ModLaunch End If '切换版本 McInstanceSelected = CurrentLaunchOptions.Instance - Setup.Set("LaunchVersionSelect", McInstanceSelected.Name) FrmLaunchLeft.RefreshButtonsUI() FrmLaunchLeft.RefreshPage(False, False) End If @@ -84,7 +83,7 @@ Public Module ModLaunch Public McLaunchWatcher As Watcher Private Sub McLaunchState(Loader As LoaderTask(Of McLaunchOptions, Object)) Select Case McLaunchLoader.State - Case LoadState.Finished, LoadState.Failed, LoadState.Waiting, LoadState.Aborted + Case LoadState.Finished, LoadState.Failed, LoadState.Waiting, LoadState.Interrupted FrmLaunchLeft.PageChangeToLogin() Case LoadState.Loading '在预检测结束后再触发动画 @@ -94,7 +93,7 @@ Public Module ModLaunch ''' ''' 指定启动中断时的提示文本。若不为 Nothing 则会显示为绿色。 ''' - Private AbortHint As String = Nothing + Private InterruptHint As String = Nothing '实际的启动方法 Private Sub McLaunchStart(Loader As LoaderTask(Of McLaunchOptions, Object)) @@ -117,8 +116,8 @@ Public Module ModLaunch New LoaderTask(Of Integer, Integer)("获取 Java", AddressOf McLaunchJava) With {.ProgressWeight = 4, .Block = False}, McLoginLoader, '.ProgressWeight = 15, .Block = False New LoaderCombo(Of String)("补全文件", DlClientFix(McInstanceSelected, False, AssetsIndexExistsBehaviour.DownloadInBackground)) 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 String, Integer)("获取启动参数", AddressOf McLaunchArgumentMain) With {.ProgressWeight = 2}, + New LoaderTask(Of Integer, Integer)("解压文件", AddressOf McLaunchNatives) With {.ProgressWeight = 2}, New LoaderTask(Of Integer, Integer)("预启动处理", AddressOf McLaunchPrerun) With {.ProgressWeight = 1}, New LoaderTask(Of Integer, Integer)("执行自定义命令", AddressOf McLaunchCustom) With {.ProgressWeight = 1}, New LoaderTask(Of Integer, Process)("启动进程", AddressOf McLaunchRun) With {.ProgressWeight = 2}, @@ -126,9 +125,9 @@ Public Module ModLaunch New LoaderTask(Of Integer, Integer)("结束处理", AddressOf McLaunchEnd) With {.ProgressWeight = 1} } '内存优化 - Select Case Setup.Get("VersionRamOptimize", Instance:=McInstanceSelected) + Select Case Settings.Get("VersionRamOptimize", Instance:=McInstanceSelected) Case 0 '全局 - If Setup.Get("LaunchArgumentRam") Then '使用全局设置 + If Settings.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 @@ -141,7 +140,7 @@ Public Module ModLaunch If McLoginLoader.State = LoadState.Finished Then McLoginLoader.State = LoadState.Waiting '要求重启登录主加载器,它会自行决定是否启动副加载器 '等待加载器执行并更新 UI McLaunchLoaderReal = LaunchLoader - AbortHint = Nothing + InterruptHint = Nothing LaunchLoader.Start() '任务栏进度条 LoaderTaskbarAdd(LaunchLoader) @@ -158,13 +157,13 @@ Public Module ModLaunch If Not IsSavingBatch Then Telemetry("Minecraft 启动成功", "Version", McInstanceSelected.VersionDisplayName, - "LoginType", GetStringFromEnum(CType(Setup.Get("LoginType"), McLoginType))) + "LoginType", GetStringFromEnum(CType(Settings.Get("LoginType"), McLoginType))) End If - Case LoadState.Aborted - If AbortHint Is Nothing Then + Case LoadState.Interrupted + If InterruptHint Is Nothing Then Hint(If(IsSavingBatch, "已取消导出启动脚本!", "已取消启动!"), HintType.Blue) Else - Hint(AbortHint, HintType.Green) + Hint(InterruptHint, HintType.Green) End If Case LoadState.Failed Throw LaunchLoader.Error @@ -193,7 +192,7 @@ NextInner: If Not IsSavingBatch Then Telemetry("Minecraft 启动失败", "Version", McInstanceSelected.VersionDisplayName, - "LoginType", GetStringFromEnum(CType(Setup.Get("LoginType"), McLoginType)), + "LoginType", GetStringFromEnum(CType(Settings.Get("LoginType"), McLoginType)), "Exception", FilterUserName(FilterAccessToken(ex.GetDetail(), "*"), "*")) End If Throw @@ -213,7 +212,7 @@ NextInner: PageOtherTest.MemoryOptimize(False) Finished = True End Sub, "Launch Memory Optimize") - Do While Not Finished AndAlso Not Loader.IsAborted + Do While Not Finished AndAlso Not Loader.IsInterrupted If Loader.Progress < 0.7 Then Loader.Progress += 0.007 '10s Else @@ -228,7 +227,7 @@ NextInner: #Region "预检测" Private Sub McLaunchPrecheck() - If Setup.Get("SystemDebugDelay") Then Thread.Sleep(RandomInteger(100, 2000)) + If Settings.Get("SystemDebugDelay") Then Thread.Sleep(RandomInteger(100, 2000)) '检查路径 If McInstanceSelected.PathIndie.Contains("!") OrElse McInstanceSelected.PathIndie.Contains(";") Then Throw New Exception("游戏路径中不可包含 ! 或 ;(" & McInstanceSelected.PathIndie & ")") If McInstanceSelected.PathVersion.Contains("!") OrElse McInstanceSelected.PathVersion.Contains(";") Then Throw New Exception("游戏路径中不可包含 ! 或 ;(" & McInstanceSelected.PathVersion & ")") @@ -245,13 +244,13 @@ NextInner: If CurrentLaunchOptions?.SaveBatch Is Nothing Then '保存脚本时不提示 RunInNewThread( Sub() - Select Case Setup.Get("SystemLaunchCount") + Select Case Settings.Get("SystemLaunchCount") Case 10, 20, 40, 60, 80, 100, 120, 150, 200, 250, 300, 350, 400, 500, 600, 700, 800, 900, 1000, 1200, 1400, 1600, 1800, 2000 - If MyMsgBox("PCL 已经为你启动了 " & Setup.Get("SystemLaunchCount") & " 次游戏啦!" & vbCrLf & + If MyMsgBox("PCL 已经为你启动了 " & Settings.Get("SystemLaunchCount") & " 次游戏啦!" & vbCrLf & "如果 PCL 还算好用的话,能不能考虑赞助一下 PCL……" & vbCrLf & "如果没有大家的支持,PCL 很难在免费、无任何广告的情况下维持数年的更新(磕头)……!", - Setup.Get("SystemLaunchCount") & " 次启动!", "支持 PCL!", "但是我拒绝") = 1 Then - OpenWebsite("https://afdian.com/a/LTCat") + Settings.Get("SystemLaunchCount") & " 次启动!", "支持 PCL!", "但是我拒绝") = 1 Then + OpenWebsite("https://meloong.com/afd/a/LTCat") End If End Select End Sub, "Donate") @@ -259,13 +258,13 @@ NextInner: #End If '正版购买提示 If CurrentLaunchOptions?.SaveBatch Is Nothing AndAlso '保存脚本时不提示 - Not Setup.Get("HintBuy") AndAlso Setup.Get("LoginType") <> McLoginType.Ms Then + Not Settings.Get("HintBuy") AndAlso Settings.Get("LoginType") <> McLoginType.Ms Then If IsSystemLanguageChinese() Then RunInNewThread( Sub() - Select Case Setup.Get("SystemLaunchCount") + Select Case Settings.Get("SystemLaunchCount") Case 3, 8, 15, 30, 50, 70, 90, 110, 130, 180, 220, 280, 330, 380, 450, 550, 660, 750, 880, 950, 1100, 1300, 1500, 1700, 1900 - If MyMsgBox("你已经启动了 " & Setup.Get("SystemLaunchCount") & " 次 Minecraft 啦!" & vbCrLf & + If MyMsgBox("你已经启动了 " & Settings.Get("SystemLaunchCount") & " 次 Minecraft 啦!" & vbCrLf & "如果觉得 Minecraft 还不错,可以购买正版支持一下,毕竟开发游戏也真的很不容易……不要一直白嫖啦。" & vbCrLf & vbCrLf & "在登录一次正版账号后,就不会再出现这个提示了!", "考虑一下正版?", "支持正版游戏!", "下次一定") = 1 Then @@ -273,12 +272,12 @@ NextInner: End If End Select End Sub, "Buy Minecraft") - ElseIf Setup.Get("LoginType") = McLoginType.Legacy Then + ElseIf Settings.Get("LoginType") = McLoginType.Legacy Then Select Case MyMsgBox("你必须先登录正版账号,才能进行离线登录!", "正版验证", "购买正版", "试玩", "返回", Button1Action:=Sub() OpenWebsite("https://www.xbox.com/zh-cn/games/store/minecraft-java-bedrock-edition-for-pc/9nxp44l49shj")) Case 2 Hint("游戏将以试玩模式启动!", HintType.Red) - CurrentLaunchOptions.ExtraArgs.Add("--demo") + CurrentLaunchOptions.ExtraGameArgs.Add("--demo") Case 3 Throw New Exception("$$") End Select @@ -404,30 +403,30 @@ NextInner: ''' Public Function McLoginName() As String '根据当前登录方式优先返回 - Select Case Setup.Get("LoginType") + Select Case Settings.Get("LoginType") Case McLoginType.Ms - If Setup.Get("CacheMsV2Name") <> "" Then Return Setup.Get("CacheMsV2Name") + If Settings.Get("CacheMsV2Name") <> "" Then Return Settings.Get("CacheMsV2Name") Case McLoginType.Legacy - If Setup.Get("LoginLegacyName") <> "" Then Return Setup.Get("LoginLegacyName").ToString.BeforeFirst("¨") + If Settings.Get("LoginLegacyName") <> "" Then Return Settings.Get("LoginLegacyName").ToString.BeforeFirst("¨") Case McLoginType.Nide - If Setup.Get("CacheNideName") <> "" Then Return Setup.Get("CacheNideName") + If Settings.Get("CacheNideName") <> "" Then Return Settings.Get("CacheNideName") Case McLoginType.Auth - If Setup.Get("CacheAuthName") <> "" Then Return Setup.Get("CacheAuthName") + If Settings.Get("CacheAuthName") <> "" Then Return Settings.Get("CacheAuthName") End Select '查找所有可能的项 - If Setup.Get("CacheMsV2Name") <> "" Then Return Setup.Get("CacheMsV2Name") - 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.BeforeFirst("¨") + If Settings.Get("CacheMsV2Name") <> "" Then Return Settings.Get("CacheMsV2Name") + If Settings.Get("CacheNideName") <> "" Then Return Settings.Get("CacheNideName") + If Settings.Get("CacheAuthName") <> "" Then Return Settings.Get("CacheAuthName") + If Settings.Get("LoginLegacyName") <> "" Then Return Settings.Get("LoginLegacyName").ToString.BeforeFirst("¨") Return Nothing End Function ''' ''' 当前是否可以进行登录。若不可以则会返回错误原因。 ''' Public Function McLoginAble() As String - Select Case Setup.Get("LoginType") + Select Case Settings.Get("LoginType") Case McLoginType.Ms - If Setup.Get("CacheMsV2OAuthRefresh") = "" Then + If Settings.Get("CacheMsV2OAuthRefresh") = "" Then Return FrmLoginMs.IsVaild() Else Return "" @@ -435,13 +434,13 @@ NextInner: Case McLoginType.Legacy Return FrmLoginLegacy.IsVaild() Case McLoginType.Nide - If Setup.Get("CacheNideAccess") = "" Then + If Settings.Get("CacheNideAccess") = "" Then Return FrmLoginNide.IsVaild() Else Return "" End If Case McLoginType.Auth - If Setup.Get("CacheAuthAccess") = "" Then + If Settings.Get("CacheAuthAccess") = "" Then Return FrmLoginAuth.IsVaild() Else Return "" @@ -472,25 +471,25 @@ NextInner: Public McLoginLoader As New LoaderTask(Of McLoginData, McLoginResult)("登录", AddressOf McLoginStart, AddressOf McLoginInput, ThreadPriority.BelowNormal) With {.ReloadTimeout = 1, .ProgressWeight = 15, .Block = False} Public Function McLoginInput() As McLoginData Dim LoginData As McLoginData = Nothing - Dim LoginType As McLoginType = Setup.Get("LoginType") + Dim LoginType As McLoginType = Settings.Get("LoginType") Try Select Case LoginType Case McLoginType.Legacy LoginData = PageLoginLegacy.GetLoginData() Case McLoginType.Ms - If Setup.Get("CacheMsV2OAuthRefresh") = "" Then + If Settings.Get("CacheMsV2OAuthRefresh") = "" Then LoginData = PageLoginMs.GetLoginData() Else LoginData = PageLoginMsSkin.GetLoginData() End If Case McLoginType.Nide - If Setup.Get("CacheNideAccess") = "" Then + If Settings.Get("CacheNideAccess") = "" Then LoginData = PageLoginNide.GetLoginData() Else LoginData = PageLoginNideSkin.GetLoginData() End If Case McLoginType.Auth - If Setup.Get("CacheAuthAccess") = "" Then + If Settings.Get("CacheAuthAccess") = "" Then LoginData = PageLoginAuth.GetLoginData() Else LoginData = PageLoginAuthSkin.GetLoginData() @@ -535,15 +534,16 @@ NextInner: Public McLoginAuthLoader As New LoaderTask(Of McLoginServer, McLoginResult)("Loader Login Auth", AddressOf McLoginServerStart) With {.ReloadTimeout = 1000 * 60 * 10} '主加载函数,返回所有需要的登录信息 - Private McLoginMsRefreshTime As Long = Val(Setup.Get("CacheMsV2OAuthExpires")) 'Minecraft Access Token到期时间 + Private McLoginMsRefreshTime As Long = 0 '上次刷新登录的时间 Private Sub McLoginMsStart(Data As LoaderTask(Of McLoginMs, McLoginResult)) Dim Input As McLoginMs = Data.Input Dim LogUsername As String = Input.UserName McLaunchLog("登录方式:正版(" & If(LogUsername = "", "尚未登录", LogUsername) & ")") Data.Progress = 0.05 '检查是否已经登录完成 - If Not Data.IsForceRestarting AndAlso '不要求强行重启 | 'Input.AccessToken <> "" AndAlso '已经登录过了,但因为其影响了Token刷新时间的判定 在Token有效时重启PCL仍然会重新登录,所以注释掉了 - (McLoginMsRefreshTime > 0 AndAlso GetUnixTimestamp() < McLoginMsRefreshTime) Then '在有效期过期前 + If Not Data.IsForceRestarting AndAlso '不要求强行重启 + Input.AccessToken <> "" AndAlso '已经登录过了 + (McLoginMsRefreshTime > 0 AndAlso GetTimeMs() - McLoginMsRefreshTime < 1000 * 60 * 10) Then '完成时间在 10 分钟内 Data.Output = New McLoginResult With {.AccessToken = Input.AccessToken, .Name = Input.UserName, .Uuid = Input.Uuid, .Type = "Microsoft", .ClientToken = Input.Uuid, .ProfileJson = Input.ProfileJson} GoTo SkipLogin @@ -559,44 +559,41 @@ Relogin: OAuthTokens = MsLoginStep1Refresh(Input.OAuthRefreshToken) If OAuthTokens(0) = "Relogin" Then GoTo Relogin '要求重新打开登录网页认证 End If - If Data.IsAborted Then Throw New ThreadInterruptedException + If Data.IsInterrupted Then Throw New ThreadInterruptedException Data.Progress = 0.25 - If Data.IsAborted Then Throw New ThreadInterruptedException + If Data.IsInterrupted Then Throw New ThreadInterruptedException Dim OAuthAccessToken As String = OAuthTokens(0) Dim OAuthRefreshToken As String = OAuthTokens(1) Dim XBLToken As String = MsLoginStep2(OAuthAccessToken) Data.Progress = 0.4 - If Data.IsAborted Then Throw New ThreadInterruptedException + If Data.IsInterrupted Then Throw New ThreadInterruptedException Dim Tokens = MsLoginStep3(XBLToken) Data.Progress = 0.55 - If Data.IsAborted Then Throw New ThreadInterruptedException - Dim MinecraftAPI As String() = MsLoginStep4(Tokens) '更改了第4步验证的返回格式,第一项为Minecraft Access Token,第二项为Token有效期 - Dim AccessToken As String = MinecraftAPI(0) 'Access Token - McLoginMsRefreshTime = GetUnixTimestamp() + MinecraftAPI(1) 'Token 到期时间,以秒为单位 + If Data.IsInterrupted Then Throw New ThreadInterruptedException + Dim AccessToken As String = MsLoginStep4(Tokens) Data.Progress = 0.7 - If Data.IsAborted Then Throw New ThreadInterruptedException + If Data.IsInterrupted Then Throw New ThreadInterruptedException MsLoginStep5(AccessToken) Data.Progress = 0.85 - If Data.IsAborted Then Throw New ThreadInterruptedException + If Data.IsInterrupted Then Throw New ThreadInterruptedException Dim Result = MsLoginStep6(AccessToken) Data.Progress = 0.98 '输出登录结果 - Setup.Set("CacheMsV2OAuthRefresh", OAuthRefreshToken) - Setup.Set("CacheMsV2Access", AccessToken) - Setup.Set("CacheMsV2Uuid", Result(0)) - Setup.Set("CacheMsV2Name", Result(1)) - Setup.Set("CacheMsV2ProfileJson", Result(2)) - Setup.Set("CacheMsV2OAuthExpires", McLoginMsRefreshTime) - Dim MsJson As JObject = GetJson(Setup.Get("LoginMsJson")) + Settings.Set("CacheMsV2OAuthRefresh", OAuthRefreshToken) + Settings.Set("CacheMsV2Access", AccessToken) + Settings.Set("CacheMsV2Uuid", Result(0)) + Settings.Set("CacheMsV2Name", Result(1)) + Settings.Set("CacheMsV2ProfileJson", Result(2)) + Dim MsJson As JObject = GetJson(Settings.Get("LoginMsJson")) MsJson.Remove(Input.UserName) '如果更改了玩家名…… MsJson(Result(1)) = OAuthRefreshToken - Setup.Set("LoginMsJson", MsJson.ToString(Newtonsoft.Json.Formatting.None)) + Settings.Set("LoginMsJson", MsJson.ToString(Newtonsoft.Json.Formatting.None)) Data.Output = New McLoginResult With {.AccessToken = AccessToken, .Name = Result(1), .Uuid = Result(0), .Type = "Microsoft", .ClientToken = Result(0), .ProfileJson = Result(2)} '结束 - 'McLoginMsRefreshTime = GetTimeMs() '不知道为什么会有一个这个东西 + McLoginMsRefreshTime = GetTimeMs() McLaunchLog("微软登录完成") SkipLogin: - Setup.Set("HintBuy", True) '关闭正版购买提示 + Settings.Set("HintBuy", True) '关闭正版购买提示 If ThemeUnlock(10, False) Then MyMsgBox("感谢你对正版游戏的支持!" & vbCrLf & "隐藏主题 跳票红 已解锁!", "提示") End Sub Private Sub McLoginServerStart(Data As LoaderTask(Of McLoginServer, McLoginResult)) @@ -606,15 +603,15 @@ SkipLogin: 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 - 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 + Settings.Get("Cache" & Input.Token & "Username") = Data.Input.UserName AndAlso + Settings.Get("Cache" & Input.Token & "Pass") = Data.Input.Password AndAlso + Settings.Get("Cache" & Input.Token & "Access") <> "" AndAlso + Settings.Get("Cache" & Input.Token & "Client") <> "" AndAlso + Settings.Get("Cache" & Input.Token & "Uuid") <> "" AndAlso + Settings.Get("Cache" & Input.Token & "Name") <> "" Then '尝试验证登录 Try - If Data.IsAborted Then Throw New ThreadInterruptedException + If Data.IsInterrupted Then Throw New ThreadInterruptedException McLoginRequestValidate(Data) GoTo LoginFinish Catch ex As Exception @@ -625,7 +622,7 @@ SkipLogin: '尝试刷新登录 Refresh: Try - If Data.IsAborted Then Throw New ThreadInterruptedException + If Data.IsInterrupted Then Throw New ThreadInterruptedException McLoginRequestRefresh(Data, NeedRefresh) GoTo LoginFinish Catch ex As Exception @@ -636,7 +633,7 @@ Refresh: End If '尝试普通登录 Try - If Data.IsAborted Then Throw New ThreadInterruptedException + If Data.IsInterrupted Then Throw New ThreadInterruptedException NeedRefresh = McLoginRequestLogin(Data) Catch ex As Exception McLaunchLog("登录失败:" & ex.GetDetail()) @@ -655,8 +652,8 @@ LoginFinish: Dim Emails As New List(Of String) Dim Passwords As New List(Of String) Try - If Not Setup.Get("Login" & Input.Token & "Email") = "" Then Emails.AddRange(Setup.Get("Login" & Input.Token & "Email").ToString.Split("¨")) - If Not Setup.Get("Login" & Input.Token & "Pass") = "" Then Passwords.AddRange(Setup.Get("Login" & Input.Token & "Pass").ToString.Split("¨")) + If Not Settings.Get("Login" & Input.Token & "Email") = "" Then Emails.AddRange(Settings.Get("Login" & Input.Token & "Email").ToString.Split("¨")) + If Not Settings.Get("Login" & Input.Token & "Pass") = "" Then Passwords.AddRange(Settings.Get("Login" & Input.Token & "Pass").ToString.Split("¨")) For i = 0 To Emails.Count - 1 Dict.Add(Emails(i), Passwords(i)) Next @@ -665,12 +662,12 @@ LoginFinish: Emails.Insert(0, Input.UserName) Passwords = New List(Of String)(Dict.Values) Passwords.Insert(0, Input.Password) - Setup.Set("Login" & Input.Token & "Email", Join(Emails, "¨")) - Setup.Set("Login" & Input.Token & "Pass", Join(Passwords, "¨")) + Settings.Set("Login" & Input.Token & "Email", Emails.Join("¨"c)) + Settings.Set("Login" & Input.Token & "Pass", Passwords.Join("¨"c)) Catch ex As Exception Log(ex, "保存启动记录失败", LogLevel.Hint) - Setup.Set("Login" & Input.Token & "Email", "") - Setup.Set("Login" & Input.Token & "Pass", "") + Settings.Set("Login" & Input.Token & "Email", "") + Settings.Set("Login" & Input.Token & "Pass", "") End Try End Sub Private Sub McLoginLegacyStart(Data As LoaderTask(Of McLoginLegacy, McLoginResult)) @@ -687,20 +684,20 @@ LoginFinish: Data.Output.ClientToken = Data.Output.Uuid '保存启动记录 Dim Names As New List(Of String) - If Not Setup.Get("LoginLegacyName") = "" Then Names.AddRange(Setup.Get("LoginLegacyName").ToString.Split("¨")) + If Not Settings.Get("LoginLegacyName") = "" Then Names.AddRange(Settings.Get("LoginLegacyName").ToString.Split("¨")) Names.Remove(Input.UserName) Names.Insert(0, Input.UserName) - Setup.Set("LoginLegacyName", Join(Names.ToArray, "¨")) + Settings.Set("LoginLegacyName", Names.Join("¨"c)) End Sub 'Server 登录:三种验证方式的请求 Private Sub McLoginRequestValidate(ByRef Data As LoaderTask(Of McLoginServer, McLoginResult)) McLaunchLog("验证登录开始(Validate, " & Data.Input.Token & ")") '提前缓存信息,否则如果在登录请求过程中退出登录,设置项目会被清空,导致输出存在空值 - Dim AccessToken As String = Setup.Get("Cache" & Data.Input.Token & "Access") - Dim ClientToken As String = Setup.Get("Cache" & Data.Input.Token & "Client") - Dim Uuid As String = Setup.Get("Cache" & Data.Input.Token & "Uuid") - Dim Name As String = Setup.Get("Cache" & Data.Input.Token & "Name") + Dim AccessToken As String = Settings.Get("Cache" & Data.Input.Token & "Access") + Dim ClientToken As String = Settings.Get("Cache" & Data.Input.Token & "Client") + Dim Uuid As String = Settings.Get("Cache" & Data.Input.Token & "Uuid") + Dim Name As String = Settings.Get("Cache" & Data.Input.Token & "Name") '发送登录请求 Dim RequestData As New JObject( New JProperty("accessToken", AccessToken), New JProperty("clientToken", ClientToken), New JProperty("requestUser", True)) @@ -724,28 +721,28 @@ LoginFinish: Data.Input.BaseUrl & "/refresh", HttpMethod.Post, Content:=New JObject( New JProperty("selectedProfile", New JObject( - New JProperty("name", Setup.Get($"Cache{Data.Input.Token}Name")), - New JProperty("id", Setup.Get($"Cache{Data.Input.Token}Uuid")) + New JProperty("name", Settings.Get($"Cache{Data.Input.Token}Name")), + New JProperty("id", Settings.Get($"Cache{Data.Input.Token}Uuid")) )), - New JProperty("accessToken", Setup.Get($"Cache{Data.Input.Token}Access")), + New JProperty("accessToken", Settings.Get($"Cache{Data.Input.Token}Access")), New JProperty("requestUser", True) ).ToString(Newtonsoft.Json.Formatting.None), Headers:={{"Accept-Language", "zh-CN"}}, ContentType:="application/json; charset=utf-8", RequireJson:=True)) '将登录结果输出 - If LoginJson("selectedProfile") Is Nothing Then Throw New Exception("选择的角色 " & Setup.Get("Cache" & Data.Input.Token & "Name") & " 无效!") + If LoginJson("selectedProfile") Is Nothing Then Throw New Exception("选择的角色 " & Settings.Get("Cache" & Data.Input.Token & "Name") & " 无效!") Data.Output.AccessToken = LoginJson("accessToken").ToString Data.Output.ClientToken = LoginJson("clientToken").ToString Data.Output.Uuid = LoginJson("selectedProfile")("id").ToString Data.Output.Name = LoginJson("selectedProfile")("name").ToString Data.Output.Type = Data.Input.Token '保存缓存 - Setup.Set("Cache" & Data.Input.Token & "Access", Data.Output.AccessToken) - Setup.Set("Cache" & Data.Input.Token & "Client", Data.Output.ClientToken) - Setup.Set("Cache" & Data.Input.Token & "Uuid", Data.Output.Uuid) - Setup.Set("Cache" & Data.Input.Token & "Name", Data.Output.Name) - Setup.Set("Cache" & Data.Input.Token & "Username", Data.Input.UserName) - Setup.Set("Cache" & Data.Input.Token & "Pass", Data.Input.Password) + Settings.Set("Cache" & Data.Input.Token & "Access", Data.Output.AccessToken) + Settings.Set("Cache" & Data.Input.Token & "Client", Data.Output.ClientToken) + Settings.Set("Cache" & Data.Input.Token & "Uuid", Data.Output.Uuid) + Settings.Set("Cache" & Data.Input.Token & "Name", Data.Output.Name) + Settings.Set("Cache" & Data.Input.Token & "Username", Data.Input.UserName) + Settings.Set("Cache" & Data.Input.Token & "Pass", Data.Input.Password) McLaunchLog("刷新登录成功(Refresh, " & Data.Input.Token & ")") End Sub Private Function McLoginRequestLogin(ByRef Data As LoaderTask(Of McLoginServer, McLoginResult)) As Boolean @@ -766,7 +763,7 @@ LoginFinish: If LoginJson("availableProfiles").Count = 0 Then If Data.Input.ForceReselectProfile Then Hint("你还没有创建角色,无法更换!", HintType.Red) Throw New Exception("$你还没有创建角色,请在创建角色后再试!") - ElseIf Data.Input.ForceReselectProfile AndAlso LoginJson("availableProfiles").Count = 1 Then + ElseIf Data.Input.ForceReselectProfile AndAlso LoginJson("availableProfiles").IsSingle Then Hint("你的账户中只有一个角色,无法更换!", HintType.Red) End If Dim SelectedName As String = Nothing @@ -774,7 +771,7 @@ LoginFinish: If (LoginJson("selectedProfile") Is Nothing OrElse Data.Input.ForceReselectProfile) AndAlso LoginJson("availableProfiles").Count > 1 Then '要求选择档案;优先从缓存读取 NeedRefresh = True - Dim CacheId As String = Setup.Get("Cache" & Data.Input.Token & "Uuid") + Dim CacheId As String = Settings.Get("Cache" & Data.Input.Token & "Uuid") For Each Profile In LoginJson("availableProfiles") If Profile("id").ToString = CacheId Then SelectedName = Profile("name").ToString @@ -810,12 +807,12 @@ LoginFinish: Data.Output.Uuid = SelectedId Data.Output.Type = Data.Input.Token '保存缓存 - Setup.Set("Cache" & Data.Input.Token & "Access", Data.Output.AccessToken) - Setup.Set("Cache" & Data.Input.Token & "Client", Data.Output.ClientToken) - Setup.Set("Cache" & Data.Input.Token & "Uuid", Data.Output.Uuid) - Setup.Set("Cache" & Data.Input.Token & "Name", Data.Output.Name) - Setup.Set("Cache" & Data.Input.Token & "Username", Data.Input.UserName) - Setup.Set("Cache" & Data.Input.Token & "Pass", Data.Input.Password) + Settings.Set("Cache" & Data.Input.Token & "Access", Data.Output.AccessToken) + Settings.Set("Cache" & Data.Input.Token & "Client", Data.Output.ClientToken) + Settings.Set("Cache" & Data.Input.Token & "Uuid", Data.Output.Uuid) + Settings.Set("Cache" & Data.Input.Token & "Name", Data.Output.Name) + Settings.Set("Cache" & Data.Input.Token & "Username", Data.Input.UserName) + Settings.Set("Cache" & Data.Input.Token & "Pass", Data.Input.Password) McLaunchLog("登录成功(Login, " & Data.Input.Token & ")") Return NeedRefresh Catch ex As Exception @@ -1004,7 +1001,7 @@ Retry: } End Function '微软登录步骤 4:从 {XSTSToken, UHS} 获取 Minecraft AccessToken - Private Function MsLoginStep4(Tokens As String()) As String() + Private Function MsLoginStep4(Tokens As String()) As String McLaunchLog("开始微软登录步骤 4/6") Dim Request As String = New JObject(New JProperty("identityToken", $"XBL3.0 x={Tokens(1)};{Tokens(0)}")).ToString(0) @@ -1025,10 +1022,7 @@ Retry: End If End Try - Return { - GetJson(Result)("access_token").ToString, - GetJson(Result)("expires_in").ToString '以秒为单位 - } + Return GetJson(Result)("access_token").ToString End Function '微软登录步骤 5:验证微软账号是否持有 MC,这也会刷新 XGP Private Sub MsLoginStep5(AccessToken As String) @@ -1115,7 +1109,7 @@ Retry: End Try Case 4 '自定义 - Do Until McSkinSex(Uuid) = If(Setup.Get("LaunchSkinSlim"), "Alex", "Steve") + Do Until McSkinSex(Uuid) = If(Settings.Get("LaunchSkinSlim"), "Alex", "Steve") 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 @@ -1208,7 +1202,7 @@ Retry: End If End If - 'Forge 检测 + 'Forge 检测(部分测试结果见 #8432) If McInstanceSelected.Version.HasForge Then If McInstanceSelected.Version.Vanilla >= New Version(6, 0, 1) AndAlso McInstanceSelected.Version.Vanilla <= New Version(7, 0, 2) Then '1.6.1 - 1.7.2:必须 Java 7 @@ -1226,11 +1220,32 @@ Retry: 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 CompareVersionGE(McInstanceSelected.Version.Forge, "34.0.0") AndAlso CompareVersionGE("36.2.25", McInstanceSelected.Version.Forge) Then - '1.16,Forge 34.X ~ 36.2.25:最高 Java 8u320 + '1.16.3~5,Forge 34.0.0 ~ 36.2.25:最高 Java 8u320 MaxVer = If(New Version(1, 8, 0, 320) < MaxVer, New Version(1, 8, 0, 320), MaxVer) - ElseIf McInstanceSelected.Version.Vanilla.Major >= 18 AndAlso McInstanceSelected.Version.Vanilla.Major < 19 AndAlso McInstanceSelected.Version.HasOptiFine Then '#305 + ElseIf CompareVersionGE(McInstanceSelected.Version.Forge, "36.2.26") AndAlso CompareVersionGE("36.999.999", McInstanceSelected.Version.Forge) Then + '1.16.5,Forge 36.2.26+,<37.0.0:最高 Java 23 + MaxVer = If(New Version(1, 23, 999, 999) < MaxVer, New Version(1, 23, 999, 999), MaxVer) + ElseIf CompareVersionGE(McInstanceSelected.Version.Forge, "37.0.0") AndAlso CompareVersionGE("37.0.79", McInstanceSelected.Version.Forge) Then + '1.17.1,Forge 37.0.0 ~ 37.0.79:最高 Java 16 + MaxVer = If(New Version(1, 16, 999, 999) < MaxVer, New Version(1, 16, 999, 999), MaxVer) + ElseIf McInstanceSelected.Version.Vanilla.Major = 18 AndAlso McInstanceSelected.Version.HasOptiFine Then '#305 '1.18:若安装了 OptiFine,最高 Java 18 MaxVer = If(New Version(1, 18, 999, 999) < MaxVer, New Version(1, 18, 999, 999), MaxVer) + ElseIf CompareVersionGE(McInstanceSelected.Version.Forge, "45.0.21") AndAlso CompareVersionGE("45.0.65", McInstanceSelected.Version.Forge) Then + '1.19.4,Forge 45.0.21 ~ 45.0.65:最高 Java 19 + MaxVer = If(New Version(1, 19, 999, 999) < MaxVer, New Version(1, 19, 999, 999), MaxVer) + ElseIf CompareVersionGE(McInstanceSelected.Version.Forge, "45.0.66") AndAlso CompareVersionGE("47.4.8", McInstanceSelected.Version.Forge) Then + '1.19.4~1.20.1,Forge 45.0.66 ~ 47.4.8:最高 Java 21 + MaxVer = If(New Version(1, 21, 999, 999) < MaxVer, New Version(1, 21, 999, 999), MaxVer) + End If + End If + + 'NeoForge 检测 + If McInstanceSelected.Version.HasNeoForge Then + If McInstanceSelected.Version.Vanilla = New Version(20, 0, 1) OrElse + (CompareVersionGE("20.2.62-beta", McInstanceSelected.Version.NeoForge) AndAlso Not McInstanceSelected.Version.NeoForge.Contains("25w14craftmine")) Then + '1.20.1,以及 1.20.2 的 20.2.62-beta 之前:最高 Java 21 + MaxVer = If(New Version(1, 21, 999, 999) < MaxVer, New Version(1, 21, 999, 999), MaxVer) End If End If @@ -1252,7 +1267,7 @@ Retry: End If '统一通行证检测 - If Setup.Get("LoginType") = McLoginType.Nide Then + If Settings.Get("LoginType") = McLoginType.Nide Then '至少 Java 8u101 MinVer = If(New Version(1, 8, 0, 141) > MinVer, New Version(1, 8, 0, 141), MinVer) End If @@ -1262,15 +1277,15 @@ Retry: '选择 Java McLaunchLog("Java 版本需求:最低 " & MinVer.ToString & ",最高 " & MaxVer.ToString) McLaunchJavaSelected = JavaSelect("$$", MinVer, MaxVer, McInstanceSelected) - If Task.IsAborted Then Return + If Task.IsInterrupted Then Return If McLaunchJavaSelected IsNot Nothing Then McLaunchLog("选择的 Java:" & McLaunchJavaSelected.ToString) Return End If '无合适的 Java - If Task.IsAborted Then Return '中断加载会导致 JavaSelect 异常地返回空值,误判找不到 Java - McLaunchLog("无合适的 Java,需要确认是否自动下载") + If Task.IsInterrupted Then Return '中断加载会导致 JavaSelect 异常地返回空值,误判找不到 Java + McLaunchLog("无合适的 Java,准备自动下载") Dim JavaCode As String If MinVer >= New Version(1, 9) Then JavaCode = MinVer.Minor @@ -1291,18 +1306,18 @@ Retry: Dim JavaLoader = GetJavaDownloadLoader() Try JavaLoader.Start(If(RecommendedComponent, JavaCode), IsForceRestart:=True) '在 Java 22+ 时优先使用 Mojang 提供的 Component 字段 - Do While JavaLoader.State = LoadState.Loading AndAlso Not Task.IsAborted + Do While JavaLoader.State = LoadState.Loading AndAlso Not Task.IsInterrupted Task.Progress = JavaLoader.Progress Thread.Sleep(10) Loop Finally - JavaLoader.Abort() '确保取消时中止 Java 下载 + JavaLoader.Interrupt() '确保取消时中止 Java 下载 End Try '检查下载结果 If JavaSearchLoader.State <> LoadState.Loading Then JavaSearchLoader.State = LoadState.Waiting '2872# McLaunchJavaSelected = JavaSelect("$$", MinVer, MaxVer, McInstanceSelected) - If Task.IsAborted Then Return + If Task.IsInterrupted Then Return If McLaunchJavaSelected IsNot Nothing Then McLaunchLog("选择的 Java:" & McLaunchJavaSelected.ToString) Else @@ -1316,454 +1331,456 @@ Retry: #End Region #Region "启动参数" - Private McLaunchArgument As String - ''' - ''' 释放 Java Wrapper 并返回完整文件路径。 - ''' - Public Function ExtractJavaWrapper() As String - Dim WrapperPath As String = PathPure & "JavaWrapper.jar" - Log("[Java] 选定的 Java Wrapper 路径:" & WrapperPath) - SyncLock ExtractJavaWrapperLock '避免 OptiFine 和 Forge 安装时同时释放 Java Wrapper 导致冲突 - Try - WriteFile(WrapperPath, GetResources("JavaWrapper")) - Catch ex As Exception - If File.Exists(WrapperPath) Then - '因为未知原因 Java Wrapper 可能变为只读文件(#4243) - Log(ex, "Java Wrapper 文件释放失败,但文件已存在,将在删除后尝试重新生成", LogLevel.Developer) - Try - File.Delete(WrapperPath) - WriteFile(WrapperPath, GetResources("JavaWrapper")) - Catch ex2 As Exception - Log(ex2, "Java Wrapper 文件重新释放失败,将尝试更换文件名重新生成", LogLevel.Developer) - WrapperPath = PathPure & "JavaWrapper2.jar" - Try - WriteFile(WrapperPath, GetResources("JavaWrapper")) - Catch ex3 As Exception - Throw New FileNotFoundException("释放 Java Wrapper 最终尝试失败", ex3) - End Try - End Try - Else - Throw New FileNotFoundException("释放 Java Wrapper 失败", ex) - End If - End Try - End SyncLock - Return WrapperPath - End Function - Private ExtractJavaWrapperLock As New Object - - '主方法,合并 Jvm、Game、Replace 三部分的参数数据 - Private Sub McLaunchArgumentMain(Loader As LoaderTask(Of String, List(Of McLibToken))) - McLaunchLog("开始获取 Minecraft 启动参数") - '获取基准字符串与参数信息 - Dim Arguments As String - If McInstanceSelected.JsonObject("arguments") IsNot Nothing AndAlso McInstanceSelected.JsonObject("arguments")("jvm") IsNot Nothing Then - McLaunchLog("获取新版 JVM 参数") - Arguments = McLaunchArgumentsJvmNew(McInstanceSelected) - McLaunchLog("新版 JVM 参数获取成功:") - McLaunchLog(Arguments) - Else - McLaunchLog("获取旧版 JVM 参数") - Arguments = McLaunchArgumentsJvmOld(McInstanceSelected) - McLaunchLog("旧版 JVM 参数获取成功:") - McLaunchLog(Arguments) - End If - If Not String.IsNullOrEmpty(McInstanceSelected.JsonObject("minecraftArguments")) Then '有的版本是空字符串 - McLaunchLog("获取旧版 Game 参数") - Arguments += " " & McLaunchArgumentsGameOld(McInstanceSelected) - McLaunchLog("旧版 Game 参数获取成功") - End If - If McInstanceSelected.JsonObject("arguments") IsNot Nothing AndAlso McInstanceSelected.JsonObject("arguments")("game") IsNot Nothing Then - McLaunchLog("获取新版 Game 参数") - Arguments += " " & McLaunchArgumentsGameNew(McInstanceSelected) - McLaunchLog("新版 Game 参数获取成功") - End If - '编码参数(#4700、#5892、#5909) - If McLaunchJavaSelected.MajorVersion >= 18 Then 'Dfile.encoding 需要放在 Dstdout.encoding 后面(#6934) - If Not Arguments.Contains("-Dfile.encoding=") Then Arguments = "-Dfile.encoding=COMPAT " & Arguments - End If - If McLaunchJavaSelected.MajorVersion > 8 Then - If Not Arguments.Contains("-Dstdout.encoding=") Then Arguments = "-Dstdout.encoding=UTF-8 " & Arguments - If Not Arguments.Contains("-Dstderr.encoding=") Then Arguments = "-Dstderr.encoding=UTF-8 " & Arguments - End If - 'MJSB - Arguments = Arguments.Replace(" -Dos.name=Windows 10", " -Dos.name=""Windows 10""") - '全屏 - If Setup.Get("LaunchArgumentWindowType") = 0 Then Arguments += " --fullscreen" - '由 Option 传入的额外参数 - For Each Arg In CurrentLaunchOptions.ExtraArgs - Arguments += " " & Arg.Trim - Next - '自定义 - Dim ArgumentGame As String = Setup.Get("VersionAdvanceGame", Instance:=McInstanceSelected) - Arguments += " " & ArgumentReplace(If(ArgumentGame = "", Setup.Get("LaunchAdvanceGame"), ArgumentGame)) - '进行参数替换 - Dim ReplaceArguments = McLaunchArgumentsReplace(McInstanceSelected, Loader) - If String.IsNullOrWhiteSpace(ReplaceArguments("${version_type}")) Then - '若自定义信息为空,则去掉该部分 - Arguments = Arguments.Replace(" --versionType ${version_type}", "") - ReplaceArguments("${version_type}") = """""" - End If - Dim FinalArguments As String = "" - For Each Argument In Arguments.Split(" ") - For Each Entry As KeyValuePair(Of String, String) In ReplaceArguments - Argument = Argument.Replace(Entry.Key, Entry.Value) + '主方法 + Private Sub McLaunchArgumentMain(Loader As LoaderTask(Of String, Integer)) + '获取基础参数 + Dim Arguments As New List(Of String) + McLaunchLog("参数获取开始") + Arguments.AddRange(McLaunchArgumentsJVM()) 'JVM 参数 + Arguments.Add(McInstanceSelected.JsonObject("mainClass")) 'mainClass + Arguments.AddRange(McLaunchArgumentsGame()) '游戏参数 + '替换 + McLaunchLog("=================== 启动参数开始 ===================") + Dim Replacements = McLaunchArgumentsReplace(Arguments).ToList + Dim Argument As String = "" + For Each Arg In Arguments + '应用替换标记 + For Each Replacement In Replacements + Arg = Arg.Replace(Replacement.Key, Replacement.Value) Next - If (Argument.Contains(" ") OrElse Argument.Contains(":\")) AndAlso Not Argument.EndsWithF("""") Then Argument = $"""{Argument}""" - FinalArguments += Argument & " " + '为带空格的参数添加双引号 + If Arg.Contains(" ") AndAlso Not Arg.StartsWithF("""") AndAlso Not Arg.EndsWithF("""") Then + Arg = $"""{Arg.Replace("""", "\""")}""" '转义在原本参数中间的双引号 + End If + '输出 + McLaunchLog(Arg) + Argument &= Arg & " " Next - FinalArguments = FinalArguments.TrimEnd - '替换 Module Path 为短路径(Forge 会在版本 JSON 硬编码这些路径) - FinalArguments = FinalArguments.RegexReplaceEach("(?<= (-p|--module-path) "")[^""]+(?="" )", - Function(ModulePath) ModulePath.Value.RegexReplaceEach("[A-Z]:\\[^;]+", Function(m) ShortenPath(m.Value))) - '进服 - Dim Server As String = If(String.IsNullOrEmpty(CurrentLaunchOptions.ServerIp), Setup.Get("VersionServerEnter", McInstanceSelected), CurrentLaunchOptions.ServerIp) - If Server.Length > 0 Then + McLaunchLog("=================== 启动参数结束 ===================") + '输出 + McLaunchArgument = Argument.TrimEnd + End Sub + + 'JVM 部分 + Private Function McLaunchArgumentsJVM() As List(Of String) + Dim Args As New List(Of String) + + 'Minecraft 参数 + If McInstanceSelected.JsonObject("arguments") IsNot Nothing AndAlso McInstanceSelected.JsonObject("arguments")("jvm") IsNot Nothing Then + '新版 MC:从版本 JSON 获取参数 + Dim CurrentInstance As McInstance = McInstanceSelected +NextInstance: + McLaunchLog($"新版 JVM 参数:从版本 JSON 获取({CurrentInstance.Name})") + If CurrentInstance.JsonObject("arguments") IsNot Nothing AndAlso CurrentInstance.JsonObject("arguments")("jvm") IsNot Nothing Then + For Each SubJson As JToken In CurrentInstance.JsonObject("arguments")("jvm") + Select Case SubJson.Type + Case JTokenType.String + Args.Add(SubJson.ToString.Trim) + Case JTokenType.Object + Dim Argument As JObject = CType(SubJson, JObject) + If Argument.ContainsKey("rules") AndAlso Not McJsonRuleCheck(Argument("rules")) Then Continue For '不满足准则 + If Not Argument.ContainsKey("value") Then Continue For '没有 value 字段 + If Argument("value").Type = JTokenType.String Then + Args.Add(Argument("value").ToString.Trim) + Else + For Each value As JToken In Argument("value") + Args.Add(value.ToString.Trim) + Next + End If + End Select + Next + End If + If CurrentInstance.InheritName <> "" Then + CurrentInstance = New McInstance(CurrentInstance.InheritName) + GoTo NextInstance + End If + '1.17.1 中有个 "-Dos.name=Windows 10",不立即加双引号会导致 10 被隔开 + Args = Args.Select(Function(a) If(a.Contains(" ") AndAlso Not a.StartsWithF("""") AndAlso Not a.EndsWithF(""""), $"""{a.Replace("""", "\""")}""", a)).ToList + Else + '旧版 MC:直接添加参数 + McLaunchLog($"旧版 JVM 参数") + Args.Add("-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump") + Args.Add("-Djava.library.path=${natives_directory}") + Args.Add("-cp") : Args.Add("${classpath}") + End If + + '设置里自定义的参数 + Dim CustomArg As String = Settings.Get("VersionAdvanceJvm", Instance:=McInstanceSelected) + If CustomArg = "" Then CustomArg = Settings.Get("LaunchAdvanceJvm") + + '重新分割字符串并去重 + Args = DeduplicateJavaArguments(SplitJavaArguments(Args.Join(" "c).Replace("McEmu= ", "McEmu=") & " " & CustomArg).ToList, True) + + '统一通行证 + If McLoginLoader.Output.Type = "Nide" Then + Args.Add("-javaagent:""${pure_directory}\nide8auth.jar""=""" & Settings.Get("VersionServerNide", Instance:=McInstanceSelected) & """") + End If + 'Authlib-Injector + If McLoginLoader.Output.Type = "Auth" Then + If McLaunchJavaSelected.MajorVersion >= 6 Then Args.Add("-Djavax.net.ssl.trustStoreType=WINDOWS-ROOT") '信任系统根证书(5252#) + Dim Server As String = Settings.Get("VersionServerAuthServer", Instance:=McInstanceSelected) + Try + McLaunchLog($"开始 Authlib Injector Prefetch") + Dim Response As String = NetRequestByClientRetry(Server, Encoding:=Encoding.UTF8) + Args.Add("-javaagent:""${pure_directory}\authlib-injector.jar""=""" & Server & """") + Args.Add("-Dauthlibinjector.side=client") + Args.Add("-Dauthlibinjector.yggdrasil.prefetched=" & Convert.ToBase64String(Encoding.UTF8.GetBytes(Response))) + Catch ex As Exception + Throw New Exception("无法连接到第三方登录服务器(" & If(Server, Nothing) & ")", ex) + End Try + End If + + 'JLW + Dim UseJLW As Boolean = + Not Settings.Get("LaunchAdvanceDisableJLW") AndAlso Not Settings.Get("VersionAdvanceDisableJLW", McInstanceSelected) AndAlso + McLaunchJavaSelected.MajorVersion <= 18 + If UseJLW Then + If McLaunchJavaSelected.MajorVersion >= 9 Then + Args.Add("--add-exports") : Args.Add("cpw.mods.bootstraplauncher/cpw.mods.bootstraplauncher=ALL-UNNAMED") + End If + Args.Add("-Doolloo.jlw.tmpdir=${pure_directory}") '这里需要不以 \ 结尾 + End If + McLaunchLog("使用 JLW:" & UseJLW) + + 'LUA + Dim UseLUA As Boolean = + Not Settings.Get("LaunchAdvanceDisableLUA") AndAlso Not Settings.Get("VersionAdvanceDisableLUA", McInstanceSelected) AndAlso + McLaunchJavaSelected.MajorVersion >= 25 AndAlso McInstanceSelected.Version.Drop >= 261 + If UseLUA Then Args.Add($"-javaagent:""{ExtractPatch("LUA")}""") + McLaunchLog("使用 LUA:" & UseLUA) + +#Region "内存管理" + + McLaunchLog("当前剩余内存:" & Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024 * 10) / 10 & "G") + Dim TargetRam As Integer = Math.Floor(PageInstanceSetup.GetRam(McInstanceSelected, Not McLaunchJavaSelected.Is64Bit) * 1024) + Args.Add("-Xmx" & TargetRam & "m") + + '获取设置的管理方式 + '0:在 Java 21+ 使用分代 ZGC,20~15 使用非分代的 ZGC,14- 使用 G1GC + '1:在 Java 21+ 使用分代 ZGC,20- 使用 G1GC + '2:仅 G1GC + '3:不指定,玩家自定义 + Dim SetupType As Integer = Settings.Get("LaunchAdvanceGC") + If McInstanceSelected IsNot Nothing AndAlso Settings.Get("VersionAdvanceGC", McInstanceSelected) > 0 Then SetupType = Settings.Get("VersionAdvanceGC", McInstanceSelected) - 1 '去掉默认 + If SetupType <> 3 Then + '确定是使用 G1GC 还是 ZGC + Dim UseG1GC As Boolean = False + If (SetupType = 0 AndAlso McLaunchJavaSelected.MajorVersion < 15) OrElse + (SetupType = 1 AndAlso McLaunchJavaSelected.MajorVersion < 21) OrElse + (SetupType = 2 OrElse SetupType = 4) Then UseG1GC = True '检查 Java 版本,ZGC 在 Java 15+ 可用,分代 ZGC 在 Java 21+ 可用 + If Is32BitSystem OrElse Environment.OSVersion.Version.Major < 10 OrElse Environment.OSVersion.Version.Build < 17763 Then UseG1GC = True '检查系统兼容性,ZGC 需要 Windows 10 1809+ + McLaunchLog($"GC 设置:{SetupType},选取 {If(UseG1GC, "G1GC", "ZGC")},Java 版本:{McLaunchJavaSelected.MajorVersion}") + '移除已有的 GC 参数 + Args = Args.Where(Function(a) Not RegexCheck(a, + "( )*-XX:[+-]?(Use\w+GC|ZGenerational|UseCompactObjectHeaders|G1\w+Percent|G1\w+Size|(Max|Min)(GCPauseMillis|HeapFreeRatio))")).ToList + '添加 GC 参数 + Args.Add("-XX:+UnlockExperimentalVMOptions") + If McLaunchJavaSelected.MajorVersion >= 24 AndAlso McLaunchJavaSelected.Is64Bit Then Args.Add("-XX:+UseCompactObjectHeaders") + If UseG1GC AndAlso SetupType = 4 Then + '优化的 G1GC + Args.Add("-XX:+UseG1GC") + Args.Add("-XX:G1NewSizePercent=20") + Args.Add("-XX:G1ReservePercent=20") + Args.Add("-XX:G1HeapRegionSize=32M") + Args.Add("-XX:MaxGCPauseMillis=50") + If Not ModeDebug Then Args.Add("-XX:+PerfDisableSharedMem") + If McLaunchJavaSelected.MajorVersion <= 7 Then Args.Add("-XX:MaxPermSize=512m") '#8286 + If McLaunchJavaSelected.MajorVersion = 8 Then Args.Add("-XX:+ParallelRefProcEnabled") + If McLaunchJavaSelected.MajorVersion >= 12 Then Args.Add("-XX:MinHeapFreeRatio=25") '需要比 G1NewSizePercent 大一点 + If McLaunchJavaSelected.MajorVersion >= 12 Then Args.Add("-XX:MaxHeapFreeRatio=40") '需要比 MinHeapFreeRatio 大一些 + ElseIf UseG1GC Then + 'Mojang G1GC + Args.Add("-XX:+UseG1GC") + Args.Add("-XX:G1NewSizePercent=20") + Args.Add("-XX:G1ReservePercent=20") + Args.Add("-XX:G1HeapRegionSize=32M") + Args.Add("-XX:MaxGCPauseMillis=50") + If McLaunchJavaSelected.MajorVersion <= 7 Then Args.Add("-XX:MaxPermSize=512m") '#8286 + Else + 'ZGC + Args.Add("-XX:+UseZGC") + If McLaunchJavaSelected.MajorVersion = 21 OrElse McLaunchJavaSelected.MajorVersion = 22 Then Args.Add("-XX:+ZGenerational") 'Java 23 起默认启用分代 ZGC,不需要再添加参数 + End If + End If + + Args.Remove("-XX:MaxDirectMemorySize=256M") '#3511 的清理 + +#End Region + + 'Log4j 漏洞防御参数 + Args.Add("-Dlog4j2.formatMsgNoLookups=true") + + '编码(#4700、#5892、#5909) + If McLaunchJavaSelected.MajorVersion > 8 AndAlso Not Args.Any(Function(a) a.StartsWithF("-Dstdout.encoding=")) Then Args.Add("-Dstdout.encoding=UTF-8") + If McLaunchJavaSelected.MajorVersion > 8 AndAlso Not Args.Any(Function(a) a.StartsWithF("-Dstderr.encoding=")) Then Args.Add("-Dstderr.encoding=UTF-8") + If McLaunchJavaSelected.MajorVersion >= 18 AndAlso Not Args.Any(Function(a) a.StartsWithF("-Dfile.encoding=")) Then Args.Add("-Dfile.encoding=COMPAT") 'Dfile.encoding 需要放在 Dstdout.encoding 后面(#6934) + + '为 JLW 添加 -jar,它必须放在最后 + If UseJLW Then + Args.Add("-jar") : Args.Add(ExtractPatch("JavaWrapper")) + End If + + '再次去重并输出 + Return DeduplicateJavaArguments(Args, True) + End Function + '游戏参数部分 + Private Function McLaunchArgumentsGame() As List(Of String) + Dim Arg As String = "" + + 'Minecraft 参数 + '旧版 MC:直接添加参数 + If McInstanceSelected.JsonObject("minecraftArguments")?.ToString.Any Then + Dim BasicString As String = McInstanceSelected.JsonObject("minecraftArguments").ToString + McLaunchLog($"旧版游戏参数:" & BasicString) + BasicString += " --height ${resolution_height} --width ${resolution_width}" '总是添加宽高选项,之后去重的时候会覆盖 MC 自带的 + Arg &= " " & BasicString + End If + '新版 MC:从版本 JSON 获取参数 + If McInstanceSelected.JsonObject("arguments") IsNot Nothing AndAlso McInstanceSelected.JsonObject("arguments")("game") IsNot Nothing Then + Dim CurrentInstance As McInstance = McInstanceSelected + Dim AppendArg = Sub(a As String) Arg &= " " & If(a.Contains(" ") AndAlso Not a.StartsWithF("""") AndAlso Not a.EndsWithF(""""), $"""{a.Replace("""", "\""")}""", a) +NextInstance: + McLaunchLog($"新版游戏参数:从版本 JSON 获取({CurrentInstance.Name})") + If CurrentInstance.JsonObject("arguments") IsNot Nothing AndAlso CurrentInstance.JsonObject("arguments")("game") IsNot Nothing Then + For Each SubJson As JToken In CurrentInstance.JsonObject("arguments")("game") + Select Case SubJson.Type + Case JTokenType.String + AppendArg(SubJson.ToString) + Case JTokenType.Object + Dim Argument As JObject = CType(SubJson, JObject) + If Argument.ContainsKey("rules") AndAlso Not McJsonRuleCheck(Argument("rules")) Then Continue For '不满足准则 + If Not Argument.ContainsKey("value") Then Continue For '没有 value 字段 + If Argument("value").Type = JTokenType.String Then + AppendArg(Argument("value").ToString) + Else + For Each value As JToken In Argument("value") + AppendArg(value.ToString) + Next + End If + End Select + Next + End If + If CurrentInstance.InheritName <> "" Then + CurrentInstance = New McInstance(CurrentInstance.InheritName) + GoTo NextInstance + End If + End If + + '设置里自定义的参数 + Dim CustomArg As String = Settings.Get("VersionAdvanceGame", Instance:=McInstanceSelected) + If CustomArg = "" Then CustomArg = Settings.Get("LaunchAdvanceGame") + Arg &= " " & CustomArg + + '把 OptiFineForgeTweaker 放在参数的末尾 + If (McInstanceSelected.Version.HasForge OrElse McInstanceSelected.Version.HasLiteLoader) AndAlso McInstanceSelected.Version.HasOptiFine Then + If Arg.Contains("--tweakClass optifine.OptiFineForgeTweaker") Then + McLaunchLog("发现正确的 OptiFineForge TweakClass,目前的游戏参数:" & Arg) + Arg = Arg.Replace(" --tweakClass optifine.OptiFineForgeTweaker", "") & " --tweakClass optifine.OptiFineForgeTweaker" + End If + If Arg.Contains("--tweakClass optifine.OptiFineTweaker") Then + McLaunchLog("发现错误的 OptiFineForge TweakClass,目前的游戏参数:" & Arg) + Arg = Arg.Replace(" --tweakClass optifine.OptiFineTweaker", "") & " --tweakClass optifine.OptiFineForgeTweaker" + Try + WriteFile(McInstanceSelected.PathVersion & McInstanceSelected.Name & ".json", ReadFile(McInstanceSelected.PathVersion & McInstanceSelected.Name & ".json").Replace("optifine.OptiFineTweaker", "optifine.OptiFineForgeTweaker")) + Catch ex As Exception + Log(ex, "替换 OptiFineForge TweakClass 失败") + End Try + End If + End If + + '重新分割字符串并去重 + Dim Args As List(Of String) = DeduplicateJavaArguments(SplitJavaArguments(Arg).ToList, False) + + '额外传入的参数 + Args.AddRange(CurrentLaunchOptions.ExtraGameArgs) + + '全屏 + If Settings.Get("LaunchArgumentWindowType") = 0 Then Args.Add("--fullscreen") + + '自动进入服务器 + Dim Server As String = If(String.IsNullOrEmpty(CurrentLaunchOptions.ServerIp), Settings.Get("VersionServerEnter", McInstanceSelected), CurrentLaunchOptions.ServerIp) + If Server.Any Then If McInstanceSelected.ReleaseTime > New Date(2023, 4, 4) Then 'QuickPlay - FinalArguments += $" --quickPlayMultiplayer ""{Server}""" + Args.Add($"--quickPlayMultiplayer") : Args.Add(Server) Else '老版本 If Server.Contains(":") Then '包含端口号 - FinalArguments += $" --server {Server.Split(":")(0)} --port {Server.Split(":")(1)}" + Args.Add("--server") : Args.Add(Server.Split(":")(0)) + Args.Add("--port") : Args.Add(Server.Split(":")(1)) Else '不包含端口号 - FinalArguments += $" --server {Server} --port 25565" + Args.Add("--server") : Args.Add(Server) + Args.Add("--port") : Args.Add("25565") End If If McInstanceSelected.Version.HasOptiFine Then Hint("OptiFine 与自动进入服务器可能不兼容,有概率导致材质丢失甚至游戏崩溃!", HintType.Red) End If End If - '输出 - McLaunchLog("Minecraft 启动参数:") - McLaunchLog(FinalArguments) - McLaunchArgument = FinalArguments - End Sub - 'Jvm 部分(第一段) - Private Function McLaunchArgumentsJvmOld(Instance As McInstance) As String - '存储以空格为间隔的启动参数列表 - Dim DataList As New List(Of String) - - '输出固定参数 - DataList.Add("-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump") - Dim ArgumentJvm As String = Setup.Get("VersionAdvanceJvm", Instance:=McInstanceSelected) - 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, ArgumentReplace(ArgumentJvm)) '可变 JVM 参数 - DataList.Add("-Xmn" & Math.Floor(PageInstanceSetup.GetRam(McInstanceSelected, Not McLaunchJavaSelected.Is64Bit) * 1024 * 0.15) & "m") - DataList.Add("-Xmx" & Math.Floor(PageInstanceSetup.GetRam(McInstanceSelected, Not McLaunchJavaSelected.Is64Bit) * 1024) & "m") - DataList.Add("""-Djava.library.path=" & GetNativesFolder() & """") - DataList.Add("-cp ${classpath}") '把支持库添加进启动参数表 - - '统一通行证 - If McLoginLoader.Output.Type = "Nide" Then - DataList.Insert(0, "-Dnide8auth.client=true -javaagent:""" & PathAppdata & "nide8auth.jar""=" & Setup.Get("VersionServerNide", Instance:=McInstanceSelected)) - End If - 'Authlib-Injector - If McLoginLoader.Output.Type = "Auth" Then - If McLaunchJavaSelected.MajorVersion >= 6 Then DataList.Add("-Djavax.net.ssl.trustStoreType=WINDOWS-ROOT") '信任系统根证书(5252#) - Dim Server As String = Setup.Get("VersionServerAuthServer", McInstanceSelected) - Try - Dim Response As String = NetRequestByClientRetry(Server, Encoding:=Encoding.UTF8) - DataList.Insert(0, "-javaagent:""" & PathPure & "authlib-injector.jar""=" & Server & - " -Dauthlibinjector.side=client" & - " -Dauthlibinjector.yggdrasil.prefetched=" & Convert.ToBase64String(Encoding.UTF8.GetBytes(Response))) - Catch ex As Exception - Throw New Exception("无法连接到第三方登录服务器(" & If(Server, Nothing) & ")", ex) - End Try - End If - - '添加 Java Wrapper 作为主 Jar - If Not Setup.Get("LaunchAdvanceDisableJLW") AndAlso Not Setup.Get("VersionAdvanceDisableJLW", McInstanceSelected) Then - If McLaunchJavaSelected.MajorVersion >= 9 Then DataList.Add("--add-exports cpw.mods.bootstraplauncher/cpw.mods.bootstraplauncher=ALL-UNNAMED") - DataList.Add("-Doolloo.jlw.tmpdir=""" & PathPure.TrimEnd("\") & """") - DataList.Add("-jar """ & ExtractJavaWrapper() & """") - End If - - '添加 MainClass - If Instance.JsonObject("mainClass") Is Nothing Then - Throw New Exception("版本 json 中没有 mainClass 项!") - Else - DataList.Add(Instance.JsonObject("mainClass")) - End If - - '处理 DataList 的换行符 - DataList = DataList.Select(Function(d) d.Replace(vbCrLf, vbCr).Replace(vbLf, vbCr).Replace(vbCr, " ").Trim).ToList - - Return Join(DataList, " ") + '再次去重并输出 + Return DeduplicateJavaArguments(Args, False) End Function - Private Function McLaunchArgumentsJvmNew(Instance As McInstance) As String - Dim DataList As New List(Of String) - - '获取 Json 中的 DataList - Dim CurrentInstance As McInstance = Instance -NextInstance: - If CurrentInstance.JsonObject("arguments") IsNot Nothing AndAlso CurrentInstance.JsonObject("arguments")("jvm") IsNot Nothing Then - For Each SubJson As JToken In CurrentInstance.JsonObject("arguments")("jvm") - If SubJson.Type = JTokenType.String Then - '字符串类型 - DataList.Add(SubJson.ToString) - Else - '非字符串类型 - If McJsonRuleCheck(SubJson("rules")) Then - '满足准则 - If SubJson("value").Type = JTokenType.String Then - DataList.Add(SubJson("value").ToString) - Else - For Each value As JToken In SubJson("value") - DataList.Add(value.ToString) - Next - End If - End If - End If - Next - End If - If CurrentInstance.InheritName <> "" Then - CurrentInstance = New McInstance(CurrentInstance.InheritName) - GoTo NextInstance - End If - - '内存、Log4j 防御参数等 - SecretLaunchJvmArgs(DataList) - - '统一通行证 - If McLoginLoader.Output.Type = "Nide" Then - DataList.Insert(0, "-javaagent:""" & PathAppdata & "nide8auth.jar""=" & Setup.Get("VersionServerNide", Instance:=McInstanceSelected)) - End If - 'Authlib-Injector - If McLoginLoader.Output.Type = "Auth" Then - If McLaunchJavaSelected.MajorVersion >= 6 Then DataList.Add("-Djavax.net.ssl.trustStoreType=WINDOWS-ROOT") '信任系统根证书(5252#) - Dim Server As String = Setup.Get("VersionServerAuthServer", Instance:=McInstanceSelected) - Try - Dim Response As String = NetRequestByClientRetry(Server, Encoding:=Encoding.UTF8) - DataList.Insert(0, "-javaagent:""" & PathPure & "authlib-injector.jar""=" & Server & - " -Dauthlibinjector.side=client" & - " -Dauthlibinjector.yggdrasil.prefetched=" & Convert.ToBase64String(Encoding.UTF8.GetBytes(Response))) - Catch ex As Exception - Throw New Exception("无法连接到第三方登录服务器(" & If(Server, Nothing) & ")", ex) - End Try - End If - - '添加 Java Wrapper 作为主 Jar - If Not Setup.Get("LaunchAdvanceDisableJLW") AndAlso Not Setup.Get("VersionAdvanceDisableJLW", McInstanceSelected) Then - If McLaunchJavaSelected.MajorVersion >= 9 Then DataList.Add("--add-exports cpw.mods.bootstraplauncher/cpw.mods.bootstraplauncher=ALL-UNNAMED") - DataList.Add("-Doolloo.jlw.tmpdir=""" & PathPure.TrimEnd("\") & """") - DataList.Add("-jar """ & ExtractJavaWrapper() & """") - End If - - '将 "-XXX" 与后面 "XXX" 合并到一起 - '如果不合并,会导致 Forge 1.17 启动无效,它有两个 --add-exports,进一步导致其中一个在后面被去重 - Dim DeDuplicateDataList As New List(Of String) - For i = 0 To DataList.Count - 1 - Dim CurrentEntry As String = DataList(i).Replace(vbCrLf, vbCr).Replace(vbLf, vbCr).Replace(vbCr, " ").Trim - If DataList(i).StartsWithF("-") Then - Do While i < DataList.Count - 1 - If DataList(i + 1).StartsWithF("-") Then - Exit Do - Else - i += 1 - CurrentEntry += " " + DataList(i) - End If - Loop - End If - DeDuplicateDataList.Add(CurrentEntry.Trim.Replace("McEmu= ", "McEmu=")) - Next - - '去重 - DeDuplicateDataList.Remove("-XX:MaxDirectMemorySize=256M") '#3511 的清理 - Dim Result As String = DeDuplicateDataList.Distinct.Join(" ") - - '添加 MainClass - If Instance.JsonObject("mainClass") Is Nothing Then - Throw New Exception("版本 json 中没有 mainClass 项!") - Else - Result += " " & Instance.JsonObject("mainClass").ToString - End If - - Return Result - End Function - - 'Game 部分(第二段) - Private Function McLaunchArgumentsGameOld(Instance As McInstance) As String - Dim DataList As New List(Of String) - - '本地化 Minecraft 启动信息 - Dim BasicString As String = Instance.JsonObject("minecraftArguments").ToString - If Not BasicString.Contains("--height") Then BasicString += " --height ${resolution_height} --width ${resolution_width}" - DataList.Add(BasicString) - - Dim Result As String = DataList.Join(" ") - - '特别改变 OptiFineTweaker - If (Instance.Version.HasForge OrElse Instance.Version.HasLiteLoader) AndAlso Instance.Version.HasOptiFine Then - '把 OptiFineForgeTweaker 放在最后,不然会导致崩溃! - If Result.Contains("--tweakClass optifine.OptiFineForgeTweaker") Then - Log("[Launch] 发现正确的 OptiFineForge TweakClass,目前参数:" & Result) - Result = Result.Replace(" --tweakClass optifine.OptiFineForgeTweaker", "").Replace("--tweakClass optifine.OptiFineForgeTweaker ", "") & " --tweakClass optifine.OptiFineForgeTweaker" - End If - If Result.Contains("--tweakClass optifine.OptiFineTweaker") Then - Log("[Launch] 发现错误的 OptiFineForge TweakClass,目前参数:" & Result) - Result = Result.Replace(" --tweakClass optifine.OptiFineTweaker", "").Replace("--tweakClass optifine.OptiFineTweaker ", "") & " --tweakClass optifine.OptiFineForgeTweaker" - Try - WriteFile(Instance.PathVersion & Instance.Name & ".json", ReadFile(Instance.PathVersion & Instance.Name & ".json").Replace("optifine.OptiFineTweaker", "optifine.OptiFineForgeTweaker")) - Catch ex As Exception - Log(ex, "替换 OptiFineForge TweakClass 失败") - End Try - End If - End If - - Return Result - End Function - Private Function McLaunchArgumentsGameNew(Instance As McInstance) As String - Dim DataList As New List(Of String) - - '获取 Json 中的 DataList - Dim CurrentInstance As McInstance = Instance -NextInstance: - If CurrentInstance.JsonObject("arguments") IsNot Nothing AndAlso CurrentInstance.JsonObject("arguments")("game") IsNot Nothing Then - For Each SubJson As JToken In CurrentInstance.JsonObject("arguments")("game") - If SubJson.Type = JTokenType.String Then - '字符串类型 - DataList.Add(SubJson.ToString) - Else - '非字符串类型 - If McJsonRuleCheck(SubJson("rules")) Then - '满足准则 - If SubJson("value").Type = JTokenType.String Then - DataList.Add(SubJson("value").ToString) - Else - For Each value As JToken In SubJson("value") - DataList.Add(value.ToString) - Next - End If - End If - End If - Next - End If - If CurrentInstance.InheritName <> "" Then - CurrentInstance = New McInstance(CurrentInstance.InheritName) - GoTo NextInstance - End If - - '将 "-XXX" 与后面 "XXX" 合并到一起 - '如果不进行合并 Impact 会启动无效,它有两个 --tweakclass - Dim DeDuplicateDataList As New List(Of String) - For i = 0 To DataList.Count - 1 - Dim CurrentEntry As String = DataList(i) - If DataList(i).StartsWithF("-") Then - Do While i < DataList.Count - 1 - If DataList(i + 1).StartsWithF("-") Then - Exit Do - Else - i += 1 - CurrentEntry += " " + DataList(i) - End If - Loop - End If - DeDuplicateDataList.Add(CurrentEntry) - Next - '去重 - McLaunchArgumentsGameNew = Join(DeDuplicateDataList.Distinct.ToList, " ") - - '特别改变 OptiFineTweaker - If (Instance.Version.HasForge OrElse Instance.Version.HasLiteLoader) AndAlso Instance.Version.HasOptiFine Then - '把 OptiFineForgeTweaker 放在最后,不然会导致崩溃! - If McLaunchArgumentsGameNew.Contains("--tweakClass optifine.OptiFineForgeTweaker") Then - Log("[Launch] 发现正确的 OptiFineForge TweakClass,目前参数:" & McLaunchArgumentsGameNew) - McLaunchArgumentsGameNew = McLaunchArgumentsGameNew.Replace(" --tweakClass optifine.OptiFineForgeTweaker", "").Replace("--tweakClass optifine.OptiFineForgeTweaker ", "") & " --tweakClass optifine.OptiFineForgeTweaker" - End If - If McLaunchArgumentsGameNew.Contains("--tweakClass optifine.OptiFineTweaker") Then - Log("[Launch] 发现错误的 OptiFineForge TweakClass,目前参数:" & McLaunchArgumentsGameNew) - McLaunchArgumentsGameNew = McLaunchArgumentsGameNew.Replace(" --tweakClass optifine.OptiFineTweaker", "").Replace("--tweakClass optifine.OptiFineTweaker ", "") & " --tweakClass optifine.OptiFineForgeTweaker" - Try - WriteFile(Instance.PathVersion & Instance.Name & ".json", ReadFile(Instance.PathVersion & Instance.Name & ".json").Replace("optifine.OptiFineTweaker", "optifine.OptiFineForgeTweaker")) - Catch ex As Exception - Log(ex, "替换 OptiFineForge TweakClass 失败") - End Try - End If - End If - End Function - - '替换 Arguments - Private Function McLaunchArgumentsReplace(Instance As McInstance, ByRef Loader As LoaderTask(Of String, List(Of McLibToken))) As Dictionary(Of String, String) - Dim GameArguments As New Dictionary(Of String, String) - + '获取替换标记 + Private Iterator Function McLaunchArgumentsReplace(Arguments As List(Of String)) As IEnumerable(Of (Key As String, Value As String)) '基础参数 - GameArguments.Add("${classpath_separator}", ";") - GameArguments.Add("${natives_directory}", ShortenPath(GetNativesFolder())) - GameArguments.Add("${library_directory}", ShortenPath(McFolderSelected & "libraries")) - GameArguments.Add("${libraries_directory}", ShortenPath(McFolderSelected & "libraries")) - GameArguments.Add("${launcher_name}", "PCL") - GameArguments.Add("${launcher_version}", VersionCode) - GameArguments.Add("${version_name}", Instance.Name) - Dim ArgumentInfo As String = Setup.Get("VersionArgumentInfo", Instance:=McInstanceSelected) - GameArguments.Add("${version_type}", ArgumentReplace(If(ArgumentInfo = "", Setup.Get("LaunchArgumentInfo"), ArgumentInfo))) - GameArguments.Add("${game_directory}", ShortenPath(Left(McInstanceSelected.PathIndie, McInstanceSelected.PathIndie.Count - 1))) - GameArguments.Add("${assets_root}", ShortenPath(McFolderSelected & "assets")) - GameArguments.Add("${user_properties}", "{}") - GameArguments.Add("${auth_player_name}", McLoginLoader.Output.Name) - GameArguments.Add("${auth_uuid}", McLoginLoader.Output.Uuid) - GameArguments.Add("${auth_access_token}", McLoginLoader.Output.AccessToken) - GameArguments.Add("${access_token}", McLoginLoader.Output.AccessToken) - GameArguments.Add("${auth_session}", McLoginLoader.Output.AccessToken) - GameArguments.Add("${user_type}", "msa") '#1221 - GameArguments.Add("${primary_jar}", ShortenPath(Instance.PathVersion & Instance.Name & ".jar")) '#6942 + Yield ("${classpath_separator}", ";") + Yield ("${natives_directory}", ShortenPath(GetNativesFolder())) + Yield ("${library_directory}", ShortenPath(McFolderSelected & "libraries")) + Yield ("${libraries_directory}", ShortenPath(McFolderSelected & "libraries")) + Yield ("${pure_directory}", PathPure.TrimEnd("\"c)) '由 PCL 添加,这会允许在分割参数并去重后再替换路径,防止路径中的特殊字符影响参数分割和去重 + Yield ("${launcher_name}", "PCL") + Yield ("${launcher_version}", VersionCode) + Yield ("${version_name}", McInstanceSelected.Name) + Yield ("${game_directory}", ShortenPath(Left(McInstanceSelected.PathIndie, McInstanceSelected.PathIndie.Count - 1))) + Yield ("${assets_root}", ShortenPath(McFolderSelected & "assets")) + Yield ("${user_properties}", "{}") + Yield ("${auth_player_name}", McLoginLoader.Output.Name) + Yield ("${auth_uuid}", McLoginLoader.Output.Uuid) + Yield ("${auth_access_token}", McLoginLoader.Output.AccessToken) + Yield ("${access_token}", McLoginLoader.Output.AccessToken) + Yield ("${auth_session}", McLoginLoader.Output.AccessToken) + Yield ("${user_type}", "msa") '#1221 + Yield ("${primary_jar}", ShortenPath(McInstanceSelected.PathVersion & McInstanceSelected.Name & ".jar")) '#6942 + Yield ("${game_assets}", ShortenPath(McFolderSelected & "assets\virtual\legacy")) '1.5.2 的 pre-1.6 资源索引应与 legacy 合并 + Yield ("${assets_index_name}", McAssetsGetIndexName(McInstanceSelected)) - '窗口尺寸参数 - Dim GameSize As Size - Select Case Setup.Get("LaunchArgumentWindowType") + '自定义信息 + Dim ArgumentInfo As String + ArgumentInfo = Settings.Get("VersionArgumentInfo", Instance:=McInstanceSelected) + If ArgumentInfo = "" Then ArgumentInfo = Settings.Get("LaunchArgumentInfo") + If ArgumentInfo = "" Then '若自定义信息为空,则必须从参数中去掉该部分,不然 MC 会显示 ${version_type} 或者一个空字符串 + If Arguments.Contains("--versionType") Then + Dim Index As Integer = Arguments.IndexOf("--versionType") + Arguments.RemoveAt(Index) + If Index < Arguments.Count Then Arguments.RemoveAt(Index) + End If + Yield ("${version_type}", """""") + Else + Yield ("${version_type}", ArgumentReplace(ArgumentInfo)) + End If + + '窗口尺寸 + Dim TargetSize As Size + Select Case Settings.Get("LaunchArgumentWindowType") Case 2 '与启动器尺寸一致 Dim Result As Size RunInUiWait(Sub() Result = New Size(GetPixelSize(FrmMain.PanForm.ActualWidth), GetPixelSize(FrmMain.PanForm.ActualHeight))) - GameSize = Result - GameSize.Height -= 29.5 * DPI / 96 '标题栏高度 + TargetSize = Result + TargetSize.Height -= 29.5 * DPI / 96 '标题栏高度 Case 3 '自定义 - GameSize = New Size(Math.Max(100, Setup.Get("LaunchArgumentWindowWidth")), Math.Max(100, Setup.Get("LaunchArgumentWindowHeight"))) + TargetSize = New Size(Math.Max(100, Settings.Get("LaunchArgumentWindowWidth")), Math.Max(100, Settings.Get("LaunchArgumentWindowHeight"))) Case Else - GameSize = New Size(854, 480) + TargetSize = New Size(854, 480) End Select - '修复 1.12.2- 下 JRE 8u200~321 下窗口大小为设置大小的 DPI% 倍(#3463) If McInstanceSelected.Version.Vanilla.Major <= 12 AndAlso McLaunchJavaSelected.MajorVersion <= 8 AndAlso McLaunchJavaSelected.Version.Revision >= 200 AndAlso McLaunchJavaSelected.Version.Revision <= 321 AndAlso - Not McInstanceSelected.Version.HasOptiFine AndAlso Not McInstanceSelected.Version.HasForge Then + Not McInstanceSelected.Version.HasOptiFine AndAlso Not McInstanceSelected.Version.HasForge Then '修复 1.12.2- 下 JRE 8u200~321 下窗口大小为设置大小的 DPI% 倍(#3463) McLaunchLog($"已应用窗口大小过大修复({McLaunchJavaSelected.Version.Revision})") - GameSize.Width /= DPI / 96 - GameSize.Height /= DPI / 96 + TargetSize.Width /= DPI / 96 + TargetSize.Height /= DPI / 96 End If - GameArguments.Add("${resolution_width}", Math.Round(GameSize.Width)) - GameArguments.Add("${resolution_height}", Math.Round(GameSize.Height)) + Yield ("${resolution_width}", Math.Round(TargetSize.Width)) + Yield ("${resolution_height}", Math.Round(TargetSize.Height)) - 'Assets 相关参数 - GameArguments.Add("${game_assets}", ShortenPath(McFolderSelected & "assets\virtual\legacy")) '1.5.2 的 pre-1.6 资源索引应与 legacy 合并 - GameArguments.Add("${assets_index_name}", McAssetsGetIndexName(Instance)) - - '支持库参数 - Dim LibList As List(Of McLibToken) = McLibListGet(Instance, True) - Loader.Output = LibList - Dim CpStrings As New List(Of String) + '支持库 + Dim Cps As New List(Of String) Dim OptiFineCp As String = Nothing - For Each Library As McLibToken In LibList + For Each Library As McLibToken In McLibListGet(McInstanceSelected, True) If Library.IsNatives Then Continue For If Library.Name IsNot Nothing AndAlso Library.Name = "optifine:OptiFine" Then OptiFineCp = Library.LocalPath Else - CpStrings.Add(Library.LocalPath) + Cps.Add(Library.LocalPath) End If Next - If OptiFineCp IsNot Nothing Then CpStrings.Insert(CpStrings.Count - 2, OptiFineCp) 'OptiFine 的总是需要放到倒数第二位 - GameArguments.Add("${classpath}", Join(CpStrings.Select(Function(c) ShortenPath(c)), ";")) + If OptiFineCp IsNot Nothing Then Cps.Insert(Cps.Count - 2, OptiFineCp) 'OptiFine 的总是需要放到倒数第二位 + Yield ("${classpath}", Cps.Select(Function(c) ShortenPath(c)).Join(";"c)) + End Function - Return GameArguments + ''' + ''' 分割 Java 参数字符串。 + ''' + Private Iterator Function SplitJavaArguments(Arg As String) As IEnumerable(Of String) + Arg = Arg.Replace(vbLf, " ").Replace(vbCr, " ").Trim '预处理换行符 + If String.IsNullOrWhiteSpace(Arg) Then Return + Dim Current As New StringBuilder + Dim InQuotes As Boolean = False + Dim i As Integer = 0 + While i < Arg.Length + Dim c As Char = Arg(i) + If c = "\"c AndAlso i + 1 < Arg.Length AndAlso Arg(i + 1) = """"c Then '检测 \" + '转义的双引号:保留反斜杠和引号,不切换 InQuotes + Current.Append("\""") + i += 1 '额外跳过下一个字符(双引号) + ElseIf c = """"c Then + '未转义的双引号:切换 InQuotes + InQuotes = Not InQuotes + Current.Append(c) + ElseIf c = " "c AndAlso Not InQuotes Then + '不在双引号内的空格:一个参数结束 + If Current.Length > 0 Then + Yield Current.ToString() + Current.Clear() + End If + Else + '普通字符,直接添加 + Current.Append(c) + End If + i += 1 + End While + If Current.Length > 0 Then Yield Current.ToString '添加剩余的 + End Function + ''' + ''' 对 Java 参数进行去重。 + ''' + Private Function DeduplicateJavaArguments(Args As List(Of String), IsJVMArgs As Boolean) As List(Of String) + Dim Result As New List(Of String) + Dim i As Integer = 0 + While i < Args.Count + Dim Key As String = Args(i) + If Not Key.StartsWithF("-") OrElse + (i + 1 >= Args.Count OrElse (Args(i + 1).StartsWithF("-") AndAlso Val(Args(i + 1).AfterFirst("-")) = 0)) Then '避免 -xPos 23 -xPos -50 中后面的 -50 被识别为参数 + '单参数 + i += 1 + If Result.Contains(Key) Then + McLaunchLog($"已去重单个{If(IsJVMArgs, " JVM ", "游戏")}参数:{Key}") + Continue While + End If + Result.Add(Key) + Else + '以空格间隔的键值对(例如 --width 233) + Dim Value As String = Args(i + 1) + i += 2 + For j = 0 To Result.Count - 2 '向前寻找相同的键 + If Result(j) <> Key Then Continue For + '仅当是游戏参数且不是 tweakClass 时,用新的值覆盖旧的值 + '据测试,如果包含多个相同 --width 或 --uuid 等参数,两个都会直接失效,如果这发生在关键参数上会导致崩溃 + If Not IsJVMArgs AndAlso Key <> "--tweakClass" Then + McLaunchLog($"已覆盖重复的{If(IsJVMArgs, " JVM ", "游戏")}参数:{Key} {Result(j + 1)} → {Key} {Value}") + Result(j + 1) = Value + Continue While + End If + '键和值完全相同,直接抛弃 + If Result(j + 1) = Value Then + McLaunchLog($"已去重{If(IsJVMArgs, " JVM ", "游戏")}参数对:{Key} {Value}") + Continue While + End If + Next + Result.Add(Key) + Result.Add(Value) + End If + End While + Return Result End Function #End Region #Region "解压 Natives" - Private Sub McLaunchNatives(Loader As LoaderTask(Of List(Of McLibToken), Integer)) + Private Sub McLaunchNatives(Loader As LoaderTask(Of Integer, Integer)) '创建文件夹 Dim Target As String = GetNativesFolder() & "\" @@ -1772,7 +1789,7 @@ NextInstance: '解压文件 McLaunchLog("正在解压 Natives 文件") Dim ExistFiles As New List(Of String) - For Each Native As McLibToken In Loader.Input + For Each Native As McLibToken In McLibListGet(McInstanceSelected, True) If Not Native.IsNatives Then Continue For Dim Zip As ZipArchive Try @@ -1829,7 +1846,7 @@ NextInstance: ''' 获取 Natives 文件夹路径,不以 \ 结尾。 ''' Private Function GetNativesFolder() As String - Dim Result As String = McInstanceSelected.PathVersion & McInstanceSelected.Name & "-natives" + Dim Result As String = ShortenPath(McInstanceSelected.PathVersion) & McInstanceSelected.Name & "-natives" If Not (IsGBKEncoding OrElse Result.IsASCII()) Then Result = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\.minecraft\bin\natives" If Not Result.IsASCII() Then @@ -1847,7 +1864,7 @@ NextInstance: Private Sub McLaunchPrerun() '使用高性能显卡 - If Setup.Get("LaunchAdvanceGraphicCard") Then + If Settings.Get("LaunchAdvanceGraphicCard") Then Try SetGPUPreference(McLaunchJavaSelected.PathJava) SetGPUPreference(PathWithName) @@ -1954,10 +1971,10 @@ NextInstance: '1.13+ :zh_cn 时正常,zh_CN 时自动切换为英文 Dim CurrentLang As String = ReadIni(SetupFileAddress, "lang", "none") Dim RequiredLang As String = If(CurrentLang = "none" OrElse Not Directory.Exists(McInstanceSelected.PathIndie & "saves"), '#3844,整合包可能已经自带了 options.txt - If(Setup.Get("ToolHelpChinese"), "zh_cn", "en_us"), CurrentLang.ToLower) + If(Settings.Get("ToolHelpChinese"), "zh_cn", "en_us"), CurrentLang.Lower) If Not McInstanceSelected.Version.Vaild OrElse McInstanceSelected.Version.Vanilla.Major <= 10 Then '将最后两位改为大写,前面的部分保留 - RequiredLang = RequiredLang.Substring(0, RequiredLang.Length - 2) & RequiredLang.Substring(RequiredLang.Length - 2).ToUpper + RequiredLang = RequiredLang.Substring(0, RequiredLang.Length - 2) & RequiredLang.Substring(RequiredLang.Length - 2).Upper End If If CurrentLang = RequiredLang Then McLaunchLog($"需要的语言为 {RequiredLang},当前语言为 {CurrentLang},无需修改") @@ -1967,12 +1984,12 @@ NextInstance: McLaunchLog($"已将语言从 {CurrentLang} 修改为 {RequiredLang}") End If ''如果是初次设置,一并修改 forceUnicodeFont - 'If Setup.Get("ToolHelpChinese") AndAlso (CurrentLang = "none" OrElse Not Directory.Exists(McInstanceSelected.PathIndie & "saves")) Then + 'If Settings.Get("ToolHelpChinese") AndAlso (CurrentLang = "none" OrElse Not Directory.Exists(McInstanceSelected.PathIndie & "saves")) Then ' WriteIni(SetupFileAddress, "forceUnicodeFont", "true") ' McLaunchLog("已开启 forceUnicodeFont") 'End If '窗口 - Select Case Setup.Get("LaunchArgumentWindowType") + Select Case Settings.Get("LaunchArgumentWindowType") Case 0 '全屏 WriteIni(SetupFileAddress, "fullscreen", "true") Case 1 '默认 @@ -1986,8 +2003,8 @@ NextInstance: '离线皮肤 Alex 警告 If McInstanceSelected.Version.Vanilla.Major <= 7 AndAlso McInstanceSelected.Version.Vanilla.Major >= 2 AndAlso '1.2 ~ 1.7 McLoginLoader.Input.Type = McLoginType.Legacy AndAlso '离线登录 - (Setup.Get("LaunchSkinType") = 2 OrElse '强制 Alex - (Setup.Get("LaunchSkinType") = 4 AndAlso Setup.Get("LaunchSkinSlim"))) Then '或选用 Alex 皮肤 + (Settings.Get("LaunchSkinType") = 2 OrElse '强制 Alex + (Settings.Get("LaunchSkinType") = 4 AndAlso Settings.Get("LaunchSkinSlim"))) Then '或选用 Alex 皮肤 Hint("此 Minecraft 版本尚不支持 Alex 皮肤,你的皮肤可能会显示为 Steve!", HintType.Red) End If @@ -1996,7 +2013,7 @@ NextInstance: Directory.CreateDirectory(McInstanceSelected.PathIndie & "resourcepacks\") Dim ZipFileAddress As String = McInstanceSelected.PathIndie & "resourcepacks\PCL2 Skin.zip" Dim NewTypeSetup As Boolean = McInstanceSelected.Version.Vanilla.Major >= 13 OrElse McInstanceSelected.Version.Vanilla.Major < 6 - If McLoginLoader.Input.Type = McLoginType.Legacy AndAlso Setup.Get("LaunchSkinType") = 4 AndAlso File.Exists(PathAppdata & "CustomSkin.png") Then + If McLoginLoader.Input.Type = McLoginType.Legacy AndAlso Settings.Get("LaunchSkinType") = 4 AndAlso File.Exists(PathAppdata & "CustomSkin.png") Then Directory.CreateDirectory(PathTemp) Dim MetaFileAddress As String = PathTemp & "pack.mcmeta" Dim PackPicAddress As String = PathTemp & "pack.png" @@ -2062,10 +2079,10 @@ NextInstance: If McInstanceSelected.Version.Vanilla >= New Version(19, 0, 3) Then For Each SkinName In {"alex", "ari", "efe", "kai", "makena", "noor", "steve", "sunny", "zuri"} ZipAr.CreateEntryFromFile(Path & "PCL\CustomSkin_Cliped.png", - $"assets/minecraft/textures/entity/player/{If(Setup.Get("LaunchSkinSlim"), "slim", "wide")}/{SkinName}.png") + $"assets/minecraft/textures/entity/player/{If(Settings.Get("LaunchSkinSlim"), "slim", "wide")}/{SkinName}.png") Next Else - ZipAr.CreateEntryFromFile(Path & "PCL\CustomSkin_Cliped.png", "assets/minecraft/textures/entity/" & If(Setup.Get("LaunchSkinSlim"), "alex.png", "steve.png")) + ZipAr.CreateEntryFromFile(Path & "PCL\CustomSkin_Cliped.png", "assets/minecraft/textures/entity/" & If(Settings.Get("LaunchSkinSlim"), "alex.png", "steve.png")) End If End Using End Using @@ -2081,7 +2098,7 @@ NextInstance: If Res <> """file/PCL2 Skin.zip""" AndAlso Res <> "" Then NewResourcePacks.Add(Res) Next NewResourcePacks.Add("""file/PCL2 Skin.zip""") - Dim Result As String = "[" & Join(NewResourcePacks, ",") & "]" + Dim Result As String = "[" & NewResourcePacks.Join(","c) & "]" WriteIni(SetupFileAddress, "resourcePacks", Result) Else Dim EnabledResourcePacks As New List(Of String)(EnabledResourcePack.Split(",")) @@ -2090,7 +2107,7 @@ NextInstance: If Res <> """PCL2 Skin.zip""" AndAlso Res <> "" Then NewResourcePacks.Add(Res) Next NewResourcePacks.Add("""PCL2 Skin.zip""") - Dim Result As String = "[" & Join(NewResourcePacks, ",") & "]" + Dim Result As String = "[" & NewResourcePacks.Join(","c) & "]" WriteIni(SetupFileAddress, "resourcePacks", Result) End If IgnoreCustomSkin: @@ -2105,12 +2122,12 @@ IgnoreCustomSkin: If EnabledResourcePack = "" Then EnabledResourcePack = """vanilla""" Dim EnabledResourcePacks As New List(Of String)(EnabledResourcePack.Split(",")) EnabledResourcePacks.Remove("""file/PCL2 Skin.zip""") - Dim Result As String = "[" & Join(EnabledResourcePacks, ",") & "]" + Dim Result As String = "[" & EnabledResourcePacks.Join(","c) & "]" WriteIni(SetupFileAddress, "resourcePacks", Result) Else Dim EnabledResourcePacks As New List(Of String)(EnabledResourcePack.Split(",")) EnabledResourcePacks.Remove("""PCL2 Skin.zip""") - Dim Result As String = "[" & Join(EnabledResourcePacks, ",") & "]" + Dim Result As String = "[" & EnabledResourcePacks.Join(","c) & "]" WriteIni(SetupFileAddress, "resourcePacks", Result) End If End If @@ -2122,9 +2139,9 @@ IgnoreCustomSkin: Private Sub McLaunchCustom(Loader As LoaderTask(Of Integer, Integer)) '获取自定义命令 - Dim CustomCommandGlobal As String = Setup.Get("LaunchAdvanceRun") + Dim CustomCommandGlobal As String = Settings.Get("LaunchAdvanceRun") If CustomCommandGlobal <> "" Then CustomCommandGlobal = ArgumentReplace(CustomCommandGlobal) - Dim CustomCommandVersion As String = Setup.Get("VersionAdvanceRun", Instance:=McInstanceSelected) + Dim CustomCommandVersion As String = Settings.Get("VersionAdvanceRun", Instance:=McInstanceSelected) If CustomCommandVersion <> "" Then CustomCommandVersion = ArgumentReplace(CustomCommandVersion) '输出 bat @@ -2144,9 +2161,9 @@ IgnoreCustomSkin: Encoding:=If(McLaunchJavaSelected.MajorVersion > 8, Encoding.UTF8, Encoding.Default)) If CurrentLaunchOptions.SaveBatch IsNot Nothing Then McLaunchLog("导出启动脚本完成,强制结束启动过程") - AbortHint = "导出启动脚本成功!" + InterruptHint = "导出启动脚本成功!" OpenExplorer(CurrentLaunchOptions.SaveBatch) - Loader.Parent.Abort() + Loader.Parent.Interrupt() Return '导出脚本完成 End If Catch ex As Exception @@ -2166,15 +2183,15 @@ IgnoreCustomSkin: .UseShellExecute = False, .CreateNoWindow = True }) - If Setup.Get("LaunchAdvanceRunWait") Then - Do Until CustomProcess.HasExited OrElse Loader.IsAborted + If Settings.Get("LaunchAdvanceRunWait") Then + Do Until CustomProcess.HasExited OrElse Loader.IsInterrupted Thread.Sleep(10) Loop End If Catch ex As Exception Log(ex, "执行全局自定义命令失败", LogLevel.Hint) Finally - If CustomProcess IsNot Nothing AndAlso Not CustomProcess.HasExited AndAlso Loader.IsAborted Then + If CustomProcess IsNot Nothing AndAlso Not CustomProcess.HasExited AndAlso Loader.IsInterrupted Then McLaunchLog("由于取消启动,已强制结束自定义命令 CMD 进程") '#1183 CustomProcess.Kill() End If @@ -2191,15 +2208,15 @@ IgnoreCustomSkin: .UseShellExecute = False, .CreateNoWindow = True }) - If Setup.Get("VersionAdvanceRunWait", Instance:=McInstanceSelected) Then - Do Until CustomProcess.HasExited OrElse Loader.IsAborted + If Settings.Get("VersionAdvanceRunWait", Instance:=McInstanceSelected) Then + Do Until CustomProcess.HasExited OrElse Loader.IsInterrupted Thread.Sleep(10) Loop End If Catch ex As Exception Log(ex, "执行版本自定义命令失败", LogLevel.Hint) Finally - If CustomProcess IsNot Nothing AndAlso Not CustomProcess.HasExited AndAlso Loader.IsAborted Then + If CustomProcess IsNot Nothing AndAlso Not CustomProcess.HasExited AndAlso Loader.IsInterrupted Then McLaunchLog("由于取消启动,已强制结束自定义命令 CMD 进程") '#1183 CustomProcess.Kill() End If @@ -2217,7 +2234,7 @@ IgnoreCustomSkin: Dim Paths As New List(Of String) If Not String.IsNullOrEmpty(PathEnv) Then Paths.AddRange(PathEnv.Split(";")) Paths.Add(ShortenPath(McLaunchJavaSelected.PathFolder)) - StartInfo.EnvironmentVariables("Path") = Join(Paths.Distinct.ToList, ";") + StartInfo.EnvironmentVariables("Path") = Paths.Distinct.Join(";"c) StartInfo.EnvironmentVariables("appdata") = ShortenPath(McFolderSelected) '设置其他参数 @@ -2231,7 +2248,7 @@ IgnoreCustomSkin: '开始进程 Dim GameProcess = StartProcess(StartInfo) McLaunchLog("已启动游戏进程:" & McLaunchJavaSelected.PathJava) - If Loader.IsAborted Then + If Loader.IsInterrupted Then McLaunchLog("由于取消启动,已强制结束游戏进程") '#1631 GameProcess.Kill() Return @@ -2242,7 +2259,7 @@ IgnoreCustomSkin: '进程优先级处理 Try GameProcess.PriorityBoostEnabled = True - Select Case Setup.Get("LaunchArgumentPriority") + Select Case Settings.Get("LaunchArgumentPriority") Case 0 '高 GameProcess.PriorityClass = ProcessPriorityClass.AboveNormal Case 2 '低 @@ -2281,8 +2298,8 @@ IgnoreCustomSkin: McLaunchLog("") '获取窗口标题 - Dim WindowTitle As String = Setup.Get("VersionArgumentTitle", Instance:=McInstanceSelected) - If WindowTitle = "" Then WindowTitle = Setup.Get("LaunchArgumentTitle") + Dim WindowTitle As String = Settings.Get("VersionArgumentTitle", Instance:=McInstanceSelected) + If WindowTitle = "" Then WindowTitle = Settings.Get("LaunchArgumentTitle") WindowTitle = ArgumentReplace(WindowTitle, ReplaceTime:=False) '初始化等待 @@ -2302,15 +2319,15 @@ IgnoreCustomSkin: McLaunchLog("开始启动结束处理") '暂停或开始音乐播放 - If Setup.Get("UiMusicStop") Then + If Settings.Get("UiMusicStop") Then RunInUi(Sub() If MusicPause() Then Log("[Music] 已根据设置,在启动后暂停音乐播放")) - ElseIf Setup.Get("UiMusicStart") Then + ElseIf Settings.Get("UiMusicStart") Then RunInUi(Sub() If MusicResume() Then Log("[Music] 已根据设置,在启动后开始音乐播放")) End If '启动器可见性 - McLaunchLog("启动器可见性:" & Setup.Get("LaunchArgumentVisible")) - Select Case Setup.Get("LaunchArgumentVisible") + McLaunchLog("启动器可见性:" & Settings.Get("LaunchArgumentVisible")) + Select Case Settings.Get("LaunchArgumentVisible") Case 0 '直接关闭 McLaunchLog("已根据设置,在启动后关闭启动器") @@ -2328,7 +2345,7 @@ IgnoreCustomSkin: End Select '启动计数 - Setup.Set("SystemLaunchCount", Setup.Get("SystemLaunchCount") + 1) + Settings.Set("SystemLaunchCount", Settings.Get("SystemLaunchCount") + 1) End Sub diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb index a0ea8b1..5d5ba60 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb @@ -5,9 +5,24 @@ Public Module ModMinecraft #Region "文件夹" ''' - ''' 当前的 Minecraft 文件夹路径,以“\”结尾。 + ''' 当前的 Minecraft 文件夹路径,以 \ 结尾。 ''' - Public McFolderSelected As String + Public Property McFolderSelected As String + Get + If _McFolderSelected Is Nothing Then SetMcFolder(Settings.Get("LaunchFolderSelect")) '不能使用 McFolderSelected 触发 Set,这会被视为为 Get 设置返回值 + Return _McFolderSelected + End Get + Set(Value As String) + SetMcFolder(Value) + End Set + End Property + Private Sub SetMcFolder(Value As String) '等同 McFolderSelected.Set + If _McFolderSelected = Value Then Return + _McFolderSelected = Value.Replace("$", Path) + Settings.Set("LaunchFolderSelect", Value.Replace(Path, "$")) + Log("[Minecraft] 当前选择的 Minecraft 文件夹:" & _McFolderSelected) + End Sub + Private _McFolderSelected As String ''' ''' 当前的 Minecraft 文件夹列表。 ''' @@ -22,15 +37,15 @@ Public Module ModMinecraft Public Location As String Public Type As Types Public Enum Types - Original - RenamedOriginal + Vanilla + RenamedVanilla Custom End Enum Public Overrides Function Equals(obj As Object) As Boolean If Not (TypeOf obj Is McFolder) Then Return False - Dim folder = DirectCast(obj, McFolder) - Return Name = folder.Name AndAlso Location = folder.Location AndAlso Type = folder.Type + Dim Folder = DirectCast(obj, McFolder) + Return Name = Folder.Name AndAlso Location = Folder.Location AndAlso Type = Folder.Type End Function Public Overrides Function ToString() As String Return Location @@ -50,9 +65,9 @@ Public Module ModMinecraft '扫描当前文件夹 Try - If Directory.Exists(Path & "versions\") Then CacheMcFolderList.Add(New McFolder With {.Name = "当前文件夹", .Location = Path, .Type = McFolder.Types.Original}) + If Directory.Exists(Path & "versions\") Then CacheMcFolderList.Add(New McFolder With {.Name = "当前文件夹", .Location = Path, .Type = McFolder.Types.Vanilla}) For Each Folder As DirectoryInfo In New DirectoryInfo(Path).GetDirectories - If Directory.Exists(Folder.FullName & "versions\") OrElse Folder.Name = ".minecraft" Then CacheMcFolderList.Add(New McFolder With {.Name = "当前文件夹", .Location = Folder.FullName & "\", .Type = McFolder.Types.Original}) + If Directory.Exists(Folder.FullName & "versions\") OrElse Folder.Name = ".minecraft" Then CacheMcFolderList.Add(New McFolder With {.Name = "当前文件夹", .Location = Folder.FullName & "\", .Type = McFolder.Types.Vanilla}) Next Catch ex As Exception Log(ex, "扫描 PCL 所在文件夹中是否有 MC 文件夹失败") @@ -62,7 +77,7 @@ Public Module ModMinecraft Dim MojangPath As String = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\.minecraft\" If (Not CacheMcFolderList.Any OrElse MojangPath <> CacheMcFolderList(0).Location) AndAlso '当前文件夹不是官启文件夹 Directory.Exists(MojangPath & "versions\") Then '具有权限且存在 versions 文件夹 - CacheMcFolderList.Add(New McFolder With {.Name = "官方启动器文件夹", .Location = MojangPath, .Type = McFolder.Types.Original}) + CacheMcFolderList.Add(New McFolder With {.Name = "官方启动器文件夹", .Location = MojangPath, .Type = McFolder.Types.Vanilla}) End If #End Region @@ -70,54 +85,51 @@ Public Module ModMinecraft #Region "读取自定义(Custom)文件夹,可能没有结果" '格式:TMZ 12>C://xxx/xx/|Test>D://xxx/xx/|名称>路径 - For Each Folder As String In Setup.Get("LaunchFolders").Split("|") + For Each Folder As String In Settings.Get("LaunchFolders").ToString.Split({"|"c}, StringSplitOptions.RemoveEmptyEntries) If Folder = "" Then Continue For If Not Folder.Contains(">") OrElse Not Folder.EndsWithF("\") Then Hint("无效的 Minecraft 文件夹:" & Folder, HintType.Red) Continue For End If - Dim Name As String = Folder.Split(">")(0) - Dim Path As String = Folder.Split(">")(1) + Dim FolderName As String = Folder.BeforeFirst(">"), FolderPath As String = Folder.AfterFirst(">") Try - CheckPermissionWithException(Path) + CheckPermissionWithException(FolderPath) '若已有该文件夹,则直接重命名;没有则添加 Dim Renamed As Boolean = False For Each OriginalFolder As McFolder In CacheMcFolderList - If OriginalFolder.Location = Path Then - OriginalFolder.Name = Name - OriginalFolder.Type = McFolder.Types.RenamedOriginal + If OriginalFolder.Location = FolderPath Then + OriginalFolder.Name = FolderName + OriginalFolder.Type = McFolder.Types.RenamedVanilla Renamed = True End If Next - If Not Renamed Then CacheMcFolderList.Add(New McFolder With {.Name = Name, .Location = Path, .Type = McFolder.Types.Custom}) + If Not Renamed Then CacheMcFolderList.Add(New McFolder With {.Name = FolderName, .Location = FolderPath, .Type = McFolder.Types.Custom}) Catch ex As Exception - MyMsgBox("失效的 Minecraft 文件夹:" & vbCrLf & Path & vbCrLf & vbCrLf & ex.GetBrief(), "Minecraft 文件夹失效", IsWarn:=True) - Log(ex, $"无法访问 Minecraft 文件夹 {Path}") + MyMsgBox("失效的 Minecraft 文件夹:" & vbCrLf & FolderPath & vbCrLf & vbCrLf & ex.GetBrief(), "Minecraft 文件夹失效", IsWarn:=True) + Log(ex, $"无法访问 Minecraft 文件夹 {FolderPath}") End Try Next '将自定义文件夹情况同步到设置 Dim NewSetup As New List(Of String) For Each Folder As McFolder In CacheMcFolderList - If Not Folder.Type = McFolder.Types.Original Then NewSetup.Add(Folder.Name & ">" & Folder.Location) + If Not Folder.Type = McFolder.Types.Vanilla Then NewSetup.Add(Folder.Name & ">" & Folder.Location) Next If Not NewSetup.Any() Then NewSetup.Add("") '防止 0 元素 Join 返回 Nothing - Setup.Set("LaunchFolders", Join(NewSetup, "|")) + Settings.Set("LaunchFolders", NewSetup.Join("|"c)) #End Region '若没有可用文件夹,则创建 .minecraft If Not CacheMcFolderList.Any() Then Directory.CreateDirectory(Path & ".minecraft\versions\") - CacheMcFolderList.Add(New McFolder With {.Name = "当前文件夹", .Location = Path & ".minecraft\", .Type = McFolder.Types.Original}) + CacheMcFolderList.Add(New McFolder With {.Name = "当前文件夹", .Location = Path & ".minecraft\", .Type = McFolder.Types.Vanilla}) End If For Each Folder As McFolder In CacheMcFolderList -#Region "更新 launcher_profiles.json" McFolderLauncherProfilesJsonCreate(Folder.Location) -#End Region Next - If Setup.Get("SystemDebugDelay") Then Thread.Sleep(RandomInteger(200, 2000)) + If Settings.Get("SystemDebugDelay") Then Thread.Sleep(RandomInteger(200, 2000)) '回设 McFolderList = CacheMcFolderList @@ -158,7 +170,7 @@ Public Module ModMinecraft #Region "版本处理" - Public Const McInstanceCacheVersion As Integer = 33 + Public Const McInstanceCacheVersion As Integer = 35 Private _McInstanceSelected As McInstance ''' @@ -173,30 +185,34 @@ Public Module ModMinecraft If ReferenceEquals(_McInstanceSelectedLast, value) Then Return _McInstanceSelected = value '由于有可能是 Nothing,导致无法初始化,才得这样弄一圈 _McInstanceSelectedLast = value + Settings.MakeInstanceDirty() + '更新 MC 文件夹所选取的 Minecraft 版本 + Log("[Launch] 当前选择的 Minecraft 版本:" & If(value?.PathVersion, "无")) + WriteIni(McFolderSelected & "PCL.ini", "Version", If(value?.Name, "")) If value Is Nothing Then Return '重置缓存的下载文件夹 PageDownloadCompDetail.CachedFolder.Clear() '统一通行证重判 If AniControlEnabled = 0 AndAlso - Setup.Get("VersionServerNide", Instance:=value) <> Setup.Get("CacheNideServer") AndAlso - Setup.Get("VersionServerLogin", Instance:=value) = 3 Then - Setup.Set("CacheNideAccess", "") + Settings.Get("VersionServerNide", Instance:=value) <> Settings.Get("CacheNideServer") AndAlso + Settings.Get("VersionServerLogin", Instance:=value) = 3 Then + Settings.Set("CacheNideAccess", "") Log("[Launch] 服务器改变,要求重新登录统一通行证") End If - If Setup.Get("VersionServerLogin", Instance:=value) = 3 Then - Setup.Set("CacheNideServer", Setup.Get("VersionServerNide", Instance:=value)) + If Settings.Get("VersionServerLogin", Instance:=value) = 3 Then + Settings.Set("CacheNideServer", Settings.Get("VersionServerNide", Instance:=value)) End If 'Authlib-Injector 重判 If AniControlEnabled = 0 AndAlso - Setup.Get("VersionServerAuthServer", Instance:=value) <> Setup.Get("CacheAuthServerServer") AndAlso - Setup.Get("VersionServerLogin", Instance:=value) = 4 Then - Setup.Set("CacheAuthAccess", "") + Settings.Get("VersionServerAuthServer", Instance:=value) <> Settings.Get("CacheAuthServerServer") AndAlso + Settings.Get("VersionServerLogin", Instance:=value) = 4 Then + Settings.Set("CacheAuthAccess", "") Log("[Launch] 服务器改变,要求重新登录 Authlib-Injector") End If - If Setup.Get("VersionServerLogin", Instance:=value) = 4 Then - Setup.Set("CacheAuthServerServer", Setup.Get("VersionServerAuthServer", Instance:=value)) - Setup.Set("CacheAuthServerName", Setup.Get("VersionServerAuthName", Instance:=value)) - Setup.Set("CacheAuthServerRegister", Setup.Get("VersionServerAuthRegister", Instance:=value)) + If Settings.Get("VersionServerLogin", Instance:=value) = 4 Then + Settings.Set("CacheAuthServerServer", Settings.Get("VersionServerAuthServer", Instance:=value)) + Settings.Set("CacheAuthServerName", Settings.Get("VersionServerAuthName", Instance:=value)) + Settings.Set("CacheAuthServerRegister", Settings.Get("VersionServerAuthRegister", Instance:=value)) End If End Set End Property @@ -212,15 +228,15 @@ Public Module ModMinecraft ''' Public ReadOnly Property PathIndie As String Get - If Setup.IsUnset("VersionArgumentIndieV2", Instance:=Me) Then + If Not Settings.HasSaved("VersionArgumentIndieV2", Instance:=Me) Then If Not IsLoaded Then Load() '决定该版本是否应该被隔离 Dim ShouldBeIndie = Function() As Boolean '从老的版本独立设置中迁移:-1 未决定,0 使用全局设置,1 手动开启,2 手动关闭 - If Not Setup.IsUnset("VersionArgumentIndie", Instance:=Me) AndAlso Setup.Get("VersionArgumentIndie", Instance:=Me) > 0 Then + If Settings.HasSaved("VersionArgumentIndie", Instance:=Me) AndAlso Settings.Get("VersionArgumentIndie", Instance:=Me) > 0 Then Log($"[Minecraft] 版本隔离初始化({Name}):从老的版本独立设置中迁移") - Return Setup.Get("VersionArgumentIndie", Instance:=Me) = 1 + Return Settings.Get("VersionArgumentIndie", Instance:=Me) = 1 End If '若版本文件夹下包含 mods 或 saves 文件夹,则自动开启版本隔离 Dim ModFolder As New DirectoryInfo(PathVersion & "mods\") @@ -231,8 +247,8 @@ Public Module ModMinecraft End If '根据全局的默认设置决定是否隔离 Dim IsRelease As Boolean = State <> McInstanceState.Fool AndAlso State <> McInstanceState.Old AndAlso State <> McInstanceState.Snapshot - Log($"[Minecraft] 版本隔离初始化({Name}):从全局默认设置中({Setup.Get("LaunchArgumentIndieV2")})判断,State {GetStringFromEnum(State)},IsRelease {IsRelease},Modable {Modable}") - Select Case Setup.Get("LaunchArgumentIndieV2") + Log($"[Minecraft] 版本隔离初始化({Name}):从全局默认设置中({Settings.Get("LaunchArgumentIndieV2")})判断,State {GetStringFromEnum(State)},IsRelease {IsRelease},Modable {Modable}") + Select Case Settings.Get("LaunchArgumentIndieV2") Case 0 '关闭 Return False Case 1 '仅隔离可安装 Mod 的版本 @@ -245,9 +261,9 @@ Public Module ModMinecraft Return True End Select End Function - Setup.Set("VersionArgumentIndieV2", ShouldBeIndie(), Instance:=Me) + Settings.Set("VersionArgumentIndieV2", ShouldBeIndie(), Instance:=Me) End If - Return If(Setup.Get("VersionArgumentIndieV2", Instance:=Me), PathVersion, McFolderSelected) + Return If(Settings.Get("VersionArgumentIndieV2", Instance:=Me), PathVersion, McFolderSelected) End Get End Property @@ -428,21 +444,7 @@ Public Module ModMinecraft VersionSearchFinish: '获取版本号 _Version.VanillaName = _Version.VanillaName.Replace("_unobfuscated", "").Replace(" Unobfuscated", "") - If _Version.VanillaName.StartsWithF("1.") Then - Dim Segments = _Version.VanillaName.Split(" _-.".ToCharArray) - _Version.Vanilla = New Version( - Val(If(Segments.Count >= 2, Segments(1), "0")), - 0, - Val(If(Segments.Count >= 3, Segments(2), "0"))) - ElseIf RegexCheck(_Version.VanillaName, "^[2-9][0-9]\.") Then - Dim Segments = _Version.VanillaName.Split(" _-.".ToCharArray) - _Version.Vanilla = New Version( - Val(Segments(0)), - Val(If(Segments.Count >= 2, Segments(1), "0")), - Val(If(Segments.Count >= 3, Segments(2), "0"))) - Else - _Version.Vanilla = New Version(9999, 0, 0) - End If + _Version.Vanilla = McVersion.NameToVersion(_Version.VanillaName) Return _Version End Get Set(value As McVersion) @@ -471,6 +473,7 @@ VersionSearchFinish: If Not JsonCandidate.ContainsKey("type") Then Continue For If Not JsonCandidate.ContainsKey("id") Then Continue For Catch + Continue For End Try JsonPath = JsonCandidatePath Exit For @@ -691,7 +694,7 @@ Recheck: End Try '确认 Json 可用性 Try - Dim JsonObjCheck = JsonObject + If JsonObject("mainClass") Is Nothing Then Throw New Exception("版本 JSON 中没有 mainClass 项!") '这里也会触发 JsonObject 的 Get 事件 Catch ex As Exception Log(ex, "版本 JSON 可用性检查失败(" & PathVersion & ")") JsonText = "" @@ -744,7 +747,11 @@ Recheck: Case Else '根据 API 进行筛选 Dim RealJson As String = If(JsonObject, JsonText).ToString '愚人节与快照版本 - If If(JsonObject("type"), "").ToString = "fool" OrElse GetMcFoolName(Version.VanillaName) <> "" Then + Dim FixedReleaseTime = ReleaseTime.ToUniversalTime().AddHours(2) + Dim JsonType = If(JsonObject("type"), "").ToString + If JsonType = "fool" OrElse + (FixedReleaseTime.Month = 4 AndAlso FixedReleaseTime.Day = 1 AndAlso JsonType = "snapshot") OrElse + GetMcFoolName(Version.VanillaName) <> "" Then State = McInstanceState.Fool ElseIf IsSnapshot() Then State = McInstanceState.Snapshot @@ -816,8 +823,8 @@ ExitDataLoad: If State = McInstanceState.Fool Then Info = GetMcFoolName(Version.VanillaName) ElseIf State <> McInstanceState.Error Then - If Setup.Get("VersionServerLogin", Instance:=Me) = 3 Then Info += ", 统一通行证验证" - If Setup.Get("VersionServerLogin", Instance:=Me) = 4 Then Info += ", Authlib 验证" + If Settings.Get("VersionServerLogin", Instance:=Me) = 3 Then Info += ", 统一通行证验证" + If Settings.Get("VersionServerLogin", Instance:=Me) = 4 Then Info += ", Authlib 验证" End If End If '确定版本收藏状态 @@ -913,7 +920,7 @@ ExitDataLoad: End If 'Logo Try - If Logo.EndsWith("PCL\Logo.png") Then + If Logo.EndsWithF("PCL\Logo.png") Then NewItem.Logo = PathVersion & "PCL\Logo.png" '修复老版本中,存储的自定义 Logo 使用完整路径,导致移动后无法加载的 Bug Else NewItem.Logo = Logo @@ -967,7 +974,7 @@ ExitDataLoad: Public VanillaName As String ''' ''' 可比较的三段式原版版本号。 - ''' 对老版本格式,例如 1.20.3,会被转换为 20.0.3。 + ''' 对老版本格式,例如 1.20.1,会被转换为 20.0.1。 ''' 若没有版本号,例如旧快照,则为 9999.0.0。 ''' Public Vanilla As Version @@ -1011,7 +1018,7 @@ ExitDataLoad: Get If String.IsNullOrEmpty(OptiFine) OrElse OptiFine = "未知版本" Then Return 0 '字母编号,如 G2 中的 G(7) - Dim Result As Integer = Asc(OptiFine.ToUpper.First) - Asc("A"c) + 1 + Dim Result As Integer = Asc(OptiFine.Upper.First) - Asc("A"c) + 1 '末尾数字,如 C5 beta4 中的 5 Result *= 100 Result += Val(RegexSeek(Right(OptiFine, OptiFine.Length - 1), "[0-9]+")) @@ -1022,7 +1029,7 @@ ExitDataLoad: If Val(Right(OptiFine, 1)) = 0 AndAlso Right(OptiFine, 1) <> "0" Then Result += 1 '为 pre 或 beta 结尾,视作 1 Else - Result += Val(RegexSeek(OptiFine.ToLower, "(?<=((pre)|(beta)))[0-9]+")) + Result += Val(RegexSeek(OptiFine.Lower, "(?<=((pre)|(beta)))[0-9]+")) End If Else Result += 99 @@ -1054,7 +1061,7 @@ ExitDataLoad: ''' Public Forge As String = "" ''' - ''' NeoForge 版本名,如 21.0.2-beta、47.1.79。 + ''' NeoForge 版本名,如 47.1.79、21.0.2-beta、26.1.0.0-alpha.14+snapshot-11。 ''' Public NeoForge As String = "" ''' @@ -1105,27 +1112,18 @@ ExitDataLoad: Public Shared Function IsFormatFit(Version As String) As Boolean If Version Is Nothing Then Return False If RegexCheck(Version, "^1\.\d") Then Return True - If Val(RegexSeek(Version, "^[2-9]\d\.\d+")) > 25 Then Return True + If Val(RegexSeek(Version, "^[2-9]\d\.\d+")) >= 26 Then Return True Return False End Function ''' - ''' 尝试将版本字符串转换为 Drop 序数。 - ''' 若无法转换则返回 0。 + ''' 将版本名转换为 Drop 序数。 + ''' 若无法转换则返回 209。 ''' - Public Shared Function VersionToDrop(Version As String, Optional AllowSnapshot As Boolean = False) As Integer - If Not AllowSnapshot AndAlso Version.Contains("-") Then Return 0 - If Version Is Nothing Then Return 0 - Dim Segments = Version.BeforeFirst("-").Split(".") - If Segments.Length < 2 Then Return 0 - Dim Major As Integer = Val(Segments(0)) - Dim Minor As Integer = Val(Segments(1)) - If Major = 1 Then - Return Minor * 10 - ElseIf Major < 25 Then - Return 0 - Else - Return Major * 10 + Minor - End If + Public Shared Function VersionToDrop(VanillaName As String) As Integer + If VanillaName Is Nothing Then Return 209 + Dim Version = NameToVersion(VanillaName) + If Version.Major >= 1000 Then Return 209 + Return Version.Major * 10 + Version.Minor End Function ''' ''' 将 Drop 序数转换为版本字符串。 @@ -1133,10 +1131,36 @@ ExitDataLoad: Public Shared Function DropToVersion(Drop As Integer) As String If Drop >= 250 Then Return $"{Drop \ 10}.{Drop Mod 10}" + ElseIf Drop = 209 Then + Log("[Minecraft] 尝试将旧快照版 Drop 序数转换为版本字符串,这不应该发生!" & vbCrLf & GetStackTrace(), LogLevel.Debug) + Return "1.20" Else Return $"1.{Drop \ 10}" End If End Function + ''' + ''' 将版本名转换为可比较的三段式原版版本号。 + ''' 对老版本格式,例如 1.20.3,会被转换为 20.0.3。 + ''' 若没有版本号,例如旧快照,则为 9999.0.0。 + ''' + Public Shared Function NameToVersion(VanillaName As String) As Version + VanillaName = VanillaName.Replace("_unobfuscated", "").Replace(" Unobfuscated", "") + If VanillaName.StartsWithF("1.") Then + Dim Segments = VanillaName.Split(" _-.".ToCharArray) + Return New Version( + Val(If(Segments.Count >= 2, Segments(1), "0")), + 0, + Val(If(Segments.Count >= 3, Segments(2), "0"))) + ElseIf RegexCheck(VanillaName, "^[2-9][0-9]\.") Then + Dim Segments = VanillaName.Split(" _-.".ToCharArray) + Return New Version( + Val(Segments(0)), + Val(If(Segments.Count >= 2, Segments(1), "0")), + Val(If(Segments.Count >= 3, Segments(2), "0"))) + Else + Return New Version(9999, 0, 0) + End If + End Function End Class @@ -1144,7 +1168,7 @@ ExitDataLoad: ''' 根据版本名获取对应的愚人节版本描述。非愚人节版本会返回空字符串。 ''' Public Function GetMcFoolName(Name As String) As String - Name = Name.ToLower + Name = Name.Lower If Name.StartsWithF("2.0") Then Return "2013 | 这个秘密计划了两年的更新将游戏推向了一个新高度!" ElseIf Name = "15w14a" Then @@ -1163,6 +1187,8 @@ ExitDataLoad: Return "2024 | 毒马铃薯一直都被大家忽视和低估,于是我们超级加强了它!" ElseIf Name = "25w14craftmine" Then Return "2025 | 你可以合成任何东西——包括合成你的世界!" + ElseIf Name = "26w14a" Then + Return "2026 | 为什么需要物品栏?让方块们跟着你走吧!" Else Return "" End If @@ -1215,7 +1241,7 @@ ExitDataLoad: GoTo OnLoaded End If '有可用版本 - Dim FolderListCheck As Integer = GetHash(McInstanceCacheVersion & "#" & Join(FolderList.ToArray, "#")) Mod (Integer.MaxValue - 1) '根据文件夹名列表生成辨识码 + Dim FolderListCheck As Integer = GetHash(McInstanceCacheVersion & "#" & FolderList.Join("#"c)) Mod (Integer.MaxValue - 1) '根据文件夹名列表生成辨识码 If Not McInstanceListForceRefresh AndAlso Val(ReadIni(PathMc & "PCL.ini", "InstanceCache")) = FolderListCheck Then '可以使用缓存 Dim Result = InitMcInstanceListWithCache(PathMc) @@ -1236,7 +1262,7 @@ Reload: '改变当前选择的版本 OnLoaded: - If Loader.IsAborted Then Return + If Loader.IsInterrupted Then Return If McInstanceList.Any(Function(v) v.Key <> McInstanceCardType.Error) Then '尝试读取已储存的选择 Dim SavedSelection As String = ReadIni(PathMc & "PCL.ini", "Version") @@ -1246,7 +1272,6 @@ OnLoaded: If Instance.Name = SavedSelection AndAlso Not Instance.State = McInstanceState.Error Then '使用已储存的选择 McInstanceSelected = Instance - Setup.Set("LaunchVersionSelect", McInstanceSelected.Name) Log("[Minecraft] 选择该文件夹储存的 Minecraft 版本:" & McInstanceSelected.PathVersion) Return End If @@ -1256,18 +1281,16 @@ OnLoaded: If Not McInstanceList.First.Value(0).State = McInstanceState.Error Then '自动选择第一项 McInstanceSelected = McInstanceList.First.Value(0) - Setup.Set("LaunchVersionSelect", McInstanceSelected.Name) Log("[Launch] 自动选择 Minecraft 版本:" & McInstanceSelected.PathVersion) End If Else McInstanceSelected = Nothing - Setup.Set("LaunchVersionSelect", "") Log("[Minecraft] 未找到可用 Minecraft 版本") End If - If Setup.Get("SystemDebugDelay") Then Thread.Sleep(RandomInteger(200, 3000)) + If Settings.Get("SystemDebugDelay") Then Thread.Sleep(RandomInteger(200, 3000)) Catch ex As ThreadInterruptedException Catch ex As Exception - If Loader.IsAborted Then Return '#5617 + If Loader.IsInterrupted Then Return '#5617 WriteIni(PathMc & "PCL.ini", "InstanceCache", "") '要求下次重新加载 Log(ex, "加载 .minecraft 版本列表失败", LogLevel.Feedback) End Try @@ -1425,7 +1448,7 @@ OnLoaded: '确认最新版本,若为快照则加入常用列表 Dim LargestInstance As McInstance = InstanceList. Where(Function(v) v.State = McInstanceState.Original OrElse v.State = McInstanceState.Snapshot). - MaxOf(Function(v) v.ReleaseTime) + MaxBy(Function(v) v.ReleaseTime) If LargestInstance IsNot Nothing AndAlso LargestInstance.State = McInstanceState.Snapshot Then InstanceUseful.Add(LargestInstance) InstanceList.Remove(LargestInstance) @@ -1641,9 +1664,9 @@ OnLoaded: Case "Mojang", "Ms" Url = "https://sessionserver.mojang.com/session/minecraft/profile/" Case "Nide" - Url = "https://auth.mc-user.com:233/" & If(McInstanceSelected Is Nothing, Setup.Get("CacheNideServer"), Setup.Get("VersionServerNide", Instance:=McInstanceSelected)) & "/sessionserver/session/minecraft/profile/" + Url = "https://auth.mc-user.com:233/" & If(McInstanceSelected Is Nothing, Settings.Get("CacheNideServer"), Settings.Get("VersionServerNide", Instance:=McInstanceSelected)) & "/sessionserver/session/minecraft/profile/" Case "Auth" - Url = If(McInstanceSelected Is Nothing, Setup.Get("CacheAuthServerServer"), Setup.Get("VersionServerAuthServer", Instance:=McInstanceSelected)) & "/sessionserver/session/minecraft/profile/" + Url = If(McInstanceSelected Is Nothing, Settings.Get("CacheAuthServerServer"), Settings.Get("VersionServerAuthServer", Instance:=McInstanceSelected)) & "/sessionserver/session/minecraft/profile/" Case Else Throw New ArgumentException("皮肤地址种类无效:" & If(Type, "null")) End Select @@ -1664,7 +1687,7 @@ OnLoaded: Throw New Exception("皮肤返回值中不包含皮肤数据项,可能是未设置自定义皮肤的用户", ex) End Try SkinString = Encoding.GetEncoding("utf-8").GetString(Convert.FromBase64String(SkinValue)) - Dim SkinJson As JObject = GetJson(SkinString.ToLower) + Dim SkinJson As JObject = GetJson(SkinString.Lower) If SkinJson("textures") Is Nothing OrElse SkinJson("textures")("skin") Is Nothing OrElse SkinJson("textures")("skin")("url") Is Nothing Then Throw New Exception("用户未设置自定义皮肤") Else @@ -1688,7 +1711,7 @@ OnLoaded: If Not File.Exists(FileAddress) Then NetDownloadByClient(Address, FileAddress & ".PCLDownloading") File.Delete(FileAddress) - FileSystem.Rename(FileAddress & ".PCLDownloading", FileAddress) + File.Move(FileAddress & ".PCLDownloading", FileAddress) Log("[Minecraft] 皮肤下载成功:" & FileAddress) End If Return FileAddress @@ -1762,7 +1785,7 @@ OnLoaded: If OriginalName Is Nothing Then Return Nothing Dim Splited As New List(Of String)(OriginalName.Split(":")) Splited.RemoveAt(2) 'Java 的此格式下版本号固定为第三段,第四段可能包含架构、分包等其他信息 - Return Join(Splited, ":") + Return Splited.Join(":"c) End Get End Property ''' @@ -2008,12 +2031,12 @@ OnLoaded: Result.AddRange(McLibNetFilesFromTokens(McLibListGet(Instance, False))) '统一通行证文件 - If Setup.Get("VersionServerLogin", Instance:=Instance) = 3 Then - Dim TargetFile As String = PathAppdata & "nide8auth.jar" + If Settings.Get("VersionServerLogin", Instance:=Instance) = 3 Then + Dim TargetFile As String = PathPure & "nide8auth.jar" Try '测试链接:https://auth.mc-user.com:233/00000000000000000000000000000000/ Log("[Minecraft] 开始获取统一通行证下载信息") - Dim DownloadInfo = GetJson(NetRequestByClientRetry("https://auth.mc-user.com:233/" & Setup.Get("VersionServerNide", Instance:=Instance), RequireJson:=True)) + Dim DownloadInfo = GetJson(NetRequestByClientRetry("https://auth.mc-user.com:233/" & Settings.Get("VersionServerNide", Instance:=Instance), RequireJson:=True)) Result.Add(New NetFile( Urls:={"https://login.mc-user.com:233/index/jar"}, LocalPath:=TargetFile, @@ -2028,7 +2051,7 @@ OnLoaded: End If 'Authlib-Injector 文件 - If Setup.Get("VersionServerLogin", Instance:=Instance) = 4 Then + If Settings.Get("VersionServerLogin", Instance:=Instance) = 4 Then Dim TargetFile = PathPure & "authlib-injector.jar" Try Log("[Minecraft] 开始获取 Authlib-Injector 下载信息") @@ -2142,7 +2165,7 @@ OnLoaded: ''' 检查设置,是否应当忽略文件检查? ''' Public Function ShouldIgnoreFileCheck(Instance As McInstance) - Return Setup.Get("VersionAdvanceAssetsV2", Instance:=Instance) OrElse (Setup.Get("VersionAdvanceAssets", Instance:=Instance) = 2) + Return Settings.Get("VersionAdvanceAssetsV2", Instance:=Instance) OrElse (Settings.Get("VersionAdvanceAssets", Instance:=Instance) = 2) End Function #End Region @@ -2365,8 +2388,8 @@ OnLoaded: If Left = "未知版本" AndAlso Right = "未知版本" Then Return 0 If Left <> "未知版本" AndAlso Right = "未知版本" Then Return -1 End If - Left = Left.ToLowerInvariant - Right = Right.ToLowerInvariant + Left = Left.Lower + Right = Right.Lower Dim Lefts = RegexSearch(Left.Replace("快照", "snapshot").Replace("预览版", "pre"), "[a-z]+|[0-9]+") Dim Rights = RegexSearch(Right.Replace("快照", "snapshot").Replace("预览版", "pre"), "[a-z]+|[0-9]+") Dim i As Integer = 0 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb index c96a843..4b53985 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb @@ -1,7 +1,7 @@ Imports System.IO.Compression Public Module ModMod - Private Const LocalModCacheVersion As Integer = 11 + Private Const LocalModCacheVersion As Integer = 13 Public Class McMod @@ -79,7 +79,7 @@ Public Module ModMod End Get Set(value As String) If _Name Is Nothing AndAlso value IsNot Nothing AndAlso Not value.Contains("modname") AndAlso - value.ToLower <> "name" AndAlso value.Count > 1 AndAlso Val(value).ToString <> value Then + value.Lower <> "name" AndAlso value.Count > 1 AndAlso Val(value).ToString <> value Then _Name = value End If End Set @@ -98,7 +98,7 @@ Public Module ModMod If _Description Is Nothing AndAlso value IsNot Nothing AndAlso value.Count > 2 Then _Description = value.ToString.Trim(vbLf) '优化显示:若以 [a-zA-Z0-9] 结尾,加上小数点句号 - If _Description.ToLower.LastIndexOfAny("qwertyuiopasdfghjklzxcvbnm0123456789") = _Description.Count - 1 Then _Description += "." + If _Description.Lower.LastIndexOfAny("qwertyuiopasdfghjklzxcvbnm0123456789") = _Description.Count - 1 Then _Description += "." End If End Set End Property @@ -252,10 +252,10 @@ GotFabric: End If Loop End If - Value = Join(ValueLines, vbLf).Trim(vbLf).Replace(vbLf, vbCrLf) - ElseIf RawValue.ToLower = "true" OrElse RawValue.ToLower = "false" Then + Value = ValueLines.Join(vbLf).Trim(vbLf).Replace(vbLf, vbCrLf) + ElseIf RawValue.Lower = "true" OrElse RawValue.Lower = "false" Then '布尔型 - Value = (RawValue.ToLower = "true") + Value = (RawValue.Lower = "true") ElseIf Val(RawValue).ToString = RawValue Then '数字型 Value = Val(RawValue) @@ -424,7 +424,7 @@ Finished: ''' Public ReadOnly Property CanUpdate As Boolean Get - Return Not Setup.Get("UiHiddenFunctionModUpdate") AndAlso Not Setup.Get("VersionAdvanceDisableModUpdate", Instance:=PageInstanceLeft.Instance) AndAlso UpdateFile IsNot Nothing + Return Not Settings.Get("UiHiddenFunctionModUpdate") AndAlso Not Settings.Get("VersionAdvanceDisableModUpdate", Instance:=PageInstanceLeft.Instance) AndAlso UpdateFile IsNot Nothing End Get End Property @@ -526,7 +526,7 @@ Finished: ''' 是否可能为前置 Mod。目前非常不准确。 ''' Public Function IsPresetMod() As Boolean - Return DisplayName IsNot Nothing AndAlso (DisplayName.ToLower.Contains("core") OrElse DisplayName.ToLower.Contains("lib")) + Return DisplayName IsNot Nothing AndAlso (DisplayName.Lower.Contains("core") OrElse DisplayName.Lower.Contains("lib")) End Function ''' @@ -534,7 +534,7 @@ Finished: ''' Public Shared Function IsModFile(Path As String) If Path Is Nothing OrElse Not Path.Contains(".") Then Return False - Path = Path.ToLower + Path = Path.Lower If Path.EndsWithF(".jar", True) OrElse Path.EndsWithF(".zip", True) OrElse Path.EndsWithF(".litemod", True) OrElse Path.EndsWithF(".jar.disabled", True) OrElse Path.EndsWithF(".zip.disabled", True) OrElse Path.EndsWithF(".litemod.disabled", True) OrElse Path.EndsWithF(".jar.old", True) OrElse Path.EndsWithF(".zip.old", True) OrElse Path.EndsWithF(".litemod.old", True) Then Return True @@ -555,7 +555,7 @@ Finished: Try RunInUiWait(Sub() If FrmInstanceMod IsNot Nothing Then FrmInstanceMod.Load.Text = "正在更新 Mod") Do Until Not PageInstanceMod.UpdatingInstanceModFolders.Contains(Loader.Input) - If Loader.IsAborted Then Return + If Loader.IsInterrupted Then Return Thread.Sleep(100) Loop Finally @@ -567,9 +567,9 @@ Finished: '获取 Mod 文件夹下的可用文件列表 Dim ModFileList As New List(Of FileInfo) If Directory.Exists(Loader.Input) Then - Dim RawName As String = Loader.Input.ToLower + Dim RawName As String = Loader.Input.Lower For Each File As FileInfo In EnumerateFiles(Loader.Input) - If File.DirectoryName.ToLower & "\" <> RawName Then + If File.DirectoryName.Lower & "\" <> RawName Then '仅当 Forge 1.13- 且文件夹名与版本号相同时,才加载该子文件夹下的 Mod If Not (PageInstanceLeft.Instance IsNot Nothing AndAlso PageInstanceLeft.Instance.Version.HasForge AndAlso PageInstanceLeft.Instance.Version.Vanilla.Major < 13 AndAlso @@ -602,7 +602,7 @@ Finished: '加载 Mod 列表 Dim ModList As New List(Of McMod) For Each ModFile As FileInfo In ModFileList - If Loader.IsAborted Then Return + If Loader.IsInterrupted Then Return Dim ModEntry As New McMod(ModFile.FullName) Dim DumpMod As McMod = ModList.FirstOrDefault(Function(m) m.RawFileName = ModEntry.RawFileName) '存在两个文件,名称相同,但一个启用一个禁用 If DumpMod IsNot Nothing Then @@ -622,7 +622,7 @@ Finished: ModList = ModList.OrderBy(Function(m) m.FileName).ToList '回设 - If Loader.IsAborted Then Return + If Loader.IsInterrupted Then Return Loader.Output = ModList '开始联网加载 @@ -641,7 +641,7 @@ Finished: Dim Cache As JObject = Loader.Input.Value '读取 Comp 缓存,获取需要更新的 Mod 列表 For Each ModEntry As McMod In Loader.Input.Key - If Loader.IsAborted Then Return + If Loader.IsInterrupted Then Return Dim CacheKey = ModEntry.ModrinthHash & PageInstanceLeft.Instance.Version.VanillaName & GetTargetModLoaders().Join("") If Cache.ContainsKey(CacheKey) Then ModEntry.FromJson(Cache(CacheKey)) @@ -691,7 +691,7 @@ Finished: Entry.CompFile.Version = File.Version '使用来自 Modrinth 的版本号 End If Next - If Loader.IsAbortedWithThread(CurrentTaskThread) Then Return + If Loader.IsInterruptedWithThread(CurrentTaskThread) Then Return Log($"[Mod] 需要从 Modrinth 获取 {ModrinthMapping.Count} 个本地 Mod 的工程信息") '步骤 3:获取工程信息 If Not ModrinthMapping.Any() Then Return @@ -707,7 +707,7 @@ Finished: '步骤 4:获取更新信息 Dim ModrinthUpdate As JObject = DlModRequest("https://api.modrinth.com/v2/version_files/update", HttpMethod.Post, $"{{""hashes"": [""{ModrinthMapping.SelectMany(Function(l) l.Value.Select(Function(m) m.ModrinthHash)).Join(""",""")}""], ""algorithm"": ""sha1"", - ""loaders"": [""{ModLoaders.Join(""",""").ToLower}""],""game_versions"": [""{VanillaVersion}""]}}", "application/json") + ""loaders"": [""{ModLoaders.Join(""",""").Lower}""],""game_versions"": [""{VanillaVersion}""]}}", "application/json") 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) @@ -740,7 +740,7 @@ Finished: Dim CurseForgeHashes As New List(Of UInteger) For Each Entry In Mods CurseForgeHashes.Add(Entry.CurseForgeHash) - If Loader.IsAbortedWithThread(CurrentTaskThread) Then Return + If Loader.IsInterruptedWithThread(CurrentTaskThread) Then Return Next Dim CurseForgeRaw As JContainer = DlModRequest("https://api.curseforge.com/v1/fingerprints/432", HttpMethod.Post, $"{{""fingerprints"": [{CurseForgeHashes.Join(",")}]}}", "application/json")("data")("exactMatches") @@ -761,7 +761,7 @@ Finished: If Entry.CompFile Is Nothing OrElse Entry.CompFile.ReleaseDate < File.ReleaseDate Then Entry.CompFile = File Next Next - If Loader.IsAbortedWithThread(CurrentTaskThread) Then Return + If Loader.IsInterruptedWithThread(CurrentTaskThread) Then Return Log($"[Mod] 需要从 CurseForge 获取 {CurseForgeMapping.Count} 个本地 Mod 的工程信息") '步骤 3:获取工程信息 If Not CurseForgeMapping.Any() Then Return @@ -781,7 +781,7 @@ Finished: Entry.Comp = Project Next '查找或许版本更新的文件列表 - If ModLoaders.Count = 1 Then + If ModLoaders.IsSingle Then Dim NewestVersion As String = Nothing Dim NewestFileIds As New List(Of Integer) For Each IndexEntry In ProjectJson("latestFilesIndexes") @@ -844,7 +844,7 @@ Finished: '等待线程结束 Do Until EndedThreadCount = 2 Thread.Sleep(10) - If Loader.IsAborted Then Return + If Loader.IsInterrupted Then Return Loop '保存缓存 Mods = Mods.Where(Function(m) m.Comp IsNot Nothing).ToList() @@ -856,7 +856,7 @@ Finished: Next WriteFile(PathTemp & "Cache\LocalMod.json", Cache.ToString(If(ModeDebug, Newtonsoft.Json.Formatting.Indented, Newtonsoft.Json.Formatting.None))) '刷新边栏 - If Loader.IsAborted Then Return + If Loader.IsInterrupted Then Return If FrmInstanceMod?.Filter = PageInstanceMod.FilterType.CanUpdate Then RunInUi(Sub() FrmInstanceMod?.RefreshUI()) '同步 “可更新” 列表 (#4677) Else diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 1cc3e3b..5fd25d2 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -200,7 +200,7 @@ Retry: Dim NeoForgeVersion As String = Nothing Dim FabricVersion As String = Nothing For Each Entry In If(Json("minecraft")("modLoaders"), {}) - Dim Id As String = If(Entry("id"), "").ToString.ToLower + Dim Id As String = If(Entry("id"), "").ToString.Lower If Id.StartsWithF("forge-") Then 'Forge 指定 If Id.Contains("recommended") Then Throw New Exception("该整合包版本过老,已不支持进行安装!") @@ -250,7 +250,7 @@ Retry: '获取 Mod 下载信息 ModDownloadLoaders.Add(New LoaderTask(Of Integer, JArray)("获取 Mod 下载信息", Sub(Task As LoaderTask(Of Integer, JArray)) - Task.Output = DlModRequest("https://api.curseforge.com/v1/mods/files", HttpMethod.Post, "{""fileIds"": [" & Join(ModList, ",") & "]}", "application/json")("data") + Task.Output = DlModRequest("https://api.curseforge.com/v1/mods/files", HttpMethod.Post, "{""fileIds"": [" & ModList.Join(",") & "]}", "application/json")("data") '如果文件已被删除,则 API 会跳过那一项 If ModList.Count > Task.Output.Count Then Throw New Exception("整合包中的部分 Mod 版本已被 Mod 作者删除,所以没法继续安装了,请向整合包作者反馈该问题") End Sub) With {.ProgressWeight = ModList.Count / 10}) '每 10 Mod 需要 1s @@ -369,7 +369,7 @@ Retry: Dim NeoForgeVersion As String = Nothing Dim FabricVersion As String = Nothing For Each Entry As JProperty In If(Json("dependencies"), {}) - Select Case Entry.Name.ToLower + Select Case Entry.Name.Lower Case "minecraft" MinecraftVersion = Entry.Value.ToString Case "forge" 'eg. 14.23.5.2859 / 1.19-41.1.0 @@ -584,7 +584,7 @@ Retry: If Not Line.Contains("=") Then Continue For Lines.Add(Line.BeforeFirst("=") & ":" & Line.AfterFirst("=")) Next - WriteFile(MMCSetupFile, Join(Lines, vbCrLf)) + WriteFile(MMCSetupFile, Lines.Join(vbCrLf)) '读取文件 If ReadIni(MMCSetupFile, "OverrideCommands", False) Then Dim PreLaunchCommand As String = ReadIni(MMCSetupFile, "PreLaunchCommand") @@ -621,7 +621,7 @@ Retry: WriteIni(SetupFile, "VersionAdvanceJvm", JvmArgs) Log("[ModPack] 迁移 MultiMC 版本独立设置:JVM 参数(覆盖):" & JvmArgs) Else - JvmArgs += " " & Setup.Get("LaunchAdvanceJvm") + JvmArgs += " " & Settings.Get("LaunchAdvanceJvm") WriteIni(SetupFile, "VersionAdvanceJvm", JvmArgs) Log("[ModPack] 迁移 MultiMC 版本独立设置:JVM 参数(追加):" & JvmArgs) End If @@ -636,9 +636,8 @@ Retry: Dim Request As New McInstallRequest With {.NewInstanceName = InstanceName, .VersionFolder = $"{McFolderSelected}versions\{InstanceName}\"} For Each Component As JObject In PackJson("components") If Not Component.ContainsKey("uid") Then Continue For - Select Case Component("uid").ToString - Case "org.lwjgl" - Log("[ModPack] 已跳过 LWJGL 项") + Dim UID As String = Component("uid").ToString + Select Case UID Case "net.minecraft" Request.MinecraftName = Component("version") Case "net.minecraftforge" @@ -647,9 +646,13 @@ Retry: Request.NeoForgeVersion = Component("version") Case "net.fabricmc.fabric-loader" Request.FabricVersion = Component("version") - Case Else 'Case "org.quiltmc.quilt-loader" 'eg. 1.0.0 - NotifyIncompatibleLoader(Component("uid")) + Case Else + If UID.StartsWithF("org.lwjgl") Then '#8210 + Log("[ModPack] 已跳过 LWJGL 项:" & UID) + Else + NotifyIncompatibleLoader(UID) + End If End Select Next '构造加载器 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModWatcher.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModWatcher.vb index 38a50b8..686ae40 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModWatcher.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModWatcher.vb @@ -33,13 +33,13 @@ HasRunningMinecraft = False FrmMain.BtnExtraShutdown.ShowRefresh() '音乐播放 - If Setup.Get("UiMusicStop") Then + If Settings.Get("UiMusicStop") Then RunInUi(Sub() If MusicResume() Then Log("[Music] 已根据设置,在结束后开始音乐播放")) - ElseIf Setup.Get("UiMusicStart") Then + ElseIf Settings.Get("UiMusicStart") Then RunInUi(Sub() If MusicPause() Then Log("[Music] 已根据设置,在结束后暂停音乐播放")) End If '启动器可见性 - Select Case Setup.Get("LaunchArgumentVisible") + Select Case Settings.Get("LaunchArgumentVisible") Case 2 '直接关闭 If TriggerLauncherShutdown Then @@ -91,7 +91,7 @@ RunInNewThread( Sub() Try - Do Until State = MinecraftState.Ended OrElse State = MinecraftState.Crashed OrElse State = MinecraftState.Canceled OrElse Loader.State = LoadState.Aborted + Do Until State = MinecraftState.Ended OrElse State = MinecraftState.Crashed OrElse State = MinecraftState.Canceled OrElse Loader.State = LoadState.Interrupted TimerWindow() TimerLog() '设置窗口标题 @@ -277,7 +277,7 @@ WatcherLog($"Minecraft 窗口已加载:{MinecraftWindowName}({MinecraftWindowHandle.ToInt64})") IsWindowFinished = True '最大化 - If Setup.Get("LaunchArgumentWindowType") = 4 Then + If Settings.Get("LaunchArgumentWindowType") = 4 Then RunInNewThread( Sub() Try diff --git a/Plain Craft Launcher 2/Modules/ModEvent.vb b/Plain Craft Launcher 2/Modules/ModEvent.vb index c90b234..441ac30 100644 --- a/Plain Craft Launcher 2/Modules/ModEvent.vb +++ b/Plain Craft Launcher 2/Modules/ModEvent.vb @@ -302,7 +302,7 @@ Public Class CustomEvent Case EventType.修改设置, EventType.写入设置 If Args.Length = 1 Then Throw New Exception($"EventType {Type} 需要至少 2 个以 | 分割的参数,例如 UiLauncherTransparent|400") - Setup.SetSafe(Args(0), Args(1), Instance:=McInstanceSelected) + Settings.SetSafe(Args(0), Args(1), Instance:=McInstanceSelected) If Args.Length = 2 Then Hint($"已写入设置:{Args(0)} → {Args(1)}", HintType.Green) Case EventType.修改变量, EventType.写入变量 @@ -369,7 +369,7 @@ Public Class CustomEvent End Try RelativeUrl = LocalTemp End If - RelativeUrl = RelativeUrl.Replace("/", "\").ToLower.TrimStart("\") + RelativeUrl = RelativeUrl.Replace("/", "\").Lower.TrimStart("\") '确认实际路径 Dim Location As String, WorkingDir As String = Path & "PCL" @@ -408,12 +408,12 @@ Public Class CustomEvent ''' 弹出安全确认弹窗。返回是否继续执行。 ''' Private Shared Function EventSafetyConfirm(Message As String) As Boolean - If Setup.Get("HintCustomCommand") Then Return True + If Settings.Get("HintCustomCommand") Then Return True Select Case MyMsgBox(Message & vbCrLf & "请在确认没有安全隐患后再继续。", "执行确认", "继续", "继续且今后不再要求确认", "取消") Case 1 Return True Case 2 - Setup.Set("HintCustomCommand", True) + Settings.Set("HintCustomCommand", True) Return True Case Else Return False diff --git a/Plain Craft Launcher 2/Modules/ModMain.vb b/Plain Craft Launcher 2/Modules/ModMain.vb index b966537..96e2ba0 100644 --- a/Plain Craft Launcher 2/Modules/ModMain.vb +++ b/Plain Craft Launcher 2/Modules/ModMain.vb @@ -166,7 +166,7 @@ EndHint: Public Text As String ''' ''' 输入模式:文本框的文本。 - ''' 选择模式:需要放进去的 List(Of MyListItem)。 + ''' 选择模式:需要放进去的 IEnumberable(Of IMyRadio)。 ''' 登录模式:登录步骤 1 中返回的 JSON。 ''' Public Content As Object @@ -308,7 +308,7 @@ EndHint: ''' 显示的第一个按钮,默认为 “确定”。 ''' 显示的第二个按钮,默认为空。 ''' 是否为警告弹窗,若为 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? + Public Function MyMsgBoxSelect(Selections As IEnumerable(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) @@ -512,7 +512,7 @@ EndHint: EventData = If(JsonData("EventData"), "") IsEvent = True Else - Dim XamlAddress As String = FilePath.ToLower.Replace(".json", ".xaml") + Dim XamlAddress As String = FilePath.Lower.Replace(".json", ".xaml") If File.Exists(XamlAddress) Then XamlContent = ReadFile(XamlAddress) IsEvent = False @@ -579,7 +579,7 @@ EndHint: '读取自定义文件 If Directory.Exists(Path & "PCL\Help\") Then For Each File In EnumerateFiles(Path & "PCL\Help\") - Select Case File.Extension.ToLower + Select Case File.Extension.Lower Case ".helpignore" '加载忽略列表 Log("[Help] 发现 .helpignore 文件:" & File.FullName) @@ -598,7 +598,7 @@ EndHint: '读取自带文件 For Each File In EnumerateFiles(PathTemp & "Help") '跳过非 json 文件与以 . 开头的文件夹 - If File.Extension.ToLower <> ".json" OrElse File.Directory.FullName.Replace(PathTemp & "Help", "").Contains("\.") Then Continue For + If File.Extension.Lower <> ".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 @@ -614,7 +614,7 @@ NextFile: Catch ex As Exception Log(ex, "检查帮助文件夹失败", LogLevel.Msgbox) End Try - If Loader.IsAborted Then Return + If Loader.IsInterrupted Then Return '将文件实例化 Dim Dict As New List(Of HelpEntry) @@ -630,7 +630,7 @@ NextFile: '回设 If Not Dict.Any() Then Throw New Exception("未找到可用的帮助;若不需要帮助页面,可以在 设置 → 个性化 → 功能隐藏 中将其隐藏") - If Loader.IsAborted Then Return + If Loader.IsInterrupted Then Return Loader.Output = Dict Catch ex As Exception @@ -643,12 +643,12 @@ NextFile: ''' 尝试解压内置帮助文件。 ''' Public Sub HelpTryExtract() - If Setup.Get("SystemHelpVersion") <> VersionCode OrElse Not File.Exists(PathTemp & "Help\启动器\备份设置.xaml") Then + If Settings.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")) ExtractCompressedFile(PathTemp & "Cache\Help.zip", PathTemp & "Help") - Setup.Set("SystemHelpVersion", VersionCode) + Settings.Set("SystemHelpVersion", VersionCode) Log("[Help] 已解压内置帮助文件,目前状态:" & File.Exists(PathTemp & "Help\启动器\备份设置.xaml"), LogLevel.Debug) End If End Sub @@ -657,11 +657,19 @@ NextFile: #Region "愚人节" - Public IsAprilEnabled As Boolean = Date.Now.Month = 4 AndAlso Date.Now.Day = 1 + Private _IsAprilEnabled As Boolean? = Nothing + Public ReadOnly Property IsAprilEnabled As Boolean + Get + If _IsAprilEnabled Is Nothing Then + _IsAprilEnabled = + Date.Now.Month = 4 AndAlso Date.Now.Day = 1 AndAlso + Settings.Get("AprilDoneYear") <> Date.Now.Year '成功后同年内则不再触发 + End If + Return _IsAprilEnabled.Value + End Get + End Property 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 AprilDifficultiedDistance As Integer = 0 Private Sub TimerFool() Try If FrmLaunchLeft Is Nothing OrElse FrmLaunchLeft.AprilPosTrans Is Nothing OrElse FrmMain.lastMouseArg Is Nothing Then Return @@ -669,11 +677,13 @@ NextFile: '计算是否空闲 Dim MousePos = FrmMain.lastMouseArg.GetPosition(FrmMain) - If MousePos = AprilMousePosLast Then - AprilIdieCount += 1 + Static IdieCount As Integer = 0 + Static MousePosLast As New Point(0, 0) + If MousePos = MousePosLast Then + IdieCount += 1 Else - AprilMousePosLast = MousePos - AprilIdieCount = 0 + MousePosLast = MousePos + IdieCount = 0 End If '计算躲避移动 Dim Direction As Vector @@ -685,9 +695,11 @@ NextFile: 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 Difficulty As Double = 1 / (1 + (AprilDifficultiedDistance / 6000) ^ 2) + 0.25 '难度,初始为 1.25x,6000 距离为 0.75x,12000 为 0.5x,24000 为 0.256x,最低 0.25x + Dim Acc = Math.Max(0, -0.65 - Math.Log((Distance / Difficulty + 0.4) / 200)) * Direction * Difficulty '加速度 + 'FrmMain.Title = CInt(AprilTotalDistance) & " - " & Difficulty + '5s 不动时回到起始点 + If IdieCount >= 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 @@ -697,10 +709,11 @@ NextFile: End If End If '回到边界 + Static Speed As New Vector(0, 0) 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 + Speed.X -= 80 If Relative.Y < 0 Then FrmLaunchLeft.AprilPosTrans.Y += ButtonHeight * 2.5 ElseIf Relative.Y > FrmMain.PanForm.ActualHeight - ButtonHeight * 2 Then @@ -708,7 +721,7 @@ NextFile: End If ElseIf Relative.X > FrmMain.PanForm.ActualWidth Then FrmLaunchLeft.AprilPosTrans.X -= FrmMain.PanForm.ActualWidth + ButtonWidth * 2 '离开右边界 - AprilSpeed.X += 80 + Speed.X += 80 If Relative.Y < 0 Then FrmLaunchLeft.AprilPosTrans.Y += ButtonHeight * 2.5 ElseIf Relative.Y > FrmMain.PanForm.ActualHeight - ButtonHeight * 2 Then @@ -716,7 +729,7 @@ NextFile: End If ElseIf Relative.Y < -ButtonHeight * 2 Then FrmLaunchLeft.AprilPosTrans.Y += FrmMain.PanForm.ActualHeight + ButtonHeight * 2 '离开上边界 - AprilSpeed.Y -= 25 + Speed.Y -= 25 If Relative.X < 0 Then FrmLaunchLeft.AprilPosTrans.X += ButtonWidth * 2 ElseIf Relative.X > FrmMain.PanForm.ActualWidth - ButtonWidth * 2 Then @@ -724,7 +737,7 @@ NextFile: End If ElseIf Relative.Y > FrmMain.PanForm.ActualHeight Then FrmLaunchLeft.AprilPosTrans.Y -= FrmMain.PanForm.ActualHeight + ButtonHeight * 2 '离开下边界 - AprilSpeed.Y += 25 + Speed.Y += 25 If Relative.X < 0 Then FrmLaunchLeft.AprilPosTrans.X += ButtonWidth * 2 ElseIf Relative.X > FrmMain.PanForm.ActualWidth - ButtonWidth * 2 Then @@ -732,29 +745,31 @@ NextFile: End If End If '移动 - AprilSpeed = AprilSpeed * 0.8 + Acc - Dim SpeedValue = Math.Min(60, AprilSpeed.Length) + Speed = Speed * 0.8 + Acc + Dim SpeedValue = Math.Min(60, Speed.Length) If SpeedValue < 0.01 Then Return - AprilSpeed.Normalize() - AprilSpeed *= SpeedValue - AprilDistance += SpeedValue - FrmLaunchLeft.AprilPosTrans.X += AprilSpeed.X - FrmLaunchLeft.AprilPosTrans.Y += AprilSpeed.Y + Speed.Normalize() + Speed *= SpeedValue + AprilDifficultiedDistance += SpeedValue + FrmLaunchLeft.AprilPosTrans.X += Speed.X + FrmLaunchLeft.AprilPosTrans.Y += Speed.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 + Static GiveUpDistance As Double = -1500 + GiveUpDistance += SpeedValue + If GiveUpDistance > 2500 Then + GiveUpDistance = 0 Select Case RandomInteger(0, 3) Case 0 - Hint("放弃吧!只需要点一下右下角的小白旗……") + Hint("放弃吧!只需要点一下右下角的小白旗……", HintType.Red) Case 1 - Hint("看到右下角的那面小白旗了吗?") + Hint("看到右下角的那面小白旗了吗?", HintType.Red) Case 2 - Hint("这里建议点一下右下角的小白旗投降呢.jpg") + Hint("这里建议点一下右下角的小白旗投降呢.jpg", HintType.Red) Case 3 - Hint("右下角的小白旗永远等着你……") + Hint("右下角的小白旗永远等着你……", HintType.Red) End Select End If @@ -843,7 +858,7 @@ NextFile: Text = Text.Replace("{version_path}", Replacer(McInstanceSelected.PathVersion)) : Text = Text.Replace("{verpath}", Replacer(McInstanceSelected.PathVersion)) Text = Text.Replace("{version_indie}", Replacer(McInstanceSelected.PathIndie)) : Text = Text.Replace("{verindie}", Replacer(McInstanceSelected.PathIndie)) Text = Text.Replace("{name}", Replacer(McInstanceSelected.Name)) - If {"unknown", "old", "pending"}.Contains(McInstanceSelected.Version.VanillaName.ToLower) Then + If {"unknown", "old", "pending"}.Contains(McInstanceSelected.Version.VanillaName.Lower) Then Text = Text.Replace("{version}", Replacer(McInstanceSelected.Name)) Else Text = Text.Replace("{version}", Replacer(McInstanceSelected.Version.VanillaName)) @@ -857,7 +872,7 @@ NextFile: '登录信息 If McLoginLoader.State = LoadState.Finished Then Text = Text.Replace("{user}", Replacer(McLoginLoader.Output.Name)) - Text = Text.Replace("{uuid}", Replacer(McLoginLoader.Output.Uuid?.ToLower)) + Text = Text.Replace("{uuid}", Replacer(McLoginLoader.Output.Uuid?.Lower)) Select Case McLoginLoader.Input.Type Case McLoginType.Legacy Text = Text.Replace("{login}", Replacer("离线")) @@ -876,7 +891,7 @@ NextFile: '高级 Text = Text.RegexReplaceEach("\{hint\}", Function() Replacer(PageOtherTest.GetRandomHint())) Text = Text.RegexReplaceEach("\{cave\}", Function() Replacer(PageOtherTest.GetRandomCave())) - Text = Text.RegexReplaceEach("\{setup:([a-zA-Z0-9]+)\}", Function(m) Replacer(Setup.GetSafe(m.Groups(1).Value, McInstanceSelected))) + Text = Text.RegexReplaceEach("\{setup:([a-zA-Z0-9]+)\}", Function(m) Replacer(Settings.GetSafe(m.Groups(1).Value, McInstanceSelected))) Text = Text.RegexReplaceEach("\{varible:([^:\}]+)(?::([^\}]+))?\}", Function(m) Replacer(ReadReg("CustomEvent" & m.Groups(1).Value, m.Groups(2).Value))) Text = Text.RegexReplaceEach("\{variable:([^:\}]+)(?::([^\}]+))?\}", Function(m) Replacer(ReadReg("CustomEvent" & m.Groups(1).Value, m.Groups(2).Value))) Return Text @@ -971,7 +986,7 @@ NextFile: Timer150Count = 0 Try #Region "每 7.5s 执行一次的代码" - If FrmMain.BtnExtraApril_ShowCheck AndAlso AprilDistance <> 0 Then FrmMain.BtnExtraApril.Ribble() + If FrmMain.BtnExtraApril_ShowCheck AndAlso AprilDifficultiedDistance <> 0 Then FrmMain.BtnExtraApril.Ribble() '以未知原因窗口被丢到一边去的修复(Top、Left = -25600),还有 #745 RunInUi( Sub() diff --git a/Plain Craft Launcher 2/Modules/ModMusic.vb b/Plain Craft Launcher 2/Modules/ModMusic.vb index febba60..ffbe64a 100644 --- a/Plain Craft Launcher 2/Modules/ModMusic.vb +++ b/Plain Craft Launcher 2/Modules/ModMusic.vb @@ -24,13 +24,13 @@ Directory.CreateDirectory(Path & "PCL\Musics\") For Each File In EnumerateFiles(Path & "PCL\Musics\") '文件夹可能会被加入 .ini 文件夹配置文件、一些乱七八糟的 .jpg 文件啥的 - Dim Ext As String = File.Extension.ToLower + Dim Ext As String = File.Extension.Lower If {".ini", ".jpg", ".txt", ".cfg", ".lrc", ".db", ".png"}.Contains(Ext) Then Continue For MusicAllList.Add(File.FullName) Next End If '打乱顺序播放 - MusicWaitingList = If(Setup.Get("UiMusicRandom"), New List(Of String)(MusicAllList).Shuffle().ToList, New List(Of String)(MusicAllList)) + MusicWaitingList = If(Settings.Get("UiMusicRandom"), New List(Of String)(MusicAllList).Shuffle().ToList, New List(Of String)(MusicAllList)) If PreventFirst IsNot Nothing AndAlso MusicWaitingList.FirstOrDefault = PreventFirst Then '若需要避免成为第一项的为第一项,则将它放在最后 MusicWaitingList.RemoveAt(0) @@ -129,7 +129,7 @@ ''' 播放下一曲,并显示提示文本。 ''' Public Sub MusicControlNext() - If MusicAllList.Count = 1 Then + If MusicAllList.IsSingle Then MusicStartPlay(MusicCurrent) Hint("重新播放:" & GetFileNameFromPath(MusicCurrent), HintType.Green) Else @@ -280,18 +280,23 @@ CurrentWave = New NAudio.Wave.WaveOutEvent() MusicNAudio = CurrentWave CurrentWave.DeviceNumber = -1 - Reader = New NAudio.Wave.AudioFileReader(MusicCurrent) + Try + Reader = New NAudio.Wave.AudioFileReader(MusicCurrent) + Catch ex As Exception + Log(ex, "使用 AudioFileReader 加载音频文件失败,换用 MediaFoundationReader 重试", LogLevel.Developer) + Reader = New NAudio.Wave.MediaFoundationReader(MusicCurrent) + End Try CurrentWave.Init(Reader) CurrentWave.Play() '第一次打开的暂停 - If IsFirstLoad AndAlso Not Setup.Get("UiMusicAuto") Then CurrentWave.Pause() + If IsFirstLoad AndAlso Not Settings.Get("UiMusicAuto") Then CurrentWave.Pause() MusicRefreshUI() '停止条件:播放完毕或变化 Dim PreviousVolume = 0 While CurrentWave.Equals(MusicNAudio) AndAlso Not CurrentWave.PlaybackState = NAudio.Wave.PlaybackState.Stopped - If Setup.Get("UiMusicVolume") <> PreviousVolume Then + If Settings.Get("UiMusicVolume") <> PreviousVolume Then '更新音量 - PreviousVolume = Setup.Get("UiMusicVolume") + PreviousVolume = Settings.Get("UiMusicVolume") CurrentWave.Volume = PreviousVolume / 1000 End If '更新进度条 @@ -311,9 +316,7 @@ Hint("由于音频设备变更,音乐播放功能在重启 PCL 后才能恢复!", HintType.Red) Thread.Sleep(1000000000) End If - If ex.Message.Contains("Got a frame at sample rate") OrElse ex.Message.Contains("does not support changes to") Then - Hint("播放音乐失败(" & GetFileNameFromPath(MusicCurrent) & "):PCL 不支持播放音频属性在中途发生变化的音乐", HintType.Red) - ElseIf Not (MusicCurrent.EndsWithF(".wav", True) OrElse MusicCurrent.EndsWithF(".mp3", True) OrElse MusicCurrent.EndsWithF(".flac", True)) OrElse + If Not (MusicCurrent.EndsWithF(".wav", True) OrElse MusicCurrent.EndsWithF(".mp3", True) OrElse MusicCurrent.EndsWithF(".flac", True)) OrElse ex.Message.Contains("0xC00D36C4") Then '#5096:不支持给定的 URL 的字节流类型。 (异常来自 HRESULT:0xC00D36C4) Hint("播放音乐失败(" & GetFileNameFromPath(MusicCurrent) & "):PCL 可能不支持此音乐格式,请将格式转换为 .wav、.mp3 或 .flac 后再试", HintType.Red) Else diff --git a/Plain Craft Launcher 2/Modules/ModSecret.vb b/Plain Craft Launcher 2/Modules/ModSecret.vb index 4cb4f2c..23b1f0a 100644 --- a/Plain Craft Launcher 2/Modules/ModSecret.vb +++ b/Plain Craft Launcher 2/Modules/ModSecret.vb @@ -62,15 +62,6 @@ Friend Module ModSecret Return "0000-0000-0000-0000" End Function - Friend Sub SecretLaunchJvmArgs(ByRef DataList As List(Of String)) - Dim DataJvmCustom As String = Setup.Get("VersionAdvanceJvm", Instance:=McInstanceSelected) - DataList.Insert(0, ArgumentReplace(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(PageInstanceSetup.GetRam(McInstanceSelected) * 1024 * 0.15) & "m") - DataList.Add("-Xmx" & Math.Floor(PageInstanceSetup.GetRam(McInstanceSelected) * 1024) & "m") - If Not DataList.Any(Function(d) d.Contains("-Dlog4j2.formatMsgNoLookups=true")) Then DataList.Add("-Dlog4j2.formatMsgNoLookups=true") - End Sub - #End Region #Region "网络鉴权" @@ -87,9 +78,9 @@ Friend Module ModSecret If Url.Contains("baidupcs.com") OrElse Url.Contains("baidu.com") Then Req.Headers.Add("User-Agent", "LogStatistic") '#4951 ElseIf SimulateBrowserHeaders Then - Req.Headers.Add("User-Agent", $"PCL2/{VersionStandardCode} Mozilla/5.0 AppleWebKit/537.36 Chrome/63.0.3239.132 Safari/537.36") + Req.Headers.Add("User-Agent", $"PCL2/{VersionBaseName}.{VersionBranchCode} Mozilla/5.0 AppleWebKit/537.36 Chrome/63.0.3239.132 Safari/537.36") Else - Req.Headers.Add("User-Agent", $"PCL2/{VersionStandardCode}") + Req.Headers.Add("User-Agent", $"PCL2/{VersionBaseName}.{VersionBranchCode}") End If End If If Not SimulateBrowserHeaders Then Req.Headers.Add("Referer", $"http://{VersionCode}.open.pcl2.server/") @@ -229,7 +220,7 @@ Friend Module ModSecret FrmMain.PanTitle.Background = Brush FrmMain.PanTitle.Background.Freeze() '主页面背景 - If Setup.Get("UiBackgroundColorful") Then + If Settings.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 - 15, ColorSat * 0.8, 91)}) Brush.GradientStops.Add(New GradientStop With {.Offset = 0.4, .Color = New MyColor().FromHSL2(ColorHue, ColorSat * 0.8, 91)}) diff --git a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb index 0392544..629ff78 100644 --- a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb +++ b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb @@ -51,6 +51,6 @@ Imports System.Runtime.InteropServices ' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 ' 方法是按如下所示使用“*” - - + + diff --git a/Plain Craft Launcher 2/My Project/Resources.Designer.vb b/Plain Craft Launcher 2/My Project/Resources.Designer.vb index f4bdeee..3005963 100644 --- a/Plain Craft Launcher 2/My Project/Resources.Designer.vb +++ b/Plain Craft Launcher 2/My Project/Resources.Designer.vb @@ -150,6 +150,16 @@ Namespace My.Resources End Get End Property + ''' + ''' 查找 System.Byte[] 类型的本地化资源。 + ''' + Friend ReadOnly Property LUA() As Byte() + Get + Dim obj As Object = ResourceManager.GetObject("LUA", resourceCulture) + Return CType(obj,Byte()) + End Get + End Property + ''' ''' 查找 System.Byte[] 类型的本地化资源。 ''' diff --git a/Plain Craft Launcher 2/My Project/Resources.resx b/Plain Craft Launcher 2/My Project/Resources.resx index 6131341..03d0719 100644 --- a/Plain Craft Launcher 2/My Project/Resources.resx +++ b/Plain Craft Launcher 2/My Project/Resources.resx @@ -145,8 +145,11 @@ ..\Resources\libwebp64.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\lwjgl-unsafe-agent.jar;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + - ..\Resources\ModData.txt;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + ..\Resources\moddata.zip;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ..\Resources\NAudio.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 diff --git a/Plain Craft Launcher 2/Pages/PageDownload/Comp/MyCompItem.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/Comp/MyCompItem.xaml.vb index 0a36182..6843a0b 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/Comp/MyCompItem.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/Comp/MyCompItem.xaml.vb @@ -94,36 +94,36 @@ End If '打开详情页 Dim TargetType As CompType - Dim TargetVersion As String = Nothing + Dim TargetInstance As String = Nothing Dim TargetLoader As CompModLoaderType = CompModLoaderType.Any If FrmMain.PageCurrent.Page = FormMain.PageType.Download Then '从下载页进入 Select Case FrmMain.PageCurrentSub Case FormMain.PageSubType.DownloadMod TargetType = CompType.Mod - TargetVersion = FrmDownloadMod.Content.Loader.Input.GameVersion + TargetInstance = FrmDownloadMod.Content.Loader.Input.GameVersion TargetLoader = FrmDownloadMod.Content.Loader.Input.ModLoader Case FormMain.PageSubType.DownloadPack TargetType = CompType.ModPack - TargetVersion = FrmDownloadPack.Content.Loader.Input.GameVersion + TargetInstance = FrmDownloadPack.Content.Loader.Input.GameVersion Case FormMain.PageSubType.DownloadDataPack TargetType = CompType.DataPack - TargetVersion = FrmDownloadDataPack.Content.Loader.Input.GameVersion + TargetInstance = FrmDownloadDataPack.Content.Loader.Input.GameVersion Case FormMain.PageSubType.DownloadResourcePack TargetType = CompType.ResourcePack - TargetVersion = FrmDownloadResourcePack.Content.Loader.Input.GameVersion + TargetInstance = FrmDownloadResourcePack.Content.Loader.Input.GameVersion Case FormMain.PageSubType.DownloadShader TargetType = CompType.Shader - TargetVersion = FrmDownloadShader.Content.Loader.Input.GameVersion + TargetInstance = FrmDownloadShader.Content.Loader.Input.GameVersion End Select Else '从详情页进入(查看前置) TargetType = CompType.Any '允许任意类别 - TargetVersion = FrmMain.PageCurrent.Additional(2) + TargetInstance = FrmMain.PageCurrent.Additional(2) TargetLoader = FrmMain.PageCurrent.Additional(3) End If FrmMain.PageChange(New FormMain.PageStackData With {.Page = FormMain.PageType.CompDetail, - .Additional = {sender.Tag, New List(Of String), TargetVersion, TargetLoader, TargetType}}) + .Additional = {sender.Tag, New List(Of String), TargetInstance, TargetLoader, TargetType}}) End Sub '鼠标点击判定 diff --git a/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageComp.xaml b/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageComp.xaml index 456ca3b..d669f8d 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageComp.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageComp.xaml @@ -32,20 +32,21 @@ - + + + + - - + - - + @@ -53,7 +54,7 @@ - + @@ -87,7 +88,7 @@ - + \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageComp.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageComp.xaml.vb index 746cdad..9df5bb3 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageComp.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageComp.xaml.vb @@ -127,7 +127,7 @@ Public Class PageComp .GameVersion = GameVersion .Tag = ComboSearchTag.SelectedItem.Tag .ModLoader = If(PageType = CompType.Mod, Val(ComboSearchLoader.SelectedItem.Tag), CompModLoaderType.Any) - .Source = CType(Val(ComboSearchSource.SelectedItem.Tag), CompSourceType) + .Sources = CType(Val(ComboSearchSource.SelectedItem.Tag), CompSourceType) End With Return Request End Function diff --git a/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageDownloadCompDetail.xaml b/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageDownloadCompDetail.xaml index eb4a37c..f95e25d 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageDownloadCompDetail.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageDownloadCompDetail.xaml @@ -20,6 +20,7 @@ + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageDownloadCompDetail.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageDownloadCompDetail.xaml.vb index 4a8ef69..ec936d4 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageDownloadCompDetail.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageDownloadCompDetail.xaml.vb @@ -8,7 +8,7 @@ Sub(Task) LoadTargetFromAdditional() Dim Result = CompFilesGet(Project.Id, Project.FromCurseForge) - If Task.IsAborted Then Return + If Task.IsInterrupted Then Return Task.Output = Result End Sub) @@ -21,14 +21,15 @@ Project = FrmMain.PageCurrent.Additional(0) TargetInstance = FrmMain.PageCurrent.Additional(2) TargetLoader = FrmMain.PageCurrent.Additional(3) - PageType = FrmMain.PageCurrent.Additional(4) + TargetType = FrmMain.PageCurrent.Additional(4) End Sub Private Project As CompProject Private TargetInstance As String, TargetLoader As CompModLoaderType ''' - ''' 当前页面应展示的内容类别。可能为 Any。 + ''' 当前页面应展示的内容类别。 + ''' 若当前页面是在查看前置时进入,则也可能为 Any。 ''' - Private PageType As CompType + Private TargetType As CompType '自动重试 Private Sub Load_State(sender As Object, state As MyLoading.MyLoadingState, oldState As MyLoading.MyLoadingState) Handles Load.StateChanged Select Case CompFileLoader.State @@ -74,13 +75,13 @@ '筛选类型相同的结果(Modrinth 会返回 Mod、服务端插件、数据包混合的列表) Private Function GetResults() As List(Of CompFile) Dim Results As List(Of CompFile) = CompFileLoader.Output - Select Case PageType + Select Case TargetType Case CompType.Any Results = Results.Where(Function(r) r.Type <> CompType.Plugin).ToList Case CompType.Shader, CompType.ResourcePack '不筛选光影和资源包,否则原版光影会因为是资源包格式而被过滤(#6473) Case Else - Results = Results.Where(Function(r) r.Type = PageType).ToList + Results = Results.Where(Function(r) r.Type = TargetType).ToList End Select Return Results End Function @@ -171,7 +172,7 @@ GroupDone: Version.Type = CompType.Mod AndAlso '是 Mod McVersion.IsFormatFit(VerName) Then '不是 “快照版本” 之类的 For Each Loader In Version.ModLoaders - If Loader = CompModLoaderType.Quilt AndAlso Setup.Get("ToolDownloadIgnoreQuilt") Then Continue For + If Loader = CompModLoaderType.Quilt AndAlso Settings.Get("ToolDownloadIgnoreQuilt") Then Continue For If SupportedLoaders.Contains(Loader) Then Loaders.Add(Loader.ToString & " ") Next End If @@ -204,7 +205,7 @@ GroupDone: If Not Pair.Value.Any() Then Continue For If Pair.Key = TargetCardName.Replace("(所选版本)", "") Then Continue For '增加卡片 - Dim NewCard As New MyCard With {.Title = Pair.Key, .Margin = New Thickness(0, 0, 0, 15), .SwapType = If(PageType = CompType.ModPack, 9, 8)} '9 是安装,8 是另存为 + Dim NewCard As New MyCard With {.Title = Pair.Key, .Margin = New Thickness(0, 0, 0, 15), .SwapType = If(TargetType = CompType.ModPack, 9, 8)} '9 是安装,8 是另存为 Dim NewStack As New StackPanel With {.Margin = New Thickness(20, MyCard.SwapedHeight, 18, 0), .VerticalAlignment = VerticalAlignment.Top, .RenderTransform = New TranslateTransform(0, 0), .Tag = Pair.Value} NewCard.Children.Add(NewStack) NewCard.SwapControl = NewStack @@ -213,7 +214,7 @@ GroupDone: If Pair.Key = TargetCardName OrElse (FrmMain.PageCurrent.Additional IsNot Nothing AndAlso '#2761 CType(FrmMain.PageCurrent.Additional(1), List(Of String)).Contains(NewCard.Title)) Then - MyCard.StackInstall(NewStack, If(PageType = CompType.ModPack, 9, 8), Pair.Key) '9 是安装,8 是另存为 + MyCard.StackInstall(NewStack, If(TargetType = CompType.ModPack, 9, 8), Pair.Key) '9 是安装,8 是另存为 Else NewCard.IsSwapped = True End If @@ -226,19 +227,28 @@ GroupDone: If PanResults.Children.Count = 1 Then CType(PanResults.Children(0), MyCard).IsSwapped = False End If + '替代提示 + If Project.Types = CompType.ModOrDataPack AndAlso (TargetType = CompType.Mod OrElse TargetType = CompType.DataPack) Then + HintAlternative.Visibility = Visibility.Visible + HintAlternative.Text = If(TargetType = CompType.Mod, + "以下是该项目的 Mod 版本。点击这里查看其数据包版本。", "以下是该项目的数据包版本。点击这里查看其 Mod 版本。") + Else + HintAlternative.Visibility = Visibility.Collapsed + End If Catch ex As Exception Log(ex, "可视化工程下载列表出错", LogLevel.Feedback) End Try End Sub Private Function GetGroupedVersionName(Name As String, GroupedByDrop As Boolean, FoldOld As Boolean) As String + Dim Drop = McVersion.VersionToDrop(Name) If Name Is Nothing Then Return "其他" - ElseIf Name.Contains("w") Then + ElseIf Name.Contains("w") OrElse Drop = 209 Then Return "快照版" - ElseIf Not McVersion.IsFormatFit(Name) OrElse (FoldOld AndAlso McVersion.VersionToDrop(Name, True) < 120) Then + ElseIf Not McVersion.IsFormatFit(Name) OrElse (FoldOld AndAlso Drop < 120) Then Return "远古版" ElseIf GroupedByDrop Then - Return McVersion.DropToVersion(McVersion.VersionToDrop(Name, True)) + Return McVersion.DropToVersion(Drop) Else Return Name End If @@ -303,7 +313,7 @@ GroupDone: Select Case MyLoader.State Case LoadState.Failed Hint(MyLoader.Name & "失败:" & MyLoader.Error.GetBrief(), HintType.Red) - Case LoadState.Aborted + Case LoadState.Interrupted Hint(MyLoader.Name & "已取消!", HintType.Blue) Case LoadState.Loading Return '不重新加载版本列表 @@ -359,8 +369,38 @@ GroupDone: If Not Instance.IsLoaded Then Instance.Load() '只对 Mod 和数据包进行版本检测 If File.Type = CompType.Mod OrElse File.Type = CompType.DataPack Then - If File.GameVersions.Any(Function(v) v.Contains(".")) AndAlso - Not File.GameVersions.Any(Function(v) v.Contains(".") AndAlso v = Instance.Version.VanillaName) Then Return False + If Not File.GameVersions.Any( '判断是否有任何一个版本匹配 + Function(FileVersion) + Dim FileIsSnapshot As Boolean = FileVersion.Contains("预览版") OrElse Not FileVersion.Contains(".") + Dim InstanceIsSnapshot As Boolean = Instance.Version.VanillaName.Contains("snapshot") OrElse Not Instance.Version.VanillaName.Contains(".") + If FileIsSnapshot <> InstanceIsSnapshot Then + '只有一种是预览版 + Return False + ElseIf Not FileIsSnapshot AndAlso Not InstanceIsSnapshot Then + '都不是预览版 + Return FileVersion = Instance.Version.VanillaName + Else + '都是预览版 + Dim FileIsNewFormat As Boolean = FileVersion.Contains(".") AndAlso Val(FileVersion.BeforeFirst(".")) > 1 + Dim InstanceIsNewFormat As Boolean = Instance.Version.Drop > 250 + If FileIsNewFormat <> InstanceIsNewFormat Then + '只有一种是新格式快照 + Return False + ElseIf FileIsNewFormat AndAlso InstanceIsNewFormat Then + '都是新格式快照 + Return FileVersion.BeforeFirst(" ") = Instance.Version.VanillaName.BeforeFirst("-") + Else + '都是旧格式快照 + If FileVersion.Contains("w") AndAlso Instance.Version.VanillaName.Contains("w") Then + '都是 w 快照 + Return FileVersion = Instance.Version.VanillaName + Else + '不全是 w 快照 + Return True '只能假定相同,无法判断 + End If + End If + End If + End Function) Then Return False End If '加载器 If Not AllowedLoaders.Any() Then Return True '无要求 @@ -412,7 +452,7 @@ GroupDone: Else Dim ChineseName As String = Project.TranslatedName.BeforeFirst(" (").BeforeFirst(" - "). Replace("\", "\").Replace("/", "/").Replace("|", "|").Replace(":", ":").Replace("<", "<").Replace(">", ">").Replace("*", "*").Replace("?", "?").Replace("""", "").Replace(": ", ":") - Select Case Setup.Get("ToolDownloadTranslateV2") + Select Case Settings.Get("ToolDownloadTranslateV2") Case 0 FileName = $"【{ChineseName}】{File.FileName}" Case 1 @@ -433,8 +473,8 @@ GroupDone: Target = SelectSaveFile("选择保存位置", FileName, Desc & "文件|" & If(File.Type = CompType.Mod, - If(File.FileName.EndsWith(".litemod"), "*.litemod", "*.jar"), - If(File.FileName.EndsWith(".mrpack"), "*.mrpack", "*.zip")), DefaultFolder) + If(File.FileName.EndsWithF(".litemod"), "*.litemod", "*.jar"), + If(File.FileName.EndsWithF(".mrpack"), "*.mrpack", "*.zip")), DefaultFolder) If Not Target.Contains("\") Then Return '构造步骤加载器 Dim LoaderName As String = Desc & "下载:" & IO.Path.GetFileNameWithoutExtension(Target) & " " @@ -464,4 +504,11 @@ GroupDone: ClipboardSet(CompItem.LabTitle.Text & CompItem.LabTitleRaw.Text) End Sub + 'Mod / 数据包 互相跳转 + Private Sub HintAlternative_Click() Handles HintAlternative.Click + TargetType = If(TargetType = CompType.Mod, CompType.DataPack, CompType.Mod) + FrmMain.PageCurrent.Additional(4) = TargetType '加载器会从这里重新拿数据 + PageLoaderRestart(IsForceRestart:=True) + End Sub + End Class diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 89d4a62..036589a 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -2,60 +2,8 @@ Public Module ModDownloadLib - ''' - ''' 如果 OptiFine 与 Forge 同时开始安装,就会导致 Forge 安装失败。 - ''' - Private InstallSyncLock As New Object - ''' - ''' 如果 OptiFine 与 Forge 同时复制原版 Jar,就会导致复制文件时冲突。 - ''' - Private VanillaSyncLock As New Object - #Region "Minecraft 下载" - ''' - ''' 下载某个 Minecraft 版本,这会创造一个单独的下载任务,失败会跳过执行并要求反馈。 - ''' 返回正在下载的任务,若跳过或失败,则返回 Nothing。 - ''' - ''' 所下载的 Minecraft 的版本名。 - ''' Json 文件的 Mojang 官方地址。 - Public Function McDownloadClient(Behaviour As NetPreDownloadBehaviour, Id As String, Optional JsonUrl As String = Nothing) As LoaderCombo(Of String) - Try - Dim VersionFolder As String = McFolderSelected & "versions\" & Id & "\" - - '重复任务检查 - For Each OngoingLoader In LoaderTaskbar.ToList() - If OngoingLoader.Name <> $"Minecraft {Id} 下载" Then Continue For - If Behaviour = NetPreDownloadBehaviour.ExitWhileExistsOrDownloading Then Return OngoingLoader - Hint("该版本正在下载中!", HintType.Red) - Return OngoingLoader - Next - - '已有版本检查 - If Behaviour <> NetPreDownloadBehaviour.IgnoreCheck AndAlso File.Exists(VersionFolder & Id & ".json") AndAlso File.Exists(VersionFolder & Id & ".jar") Then - If Behaviour = NetPreDownloadBehaviour.ExitWhileExistsOrDownloading Then Return Nothing - If MyMsgBox("版本 " & Id & " 已存在,是否重新下载?" & vbCrLf & "这会覆盖版本的 json 与 jar 文件,但不会影响版本隔离的文件。", "版本已存在", "继续", "取消") = 1 Then - File.Delete(VersionFolder & Id & ".jar") - File.Delete(VersionFolder & Id & ".json") - Else - Return Nothing - End If - End If - - '启动 - Dim Loader As New LoaderCombo(Of String)("Minecraft " & Id & " 下载", McDownloadClientLoader(Id, JsonUrl)) With {.OnStateChanged = AddressOf McInstallState} - Loader.Start(VersionFolder) - LoaderTaskbarAdd(Loader) - FrmMain.BtnExtraDownload.ShowRefresh() - FrmMain.BtnExtraDownload.Ribble() - Return Loader - - Catch ex As Exception - Log(ex, "开始 Minecraft 下载失败", LogLevel.Feedback) - Return Nothing - End Try - End Function - ''' ''' 获取下载某个 Minecraft 版本的加载器列表。 ''' 它必须安装到 McFolderSelected,但是可以自定义版本名(不过自定义的版本名不会修改 Json 中的 id 项)。 @@ -235,11 +183,11 @@ Public Module ModDownloadLib Dim Instance As New McInstance(VersionFolder) If Instance.JsonObject("downloads") Is Nothing OrElse Instance.JsonObject("downloads")("server") Is Nothing OrElse Instance.JsonObject("downloads")("server")("url") Is Nothing Then File.Delete(VersionFolder & Id & ".json") - If Not New DirectoryInfo(VersionFolder).GetFileSystemInfos.Any() Then Directory.Delete(VersionFolder) + If Not New DirectoryInfo(VersionFolder).GetFileSystemInfos.Any() Then DeleteDirectory(VersionFolder) Task.Output = New List(Of NetFile) Hint($"Mojang 没有给 Minecraft {Id} 提供官方服务端下载,没法下,撤退!", HintType.Red) Thread.Sleep(2000) '等玩家把上一个提示看完 - Task.Abort() + Task.Interrupt() Return End If Dim JarUrl As String = Instance.JsonObject("downloads")("server")("url") @@ -254,7 +202,7 @@ echo 你可以在 PCL 的 [设置 → 启动选项] 中查看已安装的 java echo ------------------------------ echo 如果提示 ""You need to agree to the EULA in order to run the server"",请打开 eula.txt,按说明阅读并同意 Minecraft EULA 后,将该文件最后一行中的 eula=false 改为 eula=true。 echo ------------------------------ -""java"" -server -XX:+UseG1GC -Xmx4096M -Xms1024M -XX:+UseCompressedOops -jar {Id}-server.jar nogui +""java"" -server -XX:+UseG1GC -Xmx6144M -Xms1024M -jar {Id}-server.jar nogui echo ---------------------- echo 服务端已停止。 pause" @@ -327,7 +275,7 @@ pause" ''' 在 version_manifest.json 中的对应项。 Public Sub McUpdateLogShow(InstanceJson As JToken) Dim WikiName As String - Dim Id As String = InstanceJson("id").ToString.ToLower + Dim Id As String = InstanceJson("id").ToString.Lower If Id = "3d shareware v1.34" Then WikiName = "3D_Shareware_v1.34" ElseIf Id = "2.0" Then @@ -420,22 +368,22 @@ pause" Dim JavaLoader = GetJavaDownloadLoader() Try JavaLoader.Start(17, IsForceRestart:=True) - Do While JavaLoader.State = LoadState.Loading AndAlso Not Task.IsAborted + Do While JavaLoader.State = LoadState.Loading AndAlso Not Task.IsInterrupted Thread.Sleep(10) Loop Finally - JavaLoader.Abort() '确保取消时中止 Java 下载 + JavaLoader.Interrupt() '确保取消时中止 Java 下载 End Try '检查下载结果 Java = JavaSelect("已取消安装。", New Version(1, 8, 0, 0)) - If Task.IsAborted Then Return + If Task.IsInterrupted Then Return If Java Is Nothing Then Throw New Exception("由于未找到 Java,已取消安装。") End If End SyncLock '添加 Java Wrapper 作为主 Jar Dim Arguments As String - If UseJavaWrapper AndAlso Not Setup.Get("LaunchAdvanceDisableJLW") Then - Arguments = $"-Doolloo.jlw.tmpdir=""{PathPure.TrimEnd("\")}"" -Duser.home=""{BaseMcFolderHome.TrimEnd("\")}"" -cp ""{Target}"" -jar ""{ExtractJavaWrapper()}"" optifine.Installer" + If UseJavaWrapper AndAlso Not Settings.Get("LaunchAdvanceDisableJLW") Then + Arguments = $"-Doolloo.jlw.tmpdir=""{PathPure.TrimEnd("\")}"" -Duser.home=""{BaseMcFolderHome.TrimEnd("\")}"" -cp ""{Target}"" -jar ""{ExtractPatch("JavaWrapper")}"" optifine.Installer" Else Arguments = $"-Duser.home=""{BaseMcFolderHome.TrimEnd("\")}"" -cp ""{Target}"" optifine.Installer" End If @@ -478,7 +426,7 @@ pause" Log(ex, "读取 OptiFine 安装器信息失败") End Try Try - If Task.State = LoadState.Aborted AndAlso Not process.HasExited Then + If Task.State = LoadState.Interrupted AndAlso Not process.HasExited Then Log("[Installer] 由于任务取消,已中止 OptiFine 安装") process.Kill() End If @@ -502,7 +450,7 @@ pause" Log(ex, "读取 OptiFine 安装器错误信息失败") End Try Try - If Task.State = LoadState.Aborted AndAlso Not process.HasExited Then + If Task.State = LoadState.Interrupted AndAlso Not process.HasExited Then Log("[Installer] 由于任务取消,已中止 OptiFine 安装") process.Kill() End If @@ -529,11 +477,11 @@ pause" ''' ''' 获取下载某个 OptiFine 版本的加载器列表。 + ''' 这不会补全所需的支持库文件,需要后续手动补全支持库。 ''' - Private Function McDownloadOptiFineLoader(DownloadInfo As DlOptiFineListEntry, Optional McFolder As String = Nothing, Optional ClientDownloadLoader As LoaderCombo(Of String) = Nothing, Optional ClientFolder As String = Nothing, Optional FixLibrary As Boolean = True) As List(Of LoaderBase) + Private Function McDownloadOptiFineLoader(DownloadInfo As DlOptiFineListEntry, McFolder As String, ClientDownloadLoader As LoaderCombo(Of String), ClientFolder As String) As List(Of LoaderBase) '参数初始化 - McFolder = If(McFolder, McFolderSelected) Dim IsCustomFolder As Boolean = McFolder <> McFolderSelected Dim Id As String = DownloadInfo.InstanceName Dim VersionFolder As String = McFolder & "versions\" & Id & "\" @@ -546,12 +494,6 @@ pause" '获取下载地址 Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("获取 OptiFine 主文件下载地址", Sub(Task As LoaderTask(Of String, List(Of NetFile))) - '启动依赖版本的下载 - If ClientDownloadLoader Is Nothing Then - If IsCustomFolder Then Throw New Exception("如果没有指定原版下载器,则不能指定 MC 安装文件夹") - ClientDownloadLoader = McDownloadClient(NetPreDownloadBehaviour.ExitWhileExistsOrDownloading, DownloadInfo.Inherit) - End If - Task.Progress = 0.1 Dim Sources As New List(Of String) 'BMCLAPI 源 Dim BmclapiInherit As String = DownloadInfo.Inherit @@ -564,8 +506,8 @@ pause" '官方源 Dim PageData As String Try - PageData = NetRequestByClient("https://optifine.net/adloadx?f=" & DownloadInfo.FileName, - Encoding:=New UTF8Encoding(False), Timeout:=15000, Accept:="text/html", SimulateBrowserHeaders:=True) + PageData = NetRequestByClientRetry("https://optifine.net/adloadx?f=" & DownloadInfo.FileName, + Encoding:=New UTF8Encoding(False), Accept:="text/html", SimulateBrowserHeaders:=True) Task.Progress = 0.8 Sources.Add("https://optifine.net/" & RegexSearch(PageData, "downloadx\?f=[^""']+")(0)) Log("[Download] OptiFine " & DownloadInfo.DisplayName & " 官方下载地址:" & Sources.Last) @@ -579,16 +521,15 @@ pause" Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("等待原版下载", Sub(Task As LoaderTask(Of List(Of NetFile), Boolean)) '等待原版文件下载完成 - If ClientDownloadLoader Is Nothing Then Return 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.Any Then Log("[Download] OptiFine 安装正在等待原版文件下载完成") - Do While TargetLoaders.Any AndAlso Not Task.IsAborted + Do While TargetLoaders.Any AndAlso Not Task.IsInterrupted TargetLoaders = TargetLoaders.Where(Function(l) l.State <> LoadState.Finished).ToList Thread.Sleep(50) Loop - If Task.IsAborted Then Return + If Task.IsInterrupted Then Return '拷贝原版文件 If Not IsCustomFolder Then Return SyncLock VanillaSyncLock @@ -699,13 +640,6 @@ Retry: End Sub) With {.ProgressWeight = 1}) End If - '下载支持库 - If FixLibrary Then - Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 OptiFine 支持库文件", - Sub(Task) Task.Output = McLibNetFilesFromInstance(New McInstance(VersionFolder))) With {.ProgressWeight = 1, .Show = False}) - Loaders.Add(New LoaderDownload("下载 OptiFine 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 4}) - End If - Return Loaders End Function ''' @@ -728,8 +662,8 @@ Retry: '官方源 Dim PageData As String Try - PageData = NetRequestByClient("https://optifine.net/adloadx?f=" & DownloadInfo.FileName, - Encoding:=New UTF8Encoding(False), Timeout:=15000, Accept:="text/html", SimulateBrowserHeaders:=True) + PageData = NetRequestByClientRetry("https://optifine.net/adloadx?f=" & DownloadInfo.FileName, + Encoding:=New UTF8Encoding(False), Accept:="text/html", SimulateBrowserHeaders:=True) Task.Progress = 0.8 Sources.Add("https://optifine.net/" & RegexSearch(PageData, "downloadx\?f=[^""']+")(0)) Log("[Download] OptiFine " & DownloadInfo.DisplayName & " 官方下载地址:" & Sources.Last) @@ -818,41 +752,6 @@ Retry: #Region "LiteLoader 下载" - Public Sub McDownloadLiteLoader(DownloadInfo As DlLiteLoaderListEntry) - Try - Dim Id As String = DownloadInfo.Inherit - Dim Target As String = PathTemp & "Download\" & Id & "-Liteloader.jar" - Dim InstanceName As String = DownloadInfo.Inherit & "-LiteLoader" - Dim VersionFolder As String = McFolderSelected & "versions\" & InstanceName & "\" - - '重复任务检查 - For Each OngoingLoader In LoaderTaskbar.ToList() - If OngoingLoader.Name <> $"LiteLoader {Id} 下载" Then Continue For - Hint("该版本正在下载中!", HintType.Red) - Return - Next - - '已有版本检查 - If File.Exists(VersionFolder & InstanceName & ".json") Then - If MyMsgBox("版本 " & InstanceName & " 已存在,是否重新下载?" & vbCrLf & "这会覆盖版本的 json 和 jar 文件,但不会影响版本隔离的文件。", "版本已存在", "继续", "取消") = 1 Then - File.Delete(VersionFolder & InstanceName & ".jar") - File.Delete(VersionFolder & InstanceName & ".json") - Else - Return - End If - End If - - '启动 - Dim Loader As New LoaderCombo(Of String)("LiteLoader " & Id & " 下载", McDownloadLiteLoaderLoader(DownloadInfo)) With {.OnStateChanged = AddressOf McInstallState} - Loader.Start(VersionFolder) - LoaderTaskbarAdd(Loader) - FrmMain.BtnExtraDownload.ShowRefresh() - FrmMain.BtnExtraDownload.Ribble() - - Catch ex As Exception - Log(ex, "开始 LiteLoader 下载失败", LogLevel.Feedback) - End Try - End Sub Private Sub McDownloadLiteLoaderSave(DownloadInfo As DlLiteLoaderListEntry) Try Dim Id As String = DownloadInfo.Inherit @@ -905,11 +804,11 @@ Retry: ''' ''' 获取下载某个 LiteLoader 版本的加载器列表。 + ''' 这不会补全所需的支持库文件,需要后续手动补全支持库。 ''' - Private Function McDownloadLiteLoaderLoader(DownloadInfo As DlLiteLoaderListEntry, Optional McFolder As String = Nothing, Optional ClientDownloadLoader As LoaderCombo(Of String) = Nothing, Optional FixLibrary As Boolean = True) As List(Of LoaderBase) + Private Function McDownloadLiteLoaderLoader(DownloadInfo As DlLiteLoaderListEntry, McFolder As String) As List(Of LoaderBase) '参数初始化 - McFolder = If(McFolder, McFolderSelected) Dim IsCustomFolder As Boolean = McFolder <> McFolderSelected Dim Id As String = DownloadInfo.Inherit Dim Target As String = PathTemp & "Download\" & Id & "-Liteloader.jar" @@ -917,14 +816,6 @@ Retry: Dim VersionFolder As String = McFolder & "versions\" & VersionName & "\" Dim Loaders As New List(Of LoaderBase) - '启动依赖版本的下载 - If ClientDownloadLoader Is Nothing Then - Loaders.Add(New LoaderTask(Of String, String)("启动 LiteLoader 依赖版本下载", - Sub() - If IsCustomFolder Then Throw New Exception("如果没有指定原版下载器,则不能指定 MC 安装文件夹") - ClientDownloadLoader = McDownloadClient(NetPreDownloadBehaviour.ExitWhileExistsOrDownloading, DownloadInfo.Inherit) - End Sub) With {.ProgressWeight = 0.2, .Show = False, .Block = False}) - End If '安装 Loaders.Add(New LoaderTask(Of String, String)("安装 LiteLoader", Sub(Task As LoaderTask(Of String, String)) @@ -950,12 +841,6 @@ Retry: Throw New Exception("安装新 LiteLoader 版本失败", ex) End Try End Sub) With {.ProgressWeight = 1}) - '下载支持库 - If FixLibrary Then - Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 LiteLoader 支持库文件", - Sub(Task) Task.Output = McLibNetFilesFromInstance(New McInstance(VersionFolder))) With {.ProgressWeight = 1, .Show = False}) - Loaders.Add(New LoaderDownload("下载 LiteLoader 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 6}) - End If Return Loaders End Function @@ -1095,22 +980,22 @@ Retry: Dim JavaLoader = GetJavaDownloadLoader() Try JavaLoader.Start(17, IsForceRestart:=True) - Do While JavaLoader.State = LoadState.Loading AndAlso Not Task.IsAborted + Do While JavaLoader.State = LoadState.Loading AndAlso Not Task.IsInterrupted Thread.Sleep(10) Loop Finally - JavaLoader.Abort() '确保取消时中止 Java 下载 + JavaLoader.Interrupt() '确保取消时中止 Java 下载 End Try '检查下载结果 Java = JavaSelect("已取消安装。", New Version(1, 8, 0, 60)) - If Task.IsAborted Then Return + If Task.IsInterrupted Then Return If Java Is Nothing Then Throw New Exception("由于未找到 Java,已取消安装。") End If End SyncLock '添加 Java Wrapper 作为主 Jar Dim Arguments As String - If UseJavaWrapper AndAlso Not Setup.Get("LaunchAdvanceDisableJLW") Then - Arguments = $"-Doolloo.jlw.tmpdir=""{PathPure.TrimEnd("\")}"" -cp ""{PathTemp}Cache\forge_installer.jar;{Target}"" -jar ""{ExtractJavaWrapper()}"" com.bangbang93.ForgeInstaller ""{McFolder}" + If UseJavaWrapper AndAlso Not Settings.Get("LaunchAdvanceDisableJLW") Then + Arguments = $"-Doolloo.jlw.tmpdir=""{PathPure.TrimEnd("\")}"" -cp ""{PathTemp}Cache\forge_installer.jar;{Target}"" -jar ""{ExtractPatch("JavaWrapper")}"" com.bangbang93.ForgeInstaller ""{McFolder}" Else Arguments = $"-cp ""{PathTemp}Cache\forge_installer.jar;{Target}"" com.bangbang93.ForgeInstaller ""{McFolder}" End If @@ -1146,7 +1031,7 @@ Retry: Log(ex, $"读取 {LoaderName} 安装器信息失败") End Try Try - If Task.State = LoadState.Aborted AndAlso Not process.HasExited Then + If Task.State = LoadState.Interrupted AndAlso Not process.HasExited Then Log($"[Installer] 由于任务取消,已中止 {LoaderName} 安装") process.Kill() End If @@ -1169,7 +1054,7 @@ Retry: Log(ex, $"读取 {LoaderName} 安装器错误信息失败") End Try Try - If Task.State = LoadState.Aborted AndAlso Not process.HasExited Then + If Task.State = LoadState.Interrupted AndAlso Not process.HasExited Then Log($"[Installer] 由于任务取消,已中止 {LoaderName} 安装") process.Kill() End If @@ -1190,7 +1075,7 @@ Retry: process.Dispose() '检查是否安装成功:最后 5 行中是否有 true(true 可能在倒数数行,见 #832) If LastResults.Reverse().Take(5).Any(Function(l) l = "true") Then Return - Log(Join(LastResults, vbCrLf)) + Log(LastResults.Join(vbCrLf)) Dim LastLines As String = "" For i As Integer = Math.Max(0, LastResults.Count - 5) To LastResults.Count - 1 '最后 5 行 LastLines &= vbCrLf & LastResults(i) @@ -1245,7 +1130,7 @@ Retry: ''' ''' 获取下载某个 Forgelike 版本的加载器列表。 ''' - Private Function McDownloadForgelikeLoader(IsNeoForge As Boolean, LoaderVersion As String, NewInstanceName As String, Inherit As String, Optional Info As DlForgelikeEntry = Nothing, Optional McFolder As String = Nothing, Optional ClientDownloadLoader As LoaderCombo(Of String) = Nothing, Optional ClientFolder As String = Nothing) As List(Of LoaderBase) + Private Function McDownloadForgelikeLoader(IsNeoForge As Boolean, LoaderVersion As String, NewInstanceName As String, Inherit As String, Info As DlForgelikeEntry, McFolder As String, ClientDownloadLoader As LoaderCombo(Of String), ClientFolder As String) As List(Of LoaderBase) '参数初始化 McFolder = If(McFolder, McFolderSelected) @@ -1291,11 +1176,6 @@ Retry: '下载 Forgelike 主文件 Loaders.Add(New LoaderTask(Of String, List(Of NetFile))($"准备下载 {LoaderName}", Sub(Task As LoaderTask(Of String, List(Of NetFile))) - '启动依赖版本的下载 - If ClientDownloadLoader Is Nothing Then - If IsCustomFolder Then Throw New Exception("如果没有指定原版下载器,则不能指定 MC 安装文件夹") - ClientDownloadLoader = McDownloadClient(NetPreDownloadBehaviour.ExitWhileExistsOrDownloading, Inherit) - End If '添加主文件下载 Dim Files As New List(Of NetFile) If Info.IsNeoForge Then @@ -1353,8 +1233,8 @@ Retry: Task.Progress = 0.8 '去除其中的原始 Forgelike 项 For i = 0 To Libs.Count - 1 - If Libs(i).LocalPath.EndsWithF($"{LoaderName.ToLower}-{Inherit}-{LoaderVersion}.jar") OrElse - Libs(i).LocalPath.EndsWithF($"{LoaderName.ToLower}-{Inherit}-{LoaderVersion}-client.jar") Then + If Libs(i).LocalPath.EndsWithF($"{LoaderName.Lower}-{Inherit}-{LoaderVersion}.jar") OrElse + Libs(i).LocalPath.EndsWithF($"{LoaderName.Lower}-{Inherit}-{LoaderVersion}-client.jar") Then Log($"[Download] 已从待下载 {LoaderName} 支持库中移除:" & Libs(i).LocalPath, LogLevel.Debug) Libs.RemoveAt(i) Exit For @@ -1385,16 +1265,15 @@ Retry: #End Region #Region "原版文件" '等待原版文件下载完成 - If ClientDownloadLoader Is Nothing Then Return 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.Any Then Log($"[Download] {LoaderName} 安装正在等待原版文件下载完成") - Do While TargetLoaders.Any AndAlso Not Task.IsAborted + Do While TargetLoaders.Any AndAlso Not Task.IsInterrupted TargetLoaders = TargetLoaders.Where(Function(l) l.State <> LoadState.Finished).ToList Thread.Sleep(50) Loop - If Task.IsAborted Then Return + If Task.IsInterrupted Then Return '拷贝原版文件 If Not IsCustomFolder Then Return SyncLock VanillaSyncLock @@ -1541,7 +1420,7 @@ Retry: Public Sub ForgeDownloadListItemPreload(Stack As StackPanel, Entries As List(Of DlForgeVersionEntry), OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean) '如果只有一个版本,则不特别列出 - If Entries.Count = 1 Then Return + If Entries.IsSingle Then Return '获取推荐版本与最新版本 Dim FreshVersion As DlForgeVersionEntry = Nothing If Entries.Any Then @@ -1662,7 +1541,7 @@ Retry: Next If RecommendedList.Count < 5 Then Throw New Exception("获取的推荐版本数过少(" & Result & ")") '保存 - Dim CacheJson As String = "{" & Join(RecommendedList, ",") & "}" + Dim CacheJson As String = "{" & RecommendedList.Join(",") & "}" WriteFile(PathTemp & "Cache\ForgeRecommendedList.json", CacheJson) Log("[Download] 刷新 Forge 推荐版本缓存成功") Catch ex As Exception @@ -1698,7 +1577,7 @@ Retry: Public Sub NeoForgeDownloadListItemPreload(Stack As StackPanel, Entries As List(Of DlNeoForgeListEntry), OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean) '如果只有一个版本,则不特别列出 - If Entries.Count = 1 Then Return + If Entries.IsSingle Then Return '获取最新稳定版和测试版 Dim FreshStableVersion As DlNeoForgeListEntry = Nothing Dim FreshBetaVersion As DlNeoForgeListEntry = Nothing @@ -1832,11 +1711,11 @@ Retry: ''' ''' 获取下载某个 Fabric 版本的加载器列表。 + ''' 这不会补全所需的支持库文件,需要后续手动补全支持库。 ''' - Private Function McDownloadFabricLoader(FabricVersion As String, MinecraftName As String, Optional McFolder As String = Nothing, Optional FixLibrary As Boolean = True) As List(Of LoaderBase) + Private Function McDownloadFabricLoader(FabricVersion As String, MinecraftName As String, McFolder As String) As List(Of LoaderBase) '参数初始化 - McFolder = If(McFolder, McFolderSelected) Dim IsCustomFolder As Boolean = McFolder <> McFolderSelected Dim Id As String = "fabric-loader-" & FabricVersion & "-" & MinecraftName Dim VersionFolder As String = McFolder & "versions\" & Id & "\" @@ -1846,26 +1725,13 @@ Retry: MinecraftName = MinecraftName.Replace("∞", "infinite") '放在 ID 后面避免影响版本文件夹名称 Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("获取 Fabric 主文件下载地址", Sub(Task As LoaderTask(Of String, List(Of NetFile))) - '启动依赖版本的下载 - If FixLibrary Then - McDownloadClient(NetPreDownloadBehaviour.ExitWhileExistsOrDownloading, MinecraftName) - End If - Task.Progress = 0.5 - '构造文件请求 Task.Output = New List(Of NetFile) From {New NetFile({ "https://bmclapi2.bangbang93.com/fabric-meta/v2/versions/loader/" & MinecraftName & "/" & FabricVersion & "/profile/json", "https://meta.fabricmc.net/v2/versions/loader/" & MinecraftName & "/" & FabricVersion & "/profile/json" - }, VersionFolder & Id & ".json", New FileChecker(IsJson:=True))} + }, VersionFolder & Id & ".json", New FileChecker(IsJson:=True))} '构造文件请求 End Sub) With {.ProgressWeight = 0.5}) Loaders.Add(New LoaderDownload("下载 Fabric 主文件", New List(Of NetFile)) With {.ProgressWeight = 2.5}) - '下载支持库 - If FixLibrary Then - Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 Fabric 支持库文件", - Sub(Task) Task.Output = McLibNetFilesFromInstance(New McInstance(VersionFolder))) With {.ProgressWeight = 1, .Show = False}) - Loaders.Add(New LoaderDownload("下载 Fabric 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 8}) - End If - Return Loaders End Function @@ -1901,7 +1767,7 @@ Retry: Return New MyVirtualizingElement(Of MyListItem)( Function() Dim NewItem As New MyListItem With { - .Title = Entry.DisplayName.ToLower.Replace("optifabric-", "").Replace(".jar", "").Trim.TrimStart("v"), .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Entry, + .Title = Entry.DisplayName.Lower.Replace("optifabric-", "").Replace(".jar", "").Trim.TrimStart("v"), .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Entry, .Info = Entry.StatusDescription & ",发布于 " & Entry.ReleaseDate.ToString("yyyy'/'MM'/'dd HH':'mm"), .Logo = PathImage & "Blocks/OptiFabric.png" } @@ -1999,7 +1865,7 @@ Retry: Hint(Loader.Name & "成功!", HintType.Green) Case LoadState.Failed Hint(Loader.Name & "失败:" & Loader.Error.GetBrief(), HintType.Red) - Case LoadState.Aborted + Case LoadState.Interrupted Hint(Loader.Name & "已取消!", HintType.Blue) End Select End Sub @@ -2011,9 +1877,10 @@ Retry: Case LoadState.Finished WriteIni(McFolderSelected & "PCL.ini", "InstanceCache", "") '清空缓存(合并安装会先生成文件夹,这会在刷新时误判为可以使用缓存) Hint(Loader.Name & "成功!", HintType.Green) + 'TODO: 自动选择安装成功的版本 Case LoadState.Failed - Hint(Loader.Name & "失败:" & Loader.Error.GetBrief(), HintType.Red) - Case LoadState.Aborted + MyMsgBox(Loader.Error.GetDetail, Loader.Name & "失败", IsWarn:=True) + Case LoadState.Interrupted Hint(Loader.Name & "已取消!", HintType.Blue) Case LoadState.Loading Return '不重新加载版本列表 @@ -2024,7 +1891,7 @@ Retry: Public Sub McInstallFailedClearFolder(Loader) Try Thread.Sleep(1000) '防止存在尚未完全释放的文件,导致清理失败(例如整合包安装) - If Loader.State = LoadState.Failed OrElse Loader.State = LoadState.Aborted Then + If Loader.State = LoadState.Failed OrElse Loader.State = LoadState.Interrupted Then '删除版本文件夹 If Directory.Exists(Loader.Input & "saves\") OrElse Directory.Exists(Loader.Input & "versions\") Then Log("[Download] 由于版本已被独立启动,不清理版本文件夹:" & Loader.Input, LogLevel.Developer) @@ -2102,7 +1969,11 @@ Retry: Dim OptiFineAsMod As Boolean = Request.OptiFineEntry IsNot Nothing AndAlso Modable '选择了 OptiFine 与任意 Mod 加载器 If OptiFineAsMod Then Log("[Download] OptiFine 将作为 Mod 进行下载") - OptiFineFolder = ModsTempFolder + If Request.LiteLoaderEntry IsNot Nothing Then + OptiFineFolder = ModsTempFolder & Request.MinecraftName & "\" '#8147 + Else + OptiFineFolder = ModsTempFolder + End If End If '记录日志 @@ -2140,7 +2011,7 @@ Retry: LoaderList.Add(New LoaderCombo(Of String)("下载 OptiFine " & Request.OptiFineEntry.DisplayName, McDownloadOptiFineSaveLoader(Request.OptiFineEntry, OptiFineFolder & Request.OptiFineEntry.FileName)) With {.Show = False, .ProgressWeight = 16, .Block = Request.ForgeVersion Is Nothing AndAlso Request.NeoForgeVersion Is Nothing AndAlso Request.FabricVersion Is Nothing AndAlso Request.LiteLoaderEntry Is Nothing}) Else - LoaderList.Add(New LoaderCombo(Of String)("下载 OptiFine " & Request.OptiFineEntry.DisplayName, McDownloadOptiFineLoader(Request.OptiFineEntry, TempMcFolder, ClientLoader, Request.VersionFolder, False)) With {.Show = False, .ProgressWeight = 24, + LoaderList.Add(New LoaderCombo(Of String)("下载 OptiFine " & Request.OptiFineEntry.DisplayName, McDownloadOptiFineLoader(Request.OptiFineEntry, TempMcFolder, ClientLoader, Request.VersionFolder)) With {.Show = False, .ProgressWeight = 24, .Block = Request.ForgeVersion Is Nothing AndAlso Request.NeoForgeVersion Is Nothing AndAlso Request.FabricVersion Is Nothing AndAlso Request.LiteLoaderEntry Is Nothing}) End If End If @@ -2156,12 +2027,12 @@ Retry: End If 'LiteLoader If Request.LiteLoaderEntry IsNot Nothing Then - LoaderList.Add(New LoaderCombo(Of String)("下载 LiteLoader " & Request.MinecraftName, McDownloadLiteLoaderLoader(Request.LiteLoaderEntry, TempMcFolder, ClientLoader, False)) With {.Show = False, .ProgressWeight = 1, + LoaderList.Add(New LoaderCombo(Of String)("下载 LiteLoader " & Request.MinecraftName, McDownloadLiteLoaderLoader(Request.LiteLoaderEntry, TempMcFolder)) With {.Show = False, .ProgressWeight = 1, .Block = Request.FabricVersion Is Nothing}) End If 'Fabric If Request.FabricVersion IsNot Nothing Then - LoaderList.Add(New LoaderCombo(Of String)("下载 Fabric " & Request.FabricVersion, McDownloadFabricLoader(Request.FabricVersion, Request.MinecraftName, TempMcFolder, False)) With {.Show = False, .ProgressWeight = 2, + LoaderList.Add(New LoaderCombo(Of String)("下载 Fabric " & Request.FabricVersion, McDownloadFabricLoader(Request.FabricVersion, Request.MinecraftName, TempMcFolder)) With {.Show = False, .ProgressWeight = 2, .Block = True}) End If '合并安装 @@ -2313,7 +2184,7 @@ Retry: SplitArguments.Add(RawArguments(i)) End If Next - Dim RealArguments As String = Join(SplitArguments.Distinct.ToList, " ") + Dim RealArguments As String = SplitArguments.Distinct.Join(" ") '合并 '相关讨论见 #2801 OutputJson = MinecraftJson @@ -2368,4 +2239,48 @@ Retry: #End Region + ''' + ''' 如果 OptiFine 与 Forge 同时开始安装,就会导致 Forge 安装失败。 + ''' + Private InstallSyncLock As New Object + ''' + ''' 如果 OptiFine 与 Forge 同时复制原版 JAR,就会导致复制文件时冲突。 + ''' + Private VanillaSyncLock As New Object + + ''' + ''' 释放补丁文件并返回完整文件路径。 + ''' + ''' "LUA" 或 "JavaWrapper"。 + Public Function ExtractPatch(Patch As String) As String + Dim PatchPath As String = $"{PathPure}{Patch}.jar" + Log($"[Java] 选定的 {Patch} 路径:{PatchPath}") + Static Lock As New Object + SyncLock Lock '避免 OptiFine 和 Forge 安装时同时释放导致冲突 + Try + WriteFile(PatchPath, GetResources(Patch)) + Catch ex As Exception + If File.Exists(PatchPath) Then + '因为未知原因可能变为只读文件(#4243) + Log(ex, $"{Patch} 文件释放失败,但文件已存在,将在删除后尝试重新生成", LogLevel.Developer) + Try + File.Delete(PatchPath) + WriteFile(PatchPath, GetResources(Patch)) + Catch ex2 As Exception + Log(ex2, $"{Patch} 文件重新释放失败,将尝试更换文件名重新生成", LogLevel.Developer) + PatchPath = $"{PathPure}{Patch}2.jar" + Try + WriteFile(PatchPath, GetResources(Patch)) + Catch ex3 As Exception + Throw New FileNotFoundException($"释放 {Patch} 最终尝试失败", ex3) + End Try + End Try + Else + Throw New FileNotFoundException($"释放 {Patch} 失败", ex) + End If + End Try + End SyncLock + Return PatchPath + End Function + End Module diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb index 6efabd1..14d943f 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -161,7 +161,7 @@ Private VanillaIcon As String Private ReadOnly Property VanillaDrop As Integer Get - Return McVersion.VersionToDrop(VanillaName, True) + Return McVersion.VersionToDrop(VanillaName) End Get End Property @@ -322,7 +322,7 @@ Else BtnOptiFabricClear.Visibility = Visibility.Visible ImgOptiFabric.Visibility = Visibility.Visible - LabOptiFabric.Text = SelectedOptiFabric.DisplayName.ToLower.Replace("optifabric-", "").Replace(".jar", "").Trim.TrimStart("v") + LabOptiFabric.Text = SelectedOptiFabric.DisplayName.Lower.Replace("optifabric-", "").Replace(".jar", "").Trim.TrimStart("v") LabOptiFabric.Foreground = ColorGray1 End If End If @@ -456,22 +456,22 @@ Case "snapshot" Type = "预览版" 'Mojang 误分类 - If Version("id").ToString.StartsWith("1.") AndAlso - Not Version("id").ToString.ToLower.Contains("combat") AndAlso - Not Version("id").ToString.ToLower.Contains("rc") AndAlso - Not Version("id").ToString.ToLower.Contains("experimental") AndAlso - Not Version("id").ToString.ToLower.Contains("pre") Then + If Version("id").ToString.StartsWithF("1.") AndAlso + Not Version("id").ToString.Lower.Contains("combat") AndAlso + Not Version("id").ToString.Lower.Contains("rc") AndAlso + Not Version("id").ToString.Lower.Contains("experimental") AndAlso + Not Version("id").ToString.Lower.Contains("pre") Then Type = "正式版" Version("type") = "release" End If '愚人节版本 - Select Case Version("id").ToString.ToLower + Select Case Version("id").ToString.Lower Case "20w14infinite", "20w14∞" Type = "愚人节版" Version("id") = "20w14∞" Version("type") = "special" Version.Add("lore", GetMcFoolName(Version("id"))) - Case "3d shareware v1.34", "1.rv-pre1", "15w14a", "2.0", "22w13oneblockatatime", "23w13a_or_b", "24w14potato", "25w14craftmine" + Case "3d shareware v1.34", "1.rv-pre1", "15w14a", "2.0", "22w13oneblockatatime", "23w13a_or_b", "24w14potato", "25w14craftmine", "26w14a" Type = "愚人节版" Version("type") = "special" Version.Add("lore", GetMcFoolName(Version("id"))) @@ -566,7 +566,7 @@ Dim HasAny As Boolean = False Dim HasRequiredVersion As Boolean = False For Each OptiFineVersion As DlOptiFineListEntry In DlOptiFineListLoader.Output.Value - If Not OptiFineVersion.DisplayName.StartsWith(VanillaName & " ") Then Continue For '不是同一个大版本 + If Not OptiFineVersion.DisplayName.StartsWithF(VanillaName & " ") Then Continue For '不是同一个大版本 HasAny = True If SelectedForge Is Nothing Then Return Nothing '未选择 Forge If IsOptiFineSuitForForge(OptiFineVersion, SelectedForge) Then Return Nothing '该版本可用 @@ -609,7 +609,7 @@ Dim Versions As New List(Of DlOptiFineListEntry) For Each Version As DlOptiFineListEntry In DlOptiFineListLoader.Output.Value If SelectedForge IsNot Nothing AndAlso Not IsOptiFineSuitForForge(Version, SelectedForge) Then Continue For - If Version.DisplayName.StartsWith(VanillaName & " ") Then Versions.Add(Version) + If Version.DisplayName.StartsWithF(VanillaName & " ") Then Versions.Add(Version) Next If Not Versions.Any() Then Return '排序 @@ -915,16 +915,17 @@ Dim FabricApiName = FabricApi.DisplayName Try If FabricApiName Is Nothing OrElse VanillaName Is Nothing Then Return False - FabricApiName = FabricApiName.ToLower : VanillaName = VanillaName.Replace("∞", "infinite").Replace("Combat Test 7c", "1.16_combat-3").ToLower - If FabricApiName.StartsWith("[" & VanillaName & "]") Then Return True + FabricApiName = FabricApiName.Lower + Dim TargetName = VanillaName.Replace("∞", "infinite").Replace("Combat Test 7c", "1.16_combat-3").Lower + If FabricApiName.StartsWithF("[" & TargetName & "]") Then Return True If Not FabricApiName.Contains("/") OrElse Not FabricApiName.Contains("]") Then Return False '直接的判断(例如 1.18.1/22w03a) For Each Part As String In FabricApiName.BeforeFirst("]").TrimStart("[").Split("/") - If Part = VanillaName Then Return True + If Part = TargetName Then Return True Next '将版本名分割语素(例如 1.16.4/5) Dim Lefts = RegexSearch(FabricApiName.BeforeFirst("]"), "[a-z/]+|[0-9/]+") - Dim Rights = RegexSearch(VanillaName.BeforeFirst("]"), "[a-z/]+|[0-9/]+") + Dim Rights = RegexSearch(TargetName.BeforeFirst("]"), "[a-z/]+|[0-9/]+") '对每段进行判断 Dim i As Integer = 0 While True @@ -980,7 +981,7 @@ Dim Versions As New List(Of CompFile) For Each Version In DlFabricApiLoader.Output If IsFabricApiCompatible(Version) Then - If Not Version.DisplayName.StartsWith("[") Then + If Not Version.DisplayName.StartsWithF("[") Then Log("[Download] 已特判修改 Fabric API 显示名:" & Version.DisplayName, LogLevel.Debug) Version.DisplayName = "[" & VanillaName & "] " & Version.DisplayName End If @@ -1122,7 +1123,7 @@ Private Sub BtnStart_Click() Handles BtnStart.Click '确认版本隔离 If (SelectedForge IsNot Nothing OrElse SelectedNeoForge IsNot Nothing OrElse SelectedFabric IsNot Nothing) AndAlso - (Setup.Get("LaunchArgumentIndieV2") = 0 OrElse Setup.Get("LaunchArgumentIndieV2") = 2) Then + (Settings.Get("LaunchArgumentIndieV2") = 0 OrElse Settings.Get("LaunchArgumentIndieV2") = 2) Then If MyMsgBox("你尚未开启版本隔离,多个 MC 版本会共用同一个 Mod 文件夹。" & vbCrLf & "因此,游戏可能会因为读取到与当前版本不符的 Mod 而崩溃。" & vbCrLf & "推荐先在 设置 → 启动选项 → 默认版本隔离 中开启版本隔离!", "版本隔离提示", "取消下载", "继续") = 1 Then diff --git a/Plain Craft Launcher 2/Pages/PageInstance/MyLocalModItem.xaml.vb b/Plain Craft Launcher 2/Pages/PageInstance/MyLocalModItem.xaml.vb index 12a448c..203d100 100644 --- a/Plain Craft Launcher 2/Pages/PageInstance/MyLocalModItem.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageInstance/MyLocalModItem.xaml.vb @@ -313,8 +313,8 @@ Public Class MyLocalModItem Shortened = True Next If Shortened AndAlso CurrentSegs.Any() AndAlso NewestSegs.Any() Then - CurrentName = Join(CurrentSegs, "-") - NewestName = Join(NewestSegs, "-") + CurrentName = CurrentSegs.Join("-") + NewestName = NewestSegs.Join("-") Entry._Version = CurrentName '使用网络信息作为显示的版本号 End If Return $"当前版本:{CurrentName}({GetTimeSpanString(Entry.CompFile.ReleaseDate - Date.Now, False)}){vbCrLf}最新版本:{NewestName}({GetTimeSpanString(Entry.UpdateFile.ReleaseDate - Date.Now, False)})" @@ -323,7 +323,7 @@ Public Class MyLocalModItem '懒加载 Public Sub New() InitializeComponent() - OnFirstEnterScrollViewerViewport(AddressOf FirstEnterScrollViewerViewport) + LazyLoadBehavior.OnFirstEnterScrollViewerViewport(Me, AddressOf FirstEnterScrollViewerViewport) End Sub Private HasEnteredViewport As Boolean = False Private Sub FirstEnterScrollViewerViewport() @@ -347,7 +347,7 @@ Public Class MyLocalModItem DescFileName = GetFileNameFromPath(Entry.Path) End If Dim NewDescription As String - If Setup.Get("ToolModLocalNameStyle") = 1 Then + If Settings.Get("ToolModLocalNameStyle") = 1 Then '标题显示文件名,详情显示译名 '标题 Title = DescFileName @@ -357,7 +357,7 @@ Public Class MyLocalModItem NewDescription = Entry.DisplayName Else Dim Titles = Entry.Comp.GetControlTitle(False) - NewDescription = Titles.Key & Titles.Value + NewDescription = Titles.Title & Titles.SubTitle End If NewDescription = NewDescription.Replace(" | ", " / ") If Entry.Version IsNot Nothing Then NewDescription &= $" ({Entry.Version})" @@ -369,8 +369,8 @@ Public Class MyLocalModItem SubTitle = If(Entry.Version Is Nothing, "", " | " & Entry.Version) Else Dim Titles = Entry.Comp.GetControlTitle(False) - Title = Titles.Key - SubTitle = Titles.Value & If(Entry.Version Is Nothing, "", " | " & Entry.Version) + Title = Titles.Title + SubTitle = Titles.SubTitle & If(Entry.Version Is Nothing, "", " | " & Entry.Version) End If '描述 NewDescription = DescFileName diff --git a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml index badc9c3..e29a1f2 100644 --- a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml @@ -94,7 +94,7 @@ diff --git a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml.vb index d4297b5..7a1bf2e 100644 --- a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml.vb @@ -23,7 +23,7 @@ Public Class PageInstanceExport AniControlEnabled += 1 If CurrentInstance <> PageInstanceLeft.Instance.PathVersion Then RefreshAll() '切换到了另一个版本,重置页面 CustomEventService.SetEventData(BtnAdvancedHelp, - If(VersionBranchName = "Release", "指南/整合包制作 - Public.json", "指南/整合包制作 - Snapshot.json")) + If(VersionBranchCode = 50, "指南/整合包制作 - Public.json", "指南/整合包制作 - Snapshot.json")) AniControlEnabled -= 1 End Sub Public Sub RefreshAll() Implements IRefreshable.Refresh @@ -305,9 +305,9 @@ Public Class PageInstanceExport '保存配置文件 Private Sub ExportConfig() Handles BtnAdvancedExport.Click Try - Dim ConfigPath As String = SelectSaveFile("选择文件位置", "export_config.txt", "整合包导出配置(*.txt)|*.txt", Setup.Get("CacheExportConfig")) + Dim ConfigPath As String = SelectSaveFile("选择文件位置", "export_config.txt", "整合包导出配置(*.txt)|*.txt", Settings.Get("CacheExportConfig")) If String.IsNullOrEmpty(ConfigPath) Then Return - Setup.Set("CacheExportConfig", ConfigPath) + Settings.Set("CacheExportConfig", ConfigPath) Dim ConfigLines As New List(Of String) 'ini 段 ConfigLines.Add("Name:" & TextExportName.Text) @@ -351,9 +351,9 @@ Public Class PageInstanceExport '读取配置文件 Private Sub ImportConfig() Handles BtnAdvancedImport.Click Try - Dim ConfigPath As String = SelectFile("整合包导出配置(*.txt)|*.txt", "选择配置文件", Setup.Get("CacheExportConfig")) + Dim ConfigPath As String = SelectFile("整合包导出配置(*.txt)|*.txt", "选择配置文件", Settings.Get("CacheExportConfig")) If String.IsNullOrEmpty(ConfigPath) Then Return - Setup.Set("CacheExportConfig", ConfigPath) + Settings.Set("CacheExportConfig", ConfigPath) Dim Segments As String() = ReadFile(ConfigPath).Split(Sperator) 'ini 段 Dim Ini As New Dictionary(Of String, String) @@ -367,8 +367,8 @@ Public Class PageInstanceExport TextExportVersion.Text = Ini.GetOrDefault("Version", "") CheckOptionsPcl.Checked = Ini.GetOrDefault("IncludeLauncher", True) CheckOptionsPclCustom.Checked = Ini.GetOrDefault("IncludeLauncherCustom", True) - CheckAdvancedModrinth.Checked = Ini.GetOrDefault("ModrinthUploadMode", False) CheckAdvancedInclude.Checked = Ini.GetOrDefault("DontCheckHostedAssets", False) + If Not CheckAdvancedInclude.Checked Then CheckAdvancedModrinth.Checked = Ini.GetOrDefault("ModrinthUploadMode", False) '#7979,加个特判 ConfigPackPath = Ini.GetOrDefault("PackPath", Nothing) '导出内容段 RulesOverrides = Segments(1).Replace(vbCr, vbLf).Replace(vbLf & vbLf, vbLf).Split(vbLf).ToList @@ -485,7 +485,7 @@ Public Class PageInstanceExport '检查规则 Dim ShouldKeep As Boolean = False For Each Rule In AllRules - Dim Revert = Rule.StartsWith("!") + Dim Revert = Rule.StartsWithF("!") If RelativePath Like Rule.TrimStart("!") Then ShouldKeep = Not Revert Next If Not ShouldKeep Then Continue For @@ -493,7 +493,7 @@ Public Class PageInstanceExport CopyFile(Entry.FullName, TargetPath) '若为压缩包,考虑联网获取路径 If CheckHostedAssets AndAlso - {".zip", ".rar", ".jar", ".disabled", ".old"}.Contains(Entry.Extension.ToLower) AndAlso + {".zip", ".rar", ".jar", ".disabled", ".old"}.Contains(Entry.Extension.Lower) AndAlso {"mods", "packs", "openloader", "resource"}.Any(Function(s) RelativePath.Contains(s)) Then Dim ModFile As New McMod(TargetPath) Dim Unused = ModFile.ModrinthHash '提前计算 Hash @@ -617,7 +617,7 @@ Public Class PageInstanceExport '等待线程结束 Do Until EndedThreadCount = 2 - If Loader.IsAborted Then Return + If Loader.IsInterrupted Then Return Thread.Sleep(10) Loop @@ -676,7 +676,7 @@ Public Class PageInstanceExport '首次压缩整合包 ZipFile.CreateFromDirectory(CacheFolder & "modpack\", CacheFolder & "modpack.mrpack") Loader.Progress = 0.5 - Directory.Delete(CacheFolder & "modpack\", True) + DeleteDirectory(CacheFolder & "modpack\") Loader.Progress = 0.6 '二次压缩整合包 ZipFile.CreateFromDirectory(CacheFolder, PackPath) @@ -686,7 +686,7 @@ Public Class PageInstanceExport ZipFile.CreateFromDirectory(CacheFolder & "modpack\", PackPath) Loader.Progress = 0.8 End If - Directory.Delete(CacheFolder, True) + DeleteDirectory(CacheFolder, True) OpenExplorer(PackPath) End Sub) With {.ProgressWeight = 6}) diff --git a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceMod.xaml.vb b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceMod.xaml.vb index a721c80..cdf9a5a 100644 --- a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceMod.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceMod.xaml.vb @@ -305,7 +305,7 @@ ''' 返回输入的文件是否为一个 Mod 文件,仅用于判断拖拽行为。 ''' Public Shared Function InstallMods(FilePathList As IEnumerable(Of String)) As Boolean - Dim Extension As String = FilePathList.First.AfterLast(".").ToLower + Dim Extension As String = FilePathList.First.AfterLast(".").Lower '检查文件扩展名 If Not {"jar", "litemod", "disabled", "old"}.Any(Function(t) t = Extension) Then Return False Log("[System] 文件为 jar/litemod 格式,尝试作为 Mod 安装") @@ -322,7 +322,7 @@ Hint("若要安装 Mod,请先选择一个可以安装 Mod 的版本!") ElseIf Not (FrmMain.PageCurrent = FormMain.PageType.InstanceSetup AndAlso FrmMain.PageCurrentSub = FormMain.PageSubType.InstanceMod) Then '未处于 Mod 管理页面 - If MyMsgBox($"是否要将这{If(FilePathList.Count = 1, "个", "些")}文件作为 Mod 安装到 {Instance.Name}?", "Mod 安装确认", "确定", "取消") = 1 Then GoTo Install + If MyMsgBox($"是否要将这{If(FilePathList.IsSingle, "个", "些")}文件作为 Mod 安装到 {Instance.Name}?", "Mod 安装确认", "确定", "取消") = 1 Then GoTo Install Else '处于 Mod 管理页面 Install: @@ -332,7 +332,7 @@ Install: If Not NewFileName.Contains(".") Then NewFileName += ".jar" '#4227 CopyFile(ModFile, Instance.PathIndie & "mods\" & NewFileName) Next - If FilePathList.Count = 1 Then + If FilePathList.IsSingle Then Hint($"已安装 {GetFileNameFromPath(FilePathList.First).Replace(".disabled", "").Replace(".old", "")}!", HintType.Green) Else Hint($"已安装 {FilePathList.Count} 个 Mod!", HintType.Green) @@ -503,7 +503,7 @@ Install: End If End If File.Delete(NewPath) - FileSystem.Rename(ModEntity.Path, NewPath) + File.Move(ModEntity.Path, NewPath) Catch ex As FileNotFoundException Log(ex, $"未找到需要重命名的 Mod({If(ModEntity.Path, "null")})", LogLevel.Feedback) ReloadModList(True) @@ -556,9 +556,9 @@ Install: Public Shared UpdatingInstanceModFolders As New List(Of String) Public Sub UpdateMods(ModList As IEnumerable(Of McMod)) '更新前警告 - If Not Setup.Get("HintUpdateMod") OrElse ModList.Count >= 15 Then + If Not Settings.Get("HintUpdateMod") OrElse ModList.Count >= 15 Then If MyMsgBox($"新版本 Mod 可能不兼容旧存档或者其他 Mod,这可能导致游戏崩溃,甚至永久损坏存档!{vbCrLf}如果你在游玩整合包,请千万不要自行更新 Mod!{vbCrLf}{vbCrLf}在更新前,请先备份存档,并检查 Mod 的更新日志。{vbCrLf}如果更新后出现问题,你也可以在回收站找回更新前的 Mod。", "Mod 更新警告", "我已了解风险,继续更新", "取消", IsWarn:=True) = 1 Then - Setup.Set("HintUpdateMod", True) + Settings.Set("HintUpdateMod", True) Else Return End If @@ -592,8 +592,8 @@ Install: Shortened = True Loop If Shortened AndAlso CurrentSegs.Any() AndAlso NewestSegs.Any() Then - CurrentReplaceName = Join(CurrentSegs, "-") - NewestReplaceName = Join(NewestSegs, "-") + CurrentReplaceName = CurrentSegs.Join("-") + NewestReplaceName = NewestSegs.Join("-") End If '添加到下载列表 Dim TempAddress As String = PathTemp & "mods\" & Entry.FileName.Replace(CurrentReplaceName, NewestReplaceName) '需要下载到 mods 文件夹,以便重复文件检查时识别 @@ -649,7 +649,7 @@ Install: End Select Case LoadState.Failed Hint("Mod 更新失败:" & Loader.Error.GetBrief(), HintType.Red) - Case LoadState.Aborted + Case LoadState.Interrupted Hint("Mod 更新已中止!", HintType.Blue) Case Else Return @@ -737,13 +737,13 @@ Install: '显示结果提示 If Not IsSuccessful Then Return If IsShiftPressed Then - If ModList.Count = 1 Then + If ModList.IsSingle Then Hint($"已彻底删除 {ModList.Single.FileName}!", HintType.Green) Else Hint($"已彻底删除 {ModList.Count} 个文件!", HintType.Green) End If Else - If ModList.Count = 1 Then + If ModList.IsSingle Then Hint($"已将 {ModList.Single.FileName} 删除到回收站!", HintType.Green) Else Hint($"已将 {ModList.Count} 个文件删除到回收站!", HintType.Green) @@ -797,8 +797,8 @@ Install: Dim ModOriginalName As String = ModEntry.DisplayName.Replace(" ", "+") Dim ModSearchName As String = ModOriginalName.Substring(0, 1) For i = 1 To ModOriginalName.Count - 1 - Dim IsLastLower As Boolean = ModOriginalName(i - 1).ToString.ToLower.Equals(ModOriginalName(i - 1).ToString) - Dim IsCurrentLower As Boolean = ModOriginalName(i).ToString.ToLower.Equals(ModOriginalName(i).ToString) + Dim IsLastLower As Boolean = ModOriginalName(i - 1).ToString.Lower.Equals(ModOriginalName(i - 1).ToString) + Dim IsCurrentLower As Boolean = ModOriginalName(i).ToString.Lower.Equals(ModOriginalName(i).ToString) If IsLastLower AndAlso Not IsCurrentLower Then '上一个字母为小写,这一个字母为大写 ModSearchName += "+" @@ -807,7 +807,7 @@ Install: Next ModSearchName = ModSearchName.Replace("++", "+").Replace("pti+Fine", "ptiFine") '百科搜索链接 - If MyMsgBox(Join(ContentLines, vbCrLf), ModEntry.DisplayName, "百科搜索", "返回") = 1 Then + If MyMsgBox(ContentLines.Join(vbCrLf), ModEntry.DisplayName, "百科搜索", "返回") = 1 Then OpenWebsite("https://www.mcmod.cn/s?key=" & ModSearchName & "&site=all&filter=0") End If End If @@ -850,22 +850,22 @@ Install: '构造请求 Dim QueryList As New List(Of SearchEntry(Of McMod)) For Each Entry As McMod In McModLoader.Output - Dim SearchSource As New List(Of KeyValuePair(Of String, Double)) - SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.DisplayName, 1)) - SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.FileName, 1)) + Dim SearchSources As New List(Of SearchSource) + SearchSources.Add(New SearchSource(Entry.DisplayName, 1)) + SearchSources.Add(New SearchSource(Entry.FileName, 1)) If Entry.Version IsNot Nothing Then - SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Version, 0.2)) + SearchSources.Add(New SearchSource(Entry.Version, 0.2)) End If If Entry.Description IsNot Nothing AndAlso Entry.Description <> "" Then - SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Description, 0.4)) + SearchSources.Add(New SearchSource(Entry.Description, 0.4)) End If If Entry.Comp IsNot Nothing Then - If Entry.Comp.RawName <> Entry.DisplayName Then SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Comp.RawName, 1)) - If Entry.Comp.TranslatedName <> Entry.Comp.RawName Then SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Comp.TranslatedName, 1)) - If Entry.Comp.Description <> Entry.Description Then SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Comp.Description, 0.4)) - SearchSource.Add(New KeyValuePair(Of String, Double)(String.Join("", Entry.Comp.Tags), 0.2)) + If Entry.Comp.RawName <> Entry.DisplayName Then SearchSources.Add(New SearchSource(Entry.Comp.RawName, 1)) + If Entry.Comp.TranslatedName <> Entry.Comp.RawName Then SearchSources.Add(New SearchSource(Entry.Comp.TranslatedName, 1)) + If Entry.Comp.Description <> Entry.Description Then SearchSources.Add(New SearchSource(Entry.Comp.Description, 0.4)) + SearchSources.Add(New SearchSource(String.Join("", Entry.Comp.Tags), 0.2)) End If - QueryList.Add(New SearchEntry(Of McMod) With {.Item = Entry, .SearchSource = SearchSource}) + QueryList.Add(New SearchEntry(Of McMod) With {.Item = Entry, .SearchSource = SearchSources}) Next '进行搜索 SearchResult = Search(QueryList, SearchBox.Text, MaxBlurCount:=6, MinBlurSimilarity:=0.35).Select(Function(r) r.Item).ToList diff --git a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceModDisabled.xaml.vb b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceModDisabled.xaml.vb index b1d1f74..07f8f20 100644 --- a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceModDisabled.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceModDisabled.xaml.vb @@ -9,7 +9,7 @@ End Sub Public Sub BtnDownload_Loaded() Handles BtnDownload.Loaded - Dim NewVisibility = If((Setup.Get("UiHiddenPageDownload") AndAlso Not PageSetupUI.HiddenForceShow) OrElse If(FrmSelectRight Is Nothing, False, FrmSelectRight.ShowHidden), Visibility.Collapsed, Visibility.Visible) + Dim NewVisibility = If((Settings.Get("UiHiddenPageDownload") AndAlso Not PageSetupUI.HiddenForceShow) OrElse If(FrmSelectRight Is Nothing, False, FrmSelectRight.ShowHidden), Visibility.Collapsed, Visibility.Visible) If BtnDownload.Visibility <> NewVisibility Then BtnDownload.Visibility = NewVisibility PanMain.TriggerForceResize() diff --git a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceOverall.xaml.vb b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceOverall.xaml.vb index 6676829..d140cb9 100644 --- a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceOverall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceOverall.xaml.vb @@ -39,7 +39,7 @@ Dim LogoCustom As Boolean = ReadIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "LogoCustom", "False") If LogoCustom Then For Each Selection As MyComboBoxItem In ComboDisplayLogo.Items - If Selection.Tag = Logo OrElse (Selection.Tag = "PCL\Logo.png" AndAlso Logo.EndsWith("PCL\Logo.png")) Then + If Selection.Tag = Logo OrElse (Selection.Tag = "PCL\Logo.png" AndAlso Logo.EndsWithF("PCL\Logo.png")) Then ComboDisplayLogo.SelectedItem = Selection Exit For End If @@ -71,12 +71,12 @@ Else '改为隐藏 Try - If Not Setup.Get("HintHide") Then + If Not Settings.Get("HintHide") Then If MyMsgBox("确认要从版本列表中隐藏该版本吗?隐藏该版本后,它将不再出现于 PCL 显示的版本列表中。" & vbCrLf & "此后,在版本列表页面按下 F11 才可以查看被隐藏的版本。", "隐藏版本提示",, "取消") <> 1 Then ComboDisplayType.SelectedIndex = 0 Return End If - Setup.Set("HintHide", True) + Settings.Set("HintHide", True) End If WriteIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "DisplayType", McInstanceCardType.Hidden) WriteIni(McFolderSelected & "PCL.ini", "InstanceCache", "") '要求刷新缓存 @@ -115,7 +115,7 @@ '获取临时中间名,以防止仅修改大小写的重命名失败 Dim TempName As String = NewName & "_temp" Dim TempPath As String = McFolderSelected & "versions\" & TempName & "\" - Dim OnlyChangedCase As Boolean = NewName.ToLower = OldName.ToLower + Dim OnlyChangedCase As Boolean = NewName.Lower = OldName.Lower '重新读取版本 JSON 信息,避免 JsonObject 中已被合并的项被重新存储 Dim JsonObject As JObject Dim OldJsonPath As String = PageInstanceLeft.Instance.GetJsonPath() @@ -126,8 +126,8 @@ JsonObject = PageInstanceLeft.Instance.JsonObject End Try '重命名主文件夹 - My.Computer.FileSystem.RenameDirectory(OldPath, TempName) - My.Computer.FileSystem.RenameDirectory(TempPath, NewName) + Directory.Move(OldPath, TempPath) + Directory.Move(TempPath, NewPath) '清理 ini 缓存 IniClearCache(PageInstanceLeft.Instance.PathIndie & "options.txt") IniClearCache(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini") @@ -135,20 +135,20 @@ '不能进行遍历重命名,否则在版本名很短的时候容易误伤其他文件(#6443) If Directory.Exists($"{NewPath}{OldName}-natives") Then If OnlyChangedCase Then - My.Computer.FileSystem.RenameDirectory($"{NewPath}{OldName}-natives", $"{OldName}natives_temp") - My.Computer.FileSystem.RenameDirectory($"{NewPath}{OldName}-natives_temp", $"{NewName}-natives") + Directory.Move($"{NewPath}{OldName}-natives", $"{NewPath}{OldName}natives_temp") + Directory.Move($"{NewPath}{OldName}-natives_temp", $"{NewPath}{NewName}-natives") Else DeleteDirectory($"{NewPath}{NewName}-natives") - My.Computer.FileSystem.RenameDirectory($"{NewPath}{OldName}-natives", $"{NewName}-natives") + Directory.Move($"{NewPath}{OldName}-natives", $"{NewPath}{NewName}-natives") End If End If If File.Exists($"{NewPath}{OldName}.jar") Then If OnlyChangedCase Then - My.Computer.FileSystem.RenameFile($"{NewPath}{OldName}.jar", $"{OldName}_temp.jar") - My.Computer.FileSystem.RenameFile($"{NewPath}{OldName}_temp.jar", $"{NewName}.jar") + File.Move($"{NewPath}{OldName}.jar", $"{NewPath}{OldName}_temp.jar") + File.Move($"{NewPath}{OldName}_temp.jar", $"{NewPath}{NewName}.jar") Else File.Delete($"{NewPath}{NewName}.jar") - My.Computer.FileSystem.RenameFile($"{NewPath}{OldName}.jar", $"{NewName}.jar") + File.Move($"{NewPath}{OldName}.jar", $"{NewPath}{NewName}.jar") End If End If '替换版本设置文件中的路径 @@ -267,7 +267,7 @@ End If '生成脚本 If McLaunchStart(New McLaunchOptions With {.SaveBatch = SavePath, .Instance = PageInstanceLeft.Instance}) Then - If Setup.Get("LoginType") = McLoginType.Legacy Then + If Settings.Get("LoginType") = McLoginType.Legacy Then Hint("正在导出启动脚本……") Else Hint("正在导出启动脚本……(注意,使用脚本启动可能会导致登录失效!)") @@ -301,7 +301,7 @@ Hint(Loader.Name & "成功!", HintType.Green) Case LoadState.Failed Hint(Loader.Name & "失败:" & Loader.Error.GetBrief(), HintType.Red) - Case LoadState.Aborted + Case LoadState.Interrupted Hint(Loader.Name & "已取消!", HintType.Blue) End Select End Sub diff --git a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceSetup.xaml b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceSetup.xaml index 0be84ec..03fb66a 100644 --- a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceSetup.xaml +++ b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceSetup.xaml @@ -48,7 +48,7 @@ - @@ -56,7 +56,7 @@ - + @@ -204,6 +204,8 @@ + + @@ -213,12 +215,26 @@ Height="100" AcceptsReturn="True" TextWrapping="Wrap" VerticalContentAlignment="Top" Padding="0,5" VerticalScrollBarVisibility="Auto" /> - - + + + + + + + + + + - - + @@ -230,7 +246,10 @@ ToolTip="完全不更改 assets;不校验 libraries、第三方登录库与版本主 jar 文件是否被修改。 如果你没有修改相关文件,请勿勾选此项。" /> + ToolTip="是否使用 Java Launch Wrapper 修复 Java 18- 在中文路径下可能无法正常启动的问题。 详见:https://github.com/00ll00/java_launch_wrapper" /> + diff --git a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceSetup.xaml.vb b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceSetup.xaml.vb index 95c67f0..2930fb9 100644 --- a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceSetup.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceSetup.xaml.vb @@ -27,41 +27,44 @@ Try '启动参数 - TextArgumentTitle.Text = Setup.Get("VersionArgumentTitle", Instance:=PageInstanceLeft.Instance) - TextArgumentInfo.Text = Setup.Get("VersionArgumentInfo", Instance:=PageInstanceLeft.Instance) + TextArgumentTitle.Text = Settings.Get("VersionArgumentTitle", Instance:=PageInstanceLeft.Instance) + TextArgumentInfo.Text = Settings.Get("VersionArgumentInfo", Instance:=PageInstanceLeft.Instance) Dim _unused = PageInstanceLeft.Instance.PathIndie '触发自动判定 - ComboArgumentIndieV2.SelectedIndex = If(Setup.Get("VersionArgumentIndieV2", Instance:=PageInstanceLeft.Instance), 0, 1) + ComboArgumentIndieV2.SelectedIndex = If(Settings.Get("VersionArgumentIndieV2", Instance:=PageInstanceLeft.Instance), 0, 1) RefreshJavaComboBox() '游戏内存 - CType(FindName("RadioRamType" & Setup.Load("VersionRamType", Instance:=PageInstanceLeft.Instance)), MyRadioBox).Checked = True - SliderRamCustom.Value = Setup.Get("VersionRamCustom", Instance:=PageInstanceLeft.Instance) - ComboRamOptimize.SelectedIndex = Setup.Get("VersionRamOptimize", Instance:=PageInstanceLeft.Instance) + CType(FindName("RadioRamType" & Settings.Get("VersionRamType", Instance:=PageInstanceLeft.Instance)), MyRadioBox).Checked = True + OnVersionRamTypeChanged(Settings.Get("VersionRamType", Instance:=PageInstanceLeft.Instance)) + SliderRamCustom.Value = Settings.Get("VersionRamCustom", Instance:=PageInstanceLeft.Instance) + ComboRamOptimize.SelectedIndex = Settings.Get("VersionRamOptimize", Instance:=PageInstanceLeft.Instance) '服务器 - TextServerEnter.Text = Setup.Get("VersionServerEnter", Instance:=PageInstanceLeft.Instance) - ComboServerLogin.SelectedIndex = Setup.Get("VersionServerLogin", Instance:=PageInstanceLeft.Instance) + TextServerEnter.Text = Settings.Get("VersionServerEnter", Instance:=PageInstanceLeft.Instance) + ComboServerLogin.SelectedIndex = Settings.Get("VersionServerLogin", Instance:=PageInstanceLeft.Instance) ComboServerLoginLast = ComboServerLogin.SelectedIndex ServerLogin(ComboServerLogin.SelectedIndex) - TextServerNide.Text = Setup.Get("VersionServerNide", Instance:=PageInstanceLeft.Instance) - TextServerAuthServer.Text = Setup.Get("VersionServerAuthServer", Instance:=PageInstanceLeft.Instance) - TextServerAuthName.Text = Setup.Get("VersionServerAuthName", Instance:=PageInstanceLeft.Instance) - TextServerAuthRegister.Text = Setup.Get("VersionServerAuthRegister", Instance:=PageInstanceLeft.Instance) + TextServerNide.Text = Settings.Get("VersionServerNide", Instance:=PageInstanceLeft.Instance) + TextServerAuthServer.Text = Settings.Get("VersionServerAuthServer", Instance:=PageInstanceLeft.Instance) + TextServerAuthName.Text = Settings.Get("VersionServerAuthName", Instance:=PageInstanceLeft.Instance) + TextServerAuthRegister.Text = Settings.Get("VersionServerAuthRegister", Instance:=PageInstanceLeft.Instance) '高级设置 - TextAdvanceJvm.Text = Setup.Get("VersionAdvanceJvm", Instance:=PageInstanceLeft.Instance) - TextAdvanceGame.Text = Setup.Get("VersionAdvanceGame", Instance:=PageInstanceLeft.Instance) - TextAdvanceRun.Text = Setup.Get("VersionAdvanceRun", Instance:=PageInstanceLeft.Instance) - CheckAdvanceRunWait.Checked = Setup.Get("VersionAdvanceRunWait", Instance:=PageInstanceLeft.Instance) - If Setup.Get("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance) = 2 Then + TextAdvanceJvm.Text = Settings.Get("VersionAdvanceJvm", Instance:=PageInstanceLeft.Instance) + TextAdvanceGame.Text = Settings.Get("VersionAdvanceGame", Instance:=PageInstanceLeft.Instance) + TextAdvanceRun.Text = Settings.Get("VersionAdvanceRun", Instance:=PageInstanceLeft.Instance) + CheckAdvanceRunWait.Checked = Settings.Get("VersionAdvanceRunWait", Instance:=PageInstanceLeft.Instance) + If Settings.Get("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance) = 2 Then Log("[Setup] 已迁移老版本的关闭文件校验设置") - Setup.Reset("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance) - Setup.Set("VersionAdvanceAssetsV2", True, Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance) + Settings.Set("VersionAdvanceAssetsV2", True, Instance:=PageInstanceLeft.Instance) End If - CheckAdvanceAssetsV2.Checked = Setup.Get("VersionAdvanceAssetsV2", Instance:=PageInstanceLeft.Instance) - CheckAdvanceJava.Checked = Setup.Get("VersionAdvanceJava", Instance:=PageInstanceLeft.Instance) - CheckAdvanceDisableJLW.Checked = Setup.Get("VersionAdvanceDisableJLW", Instance:=PageInstanceLeft.Instance) - CheckAdvanceDisableModUpdate.Checked = Setup.Get("VersionAdvanceDisableModUpdate", Instance:=PageInstanceLeft.Instance) + CheckAdvanceAssetsV2.Checked = Settings.Get("VersionAdvanceAssetsV2", Instance:=PageInstanceLeft.Instance) + CheckAdvanceJava.Checked = Settings.Get("VersionAdvanceJava", Instance:=PageInstanceLeft.Instance) + CheckAdvanceDisableJLW.Checked = Settings.Get("VersionAdvanceDisableJLW", Instance:=PageInstanceLeft.Instance) + CheckAdvanceDisableModUpdate.Checked = Settings.Get("VersionAdvanceDisableModUpdate", Instance:=PageInstanceLeft.Instance) + + SettingService.RefreshSettings(Me) Catch ex As Exception Log(ex, "重载版本独立设置时出错", LogLevel.Feedback) @@ -72,31 +75,32 @@ Public Sub Reset() Try - Setup.Reset("VersionServerEnter", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionServerLogin", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionServerNide", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionServerAuthServer", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionServerAuthRegister", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionServerAuthName", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionArgumentTitle", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionArgumentInfo", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionArgumentIndieV2", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionRamType", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionRamCustom", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionRamOptimize", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionAdvanceJvm", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionAdvanceGame", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionAdvanceAssetsV2", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionAdvanceJava", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionAdvanceRun", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionAdvanceRunWait", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionAdvanceDisableJLW", Instance:=PageInstanceLeft.Instance) - Setup.Reset("VersionAdvanceDisableModUpdate", Instance:=PageInstanceLeft.Instance) - - Setup.Reset("VersionArgumentJavaSelect", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionServerEnter", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionServerLogin", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionServerNide", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionServerAuthServer", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionServerAuthRegister", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionServerAuthName", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionArgumentTitle", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionArgumentInfo", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionArgumentIndieV2", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionRamType", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionRamCustom", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionRamOptimize", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionAdvanceJvm", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionAdvanceGame", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionAdvanceAssetsV2", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionAdvanceJava", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionAdvanceRun", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionAdvanceRunWait", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionAdvanceDisableJLW", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionAdvanceDisableModUpdate", Instance:=PageInstanceLeft.Instance) + Settings.Reset("VersionArgumentJavaSelect", Instance:=PageInstanceLeft.Instance) JavaSearchLoader.Start(IsForceRestart:=True) + SettingService.ResetSettings(Me) + Log("[Setup] 已初始化版本独立设置") Hint("已初始化版本独立设置!", HintType.Green, False) Catch ex As Exception @@ -108,31 +112,36 @@ '将控件改变路由到设置改变 Private Shared Sub RadioBoxChange(sender As MyRadioBox, e As Object) Handles RadioRamType0.Check, RadioRamType1.Check, RadioRamType2.Check - If AniControlEnabled = 0 Then Setup.Set(sender.Tag.ToString.Split("/")(0), Val(sender.Tag.ToString.Split("/")(1)), Instance:=PageInstanceLeft.Instance) + If AniControlEnabled = 0 Then Settings.Set(sender.Tag.ToString.Split("/")(0), Val(sender.Tag.ToString.Split("/")(1)), Instance:=PageInstanceLeft.Instance) End Sub Private Shared Sub TextBoxChange(sender As MyTextBox, e As Object) Handles TextServerEnter.ValidatedTextChanged, TextArgumentInfo.ValidatedTextChanged, TextAdvanceGame.ValidatedTextChanged, TextAdvanceJvm.ValidatedTextChanged, TextServerNide.ValidatedTextChanged, TextServerAuthName.ValidatedTextChanged, TextServerAuthRegister.ValidatedTextChanged, TextServerAuthServer.ValidatedTextChanged, TextArgumentTitle.ValidatedTextChanged, TextAdvanceRun.ValidatedTextChanged If AniControlEnabled = 0 Then '#3194,不能删减 / 'Dim HandledText As String = sender.Text 'If sender.Tag = "VersionServerAuthServer" OrElse sender.Tag = "VersionServerAuthRegister" Then HandledText = HandledText.TrimEnd("/") - Setup.Set(sender.Tag, sender.Text, Instance:=PageInstanceLeft.Instance) + Settings.Set(sender.Tag, sender.Text, Instance:=PageInstanceLeft.Instance) End If End Sub Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderRamCustom.Change - If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value, Instance:=PageInstanceLeft.Instance) + If AniControlEnabled = 0 Then Settings.Set(sender.Tag, sender.Value, Instance:=PageInstanceLeft.Instance) End Sub Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboRamOptimize.SelectionChanged - If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex, Instance:=PageInstanceLeft.Instance) + If AniControlEnabled = 0 Then Settings.Set(sender.Tag, sender.SelectedIndex, Instance:=PageInstanceLeft.Instance) End Sub Private Shared Sub CheckBoxLikeComboChange(sender As MyComboBox, e As Object) Handles ComboArgumentIndieV2.SelectionChanged - If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex = 0, Instance:=PageInstanceLeft.Instance) + If AniControlEnabled = 0 Then Settings.Set(sender.Tag, sender.SelectedIndex = 0, Instance:=PageInstanceLeft.Instance) End Sub Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckAdvanceRunWait.Change, CheckAdvanceAssetsV2.Change, CheckAdvanceJava.Change, CheckAdvanceDisableJLW.Change, CheckAdvanceDisableModUpdate.Change - If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked, Instance:=PageInstanceLeft.Instance) + If AniControlEnabled = 0 Then Settings.Set(sender.Tag, sender.Checked, Instance:=PageInstanceLeft.Instance) End Sub #Region "游戏内存" + Public Shared Sub OnVersionRamTypeChanged(Type As Integer) + If FrmInstanceSetup Is Nothing Then Return + FrmInstanceSetup.RamType(Type) + End Sub + Public Sub RamType(Type As Integer) If SliderRamCustom Is Nothing Then Return SliderRamCustom.IsEnabled = (Type = 1) @@ -271,7 +280,7 @@ ''' Public Shared Function GetRam(Instance As McInstance, Optional Is32BitJava As Boolean? = Nothing) As Double '跟随全局设置 - If Setup.Get("VersionRamType", Instance:=Instance) = 2 Then + If Settings.Get("VersionRamType", Instance:=Instance) = 2 Then Return PageSetupLaunch.GetRam(Instance, True, Is32BitJava) End If @@ -281,7 +290,7 @@ '使用当前版本的设置 Dim RamGive As Double - If Setup.Get("VersionRamType", Instance:=Instance) = 0 Then + If Settings.Get("VersionRamType", Instance:=Instance) = 0 Then '自动配置 Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024 * 10) / 10 '确定需求的内存值 @@ -293,7 +302,7 @@ If Instance IsNot Nothing AndAlso Instance.Modable Then '可安装 Mod 的版本 Dim ModDir As New DirectoryInfo(Instance.PathIndie & "mods\") - Dim ModCount As Integer = If(ModDir.Exists, ModDir.GetFiles.Length, 0) + Dim ModCount As Integer = If(ModDir.Exists, ModDir.GetFiles.Count(Function(f) {".jar", ".zip", ".litemod"}.Contains(f.Extension.Lower)), 0) RamMininum = 0.5 + ModCount / 150 RamTarget1 = 1.5 + ModCount / 90 RamTarget2 = 2.7 + ModCount / 50 @@ -337,7 +346,7 @@ PreFin: RamGive = Math.Round(Math.Max(RamGive, RamMininum), 1) Else '手动配置 - Dim Value As Integer = Setup.Get("VersionRamCustom", Instance:=Instance) + Dim Value As Integer = Settings.Get("VersionRamCustom", Instance:=Instance) If Value <= 12 Then RamGive = Value * 0.1 + 0.3 ElseIf Value <= 25 Then @@ -357,6 +366,16 @@ PreFin: #Region "服务器" + '当第三方登录更改时,清空版本列表缓存以更新版本分类 + 'TODO: 这会不会导致拖拽改变第三方登录的时候版本列表缓存没有更新? + Public Shared Sub OnVersionServerLoginChanged(Type As Integer) + If FrmInstanceSetup Is Nothing Then Return + WriteIni(McFolderSelected & "PCL.ini", "InstanceCache", "") + If PageInstanceLeft.Instance Is Nothing Then Return + PageInstanceLeft.Instance = New McInstance(PageInstanceLeft.Instance.Name).Load() + LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\") + End Sub + '自动替换标点 Private Sub TextServerEnter_Change() Handles TextServerEnter.TextChanged Dim NewText = TextServerEnter.Text.Replace(":", ":").Replace("。", ".") @@ -423,7 +442,7 @@ PreFin: ComboArgumentJava.Items.Add(New MyComboBoxItem With {.Content = "自动选择合适的 Java", .Tag = "自动选择"}) '更新列表 Dim SelectedItem As MyComboBoxItem = Nothing - Dim SelectedBySetup As String = Setup.Get("VersionArgumentJavaSelect", Instance:=PageInstanceLeft.Instance) + Dim SelectedBySetup As String = Settings.Get("VersionArgumentJavaSelect", Instance:=PageInstanceLeft.Instance) Try For Each Java In JavaList.Clone().OrderByDescending(Function(v) v.MajorVersion) Dim ListItem = New MyComboBoxItem With {.Content = Java.ToString, .ToolTip = Java.PathFolder, .Tag = Java} @@ -434,7 +453,7 @@ PreFin: If JavaEntry.FromJson(GetJson(SelectedBySetup)).PathFolder = Java.PathFolder Then SelectedItem = ListItem Next Catch ex As Exception - Setup.Set("VersionArgumentJavaSelect", "使用全局设置", Instance:=PageInstanceLeft.Instance) + Settings.Set("VersionArgumentJavaSelect", "使用全局设置", Instance:=PageInstanceLeft.Instance) Log(ex, "更新版本设置 Java 下拉框失败", LogLevel.Feedback) End Try '更新选择项 @@ -469,15 +488,15 @@ PreFin: Dim SelectedJava = ComboArgumentJava.SelectedItem.Tag If "使用全局设置".Equals(SelectedJava) Then '选择 “自动” - Setup.Set("VersionArgumentJavaSelect", "使用全局设置", Instance:=PageInstanceLeft.Instance) + Settings.Set("VersionArgumentJavaSelect", "使用全局设置", Instance:=PageInstanceLeft.Instance) Log("[Java] 修改版本 Java 选择设置:跟随全局设置") ElseIf "自动选择".Equals(SelectedJava) Then '选择 “自动” - Setup.Set("VersionArgumentJavaSelect", "", Instance:=PageInstanceLeft.Instance) + Settings.Set("VersionArgumentJavaSelect", "", Instance:=PageInstanceLeft.Instance) Log("[Java] 修改版本 Java 选择设置:自动选择") Else '选择指定项 - Setup.Set("VersionArgumentJavaSelect", CType(SelectedJava.ToJson(), JObject).ToString(Newtonsoft.Json.Formatting.None), Instance:=PageInstanceLeft.Instance) + Settings.Set("VersionArgumentJavaSelect", CType(SelectedJava.ToJson(), JObject).ToString(Newtonsoft.Json.Formatting.None), Instance:=PageInstanceLeft.Instance) Log("[Java] 修改版本 Java 选择设置:" & SelectedJava.ToString) End If RefreshRam(True) diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb index e72c29f..9596e60 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb @@ -55,7 +55,7 @@ Dim FileAddress As String = SelectSaveFile("选取保存皮肤的位置", GetFileNameFromPath(Address), "皮肤图片文件(*.png)|*.png") If FileAddress.Contains("\") Then File.Delete(FileAddress) - If Address.StartsWith(PathImage) Then + If Address.StartsWithF(PathImage) Then Dim Image As New MyBitmap(Address) Image.Save(FileAddress) Else @@ -79,7 +79,7 @@ '检查文件存在 Address = Loader.Output If String.IsNullOrEmpty(Address) Then Throw New Exception("皮肤加载器 " & Loader.Name & " 没有输出") - If Not Address.StartsWith(PathImage) AndAlso Not File.Exists(Address) Then Throw New FileNotFoundException("皮肤文件未找到", Address) + If Not Address.StartsWithF(PathImage) AndAlso Not File.Exists(Address) Then Throw New FileNotFoundException("皮肤文件未找到", Address) '加载 Dim Image As MyBitmap Try @@ -142,7 +142,7 @@ End If Next If FrmLaunchLeft IsNot Nothing AndAlso HasLoaderRunning Then - '由于 Abort 不是实时的,暂时不会释放文件,会导致删除报错,故只能取消执行 + '由于 Interrupt 不是实时的,暂时不会释放文件,会导致删除报错,故只能取消执行 Hint("有正在获取中的皮肤,请稍后再试!", HintType.Blue) Else RunInThread( @@ -177,8 +177,8 @@ Sub() Try '更新缓存 - WriteIni(PathTemp & "Cache\Skin\IndexMs.ini", Setup.Get("CacheMsV2Uuid"), SkinAddress) - Log($"[Skin] 已写入皮肤地址缓存 {Setup.Get("CacheMsV2Uuid")} -> {SkinAddress}") + WriteIni(PathTemp & "Cache\Skin\IndexMs.ini", Settings.Get("CacheMsV2Uuid"), SkinAddress) + Log($"[Skin] 已写入皮肤地址缓存 {Settings.Get("CacheMsV2Uuid")} -> {SkinAddress}") '刷新控件 For Each SkinLoader In {PageLaunchLeft.SkinMs, PageLaunchLeft.SkinLegacy} SkinLoader.WaitForExit(IsForceRestart:=True) diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb index 3348d63..dd61719 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb @@ -27,17 +27,10 @@ If File.Exists(Path & "modpack.mrpack") Then PackInstallPath = Path & "modpack.mrpack" If PackInstallPath IsNot Nothing Then Log("[Launch] 需自动安装整合包:" & PackInstallPath, LogLevel.Debug) - Setup.Set("LaunchFolderSelect", "$.minecraft\") - If Not Directory.Exists(Path & ".minecraft\") Then - Directory.CreateDirectory(Path & ".minecraft\") - Directory.CreateDirectory(Path & ".minecraft\versions\") - McFolderLauncherProfilesJsonCreate(Path & ".minecraft\") - End If - PageSelectLeft.AddFolder(Path & ".minecraft\", GetFolderNameFromPath(Path), False) + PageSelectLeft.CreateMcFolderInCurrentPath() McFolderListLoader.WaitForExit() End If '确认 Minecraft 文件夹存在 - McFolderSelected = Setup.Get("LaunchFolderSelect").ToString.Replace("$", Path) If McFolderSelected = "" OrElse Not Directory.Exists(McFolderSelected) Then '无效的文件夹 If McFolderSelected = "" Then @@ -46,10 +39,9 @@ Log("[Launch] Minecraft 文件夹无效,该文件夹已不存在:" & McFolderSelected, LogLevel.Debug) End If McFolderListLoader.WaitForExit(IsForceRestart:=True) - Setup.Set("LaunchFolderSelect", McFolderList(0).Location.Replace(Path, "$")) + McFolderSelected = McFolderList.First.Location End If - Log("[Launch] Minecraft 文件夹:" & McFolderSelected) - If Setup.Get("SystemDebugDelay") Then Thread.Sleep(RandomInteger(500, 3000)) + If Settings.Get("SystemDebugDelay") Then Thread.Sleep(RandomInteger(500, 3000)) '自动整合包安装 If PackInstallPath IsNot Nothing Then Try @@ -67,7 +59,7 @@ End Try End If '确认 Minecraft 版本存在 - Dim Selection As String = Setup.Get("LaunchVersionSelect") + Dim Selection As String = ReadIni(McFolderSelected & "PCL.ini", "Version") Dim Instance As McInstance = If(Selection = "", Nothing, New McInstance(Selection)) If Instance Is Nothing OrElse Not Instance.PathVersion.StartsWithF(McFolderSelected) OrElse Not Instance.Check() Then '无效的版本 @@ -75,11 +67,9 @@ If Not McInstanceListLoader.State = LoadState.Finished Then LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\", WaitForExit:=True) If Not McInstanceList.Any() OrElse McInstanceList.First.Value(0).Logo.Contains("RedstoneBlock") Then Instance = Nothing - Setup.Set("LaunchVersionSelect", "") Log("[Launch] 无可用 Minecraft 版本") Else Instance = McInstanceList.First.Value(0) - Setup.Set("LaunchVersionSelect", Instance.Name) Log("[Launch] 自动选择 Minecraft 版本:" & Instance.PathVersion) End If End If @@ -94,7 +84,7 @@ End Sub, "Version Check", ThreadPriority.AboveNormal) '改变页面 - Dim LoginType As McLoginType = Setup.Get("LoginType") + Dim LoginType As McLoginType = Settings.Get("LoginType") If LoginType = McLoginType.Legacy OrElse LoginType = McLoginType.Ms Then CType(FindName("RadioLoginType" & LoginType), MyRadioButton).Checked = True RefreshPage(False, False) @@ -108,7 +98,7 @@ ''' Public Sub PageChangeToLaunching() '修改登陆方式 - Select Case Setup.Get("LoginType") + Select Case Settings.Get("LoginType") Case McLoginType.Legacy LabLaunchingMethod.Text = "离线登录" Case McLoginType.Ms @@ -279,37 +269,37 @@ Dim Type As PageType Dim LoginPageType As Integer If McInstanceSelected IsNot Nothing Then - LoginPageType = Setup.Get("VersionServerLogin", Instance:=McInstanceSelected) + LoginPageType = Settings.Get("VersionServerLogin", Instance:=McInstanceSelected) '缓存当前版本的页面种类,下一次打开 McInstanceSelected 为空时才能加载出正确的页面 - Setup.Set("LoginPageType", LoginPageType) + Settings.Set("LoginPageType", LoginPageType) Else - LoginPageType = Setup.Get("LoginPageType") + LoginPageType = Settings.Get("LoginPageType") End If Select Case LoginPageType Case 0 '正版或离线 UnknownType: If RadioLoginType5.Checked Then - If Setup.Get("CacheMsV2Access") = "" Then + If Settings.Get("CacheMsV2Access") = "" Then Type = PageType.Ms Else Type = PageType.MsSkin End If - Setup.Set("LoginType", McLoginType.Ms) + Settings.Set("LoginType", McLoginType.Ms) Else Type = PageType.Legacy - Setup.Set("LoginType", McLoginType.Legacy) + Settings.Set("LoginType", McLoginType.Legacy) End If PanType.Visibility = Visibility.Visible PanTypeOne.Visibility = Visibility.Collapsed RadioLoginType5.Visibility = Visibility.Visible RadioLoginType0.Visibility = Visibility.Visible Case 1 '仅正版 - If Setup.Get("CacheMsV2Access") = "" Then + If Settings.Get("CacheMsV2Access") = "" Then Type = PageType.Ms Else Type = PageType.MsSkin End If - Setup.Set("LoginType", McLoginType.Ms) + Settings.Set("LoginType", McLoginType.Ms) PanType.Visibility = Visibility.Collapsed PanTypeOne.Visibility = Visibility.Visible PathTypeOne.Data = (New GeometryConverter).ConvertFromString(Logo.IconButtonShield) @@ -318,33 +308,33 @@ UnknownType: RadioLoginType0.Visibility = Visibility.Collapsed Case 2 '仅离线 Type = PageType.Legacy - Setup.Set("LoginType", McLoginType.Legacy) + Settings.Set("LoginType", McLoginType.Legacy) PanType.Visibility = Visibility.Collapsed PanTypeOne.Visibility = Visibility.Visible PathTypeOne.Data = (New GeometryConverter).ConvertFromString(Logo.IconButtonOffline) LabTypeOne.Text = "离线登录" Case 3 '统一通行证 - If Setup.Get("CacheNideAccess") = "" Then + If Settings.Get("CacheNideAccess") = "" Then Type = PageType.Nide Else Type = PageType.NideSkin End If - Setup.Set("LoginType", McLoginType.Nide) + Settings.Set("LoginType", McLoginType.Nide) PanType.Visibility = Visibility.Collapsed PanTypeOne.Visibility = Visibility.Visible PathTypeOne.Data = (New GeometryConverter).ConvertFromString(Logo.IconButtonCard) LabTypeOne.Text = "统一通行证登录" Case 4 'Authlib-Injector - If Setup.Get("CacheAuthAccess") = "" Then + If Settings.Get("CacheAuthAccess") = "" Then Type = PageType.Auth Else Type = PageType.AuthSkin End If - Setup.Set("LoginType", McLoginType.Auth) + Settings.Set("LoginType", McLoginType.Auth) PanType.Visibility = Visibility.Collapsed PanTypeOne.Visibility = Visibility.Visible PathTypeOne.Data = (New GeometryConverter).ConvertFromString(Logo.IconButtonCard) - LabTypeOne.Text = If(McInstanceSelected Is Nothing, Setup.Get("CacheAuthServerName"), Setup.Get("VersionServerAuthName", Instance:=McInstanceSelected)) + LabTypeOne.Text = If(McInstanceSelected Is Nothing, Settings.Get("CacheAuthServerName"), Settings.Get("VersionServerAuthName", Instance:=McInstanceSelected)) If LabTypeOne.Text = "" Then LabTypeOne.Text = "第三方登录" Case Else Log("[Control] 未知的登录页面:" & LoginPageType, LogLevel.Hint) @@ -353,7 +343,7 @@ UnknownType: '刷新页面 If PageCurrent = Type Then Return PageChange(Type, Anim).Reload(KeepInput) - Dim Control As MyRadioButton = FindName("RadioLoginType" & Setup.Get("LoginType")) + Dim Control As MyRadioButton = FindName("RadioLoginType" & Settings.Get("LoginType")) If Control IsNot Nothing Then Control.Checked = True End Sub Private Sub RadioLoginType_Change(sender As Object, raiseByMouse As Boolean) Handles RadioLoginType0.Check, RadioLoginType5.Check @@ -368,7 +358,7 @@ UnknownType: Public Shared SkinMs As New LoaderTask(Of EqualableList(Of String), String)("Loader Skin Ms", AddressOf SkinMsLoad, AddressOf SkinMsInput, ThreadPriority.AboveNormal) Private Shared Function SkinMsInput() As EqualableList(Of String) '获取名称 - Return New EqualableList(Of String) From {Setup.Get("CacheMsV2Name"), Setup.Get("CacheMsV2Uuid")} + Return New EqualableList(Of String) From {Settings.Get("CacheMsV2Name"), Settings.Get("CacheMsV2Uuid")} End Function Private Shared Sub SkinMsLoad(Data As LoaderTask(Of EqualableList(Of String), String)) '清空已有皮肤 @@ -384,9 +374,9 @@ UnknownType: End If Try Dim Result As String = McSkinGetAddress(Uuid, "Ms") - If Data.IsAborted Then Throw New ThreadInterruptedException("当前任务已取消:" & UserName) + If Data.IsInterrupted Then Throw New ThreadInterruptedException("当前任务已取消:" & UserName) Result = McSkinDownload(Result) - If Data.IsAborted Then Throw New ThreadInterruptedException("当前任务已取消:" & UserName) + If Data.IsInterrupted Then Throw New ThreadInterruptedException("当前任务已取消:" & UserName) Data.Output = Result Catch ex As ThreadInterruptedException Data.Output = "" @@ -407,7 +397,7 @@ Finish: '刷新显示 If FrmLoginMsSkin IsNot Nothing Then RunInUi(AddressOf FrmLoginMsSkin.Skin.Load) - ElseIf Not Data.IsAborted Then '如果已经中断,Input 也被清空,就不会再次刷新 + ElseIf Not Data.IsInterrupted Then '如果已经中断,Input 也被清空,就不会再次刷新 Data.Input = Nothing '清空输入,因为皮肤实际上没有被渲染,如果不清空切换到页面的 Start 会由于输入相同而不渲染 End If End Sub @@ -416,18 +406,18 @@ Finish: Public Shared SkinLegacy As New LoaderTask(Of EqualableList(Of String), String)("Loader Skin Legacy", AddressOf SkinLegacyLoad, AddressOf SkinLegacyInput, ThreadPriority.AboveNormal) Private Shared Function SkinLegacyInput() As EqualableList(Of String) '根据类型判断输入 - Dim Type As Integer = Setup.Get("LaunchSkinType") + Dim Type As Integer = Settings.Get("LaunchSkinType") Select Case Type Case 0 If FrmLoginLegacy IsNot Nothing AndAlso FrmLoginLegacy.IsReloaded Then Return New EqualableList(Of String) From {0, If(FrmLoginLegacy.ComboName.Text.Trim, "")} - ElseIf Setup.Get("LoginLegacyName") = "" Then + ElseIf Settings.Get("LoginLegacyName") = "" Then Return New EqualableList(Of String) From {0, ""} Else - Return New EqualableList(Of String) From {0, If(Setup.Get("LoginLegacyName").ToString.BeforeFirst("¨"), "")} + Return New EqualableList(Of String) From {0, If(Settings.Get("LoginLegacyName").ToString.BeforeFirst("¨"), "")} End If Case 3 - Return New EqualableList(Of String) From {3, Setup.Get("LaunchSkinID")} + Return New EqualableList(Of String) From {3, Settings.Get("LaunchSkinID")} Case Else Return New EqualableList(Of String) From {Type} End Select @@ -451,11 +441,11 @@ UseDefault: Data.Output = PathImage & "Skins/Steve.png" Else Dim Result As String = McLoginMojangUuid(ID, True) - If Data.IsAborted Then Throw New ThreadInterruptedException("当前任务已取消:" & ID) + If Data.IsInterrupted Then Throw New ThreadInterruptedException("当前任务已取消:" & ID) Result = McSkinGetAddress(Result, "Mojang") - If Data.IsAborted Then Throw New ThreadInterruptedException("当前任务已取消:" & ID) + If Data.IsInterrupted Then Throw New ThreadInterruptedException("当前任务已取消:" & ID) Result = McSkinDownload(Result) - If Data.IsAborted Then Throw New ThreadInterruptedException("当前任务已取消:" & ID) + If Data.IsInterrupted Then Throw New ThreadInterruptedException("当前任务已取消:" & ID) Data.Output = Result End If Catch ex As ThreadInterruptedException @@ -473,7 +463,7 @@ UseDefault: Case 4 '自定义 If Not File.Exists(PathAppdata & "CustomSkin.png") Then Hint("未找到离线皮肤自定义文件,可能它已被删除。PCL 将使用默认的 Steve 皮肤!") - Setup.Set("LaunchSkinType", 1) + Settings.Set("LaunchSkinType", 1) GoTo UseDefault End If Data.Output = PathAppdata & "CustomSkin.png" @@ -481,7 +471,7 @@ UseDefault: '刷新显示 If FrmLoginLegacy IsNot Nothing Then RunInUi(AddressOf FrmLoginLegacy.Skin.Load) - ElseIf Not Data.IsAborted Then '如果已经中断,Input 也被清空,就不会再次刷新 + ElseIf Not Data.IsInterrupted Then '如果已经中断,Input 也被清空,就不会再次刷新 Data.Input = Nothing '清空输入,因为皮肤实际上没有被渲染,如果不清空切换到页面的 Start 会由于输入相同而不渲染 End If End Sub @@ -490,7 +480,7 @@ UseDefault: Public Shared SkinNide As New LoaderTask(Of EqualableList(Of String), String)("Loader Skin Nide", AddressOf SkinNideLoad, AddressOf SkinNideInput, ThreadPriority.AboveNormal) Private Shared Function SkinNideInput() As EqualableList(Of String) '获取名称 - Return New EqualableList(Of String) From {Setup.Get("CacheNideName"), Setup.Get("CacheNideUuid")} + Return New EqualableList(Of String) From {Settings.Get("CacheNideName"), Settings.Get("CacheNideUuid")} End Function Private Shared Sub SkinNideLoad(Data As LoaderTask(Of EqualableList(Of String), String)) '清空已有皮肤 @@ -506,9 +496,9 @@ UseDefault: End If Try Dim Result As String = McSkinGetAddress(Uuid, "Nide") - If Data.IsAborted Then Throw New ThreadInterruptedException("当前任务已取消:" & UserName) + If Data.IsInterrupted Then Throw New ThreadInterruptedException("当前任务已取消:" & UserName) Result = McSkinDownload(Result) - If Data.IsAborted Then Throw New ThreadInterruptedException("当前任务已取消:" & UserName) + If Data.IsInterrupted Then Throw New ThreadInterruptedException("当前任务已取消:" & UserName) Data.Output = Result Catch ex As ThreadInterruptedException Data.Output = "" @@ -529,7 +519,7 @@ Finish: '刷新显示 If FrmLoginNideSkin IsNot Nothing Then RunInUi(AddressOf FrmLoginNideSkin.Skin.Load) - ElseIf Not Data.IsAborted Then '如果已经中断,Input 也被清空,就不会再次刷新 + ElseIf Not Data.IsInterrupted Then '如果已经中断,Input 也被清空,就不会再次刷新 Data.Input = Nothing '清空输入,因为皮肤实际上没有被渲染,如果不清空切换到页面的 Start 会由于输入相同而不渲染 End If End Sub @@ -538,7 +528,7 @@ Finish: Public Shared SkinAuth As New LoaderTask(Of EqualableList(Of String), String)("Loader Skin Auth", AddressOf SkinAuthLoad, AddressOf SkinAuthInput, ThreadPriority.AboveNormal) Private Shared Function SkinAuthInput() As EqualableList(Of String) '获取名称 - Return New EqualableList(Of String) From {Setup.Get("CacheAuthName"), Setup.Get("CacheAuthUuid")} + Return New EqualableList(Of String) From {Settings.Get("CacheAuthName"), Settings.Get("CacheAuthUuid")} End Function Private Shared Sub SkinAuthLoad(Data As LoaderTask(Of EqualableList(Of String), String)) '清空已有皮肤 @@ -554,9 +544,9 @@ Finish: End If Try Dim Result As String = McSkinGetAddress(UUID, "Auth") - If Data.IsAborted Then Throw New ThreadInterruptedException("当前任务已取消:" & UserName) + If Data.IsInterrupted Then Throw New ThreadInterruptedException("当前任务已取消:" & UserName) Result = McSkinDownload(Result) - If Data.IsAborted Then Throw New ThreadInterruptedException("当前任务已取消:" & UserName) + If Data.IsInterrupted Then Throw New ThreadInterruptedException("当前任务已取消:" & UserName) Data.Output = Result Catch ex As ThreadInterruptedException Data.Output = "" @@ -577,7 +567,7 @@ Finish: '刷新显示 If FrmLoginAuthSkin IsNot Nothing Then RunInUi(AddressOf FrmLoginAuthSkin.Skin.Load) - ElseIf Not Data.IsAborted Then '如果已经中断,Input 也被清空,就不会再次刷新 + ElseIf Not Data.IsInterrupted Then '如果已经中断,Input 也被清空,就不会再次刷新 Data.Input = Nothing '清空输入,因为皮肤实际上没有被渲染,如果不清空切换到页面的 Start 会由于输入相同而不渲染 End If End Sub @@ -601,6 +591,7 @@ Finish: If IsAprilEnabled AndAlso Not IsAprilGiveup Then ThemeUnlock(12, False, "隐藏主题 滑稽彩 已解锁!") IsAprilGiveup = True + Settings.Set("AprilDoneYear", Date.Now.Year) FrmLaunchLeft.AprilScaleTrans.ScaleX = 1 FrmLaunchLeft.AprilScaleTrans.ScaleY = 1 FrmLaunchLeft.AprilPosTrans.X = 0 @@ -624,7 +615,7 @@ Finish: CurrentState = 0 Else If McInstanceSelected Is Nothing Then - If Setup.Get("UiHiddenPageDownload") AndAlso Not PageSetupUI.HiddenForceShow Then + If Settings.Get("UiHiddenPageDownload") AndAlso Not PageSetupUI.HiddenForceShow Then CurrentState = 1 Else CurrentState = 2 @@ -670,7 +661,7 @@ Finish: End Select ExitRefresh: '功能隐藏 - FrmLaunchLeft.BtnVersion.Visibility = If(Not PageSetupUI.HiddenForceShow AndAlso Setup.Get("UiHiddenFunctionSelect"), Visibility.Collapsed, Visibility.Visible) + FrmLaunchLeft.BtnVersion.Visibility = If(Not PageSetupUI.HiddenForceShow AndAlso Settings.Get("UiHiddenFunctionSelect"), Visibility.Collapsed, Visibility.Visible) If CurrentState = 3 Then FrmLaunchLeft.BtnMore.Visibility = FrmLaunchLeft.BtnVersion.Visibility End If @@ -678,7 +669,7 @@ ExitRefresh: '取消按钮 Private Sub BtnCancel_Click() Handles BtnCancel.Click If McLaunchLoaderReal IsNot Nothing Then - McLaunchLoaderReal.Abort() + McLaunchLoaderReal.Interrupt() McLaunchLog("已取消启动") Try If McLaunchWatcher IsNot Nothing Then @@ -703,7 +694,7 @@ ExitRefresh: ''' Public Sub LaunchingRefresh() Try - If McLaunchLoaderReal.State = LoadState.Aborted Then Return + If McLaunchLoaderReal.State = LoadState.Interrupted Then Return '阶段状态获取 Dim IsLaunched As Boolean = False '是否已经启动游戏,只是在等待窗口 Try diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb index 7cb2e4f..5121724 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb @@ -42,17 +42,17 @@ Public Class PageLaunchRight End Sub Private Sub RefreshReal() Dim Content As String = Nothing, Url As String = Nothing - Select Case Setup.Get("UiCustomType") + Select Case Settings.Get("UiCustomType") Case 1 '加载本地文件 Log("[Page] 主页自定义数据来源:本地文件") Content = ReadFile(Path & "PCL\Custom.xaml") 'ReadFile 会进行存在检测 Case 2 '联网下载 - Url = Setup.Get("UiCustomNet") + Url = Settings.Get("UiCustomNet") Case 3 '预设 - Select Case Setup.Get("UiCustomPreset") + Select Case Settings.Get("UiCustomPreset") Case 0 Log("[Page] 主页预设:你知道吗") Content = " @@ -88,7 +88,7 @@ Public Class PageLaunchRight Url = "https://pcl-bmcl.milu.ink/" Case 7 Log("[Page] 主页预设:主页市场") - Url = "https://pclhomeplazaoss.lingyunawa.top:26994/d/Homepages/JingHai-Lingyun/Custom.xaml" + Url = "https://pclhomeplazaoss.lingyunawa.top:26994/p/Homepages/Homepage.Market/Custom.xaml" Case 8 Log("[Page] 主页预设:更新日志") Url = "https://pclhomeplazaoss.lingyunawa.top:26994/d/Homepages/Joker2184/UpdateHomepage.xaml" @@ -100,7 +100,7 @@ Public Class PageLaunchRight Url = "https://files.mcimirror.top/PCL" Case 11 Log("[Page] 主页预设:杂志主页") - Url = "https://pclhomeplazaoss.lingyunawa.top:26994/d/Homepages/Ext1nguisher/Custom.xaml" + Url = "http://118.195.192.193:26995/d/magazine-homepage-pcl/Custom.xaml" Case 12 Log("[Page] 主页预设:PCL GitHub 仪表盘") Url = "https://ddf.pcl-community.org/Custom.xaml" @@ -117,7 +117,7 @@ Public Class PageLaunchRight End Select '联网下载 If Not String.IsNullOrWhiteSpace(Url) Then - If Url = Setup.Get("CacheSavedPageUrl") AndAlso File.Exists(PathTemp & "Cache\Custom.xaml") Then + If Url = Settings.Get("CacheSavedPageUrl") AndAlso File.Exists(PathTemp & "Cache\Custom.xaml") Then '缓存可用 Log("[Page] 主页自定义数据来源:联网缓存文件") Content = ReadFile(PathTemp & "Cache\Custom.xaml") @@ -128,7 +128,7 @@ Public Class PageLaunchRight Log("[Page] 主页自定义数据来源:联网全新下载") Hint("正在加载主页……") RunInUiWait(Sub() LoadContent(Nothing)) '在加载结束前清空页面 - Setup.Set("CacheSavedPageVersion", "") + Settings.Set("CacheSavedPageVersion", "") OnlineLoader.Start(New Tuple(Of String, Boolean)(Url, True)) '下载完成后将会再次触发更新 Return End If @@ -152,7 +152,7 @@ Public Class PageLaunchRight VersionAddress = Address.Replace(".xaml", ".xaml.ini") Else VersionAddress = Address.BeforeFirst("?") - If Not VersionAddress.EndsWith("/") Then VersionAddress += "/" + If Not VersionAddress.EndsWithF("/") Then VersionAddress += "/" VersionAddress += "version" If Address.Contains("?") Then VersionAddress += "?" & Address.AfterFirst("?") End If @@ -161,7 +161,7 @@ Public Class PageLaunchRight Try Version = NetRequestByClientRetry(VersionAddress) If Version.Length > 1000 Then Throw New Exception($"获取的主页版本过长({Version.Length} 字符)") - Dim CurrentVersion As String = Setup.Get("CacheSavedPageVersion") + Dim CurrentVersion As String = Settings.Get("CacheSavedPageVersion") If Version <> "" AndAlso CurrentVersion <> "" AndAlso Version = CurrentVersion Then Log($"[Page] 当前缓存的主页已为最新,当前版本:{Version},检查源:{VersionAddress}") Return @@ -174,8 +174,8 @@ Public Class PageLaunchRight '实际下载 Dim FileContent As String = NetRequestByClientRetry(Address) Log($"[Page] 已联网下载主页,内容长度:{FileContent.Length},来源:{Address}") - Setup.Set("CacheSavedPageUrl", Address) - Setup.Set("CacheSavedPageVersion", Version) + Settings.Set("CacheSavedPageUrl", Address) + Settings.Set("CacheSavedPageVersion", Version) WriteFile(PathTemp & "Cache\Custom.xaml", FileContent) '若内容变更则要求刷新 If LoadedContentHash <> FileContent.GetHashCode() AndAlso ShouldRefresh Then Refresh() @@ -206,8 +206,8 @@ Public Class PageLaunchRight Private Sub ClearCache() LoadedContentHash = -1 OnlineLoader.Input = New Tuple(Of String, Boolean)("", True) - Setup.Set("CacheSavedPageUrl", "") - Setup.Set("CacheSavedPageVersion", "") + Settings.Set("CacheSavedPageUrl", "") + Settings.Set("CacheSavedPageVersion", "") Log("[Page] 已清空主页缓存") End Sub @@ -251,7 +251,7 @@ Public Class PageLaunchRight ''' 加载主页失败时调用。 ''' Private Sub OnLoadContentFailed(ex As Exception) - If ModeDebug OrElse Setup.Get("UiCustomType") = 1 Then + If ModeDebug OrElse Settings.Get("UiCustomType") = 1 Then Log(ex, "加载主页失败") If MyMsgBox(If(TypeOf ex Is UnauthorizedAccessException, ex.Message, $"主页内容编写有误,请根据下列错误信息进行检查:{vbCrLf}{ex.GetBrief}"), "加载主页失败", "重试", "取消") = 1 Then ForceRefresh() diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb index 843ac2d..5ddda26 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb @@ -5,20 +5,20 @@ ''' Public Sub Reload(KeepInput As Boolean) '记住密码 - CheckRemember.Checked = Setup.Get("LoginRemember") + CheckRemember.Checked = Settings.Get("LoginRemember") If KeepInput AndAlso Not IsFirstLoad Then '避免第一次就以 KeepInput 的方式加载,导致文本框里没东西 '保留输入,只刷新下拉框列表 Dim Input As String = ComboName.Text - ComboName.ItemsSource = If(Setup.Get("LoginAuthEmail") = "", Nothing, Setup.Get("LoginAuthEmail").ToString.Split("¨")) + ComboName.ItemsSource = If(Settings.Get("LoginAuthEmail") = "", Nothing, Settings.Get("LoginAuthEmail").ToString.Split("¨")) ComboName.Text = Input Else '不保留输入,刷新列表后自动选择第一项 - If Setup.Get("LoginAuthEmail") = "" Then + If Settings.Get("LoginAuthEmail") = "" Then ComboName.ItemsSource = Nothing Else - ComboName.ItemsSource = Setup.Get("LoginAuthEmail").ToString.Split("¨") - ComboName.Text = Setup.Get("LoginAuthEmail").ToString.BeforeFirst("¨") - If Setup.Get("LoginRemember") Then TextPass.Password = Setup.Get("LoginAuthPass").ToString.BeforeFirst("¨").Trim + ComboName.ItemsSource = Settings.Get("LoginAuthEmail").ToString.Split("¨") + ComboName.Text = Settings.Get("LoginAuthEmail").ToString.BeforeFirst("¨") + If Settings.Get("LoginRemember") Then TextPass.Password = Settings.Get("LoginAuthPass").ToString.BeforeFirst("¨").Trim End If End If IsFirstLoad = False @@ -27,7 +27,7 @@ ''' 获取当前页面的登录信息。 ''' Public Shared Function GetLoginData() As McLoginServer - Dim Server As String = If(IsNothing(McInstanceSelected), Setup.Get("CacheAuthServerServer"), Setup.Get("VersionServerAuthServer", Instance:=McInstanceSelected)) & "/authserver" + Dim Server As String = If(IsNothing(McInstanceSelected), Settings.Get("CacheAuthServerServer"), Settings.Get("VersionServerAuthServer", Instance:=McInstanceSelected)) & "/authserver" If FrmLoginAuth Is Nothing Then Return New McLoginServer(McLoginType.Auth) With {.Token = "Auth", .BaseUrl = Server, .UserName = "", .Password = "", .Description = "Authlib-Injector", .Type = McLoginType.Auth} Else @@ -49,20 +49,20 @@ '保存输入信息 Private Sub ComboName_TextChanged(sender As Object, e As TextChangedEventArgs) Handles ComboName.TextChanged If sender.Text = "" Then TextPass.Password = "" - If AniControlEnabled = 0 Then Setup.Set("CacheAuthAccess", "") '迫使其不进行 Validate + If AniControlEnabled = 0 Then Settings.Set("CacheAuthAccess", "") '迫使其不进行 Validate End Sub Private Sub TextPass_PasswordChanged(sender As Object, e As RoutedEventArgs) Handles TextPass.PasswordChanged - If AniControlEnabled = 0 Then Setup.Set("CacheAuthAccess", "") + If AniControlEnabled = 0 Then Settings.Set("CacheAuthAccess", "") End Sub Private Sub ComboName_SelectionChanged(sender As MyComboBox, e As SelectionChangedEventArgs) Handles ComboName.SelectionChanged - If sender.SelectedIndex = -1 OrElse Not Setup.Get("LoginRemember") Then + If sender.SelectedIndex = -1 OrElse Not Settings.Get("LoginRemember") Then TextPass.Password = "" Else - TextPass.Password = Setup.Get("LoginAuthPass").ToString.Split("¨")(sender.SelectedIndex).Trim + TextPass.Password = Settings.Get("LoginAuthPass").ToString.Split("¨")(sender.SelectedIndex).Trim End If End Sub Private Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckRemember.Change - If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked) + If AniControlEnabled = 0 Then Settings.Set(sender.Tag, sender.Checked) End Sub '链接处理 @@ -71,15 +71,15 @@ End Sub Private Sub Btn_Click(sender As Object, e As EventArgs) Handles BtnLink.Click If BtnLink.Content = "注册账号" Then - OpenWebsite(If(McInstanceSelected IsNot Nothing, Setup.Get("VersionServerAuthRegister", Instance:=McInstanceSelected), Setup.Get("CacheAuthServerRegister"))) + OpenWebsite(If(McInstanceSelected IsNot Nothing, Settings.Get("VersionServerAuthRegister", Instance:=McInstanceSelected), Settings.Get("CacheAuthServerRegister"))) Else - Dim Website As String = If(McInstanceSelected IsNot Nothing, Setup.Get("VersionServerAuthRegister", Instance:=McInstanceSelected), Setup.Get("CacheAuthServerRegister")) + Dim Website As String = If(McInstanceSelected IsNot Nothing, Settings.Get("VersionServerAuthRegister", Instance:=McInstanceSelected), Settings.Get("CacheAuthServerRegister")) OpenWebsite(Website.Replace("/auth/register", "/auth/forgot")) End If End Sub '切换注册按钮可见性 Private Sub ReloadRegisterButton() Handles Me.Loaded - Dim Address As String = If(McInstanceSelected IsNot Nothing, Setup.Get("VersionServerAuthRegister", Instance:=McInstanceSelected), Setup.Get("CacheAuthServerRegister")) + Dim Address As String = If(McInstanceSelected IsNot Nothing, Settings.Get("VersionServerAuthRegister", Instance:=McInstanceSelected), Settings.Get("CacheAuthServerRegister")) BtnLink.Visibility = If(String.IsNullOrEmpty(New ValidateHttp().Validate(Address)), Visibility.Visible, Visibility.Collapsed) End Sub diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuthSkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuthSkin.xaml.vb index 216c9ad..22b8ac7 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuthSkin.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuthSkin.xaml.vb @@ -12,17 +12,17 @@ ''' 刷新页面显示的所有信息。 ''' Public Sub Reload(KeepInput As Boolean) - TextName.Text = Setup.Get("CacheAuthName") - TextEmail.Text = Setup.Get("CacheAuthUsername") - TextEmail.Visibility = If(Setup.Get("UiLauncherEmail"), Visibility.Collapsed, Visibility.Visible) + TextName.Text = Settings.Get("CacheAuthName") + TextEmail.Text = Settings.Get("CacheAuthUsername") + TextEmail.Visibility = If(Settings.Get("UiLauncherEmail"), Visibility.Collapsed, Visibility.Visible) PageLoginLegacy_Loaded() End Sub ''' ''' 获取当前页面的登录信息。 ''' Public Shared Function GetLoginData() As McLoginServer - Dim Server As String = If(IsNothing(McInstanceSelected), Setup.Get("CacheAuthServerServer"), Setup.Get("VersionServerAuthServer", Instance:=McInstanceSelected)) & "/authserver" - Return New McLoginServer(McLoginType.Auth) With {.Token = "Auth", .BaseUrl = Server, .UserName = Setup.Get("CacheAuthUsername"), .Password = Setup.Get("CacheAuthPass"), .Description = "Authlib-Injector", .Type = McLoginType.Auth} + Dim Server As String = If(IsNothing(McInstanceSelected), Settings.Get("CacheAuthServerServer"), Settings.Get("VersionServerAuthServer", Instance:=McInstanceSelected)) & "/authserver" + Return New McLoginServer(McLoginType.Auth) With {.Token = "Auth", .BaseUrl = Server, .UserName = Settings.Get("CacheAuthUsername"), .Password = Settings.Get("CacheAuthPass"), .Description = "Authlib-Injector", .Type = McLoginType.Auth} End Function Private Sub PageLoginAuthSkin_MouseEnter(sender As Object, e As MouseEventArgs) Handles PanData.MouseEnter @@ -47,7 +47,7 @@ Private Sub BtnEdit_Click(sender As Object, e As EventArgs) Handles BtnEdit.Click If McLoginLoader.State = LoadState.Loading Then Log("[Launch] 要求更换角色,但登录加载器繁忙", LogLevel.Debug) - If CType(McLoginLoader.Input, McLoginServer).ForceReselectProfile Then + If TypeOf McLoginLoader.Input Is McLoginServer AndAlso CType(McLoginLoader.Input, McLoginServer).ForceReselectProfile Then Hint("正在尝试更换,请稍候!") Else Hint("正在登录中,请稍后再更换角色!", HintType.Red) @@ -55,8 +55,8 @@ Return End If Hint("正在尝试更换,请稍候!") - Setup.Set("CacheAuthUuid", "") '清空选择缓存 - Setup.Set("CacheAuthName", "") + Settings.Set("CacheAuthUuid", "") '清空选择缓存 + Settings.Set("CacheAuthName", "") RunInThread( Sub() Try @@ -70,15 +70,15 @@ End Sub) End Sub Public Shared Sub ExitLogin() Handles BtnExit.Click - Setup.Set("CacheAuthAccess", "") - Setup.Set("CacheAuthUuid", "") - Setup.Set("CacheAuthName", "") + Settings.Set("CacheAuthAccess", "") + Settings.Set("CacheAuthUuid", "") + Settings.Set("CacheAuthName", "") McLoginAuthLoader.Input = Nothing '防止因为输入的用户名密码相同,直接使用了上次登录的加载器结果 FrmLaunchLeft.RefreshPage(False, True) End Sub Private Sub Skin_Click(sender As Object, e As MouseButtonEventArgs) Handles Skin.Click - Dim Address As String = If(McInstanceSelected IsNot Nothing, Setup.Get("VersionServerAuthRegister", Instance:=McInstanceSelected), Setup.Get("CacheAuthServerRegister")) + Dim Address As String = If(McInstanceSelected IsNot Nothing, Settings.Get("VersionServerAuthRegister", Instance:=McInstanceSelected), Settings.Get("CacheAuthServerRegister")) If String.IsNullOrEmpty(New ValidateHttp().Validate(Address)) Then OpenWebsite(Address.Replace("/auth/register", "/user/closet")) End Sub diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginLegacy.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginLegacy.xaml.vb index 652330e..bd8016a 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginLegacy.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginLegacy.xaml.vb @@ -18,15 +18,15 @@ Public Class PageLoginLegacy If KeepInput AndAlso IsReloaded Then '避免第一次就以 KeepInput 的方式加载,导致文本框里没东西 '保留输入,只刷新下拉框列表 Dim Input As String = ComboName.Text.Trim - ComboName.ItemsSource = If(Setup.Get("LoginLegacyName") = "", Nothing, Setup.Get("LoginLegacyName").ToString.Split("¨")) + ComboName.ItemsSource = If(Settings.Get("LoginLegacyName") = "", Nothing, Settings.Get("LoginLegacyName").ToString.Split("¨")) ComboName.Text = Input Else '不保留输入,刷新列表后自动选择第一项 - If Setup.Get("LoginLegacyName") = "" Then + If Settings.Get("LoginLegacyName") = "" Then ComboName.ItemsSource = Nothing Else - ComboName.ItemsSource = Setup.Get("LoginLegacyName").ToString.Split("¨") - ComboName.Text = Setup.Get("LoginLegacyName").ToString.BeforeFirst("¨").Trim + ComboName.ItemsSource = Settings.Get("LoginLegacyName").ToString.Split("¨") + ComboName.Text = Settings.Get("LoginLegacyName").ToString.BeforeFirst("¨").Trim End If End If IsReloaded = True @@ -36,7 +36,7 @@ Public Class PageLoginLegacy ''' Public Shared Function GetLoginData() As McLoginData Dim UserName As String = If(FrmLoginLegacy Is Nothing, "", FrmLoginLegacy.ComboName.Text.Replace("¨", "").Trim) - Return New McLoginLegacy With {.UserName = UserName, .SkinType = Setup.Get("LaunchSkinType"), .SkinName = Setup.Get("LaunchSkinID")} + Return New McLoginLegacy With {.UserName = UserName, .SkinType = Settings.Get("LaunchSkinType"), .SkinName = Settings.Get("LaunchSkinID")} End Function ''' ''' 当前页面的登录信息是否有效。 @@ -62,12 +62,12 @@ Public Class PageLoginLegacy End If End Sub Private Sub ComboLegacy_TextChanged(sender As Object, e As TextChangedEventArgs) Handles ComboName.TextChanged - If Setup.Get("LaunchSkinType") = 0 Then PageLaunchLeft.SkinLegacy.Start(IsForceRestart:=True) + If Settings.Get("LaunchSkinType") = 0 Then PageLaunchLeft.SkinLegacy.Start(IsForceRestart:=True) HintChinese.Visibility = If(RegexCheck(ComboName.Text, "^[0-9A-Za-z_]*$"), Visibility.Collapsed, Visibility.Visible) RunInUi(Sub() PanMain.InvalidateMeasure(), True) '由于 WPF 的 Bug,它不一定会自动更新 HintChinese 的大小(#6627) End Sub Private Sub Skin_Click() Handles Skin.Click - If (Setup.Get("UiHiddenPageSetup") OrElse Setup.Get("UiHiddenSetupLaunch")) AndAlso Not PageSetupUI.HiddenForceShow Then + If (Settings.Get("UiHiddenPageSetup") OrElse Settings.Get("UiHiddenSetupLaunch")) AndAlso Not PageSetupUI.HiddenForceShow Then Hint("启动设置已被禁用!", HintType.Red) Else FrmMain.PageChange(FormMain.PageType.Setup, FormMain.PageSubType.SetupLaunch) '切换到皮肤设置页面 diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb index 0d5ed36..b4513d9 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb @@ -9,7 +9,7 @@ ComboAccounts.Items.Clear() ComboAccounts.Items.Add(New MyComboBoxItem With {.Content = "添加新账号"}) Try - Dim MsJson As JObject = GetJson(Setup.Get("LoginMsJson")) + Dim MsJson As JObject = GetJson(Settings.Get("LoginMsJson")) For Each Account In MsJson Dim Item As MyListItem = CType(FindResource("ComboBoxItemTemplateWithDelete"), DataTemplate).LoadContent() Item.Tag = Account.Value.ToString @@ -18,8 +18,8 @@ ComboAccounts.Items.Add(Item) Next Catch ex As Exception - Log(ex, $"微软登录信息出错,登录信息已被重置({Setup.Get("LoginMsJson")})", LogLevel.Hint) - Setup.Set("LoginMsJson", "{}") + Log(ex, $"微软登录信息出错,登录信息已被重置({Settings.Get("LoginMsJson")})", LogLevel.Hint) + Settings.Set("LoginMsJson", "{}") End Try '如果不保留输入,刷新列表后自动选择第一项 ComboAccounts.SelectedIndex = If(KeepInput, Math.Max(0, IndexBefore), 0) @@ -37,7 +37,7 @@ ''' 获取当前页面的登录信息。 ''' Public Shared Function GetLoginData() As McLoginMs - If FrmLoginMs Is Nothing Then Return New McLoginMs With {.OAuthRefreshToken = Setup.Get("CacheMsV2OAuthRefresh"), .UserName = Setup.Get("CacheMsV2Name")} + If FrmLoginMs Is Nothing Then Return New McLoginMs With {.OAuthRefreshToken = Settings.Get("CacheMsV2OAuthRefresh"), .UserName = Settings.Get("CacheMsV2Name")} Dim Result As McLoginMs = Nothing RunInUiWait( Sub() @@ -78,7 +78,7 @@ Loop If McLoginMsLoader.State = LoadState.Finished Then RunInUi(Sub() FrmLaunchLeft.RefreshPage(False, True)) - ElseIf McLoginMsLoader.State = LoadState.Aborted Then + ElseIf McLoginMsLoader.State = LoadState.Interrupted Then Throw New ThreadInterruptedException ElseIf McLoginMsLoader.Error Is Nothing Then Throw New Exception("未知错误!") @@ -89,7 +89,7 @@ Hint("已取消登录!") Catch ex As Exception If ex.Message = "$$" Then - ElseIf ex.Message.StartsWith("$") Then + ElseIf ex.Message.StartsWithF("$") Then Hint(ex.Message.TrimStart("$"), HintType.Red) ElseIf TypeOf ex Is Security.Authentication.AuthenticationException AndAlso ex.Message.ContainsF("SSL/TLS") Then Log(ex, "正版登录验证失败,请考虑在 [设置 → 其他] 中关闭 [在正版登录时验证 SSL 证书],然后再试。" & vbCrLf & vbCrLf & "原始错误信息:", LogLevel.Msgbox) diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml.vb index 874d53a..269afb6 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml.vb @@ -12,7 +12,7 @@ ''' 刷新页面显示的所有信息。 ''' Public Sub Reload(KeepInput As Boolean) - TextName.Text = Setup.Get("CacheMsV2Name") + TextName.Text = Settings.Get("CacheMsV2Name") '皮肤在 Loaded 加载 End Sub ''' @@ -20,9 +20,9 @@ ''' Public Shared Function GetLoginData() As McLoginMs If McLoginMsLoader.State = LoadState.Finished Then - Return New McLoginMs With {.OAuthRefreshToken = Setup.Get("CacheMsV2OAuthRefresh"), .UserName = Setup.Get("CacheMsV2Name"), .AccessToken = Setup.Get("CacheMsV2Access"), .Uuid = Setup.Get("CacheMsV2Uuid"), .ProfileJson = Setup.Get("CacheMsV2ProfileJson")} + Return New McLoginMs With {.OAuthRefreshToken = Settings.Get("CacheMsV2OAuthRefresh"), .UserName = Settings.Get("CacheMsV2Name"), .AccessToken = Settings.Get("CacheMsV2Access"), .Uuid = Settings.Get("CacheMsV2Uuid"), .ProfileJson = Settings.Get("CacheMsV2ProfileJson")} Else - Return New McLoginMs With {.OAuthRefreshToken = Setup.Get("CacheMsV2OAuthRefresh"), .UserName = Setup.Get("CacheMsV2Name")} + Return New McLoginMs With {.OAuthRefreshToken = Settings.Get("CacheMsV2OAuthRefresh"), .UserName = Settings.Get("CacheMsV2Name")} End If End Function @@ -50,12 +50,12 @@ '退出登录 Private Sub BtnExit_Click() Handles BtnExit.Click - Setup.Set("CacheMsV2OAuthRefresh", "") - Setup.Set("CacheMsV2Access", "") - Setup.Set("CacheMsV2ProfileJson", "") - Setup.Set("CacheMsV2Uuid", "") - Setup.Set("CacheMsV2Name", "") - McLoginMsLoader.Abort() + Settings.Set("CacheMsV2OAuthRefresh", "") + Settings.Set("CacheMsV2Access", "") + Settings.Set("CacheMsV2ProfileJson", "") + Settings.Set("CacheMsV2Uuid", "") + Settings.Set("CacheMsV2Name", "") + McLoginMsLoader.Interrupt() FrmLaunchLeft.RefreshPage(False, True) End Sub @@ -85,51 +85,56 @@ Hint("正在更改皮肤……") IsChanging = True '开始实际获取 - RunInNewThread( - Sub() - Try + RunInNewThread(Sub() EditSkin(SkinInfo), "Ms Skin Upload") + End Sub + Private Sub EditSkin(SkinInfo As McSkinInfo) Retry: - Do While McLoginMsLoader.State = LoadState.Loading '等待登录结束 - Thread.Sleep(10) - Loop - If McLoginMsLoader.State = LoadState.Failed Then Throw New Exception("登录失败", McLoginMsLoader.Error) - Dim AccessToken As String = Setup.Get("CacheMsV2Access") - Dim Uuid As String = Setup.Get("CacheMsV2Uuid") - Dim Result As String = NetRequestByClientRetry("https://api.minecraftservices.com/minecraft/profile/skins", HttpMethod.Post, - Content:=New Net.Http.MultipartFormDataContent From { - {New Net.Http.StringContent(If(SkinInfo.IsSlim, "slim", "classic")), "variant"}, - {New Net.Http.ByteArrayContent(ReadFileBytes(SkinInfo.LocalFile)), "file", GetFileNameFromPath(SkinInfo.LocalFile)} - }, - Headers:={{"Authorization", "Bearer " & AccessToken}, {"Accept", "*/*"}, {"User-Agent", "MojangSharp/0.1"}}) - 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").ToString, HintType.Red) + Try + Do While McLoginMsLoader.State = LoadState.Loading '等待登录结束 + Thread.Sleep(10) + Loop + If McLoginMsLoader.State = LoadState.Failed Then Throw New Exception("登录失败", McLoginMsLoader.Error) + Dim AccessToken As String = Settings.Get("CacheMsV2Access") + Dim Uuid As String = Settings.Get("CacheMsV2Uuid") + Dim Result As String = NetRequestByClientRetry("https://api.minecraftservices.com/minecraft/profile/skins", HttpMethod.Post, + Content:=New Net.Http.MultipartFormDataContent From { + {New Net.Http.StringContent(If(SkinInfo.IsSlim, "slim", "classic")), "variant"}, + {New Net.Http.ByteArrayContent(ReadFileBytes(SkinInfo.LocalFile)), "file", GetFileNameFromPath(SkinInfo.LocalFile)} + }, + Headers:={{"Authorization", "Bearer " & AccessToken}, {"Accept", "*/*"}, {"User-Agent", "MojangSharp/0.1"}}) + 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").ToString, HintType.Red) + Return + End If + '获取新皮肤地址 + Log("[Skin] 皮肤修改返回值:" & vbCrLf & Result) + Dim ResultJson As JObject = GetJson(Result) + If ResultJson.ContainsKey("errorMessage") Then Throw New Exception(ResultJson("errorMessage").ToString) '#5309 + For Each Skin As JObject In ResultJson("skins") + If Skin("state").ToString = "ACTIVE" Then + MySkin.ReloadCache(Skin("url")) Return End If - '获取新皮肤地址 - Log("[Skin] 皮肤修改返回值:" & vbCrLf & Result) - Dim ResultJson As JObject = GetJson(Result) - If ResultJson.ContainsKey("errorMessage") Then Throw New Exception(ResultJson("errorMessage").ToString) '#5309 - For Each Skin As JObject In ResultJson("skins") - If Skin("state").ToString = "ACTIVE" Then - MySkin.ReloadCache(Skin("url")) - Return - End If - Next - Throw New Exception("未知错误(" & Result & ")") - Catch ex As Exception - If TypeOf ex Is OperationCanceledException OrElse TypeOf ex Is TimeoutException Then - Hint("更改皮肤失败:连接皮肤服务器超时,请稍后再试,或使用 VPN 改善网络环境", HintType.Red) - Else - Log(ex, "更改皮肤失败", LogLevel.Hint) - End If - Finally - IsChanging = False - End Try - End Sub, "Ms Skin Upload") + Next + Throw New Exception("未知错误(" & Result & ")") + Catch ex As Exception + If TypeOf ex Is OperationCanceledException OrElse TypeOf ex Is TimeoutException Then + Hint("更改皮肤失败:连接皮肤服务器超时,请稍后再试,或使用 VPN 改善网络环境", HintType.Red) + ElseIf TypeOf ex Is ResponsedWebException AndAlso CType(ex, ResponsedWebException).StatusCode = HttpStatusCode.Unauthorized Then + Log(ex, "更改皮肤时遭遇 401 错误", LogLevel.Developer) + Hint("正在重新登录,将在登录后自动更改皮肤……") + McLoginMsLoader.Start(GetLoginData(), IsForceRestart:=True) + GoTo Retry + Else + Log(ex, "更改皮肤失败", LogLevel.Hint) + End If + Finally + IsChanging = False + End Try 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 1fda558..f26b59b 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginNide.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginNide.xaml.vb @@ -5,20 +5,20 @@ ''' Public Sub Reload(KeepInput As Boolean) '记住密码 - CheckRemember.Checked = Setup.Get("LoginRemember") + CheckRemember.Checked = Settings.Get("LoginRemember") If KeepInput AndAlso Not IsFirstLoad Then '避免第一次就以 KeepInput 的方式加载,导致文本框里没东西 '保留输入,只刷新下拉框列表 Dim Input As String = ComboName.Text - ComboName.ItemsSource = If(Setup.Get("LoginNideEmail") = "", Nothing, Setup.Get("LoginNideEmail").ToString.Split("¨")) + ComboName.ItemsSource = If(Settings.Get("LoginNideEmail") = "", Nothing, Settings.Get("LoginNideEmail").ToString.Split("¨")) ComboName.Text = Input Else '不保留输入,刷新列表后自动选择第一项 - If Setup.Get("LoginNideEmail") = "" Then + If Settings.Get("LoginNideEmail") = "" Then ComboName.ItemsSource = Nothing Else - ComboName.ItemsSource = Setup.Get("LoginNideEmail").ToString.Split("¨") - ComboName.Text = Setup.Get("LoginNideEmail").ToString.BeforeFirst("¨") - If Setup.Get("LoginRemember") Then TextPass.Password = Setup.Get("LoginNidePass").ToString.BeforeFirst("¨").Trim + ComboName.ItemsSource = Settings.Get("LoginNideEmail").ToString.Split("¨") + ComboName.Text = Settings.Get("LoginNideEmail").ToString.BeforeFirst("¨") + If Settings.Get("LoginRemember") Then TextPass.Password = Settings.Get("LoginNidePass").ToString.BeforeFirst("¨").Trim End If End If IsFirstLoad = False @@ -27,7 +27,7 @@ ''' 获取当前页面的登录信息。 ''' Public Shared Function GetLoginData() As McLoginServer - Dim Server As String = If(IsNothing(McInstanceSelected), Setup.Get("CacheNideServer"), Setup.Get("VersionServerNide", Instance:=McInstanceSelected)) + Dim Server As String = If(IsNothing(McInstanceSelected), Settings.Get("CacheNideServer"), Settings.Get("VersionServerNide", Instance:=McInstanceSelected)) If FrmLoginNide Is Nothing Then Return New McLoginServer(McLoginType.Nide) With {.Token = "Nide", .UserName = "", .Password = "", .Description = "统一通行证", .Type = McLoginType.Nide, .BaseUrl = "https://auth.mc-user.com:233/" & Server & "/authserver"} Else @@ -49,20 +49,20 @@ '保存输入信息 Private Sub ComboName_TextChanged(sender As Object, e As TextChangedEventArgs) Handles ComboName.TextChanged If sender.Text = "" Then TextPass.Password = "" - If AniControlEnabled = 0 Then Setup.Set("CacheNideAccess", "") '迫使其不进行 Validate + If AniControlEnabled = 0 Then Settings.Set("CacheNideAccess", "") '迫使其不进行 Validate End Sub Private Sub TextPass_PasswordChanged(sender As Object, e As RoutedEventArgs) Handles TextPass.PasswordChanged - If AniControlEnabled = 0 Then Setup.Set("CacheNideAccess", "") + If AniControlEnabled = 0 Then Settings.Set("CacheNideAccess", "") End Sub Private Sub ComboName_SelectionChanged(sender As MyComboBox, e As SelectionChangedEventArgs) Handles ComboName.SelectionChanged - If sender.SelectedIndex = -1 OrElse Not Setup.Get("LoginRemember") Then + If sender.SelectedIndex = -1 OrElse Not Settings.Get("LoginRemember") Then TextPass.Password = "" Else - TextPass.Password = Setup.Get("LoginNidePass").ToString.Split("¨")(sender.SelectedIndex).Trim + TextPass.Password = Settings.Get("LoginNidePass").ToString.Split("¨")(sender.SelectedIndex).Trim End If End Sub Private Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckRemember.Change - If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked) + If AniControlEnabled = 0 Then Settings.Set(sender.Tag, sender.Checked) End Sub '链接处理 @@ -71,7 +71,7 @@ End Sub Private Sub Btn_Click(sender As Object, e As EventArgs) Handles BtnLink.Click If BtnLink.Content = "注册账号" Then - OpenWebsite("https://login.mc-user.com:233/" & Setup.Get("VersionServerNide", Instance:=McInstanceSelected) & "/register") + OpenWebsite("https://login.mc-user.com:233/" & Settings.Get("VersionServerNide", Instance:=McInstanceSelected) & "/register") Else OpenWebsite("https://login.mc-user.com:233/account/login") End If diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginNideSkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginNideSkin.xaml.vb index 5baeb15..c679f02 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginNideSkin.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginNideSkin.xaml.vb @@ -12,17 +12,17 @@ ''' 刷新页面显示的所有信息。 ''' Public Sub Reload(KeepInput As Boolean) - TextName.Text = Setup.Get("CacheNideName") - TextEmail.Text = Setup.Get("CacheNideUsername") - TextEmail.Visibility = If(Setup.Get("UiLauncherEmail"), Visibility.Collapsed, Visibility.Visible) + TextName.Text = Settings.Get("CacheNideName") + TextEmail.Text = Settings.Get("CacheNideUsername") + TextEmail.Visibility = If(Settings.Get("UiLauncherEmail"), Visibility.Collapsed, Visibility.Visible) '皮肤在 Loaded 加载 End Sub ''' ''' 获取当前页面的登录信息。 ''' Public Shared Function GetLoginData() As McLoginServer - Dim Server As String = If(IsNothing(McInstanceSelected), Setup.Get("CacheNideServer"), Setup.Get("VersionServerNide", Instance:=McInstanceSelected)) - Return New McLoginServer(McLoginType.Nide) With {.Token = "Nide", .UserName = Setup.Get("CacheNideUsername"), .Password = Setup.Get("CacheNidePass"), .Description = "统一通行证", .Type = McLoginType.Nide, .BaseUrl = "https://auth.mc-user.com:233/" & Server & "/authserver"} + Dim Server As String = If(IsNothing(McInstanceSelected), Settings.Get("CacheNideServer"), Settings.Get("VersionServerNide", Instance:=McInstanceSelected)) + Return New McLoginServer(McLoginType.Nide) With {.Token = "Nide", .UserName = Settings.Get("CacheNideUsername"), .Password = Settings.Get("CacheNidePass"), .Description = "统一通行证", .Type = McLoginType.Nide, .BaseUrl = "https://auth.mc-user.com:233/" & Server & "/authserver"} End Function Private Sub PageLoginNideSkin_MouseEnter(sender As Object, e As MouseEventArgs) Handles PanData.MouseEnter @@ -48,13 +48,13 @@ OpenWebsite("https://login.mc-user.com:233/account/changepw") End Sub Public Shared Sub ExitLogin() Handles BtnExit.Click - Setup.Set("CacheNideAccess", "") + Settings.Set("CacheNideAccess", "") McLoginNideLoader.Input = Nothing '防止因为输入的用户名密码相同,直接使用了上次登录的加载器结果 FrmLaunchLeft.RefreshPage(False, True) End Sub Private Sub Skin_Click(sender As Object, e As MouseButtonEventArgs) Handles Skin.Click - OpenWebsite("https://login.mc-user.com:233/" & If(IsNothing(McInstanceSelected), Setup.Get("CacheNideServer"), Setup.Get("VersionServerNide", Instance:=McInstanceSelected)) & "/skin") + OpenWebsite("https://login.mc-user.com:233/" & If(IsNothing(McInstanceSelected), Settings.Get("CacheNideServer"), Settings.Get("VersionServerNide", Instance:=McInstanceSelected)) & "/skin") End Sub End Class diff --git a/Plain Craft Launcher 2/Pages/PageLink/PageLinkMain.xaml.vb b/Plain Craft Launcher 2/Pages/PageLink/PageLinkMain.xaml.vb index 4a3dcff..8a1bb8c 100644 --- a/Plain Craft Launcher 2/Pages/PageLink/PageLinkMain.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLink/PageLinkMain.xaml.vb @@ -70,7 +70,7 @@ Public Class PageLinkMain '由任意状态切换到 Waiting Private Sub SwitchToWaiting(OldState As LinkStates) '加载器与进程状态 - LinkLoader.Abort() + LinkLoader.Interrupt() SyncLock LinkLoader.LockState LinkLoader.State = LoadState.Waiting End SyncLock @@ -171,7 +171,7 @@ Public Class PageLinkMain End Function Private Shared Function FixCodeFormat(Code As String) As String Code = Code.Between("【", "】").Between("[", "]") '从完整消息中提取 - Code = Code.ToUpper.Replace("O", "0").Replace("I", "1") '输入修正 + Code = Code.Upper.Replace("O", "0").Replace("I", "1") '输入修正 '版本 1 兼容 If Code.Length >= 17 AndAlso (Code.Length < 23 OrElse (Code.Length >= 18 AndAlso Code(17) <> "-"c)) Then Code = Code.Substring(0, 17) & "-0105E" @@ -223,7 +223,7 @@ Public Class PageLinkMain '由 Loading 状态切换到 Failed Private Sub SwitchToFailed(OldState As LinkStates) '加载器与进程状态 - LinkLoader.Abort() + LinkLoader.Interrupt() ProcessStop() 'UI 更新 UpdateProgressBar(1) @@ -356,7 +356,7 @@ Public Class PageLinkMain Private Sub Copy() Handles BtnFinishCopy.Click Dim CodeText As String = $"在 PCL 启动器中输入邀请码【{GetInviteCode()}】,即可加入联机房间!" ClipboardSet(CodeText, False) - Setup.Set("LinkLastAutoJoinInviteCode", CodeText) + Settings.Set("LinkLastAutoJoinInviteCode", CodeText) Hint("已复制邀请码!", HintType.Green) End Sub Private Function GetInviteCode() As String @@ -460,9 +460,9 @@ Public Class PageLinkMain UpdateLoadingPage("正在检查联机模块版本……", "检查联机模块版本") If Not (File.Exists(PathEasyTier & "联机模块 CLI.exe") AndAlso File.Exists(PathEasyTier & "联机模块.exe") AndAlso File.Exists(PathEasyTier & "Packet.dll")) Then - Setup.Set("LinkEasyTierVersion", -1) + Settings.Set("LinkEasyTierVersion", -1) End If - Dim LocalVersion As Integer = Setup.Get("LinkEasyTierVersion") + Dim LocalVersion As Integer = Settings.Get("LinkEasyTierVersion") ServerVersion = ServerConfig("Link")("EasyTierVersion") Dim RequiredFiles As New List(Of NetFile) Log($"[Link] EasyTier 本地版本:{LocalVersion},需求版本:{ServerVersion}") @@ -491,18 +491,18 @@ Public Class PageLinkMain CopyDirectory(ExtractedPath, PathEasyTier) '重命名 File.Delete(PathEasyTier & "联机模块.exe") - Rename(PathEasyTier & "easytier-core.exe", PathEasyTier & "联机模块.exe") + File.Move(PathEasyTier & "easytier-core.exe", PathEasyTier & "联机模块.exe") File.Delete(PathEasyTier & "联机模块 CLI.exe") - Rename(PathEasyTier & "easytier-cli.exe", PathEasyTier & "联机模块 CLI.exe") + File.Move(PathEasyTier & "easytier-cli.exe", PathEasyTier & "联机模块 CLI.exe") '清理 File.Delete(PathEasyTier & "EasyTier.zip") - Setup.Set("LinkEasyTierVersion", ServerVersion) + Settings.Set("LinkEasyTierVersion", ServerVersion) End If Task.Progress = 0.07 '获取节点列表 UpdateLoadingPage("正在获取节点列表……", "获取节点列表") Dim RawPeers As List(Of String) - Dim CustomPeers As String = Setup.Get("LinkCustomPeer") + Dim CustomPeers As String = Settings.Get("LinkCustomPeer") If String.IsNullOrWhiteSpace(CustomPeers) Then If DiscoverNodeID = -2 AndAlso Not IsServerSide Then Panic("未填写自定义节点设置", $"$你必须在 {vbLQ}自定义节点{vbRQ} 设置中填写与房主相同的内容,{vbCrLf}才能进入该房间!") @@ -539,7 +539,7 @@ Public Class PageLinkMain For Each Peer As String In RawPeers Arguments += $" -p=""{Peer}""" Next - If Setup.Get("LinkLatencyMode") = 1 Then Arguments += " --latency-first" + If Settings.Get("LinkLatencyMode") = 1 Then Arguments += " --latency-first" '启动进程 ProcessStart(Arguments) Task.Progress = 0.15 @@ -585,8 +585,8 @@ Public Class PageLinkMain Panic("无法连接到房主", $"可能的原因:{vbCrLf}- 你或者房主的网络环境不佳{vbCrLf}- 房主已关闭房间{vbCrLf}- 邀请码输错了") End Select End If - Loop Until Task.IsAborted - If Task.IsAborted Then Throw New ThreadInterruptedException + Loop Until Task.IsInterrupted + If Task.IsInterrupted Then Throw New ThreadInterruptedException '等待连接稳定,最多 5s If IsServerSide Then Return UpdateLoadingPage("连接优化中……", "优化连接") @@ -594,7 +594,7 @@ Public Class PageLinkMain For i = 1 To 50 Dim Server = GetTargetPeer() If Server IsNot Nothing AndAlso Not Server.Relay AndAlso Server.Ping < 100 Then Return '结束 - If Task.IsAborted Then Throw New ThreadInterruptedException + If Task.IsInterrupted Then Throw New ThreadInterruptedException Thread.Sleep(100) Next End Sub @@ -1060,7 +1060,7 @@ ForcedPass: Else HintFinish.Text = "你或者房主的网络环境不太好," End If - If String.IsNullOrWhiteSpace(Setup.Get("LinkCustomPeer")) Then + If String.IsNullOrWhiteSpace(Settings.Get("LinkCustomPeer")) Then HintFinish.Text &= "正使用社区节点进行中继。" Else HintFinish.Text &= "正通过自定义节点进行中继。" diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml index fabadba..624a561 100644 --- a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml +++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml @@ -30,7 +30,7 @@ + local:CustomEventService.EventType="打开网页" local:CustomEventService.EventData="https://meloong.com/afd/a/LTCat" /> @@ -54,7 +54,7 @@ - + @@ -117,792 +117,399 @@ - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -911,7 +518,7 @@ - + @@ -957,7 +564,10 @@ + + + - - + + + local:CustomEventService.EventType="打开网页" local:CustomEventService.EventData="https://github.com/HMCL-dev/lwjgl-unsafe-agent" /> + + + + + - - - + + - - - - + + - - - - + + - - - - + + - - - - + + - - - + + - diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherHelp.xaml.vb b/Plain Craft Launcher 2/Pages/PageOther/PageOtherHelp.xaml.vb index 6fd927f..23ddcc8 100644 --- a/Plain Craft Launcher 2/Pages/PageOther/PageOtherHelp.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherHelp.xaml.vb @@ -144,13 +144,13 @@ If Not Entry.ShowInSearch OrElse (Val(VersionBranchCode) <> 50 AndAlso Not Entry.ShowInSnapshot) Then Continue For QueryList.Add(New SearchEntry(Of HelpEntry) With { .Item = Entry, - .SearchSource = New List(Of KeyValuePair(Of String, Double)) From { - New KeyValuePair(Of String, Double)(Entry.Title, 1), - New KeyValuePair(Of String, Double)(Entry.Desc, 0.5), - New KeyValuePair(Of String, Double)(Entry.Search, 1.5) + .SearchSource = New List(Of SearchSource) From { + New SearchSource(Entry.Title, 1), + New SearchSource(Entry.Desc, 0.5), + New SearchSource(Entry.Search, 1.5) } }) - 'New KeyValuePair(Of String, Double)(If(Entry.IsEvent, If(Entry.EventData, ""), Entry.XamlContent), 0.2) + 'New SearchSource(If(Entry.IsEvent, If(Entry.EventData, ""), Entry.XamlContent), 0.2) Next '进行搜索,构造列表 Dim SearchResult = Search(QueryList, SearchBox.Text, MaxBlurCount:=5, MinBlurSimilarity:=0.08) diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml.vb index 1389273..5d2b386 100644 --- a/Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml.vb @@ -5,9 +5,9 @@ Private Sub PageOtherLeft_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded '是否处于隐藏的子页面 Dim IsHiddenPage As Boolean = False - If ItemHelp.Checked AndAlso Setup.Get("UiHiddenOtherHelp") Then IsHiddenPage = True - If ItemAbout.Checked AndAlso Setup.Get("UiHiddenOtherAbout") Then IsHiddenPage = True - If ItemTest.Checked AndAlso Setup.Get("UiHiddenOtherTest") Then IsHiddenPage = True + If ItemHelp.Checked AndAlso Settings.Get("UiHiddenOtherHelp") Then IsHiddenPage = True + If ItemAbout.Checked AndAlso Settings.Get("UiHiddenOtherAbout") Then IsHiddenPage = True + If ItemTest.Checked AndAlso Settings.Get("UiHiddenOtherTest") Then IsHiddenPage = True If PageSetupUI.HiddenForceShow Then IsHiddenPage = False '若页面错误,或尚未加载,则继续 If IsLoad AndAlso Not IsHiddenPage Then Return @@ -16,9 +16,9 @@ PageSetupUI.HiddenRefresh() '选择第一个未被禁用的子页面 If IsPageSwitched Then Return - If Not Setup.Get("UiHiddenOtherHelp") Then + If Not Settings.Get("UiHiddenOtherHelp") Then ItemHelp.SetChecked(True, False, False) - ElseIf Not Setup.Get("UiHiddenOtherAbout") Then + ElseIf Not Settings.Get("UiHiddenOtherAbout") Then ItemAbout.SetChecked(True, False, False) Else ItemTest.SetChecked(True, False, False) @@ -37,9 +37,9 @@ Public Sub New() InitializeComponent() '选择第一个未被禁用的子页面 - If Not Setup.Get("UiHiddenOtherHelp") Then + If Not Settings.Get("UiHiddenOtherHelp") Then PageID = FormMain.PageSubType.OtherHelp - ElseIf Not Setup.Get("UiHiddenOtherAbout") Then + ElseIf Not Settings.Get("UiHiddenOtherAbout") Then PageID = FormMain.PageSubType.OtherAbout Else PageID = FormMain.PageSubType.OtherTest @@ -119,7 +119,7 @@ Hint("正在刷新……", Log:=False) End Sub Public Shared Sub RefreshHelp() - Setup.Set("SystemHelpVersion", 0) '强制重新解压文件 + Settings.Set("SystemHelpVersion", 0) '强制重新解压文件 FrmOtherHelp.PageLoaderRestart() FrmOtherHelp.SearchBox.Text = "" End Sub diff --git a/Plain Craft Launcher 2/Pages/PageSelectLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageSelectLeft.xaml.vb index 2493b65..d15aaf8 100644 --- a/Plain Craft Launcher 2/Pages/PageSelectLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSelectLeft.xaml.vb @@ -34,7 +34,7 @@ '添加控件 Dim ContMenu As ContextMenu = Nothing Select Case Folder.Type - Case McFolder.Types.Original + Case McFolder.Types.Vanilla ContMenu = GetObjectFromXML( @@ -43,7 +43,7 @@ ) - Case McFolder.Types.RenamedOriginal + Case McFolder.Types.RenamedVanilla ContMenu = GetObjectFromXML( @@ -64,9 +64,9 @@ ) End Select - If (Folder.Type = McFolder.Types.Original OrElse Folder.Type = McFolder.Types.RenamedOriginal) AndAlso Folder.Location = Path & ".minecraft\" AndAlso McFolderList.Count = 1 Then CType(ContMenu.FindName("Delete"), MyMenuItem).Header = "清空" + If (Folder.Type = McFolder.Types.Vanilla OrElse Folder.Type = McFolder.Types.RenamedVanilla) AndAlso Folder.Location = Path & ".minecraft\" AndAlso McFolderList.IsSingle Then CType(ContMenu.FindName("Delete"), MyMenuItem).Header = "清空" '注册事件 - If Not Folder.Type = McFolder.Types.Original Then CType(ContMenu.FindName("Remove"), MyMenuItem).AddHandler(MyMenuItem.ClickEvent, New RoutedEventHandler(AddressOf FrmSelectLeft.Remove_Click)) + If Not Folder.Type = McFolder.Types.Vanilla Then CType(ContMenu.FindName("Remove"), MyMenuItem).AddHandler(MyMenuItem.ClickEvent, New RoutedEventHandler(AddressOf FrmSelectLeft.Remove_Click)) CType(ContMenu.FindName("Open"), MyMenuItem).AddHandler(MyMenuItem.ClickEvent, New RoutedEventHandler(AddressOf FrmSelectLeft.Open_Click)) CType(ContMenu.FindName("Delete"), MyMenuItem).AddHandler(MyMenuItem.ClickEvent, New RoutedEventHandler(AddressOf FrmSelectLeft.Delete_Click)) CType(ContMenu.FindName("Rename"), MyMenuItem).AddHandler(MyMenuItem.ClickEvent, New RoutedEventHandler(AddressOf FrmSelectLeft.Rename_Click)) @@ -133,7 +133,7 @@ If Not McFolderList.Any() Then Throw New ArgumentNullException("没有可用的 Minecraft 文件夹") Else - Setup.Set("LaunchFolderSelect", McFolderList(0).Location.Replace(Path, "$")) + McFolderSelected = McFolderList.First.Location CType(FrmSelectLeft.PanList.Children(1), MyListItem).Checked = True End If @@ -178,7 +178,7 @@ RunInThread( Sub() Try - If Not FolderPath.EndsWith("\") Then FolderPath &= "\" '加上斜杠…… + If Not FolderPath.EndsWithF("\") Then FolderPath &= "\" '检查文件夹权限 If Not CheckPermission(FolderPath) Then If ShowHint Then @@ -198,7 +198,7 @@ Next End If '判断是否已经添加过,若添加过则直接修改自定义名 - Dim Folders As New List(Of String)(Setup.Get("LaunchFolders").ToString.Split("|")) + Dim Folders As New List(Of String)(Settings.Get("LaunchFolders").ToString.Split("|")) Dim IsAdded As Boolean = False Dim IsReplace As Boolean = False For i = 0 To Folders.Count - 1 @@ -220,9 +220,9 @@ '如果没有添加过,则添加进去 If Not IsAdded Then Folders.Add(DisplayName & ">" & FolderPath) '保存 - Setup.Set("LaunchFolders", Join(Folders.ToArray, "|")) + Settings.Set("LaunchFolders", Folders.Join("|")) '切换选择并更新列表 - Setup.Set("LaunchFolderSelect", FolderPath.Replace(Path, "$")) + McFolderSelected = FolderPath McFolderListLoader.Start(IsForceRestart:=True) '提示 If IsReplace Then Return @@ -243,8 +243,8 @@ Dim ModIndieFolder As New DirectoryInfo(Instance.PathVersion & "mods\") If ModIndieFolder.Exists AndAlso ModIndieFolder.EnumerateFiles.Any Then Return '满足以上全部条件则视为根目录整合包 - Setup.Set("VersionArgumentIndie", 2, Instance:=Instance) - Setup.Set("VersionArgumentIndieV2", False, Instance:=Instance) + Settings.Set("VersionArgumentIndie", 2, Instance:=Instance) + Settings.Set("VersionArgumentIndieV2", False, Instance:=Instance) Log("[Setup] 已自动关闭单版本隔离:" & Instance.Name, LogLevel.Debug) Next Catch ex As Exception @@ -260,94 +260,95 @@ Hint("在下载任务进行时,无法创建游戏文件夹!", HintType.Red) Return End If - If Not Directory.Exists(Path & ".minecraft\") Then - Directory.CreateDirectory(Path & ".minecraft\") - Directory.CreateDirectory(Path & ".minecraft\versions\") - Setup.Set("LaunchFolderSelect", "$.minecraft\") - McFolderLauncherProfilesJsonCreate(Path & ".minecraft\") - Hint("新建 .minecraft 文件夹成功!", HintType.Green) + CreateMcFolderInCurrentPath() + Hint("新建 .minecraft 文件夹成功!", HintType.Green) + End Sub + Public Shared Sub CreateMcFolderInCurrentPath() + McFolderSelected = Path & ".minecraft\" + If Not Directory.Exists(McFolderSelected) Then + Directory.CreateDirectory(McFolderSelected) + Directory.CreateDirectory(McFolderSelected & "versions\") + McFolderLauncherProfilesJsonCreate(McFolderSelected) End If - McFolderListLoader.Start(IsForceRestart:=True) + AddFolder(McFolderSelected, GetFolderNameFromPath(Path), False) End Sub '右键菜单 Public Sub Remove_Click(sender As Object, e As RoutedEventArgs) Try - Dim Folder As McFolder = CType(CType(CType(sender.Parent, ContextMenu).Parent, Primitives.Popup).PlacementTarget, MyListItem).Tag + Dim Target As McFolder = CType(CType(CType(sender.Parent, ContextMenu).Parent, Primitives.Popup).PlacementTarget, MyListItem).Tag '若为 “移除”,则提醒是否删除 PCL 的配置文件 - If Folder.Type = McFolder.Types.Custom Then + If Target.Type = McFolder.Types.Custom Then Select Case MyMsgBox("是否需要清理 PCL 在该文件夹中的配置文件?" & vbCrLf & "这包括各个版本的独立设置(如自定义图标、第三方登录配置)等,对游戏本身没有影响。", "配置文件清理", "删除", "保留", "取消") Case 1 '删除配置文件 - If File.Exists(Folder.Location & "PCL.ini") Then File.Delete(Folder.Location & "PCL.ini") - If Directory.Exists(Folder.Location & "versions\") Then - For Each InstanceInfo In New DirectoryInfo(Folder.Location & "versions\").EnumerateDirectories - If Directory.Exists(InstanceInfo.FullName & "\PCL\") Then Directory.Delete(InstanceInfo.FullName & "\PCL\", True) + If File.Exists(Target.Location & "PCL.ini") Then File.Delete(Target.Location & "PCL.ini") + If Directory.Exists(Target.Location & "versions\") Then + For Each InstanceInfo In New DirectoryInfo(Target.Location & "versions\").EnumerateDirectories + If Directory.Exists(InstanceInfo.FullName & "\PCL\") Then DeleteDirectory(InstanceInfo.FullName & "\PCL\", True) Next End If Case 2 - '不删除 + '不删除 Case 3 '取消 Return End Select End If - '若修改了本部分代码,应对应修改 Delete_Click 中的代码 - '获取并删除列表项 - Dim Folders As New List(Of String)(Setup.Get("LaunchFolders").ToString.Split("|")) - Dim Name As String = "" - For i = 0 To Folders.Count - 1 - If Folders(i) = "" Then Exit For - If Folders(i).ToString.EndsWith(Folder.Location) Then - Name = Folders(i).ToString.BeforeFirst(">") - Folders.RemoveAt(i) - Exit For - End If - Next - '保存 - Setup.Set("LaunchFolders", If(Not Folders.Any(), "", Join(Folders.ToArray, "|"))) - Hint(If(Folder.Type = McFolder.Types.Custom, "文件夹 " & Name & " 已从列表中移除!", "文件夹名称已复原!"), HintType.Green) + Dim DeletedName As String = RemoveFolderFromSetup(Target) + Hint(If(Target.Type = McFolder.Types.Custom, "文件夹 " & DeletedName & " 已从列表中移除!", "文件夹名称已复原!"), HintType.Green) McFolderListLoader.Start(IsForceRestart:=True) - Catch ex As Exception Log(ex, "从列表中移除游戏文件夹失败", LogLevel.Feedback) End Try End Sub Public Sub Delete_Click(sender As Object, e As RoutedEventArgs) - Dim Folder As McFolder = CType(CType(CType(sender.Parent, ContextMenu).Parent, Primitives.Popup).PlacementTarget, MyListItem).Tag - Dim DeleteText As String = If((Folder.Type = McFolder.Types.Original OrElse Folder.Type = McFolder.Types.RenamedOriginal) AndAlso Folder.Location = Path & ".minecraft\" AndAlso McFolderList.Count = 1, "清空", "删除") - If MyMsgBox("你确定要" & DeleteText & "这个文件夹吗?" & vbCrLf & "目标文件夹:" & Folder.Location & vbCrLf & vbCrLf & "这会导致该文件夹中的所有存档与其他文件永久丢失,且不可恢复!", "删除警告", "取消", "确认", "取消") <> 2 Then Return - If MyMsgBox("如果你在该文件夹中存放了除 MC 以外的其他文件,这些文件也会被一同删除!" & vbCrLf & "继续删除会导致该文件夹中的所有文件永久丢失,请在仔细确认后再继续!" & vbCrLf & "目标文件夹:" & Folder.Location & vbCrLf & vbCrLf & "这是最后一次警告!", "删除警告", "确认" & DeleteText, "取消", IsWarn:=True) <> 1 Then Return - '移出列表 - If Folder.Type = McFolder.Types.Custom Then - Dim Folders As New List(Of String)(Setup.Get("LaunchFolders").ToString.Split("|")) - For i = 0 To Folders.Count - 1 - If Folders(i) = "" Then Exit For - If Folders(i).ToString.EndsWith(Folder.Location) Then - 'Name = Folders(i).ToString.Before(">") - Folders.RemoveAt(i) - Exit For - End If - Next - Setup.Set("LaunchFolders", If(Not Folders.Any(), "", Join(Folders.ToArray, "|"))) - End If + Dim Target As McFolder = CType(CType(CType(sender.Parent, ContextMenu).Parent, Primitives.Popup).PlacementTarget, MyListItem).Tag + Dim DeleteText As String = If((Target.Type = McFolder.Types.Vanilla OrElse Target.Type = McFolder.Types.RenamedVanilla) AndAlso Target.Location = Path & ".minecraft\" AndAlso McFolderList.IsSingle, "清空", "删除") + If MyMsgBox("你确定要" & DeleteText & "这个文件夹吗?" & vbCrLf & + "目标文件夹:" & Target.Location & vbCrLf & vbCrLf & + "该文件夹中的游戏存档、游戏版本,以及 MC 之外的其他文件,都会永久丢失,不可恢复!", "警告", "取消", "确认", "取消") <> 2 Then Return + If MyMsgBoxInput("删除确认", + "该文件夹中的游戏存档、游戏版本,以及 MC 之外的其他文件,都会永久丢失,不可恢复!" & vbCrLf & + "目标文件夹:" & Target.Location & vbCrLf & vbCrLf & + "如果确实要删除,请在下面输入【确认删除】以继续。", + ValidateRules:=New ObjectModel.Collection(Of Validate) From {New ValidateSame("确认删除", $"请输入 {vbLQ}确认删除{vbRQ} 这四个字!")}, + Button1:="永久删除文件夹", Button2:="取消", IsWarn:=True) Is Nothing Then Return + RemoveFolderFromSetup(Target) RunInNewThread( Sub() '删除文件夹 Try - Hint("正在" & DeleteText & "文件夹 " & Folder.Name & "!", HintType.Blue) - DeleteDirectory(Folder.Location) - If DeleteText = "清空" Then Directory.CreateDirectory(Folder.Location) - Hint("已" & DeleteText & "文件夹 " & Folder.Name & "!", HintType.Green) + Hint("正在" & DeleteText & "文件夹 " & Target.Name & "!", HintType.Blue) + DeleteDirectory(Target.Location) + If DeleteText = "清空" Then Directory.CreateDirectory(Target.Location) + Hint("已" & DeleteText & "文件夹 " & Target.Name & "!", HintType.Green) Catch ex As Exception - Log(ex, DeleteText & "文件夹 " & Folder.Name & " 失败", LogLevel.Hint) + Log(ex, DeleteText & "文件夹 " & Target.Name & " 失败", LogLevel.Hint) Finally '刷新列表 McFolderListLoader.Start(IsForceRestart:=True) End Try End Sub, "Folder Delete " & GetUuid(), ThreadPriority.BelowNormal) End Sub + ''' + ''' 从设置的文件夹列表中删除指定的文件夹。 + ''' 返回被删除的文件夹的显示名称。如果没有,返回 Nothing。 + ''' + Private Shared Function RemoveFolderFromSetup(Target As McFolder) As String + Dim DeletedName As String = Nothing + Dim Folders = Settings.Get("LaunchFolders").ToString.Split({"|"c}, StringSplitOptions.RemoveEmptyEntries).ToList + For Each Folder In Folders.ToList + If Not Folder.EndsWithF(Target.Location) Then Continue For + DeletedName = Folder.BeforeFirst(">") + Folders.Remove(Folder) + Exit For + Next + Settings.Set("LaunchFolders", Folders.Join("|")) + Return DeletedName + End Function + Public Sub Open_Click(sender As Object, e As RoutedEventArgs) OpenExplorer(CType(CType(CType(sender.Parent, ContextMenu).Parent, Primitives.Popup).PlacementTarget, MyListItem).Info) End Sub @@ -371,7 +372,7 @@ New ObjectModel.Collection(Of Validate) From {New ValidateNullOrWhiteSpace, New ValidateLength(1, 30), New ValidateExcept({">", "|"})}) If String.IsNullOrWhiteSpace(NewName) Then Return '修改自定义名 - Dim Folders As New List(Of String)(Setup.Get("LaunchFolders").ToString.Split("|")) + Dim Folders As New List(Of String)(Settings.Get("LaunchFolders").ToString.Split("|")) Dim IsAdded As Boolean = False For i = 0 To Folders.Count - 1 Dim FolderCurrent As String = Folders(i) @@ -391,7 +392,7 @@ If Not IsAdded Then Folders.Add(NewName & ">" & Folder.Location) Hint("文件夹名称已更新为 " & NewName & " !", HintType.Green) '保存 - Setup.Set("LaunchFolders", Join(Folders.ToArray, "|")) + Settings.Set("LaunchFolders", Folders.Join("|")) McFolderListLoader.Start(IsForceRestart:=True) Catch ex As Exception Log(ex, "重命名文件夹失败", LogLevel.Feedback) @@ -408,7 +409,7 @@ Return End If '更换 - Setup.Set("LaunchFolderSelect", CType(sender.Tag, McFolder).Location.Replace(Path, "$")) + McFolderSelected = CType(sender.Tag, McFolder).Location McFolderListLoader.Start(IsForceRestart:=True) LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.RunOnUpdated, MaxDepth:=1, ExtraPath:="versions\") '刷新版本列表 End Sub diff --git a/Plain Craft Launcher 2/Pages/PageSelectRight.xaml.vb b/Plain Craft Launcher 2/Pages/PageSelectRight.xaml.vb index 8b9e264..c8a5849 100644 --- a/Plain Craft Launcher 2/Pages/PageSelectRight.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSelectRight.xaml.vb @@ -102,7 +102,7 @@ Else LabEmptyTitle.Text = "无可用版本" LabEmptyContent.Text = "未找到任何版本的游戏,请先下载任意版本的游戏。" & vbCrLf & "若有已存在的游戏,请在左边的列表中选择添加文件夹,选择 .minecraft 文件夹将其导入。" - BtnEmptyDownload.Visibility = If(Setup.Get("UiHiddenPageDownload") AndAlso Not PageSetupUI.HiddenForceShow, Visibility.Collapsed, Visibility.Visible) + BtnEmptyDownload.Visibility = If(Settings.Get("UiHiddenPageDownload") AndAlso Not PageSetupUI.HiddenForceShow, Visibility.Collapsed, Visibility.Visible) End If Else PanBack.Visibility = Visibility.Visible @@ -184,7 +184,6 @@ If New McInstance(Instance.PathVersion).Check Then '正常版本 McInstanceSelected = Instance - Setup.Set("LaunchVersionSelect", McInstanceSelected.Name) FrmMain.PageBack() Else '错误版本 @@ -246,7 +245,7 @@ End Sub Public Sub BtnEmptyDownload_Loaded() Handles BtnEmptyDownload.Loaded - Dim NewVisibility = If((Setup.Get("UiHiddenPageDownload") AndAlso Not PageSetupUI.HiddenForceShow) OrElse ShowHidden, Visibility.Collapsed, Visibility.Visible) + Dim NewVisibility = If((Settings.Get("UiHiddenPageDownload") AndAlso Not PageSetupUI.HiddenForceShow) OrElse ShowHidden, Visibility.Collapsed, Visibility.Visible) If BtnEmptyDownload.Visibility <> NewVisibility Then BtnEmptyDownload.Visibility = NewVisibility PanLoad.TriggerForceResize() diff --git a/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb b/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb deleted file mode 100644 index dd693b8..0000000 --- a/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb +++ /dev/null @@ -1,781 +0,0 @@ -Public Class ModSetup - Private Const VersionSetup As Integer = 1 - - ''' - ''' 设置列表。 - ''' - Private ReadOnly SetupDict As New Dictionary(Of String, SetupEntry) From { - {"Identify", New SetupEntry("", Source:=SetupSource.Registry)}, - {"WindowHeight", New SetupEntry(550)}, - {"WindowWidth", New SetupEntry(900)}, - {"HintDownloadThread", New SetupEntry(False, Source:=SetupSource.Registry)}, - {"HintNotice", New SetupEntry(0, Source:=SetupSource.Registry)}, - {"HintDownload", New SetupEntry(0, 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)}, - {"HintCustomCommand", New SetupEntry(False, Source:=SetupSource.Registry)}, - {"HintCustomWarn", New SetupEntry(False, Source:=SetupSource.Registry)}, - {"HintMoreAdvancedSetup", New SetupEntry(False, Source:=SetupSource.Registry)}, - {"HintIndieSetup", New SetupEntry(False, Source:=SetupSource.Registry)}, - {"HintExportConfig", New SetupEntry(False, Source:=SetupSource.Registry)}, - {"SystemEula", New SetupEntry(False, Source:=SetupSource.Registry)}, '仅老版本兼容,现已换用 SystemEulaVersion - {"SystemEulaVersion", New SetupEntry(0, 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)}, - {"SystemHighestSavedBetaVersionReg", 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)}, - {"SystemSystemTelemetry", New SetupEntry(True, Source:=SetupSource.Registry)}, - {"CacheDrops", New SetupEntry("", Source:=SetupSource.Registry)}, - {"CacheConfig", New SetupEntry(0, Source:=SetupSource.Registry)}, - {"CacheExportConfig", New SetupEntry("", Source:=SetupSource.Registry)}, - {"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)}, - {"CacheMsV2Migrated", New SetupEntry(False, Source:=SetupSource.Registry)}, - {"CacheMsV2OAuthRefresh", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, - {"CacheMsV2OAuthExpires", New SetupEntry(0, Source:=SetupSource.Registry)}, - {"CacheMsV2Access", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, - {"CacheMsV2ProfileJson", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, - {"CacheMsV2Uuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, - {"CacheMsV2Name", 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)}, - {"LaunchArgumentIndieV2", New SetupEntry(4)}, - {"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 -Djdk.lang.Process.allowAmbiguousCommands=true -Dfml.ignoreInvalidMinecraftCertificates=True -Dfml.ignorePatchDiscrepancies=True -Dlog4j2.formatMsgNoLookups=true")}, - {"LaunchAdvanceGame", New SetupEntry("")}, - {"LaunchAdvanceRun", New SetupEntry("")}, - {"LaunchAdvanceRunWait", New SetupEntry(True)}, - {"LaunchAdvanceDisableJLW", New SetupEntry(False)}, - {"LaunchAdvanceGraphicCard", New SetupEntry(True, Source:=SetupSource.Registry)}, - {"LaunchRamType", New SetupEntry(0)}, - {"LaunchRamCustom", New SetupEntry(15)}, - {"LinkLastAutoJoinInviteCode", New SetupEntry("", Source:=SetupSource.Registry)}, - {"LinkLatencyMode", New SetupEntry(0, Source:=SetupSource.Registry)}, - {"LinkCustomPeer", New SetupEntry("")}, - {"LinkEasyTierVersion", New SetupEntry(-1, Source:=SetupSource.Registry)}, - {"ToolHelpChinese", New SetupEntry(True, Source:=SetupSource.Registry)}, - {"ToolDownloadThread", New SetupEntry(63, Source:=SetupSource.Registry)}, - {"ToolDownloadSpeed", New SetupEntry(42, Source:=SetupSource.Registry)}, - {"ToolDownloadSource", New SetupEntry(1, Source:=SetupSource.Registry)}, - {"ToolDownloadVersion", New SetupEntry(1, Source:=SetupSource.Registry)}, - {"ToolDownloadTranslate", New SetupEntry(0, Source:=SetupSource.Registry)}, - {"ToolDownloadTranslateV2", New SetupEntry(1, Source:=SetupSource.Registry)}, - {"ToolDownloadIgnoreQuilt", New SetupEntry(True, Source:=SetupSource.Registry)}, - {"ToolDownloadCert", New SetupEntry(False, Source:=SetupSource.Registry)}, - {"ToolDownloadMod", New SetupEntry(2, Source:=SetupSource.Registry)}, - {"ToolModLocalNameStyle", New SetupEntry(0, 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)}, - {"UiHiddenFunctionModUpdate", 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.Instance)}, - {"VersionAdvanceGame", New SetupEntry("", Source:=SetupSource.Instance)}, - {"VersionAdvanceAssets", New SetupEntry(0, Source:=SetupSource.Instance)}, - {"VersionAdvanceAssetsV2", New SetupEntry(False, Source:=SetupSource.Instance)}, - {"VersionAdvanceJava", New SetupEntry(False, Source:=SetupSource.Instance)}, - {"VersionAdvanceRun", New SetupEntry("", Source:=SetupSource.Instance)}, - {"VersionAdvanceRunWait", New SetupEntry(True, Source:=SetupSource.Instance)}, - {"VersionAdvanceDisableJLW", New SetupEntry(False, Source:=SetupSource.Instance)}, - {"VersionAdvanceDisableModUpdate", New SetupEntry(False, Source:=SetupSource.Instance)}, - {"VersionRamType", New SetupEntry(2, Source:=SetupSource.Instance)}, - {"VersionRamCustom", New SetupEntry(15, Source:=SetupSource.Instance)}, - {"VersionRamOptimize", New SetupEntry(0, Source:=SetupSource.Instance)}, - {"VersionArgumentTitle", New SetupEntry("", Source:=SetupSource.Instance)}, - {"VersionArgumentInfo", New SetupEntry("", Source:=SetupSource.Instance)}, - {"VersionArgumentIndie", New SetupEntry(-1, Source:=SetupSource.Instance)}, - {"VersionArgumentIndieV2", New SetupEntry(False, Source:=SetupSource.Instance)}, - {"VersionArgumentJavaSelect", New SetupEntry("使用全局设置", Source:=SetupSource.Instance)}, - {"VersionServerEnter", New SetupEntry("", Source:=SetupSource.Instance)}, - {"VersionServerLogin", New SetupEntry(0, Source:=SetupSource.Instance)}, - {"VersionServerNide", New SetupEntry("", Source:=SetupSource.Instance)}, - {"VersionServerAuthRegister", New SetupEntry("", Source:=SetupSource.Instance)}, - {"VersionServerAuthName", New SetupEntry("", Source:=SetupSource.Instance)}, - {"VersionServerAuthServer", New SetupEntry("", Source:=SetupSource.Instance)} - } - -#Region "基础" - - Private Enum SetupSource - Normal - Registry - Instance - End Enum - Private Class SetupEntry - - Public Encoded As Boolean - Public DefaultValue - Public DefaultValueEncoded - Public Value - Public Source As SetupSource - - ''' - ''' 加载状态:0/未读取 1/已读取未处理 2/已处理 - ''' 我也不知道当年写这坨的时候为啥没用 Enum…… - ''' - Public State As Byte = 0 - Public Type As Type - - Public Sub New(Value, Optional Source = SetupSource.Normal, Optional Encoded = False) - Try - Me.DefaultValue = Value - Me.Encoded = Encoded - Me.Value = Value - Me.Source = Source - Me.Type = If(Value, New Object).GetType - Me.DefaultValueEncoded = If(Encoded, SecretEncrypt(Value, "PCL" & Identify), Value) - Catch ex As Exception - Log(ex, "初始化 SetupEntry 失败", LogLevel.Feedback) '#5095 的 fallback - End Try - End Sub - - End Class - - ''' - ''' 改变某个设置项的值。 - ''' - Public Sub [Set](Key As String, Value As Object, Optional ForceReload As Boolean = False, Optional Instance As McInstance = Nothing) - [Set](Key, Value, SetupDict(Key), ForceReload, Instance) - End Sub - ''' - ''' 写入某个未经加密的设置项。 - ''' 若该设置项经过了加密,则会抛出异常。 - ''' - Public Sub SetSafe(Key As String, Value As Object, Optional ForceReload As Boolean = False, Optional Instance As McInstance = Nothing) - If SetupDict(Key).Encoded Then Throw New InvalidOperationException("禁止写入加密设置项:" & Key) - [Set](Key, Instance, ForceReload, Instance) - End Sub - Private Sub [Set](Key As String, Value As Object, E As SetupEntry, ForceReload As Boolean, Instance As McInstance) - Try - - Value = CTypeDynamic(Value, E.Type) - If E.State = 2 Then - '如果已应用,且值相同,则无需再次更改 - If E.Value = Value AndAlso Not ForceReload Then Return - Else - '如果未应用,则直接更改并应用 - If E.Source <> SetupSource.Instance Then E.State = 2 - End If - '设置新值 - E.Value = Value - '写入值 - If E.Encoded Then - Try - If Value Is Nothing Then Value = "" - Value = SecretEncrypt(Value, "PCL" & Identify) - 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.Instance - If Instance Is Nothing Then Throw New Exception($"更改版本设置 {Key} 时未提供目标版本") - WriteIni(Instance.PathVersion & "PCL\Setup.ini", Key, Value) - 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 Instance As McInstance = Nothing) - Return Load(Key, SetupDict(Key), ForceReload, Instance) - End Function - Private Function Load(Key As String, E As SetupEntry, ForceReload As Boolean, Instance As McInstance) - '如果已经应用过,则什么也不干 - If E.State = 2 AndAlso Not ForceReload Then Return E.Value - '读取,应用并设置状态 - Read(Key, E, Instance) - If E.Source <> SetupSource.Instance 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 Instance As McInstance = Nothing) - If Not SetupDict.ContainsKey(Key) Then Throw New KeyNotFoundException("未找到设置项:" & Key) - Return [Get](Key, SetupDict(Key), Instance) - End Function - ''' - ''' 获取某个未经加密的设置项的值。 - ''' 若该设置项经过了加密,则会抛出异常。 - ''' - Public Function GetSafe(Key As String, Optional Instance As McInstance = Nothing) - If SetupDict(Key).Encoded Then Throw New InvalidOperationException("禁止读取加密设置项:" & Key) - Return [Get](Key, Instance) - End Function - Private Function [Get](Key As String, E As SetupEntry, Instance As McInstance) - '获取强制值 - 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, Instance) - If E.Source <> SetupSource.Instance Then E.State = 1 - End If - '返回现在的值 - Return E.Value - End Function - - ''' - ''' 初始化某个设置项的值。 - ''' - Public Sub Reset(Key As String, Optional ForceReload As Boolean = False, Optional Instance As McInstance = Nothing) - Dim E As SetupEntry = SetupDict(Key) - [Set](Key, E.DefaultValue, E, ForceReload, Instance) - Select Case SetupDict(Key).Source - Case SetupSource.Normal - DeleteIniKey("Setup", Key) - Case SetupSource.Registry - DeleteReg(Key) - Case Else 'SetupSource.Instance - If Instance Is Nothing Then Throw New Exception($"重置版本设置 {Key} 时未提供目标版本") - DeleteIniKey(Instance.PathVersion & "PCL\Setup.ini", Key) - End Select - End Sub - ''' - ''' 获取某个设置项的默认值。 - ''' - Public Function GetDefault(Key As String) As String - Return SetupDict(Key).DefaultValue - End Function - ''' - ''' 某个设置项是否从未被设置过。 - ''' - Public Function IsUnset(Key As String, Optional Instance As McInstance = Nothing) As Boolean - Select Case SetupDict(Key).Source - Case SetupSource.Normal - Return Not HasIniKey("Setup", Key) - Case SetupSource.Registry - Return Not HasReg(Key) - Case Else 'SetupSource.Instance - If Instance Is Nothing Then Throw New Exception($"判断版本设置 {Key} 是否存在时未提供目标版本") - Return Not HasIniKey(Instance.PathVersion & "PCL\Setup.ini", Key) - End Select - End Function - - ''' - ''' 读取设置。 - ''' - Private Sub Read(Key As String, ByRef E As SetupEntry, Instance As McInstance) - Try - If Not E.State = 0 Then Return - Dim SourceValue As String = Nothing '先用 String 储存,避免类型转换 - Select Case E.Source - Case SetupSource.Normal - SourceValue = ReadIni("Setup", Key, E.DefaultValueEncoded) - Case SetupSource.Registry - SourceValue = ReadReg(Key, E.DefaultValueEncoded) - Case SetupSource.Instance - If Instance Is Nothing Then - Throw New Exception("读取版本设置 " & Key & " 时未提供目标版本") - Else - SourceValue = ReadIni(Instance.PathVersion & "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" & Identify) - 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(McFolderSelected & "PCL.ini", "Version", If(IsNothing(McInstanceSelected), "", McInstanceSelected.Name)) - End Sub - Public Sub LaunchFolderSelect(Value As String) - Log("[Setup] 当前选择的 Minecraft 文件夹:" & Value.ToString.Replace("$", Path)) - McFolderSelected = Value.ToString.Replace("$", Path) - End Sub - - '游戏内存 - Public Sub LaunchRamType(Type As Integer) - If FrmSetupLaunch Is Nothing Then Return - 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) - ServicePointManager.ServerCertificateValidationCallback = - Function(Sender, Certificate, Chain, Failure) - Dim Request As HttpWebRequest = TryCast(Sender, HttpWebRequest) - If Failure = Net.Security.SslPolicyErrors.None Then Return True '已通过验证 - '基于 #3018 和 #5879,只在访问正版登录 API 时跳过证书验证 - Log($"[System] 未通过 SSL 证书验证({Failure}),提供的证书为 {Certificate?.Subject},URL:{Request?.Address}", LogLevel.Debug) - If Request Is Nothing Then - Return Not Value - ElseIf Request.Address.Host.Contains("xboxlive") OrElse Request.Address.Host.Contains("minecraftservices") Then - Return Not Value '根据设置决定是否忽略错误 - Else - Return False - End If - End Function - 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 - Public Sub UiLauncherTheme(Value As Integer) - ThemeRefresh(Value) - End Sub - 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 Return - 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 Return - 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 - FrmSetupUI.HintCustomWarn.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.HintCustomWarn.Visibility = If(Setup.Get("HintCustomWarn"), Visibility.Collapsed, Visibility.Visible) - FrmSetupUI.HintCustom.Text = $"从 PCL 文件夹下的 Custom.xaml 读取主页内容。{vbCrLf}你可以手动编辑该文件,向主页添加文本、图片、常用网站、快捷启动等功能。" - CustomEventService.SetEventType(FrmSetupUI.HintCustom, CustomEvent.EventType.None) - Case 2 '联网 - FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed - FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed - FrmSetupUI.PanCustomNet.Visibility = Visibility.Visible - FrmSetupUI.HintCustom.Visibility = Visibility.Visible - FrmSetupUI.HintCustomWarn.Visibility = If(Setup.Get("HintCustomWarn"), Visibility.Collapsed, Visibility.Visible) - FrmSetupUI.HintCustom.Text = $"从指定网址联网获取主页内容。服主也可以用于动态更新服务器公告。{vbCrLf}如果你制作了稳定运行的联网主页,可以点击这条提示投稿,若合格即可加入预设!" - CustomEventService.SetEventType(FrmSetupUI.HintCustom, CustomEvent.EventType.打开网页) - CustomEventService.SetEventData(FrmSetupUI.HintCustom, "https://github.com/Meloong-Git/PCL/discussions/2528") - Case 3 '预设 - FrmSetupUI.PanCustomPreset.Visibility = Visibility.Visible - FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed - FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed - FrmSetupUI.HintCustom.Visibility = Visibility.Collapsed - FrmSetupUI.HintCustomWarn.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 = 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 UiHiddenFunctionModUpdate(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 FrmInstanceSetup Is Nothing Then Return - FrmInstanceSetup.RamType(Type) - End Sub - - '服务器 - Public Sub VersionServerLogin(Type As Integer) - If FrmInstanceSetup Is Nothing Then Return - '为第三方登录清空缓存以更新描述 - WriteIni(McFolderSelected & "PCL.ini", "InstanceCache", "") - If PageInstanceLeft.Instance Is Nothing Then Return - PageInstanceLeft.Instance = New McInstance(PageInstanceLeft.Instance.Name).Load() - LoaderFolderRun(McInstanceListLoader, McFolderSelected, 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 96dc62c..32c52ff 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml @@ -32,18 +32,25 @@ - - - - + + + + - + - + - + @@ -55,18 +62,18 @@ - + - - - - - + + + + - + - + @@ -77,28 +84,30 @@ - + - + - + - + - @@ -116,7 +125,7 @@ - + @@ -131,13 +140,16 @@ - - - - + + + + @@ -182,11 +194,21 @@ - - - - - + + + + + @@ -198,7 +220,7 @@ - + @@ -231,6 +253,8 @@ + + @@ -240,22 +264,38 @@ ToolTip="还原" ToolTipService.Placement="Right" ToolTipService.InitialShowDelay="200" ToolTipService.VerticalOffset="-1" Logo="M530 0c287 0 521 229 521 511s-233 511-521 511c-233 0-436-151-500-368a63 63 0 0 1 44-79 65 65 0 0 1 80 43c48 162 200 276 375 276 215 0 390-171 390-383s-174-383-390-383c-103 0-199 39-270 106l21-5a63 63 0 0 1 33 123l-157 42a65 65 0 0 1-90-42l-49-183a65 65 0 1 1 126-33l6 26A524 524 0 0 1 530 0z" LogoScale="0.9" /> - + - + - - - - - + + + + + + + + + + + + + - diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb index 91532fc..a9ec685 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb @@ -1,63 +1,31 @@ Public Class PageSetupLaunch - Private IsLoad As Boolean = False - Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded - '重复加载部分 PanBack.ScrollToHome() RefreshRam(False) - If McInstanceSelected Is Nothing Then - BtnSwitch.Visibility = Visibility.Collapsed - Else - BtnSwitch.Visibility = Visibility.Visible - End If + BtnSwitch.Visibility = If(McInstanceSelected Is Nothing, Visibility.Collapsed, Visibility.Visible) '非重复加载部分 - If IsLoad Then Return - IsLoad = True + Static Reloaded As Boolean = False + If Reloaded Then Return + Reloaded = True AniControlEnabled += 1 - Reload() + Refresh() AniControlEnabled -= 1 '内存自动刷新 Dim timer As New Threading.DispatcherTimer With {.Interval = New TimeSpan(0, 0, 0, 1)} AddHandler timer.Tick, AddressOf RefreshRam timer.Start() - End Sub - Public Sub Reload() + Public Sub Refresh() Try - - '离线皮肤 - CType(FindName("RadioSkinType" & Setup.Load("LaunchSkinType")), MyRadioBox).Checked = True - TextSkinID.Text = Setup.Get("LaunchSkinID") - - '启动参数 - TextArgumentTitle.Text = Setup.Get("LaunchArgumentTitle") - TextArgumentInfo.Text = Setup.Get("LaunchArgumentInfo") - ComboArgumentIndieV2.SelectedIndex = Setup.Get("LaunchArgumentIndieV2") - ComboArgumentVisibie.SelectedIndex = Setup.Get("LaunchArgumentVisible") - ComboArgumentPriority.SelectedIndex = Setup.Get("LaunchArgumentPriority") - ComboArgumentWindowType.SelectedIndex = Setup.Get("LaunchArgumentWindowType") - TextArgumentWindowWidth.Text = Setup.Get("LaunchArgumentWindowWidth") - TextArgumentWindowHeight.Text = Setup.Get("LaunchArgumentWindowHeight") - CheckArgumentRam.Checked = Setup.Get("LaunchArgumentRam") - RefreshJavaComboBox() - - '游戏内存 - CType(FindName("RadioRamType" & Setup.Load("LaunchRamType")), MyRadioBox).Checked = True - SliderRamCustom.Value = Setup.Get("LaunchRamCustom") - - '高级设置 - TextAdvanceJvm.Text = Setup.Get("LaunchAdvanceJvm") - TextAdvanceGame.Text = Setup.Get("LaunchAdvanceGame") - TextAdvanceRun.Text = Setup.Get("LaunchAdvanceRun") - CheckAdvanceRunWait.Checked = Setup.Get("LaunchAdvanceRunWait") - CheckAdvanceDisableJLW.Checked = Setup.Get("LaunchAdvanceDisableJLW") - CheckAdvanceGraphicCard.Checked = Setup.Get("LaunchAdvanceGraphicCard") - + SettingService.RefreshSettings(Me) + UpdateSkinType() + UpdateRamType() + UpdateJavaComboBox() Catch ex As NullReferenceException Log(ex, "启动设置项存在异常,已被自动重置", LogLevel.Msgbox) Reset() @@ -65,57 +33,18 @@ Log(ex, "重载启动设置时出错", LogLevel.Feedback) End Try End Sub - - '初始化 Public Sub Reset() Try - Setup.Reset("LaunchArgumentTitle") - Setup.Reset("LaunchArgumentInfo") - Setup.Set("LaunchArgumentIndieV2", Setup.GetDefault("LaunchArgumentIndieV2")) - Setup.Reset("LaunchArgumentVisible") - Setup.Reset("LaunchArgumentWindowType") - Setup.Reset("LaunchArgumentWindowWidth") - Setup.Reset("LaunchArgumentWindowHeight") - Setup.Reset("LaunchArgumentPriority") - Setup.Reset("LaunchArgumentRam") - Setup.Reset("LaunchRamType") - Setup.Reset("LaunchRamCustom") - Setup.Reset("LaunchSkinType") - Setup.Reset("LaunchSkinID") - Setup.Reset("LaunchAdvanceJvm") - Setup.Reset("LaunchAdvanceGame") - Setup.Reset("LaunchAdvanceRun") - Setup.Reset("LaunchAdvanceRunWait") - Setup.Reset("LaunchAdvanceDisableJLW") - Setup.Reset("LaunchAdvanceGraphicCard") - Setup.Reset("LaunchArgumentJavaAll") - Setup.Reset("LaunchArgumentJavaSelect") + SettingService.ResetSettings(Me) + Settings.Set("LaunchArgumentIndieV2", Settings.GetDefault("LaunchArgumentIndieV2")) + Settings.Reset("LaunchArgumentJavaAll") + Settings.Reset("LaunchArgumentJavaSelect") JavaSearchLoader.Start(IsForceRestart:=True) - - Log("[Setup] 已初始化启动设置") - Hint("已初始化启动设置!", HintType.Green, False) + Hint("已初始化启动设置!", HintType.Green) Catch ex As Exception Log(ex, "初始化启动设置失败", LogLevel.Msgbox) End Try - - Reload() - End Sub - - '将控件改变路由到设置改变 - Private Shared Sub RadioBoxChange(sender As MyRadioBox, e As Object) Handles RadioSkinType0.Check, RadioSkinType1.Check, RadioSkinType2.Check, RadioSkinType3.Check, RadioSkinType4.Check, RadioRamType0.Check, RadioRamType1.Check - If AniControlEnabled = 0 Then Setup.Set(sender.Tag.ToString.Split("/")(0), Val(sender.Tag.ToString.Split("/")(1))) - End Sub - Private Shared Sub TextBoxChange(sender As MyTextBox, e As Object) Handles TextSkinID.ValidatedTextChanged, TextArgumentWindowHeight.ValidatedTextChanged, TextArgumentWindowWidth.ValidatedTextChanged, TextArgumentInfo.ValidatedTextChanged, TextAdvanceGame.ValidatedTextChanged, TextAdvanceJvm.ValidatedTextChanged, TextArgumentTitle.ValidatedTextChanged, TextAdvanceRun.ValidatedTextChanged - If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Text) - End Sub - Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderRamCustom.Change - If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value) - End Sub - Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboArgumentIndieV2.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 CheckAdvanceRunWait.Change, CheckArgumentRam.Change, CheckAdvanceDisableJLW.Change, CheckAdvanceGraphicCard.Change - If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked) + Refresh() End Sub #Region "离线皮肤" @@ -156,7 +85,7 @@ NewBitmap.Save(PathAppdata & "CustomSkin.png") End If '更新设置 - Setup.Set("LaunchSkinSlim", SkinInfo.IsSlim) + Settings.Set("LaunchSkinSlim", SkinInfo.IsSlim) ChangeSkin = True Catch ex As Exception Log(ex, "改变离线皮肤失败", LogLevel.Msgbox) @@ -182,13 +111,31 @@ MySkin.RefreshCache(Nothing) End Sub + Public Shared Sub UpdateSkinType() + PageLaunchLeft.SkinLegacy.Start() + '设置 UI 改变 + If FrmSetupLaunch Is Nothing Then Return + Select Case Settings.Get("LaunchSkinType") + 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 Sub + #End Region #Region "游戏内存" - Public Sub RamType(Type As Integer) - If SliderRamCustom Is Nothing Then Return - SliderRamCustom.IsEnabled = (Type = 1) + Public Shared Sub UpdateRamType() + If FrmSetupLaunch?.SliderRamCustom Is Nothing Then Return + FrmSetupLaunch.SliderRamCustom.IsEnabled = Settings.Get("LaunchRamType") = 1 End Sub ''' @@ -331,7 +278,7 @@ '------------------------------------------ Dim RamGive As Double - If Setup.Get("LaunchRamType") = 0 Then + If Settings.Get("LaunchRamType") = 0 Then '自动配置 Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024 * 10) / 10 '确定需求的内存值 @@ -343,7 +290,7 @@ If Instance IsNot Nothing AndAlso Instance.Modable Then '可安装 Mod 的版本 Dim ModDir As New DirectoryInfo(Instance.PathIndie & "mods\") - Dim ModCount As Integer = If(ModDir.Exists, ModDir.GetFiles.Length, 0) + Dim ModCount As Integer = If(ModDir.Exists, ModDir.GetFiles.Count(Function(f) {".jar", ".zip", ".litemod"}.Contains(f.Extension.Lower)), 0) RamMininum = 0.5 + ModCount / 150 RamTarget1 = 1.5 + ModCount / 90 RamTarget2 = 2.7 + ModCount / 50 @@ -387,7 +334,7 @@ PreFin: RamGive = Math.Round(Math.Max(RamGive, RamMininum), 1) Else '手动配置 - Dim Value As Integer = Setup.Get("LaunchRamCustom") + Dim Value As Integer = Settings.Get("LaunchRamCustom") If Value <= 12 Then RamGive = Value * 0.1 + 0.3 ElseIf Value <= 25 Then @@ -408,14 +355,14 @@ PreFin: #Region "Java 选择" '刷新 Java 下拉框显示 - Public Sub RefreshJavaComboBox() + Public Sub UpdateJavaComboBox() If ComboArgumentJava Is Nothing Then Return '初始化列表 ComboArgumentJava.Items.Clear() ComboArgumentJava.Items.Add(New MyComboBoxItem With {.Content = "自动选择合适的 Java", .Tag = "自动选择"}) '更新列表 Dim SelectedItem As MyComboBoxItem = Nothing - Dim SelectedBySetup As String = Setup.Get("LaunchArgumentJavaSelect") + Dim SelectedBySetup As String = Settings.Get("LaunchArgumentJavaSelect") Try For Each Java In JavaList.Clone().OrderByDescending(Function(v) v.MajorVersion) Dim ListItem = New MyComboBoxItem With {.Content = Java.ToString, .ToolTip = Java.PathFolder, .Tag = Java} @@ -426,7 +373,7 @@ PreFin: If JavaEntry.FromJson(GetJson(SelectedBySetup)).PathFolder = Java.PathFolder Then SelectedItem = ListItem Next Catch ex As Exception - Setup.Set("LaunchArgumentJavaSelect", "") + Settings.Set("LaunchArgumentJavaSelect", "") Log(ex, "更新设置 Java 下拉框失败", LogLevel.Feedback) End Try '更新选择项 @@ -455,11 +402,11 @@ PreFin: Dim SelectedJava = ComboArgumentJava.SelectedItem.Tag If "自动选择".Equals(SelectedJava) Then '选择 “自动” - Setup.Set("LaunchArgumentJavaSelect", "") + Settings.Set("LaunchArgumentJavaSelect", "") Log("[Java] 修改 Java 选择设置:自动选择") Else '选择指定项 - Setup.Set("LaunchArgumentJavaSelect", CType(SelectedJava.ToJson(), JObject).ToString(Newtonsoft.Json.Formatting.None)) + Settings.Set("LaunchArgumentJavaSelect", CType(SelectedJava.ToJson(), JObject).ToString(Newtonsoft.Json.Formatting.None)) Log("[Java] 修改 Java 选择设置:" & SelectedJava.ToString) End If RefreshRam(True) @@ -481,12 +428,12 @@ PreFin: NewEntry.Check() '加入列表 Dim JavaNewList As New JArray From {NewEntry.ToJson} - For Each JsonEntry In GetJson(Setup.Get("LaunchArgumentJavaAll")) + For Each JsonEntry In GetJson(Settings.Get("LaunchArgumentJavaAll")) Dim Entry = JavaEntry.FromJson(JsonEntry) If Entry.PathFolder = NewEntry.PathFolder Then Continue For JavaNewList.Add(JsonEntry) Next - Setup.Set("LaunchArgumentJavaAll", JavaNewList.ToString(Newtonsoft.Json.Formatting.None)) + Settings.Set("LaunchArgumentJavaAll", JavaNewList.ToString(Newtonsoft.Json.Formatting.None)) '重新加载列表 JavaSearchLoader.Start(IsForceRestart:=True) Hint("已将该 Java 加入 Java 列表!", HintType.Green) @@ -518,16 +465,10 @@ PreFin: #Region "其他选项" Private Sub WindowTypeUIRefresh() Handles ComboArgumentWindowType.SelectionChanged - If ComboArgumentWindowType Is Nothing Then Return - If ComboArgumentWindowType.SelectedIndex = 3 AndAlso LabArgumentWindowMiddle IsNot Nothing AndAlso LabArgumentWindowMiddle.Visibility = Visibility.Collapsed Then - LabArgumentWindowMiddle.Visibility = Visibility.Visible - TextArgumentWindowHeight.Visibility = Visibility.Visible - TextArgumentWindowWidth.Visibility = Visibility.Visible - ElseIf ComboArgumentWindowType.SelectedIndex <> 3 AndAlso LabArgumentWindowMiddle IsNot Nothing AndAlso LabArgumentWindowMiddle.Visibility = Visibility.Visible Then - LabArgumentWindowMiddle.Visibility = Visibility.Collapsed - TextArgumentWindowHeight.Visibility = Visibility.Collapsed - TextArgumentWindowWidth.Visibility = Visibility.Collapsed - End If + Dim IsVisibie = (ComboArgumentWindowType.SelectedIndex = 3).ToVisibility + TextArgumentWindowHeight.Visibility = IsVisibie + LabArgumentWindowMiddle.Visibility = IsVisibie + TextArgumentWindowWidth.Visibility = IsVisibie End Sub '可见性选择直接关闭的警告 @@ -569,11 +510,20 @@ PreFin: 'JVM 参数重设 Private Sub TextAdvanceJvm_TextChanged() Handles TextAdvanceJvm.ValidatedTextChanged - BtnAdvanceJvmReset.Visibility = If(TextAdvanceJvm.Text = Setup.GetDefault("LaunchAdvanceJvm"), Visibility.Hidden, Visibility.Visible) + BtnAdvanceJvmReset.Visibility = If(TextAdvanceJvm.Text = Settings.GetDefault("LaunchAdvanceJvm"), Visibility.Hidden, Visibility.Visible) End Sub Private Sub BtnAdvanceJvmReset_Click(sender As Object, e As EventArgs) Handles BtnAdvanceJvmReset.Click - Setup.Reset("LaunchAdvanceJvm") - Reload() + Settings.Reset("LaunchAdvanceJvm") + Refresh() + End Sub + + '去除参数中的回车 + Private Sub ReplaceEnter(sender As MyTextBox, e As TextChangedEventArgs) Handles TextAdvanceJvm.TextChanged, TextAdvanceGame.TextChanged + Dim NewText = sender.Text.Replace(vbCrLf, vbCr).Replace(vbLf, vbCr).Replace(vbCr, " ") + If NewText = sender.Text Then Return + Dim CaretIndex = sender.CaretIndex + sender.Text = NewText + sender.CaretIndex = Math.Max(0, CaretIndex - 1) End Sub #End Region @@ -585,12 +535,4 @@ PreFin: FrmMain.PageChange(FormMain.PageType.InstanceSetup, FormMain.PageSubType.InstanceSetup) End Sub - '去除参数中的回车 - Private Sub ReplaceEnter(sender As MyTextBox, e As TextChangedEventArgs) Handles TextAdvanceJvm.TextChanged, TextAdvanceGame.TextChanged - Dim NewText = sender.Text.Replace(vbCrLf, vbCr).Replace(vbLf, vbCr).Replace(vbCr, " ") - If NewText = sender.Text Then Return - Dim CaretIndex = sender.CaretIndex - sender.Text = NewText - sender.CaretIndex = Math.Max(0, CaretIndex - 1) - End Sub End Class diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLeft.xaml.vb index b8b8030..4924745 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLeft.xaml.vb @@ -5,10 +5,10 @@ Private Sub PageSetupLeft_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded '是否处于隐藏的子页面 Dim IsHiddenPage As Boolean = False - If ItemLaunch.Checked AndAlso Setup.Get("UiHiddenSetupLaunch") Then IsHiddenPage = True - If ItemUI.Checked AndAlso Setup.Get("UiHiddenSetupUi") Then IsHiddenPage = True - If ItemSystem.Checked AndAlso Setup.Get("UiHiddenSetupSystem") Then IsHiddenPage = True - If ItemLink.Checked AndAlso Setup.Get("UiHiddenSetupLink") Then IsHiddenPage = True + If ItemLaunch.Checked AndAlso Settings.Get("UiHiddenSetupLaunch") Then IsHiddenPage = True + If ItemUI.Checked AndAlso Settings.Get("UiHiddenSetupUi") Then IsHiddenPage = True + If ItemSystem.Checked AndAlso Settings.Get("UiHiddenSetupSystem") Then IsHiddenPage = True + If ItemLink.Checked AndAlso Settings.Get("UiHiddenSetupLink") Then IsHiddenPage = True If PageSetupUI.HiddenForceShow Then IsHiddenPage = False '若页面错误,或尚未加载,则继续 If IsLoad AndAlso Not IsHiddenPage Then Return @@ -17,13 +17,13 @@ PageSetupUI.HiddenRefresh() '选择第一个未被禁用的子页面 If IsPageSwitched Then Return - If Not Setup.Get("UiHiddenSetupLaunch") Then + If Not Settings.Get("UiHiddenSetupLaunch") Then ItemLaunch.SetChecked(True, False, False) - ElseIf Not Setup.Get("UiHiddenSetupUi") Then + ElseIf Not Settings.Get("UiHiddenSetupUi") Then ItemUI.SetChecked(True, False, False) - ElseIf Not Setup.Get("UiHiddenSetupSystem") Then + ElseIf Not Settings.Get("UiHiddenSetupSystem") Then ItemSystem.SetChecked(True, False, False) - ElseIf Not Setup.Get("UiHiddenSetupLink") Then + ElseIf Not Settings.Get("UiHiddenSetupLink") Then ItemLink.SetChecked(True, False, False) Else ItemLaunch.SetChecked(True, False, False) @@ -42,13 +42,13 @@ Public Sub New() InitializeComponent() '选择第一个未被禁用的子页面 - If Not Setup.Get("UiHiddenSetupLaunch") Then + If Not Settings.Get("UiHiddenSetupLaunch") Then PageID = FormMain.PageSubType.SetupLaunch - ElseIf Not Setup.Get("UiHiddenSetupUi") Then + ElseIf Not Settings.Get("UiHiddenSetupUi") Then PageID = FormMain.PageSubType.SetupUI - ElseIf Not Setup.Get("UiHiddenSetupSystem") Then + ElseIf Not Settings.Get("UiHiddenSetupSystem") Then PageID = FormMain.PageSubType.SetupSystem - ElseIf Not Setup.Get("UiHiddenSetupLink") Then + ElseIf Not Settings.Get("UiHiddenSetupLink") Then PageID = FormMain.PageSubType.SetupLink Else PageID = FormMain.PageSubType.SetupLaunch diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLink.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLink.xaml.vb index e08009c..d490894 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLink.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLink.xaml.vb @@ -17,15 +17,15 @@ End Sub Public Sub Reload() - ComboLatencyMode.SelectedIndex = Setup.Get("LinkLatencyMode") - TextCustomPeer.Text = Setup.Get("LinkCustomPeer") + ComboLatencyMode.SelectedIndex = Settings.Get("LinkLatencyMode") + TextCustomPeer.Text = Settings.Get("LinkCustomPeer") End Sub '初始化 Public Sub Reset() Try - Setup.Reset("LinkLatencyMode") - Setup.Reset("LinkCustomPeer") + Settings.Reset("LinkLatencyMode") + Settings.Reset("LinkCustomPeer") Log("[Setup] 已初始化联机页设置") Hint("已初始化联机页设置!", HintType.Green, False) @@ -38,10 +38,10 @@ '将控件改变路由到设置改变 Private Shared Sub TextBoxChange(sender As MyTextBox, e As Object) Handles TextCustomPeer.ValidatedTextChanged - If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Text) + If AniControlEnabled = 0 Then Settings.Set(sender.Tag, sender.Text) End Sub Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboLatencyMode.SelectionChanged - If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex) + If AniControlEnabled = 0 Then Settings.Set(sender.Tag, sender.SelectedIndex) End Sub End Class diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb index 766413a..3384b7c 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb @@ -27,62 +27,62 @@ Public Sub Reload() '下载 - SliderDownloadThread.Value = Setup.Get("ToolDownloadThread") - SliderDownloadSpeed.Value = Setup.Get("ToolDownloadSpeed") - ComboDownloadSource.SelectedIndex = Setup.Get("ToolDownloadSource") - ComboDownloadVersion.SelectedIndex = Setup.Get("ToolDownloadVersion") - CheckDownloadCert.Checked = Setup.Get("ToolDownloadCert") + SliderDownloadThread.Value = Settings.Get("ToolDownloadThread") + SliderDownloadSpeed.Value = Settings.Get("ToolDownloadSpeed") + ComboDownloadSource.SelectedIndex = Settings.Get("ToolDownloadSource") + ComboDownloadVersion.SelectedIndex = Settings.Get("ToolDownloadVersion") + CheckDownloadCert.Checked = Settings.Get("ToolDownloadCert") 'Mod 与整合包 - ComboDownloadTranslateV2.SelectedIndex = Setup.Get("ToolDownloadTranslateV2") - ComboDownloadMod.SelectedIndex = Setup.Get("ToolDownloadMod") - ComboModLocalNameStyle.SelectedIndex = Setup.Get("ToolModLocalNameStyle") - CheckDownloadIgnoreQuilt.Checked = Setup.Get("ToolDownloadIgnoreQuilt") + ComboDownloadTranslateV2.SelectedIndex = Settings.Get("ToolDownloadTranslateV2") + ComboDownloadMod.SelectedIndex = Settings.Get("ToolDownloadMod") + ComboModLocalNameStyle.SelectedIndex = Settings.Get("ToolModLocalNameStyle") + CheckDownloadIgnoreQuilt.Checked = Settings.Get("ToolDownloadIgnoreQuilt") 'Minecraft 更新提示 - CheckUpdateRelease.Checked = Setup.Get("ToolUpdateRelease") - CheckUpdateSnapshot.Checked = Setup.Get("ToolUpdateSnapshot") + CheckUpdateRelease.Checked = Settings.Get("ToolUpdateRelease") + CheckUpdateSnapshot.Checked = Settings.Get("ToolUpdateSnapshot") '辅助设置 - CheckHelpChinese.Checked = Setup.Get("ToolHelpChinese") + CheckHelpChinese.Checked = Settings.Get("ToolHelpChinese") '系统设置 - ComboSystemUpdate.SelectedIndex = Setup.Get("SystemSystemUpdate") - ComboSystemActivity.SelectedIndex = Setup.Get("SystemSystemActivity") - TextSystemCache.Text = Setup.Get("SystemSystemCache") - CheckSystemTelemetry.Checked = Setup.Get("SystemSystemTelemetry") + ComboSystemUpdate.SelectedIndex = Settings.Get("SystemSystemUpdate") + ComboSystemActivity.SelectedIndex = Settings.Get("SystemSystemActivity") + TextSystemCache.Text = Settings.Get("SystemSystemCache") + CheckSystemTelemetry.Checked = Settings.Get("SystemSystemTelemetry") '调试选项 - CheckDebugMode.Checked = Setup.Get("SystemDebugMode") - SliderDebugAnim.Value = Setup.Get("SystemDebugAnim") - CheckDebugDelay.Checked = Setup.Get("SystemDebugDelay") - CheckDebugSkipCopy.Checked = Setup.Get("SystemDebugSkipCopy") + CheckDebugMode.Checked = Settings.Get("SystemDebugMode") + SliderDebugAnim.Value = Settings.Get("SystemDebugAnim") + CheckDebugDelay.Checked = Settings.Get("SystemDebugDelay") + CheckDebugSkipCopy.Checked = Settings.Get("SystemDebugSkipCopy") End Sub '初始化 Public Sub Reset() Try - Setup.Reset("ToolDownloadThread") - Setup.Reset("ToolDownloadSpeed") - Setup.Reset("ToolDownloadSource") - Setup.Reset("ToolDownloadVersion") - Setup.Reset("ToolDownloadTranslateV2") - Setup.Reset("ToolDownloadIgnoreQuilt") - Setup.Reset("ToolDownloadCert") - Setup.Reset("ToolDownloadMod") - Setup.Reset("ToolModLocalNameStyle") - Setup.Reset("ToolUpdateRelease") - Setup.Reset("ToolUpdateSnapshot") - Setup.Reset("ToolHelpChinese") - Setup.Reset("SystemDebugMode") - Setup.Reset("SystemDebugAnim") - Setup.Reset("SystemDebugDelay") - Setup.Reset("SystemDebugSkipCopy") - Setup.Reset("SystemSystemCache") - Setup.Reset("SystemSystemUpdate") - Setup.Reset("SystemSystemActivity") - Setup.Reset("SystemSystemTelemetry") + Settings.Reset("ToolDownloadThread") + Settings.Reset("ToolDownloadSpeed") + Settings.Reset("ToolDownloadSource") + Settings.Reset("ToolDownloadVersion") + Settings.Reset("ToolDownloadTranslateV2") + Settings.Reset("ToolDownloadIgnoreQuilt") + Settings.Reset("ToolDownloadCert") + Settings.Reset("ToolDownloadMod") + Settings.Reset("ToolModLocalNameStyle") + Settings.Reset("ToolUpdateRelease") + Settings.Reset("ToolUpdateSnapshot") + Settings.Reset("ToolHelpChinese") + Settings.Reset("SystemDebugMode") + Settings.Reset("SystemDebugAnim") + Settings.Reset("SystemDebugDelay") + Settings.Reset("SystemDebugSkipCopy") + Settings.Reset("SystemSystemCache") + Settings.Reset("SystemSystemUpdate") + Settings.Reset("SystemSystemActivity") + Settings.Reset("SystemSystemTelemetry") Log("[Setup] 已初始化启动器页设置") Hint("已初始化启动器页设置!", HintType.Green, False) @@ -95,16 +95,16 @@ '将控件改变路由到设置改变 Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckDebugMode.Change, CheckDebugDelay.Change, CheckDebugSkipCopy.Change, CheckUpdateRelease.Change, CheckUpdateSnapshot.Change, CheckHelpChinese.Change, CheckDownloadIgnoreQuilt.Change, CheckDownloadCert.Change, CheckSystemTelemetry.Change - If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked) + If AniControlEnabled = 0 Then Settings.Set(sender.Tag, sender.Checked) End Sub Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderDebugAnim.Change, SliderDownloadThread.Change, SliderDownloadSpeed.Change - If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value) + If AniControlEnabled = 0 Then Settings.Set(sender.Tag, sender.Value) End Sub Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboDownloadVersion.SelectionChanged, ComboModLocalNameStyle.SelectionChanged, ComboDownloadTranslateV2.SelectionChanged, ComboSystemUpdate.SelectionChanged, ComboSystemActivity.SelectionChanged, ComboDownloadSource.SelectionChanged, ComboDownloadMod.SelectionChanged - If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex) + If AniControlEnabled = 0 Then Settings.Set(sender.Tag, sender.SelectedIndex) End Sub Private Shared Sub TextBoxChange(sender As MyTextBox, e As Object) Handles TextSystemCache.ValidatedTextChanged - If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Text) + If AniControlEnabled = 0 Then Settings.Set(sender.Tag, sender.Text) End Sub '滑动条 @@ -127,8 +127,8 @@ End Sub Private Sub SliderDownloadThread_PreviewChange(sender As Object, e As RouteEventArgs) Handles SliderDownloadThread.PreviewChange If SliderDownloadThread.Value < 100 Then Return - If Not Setup.Get("HintDownloadThread") Then - Setup.Set("HintDownloadThread", True) + If Not Settings.Get("HintDownloadThread") Then + Settings.Set("HintDownloadThread", True) MyMsgBox("如果设置过多的下载线程,可能会导致下载时出现非常严重的卡顿。" & vbCrLf & "一般设置 64 线程即可满足大多数下载需求,除非你知道你在干什么,否则不建议设置更多的线程数!", "警告", "我知道了", IsWarn:=True) End If diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml index 8c133d8..0bb1a57 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml @@ -23,15 +23,20 @@ - + - + - + - + - + @@ -49,33 +54,49 @@ - - - - - - - + + + + + + + - - - - - + + + + + - + - - + + - + - + - + @@ -88,16 +109,20 @@ - - - - - - - - - - + + + + + + + + + + + + + + @@ -106,7 +131,7 @@ - + @@ -114,9 +139,10 @@ - + - + @@ -239,23 +265,23 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb index ff4a56f..b8614b1 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb @@ -1,37 +1,30 @@ 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 + Dim NewText As String = Nothing 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 + If (TypeOf Control Is MyRadioBox) AndAlso CType(Control, MyRadioBox).IsEnabled Then CType(Control, MyRadioBox).Text = NewText Next End If AniControlEnabled += 1 - Reload() '#4826,在每次进入页面时都刷新一下 + Refresh() '#4826 AniControlEnabled -= 1 '非重复加载部分 - If IsLoaded Then Return - IsLoaded = True + Static Reloaded As Boolean = False + If Reloaded Then Return + Reloaded = True SliderLoad() @@ -47,68 +40,50 @@ '极客蓝的处理在 ThemeCheck 中 End Sub - Public Sub Reload() + Public Sub Refresh() 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") + SettingService.RefreshSettings(Me) BackgroundRefresh(False, False) '标题栏 - CType(FindName("RadioLogoType" & Setup.Get("UiLogoType")), MyRadioBox).Checked = True + CType(FindName("RadioLogoType" & Settings.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") + TextLogoText.Text = Settings.Get("UiLogoText") + CheckLogoLeft.Checked = Settings.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") + CheckMusicRandom.Checked = Settings.Get("UiMusicRandom") + CheckMusicAuto.Checked = Settings.Get("UiMusicAuto") + CheckMusicStop.Checked = Settings.Get("UiMusicStop") + CheckMusicStart.Checked = Settings.Get("UiMusicStart") + SliderMusicVolume.Value = Settings.Get("UiMusicVolume") MusicRefreshUI() '主页 - Try - ComboCustomPreset.SelectedIndex = Setup.Get("UiCustomPreset") - Catch - Setup.Reset("UiCustomPreset") - End Try - CType(FindName("RadioCustomType" & Setup.Load("UiCustomType", ForceReload:=True)), MyRadioBox).Checked = True - TextCustomNet.Text = Setup.Get("UiCustomNet") + CType(FindName("RadioCustomType" & Settings.Get("UiCustomType")), MyRadioBox).Checked = True + OnUiCustomTypeChanged(Settings.Get("UiCustomType")) + TextCustomNet.Text = Settings.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") - CheckHiddenFunctionModUpdate.Checked = Setup.Get("UiHiddenFunctionModUpdate") - 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") + CheckLauncherEmail.Checked = Settings.Get("UiLauncherEmail") + CheckHiddenPageDownload.Checked = Settings.Get("UiHiddenPageDownload") + CheckHiddenPageLink.Checked = Settings.Get("UiHiddenPageLink") + CheckHiddenPageSetup.Checked = Settings.Get("UiHiddenPageSetup") + CheckHiddenPageOther.Checked = Settings.Get("UiHiddenPageOther") + CheckHiddenFunctionSelect.Checked = Settings.Get("UiHiddenFunctionSelect") + CheckHiddenFunctionModUpdate.Checked = Settings.Get("UiHiddenFunctionModUpdate") + CheckHiddenFunctionHidden.Checked = Settings.Get("UiHiddenFunctionHidden") + CheckHiddenSetupLaunch.Checked = Settings.Get("UiHiddenSetupLaunch") + CheckHiddenSetupUI.Checked = Settings.Get("UiHiddenSetupUi") + CheckHiddenSetupLink.Checked = Settings.Get("UiHiddenSetupLink") + CheckHiddenSetupSystem.Checked = Settings.Get("UiHiddenSetupSystem") + CheckHiddenOtherAbout.Checked = Settings.Get("UiHiddenOtherAbout") + CheckHiddenOtherFeedback.Checked = Settings.Get("UiHiddenOtherFeedback") + CheckHiddenOtherVote.Checked = Settings.Get("UiHiddenOtherVote") + CheckHiddenOtherHelp.Checked = Settings.Get("UiHiddenOtherHelp") + CheckHiddenOtherTest.Checked = Settings.Get("UiHiddenOtherTest") Catch ex As NullReferenceException Log(ex, "个性化设置项存在异常,已被自动重置", LogLevel.Msgbox) @@ -121,45 +96,35 @@ '初始化 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("UiHiddenFunctionModUpdate") - 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") + SettingService.ResetSettings(Me) + Settings.Reset("UiLauncherLogo") + Settings.Reset("UiLauncherEmail") + Settings.Reset("UiLogoType") + Settings.Reset("UiLogoText") + Settings.Reset("UiLogoLeft") + Settings.Reset("UiMusicVolume") + Settings.Reset("UiMusicStop") + Settings.Reset("UiMusicStart") + Settings.Reset("UiMusicRandom") + Settings.Reset("UiMusicAuto") + Settings.Reset("UiCustomType") + Settings.Reset("UiCustomNet") + Settings.Reset("UiHiddenPageDownload") + Settings.Reset("UiHiddenPageLink") + Settings.Reset("UiHiddenPageSetup") + Settings.Reset("UiHiddenPageOther") + Settings.Reset("UiHiddenFunctionSelect") + Settings.Reset("UiHiddenFunctionModUpdate") + Settings.Reset("UiHiddenFunctionHidden") + Settings.Reset("UiHiddenSetupLaunch") + Settings.Reset("UiHiddenSetupUi") + Settings.Reset("UiHiddenSetupLink") + Settings.Reset("UiHiddenSetupSystem") + Settings.Reset("UiHiddenOtherAbout") + Settings.Reset("UiHiddenOtherFeedback") + Settings.Reset("UiHiddenOtherVote") + Settings.Reset("UiHiddenOtherHelp") + Settings.Reset("UiHiddenOtherTest") Log("[Setup] 已初始化个性化设置!") Hint("已初始化个性化设置", HintType.Green, False) @@ -167,24 +132,21 @@ Log(ex, "初始化个性化设置失败", LogLevel.Msgbox) End Try - Reload() + Refresh() 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) + Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderMusicVolume.Change + If AniControlEnabled = 0 Then Settings.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, CheckHiddenFunctionModUpdate.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) + Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckMusicStop.Change, CheckMusicRandom.Change, CheckMusicAuto.Change, CheckLogoLeft.Change, CheckHiddenFunctionHidden.Change, CheckHiddenFunctionSelect.Change, CheckHiddenFunctionModUpdate.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 Settings.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) + If AniControlEnabled = 0 Then Settings.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))) + Private Shared Sub RadioBoxChange(sender As MyRadioBox, e As Object) Handles RadioLogoType0.Check, RadioLogoType1.Check, RadioLogoType2.Check, RadioLogoType3.Check, RadioCustomType0.Check, RadioCustomType1.Check, RadioCustomType2.Check, RadioCustomType3.Check + If AniControlEnabled = 0 Then Settings.Set(sender.Tag.ToString.Split("/")(0), Val(sender.Tag.ToString.Split("/")(1))) End Sub '背景图片 @@ -230,7 +192,7 @@ 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 + If File.Extension.Lower <> ".ini" AndAlso File.Extension.Lower <> ".db" Then '文件夹可能会被加入 .ini 和 thumbs.db Pic.Add(File.FullName) End If Next @@ -251,8 +213,8 @@ Try Log("[UI] 加载背景图片:" & Address) FrmMain.ImgBack.Background = New MyBitmap(Address) - Setup.Load("UiBackgroundSuit", True) FrmMain.ImgBack.Visibility = Visibility.Visible + FrmMain.UpdateBackgroundAndTitleBar() If IsHint Then Hint("背景图片已刷新:" & GetFileNameFromPath(Address), HintType.Green, False) Catch ex As Exception If ex.Message.Contains("参数无效") Then @@ -358,7 +320,7 @@ Refresh: PanMusicDetail.Visibility = Visibility.Visible BtnMusicClear.Visibility = Visibility.Visible CardMusic.Title = "背景音乐(" & - EnumerateFiles(Path & "PCL\Musics\").Count(Function(f) Not {".ini", ".jpg", ".txt", ".cfg", ".lrc", ".db", ".png"}.Contains(f.Extension.ToLower)) & + EnumerateFiles(Path & "PCL\Musics\").Count(Function(f) Not {".ini", ".jpg", ".txt", ".cfg", ".lrc", ".db", ".png"}.Contains(f.Extension.Lower)) & " 首)" Else PanMusicVolume.Visibility = Visibility.Collapsed @@ -428,16 +390,51 @@ Refresh: "你可以在生成教学文件后直接刷新主页,对照着进行修改,更有助于理解。" & vbCrLf & "直接将主页文件拖进 PCL 窗口也可以快捷加载。", "主页自定义教程") End Sub + Public Shared Sub OnUiCustomTypeChanged(Value As Integer) + If FrmSetupUI Is Nothing Then Return + 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 + FrmSetupUI.HintCustomWarn.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.HintCustomWarn.Visibility = If(Settings.Get("HintCustomWarn"), Visibility.Collapsed, Visibility.Visible) + FrmSetupUI.HintCustom.Text = $"从 PCL 文件夹下的 Custom.xaml 读取主页内容。{vbCrLf}你可以手动编辑该文件,向主页添加文本、图片、常用网站、快捷启动等功能。" + CustomEventService.SetEventType(FrmSetupUI.HintCustom, CustomEvent.EventType.None) + Case 2 '联网 + FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed + FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed + FrmSetupUI.PanCustomNet.Visibility = Visibility.Visible + FrmSetupUI.HintCustom.Visibility = Visibility.Visible + FrmSetupUI.HintCustomWarn.Visibility = If(Settings.Get("HintCustomWarn"), Visibility.Collapsed, Visibility.Visible) + FrmSetupUI.HintCustom.Text = $"从指定网址联网获取主页内容。服主也可以用于动态更新服务器公告。{vbCrLf}如果你制作了稳定运行的联网主页,可以点击这条提示投稿,若合格即可加入预设!" + CustomEventService.SetEventType(FrmSetupUI.HintCustom, CustomEvent.EventType.打开网页) + CustomEventService.SetEventData(FrmSetupUI.HintCustom, "https://github.com/Meloong-Git/PCL/discussions/2528") + Case 3 '预设 + FrmSetupUI.PanCustomPreset.Visibility = Visibility.Visible + FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed + FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed + FrmSetupUI.HintCustom.Visibility = Visibility.Collapsed + FrmSetupUI.HintCustomWarn.Visibility = Visibility.Collapsed + End Select + FrmSetupUI.CardCustom.TriggerForceResize() + End Sub '主题 Private Sub LabLauncherTheme5Unlock_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles LabLauncherTheme5Unlock.MouseLeftButtonUp - RadioLauncherTheme5Gray.Opacity -= 0.23 - RadioLauncherTheme5.Opacity += 0.23 + RadioLauncherTheme5Gray.Opacity -= 0.7 + RadioLauncherTheme5.Opacity += 0.7 AniStart({ - AaOpacity(RadioLauncherTheme5Gray, 1, 1000 * AniSpeed), - AaOpacity(RadioLauncherTheme5, -1, 1000 * AniSpeed) + AaOpacity(RadioLauncherTheme5Gray, 1, 1000 * AniSpeed, 500 * AniSpeed, New AniEaseInFluent), + AaOpacity(RadioLauncherTheme5, -1, 1000 * AniSpeed, 500 * AniSpeed, New AniEaseInFluent) }, "ThemeUnlock") - If RadioLauncherTheme5Gray.Opacity < 0.08 Then + If RadioLauncherTheme5Gray.Opacity < 0.02 Then ThemeUnlock(5, UnlockHint:="隐藏主题 玄素黑 已解锁!") AniStop("ThemeUnlock") RadioLauncherTheme5.Checked = True @@ -452,12 +449,12 @@ Refresh: "若违规,可能会被从任意相关群中踢出!", "解密游戏的基本规则", "我知道了", "恕我拒绝") = 1 Then MyMsgBox("你需要用自己的智慧来找到下一步的线索……" & vbCrLf & - "初始线索:gnp.dorC61\60\20\0202\moc.x1xa.2s\\:sp" & "T".ToLower & "th", "解密游戏") '防止触发病毒检测规则 + "初始线索:gnp.dorC61\60\20\0202\moc.x1xa.2s\\:sp" & "T".Lower & "th", "解密游戏") '防止触发病毒检测规则 End If End If End Sub Private Sub LabLauncherTheme8Copy_MouseRightButtonUp() Handles LabLauncherTheme8Copy.MouseRightButtonUp, RadioLauncherTheme8.MouseRightButtonUp - OpenWebsite("https://afdian.com/a/LTCat") + OpenWebsite("https://meloong.com/afd/a/LTCat") End Sub Private Sub LabLauncherTheme9Copy_MouseRightButtonUp() Handles LabLauncherTheme9Copy.MouseRightButtonUp, RadioLauncherTheme9.MouseRightButtonUp PageOtherLeft.TryFeedback() @@ -516,56 +513,56 @@ Refresh: If FrmMain.PanTitleSelect Is Nothing OrElse Not FrmMain.PanTitleSelect.IsLoaded Then Return Try '顶部栏 - If Not HiddenForceShow AndAlso Setup.Get("UiHiddenPageDownload") AndAlso Setup.Get("UiHiddenPageLink") AndAlso Setup.Get("UiHiddenPageSetup") AndAlso Setup.Get("UiHiddenPageOther") Then + If Not HiddenForceShow AndAlso Settings.Get("UiHiddenPageDownload") AndAlso Settings.Get("UiHiddenPageLink") AndAlso Settings.Get("UiHiddenPageSetup") AndAlso Settings.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) + FrmMain.BtnTitleSelect1.Visibility = If(Not HiddenForceShow AndAlso Settings.Get("UiHiddenPageDownload"), Visibility.Collapsed, Visibility.Visible) + FrmMain.BtnTitleSelect2.Visibility = Visibility.Collapsed 'If(Not HiddenForceShow AndAlso Settings.Get("UiHiddenPageLink"), Visibility.Collapsed, Visibility.Visible) + FrmMain.BtnTitleSelect3.Visibility = If(Not HiddenForceShow AndAlso Settings.Get("UiHiddenPageSetup"), Visibility.Collapsed, Visibility.Visible) + FrmMain.BtnTitleSelect4.Visibility = If(Not HiddenForceShow AndAlso Settings.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) + FrmSetupUI.CardSwitch.Visibility = If(Not HiddenForceShow AndAlso Settings.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) + FrmSetupLeft.ItemLaunch.Visibility = If(Not HiddenForceShow AndAlso Settings.Get("UiHiddenSetupLaunch"), Visibility.Collapsed, Visibility.Visible) + FrmSetupLeft.ItemUI.Visibility = If(Not HiddenForceShow AndAlso Settings.Get("UiHiddenSetupUi"), Visibility.Collapsed, Visibility.Visible) + FrmSetupLeft.ItemLink.Visibility = Visibility.Collapsed 'If(Not HiddenForceShow AndAlso Settings.Get("UiHiddenSetupLink"), Visibility.Collapsed, Visibility.Visible) + FrmSetupLeft.ItemSystem.Visibility = If(Not HiddenForceShow AndAlso Settings.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 + If Not Settings.Get("UiHiddenSetupLaunch") Then AvaliableCount += 1 + If Not Settings.Get("UiHiddenSetupUi") Then AvaliableCount += 1 + 'If Not Settings.Get("UiHiddenSetupLink") Then AvaliableCount += 1 + If Not Settings.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 Not Settings.Get("UiHiddenOtherHelp") Then OtherAvaliableCount += 1 + If Not Settings.Get("UiHiddenOtherAbout") Then OtherAvaliableCount += 1 + If Not Settings.Get("UiHiddenOtherTest") Then OtherAvaliableCount += 1 + If Not Settings.Get("UiHiddenOtherFeedback") Then OtherAvaliableCount += 1 + If Not Settings.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.ItemHelp.Visibility = If(Not HiddenForceShow AndAlso Settings.Get("UiHiddenOtherHelp"), Visibility.Collapsed, Visibility.Visible) + FrmOtherLeft.ItemFeedback.Visibility = If(Not HiddenForceShow AndAlso Settings.Get("UiHiddenOtherFeedback"), Visibility.Collapsed, Visibility.Visible) + FrmOtherLeft.ItemVote.Visibility = If(Not HiddenForceShow AndAlso Settings.Get("UiHiddenOtherVote"), Visibility.Collapsed, Visibility.Visible) + FrmOtherLeft.ItemAbout.Visibility = If(Not HiddenForceShow AndAlso Settings.Get("UiHiddenOtherAbout"), Visibility.Collapsed, Visibility.Visible) + FrmOtherLeft.ItemTest.Visibility = If(Not HiddenForceShow AndAlso Settings.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 + If Not Settings.Get("UiHiddenOtherHelp") Then FrmMain.BtnTitleSelect4.Text = "帮助" - ElseIf Not Setup.Get("UiHiddenOtherAbout") Then + ElseIf Not Settings.Get("UiHiddenOtherAbout") Then FrmMain.BtnTitleSelect4.Text = "关于" Else FrmMain.BtnTitleSelect4.Text = "百宝箱" @@ -595,7 +592,7 @@ Refresh: CheckHiddenSetupUI.Checked = True Else '关闭 - If Setup.Get("UiHiddenSetupLaunch") AndAlso Setup.Get("UiHiddenSetupUi") AndAlso Setup.Get("UiHiddenSetupSystem") AndAlso Setup.Get("UiHiddenSetupLink") Then + If Settings.Get("UiHiddenSetupLaunch") AndAlso Settings.Get("UiHiddenSetupUi") AndAlso Settings.Get("UiHiddenSetupSystem") AndAlso Settings.Get("UiHiddenSetupLink") Then CheckHiddenSetupLaunch.Checked = False CheckHiddenSetupSystem.Checked = False CheckHiddenSetupLink.Checked = False @@ -605,7 +602,7 @@ Refresh: 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 + If Settings.Get("UiHiddenSetupLaunch") AndAlso Settings.Get("UiHiddenSetupUi") AndAlso Settings.Get("UiHiddenSetupSystem") AndAlso Settings.Get("UiHiddenSetupLink") Then '已被全部隐藏 CheckHiddenPageSetup.Checked = True Else @@ -624,8 +621,8 @@ Refresh: 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 + If Settings.Get("UiHiddenOtherHelp") AndAlso Settings.Get("UiHiddenOtherAbout") AndAlso Settings.Get("UiHiddenOtherTest") AndAlso + Settings.Get("UiHiddenOtherVote") AndAlso Settings.Get("UiHiddenOtherFeedback") Then CheckHiddenOtherAbout.Checked = False CheckHiddenOtherTest.Checked = False CheckHiddenOtherFeedback.Checked = False @@ -636,7 +633,7 @@ Refresh: 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 + If Settings.Get("UiHiddenOtherHelp") AndAlso Settings.Get("UiHiddenOtherAbout") AndAlso Settings.Get("UiHiddenOtherTest") Then '已被全部隐藏 CheckHiddenPageOther.Checked = True Else @@ -645,7 +642,7 @@ Refresh: End If '修改无具体内容的项 If Not user Then Return - If Setup.Get("UiHiddenOtherHelp") AndAlso Setup.Get("UiHiddenOtherAbout") AndAlso Setup.Get("UiHiddenOtherTest") Then + If Settings.Get("UiHiddenOtherHelp") AndAlso Settings.Get("UiHiddenOtherAbout") AndAlso Settings.Get("UiHiddenOtherTest") Then CheckHiddenOtherFeedback.Checked = True CheckHiddenOtherVote.Checked = True End If @@ -653,8 +650,8 @@ Refresh: Private Sub HiddenOtherNet(sender As Object, user As Boolean) Handles CheckHiddenOtherFeedback.Change, CheckHiddenOtherVote.Change '更多子页面(无具体内容的) If Not user Then Return - If Setup.Get("UiHiddenOtherHelp") AndAlso Setup.Get("UiHiddenOtherAbout") AndAlso Setup.Get("UiHiddenOtherTest") AndAlso - (Not Setup.Get("UiHiddenOtherFeedback") OrElse Not Setup.Get("UiHiddenOtherVote")) Then + If Settings.Get("UiHiddenOtherHelp") AndAlso Settings.Get("UiHiddenOtherAbout") AndAlso Settings.Get("UiHiddenOtherTest") AndAlso + (Not Settings.Get("UiHiddenOtherFeedback") OrElse Not Settings.Get("UiHiddenOtherVote")) Then CheckHiddenOtherAbout.Checked = False CheckHiddenOtherTest.Checked = False CheckHiddenOtherHelp.Checked = False @@ -668,15 +665,10 @@ Refresh: #End Region - '赞助 - Private Sub BtnLauncherDonate_Click(sender As Object, e As EventArgs) Handles BtnLauncherDonate.Click - OpenWebsite("https://afdian.com/a/LTCat") - End Sub - '滑动条 Private Sub SliderLoad() SliderMusicVolume.GetHintText = Function(v) Math.Ceiling(v * 0.1) & "%" - SliderLauncherOpacity.GetHintText = Function(v) Math.Round(40 + v * 0.1) & "%" + SliderLauncherTransparent.GetHintText = Function(v) Math.Round(40 + v * 0.1) & "%" SliderLauncherHue.GetHintText = Function(v) v & "°" SliderLauncherSat.GetHintText = Function(v) v & "%" SliderLauncherDelta.GetHintText = diff --git a/Plain Craft Launcher 2/Pages/PageSetup/SettingService.vb b/Plain Craft Launcher 2/Pages/PageSetup/SettingService.vb new file mode 100644 index 0000000..41c20bd --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageSetup/SettingService.vb @@ -0,0 +1,81 @@ +Public Class SettingService + +#Region "属性" + + ''' + ''' 指定该控件所对应的设置项。 + ''' + Public Shared Function GetKey(obj As DependencyObject) As String + If obj Is Nothing Then Return Nothing + Return obj.GetValue(KeyProperty) + End Function + Public Shared Sub SetKey(obj As DependencyObject, value As String) + obj.SetValue(KeyProperty, value) + End Sub + Public Shared ReadOnly KeyProperty As DependencyProperty = + DependencyProperty.RegisterAttached("Key", GetType(String), GetType(SettingService), New PropertyMetadata(Nothing)) + + ''' + ''' 指定该控件所对应的设置值。 + ''' + Public Shared Function GetValue(obj As DependencyObject) As String + If obj Is Nothing Then Return Nothing + Return obj.GetValue(ValueProperty) + End Function + Public Shared Sub SetValue(obj As DependencyObject, value As String) + obj.SetValue(ValueProperty, value) + End Sub + Public Shared ReadOnly ValueProperty As DependencyProperty = + DependencyProperty.RegisterAttached("Value", GetType(String), GetType(SettingService), New PropertyMetadata(Nothing)) + +#End Region + + ''' + ''' 重置该控件以及它所有的子控件的设置值。 + ''' + Public Shared Sub ResetSettings(Target As DependencyObject) + LogicalTreeHelper.GetChildren(Target).OfType(Of DependencyObject)().ForEach(Sub(c) ResetSettings(c)) '处理子控件 + Dim Key = GetKey(Target) + If Key Is Nothing Then Return + Settings.Reset(Key, Instance:=PageInstanceLeft.Instance) + End Sub + + ''' + ''' 更新该控件以及它所有的子控件当前显示的设置值。 + ''' + Public Shared Sub RefreshSettings(Target As DependencyObject) + LogicalTreeHelper.GetChildren(Target).OfType(Of DependencyObject)().ForEach(Sub(c) RefreshSettings(c)) '处理子控件 + Dim Key = GetKey(Target) + If Key Is Nothing Then Return + Dim NewValue = Settings.Get(Key, Instance:=PageInstanceLeft.Instance) + If TypeOf Target Is ISettingControl Then DirectCast(Target, ISettingControl).RefreshSetting(NewValue) + End Sub + + ''' + ''' 当控件对应的设置改变时,将内容保存到设置中。 + ''' + Public Shared Sub SaveSetting(sender As Object) + If AniControlEnabled <> 0 Then Return + If TypeOf sender IsNot ISettingControl Then Return + Dim Key = GetKey(sender) + If Key Is Nothing Then Return + Dim NewValue As String = DirectCast(sender, ISettingControl).GetCurrentSetting() + If NewValue Is Nothing Then Return + Settings.Set(Key, NewValue, Instance:=PageInstanceLeft.Instance) + End Sub + +End Class + +Public Interface ISettingControl + + ''' + ''' 更新该控件当前所显示的设置值。 + ''' + Sub RefreshSetting(NewValue As String) + ''' + ''' 获取该控件当前设定的设置值。 + ''' 若不应当关联该设置值,则返回 Nothing。 + ''' + Function GetCurrentSetting() As String + +End Interface diff --git a/Plain Craft Launcher 2/Pages/PageSetup/Settings.vb b/Plain Craft Launcher 2/Pages/PageSetup/Settings.vb new file mode 100644 index 0000000..f90473b --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageSetup/Settings.vb @@ -0,0 +1,410 @@ +Public Class Settings + Private Shared ReadOnly Entries As Dictionary(Of String, Setting) = (New List(Of Setting) From { + New Setting("Identify", "", Source:=Sources.Registry), + New Setting("WindowHeight", 550), + New Setting("WindowWidth", 900), + New Setting("AprilDoneYear", 0, Source:=Sources.Registry), + New Setting("HintDownloadThread", False, Source:=Sources.Registry), + New Setting("HintNotice", 0, Source:=Sources.Registry), + New Setting("HintDownload", 0, Source:=Sources.Registry), + New Setting("HintHide", False, Source:=Sources.Registry), + New Setting("HintHandInstall", False, Source:=Sources.Registry), + New Setting("HintBuy", False, Source:=Sources.Registry), + New Setting("HintClearRubbish", 0, Source:=Sources.Registry), + New Setting("HintUpdateMod", False, Source:=Sources.Registry), + New Setting("HintCustomCommand", False, Source:=Sources.Registry), + New Setting("HintCustomWarn", False, Source:=Sources.Registry), + New Setting("HintMoreAdvancedSetup", False, Source:=Sources.Registry), + New Setting("HintIndieSetup", False, Source:=Sources.Registry), + New Setting("HintExportConfig", False, Source:=Sources.Registry), + New Setting("SystemEulaVersion", 0, Source:=Sources.Registry), + New Setting("SystemCount", 0, Source:=Sources.Registry, Encrypted:=True), + New Setting("SystemLaunchCount", 0, Source:=Sources.Registry, Encrypted:=True), + New Setting("SystemLastVersionReg", 0, Source:=Sources.Registry, Encrypted:=True), + New Setting("SystemHighestSavedBetaVersionReg", 0, Source:=Sources.Registry, Encrypted:=True), + New Setting("SystemHighestBetaVersionReg", 0, Source:=Sources.Registry, Encrypted:=True), + New Setting("SystemHighestAlphaVersionReg", 0, Source:=Sources.Registry, Encrypted:=True), + New Setting("SystemHelpVersion", 0, Source:=Sources.Registry), + New Setting("SystemDebugMode", False, Source:=Sources.Registry), + New Setting("SystemDebugAnim", 9, Source:=Sources.Registry), + New Setting("SystemDebugDelay", False, Source:=Sources.Registry), + New Setting("SystemDebugSkipCopy", False, Source:=Sources.Registry), + New Setting("SystemSystemCache", "", Source:=Sources.Registry), + New Setting("SystemSystemUpdate", 0), + New Setting("SystemSystemActivity", 0), + New Setting("SystemSystemTelemetry", True, Source:=Sources.Registry), + New Setting("CacheDrops", "", Source:=Sources.Registry), + New Setting("CacheConfig", 0, Source:=Sources.Registry), + New Setting("CacheExportConfig", "", Source:=Sources.Registry), + New Setting("CacheSavedPageUrl", "", Source:=Sources.Registry), + New Setting("CacheSavedPageVersion", "", Source:=Sources.Registry), + New Setting("CacheMsOAuthRefresh", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheMsAccess", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheMsProfileJson", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheMsUuid", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheMsName", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheMsV2Migrated", False, Source:=Sources.Registry), + New Setting("CacheMsV2OAuthRefresh", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheMsV2Access", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheMsV2ProfileJson", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheMsV2Uuid", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheMsV2Name", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheNideAccess", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheNideClient", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheNideUuid", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheNideName", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheNideUsername", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheNidePass", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheNideServer", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheAuthAccess", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheAuthClient", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheAuthUuid", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheAuthName", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheAuthUsername", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheAuthPass", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheAuthServerServer", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheAuthServerName", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheAuthServerRegister", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("CacheDownloadFolder", "", Source:=Sources.Registry), + New Setting("CacheJavaListVersion", 0, Source:=Sources.Registry), + New Setting("LoginRemember", True, Source:=Sources.Registry, Encrypted:=True), + New Setting("LoginLegacyName", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("LoginMsJson", "{}", Source:=Sources.Registry, Encrypted:=True), '{UserName: OAuthToken, ...} + New Setting("LoginNideEmail", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("LoginNidePass", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("LoginAuthEmail", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("LoginAuthPass", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("LoginType", McLoginType.Legacy, Source:=Sources.Registry), + New Setting("LoginPageType", 0), + New Setting("LaunchSkinID", "", Source:=Sources.Registry, OnChanged:=Sub() PageLaunchLeft.SkinLegacy.Start()), + New Setting("LaunchSkinType", 0, Source:=Sources.Registry, OnChanged:=AddressOf PageSetupLaunch.UpdateSkinType), + New Setting("LaunchSkinSlim", False, Source:=Sources.Registry), + New Setting("LaunchFolderSelect", ""), + New Setting("LaunchFolders", "", Source:=Sources.Registry), + New Setting("LaunchArgumentTitle", ""), + New Setting("LaunchArgumentInfo", "PCL"), + New Setting("LaunchArgumentJavaSelect", "", Source:=Sources.Registry), + New Setting("LaunchArgumentJavaAll", "[]", Source:=Sources.Registry), + New Setting("LaunchArgumentIndie", 0), + New Setting("LaunchArgumentIndieV2", 4), + New Setting("LaunchArgumentVisible", 5, Source:=Sources.Registry), + New Setting("LaunchArgumentPriority", 1, Source:=Sources.Registry), + New Setting("LaunchArgumentWindowWidth", 854), + New Setting("LaunchArgumentWindowHeight", 480), + New Setting("LaunchArgumentWindowType", 1), + New Setting("LaunchArgumentRam", False, Source:=Sources.Registry), + New Setting("LaunchAdvanceJvm", "-XX:-OmitStackTraceInFastThrow -Djdk.lang.Process.allowAmbiguousCommands=True -Dfml.ignoreInvalidMinecraftCertificates=True -Dfml.ignorePatchDiscrepancies=True"), + New Setting("LaunchAdvanceGame", ""), + New Setting("LaunchAdvanceRun", ""), + New Setting("LaunchAdvanceRunWait", True), + New Setting("LaunchAdvanceDisableJLW", False), + New Setting("LaunchAdvanceDisableLUA", False), + New Setting("LaunchAdvanceGraphicCard", True, Source:=Sources.Registry), + New Setting("LaunchAdvanceGC", 4), + New Setting("LaunchRamType", 0, OnChanged:=AddressOf PageSetupLaunch.UpdateRamType), + New Setting("LaunchRamCustom", 15), + New Setting("LinkLastAutoJoinInviteCode", "", Source:=Sources.Registry), + New Setting("LinkLatencyMode", 0, Source:=Sources.Registry), + New Setting("LinkCustomPeer", ""), + New Setting("LinkEasyTierVersion", -1, Source:=Sources.Registry), + New Setting("ToolHelpChinese", True, Source:=Sources.Registry), + New Setting("ToolDownloadThread", 63, Source:=Sources.Registry), + New Setting("ToolDownloadSpeed", 42, Source:=Sources.Registry, OnChanged:=AddressOf ModNet.UpdateNetTaskSpeedLimitHigh), + New Setting("ToolDownloadSource", 1, Source:=Sources.Registry), + New Setting("ToolDownloadVersion", 1, Source:=Sources.Registry), + New Setting("ToolDownloadTranslate", 0, Source:=Sources.Registry), + New Setting("ToolDownloadTranslateV2", 1, Source:=Sources.Registry), + New Setting("ToolDownloadIgnoreQuilt", True, Source:=Sources.Registry), + New Setting("ToolDownloadCert", False, Source:=Sources.Registry, OnChanged:=AddressOf ModNet.ShouldValidateSslCertificateOnLogin), + New Setting("ToolDownloadMod", 2, Source:=Sources.Registry), + New Setting("ToolModLocalNameStyle", 0, Source:=Sources.Registry), + New Setting("ToolUpdateRelease", False, Source:=Sources.Registry), + New Setting("ToolUpdateSnapshot", False, Source:=Sources.Registry), + New Setting("ToolUpdateReleaseLast", "", Source:=Sources.Registry), + New Setting("ToolUpdateSnapshotLast", "", Source:=Sources.Registry), + New Setting("UiLauncherTransparent", 600, OnChanged:=Sub(Value As Integer) If FrmMain IsNot Nothing Then FrmMain.Opacity = Value / 1000 + 0.4), '避免与 PCL1 设置冲突(UiLauncherOpacity) + New Setting("UiLauncherHue", 180), + New Setting("UiLauncherSat", 80), + New Setting("UiLauncherDelta", 90), + New Setting("UiLauncherLight", 20), + New Setting("UiLauncherTheme", 0, OnChanged:=AddressOf ThemeRefresh), + New Setting("UiLauncherThemeGold", "", Source:=Sources.Registry, Encrypted:=True), + New Setting("UiLauncherThemeHide", "0|1|2|3|4", Source:=Sources.Registry, Encrypted:=True), + New Setting("UiLauncherThemeHide2", "0|1|2|3|4", Source:=Sources.Registry, Encrypted:=True), + New Setting("UiLauncherLogo", True), + New Setting("UiLauncherEmail", False), + New Setting("UiBackgroundColorful", True, OnChanged:=Sub() ThemeRefresh()), '不传入参数 + New Setting("UiBackgroundOpacity", 1000, OnChanged:=AddressOf FormMain.UpdateBackgroundAndTitleBar), + New Setting("UiBackgroundBlur", 0, OnChanged:=AddressOf FormMain.UpdateBackgroundAndTitleBar), + New Setting("UiBackgroundSuit", 0, OnChanged:=AddressOf FormMain.UpdateBackgroundAndTitleBar), + New Setting("UiCustomType", 0, OnChanged:=AddressOf PageSetupUI.OnUiCustomTypeChanged), + New Setting("UiCustomPreset", 0), + New Setting("UiCustomNet", ""), + New Setting("UiLogoType", 1, OnChanged:=AddressOf FormMain.UpdateBackgroundAndTitleBar), + New Setting("UiLogoText", "", OnChanged:=AddressOf FormMain.UpdateBackgroundAndTitleBar), + New Setting("UiLogoLeft", False, OnChanged:=AddressOf FormMain.UpdateBackgroundAndTitleBar), + New Setting("UiMusicVolume", 500), + New Setting("UiMusicStop", False), + New Setting("UiMusicStart", False), + New Setting("UiMusicRandom", True), + New Setting("UiMusicAuto", True), + New Setting("UiHiddenPageDownload", False, OnChanged:=AddressOf PageSetupUI.HiddenRefresh), + New Setting("UiHiddenPageLink", False, OnChanged:=AddressOf PageSetupUI.HiddenRefresh), + New Setting("UiHiddenPageSetup", False, OnChanged:=AddressOf PageSetupUI.HiddenRefresh), + New Setting("UiHiddenPageOther", False, OnChanged:=AddressOf PageSetupUI.HiddenRefresh), + New Setting("UiHiddenFunctionSelect", False, OnChanged:=AddressOf PageSetupUI.HiddenRefresh), + New Setting("UiHiddenFunctionModUpdate", False, OnChanged:=AddressOf PageSetupUI.HiddenRefresh), + New Setting("UiHiddenFunctionHidden", False, OnChanged:=AddressOf PageSetupUI.HiddenRefresh), + New Setting("UiHiddenSetupLaunch", False, OnChanged:=AddressOf PageSetupUI.HiddenRefresh), + New Setting("UiHiddenSetupUi", False, OnChanged:=AddressOf PageSetupUI.HiddenRefresh), + New Setting("UiHiddenSetupLink", False, OnChanged:=AddressOf PageSetupUI.HiddenRefresh), + New Setting("UiHiddenSetupSystem", False, OnChanged:=AddressOf PageSetupUI.HiddenRefresh), + New Setting("UiHiddenOtherHelp", False, OnChanged:=AddressOf PageSetupUI.HiddenRefresh), + New Setting("UiHiddenOtherFeedback", False, OnChanged:=AddressOf PageSetupUI.HiddenRefresh), + New Setting("UiHiddenOtherVote", False, OnChanged:=AddressOf PageSetupUI.HiddenRefresh), + New Setting("UiHiddenOtherAbout", False, OnChanged:=AddressOf PageSetupUI.HiddenRefresh), + New Setting("UiHiddenOtherTest", False, OnChanged:=AddressOf PageSetupUI.HiddenRefresh), + New Setting("VersionAdvanceJvm", "", Source:=Sources.Instance), + New Setting("VersionAdvanceGame", "", Source:=Sources.Instance), + New Setting("VersionAdvanceAssets", 0, Source:=Sources.Instance), + New Setting("VersionAdvanceAssetsV2", False, Source:=Sources.Instance), + New Setting("VersionAdvanceJava", False, Source:=Sources.Instance), + New Setting("VersionAdvanceRun", "", Source:=Sources.Instance), + New Setting("VersionAdvanceRunWait", True, Source:=Sources.Instance), + New Setting("VersionAdvanceDisableJLW", False, Source:=Sources.Instance), + New Setting("VersionAdvanceDisableLUA", False, Source:=Sources.Instance), + New Setting("VersionAdvanceDisableModUpdate", False, Source:=Sources.Instance), + New Setting("VersionAdvanceGC", 0, Source:=Sources.Instance), + New Setting("VersionRamType", 2, Source:=Sources.Instance, OnChanged:=AddressOf PageInstanceSetup.OnVersionRamTypeChanged), + New Setting("VersionRamCustom", 15, Source:=Sources.Instance), + New Setting("VersionRamOptimize", 0, Source:=Sources.Instance), + New Setting("VersionArgumentTitle", "", Source:=Sources.Instance), + New Setting("VersionArgumentInfo", "", Source:=Sources.Instance), + New Setting("VersionArgumentIndie", -1, Source:=Sources.Instance), + New Setting("VersionArgumentIndieV2", False, Source:=Sources.Instance), + New Setting("VersionArgumentJavaSelect", "使用全局设置", Source:=Sources.Instance), + New Setting("VersionServerEnter", "", Source:=Sources.Instance), + New Setting("VersionServerLogin", 0, Source:=Sources.Instance, OnChanged:=AddressOf PageInstanceSetup.OnVersionServerLoginChanged), + New Setting("VersionServerNide", "", Source:=Sources.Instance), + New Setting("VersionServerAuthRegister", "", Source:=Sources.Instance), + New Setting("VersionServerAuthName", "", Source:=Sources.Instance), + New Setting("VersionServerAuthServer", "", Source:=Sources.Instance) + }).ToDictionary(Function(e) e.Key) + + Private Enum Sources + Normal + Registry + Instance + End Enum + Private Class Setting + Public Key As String + ''' + ''' 若已调用过 Get 方法,则为当前值;否则为 Nothing。 + ''' + Public Value = Nothing + Public Encrypted As Boolean + Public DefaultValue + Public Source As Sources + ''' + ''' 当设置项的值实际被改变时触发,参数为新值。 + ''' + Public OnChanged As Action(Of Object) + ''' + ''' 该设置的值的实际类型。 + ''' + Public Type As Type + Public Sub New(Key As String, Value As Object, Optional Source As Sources = Sources.Normal, Optional Encrypted As Boolean = False, Optional OnChanged As Action(Of Object) = Nothing) + Try + Me.Key = Key + Me.DefaultValue = Value + Me.Encrypted = Encrypted + Me.Source = Source + Me.Type = If(Value, "").GetType + Me.OnChanged = OnChanged + Catch ex As Exception + Log(ex, "初始化设置项失败", LogLevel.Feedback) '#5095 的 fallback + End Try + End Sub + + ''' + ''' 立即将当前的 Value 写入对应的注册表或文件。 + ''' + Public Sub Save(Optional Instance As McInstance = Nothing) + Dim Value As String = Me.Value + If Encrypted Then + Try + If Value Is Nothing Then Value = "" + Value = SecretEncrypt(Value, "PCL" & Identify) + Catch ex As Exception + Log(ex, "加密设置失败:" & Key, LogLevel.Developer) + End Try + End If + Select Case Source + Case Sources.Normal + WriteIni("Setup", Key, Value) + Case Sources.Registry + WriteReg(Key, Value) + Case Sources.Instance + If Instance Is Nothing Then Throw New Exception($"保存版本独立设置 {Key} 时未提供目标版本") + WriteIni(Instance.PathVersion & "PCL\Setup.ini", Key, Value) + End Select + End Sub + End Class + + ''' + ''' 改变某个设置项的值。 + ''' + Public Shared Sub [Set](Key As String, Value As Object, Optional Instance As McInstance = Nothing) + Dim Entry As Setting = Nothing + If Not Entries.TryGetValue(Key, Entry) Then Throw New KeyNotFoundException("未找到设置项:" & Key) + Try + '判断是否一致 + If Entry.Value Is Nothing Then [Get](Key, Instance) + Value = CTypeDynamic(Value, Entry.Type) + If Entry.Value = Value Then Return + '设置新值 + Entry.Value = Value + Entry.Save(Instance) + '触发改变事件(必须在保存之后,以保证 VersionServerLogin 之类的在事件中读取到的是最新的值) + If Entry.OnChanged IsNot Nothing Then Entry.OnChanged.Invoke(Entry.Value) + Catch ex As Exception + Log(ex, "设置设置项时出错(" & Key & ", " & Value & ")", LogLevel.Feedback) + End Try + End Sub + ''' + ''' 写入某个未经加密的设置项。 + ''' 若该设置项经过了加密,则会抛出异常。 + ''' + Public Shared Sub SetSafe(Key As String, Value As Object, Optional Instance As McInstance = Nothing) + Dim Entry As Setting = Nothing + If Not Entries.TryGetValue(Key, Entry) Then Throw New KeyNotFoundException("未找到设置项:" & Key) + If Entry.Encrypted Then Throw New InvalidOperationException("禁止写入加密设置项:" & Key) + [Set](Key, Instance, Instance) + End Sub + + ''' + ''' 获取某个设置项的值。 + ''' + Public Shared Function [Get](Key As String, Optional Instance As McInstance = Nothing) + Dim Entry As Setting = Nothing + If Not Entries.TryGetValue(Key, Entry) Then Throw New KeyNotFoundException("未找到设置项:" & Key) + If Entry.Value IsNot Nothing Then Return Entry.Value + '对部分设置强制赋值 + Static ForcedSettings As New Dictionary(Of String, Object) From { + {"UiHiddenPageLink", True}, + {"UiHiddenSetupLink", True} + } + Dim ForcedSetting As Object = Nothing + If ForcedSettings.TryGetValue(Key, ForcedSetting) Then + Entry.Value = ForcedSetting + Return Entry.Value + End If + '正常读取 + Try + Dim GotValue As String = Nothing '先用 String 储存,避免类型转换 + Dim DefaultValue As String = If(Entry.Encrypted, SecretEncrypt(Entry.DefaultValue, "PCL" & Identify), Entry.DefaultValue) + Select Case Entry.Source + Case Sources.Normal + GotValue = ReadIni("Setup", Key, DefaultValue) + Case Sources.Registry + GotValue = ReadReg(Key, DefaultValue) + Case Sources.Instance + If Instance Is Nothing Then + Throw New Exception($"读取版本设置 {Key} 时未提供目标版本") + Else + GotValue = ReadIni(Instance.PathVersion & "PCL\Setup.ini", Key, DefaultValue) + End If + End Select + If Entry.Encrypted Then + If GotValue = DefaultValue Then + GotValue = Entry.DefaultValue + Else + Try + GotValue = SecretDecrypt(GotValue, "PCL" & Identify) + Catch ex As Exception + Log(ex, "解密设置失败:" & Key, LogLevel.Developer) + GotValue = Entry.DefaultValue + Entry.Value = Entry.DefaultValue + Entry.Save(Instance) + End Try + End If + End If + Entry.Value = CTypeDynamic(GotValue, Entry.Type) + Catch ex As Exception + Log(ex, "读取设置失败:" & Key, LogLevel.Hint) + Entry.Value = CTypeDynamic(Entry.DefaultValue, Entry.Type) + End Try + Return Entry.Value + End Function + ''' + ''' 获取某个未经加密的设置项的值。 + ''' 若该设置项经过了加密,则会抛出异常。 + ''' + Public Shared Function GetSafe(Key As String, Optional Instance As McInstance = Nothing) + Dim Entry As Setting = Nothing + If Not Entries.TryGetValue(Key, Entry) Then Throw New KeyNotFoundException("未找到设置项:" & Key) + If Entry.Encrypted Then Throw New InvalidOperationException("禁止读取加密设置项:" & Key) + Return [Get](Key, Instance) + End Function + + ''' + ''' 初始化某个设置项的值。 + ''' + Public Shared Sub Reset(Key As String, Optional Instance As McInstance = Nothing) + Dim Entry As Setting = Nothing + If Not Entries.TryGetValue(Key, Entry) Then Throw New KeyNotFoundException("未找到设置项:" & Key) + Try + '判断是否一致 + If Entry.Value Is Nothing Then [Get](Key, Instance) + If Entry.Value = Entry.DefaultValue Then Return + '设置新值 + Entry.Value = Entry.DefaultValue + Select Case Entry.Source + Case Sources.Normal + DeleteIniKey("Setup", Key) + Case Sources.Registry + DeleteReg(Key) + Case Sources.Instance + If Instance Is Nothing Then Throw New Exception($"重置版本设置 {Key} 时未提供目标版本") + DeleteIniKey(Instance.PathVersion & "PCL\Setup.ini", Key) + End Select + '触发改变事件 + If Entry.OnChanged IsNot Nothing Then Entry.OnChanged.Invoke(Entry.Value) + Catch ex As Exception + Log(ex, "重置设置项时出错(" & Key & ")", LogLevel.Feedback) + End Try + End Sub + + ''' + ''' 获取某个设置项的默认值。 + ''' + Public Shared Function GetDefault(Key As String) As String + Return Entries(Key).DefaultValue + End Function + + ''' + ''' 对应的注册表或文件是否已经储存了某个设置项。 + ''' 若改成了和默认值一样的,在 2.12.3- 会储存更改,在 2.12.4+ 不会储存更改。 + ''' + Public Shared Function HasSaved(Key As String, Optional Instance As McInstance = Nothing) As Boolean + Select Case Entries(Key).Source + Case Sources.Normal + Return HasIniKey("Setup", Key) + Case Sources.Registry + Return HasReg(Key) + Case Else 'Source.Instance + If Instance Is Nothing Then Throw New Exception($"判断版本设置 {Key} 是否存在时未提供目标版本") + Return HasIniKey(Instance.PathVersion & "PCL\Setup.ini", Key) + End Select + End Function + + ''' + ''' 当前版本改变时,要求所有版本独立设置需要重新读取。 + ''' + Public Shared Sub MakeInstanceDirty() + For Each Entry In Entries.Values + If Entry.Source = Sources.Instance Then Entry.Value = Nothing + Next + 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 d7df960..89dc208 100644 --- a/Plain Craft Launcher 2/Pages/PageSpeedLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSpeedLeft.xaml.vb @@ -140,7 +140,7 @@ Catch ex As Exception Log(ex, "更新下载管理显示失败(" & Loader.State.ToString & ")", LogLevel.Feedback) End Try - ElseIf Not (Loader.State = LoadState.Aborted OrElse Loader.State = LoadState.Finished) Then + ElseIf Not (Loader.State = LoadState.Interrupted OrElse Loader.State = LoadState.Finished) Then Try #Region "没有卡片且未中断或完成,添加新的卡片" Dim CardXAML As String = " @@ -194,7 +194,7 @@ RightCards.Remove(Loader.Name) LoaderTaskbar.Remove(Loader) Log($"[Taskbar] 关闭下载管理卡片:{Loader.Name},且移出任务列表") - RunInThread(Sub() Loader.Abort()) + RunInThread(Sub() Loader.Interrupt()) End Sub '如果已经失败,再刷新一次,修改成失败的控件 If Loader.State = LoadState.Failed Then diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 1169d14..5acf86f 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -383,7 +383,7 @@ PageSetupLeft.xaml - + PageSetupLaunch.xaml @@ -396,6 +396,7 @@ PageSetupUI.xaml + PageSpeedLeft.xaml @@ -760,6 +761,7 @@ + @@ -874,9 +876,6 @@ - - - @@ -922,7 +921,10 @@ - + + + + \ 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 a6b9e81..f337437 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 deleted file mode 100644 index 7a5c5e5..0000000 --- a/Plain Craft Launcher 2/Resources/ModData.txt +++ /dev/null @@ -1,23850 +0,0 @@ - -industrial-craft@|工业时代2 (Industrial Craft 2) -@redpower2-core|红石力量2 (RedPower2) -buildcraft@|建筑 (BuildCraft) -forestry@|林业* -railcraft@railcraft-reborn|铁路*¨railcraft-reborn|铁路 (Railcraft) - - -@ee2|等价交换2 (Equivalent Exchange 2) -forgotten-nature|被遗忘的大自然* -touhou-item-mod|辉夜姬的五难题 (五つの難題MOD+ ~ Touhou Items) -secretroomsmod|密室 (SecretRoomsMod) -the-camping-mod|野营* -usefulfood|有用的食物 (UsefulFood) -powerconverters-portablejims-fork|能源转换 (PowerConverters) - - -modular-forcefield-system|模块化力场系统* -minechem-recompile|化学 (MineChem) - 非官方重编译版¨minechem-archive|化学 (MineChem)¨73373|化学 (MineChem) - 已失效 -iron-chests@|更多箱子*¨iron-chests-for-fabric@cyberanner-ironchest|更多箱子 (Iron Chests)¨iron-chests-fabric@|更多箱子 (Iron Chests) -balkons-weaponmod|更多武器 (Balkon's WeaponMod) -advanced-machines|高级机械 (AdvancedMachines) - Chocohead版¨@advanced-machines-uuum|高级机械 (AdvancedMachines) - Immibis版 -advanced-solar-panels|高级太阳能* -nuclear-control-2|核电控制2* - -better-dungeons|更好的地牢/寻找巧克力 (Better Dungeons / Chocolate Quest) -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) -player-api|玩家API (Player API)¨playerapi|玩家API (Player API) - - - - - -not-enough-items-1-8@nei|NEI物品管理器 (Not Enough Items)¨notenoughitems|NEI物品管理器 (Not Enough Items) - - - -custom-npcs|自定义NPC (Custom NPCs) -millenaire|千年村庄 (Millénaire) -clay-soldiers-mod|粘土士兵* -mo-creatures|更多生物 (Mo' Creatures) - -extrabiomesxl|更多生态群系 (ExtraBiomesXL) - - - - -tale-of-kingdoms|王国* - - - - - -the-twilight-forest|暮色森林* - -portal-gun|传送枪* -simpleores@|简单矿石 (SimpleOres) -smart-moving|灵活动作*¨smart-moving-reboot|灵活动作 (Smart Moving) -easycrafting|轻松合成 (Easy Crafting) - - - - -computercraft@|电脑 (Computer Craft) - -inventory-tweaks|R键整理* - -minecraft-minions|召唤奴仆* -ender-storage@|末影存储*¨ender-storage-1-8|末影存储 (Ender Storage) - - - -forge-nbtedit-for-1-7-10|内置NBT编辑器 (In-Game NBTEdit) - - - - -rotarycraft|旋转工艺 (RotaryCraft) - -applied-energistics-1@ae1|应用能源* - - - - -Universal-Electricity|通用电力* -@better-than-wolves|比狼好 (Better Than Wolves) -aether@|天境 (The Aether) -@miscperipherals|电脑外设 (MiscPeripherals) - -assassincraft-assassins-creed-mod|刺客信条 (AssassinCraft) - -custom-recipes|自定义合成表* -minecraft-comes-alive-mca|虚拟人生/凡家物语 (Minecraft Comes Alive) - - -forge-essentials-74735@forge-essentials - -translocators-1-8@translocators|转运器 (Translocators)¨translocators|转运器* -craftguide|G键合成表 (CraftGuide) - -biomes-o-plenty@|超多生物群系 (Biomes O' Plenty) - - -enhanced-portals-3|增强传送门3* -compact-solars|压缩太阳能阵列 (CompactSolars / Compact Solar Arrays) -bibliocraft|收藏馆 (BiblioCraft) -natura|自然* -atomic-science|原子科学* - -atum|阿图姆:沙漠之旅/亚图姆:金沙之旅 (Atum 2: Return to the Sands) -blockphysics_by_id_miner|方块物理学 (BlockPhysics) - - -remain-in-motion|运动红石机构 (Remain in Motion) - -openperipheralcore|开放式电脑外设 (OpenPeripheral) - 核心¨openperipheraladdons|开放式电脑外设 (OpenPeripheral) - 附加¨openperipheralintegration|开放式电脑外设 (OpenPeripheral) - 联动 -modular-powersuits@modularpowersuits|模块化动力套装* - - - - -@immibis-microblocks|Immibis的小方块 (Immibis's Microblocks) - - -@redlogic|红石逻辑 (RedLogic) -powercraft-2|能量工厂 (Power Craft) -obsidiplates|黑曜石压力板 (ObsidiPlates) -@infinitubes|终极管道 (InfiniTubes) -flatsigns|平置牌子 (FlatSigns) -switches|按钮开关* -artifice|工匠的手艺* - -archimedes-ships|阿基米德之舟 (Archimedes' Ships) -cubebots|立方体机器人 (CubeBots) -truss-mod|桁架* -mutant-creatures-mod|突变生物 (Mutant Creatures) - -logistics-pipes@|物流管道* - - -magic-bees|魔法蜜蜂* -carpenters-blocks|木匠方块 (Carpenter's Blocks) -mystcraft|神秘岛*¨@mystcraft|神秘岛 (Mystcraft) - Archived - - - -minesweeper-mod|扫雷 (Minesweeper) -minechess|国际象棋 (MineChess) - - - -@factorization|工厂化/因式分解 (Factorization) - - - - -project-red-base|红石计划 (ProjectRed) - 基础¨project-red-illumination|红石计划:照明 (Project Red - Illumination)¨project-red-core@|红石计划 (ProjectRed) - -dimensionaldoors@|次元门 (Dimensional Doors) -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) -alchemyplusplus|炼金++ (AlchemyPlusPlus) -better-bows|更好弓箭系统 (Better Archery) -mumblelink|Mumble语音链接* -ender-io@enderio|末影接口 (Ender IO) - - - -electrodynamics@|电动力学* -elite-armageddon¨mc-1-6-4-solar-apocalypse -mekanism@|通用机械* - - -magic-crusade-rpg-mod|魔法远征:魔法十字军 (Magic Crusade) -invasions|入侵 (Invasion) -mb-battlegear-2|挖矿与砍杀:双持与战备 2 (Mine & Blade: Battlegear 2) - -galacticraft-legacy@|星系 (GalactiCraft) - - - -journeymap@|旅行地图 (JourneyMap) - -equivalent-exchange-classic|等价交换经典版* -underground-biomes|科学地质*¨undergroundbiomesconstructs|科学地质 (Underground Biomes) -fpsplus-lagfixes|FPS优化 (FPS Plus) -ars-magica-2|魔法艺术2* - -highlands|高地* -doggy-talents|小狗天才* -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|神秘工匠* - - - -xycraft -chococraft@|陆行鸟 (ChocoCraft) -pams-harvestcraft@|潘马斯农场 (Pam's HarvestCraft) - -opis - -openblocks|开放式方块 (OpenBlocks) - - - - -randomcraft-v0-1-0|随机工艺 (RandomCraft) -dragon-mounts|龙坐骑/龙骑士* -animal-bikes|动物坐骑* - - -electro-magic-tools|电力魔法工具 (Electro-Magic Tools) -forbidden-magic|禁忌魔法* -mobtalker2|怪物交谈2 (MobTalker 2) -icbm-classic@icbm|洲际导弹 (ICBM)¨icbm|洲际导弹 (ICBM) - 已停更 -thaumic-infusion|神秘注魔* -thaumic-exploration|神秘探险* -deconstruction-table|解构工作台* - - -kcs-growable-ores@|可生长矿石 (Kc's Growable Ores) - - - - -waila|高亮信息拓展 (What am I looking at) -chaoscraft-2|混沌工艺 (ChaosCraft) -scenter-mod|矿物追踪 (Scenter) - -ex-nihilo|无中生有*¨ex-nihilo-2|无中生有 (Ex Nihilo) -reactorcraft|反应堆工艺 (ReactorCraft) -bctools|BC扩展:更多工具 (Buildcraft Tools) -additional-buildcraft-objects|更多管道* -foundry|金属工坊* -gravitation-suite|重力装甲* -redstone-arsenal@|红石兵工厂* -big-reactors|大型反应堆* - -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) - - -per-fabrica-ad-astra-geologica|自合成至星辰:真实地理 (Per Fabrica Ad Astra: Geologica) - -redstone-furnace|红石炉* -pneumaticcraft@pneumaticcraft-repressurized|气动工艺 (PneumaticCraft: Repressurized)¨pneumaticcraft-repressurized|气动工艺 (PneumaticCraft: Repressurized) - -thirst-mod|饮水* -tubes|管道 (Tubes!) -pchan3-steamship-steamboat-pirates|飞艇与汽船 (SteamShip - SteamBoat and Pirates) - -betterfarming|农业增强 (Better Farming) - -lots-of-food|更多食物 (Lots of Food) - - -aquaculture@|水产业2/水产品2 (Aquaculture 2) -project-bench|高级工作台* - -apples-plus|更多苹果 (Apples+) - -qcraft|量子物理 (QCraft) - -mad-science|疯狂科学* - -enviromine|更多生存要素 (EnviroMine) - -the-erebus|混沌之地* -emerald-mod|绿宝石 Mod* -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|小型炼金术* - - - - - -mcicraft|MCI工艺 (MCI Craft) - - -engineers-toolbox|工程师工具箱 (Engineer's Toolbox) -e-tools-redstone-powered-tools|电子工具:红石供电工具 (E-Tools: Redstone Powered Tools) - -modular-systems|模块化系统* - -traincraft|火车工业* -hydraulicraft|液压工艺* -utilities3|流体能量 (Utilities³) - - -metallurgy|冶金* - -school-mod-forge-1-14|学校 (School Mod) -witchery|巫术* -growthcraft|生长工艺 (GrowthCraft)¨growthcraft-community-edition|生长工艺 (GrowthCraft) -gregtech-5-unofficial|格雷科技5 (GregTech 5) - -mantle@|地幔* -customoregen|自定义矿物生成 (Custom Ore Generation) -littlemaidmobx|女仆 (LittleMaidMob) -botania@|植物魔法*¨botania-fabric|植物魔法 (Botania) -alternate-terrain-generation|交替性地形生成* -gendustry|基因工业* - - - - -betterfonts|更好的字体 (BetterFonts) -zelda-sword-skills|塞尔达剑技 (ZELDA SWORD SKILLS) - -minemenu|我的菜单 (MineMenu) -symcalc|对称度运算仪* - - -jabba|更好的储物桶 (Just Another Better Barrel Attempt) -mcheli-minecraft-helicopter-mod|MC直升机 (MC Helicopter Mod) -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)¨steves-factory-manager-reborn|史蒂夫工厂管理 (Steve's Factory Manager) - - -thaumcraftgates|奥法管道 (ThaumcraftGates) -thaumcraft-recipes|神秘合成* -player-heads-forge|玩家死亡掉头 (Player Heads) -notenoughkeys|更好的按键控制 (Not Enough Keys) - -pet-bats|宠物蝙蝠* - -crafting-pillar-mod|合成柱* -ultratech|次元科技 (UltraTech) -@advanced-repulsion-systems|高级排斥系统 (Advanced Repulsion Systems) -atomicstrykers-infernal-mobs|稀有精英怪 (AtomicStryker's Infernal Mobs) -applecore|苹果核 (AppleCore) - - - -thaumic-energistics|神秘能源* - -chisel|凿子* -nuclearcraft-mod@nuclearcraft|核电工艺 (NuclearCraft) -opencomputers@|开放式电脑 (Open Computers) -elemental-stones|元素之石* - -waila-nbt|万用高亮显示 (Waila NBT) -thaumcraft-node-tracker|神秘节点追踪* -geochests|箱载世界* -parachutemod|降落伞 (Parachute) -gem-buffs-infinite-potion-effects|宝石效果/增益宝石 (Gem Buffs) -rftools@|RF工具箱 (RFTools) -atomicstrykers-magic-yarn|AtomicStryker的魔法线 (AtomicStryker's Magic Yarn) - -teds-old-world-gen-mod|怀旧地形 (Old World Gen) - -academycraft|超能力/学园都市 (AcademyCraft) - -the-spice-of-life|生活调味料 (The Spice of Life) - - - -storage-drawers@storagedrawers|储物抽屉* -wintercraft-gruntpie224|冬天的世界 (Wintercraft) - - -shincollecraft|深海舰队收藏 (ShinColle)¨shincolle|深海舰队收藏 (ShinColle) - -unicode-font-fixer|Unicode字体修复 (UnicodeFontFixer) -lanteacraft|星际之门 (LanteaCraft) -matteroverdrive-17-edition|超能物质 (Matter Overdrive)¨matteroverdrive-legacy|超能物质 (Matter Overdrive) -tainted-magic|污秽魔法* -minetweaker3 -treecapitator|砍树* -insta-house|即时建造* -multi-page-chest|多页箱子 (Multi-Page Chest) - -draconic-evolution@|龙之进化/龙之研究* -galacticraft-add-on-more-planets@more-planets|更多行星 (More Planets) -thermal-foundation@|热力基本* - - -ding@|界面进入提醒* -ender-utilities@|末影设备* -magical-crops|魔法作物* -headcrumbs|更多头颅* -ex-astris|星辉生万物* -xelitez-frostcraft|冰冻工艺 (FrostCraft) -hardcore-ender-expansion@|极限末地生存* -more-fun-quicksand-mod|更多流沙* -fastcraft|快速工艺 (FastCraft) -forgeautoshutdown-1-12-2@forgeautoshutdown - -sao-ui|刀剑神域UI (Sword Art Online UI / SAO UI) -extratic|匠魂扩展 (Extra TiC) -dimensional-pockets|四次元口袋 (DimensionalPockets) -joint-block-1-7-10|机器方块 (JointBlock) -security-craft@|安全工艺* -buildcraft-additions|建筑扩充* -bedrockium-mod|基岩工艺* -blocksteps -thaumic-horizons@|神秘视界* -modtweaker@ -lootbags|战利品 (Loot Bags) -compact-lava-generator|高级地热发电机* -project-zulu|祖鲁* - -chinacraft|华夏文明 (ChinaCraft) - - -betterbeginnings-mod|更好的开局 (Better Beginnings) -utility-mobs|工具怪物* -hunger-overhaul|饥饿改革* -jei@|JEI物品管理器 (Just Enough Items) -jeiaddons -magneticraft|磁场工艺 (MagnetiCraft) -chromaticraft|缤纷纪元 (ChromatiCraft) -immersive-engineering@immersiveengineering|沉浸工程* -armourers-workshop@|时装工坊 (Armourer's Workshop) -plants-to-ores|植物矿石* -slash|命令强化* -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|神秘基础学*¨thaumic-bases-unofficial|神秘基础学 (Thaumic Bases) -essentialcraft-3|源质魔法3 (EssentialCraft 3) - -hardcore-questing-mode@hqm|困难任务* -unidict@|矿辞统一 (UniDict) -thermal-dynamics@|热动力学* -zoology|动物学* -plant-mega-pack-reupload|植物世界 (Plant Mega Pack) -thaumic-revelations|神秘启示录* - -warp-book|传送书* -ex-compressum@|压缩工具* -simply-jetpacks|简易喷气背包* -blood-arsenal|血液兵工厂* -sim-u-kraft-old|模拟城市 (Sim-U-Kraft) -superheroes-unlimited|超级英雄无限* -oceancraft-mod|海洋世界 (Oceancraft) - -more-enchantments-legacy|更多附魔 (More Enchantments) -witching-gadgets|巫师宝具* - -buildcraft-compat@|建筑兼容* -extrabotany|额外植物学 (ExtraBotany) -botania-unofficial|植物魔法非官方版 (Botania Unoffical) -angry-pixel-the-betweenlands-mod|交错次元 (The Betweenlands) -real-first-person-render|真实的第一人称 (Real First Person 2) - - -custom-stuff-3|自定义物品3* -lockdown|地图生成锁定* -avaritia|无尽贪婪*¨avaritia-1-10|无尽贪婪 (Avaritia) -minecraft-flight-simulator@immersive-vehicles-official-content-pack|飞行模拟*¨transport-simulator-official-vehicle-set|飞行模拟 (Minecraft Flight Simulator) -essential-thaumaturgy|源质神秘学* -abyssalcraft|深渊国度 (AbyssalCraft) -calculator|运算工艺* -sextiarysector2 -warpdrive|曲率驱动 (WarpDrive) -futurepack@|飞向未来 (Futurepack Mod) -hbms-nuclear-tech-mod@ntm|HBM的核科技 (HBM's Nuclear Tech Mod) -agricraft@|农业工艺 (AgriCraft) -arcane-engineering|奥法工程学* -immersive-integration -ae2-stuff -minetweaker-recipemaker|可视化合成表编辑器 (MineTweaker RecipeMaker) -thaumic-dyes|神秘染料* -gadomancy|魔像秘经* -inventory-pets|背包宠物* -levels|装备等级* -keeping-inventory -orespawn|矿石菌种 (OreSpawn) -reliquary-reincarnations@|圣遗物 (Reliquary Reincarnations (Reliquary) / Xeno's Reliquary)¨reliquary|圣遗物 (Reliquary Reincarnations* / Xeno's Reliquary) -mo-bends@mobends|更多弯曲 (Mo' Bends) -quark@|夸克* - -official-divinerpg@divinerpg|神圣RPG (DivineRPG) -harvest-festival|丰收物语* -tough-as-nails@|意志坚定* -non-update|不再有更新* -clayium|粘土工业* -better-storage|更好的储存* -davincis-vessels|达芬奇之舟/达芬奇的船* -bspkrscore|bspkrs核心 (bspkrsCore)¨bspkrscore-updated|bspkrs核心 (bspkrsCore) -techguns|科技枪* -iron-backpacks|特殊背包* -openmodularturrets|开放式炮台 (OpenModularTurrets) -technomancy|量子魔法* -quantumflux|量子通量 (QuantumFlux) -blocksniffer|方块探测 (Block Sniffer) -dragonapi -electricraft|电力工艺 (ElectriCraft) -candycraft|糖果世界 (CandyCraft) - -minefantasy2|我的幻想2 (MineFantasy2) - -rails-of-war|铁路战争 (Rails of War) -actually-additions@|实用拓展* -galaxy-space-addon-for-galacticraft@galaxy-space|星空 (Galaxy Space) -latiao-craft|辣条工艺* - -meteorcraft|陨石工艺 (MeteorCraft) -iguanas-tinker-tweaks|匠魂增强* -arrow-cam|箭矢视角 (Arrow Cam Mod) -tea-the-story|茶风·纪事 (Tea the Story)¨2668920|茶风·纪事 (Tea the Story) - 资源包-音乐补充包 -techreborn|科技复兴 (Tech Reborn) -infusinbrewing|注魔酿造 (Infusion Brewing) -jurassicraft|侏罗纪时代 (JurassiCraft) -eternal-singularity|永恒奇点* -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|耐久信息显示 (ArmorStatusHUD) -wanionlib@ -llibrary - - - - - - - - - - - -environmental-tech@|环境科技* - -magic-cookies|魔法饼干* -thaumic-potatoes|神秘土豆* -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@|机会方块* -gun-customization -endercore@|末影核心 (EnderCore) -brandons-core@ -cofh-core@|CoFH核心 (CoFH Core) -statuseffecthud|状态信息显示 (StatusEffectHUD) -lambdalib -redstonic|红石电子* -libvulpes -ye-gamol-chattels|伊加墨的财产* -ivtoolkit -wolf-armor-and-storage|狼铠 (Wolf Armor and Storage) -better-records|更好的播放器* -worldedit|创世神 (WorldEdit) - - -worldeditcui¨worldeditcui-fabric@worldedit-cui -ztones - -dummycore¨dummycore-unofficial -extra-utilities|更多实用设备* -openmodslib|开放式模组库 (OpenModsLib) -embers|余烬* -neat@|极简血量显示*¨neat-fabric-quilt|极简血量显示 (Neat) -mob-properties|怪物属性* -ganys-surface|Gany的世界 (Gany's Surface) - -ezstorage|EZ存储 (EZStorage) -ichunutil@ -intangible - -forge-multipart-cbe@cb-multipart¨forge-multi-part -the-titans-mod|泰坦生物 (The Titans)¨the-titans-legacy|泰坦生物 (The Titans) - 旧 -enchiridion -stimmedcow-nomorerecipeconflict|合成冲突消除 (NoMoreRecipeConflict) -tinker-i-o|工匠接口 (Tinker I/O) -woot|生物工厂* - -thermal-expansion|热力膨胀* -realistic-terrain-generation|真实地形生成*¨realistic-terrain-generation-plus|真实地形生成 (Realistic Terrain Generation) - RTG 原作者继续开发的分支 -mob-rebirth@|怪物重生* -diseasecraft|疾病 (Disease Craft) -zombie-infection|僵尸感染* -astral-sorcery|星辉魔法* -neotech|全新科技 (NeoTech) -apocalypse-mod|启示录 (Apocalypse) -bookshelf-api-library - -movingworld -botania-garden-of-glass@gardenofglass|水晶花园 (Garden of Glass) -@tubestuff|RP增强 (Tube Stuff) -tiny-progressions|微型自动化* - -baubles-stuff|更多首饰* -thaumaturgical-knowledge|神秘奥义* -advanced-thaumaturgy-2|高等神秘学 (Advanced Thaumaturgy) -INpureCore -atomicstrykers-battle-towers|战斗高塔 (AtomicStryker's Battle Towers) -reborncore|重生核心 (Reborn Core) -steves-carts-reborn|史蒂夫矿车:重生 (Steve's Carts Reborn) -refined-relocation|简单分类* -gilded-games-util -dangerrpg|危险RPG (Danger RPG) -malisisdoors|更多门 (MalisisDoors) - -jaffa-foods-a-harvestcraft-addon|更多有趣的食物 (Just Another Fun Food Addon) -thermal-smeltery|热力冶炼厂* - -malisiscore -valkyrielib@ -waila-harvestability -mixed-magic|混合魔法* -hwyla@ -crafttweaker@ - -real-time-chat-translation-mod|实时聊天翻译* - -practical-logistics-2|实用物流监控2* -energyadditions|高级能源 (EnergyAdditions) -advanced-generators@|高级发电机* -bdlib - -pressure-pipes|压力管道* -onlinepictureframe|在线相框显示 (OnlinePictureFrame) -super-circuit-maker|超级电路* -switch-bow -minecolonies@|模拟殖民地 (MineColonies) - -mcjtylib@ -mcmultipart -aroma1997s-dimensional-world|Aroma1997的维度世界 (Aroma1997's Dimensional World) -project-73926|超级合成框架 (Super Crafting Frame) -akashic-tome@|阿卡什宝典* -morph-o-tool@|变形工具 (Morph-o-Tool) -decocraft@|装饰工艺* -refined-storage@|精致存储* -deep-resonance@|深度共振* - - - -clockwork-phase|时之沙* - -autoreglib@ -roots|根源魔法* -guide-api|指南 (Guide-Api)¨@guide-api-legacy|指南 (Guide-Api) - Archive -fraghappy-reborn -genetics-reborn|基因重生* - -router-reborn|路由重生* - -coroutil@ -vanilla-magic|原生魔法* -taoism|御灵* -essentialcraft-4-unofficial|源质魔法4非官方版 (EssentialCraft 4 Unofficial) -celestial-craft|天体* -lost-thaumaturgy|失落神秘 (Pengu's Lost Thaumaturgy) -compact-machines|更多空间/压缩空间* - -ex-nihilo-omnia|无中生有-世间万物* -last-sword-you-will-ever-need-mo|最终之剑 (The Last Sword You Will Ever Need Mod) -the-last-sword-you-will-ever-need-reboot|最终之剑:重生* - -ftb-library-legacy-forge|FTB Library(旧版) (FTB Library (Forge) (Legacy)) - - -thaumic-potatoes-2|神秘土豆2* -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|方块酱* - - - -magia-naturalis@|自然魔法* -sbm-wooden-shears|木剪刀 (Wooden Shears) - -schools-of-magic|魔法学院 (Schools of Magic) -aether-aspects|天境要素扫描* -arcane-arteries|奥法献祭学* -thaumic-palmistry -one-click-crafting|一键合成 (One click crafting) -essential-thaumaturgy-unofficial|源质神秘学(非官方版)* -wireless-crafting-terminal|无线合成终端* -waila-plugins|Waila 插件* -appleskin@|苹果皮 (AppleSkin) -tcbotaniaexoflame|奥术投射 (TCBotaniaExoflame) -thaumic-equivalence|奥法置换* -thaumcraft-research-helper|神秘研究小助手* -thaumic-upholstry|神秘装饰* -thaumic-expansion|神秘膨胀* -nodal-mechanics|节点力学* -transmute-liquids-addon-for-thaumcraft-4|液体嬗变 (Transmute Liquids) -thaumores|奥能矿物 (ThaumOres) -notenoughthaumcrafttabs|无限神秘标签页 (Not Enough Thaumcraft Tabs) -natures-compass@|自然罗盘/生物群系指南针 (Nature's Compass) -warp-theory|神秘扭曲学* -hammer-lib@|锤子核心 (Hammer Core/Hammer Lib) - -thermal-casting|热力铸造室* -thermal-smeltery-redux|热力冶炼厂重置版* -brcore -industrial-expansion-te-addon|工业扩充(TE附属) (Industrial Expansion [TE Addon]) - - -spmodapi -quantum-pack|量子工具包* -netherores|下界矿石 (NetherOres) -tesla|特斯拉 (TESLA) -vanillafoodpantry-mod|食品储藏室 (VanillaFoodPantry Mod) -the-elysium|极乐世界* -ice-and-fire-dragons@|冰火传说 (Ice and Fire) - -yabba -useful-nullifiers|实用销毁器* -xtones@ -xnet@ -wireless-crafting-grid|无线合成网络* - -top-addons -torchmaster@|火炬大师* -zerocore@ -sleeping-bag|睡袋* -the-one-probe@|检测器* - -simply-jetpacks-2|简易喷气背包2* -snad@|子沙* -storage-drawers-extras -solar-flux-reborn@|日光通量:重制版* -simple-void-world|简单虚空世界* -shetiphiancore@¨shetiphiancore-fabric -shadowmc -scannable@|扫描器* -rebornstorage@|存储重置 (Reborn Storage) -quantumstorage|量子存储 (QuantumStorage) -p455w0rds-library -mtlib - -open-glider|滑翔翼* -mputils -shadowfacts-forgelin -eleccore -infinitylib@ -dark-utilities@ -flux-networks|通量网络* -flat-colored-blocks-forge|平滑色块 (Flat Colored Blocks)¨flat-colored-blocks-fabric|平滑色块 (Flat Colored Blocks) -jei-bees|JEI 蜜蜂 (JEI Bees) -chisels-bits|雕凿工艺 (Chisels & Bits)¨chisels-bits-for-fabric|雕凿工艺 (Chisels & Bits) -architecturecraft|建筑师工艺 (Architecture Craft) -chameleon@texel-chameleon|变色龙* -mrtjpcore -cyclops-core@ -netherportalfix@|下界传送门修正 (NetherPortalFix)¨netherportalfix-fabric|下界传送门修正 (NetherPortalFix) -rftools-dimensions@|RF工具:维度 (RFTools Dimensions) -signals|信号* -extreme-reactors@|极限反应堆* -environmental-lunartech@environmental-lunar-tech|ET:月光发电 (Environmental Lunar Tech) -angel-ring-to-bauble|可装备的天使指环* -mob-grinding-utils|刷怪塔实用设备* -rftools-control@|RF工具:控制 (RFTools Control) -immersive-petroleum|沉浸原油* -more-shearables|更多的剪刀用途* -gregtech-gt-gtplusplus - - - - -yam-core - - -teletoro|远程传送 (TeleToro) - -re-zero-kara-hajimeru-isekai-seikatsu|RE:从零开始的异世界 (Re: Zero kara hajimeru isekai seikatsu) -minewatch -thaumcraft-inventory-scanning|神秘时代物品栏扫描* -cyclic@|循环* - -redstoneplusplus|红石++ (Redstone++) -ctm|连接纹理 (ConnectedTexturesMod) -simulated-nights|夜晚模拟* -ftb-utilities|FTB 实用工具 (FTB Utilities) -just-enough-characters@justenoughcharacters|通用拼音搜索* - -redstone-flux -cofh-world -ancient-warfare-2|古代战争2 (Ancient Warfare2) -integrated-dynamics@|动态联合/集成动力* -common-capabilities@ -jingames-dragon-block-c|龙珠C (Dragon Block C) -tan-campfire-spit|意志坚定-篝火烤架 (TAN Campfire Spit) -super-solar-panels|超级太阳能发电机* -ngtlib -geomastery|征服大地* -afsu-mod - -lightningcraft|雷电工艺 (LightningCraft) -just-enough-resources-jer@ -morpheus -wall-jump|飞檐走壁*¨wall-jump-fabric|飞檐走壁 (Wall Jump) -condensed-block-mod-reborn|凝结成块* -refined-avaritia -weather-storms-tornadoes@|局部气候&风暴 (Weather, Storms & Tornadoes) -new-things -survivalist|生存主义* -mystic-divination|秘契占星术* -cofh-lib -tabula-rasa -cofhtweaks -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|自动路径* -react -shared-resource-packs|共享资源包* -i-know-what-im-doing@|我知道我在干什么 (I Know What I'm Doing) -leather-works|皮革加工厂* -cyberware|机械改造* -thermal-cultivation@|热力农业* -better-builders-wands|更好的建筑之杖 (Better Builder's Wands) -jaopca@ -chickens|更多鸡* -tragicmc2|悲惨世界2 (TragicMC 2) -mobdrip - -customskinloader@|万用皮肤补丁 (CustomSkinLoader) -saltymod|盐 (SaltyMod) -immersive-tech|沉浸科技 (Immersive Technology) - 已停更¨mct-immersive-technology@|沉浸科技 (Immersive Technology) - -funky-locomotion -compatlayer@|版本兼容 (CompatLayer) -wopper|木制漏斗* -gorgecore|食用强化 (GorgeCore) -chineseworkshop|中式工坊 (Chinese Workshop) -modular-routers@|模块化路由器* -darkcore|暗黑核心* -tardis-mod|时间和空间的相对维度 (TARDIS MOD) - - -another-one-bites-the-dust-berry-bushes -gokistats|天赋技能树 (GokiStats) - -tropicraft@|热带世界* - - -sumsang|亖圼* -moblocks -creepypasta-1-0-0|蠕动意面 (CreepyPasta) -grue|格鲁* - -googlyeyes|金鱼眼 (GooglyEyes) -lycanites-mobs|恐怖生物* -back-to-eco|生态回归 (Back to Eco) -world-of-warcraft|魔兽世界* -the-witcher-adventure|猎魔人* -fancy-battleaxes@|华丽战斧* -zora-no-densha|Zora的电车 (Zora no Densha) -roguelike-dungeons@roguelikedungeons|冒险地牢* -first-aid@firstaid|急救/医疗护理* -bonfires@|篝火* -immersive-craft@|沉浸工艺* -aroma1997core -tatw -hostile-mobs-and-girls|敌对生物和女孩们 (Hostile Mobs and Girls) -better-hud|更好的HUD (Better HUD) -custom-stuff-4|自定义物品4* -powered-thingies|特斯拉科技 (Tesla Powered Thingies) - -mcmusicplayer#t1:description -obsidian-suite -wizards-of-lua|Lua魔导师 (Wizards of Lua) -mystical-agriculture@|神秘农业* -vampirism-become-a-vampire@vampirism|吸血鬼/血族传说 (Vampirism) -plants-vs-zombies-mod|植物大战僵尸 (Plants VS Zombies) -itemphysic@|物品物理掉落 (ItemPhysic) - 完整版¨itemphysic-lite@|物品物理掉落 (ItemPhysic) - 轻量版 -minenautica -improved-extraction|矿物获取改进* -ecology-mod|生态* -cakeisalie-mod|蛋糕是个谎言 (CakeIsALie) -ex-nihilo-adscensio|无中生有:Adscensio* -bookshelf@bookshelf-lib - -random-things|随意作品* - -netherex|下界拓展 (NetherEX) -engender-mod|召唤师 (The Engender Mod) -better-questing|更好的任务* - - -ct-mortar -ct-watercan -totemic@fenns_totemic|图腾* -grimoire-of-alice|爱丽丝的魔法书 (Grimoire of Alice) -journey-to-gensokyo|幻想乡之旅 (Journey to Gensokyo) -danmakucore|弹幕核心 (DanmakuCore) -angel-of-vengeance|复仇天使 (Angel of Vengeance) -tammodized -ex-nihilo-creatio|无中生有:创世 (Ex Nihilo: Creatio) -thaumcraft|神秘时代* -colossal-chests@|巨型箱子* -auto-pickup|自动拾取* -mc-mods-u-want|背包编辑器 (All-U-Want) -potion-core|药水核心* -solar-expansion -blue-power|蓝石力量 (Blue power) -redstone-armory|红石军械库* -qmunitylib -quest-for-blue-name -the-last-smith@|最后的太刀匠人* -mineamp|我的音乐 (MineAmp) -quiverbow|Quiver Bow - 官方原版¨quiverbow-restrung|Quiver Bow - 重制版 -cookiecore -farseek -meecreeps@|使命必达先生 (MeeCreeps) -streams|溪流* - -blockcraftery|方块工匠* -bedrockores@|基岩矿簇 (Bedrock Ores) -chat-bubbles|聊天泡泡* -refined-storage-addons@|精致存储附属* -foamfix-optimization-mod@foamfix|泡沫修复 (FoamFix) -industrial-foregoing@|工业先锋* -expanded-armory|扩展装备* -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@|抓钩* -tabbychat-2 - -yoyos|悠悠球* -cd4017be-library -iberia -reforged@|重铸* -cavern|洞穴* -block-drops-jei-addon -iron-tanks|更多储罐* -colorutility#t1:description|颜色代码 (ColorUtility) -digimobs|数码宝贝* -storage-boats-mod|存储船 (Storage Boat Mod) -mo-withers|更多凋灵 (Mo' Withers) -jingames-naruto-c|火影忍者C (Naruto C) -the-autologin-mod-for-authme-server|自动登录 (AutoLogin) -roost|鸡窝* -croparia@|矿石作物/魔种之咏* -simple-corn|简单玉米* -thaumic-jei@ -tinkers-steelworks|匠魂炼钢厂 (Tinkers' Steelworks)¨tinkers-steelworks-fork|匠魂炼钢厂 (Tinkers' Steelworks) -unicode-font-extension|Unicode 字体扩展* -placeable-items|可放置物品* -compendium|工匠防御 (Compendium / Tinkers' Defense) -sg-craft|格雷的星门 (Greg's SG Craft)¨stargate-network|格雷的星门 (Greg's SG Craft) -damage-indicators-mod|伤害显示 (Damage Indicators) -torohealth-damage-indicators|ToroHealth 伤害显示 (ToroHealth Damage Indicators) -omni-ocular -wrapup@ -nuclear-physics -wither-skeleton-tweaks|凋灵骷髅调整* -heat-and-climate|热量与气候* -customthings|自定义物品 (CustomThings) -exgregilo|格雷矿筛 (ExGregilo) -placebo@ -plants - -chinjufumod|镇守府 (ChinjufuMod +JapaneseBlock) -track-api@ -immersive-railroading@|沉浸铁路* -foodcraft-reloaded|食物工艺重置版 (FoodCraft Reloaded) -custom-main-menu|自定义主菜单* - -wildycraft - - -my-little-mob-grinder|小怪物粉碎机* -resource-loader|资源加载* -no-sleeping-allowed|禁止睡觉* -playersdropheads|玩家掉落头颅 (PlayersDropHeads) -memory-bar -toxicrain|有毒的雨 (ToxicRain) - - -cannibalism|割肉小刀/同类相食* -quick-consume|快速消耗* -planting-dirt-for-saplings@auto-planter|自动植树机 (Auto Planter / Planting dirt for saplings) - -custom-crosshair-mod@|自定义准心* -better-blink|更好的传送* -biobomb|生物炸弹 (BioBomb) -ender-hopper|末影漏斗* -mine-souls|黑魂战斗* -radixcore - -familiar-fauna|熟悉的动物* - -tinkers-tool-leveling|匠魂工具升级 (Tinkers' Tool Leveling) - -ingame-info-xml|游戏信息显示XML版 (InGame Info XML) - -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|矿石僵尸* -meanmobs|残忍怪物 (MeanMobs) -zyins-hud - -rough-tweaks|难度调整* - -the-disenchanter-mod|祛魔台 (The Disenchanter) -carry-on@|搬运* -better-than-llamas@|更好看的羊驼*¨better-than-llamas-fabric|更好看的羊驼 (Better Than Llamas) -dynamic-surroundings@dynamicsurroundingsfabric|动态环境/动态环绕*¨dynamic-surroundings-fabric-edition|动态环境/动态环绕 (Dynamic Surroundings) -alfheim@|亚尔夫海姆* -mob-battle-mod@|怪物大乱斗*¨mob-battle-mod-fabric|怪物大乱斗 (Mob Battle Mod) -smooth-font|平滑字体* - -reskillable -betteroffhand|更好的副手 (BetterOffhand) -entity-spring|实体弹簧* -compatskills -avaritia-tweaks -mjrlegendslib -dye-it-yourself|自动染色* -piston-expansion|活塞拓展* -underwater-rails|水下铁轨* -trebuchet -particlelib|粒子库 (ParticleLib) -star-miner|星际矿工 (Starminer) - -jglrxavpoks-uncrafting-table|jglrxavpok的拆解台 (jglrxavpok's Uncrafting Table) -rustic@|乡村* -netherutils -bonsai-trees|盆栽* - - -misty-world@|朦胧世界* - - -beta-kathairis|卡塞瑞斯 (Kathairis / Kether)¨kathairis-alive|卡塞瑞斯 (Kathairis / Kether) -manametal@|魔法金属 (ManaMetalMod) -avaritiaddons|无尽收容 / 更多空间箱子* -base -immersive-cables|沉浸线缆* - -better-title-screen|更好的标题页* -sound-filters|声音滤波器* -lambda-craft|半条命 (LambdaCraft) -vivecraft@¨vivecraft-forge-extensions -super-sound-muffler|超级消音器* -armorplus@|装备扩充 (ArmorPlus) -inspirations@|灵感* -tree-growing-simulator|跳舞树成长* - -personal-cars -thermal-innovation@|热力革新* -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) -fancy-block-particles|梦幻方块效果* -thaumic-katana|神秘之日本刀* -the-aether-ii@aether-ii|天境二 (The Aether II) -visibleraygenerator|永久光发电机 (VisibleRay Generator) -mmmmmmmmmmmm@|试验假人 (MmmMmmMmmMmm / Target Dummy) -aromabackup|存档备份 (AromaBackup) - -orbis-lib -the-eight-fabled-blades|八大传说之刃* -malisisblocks -useful-interior|有用的内饰* -taiga-tinkers-alloying-addon|匠魂合金附加 (Tinkers Alloying Addon) -version-checker|模组更新检测* -planar-artifice|镜面艺术: 传承 (Planar Artifice: Continuation) - -Requiem|安魂曲 (Requiem/Dissolution/Tartaros) -slashblade-in-tfc|古刀传 (Slash Blade in TFC) -mlp-mythical-creatures-updated-to-1-7-10|神话生物 (Mythical Creatures) -metamorph|变形* -reactioncraft-3-rebirth|世界反应3:重置 (Reactioncraft 3: Rebirth) -pewter|魔法匠魂* -redstone-repository-revolved|红石军械库重制版* -spawncommands-spawn-commands-teleport|传送指令 (Spawn Commands Teleport) -server-properties-for-lan|简单联机 (Server.Properties for LAN)¨@server-properties-for-lan|简单联机 (Server.Properties for LAN) - 已失效 - -jaopcaadditions|JAOPCA附属 (JAOPCAAdditions) -cloche-call -mouse-tweaks|鼠标手势*¨@mouse-tweaks|鼠标手势 (Mouse Tweaks) - 仅部分 -jargca|JAOPCA神秘农业附属 (Just A Resource Generation Compatibility Attempt) -sky-resources|空岛资源2 (Sky Resources2) -hexxit-gear|Hexxit 装备*¨hexxit-gear-restored|Hexxit 装备 (Hexxit Gear) - -magic-clover|幸运四叶草* -inventory-crafting-grid|背包工作台* -kleeslabs@|更好地破坏半砖 (KleeSlabs)¨kleeslabs-fabric|更好地破坏半砖 (KleeSlabs) - -gregtechce|格雷科技社区版 (GregTech Community Edition) -blur@blur-plus|界面背景模糊*¨blur-fabric|界面背景模糊 (Blur) -fast-leaf-decay|树叶快速腐烂* -enable-cheats|开启作弊模式* -findit|找到它 (Findit!) -wearable-blocks|可穿戴的方块* - - -swissarmyknife|瑞士军刀 (SwissArmyKnife) -ender-io-addons|末影接口拓展 (Ender IO Addons) -historicized-medicine|历史化医学* -infinity-item-editor@|无尽物品编辑器* -extra-rails|更多功能铁轨* -gregtania -origin -minecraft-transport-simulator@immersive-vehicles|沉浸车辆 (Immersive Vehicles) -chest-transporter|搬箱器* -i18nupdatemod@|自动汉化更新 (I18nUpdateMod) -realistic-item-drops|真实物品掉落* -pixelmon@|像素宝可梦 重铸 (Pixelmon Reforged) -controlling@|键位冲突显示*¨controlling-for-fabric|键位冲突显示 (Controlling) - - -simpleleather|腐肉烧皮革 (SimpleLeather) -sync|克隆* -chiseled-me|超级变变变* -progressive-automation-early-miner|进阶自动化 (Progressive Automation) -matmos|真实环境音效 (MAtmos) -ye-olde-tanks|水箱* -improving-minecraft|改善的世界*¨improving-minecraft-fork|改善的世界 (Improving Minecraft) - 他人的非官方重上传 -wawla@|Wawla高亮显示 (What Are We Looking At) -lightarea|点亮区域 (LightArea) -@replaymod|录像回放 (Replay Mod) -stellar-sky|群星璀璨* -stellar-api|恒星API (Stellar API) -nei-addons|NEI扩充 (NEI Addons) -cucumber@ -hunting-dimension@|狩猎维度* -runes-of-wizardry|符文魔法 (Runes-of-Wizardry) - -coffee-workshop|咖啡工坊* -in-game-account-switcher@|游戏内账号切换 (In-Game Account Switcher) -consecration@|圣化* -ignite-hud|燃点HUD (Ignite HUD) -mrcrayfishs-gun-mod|MrCrayfish的枪 (MrCrayfish's Gun Mod) -bloodmoon|血月* -obfuscate -runic-dungeons|符文地牢 (Runic Dungeon) -poop|屎 (Poop Mod) -slurp|啜饮* -tough-expansion|意志坚定:热力附属* -mystical-agradditions@|神秘农业扩展* -vanillafix@|原版修复 (VanillaFix) -just-enough-harvestcraft|更多潘马斯配方查询 (Just Enough HarvestCraft) -charcoal-pit-4@charcoal_pit¨charcoal-pit-3¨charcoal-pit -uncomplication|IC2exp还原* -the-wings-of-alfheim-1-7-10|亚尔夫海姆之翼 (The Wings of Alfheim) - - -mubble¨mubble-forge -libraryex|MineEx 通用库 (LibraryEx) -industrial-wires|工业线缆* -mystagrad-cloche-compat -waitingtime|加载页面游戏 (WaitingTime) -dragontech|龙之科技/龙鳞实验版 (DragonTech / Dragon Scales EX / DragonScales) - -gravityfalls-mod|怪诞小镇 (Gravity Falls) -tfcbotania|TFC植物魔法 (TFCBotania) -no-recipe-guide|没有合成指南* -takumi-craft|爬行者世界/苦力怕世界* -the-mists-of-riov|神秘世界 (The Mists of RioV Mod) - -nsr-no-respawn-screen|无重生屏幕 (No Respawn Screen) -more-bees|蜜蜂拓展* -evilnotchlib -tpalette-forge|调色板 (TPalette)¨tpalette|调色板 (TPalette) - 文件覆盖 - -career-bees|职业蜜蜂* - -level-up|升级!重置 (Level Up!Reloaded) -level-up-legacy|升级!前版 (Level Up!Legacy) -moar-boats|模块化船* -numina@|模块化动力装甲前置* -tinkers-complement@|匠魂补充 (Tinkers' Complement) -everlastingabilities@everlasting-abilities|永恒能力 (Everlasting Abilities) -abyssalcraft-heads|深渊国度头颅 (AbyssalCraft Heads) -overlord@|不死者之王* -multifarm-crops|多功能农场兼容* -forestry-fermenter-addon|更多生物质* -dakimakura-mod|抱枕* - -rift -crop-eating-animals|动物自动喂食 (Crop-Eating Animals) -refraction|折射* - -librarianlib@|图书馆 (LibrarianLib) -creeper-confetti@|烟花苦力怕* -funnels|液体漏斗* -advent-of-ascension-nevermine@adventofascension|虚无世界 (Nevermine) -toroquest|托罗探索 (Toro Quest) - -rikmulds-core-mod -just-enough-pattern-banners -primitive-mobs|远古生物 / 原始生物* -realistic-cobwebs@ -simpleharvest|简单收获 (Simple Harvest) -mrcrayfishs-device-mod|MrCrayfish 的设备 (MrCrayfish's Device Mod) -block-armor|方块盔甲* -stockpile|储物桶* -loot-slash-conquer -candy-world|糖果世界* - -creativecore@ -instantunify|瞬间统一 (InstantUnify) - -mobdrops|更多掉落 (MobDrops) -states|城邦* -modular-machinery|模块化机械* -compositegear|复合齿轮/复合装甲 (Composite Gear) -kiwi@¨kiwi-fabric -cuisine|料理工艺 🍳 (Cuisine 🍳) -world-control|世界控制* - -tree-chopper|砍树* -the-lost-cities@|失落的城市* - - - -simple-underground-biomes|简单地下生物群系* -zen-foundry|禅:金属工坊 🌋 (Zen: Foundry 🌋) - - -galaxyadditions -animationapi -realbench|更好的工作台 (RealBench) -primalcore|原始核心 (PrimalCore) -primal-tech|原始科技* -antique-atlas@|古式地图* - -xray-1-13-rift-modloader -overloaded|超限存储* -power-tools|现代工具* - -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) - -undertale-mod|传说之下* -globe|水晶球* -super-stick-sword|超级木棍剑 (Super Stick sword) -mekanism-generators@|通用机械发电机* -spider-queen|蜘蛛女王* -baublelicious|美妙饰品* -void-monster -shields-plus|更多盾牌* -ghost-buster -culinary-construct@|自定义三明治* -armoreablemobs|怪物装备自定义 (ArmoreableMobs) - - -advanced-inventory - - -pollution-of-the-realms|环境污染/领域的污染 (Pollution of the Realms) - -heat-and-climate-lib -waystones@|传送石碑/指路石*¨waystones-fabric|传送石碑/指路石 (Waystones) -thaumic-calculations|神秘计算器* -pams-weee-flowers|潘马斯花园 (Pam's Weee! Flowers) - - -paragliders@|滑翔伞* -ender-io-endergy|末影接口:管道拓展 (Ender IO:Endergy) -bwm-suite -ambience-music-mod|环境音乐 (Ambience) -almost-enough-items|AEI物品管理器* -mtutils -gravestone-mod@|墓碑 (GraveStone) -atlas-extras -horse-power|马力* -better-with-addons -tesla-core-lib|特斯拉核心* -voidscape|虚空工艺 (Voidscape/VoidCraft) -stygian-end-biome-expansion|末地:生物群系扩展 (Stygian End: Biome Expansion) -wooden-furnace|木制熔炉* -moreplates|更多金属板 (More Plates) -morelibs -game-stages@|游戏阶段* - -silents-gems@|寂静宝石 (Silent's Gems) -silent-lib@ -silents-gems-tic-support|寂静宝石:匠魂支持 (Silent's Gems: TiC Support) -lit-little-insignificant-things -gemulation -silents-gems-extra-parts|寂静宝石:额外部件 (Silent's Gems: Extra Parts) -fun-ores|趣味矿石* -solar-furnaces|简易太阳能 (Simple Solar Panels) -vanilladeathchest@|原版死亡箱子 (Vanilla Death Chest)¨vanilladeathchest-fabric|原版死亡箱子 (Vanilla Death Chest) -arachnophobia|蜘蛛恐惧症* -abyssalcraft-integration|深渊国度联动 (AbyssalCraft Integration) -prefab@|预制建筑*¨prefab-fabric|预制建筑 (Prefab) -haunch-hud -absent-by-design@ -no-nv-flash@|无夜视闪烁 (No Night Vision Flashing) -arcade-mod|街机* -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) -sky-compression -reap-mod@|收获 (Reap) -geolosys@|地质矿脉* -patchouli@|帕秋莉手册*¨patchouli-fabric|帕秋莉手册 (Patchouli) -jeid -gases-framework -ranged-pumps@|范围泵* -bagginses|背包* -ic2-classic@ic2classic|工业时代2经典版 (IC2 Classic) -opencubicchunks@cubicchunks -cubicworldgen@cwg -rally-health@ -open-terrain-generator|开放式地形生成器* - -noshelter|无庇护所 (NoShelter) -epic-siege-mod|史诗攻城 (Epic Siege) -furnace-overhaul|熔炉改革* - -architecturecraft-tridev@architecture-craft|建筑师工艺重置版 (ArchitectureCraft - TridentMC Version) -ore-farm|矿石农场* - - -plethora-peripherals@ -simple-flight|简单的飞行* -factory-tech|工厂科技 (FactoryTech) - - -mysticallib -crissaegrim - - -traverse-reforged@traverse-legacy|遍历 (Traverse)¨traverse@|遍历* -winter-wonder-land|霏雪寄语之地* -road-stuff@|道路* -ae2wtlib -real-filing-cabinet|仿真档案柜* -hycrafthds-wtf-ic2-addon|WTF 工业拓展 (WTF Ic2 Addon) -u-team-core@ -ftb-quests-forge|FTB任务 (FTB Quests)¨ftb-quests-fabric|FTB任务 (FTB Quests) -texfix@|材质修复 (TexFix) -mapmakers-gadgets|地图作者小帮手 (Mapmaker's Gadgets) -travellers-gear|旅者之器 (Traveller's Gear) -ceramics@|陶瓷器* -sjap@|拔刀剑日系附属包 (SlashBlade Japanese Addon Pack) - -planet-progression|星球研究* -space-advanced-addon-for-galactic-craft-3 -decimation-zombie-apocalypse|僵尸启示录 (Decimation) -rift-mod-list@ -forgeendertech -new-tardis-mod - -advanced-chimneys|高级烟囱* -regeneration|神秘博士 - 再生 (Doctor Who - Regeneration​) -stevekungs-lib -make-zoom-zoom|更快的加载 (MakeZoomZoom) -minecraft-virtual-machines|Minecraft虚拟机* -cavern2|洞穴 II (Cavern II) -notenoughids|增加ID上限 (NotEnoughIDs) -avaritia-recipe-generator|可视化无尽配方编辑器* -trapcraft|陷阱* -mod-name-tooltip|模组名称显示* -gpick-2|进化之镐2 (GPickaxe 2) -cxlibrary - -integrated-tunnels@|集成管道* -unmending|经验不修补* -the-creeping-nether|蔓延的下界* - 已失效¨@creeping-nether|蔓延的下界 (The Creeping Nether) -random-psideas|Psi随想 (Random PSIdeas) -expetrum|真实世界 (ExPetrum) -equivalent-energistics|等价能源学 (Equivalent Energistics / Equivalent Energistics (LTS))¨equivalent-energistics-patched|等价能源学 (Equivalent Energistics / Equivalent Energistics (LTS)) - (LTS)patch 版 -thedragonlib@ -repose|自动上坡* -botanic-additions|植物学拓展* - -veggieway-fabric|素食之道 (The Veggie Way)¨the-veggie-way|素食之道* -gargoyles-mod|石像鬼 (Gargoyles) -hydrophobia|恐水症* -dimensional-edibles|维度食物* -passable-leaves|叶间穿行* -swingthroughgrass|穿草攻击 (SwingThroughGrass) -steves-bizarre-adventure|史蒂夫的奇妙冒险 (Steve's Bizarre Adventure) -animania|动物谷:基础 (Animania Base) -endertweaker -cofh-vanilla-tools - -rarmor|功能装甲* -immersive-io|沉浸接口 (Immersive IO) -tickratechanger|运算变速 (TickrateChanger) -botania-needs-these-things|植物魔法需要它! (Botania Needs These Things!) -nocubes¨no-cubes-reloaded¨@nocubes -orelib -tick-dynamic|动态Tick (Tick-Dynamic) -surge@|潮涌* -more-avaritia -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) -fastfurnace|熔炉性能优化 (FastFurnace) -fastworkbench|工作台性能优化 (FastWorkbench) -unbreaken|工具保护 (UnbreakEn) -bitcoin|比特币* -hungering-darkness -roots-classic|根源魔法经典版* -embers-rekindled@embers|余烬复刻版* -vending-machines-revamped|自动贩卖机* -thaumic-alchemy|神秘炼金学* - -move-plus|移动方式增强* -future-minecraft|未来的版本 (FutureVersions) -contenttweaker@ -from-the-ground-up|白手起家* -clumps@|经验机制改革* -dynamic-surroundings-huds|动态环境:信息显示 (Dynamic Surroundings: HUDs) -crafting-tweaks@|合成辅助*¨crafting-tweaks-fabric|合成辅助 (Crafting Tweaks) -limelib -sparks-hammers|重锤火花* -deadly-monsters|致命怪物* -vanillaautomation|原版自动化 (VanillaAutomation) -tickprofiler|Tick分析器 (TickProfiler) -vanilla-immersion|立体工具方块* -earthworks|土方工程* -terraqueous@|地灵云心/海树山花*¨terraqueous-fabric|地灵云心/海树山花 (Terraqueous) -initial-inventory@|自定义初始物品* -interaction-wheel@ -water-strainer|滤水器* -tinkers-skyblock|匠魂空岛 (Tinkers' Skyblock) -diet-hoppers|漏斗碰撞箱修复* -xl-food-mod|超多食物 (XL Food Mod) -soot|烟尘* -hp-spells|哈利·波特:法术 (Harry Potter Spells) -recurrent-complex|自然建筑生成* -capabilityproxy@capability-proxy|功能代理 (CapabilityProxy) -reauth¨reauth-fabric -autoverse@ -transprot|运输* -default-world-generator-port -better-questing-standard-expansion|更好的任务-基础扩展 (Better Questing - Standard Expansion) -exchangers|方块交换器* -flexible-tools|灵活的工具* -dimensional-control|维度控制* -valkyrien-skies@|瓦尔基里天空* -item-scroller@|物品滚轮* -better-advancements@|更好的进度* -lucraft-core -progressive-bosses@|进化的 BOSS*¨fabric-progressive-bosses|进化的 BOSS (Progressive Bosses) -persistent-bits@ -rc-roads|真实公路 (RC Roads) -emoticons|动作表情* -simple-diving-gear|简单的潜水装备* -just-enough-energistics-jee -ironman|钢铁侠 (IronMan) -chunk-animator@chunkanimator|区块加载动画* -craftstudio-api - -fisks-superheroes-2@fiskheroes|菲斯克的超级英雄 (Fisk's Superheroes) - -aiot-botania@|植物魔法全能工具 (AIOT Botania) -botania-tweaks|植物魔法调整* -albedo -natures-aura@|自然灵气 (Nature's Aura) - -void-island-control -ic2-nei-crop-plugin|IC2育种模拟器/杂交模拟器 (IC2 Crop-Breeding Plugin) -better-storage-too|更好的储存2* -manaita-plus|更好的砧板* -bartworks|巴特的作品 (bartworks) - -placeable-motor|可放置马达* -exo-craft@ -simple-login|简单登录* -grim-pack|Grim的Mod整合* -artisan-worktables|工匠之作/工匠工作台* -ptrlib@ -creeper-awareness|爬行者意识* -what-fluid-fix -blue-skies@|蔚蓝浩空* -project-vibrant-journeys@|活力之旅 (Project: Vibrant Journeys) -bed-bugs|修复卡床* -biometweaker|生物群系修改器 (BiomeTweaker) -actuallycomputers|实用电脑 (ActuallyComputers) -fence-overhaul|斜栅栏* -zombie-players|僵尸玩家* -exotic-birds|珍奇鸟类* -charset -biometweakercore|生物群系修改器扩展 (BiomeTweakerCore) -trashcans-reborn -CompactDrawers -blockdispenser|发射器放置方块 (BlockDispenser) -redstone-paste|爬墙红石/粘性红石* -dynamic-trees-traverse-compat|动态的树:遍历附属 (Dynamic Trees - Traverse Compat) -charset-lib -betternether@|更好的下界 (BetterNether) -time-machine-mod|时光机 (Time Machine) - -upsizer-mod|更大的堆叠数量* -fence-jumper|越过栅栏* -enchantments-exchanger|便携附魔替换台* -additional-enchanted-miner@ -treasure-bags|宝藏袋* -stevecraft-by-owenpsteve2|史蒂夫工艺 (SteveCraft) -hunger-games|饥饿游戏 (The Hunger Games) -tfctech-addon|群峦工业 (TFCTech Addon) -yunomakegoodmap -organic-creepers|苦力怕蕨* - - - -industrial-renewal@|工业复兴* -draconicadditions|龙之进化拓展 (Draconic Additions) - -hated-mobs|令人讨厌的生物* - -mekanica|通用机械:DZ版* -littletiles@|LT小方块 (LittleTiles) -extended-crafting@|合成拓展* -prodigy-tech|奇才妙械* - -item-filters@|物品过滤器 (Item Filters​)¨item-filters-fabric|物品过滤器 (Item Filters​) -eblib -notenoughcodecs -future-mc@|未来的MC (Future MC) -rope-bridge|索桥* -sbm-oil-ore|油矿石 (Oil Ore) -redstone-minus-redstone|红石减红石* -more-furnaces|更多熔炉* -integrated-crafting|集成合成学* -integrated-terminals@|集成终端* -mekanism-tools@|通用机械工具* -roboticparts|机械改造1.12+ (Robotic Parts) -rewired -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 -automated-redstone|自动化红石* -thuts-elevators|Thutmose的电梯 (Thut's Elevators) -additional-resources -sky-orchards|天空果园* -mdxlib -wireless-utilities|无线设备* -tometinkers -tinkers-slashblade|刀锻冶匠魂 (Tinker's SlashBlade) -audio-death|死亡音效* -deep-mob-learning|深度怪物学习* - -tofucraftreload@|豆腐工艺重制版 (TofuCraftReload) -electroblobs-wizardry|巫术学 (Electroblob's Wizardry) -moarsigns|更多告示牌 (MoarSigns) -kamen-rider-craft|假面骑士工艺 (KamenRiderCraft) -avaritia-io|无尽贪婪:接口 (Avaritia IO) -dense-neutron-collectors|致密中子态素收集器*¨dense-neutron-collectors-1-7|致密中子态素收集器 (Dense Neutron Collectors) -pubgmc-mod -mobultion|进化怪物 (mobultion) -waddles -project-intelligence|PI文档* -thutcore -resource-pack-organizer@|资源包管理器* -morcant-ore|莫桑矿石* -force-void-world|强制虚空世界* -i-am-very-smart-forge|我很聪明 (I Am Very Smart)¨i-am-very-smart|我很聪明* -far-from-home|背井离乡* -cotton -oxygen-teleportation -oxygen-core|氧气核心* -lead-villagers|带领村民* -delta-hard-mode|Delta 困难模式* -id-squeezer-tweak -food-ores|食物矿石* -sit@bl4cks-sit|席地而坐*¨sit-fabric|席地而坐 (Sit) - - - -cplpibalds-tweaks|CplPibald的微调 (CplPibald's Tweaks) -ore-biome|矿石生态群系* -farm-adventure|农场冒险* -the-shadow-world|暗影世界 (Shadow World) -project-306141|加帕里公园 (JapariCraftMod) -mchorses-mclib -musiccraft-mod|音乐工艺 (MusicCraft mod) -hardcore-darkness|真实的黑夜* -cola-craft|可乐工艺* - -backstab|背刺* -dynamic-stealth|动态潜行* - - -roughly-enough-items@rei|REI物品管理器* -modmenu@|模组菜单 (Mod Menu) -architectury-quilt -illuminations¨illuminations-forge -mappy -mouse-wheelie@|急速滚轮* -mrcrayfishs-vehicle-mod|MrCrayfish的载具 (MrCrayfish's Vehicle Mod) -cc-tweaked@ -aliensvspredator|异形大战铁血战士 (AliensVsPredator) -dragon-murder - -birds-nests|鸟巢* -minecraft-animated -refined-machinery|精致机械* - -magicalsculpture|魔法雕像 (MagicalSculpture) -ash-another-simple-hud|另一个简单的HUD (Another Simple HUD) -custom-selection-box-port|自定义选择框 (Custom Selection Box)¨customselectionbox|自定义选择框 (Custom Selection Box) -librikka-api -not-enough-wands@|更多魔杖* -deep-mob-learning-blood-magic-addon|深度怪物知识-血魔法插件 (Deep Mob Learning - Blood Magic Addon) -informed-load|更多加载信息* -huajiage-infinite-galaxy|滑稽纪元II:无尽星河 (Huaji Age II:Infinite Galaxy) - -cqrepoured@chocolate-quest-repoured|寻找巧克力重铸版 (Chocolate Quest Repoured) -fabricproxy@|Fabric 群组支持 (FabricProxy) -ex-sartagine|锅具* -xaeros-minimap|Xaero的小地图 (Xaero's Minimap) - 默认版(功能完整)¨xaeros-minimap-fair-play-edition|Xaero的小地图 (Xaero's Minimap) - 公平竞争版(功能部分缺失,已停更)¨@xaeros-minimap|Xaero的小地图 (Xaero's Minimap) - 完整版¨@xaeros-minimap-fair|Xaero的小地图 (Xaero's Minimap) - 公平竞争版(已停更) -everlastingabilities-potioncore|永恒能力-药水核心 (EverlastingAbilities-PotionCore) -optifabric -the-emerald-haven|翡翠天堂* - -simple-grinder@simplegrinder|简易研磨机* -redstone-gauges-and-switches|红石测量与开关 (Gauges and Switches) -apotheosis|神化* -lighting-wand@|照明魔杖 🌟 (Lighting Wand 🌟)¨lighting-wand-fabric|照明魔杖 🌟 (Lighting Wand 🌟) -terrarium@|地球* -climatic-biomes -howling-moon|狼人* -hostile-worlds-invasions|敌对世界-入侵 (Hostile Worlds - Invasions) -simple-storage-network|简单存储* -2973537|虚无世界1 (Eternal Isles) -scaling-health@ -minecoprocessors|微处理器* - -difficult-life -mekanismores|通用机械矿石 (MekanismOres) -pyrotech|火种科技* -rats@|老鼠* -serversync|服务器同步 (ServerSync) - -auxilium-equivalence|等价交换辅助 (Auxilium Equivalence / Auxilium) -bionisation-4|细菌病毒 (Bionisation)¨bionisation-3|细菌病毒 (Bionisation)¨bionisation-2|细菌病毒 (Bionisation)¨bionisation|细菌病毒*¨@bionisation-4|细菌病毒 (Bionisation) -tiny-mob-farm|迷你刷怪场* -soulus -sanlib - - -travelers-backpack@travelersbackpack|旅行者背包 (Traveler's Backpack)¨travelers-backpack-fabric|旅行者背包 (Traveler's Backpack) -gregtech-classic|格雷科技经典版 (GregTech Classic) -aperture -combo-armors|组合装甲 (IC2ComboArmors) - -nonausea|没有反胃 (NoNausea) -communism-mod|苏维埃工坊* -mirror -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)¨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|飞行速破 (FastFlyBlockBreaking) - -planttech-2|植物科技2 (PlantTech 2) -toast-control|消息框控制* - -cocoa-magic|可可工艺* -betterportals|更好的传送门 (Better Portals) -classic-combat@|经典战斗* - -less-lag|较少的滞后* -goodbye-grass|没有草丛 (Grassta la Vista) -phosphor@|磷*¨phosphor-forge|磷 (Phosphor) -clay-bucket|粘土桶* -extra-anvils|更多铁砧 / 更多砧* -glassential|精致玻璃*¨glassential-fabric|精致玻璃 (Glassential) -tinkers-addons@|匠魂拓展 (Tinkers' Addons) -barrels-drums-storage-more|桶,圆桶,存储 & 更多 (Barrels, Drums, Storage & More) -wings|翅膀* -up-and-down-and-all-around|颠倒世界* -lost-souls@|失落的灵魂* -intelligent-energistics|智能能源* -ender-compass|末影指南针* -ic2-tweaker -thaumic-gadgets|神秘宝具* -multi-mine|多人开采* -extra-foam-for-liteloader@|Liteloader 修复 (Extra Foam For LiteLoader) -embersified|余烬能量转换* - -thaumic-grid|神秘网络* -back-tools|工具后置 / 后背工具展示* -mapwriter-2|地图作者2* -dartcraft-reloaded|达特工艺重置版* - -ceu -fantastic-lib -dm2|龙骑士2 (Dragon Mounts 2) -tiquality -loot-capacitor-tooltips|电容信息显示* -classic-bars|经典状态条* - -overground-ores|地表矿石* -touhou-little-maid@|车万女仆* - -eureka -lazy-ae2|懒人AE2 (Lazy AE2) -libnine -equaldragons -berries -infinity-gauntlet-mod|无限手套 (Infinity Gauntlet) -mighty-ender-chicken|强大的末影鸡* -malisisadvert|广告牌 (MalisisAdvert) -ido|移动 (Idō) -bat-happy-mod|🦇蝙蝠快乐MOD (🦇 Bat Happy Mod) -viescraft-airships|维斯工艺-飞艇! (ViesCraft - Airships!) -the-ultimate-dimension|究极次元* -advanced-mortars|更好的研钵* - -crafttweaker-utils - - -fps-reducer@|FPS减速器 (FPS Reducer) -freelook@freelook-og|自由视角 (FreeLook) -spacecraftx@spacecraftx-reloaded|航天高科X (SpaceCraftX)¨spacecraftx-reloaded|航天高科X (SpaceCraftX) - -bamboo-everything@|竹子制品*¨bamboo-everything-fabric|竹子制品 (Bamboo Everything) -nofog@no_fog|没有雾 (NoFog) -essentia-brazier|源质火盆* -antipotionmod-1-12-2|无药水效果 (AntiPotionMod) -quark-oddities|夸克-奇思妙想* -fast-food|快餐* -more-carrots|更多的萝卜* -d-maneuver-gear@3d_maneuver_gear|3D立体机动装置 (3D Maneuver Gear) -weapon-craftery|武器工匠* -bobos-supermarket|Bobo的超市 (Bobo's supermarket) -even-more-apples|更多的苹果 (More Apples) -lucky-beans|幸运豆* -cooked -afaoe -birds-foods -morexfood@ -yummy|美味* -spice-of-life-carrot-edition|生活调味料:胡萝卜版 (Spice of Life: Carrot Edition) -refined-exchange -rs-requestify|精致存储:请求者 (Refined Storage: Requestify) -pizzacraft@|披萨工艺 (PizzaCraft) -super-factory-manager@|超级工厂管理器* -sakura|樱* -sips|更多液体容器* -gregs-construct|格雷与匠魂 (Greg's Construct) -ultra-awesome-tools-mod|超级工具 (Super Tools / Ultra Awesome Tools Mod) - -locks|锁* -special-mobs|特殊怪物* -adorn-for-forge@adorn¨adorn -missingbits -@quickcarpet - -locky -baubleshud - - - - -extra-golems|更多傀儡* -craftablecreativemodifier|可合成的创造模式强化头颅 (CraftableCreativeModifier) -ruins-structure-spawning-system|遗迹 (Ruins) -armory-expansion|匠魂盔甲扩展* -wg-block-replacer|方块生成替换器 (WorldGen Block Replacer) -multi-mob-core - -structurize|结构化* - -improvable-skills@|技能进阶 (Improvable Skills 3) - -bounding-box-outline-reloaded@bbor|自然生成建筑结构显示* -sauceconstruct -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|简单农业* -bigger-packets-please -lockyz-extra-dimensions-mod|更多维度世界* - 已失效¨@ledm|更多维度世界 (Lockyz Extra Dimensions Mod) -psi-combat-magic -dtphc|动态的树:潘马斯附属 (Dynamic Trees - Pam's Harvestcraft Compat) -largefluidtank@large-fluid-tank|大型储罐 (Large Fluid Tank)¨largefluidtank-fabric|大型储罐 (Large Fluid Tank) -tumbleweed@|风滚草* -cubicdynamictreescompat -thermallogistics|热力物流学 (Thermal Logistics) -bithop -swordskillsapi -dynamic-sword-skills|动态剑技* -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)¨trashslot-fabric-edition|垃圾槽 (TrashSlot) -player-plates-forge|更多压力板 (Player Plates)¨player-plates-fabric|更多压力板 (Player Plates) -just-sleep|我就睡个觉* -auto-network-lib -click-machine|自动连点器* -mystical-adaptations|更好的神秘农业* -reinforcedtools|强化工具 (ReinforcedTools) -killing-fall -more-dogs|更多狗狗* -snow-variants|更好的雪* -searchable-chests|箱子搜索栏* -bad-mobs@ -mc-paint@mcpaint|涂鸦 (MC Paint) -goprone|匍匐前进 (GoProne)¨goprone-fabric|匍匐前进 (GoProne) -ceiling-torch@|倒置火把* -air-hop@|多段跳*¨air-hop-fabric|多段跳 (Air Hop) -better-combat-mod|更好的战斗* -ftb-money|FTB 交易 (FTB Money) -restricted-portals|传送门限制* -vampirelib@ -ingameconfigmanager|游戏内配置器 (InGameConfigManager) -playerrevive@|玩家救援 (PlayerRevive) -farlands|边境之地 (FarLands) -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@|仁慈的虚空*¨forgiving-void-fabric|仁慈的虚空 (Forgiving Void) -bread-craft|面包工艺* -alchemistry|炼金化学*¨alchemistry-fabric|炼金化学 (Alchemistry) -damage-control|伤害控制* -prestige|成就点* - - -energy-converters|能量桥接器* -signpost|路标* -diagonal-panes|对角线玻璃板* -forgelin -alchemylib -exp-ore-block-mod|经验矿石 (Exp Ore) -more-glowstone|更多荧石* -yukarilib -gregic-additions -instantlava|无限岩浆 (InstantLava) - - -enchantment-descriptions@|附魔描述* -streak|残影* -dttc|动态的树:神秘时代附属 (Dynamic Trees - Thaumcraft Compat) -dtbop@dynamic-trees-biomes-o-plenty|动态的树:超多生物群系附属 (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 -ore-excavation@|矿石挖掘* -stone-chests|石箱子* -kjlib|KJ库 (KJLib) -iron-chest-minecarts|更多箱子矿车* -nether-chest|下界箱子* -mob-kill-messages|击杀信息通知* - -betterdispenser|能喂食的发射器 (BetterDispenser) -shulkerboxdisplay|潜影盒显示器 (ShulkerBoxDisplay) -mycommands|我的命令 (MyCommands) - - - -hearth-well - -tea-and-biscuits|茶和饼干* -controllable|手柄控制*¨controllable-fabric|手柄控制 (Controllable) -genetic-animals@|遗传动物* -stone-chest|石头箱子* -iron-shulker-boxes@|更多潜影盒* -mob-dismemberment|怪物肢解* -zoo-wild-animals-rebuild|野生动物园:重制版 (Zoo & Wild Animals Rebuilt) -kottle -customdrones|自定义无人机 (CustomDrones) -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)¨yungs-better-caves-fabric|YUNG 的洞穴优化 (YUNG's Better Caves) -resynth|神农科技* -flatworld|开山棒 (Flat World) -pymtech|皮姆科技 (PymTech) -corail-tombstone|Corail 的墓碑 (Corail's Tombstone) - - -arcane-archives|奥术档案馆* -divineweapon|神兵 (DivineWeapon) -camera-obscura|朝花夕拾* -animales|动物扩充* -armor-underwear-mod|盔甲内衬* -assisted-progression|进度小助手* -more-buckets@|更多桶* -laggoggles|延迟监视 (LagGoggles) -the-weirding-gadget|古怪装置* -energysynergy|能源协同 (EnergySynergy) -mine-and-slash-reloaded|挖矿与砍杀 (Mine and Slash) - -monster-swarm|怪物云集* -SimplePipes@simple-pipes - -amecs@ -world-primer - -bookworm -openeye|错误报告器 (OpenEye) -let-sleeping-dogs-lie@|嘘,别吵醒狗狗*¨let-sleeping-dogs-lie-for-fabric|嘘,别吵醒狗狗 (Let Sleeping Dogs Lie) - -super-ores|超级矿石* -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@|等价扩展* -schematica -scp-craft-decline|SCPCraft - 下降 (SCPCraft - Decline) -tetra@ -minestrappolation-5 -underwater-biome|深海生态* -create@|机械动力*¨create-fabric@|机械动力 (Create) - - -energeticsheep@energetic-sheep|脉冲羊 (EnergeticSheep) -ensorcellation@|万象* -inventory-sorter|物品分拣* -speedster-heroes|闪电侠* - -curios@¨curios-fabric -village-spawn-point@|村庄出生点*¨village-spawn-point-fabric|村庄出生点 (Village Spawn Point) -spawnercraft|刷怪笼合成 (SpawnerCraft) -openfm|开放电台 (OpenFM) -the-dalek-mod -modular-diversity|模块化多样性* -botanic-bonsai|植物魔法盆栽* -modular-magic|模块化魔法* - -magic-kingdoms-mod|魔法王国 (Magic Kingdoms Mod/Schools of Magic Mod) -zollern-galaxy|卓伦星系* -macaws-bridges@|Macaw的桥梁 (Macaw's Bridges) - -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)¨additional-structures-fabric|失落废墟 (Additional Structures/Rex's Additional Structures) - - - - -enhancedvisuals@|增强视觉效果/拓展视觉效果 (EnhancedVisuals) -potion-fingers-redux|药剂环/药水指环 (Potion Rings) -balloon-sheep|气球羊* -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) -twerk-sim-2k16 -fart-generator|屁能发电机 (Fart Energy Generator) -ex-nihilo-fabrico|无中生有:Fabrico* -holoinventory|物品显示/物品清单 (HoloInventory) -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 -village-names@|村庄名字* -advanced-rocketry-tweaker -alternating-flux|交变磁通* -projectextended|等价交换扩展 (ProjectExtended) -tfc-metallum|群峦合金 (TFC:Metallum) -reactor-turbines-mod-for-ic2 -mutant-beasts|突变生物重置版* -jei-integration@|JEI扩展 (JEI Integration) -funny-fruit|滑稽果 (FunnyFruit) -life-tech|生命工艺* -exponential-power|指数能源* -girl-armor-mod|女式盔甲 (V-Girl Armor Mod) - -nomadic-tents|游牧帐篷* -zetta-industries|泽它重工* -kekztech -by-the-gods|神迹* -bee-angry-est|愤怒的蜜蜂 (Bee Angry-est) -titanium@|钛* -chemlib¨chemlib-fabric -carrots-lib|胡萝卜库 (Carrots Library) -no-hostiles-around-campfire@|围火无怪*¨no-hostiles-around-campfire-fabric|围火无怪 (No Hostiles Around Campfire) -healing-campfire@|治愈营火*¨healing-campfire-fabric|治愈营火 (Healing Campfire) -minetunes -jetif|物品丢入流体 (Just Enough Throwing In Fluids) -rftools-base@|RF工具:基础 (RFTools Base) -flopper@|流体漏斗* -exhausted-stamina|竭力攻击* -staminaplus|耐力值 (StaminaPlus) -enhanced-armaments|增强装备* -spatialcompat|空间兼容 (SpatialCompat) -extended-reach -no-recipe-book|没有配方书* -darknesslib -tfcraft@terrafirmacraft|群峦传说 (TerraFirmaCraft) -redstone-control|红石控制* -snow-real-magic@|雪!真实的魔法!⛄ (Snow! Real Magic! ⛄)¨snow-real-magic-fabric|雪!真实的魔法!⛄ (Snow! Real Magic! ⛄) -comforts@|舒适用品*¨comforts-fabric|舒适用品 (Comforts) -plasmacannon|等离子炮 (PlasmaCannon) -plasmaengines|等离子引擎 (PlasmaEngines) -bonny-food -emerging-technology-hydroponics|新兴技术 (Emerging Technology) - - -twilightopia-phantasy|暮托邦之梦 (Twilightopia) -engineers-decor|工程师的装饰 (Engineer's Decor) -engineers-tools|工程师的工具 (Engineer's Tools) -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) - - -fabric-language-kotlin@ -ftb-backups-forge|FTB备份 (FTB Backups) -cyclopstek|独眼巨人 (CyclopsTek) - -champions@|冠军/强敌* -danger-lies-ahead|前路危机* -croploadcore -defiled-lands|污秽之地* -arcanum|奥秘* -random-enchants|随机附魔* -much-more-spiders-v2|更多种类的蜘蛛 (Much More Spiders) -compressed-items -no-tree-punching@|无树可撸* -harvest-festival-legacy|丰收物语移植版* -friendlymobs|友好的怪物 (FriendlyMobs) -simplecore-api@|简单前置 (SimpleCore API) -topography|地形* -jei-villagers|JEI村民交易查看 (JEI Villagers) -bnbgamingcore -igauntlet|灭霸手套 (IGauntlet) -alcatrazcore -debugserverinfo -the-midnight@|午夜* -moolands|奶牛世界* -egg-craft|蛋工艺* -tinkersextras -poke-lucky|宝可梦幸运方块 (PokeLucky) -usefultnt|更有用的TNT (UsefulTNT) - -crow-flight|乌鸦坐飞机* -findme@|东寻西觅 (FindMe) -minecraft-transit-railway@|我的世界铁路* -random-loot-mod@randomloot|随机战利品* - -tinkers-aether|天境工匠* -mine-and-slash-auto-compatibility|挖矿与砍杀自动兼容 (Mine and Slash Auto Compatibility) -metallurgy-core|冶金核心 (MetallurgyCore) -blank-planet -betterachievements|更好的成就 (Better Achievements) -extra-bows|更多的弓* -forgotten-relics|失落遗物学* -ore-core@|矿石核心* -ordinary-coins|普通硬币* -peanut-mod|花生! (Peanuts!) - -in-game-wiki-mod -betterbedrockgen|更好的基岩 (Better Bedrock Gen) -wsbim-legacy-blocks-and-items -storage-items-mod -what-should-be-in-mc-wsbim -bluestone -effortless-building@ -ic2-classic-tweaker -Ic2c-Crop-Overrides|IC2经典版作物覆盖 (IC2C Crop Overrides) -ic2c-extras|工业时代2经典版拓展 (IC2C Extras) -advanced-solars-classic|高级太阳能经典版* -power-chisels|能量凿子* -ic2c-custom-soils -homing-exp-orbs|经验球归航* -enchantmentglint|自定义附魔光效 (Jabelar's Truly Magical Enchantment Glints) -floricraft|花卉工艺* -weisscore -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@|进入水桶*¨get-in-the-bucket-mod-fabric|进入水桶 (Get In The Bucket Mod) -fertilization|施肥*¨fertilization-fabric|施肥 (Fertilization) -additional-banners@|更多旗帜* -dropt -the-elven-forest|精灵森林 (The Elven Forest​) -the-beneath|深渊世界* -not-enough-characters|NEI 拼音搜索* - -mine-addons-2 -terrafirmacraftplus|群峦传说 + (Terrafirmacraft +) -quick-consume-2|快速摄入2* -mctitle -mgui@mutil -sublib -dense-ores|致密矿石* -archisections -cavecontrol|洞穴控制 (Cave Control) -expandedredstone|红石扩展 (Expanded Redstone) -legacycraft|传统工艺 (LegacyCraft) -geostrata -territoryzone -loottweaks -critterpet -condensedores -treeclimbing -more-electric-tools|更多电力装置* -wireless-fluid-terminal|无线流体终端 (AE2 Wireless Fluid Terminal) -wireless-interface-terminal|无线接口终端 (AE2 Wireless Interface Terminal) -wireless-pattern-terminal|无线样板终端* -better-questing-rf-expansion|更好的任务-RF拓展 (Better Questing - RF Expansion) -hurt-animation-remover -more-cauldrons|更多炼药锅* -parabox -sky-grid -forbidden-arcanus@|禁忌与奥秘 (Forbidden and Arcanus) -mysticalmechanics|奇械学 (Mystical Mechanics API) -backpacked|背包*¨backpacked-fabric|背包 (Backpacked) -starship|星舰 (StarShip) -tweakeroo@ -integrated-rest@ -citadel@ -screenshot-browser|内置截图管理器* - - -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@endorium|末地:重生 (Endorium)¨end-rebellion|末地:重生 (Endorium) - -ezstorage-2|EZ存储2 (EZStorage 2) -more-chickens|更多鸡扩展* -eoa-fa|魔戒:第一纪元 (Eras of Arda: The First Age Legacy submod) -the-rc-mod -rubybyimxiaoanag|红宝石 (Ruby) -jojo-hamon-era@|JoJo: 波纹时代 (JoJo: Hamon Era) - -OpenSecurity|开放式安全* -the-legend-era|传说纪元* -level-up-hp-forge|生命提升 (Level Up HP)¨level-up-hp|生命提升 (Level Up HP) -more-planet-extras -randompatches@|随意修复 (RandomPatches)¨randompatches-fabric|随意修复 (RandomPatches) -ships-mod|船* -tfc-metric|公制重量转换 (TFC Metric) - - - -tfc-additions|群峦附加 (TFC-Additions) -raolcraft-w -litematica@|投影*¨litematica-forge|投影 (Litematica) -telepastries|传送蛋糕 (TelePastries) -heroesexpansion|超级英雄拓展 (HeroesExpansion) -attributefix@|属性修复 (AttributeFix) -dynamic-transport|动态运输* -tool-builder|铸器师* -bountifulbaubles|丰富的饰品 (Bountiful Baubles)¨bountifulbaubles-fabric|丰富的饰品 (Bountiful Baubles) - -manacraft|魔能工艺 (ManaCraft) - - - - -forge-backpacks|更多背包 (Backpacks) -repurpose -unlimited-chisel-works@ -kfc -rainbow-oak-trees|彩虹橡树* -spawntabletweaker|生成调整 (SpawnTableTweaker) -large-ore-deposits|大型矿床* -gregtech6-unofficial|格雷科技6非官方版 (GregTech 6 Unofficial) -mahou-tsukai@|魔法使* - -moar-tinkers -baubley-heart-canisters@|心之容器* -jaopcasingularities@|JAOPCA奇点 (JAOPCA Singularities) - -labymod - - -guidebook -lithium@|锂*¨lithium-forge|锂 (Lithium) -left-2-mine|求生之路* -worldeditcui-forge-edition-2 -world-book -uppers|倒置漏斗* -spartan-weaponry@|斯巴达的武器* -malilib@¨malilib-forge -infraredstone -incorporeal|幻想多媒体* -amun-ra - -mysterious-mountain-lib@mmlib|妖怪之山通用库 (MysteriousMountainLib) -loottweaker -rediscovered@|特性重现* - - -baubles-reborn|饰品栏重置版* -pams-brewcraft|潘马斯酿造工艺 (Pam's Brewcraft) -dirtcraft|泥土工艺 (DirtCraft) -minihud@|迷你HUD (MiniHUD) -potato-craft|土豆工艺* - -bed-patch - -data-loader-forge¨data-loader - -simply-light|更好的灯* -lightning-bolt-mod|雷电攻击* -spartan-and-fire|斯巴达之冰与火 (Spartan and Fire) - -beacons-for-all@¨beacons-for-all-fabric - -more-flowers|更多功能花* - -buzzier-bees@ - -lollipop|棒棒糖* -enemyz|敌意显示* -thaumic-restoration|神秘复辟* - - -primal-boat|原始船舶* -eyes-in-the-darkness -thaumic-augmentation|神秘进阶* -lost-magic|失落的魔法* -thaumic-arcana -thaumic-wonders|神秘奇境* -crimson-warfare -terra-1-to-1-minecraft-world-project -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-legacy -just-map -too-realistic-inventory|真实背包 (Realistic Inventory) -mob-farm|生物农场* -acceleratorcraft|加速器工艺 (AcceleratorCraft) -minecraft-spongebob-squarepants-mod-for-the-1-7-10 -utility-worlds|实用世界* -goblin-traders|哥布林商人*¨goblintraders-fabric|哥布林商人 (Goblin Traders) -divine-favor|神的恩惠* -volumetric-flask|量瓶* -loot-bag-mod|战利品包* - -minecraft-dungeons-mod|我的世界地下城* - -seasonal-bees|季节性蜜蜂* -carpet@|地毯* -handmadegunsmodex|自定义枪械 (HandmadeGuns) -equivalent-additions@|等价拓展* -mixinbootstrap@ -powah -natural-pledge|自然誓约* -more-berries@|更多浆果* -zeiyocraft -time-stages|阶段时间* -additional-events -artemislib - -easy-retrogen|简易重生成* -extraplayerrenderer@|额外玩家渲染 (Extra Player Renderer) -rwbym -libnonymous -shattered-moon -tinkersurvival|匠魂生存 (Tinkers' Survival) -portablecraft|便携物品 (PortableCraft) - -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-revival -extra-spells-electroblobs-wizardry|额外咒语 (Extra Spells) -ancient-spellcraft|古代咒法* -moving-elevators@ -interstellar-exoplanets@|星际:系外行星 (Interstellar: Exoplanets) -infini-tic -extra-disks@|更多磁盘* -optiforge -magic-seeds-for-electroblobs-wizardry|巫术学魔法种子 (Magic seeds for Electroblobs Wizardry) -extra-alchemy@extraalchemy|扩展炼药* -beyond-the-veil|帷幕彼端* -maple-syrup|枫糖* -blood-particles|血液粒子效果* -nyx -lieutenant@ -matthews-difficulty-mod -old-combat-system|旧版战斗系统* -vampires-need-umbrellas -hypnotics|安眠药 (hypnotics) -villager-market|村民市场* - -linear|线性放置* -immersive-portals-for-forge@immersiveportals|沉浸式传送门 (Immersive Portals)¨immersive-portals-mod|沉浸式传送门 (Immersive Portals) -universalbestiary -autumnity@|秋原* -worldgeneration-profiler -chunk-in-a-globe|球内区块* -dragon-mounts-legacy@|龙骑士重置版 (Dragon Mounts: Legacy) -fruit-trees@fruitful-fun|妙趣果园 🍊 (Fruitful Fun 🍊) -journey-into-the-light-mod@jitl|光明之旅·神之本质 (Journey Into the Light · Essence of the Gods) -kitchen-mod|厨房 (The Kitchen Mod) -more-dungeons|更多地牢* -voyage -idealland|理想境* - - -second-screen - -fastasyncworldedit-forge -arcanecraft|奥法工艺 (ArcaneCraft) -retrobees -beebetteratbees|育蜂指南 (BeeBetterAtBees) -inverted-enchantments|负魔书 (InvertedEnchantments) -general-laymans-aesthetic-spying-screen-glass -diy_title|自定义名称前后缀 (diy_title) -tooltweaks|禁用原版工具 (ToolTweaks) -atop|超多生物群系护甲 (Armor for Biomes O' Plenty) -tinkers-forging|工匠锻造 (Tinker's Forging) -gravity-gun|重力枪* -mekanism-additions@|通用机械附加* -signpicture|告示牌图片 (Sign Picture) -vampirism-integrations@|吸血鬼联动* -gottschcore@ -not-enough-crashes@notenoughcrashes|崩溃优化*¨not-enough-crashes-forge|崩溃优化 (Not Enough Crashes) -crash-to-main-menu|崩溃返回主菜单* -tinkers-jei - -better-questing-quest-book@|更好的任务-任务书 (Better Questing - Quest Book) -engineers-doors|工程师的门 (Engineer's Doors) -tps-generator|TPS发电机 (TPS Generator) -better-drowning@|更好的溺水* -bibliotheca -kubejs@¨kubejs-fabric -tickcentral -lowocalizatiwn -redlib -modern-ui@|现代化 UI (Modern UI) -auto-config-updated-api -medieval-madness|中世纪的疯狂* - -caelus@¨caelus-fabric -xeocore -wtbw_lib -dev-world-fabric -threecore -moddirector -function-api -targetingapi -re-targetingapi - -dominionlib - -endergetic@|末地拓展 (The Endergetic Expansion) -swamp-expansion@ -galactictweaks@ -dungeon-tactics|地牢战术* -villagers-nose|村民的鼻子 (Villager's Nose) -dungeons2|自定义地牢2* -lang_tool|加长工具 (lang_tool) - - -emojiful -item-compatibility -aether-lost-content@|天境: 遗失之物 (Aether: Lost Content Addon) -gunpowderlib -nuclearcraft-overhauled@|核电工艺:重制版 (NuclearCraft: Overhauled) -nei-lotr|魔戒NEI插件 (NEI LotR) - -adventure-backpack|探索者背包* -speed-illusion -supertic|匠魂药水效果 (SuperTiC) -the-bumblezone-forge@the-bumblezone|蜜蜂领域/黄蜂领域 (The Bumblezone)¨the-bumblezone-fabric@|蜜蜂领域/黄蜂领域 (The Bumblezone) -beesourceful -middle-earth-industry|中洲工业 (Middle-Earth Industry) -thut-wearables -after-the-drizzle|细雨田园 (After the Drizzle) -cmdcam@|CMD 指令摄影机 (CMDCam) -climate-control-geographicraft@geographicraft|气候控制 / 地理世界 (Climate Control / Geographicraft) - -cosmetic-armor-reworked|时装盔甲重置版* - -efab¨@efab -potion-of-bees@|蜂群药水 (Potion of Bees)¨potion-of-bees-fabric|蜂群药水 (Potion of Bees) -wyrmroost@|猛龙之居* -productivebees@|资源蜜蜂 (Productive Bees) -gkolivers-super-tic - -songs-of-war-mod|战争之歌 (Songs of War) -fluidict -squidcraft@|鱿鱼工艺 (SquidCraft) -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 -snowy-leaves|霜花叶* -materialis@ -tesseract@|超立方体* -carrier-bees|物流蜜蜂* -tinkers-reforged@|工匠再锻* -mystical-world|魔幻世界* -recipes-for-all|配方书全解锁 (Recipes for All) -gregicality -the-lord-of-the-rings-mod-renewed|魔戒:复兴 (The Lord of the Rings Mod: Renewed) -modelloader -animal-crops@|动物作物* -terrafirmacraftneiplugin -furenikusroads@furenikus-roads|Fureniku的路 (Fureniku's Roads) -patchouli-quests|帕秋莉任务手册* -extraacademy|学园附属 (ExtraAcademy) -iitemrenderer-reborn -time-overhaul|时间改革* -steamweapon|梗多武器 (StemWeapon) -counter-guns - -gregtech-chill-edition|格雷科技轻松版 (GregTech: Chill Edition) -custom-player-model-cpm|自定义玩家模型 (Custom Player Model)¨custom-player-model-cpm-remake|自定义玩家模型 (Custom Player Model) -roughly-enough-resources -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@ -pick-pocketer|扒手* -terraforged -rad-metabolosis -mmd-orespawn -tragicmc3|悲惨世界3 (TragicMC 3) - -not-enough-rtgs|更多RTG (Not Enough RTGs) -qmd|量子块动力学 (Quantum Minecraft Dynamics) -environmental-rads -fission-based-neutron-collector|裂变能中子素收集器* -trinity|三位一体* -macaws-windows@|Macaw 的窗户 (Macaw's Windows) -music-player|音乐播放器* -csokicraftutil -large-enchants -angrysun|炙热太阳 (AngrySun) -its-not-long-enough|与现实相同的昼夜交替 (It's Not Long Enough) -sunscreen-gel|防晒霜* -muya1-7-10|姆亚核心 (MuyaCore) -macaws-furniture@|Macaw的家具 (Macaw's Furniture) -macaws-doors@|Macaw 的门 (Macaw's Doors) -blueprint@ -geyser-mod -not-enough-pets@|更多宠物* -potionextension -torchslabs-mod|更好的火把放置 (Torch Slabs Mod) -routerrebornlib -the-magic-doorknob -ultimate-skyblock-generator -everyone-poops-dung-fertilizer|肥料 (Everyone Poops - Dung Fertilizer) -ascension-of-the-divine -nebulaecraft -inventory-overlay|背包显示* -ic2magma -iridium-source|铱矿产* -frogcraft-rebirth|青蛙化工:重生 (FrogCraft: Rebirth) -coaxium-mod-1-12-2-ic2-addon|科亚烯 (Coaxium Mod) -energy-control|能源控制* -gulliver-reborn - -rationcraft -default-options@¨default-options-fabric -ender-mail@|末影邮递* -more-overlays|更多叠加层* -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|生命附魔* -karat-garden|克拉的花园* - -bard-mania -shulkerboxtooltip@|潜影盒提示框 (Shulker Box Tooltip) - -crafting-dead-official|行尸走肉 (Crafting Dead)¨crafting-dead-legacy|行尸走肉 (Crafting Dead) -lord-craft - - -stupid-things -more-gems-fabric|更多宝石 (More Gems) -minewars -gregicadditionscompatibility -combined-potions|组合药水* -plusticminusbad -baileys-dailies -joshuas-christmas-mod -enderio-fluxified@ -skizzik - - -sandbag|沙袋* -tinkers-arsenal -garbage-energy|废品能源炉* -quirky-generators -megaloot|超级战利品 (MegaLoot) - -mad-villagers|疯狂的村民* -logical-drops|逻辑工艺 (Logical Craft / Logical Drops) -drone-craft -water-source|水源* - -hungteens-plants-vs-zombies-mod@pangteens-plants-vs-zombies|HungTeen的植物大战僵尸 (HungTeen's Plants vs Zombies Mod) -pams-desertcraft|潘马斯沙漠工艺 (Pam's DesertCraft) -pams-bonecraft|潘马斯骨头工艺 (Pam's BoneCraft) -thermal-singularities|热力奇点* -minejurassic -terraria-craft@terrariacraft|泰拉瑞亚世界 (TerrariaCraft 🌳) -colytra@|鞘翅胸甲*¨colytra-fabric|鞘翅胸甲 (Colytra) -insects|昆虫* -sound-reloader|声音重载* -tool-belt|工具皮带* -argentina-food-mod|阿根廷的食物* -pet-names@|宠物名字*¨pet-names-fabric|宠物名字 (Pet Names) -collective@¨collective-fabric -giselbaers-durability-viewer@durabilityviewer|耐久指示器 (Durability Viewer) -more-cookies|更多饼干* -apple-carrot|苹果胡萝卜* -eat-yo-veg -bountiful@|赏金*¨bountiful-fabric|赏金 (Bountiful) -betterenchantment|更好的附魔 (BetterEnchantment) -purified-flesh-mod@|纯净的腐肉* -gotminecraftmod@|权力的游戏 (Game of Thrones Mod) -nosleep|禁止睡觉 (No Sleep) -minersadvantage|矿工的优势 (MinersAdvantage) - -simple-backpack-fabric|简单背包 (Simple Backpack) - -gas-conduits|气体导管* -handgun-from-terraria -more-discs-mod|更多唱片 (More discs mod) -edible-honeycombs -emerald-and-ruby -craftable-nametag|可合成的命名牌* -dyeable-flower-pots|染色花盆 (More Flower Pots / Dyeable Flower Pots)¨more-flower-pots|染色花盆 (More Flower Pots / Dyeable Flower Pots) -graffiti|涂鸦* -bunny-boots -backported-flora -eat-eggs -wool-plates|羊毛压力板* -more-berry-uses|更多浆果用途* -elemental-blades|元素之刃 (Elemental Blades / Elementium) -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) -bacteriums|细菌重置版 (Bacterium)¨bacterium|细菌重置版* -pillagers|掠夺者* -guard-villagers@|警卫村民* -simple-machinery|简单机器* - -bridge-maker@|桥梁制造者* -craft-your-saddle -no-pvp-cooldown -never-break|损坏防护* -simple-villager-spawn-egg -banana-decor-forge -immersive-metal|沉浸金属* -coffee-time -drink-mod|饮料模组* -more-zombie-villagers@|更多僵尸村民*¨more-zombie-villagers-fabric|更多僵尸村民 (More Zombie Villagers) -naturally-charged-creepers@|自然生成闪电苦力怕*¨naturally-charged-creepers-fabric|自然生成闪电苦力怕 (Naturally Charged Creepers) -skinport|皮肤移植 (SkinPort) -dynamic-surroundings-soundcontrol|动态环境:音效控制 (Dynamic Surroundings: SoundControl) - -chop-down-updated -aegis-weapon-system-mod|宙斯盾作战系统-战舰模组 (Aegis Weapon System -Warship's Mod) -advanced-hook-launchers|高级钩爪发射器* -vampire-magic -fantasyunderworld|江湖行 (fantasyunderworld) -stacc -a-riot-of-colour-craft|五彩斑斓工艺 (a riot of colour craft) -crop-dusting|排气施肥* -dynamic-surroundings-mobeffects|动态环境:生物效果 (Dynamic Surroundings: MobEffects) -dynamic-surroundings-environs|动态环境:周边环境 (Dynamic Surroundings: Environs) -recipe-stages|配方阶段* -attack-on-minecraft@wingsoffreedom|自由之翼 (Wings of Freedom) -cavern-miner|洞穴:矿工 (Cavern: Miner) -vanilla-tools|原版工具+ (Vanilla Plus Tools) -server-tab-info@ -letsencryptcraft -creeperhost-minetogether - -fullscreen-windowed-borderless-for-minecraft|窗口化全屏 (Fullscreen Windowed (Borderless) for Minecraft) -nocurse|不诅咒 (NoCurse) -pretty-beaches¨pretty-beaches-fabric -qing_gong|轻功 (qing_gong) -remnants|腐败* - -pane-in-the-glass -dynamic-dynamos|能源炉动画* -trophy-slots - -replanting-crops@|补种农作物*¨replanting-crops-fabric|补种农作物 (Replanting Crops) -complex-crops -screenshot-to-clipboard@|截图到剪贴板 (Screenshot to Clipboard)¨screenshot-to-clipboard-fabric|截图到剪贴板 (Screenshot to Clipboard) -hide-armor|隐藏盔甲* -hunterillager@hunters-return|邪猎者 (HunterIllager) - -pocket-apocalypse-mod|便携式天灾* -compass|指南针 (compass) -tinkers-evolution@|匠魂进化 (Tinkers' Evolution) -tinkers-exporter|匠魂数据导出器* -farlanders@the-farlanders|更多末影人 (The Farlanders) -vials|瓶瓶罐罐* -advanced-lightsabers|高级光剑* -fall_attack|下落击杀 (fall_attack) -swimsuit|泳装 (swimsuit) -more-overlays-updated@ -dothack-hack-weapons -immersive-energy|沉浸能源* -crimson-moon|绯红之月* -mobs-attempt-parkour@ -identity|化身*¨identity-on-forge|化身 (Identity) -industrial-revolution@|工业革命* -art-of-alchemy|炼金艺术 (Art of Alchemy) -lan-server-properties@|自定义局域网联机* - -immersive-intelligence@|沉浸智能* -analyzeio -wool-buttons@|羊毛按钮* -total-tinkers|统合匠艺* - -thaumic-wands|神秘法杖* -japanese-food-mod|日式料理* -pandoras-creatures|潘多拉生物* -status-tags|名称标签状态栏* -just-enough-dimensions@|维度配置* -multishot@|延时摄影* -tweakers-construct|匠魂调整* -valhelsia-structures - - -just-enough-reactors -aoa-infobundle|虚无世界信息包 (AoA InfoBundle) -mana-and-artifice|魔法艺术3:巧工魔艺 (Mana and Artifice) - 官方主要渠道¨@mana-and-artifice|魔法艺术3:巧工魔艺 (Mana and Artifice) - - -slab-helper|半砖小帮手* -no-jumping-allowed|禁止跳跃* -swan-boats|天鹅船* -primal-winter@|原始寒冬* -better-burning@|更好的燃烧机制* -compact-void-miners|紧凑型虚空采矿机* -probe -mekanism-fluxified|“通量”机械* -stepup|平滑自动上坡 (StepUp) -sodium@|钠* - -netherlicious -yungs-better-mineshafts-forge@yungs-better-mineshafts|YUNG 的矿井优化 (YUNG's Better Mineshafts)¨yungs-better-mineshafts-fabric|YUNG 的矿井优化 (YUNG's Better Mineshafts)¨yungs-better-mineshafts-neoforge|YUNG 的矿井优化 (YUNG's Better Mineshafts) -terrible-chest|可怕的箱子/可怖箱子* -spartan-shields@|斯巴达之盾* -silent-gear@|寂静装备* - -simple-smeltery-accelerator|匠魂冶炼炉加速器* -portality -natural-absorption|伤害吸收天赋* -unique-enchantments|独特的附魔* -tombstone-revived|墓碑:复生 (Tombstone: Revived) -travelers-backpack-integrations|旅行者背包集成 (Traveler's Backpack Integrations) -Baby-Mobs|Baby生物* -compressedblock|压缩方块 (Compressed Block) -wildnature|狂野自然 (Wild Nature) -novam-terram -terrafirmathings|群峦作品 (Terra Firma Things) - -simpledifficulty|坚定意志 (SimpleDifficulty) -minema -tfctech-unofficial|群峦工业非官方版 (TFCTech Unofficial) -@ee1|等价交换 (Equivalent Exchange) -invmove@|边拿边走 (InvMove)¨invmove-fabric|边拿边走 (InvMove)¨invmove-forge|边拿边走 (InvMove) -autofish-for-forge|自动钓鱼Forge版 (AutoFish for Forge) -industrial-upgrade@industrialupgrade|工业升级* -rpgstats@ -datapackrecipemaker|数据包配方助手 (Datapack Recipe Maker) -never-needed-or-wanted -ama-damage-indicator - -magic-circle|阵法* -crash-utilities@ -eldritch-mobs@ -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|全局数据包 (Global Packs/Global Data & Resourcepacks) -mob-farm-nerfer -blood-in-the-water -bio-technik - - -astromine-fabric|天体矿工 (Astromine - Machines n' Space!) -rustic-thaumaturgy|神秘乡村* - -thallium|铊* -haema@ -evil-ores -unsuspicious-stew@|炖菜解谜/炖菜效果显示* -tfc-seasonal -imblockerfabric@imblocker|输入法冲突修复 (IMBlockerFabric) -saomclib -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-forge@campanion|野营物品 (Campanion)¨campanion|野营物品* - Farbic -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) - -project-red-fabrication|红石计划:制作 (Project Red - Fabrication) -project-red-integration|红石计划:集成 (Project Red - Integration) - -project-red-world|红石计划:探索 (Project Red - World) -project-red-compat|红石计划:兼容性 (Project Red - Compat) -canvas-renderer@canvas|Canvas 渲染器* - -coolfood|冷饮 (CoolFood) -infinitevillagertrading@|无限村民交易 (InfiniteVillagerTrading) -infinite-trading@|无限交易*¨infinite-trading-fabric|无限交易 (Infinite Trading) -better-loading-screen@custom-loading-screen|自定义加载画面 (Custom Loading Screen) -extended-lights-mod|灯具拓展 (Extended Lights) -more-swords-legacy@|更多剑:传承* -the-undergarden@|深暗之园* -mc-modsure|诱惑 (Allure) - -glibys-voice-chat-reloaded|Gliby的语音聊天重置版 (Gliby's Voice Chat Reloaded) -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)¨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@exnihilosequentia|无中生有:传承 (Ex Nihilo: Sequentia) -toms-storage@|汤姆的简易存储 (Tom's Simple Storage Mod)¨toms-storage-fabric|汤姆的简易存储 (Tom's Simple Storage Mod) -fishing-real@|更真实的钓鱼* -maessentials -lingering-loot -ugraded-netherite@upgraded-netherite|下界合金增强 (Upgraded Netherite) - -inventory-profiles|一键背包整理* -slimevoid-library -kotlin-for-forge@ -fabric-zero -towers-of-the-wild|旷野之塔* -sausagecore|香肠核心 (SausageCore) -shadowlands@|暗影之地* -polymorph@|多态合成*¨polymorph-fabric|多态合成 (Polymorph) -scalable-cats-force@ -otyacraft-engine -omega-craft-mod -custom-ports|自定义局域网端口 (Custom LAN Ports) -decorative-blocks@|装饰方块* -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@ -pams-harvestcraft-2-crops@|潘马斯农场2 - 作物 (Pam's HarvestCraft 2 - Crops) -base-metals|基础金属* - -mmdlib -just-poop-mod|屎! (Poop Mod!) -costumes|服装* -eyemod-phone -upgrade-aquatic@|碧海新生* -tfc-ambiental -macaws-trapdoors@|Macaw的活板门 (Macaw's Trapdoors) -zenutil - -better-beacon-effect|更好的信标效果* -netherite-horse-armor@netherite_horse_armor|下界合金马铠* -tacocraft-fabric -lootr@¨lootr-fabric -biolib@bio-library -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) -better-minecart-rotation-forge¨minecart-direction-follow -modern-metals|现代金属* -blockrenderer¨block-renderer -blockus@ -conjurers-cookbook -color-unchained -aportingcore|移植核心 (APortingCore) -ywlib -sweet-potato|烤地瓜 (Sweet Potato Mod) -redstone-lantern|红石灯笼* -culinaire@|烹饪* -furbishcraft - - -ambientsounds@|自然音效 (AmbientSounds) -ordinary-firearms|普通枪械2 (Ordinary Firearms 2) -territory|领地 (MineTerritory) -better-ping-display@|更好的延迟显示*¨better-ping-display-fabric@|更好的延迟显示 (Better Ping Display) -turned-the-changed-mod -survival-tweaks|生存微调* -melon-slabs@|西瓜台阶* -lambdynamiclights@|Lambd的动态光源 (LambDynamicLights) -realistic-torches@|真实火把* - -durability-viewer|耐久显示器* - - - -ground-item-highlighting|地面物品高光显示* - -real-survivor@realsurvivor|幸存者 (RealSurvivor) -armor-toughness-bar|盔甲韧性显示* -block-meter -time-to-live -dual-hotbar-1-12-2|双重快捷栏1.12.2 (Dual Hotbars 1.12.2) -cha-s@|可合成的马铠和鞍 (Craftable Horse Armour & Saddle) -dual-hotbar|双重快捷栏 (Dual Hotbars) -travellers-boots@ - -cofh-vanilla-satchels -betteranimalsplus|更多动物 (Better Animals Plus) -packagedauto@|封包合成 (PackagedAuto) -packagedexcrafting@|封包合成拓展 (PackagedExCrafting) - -compactstorage@compact-storage|紧凑存储 (compactstorage) -useful-backpacks@|实用背包* -conquest-reforged@|征服者* -steelseries-gamesense -pizzaatimes-timber-mod -tellme@ -minerva-library - - - -edit-sign@editsign|编辑告示牌* -logistical-automation -dynamic-view|动态视距*¨dynamic-view-fabric|动态视距 (Dynamic View) - -instrumental-mobs@|乐器怪物* -finder-compass -spacering|储物戒 (SpaceRing) -doot¨trumpet-skeleton-redooted¨trumpet-skeleton-fabric - -emotes -oc-sensors -fabric-for-fabric -storage-tech -thaumic-periphery|神秘外饰* -embellishcraft@|装饰工艺 (EmbellishCraft) -open-loader@|开放式加载* -deep-mob-learning-refabricated@|深度怪物学习:重制版 (Deep Mob Learning: Refabricated) -ftb-ultimine-forge|连锁破坏 (FTB Ultimine)¨ftb-ultimine-fabric|连锁破坏 (FTB Ultimine) -server-translation-api¨server-translations -image2map@ -corpse@|遗体* -ring-of-the-miner-fabric|矿工戒指 (Ring of the Miner)¨ring-of-the-miner-forge|矿工戒指 (Ring of the Miner) -instant-bubble-studio|瞬息气泡工坊* - - - - - -kaleido - -crock-pot|烹饪锅* - - - - - - - - -together-forever -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|熔岩怪* -tumat -riddle-chests|谜题箱* - -totem-plus|图腾增强* -blockmeterfabric@blockmeter|方块计量表 (Block Meter Fabric) - -fluid-drawers|储液抽屉* -creepypastacraft-reborn|蠕动意面重置版 (CreepyPastaCraft Reborn) -itemzoom|物品缩放 (ItemZoom) -light-overlay@|亮度覆盖* -smallerfpsincrements -regex-filters|正则表达式过滤器* - -fluidsystem@|流体系统 (FluidSystem) -falling-tree@fallingtree|伐树 (FallingTree) -untranslated-items|物品名称双语同屏* -particle-culling@|粒子渲染机制优化* -aggressive-chickens -entity-culling@|实体渲染机制优化* -hammerandvil|锻造锤与锤锻台 (HammerAndVil) - -simply-backpacks|简易背包* - -better-placement|更好的放置* -fat-cat|大资本家* -waystones2waypoints|传送石碑路径点 (Waystones2Waypoints) -beta-days@|B测往昔* -trajectory-preview|弹道预览*¨trajectory-preview-fabric|弹道预览 (Trajectory Preview) -xp-spawner-control|刷怪笼经验控制* -mob-spawner-control|刷怪箱控制与修改* -refined-pipes|精致管道* -singularities|奇点* -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) -diggus-maximus@|连锁挖掘* -super-sentai-craft|超级战队工艺* -wildly-eat|狼吞虎咽* -gotta-climb-fast|快速爬梯 (Gotta Climb Fast!) -can-i-mine-this-block@|我­­ 能 挖 它 吗? (cAn i MiNe thIS bLOCk?) -rotten-creatures@rottencreatures|腐烂生物* -fairy-lights|圣诞彩灯* -packmode -dank-null -avaritia-complement -better-questing-triggerer -Broken-Wings - -compacter|压缩者* - -not-enough-potions -framed-compacting-drawers|镶框压缩抽屉* -discordsuite -mikes-mods-library -Teslafied -shurlin|仙灵* -mob-amputation|怪物截肢* -packguard -wtfs-texturegeneratorlib -more-totems-of-undying|更多的不死图腾* -dungeon-crawl@dungeoncrawl -tesslocator|超立方转运器* -iblis-headshots|爆头击杀* -bee-barker -sky-bonsais|天空盆景* - -origins@|起源 (Origins (Fabric)) -alexiillib -feed-a-friend - - -the-legend-of-herobrine@ -extra-origins@|起源扩展* -caves-and-cliffs -miner-golems|矿工傀儡* -bakadanmaku@|直播弹幕模组 (BakaDanmaku) -online-card|网络卡片* -felling|连锁砍树* -extra-player-render|额外玩家渲染 (Extra Player Renderer) -fabric-api@ -coloredlanterns|多彩灯笼 (ColoredLanterns) -ae2-fluid-crafting|AE2流体合成套件 (AE2 Fluid Crafting) -cardinal-energy|能量基本* -travel-anchors@|旅行锚* -bnbgaminglib -triumph -overloaded-armor-bar@|护甲上限突破*¨overloaded-armor-bar-fabric|护甲上限突破 (Overloaded Armor Bar) -toomanydanyores -glass-pipe|玻璃管道* -origins-classes@|起源:职业 (Origins: Classes) -plonk@|世界内物品放置* -baritone-simply -potionsmaster|魔药大师 (Potions Master) -tinkered-hegemony@|匠器主导* -better-impaling@|更好的穿刺附魔* -caliper -botanical-machinery@|植物机械* -demagnetize|消磁* - - - - -cinderscapes@|余烬奇景* -tfc-homestead -tfctinkers|群峦与匠魂 (TFC Tinkers) -thick-font-fix - -dynamic-trees-traverse|动态的树:遍历附属 (Dynamic Trees - Traverse) -mcmt-multithreading@mcmtfabric¨mcmtfabric -bwm-core -ice-ice-baby|冰术师* -hardlib -bilingualname|物品名称双语显示 (BilingualName) -chlorine|氯* - -bedrock-miner@|基岩矿工* -reasonable-realism|合理的现实主义* -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)¨fluid-physics|流体物理* -zettai-grimoires -runorama|全景截图背景* -item-stages@|物品阶段* -rocksalt -cazfps-the-dead-sea|死亡之海 (CAZfps The Dead Sea) -pouch-of-unknown|未知之袋 (Pouch of Unknown) -wizardry-fates -the-mighty-architect -phosphophyllite -biggerreactors -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) -config-checker|整合包配置检测 (Modpack Configuration Checker) -thaumic-speedup -armor-curve|盔甲曲线修改* -ambience-extras|环境音乐:附加 (Ambience - Extras) -additions-mod -extracpus|更多CPU (Extra CPUs) -extra-crafting-storage - -underground-city-engineering@|地下城市工程* -essentials@essentialsmod -soul-shards-respawn -soul-shards-the-old-ways - -the-flying-things -ftb-ranks¨ftb-ranks-fabric -ftb-chunks-forge|FTB 区块 (FTB Chunks)¨ftb-chunks-fabric|FTB 区块 (FTB Chunks) -ftb-essentials -silveroak-outpost|银橡前哨* -pehkui@ -jeitweaker -yungs-law -libx@ -atmospheric@|悠然一派* -monospace-font|等宽字体 (Monospace font) - -mana-liquidizer@|魔力液化器* -neapolitan@|那不勒斯风味* -clear-despawn@cleardespawn¨clear-despawn-fabric -tinkers-modifier-modifier|匠魂强化修改 (Tinkers' Modifier Modifier) -randomtweaks|随意微调 (RandomTweaks) -zettai-magic -strawgolem-reborn@straw-golem|稻草傀儡重制版 (Straw Golem Reborn)¨straw-golem-reborn|稻草傀儡重制版* -rare-ice@|冰中有宝* -create-integration -the-magic-mirror@|魔镜* - -boatload@|额外船只 (Extra Boats / Boatload)¨extra-boats@|额外船只 (Extra Boats / Boatload) -outvoted@|落选生物* - -attribute|属性修复 - Fabric版 (Attribute Fix {FABRIC}) -packmodemenu|PackMode 菜单 (PackModeMenu) -simple-gamemodes|游戏模式短指令* -uniq|流体统一/物品统一 (UniQ) - -harder-ores|更难的矿物处理* -rune-craft@runecraft -geckolib@ -memory-cleaner-mod|内存自动清理* -ore-flowers|矿物花卉* -aqua-creepers|水下苦力怕 (Aqua Creepers!) -extrastorage@|更多存储 (ExtraStorage) -thermal-locomotion@|热力运输* -external-tweaker -morebiomesxl -notes@|笔记* -stare-till-they-grow|盯到它们熟为止! (Stare Till They Grow!) -vm-computers|虚拟电脑 (VM Computers) -inventory-free|无物品栏 (Inventory-Free) - -randompatches-integration -bubble-column-elevator-backport|1.13水域机制 (1.13 Bubble Columns for 1.12) -basic-nether-ores@|基础下界矿石* -nuclearcraft-reactor-builder|核电工艺反应堆建造机 (NuclearCraft Reactor Builder) -pams-harvestcraft-2-food-core@|潘马斯农场2 - 食物核心 (Pam's HarvestCraft 2 - Food Core) -eki-lib -@immibis-core -nodami|伤害免疫机制移除 (No Damage Immunity) -astrological-sorcery@|星占魔法* -efab-ct-bindings -golden-hopper|金漏斗* -wizardry-golems|巫术傀儡* - - -devtech|GTCEu-CrT开发套件* - - - - - -jurassic-world-reborn-mod|侏罗纪重生 (Jurassic Reborn) - -cardboard@ -enchanting-with-thaumcraft|神秘附魔学* -crimson-revelations|血腥启示 (Crimson Revelation) -environmental-core@ -bigger-crafting-tables@biggercraftingtables -covers-everywhere|万用覆盖板* -mo-villages|更多村庄 (Mo' Villages) -inventoryneko -loading-screens|自定义加载画面* -ofms-crisis-ridden|OFMS:危机重重 (OFMS:crisis-ridden) -dupefix-project -ore-control|矿物控制* -twitch-chat-integration|Twitch信息显示* - - -avaritia-lite|无尽贪婪精简版* -packmenu - -console-experience|原主机版界面特性* - - -mite-reborn|MITE:重生 (MITE:Reborn) -detailed-technology|细节科技* -oreberries|矿莓* -stone-block-utilities -mystical-creations -multiconnect@ -art-of-alchemy-memoriam|炼金艺术:纪念版 (Art of Alchemy: Memoriam) -blockphysics|方块物理 (BlockPhysics) -stoneblock-dimensions -charging-gadgets|充电设备* -integration-foregoing|工业先锋集成附属* -enderfuge|末影熔炉* -calm-down-zombie-guy -universal-mod-core@|通用模组核心* -suspended-server|挂起服务器* -starlight-forge@|星光 (Starlight)¨starlight@|星光*¨starlight-neoforge@|星光 (Starlight) -research-table|研究台 🔬 (Research Table 🔬) -shoulder-surfing-reloaded@|越肩视角重制* -aqua-acrobatics|水游技艺* -silents-mechanisms|寂静机械 (Silent Mechanisms) -project-potman|背锅人计划 (ProjectPotman) -nbt-crafting@|数据包 NBT 合并* -diregoo -ogdragon|OG龙+ (OGDragon+) -sevtweaks -journeymapstages|旅行地图阶段控制 (JourneyMapStages) -textile-backup@textile_backup|Textile 备份* -goopers -mob-drops|自定义生物战利品 (Mob Drops Your Way) - -alexs-mobs@|Alex 的生物 (Alex's Mobs) -mc-mods-stackable@all-stackable|可堆叠物品自定义 (All Stackable) -thermal-mj|热力MJ支持 (Thermal MJ) -ctd-core@ -time-speed-mod|Minecraft地球自转/真实昼夜循环 (Вращение Земли Майнкрафтская (Accurate day/night-cycles Mod)) - -mineral-tracker -carpet-extra@|Carpet 拓展* - -viafabric@ -double-slabs|双重台阶* -tools-and-armor-bop|超多生物群系:旧工具和装甲 (Tools And Armor - BOP) -centralized-materials|集中材料* -server-sided-chunk-loader|服务器端区块加载器* -fluid-cows|流体牛 (Fluid cows) -shulkerboxviewer -gameinfo|游戏信息 (GameInfo) -arcaea|Arcaea韵律源点* -advanced-tfc-tech|进阶群峦科技 (Advanced TFC Tech) -enriched@|原版增强 (Enriched/Vanilla Enhanced) -satisforestry -asmc@ -simple-generators@|简易发电机* -tfc-bonsai|群峦盆栽 (TFC Bonsai) -tfc-drying-rack|群峦晾干架 (TFC Drying Rack) - -lumen|流明 (Lumen 🔥) -openblocks-elevator@elevatormod|开放式电梯 (OpenBlocks Elevator / ElevatorMod) -crafttweaker-integration|CrT集成 (CraftTweaker Integration) - -spiders-2-0|蜘蛛行为增强 (Spiders 2.0) - -hammer-metals|锤子材料* -bunch-of-biomes|生物群系扩充 (Bunch Of Biomes!) - -better-slimes|更好的史莱姆* -windowlogging|玻璃板贴合* -the-time-stop-mod|时间静止* - -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) -wandering-trapper|流浪猎人* -chocolate-fix -thaumcraft-4-scrolling@tc4tweaks -orderly -water-control-extreme -variant16x -endremastered@endrem|末地:创世 (End Remastered)¨endremastered-fabric|末地:创世 (End Remastered) - -unique-crops|独特作物* -yungs-api@¨yungs-api-fabric¨yungs-api-neoforge -dawn -assembly-line-machines|装配线* -netherending-ores -Flex-FOV|扭曲视野* -hooked@|抓钩* -createtweaker@ -iTorch - -gullivern -nbt-manipulator - - -sulfur-and-potassium-make-more-gunpowder -statues@|雕像* -advanced-mining-dimension@|先进的采矿维度* -time-travel-mod|时间旅行* -backslotaddon@|背用武器拓展 (BackSlotAddon) -optifabric-1-8-9 - -gt6-ore-helper|GT6 矿石助手 (GT6 Ore Helper) -applied-integrations|应用集成* - -inventory-hud-forge@inventoryhudplus|物品栏HUD+ (Inventory HUD+) - -langsplit@ -legacy-fabric-api@ -krypton@|氪* -mana-gear -not-enough-enchantments -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) - -ridable-ender-pearls|可骑乘末影珍珠* -gildedarmor@|镀金盔甲 (GildedArmor) -deadly-book|致命书本* -speedy-hoppers|极速漏斗* -indium@|铟* - - -go-fish|一起钓鱼吧!* -more-player-models|更多玩家模型* -loot-overhaul -miners-helmet@|矿工头盔 (Miner's Helmet) -lightweight-blood-mechanics|轻量级流血机制* -kbackup-fabric -smooth-boot@smoothboot-fabric|流畅加载*¨smooth-boot-forge|流畅加载 (Smooth Boot) - -netherite-plus-mod@|下界合金拓展* -chunkpregenerator|区块预生成器 (Chunk-Pregenerator) -antighost@|幽灵方块同步修复 (AntiGhost) - -backslot@|背用武器 (BackSlot) -minecraftcapes-mod@minecraftcapes - -spartan-weaponry-arcana|斯巴达奥法* - -greek-fantasy|希腊幻想* -architectury-api@ - - -createaddition@ -smithee -dragon-egg-replicator|龙蛋复制器* - -elemental-ingots-ei|元素锭 (Elemental Ingots) -solargeneration|太阳能发电机 (Solar Generation) -enchant-with-mob@enchantwithmob - -worldstatecheckpoints -dungeons-plus@ -liquid-enchanting|药水附魔* -shutup-experimental-settings|禁用实验性设置警告 (Shutup Experimental Settings!) -datafixerslayer -hexcraft -police-mod|警察* -enhanced-celestials@|月亮事件*¨enhanced-celestials-fabric|月亮事件 (Enhanced Celestials) -resourceful-bees@|缤纷蜜蜂* -held-item-info@|手持物品信息* -cleancut@|干净利落 (CleanCut) -plus-tweaks -global-gamerules@|全局游戏规则 (Global GameRules) - -save-my-stronghold-fabric¨save-my-stronghold -physics-mod@physicsmod|真实物理* -bluemap -dregora|德雷戈拉* -k4lib -deadly-end-phantoms -spice-of-life-potato-edition|生活调味料:马铃薯版 (Spice of Life: Potato Edition) -easiervillagertrading@|简单村民交易 (EasierVillagerTrading)¨easiervillagertrading-2|简单村民交易 (EasierVillagerTrading) -wwta@|聊天栏时间显示 (When Was That Again) -ars-nouveau@|新生魔艺* -eidolon|幻梦* -rats-ratlantis|老鼠:鼠西洲 (Rats: Ratlantis) -wthit@¨wthit-forge -modern-industrialization@|现代工业化* -chunk-pregenerator-fabric@fabricquilt-chunk-pregenerator|区块预生成器(Fabric) (Fabric Chunk Pregenerator) -jumploader -unloader -better-animal-models|更真实的动物 (Better animal models) -@mine-little-pony|我的小马驹 (Mine Little Pony) - -druidcraft|德鲁伊工艺* -berry-good@ -savage-and-ravage@|残暴与掠夺 (Savage & Ravage) -jade@|玉 🔍 (Jade 🔍) -somnia@|梦醒时分 (Somnia Awoken) -industrial-reborn@ -mo-structures-forge@mo-structures|更多自然生成结构 (Mo' Structures)¨mo-structures|更多自然生成结构 (Mo' Structures) -wallpapercraft-a-fresh-roll|墙纸创造 (Wallpapercraft - A Fresh Roll) - - - -unionlib@ -botany-trees@|植树盆栽* -better-third-person@ -survive@|生存要素* -wallpapercraft-a-fresh-roll-stairs|墙纸创造:楼梯 (Wallpapercraft - A Fresh Roll (Stairs!)) -wallpapercraft-a-fresh-roll-slabs|墙纸创造:台阶 (Wallpapercraft - A Fresh Roll (Slabs!)) -wallpapercraft-a-fresh-roll-walls|墙纸创造:围墙 (Wallpapercraft - A Fresh Roll (Walls!)) -compact-crafting -assembly-lines@|装配线* -botany-pots@|植物盆栽* -callable-horses|召之马来* - -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¨spatial-harvesters-fabric -emotecraft@|表情工艺*¨emotecraft-forge|表情工艺 (Emotecraft) -pattysmorestuff@ -hats|帽子* -smoother-bedrock|平滑基岩层* -c2me-fabric@|C^2M 引擎 (C^2M-Engine/Concurrent Chunk Management Engine)¨@c2me-neoforge|C^2M 引擎 (C^2M-Engine/Concurrent Chunk Management Engine) -datapack-anvil@dpanvil -nuclear-science@|核科学* -glaretorch|强光火把 (Glare Torch) -mrcrayfishs-jumping-castle-mod|MrCrayfish的充气城堡 (MrCrayfish's Jumping Castle) -exposer -to-the-bat-poles -cc-restitched@ -wearables|可穿戴设备* -@advancedfurnace|先进熔炉 (Advanced Furnace) - -better-weather|更好的天气*¨better-weather-fabric|更好的天气 (Better Weather) -ultimate-car-mod@|终极汽车* -craft-time|耗时合成 (Craft Takes Time) -betterf3@|更好的F3 (BetterF3) - -the-abyss-chapter-ii|深渊:第二章 (The Abyss: Chapter II / The Abyss II - The Other Side) -mapper-base@ -bedrockify@bedrockIfy - -rftools-power@|RF工具:能量 (RFTools Power) -pipez@ -coins-je@ - -beenfo@|蜂巢信息* -chest-building-blocks -zycraft -quitconfirm|退出前确认 (QuitConfirm) -ruined-equipment@ -clickthrough@|穿牌开箱 (ClickThrough) -dynamic-sound-filters@|动态声音滤波器* -binniepatcher -subterranean-wilderness - -construction-wand@|建筑手杖* -squeedometer - -forgery@fabrication¨fabrication -mcdj -boost-boots -better-sodium-video-settings-button@|更好的钠视频设置按钮* - -artisan-worktables-1-16|工匠之作2 / 工匠工作台2 (Artisan Worktables 2 / Artisan Worktables 1.16) -thermal-solars -supplementaries@|锦致装饰* -more-fuels-mod - -pointless-tech-collective -revampedwolf@ -bedrock-b-gone@ - -elemental-creepers-og@elemental-creepers|元素爬行者 (Elemental Creepers)¨elemental-creepers|元素爬行者* -gymcraft -infernal-expansion@|地狱扩展* - - -configurable-mob-potion-effects@|怪物药水效果自定义*¨configurable-mob-potion-effects-fabric|怪物药水效果自定义 (Configurable Mob Potion Effects) -sapience -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 -xnicex@ -krate -chickensshed@|鸡棚重置版 (ChickensShed) -chickenshed -expanded-storage@|扩展存储*¨expanded-storage-fabric|扩展存储 (Expanded Storage)¨expanded-storage-forge|扩展存储 (Expanded Storage) -project-mmo@ -abnormals-delight@ -jojos-bizarre-survival - -somnus@ -lost-trinkets|遗失饰物* -lookingglass -environmental@|自然环境* - -golden-airport-pack-immersive-vehicles-content - -hole-filler-mod@|洞口填充器 (Hole Filler) - -simply-tea|简单的茶! (Simply Tea!) -buttermilk -diet@|均衡饮食* -brazilian-fields|巴西风情* -ae2-extras|AE2 附加 (AE2 Extras) -animalium|动物* -mob-origins@moborigins|生物起源* -better-default-biomes|更好的默认生物群系* -kaimyentity|KAI我的实体 (KAIMyEntity) -tablechair|桌椅 (TableChair) -when-dungeons-arise@|地牢浮现之时*¨when-dungeons-arise-fabric|地牢浮现之时 (When Dungeons Arise) -animal-feeding-trough@animal_feeding_trough|动物喂养槽* -wiki-zoomer@ -personality@personality! -mc-modsurement@allurement! -dwarf-miner-totem|矮人矿工* -yungs-better-portals|YUNG 的传送门机制重构 (YUNG's Better Portals) -german-road-signs-mod|德国交通标志* -iguana-in-a-blanket@iguana|真实调整 (Iguana in a Blanket) -anthill-inside|蚂蚁物流* -nei-integration -uncrafting-grinder|分解磨床* -emendatus-enigmatica@emendatusenigmatica - - - -jousting@|马术* -bamboo-blocks@ -scape-and-run-parasites@scapeandrunparasites|逃逸:寄生体 (Scape and Run: Parasites) -just-enough-drags|更多JEI拖拽* -exnihilo-automation|无中生有:自动化 (Exnihilo: Automation) -world-handler-command-gui|世界管理器:图形交互 (World Handler - Command GUI) -entityculling@|实体渲染机制优化 (Entity Culling) - -tea-kettle|茶壶* -enhanced-block-entities@ebe|方块实体优化* -gun-customization-infinity -dungeons-gear|地下城装备* -integrated-nbt|NBT 联合 (Integrated NBT) -pillagers-plus - - - -abundance@ - - -just-enough-calculation -mythicbotany@|神话植物学 (MythicBotany) -improved-mobs@|怪物增强*¨improved-mobs-fabric|怪物增强 (Improved Mobs) -limitless|无上限附魔* -vpn-blocker|禁用VPN (VPN Blocker) -premium-wood@ -tenshilib@¨tenshilib-fabric -randomportals|随意传送门 (RandomPortals) -configured|配置界面*¨configured-fabric|配置界面 (Configured) - -jellyfishing@|抓水母* -accurate-block-placement -pro-placer@|放置专家* -farmers-delight-compats -farmers-tea|农夫的茶 (Farmer's Tea) -farmers-delight-integration -magical-psi-redux -anvil-fix|铁砧修复* -no-increasing-repair-cost@ -wool-temples@|羊毛神殿* -exp-bottling|经验装瓶 (EXP Bottling) -buildersaddition@ -gt-remastered|格雷科技重制版 (GT: Remastered) -tips@|提示* -Interactio -advancement-book|进度之书* -drawers-tooltip@|抽屉提示* -paradise-lost@|天境:重生* - -@gregfood|格雷的食物 (GregFood) -more-jellyfish|更多水母* -easy-ladders -beta-dannys-expansion -inventory-tweaks-renewed -arrp@|高级运行时资源包 (Advanced Runtime Resource Packs) -tougher-glass-forge¨tougher-glass-fabric -differentiate -cookie-core-fabric -image-world-generator|图片地图转换器* -inductive-logistics|集成物流* - -automatic-path - -morevanillalib@ -vanilla-excavators@¨vanilla-excavators-forge -dynagear -morevanillatools@|更多原版工具 (MoreVanillaTools) -colorful-health-bar -tipline -ultimate-plane-mod@|终极飞机* -simple-voice-chat@|简单的语音聊天* -not-enough-milk -ewewukeks-musket-mod@musket-mod|ewewukek 的火枪模组 (ewewukek's Musket mod) - -irisshaders@iris -@dimthread|世界多线程化 (DimensionalThreading) -chambers|处理仓* - -sodium-extra@|钠 · 扩展* -grind-enchantments@|砂轮增强* -voice-chat|语音聊天* - -xnet-gases@ -filing-cabinets-refurbished - -dropz@ -figura@ - -autopilot¨autopilot-fabric -applied-energistics-2-wireless-terminals@|AE2无线终端* -appliedenergisticstweaker -sleeping-bags@|睡袋* -mass-inscriber - -random-title|随机标题* -astikorcarts -@invsync|背包同步 (InvSync) -jea@|JEI进度 (Just Enough Advancements) -et-futurum-requiem|把未来带回现实* - <2.7.0¨@etfuturum|把未来带回现实 (Et Futurum Requiem) - ≥2.4.0 -better-op|更好的 OP* -fastworkbench-minus-replacement -crimson-compass|绯红指南针* -tinkers-construct@|匠魂 (Tinkers' Construct) -ryoramas-terraria-mod -steves-workshop -upgraded-ender-chests@|高级末影箱* -ydm-ygo-dueling-mod-ii -versioner|整合包版本工具* - -engineers-workshop-reborn - -@immersivecursedness|沉浸传送门服务端版 (Immersive Cursedness) - -crimson-xp-charm|经验护符 (Crimson XP) -locatebiome -enderman-evolution -sophisticated-backpacks@|精妙背包* -age-of-exile -whoosh -gregtech-intergalactical|泛银河系格雷科技 (GregTech Intergalactical) -catalogue|模组目录*¨catalogue-fabric|模组目录 (Catalogue) -libblockattributes - -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@|凋灵合金* -mermod-fabric@mermod¨mermaid-tail-mod|人鱼尾*¨mermod-neoforge -astromine-core|天体矿工:核心 (Astromine: Core) -dungeondq -dynamic-trees-integrated-dynamics|动态的树:动态联合/集成动力附属 (Dynamic Trees - Integrated Dynamics) -skyblock-builder@|空岛建立者* -antiportals@|反传送门 (AntiPortals) -trash-cans@|垃圾桶* -mattdahepic-core -mob-farm-helpers-forge|刷怪塔小帮手 (Mob Farm Helpers)¨mob-farm-helpers-fabric|刷怪塔小帮手 (Mob Farm Helpers) -metal-bushes|金属灌木* - - -the-vanilla-experience -flower-seeds - - - -astemirs-forest-craft -astromine-foundations|天体矿工:基础 (Astromine: Foundations) -create-stuff-additions@|机械动力:物品附加 (Create Stuff 'N Additions) -slab-machines|台阶型设备* -more-create-stuffs|更多机械动力物品* -rsinfinitybooster|RS 无限范围增幅卡 (RSInfinityBooster) -cuneiform -terraincognita -cloth-api -ingameime|游戏内输入法 (IngameIME) -yungs-better-strongholds@|YUNG 的要塞优化 (YUNG's Better Strongholds)¨yungs-better-strongholds-fabric|YUNG 的要塞优化 (YUNG's Better Strongholds)¨yungs-better-strongholds-neoforge|YUNG 的要塞优化 (YUNG's Better Strongholds) -mojangdark|暗色加载 (MojangDark) -astromine-technologies|天体矿工:科技 (Astromine: Technologies) -astromine-transportations|天体矿工:运输 (Astromine: Transportaions) -azuredooms-chunk-loader -creeper-spores@|苦力怕孢子* -more-dragon-eggs|更多的龙蛋* -more-red@|更多红石* - - - -ex-nihilo-sequentia-mekanism-addon|无中生有:传承 - 通用机械扩展 (Ex Nihilo: Sequentia - Mekanism Addon) -panorama@swd-panorama|全景图* -bgcore -induction-charger -tiered-forge@tiered¨tiered -c-o-m-b-a-t -burden-of-time -gamemenumodoption@|游戏菜单模组设定 (Game Menu Mod Option) -game-menu-remove-gfarb@gamemenuremovegfarb|游戏菜单移除GFARB (Game Menu Remove GFARB) -randomdeathmessage|随机死亡消息 (RandomDeathMessage) -ex-nihilo-sequentia-ae2-addon@|无中生有:传承 - 应用能源2扩展 (Ex Nihilo: Sequentia - AE2 Addon) -sweetmagic|甜蜜与魔法 (SweetMagic) -astromine-discoveries|天体矿工:探索 (Astromine: Discoveries) -azuredooms-angel-ring@|AzureDoom的天使指环 (AzureDooms Angel Ring) -togglelib|列车手柄库 (ToggleLib) -regrowth@|再生* -mobs-main-menu - -chaos-awakens@|混沌觉醒* -hot-or-not -playerpig -tumble-dryer -cat-jammies -rhino@|犀牛* -fastsuite|配方性能优化 (FastSuite) -twerkitmeal|跳舞生长一切 (Twerk To Grow All The Things) -thermal-integration@|热力集成* -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) -faster-ladder-climbing|更快的爬梯* -infinitymending@|无限+经验修补 (InfinityMending) -better-than-mending@|更好的经验修补* -elenai-dodge-2 - -taterzens@¨taterzens-forge -dragons-survival|龙之生存 (Dragon Survival) -@legacy-mod-menu -no-lan-cheats@|禁用局域网作弊 (No LAN Cheats) -dashloader@|疾速加载 (DashLoader) -caveworld-2|洞穴世界* - -break-progress|破坏进度* -item-model-fix@|物品模型修复* - -additional-pipes-for-buildcraft|附加管道 (Additional Pipes for Buildcraft) -lolasm -rftools-utility@|RF工具:实用设备 (RFTools Utility) -ctm-fabric|连接纹理Fabric版 (ConnectedTexturesMod for Fabric) -whats-that-slot@ -pmmo-and-nbt-compat -techstacks-heavy-machinery-mod -enhanced-mushrooms@|蘑菇增强*¨enhanced-mushrooms-fabric|蘑菇增强 (Enhanced Mushrooms) -versatile-portals|通用传送门* -spawn-egg-recipes|刷怪蛋配方注册* -configurable-extra-mob-drops@|可配置的额外怪物掉落*¨configurable-extra-mob-drops-fabric|可配置的额外怪物掉落 (Configurable Extra Mob Drops) -enhanced-mob-spawners@|刷怪笼增强* - -autorun -animania-farm|动物谷:农场* -animania-extra|动物谷:额外动物 (Animania Extra Animals) -animania-cats-dogs|动物谷:猫猫狗狗 (Animania Cats & Dogs) -better-foliage-renewed@|更好的树叶重制版* -block-swap@¨block-swap-fabric -basalt-walker@|玄武岩行者* - -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|可见装备槽*¨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@ -@slideshow-fabric|幻灯片 (Slide Show) -mob-stages|生物阶段* -refooled@ -@better-nether-beta|更好的下界:Beta版 (BetterNether Beta) -fabric-seasons@ -dehydration@|脱水* -easy-villagers@|村民物品化/简单村民* -largebar -tis-3d@tis3d -entity-nan-health-fix|假死修复 (Entity NaN Health Fix) -ferritecore-fabric@ferrite-core|铁氧体磁芯 (FerriteCore)¨ferritecore|铁氧体磁芯 (FerriteCore) -thaumcraft-research-patcher -masterful-machinery@ -minecraft-earth-mod@earth-mobs-mod|Derec 的地球生物 (Derec's Earth Mobs) -scotts-essential -drawerfps|储物抽屉渲染配置 (DrawerFPS) - -cursed-earth¨cursed-earth-fabric -sll|逆向交易 (sɹǝƃɐllᴉΛ) -lagmeter|延迟表 (LagMeter) -hexxit-gear-2|Hexxit 装备 2 (Hexxit Gear R) -scootys-plants-vs-zombies|Scooty的植物大战僵尸重生 (Scootys Plants Vs. Zombies Regrown) - - - -custom-machinery@ -bonsai-tree-crops -rpgz@ - - -@stationapi -scavenge-timing-addon -cull-particles|粒子渲染机制优化*¨cull-particles-fabric|粒子渲染机制优化 (Cull Particles) -majos-broom|魔女的扫帚 (Majo's broom) -seamless-loading-screen@|无缝加载界面*¨seamless-loading-screen-forge|无缝加载界面 (Seamless Loading Screen) -curios-quark-oddities-backpack|夸克背包饰品* -nature-expansion - - -electromagnetic-coherence -amaleafs-expantion-world-mod -the-elemelon-mod|元素西瓜* -dcsp|钻石压缩 (Diamonds Compressor SP) -corpse-complex@ -modularvoicechat|模块化语音聊天 (ModularVoiceChat) -elytra-slot@|鞘翅插槽/鞘翅槽位 (Curious Elytra / Elytra Trinket / Elytra Slot)¨elytra-slot-fabric|鞘翅插槽/鞘翅槽位 (Curious Elytra / Elytra Trinket / Elytra Slot) - -tconstructcompatible|匠魂兼容 (TConstructCompatible) - -incubation@ - -abyssmana|奈落魔法学 (AbyssMana) - -create-goggles@ - -coloured-tooltips@|彩色提示框* -magicraft-magic|魔法材料 (Magical Materials) -glowstone-ores|荧石矿石* -more-wires -alexandrite-and-more -endgame-materials|终局材料* -more-cobblestone|更多圆石* -wild-netherwart|野生地狱疣* -the-periodic-table-mod|元素周期表 (The Periodic Table) -adamantium-in-minecraft -forgerocks -ballistix@|弹道学* -wireless-industry -spice-of-life-tonio-edition|生活调味料:托尼欧版 (Spice of Life: Tonio Editon) -husk-spawn@|尸壳生成微调*¨husk-spawn-fabric|尸壳生成微调 (Husk Spawn) -artisan-tools-1-16|工匠工具 (Artisan Tools) -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-fabric -unique-enchantments-utils|独特的附魔:效用扩展 (Unique Enchantments - Utils) -forge-ae2-additional-opportunity@ae2ao¨ae2ao¨legacy-ae2-additional-opportunity -iconexporter@icon-exporter -curious-shulker-boxes@shulker-box-slot|潜影盒插槽/潜影盒槽位 (Shulker Box Slot)¨curious-shulker-boxes-fabric|潜影盒插槽/潜影盒槽位 (Shulker Box Slot) -xenoclus-2 -darker-depths@|深岩之下* -terracraft-journey -solar-cooker@|太阳灶* - -create-addon -boat-contraptions -ender-rift|末影裂缝* - -splashanimation -continue-button@|继续按钮* -chem-craft|化学工艺* -time-in-a-bottle-standalone|时间之瓶 (Time in a bottle standalone) - -compressed-grass|压缩草* -applepie|苹果派 (ApplePie) -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 - -playtime-counter-fabric|游戏时长计数器 (Playtime Counter) -entity-banners|实体旗帜* -curious-jetpacks -curious-armor-stands@¨curious-armor-stands-fabric -trinkets-fabric@trinkets -occultism@|神秘学* -stray-spawn@|流浪者生成微调*¨stray-spawn-fabric|流浪者生成微调 (Stray Spawn) -mooshroom-spawn@|哞菇生成微调*¨mooshroom-spawn-fabric|哞菇生成微调 (Mooshroom Spawn) -cardinal-components@cardinal-components-api - - -integrated-proxy|集成代理器* -a-cobblestone-crafting-table|圆石工作台* -colored-iron -final-kobold -ears@|耳朵* -wildfires-female-gender-mod-forge@female-gender¨wildfires-female-gender-mod-fabric -consistencyplus@ -modularwarfare|模块化战争/模块化武装 (ModularWarfare) -mputils-basic-tools -the-agartha-mod -falling-with-style|花式降落* -valhelsia-core@ - -alwayseat|吃不停 (AlwaysEat) - - - -aquarium|深海* -mixin-booter@mixinbooter - -jrds-moneymod -skeletdimension|骷髅维度 (SkeletDimension) -sushigocrafting@|巧制寿司 (Sushi Go Crafting) -shrines-structures@shrines -valhelsia-tweaks -lazierae2@|懒人AE2 1.16+ (Lazier AE2) -magical-crops-core -magical-crops-decorative -magical-crops-armoury - -simpleeco|简单经济 (SimpleEconomy) -vistas@ - -fish-in-planks -fish-on-the-line@¨fish-on-the-line-fabric -fish-traps|鱼栅* -combustive-fishing@ -fabric-survival-island@survival-island -sonicraft@|索尼克工艺 (SoniCraft) -islands@ -origins-forge@|起源非官方Forge版 (Origins (Forge)) -magic-feather -alet@a-little-extra-tiles -netheriteplus -the-survivalists-mod -campfire-overhaul -shatter -electric-self-balance-scooters|电动平衡车 (Electric Self-balance Scooters) -rats-mischief@ -dream-rng -wandering-trader-improvements - -wasteland-reborn|不毛之地:重生* -skds-core -endertech|末影科技 (Ender Tech) -enderpig-mod|末影猪* - -no-no-ai-spawn|镇压前端召唤 (No No-AI Spawn) -atomic-bomb-1-16|枪,炮,原子弹! (Guns, Rockets and Atomic Explosions) -se-sign-shop|简单经济:牌子商店 (SE: Sign Shop) - -fancymenu@¨fancymenu-fabric -halogen|卤素* -zetamod@zetaforged|泽塔 (ZetaForged / Zeta's Mod) - - -wholetreeaxe -fabrishot@|高清截图Fabric* -materialisation|物质化*¨materialisation3|物质化 (Materialisation) -recipebuffers|配方缓冲 (RecipeBuffers) - -portal-gun-fabric|传送枪 Fabric* -incendium@ -@new-frontier-craft -cooperative-advancements@|合作进度*¨cooperative-advancements-fabric|合作进度 (Cooperative Advancements) -lightstones -openbackup -fat-experience-orbs@|肥胖经验球* -better-pipes|更好的管道* -truetype-font-replacement -fluidlogged-api@ -spark@|火花 (spark) -mco -guardians-galore -cogwheel-tweaker -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 -gender - -ticktock@servertick - -fps-reducre-for-fabric|FPS减速器(Fabric) (FPS Reducer (For Fabric)) -art-artillery|艺术?火炮! (Art? Artillery!) -minemenufabric@|我的菜单 Fabric 版 (MineMenuFabric) -@tabtps -afkpeace@ - -secret-rooms-fabric@ -smooth-chunks|平滑区块加载*¨@smooth-chunks|平滑区块加载 (Smooth Chunks) - 已失效 -saturationoverflow|饱和度溢出 (SaturationOverflow) - -phantom-blood@phantomblood|幻影之血* - -searchable-containers|可搜索容器* - - -integrated-additions|集成扩展* -matchlock-guns|火绳枪* -fabric-autoswitch@autoswitch|自动切换工具 (AutoSwitch) -inventory-profiles-next@|一键背包整理Next* -drill|钻头* -ore-tree|矿物树* -ferdinands-flowers -clear-water@|清澈的水* -applied-energistics-2-wireless-terminals-forge|AE2无线终端Forge版* -ferroustry -village-employment@|村庄就业* - -deathlog@|死亡日志* -automatic-elytra|自动鞘翅* -axolotl-bucket-fix@|美西螈桶修复* -xks-decoration@|XK的装饰 (XK's Decoration) -endgame-materials-addons|更多终局材料* -ravage-and-cabbage@ -stackup -simple-anti-x-ray@sax -breakme@ -mod-info-command@mod-info-cmd -hexxit-gear-fabric@hexxitgear -buffed-tools|属性工具* -thaumcraft-nei-plugin|神秘时代NEI插件 (Thaumcraft NEI Plugin) -moarrecipes|更多的配方 (MoarRecipes) -luminium -better-nether-map-port@better-nether-map - -iguanatweaks-reborn@|生存重构/蜥蜴微调重生 (Survival Reimagined / IguanaTweaks Reborn) -enter-the-void|进入虚空* -tensura-mod-that-time-i-got-reincarnated-as-a-slime@tensura-mod|关于我转生变成史莱姆这档事 (Tensura Mod -That time I got reincarnated as a Slime) - -speedometer@speedometer-cafeteria|速度表* -falling-leaves-forge@fallingleavesforge|落叶 (Falling Leaves (NeoForge/Forge)) - - -custom-entity-models-cem@cem|自定义实体模型 (Custom Entity Models) -tweakmyclient@ -lovely-snails@lovely_snails|可爱蜗牛* - -clipboard|备忘录* -crimson-nbt-tags - -water-physics-overhaul -netherless -auto-ore-dictionary-converter@aodc -elytraboosters@elytra-boosters -cobblegenrandomizer@ -unified-resources -wooden-buckets|木桶* -no-nether-portals|没有下界传送门* -beehivetooltips|蜂巢提示框 (BeehiveTooltips) -buddycards@|巴迪卡牌* -extended-caves@expanded-caves¨expanded-caves - -inventorio@¨inventorio-forge -more-curios-totems-of-undying -selene@moonlight -compatibilitylayerforcustomskinloader|万用皮肤补丁兼容层 (CompatibilityLayerForCustomSkinLoader) -no-potion-shift -no-potion-offset -demonslayer@orca-kimetsu-no-yaiba|鬼灭之刃 (Kimetsu no Yaiba) -nautilium|鹦鹉螺* -auto-attack|自动攻击* -tamagotti - -signal|讯号* -realistic-horse-genetics@|真实马匹遗传* -timeless-and-classic-guns@timeless-and-classics-guns|永恒枪械工坊 (Timeless and Classics Guns) -tool-progression|工具进阶* - - -a-paimon|派蒙* -@bh-creative -music-maker-mod -penguin-lib -flywheel@|飞轮* - -coralreef|珊瑚礁 (CoralReef) - -simply-seasons|简单季节* -bclib@ -actually-baubles|实用拓展饰品* -alexs-mobs-battle-music -lava-waders-bauble|熔岩魔靴饰品* -hardcore-revival@|硬核复活*¨hardcore-revival-fabric|硬核复活 (Hardcore Revival) -additional-guns|更多的枪* -oh-my-minecraft-client@ -wooden-armors-stone-armor@woodenarmor|木制盔甲 (Wooden Armors Mod) - -insanelib@ -daydreamer -phantomfaces|幻灵接口* -improved-villagers|改进的村民* -equipment-compare@|装备比较*¨equipment-compare-fabric|装备比较 (Equipment Compare) - -PickupWidely - -lilliputian -sampler -custom-splash-screen@|自定义加载界面* -masa-gadget@¨@masa-gadget-dev|Masa Gadget - 测试版 -meet-your-fight@|迎战* -hot-or-not-plus -macaws-furniture-tfc -tfc-florae@ -tfc-elementia -infinity-water-bucket|无限水桶* -tfc-caffeine-addon -tfc-cellars-add-on -boats-and-beeps -konkrete@¨konkrete-fabric -xp-from-harvest@|收获经验 (XP From Harvest) -modern-beta@modern-beta-forge¨modern-beta-forge -tfcflux -tfc-medicinal -water-flasks - -structure-world -macaws-lights-and-lamps@|Macaw的灯 (Macaw's Lights and Lamps) -terrarian-slimes@ -create-gears|机械动力:齿轮附加* -simple-big-backpack -croptopia|作物盛景* -firmalife@ -supermartijn642s-core-lib@ -cherished-worlds@|存档置顶*¨cherished-worlds-fabric|存档置顶 (Cherished Worlds) -ironfist|铁拳* - -simply-acceleration|简单加速* -creeper-habitats -husbandry -its-the-little-things -fruitful@|硕果累累*¨fruitful-fabric|硕果累累 (Fruitful) -environmental-energy@|环境科技-发电机* -nakranoths-herdcraft|群兽行为 (Nakranoth's Herdcraft) -lambdabettergrass@|Lambd 的更好的草方块 (LambdaBetterGrass) -@client-commands -bright-ore|矿石高亮* -chinese-style-sword|中式剑 (Arsenal Core) - -heroic-armory|英雄武器* -colossal-battery|巨型电池 (ColossalBattery) -industrial-meat -biomancy@|血肉重铸* -extra-generators@|额外发电机* -horticulture|园艺* -mr-pineapples-food-mod - - -legacyvault -shopaholic - -ok-zoomer@ -untitled-duck-mod-forge@untitled-duck-mod|无题鸭 (Untitled Duck)¨untitled-duck-mod-fabric|无题鸭 (Untitled Duck) -v-tweaks@ -fairenchanting|公平附魔 (FairEnchanting) -bedspreads@¨bedspreads-fabric -piglib@ -nether-portal-spread@¨nether-portal-spread-fabric -x-hp@ - -mr-pineapples-toy-guns -magickcore@|魔法核心 (MagickCore) -feywild|仙灵荒野* -The-final-sword|最终之剑重置版 (The final sword) - -gog-skybox - -lemon-lib@lemonlib -custom-entity-models-kaimyentity-reborn|自定义玩家和实体模型 / KAI我的实体:重生 (Custom Player & Entity Models/KAIMyEntity-Reborn) -miniutilities|迷你实用设备 (Mini Utilities) -stumble-upon-campsites|邂逅:营地 (Stumble Upon: Campsites) -nomad-books|游牧之书* -yungs-extras@¨yungs-extras-fabric¨yungs-extras-neoforge -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|副手战斗*¨off-hand-combat-fabric|副手战斗 (Off Hand Combat) -reaping-mod-fabric@reaping|收割 (Reaping) -gilding|镀金* -grims-transportables|格里姆的便捷交通工具 (Grim's Transportables) -reroll|刷新附魔* -tax-free-levels@|免税附魔* -portable-dimensions|便携式传送门* -stone-age-by-yanny -terra-world-generator|Terra - 已失效¨@terra - -omnis|灾厄村民拓展* -omnis-backpacks -superhotmc -bag-of-yurting@|帐篷袋 (Bag of Yurting) -better-combat-rebirth|更好的战斗:重生* -iron-and-gold-from-1-17|来自 1.17 的铁和金 (iron and gold from 1.17) -immersive-cooking@|沉浸烹饪* -structured-crafting@ -random-shulker-colours@|随机潜影贝颜色*¨random-shulker-colours-fabric|随机潜影贝颜色 (Random Shulker Colours) -create-automated -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@|持续钓鱼*¨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@|更好的图腾*¨inventory-totem-fabric|更好的图腾 (Inventory Totem) -lava-picker-upper|熔岩收集器* -nethers-exoticism@ -everpotion@|永恒药水 ⚗️ (EverPotion ⚗️)¨everpotion-fabric|永恒药水 ⚗️ (EverPotion ⚗️) -quick-shulker@quickshulker|快捷潜影盒* -respawnable-pets@|宠物可重生* -schmucks@|小阿呆 (Schmucks!) -automatic-doors@|自动门*¨automatic-doors-fabric|自动门 (Automatic Doors) -configurable-despawn-timer@ -chunkmap@|区块加载小地图 (ChunkMap) -inventory-tabs -bottle-your-xp@|装瓶你的经验*¨bottle-your-xp-fabric|装瓶你的经验 (Bottle Your Xp) -gravestone-mod-extended|墓碑坟墓 - 拓展 (Gravestone mod - Extended) -better-enchanted-books@|更好的附魔书* -easy-steel-forge|简单的钢 (Easy Steel & More) -fabric-waystones@fwaystones|Fabric 版传送石碑 (Wraith Waystones / Fabric Waystones) - - -dark-enchanting@|暗黑附魔* - -better-wandering-traders|更好的流浪商人* -superflat-world-no-slimes@|没有史莱姆的超平坦世界*¨superflat-world-no-slimes-fabric|没有史莱姆的超平坦世界 (Superflat World No Slimes) -scorge - -beaconoverhaul@|信标改革 (Beacon Overhaul) -contact|往来* -blockshifter¨blockshifter-forge - -vanilla-builders-extension - -big-beacons|大信标* -wooden-hopper@|木漏斗* - -ages-api -fancyhud@spiffyhud¨spiffy-hud-fabric -advanced-compass|高级指南针* -salutem -the-sol|太阳系* -better-beds@|更好的床* -world-lives-mod -lib - -just-some-chocolate|只是一些巧克力 (Just some Chocolate) - -vacuum-horizon -unique-enchantments-battle|独特的附魔:战斗扩展 (Unique Enchantments - Battle) -balanced-enchanting|平衡附魔* -pipe|管道* -simple-ambients - - - -modern-loading-screen|现代加载界面* - -dong-dongs-random-creation@|冬冬的随意创作 (Dong Dong's random creation) - -transliterationlib - -rpmtw-update-mod@|RPMTW平台模組 (RPMTW Platform Mod) -farsight-spyglasses -not-enough-animations@|更多动画* -better-beacon|更好的信标与潮涌核心 (Better Beacon / Conduit) - -dungeon-now-loading@|地牢进行时* -simple-emerald-tools-fabric¨easy-emerald-tools -cold-sweat@|冷汗* -witchery-rewitched|巫术:重生 (Witchery: Rewitched) -majou-densetsu-3d|魔城传说3D (Majou Denetsu 3D) -icarus-wings@|伊卡洛斯之翼* -keyboard-wizard|按键精灵* -piscary - -storage-cabinet|储藏柜* -first-person-model@|更真实的第一人称模型 (First-person Model) -randore@¨randore-forge -rising-uppercut|上勾拳* -jackie-chan-s-weapon|成龙的武器 (Jackie Chan's weapon) -explorers-compass@|探险者指南针 (Explorer's Compass) -gravestones@|墓碑* -crafting-dead-survival|行尸走肉:生存 (Crafting Dead: Survival) -redstone-control-2|红石控制2* -csenchants -mystical-customization@ - - -fmprojecte-fmpe|等价交换重制-EMC上限扩展版 (FMProjectE) - -ibe-editor@ -exotic-critters -archers-paradox@|弓箭手悖论 (Archer's Paradox) -dynamic-trees-neapolitan|动态的树:那不勒斯风味附属 (Dynamic Trees - Neapolitan) - -randomite-classic - -wilds -roughly-searchable@ -cull-leaves@|树叶渲染优化* -dynamic-trees-atum-2|动态的树:阿图姆2附属 (Dynamic Trees - Atum 2) -randomtweaker - - -steamworld - -falling-leaves-fabric@fallingleaves|落叶 (Falling Leaves (Fabric)) -craftable-creative-ability|可合成的创造能力强化* -not-enough-energistics -terracore - -seeker-compass -ghosts-explosives -power-drop@|蓄力投掷* -yungs-better-dungeons@|YUNG 的地牢优化 (YUNG's Better Dungeons)¨yungs-better-dungeons-fabric|YUNG 的地牢优化 (YUNG's Better Dungeons)¨yungs-better-dungeons-neoforge|YUNG 的地牢优化 (YUNG's Better Dungeons) - -ore-controller -morechickens@|更多鸡 (MoreChickens) -ghosts-explosives-2 -weapon-throw|武器投掷*¨weaponthrowlite|武器投掷 (Weapon Throw) -more-villagers|更多村民*¨more-villagers-fabric|更多村民 (More Villagers) -dungeons-mobs|地下城生物* - - - - - - - - -uusi-aurinko|新日* - - - - - - - - - - -chronicler-the-key-of-stellaris|历史记录者·星之匙 (Chronicler: The Key of Stellaris) - -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@|旅人标题 (Traveler's Titles)¨travelers-titles-fabric|旅人标题 (Traveler's Titles)¨travelers-titles-neoforge|旅人标题 (Traveler's Titles) -expand-chinese-sword|中式剑拓展 (Arsenal Integration) - -littleframes@littlepictureframes|小画 (LittlePictureFrames) -lavalogged-blocks@|岩浆充填 (Lavalogged blocks) -awoken-world -gt4-reimagined|格雷科技4:重构想 (GregTech 4 Reimagined) -camouflaged-creepers -ore-tweaker@ -openpython -jei-lotr -capes@ -attack-speed-enchantment|攻击速度附魔* -natures-minerals@ -balm@¨balm-fabric -resource-hogs|资源猪 (Resourse Hogs) -advanced-xray|高级透视 (Advanced XRay)¨advanced-xray-fabric-edition|高级透视 (Advanced XRay) - -ring-of-attraction-forge|吸引戒指 (Ring of Attraction)¨ring-of-attraction-fabric|吸引戒指 (Ring of Attraction) -customhud@|自定义HUD (CustomHud) -deadly-world|致命世界* -fastdecay@ -essential-commands@ -caves-and-cliffs-backport -that-future-mod-glow-squid-axolotl-moobloom-etc -diamond-buildcraft|钻石装饰* -@apocalypse-rebooted|启示录重制 (Apocalypse Rebooted) -mcwifipnp@|更高级联机设置 (LAN World Plug-n-Play) -requious-frakto - - - -capsule -isometric-renders@|等轴渲染* - -enchanting-secretaire|附魔记录* -sync-fabric@|克隆(Fabric) (Sync (Fabric)) -tale-of-kingdoms-a-new-conquest@|王国:新征程 (Tale of Kingdoms: A new Conquest) - -schwarz@|黑* -megane-forge@¨megane@ -crusade@ -vending-machine|售货机* -modernxl -taiga2@|匠魂合金附加2 (Tinkers Alloying Addon Port) -chunkgenlimited|区块生成限制 (ChunkGenLimiter) -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 -reasonable-sorting@|合理排序* -chat-heads@|聊天头像* -hidden-armor|隐藏盔甲* -majruszs-progressive-difficulty@|Majrusz的进阶难度 (Majrusz's Progressive Difficulty) -pharmacist|药师* -kappa@ -equivalent-integrations|等价集成* -keep-equipment|保留装备* -herobrines-origin|Herobrine 的起源 (Herobrine's Origin) -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) -passive-mobs@passivemobs -sponsor|赞助者* - - -between-ores -black-hole|黑洞* -more-and-more-minerals|越来越多的矿物 (more and more minerals) -permafrost - -scootys-plants-vs-zombies-2|Scooty的植物大战僵尸2 (Scooty's Plant Vs. Zombies 2) -better-furnaces-reforged@|更好的熔炉重铸版 (BetterFurnaces Reforged) - - -schools-of-magic-second-semester|魔法学校:第二学期 (Schools of Magic: Second Semester) -dark-loading-screen@|深色加载界面* -hals-exploration-mod@hals%20exploration%20mod -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@ -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) - -nethers-delight@|下界乐事 (Nether's Delight) -farmers-extra-foods|农夫的拓展食物 (Farmer's Extra Foods) -tinkers-delight|工匠乐事 (Tinker's Delight) - -@flashfreeze -majruszs-accessories@|Majrusz的配件 (Majrusz's Accessories) -water-2-mana - - -craft-and-hunt|狩猎工艺 (Craft and Hunt) -tmats -the-afterlight|隐光之域* -tinkers-planner|匠魂蓝图 (Tinker's Planner) -playing-cards|扑克牌* -rainbow-oak-trees-2|彩虹橡树2* -mapfrontiers|地图边界 (MapFrontiers) -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)¨drink-beer-forge|喝啤酒啦 (Drink Beer) -emerald-tools-armour -hidden-recipe-book@|隐藏配方书* -kibe@|羊肉面饼实用设备 (Kibe Utilities) -poisoncraft|毒药工艺 (PoisonCraft) -detail-armor-bar-forge@detail-armor-bar|细节盔甲 (Detail Armor Bar)¨detail-armor-bar|细节盔甲* -wings-horns-hooves-the-ultimate-unicorn-mod -project-rankine@rankine|兰金计划* -tinkers-mechworks@ -qdc-core-4-0@qdc-core-4.0|量子拆解工艺 (Quantum Dis-Assembly Craft)¨qdc-quantum-dis-assembly-craft|量子拆解工艺 (Quantum Dis-Assembly Craft) - 旧 -william-wythers-overhauled-overworld@wwoo¨expanded-ecosphere@ -infinite-music -cobbler|可靠的潜影贝工厂 (Shulker's Faithful Factories/Cobbler) -nether-fast-transport-layer -the-outer-end@ -hamncheese@ -buzzy-drones -morevanillaarmor@|更多原版盔甲 (MoreVanillaArmor) - -eternal-tales@|永恒传说* -oh-the-biomes-youll-go-fixes|你将去的生物群系修复版 (Oh The Biomes You'll Go Fixes) -wild-world - -miskatonic-mysteries¨miskatonic-mysteries-legacy -harvesters-night|收割者之夜 (Harvester's Night) -slotlock@|锁定槽 (SlotLock) - -panorama-tweaker@ -simple-tomb|简单坟墓* -modern-life@|摩登生活* -paxi-fabric@paxi¨paxi¨paxi-neoforge - -waveycapes@wavey-capes|飘扬披风 (Wavey Capes) -skin-layers-3d@3dskinlayers|3D 皮肤层 (Skin Layers 3D) -mc-mods-the-discs|唱片大全 (All the Discs) -cryptic-cosmos -bayou-blues@|长沼蓝调*¨bayou-blues-fabric|长沼蓝调 (Bayou Blues) -hex-lands|六边形地貌* -fixrtm -serene-tweaks -ScalingGuis|界面缩放 (ScalingGUIs) -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 -borderless@borderless-window|无边框全屏 (Borderless Window) -lifted-restrictions-structure-block|更好的结构方块 (Better Structure Block) -entity-model-json|实体模型 JSON (Entity Model JSON) -death-coords|死亡坐标显示* - -never-enough-currency|货币多多* -never-enough-currency-lite|货币多多:精简版* -create-chunkloading -name-pain@namepain -wireless-chargers@|无线充电器* -bouncier-beds@|弹力床*¨bouncier-beds-fabric|弹力床 (Bouncier Beds) -hexlands-ii|六边形地貌 2 (HexLands II) -gold-in-river-mod|河中淘金* - -lorespawn|怪物巢穴* -creatuures -fabrics-biome-api-reforged@fb-api-reforged -stalwart-dungeons@|坚固地牢* -maidens-marvelous-materials -nekoration@|猫咪装饰* -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 Lists/Draggable Resource Packs) -fastchest|快速箱子渲染 (FastChest) - 已不再更新¨@fastchest|快速箱子渲染 (FastChest) - 在此处更新 -yuushya-townscape@|方块小镇* -architects-palette-fabric@|建筑师的调色板 (Architect's Palette)¨architects-palette@|建筑师的调色板 (Architect's Palette) -whisperwoods@|低语之森* -dimensional-dungeons@|维度地牢* -bosses-of-mass-destruction@|祸乱鬼魅 (Bosses of Mass Destruction) -neoelfeos-medieval-pub-decoration -dustrial-decor@dustrial-decor-forge -feders-scarecrows|Feder的稻草人 (Feder's Scarecrows) -zetter@zetter-painting-mod -mystical-pumpkins|神秘南瓜* -skinned-lanterns@skinned-lanterns-fabric|灯笼皮肤*¨skinned-lanterns-fabric|灯笼皮肤 (Skinned Lanterns) -scarecrows@|稻草人* -seasonals@|季节风味* -mimi-mod@mimi -blocktuner@|音符盒调音助手 (BlockTuner) -caged-mobs@|笼中生物* -advanced-rifles -tome-of-blood|血之宝典 (Tome of Blood) -blockfront-world-war-ii@blockfront|方块前线 (BlockFront) -archaic-guns -blockcarpentry -survival-overhaul -raining-cats-and-dogs|猫狗雨 (Raining Cats and Dogs) -melt - -stuff-a-sock-in-it@|日志过滤器* -supermartijn642s-config-lib@ -small-ships@ -sound-engine-reloader|重新加载声音* -crystal-caves -increasemobs -scarecrows-territory@|稻草人领域 (Scarecrows' Territory) - -dungeons-mod¨dungeons-mod-lite -loot-beams@|战利品光束 (Loot Beams: Relooted!) -theurgy@ -better-badlands|恶地改善* - -the-mysthical-reworked -villagers-and-monsters-mod-legency -repair-chests|修损宝盒* - -relics-of-gaming|游戏遗物* -modular-controller|模块化控制器* - -Item-Collectors@item-collectors -gamemodeoverhaul@|旧版指令 (GamemodeOverhaul) - -dash@ -minecraft-dungeons-content|地下城内容 (Dungeons Content) -old-beacon|旧信标* -oc2|开放式电脑 II (OpenComputers II) -botany-pots-tiers@|更好的植物盆栽* -compatchedstorage|紧凑存储修复 (ComPatchedStorage) -iseedragons -psionic-peripherals -malum@|灵灾* -mc-modsomancy@allomancy|镕金术 (Allomancy) -steamcraft2 -boilerplate -meldexuns-crystalic-void -recipes-and-more -llama-steeds-forge@llama-steeds|骑羊驼 (Llama Steeds)¨llama-steeds|骑羊驼* -levellib@657400 -enigmatic-graves -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|荒芜 (Desolation)¨desolation|荒芜* -ma-astral -zaraklib -chipped@ - -mending-for-1-7-10|给老版本的经验修补 (Mending for Older Version) -unreachable-fantasy-mod -ai-reducer|AI减速器 (AI Reducer) -simple-teleporters|简易传送器*¨simple-teleporters-fabric|简易传送器 (Simple Teleporters) -killmods@657399 -big-brain@ -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 -ftb-banners-forge -overpowered-armor-bar -tinkers-rapier|匠魂西洋剑 (Tinkers' Rapier) -earth-reworked|土方工程重制版* -cinderscapes-reforged@|余烬奇景Forge版* -better-diving|水世界/更好的潜水* -auto-sprint|自动冲刺:一键切换 (Auto Sprint : key toggle) -nebula-rpg -betternether-reforged|更好的下界Forge版 (BetterNether Reforged) -item-stitching-fix@|物品模型修复移植版* -blood-and-madness -afraid-of-the-dark -ores-above-diamonds|超越钻石* -crafting-automat -ingotter -presence-footsteps@|脚步声* -walk-the-air|凌空微步 (Walk the air) -castle-dungeons@castle -mobs-properties-randomness¨@mobs-properties-randomness|Mobs Properties Randomness - 未及时更新,不全 -iguana-tweaks|蜥蜴微调* -enhanced-ai -vulcanite|软碲铜 (vulcanite)¨vulcanite-fabric|软碲铜 (vulcanite) -ziheasymodding -path-to-dirt -dirt2path -carbonado -strange -tfctweaker -scaling-feast -delete-item -stexcraft-1-12-2-mod -longerdays -mob-heads -compass-coords -neverdark -stats-keeper¨stats-keeper-fabric -vanillatweaks@ -bacodifficulty -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)¨defaultsettings-fabric|默认设置 (DefaultSettings) -draylars-battle-towers|Draylar的战斗高塔 (Draylar's Battle Towers) - -leos-craftable-chainmail|可制作的锁链甲 (Leo's Craftable Chainmail) -time-to-die -better-survival-mod|更好的生存 (Better Survival mod) - -tschipplib -the-deep-dark-ocean-dimension -online-picture-frame|在线相框显示2 (Modern 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) - -lunae-silva - -rainbow6|我的六号 (Rainbow6:Minesiege) -friendlyendermite@friendermite|友好的末影螨 (FriendlyEndermite) -food-expansion|食物扩展* -forgotten-items|被遗忘的物品* -food-expansion-reimagined|食物扩展:重构想 (Food Expansion: Reimagined) -redstone-igniter -enchanting-tweaks -thrown-slime - -inventory-auto-fill -queen-bee@|蜂后* -better-barrels -enderbeetles -customport -more-sound-config -undead-expansion -hourglass@|沙漏* -relics-mod@|遗物 (Relics) -comfortable-nether|舒适下界* -arcanecraft-ii|奥法工艺2 (ArcaneCraft II) -presence-footsteps-forge|脚步声Forge版 (Presence Footsteps (Forge))¨@resence-footsteps-forge|脚步声Forge版 (Presence Footsteps (Forge)) - 已失效 -aardvarks-weird-wonderful-wild - - -little-delicacy-cafes -ee3-helper -save-your-pets|拯救你的宠物* -main-menu-scale -potion-fingers -reload-audio-driver-rad|音频驱动重载 (Reload Audio Driver)¨reload-audio-driver-fabric|音频驱动重载 (Reload Audio Driver) -shieldbreak@ -holiday-helper -fabric-tickratechanger-mod|Fabric版运算变速 (Fabric TickRateChanger) -observable@|可视性能侦测* -disenchantment-edit-table|祛魔编辑台* - -cit-resewn@ -lazy-language-loader@ -clef -zettai-magic-2 - -wotw-mod|世界之战 (The War of the Worlds Mod) - - - -simple-camp-fire|简单营火* -biome-locator|生物群系定位器* -extra-coals -dark-caverns|暗黑深穴* - - - -milk-all-the-mobs@¨milk-all-the-mobs-fabric -roadrunner -pokecube-aoi -grim-statues|Grim的雕像* -oauth@¨oauth-fabric -omaypaty-japan-mod -demon-slayer-mod-kimetu-no-yaiba|鬼灭之刃 (DEMON SLAYER MOD) -tipthescales@ -xplosives-mod -arkys-environment -candylands -elements-of-power -aquafina -way-through-dimension -journeymap-integration@ - -damage-tint@|伤害色调* -mo-spells -prehistoric-flora|史前自然 (Prehistoric Nature)¨prehistoric-nature@|史前自然* -blade-works|剑制 (Blade Works/nikgub_'s Blades+) -create-confectionery@|机械动力:甜食* - - - -rotten-piglins-mod|腐朽猪灵 (Rotten Piglins) -ex-nihilo-random|无中生有:随想 (Ex Nihilo: Random) - - -fabrictailor@|离线皮肤切换 (Fabric Tailor) -ambientworld -@custom-raid|自定义袭击 (Custom Raid) -apple-trees-revived|苹果树:复生* -potatos-lucky-block|马铃薯幸运方块 (Potato's Lucky block) -even-more-tnt -fun-tnt|有趣的TNT (Fun TNT) - -chileancraft|智利工艺 (Chilean Craft) -canals|水渠* - -underground-loot-crates|地下战利品箱* - -smooth-scrolling-everywhere|平滑滚动*¨smooth-scrolling-everywhere-fabric|平滑滚动 (Smooth Scrolling Everywhere) -sword-blocking@|持剑格挡* -better-mount-hud@|更好的骑乘 HUD (Better Mount HUD) -fire-overlay-controller@|火焰叠加层调整* - -particle-rain@|粒子雨* -sodium-reforged|镁 (Magnesium / Sodium Reforged) -phosphor-reforged|硫 (Sulfuric/Phosphor Reforged) -hydrogen-reforged|氦 (HeIium) -xl-food-mod-plus|超多食物+ (XL Food Mod+) - -mcbot@|群服互联🔗 (McBot🔗) -ice-and-fire-dragonseeker -reeses-sodium-options@|Reese的钠视频界面 (Reese's Sodium Options) -continuity@ -airportmod -better-gui-scaling@betterguiscaling|更好的界面缩放 (Better GUI Scaling) -titles|头衔* -skiing -cave-biomes -tatami -final-fantasy-12-mod -mojangster@|加载界面动画 (Mojangster (Animated Loading Screen)) -anvil-tweaks -asphaltmod|沥青 (Asphalt Mod) - -reroll-forge|刷新附魔Forge版 (Reroll-Forge) -swordenlarger|剑模型扩大 (SwordEnlarger) -castle-in-the-sky-the-fairytale-of-laputa|天空之城 (Castle in the Sky) -dimensionalores|维度矿石 (DimensionalOres)¨dimore|维度矿石 (DimensionalOres) -illagers@illagers+|更多的灾厄村民 (Illagers+) - - - -villagers-follow-emeralds-fabric@|村民跟随绿宝石 (Villagers follow Emeralds) - -diabloloot|暗黑破坏神战利品 (DiabloLoot - Bosses Update) -yggdrasil|世界树* -ftb-dripper-forge -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) -open-to-lan -simple-translation@|简单翻译* -fx-control@|效果控制 (Fx control) -what-are-you-voting-for@ -steam-powered-create@create-steam-powered|蒸汽动力 (Create: Steam Powered) -creepers-burn@CreepersBurn - -pretty-game-enhhancing-gobblet-pgeg-remake|魔法森林重置版 (Pretty, Game-Enhhancing Gobblet Remake) - -kvc-equipment|蛋挞君的原版补全装备篇 (KVCEquipment) -mooshroomcraft|哞菇工艺* -unearthed|出土*¨unearthed-fabric|出土 (Unearthed) -terrestria@¨terrestria-reforged -simplex-terrain-generation|Simplex地形生成器* -enderscape@|末影之景* -goblin-traders-fabric@|哥布林商人Fabric版 (Goblin Traders (Fabric)) -lakeside@|湖畔* -chenziqius-originality|CHENZIQIU的创意 (CHENZIQIU's Originality) -mc-modsoy-forgery@alloy-forgery|合金冶炼炉 (Alloy Forgery) -mechanical-tech@|机械科技* -hadesgame|阴间游戏 (HadesGame) -one-block-forge - -human-reborn@ -additional-additions-forge@addadd|额外扩展 (Additional Additions)¨additional-additions|额外扩展* -earlygame@ -happiness-is-a-warm-gun@ - -kvc-blocks|蛋挞君的原版补全方块篇 (KVCBlocks) -enigtech2-util -environmental-creepers@|环保型苦力怕* - -look-at-that -advanced-peripherals@advancedperipherals|高级外设* -nether-chest-fabric@nether-chest -@essentialaddons -levelz@ -betterend-re-forked|更好的末地Forge重铸版 (BetterEnd Reforked) -mining-gadgets|采矿小工具*¨mining-gadgets-fabric|采矿小工具 (Mining Gadgets) -ponderjs -majrusz-library@ -ydms-coppergolem@ydms-copper-golem|YDM的铜傀儡 (YDM's CopperGolem) -chococraft-3 -chococraft-plus@ -travel-huts -expandability -squirrels|松鼠* -ftb-power-pots -the-graveyard-forge@|墓园 (The Graveyard)¨the-graveyard-fabric@|墓园 (The Graveyard) -nether-agriculture@netheragriculture|下界农业* -conjuring@ -awesome-dungeon-forge@awesome-dungeon¨awesome-dungeon-fabric¨awesome-dungeon-neoforge -out-of-sight@ -decorative-blocks-modded-compat|装饰方块模组兼容 (Decorative Blocks modded compat) -camp-chair -size-matters -chalk@chalk-mod|粉笔* -chalk-fabric@chalk -@modmanager|模组管理器 (Mod Manager) -yarcf@|合成冲突消除 (Yet Another Recipe Conflict Fixer) -drones -ticbc - -meetle -tarot|塔罗* -forcecraft@|力量工艺 (ForceCraft) -right-click-harvest@|右击收割 (Right-Click-Harvest) -custom-content-packs -cake-chomps@¨cake-chomps-fabric -distant-horizons@distanthorizons -betterp2p@|更好的P2P支持 (Better P2P) -ob-aquamirae@aquamirae|海灵物语 (Aquamirae)¨aquamirae-fabric|海灵物语 (Aquamirae) -nuclear-tfc -just-more-cakes@|只是更多的蛋糕! (Just More Cakes!)¨just-more-cakes-fabric|只是更多的蛋糕! (Just More Cakes!) -image-mod -reinforced-barrels@|增强木桶* -spyglass-zoom|望远镜变焦* -npc-variety-port@npc-variety|NPC变体 (NPC Variety) -just-enough-effects -incorporeal-2-rhododendrite|幻想多媒体2 (Incorporeal 2 + Rhododendrite) - -einsteins-library@ -worldshape -rslargepatterns|精致存储大样板 (Refined Storage Large Patterns) -gendustry-jei-addon -statement@ -mutant-more@|更多突变生物*¨new-mutant-more@|更多突变生物 (Mutant More) - -just-enough-keg -paleolithic-revolution -better-shields|更好的盾牌* -yungs-bridges@|YUNG 的桥 (YUNG's Bridges)¨yungs-bridges-fabric|YUNG 的桥 (YUNG's Bridges)¨yungs-bridges-neoforge|YUNG 的桥 (YUNG's Bridges) -project-red-transmission|红石计划:传导 (ProjectRed - Transmission) -day-dream@ -savage-ender-dragon|更凶猛的末影龙* - -age-of-weapons@age-of-weapons-reforged|武器时代 (Age of Weapons) -drawerstorage-keychain|抽屉钥匙扣 (DrawerStorage Keychain) -fracdustry@|分形工业 (Fractal Industry) -magical-forest|魔法森林* -skin-swapper@skinswapper|皮肤更换器* - - -owo-lib@ -picturesign@ -divine-missions|神圣任务* -gregsieves|格雷筛子 (GregSieves) -gregtech-food-option@|格雷科技食物优选 (GregTech Food Option) -converting-industrial-wires|工业线缆:转化版* -tinkers-oredict-cache|匠魂矿辞缓存 (Tinkers OreDict Cache) -mentalillness|精神病 (Mental illness) -better-magnesium-video-settings-button|更好的镁视频设置按钮* -adventurez@ -mobz -villagerquests@|村民任务 (VillagerQuests) -environmentz@ - -homing-ender-eye@|回归之眼* -magical-crops-regrowth-1-16-5|魔法作物:重生 (Magical Crops: Regrowth) -voidz@ -mining-master@ - -victus@ -lots-of-food-revived|更多食物:复生 (Lots of Food Revived) -dontstarve|不要饿死2 (DontStarve2) -steves-universe-space-mod -candy-world-recaramelized|糖果世界:重制版 (Candy World - ReCaramelized) -carrier|搬运* - -undo|撤销! (Undo!) -unnamed-animal-mod|无名动物模组* -camels|骆驼* -food-effects@ -item-borders@|物品边框*¨item-borders-fabric|物品边框 (Item Borders) -iceberg@|冰山*¨iceberg-fabric|冰山 (Iceberg) - - -enhanced-farming@|增强农业* - - -lava-clear-view@|熔岩下清晰视野*¨lava-clear-view-fabric|熔岩下清晰视野 (Lava Clear View) -global-xp@ -universal-graves@ - -more-bows-restrung@|更多弓:重振旗鼓! (More Bows: Restrung!) -nimble-fabric@nimble|灵活 (Nimble)¨nimble|灵活* -metal-barrels|金属储物桶* - - - -motiono - -vanillarecipe|香草食谱 (VanillaRecipe) - - -fantastic-fish-alpha-v1-4|神奇的鱼 (Fantastic Fish) - - -more-mounted-storages|更多存储挂载* -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 -vanilla-degus|八齿鼠* -ksyxis@ -metallurgy-4-reforged|冶金4:重铸 (Metallurgy 4: Reforged) -harder-natural-healing@ -extra-bit-manipulation -spartan-weaponry-twilight-forest|斯巴达的武器:暮色森林 (Spartan Weaponry: Twilight Forest) -iris-reforged -additional-lanterns@|更多灯笼* -bottled-air@|瓶装空气*¨bottled-air-fabric|瓶装空气 (Bottled Air) -fabricproxy-lite@ -abyssal-depths -tomes|秘典* -budschies-morph-mod@ -pswg|帕尔奇的星球大战 (Parzi's Star Wars Mod)¨parzis-star-wars-mod|帕尔奇的星球大战 (Parzi's Star Wars Mod) -aquatic-abyss -slimier-slimes -stupid-weapon -slime-carnage|史莱姆杀戮* -portal-tags -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 -flaminco -simple-graves - - -wi-zoom@|WI变焦 (WI Zoom) -forge-carpet@ - -fabric-tree-chopper@|砍树* -i-see-lava@ -dual-riders -refined-relocation-2|简单分类2* -ftb-sluice -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|物品计数器* - -reality-check-real-life-timer -retail - -time-core-lib - -mclogin -rereskillable -kubejs-blood-magic -kubejs-create@ -kubejs-ui-forge -kubejs-thermal@ -kubejs-immersive-engineering@ -kubejs-mekanism@ -starter-kit@|初始套件*¨starter-kit-fabric|初始套件 (Starter Kit) - -stacker@ -gcm -ocean-floor-clay-sand-and-dirt -linfox-stacked-dimensions-warden-edition -experience-bottler -gregicality-ore-addon|Gregicality矿物拓展* -gregtech-battery-buffer-driver-for-opencomputers|格雷科技电池箱的开放式电脑驱动 (GregTech Battery Buffer Driver for OpenComputers) -orimod -htm@ -gtce-inventory|格雷物品管道 (GregTech CE Inventory Pipes) -mechtech|机械工程 (MechTech) -gregtech-energistics|格雷能源 (GregTech Energistics) -empatic -nukepowered-utils -gtce2oc|格雷科技开放式电脑兼容 (gtce2oc) -azure-rpg-items|Azure的RPG风格物品 (Azure RPG Items) -mine-and-slash-expansion|挖矿与砍杀拓展 (Mine and Slash - Expansion Mods) -devil-may-cry-weapons|鬼泣武器* -craft-to-exile-custom-uniques|放逐之路定制物品 (Craft to Exile Custom Uniques) -terraria-arsenal|泰拉瑞亚装备* -world-of-warcraft-weapons|魔兽世界装备 (World of Warcraft Weapons) -mcdoom@|MC 毁灭战士 (MCDoom) -bleach-weapons|死神装备* -behgameon -into-the-maelstrom|冒险漩涡* -create-deco@¨create-deco-fabric -warp-pipes -fertile-farmland|沃壤千里* -luckperms@ -inv-view@invview -ftb-industrial-contraptions|FTB工业奇械 (FTB Industrial Contraptions) -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 - 最新版(包括公开测试版) - -cursor-mod@cursormod|自定义光标* -amplified-nether@|放大化下界* -oreberries-replanted@|矿莓重制版* - -eye-contact-prohibited|禁止眼神交流! (Eye contact prohibited) - -modular-assembly|模块化组装* -healer@ -calcium|钙* -from-the-shadows -l_ender-s-cataclysm@l_enders-cataclysm|灾变 (L_Ender 's Cataclysm) -brighter-block-light|亮光 (Brighter) -pick-up-notifier@|拾取提示*¨pick-up-notifier-fabric|拾取提示 (Pick Up Notifier) - -talkbubbles@ -servux@ -config-menus-forge@forge-config-screens -saplanting@|落苗生根* -login -edible-bugs -farsight¨farsight-fabric - -atlantis@|亚特兰蒂斯* -gaia-dimension -pwem@ -akisephilas-bosses - - -fluffys-farming -aquatic-odyssey-mod -vanilla-cookbook@vanillacookbook|原版烹饪书* -edible-nether-wart|可食用下界疣* -plasmo-voice@|Plasmo 语音* -armor-sound-tweak|盔甲音效调整* -hexerei@|魔法巫师* -morerefinedstorage@ -give-me-water-or-give-me-death -lost-and-found -better-fps-render-distance¨better-fps-render-distance-fabric -armor-chroma-for-fabric@|盔甲颜色显示Fabric版 (Armor Chroma for Fabric) -ore-reeds|矿石甘蔗* -connected-glass@ -blockui -storage-racks -Dung-Pipe -extra-armor|更多盔甲* -pig-poop -stupid-horse-stand-still -ceramic-bucket@|陶瓷桶* -durability101@ -ceramic-shears|陶瓷剪刀* -torch-bandolier@|火把弹药袋* -rapid-leaf-decay@ -netherite-horse-armor-mod|下界合金马铠* -ambient-environment@ -glass-cutter -dicemc-tiered-armors -tetranomicon -more-observers|更多侦测器* -villagers-respawn@|村民重生* -hot-swappable-armor|热切换护甲 (Hot-Swappable Armor) -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@|更好的潮涌核心放置*¨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)¨ore-tree-reborn-fabric|矿物树:重制 (Ore Tree:Reborn) -player-tracking-compass@ - -tooltipfix@|信息提示修复 (ToolTipFix) -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¨awesome-dungeon-edition-ocean-fabric -pistorder -escape-rope-pokemon-item-forge -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 - -voidtotem@|虚空图腾 (Void Totem)¨voidtotem-fabric|虚空图腾 (Void Totem) -tool-leveling-plus@tool-leveling|工具升级 (Tool Leveling+)¨tool-leveling-plus-fabric|工具升级 (Tool Leveling+) -mythicmetals@|神话金属 (Mythic Metals) -creeper-firework@|烟花苦力怕* -second-chance@second-chance-forge¨second-chance-forge -promenade@ -london-underground@the-tube|伦敦地铁 (MTR London Underground Addon) -dynamiclights-reforged@sodium-dynamic-lights|钠/Embeddium:动态光源 (Sodium/Embeddium Dynamic Lights) -the-wild-mod@|荒野更新* -tuff-depth|凝灰岩深度* -minefantasy-reforged|我的幻想重铸版 (MineFantasy Reforged) - -framework¨framework-fabric - - -anointed-items -golden-age-combat@|黄金时代的战斗* -magnesium-extras|钠/Embeddium:附属 (Sodium/Embeddium Extras) - 全部¨@sodium-extras|钠/Embeddium:附属 (Sodium/Embeddium Extras) -chest-tracker@|箱子追踪* -advancementinfo@|进度信息展示 (AdvancementInfo) -animatica@ -mc-mods-dimension-height-increase|全维度建筑高度提升 (All Dimension Height Increase) -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 -@jsonem|Json格式化实体模型 (Json Entity Models) -speedrunigt@ -archmagus -slimyboyos@ -fireplace-lib@¨fireplace-lib-forge -immersive-geology@|沉浸地质学* -wool-tweaks@|羊毛调整*¨wool-tweaks-fabric|羊毛调整 (Wool Tweaks) -tools-complement@ -adventtic -questionably-immersive -long-fall-boots -total-darkness -true-darkness@ -starlight-x-create -grand-economy -chinacraft2|华夏文明2 (ChinaCraft2) -interactic@ -fnars-roguelike-dungeons|冒险地牢-Fnar版 (Roguelike Dungeons -- Fnar's Edition) -playerex -data-attributes -hardcore-buoyance -gregtech-ce-unofficial@|格雷科技社区版:非官方版 (GregTech CE: Unofficial) -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@|铁砧修复*¨anvil-restoration-fabric|铁砧修复 (Anvil Restoration) -hide-hands@|隐藏主副手*¨hide-hands-fabric|隐藏主副手 (Hide Hands) -better-beacon-placement@|更好的信标放置*¨better-beacon-placement-fabric|更好的信标放置 (Better Beacon Placement) -dead-totems -functional-storage@|功能性存储* -the-wild-update|荒野更新 1.19 (The Wild Update 1.19) -archeology@|考古学 (CapsLock Archeology) - -trinkets-and-baubles@|饰品与小玩意 (Trinkets and Baubles) - -rope-ladders|绳梯* -skewers-updated|烤串更新版* -keep-my-soil-tilled@|保持肥沃*¨keep-my-soil-tilled-fabric|保持肥沃 (Keep My Soil Tilled) -double-doors@|双开门*¨double-doors-fabric|双开门 (Double Doors) -expanded-armor-enchanting@|盔甲附魔扩展* -expanded-weapon-enchanting@|武器附魔扩展* -expanded-axe-enchanting@|斧附魔扩展* -expanded-trident-enchanting@|三叉戟附魔扩展* -urns -pylons -on-soul-fire@ -wizard-staff -kambrik@ -additional-bars@additionalbars|更多的栏杆*¨additional-bars-fabric|更多的栏杆 (Additional Bars) -leap@ -cameraoverhaul@ -enchantment-id-extender@eide -creeper-overhaul@|苦力怕改革 / 苦力怕革新* -cool-elytra-roll@ -camera-overhaul-forge -blame¨blame-fabric -patboxs-banhammer@banhammer -terraformed-api-reforged -multiblocktweaker -good-ol-currency -macaws-bridges-atmospheric|Macaw的桥梁:悠然一派附属 (Macaw's Bridges - Atmospheric) -leadvillagers -fabric-shield-lib@fabricshieldlib -frys-things-guns-and-more -quickbind|功能集成 (Quick Bind/Command GUI buttons) -ompd|开放式模块化被动防御 (Open Modular Passive Defense) -basic-shields-fabric@ -borderless-mining@ -ledger@ -pet-owner@petowner -spartan-hud-baubles|斯巴达饰品栏HUD (Spartan HUD: Baubles) -mekanism-matter|通用机械:物质拓展* -inzhefop-core - - -legendary-tooltips@|传说提示框*¨legendary-tooltips-fabric|传说提示框 (Legendary Tooltips) -myrtrees - -tiny-redstone - -icarus@ -the-splash-milk@|喷溅牛奶 (Splash Milk) -fastbench-for-fabric|工作台性能优化Fabric版 (FastBench for Fabric) -mob-buckets-fabric|生物桶 (Mob Buckets) - - -enchantable -glass-doors|玻璃门* -glasscutter|玻璃切割器 (Glass Cutter) -upgradable-crystal-tools -no-dragon-cheese -glassware|玻璃制品* -milk-plus@milk_plus -modifiers|重铸* -customnpc-plus@|自定义NPC+ (CustomNPC+) -ingredient-extension-api@ - -wireless-networks -compass-manhunt@ -exlines-furniture@ -tinkers-archery|工匠箭术 (Tinkers' Archery) -designer-modeling|设计师建模* - -netherite-horse-armor-fabric|下界合金马铠 (Netherite Horse Armor) -netherite-elytra|下界合金鞘翅* - -more-tcon@moar-tcon|更多匠魂材料 (Moar TCon) -exlines-emerald-equipment@emerald-equipment -exlines-candy-mod -renamer|代号名称* - -the-herobrine-mod-1-7-10 -aquatic-armors -immersive-industry|沉浸工业* -lightmans-currency@¨lightmans-currency-fabric -hellfire-fireball-launcher|地狱火:火焰弹发射器 (Hellfire: Fireball Launcher)¨hellfire-fireball-launcher-fabric|地狱火:火焰弹发射器 (Hellfire: Fireball Launcher) -guild@ -endless-deep-space|无尽深空* - 已弃用¨@endless-deep-space|无尽深空 (Endless Deep Space) - -dynamic-trees-for-sakura|动态的树:樱附属 (Dynamic Trees for Sakura) -advanced-fishing - -bettertabs@ -classy-hats|时髦帽子* -bedbreakbegone@ -bq-multiblock-structure-integration@|更好的任务 - 多方块与结构扩展 (Better Questing - Multiblock and Structure Integration) -bqtweaker@ -hypnos@ -collision-damage@ -project-74246@doomlike-dungeons|毁灭地牢 (Doomlike Dungeons) -dynamic-trees-defiled-lands|动态的树:污秽之地附属 (Dynamic Trees - Defiled Lands) -xaero-map-addition@ -lambdacontrols@|Lambd 的控制优化 (LambdaControls) -ducky-mod -craftgr@|幻想乡电台 (CraftGR) -quartz -mc-mods-the-blocks -mc-modsthemodium -ato -just-enough-effect-descriptions-jeed@|JEI药水效果 (Just Enough Effect Descriptions) -hostile-neural-networks -mo-cakes|更多蛋糕 (Mo' Cake) -fishing-made-better|更好的钓鱼* -neon-craft-ultimate|霓虹灯艺2 (Neon Craft Ultimate/Neon Craft 2 Mod) -architects-dream|建筑师之梦 (Architect's Dream) -ignition-enderbags -correlated@ -enderbags -no-mob-spawning-on-trees -rf-lux@ - -@roughly-enough-characters - -easy-normal-and-magic-foods -tiefix@ -more-chat-history@morechathistory|更多聊天记录* -phosphor-reloaded|磷重制版* - -pigstep-backport -agadars-brewing-api - - -ae-shield|奕 秉甲* - -giant-player-boss|巨人玩家 Boss* -set-bonus -tntutils@ -giant-swords|巨剑* -terrablender@¨terrablender-fabric¨terrablender-neoforge -commandhelper|命令助手 (CommandHelper) -bilibili - -creatures|Frikinzi's Fauna - 已失效¨@frikinzis-fauna -mcdw@|我的世界:地下城武器 (MC Dungeons Weapons) - -beta-creepers - -macaws-paintings@|Macaw的画 (Macaw's Paintings) -dyenamics -multi-piston -blood-magic@|血魔法* -resolutioncontrol@resolution-control-plus|分辨率控制 (Resolution Control/ResolutionControl+)¨resolution-control|分辨率控制 (Resolution Control/ResolutionControl+) -wdl|世界下载器 (World Downloader) - - -domum-ornamentum -methodicalmilking - -save-and-load-inventories@¨save-and-load-inventories-fabric -forge-config-api-port-fabric@forge-config-api-port -pams-cookables -end-metals -vitality -featured-servers -oldjavawarning@|旧Java警告 (OldJavaWarning) -mercurius -mc-mods-the-swords -pams-simple-recipes -bow-infinity-fix@|无限附魔修复* - -enchanting-infuser-forge@enchanting-infuser|附魔灌注台 (Enchanting Infuser) -menumobs|主菜单生物渲染 (MenuMobs) - -tiny-skeletons-forge@tiny-skeletons|小骷髅变种 (Tiny Skeletons)¨tiny-skeletons-fabric|小骷髅变种 (Tiny Skeletons) - -matter-overdrive-community-edition@moce|超能物质 (Matter Overdrive) -cavetweaks|洞穴调整 (CaveTweaks) -cosmetic-armor-fabric@cosmetic-armor|时装盔甲 (Cosmetic Armor) - - -crimson-chickens -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 -betweenlands-redstone -more-peripherals@ -ageing-spawners@ -loot-extra|战利品表拓展 (LootExtra) -cloud-boots-mod@cloud-boots|云靴 (Cloud Boots) -better-compatibility-checker@ -fastfurnace-minus-replacement -harvest -craftpresence@ -stonecutter-recipe-tags@stonecutter_recipe_tags -customnpcsreborn|自定义NPC:重生 (Custom NPCs Reborn) - -brassamberbattletowers|战斗高塔 (BrassAmber BattleTowers) -jags -sedna -fog-tweaker -open-elevator-fabric|Fabric版开放式电梯 (OpenElevator (Fabric)) - -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 -morepaths -extended-mushrooms@ -shear-madness -missing-pieces -hatchery -alexs-delight -creatures-and-beasts@|动物和野兽 (Creatures and Beasts) -dead-guys-deep-dark -towers-of-the-wild-reworked|旷野之息高塔:重制 (Towers of the Wild: Reworked) -towers-of-the-wild-reloaded|旷野之塔:重置 (Towers of the Wild: Reloaded) -bansoko|创可贴 (Bansoukou) - -inventory-backpack@inventory-backpack-mod - - -reinforced-shulker-boxes@|增强潜影盒* -fastopenlinksandfolders|快速打开链接和文件夹 (FastOpenLinksAndFolders) -reinforced-chests@|增强箱子* -biome-staff -dynamic-trees-quark@|动态的树:夸克附属 (Dynamic Trees - Quark) -radium-reforged@radium|镭* -backpackmod@ - -untamedwilds|不羁野性 (Untamed Wilds) -advancements-tracker@|进度追踪器概览 (Advancements Tracker and Overview) -no-null-processors - -ma-enchants|Ma 附魔* -bits-and-chisels@ -trading-post@|交易站*¨trading-post-fabric|交易站 (Trading Post) -phantasmic¨@phantasmic|Nourished Nether/Phantasmic/Netherific - 已失效 -furnus -permanent-light-generator@plg|恒久光发电机*¨permanent-light-generator-fabric|恒久光发电机 (Permanent Light Generator) - -immortuos-calyx -claim-chunk -dicemc-money-mod@money-sign-shops -client-command-aliases -interactive-corporea|交互多媒体* -just-another-auto-clicker - -better-sneak|更好的潜行* -crapping-copper|压缩升级铜* -botany-pots-ore-planting@|植物盆栽矿石种植* - -satin-api@ -easy-magic@|简易附魔台* -enlightend@|末地启明 (Enlightend/Enlightened End/Nourished End) -rubidium@|铷* -cultural-delights@|多元乐事* - -jer-integration|JER集成 (JER Integration) -just-enough-beacons|JEI信标* -windowed-fullscreen - -helpful-hitboxes-forge¨helpful-hitboxes-fabric -vein-mining@|连锁采集*¨vein-mining-fabric|连锁采集 (Vein Mining) -ars-creo@ -it-fell-from-the-sky - - - - - - - -lyonheart@ -genshin-12|原神12* -ae-additions-extra-cells-2-fork@ae-additions -silent-addons -ars-arsenal -gps-mod-stalker-mod -extended-armor-bars -atom-economy|基石-经济 (Atom-Economy) -just-enough-piglin-bartering|JEI猪灵以物易物* - -@aftersans53228-fabric-road|暗访谈的Fabric道路 (aftersans53228's fabric roads) -primal-magick@|原初魔法* -ore-creeper@|矿石苦力怕* -panthalassa|泛古洋* -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@|玉米乐事*¨corn-delight-fabric@|玉米乐事 (Corn Delight) - - -blast-craft@blastcraft|防爆工艺 (Blastcraft) -zdgx@|mod自动更新 (zdgx-AutoUpdateMod) - - -ore-highlight|矿石发亮* -sodium-shadowy-path-blocks@|钠 · 土径阴影* - -polymer@ -elytra-bombing|鞘翅轰炸*¨elytra-bombing-fabric|鞘翅轰炸 (Elytra Bombing) -cuboiddroids-support-mod - - - -litematica-tool|投影工具* -frozen-up|千里冰封* -carpet-tis-addition@ - -more-banner-features@|更多旗帜功能* -horsestatsvanilla@|马匹状态 (Horse Stats Vanilla) -biome-id-extender -rereskillable-reborn -rereskillable-rereforked -tetra-pak -ars-magica-legacy -compressium -talking-villagers|会说话的村民* -artifality@ -boat-container@|箱船* -delogger -just-another-vanilla-addon-java|迫真原版增强 (Just Another Vanilla Addon) -spectrite-mod|彩虹 (Spectrite) -genshin-nature@|原神:自然* -power-utilities-remastered@power-utilities|能源转换重制* -create-gear-addon -gun-mod-tl - -energymeter@ -headindex@|头颅菜单 (Head Index) -quantum-generators@|量子发电机* -simply-quarries@|简易采石场* -lethal-peaceful - - -storage-drawers-crafting-recipe -enhanced-attack-indicator@|增强攻击提示器* -parasites-addon-overlast|寄生兽:末世扩展 (OverLast) -cancel-block-update@|取消方块更新* -franciscofunari@medieval-craft-(structures)|中世纪工艺 (Medieval Craft) -d3core -green-thumb-v1-2-03 -greenthumb -tfc-adventure|群峦冒险 (TFC+ Adventure) -just-zoom-forge@just-zoom -server-holograms@holograms|全息图 (Holograms) - -eidolons-hexblades|幻梦咒剑 (Eidolon's Hexblades) -monke-madness -put-ingot-down|把锭放在地上吧! (Put Ingot Down!) -torchtools -lottweaks -quests-additions-fabric|任务拓展 (Quests Additions)¨quests-additions|任务拓展* -custom-mob-spawner|自定义生物生成器* -rpg-hud@¨rpg-hud-fabric -the-wild-update-concept-mod - -sinocate@|肴馔 (SinoCate) -oreregen|再生矿石 (OreRegen) -eidolon_tweaker - -herodotusutils@herodotus-utils -platypuses -hostile-villages|敌对村庄* -throwability|投掷* -biomeinfo@|生物群系信息 (BiomeInfo)¨biomeinfo-fabric|生物群系信息 (BiomeInfo) -clickable-advancements|可点击的进度* -factory0-resources -epic-knights-armor-and-weapons@epic-knights-shields-armor-and-weapons|史诗骑士:盾牌,盔甲和武器 (Epic Knights: Shields, Armor and Weapons) -youre-an-expert-harry|你是个专家,哈利! (You're an Expert, Harry!) -dragon-mounts-3|龙骑士3* -viaforge@ -happy-trails|快乐小径* -naturesaura_tweaker -death-finder@|死亡溯源*¨death-finder-fabric|死亡溯源 (Death Finder) - -portable-craft|便携工艺* -@polypack_host -etched@ -caves-cliffs-backport-additions -cobblefordays@ -admin-shop@shop|官方商店* -vanillamagic|纯净魔法 (Vanilla Magic) -deep-mob-learning-simulacrum -oculus@ -simple-planes-tfc -mishang-urban-construction@|迷上城建* -@cursed-legacy-api -phi@ -ae2-utilities|AE2实用设备 (AE2 Utilities) - -epic-psi -missingmagic -enchanting-convergence -magical-psideas-model-replacer -psio - - - - - -copper-pot@|铜锅! (Copper Pot!) - - -viarewind -viabackwards -thaumic-isorropia -loading-manager@loadingmgr|更多加载信息* -psitools -psionic-upgrades -psionicolor -reskillable-psi-compat -zettai-psi -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!) -collisions-lib@ -wooled-boots@|羊毛靴子* -zawa-evolved@|野生动物园:进化 (Zoo and Wild Animals: Evolved) -bongo@|宾果游戏* -impersonate@ -calemi-core@ccore - - -visual-workbench@|可视化工作台* -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@|更好的模组按钮* - -advancement-frames@ - -dynmapforge -spellbind@|物品魔法* - -bumpkinbatch -beekeeper|养蜂人* -some-assembly-required@ -ladylucs-critters-mod -@modmenu-beta - -better-signs -@macula -@howmanyitems -@howmanyitems-fabric - -@glass-config-api -@translated-legacy - - - -create-irrigation -delete-worlds-to-trash-forge@delete-worlds-to-trash¨delete-worlds-to-trash-fabric - - -simple-magnets@|简易磁铁* -guns-without-roses@|枪炮“没”瑰* -buddycards-expansions|巴迪卡牌扩展* -zettai-ars -cant-sleep-clowns-will-eat-me@|夜不能寐 (Can't Sleep Clowns Will Eat Me) -colony-cards|殖民地卡牌* -autoharvest|自动收获 (AutoHarvest) -realistic-block-physics@ -domestication-innovation@|驯养革新* -snuffles@|魄罗* -flan-forge@flan¨flan -awesome-dungeon-the-end-forge@awesome-dungeon-the-end¨awesome-dungeon-the-end-fabric -tehnuts-torcherino -library-ferret-forge@library-ferret¨library-ferret-fabric¨library-ferret-neoforge -awesome-dungeon-nether-forge@awesome-dungeon-nether¨awesome-dungeon-nether-fabric -ae2-extended-life|应用能源非官方延续版 (AE2 Unofficial Extended Life) - -refined-cooking@|精致厨房* -jade-addons@jade-addons-forge¨jade-addons-fabric@ -feature-nbt-deadlock-be-gone@ - -real-infinity-bow-allow-inf-mending|真正的无限弓 (Real Infinity Bow) -drink-it-forge|喝! (Drink It!) -foxlib -tails -howling-moon-rebooted-forge¨howling-moon-rebooted-fabric - - -@dustrial-decor -furnish@furnish-furniture -iammusicplayer@iam-music-player - -pirates|海盗* -comics-bubbles-chat@ -fabric-extended-armor-bars-forked -eating-animation-forge@eating-animations|进食动画 (Eating Animation)¨eating-animation-fabric@eating-animation|进食动画 (Eating Animation) -waterdripsound@dripsounds¨dripsounds@waterdripsound -better-horse-hud|更好的骑马 HUD* -thermopolium|汤饮铺* - - -orderly-fabric-2-0 - -entity-texture-features-fabric@entitytexturefeatures|实体纹理特性 (Entity Texture Features) -sculk-plus -creeper-confetti-fabric|烟花苦力怕Fabric版* -double-jump-attribute¨@double-jump-attribute|Double Jump Attribute - 已失效 -overweight-farming@ -healthcare@ -betterloadingscreen|加载画面改良 (Better Loading Screen) -fabric-title-changer@ -window-title-changer - -@betterlight - - -@bushyleaves -robins-ruby-mod - - -just-needed@justneeded¨just-needed-fabric -nodami-remake|伤害免疫机制移除重制版 (NoDamIRemake) -had-enough-items@|HEI物品管理器* -worldinfo -@bang -block-helper@ -@class-loader-fixer -@font-fixer -gregicprobe - -travelers-index - -dimension-data-fix|维度数据修复* -gtce-bees|GTCE 蜜蜂 (GTCE Bees) - - -armory-expansion-bits-and-pieces -electrostatic-tinkers-toys@ -banhammer -slabgen -potioncraft -atlas-lib@ -blood-smeltery@ -tinkers-memes -tinkers-golems-addon -tinkers-addons-fork -reagenchant - -sim-u|模拟城市/模拟大都市 - -thorium@|钍* -creative-one-punch@ -radon@|氡* -ars-omega -game-stages-conditions -tinkers-construct-tool-leveling-with-random -odd-water-mobs -glowsquids-begone@ -theundead@the-undead-revamped -framedblocks@|框架方块 (FramedBlocks) -nekos-enchanted-books@ -istc|我说了算 (I Said The Calculation) - -dracovita-farm-life -no-enchant-cap@ - -artisan-automation|工匠自动化* -enchanted-wolves - -rain-growth@rain -scape-and-run-monstress|逃逸:魔物娘 (Scape and Run: Monstress) -raised@ -resetchunks@ - - -moreblocksforyou -trident-return -bettertridentreturn -multibeds¨multibeds-fabric -enhanced-armaments-reload|增强装备重制版* -entangled@ - -createplus@ -custom-fluid-mixin@ -slender-reimagined -doors-by-ichun -slender-man-mod -cookielicious|曲奇佳味* -the-forbidden|禁忌者* -memory-usage-screen@ -evergreenhud@ -nuit@ -@level-border -@fvt -blue_skies_tcon -tdv-tweaks - -picture-in-picture-pip -guilt-trip -parcool@|跑酷! (ParCool!) -legacy-mc-kotlin -minimepets -ugly-scoreboard-fix@ - - - -railcrafttweaker -pig-grinder -photoreal -keygrip-mocap-mod - -attachable-grinder -hat-stand -chunk-copy-fabric@ -inventory-home|回归箱* -nether-hexed-kingdom - -@paimonfoodreborn|应急食品:重制 (PaimonFood:Reborn) -talking-ben-mod -in-backpack-eat|背包内食用 (In-backpack Eat)¨@inbackpackeat|背包内食用 (In-backpack Eat) - 已失效 -with-thursday|相约星期四 (WithThursday!) -smooth-swapping@|平滑转移*¨smooth-swapping-forge@smooth-swapping-forge-updated|平滑转移 (Smooth Swapping) -tinkering-with-blood-magic -tinker-toolcasts -thermal-tinkering -deuf-duplicate-entity-uuid-fix -corundum-meadows -millenaire-extended-inuits -mct-smeltery-io -opencomputers-drivers-for-tinkers-construct -oedldoedl-construct -millenaire-extended-byzantine -millenaire-extended-normans -millenaire-extended-indians -millenaire-extended-maya -oedldoedl-core -oedldoedl-resources -oedldoedl-gear -disguiseheads@ -simple-tcon -enchanted-tooltips@ -stackablepotions-forge¨stackablepotions -mobifier¨mobifier-fabric -art-of-forging-a-tetra-addon|锻造之艺 (Art of Forging) -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) - -property-modifier -grimoire-of-tetra -prehistoric-delight-by-nocube|史前乐事 (Prehistoric Delight) - -simple-stations -ars-elemental-elemental-spell-foci|元素魔艺 (Ars Elemental) -too-many-glyphs -create-cafe@|机械动力:咖啡馆* -@worldbordercolor -ic2-rpg|工业RPG (IC2 RPG) -drop-the-meat@dropthemeat|肉多多 (Drop the Meat) -better-invisibility|更好的隐身* -tweakerplus@ -autorun-fabric@autorun -fpv-drone -campfire-backport@ -skip-transitions@ -just-load@ -cheese-dragon -boatjump@ - -torched -nyfs-quivers@|Nyf的箭袋 (Nyf's Quivers) -party-parrots@¨party-parrots-fabric -patina-pipeworks|古铜管道* -brewevolution|酿造进化🍺 (Brewevolution 🍺) -devil-fruits|恶魔果实* - -trail-mix -multiplayer-server-pause-forge|多人服务器暂停 (Multiplayer Server Pause)¨multiplayer-server-pause-fabric|多人服务器暂停 (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@ -medieval-siege-machines@|中世纪攻城机器* -leapoffaith-forge|信仰之跃 (Leap of Faith) -top-plus -refined-storage-fluxified@ -quit-confirm -compressedcreativity@|压缩动力 (Compressed Creativity) -applied-mekanistics@|应用能源:通用机械附属* -craftdumper -immersive-weathering-fabric@immersive-weathering|沉浸式风化 (Immersive Weathering)¨immersive-weathering-forge|沉浸式风化 (Immersive Weathering) -replay-mod-for-forge -bigtrees -absolutely-not-a-zoom-mod@anazm|绝对不是一个缩放模组* -glymworld-lush-caves -colored-crafting-stations -harvest-scythes -croptosis -weeping-angels-mod@weeping-angels¨the-lonely-assassins -hardcore-item-stages -game-stages-viewer -mpm-lotr|更多玩家模型:魔戒兼容 (MPM LOTR) -guard-villagers-fabric@guard-villagers-(fabricquilt)|警卫村民Fabric版 (Guard Villagers (Fabric)) - -item-highlighter@|物品高亮*¨item-highlighter-fabric|物品高亮 (Item Highlighter) - -environmental-armor@¨origins-environmental-armor-1-18-1-port - -health-levels@ -the-comfort-zone@ - -mekatweaker -smithing-in-the-90s -embellished-enchanting - -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-fabric|自定义玩家模型 (Customizable Player Models) -extrachampions|强敌扩充 (ExtraChampions) - - - -another-origins-mod -just-another-void-dimension -player-weight-mod|玩家重量* -chunk-loaders@|区块加载器* -tinkerstages -@oneboxatatime -eccentric-tome-updated@eccentric-tome|怪奇宝典 (Eccentric Tome)¨eccentric-tome|怪奇宝典* -arnicalib - -gregicality-multiblocks@ -@forcecloseworldloadingscreen|强制关闭加载屏幕 (kennytv's epic force close loading screen mod for fabric) -the-box-trot@ -better-biome-blend@|更好的生物群系过渡* -forever-enough-items|FEI物品管理器* -chess|象棋* - 此已不受支持¨@chinesechess|象棋 (Chess) - >=3.0 -immersive-fx -ydms-weapon-master@weaponmaster|YDM的武器大师 (YDM's Weapon Master) -galacticrafttweaker -moreleads@|拴绳增强 (More Leads) - -simple-discord-rpc@ - -excore -messmod@ -log4j2-jndi-exploit-fix -woodcutter¨woodcutter-forge -origins-classes-forge@|起源:职业非官方Forge版 (Origins: Classes (Forge)) -tool-stats@ -thatched -fumo-mod -basement-origins -no-weak-attack -bettas|搏鱼* -baby-fat|婴儿肥* -quickplant|顷刻吐芽 (QuickPlant)¨quickplant-fabric|顷刻吐芽 (QuickPlant) -infinite-dungeons -wpo-addon-mod -just-the-binding-of-isaac-pills -pendant-of-life -the-binding-of-isaac-tears-mod -humbling-bundle@|慈善捆绑包* -grindstone-sharper-tools@¨grindstone-sharper-tools-fabric -nutritious-milk@¨nutritious-milk-fabric|Nutritious Milk - 文件已失效 -extract-poison@¨extract-poison-fabric -zombie-villagers-from-spawner@¨zombie-villagers-from-spawner-fabric -vine-climber -healing-soup@¨healing-soup-fabric -idas@|地牢建筑统合 (Integrated Dungeons and Structures) -mob-sunscreen@ -@dontstarvereborn|不要饿死:重生 (Don't Starve: Reborn) -decorative-winter -looot@ -wmch -block-event-separator@ -no-damage-immunity-reload|伤害免疫机制移除重制版* -sheve -chromatic-currents@ -dropfullcarts -are-you-blind -alwayseat-reload|吃不停重制版 (AlwaysEat Reload) - -tps-hud-fabric - -orcz -sandwichable@ -@shelve-refabricated -mod-erate-loading-screen@moderate-loading-screen -shrink_@shrink -cable-tiers@ -jumbo-furnace@ -no-villager-death-messages@ -tank-null -trajans-tanks-forge¨trajans-tanks-fabric-wip -colds-easy-paxel-lite - -smooth-chunk-save|平滑区块保存* -rigoranthus-emortis -jei-utilities|JEI实用设备 (JEI Utilities) -plummet -stackone-mod|禁止堆叠 (StackOne) -spectrum@|光谱世界* -kitteh6660s-morecraft -angel-ring|天使指环* -debugify@ -nomowanderer@ -mc-modsthecompressed -cave-enhancements@ -creative-apiary|创造蜂场* -creative-crafter -mcmod-search-reborn|MC百科资料搜索-重生 (MCMOD Search Reborn) -proxy-server@ -multithreaded-noise -spelling-table-mod|拼写台* - -advancedchatcore@AdvancedChatCore -dirt-deco -multiblocked -arcanus-legacy@ -armor-weight -mc-mods-the-tweaks -runelic@ -alexs-cloud-storage@|云存储 (Cloud Storage) -visuality@|可视性* -ecologics@|丰富的生态* -mob-scarecrows -trolls-community -g4mespeed@ -ogres-community -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 制作的修复版 -immersive-armors@|沉浸式盔甲* -seeds@ -unusual-drill -frosted-friends@ -hover-pets|飘浮宠物* -ic2-patcher -useless-sword@|朴华之剑* -jei-professions -atm-additions -extra-tags|额外标签* -advancedchatlog@AdvancedChatLog -crafting-station|合成站* -sons-of-sins@|七罪之子* -advancedchathud@AdvancedChatHUD -fuzes-relics -chirpys-wildlife@wildlife-fabric -megaparrot@ -nourish -village-box|村庄盒子* -waila-stages -steves-vanilla - -duckling@ -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 -icommonlib@icommon -chunky-pregenerator@chunky|预生成区块 (Chunky)¨chunky-pregenerator-forge|预生成区块 (Chunky) -beast-slayer|上古凶灵/远古野兽 (Ancient Beasts/Beast Slayer) -easyauth@ -depth@ -slimy-stuff@ -netheriteroad|下界之路 (Netherite Road) -organics -qsl@ -kaliastyle|卡利亚式附魔 (CarianStyle) - -wmitaf@ -depth-meter|深度计* -omni-hopper@omnihopper -jumpy-boats@ - -carpetclient@ - -dynamic-trees-vampirism|动态的树:吸血鬼附属 (Dynamic Trees - Vampirism) -transcend|超越* - -connectible-chains@connectiblechains¨connectible-chains-forge - -birds-nests-fabric|鸟巢 Fabric 版 (Birds Nests (Fabric)) -hot-or-not-tfc -eye-of-dragons -paperdoll@|纸娃娃 (PaperDoll) -little-logistics@ -show-me-what-you-got@ -herdspanic@ -extrasounds@ -brooms -the-stormlight-archive-mod|飓光志* -extrae -projecte-integration@|等价兼容 (ProjectE Integration) -mekajs -antique-dragons@ -badpackets@ - -undead-army -ironagefurniture -minekeamod -aeble -trident-mod|三叉戟 (Trident) -custom-professions@custom-villager-professions|自定义村民职业 (Custom Villager Professions)¨custom-villager-professions-fabric|自定义村民职业 (Custom Villager Professions) - -nextspring|化作春泥更护花 (NextSpring)¨nextspring-fabric|化作春泥更护花 (NextSpring) -psionic-utilities -lucent@ -togglesneak -iron-apples -actually-additions-fluxified@ -dank-storage¨dank-storage-fabric -pixelgamewizards-banded-torches -dynamic-trees-byg|动态的树:你将去的生物群系附属 (Dynamic Trees - Oh The Biomes You'll Go) - -comfort-magic -colored-lights-fabric -biomes-far-away -better-runtime-resource-pack@brrp|更好的运行时资源包* -ends-delight@|末地乐事 (End's Delight) -natures-starlight -mc-modsoygery@alloygery -custom-game-rules -lava-walker@lavawalker -pretty-pipes|更好的管道* -@death-flashback|死亡回溯 (Death Flashback) -victorymod -cryptic-assets-pack -dynamicregistries@ -among-us-mobs -among-us|在我们之中* -universal-ores-fabric@universal_ores - -project-copper -pirates-and-looters-mod -@mudrock|泥岩 (Mudrock) -itemchat - -resident-evil-8-mod@resident-evil-84|生化危机8 (Resident Evil 8) -solar-forge -colored-allays|染色悦灵* - -phantasm@ends-phantasm -emerald-craft-mod@emerald-craft|绿宝石工艺* -roughly-enough-professions-rep@|REI工作方块 (Roughly Enough Professions) -sophisticated-core@|精妙核心* -edibles@¨edibles-fabric -reach-fix@ -lootjs-forge@lootjs -chat-sounds@chatsounds -advancement-screenshot@¨advancement-screenshot-fabric -mc-mods-loot-drops@all-loot-drops -disc-jockey@ -better-taskbar@|更好的任务栏* -storage-network - - -snr-more-metal -gate-of-babylon|王之财宝 (Gate of Babylon) - -evocation -the-illusioners-cabin -gw-pillager-outpost -mercs-and-menaces -illage-and-spillage -more-illagers -probably-chests -illager-plushies¨illager-plushies-fabric -pillageplunder -extended-illagers-mod -midnightcontrols@ -wonderful-enchantments@majruszs-enchantments -a-lot-of-useless-stuff -lankaster-origins@lankasters-origins - - -priority-target|优先目标* -advanced-botany|高级植物学* -charred -incorporeal-3@|幻想多媒体3* - - -oxygen|氧* -immersive-combat@|沉浸式战斗* -@essentialclient -mystical-index@ -combat-commons -corail-woodcutter - -nolocalizationconflict|本地化冲突消除 (NoLocalizationConflict) -enhanced-celestials-mobifier-integration¨enhanced-celestials-mobifier-integration-fabric -twilightdecor -midas-hunger-fabric@midas-hunger -firesafety|安全用火 (FireSafety) -pretty-pistons -more-beautiful-trapdoors@ -project-expansion@ -the-corners@ -deep-mob-learning-reforged|深度怪物学习:重铸 (Deep Mob Learning: Reforged) -zenith@ -extended-drawers@ -equippable-utilities@utilities -never-enough-currency-2@never-enough-currency-2-(forge)#all-versions|货币多多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!) -motschens-puddles@puddles -dense-ores-reborn|致密矿石:重生* - -tfctreatedwood|群峦·防腐木 (TFC Treated Wood) -retro64¨retro64-fabric -double-hotbar@|双重快捷栏* -lavatech|熔岩科技 (Lava Tech) -pineapple-psychic@|凤梨通灵术* -fragile-torches -@time-changer -come-closer -creeper-chain-reaction -tiffitlib -sanity - -dynamic-trees-the-aether-legacy@dynamic-trees-aether|动态的树:天境附属 (Dynamic Trees - The Aether Legacy) -dynamic-trees-cuisine|动态的树:料理工艺附属 (Dynamic Trees - Cuisine) -ancient-classes -bigger-stacks@biggerstacks -silence@|快速静音 (Silence!) -dynamic-trees-extra-utilities-2|动态的树:更多实用设备2附属 (Dynamic Trees - Extra Utilities 2) -platforms@¨platforms-fabric -easierchests@|简便箱子 (EasierChests) -crackers-wither-storm-mod@|Cracker的凋灵风暴 (Cracker's Wither Storm Mod) -ore-canes-mod -spartan-defiled -mcmtfabricce@mcmtce|Minecraft多线程增强Mod兼容性增强分支 (Minecraft Multi-Threading Mod Fabric Port Compatibility Enhancement) -dynamic-trees-roots|动态的树:根源魔法附属* -dynamic-trees-voyage|动态的树:Voyage附属 (Dynamic Trees - Voyage) -mystical-biomes - -forgero@ -disenchantingforge¨disenchantingfabric -redstone-pen@redstonepen|红石笔* -ae2-things-forge@ae2things¨ae2things -avaritia-endless|无尽贪婪·伪* -dynamic-trees-jurassicraft|动态的树:侏罗纪时代附属 (Dynamic Trees - JurassiCraft) -dynamic-trees-natures-aura|动态的树:自然灵气附属 (Dynamic Trees - Nature's Aura) -dynamictreesplus@|动态的树:拓展 (Dynamic Trees +) -dynamic-trees-forbidden-arcanus|动态的树:禁忌与奥秘附属 (Dynamic Trees - Forbidden And Arcanus) -dynamic-trees-terraforged|动态的树:TerraForged附属 (Dynamic Trees - TerraForged) -dynamic-trees-corvus|动态的树:Corvus附属 (Dynamic Trees - Corvus) -dynamic-trees-mystical-biomes -corvus -goat-horns-copper-horns|山羊角与铜制号角 (Goat Horns & Copper Horns) -mystical-powers - -damp|受潮* -wooden-bucket@|木桶* -compressed-barrels@compressed_barrels|压缩木桶* - -advanced-netherite@|高级下界合金*¨advanced-netherite-fabric|高级下界合金 (Advanced Netherite) -re-avaritia@|无尽贪婪:重生 (Re:Avaritia) -simply-conveyors-more|简易传送带 (Simply Conveyors & More) -porting-lib@porting_lib -expanded-delight@|扩充乐事* -spell-bundle -nightmareesm -simply-no-shading@ -hexcasting@hex-casting|咒法学 (Hex Casting) -paucal@ -uneffectual@ -loot -crafting-dead-immerse|行尸走肉:沉浸 (Crafting Dead: Immerse) - -extended-clouds@ -distinct-damage-descriptions -technicalities-lib -fantasys-furniture@fantasy-furniture|Fantasy的家具 (Fantasy's Furniture) -touhou-spell-card-additional|东方符卡附加包 (Touhou Spell Card Additional Pack) -registrator -apexcore@ -magiclib@|魔法类库 (MagicLib) - 正式版¨magiclib-dev|魔法类库 (MagicLib) - 开发版¨@magiclib-dev|魔法类库 (MagicLib) - 测试版 -cull-less-leaves@|更好的树叶渲染优化* -@ex-stellae|繁星之凝 (Ex Stellae) -with-craft|手工艺 (With Crafts) -fluidconverters|流体转化器 (FluidConverters) -multiblock-stages - -metallurgylegend|冶金传奇 (Metallurgy Legend) -waterskin -realism-thirst -dungeons-libraries - -@fabricated-forge -raknetify@ -vmp-fabric@¨vmp-forge@ -flotage@|漂浮物* -dynamic-trees-for-hungteens-plants-vs-zombies-mod|动态的树:HungTeen的植物大战僵尸附属 (Dynamic Trees for PVZ) -antidrop@|防丢 (AntiDrop) -elemental-items - -onekeyminer@|一键矿工 (OneKeyMiner) -boathud@ -ninjaxxs-needs -pixelmon-gui-blocks - -more-mekanism-processing@ -item-banning@ -probejs@ -impaled@|更多三叉戟 (Impaled🔱) -laserio -villager-tools@ - -mcsa -no-resource-pack-warnings@ -@take-it-slow -slime-mimic@slime-mimic-mod - - - -ldlib@ -shimmer@shimmer!|微光* -ducts -@baguette - -nosiphus-furniture-mod -tf2-engineer-buildings-mod -kubejs-botania -advancements-enlarger -better-muffling|更好的消音器* -lightest-lamps@¨lightest-lamps-fabric -bigbuckets|大铁桶 (Big Buckets)¨bigbuckets-fabric|大铁桶 (Big Buckets) -dimstorage@ -spawner-imbuer@ - -unnamed-delight|无名乐事* - -monsters-girls-mushroom-update -ftb-tutorial-mod-forge -mc-terrain-editor -extra-gems@extragems|额外的宝石 (ExtraGems) -various-world -better-impaling-forge@|更好的穿刺Forge版* -bucketlib@ -aquatic-torches@ -better-sponges -easyexcavate -wooden-shears@|木剪刀* -brick-furnace@|砖熔炉* -brick-hopper@|砖漏斗* -human-companions -odysseyhud -colorblindness@ -aether-addon -moonstonemod@moonstone|月之石 (MoonStone)¨@moonfabric|月之石 (MoonStone) - -server-redirect -city-blocks -useful-hats@ - -modern-splash@|高版本加载界面* -babel -cultural-treasures-paintings|文化瑰宝 - 画作与乐曲 (Cultural Treasures - Paintings and Music) -kitchen-karrot@|胡萝卜厨房* -servercore@ -ivan-carpet-addition@ -food-funk -wumpleutil -twilight-delight@twilightdelight|暮色乐事* -recruits@villager-recruits -the-true-backrooms -webstreamer@ -op-items-tab -thaumisc|神秘杂项学* - - -treechop@ -idwtialsimmoedm@ -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 -nature-overhaul -ae2-fluid-crafting-rework@ae2-fluid-crafting|AE2流体合成套件重置 (AE2 Fluid Crafting Rework) - - -moreculling@ -better-village-forge@better-village|更好的村庄 (Better Villages)¨better-village-fabric|更好的村庄 (Better Villages)¨better-village-neoforge|更好的村庄 (Better Villages) -trinkets-curios-theme@ -banilla-claws-forge@banilla-claws¨banilla-claws@banilla-claws-forge - -transparent-cosmetics|Transparent Cosmetics - 已失效¨@transparent-cosmetics -more-geodes-reforged@¨emerald-geodes@more-geodes -right-click-get-crops@ -oh-my-gourd@ -better-block-sounds@bbs - -v0ids-smart-backpacks|V0id的智能背包 (V0id's Smart Backpacks) - -winterly@|银装素裹* -forgetmechunk@¨forgetmechunk-forge -@moremusic - -better-f1|更好的F1* -removehudbutnothand -tool-part-stages - -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) -@axolotlviewer -@compact-chat|紧凑聊天 (Compact Chat) -language-reload@ - - -@beer -sound-categories@ -@unsuspicious-stew%22 -preventer@ -@wpit -starflight-innovation -powah-rearchitected@powah -@mouserate-framerate -pickup-notifications@ -@practical-barrels -better-rocks -horse-combat-controls -libgui -simply-houses@ -yungs-better-desert-temples@|YUNG的沙漠神殿优化 (YUNG's Better Desert Temples)¨yungs-better-desert-temples-fabric|YUNG的沙漠神殿优化 (YUNG's Better Desert Temples)¨yungs-better-desert-temples-neoforge|YUNG的沙漠神殿优化 (YUNG's Better Desert Temples) -modern-dynamics@|现代动力学* -doggo-mod@ -tan-huge-trees@tans-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-fabric|YUNG的沼泽小屋优化 (YUNG's Better Witch Huts)¨yungs-better-witch-huts-neoforge|YUNG的沼泽小屋优化 (YUNG's Better Witch Huts) -panorama-creator|全景图创建器* -ui-input-undo-fabric@¨ui-input-undo-forge@ -paimeng|应急食物 (PaiMeng) -nyfs-quivers-expanded - -zoomify@ -golemania@ -vulkanmod@ -sledgehammer -quilt-loading-screen|Quilt 加载画面* - 不再更新¨@quilt-loading-screen|Quilt 加载画面 (Quilt Loading Screen) -amethyst-imbuement@|紫晶魔艺* -emi@ -nuclear-contraptions -fire-crafting@firecrafting|烈焰配方 (FireCrafting) -tooltiptweaks@|提示框微调 (Tooltip Tweaks) - -more-babies@ -@save-my-bed -data-reload@ -winver@ -armor-visibility@ - -the-chicken-came-first|先有鸡* - -hardcore-dungeons -block-relocation-forge¨block-relocation -norecipebook-fabric@norecipebook|没有配方书Fabric版 (NoRecipeBook (Fabric)) -@sort -fpsdisplay@ -@where-items-owo -microdurability@ -indicatia@ -fishy-delight-a-farmers-delight-add-on -simple-delights -color-me-outlines@|为轮廓上色* -nbttooltips@ - -upstream¨upstream-fabric -astemirs-fireflies - -ender-crop@ -modupdater -fivehead@5head - -attained-drops|可种植掉落物* -attained-drops-2|可种植掉落物 2* - -auth-me@ -refinedcreativeinventory@|创造模式物品栏重制 (RefinedCreativeInventory) - -runesword -@jcm|常磐装饰 (Joban Client Mod) -autopackager -dynamx -mob-cards -mavm@ -@waxednotwaxed -hidden-names@|隐藏名称* -doph@|远程命中提示 (Ding On Projectile Hit) -keybinds@ -hat-list@hatlist -nmuk@ -raven-brews-core -raven-coffee@raven-coffee-mod|Raven咖啡* -cqc -geode -realistic-spiders|真实的蜘蛛* -@timedisplay|时间显示 (Time Display) -biome-particle-weather@biome_particle_weather -ftb-backups-2|FTB备份2 (FTB Backups 2) -darkkore@ - - -illagers-wear-armor@ -hudium@ -ocean-world@|海洋的世界* -cobblegen@ -zombie-extreme -modularmovements|模块化动作 (Modular Movements) -uncle-js -wither-bones|凋灵之骨* -sleep-warp@ -diagonal-fences@ -jumpy-boats-fabric|跳跃的船(Fabric/Quilt) (Jumpy Boats(Fabric/Quilt)) -dyeable-redstone-signal@|染色红石信号* -velocity-based-damage -no-telemetry@ -@fullbright - -create-chromatic-return|机械动力:异彩化合物 (Create: Chromatic Return) -coffee-spawner -timber-mod@timber-mod-by-mycf¨@timber-by-mycf-(server-side)|Timber Mod - 服务端版 -sophisticated-storage@|精妙存储* -advanced-lootable-weapons -what-the-bucket@ -quickhomes -real-time-clock -tardim@ - - -luckytnt@lucky-tnt-mod -gamma-utils@|伽玛工具* -pickle-tweaks@ -dps-chaoscraft@ -@cc-polymer -moyai@ -mega-meteors-mod -gravity-generator|重力发电机 (GravityGenerator) -@mcmouser -mixinbootstraplegacy -freecam - -animationrecorder|动图记录 (AnimationRecorder) -ingame-biome-map-exporter|群系地图一键导出 (Ingame Biome Map) -fishing-overhaul -kronhud@ -shared-ender-chest|共享末影箱* -no-beacon-beams|无信标光柱* -farmers-respite|农夫暇事 (Farmer's Respite) -@fabricae-ex-nihilo -crafting-mania -loot-goblins@ -skylib@ -dt3|不要饿死3 (DontStarve3) - 暂停更新¨@dt3|不要饿死3 (DontStarve3) -tbscclick -modern-elevators-and-escalators@|现代电梯与扶梯 (Modern Elevators and Escalators) - -extra-inventory -chroma-concrete -dracovita-delight-a-farmers-delight-add-on -gobber-delight-a-farmers-delight-add-on|戈伯乐事 (Gobber Delight) - - -extinguish-by-uss_shenzhou|灭 (Extinguish) -biome-makeover-forge@biome-makeover|生物群系改造 (Biome Makeover)¨biome-makeover|生物群系改造* -throwable-blocks -ancient-warfare-3@ancient-warfare|古代战争3* -no-chat-reports@|禁用聊天举报* -valleycraft@ -no-xp-bar -towers-of-the-wild-additions@ -world-of-pure-imagination|想象界 (World of Pure Imagination) -connectivity -more-useful-villagers - -@symbol-chat -@forcegl20 -hyle - -advanced-solar-panels-patcher -no-recipe-book-reborn@norecipebookreborn|没有配方书重制版* - - -shulker-tooltip@ - - - -midnightlib@ - -just-backpacks -doubledoors -@mod-remapping-api -tic-tooltips -ydms-wizarding-world-of-harry-potter -lucraft-id-extender -modern-flat-colored-blocks - - -flat-bedrock@ - -dans-crafting-tweaks -handle-cane|手杖* - -mega-cells@mega|MEGA存储单元 (MEGA Cells) -structory -enchlevel-langpatch-config2|附魔等级语言补丁 - 配置扩展 (EnchLevel-LangPatch Config IV) -instant-unify|瞬间统一+ (InstantUnify+) -sneaky-farts -just-enough-recipe-integrations@jeri -hanami -is-a-mod-by-vazkii -inputfix|输入修正 (InputFix) -inventory-tabs-updated@ -ez-mod-lib@ezmodlib -armor-toughness-bar-updated -colorful-health-bar-updated - -wizardry-necromancers-delight -wizardryutils -xp-orb-clump -inventory-weight -time-reverse -nether-tears|下界遗泪 (NetherTears) - - -safaricraft -applied-botanics-addon@applied-botanics|应用能源:植物魔法附属* -overloaded-armor-bar-updated -delightful@ -wizardry-tales - -tamedrespawn|驯兽重生 (TamedRespawn) - -dumplings-delight@|饺子乐事* -thermal_extra@thermal-extra -nether-sky-block@|下界空岛* -arte-magicum - -ocean-blender@|海洋搅拌机 (OceanBlender) -buildcraft-fluxified -brewin-and-chewin@|饮酒作乐 (Brewin' And Chewin') -infinite-source-of-water -dramatic-doors@ -recipe-gui -@autotechno -villager-hats-mod@villager-hats -custom-damage-particles@|自定义伤害粒子* -@aei|AEI物品管理器 (Always Enough Items) -cyan-warrior-swords-mod@ -plant-in-a-jar@ -solid-mobs@solid_mobs -naturalist@|自然主义* -c3h6n6o6@|环三亚甲基三硝胺 (Cyclotrimethylenetrinitramine) -syncmatica@|共享原理图* -zephs-hammers@zephshammers -zephs-excavators@zephsexcavators -@delayedreports -@technomodel -cat-herder -command-creative-tab -umu-backpack|UMU Backpack - 已失效¨@umu-backpack - -short-stacks -smooth-boot-reloaded@|流畅加载重置版* -stone-crafting-table -lodestonelib@ -witherturnsskeletons@ -twilight-forest-the-lost-blocks@ -the-nexus-deep-dark-dimension -jepp|JEI绘画预览 (Just Enough Painting Previews) - -create-curios -ctm-refabricated¨@ctm-refabricated -placeable-pumpkin-pie|可放置南瓜派* -birch-forest-upgrade|白桦林更新* -ok-zoomer-forge -@koro-utils-lib|科洛的工具库 (Koro Utils Lib) -cosmicnpcs -skinrestorer@ -hitchhike -sonic-deflect@ -mpkmod -supernatural-creatures -food-rebalanced -psi-unofficial -time-core -@searchable-containers-retraversal|可搜索容器:重遍历 (Searchable Containers: Retraversal) -unusual-squad-into-the-void@intothevoid -create-chromaticreturn -powertool@|电动工具 (PowerTool) -keymap@|键盘映射* -actually-useful-stonecutter -itemphysic-lite-fabric|物品物理掉落:轻量版 - Fabric (ItemPhysic Lite - Fabric) -forgotten-treasures -player-health-indicators@playerhealthindicators -displaycase@|陈列柜 (Display Case) -auto-look -grimoire-of-gaia@|盖亚魔典 (Grimoire of Gaia) -ftb-jar-mod-forge -dimensional-paintings|维度绘画* -item-recycler -linsapi@ -titlechanger|标题切换器 (TitleChanger) - 已失效¨@mctitlechanger|标题切换器 (TitleChanger) -adobe-blocks-2 -menacing-monsters -packing-tape -the-graveyard-biomes-forge@nyctophobia¨the-graveyard-biomes-fabric - -cammies-minecart-tweaks@ -renderlib -nothirium@ -advancedchatbox@AdvancedChatBox -quick-pick -advancements-debug@ -randomium-ore@ -degradeexplodedblocks - -zeras-scps -enderite-lieonlion@ -advancedchatfilters@AdvancedChatFilters -advancedchatmacros@AdvancedChatMacros -aof-emotes -grasslessdirtbackport -dazzle-2 -smaller-nether-portals@¨smaller-nether-portals-fabric -basic-aiots -pokeball@|精灵球 (PokeBall) - -gravitychanger@ -building-wands@ -advancedchat@AdvancedChat -aiots-expanded-fabric -moremcmeta@¨moremcmeta-fabric -starry-skies@starryskies -flesh2leather-forge¨flesh2leather-fabric -fall-damage-indicator -aww-man-achievement-mod -fire-extinguisher@|灭火器* -farmers-knives@ -sullys-mod@sullysmod -magicaldecorations -moss-and-monsters -detonation -@rpgdurability|RPG装备耐久 (RPG Durability) -coal-processing-machine -joy-of-painting@|绘画之乐 (Joy of Painting) -warden-loot-forge¨warden-loot -@vmwcr|维克的现代战争补充合成表 (Crafting Recipes of Vic's Modern Warfare Mod) - - -optifine-checker@|高清修复检测 (OptiFine Checker) -paintings -builtin-servers@ -extractinator@|提炼机* -choicetheorems-overhauled-village@ct-overhaul-village -blast@ -no-indium@ -windsweptmod@windswept -immersive-paintings@|沉浸画框* -melon-wireless-redstone@wireless-redstone -automated-crafting@ -op-tab@optab -easy-piglins@|简易猪灵* -waterlogged-redstone -prehistoric-flora-integration -better-bad-omen -can-you-trash-it -croptopias-chocolaterie-forge@croptopia-chocolaterie|作物盛景:巧克力工坊 (Croptopia's Chocolaterie)¨croptopias-chocolaterie-fabric|作物盛景:巧克力工坊 (Croptopia's Chocolaterie) -crawl@|爬行* -chisel-reborn@ -roost-ultimate@roostultimate -cammies-wearable-backpacks@ - -parrying -back-in-slime-slime-blocks-for-1-7 - -create-alloyed@|机械动力:合金 (Create: Alloyed) -verdure@|郁郁葱葱* - - -the-ori-mod -coxinha-utilities@ - -dragon-fire-mod - - - -sandy-ores|沙子矿石* -rainbowify@ -be-quiet-please|请安静* -prehistoric-revival-a-prehistoric-fauna-add-on@|史前复生 (Prehistoric Revival - A Prehistoric Fauna Add-On) -had-enough-characters -medieval-origins - - -elytra-chestplate-swapper@ -the-ends-flora -apollos-additional-structures - -chimes - -endless-ocean-aquatic-adventures -ic2-no - -origins-plus-plus|起源++ (Origins++) - -mcda@|我的世界:地下城盔甲 (MC Dungeons Armors) - -sun-burns -battle-tools -jobsplus@ -towns-and-towers-structure-add-on@towns-and-towers -drg-flares-forge¨drg-flares -simple-uncrafting-table-fabric@simple-uncrafting-table -caracal-mod@caracal_mob -rough-tweaks-revamped@ -the-wild-backport -unvoted-shelved@unvoted -yeos-mobs -infohud@ -haruhiism|春日主义* -withcoffee|咖啡相伴/天堂之路 (WithCoffee) -emeraldstuff -grass-slabs-carpets-stairs -not-mutually-exclusive|不冲突*¨@not-mutually-exclusive|不冲突 (Not Mutually Exclusive) - 已失效 -builders-delight-forge@builders-delight -miners-minerals@ -days-to-mine@7-days-to-mine|七日杀 (7 Days to Mine) -pieces-of-ore - -@fix-keyboard-on-linux -lockdown-additions -scp-lockdown-extras -player-tabs -cie -easy-mob-farm@ -material-elements -raised-clouds@ -music-triggers@ -sneaky-screens@ -inmis@¨inmis-forge - - -rechiseled@ -durability-tooltip@ -oreganized-mod|井然有矿* - 旧版¨oreganized|井然有矿 (Oreganized Mod) - 2.0+版¨@oreganized|井然有矿 (Oreganized Mod) -riding-utilities -compact-help-command@¨compact-help-command-fabric - -miners-lung|矿工之肺 (Miner's Lung) -greenery@|绿色植物🌿 (Greenery🌿) -butchers-delight@|屠夫乐事 (Butcher's Delight) -large-meals-an-add-on-for-farmers-delight -explorers-delight@ -the-irregular-chef@irregular-chef -compat-o-plenty@compatoplenty -snow-pig@snowpig|雪猪*¨snow-pig-fabric@snowpig-fabric|雪猪 (Snow Pig) -wandering-collector@ - - - -skull-craft@|头颅工艺* -re-chiseled-compat -auto-leveling -packed-inventory@ - -crafting-on-a-stick -endlessids@ - -@cpm-fabric|压缩空间 Fabric (Compact Machines - Fabric) -cycle-paintings@¨cycle-paintings-fabric - -fire-spread-tweaks@¨fire-spread-tweaks-fabric -anger-management -easy-elytra-takeoff@¨easy-elytra-takeoff-fabric -stack-refill@¨stack-refill-fabric -light-meals@|轻食物语* -lost-and-fished@lost-fished|失而钓得 (Lost and Fished) -custom-backgrounds -ydms-allay@|YDM的悦灵 (YDM's Allay) -starmaker@ -@swdheftpywaed|对不起,我们没有充足的资金为您提供一只末影龙 (Sorry We Don't Have Enough Funds To Provide You With An Ender Dragon) -simply-snow -areas@¨areas-fabric -emberroot-zoo -mctimeextendsfabric -l2library@ -unstructured -colorful-cut -@fake-floader -environmental-materials@ -horse-tweaks -auto-workstations-fabric@auto-workstations|自动化工作站 (Auto Workstations) -l2-backpack@l2backpack|莱特兰-背包* - -@mbp -capybara-uam¨unnamed-animal-mod-capybara-only -just-enough-petroleum -diamethysts@diamethysts! -twigs@ - - - - -fplib@ -spongemixins¨@spongemixin1710 -nock-enough-arrows -every-compat@|泛用兼容:木材 (Every Compat: Wood Good) -offline-mode -ghastly-wail@ -immersive-weapons#c71 - -clear-skies@ - -ShretNether -pling@ -justthetips - -notenoughitems-gtnh@notenoughitems-unofficial|NEI物品管理器非官方版 (NotEnoughItems Unofficial) - -sketchbook-attributes -better-combat-by-daedelus@better-combat¨better-combat-backport -custom-stars - -ice-and-fire-tweaker@ -soaring-clouds -lapis-stays-in-the-enchanting-table -goodall -freecam-by-zergatul - -macaws-byg-bwg@|Macaw 的桥梁:你将去的生物群系附属 (Macaw's Bridges - Oh The Biomes You'll Go)¨macaws-bridges-oh-the-biomes-youll-go@|Macaw 的桥梁:你将去的生物群系附属 (Macaw's Bridges - Oh The Biomes You'll Go) - 原,已失效 -macaws-fences-oh-the-biomes-youll-go@|Macaw的栅栏与墙:你将去的生物群系附属 (Macaw's Fences - Oh The Biomes You'll Go) -alternate-current@ -no-unused-chunks@ -no-fade@ -radioactive-universe - -completeconfig@ -fixmyspawnr -l2-artifacts@l2artifacts|莱特兰-古遗物* -critters-and-companions@ -memorytester -colormatic@ - -fogbox@ -@hopper -lots-of-shields -timestopclock|Mega的时间静止 (MegaTimeStopMod) -umu-little-maid@ -loot-games|战利品游戏* - -ydms-scorpions@|YDM的蝎子 (YDM's Scorpions) -auto-reconnect -text-damage-indicators -recall -monster-coin -dotcoin-mod@dot-coin-mod¨dot-coin-mod-fabric -super-potato|超级土豆* -custom-fog@ - -oc-xnet-driver - - - -ydms-glare@|YDM的怒目怪 (YDM's Glare) -caupona@|分茶* -ydms-iceologer@|YDM的冰术师 (YDM's Iceologer) -fabric-sculk-worm -apex-guns|Apex 枪械工艺* - - -hwyla-addon-horse-info -postal-pigeons -swagoween -no-lag-tickratechanger@ -alcocraft-beer-and-stuff -simplevillagers@ - -autoreconnect@ -twelvefold-better-combat|更好的战斗* - 已失效¨@twelvefold-better-combat|更好的战斗 (Twelvefold Better Combat) -dusk -copper-craft|铜制工艺* -extrabotany2|额外植物学重置版 (ExtraBotany2) -terramine@ -aeinfinitybooster@ -endertech-infinity|Endertech Infinity - 已失效¨@endertech-infinity -more-frogs-fabric@morefrogs|更多青蛙 (More Frogs) - - -create-big-cannons@|机械动力:火炮* -fastanim@ -rubidium-extra@|铷 · 扩展 (Embeddium (Rubidium) Extra) -less-feature|更少的特性 (Less Features) -mores-forge@mores¨mores-fabric -tactical-fishing -token-enchanter -igiexteneded|IGI 信息扩展 (IGIExteneded) - -landofsignals@ -lootbeams@ - -stepupnext@stepup -simple-bbq@|简易烧烤 (Simple BBQ) -mythic-mounts-forge¨mythic-mounts -spice-of-life-sweet-potato-edition|生活调味料:红薯版 (Spice of Life: Sweet Potato Edition) -@reality-c-c|真实城市建设模组 (Reality City Construction) -sneak-through-berries@ -winter-overhaul@|冬季改革* -offlineskins|离线皮肤 (OfflineSkins)¨offlineskins-fabric|离线皮肤 (OfflineSkins) - -@xdi8aho-mod|灯纟火 (Xdi8Aho Mod) - -another-furniture@|别样家具* - - -rayon@ -ponder@ -ender-logistics|末影物流* - - - -megaplanets -cosmic-horizons-gc-addon -ultris-boss-expansion -bedfix -mo-glass@ -flans-mod-global-firestorm -turtlemancy@ - - - -goblins-dungeons -optigui@ -@eeeee|咏e (eeemod) -background-music-selector@bgmselector|背景音乐选择器* -dynamic-surrounding-resurrected - -spells-shields@ - -player-companions@ -technical-engineering-3|科能工程3* - -extra-utilities-reborn|更多实用设备:重生* - - -chatflow -auto-third-person@|自动第三人称* -flowery-structures@ -chat-up -flowery-core@flowerycore -level-hp -sanguine-arsenal|幻梦:血染武装 (Eidolon's Sanguine Arsenal) -automobility@|飞车奇匠* - - -ftb-quests-localization-keys - -unlit-realistic-torch-remake|真实火把:重置 (Realistic Torch Remake) -chunk-saving-fix|区块保存修复* -fullscreeno@ -@xibao-plus-plus|喜报++ (Xibao Plus Plus) -piglin-proliferation@ -the-binding-of-isaac-style-consumables -guns-rpg -configuration@ - - -natural-decoration -spice-of-fabric@ -better-climbing@|更好的攀爬* -dog-yeeter -mc122477fix@ -armors-hud-revived-liteloader-only -living-things@|自然生物* -beautify-decorate@beautify|美化! (Beautify!) -Voodoo@voodoo -notenoughluck|更多幸运 (NotEnoughLuck) - -@hideplayers|隐藏玩家 (HidePlayers) -mixintrace@ -bancis-enchantments -@maze|迷宫 (Maze) - - -skylands-fabric@skylands -jjthunder-overhauled-world-generation -betterblockoutline@ -@sodium-crash-fix|Sodium 临时崩溃修复 (Sodium Crash Fix) -scift@ -@ping-me -@tool-rods -the-squid-game-mod -datapack-portals@datapackportals|数据包传送门* -more-beautiful-walls@ -iris-flywheel-compat@iris-flw-compat -prism-lib@¨prism-fabric - -map-atlases-forge@map-atlases|地图册 (Map Atlases)¨map-atlases|地图册* -@eprr|额外玩家渲染Rift版 (ExtraPlayerRenderer-Rift) - - - -smartbrainlib@ -twilight-tweaks -aureus-simple-slabs -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 -survivalplus-lightsabers|生存加光剑 (SurvivalPlus Lightsabers)¨survivalplus-lightsabers-fabric|生存加光剑 (SurvivalPlus Lightsabers) -fclib -primitive-utilities -guglecarpetaddition@gca|Gugle的Carpet附加包 (GugleCarpetAddition) -survivalplus|生存加 (SurvivalPlus)¨survivalplus-fabric|生存加 (SurvivalPlus) -mrp-library -bypass-anvil-restriction -no-early-loading-progress - -block-runner-forge@block-runner¨block-runner -quick-paths@¨quick-paths-fabric -solar-energy -restored-earth - - -pig-pen-cipher@ -luckyblock-fabric@luckyblocks|幸运方块 (Lucky Blocks) -@smeltingtouch -things-fabric@things|杂七杂八的东西 (Things) -exlines-snorkel-mod@snorkel -two-players-one-horse@ -headshot-forge -left-hanging -stars_carrier|星光的载具 (stars_carrier) - -aetherworks|天华之作 (AetherWorks) -slice-and-dice@ -textrues-rubidium-options@|TexTrue的铷视频界面 (TexTrue's Rubidium Options) - - -rubber-duck|橡皮鸭* -unlimited-dragon-eggs-fabric@unlimited-dragon-eggs -moreplayermodels-plus@moreplayermodels+|更多玩家模型+ (MorePlayerModels+) -@actioninventory - -custom-void|自定义虚空* -create-jetpack@|机械动力:喷气背包* -entity-outliner -@sharpness6 -no-name-tags@|隐藏名称标签* -ranged-wireless-redstone -potato-canon-plus-forge -unusual-end@unusual_end|不同寻常的末地* -solar-flux|日光通量* - -custom-background-color@cbc|自定义背景颜色* -simple-shulker-preview@ -bygone-nether|逝去的下界*¨bygone-nether-fabric|逝去的下界 (Bygone Nether) -@clickopener -kokoalinux-backport -mechanical-clothesline|机械晾衣绳* -loading-progress-bar@|加载进度条* -intercontinental-ballistic-redux -planefix -quick-leaf-decay -simple-trophies -thaumic-computers -@sliderclicksoundfix -instant-massive-structures-ims -hunger-remover@ -rad-enchants -plus-the-end -runic@ -broken-discs -forgedfabric@ -create-extended-flywheels@extended-flywheels|机械动力:更多飞轮 (Create: Extended Flywheels)¨create-extended-flywheels-fabric|机械动力:更多飞轮 (Create: Extended Flywheels) -piggy-bank -deeperdarker@|幽邃黑暗 (Deeper And Darker) - -remote-gui-opener-forge - -illagers-pillagers -guard-illagers -moon-light-illager -the-woodland-update -a-foe-on-fire -hunting-delight|狩猎乐事 (Hunting delight) -more-barrels|更多桶* -origins-accessibilities@|起源:通行 (Origins: Accessibilities) -@minerslunchbox|矿工的午餐盒 (Miner's Lunchbox) -fuelcanister@fuel-canister - - -f5-begone@ -smartvision@ - - -no-more-purple@ - -content-creator-integration¨content-creator-integration-fabric -defaultworldtype@|默认世界类型 (Default World Type) -no-nether -miniatures -ad-astra@ -big-items-duh@ -scape-and-run-parasite-vaccine -doge-mod -ice-fire-katanas -@pressalttomeow -@cma|地毯-MCT拓展 (Carpet MCT Addition) -brvsb@|更好的铷视频设置按钮 (Better Rubidium Video Settings Button) -roughly-enough-trades@ -simple-quarry@ -magitek-mechs|Magitek Mechs - 已停用¨@magitek-mechs -infectum -nocubes-sea-dwellers -show-me-your-skin@ -invulnerable-pigs -t88 -k-turrets@¨k-turrets-fabric -nevertooexpensive -max-enchant-x@ -visible-toggle-sprint@ -let-me-despawn@lmd -glsl-panorama@ -feyfriends@ -mccalc@ -nekeys -crafted-forge¨crafted -cursery -mirage-orb -galacticborn-origin@ -extra-recipe|更多配方* - - -custom-window-title@|自定义窗口标题* - -crated-foods-farmers-delight -damage-tilt -upgraded-core¨@upgraded-core|Upgraded Core - 不全 -upgraded-netherite-ultimerite@|下界合金增强:终极 (Upgraded Netherite : Ultimerite) -upgraded-netherite-items@|下界合金增强:物品 (Upgraded Netherite : Items) -upgraded-netherite-creativerite|下界合金增强:创造 (Upgraded Netherite : Creativerite) -elementary-ores - -minecraft-dark-souls|黑暗之魂 (MC: Dark Souls) -dontmineit@ -tmp@ -feytweaks@ -show-yourself@ -convenient-name-tags@ -anakus-status-bars¨anakus-status-bars-forge -minemenu-refabricated -cfl@ -creative-fly@ -why-does-my-glass-sound-like-that@wdmgslt -itemwallet@ -way-much-faster-oxidize@|更快铜锈蚀* - -emi-trades-villager-trading-emi-plugin@emitrades|EMI村民交易 (EMI Trades) - -sim-u-kraft-reloaded|模拟城市重置版 (Sim-U-Kraft Reloaded) -create-factory@ -horseinboat@ -upgraded-tools@|下界合金增强:工具* -tools-for-caves-and-cliffs -betterendsky@better-end-sky - -infinity-with-mending@|无限与经验修补* -infinity-craft -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¨dyeable-fishing-lines-forge - -reciperemover@ -roughly-enough-loot-tables@ -fld@ -lostcities-tfc -snowed-fabric -player-blink -better-command-block-ui@bettercommandblockui -create-experienced -gotta-go-fast - - -mad-particle@|疯狂粒子* -fabrihud@ -shiny-horses@ -nyx-rotn-edition - -playeranimator@ -apathy-mod@apathy -auudio-forge@auudio¨auudio-fabric - -easy-shulker-boxes@¨easy-shulker-boxes-fabric - -qu-enchantments@ -ironchests@ -piercing-paxels@piercingpaxels -icy-incitement@icyincitement -visible-librarian-trades -unlimited-chisel-works-tfc1@ -enchantedshulkers@|附魔潜影盒 (EnchantedShulkers) -noits-simple-sorting -colds-gauntlets -level-one@ -wilder-wild@ -paintings-with-dragons -more-redstone-lamps|更多红石灯* -placeable|可放置植物 (Placeable Plants) -tfc-hot-or-not@ -quick-elytra@ -other-berries -itank -snowy-spirit@ -no-tutorial-toasts@ -experience-ores -anvil-player-heads-fabric@anvil-player-heads¨anvil-player-heads -artisan-integrations -seemyname -biomes-o-plenty-tools -bedrockcraft@ -better-mobgriefing-gamerule -frozen-fiend -minefall -gateways-to-eternity|永恒之门 (Gateways to Eternity) -gate-of-babylon-additions|王之财宝附加 (Gate of Babylon Additions) - 已失效¨@gate-of-babylon-additions|王之财宝附加 (Gate of Babylon Additions) -hephaestus-fabric@hephaestus|匠神 (Hephaestus) -crafting-bench@ -morebeeinfo@|更多蜜蜂信息 (MoreBeeInfo) -bq-forestry|更好的任务 - 林业扩展 (Better Questing - Forestry) - -create-infinidrill - - -@scrollable-tooltips -attribute-tooltip-fix@ - -no-slow-down|不减速* -crumbs@¨crumbs-fabric -italians-delight -immersivemc@|沉浸式MC (ImmersiveMC) -mc-vr-api@ -exordium@ -fabric-launchpads¨zihlaunchpads - -thermal-innovation-cyclic-compat -@bee-fix|蜜蜂修复 (Bee Fix) -noel-christmas-mod -moar-fps@moarfps -flighthud -meal-api@mealapi -seed-drop -fishery-expansion@fishery - -arrowcamfabric -overpowered-mending@overpoweredmending -woof@wolves-of-other-furs -instant-blocks@¨instant-blocks-fabric -better-sprinting@|更好的疾跑* -rpglevels -snow-under-trees@ -elytra-physics@|鞘翅物理* -scout@ -zenstages - -wondrous-wilds@ -truly-treasures@ -where-is-it@ -relicex@ -led@|发光二极管 (Light Emitting Diode) -i-dont-need-stone|再见 圆石 (I DON'T Need Stone) -@libgui-forge -colorize@ -no-magic-milk@ -powered-food -spirit@ - -elytra-bounce@ -no-report-button@nrb|无举报按钮* -mana-wizardry -aileron@ -devworld@ - -immersive-weapons-compatibility-bridge@ -gameidiots-craftable-wizardry-items -craft-hacks -serene-seasons-harvestcraft2-compat|静谧四季 - 潘马斯农场 2:作物兼容 (Serene Seasons - Pam's HarvestCraft 2: Crops Compat) -goat - -simple-autofish -think-before-drop@thinkbeforedrop|丢弃物品保护* -omo -mushroom-additions - -project-the-void|项目 -虚空- (Project the Void) -ice-and-fire-rotn-edition|冰火传说: RotN版 (Ice and Fire: RotN Edition) -minescript@ -no-capes@|禁用披风* -apocalypsecraft -mcree_highnoons-enchantments|McRee_HighNoon的附魔 (McRee_HighNoon's Enchantments) -canary@ -better-give@ -zonkos-monsters -tetratic-combat -fastload@ -dramatictrees@dtree -robinhood|Robin Hood - 已失效¨@robinhood -trajans-core -stop-hiding - -simple-world-timer -recursive-resources@recursiveresources -inventory-actions -lavafishing@|熔岩钓鱼 (Lava Fishing) -haunted-harvest@ -dungeonsenhanced@dungeons-enhanced -create-crystal-clear@|机械动力:晶莹剔透 (Create: Crystal Clear) -@create-crystal-clear-fabric -fix-experience-bug@ -@minecraft024|24点 (Minecraft024) - - - - -it-takes-a-pillage¨it-takes-a-pillage-fabric - -get-it-together-drops@ -fire-n-blood -chunknogobyebye -beaming-drops@loot-beams-backport|掉落物光束 (Beaming drops / Loot Beams Backport) -protocharset@protocharset-rift -the-hordes@ - -inventory-management@ -soul-fired@soul-fire-d -faithfulbackrooms@ -ex-machinis@¨ex-machinis-divitiae-deorum@ -goety@|诡厄巫法* -torch-hit@ - -we-got-runners -@cabricality-utils -dynamic-trees-croptopia -medieval-music -gempire@ - -sbm-bone-torch -linkmyitem -sprout@ -resourceful-lib@ - - - -marg -cozy@ -better-piglin-trade@|更好的猪灵交易* -model-gap-fix@modelfix - -posture -little-ants@|小蚂蚁* -hardcore-torches@|硬核火把*¨hardcore-torches-forge|硬核火把 (Hardcore Torches) -auto-torch@|自动火把* -nightlights@|小夜灯 (Night Lights) -angry-mobs@ -onlylooking -the-birdwatching-mod -giant-ai -unlit-campfire@ -xl-packets-renewed -nameplate@ -rpgdifficulty@ -tooltiprareness@|稀有度提示框 (TooltipRareness) -@minimotd-reforged -combat-roll@|战斗翻滚* -project-brazier@ -over-enchanted@overenchanted -creeper-overhaul-firework|烟花苦力怕改革* -spartan-weaponry-bewitchment@|斯巴达的武器:巫师之路 (Spartan Weaponry - Bewitchment) -no-water-spread -shoppy -cathedral - -meowing -dogwhistle - -@onlylooking-fabric - - -wilder-wilds -@ae2-unpowered -better-respawn@|更好的重生* -essentialgui@ -elementary-staffs@ -dragon-fight-config -infused-foods@ -what-meme -shiny-gear -would-you-shut-up-man -weaker-spiderwebs@¨weaker-spiderwebs-fabric -netherbarrels -wooden-elytra|木制鞘翅* -construction-site-deco@construction -wthit-harvestability@ -habitat -@emicompat -harmonicenchantments|调和附魔 (HarmonicEnchantments) - - -custom-cards|自定义卡牌* -biome-cards|群系卡牌* -bombinghud -astral-dimension -followers-teleport-too@¨followers-teleport-too-fabric -@citycraft|城市工艺 (City Craft) -odysseymod -libipn@ -hulsealib -blues-dynamic-lights -gtc-expansion@ -nether-depths-upgrade@|炽海生机* -cloud-factory -disc-holders-dj -@econ -keepmum|三缄其口 (KeepMum) -saturn@ -stackable -do-a-barrel-roll@ -fantasys-dice@fantasy-dice|Fantasy的骰子 (Fantasy's Dice) -@ukulib -@betterhurtcam -itemresistance@ -distinguished-potions@ -@enhanced-weather -just-enough-immersive-multiblocks@jei-multiblocks -adapaxels@ -fabrizoom@ -json-things -@origins-randomiser -simply-swords@|简易刀剑* -kuayue@|跨越 (KuaYue) - -summoningrituals|召唤仪式 (Summoning Rituals) -no-rest -you-died@|你死了* -hotbarcycle@ -hungry-in-peaceful-mode|无中生饥* -auto-respawn-mod -cave-generator|洞穴生成器* -console-filter -customized-dungeon-loot@ -customquests -portal-cubed|Portal Cubed / Thinking With Portatos - 无法¨@portal-cubed -pehkui-resizer -kaffees-dual-ride@kaffees_dual_ride -@sfreeze -portable-hole@ -betterteamchat@ -logic-chips|逻辑芯片* -quit@ - -nears@ -obsidianui@ -walk-jog-run@ -conveyor-belts-fabric|传送带 (Conveyor Belts) -create-sifting@|机械动力:筛子* -player-name-tweaks|角色名调整 (PlayerNameTweaks) -dat-modding-api -rangefinder-hud@rangefinderhud -prelaws-blocky-siege@luckys-blocky-siege -modget@ -@babies-forever -no-leaf-decay@ -mysteriumlib@ -@inrealtime -furnace-recycle@|熔炉回收*¨furnace-recycle-fabric|熔炉回收 (Furnace Recycle) - -wild-lands@ - -noenchanting -gregtech-experimental@ -@cooldown-totem -almost-bedtime¨@almost-bedtime|Almost Bedtime - 已失效 -catlib -@mythicbotany_tweaker -polaroid-camera@polaroidcamera|宝丽来相机* -dig - -dimensional_ores -devices-mod@ -dynamistics -eguilib -glacidus - - -compat-makeover -@deferred-registries -@nametagping -map-in-slot@ -hungertweaker -knob-control -daedalus-labyrinth -tip-the-gui|界面尺寸设置优化 (GUI Scale) -copper-overhaul@ -epic-fight-nbt-integration -login-protection|登录保护* -swem@|星虫马术 (Star Worm Equestrian Mod) -metal-barrels-legacy|金属储物桶:传承 (Metal Barrels: Legacy) -inventoryfullalert@ -lead-beyond|引向超越* -dyeallthethings@ -swampier-swamps@¨swampier-swamps-fabric -weather-settings|更好的天气控制 (Weather settings) -shutdowner -shield-mechanics|盾牌机制优化 (Shield mechanics/Tactical Shield Overhaul) -sun-and-moon-celestial-configuration@celestial-config -chatsound -advancedshader|光影前向兼容 (AdvancedShader) -the-wools@|羊毛! (The Wools!) -fabric-enchantments -glued@ -tinkers-craft|工匠创意 (Tinkers' Craft) -tinker-leveling -gtce-tj-edition|格雷科技社区版:TJ版 (GregTech Community Edition: TJ Edition) -upc@ -gregicality-tjfork -@flagslib -create-mechanical-extruder@ -no-debug-5-you -packagedavaritia@|封包无尽贪婪 (PackagedAvaritia) -pillar -resound -mob-plaques@ -corail-scanner -space-ambient-addon-for-galacticraft@space-ambient -spiked-foods -auraddons -auracontrol -contenttweaker-registry-orderer -the-otherside -pogo-sticks -tickrate-changer|运算变速* -camcord@ -modern-keybinding@modernkeybinding|现代化按键绑定 (Modern KeyBinding)¨modern-keybinding-fabric|现代化按键绑定 (Modern KeyBinding) -make-bubbles-pop@make_bubbles_pop -couplings@ -mambience@ -elytra-aeronautics@¨elytra-aeronautics-forge - -infinitory@ -loud-leads|拴绳音效* -music-duration-reducer -telepistons@ -mariums-soulslike-weaponry@|Marium的魂类武器 (Marium's Soulslike Weaponry) -lets-go-herping -modularui@ -inventory-bogo-sorter@inventory-bogosorter -gregtech-sieves|格雷矿石筛子 (GregTech Sieves) -dynamic-trees-gregtech-ceu-rubber-tree|动态的树:格雷科技社区版:非官方版附属 (Dynamic Trees - GregTech CEu) -fertility - -tcintegrations@ -underground-villages@ -spook -broglis-owls -pluto@ - -youre-in-grave-danger@yigd -reds-better-biomes-fabric-forge -reds-more-structures -rotn-tweaker -cannot-build-over-lava-source-blocks -quark-rotn-edition|夸克:RotN 版 (Quark: RotN Edition) -inmisaddon@ -pineapple-delight@|凤梨乐事* -woodworks@ -informational-accessories|信息饰品* -nyfs-spiders@ -illager-additions -idolizing -evocation-and-annihilation -more-golems -kebabs-crowns -rerereskillable@ -hedgehogs|刺猬* -@pendulum -yacl@ -keyboard-wizard-legacy@keywizardlegacy|按键精灵旧版 (Keyboard Wizard: Legacy) -queen-cats-dogs@ -additional-lights|更多光源* -in-time-presence -mob-vote-2022-forge¨mob-vote-2022 -curious-lands -cpmsvcc@|自定义玩家模型的简单的语音聊天兼容 (Customizable Player Models Simple Voice Chat compat) -pettable@ -create-enchantment-industry@|机械动力:附魔工业 (Create: Enchantment Industry)¨cei-fabric-legacy@|机械动力:附魔工业 (Create: Enchantment Industry) -enchanted-witchcraft@ -wyml - -bunch-o-bugs -useless-reptile@ -technomancy-2|量子魔法2 (Technomancy2) -quickstore|快速贮藏重制版 (QuickStoreRemake) -your-items-are-safe@¨your-items-are-safe-fabric -techemistry -the-missing-villages -continents -yungs-better-ocean-monuments@|YUNG 的海底神殿优化 (YUNG's Better Ocean Monuments)¨yungs-better-ocean-monuments-fabric|YUNG 的海底神殿优化 (YUNG's Better Ocean Monuments)¨yungs-better-ocean-monuments-neoforge|YUNG 的海底神殿优化 (YUNG's Better Ocean Monuments) -echoing-depths - -advanced-finders -maple-forest|枫林* -@legacyinputpatch|Legacy Fabric 输入补丁 (LegacyInputPatch) -droplight -xanders-sodium-options@ -entity-view-distance@ -creeper-ai-updated@ -sihywtcamd@difficulty -sihywtcamc@combat -why-stacks-of-16@ -jumpquilt -oh-how-the-crafting-has-tabled - -roughly-enough-items-hacks@ -piglin-expansion|猪灵扩展* -@nes -dreadsteel|悚怖钢* -auto-hud@autohud -camera-utils@ - -roughly-enough-items-server-component@ -daves-building-extended¨daves-building-extended-fabric -@rechiseled-bookshelves -dimensional-pockets-ii@|四次元口袋2 (Dimensional Pockets II) - -@calculatorrinf-uwu -black-hole-storage|黑洞存储* -hudtweaks@ -mod-button -opt-carpet-addition@ -trees-do-not-float@ -cosmos-library@ -groovyscript@ - -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@ -loading-screen-tips@loadingscreentips -better-tips -immediatelyfast@ -opac-fabric-create-support@ -steel-for-fabric@steel|钢 (Steel) -mekanism-tweaks@ -changed-minecraft-mod@ -hello-crosshair@ - -bendy-lib@ -enchantment-transfer-forge@enchantment-transfer -golden-crops -lil-wings@ - - -@scp-sharp -scary-mobs-and-bosses -elytra-replace|鞘翅替换* -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 附加包* -earth-mobs@earthmobs|地球生物* - -simplemetals-tin -just-enough-keys¨just-enough-keys-fabric -why-am-i-on-fire@ -bouncing-balls-api@|弹跳球 API (Bouncing Balls API) -bouncing-balls@|弹跳球* -teletubbies-mod|天线宝宝* -almost-unified@ -draw-bridge -creative-fireworks -invertedbed -time-arrow -catch-me-if-you-can-cmiyc -mc-modsis-one-way-glass|Alli的单向玻璃 (Alli's One Way Glass) -sanguis -ender-trigon@ -litlaunch -puzzle@ -why-am-i-on-fire-refoxed - -@tdfp|暮色乐事:冰雪豪饮 (Twilight Delight: Frozen Pride) -ftb-pack-companion -teams-stages -kiwi-boi@ -rubidium-toolkit@|铷 · 工具箱* -advanced-combat|高级战斗装备* -advanced-combat-revitalized@|高级战斗装备重置 (Advanced Combat (Revitalized)) -totemic-overhaul - -battlecorrection|战斗修正 (BattleCorrection) -midnightcontrols-extra@ -i-wanna-skate@ -tectonic@ -born-in-chaos|生于混沌 (Born in Chaos) -eureka-ships@eureka -goofy-goober -time-stop-clock-mod@|时之钟 (Time Stop Clock) -dynamic-asset-generator@dynamic_asset_generator -excavated-variants@excavated_variants - - -survival-light-blocks - -garden-stuff|园林组合* -forgottenrecipes -corgilib@ -moms-love@|母爱 (Mom's Love) -food-effect-tooltips@foodeffecttooltips|食物效果显示* -@resounding -hbm-fixes -status-effect-bars@ -monsters-in-the-closet@ -recipe-unlocker@recipes -metamorph-max|变形拓展* -kubejs-tinkers-construct - -ghost@ -better-stats@|更好的统计信息界面 (Better Statistics Screen) - - - - -abyssalblocks|深渊国度幸运方块 (AbyssalBlocks) -archon@ -stackie -@cullclouds -@superfancyclouds -stage-tabels -temporal-dynamics -villagertradingban -enchantment-machine -yosbr@ -minefortress-rts@minefortress -onebar@|单条 (OneBar) -berdinskiybears-armor-hud - - -tiered-tooltips -rgb-blocks-forge|调色方块 (RGB Blocks) - -quicksand-fabric@quicksand|流沙 (Quicksand) -better-durability@|更好的耐久度* -passthrough-signs -excorrelation@ -packet-size-doubler -@packet-size-double-forge -arachnophobia-mode-for-minecraft@arachnophobia-mode -villagerconfig@|村民配置 (Villager Config) -jasm@speedometer -paginated-advancements@paginatedadvancements|分页进度 (Paginated Advancements & Custom Frames) -@backport-gamerules -structures-compass -swiss-cheese -vitalize@ -i18n-nlts@i18nupdatemod-nlts|自动汉化更新非长期支持版 (I18nUpdateMod Non-LTS) -ingame-info-xml-serene-seasons -ingame-info-xml-addon-serene-seasons - - -staff-of-building|建筑之杖 (Staff of Building) -dark-mode-everywhere@|夜间模式无处不在* -custom-shop|自定义商店 (CustomShop) -another-liquid-milk@ -dark-mode-everywhere-fabric@|夜间模式无处不在Fabric版 (Dark Mode Everywhere - Fabric) - -bartering-station@|易物站* -dark-paintings@ - -filtpick@|拾取筛 (FiltPick) - -deepslatecutting@ -easy-anvils@|简易铁砧* -leaves-be-gone@ -recipe-cache|配方缓存* -mob-catcher -@quiltgoslighlyfasterlol - - -guns-rpg-waystone-addon -biospheres-fabric|现代生物圈 (Modern Biospheres) -better-snowball-fight@|更好的打雪仗* -feathers@ -brb@|更好的配方书 (Better Recipe Book) -boatoverhaul-forge|行船机制修改 (Boat Overhaul)¨boatoverhaul-fabric|行船机制修改 (Boat Overhaul) -sculk-warden -better-questing-gamestages-expansion@|更好的任务-游戏阶段扩展 (Better Questing - Gamestages Expansion) -omega-chips -youdroppedthis@ - - -toomanyorigins@ -evil-regeneration@ -food-treasure-box|食物宝盒* -revolution -apugli¨@apugli -harvest-season -@ic2fix -@extended-bookshelves -cocoainput -chargers@ -@axolotl-buckets - -recipe-book-is-pain@rbip -@one-bad-apple - -with-json@ovo -mystical-nature|神秘自然* -@formula-addition-fabric|配方追加 (Formula addition) -randomlib -@kinventory -pullup@|飞行警报* -id-primeval@primeval -colorfulazaleas@colorful-azaleas|杜鹃缤纷 (Colorful Azaleas) -pigeon-post@ -hunted-api - -bigger-structures - -find-my-friends@ -@legacy-lazydfu -fallout-wastelands - - -@letitsnow -dons-lightning-rod-mod -rainglow@ -nethers-delight-fabric|下界乐事(Fabric 版) (Nether's Delight (Fabric)) -quicksand-neoforge@|流沙(NeoForge) (Quicksand (NeoForge)) -axolotl-bucket-fix-forge@|美西螈桶修复 Forge 版 (Axolotl Bucket Fix (Forge)) -scape-and-run-parasites-survival-addon-by-nocube -scape-and-run-parasites-nests-addon-by-nocube -@emiffect -villagers-sell-animals -teal-bricks -bodacious-berries@berries|多汁浆果 (bodacious berries) -@the-bag-of-holding|手袋 (Bag Of Holding) -rgb-chat - -diamond-caliber -@emi_farmersdelight -world-stripper@ -dayz-remastered|DayZ 重制版 (DayZ Remastered) -visuality-reforged@visuality-forge|可视性:重铸 (Visuality: Reforged) -ease-out-night-vision@no-night-vision-flickering -athelas|阿塞拉斯* -more-beautiful-buttons@¨more-beautiful-buttons-fabric -aoa-end-realmstone - -adaptive-tooltips@ -variantbarrels@variant-barrels -variant-crafting-tables-fabric@variant-crafting-tables -immersive-structures@ -avaritia-port-fabric -explorify -variant-bookshelves-fabric@variant-bookshelves -variant-tiered-shields-fabric¨@variant-shields|Variant Shields - 已失效 -libertys-villagers@libertyvillagers|自由村民 (Liberty's Villagers) - -rough-mobs-2|粗暴的怪物2* -barren-isles -korgelin -variant-composters-fabric@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@lets-do-vinery|葡园酒香 (Let's do Wine / Vinery) -wealthyandgrowth@ -subtitle-highlight@|字幕高亮* -clockhud@clock-hud - -variant-lanterns-fabric¨@variant-lanterns|Variant Lanterns - 已失效 -lanterns-bow@ -auto-crouch@ -my-village-pack@my_village_pack -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@|物理声效重制版* -@fix-quark-3951|Quark3951号issue修复 (FixQuark3951) -starcoffee -seed-finder-mod@seedfindermod -potato-food - -compassplus -create-industry@create-tfmg|机械动力:工业长路 (Create: Industry/Create: The Factory Must Grow) -simple-splash-screen@ -unusual-prehistory-forge@ -biospheres|生物圈 (Biosphere) -qkl@ - -dynamic-trees-tech-reborn|动态的树:科技复兴附属 (Dynamic Trees - Tech Reborn) - -daylight-mobs-reborn@ - -toast-manager -explosives-i-approve -miners-delight-plus@miners-delight|矿工乐事 (Miner's Delight / Miner's Delight +) -igniting-arrows -rise-of-the-animagus -lost-books -shingeki-no-kyojin-attack-on-titan -helicopters-madness@ -fanon-mutant-entities -technical-enchant@technical-enchant%2B|更多附魔重置版 (TechnicalEnchant+) -naturally-spawning-vex -better-game-menu@ - -seasonhud@¨seasonhud-fabric@ -stack-to-nearby-chests@|堆叠到附近的箱子 (Stack to Nearby Chests) -gmod-title-screen@ -create-steam-n-rails@|机械动力:汽鸣铁道 (Create: Steam 'n' Rails) -neutron -applied-cooking@|应用厨房* -@litematica-printer|投影打印机 (Litematica Printer) -recipe-printer@ -botarium@ -qfapi-and-qsl-biomefix-1-18-2@qsl-biomefix - -@cotton - -honey-expansion-add-on-for-farmers-delight|蜂蜜拓展 (Honey Expansion) -moguns@mo-guns -dayz-minecraft -infusion-table|灌注祛魔台* - 已失效¨@infusion-table|灌注祛魔台 (Infusion Table) -backroomtastic -xps-things|经验之谈 (XP's Things) -gravityapi@gravity-api -fabric-super-secret-settings@super-secret-revival -item-alchemy-fabric@item-alchemy -bat-elytra@|蝙蝠鞘翅* -super-secret-settings@ - -@plumeconfig -geophilic@ -critter-fights -hypothermic@ -nosecrets|不秘密 (NoSecrets) -extra-creeper-types -loot-casket -farmers-bundle-of-joy -musical-allays@ -pure-chaos-chaos-awakens -flatter-entities@ -daves-potioneering@ -last-days-of-humanity-tweaks -space-bosstools-giselle-addon -@ser|刷怪蛋配方 (Spawn Eggs Recipes) -mined-rider-kuuga -inventory-essentials@¨inventory-essentials-fabric -astral-additions|星辉附加* -simple-copper-pipes@¨simple-copper-pipes-forge -advanced-nbt-tooltips@|高级NBT提示框 (Advanced NBT Tooltips) -follow-me@ -stabx-modern-guns@ -justhammers@just-hammers|锤子合集 (JustHammers) -reinforced-deepslate-crafting|强化深板岩的合成* -jaopcacustom|JAOPCA自定义 (JAOPCA Custom) -friendly-fire@ -companion@¨companion-fabric -sebastrnlib@ -what-music-is-this - -elemental-combat|元素战斗* -roasted@|烘烤* -lotr-attack-indicator-addon|魔戒攻击指示器 (LOTR Attack Indicator Addon)¨@lotr-attack-indicator|魔戒攻击指示器 (LOTR Attack Indicator Addon) - 已失效 -steels-delight -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) - - -nether-mushroom-stew|下界蘑菇煲* -shibapi -galosphere-delight-a-farmers-delight-add-on -strong-crops@ -vegetarian-delight|素食乐事* -resourceful-config@ -coppers-delight -enderites-delight -simply-steel-forge - -wilder-world@ -advanced-solar-materials -@survival-tooltips -@notifyme -@damagedarrows -modulargolems@modular-golems|傀儡装配 (Modular Golems) -tooltip-scroll-fabric@tooltip-scroll -legoatooms-golden-berries@golden_berries -nyfcore -call-of-the-wild|荒野之声 (Call of the Wild) -more-lapis-lazuli@ -slimefun-essentials@ -decoration-delight|装饰乐事 (Decoration Delight: Refurbished) -@havio-cookbook|Havio的烹饪书 (Havio's Cookbook) -formidablefarmland@ - -survivality@ -dynamic-crosshair-compat@dynamiccrosshaircompat|动态准星兼容* -litewolfcore -vineyard-mod -@affectionate -mo-colors@ -peek@ -fancy-dyes@ - -extra-mod-integrations@ -mod-settings@ -dont-disappear-on-me@dont-dissapear -fastquit@|快速退出 (FastQuit) -violeta-cannons -war-of-valor - -no-tool-break -motionblur-fabric@motionblur|动态模糊 (Motion Blur) -epic-paladins -brazier@|生灵火盆* -stackcalc-revived@ -with-thursday-delight|乐在星期四* -osmiummod@osmium|锇 (Osmium) -@command-gui-buttons -wagyourminimap@ -chunks-fade-in@|区块淡入动画 (Chunks fade in) -sword-displays|刀剑展示架* -slabfishs-delights -saltymod-expanded@ -masonry-blocks -@sqlib -mssql-jdbc -packages@|自定义包裹* -giant-spawn@¨giant-spawn-fabric -@mtr-nte|纸板箱的交通扩展 (Nemo's Transit Expansion) -serene-shrubbery@ -gardens-of-the-dead@|死亡花园 (Gardens of the Dead) -pirate-hats|海盗帽子* -decor4fabric -mob-skills -clay-no-more-balanced|黏土不再制衡* -blossom@ -whipdashing@ -potiontimestacker-forge@timestacker -breezy@ -heart-balance -throwabletorch-fabric@throwabletorch¨throwabletorch -potion-descriptions¨potion-descriptions-fabric -half-doors@halfdoors -decor4forge - -mineterrariabosses -biomes-in-jars-forge@biomes-in-jars|群系罐子 (Biomes in Jars)¨biomes-in-jars-fabric|群系罐子 (Biomes in Jars) -@bocchitheblock -craftable-potion-combinations@craftablepotioncombinations -polylib@ -@creeper-fire-charge-fix|苦力怕火焰弹修复 (Creeper Fire Charge Fix) -tags-binder@ -fastcaps -throwable-fluids@ -time-in-a-bottle|时间之瓶 Fabric 版 (Time in a Bottle (Fabric)) - 已失效¨@time-in-a-bottle|时间之瓶 Fabric 版 (Time in a Bottle (Fabric)) -upgraded-netherite-spartan-weaponry|下界合金增强:斯巴达的武器 (Upgraded Netherite : Spartan Weaponry) -simple-jams -nethers-cruelty - -atom-sweep|基石-清理 (Atom-Sweep) -the-gold-rush -optifabric-origins@ -lng-deco -darkrpg-reborn|黑暗 RPG:重生 (DarkRPG: REBORN) -modpack-manager@|模组管理器* -rocket-connector -hot-and-cold -donthityourfriend -drink-beer-unofficial-clockwerk-edition -novacraft@ - - -better-hurt-timer -drink-beer-refill@|喝啤酒啦:再来一杯* -minecraft-style-paintings -potato-cooking -@conveniented-forge-tags -clienttime -mcpitanlibarch@ - -manure@|粪便*¨manure-fabric|粪便 (Manure) -well@ - -enderling-invaders@ -proton -zetter-gallery@zetter-gallery-share-paintings -hedge-magic@ -arcane-additions@arcaneadditions - -instrument@instrument%2B%2B|更多乐器 (Instrument++) -rpg-gods - -mob-crossing -just-enough-vehicles - -max-health-fix@ -synlib@ -tell-me-my-items@ -pollen -mavapi@ -player-hopper -guaranteed-villager-conversion -windchimes@|风铃* - -diamond-ingots@|钻石锭* - -inventory-sorting@ -mine-piece@orca-mine-piece -mine-piece-animation -hbms-nuclear-tech-mod-extended-edition -custom-skyboxes -breedable-killer-rabbit@|可繁殖的杀手兔*¨breedable-killer-rabbit-fabric|可繁殖的杀手兔 (Breedable Killer Rabbit) -bqenergyexpansion -magic-and-wand|法术与法杖 (Magic&Wand) -re-ftbqkeys@|FTB任务本地化键:重置 (Re-FTBQLocalizationKeys) -enchantment-sort|附魔排序* -wrapfix|换行修复 (WrapFix) -gem-crabs|宝石蟹* -create-rainbow-compound@rainbowcompound|机械动力:彩虹化合物 (Create: Rainbow Compound) -inmis-back-pack-mod-retextured -thonkutil -xp-storage@ -xp-storage-trinkets@ -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|迷你状态效果配置*¨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-fabric|机械动力:更多土豆 (Create: More potatoes) -primitive-beasts -raided@ -moisturization-fabric@moisturization -treasure2-twilight-forest-loot-pack -sanity-and-insanity -crops-love-rain@ -till-zombies-tear-us-apart -difficult-raids@ - -gag -bleach-awaken-by-deephantom15 -kleiders-custom-renderer-api@ -chefs-delight-fabric@chefs-delight¨chefs-delight-forge - -mcgltf@ -add-potion-into-your-food|给您下药了 (Add Potion into Your Food) - -@chunk-bordium -thaumic-energistics-extended-life|神秘能源延续版* -create-ender-transmission@|机械动力:末影传输 (Create: Ender Transmission) -horror-elements-mod -create-extended-cogs@extended-cogwheels|机械动力:更多齿轮 (Create: Extended Cogwheels)¨create-extended-cogwheels-fabric|机械动力:更多齿轮 (Create: Extended Cogwheels) -create-connected-block-textures - -cccbridge@ -liquid-burner@ - -create-electric-stonks -create-mounted-storages|机械动力:更多存储挂载 (Create: Mounted Storages) -minecells@|我的细胞 (Mine Cells - Dead Cells Mod) -@heatwaves|热浪 (Heatwaves) -steves-mini-pouch -infinite-abyss@ -@ktice -creator-overlays@creatoroverlays -maplecraft -invutils@ -@withfire-upgraded|手工艺:升级版 (With Crafts: Upgraded) -@usage-ticker -distant-worlds@ - -@advanced-vanilla-logistics -simple-flashlight-port@flashlight -alwaysopenwater@|始终开放水域 (AlwaysOpenWater) -quest-plaques@|任务牌匾* - -video-player@|视频播放器* -stendhal@ -dynamic-surroundings-remastered-fabric-edition@dynamicsurroundings_remasteredfabric -terraplusplus -blahaj@|布罗艾 (Blåhaj) -tinkers-levelling-addon@ -terramap@ - -villagemarkermod-for-liteloader -@show-durability -disable-enderman-picking-up-blocks@|禁用末影人搬运* -beautified-chat-server@¨beautified-chat-server-fabric -beautified-chat-client@¨beautified-chat-client-fabric - -axes-are-weapons@ -@curse%2B|诅咒+ (Curse+) -optifine-capes - -immersive-aircraft@|沉浸式飞机* -default-world-generator - -pasterdream|帕斯特之梦 (PasterDream) -animalistic -@qdresloader - -fabricskyboxes-interop@nuit-interop -old-inventorism -title-fix@title-fix-mod|标题修复* -create-alloyed-guns - -@luna-slimes -special-drops -forgebrainlib -render-360 - -async-locator@ -minemention@|提及 (MineMention) -umapyoi@|马儿蹦跳*¨@umapyoi-fabric|马儿蹦跳 (Umapyoi) -origins-full-moon|起源:满月 (Origins: Full Moon) -codechickenlib-unofficial@ -codechickencore-unofficial@|鸡块核心非官方版 (CodeChickenCore Unofficial) -permafrost-biome - -ambient-additions@ambientadditions -sweep|扫雷 (Minesweeper) - -sekclib -betweenlands-storage -ore-stone-variants -food-effect-tooltips-forge@|食物效果显示Forge版 (Food Effect Tooltips (Forge)) -alexs-armoury - -dynamic-crops@ -super-chocolate-maker|超级巧克力制造* -naturalized - -rsls@ -emi-loot@ - -backhand@ -@stones-cookbook|Stone的烹饪书 (Stone's Cookbook) - -farmers-delight-jei-plugin@just-enough-farmers-recipes -keybind-fix@ -tales-of-villagers-the-infiltrators|村民之书:渗透者 (Tales of Villagers: The Infiltrators) -@morecullingextra -carpet-fixes@ -er-core|ER 核心 (ER Core) -rings-of-ascension@|提升戒指 (Rings of Ascension)¨fabric-rings-of-ascension|提升戒指 (Rings of Ascension) - - - -blanket@ -convenient-curios-container@convenient_curios_container -moogs-voyager-structures@ - -extra-aoa-info|额外虚无世界信息 (Extra AoA Info) -opulence@ -lonely-biome|孤独的生物群系* -lamps - -generic-ecosphere -wired-redstone@wiredredstone -pixelgalaxy -hopper|漏斗+ (Hopper+) -excalibur-the-mighty-sword -undergarden-paths|深园小径* -undergarden-tetra-patch|深暗之园:Tetra 兼容 (Undergarden/Tetra Patch) -uncrafter@ -@pebblegetter - -pangea-ultima -@fpspluslf|FPS优化Legacy Fabric版 (FPS Plus Legacy Fabric) -table-top-craft@¨table-top-craft-fabric -ddyc@ -@stonecutter-damage -shipping@ -structureutils -@cloudmusic|云音乐 (CloudMusic) -i-like-wood -macaws-furnitures-biomes-o-plenty@|Macaw 的家具:超多生物群系附属 (Macaw's Furnitures - Biomes O' Plenty) -macaws-furnitures-oh-the-biomes-youll-go@|Macaw 的家具:你将去的生物群系附属 (Macaw's Furnitures - Oh The Biomes You'll Go) -armiger -news-pillagers -rangers-haven -heyberryshutup@ -destroy-on-death@ -@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)¨macaws-terraformersmc@¨@macaws-roofs-biomes-o-plenty|Macaw 的屋顶:超多生物群系附属 (Macaw's Roofs - Biomes O' Plenty) - 原,已失效 -configured-feature-saplings@ -coyote-time@ - -macaws-bridges-modding-legacy|Macaw 的桥梁:Modding Legacy 附属 (Macaw's Bridges - Modding Legacy) -macaws-bridges-aurora@macaws-aurora|Macaw 的桥梁:Aurora 附属 (Macaw's Bridges - Aurora) -betterlands -koremods@ -heart-of-ender@ -heart-of-spartan@ -macaws-fences-biomes-o-plenty|Macaw 的栅栏与墙:超多生物群系附属 (Macaw's Fences - Biomes O' Plenty)¨@macaws-fences-biomes-o-plenty|Macaw 的栅栏与墙:超多生物群系附属 (Macaw's Fences - Biomes O' Plenty) - 原,已失效 -endemic@ -lucys-sloths -@gdtweaker -drop-the-rock-no-tree-punching-compat@ -macaws-bridges-abnormals@macaws-abnormals|Macaw 的桥梁:Abnormals 附属 (Macaw's Bridges - Abnormals) -macaws-bridges-shroomed|Macaw 的桥梁:Shroomed 附属 (Macaw's Bridges - Shroomed) - -shroomed -rlcraft-structures-not-official@rlcraft-structures-%28not-official%29 -moving-sunflowers -lunar-mana-generator|月光魔能制造器* -ost-overhaul@ -chunk-by-chunk@chunkbychunk -beyond-planets-core|飞越群星:核心 (Planeteer - Core) -webdisplays@|内置网页浏览器 (WebDisplays) -mcef@|Minecraft Chromium 嵌入式框架 (Minecraft Chromium Embedded Framework) - - - - -the-monk-mod -expanded-enderchest@ -text-utilities@ - -memorysweep@|内存清扫 (Memory Sweep) -@explosive-enhancement|爆炸动画增强 (Explosive Enhancement) -autostereogram@ -bounced|Bounced! - 不活跃¨@bounced -identifier-translation@|标识符翻译* -vanity@vanity-core -reid@ -its-been-twelve-years -riftlin -sorcerium@ -zeropoint -campful - -well-rested@ -raw-input-1-12-2@raw-input -spider-pig -jingames-hair-c@hair-c -map-tooltip@ -planetoid -golem-tweaks -yummy-foods -home-system-forge -geta-footwear -catwalks-inc -firework-rocket-duration -@chatwalk -emcstage@ - - - -@broken-lead-warner|拴绳断裂警告 (Broken Lead Warner) -@alwayzsteve|永远史蒂夫 (Alwayzsteve) -vanilla-vistas -menulogue -archaicfix¨@archaicfix -ekac@|糕蛋 (ekaC) -byg-plus|你将去的生物群系+ (Oh The Biomes You'll Go Plus) -farmers-compats -@map-compass - -space-research-addon-for-galacticraft3 -patchoulibutton|帕秋莉手册按钮 (PatchouliButton) -sonorama -vanity-dungeons-pack -divinerpg-processing-compat -weapon-master@|武器大师* -your-ideas|你的想法* -vanity-ancient-tool-variants@ -motion-capture-mod-mocap@motion-capture|动作捕捉 (Motion Capture) -wormhole-portals@wormhole|虫洞 (Wormhole) -dragon-magic-and-relics@|神龙魔法与遗物* -yummy-foods-forked -content-creator -fullblock-energistics@ -youmatter@ -vanity_battle_axes -markdownmanual@|Markdown 手册(Markdown Manual) -powershot@ -@crockpot-tweaker -automatic-tool-swap@ -knight-quest-reforged@knight-quest¨knight-quest-fabric¨knight-quest -modernfix@|现代化修复 (ModernFix) -blades-plus -homeostatic@|稳态* -super-saturation|超级饱和度* -rpg-rpgae|RPG天启进化 (RPGApocalypticEvolution) - -dungeon-difficulty@ -cazfps-chronicles -unstable-tools@unstable|不稳定金属工具* -tech-reborn-patchouli -biome-bundle -moon-phase-info@ -@fabwork - -advanced-tweakery -creeper-hector -tightened-village-security -@mcr_blahaj|布罗艾扩展版 (Blahaj Expanded) -@blahaj-reforged|布罗艾:重铸 (Blåhaj - Reforged) -buddingcrystals -dynamic-trees-tectonic|动态的树:Tectonic附属 (Dynamic Trees - Tectonic) -prp -@moonphaseinfo%2B -harvest-day|丰收之日* -hungteens-lib@pangteens-lib -more-tool|更多工具* -@ex-hud -@hoarding|囤积 (Hoarding) - -optifine-crash-fix - -wyrmroost-patch|猛龙之居补丁* -travelers-dream -thaumic-travelers-dream -@gasstation - -aetherium-ashen-armor -smoothmenu|平滑菜单 (Smooth Menu) -@cabricality-mod -unusual-fish@unusual-fish-mod|独特鱼类 (Unusual Fish Mod) -obscure-tooltips@ - - -otg-tutorial-world -otg-skylands -fxs-rail-optimization@rail-optimization -morejs@ - -@moresnowballls|更多雪球 (MoreSnowballs) -valkyrien-skies-control@ -the-end-expanded-mod-ice-and-fire-addon -vault-patcher@|保险库补丁* -projectile-damage-attribute@ -noteable@ -deftulib@ -trofers@ -obscure-api@¨obscure-api-fabric - -death-punishment@|死亡惩罚* -inventory-tabs-forge -reaper@ -containersearcher@csearcher - - -screencapper@ -valkyrien-skies-world@ -lucky-tnt-lib@ -waffles-placeable-foods@ -otg-the-void -otg-flatlands -otg-dungeons -@light-meals-quilted -gtnhlib@ -sculpt@ -levelhearts@ -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) -l2-complements@|莱特兰-扩充* -epicfight-auto-shouldersurfing -zsrarity -zenscroll -zentraits -l2-archery@l2archery|莱特兰-弓艺* -vanity-metallurgical -minespaceex -gregious-maximus -shut-up-model-loader -cultural-delights-fabric@|多元乐事(Fabric 版) (Cultural Delights [Fabric]) -collectors-reap@ -bones-and-swords -vanity-shedds-mystical-toolsets-pack -emc-builders-wand - -vanity-charcutier -hunger-in-peace - -lexicon@¨lexicon-fabric -scaffolding-drops-nearby@¨scaffolding-drops-nearby-fabric -fuel-info@ -glacier-ice -gtnhmixins@ -dawn-to-dusk -open-tower-defence@|开放式塔防* -mtr-station-decoration@station-decoration|MTR车站装饰 (Station Decoration) -perviaminvenire - -silverbirch@silver-birch - -@flame-sweeping|烈焰横扫 (Flame Sweeping) -creepypastas-mod -more-slab -landk-brick -kubejs-offline@|KubeJS 离线文档 (KubeJS Offline Documentation) - -ex-nihilonatureminerals|无中生有:传承 - Nature's Minerals 扩展 (Ex Nihilo: Sequentia - Nature's Minerals Addon) - - -memory-settings|内存设置* -tiny-item-animations|Tiny Item Animations - 已失效¨@tiny-item-animations -more-plates-revamped@|更多金属板重置版* -extended-slabs-plus -brewin-and-chewin-fabric@|饮酒作乐 Fabric 版 (Brewin' And Chewin' [Fabric]) -particular -longer-login-times -broglis-plants@ -rlmixins@ -simplehats@simple-hats|简单帽子 (Simple Hats) -timeoutout-fabric@timeoutout -fabric-furnaces - -mixinbooterlegacy -basalt-walker-reborn|玄武岩行者:重生 (Basalt Walker : Reborn) -create-industrial-chemistry@|机械动力:工业化学 (Create: Industrial Chemistry) - -@flaming|火焰熊熊 (Flaming) -cruelars-triforcemod - -@morespawneggs|更多刷怪蛋 (MoreSpawnEggs) -beautify-refabricated@|美化!重织 (Beautify: Refabricated) - -manatweaks -chicken-nugget -goldfish-myth -rezombies -wound@|外伤* -survival-campfire@ -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 - -rlcombat@|更好的战斗-RLCraft版 (RLCombat) -botanical-addons -@scoreboards-backup|计分板备份 (Scoreboards Backup) -hodgepodge@ -fast-projectile-fix -edivadlib@ -systeams|热力系列:蒸汽锅炉 (Thermal Systeams) -waymaker@ - -dmod -extra-redstone-craft|更多红石合成* -farmers-respite-fabric|农夫暇事(Fabric 版) (Farmer's Respite (Fabric)) -wizards@|魔法师* -basketcase -primal-lib -biomes-youll-go-1-12-2-fixed|你将去的生物群系修复版 (Biomes You'll Go Fixed) -rune-crafting@runes|符文 (Runes) -controlled-random -leos-bosses|Leo的Boss (Leo's Bosses) -leos-illagers - -modularmachinery-community-edition@|模块化机械:社区版 (Modular Machinery: Community Edition) -wearable-backpacks-rlcraft-edition@|可穿戴背包-RLCraft版 (Wearable Backpacks: RLCraft Edition) -spartan-fire-rlcraft-edition@spartan-and-fire-rlcraft-edition|斯巴达之冰与火-RLCraft版 (Spartan and Fire: RLCraft Edition) -frame-void-patch-mc-59363@frame-void-patch-(mc-59363) -archprp@|帕秋莉手册加载补丁跨平台版 (Patchouli Resource Patch - Arch/Architectured Patchouli Resource Patch) -clear-skies-forge-port -spell-power@ - -morecrashinfo|更多崩溃报告信息 (MoreCrashInfo) -epicfight-saopack|史诗战斗:ACG附属包 (EpicFight ACG AddonPack) -screenshot-viewer@|截图查看器* -gml@ -@futurepack-additions|飞向未来附加 (Futurepack Additions) -bee-fix|蜜蜂修复* -spawner-fix|刷怪笼漏洞修复 (Spawner Bug Fix) -block-limit-fix@block_limit_fix -nochatlag@|聊天无卡顿 (NoChatLag) -spell-engine@|法术引擎* -spellblade-next@spellblades-and-such -netherite-road-2@|下界之路2* -@tileentity-reset-fix -notenoughrecipebook@ -urushi-mod|漆 (Urushi) -nicephore¨nicephore-fabric -terraria-paintings¨terraria-paintings-fabric -minegooseduck -floating-islands - -@qwq-library -scorched-guns@scorched-guns-2 - -fred-qol@fred -mekanism-ce-unofficial|通用机械社区版:非官方 (Mekanism CE Unofficial) -guntopia-legend-of-the-guns - -carpet-ams-addition@¨@carpet-ams-addition-legacy -pixelmon-gameshark -hidden-creepers-creepers-pretend-to-be-other-mobs -ob-core -ob-pandorica -no-weather-effects@ -ob-tooltips -hekate-lib -loot-journal@¨loot-journal-neoforge¨loot-journal-fabric - - - - - - - - - - - - - - - - - -structure-floater-fabric -applecore-unofficial@|苹果核非官方版* -drilling-veins@ -server-chat-history@|服务端聊天历史* -scriptor-magicae@|字符魔法师* -json-entity-models-jems@|JSON实体模型 (JSON Entity Models) - - - -rain-of-hell - -suggestion-provider-fix@suggestionproviderfix -worldblender@¨world-blender-fabric@worldblender-fabric -no-oceans|无海洋的世界* -monoblocks -tinkers-things-json@tinkers-things|匠魂杂物 (Tinkers' Things) -free-cam¨@freecam|Freecam - 无作弊版 -workings@ -@mod-loading-screen|模组加载屏幕 (Mod Loading Screen) -lucky-cases -atmosfera@ -feruchemy-allomancy|藏金术 (Feruchemy) -alive-combat@|战斗生机* -dialog|对话框* - - - - - - - - - - - -fix-selected-item-text -dregora-o-plenty -integrated-api@ -the-betweenlands-eternal-melodies|交错次元:永恒旋律 (The Betweenlands: Eternal Melodies) - -frozen-apocalypse@|冰封启示录* -whymap@ -craftify@ -overgrown-cities-fabric -night-config-fixes@ -standardconfigs -armor-adjustment|盔甲调整* -enchanting-max_level@enchanting.max_level -fixbookgui@ -custom-explosions|自定义爆炸* -datapacks-screen|数据包屏幕 (Datapack Screen) -pandoras-box@|潘多拉的魔盒 (Pandora's Box) -boss-rifts -random-teleport-altar -syncpotioneffects -aobd-ore-chunks -evasive-items@ -spagheters-enchants -factory-api@ -tempad@|任意门* -structure-void-toggle@|结构空位切换* -@cactusfix -morezombies|更多僵尸 (More Zombies) -mushroom-quest -chowder-express@ -mod-browser|模组浏览器* -fastback@ -copper-hopper@|铜漏斗* -oxidized@ -ping-wheel@ -dark-waters@ -sneak-tweak@ - -serene-seasons-fix@|静谧四季修复* -cross-dim-commands|跨维度指令 (Cross-Dim Commands) -temporary-spawners@ -slyde@ -phonos@ -spelunkery@ -@endless_cake|无尽的蛋糕 (Endless Cake) -rusticated -invmovecompats@ -@tinkerers-smithing -hesperus|燐* -inventory-hotswap -corail-backpack -chomper|食人花* -flamelib - -better-planting@ -superfancyclouds-refabricated@|超级华丽云:重织版 (SuperFancyClouds: Refabricated) - -pet-tracker -@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@ -cobalt-mod-think-blue@cobalt-mod -graphutil@ - -comfy-sky@|舒适空岛* -entropy@ -ngv-forge@ngv¨ngv-fabric -world-of-wonder@ - -full-brightness-toggle@ -@your-ideas|你的想法 (Your Ideas) -nohurtcam@ -arrows-break-torches@arrowsbreaktorches|箭矢破坏火把* -golden-delicacies -hightiercrops -commandspy -slimyfloor -daily-dad@|每日冷笑话* - 客户端版¨daily-dad-server@|每日冷笑话 (Daily Dad) - 服务端版 -good-ending@ - -creeper-nuggets -coherent-villages - - -terrains -bugtorched-curseforged|BugTorch - 他人的非官方上传¨@bugtorch -better-tridents@|更好的三叉戟* -undead-unleashed@ -missing-wilds@|遗落荒野*¨missing-wilds-forge|遗落荒野 (Missing Wilds) - -stellar-fluid-conduits|恒星流体导管* -advancement-locator -universal-tweaks@|通用修改* - -@succ -welcome-to-the-jungle|丛林传说 (Welcome to the Jungle) - - -transparent@ -hopperplus-instant-hoppers -sbm-merpig -lwjgl3ify@ - -mine-treasure -creates-delight@|机械动力乐事 (Create's Delight) -mo-villager@mo-villagers|更多村民 (Mo' Villager) - -logunspam - -chatimage@|聊天栏图片显示 (ChatImage) -@treasurehunt|寻宝 (TreasureHunt) -no-tema-stahp -labels@|存储标签 (Storage Labels) -@qdaa - -better-creeper-mod|更好的苦力怕 (Better Creeper) -regions-unexplored@|未至之地* - -rancraft-penguins - -more-mob-variants@|更多生物变种* -experience-rings|经验指环* -deeper-oceans|更深的海洋* -im-crossover-ic2 -libjf@ - -hopper-xtreme -maleks-infinity-gauntlet -malum-skyland|灵灾空岛 (Maland) -betweencards - - - - - -google-chat@ -resclone@ -tame-them-all - -little-contraptions - -convenient-decor@|精简锦饰* -mixin-conflict-helper@ -create-decoration-casing -create-brass-coated|机械动力:黄铜覆壳 (Create: Brass Coated) -sculked|Sculked - 已失效¨@sculked -better-mob-spawner|更好的刷怪笼* -planeteer-dimensions|飞越群星:维度 (Planeteer - Dimensions) -planeteer-machines|飞越群星:机器 (Planeteer - Machines) -create-central-kitchen@|机械动力:中央厨房 (Create: Central Kitchen) -jamd -ninezeros-gun-mod-addon -donthurtthatboat@ -@horsebuff -enchanting-table-descriptions@|附魔台描述* -harvest-with-ease@ -trade-refresh@|交易刷新* -create-molten-geodes -thats-a-lot-of-items -nether-skeletons@netherskeletons - -penguins -rocket-squids - -wood-stuff -magmafurnace-weapons-bosses-and-more -monstersregulararmy -why-does-my-food-taste-like-that -iron-generators -elytra-swapper-forge|鞘翅切换* -ftb-team-islands-forge - -market-crates|集市板条箱* -industrial-renewal-port|工业复兴移植版* -tfcm@|群峦合金非官方版 (TFC Metallum U) -tnt-time-mod -drunken-mug -cartoonish-horde-library@villainous-horde-manager -limited-lives|有限生命*¨limited-lives-fabric|有限生命 (Limited Lives) -universe-box@ -invtweaks-emu-for-ipn@ - -create-compact-exp|机械动力:压缩经验* - - - -heat-and-processing -skytheorylib -ad-astra-giselle-addon@ -shift-scroll-fix@ -gim|原神农业 (Genshin Impact Cropper) -oxygen-daily-rewards -structure-compass@|结构指南针* -cold-snap-horde@ -tis-the-season - -@baubles-expanded -cobblehaters -mob-captains|怪物队长* - -@sound-track -snowballing -winter-essentials@winter_essentials -embeddium-extras@|镁/铷附属:土豆版 (Magnesium/Rubidium Extra: Potato Editon*) -@realistic-cruelty|真实残忍 (Realistic Cruelty) -trapper-pelts@ -workshops-of-doom@ -create-mechanical-spawner@|机械动力:动力刷怪笼* - -amethyst-core@ -fzzy-core@ -tnt-breaks-bedrock@ -from-the-north@ -spruce-willis-the-xmas-tree@ -sweet-potato-core-spc|地瓜核心 (Sweet Potato Core) -merge-enchantments@ -turkey|火鸡* - -snowy-weaponry@ -dungeon-mobs-reborn -quickteleports -powerfuljs -memoryclear-refabricated@memory-clear-refabricated|内存清理:重织 (Memory Clear : Refabricated) -villager-comfort|村民舒适度* -ender-quarry|末影采石场* - - -mythic-upgrades-fabric@mythic-upgrades¨mythic-upgrades-forge -fat-chicken - -snowmancy@ -@roadchina|道路中国 (Road China) - -@immersive-snow - -functional_tfc -better-end-potato-edition|更好的末地:土豆版* -bossbar-stack@ -origins-umbrellas@|起源:雨伞 (Origins: Umbrellas) -tfc_decoration -shroom-dealers@shroom-dealers! -nbtedit -burlap-sack|粗麻布袋* - - -animalnet -biome-backlog -doespotatotick|远物停载:土豆版 (Does Potato Tick?)¨@does-potato-tick|远物停载:土豆版 (Does Potato Tick?) - 已失效 - -welcome-to-meadow@lets-do-meadow|青青草甸 ([Let's do] Meadow / Cheese!)¨@lets-do-cheese|青青草甸 ([Let's do] Meadow / Cheese!) - 已失效 -universal-enchants-forge@universal-enchants|通用附魔 (Universal Enchants)¨universal-enchants-fabric|通用附魔 (Universal Enchants) -aa-farmer-compat - - - -better-crates - -vanillaicecreamfix@ -actually-unbreaking-forge@actually-unbreaking¨actually-unbreaking-fabric -handcrafted@|精巧手艺* -no-nether-teleport@ -crasher|崩溃机* - -easywhitelist@ -clayworks@ -miniscaled@ -lost-cities-potato-edition|失落的城市:土豆版 (Lost Cities: Potato Edition) -endless-noend -matmos-2@matmos-ambient-sound -tfc-item-barrels - -villagersplus-forge@villagersplus¨villagersplus-fabric -data-criteria@ -japanese-emoji-commands -attack-on-christmas - -voxel-latest -the-printer@ - -flying-cullers@ -timeless-power@ -create-deco-fabric-fixed -calibrated@ -frozen-memories -atlantis-api¨@atlantis-api|Atlantis API - 已失效 -nutritional-balance -profession-lock - -spectrum-jetpacks@ -difficult-caves - -spartanlands-rereforged -red-pandas@ - -simple-cobblestone-generator-forge -floral-flair-fabric¨floral-flair -vertical-slabs-compat@ -ruins@philips-ruins -cobblemon@|方块宝可梦* -mysterious-biomes - -head-in-the-clouds@ -fdmc -rpg-style-more-weapons@rpg_style_more_weapons - - -easy-experience - -full-turtle-armor@ - - -thip@tokusatsu-hero-instrumentality-project|特摄英雄补完计划 (Tokusatsu Hero Instrumentality Project) - - -spyglass-astronomy@ -mchalo@ -darkmenu-darkrpg-legacy-menu@darkrpg-menu - -rl-artifacts|奇异饰品-RLCraft版 (RLArtifacts) -azurelib@ -harder-monster-boats-finer-boat-control@harder-monster-boats -spyglass-improvements@|望远镜改进* -vanilla-zoom@|原版缩放* -time-in-a-bottled -improved-end@ -raw-block-smelting -nocubes-better-blast-furnace -bugjump@ -cluttered@ -digitality - -nautral-decor-mod - -cobbled-deepslate-generator -female-villagers|女性村民* - -subaquatic@ -leos-sans -@damagevignette -no-irom-farm -amethyst-tools-mod -@grate-blocks -lush-forests - -retraining@ -ender-ore@enderore -ars-instrumentum -easier-sleeping@ -harder-farther -custom-signposts -galactic-research@ -mining-dimensions-fabric -bejs -screenjs -pioneer -@sha1runtime -night-vision-enchantment-forge@night-vision-enchantment -galactic-computers@ -mini-cites -ad-tetra@ad-tetra! -chest-cavity-forge-port|胸腔Forge版 (Chest Cavity - Forge Port) -entity-lagfix-lag-fix -audioplayer@ -vibes@ -disco@ -the-mcxr-core@mcxr-core -mcxr-play@ -beneath-the-wetlands@ - -add-on-the-abyss-beginning -reusable-rockets@ -item-info -florist -omni -frostrealm@ -nameless-trinkets@ -unsafe-spawns - -bubbles@pop -nan-health-fixer@|假死修复:土豆版 (Potato NaN Health Fix) -@voxelmap-updated -blood-and-stuff@ -yungs-better-nether-fortresses@|YUNG 的下界要塞优化 (YUNG's Better Nether Fortresses)¨yungs-better-nether-fortresses-fabric|YUNG 的下界要塞优化 (YUNG's Better Nether Fortresses)¨yungs-better-nether-fortresses-neoforge|YUNG 的下界要塞优化 (YUNG's Better Nether Fortresses) -squidless - -enders-delight@|末影乐事 (Ender's Delight) -decostorage@decorative-storage -mahogany -aspen -unmending-potato-edition|经验不修补:土豆版* -mc-modsens-rocket-launcher-arl|简易火箭筒 (Allen's Rocket Launcher) -@item-tributes -assorted-discoveries -not-so-shrimple-forge -valkyrien-computers@ - -gems-jewels -@angling -dimensional-sync-fixes@|维度同步修复* -exhaustion-fatigue@ -chainmail-bucket@ -preciseblockplacing -accurate-block-placement-reforged -carpet-tctc-addition@ - -plushie-mod@plushie -shield-expansion@ - -barbarians|野蛮人* -minecraft-startup-sound-aka-mojaaaaaang -realistic-terrain-generation-unofficial|真实地形生成非官方版* -combat-enchantments@combatenchantments|战斗附魔* -fastentitytransfer@ -chalice - -one-twenty-update -minecraft-middle-ages@days-in-the-middle-ages -gibmemojangstudio -redwolf-music-expansion@ -@nameprotect -gliders@ -@no-teleport-cooldown -riding-partners@|双人骑行* -rpgskillable -extra-discs@ -propertyerizer -waxable-coral@|涂蜡珊瑚* -@fireframe|火焰框架 (FireFrame) -goated@ -morebread@ - - - -ice-prevents-crop-growth@ -@gold-coins-mod -glowing-ores|矿石发光* - -falsetweaks@ -metaworlds-unofficial@metaworldsunofficial|元世界:非官方版* -tslateffectslib@ -tslatentitystatus-tes@tslatentitystatus -rounds-invisible-frames@invisible-frames-mod -elytra-capes@elytracapes -config-swapper -viafabricplus@ -menu-companions -entity-render-distance-extender@erde -rpg-stamina|RPG 耐力 (RPG Stamina) -mjs-animations -deepslate-generator -hairy-zombies - -footprintparticle@|脚印粒子 (FootprintParticle) -tabbychat -@leafculling -unimixins@ -nei-lotr-fa|魔戒:第一纪元 NEI 插件 (NEI LOTR FA) -nogravity-mod@nogravity|零重力 (NoGravity) -milk-of-magnesium -@slumber -nei-recipe-handlers -nox-a-mob-and-difficulty-overhaul@nox -christmas-festivity -tameable-beasts@ -cute-hermit-crabs¨cute-hermit-crabs-fabric - -receiver-mod -chargepads|充电座 (ChargePads) -snow-real-magic-potato-edition|雪!真实的魔法!(土豆版)* - -ravenous-void -immersive-engineering-blueprint-tweaker@iebpt -mob-compack -kore-sample -multiworld - -peat-zombie -ragna-goblin-updated|Ragna Goblin - 新¨ragna-goblin|Ragna Goblin - 旧(不再更新) -demogorgon@ -haunted-fields -health-command@ -splash-logo-color-fix -frv-tools -bombs-bandits -immersive-cavegen@icg -villager-brute -exspiravit-magicae -equiped -limited-chunkloading -custom-villager-trades-forge@custom-villager-trades|自定义村民交易 (Custom Villager Trades)¨custom-villager-trades-fabric|自定义村民交易 (Custom Villager Trades) -dungeons-more-mod -ancient-trees -extraskills -scotts-tweaks -kore-sample-l -book-wyrms@ -nakaroths-herdcraft-l|群兽行为L* -mystical-oak-tree@ -ancient-trees-l -butchercraft@|屠宰工艺* -zombie-invasion@ -clay-soldiers-reborn -geore@ -mt-claysoldiers2-forge -safekeystring|安全键位名 (SafeKeyString) -loadingtips -gear-o-plenty -regional-water -battle-text -music-choices - -chemcraft-snowfall|落雪 (Snowfall) -closed-captions|隐藏式字幕* -dont-pick-up -easy-breeding|简单繁殖* - -chemcraft-core - -bonsai-man-mod|盆栽人* - -pet-cemetery@ -chemcraft-geocraft - -steamagerevolution|蒸汽时代革命 (SteamAgeRevolution) - -brewcraft -zombie-awareness-freeze-fix|僵尸意识冻结修复* -integrated-stronghold¨@integrated-stronghold|Integrated Stronghold - 未及时更新 -grass-overhaul@ -@purpurclient -alkimicraft-part-i-project-oasis -wild-caves-3|洞穴装饰3 (WildCaves 3) -modest-mining@ -vanilla-compats -vending-block|自动售货机 (Vending block)¨vending-block-1-5|自动售货机 (Vending block) - -vending-block-revived|自动售货机:重生* -assortment - -opotato|哦,土豆!* -contingameime@|游戏内输入法续更版 / 游戏内输入法 Forge 重置版 (ContingameIME / IngameIME-Forge / IngameIME-Forged) -ccastroadds -aerial-hell@ -swashbucklers@ -style -eatable-livestock -hunger-strike@|绝食* -extrabuttons@extra-buttons|更多按钮 (ExtraButtons) -big-doors -blockshot -jump-over-fences-forge@jump-over-fences -luppiis-ladders - -anthropophagy@ -ambient-structures -minegicka-iii|魔能3 (Minegicka III) -hopo-better-underwater-ruins - -just-another-crafting-bench -tiny-ents - - - -nei-emmaitar -magicrafted-rings-of-power - -skybox-loader-forge -easy-feed@mcf-easyfeed|简单饲养 (Easy feeding) -create-buffers-beams -small-boats-mod -redev@ -wands-and-wizardry -geore-nouveau@ -crimsonsteves-more-mobs -the-ulterlands -mt-lotr -asjcore@ -bane-tooltips|克星信息显示* -lava-crystal -literal-sky-block -@literal-sky-block-fabric -aniskin -mob-stacker@ -mob-stacker-integration@ -mob-stacker-farming@ -lightspeedmod@lightspeed -coffee-delight@|咖啡乐事* -simple-sculk-dimension-deeper-dark -no-more-inifinite-water@finite-water -choo-choo-craft -eco-mobs -classic-hostiles -chalk-fabric-colorful-addon@chalk-colorful-addon -@asielib -food-bosses-reheated -dreamland-biomes -@bedrockjukebox|基岩版唱片机 (BedrockJukebox) -environmental-expansion -neutrality -bygone-land -the-amazing-world-of-mobs -falloutcraft -botania-additions|植物魔法附加* -dragonrealm -ydms-ducks-mod@the-ducks -arthropod-reborn -the-undefeatables -durts-nether-dungeons@nether-dungeons - -health-and-hunger-tweaks -@create-track-map -improved-hoes -orehider@ -full-grown-crop-marker@ - - -luggage|行李箱* - -slime-breeder-advanced -ahznbs-naruto-mod@ahznbs-shinobicraft -delightful-mining - -@beancoin - -trimmable-tools -@tablesaw|锯木台 (Tablesaw) -glowglass@ -mc-mods-the-fan-made-discs@all-the-fan-made-discs -from-the-fog -more-ladders@ -reblured@ -spellbound-weapons - -sword-parry@ -@create-ruins -@minegpt -respiteful@|闲暇风味* -useful-slime¨useful-slime-fabric -kelvins-better-player-animations - - -tfc-casting-with-channels -tfc-create -max-health-fixer -gjeb@ -bundled-delight@ - -travellerstoasts@ - -@ijo-pona-poki -sk1llful@|身怀绝技 (Skillful) -salt@ -monobank@ -sooty-chimneys@ -areas-undefined -trivialthoughts|魔金琐想 (TrivialThoughts) -tfc-delight -myssyheads-sculk-adventures -waystone-towers@ -smitheesfoundry|Smithee's Foundry - 已失效¨@smitheesfoundry - -beach-slimes -rideable-ravagers@|可骑乘的劫掠兽* -splatcraft@|斯普拉遁* -beneath-the-snow -sea-creeps -skills-v|技能:香草 (Skills: Vanilla) - -flower-foxes -pack-it-up@ -mine-trading-cards-open-source-edition@mine-trading-cards -chainsaw-man-csm|电锯人 (Chainsaw Man) -superior-shields@ -alternative-world-save-location@ -skills-firearms|技能:枪械 (Skills: Firearms) -tx-loader@ -Reacharound@reacharound -variety-aquatic|Variety Aquatic - 已被续作替代¨@variety-aquatic|Variety Aquatic - 已失效 -blocks-booster@ - -tfc-cast-iron-grill@|群峦铸铁烤架 (TFC Cast Iron Grill) -tfc_metalwork|群峦金属加工 (TFC Metalwork) -@gan_delight|赣味乐事与家常菜 (Gan Delight Reborn) - - -furniture-compatibility-for-macaw-tfc|Macaw的家具:群峦传说附属 (Furniture Compatibility for Macaw/TFC) -roof-compatibility-for-tfc-macaw|Macaw的屋顶:群峦传说附属 (Roof Compatibility for TFC/Macaw) - -tfc-supplementaries|群峦锦致装饰 (TFC Supplementaries) -tfc-ie-crossover|群峦传说:沉浸工程兼容附属 (TFC + IE Crossover) -bridging-mod@ -geode-plus@|晶洞+ (Geode+)¨geodeplus-backport|晶洞+ (Geode+) -cursed-difficulty@ - - -algane -dawn-of-time@ -kubejs-projecte@ -biome-backport -infernal-geode -geode-o-plenty -the-banished -pufflos -wizardry-the-next-generation - -lagbgon -doodads-fabric -subject-three-sweet-dreams@|科目三:甜蜜的梦 (Subject Three: Sweet Dreams) -ocd-shaders-mod -create-shrunk -cherish -the-lost-castle@|失落城堡*¨the-lost-castle-fabric|失落城堡 (The Lost Castle) -llamarama|羊驼!* -simple-conveyors -itemupgrader-core -itemupgrader -screenfx@ -dense-ores-abundant@dense-ores -tinkers-thinking@|工匠巧思 (Tinkers' Thinking) -simple-musket@ -cash-ores@ -stacked-dimensions -@unlimited-maxhealth -floral-enchantment¨floral-enchantment-fabric -newworld@new_world -@more-stats -notifmod@ -wallfence -ezwastelands -zombie-survival-kit|末日生存工具包* -kobolds@|狗头人! (Kobolds!) -supernatural@|超自然* -better-ladder-placements@|Salju的梯子 (Salju's Ladders) -magic-mirrors-forge - -abundant-atmosphere@ -swampex -bamboo-combat@ -nicer-skies@ -bed-benefits@ -accurate-maps@ -incantationem@ -rebind-narrator@ -earth2java@¨earth2java-mobs -fairy-dragons -turned-changed-extension -immediatelyfast-reforged@ -magic-mirror -magic-mirror-fabric@magic-mirror -chassis@ - -fast-doll@fastdoll -better-lily-pads@|更好的睡莲* -mo-zombies-wave -almost-all-the-ores -@Geyser -supplementaries-squared@ -changed-addon-plus -functional-armor-trim - -belly-button¨belly-button-fabric -raptor-chickens -@stygian-endunoffical|幽冥末地:非官方版 (Stygian End:Unoffical) -craftheraldry -pfaeffs-mod -a-bad-experience -the-nectar-mod -heavy-boulders -witherbold -jewelcraft@|珠宝工艺* -corrupted-souls -cinnamon -tfc-fight -sbm-magic-mirror -farmers-delight-heat-compats -tofu-delight@tofudelight|豆腐乐事* -gencreator -dangeonplus -end-upgrade -bufferfish -florescence -mobcages -you-win-button -tea-anyone -envirorot -the-seasons-mod|四季模组* - -the-realistic-leaves-mod -untitled-swans-forge -playdate@ -molotov -another-weapons -@elytra-toggle -compression -compressor@ - -hexal@|咒法拓展* - -create-encased@|机械动力:封装工艺* -@treeplacer -death-knell@ -moreiotas@ -numismatic-overhaul@|货币学拓展 (Numismatic Overhaul/Numismatic Overhaul: Reforged(forge))¨numismatic-overhaul-reforged|货币学拓展 (Numismatic Overhaul/Numismatic Overhaul: Reforged(forge)) -hexbound-fork@|咒法组构学 (Hexbound)¨@hexbound|咒法组构学 (Hexbound) - 原-已失效 -vanity-druid-pack -vanity-farcrs-colossal-weapons -debris-chunk-raw-netherite-scrap@raw-netherite-scrap|残骸碎块 (Debris Chunk) -malum-vestis -culllessleaves-reforged@cull-less-leaves-reforged|更好的树叶渲染优化重铸版 (CullLessLeaves Reforged) -biome-music|生物群系音乐* -agers-earthquake-generator -vanity-black-gold -vanity-bone-pack -what-that-wolfhouse|那是什么?仓库管理员! (What That? Wolfhouse!) -click-for-hot-chicks@ -vanity-molten-pack -vanity-spartan-pack -woods-and-mires@ -suggestion-tweaker@ -Additional-Redstone@additional-redstone -heartstone@ -dyed@ -wireless-redstone@wirelessredstone - -vanity-steel-pack -vanity-viking -horse-expert@ -snow-under-trees-remastered@ -oceans-delight@|海洋乐事 (Ocean's Delight) -transcending-trident@¨transcending-trident-fabric -snow-under-trees-fabric -precision-enchanter -@immersivethunder -top-extras|TOP 附加 (TOP Extras) - -potatweaker -effect-tooltips@ - -variant-crafting-tables -endless-biomes@ - -chatimg|图片聊天 (chatImg) -throwable-explosives@ -@skillmmo -archeon@ -chattoggle@ -enchancement@ - -useful-spyglass@ - - -nff-girls -launchgui -villager-armor-layer@|村民盔甲显示* -wasabi@ -magnet-craft|磁铁工艺* -item-obliterator@ -you-shall-not-spawn@ -hell-on-earth -zombie-friends@ -@stone-craft|石头工艺 (Stone Craft) -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 -@slime-craft -way2wayfabric@ -cloche-profit-peripheral -l2weaponry@|莱特兰-武器 (L2 Weaponry) - -@rhodium|铑 (Rhodium) -zoom-o-matic@ -@broken-tool -fishing-ruler@ -command-relay@ -beasts-bosses - -the-one-probe-community-edition|检测器-社区版* -packageddraconic@|封包龙之进化 (PackagedDraconic) -imitationcore -big-sip@ -floating -@blast-travel -skygrid@ -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-advancedgenerators@mekanism-moresolarpanels|通用机械-更多太阳能板 (Mekanism Advanced Generators / Mekanism-MoreSolarPanels) -paperandquill - -sneaky-curses-forge@sneaky-curses¨sneaky-curses-fabric -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@|改进的骑乘HUD* -mc-mods-enchantments-for-trade -i-need-block -spiky-spikes@ -straw-statues@|稻草雕像* -linear-xp -save-gear-on-death -curtain@|窗帘* -rrls@|移除重载界面 (Remove Reloading Screen) -entity-model-features@|实体模型特性* -forgestory -armor-statues@ - -world-of-bosses - - -mirabilis-vanilla-biome-overhaul -energized-power@ -carpenter -tolerable-creepers -anchor -locksmith -mystical-machinery|神秘机械* -life-steal-enchantment -more-wandering-trades|更多流浪商人交易* -mineralas|Mineralas - 已失效¨@mineralas -ecospherical-expansion@ -ecospherical-depths -arrhys-simple-currency -better-wandering-trader¨@better-wandering-traders|Prelaw's Better Wandering Trader - 已失效 -interdimensional-wireless-transmitter@|创造无线发送器* -cozy-home@ -inventory-crafter - -maxs-armory|Max 的武器库 (Max's Armory) -nefs-farm-decoration -create-armory@ -dangerous-wasps -createfabricreibugfix@|机械动力 Fabric 版 REI 配方显示修复 (Create&REIBugFix / CreateFabric&REIBugFix) -seasontweaks - - -@automessenger - - -padoru@ - -snow-coated -miracle-berry -locked-chests -maxs-armory-expansion|Max 的扩展武器库 (Max's Armory Expansion) - -remove-mouseover-highlight -apocalyptic-fortress@ - - -unbreakabler -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 - - -bring-color-to-my-skies -portal-dungeons - -radiant-gear@¨radiant-gear-fabric -create-teleporters@|机械动力:传送器 (Create : Teleporters!) -enchantato -floating-block@floating-cube|浮空立方体 (Floating Cube) -curious-lanterns -river-redux@ -restrictions -create-modern-train-parts@modern-train-parts - -targetato -messagetweaker - - -tskimi-seirans-fruit-wine@tskimiseirans-fruit-wine|月见清兰的果酒 (Tskimi Seiran's Fruit Wine) -graduated-cylinders@|刻度量筒* - -fps-monitor -athena¨@athena-mod|Athena / Stitch - 已失效 -calm-mornings@ -fog-looks-good-now@ -guarding@ -cats-expanded@ -modular-bosses -experience-obelisk@cognition -here-be-no-dragons -gnumus-settlement -fading-night-vision -mru@ -mute -simple-knives -iron-fishing-rods -cave-rats -@squeedometer - -sky-structures -mannequins -simple-mango@ -betterdrawhoveringtext|更好的工具信息显示 (betterDrawHoveringText) - -badges-by-harmex@cobblebadges2 -terrarian-arsenal -zombie-veterinarian|僵尸科兽医* -just-enough-sculk-sensor -hearth-and-home@ -better-leveling|更好的升级* -applied-mana|应用魔法* -boundless-flux - -@axolotlclient -energy-nodes -fog@ -thirst-was-taken@|口渴* - -unlimited-fluidity -e4mc@ -late-game-golems -iter-rpg - -oceanic-expanse@|海洋拓展* - - -origins-vampire|起源:吸血鬼 (Origins: Vampire) - -bad-to-the-bone¨bad-to-the-bone-fabric -workers@villager-workers - -sculk-horde@|幽匿部落* -stratospherical-expansion -lets-do-candlelight-farm-charm-compat@lets-do-candlelight-farmcharm-compat|烛火晚宴 ([Let's Do] Candlelight) - [作者推荐]2.0.0+¨candlelight-lets-do-a-candlelight-dinner@lets-do-candlelight|烛火晚宴 ([Let's Do] Candlelight) - Legacy版,作者已停止维护 -let-me-play-iris@ -dimensional-depths -create-molten-vents@ -everything-as-a-hat¨@everything-as-a-hat|Everything as a Hat - 已失效 - -world-border-expander -htmltech -extra-tan@ -diamond-economy@|钻石经济* -texels-paintings@ -tinkers-expansion -revelationary@ -fullstack-watchdog@ - -adventure-apparatus -neruina@ -kawaii-dishes@ - -keep-my-hand@ -no-lan-cheating@nolancheating -goat-horn-block-mod@placeable-goat-horns|可放置山羊角 (Placeable Goat Horns) - -metallics-arts|金属技艺* -actions-of-stamina - -disenchanting-book -stackdeobf@ - -portfolio|Portfolio - 仅版¨@portfolio -@nvidium -merequester@ -invade|入侵* -frame-api@ - -realisticclouds -arcane-world -tiled-cauldron -manyideas-christmas@ -overflowing-bars@ -kokoalinux -medievalweapons@ -completionists-index@ -stoneworks@ - -mob-lassos@ -mutant-monsters@ - -@physics-toys -tarot-cards@|塔罗牌* - -chatmove@ -@forgedloaderapi -public-transport-mod -mineral-chance@ -random-bone-meal-flowers@ -now-playing-forge@now-playing¨now-playing -end-portal-recipe@|末地传送门配方* -crying-portals@ -dragon-drops-elytra@|末影龙掉落鞘翅* -name-tag-tweaks@|命名牌调整* -funky-yoyo@funkyyoyo -pierce-arrow -tool-sharpening -@ktfruaddon|群峦救援-非官方版扩展 (kTFRUAddon) -pigsteel@pigsteel-fabric¨pigsteel-forge@ - - - - -flowermap@|花卉地图 (Flower Map) -hopo-better-mineshaft - -reforgium@ -spoorn-weapon-attributes@ - -fabrc-legacy-fixes@legacy-fabric-fixes - - - -moa-decor-bath - -stealing-the-villagers-forge@¨stealing-the-villagers-fabric@ -spoorn-armorattributes@spoorn-armor-attributes -connectedness@ -epic-samurais@|史诗武士 (Epic Samurai's / Samurai Dynasty)¨epic-samurais-fabric@epic-samruais-fabric|史诗武士 (Epic Samurai's / Samurai Dynasty) -sandwiches-n-more -enchantments-plus-fabric@enchantments-plus -purpeille@ -carpet-sky-additions@ -spice-of-life-carrot-edition-unofficial|生活调味料:胡萝卜非官方版 (SOL - Carrot Unofficial) -ender-dragon-egg-respawn-fabric -personal-space|私人维度* -held-item-tooltips@|手持物品信息显示* -minecraft-shark-mod -forgotten-delight - -enhancedlootbags -recipe-reshaper@ -hellish-blahaj@|布罗艾 Hellish 版 (Hellish Blåhaj) -amber-jade@|琥珀 (Amber) -mafglib@ -@fast-minecart -ae2_tools -create-compats -dont-drop-it@ -nicemod-new-blocks@nicemod -forgematica@|全息蓝图 (Forgematica / Litematica-Forge) -framland -blahaj-legacy|布罗艾:旧版 (Blåhaj:Legacy) - 无法访问¨@blahaj-legacy|布罗艾:旧版 (Blåhaj:Legacy) -deep-aether@|深入天境* -the-forgotten-dimensions@ -@the-sink|水槽 (The Sink) - -@stairjumper -watchdog-anti-cheat@watchdog-anticheat -villagers-drop-emeralds-on-death@ -neydis-dragons -colourful-goats -perfect-spawn - -infinity-pickaxe -biome-spawn-point@ -smallbiomes -enhanced-block-entities-reforged-unofficial -hopo-better-ruined-portals -wearthat@ -portable-crafting-table@|便携工作台* -structory-towers -everything-is-a-hat -skeletal-remains@ -tidbits -terrible-chest-potato-edition|可怖箱子:土豆版* -@dryinglava -advancedreborn@advanced-reborn -blue-archive-halos -@totemcounter - -@mana-visualizer -mhcraft -irons-spells-n-spellbooks@|Iron的法术与魔法书 (Iron's Spells 'n Spellbooks) -infernal-enchantments -reimagined-world-menu@ -origins-assassin -peculia¨@peculia|Peculia - 已失效 -koratio -promans-origins -mermaid-mythical-origins -werewolf-mythical-origins -fairy-mythical-origins -elf-mythical-origins -dragon-mythical-origins -budget-fire-aspect -facehugger -vine-boom-moments -lotta-blocks@ -snip-those-tags -zombie-variants-forge -nights-of-sorrow -simple-spells -auditory@ - -trulios-compilation - -realms-button-remover@ -manyideas-doors@ -end-origins -extra-classes-origins -wire-decoration|电线装饰* -optimizationsandtweaks@ -the-flesh-that-hates@tfth -tabfaces¨@tabfaces|TabFaces - 已失效 -mob-armor-mod-v2 -umbral-skies -recipes-library@ -dimension-access-manager@ -witherborn-origin -origins-gravity-enforcer -snuffles-fabric@|魄罗Fabric版 (Snuffles (Fabric)) -manyideas-halloween@ -selectable-painting@ -boat-break-fix@ -advanced-movement -totem-overhaul -mobs-no-render@ - -covenants-choose-your-purpose -insatiable -odd-organisms -rotten-eggs -cc-rt -manyideas-core@ -multi-builder-tool@|多方块构建工具* -ender-storage-1-12-continuation@ender-storage-continuation|末影存储:延续版 (Ender Storage continuation) -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@pickable-health-orbs -mobneutralizer - - -@echoes-of-the-past -cloud-rider -@assemblymod -treasure2-bones -ender-pearl-swap -jer-ore-integration -adorkable-dogs-pocky|DK狗的Pocky (Adorkable dog's Pocky) - -realistic-explosion-physics@ -nitwitification@ -mutated-items@ - -homespun@ -primitive-start@ -throwing-dynamites@throwing-dynamite -paladins-and-priests@ -cataclysm-heaven-burner@|灾变:焚天神兵 (Cataclysm: Heaven Burner) -echo-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@ -create-gravity -cataclysm-boss-bar|灾变Boss血条显示*¨@cataclysm-boss-bar|灾变Boss血条显示 (Cataclysm Boss Bar) - 已失效 -unusual-gifts -building-blocks-overhaul-forge - -tick-info -primal-stage@primalstage -spontaneous-replace@|自然更替 (Spontaneous-Replace) -pixel-loader|像素加载器2 (pixel loader2) -kubejs-ars-nouveau@ -cataclysmweaponery@cataclysm-weaponery -twilight-paintings -twilight-origins -cpmoscc@|自定义玩家模型OSC兼容 (Customizable Player Models OSC Compat) -twilight-forest-portal-catalyst|暮色森林传送门催化石* -better-fog -tool-upgrades@|工具升级* -visiblebarriers@ -aether-gravitation@|天境之引* -@sublanguage|首选语言 (Sublanguage) -nff-services -better-potion-visuals@ -modern-warfare-cubed@|现代战争方块化* -extraordinary-extra-totems -@squidfriends -beachparty@lets-do-beachparty|沙滩派对 (Let's Do Beachparty) - -s33r-more-food@ -froglight-backport - - -exquisito@|末域奇馔* -species@ -cles-battleitems|战斗物品 (Cle's BattleItems) -unu-parts-pack@ -spleaves@ -modernworldcreation@modern-world-creation -enchant-the-rainbow@ -@muffins-songkran -fixed-anvil-repair-cost@ -sleep-tight@ -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@ -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-tng-rosia¨tfc-rosia -aether-additions -custom-portal-api-forge@customportalapi|自定义传送门 API Forge 版 (Custom Portal API [Forge]) -jaopca-extras - -enclosure@ - - -isleofberk|博克岛 (Isle of Berk) - 已失效¨@isle-of-berk|博克岛 (Isle of Berk) -patpatpat@¨patpatpat-fabric - -wildberries - -kubejs-powah@ -@hexkinetics|咒法动力学 (HexKinetics) - -sand_box@sandbox -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@ -tinkers-disassembler -piseks-tinkers-enchantments -tinkering-with-embers -mob-despawn-timers -tfc-towerheat -tfc-toohotaroundhere -flower-patch@ -quickcure@quick-cure¨quickcure-fabric@quick-cure-fabric -spoiled@ -entity-specific-damage-invulnerability@ -hungryanimals -opolis-utilities@ -better-breeding -frostiful@|霜冻* -camo-creepers@ -coupons@ -simple-bracers -baby-delight -strategic-enchanting -forged-in-fire -lumy-skin-patch -@le0s-spoons -redstone-clock|Redstone Clock - 已失效¨@redstone-clock -anti-mob-griefing -nbtedit-reborn@|游戏内NBT编辑器重制版 (In-game NBTEdit Reborn) - -the-filler-update@ -custom-machinery-create@ -@rightproperguiscale -armor-trims@ -revised-phantoms@ -choruslib@ -frogs-can-eat-any-hostile-mob -artificial-thunder -rp-renames@ -openblocks-trophies -@shrug-it-off -@f3-t-everywhere - -lootbag-patches - -stargate-journey@sgjourney|星门之旅* -xaero-arrow-fix|Xaero Arrow Fix - 无法¨@xaeroarrowfix -ornamental -xaero-zoom-out@xaero-zoomout -minecard - -ydms-custom-camera-view@ -gravitational-modulating-additional-unit -edgerunner@edgerunner-feature-fix|边缘行者* -nbt-autocomplete@ -smells-fishy@entity-rain -primogem-craft@2primogem-craft|原石工艺 (Primogems Craft) -benched@ -kubejs-tfc@ -precision-prospecting@ -potatoos-custom-structure-for-hbms-nuclear-tech -fabric-seasons-terraformers-compat@ -fabric-seasons-extras@|Fabric Seasons: 拓展 (Fabric Seasons: Extra) -better-f3-plus@ -fabric-seasons-delight-compat@ -fabric-seasons-terralith-compat@ -marigolds@ -fabric-seasons-croptopia-compat@ -fabric-seasons-byg-compat@ -sassot@ -easyhopper@easy-hopper|轻松漏斗 (Easy Hopper) -progressive-archery@ -nonconflictkeys@|全键无冲 (NonConflictKeys)¨nonconflictkeys-fabric|全键无冲 (NonConflictKeys) -armor-restitched@ -@pillager-queen - -nmpr@ -sprinklerz@ -our-villager-discounts@ -easydropper|轻松投掷 (Easy Dropper) -varied-adventure -kubejs-delight -block-physics-overhaul -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@ -fake-player@fake-players -@lootbeams-fabric|战利品光束Fabric版 (LootBeamsFabric) -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 -spotting|索敌* -advanced-tfc-tech-unofficial@|进阶群峦科技非官方版 (Advanced TFC Tech Unofficial) -pineapple-tags|凤梨标签* -impostore -effishiency@ -glumbis -prehistoric-nature-fossils -peeled -butterflys -@forgedapi - -be-style-wither@ -campfire@ -ars-enderstorage -@ftbchecker -mythicmetals-decorations@ -metallurgychisel -sooty-chimneys-fabric@ -arboria -mekanism-evolution - -chiseledadditions -@tinkers_ingenuity|工匠匠心 (Tinkers Ingenuity) -gregtech-4|格雷科技4移植版 (GregTech 4 Rewritten) -lacrimis -productive-villagers¨@productive-villagers|Productive Villagers - 已失效 -canned-goods@ -itemchat-fabric@itemchat - -crafttweaker-sixik-utils-ftb-quest -wares@ -difficult-spawners -recoil-shotgun@ -stratum|Stratum - 无法¨@stratum -observed@ -ex-sartagine-requiem@ -giant-pacman-1-16-5 -item-banning-fabric -erroring-entity-remover@ -mclo-gs -pink-expansion -polluted-earth-reborn -kitsus-forgecraft -stat-check -hit-indication|Hit Indication - 已失效¨@hit-indication -multipart-machines-farming - - -tru-first-person-mod -reduced-music-delay -agers-giant-junkyard-dimension -jsmacros@ -great-big-world@¨@great-big-world-old -armored-mobs -astrological@ -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@ -cataclysm-delight -old-combat-mod@ -pipe-connector@ -diamethyst-arrows@ -cherry-blossom-grotto - - -parties -pots-and-mimics-rpg -gemspark@ -otakomod -wall-jumping -new-life -reeves-furniture@furnitury -@undying|不朽 (Undying) -creatania -boat-rocked -proficiency-honest-work -warrior-rage@ - -pokefood -armor-souls-reforged - -aether-redux@the-aether-redux|天境:新生代 (The Aether: Redux) - -staaaaaaaaaaaack@ -thanks-i-have-rei@tihr - -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) -@symlink-check|符号链接拦截 (Symlink Check) -tis-stringify - -dismount-entity@¨dismount-entity-fabric -dyeable-compasses@|染色指南针* -supercompression|超级压缩 (Super Compression) -better-hungteen-s-plants-vs-zombies|更好的 HTPVZ (Better HungTeen's Plants vs. Zombies) -piglinsafety|猪灵:多喝岩浆 (PiglinSafety) -gatewayer -bocchud@|孤独HUD (BoccHUD / MiniHUD-Forge) -arrowcollector@arrow-collector|你返箭吗 (Arrow Collector) -saplingslayer|鸽子衔枝 (SaplingSlayer) -quality-quails -hydration@ - -halohud@ -resourcify@ -ioclias@ -twilights-flavors-delight@twilight-delight|暮色风味乐事 (Twilight's 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@photon-editor|光子* -voice-chat-interaction@ -replay-voice-chat@ -ships-mod-unofficial|船:非官方版 (Cuchaz Ships Unofficial) - -storage-overhaul -chorus-warps -aureate-reliquary -submerged-explosions@ -netherite-items -aim-plus -reckless-drilling -tick-stasis@ -azure-paxels@ - -no-angled-brackets -alien-apocalypse -server-utilities -su-addon-silk-spawners -su-addon-quests -harder-hardcore -argentinasdelight@argentinas-delight|阿根廷乐事 (Argentina's Delight) -colonies -everythingcopper@|万物皆铜 (Everything is Copper) -passive-endermen@|被动型末影人* - -elemental-aspects -dune -lithereal@ -mobs-genus -ore-extension -extradelight@|额外乐事 (ExtraDelight) -shady-alchemist -ender-knight -bubbleland -cake-cow - -shrimps -projecte-aether-addon -coal-additions -fungi-stew -grenade-launcher -illness -structural-statues - -wild-bushes -mutant-wolf -curses-naturals - -straighten-up@ -twilight-catalist|暮色催化石* -extra-moas -corruptional -enablemultiplayermode@ -wizardy-delight@wizardry-delight - - -tinyallies@ -mc-mods-da-nuggets -random-recipes -starks|史塔克一家* -easy-paper -modern-ruins-pack -tetras-delight -@kekkai|结界 (Kekkai) -avaritia-reset-version|无尽贪婪重置版* -archeology-plus@ -mobification -trimseffects@ -tough-glass@ -celestisynth@|天神剑技* -golems-plus-plus@ -more-axolotls@more-axolotl -perfect-accuracy@ -@perfect-accuracy-forge -@swingthrough -log-begone@ -@transferable-pets -@bone-blocks -woodster@ -deaths-mark -sweet-boreal@ -fuzzymobs -@beslandia -@ars-magica-25|魔法艺术2.5 (Ars Magica 2.5) -delightful-froge@ -enhancedsnowman -new-world-height-and-depth -@inertiaanticheat - -scroll-of-harvests@ -@scripts-chunk-loaders -clean-tooltips@ - -quick-save@quicksave|快速存档&快速读档 (QSave&QLoad) -iron-bows-forge¨iron-bows-fabric - -filtered-chests - - -antixray@anti-xray¨antixray-forge -special-strength -armorpoints@ -easy-enchanting@|轻松附魔* -elitia -cosmetic-wings -deepspace|深空 (DeepSpace) -death-backup@|死亡备份* -bear-with-me -create-diesel-generators@|机械动力:柴油动力 (Create: Diesel Generators) -vintagefix@ - -nostalgic-tweaks@ -suspicious-sand-maker -create-cobblemon-industrialized@ -create-pixelfactory -ies-tweaks -haunt-furnace@ -player-ladder@ -orb-of-origin-plus@ - -firework-minecart-mod@ -soots-sandwichcraft -rpg-origins -@zombie-lag-fix -classic-minecraft-icon@ -@the-binding-of-isaac-useful-items -@trivia -some-useful-ores -@stardew-valley-mod -rainy-harvest -mythic-mobs@mobs-of-mythology -lost-features@lostfeatures -bagus-lib@ - -@better-doors -server-pack-unlocker-forge@server-pack-unlocker¨server-pack-unlocker -x-enchant@x-enchantment - -@blahaj-remake -pamps-simple-edition -@babyzombie-drops - -better-chiseled-bookshelves|更好的雕纹书架* -@shorks -@missing-vanilla-recipes -alcocraft@ -silences-defense-tower - -mowlib - -advanced-backups|高级备份* -not-just-biomes@ -agricultural-enhancements@|农业增强* - - -lorrys-sword-breakers|罗毅的锏 (Lorry's sword breakers) -ramel@ - -@chat-tools|聊天工具箱 (Chat Tools) -amys-rftl -cutepenguins|可爱的企鹅 (Cute Penguins) -hellions-sniffer@hellions-sniffer+ - -hybrid-flowers|杂交花* - - -methane|Methane - 已失效¨@methane -mushroom-villagers -@litematica-server-paster -s33r-butterfly-paintings@ -@more-statistics -villager-see-villager-do@ -industrybase|工业基石 (IndustryBase) -silent-river-in-the-nether|炎液断蒸* -ramel-reforged -sulfar-mod -apple-cows -gardening-tools -nether-ores-plus -river-treasures -lumbers-axe - -immunity-enchantments -better-fishing-rods -book-fishing -more-villager-trades -custom-world-icons@ -trims-begone -haste-enchantment -workshop-for-handsome-adventurer -desert-upgrade -ocean-recovery -more-armor-trims|更多盔甲纹饰* -mc-mods-the-trims@allthetrims -@bamboo-sign-editor|告示牌编辑器 (Bamboo Sign Editor) -revival-orb@ -stackable-trims@ -keepcuriosinventory|饰品栏优化 (KeepCuriosInventory) -megachicken@mega-chicken -s33r-iris-azalea-mod -difficultyplus@difficulty+ -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@|随机战利品表* -kubejs-botany-pots@ -irons-rpg-tweaks@ -@enchantips -tokenable-decoration -emogg@ -@festival-delicacies|节日佳肴 (Festival Delicacies) -elytra-trims@ -benefits-of-reading|雕纹书架注魔/阅页读著 (Benefits of Reading) -gothic-rpg@ -arcadian-dream@|幻想之梦* - -dungeon-and-taverns|地下城与酒馆 (Dungeons and Taverns) -elytra-trims-extensions@ -fallingblocks -fabric-musica -growmeal@ -moa-decor-art - - -easier-armor-trim-duplication@ -steppy@ -new-thin-air@thin-air|稀薄的空气 (Thin Air) -the-armory -xannoszs-better-minecarts|Xannosz的更好的矿车 (Xannosz's Better Minecarts) -meliusvanish@vanish -tooltip-tool-tips@ -sanity-descent-into-madness@ -no-darkness-effect-mod@no-darkness-effect|无黑暗效果 (No darkness effect) -@seamless-loading-screen-renewed -armorskin@ -@translucent-glass -simple-health-bar@ -plenty-of-golems -@hit_particles -@durability-viewer-updated|耐久指示器更新版 (Durability Viewer Updated) -puffish-skills@skills -better-archeology@|更好的考古学* -fake-people|假人* -apoca-mobs - -@snow-sniffer -responsive-shields@responsiveshields -beehave@|蜜蜂信息显示* - -sign-clipboard@ -nocubes-better-frogs -@vanilla-permissions -create-dreams-desires@create-dreams-and-desires|机械动力:梦想与欲望 (Create: Dreams & Desires) -trails-and-tales@trails-and-tales-plus - -stackable127@ - - -wanderer-profession - -cataclysmic-combat@ -persona - -create-air-forge -@gravity-pads - - -inhibited@ -china-railway-facilities|中国铁路设施 -sekc-physics¨sekc-physics-fabric -@artificial-lightning-mod -do-api@ -@pythonmc -@tp-chat-cmd|TP 聊天命令 (TP Chat Command) -grabby-mobs@ -pandas-falling-trees@ -iron-ender-chests@ -delightful-creators-forge@delightful-creators|动力乐事 (Delightful Creators)¨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@ -modlist -panorama-screens@ -campfire-spawn-and-tweaks@ -ghostz@ -better-totem-of-undying@¨better-totem-of-undying-fabric -modonomicon@|模组秘典* -moreyoyos - -onetwenty-1-20-backport@trailstales-backport -xtra-arrows@ -secrets-of-forging-revelations-a-tetra-addon -trolldom -@made-in-china|中国制造 (Made In China) -soundlimitextends -artemis-flower-pots -sculky-bits -minecolonies-for-computercraft -flame-sweeping-potato-edition|烈焰横扫:土豆版* -skinned-carts@ -quick-effect@quickeffect -block-log - -equipmentbenediction@equipment-benediction|装备祝福 (Equipment Benediction) -@gms|现代游戏模式选择器 (Modern Gamemode Switcher) -dimension-localized-inventories -skillcraft-modpack-tool -modern-inhibited -ghostjump|死者为大 (GhostJump) -@notsoessential -worldsalads-opulence - -wyrms-of-nyrus@wyrms -pearfection@ -enderchests@¨enderchests-fabric -dragon-rider -createutilities@create-utilities|机械动力:实用物品 (Create Utilities) - -creeperhost-presents-chickens -inet@ -safefall|你安星好啦* -my-beloved-icon@ -mob-catcher-fabric -tetra-enlarged -fruit-delight@|果品乐事* -@idletweaks -tagmod -passive-skill-tree|被动技能树* -villagertradefix@ - - -bullet-chat|弹幕聊天* -fishermans-trap@fishermens-trap -removebats@|禁止蝙蝠生成 (RemoveBats) -nabba -enchantdemon|附恶魔 (EnchantDemon) - - -create-alchemists-industry@ - - -stellarity - - -@modern-sound -@polished-gui -mc-mods-bark-all-bite -lively-forests - -dynamic-fullbright@ -@modularwarfare-shining|模块化武装:烨熠 (ModularWarfare-Shining) -dont-clear-chat-history@dcch -difficulty-locker -virus-disease-mod -this-boat-is-mine@|这是我的船! (This boat is MINE!) -pandas-extra-details@ -ebs-wildfire - - -bobby-forge -matter-transporter -tall-flower-pots@ - -too-fast@ - -fast-paintings@ -personality-rp@personality - - -@fabric-yaml-configuration -comfy-beds@ -twerk-crop-dusting-mod-fabric -extra-damage-enchantments@ -lemon-core -rightclickharvest@ -planters-forge@planters -passive-charms@ - - -linkart-updated@linkart -jamlib@ -globalization@ -renewable-spore-blossoms -@paragraphs - -@scoreboard-helper|记分板助手 (Scoreboard Helper) - - - - - - - - - - -mobs-info@mobsinfo|生物信息* -ngrok-api@ - - -@swordunsheather|利刃出鞘:重铸 (Sword Unsheathe Reforged) -rpgloot -@sus-saver - -dynamic-fps-reforged@ -utility-belt@ -cultivatecraft -rpgloot-patched -fluidlogged@ -create-foundry -cobblemon-fight-or-flight@ - -ender-magnet|末影磁铁* -dead-guys-hallucination-nightmare - - -simple-hot-air-balloons -toomuchrain@ -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-fabric -configanytime@ -faster-crouching@ -yeetusexperimentus@yeetus-experimentus -xbob@|准星摇晃 (Crosshair Bobbing) -zombie-horse-spawn@¨zombie-horse-spawn-fabric -tinkers-katanas|匠魂武士刀 (Tinkers' Katanas) -fbp -yeetem-potions@ -incapacitated@ -@fys|锻汝砧上 (Forge Yourself) -@mcopper|梧桐物语 (MCopper) -no-ranged-knockback -industrial-agriculture -macaws-bridges-sajevius|Macaw 的桥梁:Sajevius 附属 (Macaw's Bridges - Sajevius) -@getwebbed -@water-resistance-potion -the-predators -create-structures -ivycore@ -more-immersive-wires@ -ventur-origin@venturorigin - -@sodium-blendingregistry -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 -despawning-eggs-hatch@ -mob-death-messages -chunkapi@ -@betterwaystonesmenu -big-fish@ -nulltal@ -caffeinefilled@ -pet-transfer-trade-your-pets@pet-pass-trade-your-pets! -lets-do-bakery-farm-charm-compat@lets-do-bakery-farmcharm-compat|馥郁烘焙 (Let's Do: Bakery) - [作者推荐]2.0.0+¨lets-do-bakery@|馥郁烘焙 (Let's Do: Bakery) - Legacy版,作者已停止维护 -searchables@ -dixtas-armory@ -ingamestats@ -hanger-system-overhaul -isaidnosnow@ -jarsauth|客户端管理 (JarsAuth) - 此已不受支持¨@jarsauth|客户端管理 (JarsAuth) - >= 4.0 -autoelytrapanic@ -more-crossbows-cj -multipart-machines-cooking - - -thepeebrain-dream-dimension -@chaos-world|混沌世界 (Chaos World) -ochetgenyo@ -qcraft-reimagined@qcraft|量子物理重构 (qCraft Reimagined) - -@todo-list|待办事项 (TODO List) -@arst-armor-hud -spice-of-life-onion@|生活调味料:洋葱版 (Spice of Life Onion) -effect-berries@ -tinkersworld - - -ragdoll-corpses|布娃娃尸体* -floatingruins|浮空遗迹 (FloatingRuins) - -creeper-backguard@creeperbackguard -audio-extension-for-fancymenu-forge@audio-extension-for-fancymenu¨audio-extension-for-fancymenu-fabric -stay-warm-together -aeroblender@ -ancient-aether@ -artisticcraft@ -lavaboat_mod|熔岩船 (LavaBoat) -sophisticated-wolves|精致的狼 (Sophisticated wolves) -enderio-alloys -dynamic-music -@item-hunt -dynamo -create-sabers -liveworldgen -split-shulker-boxes@ -tinkers-leveling -curios-compat -@cloudbackup|云备份 (CloudBackup) -serverpingerfixer@ -@world-days -such-a-delight -create-compressed@ -emoji-type@ -soul-bound-enchantment@soulbound-enchantment|灵魂绑定 (SoulBound) -tower-defense-units -barrier-block-mod|屏障方块* -@simplehealthorbs -misctweaks_ -dynamic-music-updated@ -spartan-netherite -climb-ladders-fast -custom-machinery-mekanism@ -@touhou-tweaks|东方改进 (Touhou Tweaks) - - -noraidtotems@ -@snowballs_plus -bagus-mob@ -chat-twix@ -shulker-meat -accurate-block-placement-reborn@ -favorite-items - -smart-villagers-follow-emeralds@|见钱眼开* - -@villager-pickup -step-it-up@stepitup -fantasy-trees|奇幻树* - -remodified|你再造! (Remodifier) - - -better-fusion-reactor-for-mekanism@ -growableores@¨growableores-ore-cane-forge¨growableores-ore-cane-neoforge -golemsarefriends - - -keep-command-history@keepcommandhistory - - -generatorgalore -map-shirts@ -fireproof-boats -dyenamicsandfriends - - -fusion-connected-textures@ -bluebox -hunger-reworked -armor-status-hud-renewed|耐久信息显示:重生 (Armor Status HUD Renewed) -boblib -placeable-mobs@placeble-mobs -potion-blender@ -t6-auto-attack-mod¨@t6-auto-attack|T6's Auto Attack Mod - 已失效 -forceasciifont-backport -vmtranslationupdate@vmupdate|VM汉化更新 (VM Translation Update) -trample-no-more@ - -jeremyseq-damage-indicator@jeremyseqs-damage-indicator - -digs-dnd-origins -superior-flat -fungal-infection-spore@fungal-infectionspore|真菌感染:孢子 (Fungal Infection:Spore) -easy-tweak@ - -netherless-quartz -@maple-api -reforged-fabric-api¨@reforged-fabric-api -caffeinated@ -buildcraft-rf -gilded-ingot@ -chatpatches@|聊天补丁 (Chat Patches) -burning-furnace@ -shadowizardlib@ -ants-unleashed@ -@seaborgium -gold-fish -pipeplus@ - - -deuf-refabricated@ - -runic-items@ -twist|诡变* -@serverlistbufferfixer -oil-refinery -themangonewadvent -@worthy-food - - -better-nether-continuation@betternether-continuation|更好的下界延续 (BetterNether Continuing) -stygian-end-continuation|末地:生物群系扩展延续* -skill-slots@|技能槽*¨skill-slots-fabric|技能槽 (Skill Slots) -novam-terram-continuation -@jade-feet|玉足 (Jade Feet) - -cutting-edge -xp-from-harvest-reworked@ -papi-project -eventhorizon|事件视界 (EventHorizon) -mob-options -mod-sets@|模组集* - - -hold-that-chunk@ -dark-matter@ -@steal_dogs|偷狗 (Steal Dogs) -faster-random@ - - -simply-steel-continued@ -simple-corinthium -chidori-origins-collection@ -enhancedp2p|增强的P2P (EnhancedP2P) -custom-de-upgrade-recipes|自定义 DE 升级配方 (Custom DE Upgrade Recipes) -mode-switch -better-clouds-forge -@better-clouds -@easymapdownload -@dynamic-difficulty|动态难度 (Dynamic Difficulty) -client-crafting -anvil-repairing@ -headcrabs -kubejs-industrial-foregoing -gensokyo-ontology@|幻想存有论* -recipe-book-delight@|配方书乐事* -chest-hoppers|箱子漏斗* -@gravy-delight -ubes-delight@|香芋乐事 (Ube's Delight) -torcherino-unofficial@torcherino(unofficial)|加速火把非官方版 (Torcherino(Unofficial)) -more-bows-and-arrows@ -xp-shop -acclaimed-origins@ -replanter -zombie-infection-vaccine -simple-achievements -achievement-books|成就书* -villager-enchanter|村民附魔师 (VillagerEnchanter) -invocore-utility-mod -saljus-quill@ - -derelict -@charged-charms -custom-villagers|自定义村民* -turtlematic@ -remove-base-origins -@cobblemon-delights|方块宝可梦乐事 (Cobblemon Delights) -redirector@|异引定址*¨redirectionor-retro|异引定址 (Redirector) -villager-mantle-fix|村民帽子修复* -rechiseled-create@ -xaeroplus@|Xaero的地图增强 (XaeroPlus) -cosmetic-nametags@ -thirdlife-rts@ -real-peaceful-mode@|真正的和平模式* -niftyblocks -elfs-dark-dimension -xaeros-minimap-world-map-waystones-compability@xaeros-minimap-world-map-waystones-compatibility-forge -jagms-kiwis@ -@masaadditions -improved-trident@ -mystic-bows -forgiving-world -skill-cloaks@skillcloaks -swordinthestone@ -lazy-ae2-patch|懒人AE2补丁 (Lazy AE2 Patch) - -yamato-gun-mod@yamato-gun - -ars-mage-fight - -epic-sanji -kubejs-entity-events-extension -mc-dungeons-enchanting@|我的世界:地下城附魔 (MC Dungeons Enchanting) -rei-custom-command|REI自定义命令 (REI Custom Command) -copperative@|铜心协力* -growable-storage-cells -growable-cells-2 -cinchcraft@ -day-counter@ag-day-counter -makecold|冷境 (MakeCold) - - -sculk-redstone-components@sculkredstonecomponents -toggle-enchantments@ -unbreakable-enchantment-forge@unbreakable-enchantment -immersive-portal-gun@portal-gun|沉浸式传送枪* -tac-craft-tactical-armor-pack -@flexible-arms|灵巧双手 (Flexible Arms) -boat-tweaks@|船只调整* -new-effect-descriptions@effect-insights -diagonal-windows@ - -illager-invasion@|灾厄侵扰* - - -@touhou-origins-blessings - -altorigingui@ -dynamic-trees-pams-harvestcraft-2|动态的树:潘马斯农场2 - 果树附属 (Dynamic Trees Pam's Harvestcraft 2: Trees) -dynamic-trees-hexerei|动态的树:魔法巫师附属 (Dynamic Trees - Hexerei) -minium-stone@ - -@fastrtp -tech-decorators@|科技装饰商* -dynamic-trees-ars-nouveau|动态的树:新生魔艺附属 (Dynamic Trees - Ars Nouveau) - -@kazzmons-magecraft -metal-bundles@ - - -tidal-towns|潮汐小镇* -blossom-blade - -cute-kiwi-birds-new-animal -moremobheads@ -ouchies@ -@traditional-asphalt -thaumic-boots@thaumic_boots -carpeted-stairs@ -just-enough-archaeology@ -bedrock_world - -world-preview@|世界预览* -not-enough-trinket-slots-nets -the-five-nights-at-freddys-mod@the-five-nights-at-freddys-mod#all-versions|玩具熊的五夜后宫 (The Five Nights at Freddy's Mod) -easylan@|自定义LAN局域网联机服务器 (EasyLAN) -pelagic-prehistory -minerally@ -better-jukeboxes -patboxs-brewery@brewery - -stackable-stew-and-soup -mindful-darkness@ -@sbet -nature-arise@ -compression-bag|压缩袋 (CompressionBag) -more-beautiful-torches@ -quality-crops -@individual-keep-inventory -permanent-sponges@ -hang-glider@ -@auto-twerk -block-beams@ -adorabuild-structures@ - -moogs-end-structures@mes-moogs-end-structures -@brew-guide -one-click-crafting-fabric@oneclickcrafting -@genshin-ui -fenomena-structures@phenomena-structures -first-join-message@ -expansive-weaponry -wabi-sabi-structures-forge¨wabi-sabi-structures-fabric -jobsaddon@ -@partyaddon - -loading-backgrounds@ -cuisine-delight@|料理乐事* -iron-bookshelves@ -@dimensional-expansion -danger-close@ -hardcore-wither -get-off-my-lawn-reserved@goml-reserved - -dangerousstonecutter@ -normal-damage@ -ftb-xmod-compat -crabbers-delight@|蟹农乐事 (Crabber's Delight) -slot-cycler@ -resource-pack-overrides@ -respawning-animals@|动物重生* -arcane-lanterns@ - -crashma@ - -blackwolf-library@¨blackwolf-library-fabric -blues-scape-and-run-bosses -gigeresque -lookaround -projectileimmunityfix -@betterzoom -player-visibility@ -bag-of-holding-forge@bag-of-holding - - - -fish-of-thieves@ -qualitys-delight -arrows-info -godly-vampirism -itemlocks@ -pick-block-pro@|选择方块专业版* -skin-and-bones -pet-armor@ -maxs-deco|Max的装饰 (Max's deco) -more-nugget@|更多矿物粒*¨more-nugget-fabric|更多矿物粒 (More Nugget) - Farbic,已失效 -dual-swords@ -organizable-play-screens@ -labelling-containers@ -inventory-pause-forge@ -ready-player-fun@ -condensed-creative@ -leaves-us-in-peace@ -yellow-snow@ -no-tnt-griefing@ -monster-plus -ilmusu-enchantments@ilmusuenchantments - -desired-servers@ -attributizer@ -reactive@|反应炼金术 (Reactive Alchemy) -simple-deepslate -minunrpg -more-sheep-wools -maturi-delight@|祭典乐事* - -forgified-fabric-api@ -artisanat@ -devmode -better-trims@bettertrims -@doggo-mod-overhauled -traders-nightmare -command-block-ide@ - -green-thing-mod -lmft@ -peripheralium@ -resource-switcher@|资源切换器 (ResourceSwitcher) -serializationisbad@ -clutter@ -no-enchantment-cap-1-12-2-backport -survivingtheaftermath|劫后余生 (Surviving The Aftermath) -dimension-viewer@ -foodmodmorefood@more-food|更多食物 (More Food) -tfcgyres-orehints -badstdout@ - -multiworld-mod@multiworld -miaooo -pipeblocker@ -moa-decor-lights -craft-saddles-forge-1-16-5@craftsaddles - -@elytra-fix -@ho-library - -riskofrainmod|雨中冒险 (Risk of Rain Mod) - -baddie-mobs-uwu -beacons-revisioned@ -silence-mobs@ - -utilitix@ - -tiny-coal@ -replaymod-for-forge-reborn -flib@ - -copper-revisioned@ -frozen-fish|冻鱼 (FrozenFish) -fine-tuned-calibration@finetunedcalibration -third-person-maps@ -carpet-minitweaks@minitweaks - -time-in-a-bottle-forge@time-in-a-bottle-universal -seared-ladder-backport@seared-ladder-(backport) -wall-jumped@ -red-core@ - -record-days-survived@ -veinminer-companion -flightem|我要骑着你飞* -@leashable-players -snowballs-freeze-mobs@ -guinea-pigs@guineapigs - - -vault-research -the-chaser -bandaging -enchanted-charms@ -nether-api@ -mother-silverfish -mcretector@ - -little-botanics -ex-pattern-provider@extended-ae|AE2扩展 (ExtendedAE) -@integrated-circuit -creative-disk -engineers-construct -@botools|假人映射 (Botools) -witch-mobility -gravestones-die-classy - - - -@pebbles-begone -eternal-eats -zombiegame|僵尸游戏 (Zombie Game) -effect-overhaul -casualness-delight@|随意乐事* - -eidolon-rebrewed@ -fruity-random-teleport|紫颂果味随机传送* -pipe-master-2000|管道专家 2000 (Pipe Master 2000 / Pipe Googles) -command-macros@|命令宏* -@shwetro|上海地铁装饰组件 (MTR Shanghai Wetro Addon) -yuushya-modelling@|方块建模* -tactical-aid@|战术医疗* -@clear-enchanting -fishing-bobber-detector@create-fishing-bobber-detector -@unfix-mc-181190|村民折扣叠加 (Unfix MC-181190) -create-balanced-flight -brewin-and-chewin-remastered -cupboard -mcinstance-loader@ -pre-fish-feed|打窝* -armor-trim-item-fix@ -waffles-moss -delightful-cuisine-for-woodheads -towers-of-the-wild-modded@totw-modded|旷野之息高塔 : 再重制 (Towers of the Wild Modded) - -waffles-terracotta-plaster -watermedia@ -@inverse-phantoms -@cactus-storage - -etcetera - - -garnished@create-garnished|机械动力:装食 (Create: Garnished) -just-a-well@ -siberiamod -spacetime|空之翼 (SpaceTime) - - - -grappling-hook-restitched@grappling-hook-mod-fabric -@minceraft-title -mob-animations -platter -i-want-that-back -presence-not-required -wnboi@ - -@biome-compass -eye-collector-mod - -cozy-foods-milk-tea -opolis-miners@ -netherite-but-cheaper -@fabric-hammers -items-displayed-fabric@items-displayed|物品陈列 (Items Displayed)¨items-displayed-forge@|物品陈列 (Items Displayed) -wood-converter -hammer-mod - -realisticsleepfabric@stevesrealisticsleep -zombies-actually-siege -hex-gloop@hexgloop|咒法凝浆* -the-void -the-shadowlands -bloxys-structures@ -enhanced-hordes -niftycarts@ -wither-dimension-whitelist -@hexlink - -usefulfood-reborn@|有用的食物 重生 (UsefulFood Reborn)¨usefulfood-community|有用的食物 重生 (UsefulFood Reborn) -ancient-warfare-2-tweaked@ -cuffed@|监禁* -rockn-roller@rocknroller -bodies-bodies@ -potionparticlepack@|药水粒子包 (Potion Particle Pack) -deep-blood-evolution -better-horses-mod|更好的马* -potion-bundles@|药水捆* -kofi-table@ -better-mcdonalds-mod@ -@itemframesplus -sinytra-connector@connector|信雅互联* -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-hotbar@verticality -the-slender-man -automodpack@ -bella-quilt@bella -simply-skills@ - - - -cctv-craft -redeco@|重铸家具 (Re:Deco) -pocket-storage -animated-player-mod|动画化玩家* -its-thirst@ -infernal-damage-indicators - -@just-enough-speed -remion|soul-like armors: medieval weapons & armors - 旧版,已失效¨soul-like-armors-medieval-weapons-armors|soul-like armors: medieval weapons & armors - 重置版,已失效 -@elytratime - -squaremap -roots-classic-fabric -justenoughbreeding@ -simple-drills -peculiarpieces@ -loot-stages@|战利品阶段* -player-stages|玩家阶段* -generation-stages|生成阶段* -ars-oscura@|黑暗魔艺* -bobby-reforged|服务器区块缓存-重铸* -shut-up-gl-error@ -no-spider@ -terracart-reloaded@ -dme -fruit-stack@|果栈丰萦* -gregtech-drawers -marine-iguana|海鬣蜥* -stonks@ -dirtnt@|泥土TNT (DirTNT) -equipable-twilight-forest-charms-tfc|可装备的暮色森林符咒 (Equipable Twilight Forest Charms) -buriedwrecks -zapsconverter|Zaps 转换器 (Zaps Convertor) -amethyst-update -angel-block -angel-block-renewed@ -da-bomb@ -quickstack -@bhs|黑洞储存 (Black Hole Storage) -collectors-album@ -head-name-fix@headfix -hostile-delight@unusualdelight|异趣乐事/宿敌乐事 (Unusual Delight*) -vivecraft-compat@|ViveCraft兼容 (ViveCraft Compat) -wildlife-expanded-skunk@ -keepheadnames@ -ydms-fennec-fox@ -ydms-ostrich@ -curse-of-the-warden -chatanimation@|聊天动画 (ChatAnimation) -mobvote-rascal@rascal -spotiforge -indypets@ -minecraft-legends-golems -create-sandpaper-overhaul@ -vintage-gregtech -ydms-vulture@ - -locked-slots -wildlife-expanded-snakes@ -jline-for-minecraft-dedicated-server@jline4mcdsrv -blocklingcollection -trenzalore - - - - -creo-lib¨@creo-lib|Creo Lib - 已失效 -highlight@ -lost-libraries -@plant-pearl - -sensible-sleep -@hollows-tweaks -eastward-journeys@ - -omotions@ -invisible-frames -ultimatebackportmod@ubm - - -true-ending -@sorted-enchants|附魔排序 (Sorted Enchants) -constructs-armory-1-18-2-port@construct-armory-updated - -@videotape -@enchantmenttweaker -let-me-sleep -forge-tooltip-texts-scroller¨fabric-tooltip-texts-scroller -well-behaved-mobs - - -ancient-realms -@remove-terralith-intro-message -gambling-style -animated-recipe-book - -@packetunlimited -bloxys-bosses -more-bows-cj -@snowballs-hit-players|雪球可以击退玩家 (Snowballs Hit Players) -tectonic-bop|Tectonic:超多生物群系兼容 (Tectonic + Biomes O' Plenty compat) -tech-enhanced -gilded-netherite-cj-edition -enderite-cj-edition@ - -dangerous-oceans -@mc-249136-fix|MC-249136 修复 (MC-249136 Fix) -@featherfallflying -@lidar -anvil-never-too-expensive@ante -crossbow-mod@crossbow|弩 (Crossbow) -@place-item - -controlify@ -@bedrodium -xbbs-hot-air-balloon-fantasy@|XBB的热气球幻想 (XBB's hot air balloon fantasy) -netherite-horse-armor-cj -polydex@ -plenty-of-armors@ -spatialio-compat -@mica -heavy-armor -moss-layers@|苔藓层* -lunchboxes -@autofish-chao -strawgolem|稻草傀儡 (Straw Golem) -@shifting-wares -dynamic-trim@ -trade-uses@ -ambient-fireflies@ -nb_mod - -stacked-armor-trims@ -@final-beta -better-trim-tooltips@ -totally-enough-pain@ -custom-village|村民调教* -animaticareforged -shear-cows -fps-boost -afkfish@ - -@rend -more-trails-more-tales@ -good-tea@|馥郁良茶* -screen-size -botany-ores@ -@cauldron-fix|炼药锅修复 (Cauldron Fix) -foods-plants-cooking-with-mindthemoods -@customgui|自定义 GUI (Custom GUI) -keebszs-battletowers-fabric¨@keebszs-battletowers|Keebsz's Battle Towers - 已失效 -as-a-creeper|×的和你爆了 (As a creeper) - -smarterwanderers -extended-crafting-nomifactory-edition|合成拓展:延续版 (Extended Crafting:Nomifactory Edition) -@meal-api-addon - -easy-config-button -@kahur -@modloadermp -maple@|枫* -seamless@ -bundle-enchantments -real-time-mod -chromatic-arsenal -ore-visual-detector -dank-null-no_rce@danknull-rce -kubejs-additions@ - - - -betterdays@ -@seedy-place -extradetails -signed-paintings@ -inenchantment-reconstruction|负魔与改造 (Inenchantment & Reconstruction) - -nae2|Neeve的AE2:EL附加工具 (Neeve's AE2: Extended Life Additions) -the-microworld -vionta -hammer-animations@ - -blueflame@ -nocubes-craftable-music-discs -enderlicious -quarry-reborn - - -morematerials@ -foodmod-for-fabric@food -cursed-mod-for-fabric@cursed -weaponized-baseball -epic-paragliders-but-sekiro|史诗狼之伞* -visualores@ -d-furnace -flickerfix@|闪烁修复 (FlickerFix) -@spongesucc -@phosphor-legacy -random-crits -simple-enchantments -simple-weapons-for-better-combat@ -wither-drops-netherite-templates -@spineless -immersive-melodies@|沉浸式奏乐* -theobsidianboat -dragon-survival-compatibility@|龙之生存:兼容* -bettercookedaxolotls -stateobserver@ -mighty-mail¨mighty-mail-fabric -nature-architect-plants-and-decorations -better-berries-redux -kurisus-passable-leaves@passable-leaves|叶间穿梭 (Passable Leaves) - -armorful@ - -@osl -fix-gpu-memory-leak|修复GPU内存泄漏 (fix GPU memory leak) -cake-delight@cakedelight|蛋糕乐事* -autoslabs@ -@kabo-village-marker -ootn -@signal -i-see-what-you-did-there@ -hit-streak@ -new-slab-variants@ -blue-archive-banner-and-shield-patterns -mimic-mod@mimic -bocchium -despawntweaker - -on1chest@|唯一箱子 (Only Need One Chest) -landmines@|地雷* - -packed-up-backpacks@ -valhelsia-furniture@ - -dimension-remote -bring-decay@ -rendertypecache -autotag@ -libz@ -autotools@minecraft_autotools|自动工具 (AutoTools) -@threadtweak -nbt-editor@ - -@betterendsky - -dimtpcmd|维度传送指令 (DimtpCmd) -fast-ip-ping@ -better-anvil@ -bloxys-misc -@find -@elytra-recast -tieredz@ -more-creepers|更多苦力怕* - - -cryptic-registry@ -level-text-fix@ -binnies-mods-patched@ -cyanide@|氰化物*¨cyanide-fabric|氰化物 (Cyanide) -@particlesenhanced -@atum -@worldpreview - -prehistoric-nature-precambrian-dimension -@mc-260949-fix -pro-sniper|专业狙击手* -aether-gear-expansion -aether-enhanced-extinguishing@ -@recipebookmasscraft -create-new-age@|机械动力:电气时代 (Create: New Age) -@universal-trading -@sauces|涂酱 (Sauces) - - - -nekoui - -xpteleporters-2|经验传送器 (XPTeleporters 2) -centered-plants@|植物居中* -showkeybinds@ -@lostera-coremod -advanced-tooltips@ - - -prehistoric-nature-cambrian-dimension -@mushroom-mod -better-end-sky¨better-end-sky-fabric -valkyrie@ -soaring-structures-2|Soaring Structures 2 - 完整版¨soaring-structures-2-clean-version-fabric|Soaring Structures 2 - 轻量版 -prehistoric-nature-ordovician-dimension -fadeless@ -create-tweaked-controllers@|机械动力:高级遥控器 (Create: Tweaked Controllers) - -auto-elytra@ -villager-names@villager-names-serilum -bedrockwaters@ -@antishulkerdupe -hourai-elixir@ -convivium|会饮* -prehistoric-nature-silurian-dimension -grass-seeds@ -minecraft-dungeons-weaponry -ahznbs-naruto-mod-addon -random-village-names@¨random-village-names-fabric -mooshroom-tweaks@ -grinners-ents -log-cleaner@ -lunar@ -cosmetics@cosmetica - -@abi -interiors@|机械动力:内饰 (Create: Interiors) -souls -real-seasons -eternal-winter@ -move-boats@ -omnom@ -forest-x-reborn@ -exlines-bark-carpets@bark-carpets -exlines-more-carpets -srsl@|星骸秘遗 (Star Remains Secret Legacy) -unearthed-journey@|出土之旅* -prehistoric-nature-devonian-dimension -mwtis-stone-expansion@stone-expansion -smooth-entity-light -title-fixer@ -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 -vehiclefix@ -firework-frenzy@ -prehistoric-nature-carboniferous-dimension -cammies-combat-tweaks@ -chorus-gormandizers@ -enemy-expansion -clear-void@|清澈虚空* -the-arcaneum -@mixmetica -mutant-mobs-mod -prehistoric-nature-permian-dimension -@phosphorlegacyforge -stairdoors-extended@ -into-the-rend -buff-frog-mod -asphere -autoclick-machine|自动连点器(Fabric) (Click Machine (Fabric)) -harvestcraft-tweaker -the-legend-of-the-mudman -mutagenesis -nether-update-backport -l2hostility@|莱特兰-恶意 (L2Hostility) -packagedthaumic@|封包神秘时代 (PackagedThaumic) -cat-eyes-night-vision-toggle-mod -vtdownloader@ -smithing-mod - -the-doppelganger@ -rail-wand -tin-ore@tinore -dark-elves-of-underdark -titan-biomes -depth-striders@ -endercage@|末影笼* -mutationcraft@ -aftershock@ -limitless-concert|永无止境: 音乐会* -realm-rpg-dragon-wyrms -prehistoric-nature-triassic-dimension -flower-power -vr-combat@ -embeddium@ -no-arrows-in-you@ -@unicopia|奇幻小马国 (Unicopia) -ryans-zombies -lights-out-2 -leafper-creeping-and-cute -the-john-mod-reborn@john_mod_reborn - -apothic-attributes - - -wall-jump-txf@ -@fastmove -@genshincraft|原的世界 (Genshin Craft) -and-there-was-only-one-bed@ -hex@ -legend-of-dreemland-drakonboos -hanew-village -battle-allays -@lootbeamsfabricupdated -styled-chat@ -infiniteinvo -playerex-reimagine -startup-timer -cc-mb@|纸带八音盒 (Music Box) -oryls-adventures -elden-craft -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)¨yungs-better-jungle-temples-fabric|YUNG的丛林神庙优化 (YUNG's Better Jungle Temples)¨yungs-better-jungle-temples-neoforge|YUNG的丛林神庙优化 (YUNG's Better Jungle Temples) -forlorn-beasts -harpiccore-mod -poonggis-add-more-bosses -rottenmod -simpletweaker -@no-spawning-on-ice-highways - -zens-mmorpg - -enchantment-lore@ -zenrecipereload|配方热重载 (ZenRecipeReload) -lovable-chest -critters-cryptids -deathquotes-death-quotes -saphyre - -gameblocks@ -initial-house@|初始房屋* -livingchest - -skibidi-toilet-stevebidop -better-impaling-fabric -vanadium-mod@vanadium|钒 (Vanadium) -loginar-storage@ -jewelry@ -elytra-drag@ -night-vision-flash-be-gone - -ancient-return@ -mc-modsayed -honkai-star-rail-12|星铁12* -torchflower-relit@ -fexs-random-stuff-mod -k9@k9-mod -the-digimod-beta|方块数码宝贝 (The Digimod) -ex-deorum@|无中生有:神赐* -entity-detectors@ -@horse-armor-stand - -above-and-below@ - -freeze-it-and-heat-it@|冷汗:食物冷冻与加热 (Freeze It, and Heat It!) -@keybindsgalore-1.20.x-(hvb007) -never-full -nemos-blooming-blossom@ -legacies-and-legends@ - - -your-log-saw-something-last-night@ -tubes-reloaded@ - - -natures-spirit@|自然之灵 (Nature's Spirit) -@natrium -bossominium@ -@sort-extension -hostile-water-monsters -slabs-layers@slabs-layers+ -history-of-middle-earth-legacy|中洲历史:传承 (History of Middle-earth: Legacy) -hostile-humans@ -classic-and-simple-status-bars@cssb|经典且简易的状态栏 (Classic and simple status bars) -@turtle-charging-station -your-reputation@¨your-reputation-wthit@¨your-reputation-jade@ -futurediary|未来日记 (FutureDiary) -infiniverse@ -use-item-on-block-event@ -genshin-instruments@ -genshin-elementreactions -chatshot@ -cropchance|IC2作物信息 (CropChance) - -freelook-fabric@freelook -respawn@ -infiniverse-utils -coreextensions@|核心拓展 (CoreExtensions) -@fast-items -toad-terror -modern-industrialization-sound-addon@ -achievements-optimizer@ -automessage@auto-message -ftb-quests-optimizer@ -gfarm@ -ryoamiclights@ -patchouli-rofl-edition -alfheim-lighting-engine@ -even-more-instruments@evenmoreinstruments -more-red-computercraft-integration - -no-invincibility-frames -moderncreator -better-questing-unofficial|更好的任务非官方版* -p455w0rds-ae2-wireless-terminals-patch -spoiledz@ -boss-music-mod -yippee -friends-forever|永恒的伙伴* -de-extinction-mod -custom-world-generation@|自定义世界生成* -cataclysm-tweaks -euphoria-patches@ -poke-ball|精灵球 (pokeballhv) -aquamirae-mod-music@aquamirae-mod-extra-music -deathmatch -@smooth-scroll|平滑滚动 (Smooth Scrolling) -toad-terror-battle-music - - -fusion@ -machines@ -tenms-discs -netherrocks@ -invasion-code-red -efw-forgotten-place -@vulkanite-mod -yungs-better-end-island@|YUNG的末地岛屿优化 (YUNG's Better End Island)¨yungs-better-end-island-fabric|YUNG的末地岛屿优化 (YUNG's Better End Island)¨yungs-better-end-island-neoforge|YUNG的末地岛屿优化 (YUNG's Better End Island) - -bellsandwhistles@ -daniinatorul -uuid-offline -vanilla-cubed@|原版立方* - - - - - -longer-chat-history@ -@secret-spectator -shoot-glass@ -modification-of-critical-hit@|暴击改革* -improved-damage-framework@idf -@shulker+ -@biome-tag-villagers -combat-bash@ -@simpleprivatechest -marbleds-villager-hats@ - -connector-extras@ -akkamaddis-simple-tungsten|Simple Tungsten - 新 -just-enough-beacons-reforged@ - -akkamaddis-additions@akkamaddis-simple-tungsten¨simple-cobalt|Simple Cobalt - 新 -akkamaddis-ashenwheat@ -prehistoriclegacy -redyed -enchantmentdisabler@enchantment-disabler -miners-glasses|矿工眼镜 (Miner's 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-arsenic-and-lace|Arsenic and Lace - 新 - -xiyus-exchanted-book@xiyus-enchanted-book|饩雨的附魔书 (Xiyu's Enchanted Book) -la-abuelita -rotted-forge@rotted -rustic-furniture-compat -@no-realms-button|Realms按钮移除 (No Realms Button) -@benchantments -epic-fight-indestructible|坚不可摧 (Epic Fight - Indestructible) - - - - -catwalks-llc@ -divine-quest-rpg -@carpet-org-addition -simply-headshots -random-structure-land - -random-mobs-land -clean-swing-through-grass -shrug-it-off-stb-edition@ -enchantsmith -snifferent -jei-recipe-history@ -@yeet -macaws-paths-and-pavings@|Macaw的小径和路面 (Macaw's Paths and Pavings) -chiseled-bookshelf-visualizer@ -elytra-skins@ -mcv-biome-makeover-lieonlion@ -more-chest-variants-lieonlion@ -more-crafting-tables-mct@more-crafting-tables-lieonlion -@cobblemon-quests -akkamaddis-classical-alchemy|Classical Alchemy - 新 -@big-pony|彩虹大马 (Big Pony) -qraftyfied -theft-mod@theft -akkamaddis-golden-glitter@ -@obsidianbucket -enhanced-annihilation-planes -akkamaddis-simple-cthon@ -@heads-hurt-too! -pooping-animals -good-boy@ -nethers-overhaul@ -better-battle-towers|战斗高塔,启动!* - - -@axiom - -lilac@ -colorful-enchantment|自定义附魔光效 (Custom Colorful Enchantment) -rusticwitchcraft - -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 -no-durability -potion-of-armor@ -@wmf -tenebrous-lands@ -super-better-grass -configurable-boss-bars@ -nuclearcraft-neoteric@ -beastly-beacons -creeplets|Creeplets - 已失效¨@creeplets -thermoo@ -restapi@rest-api -@advanced-ui-scale -@umines -health-disease|健康&疾病 (health&disease) - - -@hd-skins - -sundew -undead-boxers -aesthetics@ - - -chinese-festivals@|中国节* -ultramarine@|群青* - -@cargo - -dragon-nest-forge-fabric -geode-creatures -haraldsbetterstructures -squake -ae2-uel-extended@|应用能源2非官方拓展 (AE2 Unofficial Extended) -terraria-calamity-mod|泰拉瑞亚灾厄 (Terraria Calamity) -darkrtp-rtp-random-teleport@darkrtp -cute-bears -additional-fruits@ -bigger-better-end-cities@|更大更好的末地城* -@some-peripherals -reden@ -sparse-structures@sparsestructures -persistentcooldowns|物品冷却持久化 (Persistent Cooldowns) -@command_extractor -advancement-based-spawning@ - -heroic-armory-legacy -yungs-menu-tweaks@|YUNG的菜单调整 (YUNG's Menu Tweaks)¨yungs-menu-tweaks-fabric|YUNG的菜单调整 (YUNG's Menu Tweaks)¨yungs-menu-tweaks-neoforge|YUNG的菜单调整 (YUNG's Menu Tweaks) -entity-distance-1-12-2@entity-distance-1.12.2|实体距离 (Entity Distance) -coolesthardcore@coolest-hardcore -taxcastlepillager -pesky-pirates@ -subterrestrial@ -illusioners-tower -bad-npcs -darkfeather-golden-feather@darkfeather -darkspawn-teleport-to-spawn@darkspawn -darksmelting-smelt-armor-and-tools@darksmelting -fast-build -digi-applimobs|数码宝贝宇宙应用怪兽* -duckies -dimension-crystals@ -mechanical-crafting -@enhancedbookwriting -player-events@ -mushlings -sky-tribes - -recipe-enhancements -oceanopolis@ - -pumpkillagers-quest@ - - - -waterlogged-chests -realm-rpg-fallen-adventurers -useful-bats -goat-food -mobile-beacon-1-18-forge -durabuilt -cavemans -balloon-box -campfire-resting@ -fizzle - -grimoire-api -cristel-lib@ -more-sleeps@sleepquality -o-coracao-da-selva -creative-experience -more-than-50 -underground-jungle@underground-worlds -forge-soul-like-armors-reworked -meds-and-herbs@ -soul-like-monsters-epic-fight-addon -souls-like-parry -tcdcommons@ - -autotranslation@|自动翻译 (AutoTranslation) -villages-and-pillages@ -nohurtcam-plus@nohurtcam+ -darker-souls - -@spooky-bats -swutms-extra-dungeons|SWUTM's Extra Dungeons - 已失效¨@swutms-extra-dungeons -swutms-extra-desert@ -@refill-chests - -@cookeymod -@useful-brush -@horse-spawn -tw-resurrection -@dice -any-lanterns@any-lanterns! -horse-tack -darkmobs-increase-mob-difficulty@darkmobs -@apollo-the-parrot -mob-variants -galvanization -biome-grass-available@ -pigment@ -sunrise-sunset-audio@ -halloween-nighmare -lookin-sharp@|锋芒毕露 (Lookin' sharp) -halloween-luckyblocks -spooky-halloween -isle-of-berk-variant-loader@ -spooky-arms -qraftys-end-villages -bed-is-not-too-far-away@ -@enderman-tweaks - - - -decoration-and-furniture - -formations@ -formations-overworld@ -formations-nether@ -halloween-spirit -glitches-halloween -rei-collapsible-entries@ - - -kubevs@ - -halloween-expansion-food -fishy-business-more-fish - -@parry -crab-mob-vote-2023 - - -enderswords@ - -lemons-halloween -moon-reborn -the-witching-hour -hallows-eve@ -@chroma-world-border -just-sword-blocking - - -@blissful-butterflies -mltpojectmonster|銘洛天的怪物增强 (MLTPojectMonster) -@relics-of-the-sky|空岛遗物 (Relics of the Sky) - -ae2-stuff-extended@ -butchers-delight-foods@ -better-falling@ -dmcloot -simply-stacked-dimensions -@what-are-you-voting-for-2023 -@what-are-you-voting-for-2022 -immersive-electrocution -additional-compression -team-projecte|等价交换团队 (Team ProjectE) -torcherino-community-edition@torcherino-ce|加速火把社区版* - -enchantgiver -diabolical-delights@ -ore-growth@ -@real-arrow-tip -dnt-ancient-city-overhaul - -cropariaplus -soularia@ -stemaria@ -spelunkers-charm-ii -structure-essentials-forge-fabric - -tiny-pals@ -@amethyst-craft|紫水晶工艺 (Amethyst Craft) -weapons-of-miracles-epicfight@weapons-of-miracles|奇迹武器 (Weapons of Miracles) - -@hsrpaths - -mcdar@|我的世界:地下城法器 (MC Dungeons Artifacts) -dnt-stronghold-overhaul -dnt-swamp-hut-overhaul -jaopcagt@ -smidgeon-o-bliss -cable-flux@12.3.5 -jet-and-elias-armors - - - - -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@|混合水生* -spectre-creep -resource-chickens|资源鸡* - -storage-crate@|板条箱* -oculus-particle-fix@ -urkaz-moon-tools@ -the-midnight-lurker@ -realm-rpg-imps-demons -multiverse@multiverse_mod - - -strangecreatures -bovines-and-buttercups@ -mooblooms@ - -water-walking-fix@ -water-walking-fix-forge@ -@chicken-nerf -@explosive-breeding -squished@ -russtales-forge -trident-alter -disenchanter@ -minecraft-dungeons-artifacts -uniquedungeons -@cobbledex -cobblemon-info@ -enderman-overhaul@|末影人革新* -cloak-dagger@cloak-and-dagger -oworld2create|别创建新世界! (OWorld2Create)¨oworld2create-refoxed|别创建新世界! (OWorld2Create) -dungeons-in-dimensions -infernal-bugz -@cobblemon-gts -cobblepedia@ - -@cobblemon-integrations -fruitstack-jei-support@|果栈丰萦JEI支持* -dungeons-artifacts -the-monkey-bomb@ -@cobblemon-hunt -ancient-animals -beavery@ -qraftys-halloween-villages -vemerioraptor -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 - -fossilmon@ -opack2reload|资源包惰性重载/抑验怠载 (0Pack2Reload/OPack2Reload) -wits@ -@motleys-music-discs - -husks-drop-sand@ -patched@ -@snakewheel-attack! - - -configurable-falls@ -just-enough-mekanism-multiblocks@ -throwableslimeball|可投掷黏液球/圆液多掷 (ThrowableSlimeball) -death-note|死亡笔记* - -icicle - - - -surface-mushrooms@ -dont-void-arrows@ -potion-cauldron@ -hippo-keystrokes@ -spiritcaller-backport - -kindled - -mushroom-trees - -@skeleton-creeper|骷髅苦力怕 (Skeleton Creeper) -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|Moderately Enough Effect Descriptions - 新¨@moderately-enough-effect-descriptions-(meed)-jeed-addon|Moderately Enough Effect Descriptions - 已失效 -alexs-caves@|Alex 的洞穴 (Alex's Caves) -bow-spam-be-gone@ -lmdcraft -hardcore-survival@|硬核生存* - - -dynamic-village@ -@even-better-archeology - -jammies@ -dj-villager -ars-energistique@ -chatimages@chatimageN|聊天图片 (ChatImages) -create-more-drill-heads@|机械动力:更多钻头 (Create: More Drill Heads) -create-liquid-fuel@|机械动力:液体燃料 (Create: Liquid Fuel) -@rays-cool-armor -eeeabs-mobs@eeeab-s-mobs -@obfuscated-accessibility -regional-chat@ -zenith-attributes@ -@smartygui - - -selectlative|选择性成就共享* -better-compressed-blocks@ -fakerlib@ - -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@ - -just-leveling@ -create-edible-belts -tact -paimon|派蒙!*¨paimon-fabric|派蒙! (Paimon) -@cesium|铯 (Cesium Storage Format) -salvage-furnace@ -eager-beavers@ -laendli-transport -witchs-artifacts -the-pumpkin-challenge@ -loot-crates-plus@loot+ - -fuji@|藤* -legendary-origins@ -flow@ -lit-it-up@ -lucky-cat|招财猫* -mc-mods-the-wizard-gear -better-tools-and-armor -berrfect@|完莓无缺* -mazemanicore -uncanney-valley -@cannibal-conundrum -@glass-carpet -@quality-sounds -dolt-compat -embeddium-extension -wakes@ -create-immersive-portal-integration -dangers-in-the-darkness -spookycraft -kelpie@ -@viavanillaplus -dead-mans-abyss -the-leagues-of-the-dead -centered-crosshair@ -@create-fabric-sodium-fix -realm-rpg-creep-crop -fexcraft-common-library - -x-autofish@x+-autofish|自动钓鱼XPlus版 (XPlus AutoFish) -befixment -more-magic -cheat-command -@screenshot-organisation -pumpkinpal - -johnnys-biological-notes@johnnys-biological-notes-1.0-beta|Johnny的生物笔记 (Johnny's biological notes) -autodrop@ -mutation-rerun - -@compactspawners - -corundum-guardian-reborn -autofire-bow-enchant - - -rideableravagers@ -passive-searchbar|被动搜索栏 (Passive SearchBar) -flower-mimics@ -vegan-delight@|纯素乐事* -bloodmooncmsfix-bmcmsfix -evoodooers -giant-overhaul -@torohealth-damage-indicators-updated -boliviamod -leawind-third-person@|Leawind的第三人称 (Leawind's Third Person) -fabled-weaponry -lazurite@ -lets-do-nethervinery@|下界葡园 (Let's Do: NetherVinery) -shinnyladders|发光梯子/洇荧登纵 (Shinny Ladders) -macaws-holidays@ -unions-upgrade-scrolls -torohealth-unofficial -rebindallthekeys@rebind-all-the-keys -pocketwatch2@pocketwatch -pick-blockstate@pickblockstate -@epcore|满同态核心 (Epimorphism Core) -oh-my-sherd -archaeology-banners@ -mobvote-2023-crab@ -totem-curse - -zombies-are-real -timeless-and-classics-guns-lesraisins-append-pack@lesraisins-weapon|TaC:绿葡萄附属包 (TaC:LesRaisins Append Pack) -permanent-chat-logs@permanent-chatlogs|聊天记录保存 (Permanent ChatLogs) -mob-strength@ -catastrophemod -@water-generators|水发电机 (Water Generators) -fishes-undead-rise-ye -nameless-servers@ -noisium@ -@embedded_assets -creative-library@ -independent-gizmo@ -jackocache@ -creepy-creepers -modular-item-api@¨truly-modular-arsenal@¨truly-modular-archery@¨truly-modular-armory@ - -@actionhunger -trafficcraft@ -banilla-hammers@ -everyxhotpot@every-x-hotpot|一起火锅 (EveryXHotpot)¨everyx-hotpot|一起火锅 (EveryXHotpot) -@hira-hira -tierability@ -soul-collector@ -@jime -@nota - -@lighty -echo@ -@shieldindicator - -lanthanum@|镧* -charge-thrower - -champions-ashes|王者遗灰 (Champion's Ashes) - -jade-addons-ic2classic@ic2cjadeaddon -sit1@sit! -monnef-core -robs-floating-islands@ - -glasses@|眼镜* - -gem-crabs-1-19 -berrybush-magic -archers@ -@packrule-menus|数据包/游戏规则菜单 (Datapack/Gamerule Menus) -inventorylogger-backups -rideablepolarbears@ -cobblemon-lucky-blocks -egg-delight@|鸡蛋乐事* -portable-nether¨portable-nether-fabric -@resourceful-block-sounds - -the-starved-stalker -4832673@toms-peripherals -croptopia-delight -@no-mining-cooldown -futuristic-decor|次元科技装饰方块* - -spyglass-of-curios@|饰品望远镜 (Spyglass of Curios) - -macabre - -ssr -petal@ -creatures-of-runeterra@cor -from-another-world@ -pumpkin-moon@ -zombie-onslaught@ -neighborly -natural-progressions@natural-progression -charged-explosives@ -pulver@ -@allow-editing-player-data -apple-crates - -betterend-forge-port|更好的末地 Forge 版 (BetterEnd (Forge)) -the-corpse-stalker-cave-dweller-mod -ciscos-armoury -portable-mobs -deserts-and-dunes -@mcfc -box-of-horrors@the-box-of-horrors -chat-colours@ -mekanism-weapons|通用机械武器 (Mekanism: Weapons) -vanilla-reflex@ -flighthud-reborn|鞘翅飞行抬头显示:重生 (FlightHUD: Reborn) -celestial-enchantments|星月附魔* -clearsky|洁净天空 (ClearSky) -educate-nitwit -damage-spawns-mobs -decorative-sniffer-egg@ -gilded-sherds@ -camps-castles-carriages -rainbow-reef@ -advancement-no-more@ -aqua-geode - -medieval-buildings@ - - -@you-thief-remastered-edition - -more-slabs-stairs-and-walls@ -caves-canyons -dragon-mounts-legacy-continued@|龙骑士重制版延续* -chloride-mod@chloride -aggro-indicator@aggroindicator -haveasoltime@ -tothestars@ -translater@ -localized-chat@ -prominent-create -bad-lightning-no-cookie -equipment-standard@|装备标准 (EquipmentStandard) -terra-armory@ -advanced-enchantments@|进阶附魔* -oaks-nature@ -geophilic-reforged -lglegacy@|延迟监视:移植版 (LagGogglesLegacy) -smooth-scrolling-refurbished@ -medieval-weapons-pack@ -celestial-artifacts|星月遗物* - -perfect-mob-farm -smart-render¨smartrender -power-adapters@ -silk-api@|丝绸开发库 (Silk API) -@mediaworks|媒质工程 (Mediaworks) -chestesp -@ruthenium|钌 (Ruthenium) - -spirit-walker@ -gcyr@ -gregtechceu-modern@|格雷科技现代版 (GregTechCEu Modern) -@intarsia|咒术器具 (Intarsia) -instant-village-building - -nbt@ - -separated-leaves@separatedleaves -pangteens-immortal-adventure@|PangTeen的平凡冒险 (PangTeen's Immortal Adventure) -simple-shops@simpleshops|简单商店* -forgiving-border|仁慈的世界边界 (ForgivingBorder) -snow-mercy - -@blocky-bubbles -airdrop-supply|空投供应* -refined-proxy - -pickable-pets@ -snow-mercy-forge - - -bouncestyles@ -@better-beds-reforged -untamed-delight|不羁乐事* -monster-no-armor-in-slar - -dancing-hoppers@|舞动的漏斗* -anvil-crafting@|铁砧配方* -ender-chested@ -@skull-vision -prefabricated-structures@ -rebirth@rebirth-paintings -amethyst-tools-2|紫水晶工具2 (Amethyst Tools Mod 1.2x) -mob-pets|驯兽师* - -ultimate-compression@ - -farming-in-rain -bosses-of-mass-destruction-forge@|祸乱鬼魅 [FORGE] (Bosses of Mass Destruction [FORGE]) -armor-set-bonuses@¨armor-set-bonuses-fabric -nemos-creatures@ -immersive-jungles@ - -weather-2-remastered|局部气候&风暴 - 重置版 (Weather 2 - Remastered) - -phantoms-of-the-end -diamond-and-emerald-farming-mod -blood-and-gore -nonetherportal@no-nether-portal -necronomicon@ -showcase-item@ -eldritch-end@ - -quit-or-not -spelled-mobs -let-fish-love -exposure@|拾光定影* -@fast-portals -pick-up-me-please@pickup-me -bouncy-creepers -simple-death-chest@ -@enhancer-mod -headphones -you-are-the-zombie -self-damage-knife - -coin-craft -speedy-ladders -@youaremyhatnow - - -fruits-delight@|果园乐事* - -destruction-difficulty@destructiond|破坏困难* - -villagers-follow-emeralds -dredge@ -create-creating-space@creating-space -asmc-performance-patch -mrcrayfishs-gun-mod-unofficial|MrCrayfish的枪:非官方版 (MrCrayfish's Gun Mod: Unofficial) -@fish-tanks -ram-compat@ -@wcsm|中国式学校 (Chinese School Mod) -zombies-reworked-forge@zombies-reworked -legendary-monsters@|传奇怪物* -catontoasts-mobs -combatify@ -go-fish-updated|一起钓鱼吧!(更新版) (Go Fish (updated)) - -what-are-they-up-to@ -fumofumo|Fumo - 仅 16.0.0+¨@fumo -@elytraplus -mcaic@ -@zombification -@stutterfix -extrasounds-forge@extrasoundsforge -resource-mod-loader|资源模载器* -regrown -carcass@ -@humility-afm -let-me-use-it|亿用得纵 (Let Me Use It!) -epic-fight-impactful@ -grassnotfloating|浮的古原草送别 (GrassNotFloating) - - - -thermite@ -restriction -collision-fix@ - -dynamic-name-tags@ -@profundis -ctlib@ctlibmod - -building-packs -styled-sidebars@ -cut-and-colored@ -the-fence-unleashed@fency -@touch-up -@gipples-galore - -wood-enjoyer@|入木三分* -@coreextensions-foodapi|核心拓展-食物 (Coreextensions-Food-API) -dynamic-darker-souls -fade-in-chunks@ -@durability-guard -sorceryfight -better-lava-bucket -just-outdoor-stuffs@ -croptopia-additions@ -corniergun -better-flight-forge@betterflight - -farmers-delight-cookbook-reforged@|农夫乐事:烹饪书重制版 (Farmer's Delight: CookBook Reforged) -applications@ -k-clear-lag -@hexdim|咒法维度 (Hexxy Dimensions) -simple-backups@|简单备份* -sky-guis@ -botaniverse@|寰宇植物学* -betterer-p2p -recall-staffs - -enercell|能量电池* -default-world-generator-ssp -homyatos-explosives@ -infchest@|无限箱子 (Inf Chest) -@squashed -unremovableeffects@unremovable-effects -traders-in-disguise-the-illager-assassin-project@ -cherished-items -verdantvibes@|绿意盎然 (VerdantVibes) -crafting-manipulator -beware-the-rain -the-sasquatch -potion-pizzas@potionpizzas|药水披萨* -pot-breaker@|砸罐子* -disabletools@disable-tools|禁用工具 (Disable Tools) -@humility-se - -push-everything-away@|推开一切* -create-power-loader@|机械动力:动力加载器 (Create: Power Loader)¨create-power-loader-fabric@|机械动力:动力加载器 (Create: Power Loader) - -epiceldenringweaponsarmorandmobs -restart-server@ -sakura-cherry-additions -pillagers-gun|掠夺者的枪 (Pillager's Gun) -hammers-and-smithing - -tetra-booster-pack@withering-boon-for-tetra -everlasting-skins -decorated-pot-minecart|饰纹陶罐矿车* -legacy-console-sounds@ -eye-spy@ -sonicraft-demons@ -@speech-manager-by-command-scoreboard|计分板禁言管理器 (Minecraft Command Speech Manager) -flans-mod-reloaded|Flan的枪械重制版 (Flan's Mod: Reloaded) -mod-whitelist@|模组白名单* -simpledeserteagle|简单沙鹰 (Simple Desert Eagle) -dungeons-towers@dungeons+-towers -dungeons-more-spawners@dungeons+-more-spawners -@nether-depths-mod -technical-cores|机巧核心* -minetraps@|我的陷阱 (MineTraps) -@fabricated-rift -honey-sticky-piston -ore-discovery-broadcast@ -alchemists-garden -opolis-strainers@bbl-strainers -book-eater@ -rotom-phone-cobblemon@ -@world-comment|随处随笔 (World Comment) -ultramarine-refabricated|群青:重织* -long-nbt-killer -@curio-attribute|饰品属性 (CurioAttribute) -consistent-aim|持久瞄准/移眼盯住* - -arrow-pointers@ -bareback-horse-riding@ -what-the-gecko@ -forgotten-pots-forge -explorations@ - -redstone-lamps-plus -wool-collection@|羊毛装饰方块 (The Wool Collection) -@more-automation -random-mob-sizes@|随机生物模型大小* -unexperienced - -balanced-crates@ - -ducky-periphs@ -@norefreshscroll -furnitura@ -create-ad-astra-compat@ - -walkie-talkie@ -geotagged-screenshots@ -@wafflesscythes - -@legacy-optifabric -oneironaut@ - -celestial-core|星月核心* - -colorablefox|可染色狐狸/色绘你狐革 (Colorable Fox) -archeology-api -rpg-parties@ -astikor-carts-tfc@tfc-astikor-carts -nanexs-mobs -no-feather-trample@ -embers-extended-life@embers-unofficial-extended-life|余烬非官方延续版 (Embers Unofficial Extended Life) -terrafirmajousting@ - -jujutsu-animation -craftable-elytra -francium@francium-optimization|钫* -dragonwingselytra -universal-grid@|通用终端* - -antique-atlas-reborn -ars-artifice@ -draconic-energy -hamsters-plus@hamsters -@you-bandit! -eugenes-lance@ -thorium-reactors@|钍反应堆* -eugenes-guan-dao@ - -eugenes-wealthy-plains-village -lets-do-herbal-brews@lets-do-herbalbrews|煨茶酝露 (HerbalBrews) -enchant-icon@|附魔标签* -vintage-delight@|腌渍乐事* -@hotshot -biospherical-expansion@ -@serendustry -create-connected@|机械动力:创意传动 (Create: Connected) -@rgml-quilt -hbms-nuclear-tech-hamster-reloaded -noxesium@ - -infinity-cave|无限洞穴* -surface-lush-caves -geologic-expansion@|地质拓展* -cpas@ - -awesome-magic@awesome_magic -christmas-dweller -create-curio-goggles@ -@cobbleloots -dontusecommand@|请别用指令 (DontUseCommand) -beans-backpacks@beans-backpacks-3¨@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) -mob-battle-extra -lios-overhauled-villages@ -lost-relics@ -provihealth@provis-health-bars -metabolism@|新陈代谢* -adv-js|Advancement JS - 更新较慢¨@advancementjs -teleportcraft@ -frights-delight@|惊悚乐事 (Fright's Delight) -travelers-compass@|旅行者指南针 (Traveler's Compass) -@artemis-thin-logs -configjs@ -hardrock-tools-materials@ -animals-trap -armor-damage-scaling-forge-fabric -hornet -exotelcraft@ -jujutsu-kaisen-gt -@updated-hud -mapwriter - - - -clickmanaita - - -command-toast|指令面包机* -@hex-research|咒法研究 (Hex Research) -cwg-far-plane-view -firmacivilization@firmaciv|群峦传说:航海文明 (Firma: Civilization) -catbop-things -player-mobs@ -@create-trimmed -tinkers-caramel -ctrl-q@ -rug@ -glowing-tools@|发光工具* -horsing-around@ -herd-mentality@ -doggy-talents-next@ - - -motobox@ -pottery-additional-pots@pottery -better-dogs-x-doggy-talents-next -@villagertimetable -towntalk -cumulus@ -epherolib -icterine@ -notrample -industrial-foregoing-souls@ -fuelgoeshere@ -initial-dimension -youkais-homecoming@youkaishomecoming|妖怪们的归家 (Youkai's Homecoming) -utilitarian@ -classic-sword-blocking|剑之格挡* -@flutterandflounder - -jojo-world-of-stands@ -ash-api@ - -stylecolonies -hyperbox@ -respite-creators-fabric@ -simple-pizzas@|简单比萨* -rapscallions-and-rockhoppers@ -pescatore@ -apocalypse-now@ -cenozoic-nightmare-the-horror-of-prehistory - -quickbackupmulti@|多槽位备份 (QuickBackupMulti) -slashblade-japanese-addon-pack-reforked|拔刀剑日系附属重置版 (SlashBlade Japanese Addon Pack Reforked) -@create-fabric-fixes -@command-block-sceptre|命令方块权杖 (Command Sceptre) -crate-delight-forge@crate-delight|装箱乐事 (Crate Delight)¨crate-delight-fabric|装箱乐事 (Crate Delight) -cultural-creators-forge-create-and-cultural@cultural-crators¨cultural-creators-fabric-create-and-cultural -shuffle@ -probejs-legacy -create-destroy@destroy|坍毁化合 (Destroy) -flourish@ -pitch-dark@ -survival-debug-stick -cerbons-api-forge@cerbons-api -arcane-apprentices -kirara -nether-gold -create-interactive@interactive|机械动力:交互学 (Create: Interactive) -this-tsunami@ -blendium@ -awakened-bosses -survive-in-the-winter-frontier@misc_twf|冬境边域:生存法则 (Survive in the Winter Frontier) -toneko@tonekomod -goldelight -cosmos-portals -cc-vs@ - -item-despawn-timer@ -@is-this-mod-legit -aylyth@ -no-shade@ -dimensional-threads@dimthreads -jonns-trophies@ -it-follows-exclamation@it-follows! -@loggerhead-luminancies -asteorbar@|Asteor的状态栏和血量显示 (AsteorBar) -better-f1-reborn@|更好的F1重制版* -create-tipsy-n-dizzy@create-tipsy-n-high -ars-expanded-combat@ec-ars-compat -@revamped-piles -@fluiwid -revamped-phantoms@revamped_phantoms -defaultserverlist@ -green-delights|翠绿乐事* -@modmenu-ornithe -lost-city -digestive - - -inventory-binds@ - -octo-lib@ -farmers-plus¨farmers-utils|Farmer's Plus - 旧 -architects-friend -bagus-cosmetic@ -floatingitems -ars-ocultas@ -tetracelium@ -fugue@ -create-food@ - - -a-block-of-charcoal|木炭块 (A Block of Charcoal) -a-block-of-flint|燧石块 (A Block of Flint) -tome-of-blood-rebirth@ -chatutils@ - -asgard-shield-reloaded@ -gobble-core -expanded-combat@ - -fancy-chests@ - -glore@ -pi-privateisland|私人空岛 (PrivateIsland) -i-didnt-mean-it-that-way@ -finitewater@ -serverstop¨serverstop-fabric -glassential-renewed@ -tanukidecor - -cit-reforged -ultreonlib@ -undergarden-delight@|深暗之园乐事* -medieval-deco@ - - -limi|轻量化模组名称显示 (Lightweight Mod Indicator) -jtlunlocker -ae2-stuff-unofficial -@error422 -harder-underground|更难的地下* -harder-wildlife|更难的野生动物* -harder-farming|更难的农作* -waterproof -entityculling-unofficial@entitycullingunofficial|实体渲染机制优化:非官方版 (EntityCulling Unofficial) -@sync-projecte-knowledge - - -craft-vania -lotrextracoins-for-1-7-10|额外魔戒银币 ([Legacy] LotRExtraCoins) -genst -ae2-network-analyser -mxtune -customui|自定义UI (CustomUI) -deadly-monsters-patched -glodium@ -aether-delight|天境乐事* - -dungeonz@ -cazfps-axolotls -easy-breeding-tfc -paperfixes@ - -fishing-bot -progression-tweaks -whitelistfixer@ -fleshz@ - -depths-of-madness -tree-lib -@moehreag-legacy-lwjgl3 -real-camera@|真实相机* -unofficial-mod-name-tooltip-backport|模组名称显示:非官方版 (Mod Name Tooltip Unofficial) -custom-health-bar@ -lotrimprovements|魔戒改进 (LOTR Improvements) -mousekeyinventoryfix@ -visible-offhand@|可见副手* -phosphorcrashfix@phosphor-crash-fix -sound-physics-remixin|籁* -hextended-staves@ -aquaculture-delight@|水产乐事* -vics-point-blank@ -occultism-kubejs@ -tetra-extras@ -anilink -overworld-netherite-ore¨@overworld-netherite-ore|Overworld Netherite Ore - 已失效 -@rebindmykeys -keybind-description-fix -kappas-forgelin -flesh-mod - - -create-bitterballen@ -glowing-illagers@ -heads@ -epicdmcbossdante -step@ -wildist@ -hiccups-legacy -slave-knight-gael -gwyndolin-dark-souls-boss -mceconomy2 -forgeservertools|服务器工具-核心 (ServerTools-CORE) -@replay-fps -quark-delight|夸克乐事* -mmm-lib -@crabmtr-transit-plus|螃蟹的MTR扩展 (CrabMTR Transit+) - -create-design-n-decor@ - -enviromine-lite@|更多生存要素:精简版 (EnviroMine Lite) -knaves-needs@ -azurelib-armor@ -@container-tooltips -magical-jewelry -epicsoulsbosses -epic-puss-in-boots -soul-like-npc -epic-empires¨@epic-empires|Epic Empires - 已失效 - - - - -prefabricated@ -artorias-epicfight-addon -soul-like-demons-plus-epic-fight-monsters -dark-spirit-dark-souls-system-epic-fight-addon -soul-like-mobs -untranslateditemsaddon-alsofluids -better-quest-pop-up@ -@simple-hud-utilities -kiln-fabric@kiln -tetra-niche-materials -the-accurate-backrooms -create-trains-on-trains@ -@campfire-torches-plus -@armor-rack -flux-networks-fabric@flux-network-fabric -@surface -poof-sounds@ -crash-pipe@ -gradeus-epic-fight-addon-soul-like-boss -zombie-more@zombies-more -gunscraft|枪械工艺 (Guns Craft) -audino@ -tabbychat-unofficial@ -odyssey-quests@ -flapjacks-economy -@onion-onion -relics-vivid-light-addon@ -tofucreate@tofu-create -luminite-sunilite -better-formatting-code -@apeeling -@bubble-boots -silkablooie@ -@belly-flop -@milky-way -@pet-shop -bed-is-never-too-far-away -create-oxidized@create_oxidized - -green-soul -everyxdance@|一起跳舞! (EveryXDance) -applied-flux|应用通量* - -tics-delight@tinkers-delight|匠魂乐事 (Tinkers' Delight / TiC's Delight) -unnamed-desert-structures@unnamed-desert -bloomingnature@lets-do-bloomingnature|绽芳自然 (Let's Do: BloomingNature) -waila-inhibitors@ -thingamabobs-and-doohickeys -waila-events@ -march-of-the-ents|恩特的进军* -rndtp -in-world-buoyancy -@simply-starminer -macos-input-fixes@|MacOS 输入修复 (MacOS Input Fixes) -@maxhealthfixfixfix -@astronomical - -@millet-delight|小米乐事 (Millet Delight) -telos@|终焉* -magical-torches@ -dynamical-compass@ -better-questing-lord-of-the-rings-addon|更好的任务-魔戒扩展 (Better Questing - Lord of the Rings addon) -dimension-teleport@ -better-azalea -tetratic-combat-expanded@ - -more-beautiful-slabs@ -tools-complement-create@create-complement - -biome-beans -cats-workshop -soulless-steeds -openblocks-elevator-fabric@ -aurorasdecorations@ -choups-drakvyrn-mod -abyssal-decor - -reddens-stone-lanterns@|Redden的石灯笼 (Redden's Stone Lanterns) -heaven-burns-red|红烧天堂* - -apotheosis-modern-ragnarok|神化:现代诸神黄昏 (Apotheosis Modern Ragnarok: Zero) -@bedgoboom -block-properties|方块属性* -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¨@leftist-potions|Leftist Potions - 已失效 -more-delight-fabric@more-delight|多趣乐事 (More Delight)¨more-delight-forge|多趣乐事 (More Delight) -mceconomy3 -@antique-atlas-4 -pollution|污染* -tinted-campfires@ -additionalstatus -epic-knights-slavic-armory -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@|雾中人 (The Man From The Fog) -sawmill@universal-sawmill|锯木机* -@savemod -@dudewhatsmygpu -create-wizardry@ -netherite-extras@ -wfs-cave-overhaul@ - - -cit-resewn-jsonlagpatch@ -geckoanimfix@ - -mekanismecoenergistics@mekanism-eco-energistics -waila-blacklist|Waila 黑名单 (WAILA Blacklist) -item-blacklist|物品黑名单* -continue@ -the-dawn-era@|黎明纪元* - -tridents-n-stuff@ -create-hand-crafting@ -@canary-safety -@softer-pastels -@rainbethunder -create-easy-structures@ -sound@ -skinshuffle@ -reboot-lovelyrobot@|萌化机器人:重启 (Reboot LovelyRobot) - - - - -farmers-delight-tfc@ -even-more-realistic-ore-veins -ad-astra-extra -underground-bunkers@ -minemath@ -weapon-leveling@ -rather-more-potions|稍多药水* -museum-curator@|琳琅满目* -pixel-hud@ -@immibis-macroblocks -@heater -natures-melody@|自然旋律 (Nature's Melody) -astemirlib@ -create-unbreakable-tools@create_unbreakable -timeless-heroes@superhero -sky-origins@sky -glitchcore@ -light-level-overlay-reloaded -eirin-yagokoros-pharmacy@eirin-yagokoro-pharmacy|蓬莱药局 (Eirin Yagokoro's Pharmacy) - -tfc-ore-excavation -tac-interact-key|TAC交互优化 (TAC Interact Key) -@cement - -@igfileeditor -tide@|潮汐* -taiga-replant-replant|匠魂合金附加二次重栽版 (TAIGA Replant Replant) -salmons-genesis-reincarnation -loot-bundles@ -optifine-check -tfc-ie-minerals -looking-at - -rftools-continuation -better-with-everything@ -create-clockwork@ -lomlib - -@old-and-new -sparkly-pants@ -nether-sheep@|暗黑羊* - -light-level-description -set-home-waypoints -leaky -curse-of-pandora@|潘多拉之咒 (Curse of Pandora) -champions-rotn-edition -tempest@ -simpledifficulty-for-underdog -@proxy-compatible-forge -tally-master -hexagonal-heresy -hardcore-spelunking -dark-menagerie -icarus-mod -ars-knightsnmages@epic-knightsnmages¨epic-knightsnmages-fabric -hotai|绷带* -zeta@ -taxtowncitizen -killer-rabbit-transformation@killer-bunny-tweaks|转化杀手兔 (Killer Bunny Tweaks) -bronze-viking - -astikor-carts-redux@astikorcarts-redux -third-person-shooting@third-person-shooting-zero|第三人称射击:零 (Third Person Shooting: Zero) -sight|视域* -@the-first-city -threetag-palladium@|钯 (Palladium) - - - -permanent-status-effect@permanent_status_effect|永久状态效果* - -world-play-time@ -ikwila-i-know-what-im-looking-at -experienced-crops@experienced_crops -medieval-seedbags -fusionutil - -@compact-machines-infinite|压缩空间:无限 (Compact Machines: Infinite) -thaumic-sanity -tfc-thermal-deposits@tfc-volcanoes -animals-trap-for-tfc - -zzzzz-custom-configs -weird-happenings -nbc-heroes@ -melody@ -cut-through@ - -anvilfixreborn@anvil-fix-reborn|铁砧修复重生 (Anvil Fix Reborn) - -apothic-curios -hbm-ntm-lucky-blocks -thaumtweaks -no-baby-zombies@ -combat-nouveau@ -@hanging-on - -@lazy-mystical|神秘农业:懒人 (Lazy Mystical) -udlede@|港口* -hammer-time -hammerz -@pickup|物品框交互优化 (Pickup) -livingadventuretrails -suggestions-api@ -colorful-subtitles@ -dashing-dashboard -mod-control|模组控制* -extended-potions -dimension-inventorys|维度物品栏* -dimension-rules|维度规则* -erroring-entity-remover-reforged@eer-reforged -@vs-tournament|瓦尔基里天空:竞赛 (VS: Tournament Continued) -fabricated-exchange@ -more-variants-and-biomes -badoptimizations@ - -genshinimpactmod -diagonal-walls@ -gravestones-die-classy-updated -osog-city-cars -immersive-vehicles-iav-parts-pack -tfmg-virtual-oil-deposit|工业长路:虚拟油田 (TFMG: Virtual Oil Deposit) -@alinlib -croparia-if@|矿石魔种 (矿石作物/魔种之咏 IF版) (Croparia-IF) - -@actionlib -simple-close-button@ - - -godzilla-rising -create-netherless@ -noguievolution@no-gui-evolution|沉浸进化 (NoGuiEvolution) -baseball-bats -tfc-weather - -conrad@ - -nendermoo -forgedcarpet@ -framed -gear-core@ -hideasterisk@hidemodded|隐藏“已修改” (HideModded) -monster-eggs@ -rain-shield@|驱雨盾* -cerbons-better-beacons@ -@funny-roulette -@worldeditcui-forge -better-loot@ -trique-api@ -lets-do-addon-structures -create-recycle-everything -tfc-ambiental-second-edition@ -@somemusicdiscs -gimmetime -@fuzzy -helpfixer -@litemoretica -@shiftingwares-villagerconfig-addon -@colored-lamps -@expansive-lighting -drippedout@dripped-out -easter-rabbit-life@ -sticker-frames@ -tnt-slimes@ -armored-redstone@ -bismuth-colors@bismuth-2|铋 (Bismuth) -killbind@ -universal-clock-hud@ -portaldupebegone@ -@teabridge -missions@ -votemission@ -immersive-vehicles-automobilwerke-schwikau-veb -cheesemaking -cardiac@ -materialtweaker@ -whirlwind@ -warden-tools@ -royal-guard|皇家守卫* -@the-mighty-architectury -themoreloyaltrident@|更忠诚的三叉戟/移运兜转 (TheMoreLoyalTrident) -notenoughresources -elenai-dodge -xenon@xenon-forge|氙* -riftstorm-rpg -data-api -better-babies -morecreativetabs-forge-fabric@morecreativetabs - -@shove! -sunflower-delight@|向日葵乐事* -mystias-izakaya@mystiasizakaya|夜雀乐事* -carpet-everything - -lets-do-brewery-farm-charm-compat@lets-do-brewery-farmcharm-compat|盛节精酿 (Let's Do Brewery) - [作者推荐]2.0.0+¨lets-do-brewery@|盛节精酿 (Let's Do Brewery) - Legacy,作者已停止维护 -hephaestusplus@ -re-dimension-stages|维度阶段重制版 (Re-Dimension Stages) -lemoned@lemoned-(farmers-delight) -@horizonlimit -fallen-paladins-and-priests - -@rgb -@virtualpump -everymole@ -mutant-iceologer@mutant-iceologer-mod -@days-gone -@extra-loot|额外战利品 (Extra Loot) -relics-of-gaming-continued@|游戏遗物:延续* -endermen-plus@ -tiptapshow@ -villager-gunners - -epic-fight-infernal-gainer -prodigy-mechanics -just-an-end-anchor@ - -memory-usage-title@|标题显示内存* -string-utilities@|字符串工具* - -sweeper-maid@|清洁女仆* -more-enchantments_|更多附魔 (More Enchantments) -bow-scope - -fpv20 -molten-metal -selling-bin@ -tomtarus-cobblemon-farmers-delight-tweaks -cobblemon-o-plenty -tomtarus-cobblemon-immersive-engineering-tweaks -abuseless-hardcore@ -@wizstacks32 -tconjei@ -new-xp-ore -@not-responding -nocubes-wilderness - -copper-great-swords -@better-falling-block-particles -zume@ -mobtimizations@ -illager-trader@ -@damagenumbers -toolendxp -spiritmancy@ -create-vintage-improvements@ - -dragon-craft-quest -sword-of-gods -horse-stonks@ - -pillarger@ -ars-additions@ -visualsound -@cyclic-crash-fixer -lavender-api@lavender - -cheatutils-by-zergatul -jump-sounds¨@jump-sounds|Jump Sounds - 已失效 -kirin@ -llamapalooza -instant-drown -acsguis -game-phase@|游戏阶段* -no-zombie-pandemic -witcheroo@ -totallybalancedcreativeflying - -heterorustichromia -video-extension-for-fancymenu-forge¨video-extension-for-fancymenu-fabric -easy-npc@ - -the-dawn-era-delight@|黎明纪元乐事* -dynamic-craft -startinginventory -wireless-speakers|无线扬声器* -sagerfx@|SA特效 (SagerFX) -@noteit -jewelrycraft-2|珠宝工艺2* -fallflyinglib -enchantable-spike - -xaeros-map-chest-tracker-integration@ -warden-horn@ -too-many-efficiency-losses -srp-addon-cotesia-glomerata@|SRP:寄生蜂 (Scape and Run Parasites Addon: Cotesia Glomerata) - -damage-lock|磁场天锁 (DamageLock) - -modular-materials@modularmaterials|模块化材料* -minepal -custom-portals@|自定义传送门* -dirty-lens@ -@improved-anvils -styled-player-list@styledplayerlist -create-love-war@ - -chainmailed@ -serious-player-animations@ -abridged@ -hexvr@ -hearths -prey-effect -venturer@ -wheres-my-wither-storm -alexs-mobs-interaction@|Alex 的生物:交互* - - - - -myworldgen -medieval-buildings-end-edition@ - -orpheus@ -create-sweets-and-treats@ -klsts-beyond-netherite - -refined-polymorphism@ -cave-dweller -dweller-dweller@dwellerdweller -thermals-delight -@advanced-hud -better-farmers-combat - -simple-butchery¨@simple-butchery|Simple Butchery - 已失效 -butchery@ - -enchantment-reveal@ - -copycats@|机械动力:伪装方块+ (Create: Copycats+) -the-great-alchemical-compendium@ -desperate-measures¨@desperate-measures|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 - -modern-delight@|现代乐事* -better-main-menu@bettermainmenu - -more-wizards@more-wizards-more-magic-series -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@star-wars-planets -amethyst-equipment@ -the-whisperer - -epic-vinland-saga -cat_jam@ -remastered-structure -spacore -fancyvideo-api -goatman-jar-v2-dweller@the-goatman-dwller - -mineral-overhaul-shellstone-tuff -clear-gpu-cache@|清除GPU缓存* -stalker-creepers -the-ghoul-remastered@ -@transitmanager -integrated-scripting@ -@nyc-mtr -@mtr-utility -creativetabsearch@|创造物品栏检索 (CreativeTabSearch) -moonbetween@|在月亮之间 (Moon Between) -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) - - - -kubejs-irons-spells@isskjs -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-jar-dweller -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@|弹道估计* -@foxcore|狐狐核心 (FoxCore) - - - - - - -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@arborfirmacraft-(afc)|林海传说 (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|Lucky Clover - 已失效¨@lucky-clover! -@better-portals|更好的传送门 (Better Portals) -social-distance@|社交距离* -gt@gtnn -hunger-plus@|饥饿+* -melee-ex-machina-meexma@melee-ex-machina - -arc@ -cores@ - -citymod-traffic-and-life@citymod|我的城市:交通与生活 (CityMod:Traffic and life) -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@|变种与冒险 (Variants & 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@|机械动力:瀚海雄心 (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村庄-二轮世界 (Jerotes Village - Second Round World) -@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@|音乐控制* -stellarcore|星核 (StellarCore) - -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@ -@underworld-magic-craftsmanship|幽法工艺 (Underworld Magic Craftsmanship) - -callable-horse-unofficial-fabric-port|召之马来 Fabric版 (CallableHorse Unofficial Fabric port) -@better-combat-experience|更好的战斗体验 (Better Combat Experience) -shiny-horses-forge-enchantable-horse-armor@shiny-horses-forge -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-import-export-card@|AE2输入输出卡 (AE2 Import Export Card) -@magick-experience - -@repairable-disc-11 - -@fabric-permissions-api -@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|幽灵 (Ghostly) -tectonic-tweak -forge-essentials-client@ -@world-host - -spit-splat@|唾溅兽* -maced|重锤一击* -nether-villager-trader -@no-exp-enchanting-reimagined -odyssey-claims@ -odyssey-allies@ -giacomos-travelogue -giacomos-maps -descension - -@startup-time|启动时间 (Startup Time) - - -toggledpickup|拾取控制 (Toggled Pickup) -farmers-delight-refabricated@|农夫乐事:重织 (Farmer's Delight Refabricated) -village-nullifier-terralith-mod - -structure-credits@¨structure-credits-fabric-version -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@ - - -momento@ -odyssey-roles@ - -waystones-jawsawn-fork|传送石碑:Jawsawn版* -nautilium-spirits@|鹦鹉螺重置版* - -@telluriumforge -aquatweaks|水下微调 (AquaTweaks) -aquatweaks-compat|水下微调:兼容 (AquaTweaks Compat) -@potions-re-glint -simpletextoverlay@ -bountiful-fares|丰饶食记* - 2.0.0 及以上¨@bountiful-fares|丰饶食记 (Bountiful Fares) -@ancient-debris-tweak|远古残骸微调 (Ancient Debris Tweak) - - -deer-jar-dweller -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@|血族乐事 (Vampire's 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)¨@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 -gtnhs-forgelin@ -rose-gold-equipment@ - -pantheonsent@ -@yukkuri - - -@moddetectionpreventer -dramatic-spawning -mc-mods-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-eye-of-cthulhu@look -@salmonberry-addition -pet-collecting@ -@yummy_glass - -totallybalancedfallflying -giacomos-experience-seedling -@server-notify -config-api¨@config-api|Config API - 缺少部分 -nethers-delight-refabricated@|下界乐事:重织* -@pumpkin-pie-delight -runiclib@ -dragon-mounts-more-dragons@|龙骑士附属:更多龙 (Dragon Mounts: More Dragons) - - -hey-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-requirements -enchantment-enhancements@ -mo-enchantments -soul-like-enchantment - -@blockbench-import-library -mrcrayfish-furniture-mod-rebuilt -btfixes -vmfixes -pillar-patched -novalogin|新星登录 (Nova Login) -tfc-desire-paths@ -tfc-ore-washing - -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|Alex 的洞穴:物品 & 鱼雷 (Alex's Caves: Stuff & 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@ -tinkers-innovation@tinkersinnovation|工匠创新 (Tinkers' Innovation) - -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@laser-bridges-and-doors -lukis-grand-capitals@ -fabric-create-netherless -create-connected-fabric-experimental@create-connected-fabric - -wastify@ -starter-structure@|初始建筑* - -mobblocker¨@mobblocker|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 - -uranus@ -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-expanse@ -tinker-delight@tinkers-construct-delight|匠魂乐事 (Tinkers Delight/Tinkers Construct Delight) -barbeques-delight@|烧烤乐事 (Barbeque's Delight) -coffeecraft-by-blockbrothers@coffeecraft -hearty-meals@ -@minecar-drill - -enderfake -@alwaysonline - -@awakenedsilverfish|蠹虫觉醒了 (AwakenedSilverfish) -rawore-on-1-12-2@rawore_on_1.12.2|1.12.2的粗矿 (rawOre_on_1.12.2) -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 -pineapple-mending|经验修补:凤梨版* -@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 -bitter-brews@ -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|FSit - 已停更¨@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@ -calamity-sn -bodyhygiene -cafes-birding@ -kafs-valentine-special@ -create-deepfried@|机械动力:油炸 (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 -creature-whisperer - - -create-molten-metals@ -create-optical@|机械动力:光学* -@farmers-delight-plus - - - -mob-battle-music@|战斗音乐* -concerto@|协奏曲/一起听* - -@invisible-frames-for-forge -factions-and-curiosities@|派系与奇遇* -@anyfps -create-amazing-trading@ - - -westeroscraft-worldeditcui - -durability-display@ -hardrock-samples-tfc -@invhud_configurable|物品栏HUD+ 药水显示支持 (InvHUD_Configurable) - - -treps-cars@ - -back-up-beds@ - - - - - -mountain-sea-and-continent-two|山海大陆 (Mountain Sea and Continent) - -vinery-tfc -tkbs-campfires - - -whispers-of-the-wendigo@ -quartz-elevator@ -elytra-utilities@¨elytra-utilities-fabric -davids-furniture|大卫的家具 (David's Furniture) -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@|繁殖药水* -@servuxforged -loading-tips|加载提示 (Loading Tips / Pineapple Tips) -@highernether|更高的下界 (Higher Nether) -better-one-block|更好的单方块* -the-fletching-table-mod@ -@create-militarized - -customemoji|自定义表情 (CustomEmoji) -sword-soaring|史诗战斗:御剑凌虚 (Epic Fight - Sword Soaring) -bigger-ae2@ -scalar¨scalar-legacy -trials-chambers-backport@ -blus-sign-pack-mts-iv -alexs-mediumcore@ -sherdsapi@ -@kontraption|精致机械 (Kontraption) -musketeer-illager - -daker-acg|Daker ACG工艺 (DakerACG) -bananarangs@ -remorphed@ -particle-core@ -fermiumbooter@ -ytech@ -better-biome-reblend@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@ -@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 - - -@myceliumlib|菌丝 (Mycelium Lib) - -cataclysmic-illagers -witcherypatch@|巫术补丁 (WitcheryPatch) -pin -simple-pings@ -great-scrollable-tooltips@ -waterframes@ -eugenes-whistle-spur|友止殷的马哨和马刺 (Eugene's Whistle & Spur) -quickquark|畅启速始/夸克疾速启动 (QuickQuark) -minecraft-mineralogy -seed-delight@|种子乐事* -transmog@|幻化* -nuclear-guitars -cubic-racers -lotr-ucp|魔戒非官方兼容性补丁 (LOTR UCP) -delightful-sandwiches@ -shader-fixer@|光影修复 (Shader fixer) -resiever@ -cartload@ -stewing-baking@|炖与烤 (Stewing & Baking) -am2playground@ -astrocraft-mod@astrocraft - -neat-shaders-fix@|极简血量显示 - 光影修复版 (Neat - Shaders-Fix) -worldtooltips-shadersfix@|掉落物信息显示 - 光影修复版 (WorldTooltips - ShadersFix) -ars-repairing|新生魔艺:修复纤维强化* -options-enforcer@ -macaws-bridges-biome-o-plenty|Macaw 的桥梁:超多生物群系附属 (Macaw's Bridges - Biomes O' Plenty) - 已被更新版顶替¨@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@ninjinentities -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) -@non-update-reloaded|不再有更新重制版 (NonUpdate Reloaded) -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 -ninjinentities-unofficial@|Ninjin Entities-非官方版 (ninjinentities-Unofficial) -sanguine-arsenal-reforged|血染武装重铸版* -respawn-obelisks@ -flintandsteel-improve@ -forge-zombie-plague-mod-2-wip@zombie-plague-2-hardcore-zombie-apocalypse|僵尸瘟疫2 (Zombie Plague 2) -colored-grasses -more-default-options -@livelydanmaku|缤纷弹幕 (LivelyDanmaku) - -treecapitator-updated|砍树更新版* -@offhandlights|副手光源 (Offhand Lights) -dental-handbook@|牙科手册* -prehistoric-nature-jurassic-dimension - -many-more-structures@¨many-more-structures-depricated@more-structures -mobs-are-friends@ -polytone@ -@calcium-fps|钙 (Calcium) -delightful-burgers@ -cinderloe-project -lotweakr|魔戒微调 (LOTweakR) -lotr-renewed-extended@|魔戒:复兴-拓展 (LOTR: Renewed Extended) -lotr-companions-renewed-addon|魔戒:同伴 (LOTR: Companions) -dvs|自定义魔戒小建筑 (DVS) -mffs -lotr-extended|魔戒大陆拓展 (LOTR Extended) -bitcrafting -fart-shit-pee -statuseffecthud-updated|状态信息显示更新版 (StatusEffectHUD Updated) -capejs@ -advanced-machines-patcher|高级机械补丁* -@immersive-tooltip|沉浸式提示框 (Immersive:Tooltip) - -sound-controller@ -cagerium -advanced-inventory-mod@ -rolling-down-in-the-deep@ -dwarven-realm|矮人诸国* -renewed-eras-of-arda-addon|阿尔达纪元:复兴 (Eras of Arda: Renewed Addon (First and Second Age)) -legendary-item@|魔戒传说物品* -lotr-middleearth-tweaks@middleearth-tweaks|中洲微调 (MiddleEarth Tweaks) -thaumcraft-integration@ -reach-display@ -gravitation-suite-patcher -anti-rat-dungeon -modchu_defaultmodelset -create-storage@fxnt-create-storage -avaritia-item|无尽特效物品* -kingdom-of-rin-regions@regions -durability-speed-legacy-backport -inventory-on-death-mod -berries-cherries-delight@berries-and-cherries -silents-delight@|幽匿乐事 (Silent's Delight) -darwin-sprinting-system|达尔文疾跑系统* -camera-overhaul-reforged@ -monolib@ -@pyrofrost -animal-armor-trims@ - -better-safe-bed@ -modchu_models -ice-and-fire-spellbooks@ -exlines-fishing@ -cavernous-delight -@steep-surface-fix - -arthropocolypse@ -@kaleido - - -combat-skill|战斗技巧* -life-is-precious|生命是宝贵的 (Life is precious) - -advanced-skills@|进阶技能* -nuts-delight -vegetables-delight|Vegetables Delight - 已失效¨@vegetables-delight -enderpack@ -ingame-mod-configs|游戏内模组配置 (InGame Mod Configs) -playertag|玩家标签 (PlayerTag) -hide-names|隐藏名称* -camo-suits|迷彩套装* -vtubruh-lotr-mobs-new@vtubruh-lotr-mobs|Vtubruh的魔戒生物 (vtubruh LOTR Mobs) - - -@create-more-features -armadillo-scute-armor@ -new-shield-variants@ - - -way-much-faster-oxidize-reborn@ -bn-blood-particles@ -bn-weapons@ -ecotones@ -froglins -create-armor-trim -slashblade-resharped@|拔刀剑:重锋 (SlashBlade: Resharped) -spawn-mod@ -@smooth-swapping-1.20.4-port|平滑转移 1.20.4 移植 (Smooth Swapping 1.20.4 Port) -@create-tab-fix -scape-and-run-origins@srp-origins -origins-extra-keybinds@origins-extra-keybinds-fabric -epic-knights-addon@ - -@arknights-skadi-orca-plushie|【明日方舟】斯卡蒂的虎鲸抱枕 ([Arknights] Skadi Orca Plushie) -sona-survival-101|唢呐生存指南* -@more_villagers -cult-of-the-wither -clochetweaks - - -@multiproto -frostbytes-improved-inventory@ -mekanism-extras@mekanism_extra|通用机械:扩展* -leaf-beds@ -unidentified-enchantments@unidentified_enchantments -protection-pixel|机素防护 (Create: Protection Pixel)¨@protection-pixel|机素防护 (Create: Protection Pixel) - 已失效 - - -createdpcompat@ - -lava-waterblock - -constant-music@ -supercore -extreme-reactors-create-compat -modchu_playerformlittlemaid -totally-lit@ -mo-shiz-mod -aetheric-tetranomicon - -arda-addon|阿尔达拓展* -@potionwarning -a-good-place@ -aether-protect-your-moa@ -advanced-rocketry-2 -compostimprove@ -superb-steeds@ -coal-piece - - -@mechmonstrosity|机械巨兽 (MechMonstrosity) -slash-illager@ -@create-spawnerboxer|机械动力:拳击刷怪笼 (Create: SpawnerBoxer) -skeletalband|骷髅乐队乐谱 (SkeletalBand) -alexs-caves-entropy|Alex 的洞穴:熵 (Alex's Caves:Entropy) -mekanism-explosives|通用机械:炸药* -@minimal-coords-hud - - - -avaritiareborn@|无尽贪婪:复兴 (AvaritiaReborn) -cherry-shrimp@ -pick-command@|俺拾的指令* -regalliv -extra-addition-s@extra-additions - -@amethyst-shield|紫水晶盾 (Amethyst Shield) -@plateplate|板板 (PlatePlate) - - -@difficulty-tweak|难度调整 (Difficulty Tweak) - -@herbal-delight - - -@compatlib|旧版本兼容工具 (LegacyCompatibilityUtils / CompatLib) -warriors-of-past-epoch -the-ghast-cow@ -@alternate-current-unofficial -birds-on-a-wire -no-hurt-animation -incense -wild-lands-2 -hullabaloo@ -invinci-dogs-ssp -@noglow|禁止发光 (noglow) -timeless-and-classics-zero@|永恒枪械工坊:零 (Timeless and Classics Zero) - -@concentration|专注 (Concentration) -terra-curio@|泰拉饰品* - -cobblemon-counter@ -cobblemon-move-inspector@ -cobblemon-spawn-notification@ -cobblemon-pokenav@ -cobblemontrainers@ -the-ink-arena@ - -epicfight-integration|史诗战斗·集成 (EpicFight Integration) -@stop-spiders-from-climbing -kubejs-enderio@ -polymorphic-energistics@ -war-of-the-ring-mc|魔戒大战 (The War of the Ring MC) -redstone-clock-mod@|红石钟 (Redstone Clock) -create-cobblestone@ -@another-pickaxe -selfexpression@ -electricalcraft -@elecfurn -what-is-stone-colorful-caves@what-is-stone-(colorful-caves) -vtones -heavy-inventories|物品负重* -vs-addition@ -gravity-torch@ -lifesteal-forge-fabric@lifesteal-mian -mores-by-its-infinite -dragonite-gear -lets-do-addon-fluids@ - - -@just-glowing-buttons -rats-hats -biome-reactors -mystical-agriculture-tiered-crystals@ -tpaplusplus@tpa++ -warlerys-hq -call-of-yucutan@|尤卡坦的呼唤 (Call of Yucatán) -redman@|红超人 -lets-do-addon-compat@ - -worldeditcui-forge-edition -slime-delight|粘液乐事* -darkcap@ -@ryoamium -quality-equipment -seals -nocubes-better-smoker -@shutdown-on-death -mekanism-energistics -ae2-network-visualiser -ahznb-sword-plus -anbu-bingo-book-for-ahznbs-shinobicraft -ahznbs-naruto-mod-reroll -xycraft-override -xycraft-machines -xycraft-world -battlemusic@ - -@embyui -engineered-golems -axifier@ -renderjs@ -@enchantment-compat -dehand@ -jadecolonies -@cobblemon-mike-skills -diamond-star-combat@ -modern-ae2-additions@ -create-metallurgy@|机械动力:冶金学 (Create: Metallurgy) -@client-info-fix -the-shy-guy -@tea-time -@cobbreeding -@cobblemon-myths-and-legends-sidemod -@rctmod -create-klinks-n-klangs@klinksnklangs -mo-than-enough-guns@ - -forge-creeper-heal|Forge 苦力怕坑修复* - - -@momos-skiphand|莫莫的折跃之手 (Momo's SkipHand) -curse-of-disintegration -adventure-backport|冒险模式向后移植* -@oreganized-refabricated|井然有矿:重织 (Oreganized Refabricated) -yosby -@zundamod -common-network@ -addurdisc@|自定义唱片 (AddurDisc/Add your disc) -enigmatic-addons@|神秘遗物扩展* - -@bloodscythe -ddgourmetbattles@dungeons-delight-gourmet-battles -stronger-potions@|更强的药水* - - -@particular - -reforgedplay-mod -sqript -natures-delight@|生灵乐事 (Nature's Delight) -reimagining-potatoes@ -@legacy-resource-pack-adapter -insane-stamina -bren@ -@power-hud -plushables@|毛绒玩偶* - - - -@rcspeedbuild -@staff-of-the-king-orange|橙王的权杖 (Staff of the King Orange) - -path-under-gates -ojs-guilds -command-macro-key@|命令宏键* -realm-rpg-quests-rewards -@roadworks -unlucky-tnt@ -fastboot¨@fastboot|FastBoot - 已失效 - -tardis-refined@|改良的TARDIS (TARDIS Refined) -ocean-villager-trader@ -@precise-manufacturing|机械动力:精制工艺 (Create: Precise Manufacturing) -@create-new-age-alexs-caves-integration -create-kryeit@ -animationoverhaul@ -starbunclemania - - -display-qien@ -@village-healthcare -cubic-villager -@morecursors|更多光标 (MoreCursors) -true-infinity -nukateams-gun-lib@ntgl -fantastic-biomes-cave -nukacraft@thenukacraft -enchantment-limiter -emi-ores@ -@bread-skin-mite|面包皮 (Bread Skin) -extra-gore -chassiscore@ -@spit-splat-fabric|唾溅兽 Fabric 版 (Spit Splat [Fabric]) -linweiyun-mod@moderation -normalcore@ -appliede@ -waystones-teleport-pets@ -@sneaky-link -create-mortar@ -forgelin-continuous@ -@ripples-of-the-past-killer-queen-addon|RotP:杀手皇后附属 (Ripples of the Past: Killer Queen Addon) -ninjin-knockback-dbc-by-hedaox -wings-3 -dstathud@ -opticmanager@ -ribbits@ -@actually-camel - - - -raws-visual-keybinder -synthetic-products|合成配方* - -scoreboard-tweaks@scoreboardtweaks -rsinfinitewireless -rustic-engineer@ -artsandcrafts@ -mermaid-legend|人鱼传说* -endcake|末影蛋糕 (EndCake) - -@mcsudo - -scp-remake -@scp-fallen-foundation - -create-heat-js@ -createaddoncompatibility@ -more-difficulty-levels -alternacraft -sheep-squeak@ -fabric-simple-animated-guns -a-v-a-in-minecraft@a.v.a-alliance-of-valiant-arms-guns -coordinates-display@|坐标显示* -@acrylicraft|亚克力窗口 (AcryliCraft) -towelette@ -shc-pvz-zengarden@ -unusual-foods-delight|奇食乐事 (Unusual food's Delight) -re-fruitful -dark-rites-2 -advitam-addon-for-requiem@memento-mori -potheads - -skyfall-meteorites@ -fancyclear -pathfinders-spade -legacy-minecraft@legacy4j -festive-creepers -essential-features -piston-control-forge¨piston-control - -blahaj-restitched@|布罗艾重制版* -@tabbychat-2-reforged -lithostitched@ -pogfish -launch-time@|启动耗时* -killer-table -trading-table -winter-decorations -fancy-snowy-weather -winter-ambience -dralards-rock-candy-mod - - - -explosion-breaks-no-block@|爆炸不破坏方块* -via-romana@ -lithic-coins -dynamic-trees-for-natures-spirit@|动态的树:自然之灵附属 (Dynamic Trees for Nature's Spirit) -gore-edition -christmas-wish-in-a-bottle -chiseled-bricks -unethly-origin@ -dimensional-totem@ -placeable-gunpowder -library-for-ar-reworked - - - - -craftdev-core -costume - -borzoi-dogs@ - -nether-exorcism@nethers-exorcism -integrated-villages@ -taxdeepvillager -@voxelprints-desert -music-on-demand -leadable-bats -canes-wonderful-spiders - - -scribble@ -text-formatting-everywhere@ -extended-item-information -mod-sound-volume-options@mod-volume-options - -teams-hud -@tpm|传送管理器 (TeleportManager) -@camera-obscura -wzorescanner -@potion-recipes -wither-totem@wither-skeleton-totems -@player-bones - -more-apples-hyj|更多苹果 (More Apples) -fancy-enchantments@|奇异附魔* -ash-of-sin-adventure-dimension|罪业余烬:冒险维度 (Ash Of Sin: Adventure Dimension) -push-forward@|猪突猛进* -ymn|你现在是我的了! (You're Mine Now!) - 已失效¨@ymn|你现在是我的了! (You're Mine Now!) -thermal-endergy@ -mekanism-turrets-fences@mekanism-turrets -nuka-cola-classic -draconic-machinery -@voxelprints-halloween -iap-gobber@ -iap-botania@ -iap-industrial-foregoing@ -iap-silents-gems@iap-powah - -iap-omega-craft -iap-mekanism -industrial-agriculture-plugin-silents-mechanisms - -roads-and-roofs-tfc@ -taxvillagearchitect -taxoceanarchitect -nethers-flora - -microcosm -chinese-flying-island-tower@ -@netherite-tools-for-crackers-witherstorm-mod -better-maces -jack-o-launcher -the-otherworld-mod -craftingxp@ - -dmmttba@ -fzzy-config@ -no-shield-delay@ -musicpower@|音乐之力 (MusicPower) -macrocraft@ -camerapture@ -simple-voice-radio@simple-radio - -adorned -fence-on-slab@fence_on_slab -monochromatic-blocks@ - - - -archaicfixfix -@inventive-inventory -boxlib@ -the-shattered-goddess-mokels-bossfight-saphyra -resource-explorer@resource_explorer -@patcher -autoreconnectrf@ -disable-accessibility-screen@ -@fly-high - -@fly-apple|飞苹果 (Fly Apple) - -@hoyoi -rogues-and-warriors@ - - - -tfc-support-indicator@ -tfc-poisoned-drinks -smartercontraptionstorage@smarter-contraption-storage|智能动态结构存储 (SmarterContraptionStorage) -lexiconfig@ - -@advancementsfullscreen|进度全屏 (AdvancementsFullscreen) -luckys-wardrobe@luckyowls-wardrobe -@forkkit -more-affordable-than-ever-never-too-expensive@more-affordable-than-ever -what-am-i - -@camoverlay -autoplant|自动种植 (AutoPlant) -@skip-backup-screen -@polysprint -@crashpatch -@vanillahud -@damagetint -@polyblur -@colorsaturation -@hitbox -lains-random-creation|LAIN的随意创作 (Lain's random creation) -autochefs-delight@ - -bindcommands@ -short-grass@ -stairs-but-chairs@ -yumo-compactmachines-por@|压缩空间:产量推演 (yumo compactmachines por) -dynamic-trees-for-fruit-trees|动态的树:妙趣果园 🍊附属 (Dynamic Trees for Fruitful Fun 🍊) -dynamic-trees-for-better-end|动态的树:更好的末地附属 (Dynamic Trees for BetterEnd) -dynamic-trees-autumnity|动态的树:秋原附属 (Dynamic Trees - Autumnity) -dynamic-trees-for-bloomingnature|动态的树:绽芳自然附属 (Dynamic Trees for BloomingNature) -dynamic-trees-terralith@|动态的树:Terralith附属 (Dynamic Trees - Terralith) -dynamic-trees-for-meadow|动态的树:青青草甸附属 (Dynamic Trees for Meadow) -dynamic-trees-for-beachparty|动态的树:沙滩派对附属 (Dynamic Trees for Beachparty) -dynamic-trees-for-vinery|动态的树:葡园酒香附属 (Dynamic Trees for Vinery) -tfc-aesthetics@tfc-plus-aesthetics -smooth-gui@ -offershud@ -perspektive@ -ore-harvester@ -flightassistant@ -biomefog@ -edgeless-chat-screen@|无边界聊天框* -villager-death-messages@ -@smooth-skies -clist@ -tothestarsremake@|ToTheStars重制版 (ToTheStarsRemake) -galacticraft-gravity -dragon-mounts-even-more-dragons|龙骑士附属:附加龙 (Dragon Mounts: Even More Dragons) -xplus-contingameime@|游戏内输入法 XPlus 版 (XPlus ContingameIME) -@watersource2|水源 2 (Water Source 2) -radomraidspawn|随机袭击生成 (Random Raid Spawn) -enigmatic-legacy-legacy|神秘遗物经典版* - -nco-java-legacy-lib -forge-souls-like-universe@souls-like-universe - - - -neutral-animals@ -create-upgraded-armor -fbp-renewed@ -chat-impressive-animation@|聊动魅影* - -pianocraft@ -jazzymusicality@musicality -@boids -buckshotroulette@|恶魔轮盘赌 (BuckshotRoulette) -customnpcs-unofficial@|自定义NPC 非官方版 (CustomNPCs Unofficial) -@fast-trading -simple-wooden-pipes -simplywalk@ -persistent-stuff@ -lan-operators@ -compatdatapacks@ -the-luminous-mod@ - - -burst-door-open@|破门而入* - - -chain-suspension-forge@chain-suspension¨chain-suspension -cui@ -emi-enchanting@ -clientsort@ -immersive-ui@ - -curios-continuation@ -@minekimi -blind-accessibility@minecraft-access -enchanting-tree@enchantingtree -dragon-enchants -item-placer@ -expandedworld -monster-hunter-villager@ -jcraft-eyes-of-ender@jojo-eyes-of-ender -@return-dirt-background - -@reset-keys-confirmation-screen -idle-boost@ -bettergrassify@|更好的草地 (BetterGrassify) -@lightweight-inventory-sorting -@stonecutter-gui-remastered -@loom-gui-remastered -unseaworthy@ -@chromaanvils -thermal-and-space@ -create-curios-jetpack@ -epic-knights-antique-legacy@ -viking-samurai-knight-items -barely-simple-staffs@barely-simple-staff - - -alexs-caves-delight@ -alexs-caves-adventure@ -divine-weaponry - -hook@hoook|抓钩* -fix-guard|格挡修复 (FixGuard) -@greg-caves|格雷的洞穴 (Greg Caves) -better-mob-combat@ -mob-player-animator@ -depression@|抑郁症* -more-rpg-classes@ -minimalism-leaf-decay@minimalism_leaf_decay|极简快速落叶* -biome-modifier-for-fabric@|Fabric版群系编辑器 (Biome Modifier for Fabric) -chunkloader-simple -apollyon -worldweaver@ -netherite-compass@|下界合金指南针* -the-darkness-will-find-you@ -silent-screenshots@ -cr3stal-updatet@crestal -toggle-subtitles@ -ok-boomer-zoom@ok-boomer - -@forcegl2.0-remapped - -rendi@|重生:伤害免疫机制移除 (ReNDI) -create-questing@ -@create-train-perspective -elainalike@|魔女之绘 重生:重生 (ElainaLike Reborn: Reborn) -take-back-your-sword@|收回你的剑!* - - - -travel-friendly-food-fabric-forge@travel-friendly-food -stardew-valley-food@ -minecolonies-compatibility -bettergamma@ -more-lectern-variants@ -@ase -lush-cave-trader@ -oceans-enhancements@ -xp-jellies@ -aromatic@ -onekeyminer-nf@onekeyminer_nf|一键连锁(Neo)Forge (OneKeyMiner(Neo)Forge) - -retargetato@|约谊敌众 (ReTargetato) -iceandfire-ce@|冰火传说社区版 (IceAndFire Community Edition) -tomanos-vehicle-mod -ancient-sands@ -hs-bosses -chubby-mobs@ -repair-gem|修复宝石* -better-weaponry-compatible-with-better-combat@better-weaponry -disable-front-perspective@ - - -thaumcraft-6-aspects-for-jei@ -@up-and-away - -@ripples-of-the-past-hermit-purple-addon|RotP:紫色隐者附属 (Ripples of the Past: Hermit Purple Addon) -nc-steam-additions@nuclearcraft-steam-additions -aura-cascade|气场流注* -rac-compat@ -spartan-weaponry-addon-toolkit@ -smsn@|救救我的答辩网络 (Save My Shaky Network) -sneaky-tree-growing-forge@sneaky-tree-growing¨sneaky-tree-growing-fabric -hungry-zombies -@gravity-gourds -usa-delight|USA Delight - 已失效¨@usa-delight -experience-farm -ad-extendra-dandi2k8-version|Dandi2k8's Ad Extendra - 已失效¨@ad_extendra-continuation -nebulus-juice-trader@ -cthulhu-fishing@ -large-super-potato|大型超级马铃薯* -@craft-time -the-orcs -made-in-abyss-shroombears -squinkers -mokels-bossfight-kinora -@create-high-pressure -create-framed@|机械动力:多彩边框 (Create: Framed) -trackwork@|驱动工艺* -oritech@ -the-impossible-library@ -perspective-mod-redux@ -more-cartography-tables@ -more-barrel-variants@ -wheelbarrow@ -simple-automation -better-paragliders@ -fallen-wizards-more-magic-series@ - -@whiffowisp -mango-cats -tax-tree-giant@tree-giant -taxskyvillager -compostable-rotten-flesh -villager-in-a-bucket@ -nebulus-trader-for-the-desert -nebulus-jungle-trader@nebulus-trader-for-the-jungle -mushroom-villager-trader@ -nebulus-better-portals¨@nebulus-better-portals|Nebulus Better Portals - 已失效 -resource-ghouls -avaritianeo@|无尽贪婪Neo (AvaritiaNeo) -create-legacy@ -@create-bronze-age -wind-bottle@|风瓶 (wind bottle) -lc-tech@ -minecolonies-tweaks -text-placeholder-api@placeholder-api|文本占位符 API (Text Placeholder API) -@gravity-api-fork - -@tt20 -kasugalib@ -@c2h6s-tinker|乙硫基匠魂 (C2H6S Tinker) -encounter-mob-ai-tweaker|遭遇/长驱速弑 (Encounter) -kubejs-mekanism-unofficial -@mediaplayer|媒体播放器 (MediaPlayer) -bakery-villager-trader@ -nebulus-trader-for-the-plains -mokels-more-spiders - -exposure-catalog@ -skinchanger@ - -@halflifemenu -sitting@sitting+ -forgotten-east@ -brazil-legends@ - -custom-item-despawn-duration@|自定义掉落物消失时间* -your-items-to-new-worlds@ -enhanced-boss-bars@enhanced-boss-bars-mod|更好的Boss血条* -cutetrade@ - -smoothmenu-refabricated@|平滑菜单:重制版 (SmoothMenu Refabricated) - -toexistingstacks|添加到现有堆叠 (ToExistingStacks) -@postmortal-particles -@give-me-a-new-splash-text -@less-annoying-fire -treasuredistance -affinity@ -chaos-moon -@healthindicator -@small-chisel|小凿子 (Small chisel) -@auto-sprint-fix -lets-do-emi-compat@ -health-indicator@health-indicators -aiming-fix@ -compasshud@|指南针HUD (CompassHUD) -mini-boss-boss-bars@ -berserker-rpg-class@ -fromanotherlibrary@ -mounted-pearl-bring-your-mount-along-when-you -biome-id-fixer -immortal-coral@ -immersive-guns@ -guns-plusplus -additional-rpg-jewelry@ -mekanism-ad-astra-ores@ -question-ducks-ambient-fireflies -travelerz@ -the-rise-of-minerals|矿石崛起* -gregtech-steam-additions -gregtech-nomifactory-edition -create-ethium@ethium -create-contraption-terminals@|机械动力:动态终端* - -strata-recipes -strayed-fates-forsaken -snowyleavesplus@ -shield-overhaul@ -g-weapons-mod-gargantuan-weapons-mods|G武器 (G-Weapons) -backtools@|工具后置/后背工具展示:重制版 (BackTools) -epic-fight-guandao-moveset|史诗战斗:关刀 (Epic Fight - Guandao Moveset) -epicfight-dual-greatsword -spell-checker@ -sparkle@ -@visible-traders -villagers-inventory -removehud@ -@orthocamera|正交相机 (OrthoCamera) -third-person-crosshair-fabric -@hitrange -black-moon@ -dynamic-fire-overlay@ -firorize@ -smoke-extender -@nohotbarlooping -@higher-chat -mekanism-cardboard-tooltip@ -durability-notifier@ -gregtech-extended-chemistry -centrifuge-tiers -distant-friends@ -the-world-of-herobrine -primal-storage@primalstorage -@potioncorereloaded|药水核心重制 (PotionCoreReloaded) -yamazakura-reforked|山樱之刃重置版 (Yamazakura reforked) - - -apothic-spawners - -sinocore|华夏核心 (SinoCore) -tinted-dyes@ -dynamic-trees-ecologics@|动态的树:丰富的生态附属 (Dynamic Trees - Ecologics) -craftablecapes@|可合成的披风 (Craftable Capes) -tamago@ -@clickthrough2.0 -cat-jammies-fabric@cat-jammies -open-computer-resurrected -advancements-reloaded@ -oc2r -eu-p2p-tunnel@eup2p|EU能源P2P通道 (EU P2P Tunnel) -@hold-onto-everything -ardagrass@ -geocluster@ - -@knives-construct - -updating-world-icon@ -shared-resources@ -tech-dimension@ -tilt-break@ -item-frament@ -water-vision@ -randomized-default-fireworks@randomizeddefaultfireworks -glowing-torchflower@ -@clock-hud-renew -cameranoclip -barriers-dont-block-rain@ -no-render@ - -runningshoes|跑鞋 (Running Shoes) -fluid-void-fading@fluidvoidfading -@movement-in-gui -glowing-eyes@ -youarch -true-darkness-fabric@ -esf-entity-sound-features@esf|实体声音特性 (Entity Sound Features) -nomoreglowingpots@ -smooth-particles@ - -unloaded-activity@ -@improperui -neverenoughanimation@ -reds-stagger-parry -additional-placements@¨additional-placements-fabric@ -akicaters-shelves@akicaters-shelf-mod -refurbished-furniture|MrCrayfish 的家具:重制 (MrCrayfish's Furniture Mod: Refurbished) -improved-stations-forge¨improved-stations¨improved-stations-for-1-19 -elemental-wizards-rpg-class@elemental-wizards-rpg -pov-that-one-short-friend -onward-and-upward -weapon-case-loot|武器箱战利品* -mace-but-3d@ -@healthindicators -smoothcoasters@ -do-a-flip@ -@no-death-animation -veindigging@ -too-many-entities@ - - - - -datapack-breakpoint@datapack-debugger|断点调试 (Datapack Debugger) - - -frosted-heart|冬季救援:寒霜之心 (The Winter Rescue: Frosted Heart) -create-planetary-tweaks@cp-tweaks -entris@ -@sushi-bar -lumi@lumi1710 -pet-the-frog@frog-petting -ex-nihilo-extras@ -cycle-title-screen-splash@ -hide-invisible-armor@ -inventory-tweaks-refoxed@ -bigshot@ -more-immersive-aircraft -legendary-survival-overhaul|传说生存* -mineral-delight -not-just-sandwich@notjustsandwich -fantasyfood|幻想食物 (FantasyFood) -mc-modsthefood@allthefood -villager-names-fabric@villager-names -trial-vault-restock@trialchamberrestock -hot-green-fire -phantom-flames -darktitlebar@ -cubes-without-borders@ -block-parry-dodge -fargos-talismans@|Fargo的护身符 (Fargo's Talismans) -toostrongmonster -simplystronger -tacz-durability -bigger-lightning-storms -eternal-limbo -legoman -petcreepers-mod -tugkandemans-weaponry@ - - - - - - - -@noanysus -rekusaeater@|Re艹 (ReKusaEater) -jsg@ -@potion-mixing|药水混合 (Potion Mixing) -sandfilter@|砂滤器 (Sand Filter) -resaplingslayer@|雁雅得枝 (ReSaplingslayer) -cerberu@|狱牙抵战 (Cerberus) -remoreloyaltrident@|远亦得珍 (ReMoreloyaltrident) -potionlevelfix@|药水等级修复/药引对注 (PotionLevelFix) -reunmending@|以验垫砧 (ReUnmending) -reghostjump@|引殃髑至 (ReGhostJump) -rebroken-blade@|隐影刀珍 (Mowzie's Mobs: ReBroken Blade) -attackagain@|又御刀追/追击 (AttackAgain) -@sectionsign -@allow-chat -retro-damage-indicators@ -@impropers-3d-minimap -beddium@ -create-thermal-compat -create-lagless@ -create-ironworks@ -@create-vibrant-vaults|机械动力:炫彩金库 (Create: Vibrant Vaults) -steam-power -kevs-library@ -remove-purpleprison-ads -timeoutfixes -forgeskyboxes@ -customfishing|随液钓趣 (CustomFishing) -metr0polis@metropolis -crust@ - -sc-structurecraft@structurecraft -minehop@|Minehop - 主¨minehoplite@ -placeabletools -rlfoliage@ -bc-remastered -@deepdrilling -copperworks - - -miner-villager -villager-venture -alekiships@ -alekishipsbop@ -antique-trading-ship@ -small-horse-stable@ -shrek-the-ogre@shrek - -the-anomaly@the-anomaly-rephased -desert-behemoths-sandworms@desert-behemoths-sandworms! - -vermintide-rising -armor-of-the-ages@|时代铠甲 (Armor of the Ages) - - - -@betterf3-stationapi -ftb-quest-localizer|FTB Quest 本地化 (FTB Quest Localizer) -modpack-update-checker@ -minimotd-fabric -effecttimerplus@ -thaumic-concilium@|神秘议会* -equivalentexchange - -coral-up@ -plushie-buddies@ -@the-aethers-delight -@wheelchairs -dnt-pillager-outpost-overhaul -mage-flame@ -@totem-party-popper -@powerless-refined-storage -forgotten-graves@ -day-zombies -morecoal|更多煤炭 (More Coal) -jjku - -immersive-combat-feathers -ghosties-monocle -ender-dragon-loot -epic-terrain|史诗地形* - 史诗地形(实验版) -oh-the-trees-youll-grow@ -oh-the-biomes-weve-gone@|我们走过的生物群系 (Oh The Biomes We've Gone) -dblockbusterdisplays@ - - -@waygl -no-sneaking-over-magma@ -harmonia@wasabiwhisper-harmonia -configurable-head-drop@ -@connectored-c2me-(c2me-fork-for-connector)|C^3M 引擎 (Connectored Concurrent Chunk Management Engine) -structure-expansion@ -armored-doggo@ -the-newest-goatman -epic-mob-siege-nightmare -jupiter@ -airport -just-dandy@ -@uk-roads -my-totem-doll@my_totem_doll -void-power-for-fabric|虚空动力 (Void Power) - -dis-enchanting-table@ - - -gt-top-addition|格雷信息显示拓展 (GT TOP Addition) -gt-steam-tech|格雷蒸汽科技 (GT Steam Tech) -simpleanimator@ -tianjin-metro@|天津地铁* -modular-flower-pots|模组化花盆* -repurposed-structures-floralis-compat-mod|结构变体:Floralis 兼容模组 (Repurposed Structures - Floralis Compat Mod) - -balanced-shield@ -more-potion-effects@|更多药水效果* -jungle-villages -truecherry -@revamped-trades -creeper-fireworks@creeper-fireworks-mod|烟花苦力怕 (Creeper Fireworks Mod) -@word-overflow -chatnotify@ - -nbt-tool - - - - -dglab-x-minecraft¨@dglab-x-minecraft|Minecraft x DgLab - 已失效 -twintails@|双马尾 (TwinTails)¨twin-tails|双马尾 (TwinTails) -gt-wireless|格雷无线科技 (GT Wireless) -forcejava21@|强制 Java21 (ForceJava21) -blessings@|祝福* -crafted-core@ -call-from-the-depths|深渊召唤*¨@call-from-the-depths|深渊召唤 (Call From The Depths) - 落后 更新不及时 -@clover-fabric|四叶草Fabric版 (Clover Fabric) -champions-unofficial@|冠军/强敌再续* -aetherworks-refracted@ -eidolon-repraised@eidolonrepraised -create-northstar@|机械动力:北极星 (Create: Northstar) -create-pattern-schematics@|机械动力:模式蓝图 (Create: Pattern Schematics) -magic-merchant -aether-villages@|天境村庄* -tricky-trials|Tricky Trials 1.21 - 已失效¨@tricky-trials-1.21 - - -the-boys-minecraft|黑袍:新世界 (The Boys : New world) - - -better-creative-tabs-forge-neoforge|更好的创造标签页 (Better Creative Tabs) -more-upgrade|更多锻造模板 (MoreUpgrade) - - -avaritia-unofficial -stellaris@|群星* -command-o-matic - -realistic-physics@ -cia@|自定义物品属性 (Custom Item Attributes) -item-wheel@ -data-attributes-directors-cut@ -better-walls@betterwalls -the-pillager-legion -the-frozen-kingdom -stardew-fishing@ -lets-do-a-jumpscare@letsdoajumpscare - - -the-quackening -better-trial-chambers@ -coldsweat-tfc -deeper-nether-biomes -adventurers-beyond@ -mss-moogs-soaring-structures@ -goblins-tyranny@|哥布林的统治* -no-32768-limit@|没有32768限制* - - - - -reairdrop-supply@|空投供应:重生 (ReAirdrop Supply) -@minequery|MC宝 (MineQuery)¨@minequery-legacy|MC宝 (MineQuery) - -@simply-create-model-mod|简单动力 (Simply Create Model) -mountains-poem@|青丘辞 (Mountain's Poem) -@playtime-reborn|游戏时长计数器:重生 (Playtime Reborn) - -moon-between-medicine|在月亮之间:药学拓展 (Moon Between : medicine) -craftable-chainmail-reborn|可制作的锁链甲:重生* - -thaumcraftfix|神秘时代6修复 (Thaumcraft Fix) - -extended-industrialization@ -small-tetra-additions -lets-do-furniture@|家居装饰 ([Let's Do] Furniture) -tesseract-api-neoforge@tesseract-api -tickrate-api -spectrelib - -tfc-artisanal - -@the-real-time|现实时间 - -dragonoptifix|DragonBlockC 与 OptiFine 的兼容修复 (DragonOptiFix) -effortless@|轻松建造 (Effortless Structure) -@barriers-dont-block-rain-1.21 - -@nochathide -inventory-tweaks-extrafoamy -automatic-infinite-elytra@ -re-translator@ -yank-it-out@ -vintage-kubejs@ -emi-professions-emip@emi-professions-(emip) -improved-grindstone -@starlight-legacy -themetip@ -woodwalkers@ -peaceful-moon@ -to-tweaks-irons-spells¨@to-tweaks-irons-spells|T.O Magic 'n Extras - Iron's Spells Addon - 已失效 -horde-moon@ - -laser-mod-2 -mekanism-lasers@ -wizards-reborn@ -tinkervillager|工匠村民 (Tinker Villager) -customnpc-contentback@cnpc-items -debug-stick -useful-bat -runic-inscription -bamboo-stuff@ -@moai-update -junk-drawers@ -playerex-directors-cut@ -lets-do-camping@|摇曳露营 ([Let's Do] Camping) -@startuptime-unoffical|启动时间非官方版 (StartupTime Unoffical) -serverconfig-updater -@epiczoomer - -agenta@ - -more-beehive-variants@ - -persistent-creative-inventory -lets-do-wildernature@|野性自然 ([Let's Do] WilderNature) -@quitconfirm -@ressourcepackcommand - -neodymium-unofficial@nd1710|钕:非官方版* -@carbon-performance|碳 (Carbon) -coloredglowlib@ -@better-snow-coverage|更好的雪覆盖 (Better Snow Coverage) - -trade-enchantment-display@|交易附魔显示* -eternal-starlight@|永恒星光* -astral-patch|星辉补丁* -fast-scrolling-fabric@fast-scrolling¨fast-scrolling -galoblender-updated -more-tetra-materials@ -ageing-mobs@ -warm-ice-block -smoke-signals@ -wunderreich@ - -ames-mobs-renew -refreshdisplaylists -vulkanmod-android-libs -@black-bar-concealer -building-shift@ -mob-ai-tweaks@ -the-masquerade-illager-boss@the-masquerade-(illager-boss) -better-armory-x -sweetys-horse-armor-tweaks@ -fired-pots@ -under-the-moon@|驻月夜下 (Under the Moon) -coffeegs-colorful-world -jeb_-wool@|jeb_羊毛 (jeb_ Wool) -illage-and-spillage-finally-ported@illage-and-spillage-respillaged -more-runes-more-magic-series@|更多符文 (More Runes) -battlemages-more-magic-series@ -eidolon-rebrewed-data-recipes -elemental-metals-magical-metallurgy-series@fallen-paladins-and-priests -dragonsteel-more-magic-series@ -dragon-scale@ -scholar@ -@elytraswimfix -tacz-bullet-proof-enchant-add-on@¨tacz-bullet-proof-enchant-fabric-add-on -no-screen-bobbing@viewbobbingmod -more-spell-attributes-more-magic-series@ -minos-particle-presets -somewhat-hardcore-fabric-forge@you-die-you-lose-a-heart -@blurred-window -player-list-heads -@antighost-fork -environs-mod - - -unique-magic - - -epic-projectile-reflection|史诗弹射物反射 -zombie-island -stratagems@ -solar-hardcore@ -i-hate-flesh-reborn-ihfr@i-hate-flesh-reborn-(ihfr) - -@particle-unlimit|粒子上限解除 (Particle Unlimit) -aaa-particles@ -@anno -compass3d@ -@clockin -diggus-maximus-reborn@|连锁挖掘重制版* -satisfying-buttons@ -item-on-chest-fabric@item-on-chest -industrialreborn@ -@ntmspace|HBM的核科技航天 (HBM's Nuclear Tech Mod Space) - -several-food-craft@ -cakes-cosmetics@ -boks-butterflies@ -@immersive-winds -reef-redux@ -simple-quiver@ -too-many-paintings-forge-fabric@too-many-paintings -building-but-better@ -exchange-fuels@ -more-craftings-of-runes@ -mega-evolve -pixeltweaks@ -hrbs-drills@ -index-librorum-prohibitorum|禁书目录 (Index-Librorum-Prohibitorum) -bft -heartbond@ -breakerplacer@ -iron-ladders@|更多梯子* -crumbs-deepslate-button|Crumbs 的深板岩按钮 (Crumbs' Deepslate Button) - -cl0uds-paxels -unique-weaponry@ - -boss-keys - -mace-variants -shortswords@new-short-swords -bbs-mod@ -monocle@monocle-iris -move-ui@ -terrafly -achievements-mod-200@mysticrift-achievements - -saturation-plus -mod-and-resource-pack-checker-abras-additions -createstuffadditions-fix -warden-slayer-enchantment@wardenslayerenchantment -mods-optimizer@ -glowy-players-renewed@|玩家高亮:重置版* - -epic-fight-kenjis-combat-forms -mekanism-unleashed@ - -easy-cake|简易蛋糕* -weave-craft -morefarming@|更多农耕 (MoreFarming) -iron-bushes -forestry-community-edition@|林业:社区版 (Forestry: Community Edition) - -specified-spawning -kubejs-create-for-fabric-1-20-1 -portable-spawners -bettertime@better_time|长期熟时/求闻时记/更好的时间 (BetterTime) - - - - -lets-do-farm-charm@|沉浸农艺 ([Let's Do] Farm & Charm) - -hunters-moon@ -miners-moon@ -ender-moon@ -extreme-horde-moon@ -spider-moon@ -@breed-parrots-with-seeds -persistent-parrots@ -@ultimate-autototem -anti-mob-cheese@anti-mob-farm -bad-horse-fix@ -vanilla-nei-fix - -fconfiglib@ -satin-free-wakes@ -blue-archive-paintings|Sensei的珍藏* - -lunar-nether -yeehaw-towns@ -@copperrails - -mana-unification@ -immersive-energistics@ -specialised-cells@ -random-chunks@ -unique-commands@ - - -flood@ -block-prints - - -justleveling-x-ironspell@|法有所归 (Just Leveling x IronSpell) - -hugme@|抱抱我! (HugMe!) - -coins-ll@coins! -purediscstrickytrials@ -tinkers-in-the-sky -create-tank-defenses@|机械动力:坦克防御* -potato-update@potato-update-backport -twilight-forest-fixes@ -dietary-statistics -day-zombies-rebooted -viewboboptions@ -ender-pearl-anti-disappear@ender-pearl-ad - -create-dynamic-lights@ -decorative-tin -blended-compat@ -hold-easy-place@|保持简单放置* - - - -endlesscompat|无尽贪婪·伪附属 (EndlessCompat) -spartan-and-fire-lightning-edition|斯巴达之冰与火-雷电版 (Spartan and Fire - Lightning Edition) -the-twilight-forest-deforestation-edition|暮色森林 - Deforestation 版 (The Twilight Forest - Deforestation Edition) - -minieffects-legacy-extended-life -call-to-battle-ww2-vehicles-addon -thaumic_funnel@ -ynet-an-xnet-fork -rosatech -nutrition-gtceu@ -nutrition-unofficial-extended-life@|营养学非官方延续版* -manametalmod-tweaks-m3-t@manametalmod-tweaks|魔金微调 (ManaMetalMod Tweaks) -ae2-crafting-tree|合成树 (AE2: Crafting Tree) -client-automatic-doors@client_automatic_doors|客户端自动门* - -@chais-build-tools -forge-relocation -forge-relocation-fmp-plugin -@fish-lib -forgedapi-fork@ -prioninfection -dark-shadow-monster@|暗影怪物* -the-mi-alliance-invasion -fancy-health-bar@ -@no-join-leave-messages -data-trades@ - -draconic-alchemy -fancymenu-animation-maker-tool -jmx@imx -@elytra-rebalance -another-dyeable-shulkers@|可染色潜影贝* - -@thatskyinteractions -@tinker-transplant|匠魂移植 (Tinker Transplant) -chisatos-more-redstone@|Chisato的更多红石 (Chisato's More Redstone) -assetmover@ -duclib@ - -orecrop|矿石作物 (OreCrop) -@vinurl -nutritionz@ -xxl-packets@ -uncharted -mcfetch@ -reignited-hud@ -more-crafter-variants@ -sharingan-addon-ahznbs-naruto-mod -create-tacz-automation@ -tacz-plus-timeless-and-classics-feature-addon@tacz-plus -fibers-guns-pack-for-tacz -@splinecart -beams@ -discarnate@ -@fishmc -mob-armor-trims -bubbles-a-baubles-fork -arst-motion-blur@ -@mpalladium|钯 (Palladium) -firehud@ -@elytra-autopilot - -personal-worlds@ -pearltickets -cobweb@ -progression -stop-repeating-command-block-reborn@|停!循环型命令方块:重生* -parry-us@parry!|予以刀振/格挡! (Parry) - -frycooks-delight@|油炸乐事 (Frycook's Delight) -advancedae@|高级AE (AdvancedAE) - -pretty-pipes-fluids@|更好的管道:流体 (Pretty Pipes: Fluids) -webstone@ -rotatable-blocks -treasure-seas@|宝藏海* -ambidextrous -@always-sprint -tea-the-story-recount|茶风·纪事:追叙 (Tea the Story : Recount) -xp-challenge@|经验挑战 (XP Challenge) -@styled-renaming -simple-block-overlay@ -@helpfull-action-bar -repeatable-trial-vaults@ -fast-async-world-save-forge-fabric -@chat-magic - -unlimitedelytra@|无限鞘翅 (UnlimitedElytra) -recrafted-creatures -reciperesearch|合成配方研究 (RecipeResearch) -thaumon@|神秘再饰* -create-firearms-patch|机械动力火器补丁 (Create Firearms Patch(kinetic pixel)) -create-eureka -forsaken-corpses@ -cat-variant-eggs@ -more-colorful@morecolorful|更加多彩的世界* -void-island-control-2-0 -fishing-rod-fix@ -@additionalentityattributes -@additionalentityattributes-forge -kubejs-sanity - -journeymap-web-map@|旅行地图:网络地图 (JourneyMap Web Map) -rain-should-extinguish-campfires@ -@mob-death-sounds -gauntlets@ - - -thrown@|扔!* -tacz-npcs-also-vpb@tacz-npcs -@scape-and-run-parasites-addon-immalleable-generator|逃逸:无适应性发生器 (Scape and Run Parasites Addon: Immalleable Generator) - - - -hotdog-delight -lets-do-addon-corn-expansion@|玉食俱馩 ([Let's Do Addon] Corn Expansion) - -@client-maps -dragon-gear-renewed -@archers-plushies -@hephaestus-expansion -create-structures-arise@ -kilt@ -gregtech-extended-chemistry-extended -ulv-covers-modern -farmers-structures - -@minecartspeeddisplay|矿车速度显示 (MinecartSpeedDisplay) -crossstitch@ - -free-camera-api@|自由相机API (FreeCameraAPI) -@flashback -bloodmagic-meteors-jei-support|血魔法陨星显示 (BloodMagic Meteors JEI Support) -limited-damage-indicator-particle@|伤害粒子限制* -netherite-extension@netheriteextension|下界合金拓展续作* -immersive-farming@|沉浸农业* -@vpb-too-many-guns -death-angels|死亡天使* -the-pale-hound -monsters-girls@ -monsters-girls-secrets-of-mermaids -dios-tiny-ore@ -defence-craft - -copper-equipment@exlines-copper-equipment -terramity@ - - - -neptune-lib@neptune -sign-edit-lite@signeditlite|告示牌编辑轻量版* -@book-formatting -@morewaterlogging - -@customspyglassmagnificationoverlay|自定义望远镜覆盖层 (CustomSpyglassMagnificationOverlay) -@chatting -@crosshair - -respawning-structures-forge-fabric -@sticky-honey -horseman@ -@easyplacefix|轻松放置修复 (EasyPlaceFix) -screenshot-flash@flash|一闪 (Screenshot Flash / Flash) -warp-zone@ -faded-widgets@|淡出界面* -knowledges@|知识库* -panda-genetics-tweak -colourful-llamas -@chens-japanese-decoration - -create-halitosis-create-halitosis@create-halitosis -create-unify@ -create-more-sand-papers@create-more-sandpapers -sawmill-house@ -kaboom-moon -hardcore-revive-mod@ - - -petrols-parts@|Petrol 的机件 (Petrol's Parts) -slavic-delight@ -aquamirae-delight@|海灵乐事* -dumplings-delight-rewrapped@ -my-nethers-delight-refabricated@ -@polyweather -shadow-x-axolotl-buckets-plus -daily-shop@ - -no-tree-to-destory@|你不准破坏木头!* - - -growable-goodies -petrolpark-library@petrolpark|Petrolpark 的库 (Petrolpark's Library) - -ancient-reforging@ -stackmob-fabric@ -itemindicator@ -kenshiro-mod|北斗神拳* -roamers -@legacycaneditsign -title-screen-mobs@ - -antiblocksrechiseled@ - -end-ores -tnt-expanded -glimmering-tales|微光纪事* -fluid-interaction-tweaker|自定义流体交互* -kubejs-extended-crafting -kubejs-addon-blood-magic -custom-portal-builder@ -biome-difficulty -@viaaprilfools -tfc-weld-button@ -tfc-regrowing-forests@ -ccdbridge@ -welcome-message@ -auto-attack-rebirth -lotas@ -tasmod@ - -betterfly@|飞起来! (BetterFly) -@leashedplayer|可拴玩家 (LeashedPlayer) -melodymagic@|旋律魔法 (MelodyMagic) -scaling-mob-difficulty-fork|知时修倍* -trajectoryprojections@trajectory|弹道预测 (Trajectory) -accessories@ -onewholibs -nucleus@nucleus_pauljoda -@equator -accessories-cc-layer@ -accessories-tc-layer@ -@confetti-lib - - -material-replication@ -rsj@ -irikana|伊利康纳* -mts-iv-aq-studios-himars -immersive-vehicles-iv-mts-lindqvist@lav -immersive-vehicles-iv-mts-zroskyan-ordinary -petroleums-wigs -revenge-mark|遗怨待战 / 复仇标记* - - - - -@create-coggle -create-enchantable-machinery@¨create-enchantable-machinery-fabric -bad-eyes|近视眼* -bad-dreams@|噩梦* -turtlebois-rpg-classes -through-the-lily-pads-gently@ -decofirmacraft@ -@dusty -@beeg-smol -scaling-mobs@scaling-mob-difficulty -multiline-mastery@ -@confetti-stuff -pirates-treasures -ars-nouveau-delight|Ars Nouveau Delight - 已失效¨@ars-nouveau-delight -crossbow-enchants@ -extendeddrawersaddon@ -minecolonies-letsdo -earlystage@ -smitherz@ -additionz@ -bjornlib@ - - -skewers-reflavored|串起酥食/烤串:再调味* -linear-xp-forge|验依定值/线性经验 (Linear Xp Curve) - - -dumplings-delight-reload@|饺子乐事:重启* -auto-switch-elytra@autoswitchelytra|自动切换鞘翅* -gregtech-placeable-emitters@ - - - - -zakuro@|榴* -dropoff -upgraded-totems -@player-chains -anti-creative-drift@ -damage-incorporated@ - - - - -exmodifier@|极墨重锻-革故鼎新 (ExModifier) - -@creepersburn-reborn -lazy-dfu-forge|DFU载入优化 [FORGE] (Lazy DataFixerUpper(LazyDFU) [FORGE]) - -creaturechat@ -helldivers-spread-democracy@helldivers-2-spread-democracy - -variant-tools-and-weaponry-more-weapons@ -mgrr@ -arcanemysteries@arcane-mysteries -botanic-pledge@botanicpledge -rediculous-ore-generation@ -witchy-wearables -simple-delights-recooked|重启爽食/简单乐事:再烹饪* -braziliandelight@|巴西乐事 (Brazilian Delight) -applied-energistics-delight|Applied Energistics Delight - 已失效¨@applied-energistics-delight -extra-meat -peculiar-primordials@ -time-wind-forge@time-wind¨time-wind -@mcbrowser -additional-trims -upgraded-trims -water-balloon@ -cataclysm-spellbooks@ -call-of-drowner@|溺亡者之嚎 (Call of Drowner) - -endofdays|终焉之日 (endofdays-re) - -fastfood-delight-unofficial|重启速食/快餐乐事非官方版 (FastFood Delight Unofficial) -faster-fly-block-breaking|飞行速速破* -upgraded-additional-trims -create-let-the-adventure-begin@ -bountiful-critters@ -flashlight-mcowners -smartpot@|智能锅 (SmartPot) - - -merciful-void|渊佑堕者/慈悲的虚空* -gsic2|星空工业 (GSIC2) -open-energistics -@the-friends-mod -@construction-wand-fabric -osmiumspacetiers -bodyguard@ -@quick-menu|快捷菜单 (Quick Menu) -lazrs-lib@ -cute-words-chat-replacer|雅言订正/聊天内容替换 (Cute Words) - - -hotbath|热水澡 (Hot Bath) -@no-double-sneak -tfc-hammer-time@ -tfc-better-stone-age -battery-status-info@batterystatusinfo -mineteam@mine-team -@nocreativemode|禁用创造模式 (NoCreativeMode) -@darktitlebar-forge -croaklib@¨@croaklib-dep|CroakLib - 已失效 - -nbt-copy@ - -more-totem-effects -bakeyourbread@bake-your-bread -modern-debugify -recipe-essentials-forge-fabric -zombie-villager-control|催起死尸/僵尸村民控制* -@1.8-pvp-mod -@blackscreenquiet|黑屏安静 (BlackScreenQuiet) - -@too-many-shortcuts -better-horse-movement -tct-core@ - - -@notica - -zhonglv-12et@|钟吕十二律 (ZhongLv-12ET) - - -just-another-random-spawn|遥缘调址/随机出生点* -@kaimyentity-c|KAI我的实体-C (KAIMyEntity-C) -realistic-mobs|Realistic Mobs - 无法文件¨@realistic-mobs|Realistic Mobs - 已失效 -fullthrottle-alchemist -fullthrottle-nei -creature-compendium@ -desert-update@desert_update -ancient-elements@ancient-elements-mod -left-behind@ -corrupted-witherskeleton-boss-mod - -mca-api - -sodium-leaf-culling@sodiumleafculling|钠:树叶剔除* -homing-xp-orb|引验导追/归航经验球* -multiblocked2@ -armorstatushud-updated|耐久信息显示更新版 (ArmorStatusHUD Updated) -tfc-better-blast-furnace -tfc-textile@ -tfc-woodworking@ -tfc-auroras@auroras -greg-paintings@ -gtmthings -create-trading-floor@|机械动力:交易站点 (Create: Trading Floor) -@fishy-create-stuffs|Yu的机械动力附属 (Fishy Create Stuffs) -biolith@ -hungrier@ - -furnace-pickaxe-mod -camouflage-doors-and-trapdoor@ -dense-metals -actually-subtractions@ -mechanical-botania -puddles -yoyousukes-kabutoaddon-for-ahzs-shinobicraft -illager-world-war -guns-craft-adventurers-arsenal|枪械工艺:冒险者的武器库 (Guns Craft Adventurer's Arsenal) -@seven-deadly-sins-origins -difficult-raids-stronghold-survival-edition -subnautica-flow -cardinal-sins -unwrecked-ships-forge¨unwrecked-ships-fabric -revamped-shipwrecks-mod -christmas-culinary-desires-decorations@christmas-culinary-desires-(-decorations) -@florum-sporum -unofficial-bosses-of-mass-destruction-dungeon - - -@more-things|更多物品 (MoreThings) - -explosionvisualizer@|爆炸信息显示 (ExplosionVisualizer) -@more-vanilla-foods|更多原版食物 (More Vanilla Foods) -let-me-feed-you|吃取送食/玩家喂食 (Let Me Feed You!) - -drg-laser-pointer@|深岩银河激光指示器 (DRG Laser Pointer) -spawner-head -medieval-core-mod -darkmining@ - -@visualkeys -sodium-extra-information@ -@bulk-villager-trading -omniscience -illusion-onslaught -rar-compat@ -wards -moremcmeta-emissive-forge@moremcmeta-emissive¨moremcmeta-emissive-fabric -@fantazia -falling-attack -lesraisins-armor@ -goety-spillage@ -waifucraft -sign-to-chat|阅言得知/聊天栏读取告示牌 (Sign to Chat) -rainimatormod@ -realistic-airdrop|真实空投* -keepers-of-the-stones-ii@keepers-of-the-stones-2 -woodencog|Wooden Cog - 最新(已由Manwe_b接手)¨wooden-cog|Wooden Cog - 已不再更新¨@woodencog -shadow-x-blocks-plus -pet-essence@ - -watson@ - -emerald-matcha-craft-v3|翠茶工藝 (Emerald Matcha Craft) -cctv-camera -trash-compactor@ -rustic-delight@|乡村乐事* -total-assault¨@total-assault|Total Assault - 已弃用 -sky-breaker|天穹突破* -@scala3std - -@hoofprint -better-controls@ -@optibye -kubejei -actually-harvest@ -city-craft@rexs-city-craft - -eggs-better-vanilla-food@eggs-better-food -shelf-mod@ -nebulus-cherryblossom-tree@nebulus-cherry-blossom-tree -ftb-rickety-water-wheel -cobblegen-galore -@ringles-gun-turret -create-sky-village -create-crushing|Create: Crushing - 已失效¨@create-crushing -cushy-pillows|舒适枕头* -ice-and-fire-patcher@iaf-patcher|冰火传说随意修复* -goety-revelation@|诡厄巫法:启示录 (Goety: Revelation) -the-mandela-catalogue-alternates@ -the-craftela-catalogue -the-ceilands@|垂顶之地* -@sharowings-better-dungeons -snowbound@snow_bound -opencomputers-icbm-classic-addon¨icbm-opencomputers|Opencomputers ICBM-Classic Addon - 教程文档 -@ad-astra-pandoras-frontier -cosmic-horizons@cosmic-horizons-cosmos -shadow-x-netherite-scrap-from-piglin-brutes|猪灵蛮兵掉落下界合金碎片 (Netherite Scrap From Piglin Brutes) - -better-modlist-neoforge@better-modlist -sky-aesthetics@ -headshot-bonus|已无可惧 / 简单爆头* -enchantlevelbrek@enchantmentlevelbreak|附魔等级上限突破2 (EnchantmentLevelBreak) -the-ruler@ -biome-borders-revived-liteloader-only -chunkborders|区块边界 (ChunkBorders) -burnt@ -goatman@ - -armor-damage-limit@|甲哇!/盔甲耐久损失限制* -knight-bodyguard-forge|骑士保镖 (Knight Bodyguard) -deeper-depths -unseens-nether-backport - -shadow-x-adventures-plus -adventures-in-time@ait -elementalist -@craft-slime-fabric|制作黏液球 (Craft Slime Fabric) -shadow-x-unactivated-totems -cagebox - -rechiseled-ae2@ -archeological@archeologicalmod -clarity -backpacked-world-of-color@ -nofov -cobalt-custom-chunk-renderer|钴 (Cobalt)¨@cobaltmod|钴 (Cobalt) - 已失效 -spartacus-army-uniform -soviet-army-uniform@ -german-uniforms-ww2 - - - -tameable@ -slashblade-gamerelic|游戏扩增·异界之刃 (SlashBladeGameRelic) -theovergrowth -jadens-nether-expansion@ - -configurable@ - -@chatpositiondisplay|聊天框坐标显示 (ChatPositionDisplay) - - -@forge-early-loading-screen-fabric|Forge 加载屏幕移植 ((Neo)Forge Early Loading Screen for Fabric) -@ebe-forge - -patpat -modern-life-patch@modernlifepatch|摩登生活补丁* -@ivr -rusticdelight-refabricated@|乡村乐事:重织 (RusticDelight: Refabricated) -scape-and-run-meshi@|逃逸:寄生饭 (Scape and Run: Meshi) -@bad-apple-world-preset -gastronomy-works@ -@create-air-fabric -@clockwork-additions -colorfulwater -yungs-cave-biomes@|YUNG的洞穴生物群系 (YUNG's Cave Biomes)¨yungs-cave-biomes-fabric|YUNG的洞穴生物群系 (YUNG's Cave Biomes) -@legacy-command-registry|旧式命令注册 (Legacy Command Registry) -@screensaver|屏保 (Screensaver) -@startuptone|启动提示音 (StartupTone) - - - -va-11-hall-a-drinks|Vall-11 Hall-A饮品 (Vall-11 Hall-A Drinks) -bettergive-reborn@bettergivereborn -@blur-server-address -foodvariations@|生活调味料:经典版 (Spice of Life: Classic Edition) -pizza-delight@pizzadelight -simplefog@ -@butter -tnt-plus-mod|TNT Plus - 所有¨@tnt-plus-mod - -@kelvins-better-player-animations-(port) -tokusatsurecord|特摄唱片 (Tokusatsu Record) - -origins-backgrounds-forge¨origins-backgrounds -cataclysm-apotheosis-addon -cave-dweller-reimagined¨cave-dweller-reimagined-fabric -out-of-combat|脱战 (Out of Combat) -soulfragment|灵魂碎片 (Soul Fragment) - -create-peaceful@ -baby-players -dynaores|动态粗矿 (Dynamic Raw Ores) -mc-mods-arrows-infinity-fix -bundles-backport -its-magispelling-time - -@windows-starting-overlay|Windows启动界面 (WindowsStartingOverlay) -@dontsneakprogress|偷跑禁止 (DontSneakProgress) -@unkindled -recipe-generator@ -@carbonfltr -argonmod@|氩 (Argon) -foggypalegarden@ -@items-stack -arkane-domains - -yakumoblade|幻想之刃 / 刀藏录 (yakumoblade) -no-random-drop-offset|垂直落下/移除掉落随机偏移* -croptopias-chocolaterie-unofficial|巧克力工坊:非官方版 (Croptopia's Chocolaterie Unofficial) -epic-fight-wukong-moveset|史诗战斗:悟空 (Epic Fight - Wukong Moveset) - -petphrasex@|口癖X (PetPhraseX) - -dust-and-ash|尘与烬 (Dust and Ash) -@particle-interactions -@trial-spawner-timer|试炼刷怪笼计时器 (Trial Spawner Timer) -enigmatic-delicacy|神秘佳肴* -slashblade-resharped-renderfix-patch@|拔刀剑:重锋 渲染修复补丁 (SlashBlade Resharped RenderFix Patch) -@invulnerable-wheat -skin3d-but-not-cubic@skins3d-but-not-cubic -leavesly@ -create-totem-factory@ -snad-redstone-edition|子沙:红石版 (Snad:Redstone Edition) -@party-flames -subtle-effects@ -@dma -cc-wasm -legacy-patch - -@glowup -@customsavedirs -just-enough-magiculture -ae2-jei-integration -entangled-fix -@customdurabilitybar - -scape-and-run-revenants -warden-s-domain -more-wardens -hidden-realm@ -spells-gone-wrong@ -wandrous@ -cnpc-dbc-addon@customnpc-plus-dbc-addon -salmons-genesis -the-afterdark -endlesssword|无尽拔刀剑 (Endless Sword) -bh3|崩坏3 - -loaded-mods-checker@loadedmodschecker|存档模组核对* -i-have-slept@|朕已安寝 (I have slept) -@itemstackpromax|物品堆叠ProMax (ItemStackProMax) -item-split-bug-fix|物品分裂修复* -spontaneous-replace-cobwebbed@|自然更替:蛛丝网迹 (Spontaneous-Replace: Cobwebbed) -modernconverter -frozify@ -potato-library -swisscaves@ -title-screen-blobcat@ -punching-creepers@ -ancient-curses -resettleable-traders-forge-fabric@resettleable-traders|流浪商人安家 (Resettleable Traders) -ihearttfc@ -itemphysic-1-7-10-unofficial@itemphysic-1.7.10-unofficial|物品物理掉落非官方版 (ItemPhysic Legacy Unofficial) -jei-area-fixer -ars-elixirum-forge@ars-elixirum¨ars-elixirum-neoforge¨ars-elixirum -gold-nugget-recycling -sodium-options-api@ -@totom-register - -crazyae@|疯狂的AE (CrazyAE) -ae2-crafting-tree-legacy|AE2合成树-传统版 (AE2CT-Legacy) -ae2-alchemistry-addon - -novaultlimit@ -game-discs@|游戏光碟* -luncheon-meat-s-delight@|午餐肉乐事 (Luncheon Meat 'S Delight) - -vanilla-plus-resourceful-tools¨resource-tools-fabric -create-horse-power@ -ars-technica -plustic-reforged@ -spawners-plus@spawners_plus|刷怪笼拓展 (Spawners+) -dracolotl@ - -sacks-n-such@ - - -camellialib@|山茶花核心 (CamelliaLib) -cameliaarmory@|花朵武器库 (FlowerArmory) - -moonrise@moonrise-opt -corpsecomplex-unofficial@ -@starlish -languagereloadunofficial@ -mekanism-covers@ -enchanted-wilderness-elegant-countryside@enchanted-wilderness-elegant-countryside.|雅致乡下 (Elegant Countryside) -better-durability-reforged|更好的耐久度:重铸* -fast-tpa|我来助你! (Fast TPA) -cherry-on-1-12-2@cherry_on_1.12.2|1.12.2的樱花 (Cherry_on_1.12.2) -scape-and-spartan-parasites|寄体斯巴达 (Scape and Spartan: Parasites) -@ripples-of-the-past-extra-stands-addon -the-knocker@ -vll-r-mystery -scp-origin -sniffers-delicacies -fix-changed -valkyrien-pirates@|瓦尔基里海盗* -pathogen -chrysalis@ -alekis-ridiculously-simple-roofs@alekiroofs -@trails -rainboows@ -texturized-particles¨@texturized-particles|Texturized Particles - 已失效 -rple@ -reign-of-nether-rts-in-minecraft@reign-of-nether-rts|下界之治 (Reign of Nether RTS) -the-secret-doors - -immersive-vehicles-iv-mts-veb-iav-improved-2000|“改进-2000” -tame-tools@|驯兽工具* -@bia -vounierns-turrets -seafarer-forge -zombies-plus-frenzied-horde@ -@tetrismc -ecliptic-seasons|节气* -xibaoxx@|喜报 ×× (XiBao ××) - - -murasama-daker|鬼妖村正 (Murasama) -particle-storm|粒子风暴* -@2d-minecraft -till-it-breaks-updated@ -debark@ -till-it-breaks@ -end-reborn-expansion@end-reborn -@origins-genshin - - -the-glitched-one -progression-reborn@ - -@simple-info-display -@automaticmemories -zoom-camera@ -dpi-fix -@item-information-display|物品信息显示 (Item Information Display) -almanac-lib@almanac - -remove-blindness|移除失明 (Remove Blindess) - 不全¨@remove-blindess|移除失明 (Remove Blindess) -simplerpgcore@ -droppable-villager-trades@ -stackupper@ -colorful-orbs@ -@idmxd -modernxl-2-in-survival -creepercollateral -findmyitemsandfluids -@numeric-experience-info -aquapatch -aviator-dreams@ -macaws-stairs@|Macaw的楼梯与露台 (Macaw's Stairs) -cross-stitch-colours@ -gaming-deco@ -reactive-music@|韵律回响* -easel-does-it@ -rbasamoyais-betsy-ross@betsy-ross - - - - - -dropped-item-tweaks@droppeditemtweaks|掉落物调整* -movingquickly|禁用快速移动检查 (MovingQuickly) -@soup-api -@tsa-decorations -@autofarm-mod -gelato-galore-2@|意式冰淇淋盛宴* -dyeable-jack-olanterns@ -white-pumpkins@ -dawn-of-the-flood@ -deatbutthreereload@|逝不过三:重开 (Death But Three Reload) -common-weapons -ore-silverfish-mod@ -gtbcs-spellbooks -project-lambda - - - - - -@pretty-hitboxes-create-addition|可配置的碰撞箱显示-机械动力功能附加 (Pretty Hitbox-Create Addition) -watersource-reborn@|水源:重生 (WaterSource: Reborn) -locks-unofficial|锁:非官方版 (Locks-Unofficial)¨@locks-unofficial|锁:非官方版 (Locks-Unofficial) - 已失效 -epicfight-improve@epicfight_improve|史诗战斗:改进 (EpicFight:Improve) -just-in-nether@ -jinghui@|镜回 (JingHui) -@ripples-of-the-past-mandom-addon|RotP:男人领域附属 (Ripples of the Past: Mandom Addon) -@auto-gg -better-brightness-slider-respawn@ - -@playergyro -animatica-foxified@ -mcchatgpt@ -@aimobs -ambiances@aurae|氛围! (Aurae!) -screw-your-items@ -mace-port -bloodlines -vampiric-ageing-a-vampirism-addon -extra-enchantments-and-curses@|更多附魔和诅咒 (Extra Enchantments and Curses) -enchanting-tweaker@enchanting-tweaks -just-a-lot-more-enchantments@ -alessandrvs-enchantments@alessandrv-enchantments -armor-abilities@ -sleepy-hollows@|沉眠空谷* - -nametag-tweaks@nametagtweaks|名称标签调整 (Nametag (Display) Tweaks) -@sodium-no-alerts -headshot-respawn@|爆头:重生 (Head Shot Respawn) -leafdecaystopper|树叶腐烂抑制器 (Leaf Decay Stopper) -animated-loading-screen@ -@rotp_whitesnake|RotP:白蛇附属 (Whitesnake Addon (Ripples of the Past)) -@ripples-of-the-past-made-in-heaven-addon|RotP:天堂制造附属 (Ripples of the Past: Made in Heaven Addon) -@ripples-of-the-past-c-moon-addon|RotP:新月附属 (Ripples of the Past: C-Moon Addon) -imbued-gear@ -tacz-js@ -ipla@ -bcg-util -sciophobia@|全局自定义文本阴影渲染* -lithic-addon-mod -light-blocks-from-1-17@ -light-and-shadow@ -excavein@ -spanish-delight-a-farmers-delight-add-on@spanish-delight|西班牙乐事 (Spanish Delight) -ars-nouveaus-flavors-delight@arsdelight|新生乐事 (Ars Nouveau's Flavors & Delight / Ars Delight) -oceanic-delight@|海之乐事* -the-player -kelka-craftable-animals@craftableanimals -super-hyper -wans-ancient-beasts@wab|Wan的远古异兽 (Wan's Ancient Beasts) -invocations-spell-engine@invocations -gearifiers@ -recall-potion-neoforge@|回忆药水 (Recall Potion) -flowing-fluids@ -frights-and-foliage@ -blorfstone -filinkus-s-huge-tools -necromancer-mod -e_kedis-electronics -uprade-yourself - -smelting-touch-enchantment -shinobiorigins-utils -unifine -trailier-tales@ -mixinjs-coremod -mcwen -rank-system|评分系统* -@creative-one-punch-forge -bundle-inventory|Bundle Inventory - 问题反馈¨@bundle-inventory -scroll-tweaks@scrolltweaks|鼠标滚轮调整* -st@server-tools|服务器工具 (Server Tools) -ride-every-thing@|骑乘一切* -cit-resewn-neopatcher@ -legendary-creatures|传说生物* -@meowcraft-mod - - - - -frozenlib@ -clientblock@ -eventjs -backup-manager@ -the-root-of-fear@ -the-modifiger@ -keypreset@|键位预设 (KeyPreset) -@tweakeroo-features-menu -sanity-prequel|理智:前传 (Sanity: Prequel) -ayame-paperdoll@|Ayame 纸娃娃 (Ayame PaperDoll) -@registry-helper-lib -@carpet-permissions -passive-shield@|被动盾牌* -trap-expansion -roost-2-flying-higher -@amber -liteminer@ -@lvlz-better-nether -@lvlz-better-end -cc-shops@ -modular-machinery-reborn@ -flare@ -rs-crafting-monitor-in-grid@ -@photonics -lambdynamiclights-unofficial-neoforge@ - -@heracles-button -voicecontrol|声控* -hex-ars-linker@|魔力媒质链接 (Hex-Ars Linker) -bingolobby@|宾果游戏大厅 (BingoLobby) -worldedit-legacy@worldedit-legacy-enhanced -@nohealthbar -asm-fixes-j-a-f-m -moestweaks -prickle@ -farming-3x3@ -trickery@ -kebab@bogismokkebab -farmers-croptopia@ -mc-mods-trees-drop-apples -infinite-dimensions@ - -mofus-broken-constellations -starlance@ -beneath@ -@simple-client-base|简易客户端:基础 (SimpleClientBase) - - -ultimate-enchantment@|终极附魔* -ron-settings -backpack-display@|背包物品内容显示* -horrrs-pvz|Horrrs的植物大战僵尸* -@optibabric -item-restrictions@ -vintage-animations@ -the-one-who-watches@ -scp-ultimate -herobrines-omen -sws-wukong -dragns-valiant-vehicles@dragns-valiant-vehicles! -bio-factory@biofactory|机械动力:血肉工厂 (Create: Bio-Factory) -create-ad-astra-compatibility -create-mechanical-chicken@ -zbgt@ -casinocraft -@mql-tir5d-turtle -toadlib|ToadLib - 不全¨@toadlib - - -crosshair-tweaks@crosshairtweaks|十字准星调整* -what-did-i-just-kill@ -scalablelux@ -weather-changer@ -iron-nugget-recycling -@picohud -re-exposer@|Exposer 重置版 (Re-Exposer) -gtmoreoreprocessing@ -computercraftedu -bibliocraft-legacy@ -simple-clouds@ - - -furniture-modcraft@several-furniture-craft - -spellblades-and-such-hexblade - -sons-of-sins-organs-additions|七罪之子:器官添加 (Sons Of Sins: Organs Additions) -sons-of-sins-organs-museum|七罪之子:器官博物馆 (Sons of Sins: Organ Museum) -mobs-of-sins-alexs-mobs-integration-forge|七罪之子: Alex的生物集成 (Mobs of Sins: Alex's Mobs Integration [Forge]) -stitched-sins|缝合的罪* -@bio-delight|血肉乐事 (Biomantic Delight) - -the-sculpture -goop@ -neepmeat@ - - - -@huangsheng1s-more-monster|更多怪物 (HuangSheng1's More Monster) -creeping-woods -@zac -dragon-mounts-2@|龙骑士2 (DragonMounts2) -life-fruits@|生命果* -ati-structures -fantasy-armor@fantasy_armor|幻想铠甲* -beautiful-enchanted-books@beautiful-enchanted-books-mod-edition - - -void-fog@voidfog -@legacy-rocket-model|旧版火箭模型 (Legacy Rocket Model) - - - -tinker-i-o-ce|工匠接口社区版 (Tinker I/O CE) -more-shield-variants@ - -bendy-items -paladins-oath - -roundabout-the-jojo-mod@roundabout_the_jojo_mod - - -enviromine-continuation@|更多生存要素:延续 (EnviroMine continuation) -@toffys-hooks -mutants-buff - -@blockplayer|玩家方块模型 (BlockPlayer) -terrablenderfix@ -craterlib@ -@caramel-chat -spark-unforged@ -pack-mode-reborn -mc-mods-the-wood-weve-got@all-the-wood-weve-got -bibliowoods-legacy@ -hydrological@ -unilib@ - -modchu_playerformlittlemaidfml -quiet|迁噪碍音/玩家禁言* -galacticraft-compatibility@|星系兼容* -@bettertab -modular-machinery-reborn-mekanism@ - -dawn-of-time-roa-edition -buildpaste¨buildpaste-for-fabric -mutils@ -better-campfires@|更好的营火* -@mtr-renfe-addon -gt-community-additions@ -more-create-burners|机械动力:更多燃烧室* -create-logistics@ -create-pneumatic-equipment@ -collisiondamage|碰撞伤害 (CollisionDamage) -@absolutely-proprietary -tensura-reincarnated@|关于我转生变成史莱姆这档事:转生 (Tensura: Reincarnated) -transformer|奥特化身:无限 (Becomes Ultraman:Infinity) -henshin|变身* -ridiculous-world -enhanced-biomes -quartz_craft@|石英工艺 (Quartz_Craft) -cursed-stare@ -legendblade|传世之刃 (LegendBlade) -@hypothermic-reforged -scape-and-run-parasites-extra@|逃逸:寄生体扩展 (Scape and Run: Parasites Extra) -lauchs-shutters@shutters -golden-foods@golden-foods! -@alexscaves-delight -@spmreborn|烤地瓜:重生 (Sweet Potato Reborn) -dragon-fight-config-endergetic-addon -hour-clock-24@|24小时制 (24Hourclock) - - -celestial-forge|星月再锻* -mahjongcraft@|麻将工艺 (MahjongCraft) -formidulus@ -ames-stranger-things -herobrine-origins -milkable-blazes¨@milkable-blazes|Milkable Blazes - 已归档 -@rotp-stone-legacy|RotP:暗之遗物 (Stone Legacy (Ripples of the Past addon)) -furniture-beetle@ -mekanism-x-create-northstar@|通用机械:北极星 (Mekanism x Create: Northstar) -@createz -create-smart-crafter@ -create-fuel-and-water-information@create-fuel-water-information -thematic@ -more-composter-variants@ -more-fletching-tables@ -more-grindstone-variants@ -more-bed-variants@ -more-loom-variants@ -more-feeding-trough-variants@ -more-smoker-variants@ -manascore@ -ames-mobs-configuration|AME生物配置 (Ame's Mobs' Configuration) -display-delight@ -realistic-torches-roa-edition -explorers-compass-edited|探险者指南针 修改 (Explorer's Compass Edited) - -@slime -x-backup@ -iron-barrels-forge@iron-barrels -spectral-decorations@ - - -trims-on-tools@ -galacticraft-automatic-resources|星系自动资源* - -@lx-light-assist-tool|轻辅助工具 (light assist tool) - - -roberts-building-pack|Robert的建筑扩展包 (Robert's Building Pack) -arcanus@ -ultimate-chess@ -sparkweave@ -visualjs -lights-out -a-night-stalker -the-faceless-duo -scape-and-run-parasites-meteorite@|逃逸:祸从天降 (Scape and Run: Parasites Meteorite) -cravencrafts-bloody-bits@ - -@carcrash|撞车 (CarCrash) - -fastlang -min-3-hall-a@ -modular-machinery-reborn-energistics@ -tweaks-for-galactic-science -java-version-checker -chatcopyrite -chat-boost|聊天增强* -terracart -noteblock-backport@ -scape-and-run-parasite-dimension@srdimension|逃逸:寄染之世 (Scape and Run: Dimension) -hexdebug@|咒术调试 (HexDebug) -paths-of-sin@ -@mapperplugin -@enchantment-decomposition|附魔分解 (Enchantment Dismantling) -hide-key-binding@|隐藏按键绑定* - -inline@ -fluffy-fur@ - - -head-cutter|玩家剪头* -salty-s-realistic-forging@saltys-realistic-forging -@vs-wakes-compat -@vs-crumbles -@vs-ship-in-a-bottle -rustic-pancakes@ -ice-and-fire-delight@|冰火传说乐事 (Ice and Fire Delight) -additional-dragons -enigmatic-unity -ephemera@ -theurgy-kubejs@ -immersive-lanterns@ -txnilib@ -default-key-setup@|默认按键配置* -the-man-king -create-arms-race@ -powered-flashlight@ -vmc-mc@virtual-motion-capture-for-minecraft -@hexcellular -hex-conjuring@|咒术构筑* -hexjs@ -craftsense@ - -zenkorium-creatures -zhengelss-techguns-addon@zhengelss_techguns_addon -more-artifacts@ - -tfcgenviewer@ -terra-math@ -lukis-crazy-chambers -tumbleweed-wasteland -irons-jewelry|Iron的宝石与饰品 (Iron's Gems 'n Jewelry) -atlas-api -loading-screen-messages -@pipesounds -nemos-invertory-sorting@nemos-inventory-sorting -@better-ux -@hudmini -ribs-panning -hotkettles@ -gift-drop@ -dragns-livestock-overhaul@ -storage-drawers-unofficial@|储物抽屉非官方版* - -centrifuge-tiers-reproduced@ -dense-mekanism@ -simple-missles@ -galosphere-spellbooks@ -discerning-the-eldritch -@hexcassettes -wardens-plus -ender-wyrmlings - - -new-classic-battle-towers -chitin-equipment@|甲壳装备* -mowzies-cataclysm@|Mowzie的灾变 (Mowzie's Cataclysm) -stardew-fishing-fabric@ -piglin-slayer@ -cataclysm-tools@ -witherite-gear -faunus@ -oo-ee-a-e-a@ -@translator|翻译器 (Translator) - - -sodium-embeddium-options-mod-compat@sodium-options-mod-compat -secureseed-reborn@ -creative-eats -mazerooms@ -friendly-chests@ -@chitinous_ties -brewable-dragons-breath@|龙息可酿造 (Brewable Dragon's Breath) -flerovium@|鈇* - - -gathering-torches-become-sunlight|薪火,造炬成阳* - -@morechathistory-neoforge|更多聊天记录-NeoForge (MoreChatHistoryNeoForge) -no-arrows-in-you-respawn@no-arrows-in-yourespawn - -glowcase@ -hitbox-api@ -@polynametag -broken-nametags@ -@compostable-flesh -a-cute-little-crock-pot@ -@bountifulharvest|感恩节乐事 (Bountiful Harvest) -wasteland-grocers -arcane-tablet -@unflavoured-pipes -curvy-pipes@ - - -classic-bar-legacy|经典状态条 延续版* -glowing-eyeblossom@ -openlink@|开放式联机 (OpenLink) -@vs-grapples -@mydriasis -no-mob-spawning-on-plants@ - -durability-rework@ -more-villagers-re-employed@ -similsax-transtructors -tcw-bedrock-breaker -apothic-reforge-tokens -advanced-skills-remastered@|进阶技能:重制版 (Advanced Skills: Remastered) -monsters-and-dungeons -cultivate-the-eternal-realm@ -too-much-bosses -valoria@ -glowroot@ -@instaminable-deepslate - -greedy-bag -naughthirium@ -chunkpurge|区块清除 (ChunkPurge) -kubejs-tfmg@ -gauges-and-switches-ported -mifa@ -tis-vs@ -pistronics-2 - - -gladius-combat-evolved -hungry-chests -better-withered-mobs@ -pkgbadges@ -@carbasa -countereds-settlement-roads@ -countereds-terrain-slabs@ - -explosive-enhancement-reforged@explosive-enhancement-forge -tmtravlrs-arrow-trails|Tmtravlr的箭矢轨迹 (Tmtravlr's Arrow Trails) -biome-replacer@|群系替换器*¨biome-replacer-neoforge@|群系替换器 (Biome Replacer) -custom-suspicious-stew|自定义谜之炖菜* -@child-folder-mod-scanner|子文件夹Mod扫描器 (Child Folder Mod Scanner) - -@create-stress-debug -create-kart -@barometry - -menufpsunlocker@ -bogged-spawn@ -unicode-fix@ -insanity -sepals@ -frustum-culling-advanced - - -star-meow-craft|星喵工艺* -@defile -vanishmod@ -@eat-it -f1-y-f5-mod@perspective-lock -meddlebootstrap -mc-modstheleaks -walk-overhaul -no-strip@ -mcplus-remastered|MCPlus:重置版 (MCPlus Remastered) -instant-classic-houses -hexparse@ -betterraid|更好的劫掠 (BetterRaid) -villagermetafix -create-better-villager@create-better-villagers -mc-modsjs@filesjs -robotic-parts-first-aid-compat -craftingpad-fabric@craftingpad - -exlines-sushi-mod@sushimod|寿司 (Sushi Mod) -demanding-saplings@ -coastal-waves@ -@no-swimming - -stone-zone@|泛用兼容:石材 (Every Compat*) - -a-man-with-plushies@ -enchantmentransfer@|附魔转移 (Enchantment Transfer) - - - -@async -@mtr-ante|无名的纸板箱交通拓展 (Aphrodite's Nemo's Transit Expansion) -touchcontroller@|触摸控制器 (TouchController) - -let-me-click-and-send@ - -careful-cast-corrector-ccc -lagbgon-revived@ -project-steam -extended-crafting-terminals-for-applied -sweety-archeo@sweety-archaeology - -chamber-clarity-tac-z@tacz-chamber-clarity -@techguns - -@jdinpack -selfexpression-slim@ -nothing-dimension@ -@glassitemframes -portable-stations -new-world-mod@ - - - - -book-scroll@ -@journalmod|日志模组 (Journal Mod) -@autotool-ks|自动工具 (AutoTool) -@fakevanilla - - - - -qualia-carpet-addition@qca -mouse-tweaks-unofficial|鼠标手势非官方版* -baubles-lts -elysium-api@ -noisethreader@ -@no-bats -antibat@ -illage-and-spell-age -origincore|起源核心* - -pet-connect|收容宠物* -heaven-destiny-moment|天命时刻* -industrial-foregoing-extra-upgrades|工业先锋:更多升级 (Industrial Foregoing: Extra Upgrades) -growableores-extension@|甘蔗转换机 (GrowableOres Extension) -oneiricconcept@|梦华构想 (OneiricConcept) -simelectricity -somnia-refreshed@ -terramoment|泰拉时刻 (TerraMoment) -miners-diary-beyond-village -biggerchathistory -unifier -compass-ribbon@ - -@elytra-hud -creeper-drops-tnt -visual-novel-framework@ -@experience-progress -yapping-tooltips@ -bird-nests@birdnest -tfc-purified-water -@exparticle|粒子扩展 (ExParticle) -@entity-render-disabler -quick-right-click@ -alchimiae-magicae@|炼金魔法师 (Alchimicae Magicae) -thaumic-forever -gregfluxology|GTCEu/GTM能源拓展* -create-crowns@ -@create-modular-tools -ae2-wireless-terminal-lts -@cme-is-bad|并发修改什么的不要鸭 (CME is Bad) -enchantment-harmony@|和谐相处的附魔书 (EnchantmentHarmony) -quick-refine|快捷锻刀* -rubinated-nether@|耀红下界* -cornucopia-bypizza573@cornucopiabypizza573|丰饶之角 (Cornucopia) -epic-fight-bow-tweak@ - -jjkutilities -crystal-chronicles@ - -water-particles-render-fix -ray-trace-library -delayed-thunder@ -book-and-quick-save@ -keybaordjs@keyboardjs -better-eating-mod@better-eating - -@heart-effects -@global-wind -botaniavisualizer - -manavisualizer -easierworldcreator@ewc -kubejs-diesel-generators@ -create-slugma@ -cobblemonrider@cobblemonrider1.5 -cobbledex@cobblemon-pokedex - -item-descriptions@ -item-production-lib - -connectedtexturesmod-backport -@litematica-printer-easyplace-extension|投影打印机 (Litematica-Printer-Easyplace-Extension) -elegant-architecture@|雅致画栋* -extended-workbench-reborn|扩展工作台重置版* - -@stans-deathshot -pathunderfencegates@ - -latiao-craft-2@|辣条工艺 2* -canned@ -mushroooms@ -tacz-compatibility -@baablu-natural-disasters -@tacz-tweaks -un-saddle -@item-landing-sound -rehooked@ - - - -better-night-vision@betternightvision|更好的夜视* - -manors-bounty@|庄园馀话 (Manor's Bounty) - - - - - -vanilla-anvil-repair -tiered-depths -tooltip-tweaker -editableedibles@ - -@mcdr-command-fabric -betterbuilderswandsfix@ -pigzilla@ -pale-garden-backport@ -seasons-greetings@ -ex-nihilo-coloratus|无中生有:多彩 (Ex Nihilo: Coloratus) -granular-mob-griefing -@dashloader-portinglib-compat -fermiumbooter2mixinbooter -immersive-optimization@ - -tab-tweaks@tabtweaks -fermiumasm@ -mc-mods-mobs-out-of-the-pool -clipboardplus@clipboard -misty-world-unveiled -balkons-weaponmod-legacy@|更多武器:传承 (Balkon's WeaponMod: Legacy) -betterendforge-backport -epic-fight-mod-rapier-moveset-addon -legendary-warriors -scape-and-run-holiday@|逃逸:节日 (Scape and Run: Holiday) -crimson-steves-mutant-mobs@ - -tactical-imbuements -puppy-paws@ -ae2-mega-things -solar-flux-reboot -solar-flux-additions -anvil-cell-workbench -@ultimate-furnace -create-sifting-fabric@ -create-magics@ -@crypto -@polyfactory -buildcraft-legacy@legacy-buildcraft - -wither-storm-delight|风暴乐事* - -x1000-botania@1000x-botania -angel-ring-classic|天使指环经典版* - -better-animations-collection-revived-2 -scape-and-run-parasites-tweaker -scape-and-run-parasites-medical-addon -durability-overhaul@ -quick-hotkeys@quick_hotkeys -@alwayschristmasday|永远的圣诞节 (AlwaysChristmasDay) -@strongluck|强运 (StrongLuck) - -uncrafted@ -mcjtylib-refilmed@ -nanny@ -resource-library@ -resource-config-api@ -@threatengl -hybridfix@|混合修复 (HybridFix) -@disable-portal-checks -eat-eat-eat|吃吃吃* -@recipe-stages-js|配方阶段 (Recipe Stages JS) -create-morerecipes -portable-craft-bench -portable-tables@ptables -@flux-network-fork-neoforge -resource-backpacks@ -etherology@ -snackpirates-aeromancy-additions@aeromancy-additions -apothic-enchanting -maidsoul-kitchen@|女仆厨房* -refinedtools@ -programmed-circuit-card@ -ae2-toogleable-view-cell@ae2-toggleable-viewcell|AE2可切换显示元件 (AE2 Toggleable ViewCell) -@cobblemon-armors -letmorefishlove@ -l_ender-s-delight@l_enders-cataclysm-delight -ofaw-of-faith-and-war-1237|信仰与战争1237 (Of Faith and War 1237) -lotmoresteves - -legendary-armory-zelda-mod@legendary-armory -hot-update-1-23-by-gt¨@hot-update-1.23-by-gt|Hot Update 1.23 by GT - 已失效 -management-wanted@ -perception@ -fancy-vfx@ - -pretty-rain@ -alchemancy -flavorful -heavy-fallings@ -erudite-tweaks -keymap-presets@ -mekanism-no-thanks-nbt@ -@loot-beams-up -@tekst -ledger-databases@ -@enderman-death-silence -infectious-zombie-apocalypse -xiaoanfc@|小安的农业核心 (Xiaoan's Farming Core) -@enchant-golden-apple-reborn|附魔金苹果重生 (Enchant Golden Apple Reborn) -cursor-mod-reload@|自定义光标:重生 (Custom Cursor: Reload) - -celestial-overhaul|星月改革* -simple-faqi@|简单法器 (Simple FaQi) -redes-coins|Rede的硬币 (Rede's Coins) -@teleport-commands|传送指令 (Teleport Commands) -@generic-code-library -cosmeticarmours@ -ooo-jar@000.jar -spawner-tweaks -mob-brawlers -@transformhandlers -player-totem@ -@screenshot-uploader -cute-companions-ducks -loot-n-explore@ -epic-knights-ice-and-fire -medieval-origins-revival@ -construction-sticks@|建筑棒* -sophisticated-storage-in-motion@|精妙物流 (Sophisticated Storage in Motion) -imgur-display@ -extra-sponges@extrasponges|更多海绵* -more-wolf-armors@|更多狼铠* -not-enough-rocks@ -pedestal@ -@snowball-and-egg-knockback -forestry-worktable-display -accessorify@ -high-quality-crops|高品质作物* -immortal-enchantment@|不死附魔* -awesome-storage|魔法存储* -@wallpaper - -@modify-player-data -idcv@|ID冲突查看器 (ID Conflicts Viewer) -eaglemixins -kubejs-thermal-augments -@minopp - - - - -camera-anim@|相机大师* -mekanism-upgrades-reborn|通用机械升级突破:重生 (Mekanism Upgrades: Reborn) - -epic-fight-x-irons-spells-animation-fix@ -epic-fight-x-wings-reborn-animation-fix -ef-bs@battle_arts -alshanexs-familiars@ -feur-skyland@ -balkons-expansion - -ascendant-mobs@ -duarm|羽化盔甲 (DuArm) -bomd-addon -create-the-air-war@ -bew76@ -block-swapper@ -@simplemap|简易地图 (SimpleMap) -@oneconfig -iron-chest-unofficial@|更多箱子非官方版* -notenoughids-unofficial-1-7-10@notenoughids-unofficial|增加ID上限非官方版 (NotEnoughIDs Unofficial) -@shutdown - -tornado-mod-classic@weather-and-tornadoes-classic|局部气候&风暴经典版 (Weather and Tornadoes Classic) -strange-berries@ -jeffs-cursed-walking-structures -terra-entity@|泰拉生物* -not-interested@ -@new-soviet - -gt5r -ragexs-nuclear-tech|Ragex的核科技 (Ragex's Nuclear Tech) -civcraft -create-springs-loaded -mekanism-the-factory-must-grow-compatibility@mekanism-tfmg-compat -cfm-refurbished-circuit-breaker -diving-bell-for-tfc - -piglin-safety-reburn|猪灵 多喝岩浆:重生 (Piglin Safety: Reburn) -papers-please|请出示证件 (Papers, Please) -the-twilight-forest-unofficial@|暮色森林非官方版* -somnia-awoken-gui-beautify|梦醒时分 - GUI美化 (Somnia Awoken - GUI Beautify) -redstonecraft@redstonecrafts|红石工艺 (RedStoneCraft) -mowzies-mobs-baubles|Mowzie 的生物饰品 (Mowzie's Mobs' Baubles) - - -dungeons-and-combat -@blossomlib -mod-erate-loading-screen-forge@ -fastquit-forge@ -ingame-info-reborn|游戏信息显示复兴版 (InGame Info Reborn) -@overlay-mod -bedisnottoofarawayrefoxed|就要睡觉 (Bed Is Not Too Far Away Refoxed) -goopreforged@ - -@crimes-against-the-jvm -better-split-stack -sdm-engine-core@sdm-core -sdm-stages@sdm-gamestages - - -huh-fabric@huh|哼? (Huh?) -@acme-admin-tools -custom-nausea@¨custom-nausea-fabric -accesstransformerjs - -checklist - - - - -puncher@ -sensible-stackables -rei-addons-ic2classic -@blossomtpa -@lithium-raycast-fix -@yet-another-minecraft-bingo -tools-attack|工具也横扫!* -darkster-epic-guns-tacz-epicfight -epic-tweaks@ -epic-fight-x-gliders - - -familiar-faces@ -eyes-in-the-dark - -jellyfishing-delight@|抓水母乐事* - -carrot-rarity@ -more-husbandry -chest-with-legs@ -biodiverse -railway-wires -bullseye|靶心* - - -create-mob-spawners@ -salvation-archives-lobotomy -rlcraft-parasited -dregora-rl -underneath -@leaf-me-alone -rocket-mons -farsighted-mobs@ -@hev-suit-voice-system¨@h.e.v-suit-voice-system|HEV Suit Voice System - 已失效 -astral-sorcery-anti-anti-fake-player-asaafp@astral-sorcery-anti-anti-fake-player -apotheosis-ascended@ -@better-than-wolves-legacy-unofficial -warium -@ait_plus -fabulous-fletching -universal-wrench@ -@bottle-ship|瓶中船 (Bottle Ship) -smallblueslimes-ladders -doomsday-decoration|末日装饰* -overclocked-watches@ -portable-wardrobes-easy-armor-swap - - - -eternalappetite@|永恒食欲 (Eternal Appetite) - -platform@ -wandering-cocoa@|流浪的可可豆* - -no-more-potion-particles@ -larion-world-generation@larion-worldgen -blueprint-texture-issue-fix -transparentcapespatch@|透明披风修复 (TransparentCapesPatch) - - -saltyfish-vehicle@ - -tacz-leawinds-third-person-compat@ - - -gtmaid|血汗工厂 (GTMaid) - -@damage-tilt-fix -illager-raid-music@ -@apron -@coordinated-compass -prinegorerouse|尼格洛兹·旧日重铸/尼格洛兹·万神重归* -feur-extension-desert@ -scape-and-run-parasites-quark@|逃逸:疫染夸克 (Scape and Run: Parasites Quark) -infested-swarms-and-spiders@ -integrated-cataclysm - - - - -@searchworldenhance -colonies-maid-citizen@|殖民地女仆市民* -relictium@ -royal-city-gladiolus-sweep|王城剑兰-清理* -@inventory-blur -personal-cloud-storage@|个人云存储* - -@omni-mobs -@him -steve-anomaly@the-anomaly -integrated-simply-swords -obsidian-equipment@ - - - -the-deep-void@(mortius)-the-deep-void - -cataclysm-incinerators-try-hard@incinerators-try-hard|灾变:武器技参数配置/冒火的剑 (Cataclysm: Weapon Skill Config/ Incinerator's Try Hard) -scp-apollyon-scp-apollyon -trickster@ -pale-garden -shulker-enchantments@ -xenotech@ -sewing-kit -zephyr@zephyr-mod -create-radars@|机械动力:雷达 (Create: Radars) -create-more-additions@ - - -minecart-turning-reforged@minecart-turning¨@minecart-turning-reforged -offlimits@ -apotheosis-threat -@string-duper-fix-remover -@superresolution|超分辨率 (Super Resolution) -special-model-loader@ -vs-ship-handler@ - - -@dice-rebuild -lets-do-apple-wood@lets-do-addon-apple-wood -ascended-quark@ -enchanted-vertical-slabs@ -@better-ladders -would@|木韵自然* - -gendustry-community-edition@|基因工业:社区版 (Gendustry: Community Edition) -ae2fix@|AE2修复 (AE2Fix) - - -betterenddelight@|更好的末地乐事 (BetterEndDelight) - -@spanish-delight-refabricated -crate-delight-croptopia@|装箱乐事:作物盛景 (Crate Delight: Croptopia) -foodspoiling@ -natura-legacy -pepsied-potted-farms - - - - - -riding-partners-reforged@riding-partnersreforged|双人骑行:重铸 (Riding Partners:Reforged) - -cat-healing -plumbob -@variants-cit - -@more-enchantments-soybeani-more-enchantments|豆浆更多附魔 (More Enchantments by Soybeani) - -@clearviews -@immersive_weapons_sounds -epic-fight-invincible|无坚不摧 (Epic Fight - Invincible) -ore-dict-re-order -electrostatics - -evil-captcha@ - - - -fpsmatch@|通用射击游戏比赛框架 (FPSMatch) -mythic-charms@|神话护符* - - - -minecraft-add@|原版补充* -stacked-blocks@|捆扎方块* -stacked-blocks-farmers-delight@|捆扎方块:农夫乐事 (Stacked Blocks: Farmer's Delight) -fowlplay@ - -ender-totem -diversity@faewufs-diversity -tonsofenchants - - -cave-root - -whos-there-ghost-players@ -the-cuckoo-clock -final-samurai -classic-battle-towers@|经典战斗高塔* -sihywtcamd-extensions@difficulty-extensions - -@heart-crystals -@partialhearts -@the-abyss-runtime -cosy-critters@ -omnilib@ -astages -@aloria-loading -@parentalcontrols -jason-bot|Jason机器人* - -fly-in-the-sky|高空飞行 (Fly in the sky) -@smartelytra|智能鞘翅 (SmartElytra) -momotinker|墨工坊 (momotinker) -electrostaticsre|每日任务 (ElectrostaticsRE) - -brooms-unofficial|扫帚:非官方版* -fishing-dangers -distinctpaintings@ -@search-on-mcmod|MC百科搜索 (Search on MCMOD) -infinite-lava-renewed -@better-fabric-console|更好的 Fabric 控制台 (Better Fabric Console) -mine-tooltips -fastchest-reforged -@better-caves-archaic|古早洞穴优化 (Better Caves Archaic) - -alexis-64-food -cosmetic-armor-revitalized-fabric@ -@ambience-v2 -umapyoi-addon-pack@umapyoi-addon|马儿蹦跳:拓展包 (Umapyoi:Addon Pack) -the-god-of-roadkill -@visual-snowy-leaves -verdant@verdant-mod|葱茏绿意* -grounded@ -gallery@mod - -lost-cities-survive-the-dead-edition - - -power-of-the-void|虚空之力 (Power of the Void) -aerlune-rpg - -hitboxbackport@ -fsmm@ -create-pantographs-and-wires@ -footwork-api@footwork -@halplibe -warmachinelib@|战争机器库 (WarMachineLib) - -crash-assistant@ - - -inventorytweak@|库存调整 (InventoryTweak) -@miss -legendary-tabs|传说选项卡* -sky-breaker-blue-skies-limit-remover-1-18-2|天穹突破_1.18.2 (Sky Breaker_1.18.2) - - - - -@mxa-tools|MX的工具A (MXA Tools) -cloudertinker|浮云工坊 (Clouder Tinker) -xiyus-lucky-block|饩雨的幸运方块 (Xiyu's Lucky Block) -@epicfight_oldsolar|史诗战斗:旧版solar (EpicFight_oldsolar) -reskillable-reimagined -renaissance-core@ -@startup-chime|启动音效 (Startup Chime) -carpet-takeneko-addition@tnca|竹猫的地毯扩展* -chain-mod -speedrunmod -insta-boom -infinite-night -nether-lake -@create-cards -create-powerlines -emerald-nugget -what-dah-dog-doin-tetra-compat -endbiome -jasons-fly-mod -conium@ -yellowtext@ - -healight@ -@body-health-system -savemykeybinds@ -nomenublur@ - -more-loot-tables@ -noteblocks -@crunchy-crunchy-advancements -chainvein@ -mobs-on-rails@ -@no-ones-view-model -gravestone-x-curios-api-compat@ -nolijium@ -eventslib -etst-lib|乙硫醇的匠魂词条库 (EtST Lib)¨@etstlib|乙硫醇的匠魂词条库 (EtST Lib) - 更新可能较慢 -orbs-of-crafting -@leonmtrmod|Leon轨道交通Mod - - - - - -whatimpressing@|正击何键 (What I'm Pressing) - - -stackcraft@ -@extremeview -@materialexcavator -@startinthenether -mekanismmixinhelp -simple-warp-commands|简单传送指令 (Simple warp commands) -@mojangfix -tatercart@ -irons-spell-book-mob-attribute-addon -epic-fightexsilium-gladius|EpicFight—放逐之刃 (Epic Fight — Exsilium Gladius) -kamenriderweaponcraft@|假面骑士武器大全集 (KamenRiderWeaponCraft) - -advancearmy@|先遣部队 (Advance Army) -@blood-blade -@mineimpact|方神 (MineImpact) -jadens-nether-expansion-delight@ - -archery-expansion@ -jjsk - -@so-crazy-try|趣亦合成 (So Crazy Try) -ash-of-sin-overlord|罪业余烬:不死者之王 (Ash Of Sin: Overlord) -carbon-strip-craft-augmented-edition@|碳条工艺:加强版 (Carbon Strip Craft:Augmented Edition) -@ripples-of-the-past-bad-company-addon|RotP:极恶中队附属 (Ripples of the Past: Bad Company Addon) -true-prime-piece -maxims-core|箴言与本源 (Maxims&Core) -arphex@ -cubic-combat-simulator - -webmapview@|网页地图浏览 (webmapview) -f3-is-my-shawty -ollamachat@ -potion-stacker -@betterweather -better-gamemode -better-command -fishermans-haven@ -bakeries|烘焙坊* - -female-plastic-surgery-bust-limit-tweaker - -feur-pet-hat-forge@feur-pet-hat -feur-dimensional-skyland@ -feur-colors@ -feur-statue@ -feur-builder@ -feur-elytra-wings@ -feur-magic-more-enchantments-xp-bottle-forge@feur-magic -veggies-delight@|蔬菜乐事* - -ramadan-delight@|斋月乐事* - - -potion-core-reborn|药水核心:重生* - -rolling-gate@|卷帘门* -bettertab@better-tab|更好的Tab (BetterTab) -let-me-see-see-your-code@let-me-see-see-(your-code)|让我看看 (LetMeSeeSee(YourCode)) -put-mana-in|手充魔力* -ars-botania - -baublesex -custom-block-highlight@|自定义方块高亮* -tinkers-simple -threedmusket -rtmmetro|真实火车:地铁扩展 (RTMMetro) - - - -lobotomy -parrot-power -fortune-ores-2 - - -feur-dungeon-spawner@ -feur-extension-fossil@ -feur-extension-jungle@ -cybernetic-system|赛博系统* - - -liquid-dirt -liquid-blocks@ -apothic-combat@ -toms-trading-network@ -somanyapples|超多苹果 (So Many Apples) -static-block -cherryvillage -ductwork@|管道* -cooldown-coordinator@ -librarianlib-continuous@ -luna@ -loot-integrations -realtimescale - -crafting-recipe-exporter - -extra-apoth-compat -pathtracker@ -elytra-protection -skip-sleep -stony-cliffs-are-cool -simple-ender-things -mimecraft-mod -warden-sword -arch-bows@ -fancy-trinkets@|精美的小饰品* -block-n-zapping@ -cgs@ -dynamic-trees-jadens -dynamic-trees-croptopia-new@dynamic-trees-croptopia -stacksonstacks -more-of-all@ - - -popular-biology|热门生物* -tolkien-tweaks -tolkien-tweaks-mobs-edition -soulplied-energistics -valarian-conquest -mowzies-mobs-respawner -crafting-station-jei-edition@|合成站:JEI版 (Crafting Station: JEI Edition) -more-waterlogging -the-ancient-trinkets-index@ -straw-golem-rebaled-ported@ -haybale-1-20-1@haybale-ported -gtbcs-spelllib -haybale@ - -creative-eating-reforged|创造也能吃* -@better-mod-list-button-fix|Better ModList 按钮修复 (Better Mod List Button Fix) -krypton-foxified@|氪 NeoForge 版* -proximity-text-chat@ -justleveling-fork@ - -redirected@ -asynchronous-reprojection@ -not-enough-keybinds@ -daily-deliveries@ -vehicular-movement-light -vehicular-movement -onysdvehicles@onysd-vehicles - -zunpet-forge|Zun号非官方NeoForge/Forge版 (ZUNPet NeoForge/Forge) -more-hitboxes@|更多碰撞箱* - -shipwreck-fix|沉船修复/沉船卡顿优化* - -narcissus-farewell|水仙辞* -mcmod-splash-plus-plus|百科闪烁标语++ (MCMod Splashes PlusPlus) - 部分常用¨@mcmod-splashes-plusplus|百科闪烁标语++ (MCMod Splashes PlusPlus) - 全 -random-enchants-2|随机附魔 2* -sparkle-reforge@|火花:重铸 (Sparkle: Reforge) -led-lighting -not-enough-stuff -iron-fence -bricks -additional-records -firefly-bush -spring-update-snapshot-to-old-versions -@godot-signal-system-lib - -leons-minecraft-dungeons-paintings-mod -miscellaneous-additions@ -rupters-figure-mod-doors -sophisticated-backpack-storage-emerald-upgrade@sophisticated-backpackstorage-emerald-upgrade -sophisticatedinjections@ -immortalers-delight|千古乐事* - -createnuclear@|机械动力:原子核动 (Create Nuclear) -keepthatinventoryopen@ -falcons-single-person-sleep -realisticsleep - -avaritia-1-1x-unofficial|无尽贪婪 1.1x 非官方延续版 (Avaritia 1.1x Unofficial Extended Life) -lightsaberx -prime-punch-one-punch-mod -rpgmana¨arch-rpgmana@ -opposite-dimensions -migamigos -@cloudmusicroom|云音乐房间 / 服内一起听音乐与点歌 (CloudMusicRoom) -theonesmeagle -witchery-companion@ -@tpa-utilities -@remote-player-waypoints-for-xaeros-map - -addonslib@ -siliconedolls@silicone-dolls|硅胶玩偶 (SiliconeDolls) -@authshield|认证防护 (AuthShield) - -redstone-armoury-minus-thermal -elytras-plus -ae2uel-wireless-universal-terminal|无线通用终端 (AE2UEL Wireless Universal Terminal) -presents -create-picky-waterwheels@create-picky-wheels - -@green-screen -fancy-lamps -resizing-potion -miku -advanced-smelter@|荒古炼金炉 (Advanced Alchemical Furnace) -extended-tinker|匠魂扩张* - - -bedsheet@|床单 (BedSheet) -despawn-tweaks@ -planetguylib -@fabric-kotlin-extensions -crafting-table-plus@ -@replay-export -@loot4everyone -containerfix -cool-rain@coolrain -queqiao|鹊桥 (QueQiao) -lexikon@ - -idmid@ -simple-concrete@ -chunk-activity-tracker@ -lets-do-lilis-lucky-lures@ -craftformers-prime@ -@pumpkinmoon -@vbe -arts-by-kev-mod-2023@ -the-lion-king-mod -epic-terrain-compatible|史诗地形兼容版* -the-beginning -create-simple-ore-doubling@ -create-low-heated@ -planetguy_gizmos -@thirdpersonfix-babric -@retrocommands -@mana-peeper -retro-sophisticated-backpacks|复古精妙背包* -grid@ -emienchants@ -random-complement|随意补充 (RandomComplement) -thedulling -batsword -unidye@ -obs-overlay@ - -cwhitelist@ - -raw-mouse-input-blessed-edition@|原始鼠标输入 - 祝福版 (Raw Mouse Input - Blessed Edition) - -@hidetags -grass-kiss@ -attack-through-grass@ -structurify@ -netherite-beacons-forge@netherite-beacons¨netherite-beacons -esoteric-reforging-forge -dimensional-leap@ -replant-it@replant-it! -trail-tales-delight@trailtales-delight|樱途旅事 (Trail&Tales Delight) -pams-harvestcraft-2-fantasy -alexs-caves-rad-fork@ -hongbao-red-envelope@red-envelope|红包 (HongBao: Red Envelope) - -sortilege@ - -lazymodder - - -minecraft-skill-tree -skill-tree-mod - - -easy-shulker-access -@ysbb|森罗物语 (Kaleidoscope Mod) -torch-slabs-renewed|更好的火把放置重制版* - -wormhole-artifact@ - - - - -create-diamond-factory@ -create-realism@ -create-sound-of-steam@ - -big-explosives@ -ice-cream-creepers -aquatic-craft -village-taverns@|乡村酒馆* -f-a-rebirth-and-expand-genesis -fossils-archeology-origins@fossilsarchaeology-origins|考古与化石:起源 (Fossils & Archeology Origins) -faunify@ - -wills-hedgehogs -cryptography@metaphysics -@spasm -sketch@ -@envirosoundbeta -@keybindsgaloreplus - -@smoothbeta -no-fall - -scopic -memory-leak-fix-unofficial-remastered -@distance-traveled-calculation - -valkyrien-skies-control-craft@control-craft|控制学 (Control Craft) -reforbidden-magic@|禁忌魔法:重生 (ReForbidden Magic) -moses-mod -craftable-animals|可合成动物* -avaritia-1-1x-kedition -@more_avaritia|更多无尽物品 (MoreAvaritia) -the-block-box@|方块百宝箱* -the-dirtbike-mod -ore-seeds - -mana-visualizer -custom-tnt-igniter - - - -jaiz@jaizmod -harder-illage-and-spillage -dagercraft@|旧超神之路 (DagerCraft) -@deus-ex-minecraft-s-conspiracy|杀出重围 (Deus Ex Minecraft's Conspiracy) -thaumic-staff|神秘法杖* -thaumic-bases-mystical-rose-rework|神秘基础学玫瑰重制* -rhyme-pvz@|PVZ:润 (Rhyme PVZ) -ichorium-kit -reforgotten-relics@|失落遗物学:重生 (ReForgotten Relics) -in-your-world@ -warpapocalypse@warp-apocalypse - -arcane-arteries-kedition|奥法献祭学非官方版* -thaumic-tinkerer-unofficial@|神秘工匠非官方版* - -asyncparticles@|异步粒子 (AsyncParticles) -@dragonfly-model-library -@terrainapi -mnmutils -betterend-elytra-fix@ -player-swap -@configurable-everything -no-hearts-ui@ - - -old-loading-progress-bar@|旧版加载进度条* -raw-tp-chat-command@raw-tp-chat-cmd -@waterplayer -@home-utilities -multiplayer-button@ - -@kelui -brick-lib -@no-slow-motion|无拘速行 (No Slow Motion) -@minecartsloadchunks -guideme@ -neoculus@ -chatwithmobs|与生物聊天 (ChatWithMobs) -@kiss-mod -extra-armor-info@ -feature-recycler@ -ore-hammer@ - -exp-chest -sophisticated-backpack-allthemodium-tier -sophisticated-storage-allthemodium-tier -the-amazing-world-of-mobs-renovated@theamazingworldofmobs -ash-of-sin-tempest|罪业余烬:特恩佩斯特 (Ash Of Sin: Tempest) - -@cauldronfix|铁锅工艺 (Cauldronfix) -spelunker@ -lil-tater-reloaded@ltr -no-modern-industrialization-efficiency -@emitechreborn -@better-mipmaps -showmyskin@ -rhizo -deimos-fabric-forge-neoforge@deimos - -excavation|挖掘* -basic-end-ores|基础末地矿石* -@portable-crafting - -simple-bbq-unofficial|简易烧烤非官方版 (Simple BBQ Unofficial) - -eggy-goodness -@slide-show-pro|幻灯片:增强 (Slide Show Pro) -alternative-twilight@alternative_twilight|暮色:另类* - - -pepsied-item-glow -create-bigger-storage@ -tacz-create - -terrific-trash-cans - -colourful_portals_mod -gud_coolers -suppergerrie2s-drone-mod -data-essence@ - -nautec@|海蓝科技 (NauTec) - -thorny-bush-protection@ -gudlib -reflex-antilag@ -tfc-nei - -nolan -@repeater-sound -audio-hotkeys@ -voicechat-soundboard@ -@the-moon-bta -ftb-ocean-mobs -fake-ores - -@mystical -crackedzombie - -error-404-not-found-horror-entity@error-404-not-found -amelet-totem - - -tbone -fastfurnace-decreased|熔炉性能优化-- (FastFurnace--) - -@cdnperspective3d -@volume-fix -chorus-fruit-drops-nearby@|紫颂果集中掉落* -better-first-aid-visual -tpms@|传送命令·简 (Teleport Master Simplified) -@scoreboard-overhaul - -tensura-mysticism -furnection@lyivxs-furniture|LYIVX的家具* -@colourful-portals-reimagined - -craft-of-the-wild-cotw -piglands-mod -vanilla-extension -floating-items-mod-datapack -butterfly-mania -@rensumo_enchanted_books_addition|Rensumo 的附魔书附加包 (Rensumo Enchanted Books Addition) -kbi-mmd -sowdispenser -metalchests -jumppad -obsidian-boat|黑曜石船* -@moderner-beta -the-animals-plus -create-fluid-stuffs|机械动力:流体附加 (Create:Fluid Stuffs) -create-goggle-placement-lieonlion@ -minecraft-multi-purpose-mod -kubeloader@ -updatefixerupper -configurable-data-fixers@ -lenient-death@ -short-circuit@ -tensura-kumodesu -tinkers-advanced@|前沿匠艺 (Tinkers' Advanced) -more-structure-processors@ -quick-stack-to-nearby-chests@quickstack|快速堆叠 (QuickStack / Quick Stack To Nearby Chests) - -@kallfix -yggdrasilproxy@yggdrasil-proxy - -thaumic-meme|神秘吐槽* -starlightxae|星光xAE2修复 (StarlightxAE) - -@levelclear -@drops-into-shulker -ftb-team-dimensions -epicfight-resurrection|史诗战斗-重生 (EpicFight : Resurrection) -epic-fight-dual-axes -epic-fight-dual-spears -realistic-fire-spread@ -palehell -elainasbroom|伊蕾娜的扫帚 (Elaina's Broom) -extinction-z@ -pomkots-mechs@ - -replication@ -better-sugar-cane|更好的甘蔗* -apogee@ -btrultima-tensura -dragon-block-c-additions -twilight-forest-final-boss -generations-structures@ -oceanic-realms -zoomers-extended-apotheosis -the-god@ -relics-rpg@ -macaws-quark@ -macaws-sajevius@ -macaws-biomes-o-plenty@ - - - -macaws-modding-legacy@ -fancy-spawn-eggs - - - -@no-more-serverconfig|不再有服务器配置 (NoMoreServerconfig) -@queryinfo -ftb-pause-menu-api - -modifyjs@ -@bettershields|更好的盾牌 (BetterShields) -@better-selection - -ytgld-better-beacon@better-ytgld-orb-beacon|亚特格拉德的信标 (Ytgld : Better Beacon) -colorfultools -colorful-armor -ibench -crafting-table-on-a-stick|手持工作台 (Crafting Table on a Stick) - -villager-anti-doors -liquipacks -create-advanced-crafting -create-stone-generators@ -create-cold-sweat@|机械动力:冷汗 (Create: Cold Sweat) -another-unbreakable-enchantment@ -passive-piglins -void-miners -gwycraft-a-colored-blocks-mod -creative-sandbox|创造沙盒* -signboard-preview@|告示牌预览 (SignBoard Preview) - -hexoverpowered@ -hexflow@ - -@chihayaannos-steel-sheet|MyGO!!!!!:千早爱音的前置装甲方案 (Chihaya Anno's steel sheet) -moremekasuitmodules|更多 MekaSuit 模块 (MoreMekaSuitModules) -eternal-attributes@ - -easy-pickings -relics-in-chaos@relic-in-chaos -archers-expansion@ -witcher-rpg-class@ -forcemaster-rpg-class@ -death-knights@ - -immersive-slumber@|沉浸睡眠 (ImmersivelySleep) -bountifulbaubles-reforked@bountifulbaublesreforked|丰富的饰品:重铸 (BountifulBaubles:Reforked) -@anvil-uses|铁砧使用次数显示 (Anvil Uses) -@lucidity-mod|我的视界 (Lucidity) -@mekanismmoremodules|通用机械:更多单元 (Mekanism: More Modules) -@better-armor-swap - -the-man-from-the-shadow@the-man-from-the-shadow-(horror) - - - - -arcanmira -comparties-reborn|组队兼容:重生* -tape-stop@|停碟* -persistent-inventory-search@ -@no-multiplayer-menu -@litematica-enderchest-materials -@mob-protect -only-bags@ -the-broken-script-official@the-broken-script -torojimas-buildhelper@torojima_s_buildhelper -expanded-armory-legacy@|扩展装备:传承 (Expanded Armory: Legacy) -loquat-forge@loquat¨loquat -@waterbeds -@customhealthhud -@fix-horizontal-camera-lag -create-cyber-goggles@|机械动力:赛博护目镜 (Create: Cyber Goggles) -mekanism-elements -bots-lib@ - -botaniaoverpowered@ -@simple_no_survival|蓟县生存 (Simple ? Survival) - - -auto-pillar-generator@|一键柱子生成* -vanilla-delight@vanilla-delights -jade-vs@ - -vics-modern-warfare-patched|维克的现代战争(修复版) (Vic's Modern Warfare (Patched)) -waterframesbackported - -tweakeroo-update-port -xkballs-auto-translate@|xkball的自动汉化 (xkball's Auto Translate) - -block-replacement-mc1-7-10 -@mekanismqq - -confluence@|汇流来世 (Confluence: Otherworld) - - -@trinkets-client-optional -data-packs-helper|数据包助手* -@gokiskills|技能专精 (GokiSkills) - -tconstructjs|有头脑的工匠 (TConstructJs) -maid-storage-manager|女仆仓管* -@mystias_izakaya|夜雀食堂 (Mystia's Izakaya) -lush-scented-paradise|芬芳茶园* - -hold-my-items@ -achievement-extreme -advancement-extreme -recipe-machine-stages-zs-js -configurable-keepinventory -better-chat@betterchat -mekalus-oculus-fork-with-fixed-mekanism-mekasuit -view-emc -fortitude@ -experience-ore|经验矿石* -passive-torch -productive-metalworks -better-leveling-respawn|更好的升级:重铸 (Better Leveling: Reforge) -drive-by-wire|线缆控制 (Drive-By-Wire) -spirit-of-fight@|战魂 (Spirit of Fight) -grim-bleak@grim-and-bleak -carrymyboss -ranged-damage-limit|远域挡招/远程伤害保护* -magichem|魔法炼金 (MagiChem) -iglee-library@ -component-model-hider - -@dont-cut-tripwire -extra-achievements -keybindjs@ -@autototem -@totem-cooldown -sound-physics-legacy|物理声效:遗产* -astatine|砹* - -marblegates-exotic-enchantment-reborn@marblegates-exotic-enchantment-flowing-agony-reborn|白门的奇异附魔:苦痛长河:重生 (MarbleGate's Exotic Enchantment: Flowing Agony: Reborn) - -@beta-1.7.3-music-discs -@spawn-eggs|刷怪蛋 (Spawn Eggs) - -create-waystones-recipes@ -mekanistic-routers@ -just-healerblock -ftb-stuff-things -infinibows -tacz-labs@ -@mineshock-cybernightmare|网络奇兵 (MineSHOCK: CyberNightmare) -make-a-wish -archaeological_research@|考古研究:探寻 (Archaeological Research:Exploration) -forgotten-nunchakus -create-big-cannons-advanced-technologies@|机械动力火炮:先进技术 (Create Big Cannons: Advanced Technologies) -quality-food@ -snekcraft@ -hearth-and-harvest@|暖灶丰年 (Hearth and Harvest) - - - -wjys|无尽药水 (WJYS) -schematicpreview@|原理图预览 (SchematicPreview) - -@collect-emerald|聚灵石 (Collect Emerald) -sakura-tinker|魂樱工匠* -@appspec -heart-crystal|心之水晶* -default-skin@ -letyourfriendeating@let-your-friend-eating!|让你的朋友吃! (Let Your Friend Eating!) - -ftb-jei-extras -shader-reload@ -simple-menu@ -@asahi -keybindspurger@ -iguana-lib@ -map-making-tools|地图制作工具* - -turkeyutil -drcyanos-wonderful-wands-wizarding-robes -dragon-survival-griffin-addon -rpg-skillpower@rpgsp -unknown-null -slime-origin -@slime-origin -slime-origin-remastered@slimeorigin -alchemy-kingdom|炼金王国* -tcondiadema|匠魂领域 (TconDiadema) - -despawn-wand -tome-of-knowledge-sharing - - - - - - -archers-helicopter@|阿辰的直升机 (Archer's Helicopter) -fels-machine-guns-wwi -fels-machine-guns-wwii -steamatic-locomotion -dungeon-revival -new-order -create-more-recipes-addon -cbc-nuclear@ -smarter-zombies¨@smart-zombies|Smart Zombies - 已失效 - - -libguifoxified@ - -valkyrien-relogs@ -@section-31|简单监控 (Section 31) -chatalert -aaa-particles-world@ -pick-up-tnt@ -ymadditions@ -immersive-machinery@ -xp-synthesiser@ -oredictionaryconverter -cbc-modern-warfare@cbcmodernwarfare|机械动力火炮:现代战争 (CBC: Modern Warfare) -shulker-charm@ -villager-license|村民证件* -description-tags -harvestwithdispenser -sound-physics-fabric|物理声效 Fabric 版* -cleanroom-relauncher -fast-item-frames@ -hammering@ -vanity-elementals -fmprojecte-advanced-alchemy-fmpeaa -peex -animal-origins@ -narutoto-ninja-world -the-ender-scrolls-skyrimcraft-the-revival@the-ender-scrolls-skyrimcraft|末影卷轴 - 天际工艺 (The Ender Scrolls - Skyrimcraft) -kingdom-of-rin-mobs -scape-and-run-parasites-mutant-beasts|逃逸:寄染突变体 (Scape and Run: Parasites Mutant Beasts) -alexscavesexemplified@alexs-caves-exemplified -akutolib -@glass-networking -@always-more-items -@mostlymodernrecipes-stationapi -toomuchloot -toomuchtime -cs2-box|CS2箱子 (CS2 Box) -edit-mob-drops@ - -tea-aroma@|茶香* - - - -overpowered-inventory -bbrains-umfixes - -foodstats@|食物增强 (foodstats) -hxchud -sorted-enchantments@|排序附魔* -assassins-creed-parkour-mod|刺客信条跑酷 (Assassin's Creed Parkour Mod) -critter-armory@ -the-harvest -better-minoshroomtaur|Better 米诺菇* -moobloom|哞菇与哞花 (Mooblooms and Mooshrooms) -mooblooms-and-mooshrooms-bop-edition|哞菇与哞花BoP版 (Mooblooms and Mooshrooms (BoP Edition)) -the-pure-suffering-mod -dooglamoo-jr-archaeology|Dooglamoo 的考古学 (Dooglamoo Jr. Archaeology) -legionary -voiceless-survival@|寂静求生* -fabulous-blades@fabulous-blade - -prism-plan|棱镜计划* -ae2cc-bridge@ae2cc -ae2-mousetweaks-fix@ -ae2-qol-recipes@ -cyberspace@ - -displayed@|展示 (Display) -engineered-compatibility@ -create-abyss-catalysis@createabysscatalysis|机械动力:深渊催化 (Create: AbyssCatalysis) - -@worlddownloaderlegacy|世界下载器旧版 Forge (WorldDownloaderLegacy) -level-up-rpg-skills-more - -@creeper-healing -render-control|渲染控制* -chemical-tweaker -health-bar -see-the-rarities-str|查看稀有度 (See The Rarities) -craftpilot@ -@game-of-reborn|复活赛 (Game of Reborn) -rough-blade|无锋道* -@dota.rg -@appledog|苹狗 (Appledog) -superb-warfare@|卓越前线* - -aetherworks-extended-life@aetherworks-unofficial-extended-life -pomkots-mechs-extension-pack@ -@monkey-utils -some-more-blocks@ - -projecte-advanced-alchemy -nff-girls-grimoire-of-gaia-extension|NFF: Girls - 盖亚魔典扩展 (NFF: Girls - Grimoire of Gaia Extension) -replicore@|复制核心 (RepliCore) -create-reforged-foundations@ - -@jgfe|我踏马吃吃吃! (Just Go Fxxking Eat) -better-experience@better-experience-of-confluence|更好的体验* - -thdilos-fox-origin@|ThDilos的狐狸起源 (ThDilos Fox Origin) -narutofix@|火影修复 (NarutoFix) -sbr-i-need-more-enchantment@slashblade-resharped-i-need-more-enchantment|重锋:施魔更哥 (SlashBlade Resharped: I need more Enchantment!!!) -configurable-health|可配置的生命值* -create-better-fps@createbetterfps -create-security-program@ -furnies@ -cobblefurnies@ -thdilos-fox-origin-expanded@|ThDilos的狐狸起源拓展 (ThDilos Fox Origin Expanded) -potion-sauce@ -copious-dogs-reforged -@slot-customization-api -hqm-keybind@ -zoomer-simple-zoom - -curioenchantment|饰品附魔 (CurioEnchantment) -wall-jump-continuation -armor-stand-shift-swap@ -moveui-forged@ -harvest-level-config -brewing-helper@ -theatrical@ -etlib|淬火煉刀通用库 (Emberthral) - -tacz-addon@taczaddon -@heartcanister|心之容器 (Heart Canisters) -gunswithoutroses-expansions@gunswithoutrosesexpansion-s|枪炮“没”瑰:扩展 (Guns Without Roses : Expansions) -ati-structures-datapack-vanilla -create-backpack-pixel|机素背包 (Create: Backpack Pixel) -crazy-alloy -spellbound-enchantments@spellbound - - -ultramarine-rekindled|群青:重明* -fortunas-anvil -create-deep-dark@ -create-ranged@ -create-enlightend@ -create-winery@ -create-filters-anywhere@ -create-cheese@ -create-copper-zinc@ -create-ultimate-factory@ - -lyivxs-core@ -exclusions-lib@ -json-paintings@ -keybind-unconflict@ -apothic-compats -apothic-materials -pepsied-easy-multi-item-sorter -tetra-apotheosis-fix@ -ron-timer -empty-air-bubbles -bundles-throw-potions -ftb-team-bases -raworesmelting@ -dpt@ -potion-effect-enchantment -mythical-origins -assorted-armaments@|百般武艺* - -spanksters-craft -heavenlyabyss -slashblade-twin-attack|拔刀剑:连携攻击 (SlashBlade Twin Attack) -dungeon-crawl-dimensional-patch -apothic-supplementaries-enchanting -apothic-amendments-enchanting -apothic-mutant-heads -apothic-science-moa-stats -ye-gamol-chattels-reborn@ - - -mme@my-more-enchantments|我的更多附魔 (My More Enchantments) -@some-little-enchant|一些小附魔 (Some Little Enchant) -minepulse@|一脉相挖 (Mine Pulse) - - -trinkets-and-baubles-reforked@|饰品与小玩意:重铸 (Trinkets and Baubles Reforked) -@mace_expand|绵阳的重锤拓展 (SunSheep's MaceExpand) - -astral-dimensions-create-compats -cbc-more-shells|机械动力火炮:更多炮弹 (CBC More Shells) -create-tools-n-weapons -create-factory-logistics@create_factory_logistics|机械动力:流体物流* -wiidudes-custom-origin-mod@wiidudes-custom-origins -wolfkin-origin@ -horrorgins@ - -aspects-origins-addon@aspects -@origins-minus -hapi-pillager@ -@stop-picking -pepsied-super-hopper -pepsied-item-catcher -pepsied-auto-harvest -@bulk-compost -centered-item-frames -undergarden-botany-pots-compats - - -bbl-flight-blocks@ -mjs-raw-ores -create-gunpowder-crafting -luminax@ -cable-facades@ -easy-storage@ezstorage|简易存储* -@tmwin|问君何所需 (TellMeWhatINeed) -elrols-gui-elevator -backrooms-found-footage@minecraft-found-footage -exposure-polaroid@ -surpass@|超限* -fallingalchemy|坠落炼金 (FallingAlchemy) - -fluxloading@ -inventory-swapping@ -seamless-trading@ -sophisticated-auto-walk -mmmmmmmmmmmmpatch|试验假人补丁 (MmmMmmMmmMmmPatch) -global-datapacks@datapacks -world-guard@ -more-murphy-pumpkins|更多南瓜 (morepumpkins) -tetradelight - - -heroes-of-might-and-magic-3@ -another-changed -randomly-tp|随意传送 (Freely/Randomly TP) -illager-war-trireme - -hominid -anvians-lib@ -@creo-api -amblekit@ - -nocubes-better-fletching-table -better-fletching-table@|更好的制箭台* -jsconfig@jsconf -@lightspeed-boat|光速船 (Lightspeed Boat) -nomissingmods -urban-decor@ -nospawnzone -keybind-bundles@ - -cloudflared@ -@aikoyori-tweaks -flowingfluidfixer -absolutely-stuffed-uncapped-hunger-saturation -gluttony-oversaturation-overeat -overeat -oversaturation - -etheria@ - -legends-of-slugterra@ -gussdx-decoration - -projectiles@ -space-patrol-delta -@neomtr|纸板箱特色我的世界铁路 (NeoMTR) -@contigency-contract-lite|轻量合约 (Contigency Contract Lite) -assorted-lib@ -taterlib@ - -nocapes@ -inventory-sorter-configurable@ -smartcursor|智能指针 (SmartCursor) -wither-spawn-animation@ -@boom-enchantment -prioritiser -engineered-schematics@ -@mojangfix-stationapi-edition -@nedologin - -@sprint-on-ctrl -kill-counter-kill-streak-announcer-mob-death|连杀计数 (Kill Counter) -calm-down-dog@ -keybinding-hider@|按键绑定隐藏器 (KeyBinding Hider) -darkerer@ -no-more-sleep-problems@ -configbackuper@ - - -inhrtburys-gilding|Inhrtbury 的镀金 (Inhrtbury's gilding) -@tree-miner|矿树节 (Tree Miner) -beyond-dimensions@beyonddimensions|超越维度* -throughput-quest|ME吞吐量检测任务* - -lord-of-the-rings-qualities-of-middle-earth|魔戒:中洲特质 (Lord of the Rings: Qualities of Middle-Earth) -lord-of-the-rings-qualities-of-middle-earth-1-7-10|魔戒-中洲特质:传承 (Lord of the Rings – Qualities of Middle-earth: Legacy) -happy-ghast-backported -happy-ghast-backport@happy-ghast -snowy-tents@ -nuhayuponosiks-bosses -goety-cataclysm@|诡厄灾变* -cave-delight@|洞穴乐事* -@forkcart -silentgear-compat -timeless-ivy-reborn@|永恒常春藤:重生 (Timeless Ivy:Reborn) -simply-more@simplymore -wetland-whimsy@|奇湿妙想* - - -@deputy-placement-switch|求你别放了 (NoG8Put) -ileafcore -dirt-tools-and-armor@|泥土工具与盔甲 (Dirt Tools and Armor) -thaumic-rings-of-power|神秘众戒* -lotr-valkyrien-compat|魔戒:瓦尔基里兼容 (Lotr+Valkyrien Compat) -improvedcrashreports@ -colorful-paradise@ -oracle-index@ -come-back-my-villagers@ -screenshot-with-coords@|带标截图 (Screenshot with Coords) - -ccddi-damage-indicator@ccddi -lidar -@segmented -goety-gotta-summon-em-all@goety-gotta-summon-em-all! -aerlune-rpg-2 -origin-furs@ -grounded-origins-forge@groundedorigins¨grounded-origins-fabric -@sand-and-gravel-are-forbidden-to-fall|禁止下落 (Nofall) -tinkers-tool-leveling-2@|匠魂工具升级2* -remodifier-reborn|你别造了!!!* -exporbrecall@|经验球召回 (ExpOrbRecall) -functional-economy@functionaleconomy|功能性钱币 (FunctionalEconomy) -ranckors-rings-of-power|Ranckor的力量之戒 (Ranckor's Rings of Power) -lotr-improvements-lite|魔戒改进:轻量版 (LOTR Improvements Lite) - - -astounding -carpets-core@ -carpet-variants@ -@mineable-unmineable -tetra-addition -styled-boss-bar-api@|自定义Boss栏 (Styled Boss Bar API) - -random-enchant-fix@ -immersive-armor-hud@|沉浸式盔甲 HUD (Immersive Armor HUD) - -yeast-n-feast@ - -vampirism-tinker|血族工匠 (VampirismTinker) - -essentia-pipes@|源质管道* -msp-backpacks -simple-block-breaker@ -salis-arcana@ -thaumic-mixins -sanguimancypatch -sanguimancy -jungle-villager-trader@ -origin-furs-unofficial-forge-fork@origin-furs-unofficial-forge-port -ephemeral-wither-skulls@|消逝的凋灵之首* -fox-friend@|狐友* - -simple-difficulty-reforged -create-recycling-everything-neo - -aquaticamod -hell-ntegrations -@mcmod-more-food-enchantment|更多的附魔食物 (More Food Enchantment) -mapletree|枫树* -drink-it-refoxed|喝!重生 (Drink It! Refoxed) - -galospheric-delight@ -growmeal-fabric@growmeal-(fabric) - -katharite-slimes@slimes-of-kathare -botania-ceu -magic-from-the-east@ -blatapi@ -@materials-lib -cavelib@ -economy-api@ - - -no-enchantment-cap-level@ -create-ultimine@ -serene-wild@ -kitchen-decorations -refined-storage-curios-integration@ -refined-storage-trinkets-integration@ -refined-storage-emi-integration@|精致存储 - EMI 集成 (Refined Storage - EMI Integration) -refined-storage-rei-integration@|精致存储 - REI 集成 (Refined Storage - REI Integration) -refined-storage-jei-integration@|精致存储 - JEI 集成 (Refined Storage - JEI Integration) -refined-storage-mekanism-integration@|精致存储 - 通用机械集成 (Refined Storage - Mekanism Integration) - - - -lukis-ancient-cities -ungebauts-wildlife@ -changed-mcreator-slop -forgotten-battle-towers -@back-at-it-again -summer-cottage@ -marius0x-furniture -youssefs-currency@youssefs_currency -bibliobiomes-legacy@ -sniffers-delight@sniffers_delight -easters-delight@ - - - -better-carryon-maid|更好的女仆搬运* -tensura-no-game-no-life|转生:游戏人生 (Tensura: No Game No Life) -summoner-scrolls@ -refined-storage-quartz-arsenal@ -create-advanced-logistics@createadvlogistics -create-electric-drive -@lachryvisions -the-heaven-sword-and-dragon-saber|倚天屠龙 (The Heaven Sword and Dragon Saber) -dreamtinker@|工匠幻梦 (DreamTinker) - - -wolfs-enchantment-lib|狼王的附魔库 (Wolf's Enchantment Lib) -@caoplus|槽 (CaoPlus) -disturb-not-my-dream@|勿扰吾梦 / 起床气* -@contigency-shop-lite|轻量兑换所 (Exchange Site Lite) -lootbagsrenewal@lootbags|战利品袋重制版 (LootBagsRenewal) - - -autoswaplowdurabilityelytra|自动鞘翅替换 (AutoSwapLowDurabilityElytra) -no-elytra-equip@elytras-disabled -no-elytra -title-changer@ -clickthrough-plus@clickthrough+|穿牌开箱+ (ClickThrough Plus) -itemzoomer@ -@surveystones -particular-reforged@ -cloud-revive@cloud_revive|云生* -paranoia|偏执狂* -thaumic-brewing|神秘酿造学* -aether-treasure-reforging@ -animations@ -@pet-necropolis -paddle-boats -true-darkness-elementriy - - -sophisticated-storage-create-integration@ - -@removespeeddetection|移除服务端速度检测消息 (RemoveSpeedDetection) -shared-advancements@ -@polytime -golden-meadows -ssmlegacy@ -super-sound-muffler-revived -current-game-music-track@ -create-mobile-packages@|机械动力:无人机物流 (Create: Mobile Packages) -create-cardboarded-conveynience@ -blacksmith-weapon|铁匠武器 (Blacksmith_Weapon) - -mrqx-s-slashblade-core@mrqx%60s-slashblade-core|墨染琴弦的拔刀剑核心 (mrqx's Slashblade Core) -goldblade|神刀 (GodBlade) - -shanghai-metro-line-one-mod@|上海地铁一号线* - - -cat-burger|猫猫汉堡* -mineral-backpacks@ -@furry_bohe|兽薄荷 (Furry Bohe) -narcissusfarewell-reflorescence|水仙辞:重绽 (NarcissusFarewell: Reflorescence) - -bibliocraft-bibliowoods-forestry-edition -bibliocraft-bibliowoods-biomes-oplenty-edition -bibliocraft-bibliowoods-natura-edition -bibliocraft-bibliowoods-terrafirmacraft-edition -bibliocraft-bibliowoods-highlands-edition -bibliocraft-bibliowoods-extrabiomesxl-edition -@blockprintr - - -assorted-tools@ -assorted-core@ -tlotd@ -infinity-golem-boss-fight-beta@infinity-golem-boss-fight-(beta) -actually-divisions -extra-trinkets@ -portable-tanks -happier-ghasts@ -tinker-in-caves|洞穴工匠 (Tinker in Caves) -@better-tfcr|更好的群峦:重生 (Better TFCR) - -mobreaker|坚壁重构* -man-from-the-fogs-delight|雾中人乐事 (Man From The Fog's Delight) -forsaken-items@|被遗忘的物品:重生 (Forsaken Items Reforked) -@soybean-fun-item|豆浆你提我造 (Soybean Fun Item) -epic-fight-mesh-model|史诗战斗网格模型模组* -monster-of-the-night-skies@ -spooky-doors@ -@mclientapi -moffs-addonapi-dynload@addonapi -@shiv -@tab-list -dokimobs@|萌化生物 (DokiMobs) -bookling-gear@ -neuracraft@|神经工艺 (NeuraCraft) -moves-like-mafuyu@|高速企鹅* - -vanillin@flw-vanillin -chain-mining-reforged@chainminingreforged|连锁采集重铸* -hrtffix@|HRTF修复 (HRTF Fix) -iammusicplayer-renewed@iam-music-player-renewed -misc-tweaks@misctweaks -ftb-filter-system -neonium¨@neonium|Neonium - 已失效 -@super-fast-math - - -simple-loot-viewer@ - -greg-tech-chisel|凿子 GTNH 版 (Chisel - GTNH / Greg Tech Chisel) -baubles-expanded-gtnh|饰品栏 GTNH 版 (Baubles-Expanded-GTNH) -gregs-tinkering -metaworlds-mixins|元世界 - Mixin 重制版 (MetaWorlds - Mixins) -create-cobblemon-potion@|宝可梦动力药水* - -jarjar@ -javascriptjs@ -blood-n-particles-mod -@sstool|绵阳的特效工具 (Sun Sheep's Tool) -xiaofanweis-items|小烦维的物品 (xiaofanwei's items[Iron's Spellbooks and Terra Curios]) - -easycolony-addon-for-minecolonies|简易殖民地 (Easycolony) -blades-derby@|骐骥刀剑风云* - -create-simple-generator@|机械动力:简单发电机 (Create: Simple Generator) -sophisticated-backpacks-create-integration@ -ticex-tinkers-construct-ex@ticex -eternal-starlight-vanilla-ores@eternal-starlight-vo -supercritical -supercritical-gtqt -gtconsolidate@ -implosionnobomb@ -villager-golem-healer@ -yakurum-mod -@fantasytools -metaworlds-mod|元世界 / 变幻世界* -create-dragons-plus@|机械动力:龙+ (Create: Dragons Plus) -appliances¨@appliances-mod|Appliances - 已失效 -@twelvefold-booter -omniconfig@ - -@linearxp-legacy|线性经验值 (LinearXP) -@better-thunder|更好的雷声 (Better Thunder) -@enhanced-packet-compression|增强数据包压缩 (Enhanced Packet Compression) -gnetum@ -accessible-step@ -terrastorage-icons -terrastorage@ -@euphoria-companion -jump-bridge-mod -huskhomes -blahajasm@ -mireoles-gtceu-additions@ -expanded-ae -modular-machinery-reborn-ars-nouveau@ -bonsai-crops@|盆栽作物* -playing-cards-chips|扑克牌与筹码 (Playing Cards & Chips) -enderdrives@ -lucky77 - -i-dont-see-you@ - -epic-fight-valour-guard -sweet-calamity@ -vanillabackport@ -stylish-stiles@ -stylish-stiles-renewed@ -undermod@mystronics-undermod -spitting-image@ -@repo-heads - -@create-blueprint-tweaks|机械动力蓝图微调 (Blueprint Tweaks: A Create Addon) -mob-journal@|生物图鉴* - -sdm-shop@ -economy-coins-bills-and-gems -multi-hotbar-core -multi-hotbar|多重快捷栏 (Multi-Hotbar) -properties-panel@propertiespanel|属性面板* -whimcraft@|奇思妙想 (WhimCraft) -recipeconflict-fixer|合成冲突消除:修复版 (RecipeConflict Fixer) -dooglamoo-painter-mod|Dooglamoo 的绘画* -notafreaks-plushies@ -enchanting-vanilla@|原韵新生* - - -quest-items-rpg@quest-items -experimental-mobs -advanced-combat-patched|高级战斗装备修复版* -@authproxy -ezstorage-2-patch|EZ 存储 2 补丁 (EZStorage 2 Patch) -squake-patched -immersive-hotbar@ -create-classic-blaze-enchanter@|机械动力:经典烈焰人附魔室 (Create: Classic Blaze Enchanter) - -ifpatcher@|工业先锋补丁 (IFPatcher) -sakura-orihime|樱:织姬 (Sakura-Orihime) - -tinkers-antique|匠魂怀古 (Tinkers' Antique) -ex-fusile -better-player-respawn - - -another-experiment-researcher -spiders-1-999 -villager-comfort-updated|村民舒适度更新版* -flight-affinity@ -emcgadgets - -@minecraft-engineer-edition - -custom-armor-bar@ -roughly-enough-input-methods@ -pirates-doom@ -techrebornjei@|科技复兴JEI (TechRebornJEI) -little-joys@ -blasting-raw-metal-blocks-into-blocks-fabric-forge@blasting-raw-metal-blocks-into-blocks - -@re_mob-control-wands|重制:怪物控制魔杖 (Re: Mob Control Wands) - -nekoration-reborn|猫咪装饰:重生 (Nekoration-Reborn) -mine-reputation@|失去的声望* -ruined-lighthouse -frogs-medieval-paintings -bad-apple@ -podium-sodium@podium -compressed-create-recipes -aether-overworld-ores@ -slashbalde-useful-addon|拔刀剑实用扩展* - -powerutilites-unofficial|电力转换非官方版 (PowerUtilites Unofficial) -@gameruleplease -custom-fov@custom-fov-illusive¨custom-fov-fabric -apotheosis-x-irons-spellbooks-compat -customtab@ -nightmares|噩梦* -graveyards -sky-arena@demis-sky-arena -progressive-mechanics-library@ -@shy - - -tradepreview@|交易预览 (TradePreview) -enhanced-celestials-shader-support@|月亮事件光影支持* -incendium-biomes-only -thaumic-tweaks@ -selectivebounds@ -@bactromod -@exit-on-startup|一启动就退出 (Exit On Startup) -@kotlin-for-forge-unofficial -@circlemc -nearbymobchecker@ -gputape¨@gputape|GPUBooster / GpuTape - 此处项目名更改为 GPUBooster -@limitless-anvil|铁砧限制修复 (Limitless Anvil) -carry-on-extend@|搬运:拓展* -kaleidoscope-doll@|森罗物语:玩偶* -kamen-tinker|蓝钢匠艺/假面匠艺* -agritech-automated-crops@ -@pots-idea|脑洞瓦工 (Pot's Idea) -kogtyv-tav@|Kogtyv 的城镇与村庄 (kogtyv-Towny and Village) -gothic-church|哥特式教堂* -sky-whale-ship@ - -no-mans-land@ -bindable-mana-pool@|可绑定魔力池* -@blood-mending -craziness-awakened@craziness-awakened-(orespawn-remake) -mischief-illagers@ - -dynamic-trees-caverns-and-chasms|动态的树:Caverns & Chasms 附属 (Dynamic Trees - Caverns & Chasms) - - -apex-a-proper-equipment-expansion -dimension-of-caves|Alex的洞穴维度 (Dimension of Caves) -herobrine-a-friend@ -stattweaker@ - - -atsassistmod -@i-cant-believe-its-not-1215 -@slbcf|服务器列表缓冲崩溃修复版 (ServerlistBufferCrashFixer) -dynamic-tooltips|动态提示框* - -mixed-litter@ -groovyduvet@ -create-egg-production@createegg-production|机械动力:鸡蛋产线 (Create: Egg Production) -create-fishery-industry@|机械动力:渔业 (Create: Fishery Industry) -create-rustic-structures@|机械动力:乡村结构 (Create: Rustic Structures) -slightly-newer-art-of-forging -custom-treasure-maps@ -evolved-mekanism|通用机械:进化* - -brain-delight|脑子乐事* -villager-library|村民图书馆* -trade-enchant-overhaul -more-additional-paintings@ -simplebackport@ -biomebeats@ -decorative-core@ -@key-bindings-keeper|按键绑定不减 (Key Bindings Keeper) -@mekanism-output-faster|通用机械加速输出 (Mekanism Output Faster) -@infinite-capacity-cell|无限容量元件 (Infinite Capacity Cell) -@mcutilities -pickuptorches@ - -pointblank-magazines-vpb -pointblank-projectiles-vpb -deathly-hallows@|死亡圣器* -tetra-loopback@ -appliedenergisticsoddities -tweakermoreforge@ -vs2-cbc-armor-blocks -create-integrated-farming@|机械动力:集成农业 (Create: Integrated Farming) -ring-of-blink-forge|闪现戒指 (Ring of Blink) -golem-overhaul@|傀儡革新* -voile@ -title-tweaks@titletweaks -ugoblock|动块 (UgoBlock) - - -scriptasm - - -aimbot|瞄准修正 (Aim Bot) -@server-chat-log-history -hud-compass - -familiar-friends@|亲密伙伴* -golem-spawn-animation@ -realistic-night-vision -stackable-items - -discrafted@ -survival-plus-plus@ -server-plus-plus@ -happier-ghast@|更好的快乐恶魂 (Better Happy Ghast) -bhgc@|更好的快乐恶魂控制 (Better Happy Ghast Control) -@dominatus -unfocused@ -jerotes-warehouse|Jerotes仓库* -happy-ghast-legacy@ -spider-jockey@ -digger-helmet@ -acecraft - -@familiar-magic -lumenized|流光溢彩* -chili-bullet-weapons@ -applied-web-terminal@|AE网络终端* -@dusts-keymap -itemzoommore -@noitemtooltips -shuttfup|Stfu - 已停更¨@shuttfup -baublesreforked@|饰品重铸 (BaublesReforked) -@wills-lively-villages -tmrv@ - -twilight-treehouses@ -improved-rails@|更好的铁轨(可转弯の动力铁轨!) (Improved Rail (TURNABLE POWERED RAILS)) -redstone-signal-bind-wand@|非Create版无线红石* - -@ingametranslator|游戏内聊天翻译 (In game Translator) -carnivorous-plants-addition -mekanism-curios -tetra-compat -hex-casting-additions -ghasts-crash - -futurecherry@|未来的樱花 (FutureCherry) -food-fix -mining-speed-tooltips@ -smithing-template-viewer@ -picks-of-power@ - -super-hot -chill-thrill -pyrellium@ -luminous-nether@ -brush-mining-machine|刷矿机 (Ore Generator) - -@night_vision_amulet|夜视护符 (NightVisionAmulet) -set-effects|套装效果* -tramways@ -projecte-kubejs -actually-additions-v2-unofficial|实用拓展 V2 非官方版 (Actually Additions V2 Coffee Edition) -create-ender-link@ -progressive-tweaks -portable-blueprints@ -carrasconlib@ -blockparticlespawning@|方块粒子生成 (Block Particle Spawning) - - - -aether-dragon-dragon-survival-addon -tundra-dragon-dragon-survival-add-on -naturalist-delight -civilizations@ -block-factory-biomes@block-factorys-biomes -underwater-swim-fix-mc-220390|水下游泳修复 (Underwater Swim Fix) -scaffolding-backported -hold-my-items-reforged@ - -distraction-free-recipes@ -seeking-immortals-nightmare@|月之石:噩梦之章/求仙者:噩梦之章 (Moonstone :Nightmare/Seeking Immortals : Nightmare) -enchanted-crystal-arrow|魔法水晶箭 (Enchanted Crystal Arrows) -touhou-danmaku-kagura-core|东方弹幕神乐核心 (Touhou Danmaku Kagura core) -hah-ueuh@hah!-ueuh -eternal-nether@|永恒下界* - - - -gui-followers@¨gui-followers-fabric -omnidirectional-sound-ods@omnidirectional-sound-(ods) - -diligentstalker@|勤劳跟踪狂 (Diligent Stalker) -maid-useful-tasks|女仆实用任务 (Maid Useful Task) -@titlechanger-next|标题切换器 Next (TitleChanger Next) -embers-underground-rooms@ - -dontstarve4@|不要饿死 4 (Don't Starve 4) -spark-core@|星火核心* -nether-core-useful-nether-rock|下界核心 (Nether Core) -slashblade-js|拔刀剑 JS (SlashBlade JS) -caerula-arbor@|方块与深蓝之树* -alices-doll|元歌 (Alice's Doll) -bedrock-redux@|基岩再现* -item-entity-control|掉落物清理* -wishing-fountain|许愿泉* -@unbelievable-enchantment|令人不可置信的附魔 (Unbelievable) - -we-do-copyright@ -useful-clipboard -seeking-immortals-virus@seeking-immortal-virus|月之石:基因计划/求仙者:基因计划 (Moonstone :Virus/Seeking Immortals :Virus) -gambler-illager-irons-spells-and-spellbooks-addon -chimericlib -pokecube-alternative -@intuitive-netherite -create-propulsion@|机械动力:推进工程 (Create: Propulsion) - - -event-wrapper@|事件包装器* - -@modwhitelist|模组白名单 (ModWhiteList) -@instant-build|瞬时建造 (Instant Build) -beacon-conduit-tweaks|信标与潮涌核心调整 (Beacon & Conduit Tweaks) -tfc-tools-trim@|群峦传说:工具纹饰 (TFC Tools Trim) -@kill-youkai-with-knives -mo-bees@|更多蜜蜂 (Mo' Bees) - -faux-custom-entity-data@ - -poopsky@|空中厕所 (PoopSky) -@solarus-classic - -create-unlimited@ -skeleton-ai-fix@|骷髅 AI 修复 (Skeleton AI Fix) -climate-rivers@ -dungeonsdelight@dungeons_delight|地牢乐事 (Dungeons Delight) -cleanroom-relauncher-unofficial@|Cleanroom 模组式启动器非官方版* -silents-power-scale@ -trident-return-fabric -resource-world@|资源世界* -ijm-tweaks@ -no-mans-delight@ - -applemilktea2-tweaked -@carpet-blue-addition -@yaca|毯上添花 (Yet Another Carpet Addition) -@steel_myfirstmod|钢铁 -movie-discs|Minecraft 大电影插曲唱片 (A Minecraft Movie Discs) - - -materials-integration|资源统合* - - - -modular-machinery-reborn-create -sheep-variety@ - - -@tetraclip|易验锻造 (TetraClip) -@rozhud -the-cosmic-spokespersons@|宇宙代言者* -mc-mods-in-zero@all-in-zero|一切于零 (All In Zero) -@yunzhu-transit-extension|云竹交通扩展 (Yunzhu Transit Extension) - -goodbye-dirt-screen@|澄清素视 / 去你的泥土屏幕* -create-stock-bridge@ -create-escalated@escalated -create-mechanical-confection@createmechanical-confection|机械动力:蛋糕工坊 (Create: Mechanical Confection) -farmers-delight-compat@ -gtwoodprocessing@gtwp - -vintagedisplay@ -voidless-framework -mixin-args -melonlib@ -@no-kebab -mechanicals-lib@ -create-mechanical-cow@ -global-options@ -kubejs-projecte-fork@ -untoggle-sprint@ -vndialog@nvdialog|VN对话框引擎 (VNDialog) -@elytrabugfix -@ezbowls -soundtrack-events -commandkeys@ -iron-chests-with-netherite-chest@iron-chests-(with-netherite-chest) -emerald-on-a-stick-villager-follower@emerald-on-a-stick-(villager-follower) -fishing-indicators@ - -just-another-witchery-remake@ -@inexorable-origins -cybersus@ -@passivearmour -zettai-rpg@ -md-units@md-unit-robots -extreme-core -dreamless-spells-and-spellbooks -gregtech-meowmelmuku|格雷科技非官方版 - 喵呜酱版 (GregTech - MeowmelMuku) -@namedloot -@enchantment-decay -create-jet-boots -train-deco@|机械动力:地铁列车装饰* -packed-packs@ -dyed-flames@ -hopper-gadgetry@ - - -quickcopy@|迅摹天工 (QuickCopy) -item-informations|物品信息* -shootscreen|拍屏 (ShootScreen) -@server-expansion|扫地小狐 (Server Expansion) -@valkyrien_skies-defense|瓦尔基里:防御 (Valkyrien_Skies: defense) - -tinkerslashblade-patch|刀锻冶匠魂修复 (TinkerSlashBlade Patch) -alienevo - -banit|干掉它! (BanIt) -alexs-mobs-naturalist-compat@ - -tinkers-ingenuity|匠心之作 (Tinkers' Ingenuity) -curiosities@|趣味物品* - -@cs2_c4|Qis的C4 (C4) -bomb-disposal-expert@bde|拆弹专家* -sprintify|长疾速适* -shield-system -@burythelight -command-aliases@ -pigium-performance-mod -spectrumjei@|光谱世界JEI (SpectrumJEI) -@itemban -@skiesclear -vminus@ -@villagertalk1 -debug-utils-forge@debugutils¨debug-utils-fabric -slimefun-essentials-port -uma-little-maid@uma_maid|马儿小女仆* -i-like-wood-twilight-forest-plugin -i-like-wood-oh-the-biomes-youll-go-plugin -i-like-wood-immersive-engineering-plugin -click2pick@ -hudless@ -dungeons-perspective@ -miniutilities-flight-fix@ -linked-chests@new-linked-chests -create-direct-chute@direct-chute -create-packagers-psi-compat@packagerspsic -create-more-packages@ -create-extra-gauges@extra-gauges -ships-legacy -traders-backport -banner-patterns-backport@ -convenient-effects@ -baguettelib -fast-event@fastevent -@citreforged -better-meteorite|更好的陨石* -paragraphs-reforged@ - -tpsbooster -custom-portal-api-reforged@ -forgedpaginatedadvancements@|分页进度 (Neo)Forge 版 (ForgedPaginatedAdvancements) -colorfulanvils-reforged@ -keymap-maintained -create-mechanical-companion@ -crazy-ae2-addons@ -schizophrenia|精神分裂症* -@mobswithpowersaddon -wolf-sword-mod@ - -charged-mobs@ -the-mangled-hound -avp@ -@giantess-toki -enchant-limiter@ -crafter-backport -citadel-fix|Citadel优化修复* -knit -gallant-tireless-altruist@|热心市民* - -cerulean@cerulean-advancements -color-format - -swim-in-lava -orevolution@ -even-better-nether@ -plastoid-armor@ -corpse-x-curios-api-compat@ -@trinkets-canary -@a-strange-world-we-live-in -spellhud-addon@ -replication-ae2-bridge@ -@deltarune-mod -eternalpotions@ -@l-mans-cat-clocks -life-leech-enchantment@lifeleech|生命汲取附魔* -sakaz-hand|奇语之手* -clayium-unofficial@|粘土工业非官方版* -mekanism-weaponry -wardends-revenge -mob-control-rod -unlimitedperipheralworks@ -particle-effects@ -verdant-wonders@ -underlay@ - -lazy-item-generator|咸鱼物品生成器* -crab-street-light@|螃蟹的路灯* - -undertale-delight@|决心乐事* - -@origins-algorithmic-phantom|起源:算法幻影 (Origins:Algorithmic Phantom) - -spawn-egg-information@|刷怪蛋信息显示 (Spawn Egg Infomation) -calypsos-candy-workshop@|卡里普索的糖果工坊 (Calypso's Candy Workshop) -fill-tool -growth-tonic -quivermob - - -world-drop - - -shell-armor -cart-livery -territorial-dealings -potion-packs -armor-smelter - -carpet-sls-addition@sls-addition -forge-string-unpatched-powered-permanent-string@fsu|(Neo)Forge 常亮绊线特性恢复 (Forge String Unpatched - Powered Permanent String) -quests-kill-task-tweaks -@lpctools -immersive-messages-api@ -immersive-damage-indicators@ -easy-disenchanting@ -respect-my-trims@ - -cloudgolem-edited|湫渃云魔修改 (CloudGolem Edited) -maidaddition -webcam|网络摄像头* -projecteteams@ -battle-frenzy|越战越勇* -@plane-advancements -cosmopolitan@|四海一家* -redtassel|红缨 (redtassel) -sridr|拔刀剑锻造增伤改革 (SlashBlade Refine Increased Damage Reform) - -mianbaos-modernwarfare|面包军火库 (Mianbao's ModernWarfare) -creator-sword@|机械动力:机械师之剑 (Create: Creator Sword) -create-limited-draining@|机械动力:流体抽取限制 (Create: Limited Draining) -create-no-touching -create-aether-industry|机械动力:天境工业* -create-entitycontroller@create-entity-control|机械动力:实体控制 (Create: Entity Control) -better-advancements-blessed-edtion|更好的进度 - 祝福版 (Better Advancements - Blessed Edtion) -@gloom-raiders -herobrine-prime -legend-of-the-dwerden@ -dnt-stronghold-overhaul-lite-edition -dnt-nether-fortress-overhaul -gtfocraftprotocol@gtfo-craft-protocol - -keerdm-zombie-apocalypse-essentials@keerdm-zombie-apocolypse-essentials -chovys-apocalypse@ -bexlas-enhanced-ores -starve-library@|饿死图书馆* - - -infinite-refills|无限续杯* -systrace@|一导即出* -fluxed-core@ -myluckyblock@|我的幸运方块 (MyLuckyBlock) - -backpack-plus|背倍加* -@hydration-mod - -defiled-lands-reborn@|污秽之地重置版* -@copper-bulb-early|铜灯补充 (Copper Bulb Early) -future-fireproof@|未来防火* -@low-durability-switcher -dimensional-potions -ghasts-drop-records|恶魂掉落唱片* -ftb-chunks-compatibility-mod@ -charm-forked@ -early-bedtime@ - -instant-picking@ -@quick-craft -kubejs-curios -copper-carrots@ -tinkers-jewelry@|工匠珠宝 (Tinkers' Jewelry) -thief@ -applied-schematicannon -more-functional-storage@|更多功能性存储* -vital-herbs - -hbm-ntm-structure-1-12-2 -illusioners -cataclysms@ -bas-cave-enemies -sniffer-ride -aesthetic-shelving -arboreal-nature@ - -warborn-resurgence@warbornresurgence -@ceres - -super-creeper|智能爆破专家 (Creeper Super) -expanded-experience -reworked-phantoms@ -ex-nihilo-fabricio@ -hybrid-delights@ -create-clothes@|机械动力:服装 (Create: Clothes) -create-delivery-director@delivery-director -create-cardboard-things@ - -watkinsbase - - - -toggleable-enchantments@ - - - -scape-and-run-parasites-deep-sea-danger@ - -craft-in-shadow -@jewelryz -better-armory-mod@seths-better-armory -twilight-forest-dungeons-villages@the-twilight-forest-dungeons-villages|暮色森林 - 地牢与村庄 (Twilight Forest - Dungeons & Villages) -mice@ -ancient-golems@|上古傀儡* -model-citizens -botanical-machinery-extra@tPTR9GcJ -flowerary@ -extrabotany-reburn@extrabotany|额外植物学:重燃 (Extrabotany: Reburn) - - - -umapyoi-delight|马儿跳乐事* -lne-rogues@ -lne-archers@ -lne-wizards@ -lne-paladins@ -@protomanlys-weather -tinkers-mechworks-legacy -bbl-core@ -cooparticlesapi@|空栈粒子框架 (CooParticlesAPI) -fdlib@ -potion-icons@potionicons -catvision -spectre-things@ -chatplus@ -ritual-enchanting -peaceful-progression@ - - -usefulmagic@|实用魔法 (UsefulMagic) -keepinventorynext|死亡不掉落增强 (Keeping Inventoiry Next) - -tinkers-jewelry-ex|工匠珠宝拓展 (Tinkers' Jewelry EX) -lovely-sparkle-pieces|璀璨饰品* - -yuns-weather@ -qliphoth-awakening@ - - -universal-mod-localizer@universal_mod_localizer|通用模组汉化器* -smart-creeper@|智慧苦力怕* -peaceful-depletion@peaceful_depletion|和平消耗* -@everything-is-tnt -structure-pool-api@ -create-bluemap@ -tragicmc-2-continuation|悲惨世界2:延续 (TragicMC 2 Continuation) -nebula-parasites@ -bonsai-trees-unofficial-extended-life|盆栽非官方延续版* -@its-as-shrimple-as-that -worldedit-items@ -slashblade-skin@|拔刀皮肤 (SlashBlade Skin) -iron-door-key@ -just-enough-fishing-jef@just-enough-fishing-(jef) -containersearch@container-search -mousepets@ -backported-minecarts@ -simple-incubator@ -amethyst-stairs-slabs-and-walls -@vessels -ultimate-scaler@ -legendary-weapons-byititor@legendaryweapons -slender-reborn -craft-vania-lite -pollution-of-create -create-chocolate-fountain@|机械动力:巧克力喷泉 (Create: Chocolate Fountain) -create-currency-shops@|机械动力:货币商店 (Create: Currency Shops) -create-nether-industry@|机械动力:下界工业 (Create: Nether Industry) -backported-diamond-ore-gen -tfthreadsafetyaddon -serverautosaver -infinistack@|无限堆叠 (InfiniStack) -powerful-dummy|强力假人* -beyond-bosses@beyondbosses -mini-utilities-y -concoction@concoction!|田园调酿! (Concoction!) -zombietactics2@ -radiation-zone-reborn|辐射荒原:再行 (Radiation Zone: Reborn) - -@crumbling-hearts - -dye-the-world@ -modernmarkings@ -hololive-product@ -fetzis-displays@ -shadered@ -sweety-garden@ - -@twilight-forest-aurora-palace-regeared -changshengjue@|长生诀 (ChangShengJue) - -medieval-buildings-nether-edition -@ribbits-croaks -echoes-of-time@ -horror-alexbrine -zzz-craft|绝区零·星见雅 (ZZZ Miyabi) - -cozy-cabins-and-cottages@ -servereye -deepseek@deepseek-neoforge -ai-command|AI指令生成 (AI Command Generator) - -flighthud-do-a-barrel-roll-fix - -fast-container-placement@|快速容器放置* -@teleport-mod -@what-meme -crackers-wither-storm-mod-v-sides-soundtrack@ - -roberts-game-tweaks|Robert的游戏调整 (Robert's Game Tweaks) - -@datapack-load-error-fix|数据包错误修复:重生 (Datapack Load Error Fix Reborn) -@whats-this -@additional-jewelryz -tacz-tes-compat@ - - -directionhud -raw-netherite-reforged@ -blast-travel-reborn@blasttravelreborn|旅行火炮·重生* -shanxi-skeleton@shanxiskeleton|山西骷髅* -@gunpowder-overhaul|火药改革 (Gunpowder Overhaul) -smoking-stuff-a-wizards-hobby@ -@alloy-smelter -@autocrafter-early -time-in-a-bottle-charger@ -just-a-sculk-vial@ -lockylocks@ -server-i18n-api@ -fragmentum-forge@fragmentum¨fragmentum-neoforge¨fragmentum-fabric -@monument-data-fix|Monument 数据修复 (Monument Data Fix) -@better_tp -waystone-currencys@|消币则至 / 传送石碑:货币 (Waystone: Currencys) -@armor-stand|盔甲架 (ArmorStand) -threadtweak-reforged|ThreadTweak (Neo)Forge 移植版 (ThreadTweak Reforged) -@environmental-creepers-backport -com-bat -touhou-little-maid-rpg-class-task -unknown5473lib@ -heat-and-climate-patch|热量与气候修复* - -@clientupdater - -modern-lucky-block@ -foxrecipemaker -@global-mob-health-multiplier|全局生物血量倍率 (Global Mob Health Multiplier) -chatbox-for-mc@chatbox|对话框 (ChatBox) -perfectly-balanced-bows -@playerex-alcohol|PlayerEx 酒精版 (PlayerEx: Alcohol) -hak-minepiece -grease@ -cleaver-compedium -phayriosis-parasite-infection -srp-calamity-catastrophe-cataclysm@|逃寄:无妄之灾 (SRP: Calamity Catastrophe Cataclysm) -moss-overgrowth -create-pillager-arise -create-qol@ -create-remote-terminal@|机械动力:远程终端 (Create: Remote Terminal) - - -songs-of-war@|战争之歌 (Songs of War) -cataclysm-summons@ -cutepuppymod@ -giant-swamp-tree@|沼泽巨树* -big-oak-tree@|大橡树* -giant-tree-stump|大树桩* - -polars-mad-tweaks@ -cobblemon-ranked@|方块宝可梦-排位赛* -eiramoticons -horse-breeding-fix@ -tablistextension@|TAB 列表扩展 (TabListExtension) -rally-of-the-guard-guardvillagers -bncci -@recipe-maker -portaltransform@|传送门嬗变 (PortalTransform) -@a555sd|更多的画 (More Paintings) -unusual-furniture@ -xiaoanmooncake@|小安的月饼狂热 (Xiaoan's Mooncake Fever) -foragers-insight@|巧觅巧食 (Forager's Insight) -palestinian-delight@ -mekanism-more-machine@mekanismmoremachine|通用机械:更多机器 (Mekanism: More Machine) -custom-battleroyale@|自定义大逃杀 (Custom BattleRoyale) -improved-pillager-outpost -rebalanced-enchanting@ -dark-doppelganger@ -enders-spellsandstuff -hazen-n-stuff -spongeforge@ - -@don%22t-die|补药趋势啊! (Don't Die!) -sdm-market@ -@omnilook - -survivalist-essentials@ -villager-trading-plus@trading+ -mending-fix|经验修补修复* - -colorwheel@ -tlib@ -smoothscreen@ - -@fuzz -advanced-loot-info@|高级战利品信息显示* -resourcepackcached@ -aotake-sweep|竹叶清* - -effectual@ -cold-light@|冷晖之枪* - -huanles-weapons@|Huanle的武器 (Huanle's weapons) -@clay-soldiers-remake -threateningly-mobs@ -basic-spinosaurus -european-wildlife -marvelous-menagerie@ -roman-weaponary -compat-structure@ -flower-bed@ -archery-expansion-squared -create-more-linked-remote@ - - - -gambagoons-better-emeralds -ingameime-vintage@|游戏内输入法-1.12.2 (IngameIME-Vintage) -extreme-sound-muffler-legacy@ -amazing-trophies - - -global-server-configs@global-server-config|全局服务器配置* -expandedbonemeal -@aireplyassistant|AI回复助手 (AIReplyAssistant) -utiljs -moon-info-updated@ -@server-market|服务器市场 (Server Market) -nbt-tooltip@nbttooltip -delicate-dyes@ -@modernmixins -sdm-economy -sdm-ui-lib@ -mcllm¨@mcllm|MCLLM - 审核中 -@inventory-pause-yipeekiyaay -chestsearch|容器检索 (ChestSearch) -clicktor|Clicktor连点器 (Clicktor - Auto Clicker) -extended-bone-meal@¨extended-bone-meal-fabric -show-me-the-enchantment|怎魔,你不附器* -better-sign-edit@ -disc-recipes@|唱片合成 (Disc Recipe) - - -scoutreforked@|侦察兵 重构 (Scout Reforked) -immersion-in-traffic-context@|沉浸交通道路 (Immersion in Traffic Context) -arknightsfurniture@|明日方舟家具 (ArknightsFurniture) -gunsmith-lib -@emixx -experiencelib@ -mystical-mobs - -progressive-difficulty-chaos-integration@ -ottapomos-scps -scp-foundation-requisites@ -thermal-construct@ -war-wither|战争凋灵* -status-effect-bars-reforged -dark-tower-maze - -the-occult -wolftailui@ -better-client@better-client-enc|更好的客户端* -clientharvest@ -auto-afk@ -particle-effects-reforged -hold-my-items-refoxed -dont-claim-our-structures -cosy-critters-creepy-crawlies@cosy-critters-creepy-crawlies-neo -thin-air-ad-astra-compat -yyzsbackpack@yyzs-backpack|yyz的背包 (Yyz's Backpack) - -vital-delight - -@mining-in-place -pathfinder-navigation|寻路者导航* -adorable-eggs@ -food-addition@ -everything-totem|万物皆可图腾* -thaumic-renaissance@thaumcraft-renaissance -@executive -@make-i18n-great-again -steve-goes-fishing@ -voltaic-api@voltaic -boat-delete-begone -zs-packet -raise-them-hotbars -quick-leafdecay -footprint-particle-returns -inventory-crafter-returns -colorwheel-patcher@ - - - -@llpswsounds|llpsw的大喇叭 (llpswsounds) -difficulty-lock@¨difficulty-lock-fabric -ryymr@ -@lazybeefix - -lazy-ae2-tweaks -coordinates-hud@coordinateshud -just-enough-botania@ -fumo-fumo -touhoupixelcanteen-a-farmers-delight-plugin@touhoupixelcanteen|幻雀妖 (Gensokyo Izakaya) -perfect-parity-the-garden-awakens-edition@ -perfect-parity-spring-to-life-reforged -hypertubes@hypertube|机械动力:超级管道 (Create: Hypertubes) -perfect-parity-spring-to-life-edition@perfect-parity-1-21-5 -create-geography@|机械动力:地理学 (Create: Geography) -create-apothic-enchanting@ -demis-enigmatic-dice@ - -@mpem|月夜性能优化 (Moonlit Performance Enhancement Module) -@eventbenchmark|事件性能测试 (EventBenchmark) -no-more-garbage-in-cell -pick-up-filter-puf@pick-up-filter - -identity-fix-morph@identity-fix - -stick-it@ -aimod -epca|终末-归寄万物 (End-Parasitize and Convert All) -legendary-relics|传说遗物* - -true-power@|真正的力量 (True POWER) -ender-villages|末地村庄* -twilight-forest-villages@|暮色森林村庄* -poland-nature -amethyst-extra -villagers-windmill -extended-wrenches@ -why-stack-only-64|为什么才64个呢? (Why Stack Only 64?) -@digcooldown|挖掘冷却控制 (DigCoolDown) - - -potentials@ -deltaboxlib@ -gobbobs-animated-blocks|Gobbob 的动画方块 (GobBob's Animated Blocks) -glowingfootsteps|发光足迹粒子 (GlowingFootsteps) -simply-swords-overhaul@ -farms-and-foods@farms-foods -@achievement-fix|成就修复 (Achievement Fix) - -lang-magic-tweaker -spawn-dimension-choice@|诞生维度自选* -reforge-stone@|重铸石* -numericalbotany -cameraoverhaul-vintage@ - - -advanced-hoppers - -ars-meteorites|新生陨星* -the-hard-herobrine-mod - -tektopia-addons -jason-voorhees -biome-improvement-mindthemoods-pile-of-rocks -mochila@|简彩跃光* -soulytra -@advanced-tfc-blueprint|高级群峦蓝图 (Advanced TFC Blueprint) -@accesswidener-loader -improperui-forged@ - -enchantment-to-attack-faster|并非环取/攻击速度附魔非官方版 (Attack Speed Enchantment Unofficial) -@stopgrowth|停止生长 (StopGrowth) -squid-no-glitch -@permanent-night-vision|无痕夜视 (Permanent Night Vision) -@rems-carpet-addition - -colorful-hex@ - -bbl-no-rain-fog - -@be-quiet-negotiator -link15s-no-i-frames -jei-integration-reborn@|JEI扩展:重生 (JEI Integration: Reborn) -appliedsync -jei-uu-assembler@ -ominous-overlays -create-nuclear-shell@ -world-of-wonders -horrible-meteor-shower|陨石雨* -desertification@ -cinchs-abandoned-houses@ -curse-breaker@ -hundred-years-warfare@|百年战争* -biologica@ -oritech-things@ -potato-vehicle-industries -warfare-wings@ -avaritias-delight@|无尽乐事 (Avaritia's Delight) -mamas-herbs-and-harvest@ -vs-orbit@|瓦尔基里:轨道学 (VS Orbit) -touhou-little-maid-spell@|车万女仆:万法皆通 (Touhou Little Maid: Spell) -despawn-notifier|余影待终/掉落物消失提醒* -customnpcs-unofficial-from-betazavr|自定义 NPC BetaZavr 非官方版 (CustomNPCs Unofficial from BetaZavr) - -efficient-core-automatic-mining|Efficient Core自动挖掘器* -@bento_box|便当盒 (Bento Box) -custom-100-day-boss@|自定义100天Boss (Custom 100-Day BOSS) - -cinchs-extra-torches@ -corpse-x-cosmetic-armor-reworked-compat -modular-angel-ring -magic-feather-replumed@magicfeather -essentialcraft-magic-reflux -ad-astra-star -neomopeds -create-more-parallel-pipes@ -create-garnished-reworked@ -create-shimmer|机械动力:微光 (Create: Shimmer) -blue-archive-school-banners -cialloblade|重锋:cia出如llo (CialloBlade) -windows-keyboard-fixes-returns -aquatic-torches-returns -cratetech-crate-storage -bigger-and-better@ -blabber@ -reducedores@ -durabilityrarity@ -ironfist-lite -shear-chicken@shear-chickens -no-moon-jar@no_moon.jar -@deep_space -blue-grove -quarkponders@ -sussy-sniffers -firefly-bush-backport@ -agritech-trees-automated-trees@agritech-trees -agritech-evolved@ -wealizh|工业故事* -@hydrometallurgy|湿法冶金学 (Hydrometallurgy) -mekanism-ecoenergistics-unofficial - -woodlandfoxverses@|林间狐咏 (WoodlandFoxVerses) - - -swaying-garden|摇曳花园* -time-feeds-villager@|逝者如饲:村民 (Time Feeds: Villager) -ftb-backups-3|FTB 备份 3 (FTB Backups 3) -kurolib@ -trimmed@ -free-camera-api-tripod@|自由相机API-三脚架 (Free Camera API Tripod) -abelia¨@abelia|Abelia - 审核中 - -simple-weather -simple-copy@ -natures-aura-render-fix@ -creakingchopperenchantment@ -daily-rewards@ -initialdimensionreborn@ - -@oo-ee-a-e-a-fabric - -redstone-chans-enchantment-expansion|红石酱的附魔拓展 (Redstone-chan's Enchantment Expansion) -the-plugin-mod@ -cave-vision -@el-addon-retrieve-to-slot -aether-gloves-for-all -reducedloot@ -@irisfixes|Iris 修复 (IrisFixes) -musicjs - -suspendtheserver|自动挂起服务器 (Suspend The Server) -screenshot-layers@ -anti-spider-climbing -rechiseled-chipped@ - -weatherdisplay@ -radium-fabric|Radium - 已失效¨@radium-mod -cinnabar - -pquality@ - -mte-patches -happy-ghast-breeding@ -happy-ghast-flight@ -the-angry-ghast@ -@morfonica-in-minecraft -for-vanilla-flowers -@skillpractise|技能练习 (SkillPractise) - - - -bedrock-hotbar-offset@bedrock-hotbar -mss-more-slot-swap¨more-slot-swap -show-all-advancements|显示所有进度*¨@show-all-advancements|显示所有进度 (Show All Advancements) - 审核中 - -mana-display@ - -curse-forge|诅咒锻造* - - -disconnect-packet-fix@ -happyghast-on-1-12-2@happyghast_on_1.12.2|1.12.2的快乐恶魂 (HappyGhast_on_1.12.2) -automationera@|自动化时代 (Automation Era) -@tears-backport -lava-chicken-disc -lava-dennis -album-go-wall -forgotten-java -johanness-renaissance-rebirth@johanness-renaissancerebirth|约翰内斯的文艺复兴:火器之重生 (Johannes's Renaissance: Musket Rebirth) -swarm-infection@ -necro-rooted -mycelial-crisis@|菌丝危机:崛起 (Mycelial Crisis: Mushroom Rising) - -lethalsteelproject|致命拔刀计划 (Lethal Steel Project) -lovecraft-girlfriends-3@ -@faithful-mace -bard-craft -@bilibilimedia|哔哩哔哩WaterMedia兼容模组 -items-timer -neo-language-reload@ -@oxidizium -ixeris@ -substrate-sodium-addon@substrate -hide-item-frame@|隐藏物品展示框* -@smoothmaps -neoessentials@ -structure-layout-optimizer@ -mutant-creatures-legacy -dynamites-overhaul@ -dynamite-addon¨dynamite-addon-fabric -maid-mana-source|女仆魔源* -maidens-merry-making@mamas-merrymaking -bbl-invisible-lights@ -superior-trees@ -underground-rivers@ -improved-village-placement@ -@photosynthesis -@mineno -slashbladetetra - -irons-spells-n-spellbooks-dynamic-skill-trees@ -spell-elemental@ -ward-ring-extension-for-irons-spells-n-spellbooks -dungeons-and-combat-x-irons-spells -smallcolonies -farmers-cutting-regions-unexplored -serene-landscapes@ -blood-arsenal-reawakened@ - - -spell-colonies -nature-reimagined -ominous-bottle-add -only-hammers@ -auto-resource|自动资源* -iu-additions@ -rubiks-cube|魔方* -clockworklib - -fabridge@ - -true-fullbright -quickslots -hide-hud-in-third-person-view@hide-hud-third-person -automlg@auto_mlg -elytraautopilot@elytra_autopilot -simple-conveyor-belts@ -smidgeon-o-bliss-remastered@smidgeon-o-bliss -xl-food-reborn|超多食物:重生 (XL Food Mod Reborn) -create-spin-spawner -vs-rotanator -create-refilling-boxes@ -cbc-chemical-warfare|机械动力火炮:化学与生物战争 (CBC: Chemical Warfare) -cbc-warium-projectiles|机械动力火炮:Warium炮弹 (CBC: Warium Projectiles) -create-colored -create-law-and-order|机械动力:法律与秩序 (Create: Law and Order) -blockexporter@ -fix-attack-lag@|修复攻击卡顿* -@clienthings -@misinput -lavablocker@ -gildedarmors@gilded-armor|鎏金盔甲 (Gilded Armor) -inventory-management-deluxe -runningmapmusic|跑图音乐 (RunningMapMusic) -lava-chicken-music-disc -porting-dead-libs@ -panoramica¨panoramica-fabric -create-mt-integration|资源统合-机械动力配方附加* -valkyrien-skies-war-and-peace@valkyrien-warpeace|瓦尔基里:战争与和平 (Valkyrien War and Peace) -sillys-auto-totem@ -repairables-anvil@|可修复的铁砧* -@throwable-bricks -@now-time|准点报时 (Now Time) -fluidjs¨@fluidjs|FluidJS - 审核中 -hybridcompat|混合兼容 (HybridCompat) -@recipecooldown|配方冷却 (RecipeCooldown) -counter-mod -lotr-renewed-class-mod|魔戒种族 (LOTR Races) - -craftable-chain-armors -item-cooling-reduction@|物品冷却缩减* -yosbs@ - - -@no-bugs -dark-window-bar@ -sodium-core-shader-support@ -@anvilcraft-headtap|铁砧工艺:敲你脑袋 (AnvilCraft: HeadTap) -hearts-in-a-bottle@ -copper-tools-and-shears@ -windchime-unofficial-continued@ - -potionsplus -tinkers-wood@ -illuminated@ -galosphere-argent-edge -brutality-a-terramity-addon -free-epic-games@|FE 游戏框架 (FreeEpicGames) - -fabric-database-h2@|H2数据库* -tokien-theme-bq|更好的任务-托尔金主题 (Tolkien Theme [BQ]) -tpa-utilities -more-diamond-spawn|更多钻石生成* -shutup-opengl -maid-command|女仆指令* -speedy-hopper-vanilla -suggestions-fix-fabric -no-ixapi@no.ixmodapi - -epicfight-zylob@epicfight-sword-light-modifications|史诗战斗:刀光修改 (EpicFight Sword Light Modifications) -perfect-parity-pale-garden-awakens-neo -expressive-advanced -philia-amulet|友爱护符 (PhiLia Amulet) -stronger-fire-boss|原焰帝臻* -myec@|更多渴望:附魔与制造 (More of Yearn: Enchants & Crafts) -abandoned-urban|废弃城市 (Abandoned urban) -fungal-hazard|蕈骸迷途* -more-useful-copper-2-0@more-useful-copper|更有用的铜 (More Useful Copper) -boom-bombs@ -polars-exploration-additions@ - -ozymandias-sundries -tensura-enigmatic -createtraincontrol@|机械动力:列车控制 (CreateTrainControl) -create-collection-bundles@ -create-enhanced-mastery -create-industrial-tools@ -create-smart-bounds@ -create-fantasizing-again@|机械动力:又在幻想了 (Create: Fantasizing Again) -crafting-station-jei-edition-updated -uncraft-everything@ -@videoplayer -net-music-play-list@|网络音乐机:播放列表 (NetMusic: Play List) - -gregs-modern-construct - -smart-key-prompts@|灵活按键提示 (SmartKeyPrompts) -@zero-whitelist|Zero白名单 (Zero Whitelist) -milometer|计程器* -@pearlchunkloading|珍珠加载区块移植 (Pearl Chunk Loading) -clean-drops -auto-replace -@footprint - -simple-villager-follow@ -tinkers-experience -hedgehog-companion@ -i-want-to-spin@|我要开转* -kiss@kiss-fabric -@mc-bds|北斗导航 (MC BDS) -neo-the-titans@|新泰坦生物 (Neo Titans Mod) - -nuggets-repair-items@|矿粒修复物品* - - -terra-atmos@terra_atmos|群峦环境音效* -tlm-true-power@true-power-of-maid|车万女仆:真正的力量 (TLM: True POWER) - - - -@splash-window -neoenchant -@showcase -enhancedtooltips@ -locate-fixer -journeymap-fixes -ancient-structure@ancient-structures - -wizard-samurai-irons-spells-addon¨@wizard-samurai-irons-spells-addon|Wizard Samurai - Iron's Spells Addon - 更新较慢 -survival-instinct -enderzoo-patched@enderzoopatched -illager-keep -codex-of-champions -ars-controle@ -medieval-craft-historical-firearms -too-many-withers -reliquified-l-ender-s-cataclysm@ - -findshit@log-creator-finder-findshit|找史大王 / 日志溯源 (find log's creator / findshit) -enchantment-lookup@|附魔查询* - - - - -@mods-checker|模组校验 (ModsChecker) -no-enchanting-xp-requirment -client-dynamic-light|客户端动态光源* - -multiyggdrasil@ -thaumcraft-4-patched -patchful -gtnh-customizer@ -view-sounds@ -ae-inventory-profiles -tooltips-reforged@|提示框:重铸* -@wyr -soaring-phantoms@ - -ritchies-projectile-library@rpl -modopedia@ -@translate-allinone|一体化翻译 (Translate All in One) -button-fix@ -@birthday-fabric|生日模组 (Birthday Fabric) -bucketstacking -creeper-no-break-blocks@ -create-cog-hud@|机械动力:齿轮 HUD (Create: Cog HUD) -@createtools-n-weapons -create-pipe-networks@ -jiagu-reappearance|岁在甲骨* -multicolored-redstone-lamps -reliquified-twilight-forest@ -witch-tower -the-nightmare-000@ -meowmere|彩虹猫之刃* -@fallenflowers-server-economy|Fallenflower的服务器经济 (Fallenflower's Server Economy) -deadout-medical-supplies|死亡突围医疗用品 (Deadout Medical) -@thermal-shock -better-questing-npc-integration|更好的任务-NPC扩展 (Better Questing - NPC Integration) - -eu2emc|EU转EMC能量转换器 (EU2EMC) - -simplesorter@|简单整理 (SimpleSorter) -spawncursion|生成式入侵 (SpawnCursion) -grass-be-gone|不要草* -tacz-unidict|TACZ:铳械协议 (TACZ: Unidict) -gem-lichens|宝石地衣* -lethality-a-terramity-addon@ -lootr-fixes -no-name-provideds-potion-fruit@potion-fruit -fungus-stew -auto-sapling|自动树苗种植* -alans-bees -snack-sticks@ -fish-fix -stuttering-screen-lag-protection -tilefinder@ -immersive-furniture@|沉浸式家具* -modernnetworking -like1-8 -spoduos-future-mineration -enderio-continuous|末影接口延续版 (EnderIO Continuous) -enchantment-broker@ - -new-dawn -enhanced-glass -hospitals -comfy-cozy -epicnpc|史诗战斗NPC (EpicNpc) -epic-fight-script-extension|史诗战斗:脚本扩展版* -@undead-transformation - -skullskinless|头颅无皮肤/易颜得帧 (SkullSkinless) -staynight|永夜定驻 (Stay Night) -blockblocker|方块放置阻止/抑用挡置 (BlockBlocker) -shoving-shovels@ -electric-coating|不止电池 / 电力镀层 (NotOnlyBattery / Electric Coating) -araxers-bestiary -better-questing-immersive-engineering-multiblock -bloodyquests -croaker@ -crawl-on-demand@ -gaze-a-malum-addon -osce|矿石菌种社区版 (OreSpawn Community Edition) -explosive-arrow -more-relics@ -no-sun@no-sun-mod|暗无天日* -opposing-force@ - -@pingfix -@volumescroll -talk-balloons@ -health-indicator-txf@ - -snowy-weather - -dimensionlock@ -fluidium|锍* - -peritia - -inventory-sort@|背包整理* -corpse-kibou-no-hana|希望の花 (Corpse: Kibou no Hana) -redyeable -@natural-motion-blur -@modpack-checker -convenient-achievements -vintage-vibes@ - -@smelter-the-hedgehog -@hopper-the-hedgehog -custom-trades-mod|自定义村民交易* -tameable-zombie-horse-and-skeleton-horse|可驯服的僵尸马和骷髅马* -mi-tweaks -qa-villager-tweaks@qa-villager-extends|Qa 村拓展 & 废物革新 (Qa Villager Extends & Waste Innovations) -multiblocked-extended-compatibility -enum-extender-js -@btc - -no-pigs -vanimals@ -wind-charged-weaponry@ -untagged-mobs -enchanted-potato -cit-for-nbt - -bonemealtweaker -hellstone-golem|狱岩魔像* -netherstar-crafting|可合成的下界之星* -tutes-cn-sweetinks-items|塔兹与甜墨的物品 (Tutes-cn & Sweetink's Items) -i-am-steve@i..am-steve -backported-stufff - -tumbleweeds@ -mending-mirror|破镜重圆* - -natures-life -yggdrasils - - -@deepseeks-enchant|DeepSeek的附魔 (DeepSeek's Enchant) - - - -isitwaxed -simple-hp-bar@ -login-hp-fix -shape-shifter-curse@|幻形者诅咒* - - -tinkers-planner-reborn|匠魂蓝图:重燃 (Tinker's Planner Reborn)¨@tinkers-planner-reborn|匠魂蓝图:重燃 (Tinker's Planner Reborn) - 审核中 -hunger-overflow -nocreeper -mo-creatures-extended -skippy-pearls -spelunkery-plus -forge-better-redstone -jeb-just-enough-book@justenoughbook -pal@ -data-anchor@ -elytra-hopping -oh-more-wandering-trades@|更多游商交易* -beacon-anti-phantom@|不时轻轻肘击幻翼的邻座信标同学 (Beacon Anti-Phantom) -@flexible-painting|灵活的画 (Flexible Painting) - -cooler-animations - -hardcore-architect - -carpet-neoforged@neoforge-carpet -no-campfire-smoke -tiny-tasks -fancy-outline -echo-compass-hud@ -decorative-stands -confluence-otherworld-gun-fix@ - -sbm-cardboardboxes - - -bedrock-age@|基岩时代* - -return-scepter|回程魔杖* -@koniavacraft|娜拉工艺 (Koniavacraft) -emojicraft|Emoji工艺* -kylin-arm|麒麟臂* -server-hats@ -forgotten-ruins@ - -creeperhost-presents-steves-carts@ -perspatium@per-spatium -face-stealer@ -offlawn-legacy -metalborn -@wizards-mod -mo-creatures-nostalgia-edition@ -mocreatures-awakened -sterling -cuisine-tfc|料理群峦 (Cuisine TFC) -@natural-temperature -silent-gear-metalworks -treetap@ -better-cave-update -@affix -starry-end -dynamic-trees-for-cobblemon -immersive-portal-gun-for-forge@ -adorable-hamster-pets@ -infinite-lava@|无限熔岩* -ethereal-shots|无限箭制 (Unlimited Arrow Works) - -epic-fight-super-golem|超级铁傀儡 (Epic Fight - Super Golem) -fallen-log-hideout -pastel@pastel-mod|彩绘世界* -mob-catcher-unofficial -retro-pet-items -confluence-dimension-patch|汇流来世维度补丁* -convenient-storage|便捷存储* -legendreliclib|传世遗产库 (LegendRelicLib) -jauml@ -nemexlib@ -cryonicconfig@ -knight-lib@ - - -@okom - -craft-slabs-back-into-blocks@ -highland-statue -restore-ore@|复原矿石* -factory-blocks@|工厂方块* -camouflaged-doors -rotten-planks-and-logs - -create-unify-updated-to-create-6@ -create-arm-made-cuisine|机械动力:臂力臂力炒菜 (Create: Arm-made Cuisine) -create-cultivation-craft@|机械动力:栽培工艺 (Create: Cultivation Craft) -kaleidoscope-cookery@|森罗物语:厨房* -retroemi-forge@ -@pearlecho -@mcdaycounter -minecolonies-war-n-taxes -falling-down@ -more-red-x-cc-tweaked-compat@ - -@speed-uuuuuuup|加加加加加加加速! (Speed Uuuuuuup) - -wither-reincarnated -@biome-snapshot -toros-auto-attack@ -creeperfire|自定义烧货 / 苦力怕阳光下燃烧 (CreeperFire) -fastspawner|刷怪笼渲染优化/产器速算 (FastSpawner) -sophisticated-storage-plus|存取思深/精妙存储扩容* -whaleborne|鲸帆远航* -uniful@ -newspaper-big-book-bibliocraft-legacy-backport -bic-clipboard -templates-2@ - - - - -workstation-recipe-exporter@|可视化配方编写* -simple-auto-attack -hostile-to-neutral -tracer -fishing-tick-fix@ -fzmm@ -pasteljei@|彩绘世界JEI (PastelJEI) -e4mc-retro@ - -mantlejs@ -one-enough-hand|只手遮天* -persistent-moon-phases -sakurapack-compatability-patch -cattlestrophic@cattlestrophic! -ae-recipe-tool -minecraft-cursor@ -stalker-creepers-fabric@ -epiv-fight-l-enders-cataclysm-compatibility|史诗战斗灾变兼容 (Epic Fight & L_Enders Cataclysm compatibility) -lunar-nether-backport -lookinmyeyes -more-relics-more-rpg-content@more-relics-rpg -backstab-reforged -armamentarium - -remnant-bosses@ -choccos-mobs@ - - -uncrafting-table-xiaoyu-2009|拆解台 (Uncrafting Table) - -aewirelesschannel|AE无线频道 (AE Wireless Channel) -infinitepower|无尽能源 / 能量叠生 (Infinite Power) -hoshikima@|随意作品* -create-bugfix-clipboard-patch|机械动力:剪贴板修复 (Create Bugfix: Clipboard Patch)¨@create-bugfix-clipboard-patch|机械动力:剪贴板修复 (Create Bugfix: Clipboard Patch) - 审核中 -tool-disassemble|拆器碎散/匠魂工具拆解* -summer-to-life|夏意盎然 (Summer to Life) -@freedraw -geckojs@ -sanandreasps-manager-pack - -touhoulittlemaid-orihime@|车万女仆:织姬 (Touhou Little Maid: Orihime) -more-mod-tetra|更多Tetra模组锻造材料* -cataclysm-dimensions@cataclysm-dimension|灾变:维度* - -misttaczskills@|TaCZ:圣化技能扩展 (MistCloud Tacz Skills Extension) -quality-railway@|品质铁路* - -custom-mob-attributes@ -custom-durability@ -@dragons-egg(s) -zombie-variants@ -extra-carts -fairy-factions-revived -netherited@netherited-fireproof¨fabric-netherited -creeperhost-presents-soul-shards@ -myths-n-legends@myths-and-legends|神话与传说 (Myths & Legends) -@snackcraft|零食工艺 (SnackCraft) - -copper-backport@ - -@shield-indicator|盾牌指示器 (Shield Indicator) -a-bastion-remnant-treasure-reset|堡垒遗迹藏宝室重置 (Bastion Remnant Treasure Reset) -a-bastion-remnant-hoglin-stable-reforged|堡垒遗迹疣猪兽棚重铸 (Bastion Remnant Hoglin Stable Reforged) -colonial-arcana-minecolonies-addon|殖民地魔法 (Colonial Arcana) - -fires-ender-expansion -thetitansneo@|泰坦生物Neo (TheTitansNeo) -vectorientation-reneoforge -copyid@|复制ID (CopyID) -@a-lightcolor-beacon -@surveyor -@create-portable-packaging -create-more-pipe-bombs-in-packages@ -create-bugfix-schematic-patch@|机械动力:蓝图补丁 (Create Bugfix: Schematic Patch) - -create-ornithopter-glider@ -create-train-parts@ -@breakable-blocks -flux-network-x-cc-tweaked -twotility -opticubes -closets-by-smplesco@ -variety-chests-mod -light-detector -quality-hails -ancient-structures-edo-japan@ -tiger-shark@tigershark|海虎 (TigerShark) - - - -better-end-cities-better-end@better-end-cities-for-betterend|更好的末地城 (Better End Cities)¨better-end-cities-vanilla@better-end-cities-base|更好的末地城 (Better End Cities) -fallen-gems-affixes -skill-tree -blatium@ -trimica@ -fantasy-weapons-medieval-series@fantasy_weapons - -ksit@ -bestia@ -@itemfinderinall-items -filterchat -kit-keep-inventory-timer-keepinventorytimer -useful-luck@ -@sneak-fertilizing -p1neros-epic-fight-leawind-compat -custom-entity-leveling@|自定义实体等级* -no-monster-rooms -@carpetrmsaddition -@fireworkindicator -squeedometer-reforged-special-port - -difficulty-patch -squake-reforged@squake-fabric-updated¨squake-fabric-1-20 -squake-reforged-special-port -brigo@ -ae2-web-integration@ -skillet-man-core -p1neros-dialogue-lib - - -create-arm-made-barbeque|机械动力:臂力臂力烧烤 (Create : Arm-made Barbeque) -indestructible-blocks - -epic-fight-super-chef -epicfight-nightfall|史诗战斗:夜幕 (EpicFight-Nightfall) -genesis-official -featurecreep - -fabric-orm-jimmer@ -aces-spell-utils@ -targeteventbackport -silk-kt@silk - - -@playercommands-(old-mc) -legends-forge-series-vikings-n-northerners -tinkers-battle-spades -@its-not-real -ly-meteors -ashvehicle -@smart-absorption -@mooshees -city-of-chambers -tower-of-chambers@tower-of-chambers-neoforge - -ancient-structures-chinese@ -eypipes -shipping-bin -hbm-nuclear-tech-mod-community-edition|HBM的核科技社区版 (HBM's Nuclear Tech Mod Community Edition) -gte2-coremod@ -japan-props@ - -one-enough-item@ -o123456789@ -friendly-chests-no-fluid -herios-floral-expansion@ -pinkcabbage-transparent-betterscreen@pinkcabbagetransparentbetterscreen|粉红大包菜的屏幕透明度优化 (PinkCabbage Transparent BetterScreen) -wastify-returns -sillys-crossbow-fix@ -thaumpotion-tweaker@ -novoatlas@ -resource-pack-tweaks -night-vision-decay-fix|夜视衰减修复* -roid-tweaker -translatorpp@ -modular-machinery-community-edition-addons -randomaddon|随意之作 (Random Addon) -myhead|持器射首 / MyGO 你个头 (BanG Dream! It's MyHead!!!) -boss-dps-tracker|查其所伤/Boss伤害追踪器 (Boss DPS Tracker) -wandering-trader-may-leave@ -mod-tabs -totem-bar@ -visualores-meowmel -savebabystriders -bygone-nether-fixes@|逝去的下界修复* -bossesrise - -advancementinfo-update -expanded-mace-enchanting@ -silky-spawners -starhud@ -celeritas-dynamic-lights@ -resistance-balancer@ -silkier-touch@ -wither-spawn-fix@|凋灵生成修复* -accelerated-rendering@acceleratedrendering|加速渲染* -cii@ -simpler-wooden-pipes@ -garden-cloche-backport -bh-boss-hatred@boss-hatred|首领仇恨 (Boss Hatred) - -camol -bbb-unforged@ -performance-monitoring-enhancer -create-upsizing@ -better-world-loading-forge@better-world-loading¨better-world-loading-fabric - -apocalypse-minimap-hud@apocalypseminimaphud|启示录:小地图Hud* -advancementnomore|进度移除 (AdvancementNoMore) -collisium -dypsis -chat-plus@ -mcreatormemfix@ -@atlas -legacy-tweaks@legacytweaks -easy-elevators@|简单电梯* - -davincing -aeronautical-radio|航空无线电* -hunter-vs-mice@|猎人鼠鼠游戏* -citymod-one-block-one-building@city_mod -gedrite-mod@ -@shorkie -enchantable-boat@ -throw-bricks -animal-pens@animalpens - - - -@glys-can|GLY的罐头 (GLYCan) -fargo-soul|Fargo魂石* -@brokenbows|破损弓 (Broken Bows) -mekanism-trimming|通用机械纹饰* -teleportcakes@|跃迁蛋糕 (Teleport Cakes) -repair-amulet -alpine -clientchatclean|客户端消息清理 (ClientChatClean) -clickmobs -vlib@ -wabbanode-companion -@mcmti|麦克风语音识别文本输入 (Microphone Text Input) -powernexus-menu -hit-delay-fix -betterexcavate|更好的挖掘机制 (BetterExcavate) -optimization-of-campfire-smoke|营火烟雾优化 (Optimization of Campfire Smoke) -armored-combat-enhancer - -animal-hats@animal-hats-yeah -@raid-restore -asgardandelion-for-botania -trotting-wagons@ -grindstonehoning -rainbowwrenchforjei-reforge|彩虹扳手:Forge版 (RainbowWrenchForJei: ReForge) -better-locate-structure-command|更好的结构定位指令* -att-miss|闪避攻击* -energizexp@ -no-more-magic-choices|更好的铁魔法UI* -patternbetter@|更好的ME样板供应器 (Pattern Better) -legacy-skins@ -@oh-my-pc -vsprinter@ -clickvillagers -@button-packet-id-fix -accessories-compat-layer@ -world-downloader@ -tameable-guinea-pigs -familiarslib -dmr@|龙骑士重制版 (Dragon Mounts Remastered) - -avaritia-expand|无尽贪婪 : 拓展 (Avaritia : Expand) -polaristrading|北极星市场方块 (PolarisTrading) -ecliptic-seasons-multimod-patch -random-things-returns -infinite-storage-cell -delta-technology|八宝粥行动* -elegant-spells@|雅致咒术* -@seelescraft|希儿的工坊 (Seele's Craft) -readyhomes|随时可住 (ReadyHomes) -arknights-weapon|方舟武器* - -illager-warship@ -asian-fountains@ -illager-chef-trader -skyblock-villager -@redstoneer-villager -perrys-urban@ -neo-blahaj - -teleportation-crystal|传送水晶* -majo-spell-enchantment|魔女的魔咒 (Majo's Spell Enchantment) -oaks-capes@ - -cobblemon-ride-on@|Cobblemon:骑乘! (Cobblemon: Ride On!) -clayium-additions -farmers-tfc|农夫群峦 (Farmers TFC) -oaks-delight@ - -pathfinding-edition-for-minecolonies@|殖民地寻路大修* -clicksigns@ -@salted-fish-craft|咸鱼 (Salted Fish) -herios-helian-mod@ -decorative-food@|装饰性食物* - -anvilcraft-alloyextension@|铁砧工艺:合金扩展 (Anvilcraft: Alloy Extension) -arkifs-hoverboard-mod -glow@glows -leaf-villager-trader -guard-villager-trader -hunter-villager-trader -garbage-collector-villager -more-traders@ -ae2-better-villagers@ -harvester-trader -railman-villager@ -dimensionaltraders -taxbiometrader@tax-leons-biome-trader -quickelytraswapperplus-client@elytraswapper+ -@elytrakey -elytraswapperplus -taste-fatigue@|味觉疲劳* -realistic-nametag@ -hitboxplus@ -@hittable -hitmarker -autolandingwater@|自动落地水 (AutoLandingWater) -skygrid-reloaded@ -@stone-wood-industry|石木工艺 (Stone & Wood Industry) -roomopolis@ -bbl-placers@ - -draconic-legacy-models|龙之进化旧版模型* -furnaces -gtconstruct -rain-be-gone-ritual@ -the-vegan-option|素食者的选择* -gensokyo-delight-youkais-feasts@|幻想乡乐事 ~~ 妖怪们的飨宴 (Gensokyo Delight ~ Youkais' Feasts) - -tuttas-doors@ -@effectlivingdead|行尸走肉 (Effect Living Dead) -vs-chunkloader@|VS区块加载器 (VS ChunkLoader) -create-blocks-bogies@blocks-bogies -create-netherite-additions@ -create-sophisticated-backpacks-compat@ -create-item-pets -c-bc-nukes-6-0-port -plushieverse@ -thavma@ -arsarms -yorupo-mod@ -yande-mod@ -gtcefucontent -mcheli-overdrive-ext@mcheli-o-ext -iron-biplane@ -realistic-computers - -boss-mob-enhancer -flight-api|飞行 API (Flight API) -unlimited-spawners@|无限刷怪笼* - -@minecart-visualizer|敞骑速视 / 矿车信息可视化 (MinecartVisualizer) -@shadowborders -authenticate@|认证* - -unbinilium -veinbreaker@ -actions@ -i-have-no-mouth-but-i-must-chat@ihavenomouthbutimustchat -renderscale@ -proportional-destruction-particles -tacz-ammo-query -fast-happy-ghasts -@starhudforged -@slotted-armor-hud - -@say-sorry! -@playerautoma -im-fast@ -@unpath -no-more-popups@ -sussypatches@ -@simple-item-editor -baby-zombie-removal@ -immersive-sounds -boatview360@ -@my-resource-pack -oaks-bits@oaks-bits-and-bops -@starsource|星源拔刀剑 (Star Source Blade) -snow-waifu-spell|雪下的誓言* -mob-farm-trap@|香草刷怪塔陷阱强化:涌渊敌冢* -twograve -perrys-decorations@ -perry-s-decorations-2 -bookshelf-extended-enchanting-reach -enchanter-fix@ -dynamic-regen-enhancer -guinea-pig-variety@ - -@areas-hint|域名 (Areas Hint) -yammo - -fps-display-doubler@ -inventory-stages|背包阶段* -gregmek|格雷矿物通用机械支持 (GregMek) -@armor-hud -@ukus-armor-hud -flowtech-mob-systems@ - -ftb-materials -the-great-below -illagerblabber@ - -serene-season-extended-fix -create-enchantment-industry-plus@ -boiled-one-unleashed -creaturecraft-plus -war-elephants - -one-click-one-block-1c1b@oneclickoneblock|点到为止 (One Click One Block) -@translatabledebugoptions|可翻译调试选项屏幕 (TranslatableDebugOptions) - -suppressopengl1280@|OpenGL错误隐藏 (Suppress OpenGL Error 128(0-2)) -fexs-vehicle-mod@fvtm -otterlib -dimban|维度禁用 (DimBan) -onlyoneitem|仅存一物 (Only One Item) -bedload|自定义区块加载器 (BedLoad) -@unreachable-nether - -@detail-armor-bar-reconstructed -@auto-fishing - -indrevjei@|工业革命JEI (IndRevJEI) -fpresearchpatcher|飞向未来研究数据包兼容 (Futurepack Research Patcher) -me-infinity-cell|ME无限元件 (ME Infinity Cell) -air-jump -more-sniffer-flowers@|更多嗅探兽花卉* - -enchantability|附魔能力* -ender-lead@|末影拴绳* - - -create-growableores-compat@creategrowableores-compat - -gears-n-kinetics@ -valkyrien-sails@ - -moo-fluids-modern -yan-from-ff14@|FF14的羊 (Yan from FF14) - - -tfc-cuisine@|群峦料理 (TFC Cuisine) -tfc-no-collapse|群峦传说:塌方禁止 (TFC No Collapse) -no-sleep-chat-overlay-nsco@no-sleep-chat-overlay-(nsco) -funkys-fancy-furnaces@ -timber-enchantment -@alternative-chunkloading -@particulate -haydenapi -spore-inquisition -ice-and-fire-spartan-weaponry-extras -@vanitydungeons -@fcitx5-enhancer -kubejs-actually-additions@ -vibrative-voice@ -spawnlock -enchantment-custom-table@|自定义附魔台* - - - -keeping-inventory-reborn -camel-extend|骆驼拓展* -confluence-music|汇流音乐* -cancel-attack-cooldown|取消冷却间隔* -surprising-loot|藏奇速释/惊喜战利品* -@onlykeys -flair -minecraft-comes-alive-reforged|凡家物语·重制* -cave-mita-dweller@mita-dweller -eeeabs-mobs-death-mode -revivetoken@|复活币 (ReviveToken) -real-filing-reborn-cabinet-based-item-storage@ -quivers -infused-crystals@ -mendingremover@ -auto-vanilla@autovanilla -underground-villages-stoneholm@underground-village,-stoneholm -gep@ - -more-harnesses@|更多挽具* -vanilla-aiots@ -nether-villager-merchant@ -end-villager-trader@ -deep-dark-trader@ -random-generator-block -devour -quantum-storage-reborn@ -library-section@ -move-subtitles@ -@modrenf3 -modern-inline@ -culler@ -@playernoticeboard -extendedae-plus@ -@ae2uel-extra - -gems-realm@ -arrowcollect@|箭矢回收修复 (ArrowCollect) -@primitivemobsrevival -steampunk-clocktower -piglin-outpost -nolando-structurez -skinlayers3d-customskinloader-bridge@ -puffish-biome-dither@biome-dither -voracious -@minecraft-dungeons-weaponry -gentech-block-generation@ -byzantine-styles-pack-for-minecolonies - -aquaculture-tinkers@ -cups -blue-archive-halo@|仿碧蓝档案光环* -minebackup@|存档时光机 (MineBackup) -ecological-replenishment-station@|生态补给站* -@advancedhostility|进阶仇恨 (Advanced Hostility) -aggro-fix@ -chest-curio-items@|箱子里的小饰品* -galaxysimagination|Galaxy的奇思妙想 (Galaxy's Imagination) -delightful-cuisine-for-woodheads-reforged|懒人厨房·重制 (Delightful Cuisine for Woodheads Reforged) -@loans-cinema -banana-baking@ -duacan-delight|岩城乐事* -slashblade-refabricated@|拔刀剑:重织 (SlashBlade: Refabricated) -ender-dragon-fix - -detailab-compat@|细节盔甲兼容 (Detail Armor Bar Compat) -calypsos-mobs@|卡里普索的生物 (Calypso's Mobs) -dirtcraft-unoffical|泥土工艺 - 非官方版 (DirtCraft - Unofficial) -specialmaterials@|材料 (Materials) -@onlytpnext|仅传送Next (OnlyTPNext) -easy-survival-command|简单生存指令TP (EasySurvivalCommand) -@gensokyo-reverie-of-lost-dreams|梦隐的幻想乡 (Gensokyo Reverie of Lost Dream) -reliquified-ars-nouveau@ -requesting-interface@irequesting -applied-experienced@ -plain-cars-pack@plaincars -gt-craft-iv-mts@gt-craft-ivmts -ad-astra-more-structures@ -perfect-dodge|完美闪避* -simple-paraglider@|简易滑翔翼* -human-gunner -tacz-headshot-extension|TaCZ 爆头机制扩展 (TaCZ Headshot Extension) -dream-in-a-manhunt - - -@thesunrise -more-critters@|更多异兽* -oelib¨@oelib|One Enough Lib - 仅0.0.1 -itemblacklistfixed|物品黑名单修复版 (ItemBlackListFIXED) - -voxelmap-patch -xaero-train-map@ -traversable-leaves-neoforge¨traversable-leaves¨traversable-leaves-fabric -@etched-extension -vs-addition-continue|VS Addition Continue - 更新慢¨@vs-addition-continue|VS Addition Continue - 更新较快 - -clavis@ -luckyblock-lib - -nopackcompatcheck@|禁用资源包兼容性检查 (NoPackCompatCheck) - - -crabbers-delight-expand|蟹农乐事:渔冶锭整 (Crabber's Delight Expand) - -offlinegrowth@ - -fauna-and-orchestra@faunaandorchestra - - -contact-love-rekindled|往来:旧情复燃 (Contact: LoveRekindled) -autosow-by-neni-o@ -piglin-join-wto|猪灵加入了WTO (Piglin Join WTO) -keyboard-detector@|键位检测器* -potion-pill|药水药丸* -inhrtburys-coin|Inhrtbury的金币 (Inhrtbury's Coin) -@firesight -epic-villages -@brainfk-in-minecraft -@aviator-dreams-reloaded -russian-dream - -cbc-ballistics -create-programmable-pals -create-ore-excavation-plus@ -@createtreadmill|机械动力:跑步机 (Create:Treadmill) -create-more-package-couriers@ -regius@ - - - -dont-make-me-see-red|别让我红温* - -peyros-scythe|佩伊洛的镰刀 (Peyro's Scythe) - -@readstar|占星术 (ReadStar) -illage-and-legend -giant-dead-oak-tree@ - -ascension-nether -ascension-end -@echovoids -soulful-nether@soulfulnether -zefs-nether -the-end-update-concept -@ending-biomes -charred-horizons@ -@nether-update-expanded -i-see-my-armored-hand@ismah -naturally-spawning-withers@|自然生成凋灵* -wither-infection@ -creeper-infection@ -long-books@ -ftb-chunks-recoloured -jei-hover-search@ -rollable@ -invisibility-aggro-fix@ -quick-skin@ -countryball@minecraft-countryball-mod -tinkers-construct-emergence -pointblank-jelly@pb-jelly -terrabnormals -extra-mining-world -herobrine011840s-nether-biomes -my-end -update-ender-a-reimagine-of-the-end -@air-puffers -companions-mod@|同伴! (Companions!) -@ai-chat|AI聊天 (AI Chat) -apothic-attributes-extension|神化属性拓展* -databank@ -randomtp@ - -instantunify-reforged -@blockfire -morphoverlay -display-prior-work-count -extended-scripts -natures-aura-simplified|自然灵气:简化 (Nature's Aura Simplified) -bed-spawn-backport@|想设就设* -visible-effect@|药水效果显示* -@config-manager|设置管理器 (Config Manager) -simple-datapacks@ -shulkerrrt@srrt -custom-icon-sets -gregic-probe-ceu -@antilootgame -graphene@|石墨烯性能优化* - -talents-fabric@talents -@combat-maids -voxelfurni -voxels -voxel-pairing -no-stuck-healing -pixelcompress -matrinoxes-village-names -redlink-wireless-redstone-control@ -@nekohashizuku-blade|雫拔刀剑 (ShizukuBlade) -xtones-reworked@ -@tinkers-enchanting -new-woods -ennuis-bigger-inventories@ennuis_bigger_inventories -@soldisco|生活调味料:探索 (Spice of Life: Discovery) -missing-cookery -@farmers-tea-resteeped -peruvians-delight@ -productivefarming -brewin-compat-delight@cocktails-delight|鸡尾酒乐事 (Cocktails Delight) -kubejs-tweaks -krypton-fnp@ -neoauth@ -crystalix -chisel-chipped-integration -refined-types@ -mystical-automation@ -utility-vest -little-big-redstone@ -@stone-is-stone -almost-unified-ie -@trident-are-weapon -collect-seeds -create-delicious-teas@ -@showtime -@windup-music-box -babylonian-empire-origins -mc-mods-the-arcanist-gear -epitaphs -biologist|生物学家* -wandering-trapper2|流浪猎人2* -skiing2|滑雪* -backported-animal-variants@ -explore-ruins-aether@ -warpdrive-extras@ -@chest-transport-reloaded -lrs-blockollection -@the-what-tools -tacz-chaoscrafts-apocalyptic-arsernal -detail-armor-bar-re-equipment@|细节盔甲条:重装 (Detail Armor Bar Re-equepment) -@jeac -boat-fly|船飞行* -finite-water-infinite-lava -transfer-labels@ -growth-accelerator-tiers -astages-curios -astages-pufferfishs-skills -sound-physics-perfected@ -the-sound-of-rain@ - -greekfantasy-unofficial -musketeer-illager-port -cataclysm-apotheosis-addon-neo -iron-apples-iron-series@ -@mangos-compat-delight -tinkers-oreganized@ -simple-basketballs@simple-basketball -decorative-blocks-repurposed -create-mechanical-botany@ -@insecticide - -naked-gauntlet|焰眼掉装* -only-one-item@ - -aimbow-bow-hit-indicator|弓箭瞄准 (AimBow) - -@tt20forged -@worldfarview -@fixmcstats -soul-return-scroll|还魂符* -slashblade-murasame@|拔刀剑:丛雨丸* - -dungeon-tools-2|地牢工具 2* -gregtech-beyond-coremod -create-compatible-storage@ -antique-rockets@ -meta-changer -chromatic-enchantments@ - - -tfc-detail-armor-bar@|群峦传说:细节盔甲条 (TFC Detail Armor Bar) - -tinkers-compatibility@ -fabric-trade@ -giant-nether-tree@ -gamerule-doblockupdates -terralith-restoned -guitas-woodworks@ -power-grid@|机械动力:交错电网 (Create: Power Grid) - -audaki-cart-engine@ - - -humansmod@humans-mod -aquaacrobaticslegacy - -armored-arms@ -armored-golems -disable-fog@ -accrelatedrendering-refabricated@|加速渲染 重织版 (AcceleratedRendering-reFabricated) -minemenureforged|我的菜单 重制 (MineMenuReforged) -function-command-deduplicator@|函数命令去重器* -@hide-armour -ftb-quests-freeze-fix@|FTB任务冻结修复 (FTB Quests Freeze Fix) -playeranimatorapi@ -strictly-origins@ -born-in-configuration@ -eyes-of-ice-and-fire@ -better-hp@betterhp -jsonate -plsgodie|残血了就给我乖乖去死啊! (PlsGoDie) -tetra-patchouli-book|Tetra帕秋莉手册* - -configurable-death@ -invenaudio@ -client-curse-of-binding-prevention -simpleclockmod - -audio-improvements@ - - - -simple-crop-harvester|简易农作物收割* -darkness-curse|暗影诅咒·重生 (Darkness Curse • Reborn) -scroll-wheel-command@scroll-whell-command|滚轮命令* -infoplus@ -@bin-slot -cobblemon-utils -flamingo-mania - -endangered-plants|濒危植物* - -better-melon@|更好的西瓜* -better-snifferty@|更好的嗅探* -@bobs-originium-dream|鲍勃之源石梦想 (BOB's Originium Dream) - -minibloom -teatime@tea_time -garden-trails@ - -@gd656killicon|GD656击杀图标 (GD656Killicon) -itemcleaner@|掉落物清洁者 (ItemCleaner) -@tinkers-dolabrae -metallic-tinkering@ -kubejs-draconic-evolution -kubejs-mystical-agriculture@ -modern-beta-forge-islands -modern-beta-forge-release-plus -pomkots-world@ -black-dragon-armor|怪物猎人·世界:黑龙盔甲* -kimetsu-no-yaiba-reload|鬼灭之刃 重制* -resonantisshelomoh|同调造物·所罗门 (Fabrica Resonantis: Shelomoh) -withering-away-reborn -villager-extend-localbully|村民拓展:地头蛇 (Villager Extend - LocalBully) -dancing-villagers -natures-of-witchery -tct-flashlight@tctflashlight -mace-attack-assistance -changed-doomsday -changed-ice -tile-entity-breaker -frozen-ocean -portable-pet-sphere@ -@thaumicthermae -bbl-routers -bed-sapwnpoint -wans-storage-shelves@storage-shelves -@winefoxs_spellbooks|酒狐的魔法书 (Winefox's Spellbooks) -better-allay@ -codechicken-lib-cre@ -solcarrot-fix|生活调味料:胡萝卜版 - 死吃修复* - -nanexs-cherry-biome -digital-botania - -crab-city-facilities@|螃蟹的城建 (Crab city facilities) -bbl-casting@casting -bbl-smart-crafting -foolproof@ -realistic-terrain-generation-community|真实地形生成:社区版* -more-outlines@ -phantomtweaks|移除幻翼 (RemovePhantoms) -simple-item-blacklist|简易物品黑名单* -titlescreen-cleaner - - -manaitaplus-legacy@|砧板传承 (ManaitaPlus Legacy) - -blockoffensive@|方块攻势 (BlockOffensive) - -hugme-forge-edition|抱抱我!Forge 版* - - - -tool-upadate@tool-update|工具附魔等级升级 (Tool Update) -@better-gregtech-and-applied-energistics|更好的格雷科技与应用能源 (Better GregTech And Applied Energistics) - -tprt-sakuratinker-expand|挚爱 (myLove(sakuratnker expand)) -better-turtle-scute@|更好的海龟壳* - -floatable-pressure-plates@|可浮空压力板* - - -more-rust@rust|锈 (Rust) -cryofloric-arts@|严寒插花术* -tacz-refabricated@|TaCZ:重织 (Timeless and Classics Zero: Refabricated) - -ashen-witch-broom@|魔女的扫帚:重制版* -maidswordsoaring|女仆御剑 (Maid Sword Soaring) -lembrary -optiboxes@ -create-furnace-lava-adapter -create-trainutilities@ -@createtrainscustomportalapi1.20.1 -create-xptool@cxptcreatexptool|机械动力:经验工具 (Create: XPTool) -graveyard-death-mode -beautiful-campfires@ -kimetsu-no-yaiba-final-hope -legend-ary@ -tfc-hourglass|床起速时 / 梦该醒了 (TFC Hourglass)¨@tfc-hourglass|床起速时 / 梦该醒了 (TFC Hourglass) - 审核中 - - - - - -@alan-unified-ui -@cntiertagger -pick-up-the-hint|物品拾取提示 (Pick Up the Hint) -jei-tetra -eyes-in-the-shadows@ -bandagez -kineticdamage@ -underwater-village@ -dimension-parasite|维度寄生者* -@realistic-stamina -ciscos-content -pet-home@pet_home -changed-xtras@ -alexs-caves-enriched@|Alex 的洞穴:浓缩 (Alex's Caves: Enriched) -@fps-to-the-trash -@entity-desync-viewer -re-entity-outliner -@c2mef -hellspawn-starting-dimension@hellspawn -jj-weapon-config -bbl-compat@opolis-compat -tinkertime-geology -spectral-arrow-tweaks -too-many-bows@ - -@soulbinditem|灵魂绑定 (Soulbind) - - - -maid-beside|女仆伴行* -snkey|键 (Sn Key) -vzlinglib@ -@signfinder|告示牌查找器 (Signfinder) - - - -@colorful-leaves-mod -decorative-computers@|装饰性电脑 (DECORATIVE COMPUTERS) -landk-furniture@ -derfl007s-road-mod@derfl007s-road-mod-repaved -medieval-paintings@ -glymworld-deepslate - -roadarchitect@ - - -lazybank|咸鱼物品银行* - - - - -@projectile-ding -client-time@clienttime -replanter-plus@ -ae2-retex-port -tinker-tantrum -amethyst-additions -@tetravsikt -@advanced-netherite-upgrade-templates -@falling-sand -gregified-energistics@ -scalable-storage-ceu@ -luminous-blocks@ -epic-structures-witch-huts - -void-block-fabric@void-block-fabric-1.21.1 -more-stews-mod -@ported -better-music-player -berries-and-mobs -applied-soul -packagedfluidcrafting@|封包流体合成 (Packaged Fluid Crafting) -packagingprovider@|封包供应器 (Packaging Provider) -mts-iv-recurring-air-war - - - -@explodee -swift-wheel@|迅捷轮盘* -@clienttimeandweathercontrolmod|客户端时间与天气控制 (ClientTimeAndWeatherControlMod) -better-spectral-arrows -polymorphic-tom@polymorphic-toms-simple-storag -shoulder-surfing-ultimine@ -artisan-pottery@ -epic-fight-avalon -@neospeedzero|自定义速通挑战:Zero (NeoSpeed Zero) -fluffy-dandelions@ -nether-update-concept-mod -@little-maid-mood-flutter|车万女仆:情绪萌动 (Little Maid: Mood Flutter) -mobvotes-sniffer@sniffer -ae-wireless-transceiver@|AE无线收发器 (AE Wireless Transceiver) -create-train-lights@ -kabooms -zoo-architect@ - -@noverifychat|无验证聊天 (NoVerifyChat / FixChatVerify) -giant-cherry-blossom-bonsai-tree@ -lemonskin@|柠檬皮 (LemonSkin) -water-erosion -@undertale-healthbars - -tetra-gui-compat -@shortratio-mod -quantumchunks@ - -@citrus -@accessory-api -@catalyst -@day-counter-enhanced -messenger-crow -epic-fight-super-warden|史诗战斗:超级监守者 (Epic Fight - Super Warden) -armageddon -cobblemon-mega-showdown@ -golem-dungeons@|傀儡地牢* - -explosion-overhaul-a-new-level-of-destruction -@skillz -hadean-breathe@|幽焰之息* -can-you-survive -eternal-shield-bead|永御盾珠* -slashnouveau -@aether-stapi -@notenoughminecraft -originiumarts@|源石技艺 (OriginiumArts) -simplebackhome|简单回家 (SimpleBackHome) -@qismorecommands|齐的更多命令 (Qi's More Commands) -polymorphic-travelers-backpack@ -playernbt-quests-ftb-quests -interactive-block-prompt@ibp|可交互方块提示* -@timeshifts -@weathershift -chat-binds@chatbinds -tridentperf-1-0-0 -maid-s-bakeries|女仆的烘焙坊 (Maid's Bakeries) - -elytraautocollect|鞘翅自动搜集 (ElytraAutoCollect) -@banitems|物品封禁 (Banitems) - -tt20-forged@tt20-reforged -default-server-properties@|默认服务器属性* -f3-lite@ -text-animator@ - -yet-another-furniture@ - -qarsans-insurgency -yum-delicious|Yum!美味! (Yum! Delicious!) -lunarinispread@|丰盛晚宴 (Lunarini Spread) - -rs-backpack@ -no-template-netherite@ - -@mobcapture -koifish@ - - -@mcinspects -@csgo-inspects -armor-hud-by-mcjunky33@ -@can-i-sleep-now -@zenxarch-damage-vignette -simple-teleport-commands@teleportg -too-many-binds -too-many-binds-plus@toomanybinds -astral-dragon -middle-earth-additions-npc@|中洲拓展:NPC (Middle-Earth Additions: Npc) -middle-earth-additions-factions@|中洲拓展:派系 (Middle-Earth Additions: Factions) -middle-earth-additions-war@|中洲拓展:战争 (Middle-Earth Additions: War) -brews-and-bevs@|酿造与饮料 (Brews and Bevs) -@kimetsu-no-yaiba-x-epic-fight - -lrs-dynamic-dungeon -buff-mobs@ -banner-claim@|旗帜圈地* -@reformundyingtotem|不死图腾重制 (ReformUndyingTotem) - -more-world-crafting@|更多世界合成* -@simplelocks|简单的锁 (SimpleLocks) -luminous-helmet -steel-armor-blocks@sab|机械动力:钢铁装甲方块 (Create: Steel Armor Blocks) -create-armor-blocks@|机械动力:装甲方块 (Create: Armor Blocks) -rolled-homogenous|轧压均质装甲* -elemental-end-portal -unseens-better-stronghold -salutation -minecraft-1-7-10-reloaded -global-customnpc-data -modern-beta-forge-rivers -zombie-improvements@zombieimprovements -rewithered@ -better-lost-candle -openblocks-reopened -@rc-toys -fancy-toasts@ - - -@trueuuid|正版离线共存 (TrueUUID) -owapote-bc-exlaser -truly-custom-horse-tack@ -tacz-applied-ammo-box@ -azurum-miner@ -thermal-recycling|热力回收* - -revoted-wildfire@ -biome-makeover-altar-fix -techgunsmixins -open-persistence -hungerstrike-extended-support -@floras-delight -fintastic@|鳍妙至极* -auto-reload-crossbow@|弩自动装填* -aimassiste|辅助瞄准 (AimAssiste) -zombie-dinosaur@a-zombie-dinosaur -monster-expansion -monster-girl|怪物女孩* -@offlineauth|离线认证 (OfflineAuth) -claxels-classic-paxels -meowmeldrawers -@perrys-botany -warforge-factions-remaintained -lunar-moon-reborn -minefactorial@ -create-universal-ores@ -create-crystallized@ -chorus-expansion -@lootshare -clojure-lib -@stripcustomdata|扔掉"custom_data"! (StripCustomData) -wheres-my-brain -champions-alter@|冠军-重塑 (champions-alter) -slashblade-hf-blade@energyblade|拔刀剑:高频刀 (SlashBlade: HF Blade) -virtual-witch-arrangement|虚拟魔女排布法* -@player-move-detector -valkyrien-space-war@|瓦尔基里太空战争* -@blazerod-model-assimp -@bindfirework-hotbar -@new-soul -beautiful-potions@beautiful-potions-mod-edition -yukamis-sophisticated-backpack-tab@ -crouch-to-block@ - -juv@juvenile-preserve|永雏 (Juvenile Preserve) -hooklib@ -oasis2@ -blue-ice|蓝冰* -json-model-legacy@ -lidar-laser-mod -sleep-tighter -butterflies-extension -back-in-slime-honey -alans-basalt-generator -demis-better-stealth - - -@coords-hud|坐标 HUD (Coords HUD) - -@eternisstarrysky|星河传承 (Eternis Starry Sky) -@safe-respawn|安全重生 (Safe(ish) Respawn) -palmon|帕鲁梦* -@spectators-generate-loot|旁观者生成战利品 (Spectators Generate Loot) -death-reduces-life@deathpenaltymod|死亡减少生命值 (Death Reduces Life Mod) -maid-chunk-loader|车万女仆:区块加载* -@maidusehandcrank|女仆摇曲柄 (MaidUseHandCrank) -hard-pity@|大保底:凋灵骷髅/下界合金/三叉戟/龙蛋* -genetics-resequenced@ -moo-fluids -create-balanced-flight-forked -mc-modsthemodium-enderio-capacitor-additions -ironsarms -burst@ -chat-calculator@ - -unbreakable-leads@ -mortality-a-terramity-addon@ - - -chatjs@ -let-me-peek@peekmod -persistent-players -torchmaster-cobblemon-compat -nemos-backpacks@ -homy-tp@ -@shellphone -faded-conquest-ii - - -chosenlib@ - -render-blender|渲染搅拌机* -ve-fluidhandling -@client-export-helper|客户端数据导出 (Client Export Helper) - - -overgeared@ -rain-after-long-drough|久旱逢甘霖 (Rain after long drough) - -@clarityhud -spawn-egg-preview@|刷怪蛋预览* -vulkanmod-extra@ -vramo -@afar -@cmyk-mod -middle-key-ping@|中键标点 (MiddleKeyPing) -scape-and-run-randomizer -amnesia-core -@minecraft-sqlite-jdbc -sqlite-jdbc -forbidden-arcanus-js - -@sha1redemption -f-k-create-world@fcw|不要创建世界 (F××k Create World) -maidusehandcrank@maid-task-scrolling-helper|女仆任务滚动助手 (Maid Task Scrolling Helper) -rozutils@ -instantly-interact-internally@|随点随用* -@jsonem-mult|Json格式化实体模型·多加载器 (Json Entity Models Muit) -gadothaumy@ - -dimensional-teleporter|维度传送器* -avaritia-integration|无尽贪婪:集成 (Avaritia:Integration) -super-lead@superlead|超级拴绳 (SuperLead) -solo-leveling-mod -platanitos@ -@spiceoflifelatiao|生活调味料:辣条版 (Spice Of Life: Latiao) -spicy-species -thaumic-isorropia-kedition -thaumic-concilium-kedition -znet - -railcraft-diesel-locomotive-addon - - - - -alchemistry-redox@ - -extra-hostile-neural-networks -extended-crafting-expanded -packagedexexcrafting@ -scp-reborn|SCP:重生 (SCP: Reborn) -spiritual-flame-firearms@|灵焰炽铳* -a-weird-bow@|奇奇怪怪的弓* - -bacchanalian-mobs -toxony@|毒术* - -ncm-for-mc@neteasecloudmusic-for-minecraft|NCM播放器 (Ncm for Mc) -lavamelon|熔岩西瓜* -@bananaskin|香蕉皮 (BananaSkin) -worn-tear@|磨痕* -cool-rain-reforged -twilight-forest-cave-fix@|暮色森林洞穴修复* - -create-fluid@|机械动力:流体 (Create: Fluid) -create-fly@|机械动力飞越版* -sbm-wooden-buckets|木桶 ([SBM] Wooden Buckets) -sea-of-chests -flammable-tweaker -changed-armor-and-weapons -abominationsinfection -ly-target-dummy|目标假人 (Target Dummy) -unique-accessories@ -@plants-vs-zombieminecraft-warfare-pvz - -goners-armor-trims - -muffins-slime-golem@ -dontstarve-moss-edition@|不要饿死:Moss版 (Don't Starve: Moss Edition) -jerotes-delight|Jerotes乐事* -stellar-striker|星神之怒* -ptp@ -@the-mad-hatter -magic-bees-kedition -complicated-backpacks@complicatedbackpacks -retro-mario-worlds@ -@guard-villagers-1.21.1 -@mcmassok-guardvillagers-fork -villager-pagoda-house@ -@maid-function-extension|女仆!给我阎魔刀 (Maid Function Extension) -xfoxsword|狐狐圣剑 (XfoxSword) -soul-pact|灵魂契约* - -resolution-controll@resolution-control-plus-plus|分辨率控制++ (ResolutionControl++) -@stackable-shulkers-fix|潜影盒堆叠修复 (Stackable Shulkers Fix) -spectrum-rush@|色谱竞速* -libertys-villagers-revived -blue-skies-tweaks -drpgspawnfix -eat-yourself@ -kaiju-calamity -@hattened -ender-christmas-plus@ender-christmas+ -juniors-open-smash-bats@opensmashbats -choppers-delight@ -delighto-flight|云端之乐 (Delight o' Flight) -xbbs-roaring-knight@|XBB的呼啸骑士 (XBB's Roaring Knight) -suixingxiugai@|随性修改 (Suixing Xiugai) - - -avaritia-tweak|无尽贪婪:魔改 (Avaritia: Tweak) -gregtech-easy-core -polishedlib -minecraftapi -easy-gun-mod@easy-guns -lightroot@ -miscmfrcircuits -dartpatch -polar-bears-frozen-oceans-backport -uptodatemod -concrete-and-marble-mod-2 -kaminari-motor-works -block-highlightfx@block-hightlightfx -better-compass-hud@ -@mendmeter -smallstairs|小楼梯 (Small Stairs)¨small-stairs|小楼梯* -mana-crystals@ -abstract-rpg -more-pylons@ -thermal-parallel@|热力并行* -mcpatcher@ -spindles-tfc -tfc-more-items@ -dynamic-trees-tfc-seeds@ -farmer-enchants@ -tiny-tree - -xnet-zhcn-edition|XNet 汉化版 (XNet-zhCN edition) -mtr-yomi-utility-mod@|Yomi的MTR实用拓展 (MTR Yomi Utility Mod) - -laseas-wilderness-traders|Lasea的荒野商人 (Lasea's Wilderness Traders) - -mtr-moogs-temples-reimagined@ - -perennial-pastries@ -narrativecraft@ -mixinbooter2fermiumbooter@ -moogs-structure-lib@ -chickens-can-cast-fireball -bad-sound@ -heirlooms@ -warborn-capture-points -tacz-x-gunslightsaddon-addon@tacz-x-guns-lights-addon-addon -hunger-tweaks@ -it-takes-a-pillage-continuation@ -swansong@ - -croparium@|矿石种植工艺* -indigestion-tablet@indigestion-tablets|健胃消食片* -me-beam-former@|ME光束 (ME Beam Former) -create-fast-schematiccannon@create-fast-schematic-cannon|机械动力:更快的蓝图加农炮 (Create: Fast Schematic Cannon) - -trail-of-light -abominations-apocalypse -@pams-harvestcraft-2-nerf -pommel-held-item-models@ -echoes-of-battle -thaumic-wonders-unofficial|神秘奇境非官方版* -mystical-expansion -refraction-continuation|折射:延续* -expanded-arcanum -@tpatools|TPA工具集合 (TPATools) -hud-manager@|界面管理器 (HUD Manager) -simple-smithing-overhaul@ -@tinyfish-death-penalty|死亡惩罚 (Death Penalty) -@dine|动态NBT编辑器 (Dynamic In-Game NBT Editor) -@wecuifix -time-control@|时间控制* -embers-text-api@ -stageenchantment|阶段附魔 (StageEnchantment) -@black-sun -the-many-faces-of-enderman - -@eternal-sky-orbs -antiqueatlas-recurrentcomplex-compatability@ -global-shaderpack-properties|全局光影包配置 (Global Shaderpacks Properties) -strawberrylib@ -@ibukigourd -onekeyminer-chainable-visuals@|一键连锁:可视化 (OneKeyMiner Chainable Visuals) -precision-mining@ -better-capes-x@ -botanic-cheater -villagerxp@ -silk-suspicious-sand -trial-liberator@ -nycto@ - - -healing-bed -@cleardrops|清道夫 (ClearDrops) -@craftaudit|方块审计 (CraftAudit) -kiss-mod-unofficial@|Kiss Mod:非官方版* -rawinput@ -loot-beams-retro -am2pga -gtbcs-geomancy-plus - -@modmenu-babric - - -@hiirosakura -universalsummoning|通用召唤 (UniversalSummoning) - -@gambac -cad-editor -@unitweaks -@nyalib - -nei-mystcraft-plugin -jei-mystcraft-plugin -bubblesex -legendary-stages -tesseract-optimizations -@uwufied-beta -@uniwrench -useful-ribbits - - -power-advantage|能量优势* - -create-transmission - - - - -applied-pneumatics@|应用气动* -@bratwurst -neoa-ban|机器码封禁Neo版 (NeoABan) -trashpandas-ascension -@food-needed-to-respawn-at-bed -block-cannon|方块投射炮* -pocket-space-teleporter@|口袋空间传送器* -re-from-the-ground-up -@stacks-are-stacks -vc-vocacraft|乐音奇旅 (VocaCraft) - 审核中¨@vocacraft|乐音奇旅 (VocaCraft) -resource-fish - - - -@immibis-peripherals -horde-beacon|尸潮信标* - -extreme-blocks|极限方块* - -talecraft -new-crimson-revelations -makeae2better@ -@elemental-arrows-stationapi -@nyabags -@past-el-palettes -@blowing-bubbles -mobs-n-growths-origins -roadarchitect-encounters - -@mystcraft-ageless -thaumcraft-return-of-the-ancients@ - - - - -neocontinuity@ -continuity-unofficial-port-1-16@continuity-unofficial-port-1.16 -@safefarmland|耕地保护 (SafeFarmland) -@bone-meal-fern -ae2-cell-upgrade-compat -iris-shader-folder@ -rpcdrive@ - -mixintrace-resmithed@forge-1.20.1-1.0.0 -tetra-musket|火枪锻造* -tudigong-wayfinder|土地公 (TuDiGong) -mob-statues - -charset-cre -legacy-farms -thaumictweaker -covers1624-lib - -one-enough-block@ -@better-chat|更好的聊天框 (Better Chat) - -@renderlimiter|渲染抑制器 (RenderLimiter) -@cornucopia-reborn|丰饶之角:重生 (Cornucopia Reborn) -longwings@ -more-ae2-additions -congrega-mystica -@no-screenshot-message|无屏幕截图消息 (No Screenshot Message) -fast-industrial-platform|快速工业平台* -@rolling-gate-rzf-addition|人哉肥的卷帘门附加包 (Rolling Gate RZF Addition) -tensura-mortal-cultivation|转生:凡人修仙 (Tensura: Mortal Cultivation) -pickup-limits - - -armorycache|军械库 (Armory Cache) -gregtech-storage-drawers@ -@chiseled-mod - -@area_lib -unordinaryextras -awakened-craziness -villager-market-nbt-fix|村民市场 - NBT 修复版 (Villager Market - NBT Fix) -illager-expansions -@tropicraft-stationapi -bbl-shops -@dronebox -@volo-volare -@customanvilrenameable|自定义铁砧改名权 (CustomAnvilRenameable) - - -anvilcraft-extra-power|铁砧工艺:额外电力 (Anvilcraft:Extra Power) -create-prismatic-shine@|机械动力:流光溢彩 (Create: Prismatic Shine) -@dream-stone|梦之石 (Dream Stone) - -enhance|增幅 (Enhance Buffs) -@recipes-of-the-lost|失落配方 (Recipes of the Lost) -@huhobot-mod - -tacz-pack-upgrader@ - - -@ping-view - - -extravagant-delight@ -dodos-mobs -pillager-caravans@ -@worlds-whisper|世界之低语 (World's Whisper) - -create-soul|机械之魂* - - -quality-equipment-reforked -metalmith|铜铁新生* -@convenient-malum|更方便的灵灾 (Convenient Malum) -nautilus-spears-mounts-of-mayhem@|鹦鹉螺&矛 - 群骑纷争 (Nautilus & Spears - Mounts of Mayhem) -telepathic-maid@|电波女仆* -tombmanygraves-2-api -mytown - - -@linverticalslab|竖半砖 (Lin Vertical Slab) - -@pearlchunkloader|珍珠区块加载器 (PearlChunkLoader) -@lv-wings -@foxbox -@more_than_a_foxbox -@fox-plushies -ecliptic-seasons-oh-the-biomes-weve-gone -tacz-1-21-1@tacz-1.21.1 -tacz-special-forces@ -sculpture@|生物雕像* -aps-repowered -citizen-pot|市民锅* -linear-experience@lineaer-experience|线性经验* -@durability-viewer-continuation|耐久指示器:延续 (Durability Viewer Continuation) - -huaji-age-astral-regenesis@|滑稽纪元:轮回星启 (HUAJI Age: Astral Regenesis) -slashblade-fabric-addons@|拔刀剑:重织附属包 (SlashBlade Fabric Addons) - -proof-of-honor@|荣誉的证明 (Proof of Honor) -splendour-ablaze-epoch|棠煌纪元* -spellbooks-attributes-reforged|铁魔法属性:重铸 (Spellbooks Attributes:Reforged) - -snows-bosses-mechasent|Snow的Boss:机械遣使 (Snow's Bosses: Mechasent) -create-crafter-integration -create-schematicchecker@createschematicchecker|机械动力:蓝图校验 (Create: Schematic Checker) - -ae-terminal-view-cell-fix@terminal-view-cell-fix|AE2显示元件槽位修复 (AE Terminal View Cell Fix) -pearload|实体区块加载* -projectez -comfy-cozy-brickery@comfy-cozy-brickery-patch -spear-downport@|矛:向下移植版* -accurate-spears@|‌精准长矛‌* -soundreload -world-mod-cacher -orbital-railgun-by-mishkis|Orbital Railgun - 他人的非官方上传,已失效¨@orbital-railgun - - - -file-director-incremental-mod-downloading -paytheprice@ -@the-silicon-mod|硅 (Silicon) -@nitrogen_rbn|氮 (Nitrogen) - - -extended-itemview-eiv@eiv - - -projecte-teams-sync -sequence-pathways-lotm-mod@lotmmod -yung-structures-addon-for-loot-integrations -backpacks-for-dummies@ -@egafixer|附魔金苹果修复 (Enchant Golden Apple Fixer) -@fixtconstructpickaxe|匠魂挖掘等级修复 (FixTconstructPickaxe) -co-lib -omni-cells|OMNI 存储元件 (OMNI Cells)¨@ae2-omni-cells|OMNI 存储元件 (OMNI Cells) - 审核中 - - -sdm-gamestages-helper -mangos-multiblock-library - - -@a177-added-modified-enchantments|A177增修附魔 (A177 Added Modified Enchantments) -qa-enchants@|Qa 附魔* - -create-golems-galore@ -vmh -ore-stages-reborn@ -journey-map-stages-reborn@journeymapstages-reborn -the-one-prode-stage@ -sdm-mob-stages -passive-skill-tree-stage -sdm-loot-overhaul@ -@area-tools -lightbind|亮度绑定 (LightBind) - -timberreplant@ -hunting-dimension-reforged -better-angel-ring -tcompat-tinkers-construct-addon@tcompat -j-a-c-m-just-another-chisel -acuisine@assorted-cuisine -juniors-troll-tnt@trolltnt -compact-mekanism-machines -compact-mekanism-machines-plus@ -woot-revived@ - -croparium-the-twilight-forest@|矿石种植工艺:暮色森林 (Croparium: the Twilight Forest) -@leafs-crucible-ice-and-fire|Leaf的炼金炉 - 冰与火 (Leafs Crucible - Ice and Fire) - -starcatcher@|捕星者* -thermaloot -rs-insert-export-upgrade@ -void-miners-reforged -sanguine-neural-networks@ -chiseler@ - -@mod-menu-bta -xp-cost -shut-up-realms@ -narrator@narrator-legacy -mc-truststore@ -rlcraft-dregora-srp-arachnida-tweak -broken-heart-undershirt-statistic -stitchedsnow@ -@moderndeco - -create-henry@ -recipe-history-addon-for-jei@jei-recipe-history-addon-1.16.5 -@proto-hivemind-girl|新生心智 (Proto Hivemind Girl) -wooden-tools-are-dumb@ -laserio-uel -hamtastic-hamsters@hamtastic-hamsters! -gateways-to-eternity-more-gateways@ -cursed-earth-returns -not-enough-trials -orbital-railgun-reforged - - - -create-heat|机械热力 (Create: Heat) -@dream-enchantment|梦之咒 (Dream Enchantment) -@eatalways|一直吃 (EatAlways) - -rehurttime@|伤害免疫机制重做 (ReHurtTime) -naraka@ - -minechem-working-with-better-builders-wands -dungeons-mobs-port -obtainable-end@ -slideshowplus@ -classic-and-simple-status-bars-rebuild|经典且简易的状态栏:重制版 (Classic and simple status bars rebuild) -@the-last-crystal-cup -@crwui|新版创建世界界面 (CreateWorldUI) -@whiteout -mining-quakes@ -tpw@wenxingtpw -inspectability-forge@hi-inspectability -@orbital-railgun-sounds -beneathmixins -cutting-delight@ -locate-command-backport -the-copperier-age@ -@veinminer-client - -@vertigo -powercrystalscore -twilightsoul|暮色之魂 (TwilightSoul) - -endfield-industry@|终末地工业* -modclassifier|模组分类器 (ModClassifier) -lightningsuperpeashooter|电能机枪豌豆 (Lightning Super Peashooter) -display-delight-fabric@ - -@life-essential-oil|生命精油 (Life Essential Oil) -st-drive@stdrive -roadweaver@|阡陌交通 (RoadWeaver) -xemos-cluckshroom -@the-past-ages -take-back-the-night@ -winds-of-requiem@ -classjs@ -c3-blocks@ -@allium -create-netherless-ported@ -mechanical-healing-machine@ -@potionenchant|药水附魔 (PotionEnchant) -tongda-way|通达路 (TongDaWay) - -enigmatic-legacy-cursed-ring -elemental-synergies -simple-netherite-horse-armor@ -project-mmo-farmers-delight-compat@project-mmo-farmers-delight -darling-decorations@darling-decorations! -cute-n-sweet@cute-n-sweet! -inspectability@ -@crafttweakeradditions -hunting-dimension-remake -@lootify-(structures) -portable-storage@|随身仓库* -lootstories|遇言典著 (LootStories) -otherworld-core -simple-corpse -botania-mana-fluid -create-ae-generator -create-additional-logistics@|机械动力:物流附加 (Create: Additional Logistics) -issrf-range-fix-irons-spells-n-spellbooks|铁魔法溢出射程修复 (Range Fix - Iron's Spells 'n Spellbooks) -goety-delight@goetydelight|诡厄乐事* -advanced-little-garbage@advanced_little_garbage|高级小垃圾* -@tpa-tp -@miteequilibrium|MITE:宁静 (MITE: Equilibrium) -tetrawhetstone|Tetra磨刀石 (TetraWhetstone) -brain-stealer-dragon-addon|龙之生存:夺脑龙 (Brain Stealer Dragon - Addon) -official-epic-fight-x-parcool@official-epic-x-parcool -jump-efficiency|跳跳效率* -smooth-scrolling-reforged - -one-enough-fluid@ -jerksteve@ - -ydms-mobhealthbar-mod@ydms-mobhealthbar -otherworld-origins -dragon-mounts-patches@ -gregtech-modern-ore-generation-standalone@gtmogs -cape-banners -bftp@blast-from-the-past -compact-crafting-updated -appliedchisel|应用凿子 (AppliedChisel) -item-obliterator-despawn-fix -@borukva-food -dynamic-difficulty-mod -obituary-exchange -from-the-caves@from-the-cave -lumen-alveary-patch -configurable-tooltips -modlistmemory@|模组列表记忆 (Mod List Memory) -macu-lib@ - -better-end-crashed-ships-tweaks@betterend-crashed-ships-tweaks - -no-caves-mod@|无洞穴* -simply-desire-paths -happy-ghasts-boost@ -cbr-addon@|自定义大逃杀扩展 (CBR Addon) -compact-expansion -armor-quick-swap@|盔甲快速切换* - -mixing-and-cutting@mixing_and_cutting!|混合切制 (Mixing and Cutting!) -yumo-isk-stackstackstack|拼好组 (Yumo isk-Stackstackstack) - -flourfood|面食 (Flour Food) - -neo-ae2-toogleable-view-cell@|AE2可切换显示原件-Neo (Neo AE2 Toogleable View Cell) -mtt-more-tetra-tools|更多Tetra工具 (More Tetra Tools) - -compat-delight@ - - -thermal-processing -extramachinery-reforged -botanicalmachinery-reforged -armorplus-reforged - -@better_tooltips -@ironmanarmor -vs-genesis@ -element-endow|元素赋予* -resource-bar-api@ -goety-iron|诡厄铁魔法* -i-feel-bad@|恙 - 疫恙待诊* -@backoff - -mc-mods-creepypasta-in-one@all-creepypasta-in-one -disable-structures@|禁用结构* -windowlogging-renewed -leaderboards -@beacon-dragon-egg|信标龙蛋 (Beacon Dragon Egg) -maid-travel-camera|女仆旅行相机* -nieih@ - -origins-furs-updated@ -@tinkers-gears|匠械 (Tinkers' Gears) - -moreeverything -epic-fight-skill-tree@ -dtk-update@pale-lively-update -goety-tetra-fix|魔力剑聚晶Tetra兼容 (GoetyTetraFix) -otherworld-apotheosis -mana-attributes@ -azalea-growth-control@ -natural-waters@ -health-bars@new-health-bars -enchantment-insights@ -bloomcraft@ -bmc-pale-garden-patcher -@polluted-rain -modernfix-mvus@ -stutterfix-refursbished@stutterfix-refurbished -noisiumforked@ -golems-kill-creepers@golemskillcreepers -no-animal-tempt-delay@ - -pixelshot - -changeling -ancient-scribes -@kamenriderperfectionproject|假面骑士补完计划 (Kamen Rider Perfection Project) -goety-iron-link|法厄通* -superaim - -taczattributeadd@|Tacz 属性添加 (TaczAttributeAdd) -@itemtocoin|以物易币 (ItemToCoin) -pet-rocktm|宠物石 (Pet Rock™) -gunfire-overhaul-echoes-of-the-battlefield -stamina-attributes@ -clanging-howl -limbus-company-mod-lcm - -realistic-bird-behavior@|真实鸟类行为* -wing-kirin|翼麒麟* -mcheli-reforged-mch-r - - - -enigmatic-legacy-plus@enigmaticlegacy+|神秘遗物+ (Enigmatic Legacy+) - - -novacore@ -snowycrescentcore@|雪月核心 (Snowy Crescent Core) -hostile-neural-industrialization@ -clockwork@clockwork_mod -vista@vista_tv -kismet -sea-life@new-sea-life -armored-foes@ -vehicle-upgrade@ -party-creepers -mc-mods-the-heads@all-the-heads -fantastic-wings@ -village-masquerade -new-shroomcraft@shroomcraft -tinker-and-better-combat - -extralib@ -whats-your-build -where-did-i-die@ - -tooltips-txf@ -@allow-disconnect -target-locks|注视锁定 (Target Lock) -fleeing-animals@ -peacegiver|和平方块 (PeaceGiver) -better-books@better-enchantment-tooltips -@chest-on-a-ghast - -general-feedback@|通用意见反馈* -raid-counter@ -modern-startup-qol-reforked -loot-integrations-dungeon-crawl -vanilla-loot-addon-for-loot-integrations -loot-integrations-cataclysm -aquamirae-x-better-combat-compatibility -ice-and-fire-dragons-x-better-combat@ -eternal-currencies -comfortable-campfires@ -embers-floating-islands@ -farmers-cutting-oh-the-biomes-weve-gone -beds-dont-explode -enchantment-library-at-home -turtlearmor -wandering-collector-forge@ - -jaffactory -horses-can-swim@swimming-horses-forge -mob-population-control -blighted-beasts -@the-witchs-broom|魔女的扫帚-Fabric移植版 (Majo's Broom) - -attribute-sculptor|属性雕刻家* -notexturerotations@|无纹理旋转 (NoTextureRotations) -baked-enchants -@priority -combatproperties - -judgement-day -@origins-plus - - - -dynamic-rpg-resource-bars@dynamic-resource-bars -lwjgl3ify-colorful@lwjgl3ify-1.12 -@lib-39|叁玖库 (Lib39) - -@simple-paper-doll|简单的纸娃娃 (Simple Paper Doll) - -@destroying-minecraft - -@trophymod|奖杯模组 (Trophy Mod) -create-brassworks-missions@ -elysian-event -sticky-enchanting-lapis@ -hungry-pouches -antiquities@ - -pams-harvest-the-nether -certain-questing-additions@ -alexs-mobs-capsid-fix|Alex生物衣壳体修复 (Alex's Mobs Capsid Fix) -@parcoolskill|跑酷技能 (ParCoolSkill) -merchantjs@ -fetchjs@ -mc-mods-the-mafuyu@all-the-mafuyu|万象瑞雪 (All the Mafuyu) -goety-end-biomes -structure-spawn-area-fix@|结构生成区域修复* -aloof - -armory-rpg-series@ -moving-light-source -ftb-mighty-ender-chicken-rehatched -cyborg-robot-chicken-returns@ -dragon-wings@dragon-wings-09|龙翅膀* - -furnitures-o-plenty@ -windswept-delights@ -beltborne-lanterns-accessories-layer@ -beltborne-lanterns@ -mesophils-cities@ -mesophils-cities-classic -villagers-reborn@ -@simple-player-logger -mint-lib@ -better-fishtanks@|更好的鱼缸* -@roman-minimap -accelerated-recoiling|加速碰撞* -thank-your-eggs|谢个蛋/鸡谢动力* -star-rail-apocalyptic-shadow|星穹铁道:末日幻影 (Star Rail: Apocalyptic Shadow) -unusual-adventures -gui-scaler@auto-gui-scaler -ae2-id-sorter -@danganronpa|魔女论破 (DespairBook) -maids-return@|女仆归心 (Maid's Return) -boosted-brightness-remastered@ -helpfulcampfires@ -geophilic-backport-vanilla-backport-compact -nexus-layer -zipline@ -fathomless-crimson -@hexconnect -phase-journey -lucky-pot -@enchantment-controller|附魔控制器 (Enchantment Controller) -auroraslanterns@ -pocket-repose@ -fishing-plus@fishing+ -chaoscrafts-devices@ -obsessed@ -arsenal-rpg-series@ -mod-change-log|模组变更记录* -@entity-glow|实体发光 (Entity Glow (Backport)) -sophisticated-sorter@|精妙整理* -abi-forge¨abi-fabric -display-edit -arthys-elemental-engine-aee-forge -bobby-legacy@ -ambience-mini -arthys-ebonite-ae-forge -enigmatic-arcana - -optifine-cit-enchantment-patch@optifine-cit-patch -controller-mod@controllermod|控制器支持 (Controller Support Mod) -new-enchantment-switch@enchantment-switch -ftgu-from-the-ground-up@from-the-ground-up -options-profiles@ -forgematicaprinter@ -better-biome-blend-continued@ -furnace-xp-storage -recased@ - -elemenics|元质学* -pale-bloom -zip-fetcher@ -create-kinetic-illuminator@ -@tagban - -trade-tweaks@|交易优化* - - -bryszirake -no-worldgen-5-you@ -no-worldgen-5-you-continued@ -spiral-tower-villages@ -care-to-share@ -@hamstermod|仓鼠模组 (Hamster Mod) -@statictnt|静态TNT (StaticTNT) -floating-damage-numbers -voice-messages|语音消息* - - -@garden-farming|园林耕作 (Garden Farming) -lets-do-tfc-farm-charm|群峦农艺 ([Let's Do] TFC Farm Charm) -ride-casually@|随意骑乘* - -night-repair@|夜视修复* - - - - - - -originjs|起源JS (OriginJs) - -ancient-nature-a-prehistoric-experience -mte-more-tetra-effects|更多Tetra词条 (More Tetra Effects) -@vertical-bobbing -extraquests@ -crashexploitfixer@|崩溃漏洞修复 (CrashExploitFixer) -sticky-it -you-have-treasure|你有宝! (You Have Treasure!) - 审核中¨@you-have-treasure|你有宝! (You Have Treasure!) -nether-portal-configurator -lavasweeper@|熔岩清道夫 (LavaSweeper) -@more-people -simply-improved-terrain|简单地形改进*¨simply-improved-terrain-fabric|简单地形改进 (Simply Improved Terrain) - -faewulfs-lib@faewulfslib -mce2-lib -bop-legacy-reborn-croparium@|超多生物群系往昔重生 & 矿石种植工艺 (Biomes O' Plenty Legacy Reborn & Croparium) -lotr-reworked-new-beginning@|魔戒:重置 (LOTR Reworked) -kelp-fertilizer@|海带肥料* -crystalwing|水晶之翼 (CrystalWing) -@label-my-items -lightoverlay@ -rcw@ - - -obituary -worn-horseshoes -antiqueatlasautomarker -connectorlib@ -milkable-creepers -@villager-clothes -monsters-girls-witchy-stuff -grimoire-of-gaia-spells|盖亚魔法 (Grimoire of Gaia Spells) -psi-oddities|Psi-奇思妙想* -@schempaste -mining-progress-hud|挖掘进度 HUD (Mining Progress HUD) -creativetabs@creativetabsplus -create-missiles@ - - -nuclear-bomb-bay@ -lightning-rod-backport -complicated-bees@ -werdens-illagers|沃尔顿的刌民 (Werden's Illager +) -thaumic-attempts -horseshoes-forge -replication-matter-overflow-tank -spaceploitation - - -pathfinder-api@ -no-resource-pack-warnings-forge@ -dbc-expansion|DBC扩展 (DBC-Expansion) -cutt-promix@cutt_promix|砧板乐事 (Pro Assistant Cutting Board) -dirty-bowls-delight|脏碗乐事* -corpsetweaker@corpse-tweaker|遗体调整 (CorpseTweaker) -convenient-interface|便捷接口* -brimm-armors-tactical-military-armors -@the-shadow-tapes -starter-bunker -shortbow-revamped -places@ -pets-pillage -ultimine-rewind@|连锁撤回* -project-time-master - -let-me-click-and-send-for-server@ -extra-hoppers@ -quick-pack@ -armored-paws-backport@wolf-armor-backport - - -create-mining-laser -create-who-touched-my-train@|机械动力:谁动了我的列车! (Create: Who Touched My Train!) -@so-lets-set-the-ore-on-fire -tab -armor-tooltip -modefite-item-definition-backport@ -hobbit-hill-village@ -alexs-caves-better-combat@ - -mc-modstheimbaium -storage-drawers-extra-reloaded -startup-qol -modern-startup-qol -domestication-innovation-fixed|驯养革新修复版* -@clear-despawn-reworked -spartancataclysm@ -@metalrender -nirvana-library@ - -animated-mojang-logo@ -hardcoreastagesitem -@morbid-reborn-reborn-reborn - -fullbright-ultimate -fast-pipes@ -immersive-enchanting@|沉浸式附魔* - -boss-checklist@ -fire-resistance-tiers -cursedinfuserbycage|诅咒之笼注入 (CursedInfuserCage) -enchantedsails@ -pale-monarch@pale-monarch-boss-mod -firmanutrition@ -calypsos-night-vision-goggles|卡里普索的夜视仪 (Calypso's Night Vision Goggles) -the-apiarists-terminal -bee-mastery@ -nonupdate-retro@|不再有更新:Retro 版 (NonUpdate-Retro) -custom-message|自定义消息* -kjsutils - -create-access-denied@ -create-better-motors@ -@create-cc-total-logistics -create-fuel-motor@ -create-extra-casing@ -@create-meta-logistics|机械动力:元物流 (Create: Meta Logistics) -bush-master-core -@tritiumconfiguration|氚配置 (TritiumConfiguration) - -@mob-effect-display-fix|状态效果显示修复 (Mob Effect Display Fix) - - -anvilcraft-pigsplus@anvilcraftpigsplus|铁砧工艺:猪+ (AnvilCraft: PigsPlus) - - - -@teas-official-random-things|Eh5の茶会:随意作品 (Teas Official Random Things) - - -@chatscreen|聊天屏幕 (Chat Screen) - - -sunny-riptide-trident@ -@lastwords|鸳鸯董卓 (LastWords) - -@bubble-column-tweaks|气泡柱调整 (Bubble Column Tweaks) - -@villager-inventory-hwyla-plugin -blessfulled -irregular-implements@ -sounds-be-gone@soundsbegone -@copper-grates-bubble -@fireworkdurability -create-colored-chain-conveyor@ -create-dimension-steamworks-realm@create-dimension,-steamworks-realm -punchy@punchy-fpa -@quickswap|快速切换物品栏 (Quick Swap) -@blockdynamics_mod -armor-durability-hud -g3-doors -arcane-convergence|奥法归一* -ae2-ftbquest-detector|AE2-FTB任务检测器 (AE2-Ftbquest-Detector) -better-library@ - -dimensions-of-alexs-caves@|Alex的洞穴:维度 (Dimensions-of-Alex's-Caves) -better-combat-particle@|更好的战斗粒子* -vsplit@|V裂 (VSplit) -taczcurios@|Tacz饰品 (TaczCurios) -jeai@ - - -unofficial-variedcommodities -literal-sky-block-neo -cnpc-cobblemon-integration -cnpc-gecko-addon@cnpc-geckolib-addon -minecards@minecards-forge|我的卡牌* - -construction-wand-kots@|建筑手杖-耕云钓月版 (Construction Wand - KOTS) -thaumcraft-nei-plugin-patched@ -replication-rs2-bridge - -player-attribute-commands@|玩家属性指令* -lumis-lots - -omnisearch@|万象搜索* -ftb-unearthed -@colored-obsidian -collectors-caravan@ - -@itemagnetic - -soul-candles@ -lunchbox-sustenance-project|好好吃饭* -just-some-more-crops|农务多多* -cobblemon-spawn-alerts@|方块宝可梦生成提醒* -hex-text@ -hand-snow-ball|给我一个雪球* -extended-shaders -titles-and-timing@renxi.ch|称号与计时 (Titles and Timing) -biomespy|群系间谍 (BiomeSpy) -random-dungeon-spawners|随机地牢刷怪笼* -versionerreborn|整合包版本工具:重生 (VersionerReborn) -critical-strike@ -ghostblocks@ghostblock|幽灵方块 (GhostBlock) -@crossbow_scoping -create-threaded-trains@ -raing-row@raing_row|雨后生草 (Rain Grow Mod) - -@seafloor_gardening|海底花园 (Seafloor Gardening) -nemos-vertical-slabs@ -electric-advantage|电力优势* -froglightsreimagined@ -flower-pots-plus -diversity-legacy -@sturdy-farmland -bettervannilafishes|更好的原版鱼类 (Better Vannila Fishes) - -ezunclear-reactor-big-explosion-preventer|易研电炸/核抑危 (EzUnclear) - -kubejs-goety -create-stuff-and-addition-tank-fix@ -create-ratatouille-fried-delights|机械动力:齿轮与麦穗的炸物拓展 (Create:Ratatouille Fried Delights) -spellcasters-archives|施法者档案馆 (Spellcaster's Archives) -enders-spells-and-stuff-requiem -ironrust@ -web@webs -letmecc@|让我看看 (Let Me See See) - - - -fancy-trail|梦幻刀光* -caster-curios-bonus|灿奇术饰* -anyblade@|万物皆为刃 (Anything SlashBlade) - - -tongda-railway|通达铁路 (TongDa Railway) -crystcursed-dragon|晶咒龙* -brutal-mobs|狂暴生物* -super-headcrab|超级猎头蟹* - -@simple-locations|简单位置 (Simple Locations) -lios-seafaring-dungeons@ - -inductive-automation -steam-advantage|蒸汽优势* -@better-block-entities - -rs-logical -industrial-revolution-by-redstone-rebooted -the-void-legacy -omoshiroi-kamo -death-taxes@death-and-taxes -@emotional-support-creeper -ly-ender-compass -walking-crops -harken-scythe-resharpened@ - - -resonant-engine -@liquid-xp|液体经验 (Liquid XP) - -xlvs-locks|Xlv 的锁 (Xlv's Locks) -the-legend-of-2900-core - -graphene-extension -dr-stone-kingdom-of-science@dr.-stone-kingdom-of-science -kinetic-pixel-dup-bug-fix -@custom-shutdown|自选关机 (Custom Shutdown) - -formatless|格逝* -invisiblocks-1-2-1|隐形方块 (Invisiblocks) -mage -spore-addon-nightmare|孢子扩展包:噩梦 (Spore Addon: Nightmare) -the-biomass-must-grow|生物质必须生长 (The biomass must grow) -create-nuka-cola@create-nuka -dyson-cube-project|戴森立方计划* - -annoying-villagers-herobrine-invasion@|烦人的村民 (Annoying Villagers: Herobrine Invasion) -@net-music-peripheral|网络音乐机:电脑外设 (Net Music: Peripheral) - -tacz-golem-compat@|傀儡装配-战术人形 (TaCZ Golem Compat) -customizable-player-health@|可自定义的玩家生命值* - -goety-twilight|诡厄暮色* -@achievement-attribute-rewards|成就属性提升 (Attribute Achievement Rewards) - -@easyentitylib -coolcatlib -myths-and-monsters -@chronograph|计时仪 (Chronograph) -cnpc-additions@ -complicated-bees-genetic-industry -squish@ -tameableminisheep@ -tameablemossbloom@ -wolf-armor-and-storage-legacy@ - -@mcedia - -phonk-edit@ -ae2addonlib -infinity-mending-datapack-mod -epic-knights-ores-and-alloys -epic-knights-dark-ages-addon -indestructible-server-fix|坚不可摧服务端修复* -chromosome-lib@ -turtlebois-core-library -simple-voice-chat-group-player-names@svc-group-player-names -cinematic-zoom-neoforge@cinematiczoom -busy-villagers - -ars-affinity -ars-hex-unity -pretty-in-pink@ -chatcalc-neoforge@chatcalc -dust-and-ore@dust-and-ores -matrix-minecraft-bridge - -@entity-chat -jei-copy-recipe-json|JEI随意复制 (JEI Copy Recipe Json) -configured-burn-time@|可配置的燃烧时间 (Configurable Burn Time) -time-controller@ -@improved-snow-melting -ridebattle-lib@ridebattlelib|骑士战争库 (RideBattleLib) - -gamma-tweaks@ - -wandering-trader-express|流浪速递* -stewme|铁锅炖自己 (Stew Me) -kubejs-powah-reborn -inheritable-coat-color@|可继承的绵羊毛色* -pouch-of-unknown-nirvana|未知之袋:涅槃 (Pouch of Unknown: Nirvana) -ae2-auto-pattern-upload@|AE2自动样板上传 (AE2 Auto Pattern Upload) - - -petite-inventory@|真实物品栏 / 娇小物品栏* -cipher-wright -short-players@|矮玩家* -backported-spears@ -ufo-future -copper-age-backport@backport-copper-age -animal-garden-sea-otter@ -animal-garden-porcupine@ -animal-garden-red-panda@ -animal-garden-owl@ -bytebuddies -entity-enchantment|实体附魔* -smoothwater -insanity-assorted-magics -bonded@ -indexer@ -dimensional-worldborder-continuation -dimensional-worldborder -damage-tracker -the-growling-man -mapwright@ - -wandering-ribbit@ -kinetic-minecart@ - -classic-pipes@ - -dust-and-ore-raw-ore-expansion -@minecraft-sigma -@pricks-n-planks -archogenum -giant-drops -kubejs-data-component -quantum-things@ -simple-emotes@ -flux-ducts -valley@valleys - -wizard-tower -the-dyson-sphere-project@dyson-sphere-project|戴森球计划* -bronze-mod@bronze|青铜 (Bronze) -lib39@ -companions-dogfolk@ -the-block-keeps-ticking@ -better-pet-teleporting@|更好的宠物传送* -beacon-aura@ -create-ender-storage -portalfarm-despawn-fix@ -@kitchen-projectiles -eternally-overburdened -robot-dinos -stellar-decay|繁星枯朽* - -acceleratedblade@|拔刀剑:加速渲染兼容 (SlashBlade: AcceleratedRendering) -heartbladeunoffical|心之所向非官方版 (HeartBladeUnOffical) -slashblade-japanese-addon-pack-adder|拔刀剑·日系附属·扩展包 (SJAPA·The SlashBlade EXtra) -project-saligia-reborn|炼金重铸计划·七罪新约* -lostbladereborn|遗忘之刃重生 (LostBladeReborn) -slashblade-shinku-and-blood-katana|炼狱真红之刃 (SlashBlade: Shinku And Blood Katana) -foxbladeextrare|狐月刀改·重生 (FoxBladeExtraRe) -spelunkers-palette@ -@seasons-api|季节 API (Seasons API) -mavity-lib@ -void-lib@ -easy-platform|简易平台* -dont-get-hurt|无伤大雅* - -flight-ring@|飞行戒指* - -autorepairhandler|坚不可摧 (AutoRepairHandler) -wonderous-sea-endlessocean@wonderoussea -@bettertp|更好的传送 (BetterTP) -ftb-echoes -makeup-aesthetics-decor@ -opencomputers-rescaled -entityguardian -deep-dark-dimensional-dungeons -infinite-light@|无限光源* -@list-core -thermal-tweaks-dynamic-temperature-survival -debloat@ -orthocamera-unofficial-neoforge-port@orthocamera-(unofficial-neoforge-port) -crossroads-legacy -@wilder-enderscapes -charcoalplus@ -modern-decor-outdoor@ -shadeless-blocks@ -modern-decor-wooden@ -shadeless-mobs@ -herobrine-old-edition@herobrine-mod-alpha-version -multiplayer-spawners@ -compact-crafting-fork - -custom-machinery-ars-nouveau -peaceful-hunger@ -ftb-ez-crystals - -falling-blocks-anim -immersive-overlays@ -volcano - -nbtstructurelib@ -@enderlib -coalapi@ -homo-http-router@homohttprouter|野兽先辈的HTTP路由器* -fastconfigapi@ -@awakeapi -@anti-offhand -@so-tuff - -moreeventsjs -spudiversity-more-and-more-potato|土豆盛宴-更多的土豆! (Spudiversity - More And More Potato) - -flans-mod-tyrants-and-plebians-edition -connected-caves@ -invasion-code-red-reborn@ -mecha-pillager-boss -@zg-mobs -invincibleconquest -@arknights-races|明日方舟种族 (Arknights origins races) -gulliver-lite@gulliverlite -mojo-redmetal -logistics-bridge|Logistics Bridge - 原版¨logistics-bridge-dmnedition|Logistics Bridge - 修复版 -sourceblock@|源方块 (Source Block) -aec|以太工艺 (AetherCraft) -animal-garden-sugar-glider@ -animal-garden-meerkat@ -just-sit@just-sit! -tameable-endermen -vanilla-shears@vanillashears -logibots -always-eat@ -spice-of-life-valheim-reforged@ -enchantedstorage@|附魔收纳 (EnchantedStorage) -ultimine-addition -immersive-tips@|沉浸式提示* -lightspeedre-launch-optimizations -enhancedgunsounds -@mcsr-ranked -@create-cafe-unofficial|机械动力:咖啡馆 非官方分支 (Create Cafe Unofficial Version) -realm-rpg-treasure-balloons - -@alexs-caves-delight-(-farmers-delight-alexs-caves-add-on) -kitchen-tools@kitchen-tools-tc6-addon|厨师宝具* -camphor@ -jade-magnifying-glass@ -c418-music-restored@ - -crab-claws@ -draconic-evolution-render-patcher@ -touhou-little-maid-epistalove@|车万女仆:纸短情长 (Touhou Little Maid: Epistalove) -omnicore@ -@voxelbridge -tritium@optitritium|氚* -immersive-fixes@|沉浸工程修复* -schematic-energistics@ -boss-rush@boss-rush-mod|老板冲* -mekanism-bigger-teleporters@ -@carpet-igny-addition -registry-blocker@ -more-ornamental-plants@|观赏植物* -presence-footsteps-neoforge|脚步声NeoForge版 (Presence Footsteps (NeoForge)) -@villager-translator|村民语言翻译器 (Villager translator) -ai-player@|AI玩家 (AI Player) -aaron@ -@hextech-lib|海克斯 (Hextech Lib) - -missing-trees@ -pk-craft -easy-craft-tweaker@easy-crafttweaker -wenxins-warp-pipes@ -forgelin-legacy¨@forgelin-legacy|Forgelin: Legacy - 审核中 -anothertips@ - -copper-drops -cooks-collection@ - -no-end|我的末地呢?!* -ome-tweaks@ -clutter-no-more@ -decocraft-nature@deconature -frex@ -open-terrain-generator-continued@ -duplicationless|复演结/コピーの終結* - -custom-mob-targets - -bopintegration-catized@bopic|超多生物群系集成:非官方版 (BOPIntegration - Catifized) -@rawmouseinput - -buildnotes@|建筑笔记 (BuildNotes) - - -hbms-nuclear-tech-modernized@|HBM的核科技现代化 (HBM's Nuclear Tech Modernized) -mtr-france-addon@ -minions-remastered -@applied-enough-items|应用定整 (Applied Enough Items) -milkspray|牛奶喷雾 (Milk Spray) -@road-to-evolution|进化之路 (Road to Evolution) -@totem-of-homing|归家图腾 (Totem of Homing) -better-foliage-legacy-edition@ - - -@adventure-platform-mod -pedestal-crafting -pedestal-crafting-patched@ -putbuildings@|建筑放置 (PutBuildings) -@no-air-mining-penalty|去除浮空挖掘惩罚 (No Air Mining Penalty) - - -reader - -improved-cleanroom-relauncher@ -qbithop - -wilder-flowers@ -render-held-item-while-a-wolf-witchery-addon -economicalmilktea -unnamed-monster@ -half-bite -merry-snow@|瑞雪物语* - -hdd-continuation@ -headdowndisplay@hdd -refined-equivalence - -amtweaker - - -fluidityfoodstuffs -chisel-modern -rmscore@ -magic-coins-tweak -irons-apothic-invaders@ -mekagenjei-mekanism-generator-addon -boatfly|船只飞行 (BoatFly) -ibicf -kube-utils@ -laputan -lecovian -pops@ -bad-ores -reactor-plus - - - -petrock-mod -bettertalk -autocrafter2000 - -baby-mobs-rebrushed@ -animal-garden-mouse@ -better-sleeping|更好的睡眠* -amtgenerators - -extrabees-community|更多蜜蜂:社区版 (ExtraBees: Community Edition) - -better-farming@better-farming-plus -evil-seagull@|邪恶海鸥* -hbm-galacticraft-companion -gamingbarns-guns -jas-compatability-addon - -ad-astra-auto-lander -@createfkcrafter|机械动力:解放合成器 (Create: FuckCrafter) -create-cobblemon-balls-overhaul -create-air-ducts@ -grimoire-of-gaia-redux - -create-wrapped -create-cogs-invaders -notenoughscaffold -ore-trees-reboot -re-barked -composing -antique-armory|匠魂盔甲怀古* -cataclysm-ignis-soulfires -just-dyna-things -metal-detector -replication-addon-tiered - - -savethehorse|哦齁齁齁斯 (SaveTheHorse) -hamsters-delight@|仓鼠乐事 (Hamster's Delight) -the-ultimate-ore-mod -animal-garden-fennec-fox@ -animal-garden-common-raven@ -@nether-portal-remastered -redstone-recharged@recharged -toil-and-trouble@ -basicweapons@|基础武器 (Basic Weapons) - -youkaishomecomingcurios|妖怪们的归家:饰品兼容 (Youkais Home Coming Curios) -drop-force@|掉落力* -sacrifice|祭品/掉落不死亡* - -getoutofmyway|别挡我的路! (GetOutOfMyWay) -stronger-snowballs@ - - -simply-swords-epicfied|简易刀剑 - 史诗战斗 (Epic Fight - Simply Swords EpicFied) -cotton-resources - -talents -rain-rot@ -lothryas-spell-additiions -shershavy@|谢尔沙维* -craycrafting -@rain-world-weaponry -customtitlescreen -unusual-prehistory-2@ -shield-api@ -brick-lib-api@ -whatversioning|申必版本号 (WhatVersioning) -yourender|完了 (YourEnder) -@mana-jade|以玉定植 (Mana Jade) -villagerapi@ -peeping-angels@ -simple-teleporters-reforged@ -structures-tweaker@ -tooltip-overhaul@ - -pre-menu-screen -titlescreennotice -spellboundskiescustom -kind-of-nice-weapon -copperized - -comes-alive-reworked@|凡家物语:重制* -better-animal-feeding@ -tiny-dragons@ -@eternal_winter_mirage|永冬幻境 (Eternal Winter Mirage) -tightfire@ -wax-item-frames@ -obese-crops@ -@frame-changer - - - -tfcgurman@tfc_gurman -fungi-delight@ -leaves-youll-go -yagens-attributes|Yagen的属性 (Yagen's Attributes) -terrarium-world@terrarium-earth -daylightchangerstruggle@ - -@eclipses-tweakeroo-additions -utamis-futon@ -@not-enough-furniture -ceruleans-mystical-smithery -mutated-mobs-mod -ftbxaerocompat -aesthetic-windows -bagels-palette-blocks -astrochem@ -dynamic-portals -heralds-ii@ -industrialized-architecture -better-starting-armors@ -@slashblade-frostbite-snowbloom|拔刀剑:雪蚀绽霜 (SlashBlade: Frostbite Snowbloom) -raspberry-core@ -advancedcamera-by-lostmortal -classic-peripherals@classicperipherals -sbm-punt-animal -sbm-baggable-mobs -sbm-helm-bucket -animal-garden-spotted-hyena@ -animal-garden-western-gorilla@ -more-concrete@ -lukis-strongholds -lukis-woodland-mansions -thaumic-model -gtse -ancore@ -xdonplugins - - -expanded-storage-kots|扩展存储 - 耕云钓月版 (Expanded Storage - KOTS) -ragdolls@ -mar-mars-enhanced-ore-variety@ -superflat-progression@ -@tinkers-origin|始源匠心 (Tinker's Origin) -renxin-music-player@|荏心音乐机* -slotify -textile@textile-lib -clash -morebatsvariants -hxcperipherals -yori3os-grappling-hooks@ -seasonal-decorations@|🎄 季节性装饰 (🎄 Seasonal Decorations) -neon-sentry-keeper - -maid-please-help-me-forge|女仆,请帮我打铁* - - -chemcraft-more-backpacks|更多林业背包 (More Backpacks) -e-flux -thaumcraft-extras|神秘扩展* - -peacefulpack -sulfur-and-nitre -combat-evolution -shaderfixerragecraftver -brokenentity-0 -the-cardboard-box-extension -kubejs-cc@kubejs+cc-tweaked -sbm-elevators -sbm-cacti-bucket -sbm-grappling-hook -sbm-hand-held-piston -petting@ -datapatched@ -no-villages -hbms-nuclear-tech-leafias-cursed-edition -cell-chemistry -ae2-all-encompassing@|AE2:包罗万象 (AE2: All Encompassing) -tiptool -burrowers@ -skyislands -fastflyblockbreaking-reworked -aether-ruined-portals - -@more-backpack-upgrades|更多背包升级 (More Backpack Upgrades) -@daedalus-enchantments|代达罗斯附魔 (DaedalusEnchantments) - -better-lock-on@|史诗战斗 - 更好的锁定 (Epic Fight - Better Lock On) -nightfall-invade|史诗战斗:夜幕入侵 (NightFall : Invade) - -copper-friend-backport|铜器时代的小家伙* -slab-topographic|自然台阶 (slab topographic) -tag-editor|贴标签* - -omnitool@omnitools|全能工具 (OmniTools) - - -@syncmatica-revolution|共享原理图增强 (Syncmatica Revolution) -quantumhue-visualizer|量子色域 视界 (QuantumHue Visualizer) -@thip_expansion|特摄英雄补完计划-附属 -sbw-drr|[SBW]龙之崛起:重铸 (DragonRise: Reforge) -nine-nether-regions@|九幽引 (Nine-nether Regions) -handheld-moon@|掌中明月* -carpenters-blocks-ce|木匠方块-社区版 (Carpenter's Blocks-CE) - -@yos-coins -ae-infinity-disk@|AE无限磁盘 (AE Infinity Disk) -survivalplus-primer¨survivalplus-primer-fabric -northstar-redux@|机械动力:北极星 - 重制版 (Create: Northstar - Redux) -create-igneodynamics@ -create-numismatics-utils@ -create-vintage-unofficial-port@create-vintage-(unofficial-port) -create-bits-n-bobs -ccb-tweaks@ccbt -gregtechceu-modern-extra-unofficial@gtceu_extra -geotetraarmor -more-more-tooltips -more-tooltips -elemental-creepers-redux -mc-modsthecreepers -wikiful@ -atlatls@ -@itemaccessrestrictor|物品存取限制器 (Item Access Restrictor) - - -ahh-pvp@ -toggle-sneak-sprint -monstie-hunter-baby-monster-collector@monstie-hunter-baby-monster-collector! -enchants -hubris -custom-nether-portals@custom-nether-portal -damagenumberlegacy -helios-divinity -item-marks|物品标记* -mossylib@ - - -@better-trading-menu|更好的交易菜单 (Better Trading Menu) -easy-npc-config-ui@ -evolved-mekanism-extras - -backups -inventory-particles@|物品栏粒子* -backport-recipes@ -primal-survival@ -electrical-age-eln@electrical-age-jrddunbr-edition -@showfps|显示FPS (ShowFPS) -magia-daemonica -death-n-taxes - -super-factory-manager-unofficial-backport-sfm-ub -cart-complete -veilings - -narutoloading -visual-keymap@|可视化键位图* - - -grindstoneplus|更好的砂轮 (GrindstonePlus) -anvilcraft-transducers|铁砧工艺:并入电网 (AnvilCraft Transducers) -confluence-weapon-modification@confluence_weaponmodification|汇流来世:武器修改 (Confluence: Weapon Modification) -some-useless-things|无用之物* -hmag-spells|藏妻术式 (HMaG Spells) -tsb-tetra-spell-book|Tetra法术书 (Tetra Spell Book) - -gilded-krmor - -traces-of-the-fallen -lycanite-mobs-additions -revmobs -kaleidoscope-cookery-refabricated@|森罗物语厨房:重织* -timelesslib@ -norfrieds-eldritch-takeover -deliverymanconfig|殖民地现代化更新 (Minecolonies Modernization Update) -setcraftjs|套装效果 (SetCraftJS) -xymultichat|聊天分栏 (XYMultiChat) -mc-mods-of-slashblades - -texture-locale-redirector@ -eidolon-edoni@|幻梦:欢宴 (Eidolon : Edoni) -mekanism-morecapacity@mekanismmorecapacity -modular-machinery-cryogenic-simulation-edition -sbm-wooden-rails -project-fruit|水果地形* - -tlm-native-power|车万女仆:原生的力量 (TLM: Native POWER) -hogcraft -awesome-sheep-swell@ -@casks|桶 (Casks) -luxurious-misfortunes -transparent-entities@ -paintings-n-discs-backport -fallen-elves -@pv-addon-flashback - -ae2fluidcraft-rework-unofficial|AE2流体合成套件重置非官方版 (AE2 Fluid Craft Rework Unofficial) -annihilation-recreated -simple-kelpies@ -tacz-turrets@ - - -health-scoring -supearlposition -daisy@ -no-fall-mod -@farmers-assortment -foggy-world - -thieves -witt -techrot@ -create-easyfilling@ -mortar-and-pastels@mortar -@delicate_little_garbage|精致小垃圾 (Delicate Little Garbage) -elemental-arsenal|属性锻造 (Elemental Arsenal / ElementalCraft) - -kubejs-recipes-create|kubejs配方生成* - -showercore|洗浴核心 (Shower Core) -playsound-pro|音频播放专业版*¨@playsound_pro|音频播放专业版 (Playsound Pro) - 审核中 -omnisprint@|四向疾跑 (OmniSprint) -@totem-of-luck|幸运图腾 (Totem of Luck) -infinite-provider@|无限供应器* -annuus@ -myosotis@ - - - - - - - -magistics -littlefix -@legacyvoicechat -fast-recipe-search|快速配方查找* - -speech-recognition -faster-block-placement@|更快的方块放置* -instantsleep -chunk-save-fix@|区块保存修复* -peacefulsurface¨peacefulsurface-fabric -mazons-quarks -lucisrenderlib@|光 渲染库 (LucisRenderLib) -no-ai-guess@|禁止 AI 胡扯 (No AI Guess) -itemnamecopier|复制物品名称 (ItemNameCopier) -ping-like-r2 -super-bosses@ -slashblade-patchouli@ -ender-dragon-suit -ecliptic-seasons-lets-do -lets-do-hearth-timber@ -immersive-vehicles-vdeco@vdeco -netherized-kedition -wizardry-and-fire -pepsied-item-name-recolorer -pepsied-auto-droppers -pepsied-copper-item-pipes -pepsied-exp-vacuum -pepsied-pocket-dimension -pepsied-mining-quarries -sbm-red-cow -fangs-textiles-and-trinkets - - - -saurialib -riftlibrary@ -clean-portals-randomportals-cleanroom-edition -spinning-items-displayer-mod -attack-range-attribute@ -kryptonfnp-patcher@ -riautomobility -cyberware-reforged -project-plastic - - - -me-placement-tool|ME成型工具¨@me-placement-tool|ME成型工具 - 审核中 -pepsied-slow-hopper -nocubes-food-desire -@dense-flowers -prehistoric-rift@ - - -more-slashblade-ex-enchantment-effects|超多附魔增效 (More SlashBlade Ex Enchantment Effects) -tinkers-emc|匠魂EMC (Tinker's EMC) -@tacz-advanced-deathinfo -summon-totem|召唤图腾* - - -christmas-music-discs@ -friends-for-life@ - -wool-pressure-plates@ -protect-mobs-from-daylight@ -pepsied-more-professions -pepsied-chaos-core -pepsied-auto-bridger -custom-sapling|自定义树苗* - -patternprovidersave@|样板供应器保存 (PatternProviderSave) -create-lazytick|机械动力:懒惰刻 (Create:LazyTick) - 注意号¨@createlazytick|机械动力:懒惰刻 (Create:LazyTick) \ No newline at end of file diff --git a/Plain Craft Launcher 2/Resources/lwjgl-unsafe-agent.jar b/Plain Craft Launcher 2/Resources/lwjgl-unsafe-agent.jar new file mode 100644 index 0000000..0552f13 Binary files /dev/null and b/Plain Craft Launcher 2/Resources/lwjgl-unsafe-agent.jar differ diff --git a/Plain Craft Launcher 2/Resources/moddata.zip b/Plain Craft Launcher 2/Resources/moddata.zip new file mode 100644 index 0000000..851cdd0 Binary files /dev/null and b/Plain Craft Launcher 2/Resources/moddata.zip differ diff --git a/README.md b/README.md index 8b989a8..9ea9c2c 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Stars](https://img.shields.io/github/stars/Meloong-Git/PCL?style=flat&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTggLjI1YS43NS43NSAwIDAgMSAuNjczLjQxOGwxLjg4MiAzLjgxNSA0LjIxLjYxMmEuNzUuNzUgMCAwIDEgLjQxNiAxLjI3OWwtMy4wNDYgMi45Ny43MTkgNC4xOTJhLjc1MS43NTEgMCAwIDEtMS4wODguNzkxTDggMTIuMzQ3bC0zLjc2NiAxLjk4YS43NS43NSAwIDAgMS0xLjA4OC0uNzlsLjcyLTQuMTk0TC44MTggNi4zNzRhLjc1Ljc1IDAgMCAxIC40MTYtMS4yOGw0LjIxLS42MTFMNy4zMjcuNjY4QS43NS43NSAwIDAgMSA4IC4yNVoiIGZpbGw9IiNlYWM1NGYiLz48L3N2Zz4=&logoSize=auto&label=Stars&labelColor=444444&color=eac54f)](https://github.com/Meloong-Git/PCL/) [![Issues](https://img.shields.io/github/issues/Meloong-Git/PCL?style=flat&label=Issues&labelColor=444444&color=1F883D)](https://github.com/Meloong-Git/PCL/issues) [![哔哩哔哩](https://img.shields.io/badge/动态-BiliBili-00A4DB?style=flat&labelColor=444444&logoSize=auto)](https://space.bilibili.com/11343203/dynamic) -[![爱发电](https://img.shields.io/badge/赞助-爱发电-946ce6?style=flat&labelColor=444444&logoSize=auto)](https://afdian.com/@LTCat) +[![爱发电](https://img.shields.io/badge/赞助-爱发电-946ce6?style=flat&labelColor=444444&logoSize=auto)](https://meloong.com/afd/a/LTCat) 包含 PCL 的大部分源代码,包括 UI 库、动画模块、下载模块、Minecraft 启动模块等!
代码并不是实时更新的,它会在每次 PCL 发布更新时同步一次。
@@ -12,6 +12,6 @@
### 相关资源 -- [PCL 下载](https://afdian.com/p/0164034c016c11ebafcb52540025c377):下载可免费使用的正式版 PCL! +- [PCL 下载](https://meloong.com/afd/p/0164034c016c11ebafcb52540025c377):下载可免费使用的正式版 PCL! - [PCL 功能投票](https://github.com/Meloong-Git/PCL/discussions/2):来参加投票吧,开发者会优先处理票数较高的项目! - [帮助文档库](https://github.com/LTCatt/PCL2Help):PCL 内置帮助文档的存储库 diff --git a/最新正式版.zip b/最新正式版.zip index 88010a4..ef5c095 100644 Binary files a/最新正式版.zip and b/最新正式版.zip differ