This commit is contained in:
龙腾猫跃
2026-07-02 23:24:29 +08:00
parent 124e3be6bf
commit c6d0457946
193 changed files with 3112 additions and 3747 deletions
@@ -1,4 +1,4 @@
Public Class PageSetupLaunch
Public Class PageSetupLaunch
Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
'重复加载部分
@@ -6,15 +6,16 @@
RefreshRam(False)
BtnSwitch.Visibility = If(McInstanceSelected Is Nothing, Visibility.Collapsed, Visibility.Visible)
'Java 可能在版本设置被修改,所以总是重新加载(反正其他的 Refresh 也不太吃性能)
AniControlEnabled += 1
Refresh()
AniControlEnabled -= 1
'非重复加载部分
Static Reloaded As Boolean = False
If Reloaded Then Return
Reloaded = True
AniControlEnabled += 1
Refresh()
AniControlEnabled -= 1
'内存自动刷新
Dim timer As New Threading.DispatcherTimer With {.Interval = New TimeSpan(0, 0, 0, 1)}
AddHandler timer.Tick, AddressOf RefreshRam
@@ -25,7 +26,7 @@
SettingService.RefreshSettings(Me)
UpdateSkinType()
UpdateRamType()
UpdateJavaComboBox()
UpdateJavaList()
Catch ex As NullReferenceException
Logger.Error(ex, "启动设置项存在异常,已被自动重置", LogBehavior.Alert)
Reset()
@@ -37,9 +38,9 @@
Try
SettingService.ResetSettings(Me)
Settings.Set("LaunchArgumentIndieV2", Settings.GetDefault("LaunchArgumentIndieV2"))
Settings.Reset("LaunchArgumentJavaAll")
Settings.Reset("LaunchArgumentJavaSelect")
JavaSearchLoader.Start(IsForceRestart:=True)
Configs.JavaList.Reset()
Configs.JavaRemovedList.Reset()
JavaListRefreshWorker.Start()
Hint("已初始化启动设置!", HintType.Green)
Catch ex As Exception
Logger.Error(ex, "初始化启动设置失败", LogBehavior.Alert)
@@ -57,7 +58,7 @@
Private Sub RadioSkinType3_Check(sender As Object, e As RouteEventArgs) Handles RadioSkinType4.PreviewCheck
If Not (AniControlEnabled = 0 AndAlso e.RaiseByMouse) Then Return
'已有图片则不再选择
If FileUtils.Exists(PathAppdata & "CustomSkin.png") Then Return
If FileUtils.Exists(Paths.AppDataThenName & "CustomSkin.png") Then Return
'没有图片则要求选择
Dim SkinInfo As McSkinInfo = McSkinSelect()
If Not SkinInfo.IsVaild Then
@@ -71,17 +72,17 @@
Private Function ChangeSkin(SkinInfo As McSkinInfo) As Boolean
Try
'复制文件
FileUtils.Copy(SkinInfo.LocalFile, PathAppdata & "CustomSkin.png")
FileUtils.Copy(SkinInfo.LocalFile, Paths.AppDataThenName & "CustomSkin.png")
'将单层皮肤扩展到双层
Dim Bitmap As New MyBitmap(PathAppdata & "CustomSkin.png")
Dim Bitmap As New MyBitmap(Paths.AppDataThenName & "CustomSkin.png")
If Bitmap.Pic.Width = 64 AndAlso Bitmap.Pic.Height = 32 Then
Dim Img As System.Drawing.Image = Bitmap
Dim NewBitmap As New System.Drawing.Bitmap(64, 64)
Using g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(NewBitmap)
g.DrawImageUnscaled(Img, New System.Drawing.Point(0, 0))
End Using
FileUtils.Delete(PathAppdata & "CustomSkin.png")
NewBitmap.Save(PathAppdata & "CustomSkin.png")
FileUtils.Delete(Paths.AppDataThenName & "CustomSkin.png")
NewBitmap.Save(Paths.AppDataThenName & "CustomSkin.png")
End If
'更新设置
Settings.Set("LaunchSkinSlim", SkinInfo.IsSlim)
@@ -96,7 +97,7 @@
End Function
Private Sub BtnSkinDelete_Click(sender As Object, e As EventArgs) Handles BtnSkinDelete.Click
Try
FileUtils.Delete(PathAppdata & "CustomSkin.png")
FileUtils.Delete(Paths.AppDataThenName & "CustomSkin.png")
RadioSkinType0.SetChecked(True, True)
Hint("离线皮肤已清空!", HintType.Green)
Catch ex As Exception
@@ -164,7 +165,6 @@
If(RamGame <> RamGameActual, " (可用 " & If(RamGameActual = Math.Floor(RamGameActual), RamGameActual & ".0", RamGameActual) & " GB)", "")
LabRamUsed.Text = If(RamUsed = Math.Floor(RamUsed), RamUsed & ".0", RamUsed) & " GB"
LabRamTotal.Text = " / " & If(RamTotal = Math.Floor(RamTotal), RamTotal & ".0", RamTotal) & " GB"
LabRamWarn.Visibility = If(RamGame = 1 AndAlso Not JavaIs64Bit() AndAlso Not Is32BitSystem AndAlso JavaList.Any, Visibility.Visible, Visibility.Collapsed)
If ShowAnim Then
'宽度动画
AniStart({
@@ -270,7 +270,7 @@
''' <summary>
''' 获取当前设置的 RAM 值。单位为 GB。
''' </summary>
Public Shared Function GetRam(Instance As McInstance, UseVersionJavaSetup As Boolean, Optional Is32BitJava As Boolean? = Nothing) As Double
Public Shared Function GetRam(Instance As McInstance, UseVersionJavaSetup As Boolean) As Double
'------------------------------------------
' 修改下方代码时需要一并修改 PageInstanceSetup
@@ -344,119 +344,97 @@ PreFin:
RamGive = (Value - 33) * 2 + 16
End If
End If
'若使用 32 位 Java,则限制为 1G
If If(Is32BitJava, Not JavaIs64Bit(If(UseVersionJavaSetup, Instance, Nothing))) Then RamGive = Math.Min(1, RamGive)
Return RamGive
End Function
#End Region
#Region "Java 选择"
'注意:修改此处代码时需要同时修改 PageInstanceSetup.xaml.vb
'刷新 Java 下拉框显示
Public Sub UpdateJavaComboBox()
If ComboArgumentJava Is Nothing Then Return
'初始化列表
ComboArgumentJava.Items.Clear()
ComboArgumentJava.Items.Add(New MyComboBoxItem With {.Content = "自动选择(推荐)", .Tag = "自动选择"})
Public Sub UpdateJavaList()
If ComboAdvanceJava Is Nothing OrElse LabAdvanceJava Is Nothing OrElse Not ComboAdvanceJava.IsLoaded Then Return
ComboAdvanceJava.Items.Clear()
'还需要等待搜索结束
If JavaListRefreshWorker.Running Then
BtnAdvanceJavaSearch.IsEnabled = False
ComboAdvanceJava.IsEnabled = False
LabAdvanceJava.Text = "搜索中 …"
Return
End If
'========================================== 显示结果 ==========================================
BtnAdvanceJavaSearch.IsEnabled = True
ComboAdvanceJava.IsEnabled = True
'更新下拉框文本
Dim Count = Configs.JavaList.Get().Count
LabAdvanceJava.Text = If(Count > 0, $"共有 {Count} 个 Java …", "未找到 Java,点击以导入已有的 Java")
'更新列表
Dim SelectedItem As MyComboBoxItem = Nothing
Dim SelectedBySetup As String = Settings.Get(Of String)("LaunchArgumentJavaSelect")
Try
For Each Java In JavaList.ToList().OrderByDescending(Function(v) v.MajorVersion)
Dim ListItem = New MyComboBoxItem With {.Content = Java.ToString, .ToolTip = Java.PathFolder, .Tag = Java}
ToolTipService.SetHorizontalOffset(ListItem, 400)
ComboArgumentJava.Items.Add(ListItem)
'判断人为选中
If SelectedBySetup = "" Then Continue For
If JavaEntry.FromJson(GetJson(SelectedBySetup)).PathFolder = Java.PathFolder Then SelectedItem = ListItem
Dim JavaEntries = Configs.JavaList.Get()
For i = 0 To JavaEntries.Count - 1
Dim JavaEntry = JavaEntries(i)
Dim JavaItem As New MyListItem With {
.FontSize = 13, .Height = 24, .IsScaleAnimationEnabled = False, .Type = MyListItem.CheckType.Clickable,
.Tag = JavaEntry, .Title = JavaEntry.ToString}
AddHandler JavaItem.MouseLeftButtonUp, Sub(sender As Object, e As MouseButtonEventArgs) e.Handled = True
AddHandler JavaItem.Click, Sub() Hint("点击选项右侧的箭头可以进行排序,以控制 PCL 优先选择哪个 Java!")
ComboAdvanceJava.Items.Add(JavaItem)
Dim Buttons As New List(Of MyIconButton)
'向上移动按钮
Dim UpButton As New MyIconButton With {.Logo = Logo.IconButtonArrowUp, .LogoScale = 0.95, .Height = 24, .Width = 24}
UpButton.IsEnabled = i > 0
UpButton.ToolTip = "提高优先级"
ToolTipService.SetShowOnDisabled(UpButton, True)
AddHandler UpButton.Click, Sub() MoveJavaInList(JavaEntry, -1)
Buttons.Add(UpButton)
'向下移动按钮
Dim DownButton As New MyIconButton With {.Logo = Logo.IconButtonArrowDown, .LogoScale = 0.95, .Height = 24, .Width = 24}
DownButton.IsEnabled = i < JavaEntries.Count - 1
DownButton.ToolTip = "降低优先级"
ToolTipService.SetShowOnDisabled(DownButton, True)
AddHandler DownButton.Click, Sub() MoveJavaInList(JavaEntry, 1)
Buttons.Add(DownButton)
'从列表中移除按钮
Dim IsOfficial As Boolean = JavaEntry.Folder.StartsWithF($"{Paths.AppData}.minecraft\runtime\")
Dim DeleteButton As New MyIconButton With {.Logo = Logo.IconButtonStop, .Height = 24, .Width = 24}
DeleteButton.IsEnabled = Not IsOfficial
DeleteButton.ToolTip = If(DeleteButton.IsEnabled, "从列表中移除", "无法移除官方 Java")
AddHandler DeleteButton.Click, Sub() ManuallyRemoveJava(JavaEntry)
ToolTipService.SetShowOnDisabled(DeleteButton, True)
Buttons.Add(DeleteButton)
'打开文件夹按钮
Dim OpenButton As New MyIconButton With {.Logo = Logo.IconButtonOpen, .LogoScale = 1.1, .Height = 24, .Width = 24}
OpenButton.ToolTip = "打开文件夹"
AddHandler OpenButton.Click, Sub() OpenExplorer(JavaEntry.JavaExePath)
Buttons.Add(OpenButton)
JavaItem.Buttons = Buttons
Next
Dim ImportItem As New MyListItem With {
.FontSize = 13, .Height = 24, .IsScaleAnimationEnabled = False, .Title = "导入电脑中已有的 Java…", .Type = MyListItem.CheckType.Clickable}
AddHandler ImportItem.MouseLeftButtonUp,
Sub(sender As Object, e As MouseButtonEventArgs)
e.Handled = True
ManuallyImportJava()
End Sub
ComboAdvanceJava.Items.Add(ImportItem)
Catch ex As Exception
Settings.Set("LaunchArgumentJavaSelect", "")
Logger.Error(ex, "更新设置 Java 下拉框失败")
End Try
'更新选择项
If SelectedItem Is Nothing AndAlso JavaList.Any Then SelectedItem = ComboArgumentJava.Items(0) '选中 “自动选择”
ComboArgumentJava.SelectedItem = SelectedItem
'结束处理
If SelectedItem Is Nothing Then
ComboArgumentJava.Items.Clear()
ComboArgumentJava.Items.Add(New ComboBoxItem With {.Content = "未找到可用的 Java", .IsSelected = True})
End If
RefreshRam(True)
End Sub
'阻止在特定情况下展开下拉框
Private Sub ComboArgumentJava_DropDownOpened(sender As Object, e As EventArgs) Handles ComboArgumentJava.DropDownOpened
If ComboArgumentJava.SelectedItem Is Nothing OrElse ComboArgumentJava.Items(0).Content = "未找到可用的 Java" OrElse ComboArgumentJava.Items(0).Content = "加载中……" Then
ComboArgumentJava.IsDropDownOpen = False
End If
End Sub
'下拉框选择更改
Private Sub JavaSelectionUpdate() Handles ComboArgumentJava.SelectionChanged
If AniControlEnabled <> 0 Then Return
'Java 不可用时也不清空,会导致刷新时找不到对象
If ComboArgumentJava.SelectedItem Is Nothing OrElse ComboArgumentJava.SelectedItem.Tag Is Nothing Then Return
'设置新的 Java
Dim SelectedJava = ComboArgumentJava.SelectedItem.Tag
If "自动选择".Equals(SelectedJava) Then
'选择 “自动”
Settings.Set("LaunchArgumentJavaSelect", "")
Logger.Info("修改 Java 选择设置:自动选择")
Else
'选择指定项
Settings.Set("LaunchArgumentJavaSelect", CType(SelectedJava.ToJson(), JObject).ToString(Newtonsoft.Json.Formatting.None))
Logger.Info($"修改 Java 选择设置:{SelectedJava}")
End If
RefreshRam(True)
End Sub
'手动选择
Private Sub BtnArgumentJavaSelect_Click(sender As Object, e As EventArgs) Handles BtnArgumentJavaSelect.Click
If JavaSearchLoader.State = LoadState.Loading Then
Hint("正在搜索 Java,请稍候!", HintType.Red)
Return
End If
'选择 Java
Dim JavaSelected As String = Dialogs.SelectFile("选择 bin 文件夹中的 javaw.exe 文件", False, filter:={({"exe"}, "javaw.exe")}).FirstOrDefault()
If String.IsNullOrEmpty(JavaSelected) Then Return
JavaSelected = PathUtils.AddSlashSuffix(PathUtils.RemoveLastPart(JavaSelected))
Try
'验证 Java 可用
Dim NewEntry As New JavaEntry(JavaSelected, True)
NewEntry.Check()
'加入列表
Dim JavaNewList As New JArray From {NewEntry.ToJson}
For Each JsonEntry In GetJson(Settings.Get(Of String)("LaunchArgumentJavaAll"))
Dim Entry = JavaEntry.FromJson(JsonEntry)
If Entry.PathFolder = NewEntry.PathFolder Then Continue For
JavaNewList.Add(JsonEntry)
Next
Settings.Set("LaunchArgumentJavaAll", JavaNewList.ToString(Newtonsoft.Json.Formatting.None))
'重新加载列表
JavaSearchLoader.Start(IsForceRestart:=True)
Hint("已将该 Java 加入 Java 列表!", HintType.Green)
Catch ex As Exception
Logger.Error(ex, "该 Java 存在异常,无法使用", LogBehavior.Alert)
Return
Logger.Error(ex, "更新 Java 列表下拉框失败")
End Try
End Sub
'自动查找
Private Sub BtnArgumentJavaSearch_Click(sender As Object, e As EventArgs) Handles BtnArgumentJavaSearch.Click
If JavaSearchLoader.State = LoadState.Loading Then
Hint("正在搜索 Java,请稍候!", HintType.Red)
Return
End If
RunInThread(
Sub()
Hint("正在搜索 Java!")
JavaSearchLoader.WaitForExit(IsForceRestart:=True)
If Not JavaList.Any() Then
Hint("未找到可用的 Java!", HintType.Red)
Else
Hint("已找到 " & JavaList.Count & " 个 Java,请检查下拉框查看列表!", HintType.Green)
End If
Private Sub MoveJavaInList(JavaEntry As Java, Offset As Integer)
Configs.JavaList.Edit(
Sub(ByRef List)
Dim Index = List.IndexOf(JavaEntry)
Dim NewIndex = Index + Offset
If Index < 0 OrElse NewIndex < 0 OrElse NewIndex >= List.Count Then Return
List.RemoveAt(Index)
List.Insert(NewIndex, JavaEntry)
End Sub)
UpdateJavaLists()
End Sub
Private Sub BtnAdvanceJavaSearch_Click() Handles BtnAdvanceJavaSearch.Click
ManuallySearchJava()
End Sub
#End Region
@@ -476,7 +454,7 @@ PreFin:
If ComboArgumentVisibie.SelectedIndex = 0 Then
If MyMsgBox("若在游戏启动后立即关闭启动器,崩溃检测、更改游戏标题等功能将失效。" & vbCrLf &
"如果想保留这些功能,可以选择让启动器在游戏启动后隐藏,游戏退出后自动关闭。", "提醒", "继续", "取消") = 2 Then
ComboArgumentVisibie.SelectedItem = e.RemovedItems(0)
If e.RemovedItems.Count > 0 Then ComboArgumentVisibie.SelectedItem = e.RemovedItems(0)
End If
End If
End Sub
@@ -487,7 +465,7 @@ PreFin:
If Not CheckArgumentRam.Checked Then Return
If MyMsgBox("内存优化会显著延长启动耗时,建议仅在内存不足时开启。" & vbCrLf &
"如果你在使用机械硬盘,这还可能导致一小段时间的严重卡顿。" &
If(SystemUtils.HasAdminRole(), "", $"{vbCrLf}{vbCrLf}每次启动游戏,PCL 都需要申请管理员权限以进行内存优化。{vbCrLf}若想自动授予权限,可以右键 PCL,打开 属性 → 兼容性 → 以管理员身份运行此程序。"),
If(WindowsUtils.HasAdminRole(), "", $"{vbCrLf}{vbCrLf}每次启动游戏,PCL 都需要申请管理员权限以进行内存优化。{vbCrLf}若想自动授予权限,可以右键 PCL,打开 属性 → 兼容性 → 以管理员身份运行此程序。"),
"提醒", "确定", "取消") = 2 Then
CheckArgumentRam.Checked = False
End If