PageSetupLaunch.xaml.vb 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. Public Class PageSetupLaunch
  2. Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
  3. '重复加载部分
  4. PanBack.ScrollToHome()
  5. RefreshRam(False)
  6. BtnSwitch.Visibility = If(McInstanceSelected Is Nothing, Visibility.Collapsed, Visibility.Visible)
  7. '非重复加载部分
  8. Static Reloaded As Boolean = False
  9. If Reloaded Then Return
  10. Reloaded = True
  11. AniControlEnabled += 1
  12. Refresh()
  13. AniControlEnabled -= 1
  14. '内存自动刷新
  15. Dim timer As New Threading.DispatcherTimer With {.Interval = New TimeSpan(0, 0, 0, 1)}
  16. AddHandler timer.Tick, AddressOf RefreshRam
  17. timer.Start()
  18. End Sub
  19. Public Sub Refresh()
  20. Try
  21. SettingService.RefreshSettings(Me)
  22. UpdateSkinType()
  23. UpdateRamType()
  24. UpdateJavaComboBox()
  25. Catch ex As NullReferenceException
  26. Logger.Error(ex, "启动设置项存在异常,已被自动重置", LogBehavior.Alert)
  27. Reset()
  28. Catch ex As Exception
  29. Logger.Error(ex, "重载启动设置时出错")
  30. End Try
  31. End Sub
  32. Public Sub Reset()
  33. Try
  34. SettingService.ResetSettings(Me)
  35. Settings.Set("LaunchArgumentIndieV2", Settings.GetDefault("LaunchArgumentIndieV2"))
  36. Settings.Reset("LaunchArgumentJavaAll")
  37. Settings.Reset("LaunchArgumentJavaSelect")
  38. JavaSearchLoader.Start(IsForceRestart:=True)
  39. Hint("已初始化启动设置!", HintType.Green)
  40. Catch ex As Exception
  41. Logger.Error(ex, "初始化启动设置失败", LogBehavior.Alert)
  42. End Try
  43. Refresh()
  44. End Sub
  45. #Region "离线皮肤"
  46. Private Sub BtnSkinChange_Click(sender As Object, e As EventArgs) Handles BtnSkinChange.Click
  47. Dim SkinInfo As McSkinInfo = McSkinSelect()
  48. If Not SkinInfo.IsVaild Then Return
  49. ChangeSkin(SkinInfo)
  50. End Sub
  51. Private Sub RadioSkinType3_Check(sender As Object, e As RouteEventArgs) Handles RadioSkinType4.PreviewCheck
  52. If Not (AniControlEnabled = 0 AndAlso e.RaiseByMouse) Then Return
  53. '已有图片则不再选择
  54. If FileUtils.Exists(PathAppdata & "CustomSkin.png") Then Return
  55. '没有图片则要求选择
  56. Dim SkinInfo As McSkinInfo = McSkinSelect()
  57. If Not SkinInfo.IsVaild Then
  58. e.Handled = True
  59. Return
  60. End If
  61. '正式改变
  62. If Not ChangeSkin(SkinInfo) Then e.Handled = True
  63. End Sub
  64. '返回是否成功改变
  65. Private Function ChangeSkin(SkinInfo As McSkinInfo) As Boolean
  66. Try
  67. '复制文件
  68. FileUtils.Copy(SkinInfo.LocalFile, PathAppdata & "CustomSkin.png")
  69. '将单层皮肤扩展到双层
  70. Dim Bitmap As New MyBitmap(PathAppdata & "CustomSkin.png")
  71. If Bitmap.Pic.Width = 64 AndAlso Bitmap.Pic.Height = 32 Then
  72. Dim Img As System.Drawing.Image = Bitmap
  73. Dim NewBitmap As New System.Drawing.Bitmap(64, 64)
  74. Using g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(NewBitmap)
  75. g.DrawImageUnscaled(Img, New System.Drawing.Point(0, 0))
  76. End Using
  77. FileUtils.Delete(PathAppdata & "CustomSkin.png")
  78. NewBitmap.Save(PathAppdata & "CustomSkin.png")
  79. End If
  80. '更新设置
  81. Settings.Set("LaunchSkinSlim", SkinInfo.IsSlim)
  82. Return True
  83. Catch ex As Exception
  84. Logger.Error(ex, "改变离线皮肤失败", LogBehavior.Alert)
  85. Return False
  86. Finally
  87. '设置当前显示
  88. PageLaunchLeft.SkinLegacy.Start(IsForceRestart:=True)
  89. End Try
  90. End Function
  91. Private Sub BtnSkinDelete_Click(sender As Object, e As EventArgs) Handles BtnSkinDelete.Click
  92. Try
  93. FileUtils.Delete(PathAppdata & "CustomSkin.png")
  94. RadioSkinType0.SetChecked(True, True)
  95. Hint("离线皮肤已清空!", HintType.Green)
  96. Catch ex As Exception
  97. Logger.Error(ex, "清空离线皮肤失败", LogBehavior.Alert)
  98. End Try
  99. End Sub
  100. Private Sub BtnSkinSave_Click(sender As Object, e As EventArgs) Handles BtnSkinSave.Click
  101. MySkin.Save(PageLaunchLeft.SkinLegacy)
  102. End Sub
  103. Private Sub BtnSkinCache_Click(sender As Object, e As EventArgs) Handles BtnSkinCache.Click
  104. MySkin.RefreshCache(Nothing)
  105. End Sub
  106. Public Shared Sub UpdateSkinType()
  107. PageLaunchLeft.SkinLegacy.Start()
  108. '设置 UI 改变
  109. If FrmSetupLaunch Is Nothing Then Return
  110. Select Case Settings.Get(Of Integer)("LaunchSkinType")
  111. Case 0, 1, 2 '默认
  112. FrmSetupLaunch.PanSkinID.Visibility = Visibility.Collapsed
  113. FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Collapsed
  114. Case 3 '正版
  115. FrmSetupLaunch.PanSkinID.Visibility = Visibility.Visible
  116. FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Collapsed
  117. Case 4 '自定义
  118. FrmSetupLaunch.PanSkinID.Visibility = Visibility.Collapsed
  119. FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Visible
  120. End Select
  121. FrmSetupLaunch.CardSkin.TriggerForceResize()
  122. End Sub
  123. #End Region
  124. #Region "游戏内存"
  125. Public Shared Sub UpdateRamType()
  126. If FrmSetupLaunch?.SliderRamCustom Is Nothing Then Return
  127. FrmSetupLaunch.SliderRamCustom.IsEnabled = Settings.Get(Of Integer)("LaunchRamType") = 1
  128. End Sub
  129. ''' <summary>
  130. ''' 刷新 UI 上的 RAM 显示。
  131. ''' </summary>
  132. Public Sub RefreshRam(ShowAnim As Boolean)
  133. If LabRamGame Is Nothing OrElse LabRamUsed Is Nothing OrElse FrmMain.PageCurrent <> FormMain.PageType.Setup OrElse FrmSetupLeft.PageID <> FormMain.PageSubType.SetupLaunch Then Return
  134. '获取内存情况
  135. Dim RamGame As Double = Math.Round(GetRam(McInstanceSelected, False), 5)
  136. Dim RamTotal As Double = Math.Round(My.Computer.Info.TotalPhysicalMemory / 1024 / 1024 / 1024, 1)
  137. Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024, 1)
  138. Dim RamGameActual As Double = Math.Round(Math.Min(RamGame, RamAvailable), 5)
  139. Dim RamUsed As Double = Math.Round(RamTotal - RamAvailable, 5)
  140. Dim RamEmpty As Double = Math.Round((RamTotal - RamUsed - RamGame).Clamp(0, 1000), 1)
  141. '设置最大可用内存
  142. If RamTotal <= 1.5 Then
  143. SliderRamCustom.MaxValue = Math.Max(Math.Floor((RamTotal - 0.3) / 0.1), 1)
  144. ElseIf RamTotal <= 8 Then
  145. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 1.5) / 0.5) + 12
  146. ElseIf RamTotal <= 16 Then
  147. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 8) / 1) + 25
  148. Else
  149. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 16) / 2) + 33
  150. End If
  151. '设置文本
  152. LabRamGame.Text = If(RamGame = Math.Floor(RamGame), RamGame & ".0", RamGame) & " GB" &
  153. If(RamGame <> RamGameActual, " (可用 " & If(RamGameActual = Math.Floor(RamGameActual), RamGameActual & ".0", RamGameActual) & " GB)", "")
  154. LabRamUsed.Text = If(RamUsed = Math.Floor(RamUsed), RamUsed & ".0", RamUsed) & " GB"
  155. LabRamTotal.Text = " / " & If(RamTotal = Math.Floor(RamTotal), RamTotal & ".0", RamTotal) & " GB"
  156. LabRamWarn.Visibility = If(RamGame = 1 AndAlso Not JavaIs64Bit() AndAlso Not Is32BitSystem AndAlso JavaList.Any, Visibility.Visible, Visibility.Collapsed)
  157. If ShowAnim Then
  158. '宽度动画
  159. AniStart({
  160. AaGridLengthWidth(ColumnRamUsed, RamUsed - ColumnRamUsed.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
  161. AaGridLengthWidth(ColumnRamGame, RamGameActual - ColumnRamGame.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
  162. AaGridLengthWidth(ColumnRamEmpty, RamEmpty - ColumnRamEmpty.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong))
  163. }, "SetupLaunch Ram Grid")
  164. Else
  165. '宽度设置
  166. ColumnRamUsed.Width = New GridLength(RamUsed, GridUnitType.Star)
  167. ColumnRamGame.Width = New GridLength(RamGameActual, GridUnitType.Star)
  168. ColumnRamEmpty.Width = New GridLength(RamEmpty, GridUnitType.Star)
  169. End If
  170. End Sub
  171. Private Sub RefreshRam() Handles SliderRamCustom.Change, RadioRamType0.Check, RadioRamType1.Check
  172. RefreshRam(True)
  173. End Sub
  174. Private RamTextLeft As Integer = 2, RamTextRight As Integer = 1
  175. ''' <summary>
  176. ''' 刷新 UI 上的文本位置。
  177. ''' </summary>
  178. Private Sub RefreshRamText() Handles RectRamGame.SizeChanged, RectRamEmpty.SizeChanged, LabRamGame.SizeChanged
  179. '获取宽度信息
  180. Dim RectUsedWidth = RectRamUsed.ActualWidth
  181. Dim TotalWidth = PanRamDisplay.ActualWidth
  182. Dim LabGameWidth = LabRamGame.ActualWidth, LabUsedWidth = LabRamUsed.ActualWidth, LabTotalWidth = LabRamTotal.ActualWidth
  183. Dim LabGameTitleWidth = LabRamGameTitle.ActualWidth, LabUsedTitleWidth = LabRamUsedTitle.ActualWidth
  184. '左侧
  185. Dim Left As Integer
  186. If RectUsedWidth - 30 < LabUsedWidth OrElse RectUsedWidth - 30 < LabUsedTitleWidth Then
  187. '全写不下了
  188. Left = 0
  189. ElseIf RectUsedWidth - 25 < (LabUsedWidth + LabTotalWidth) Then
  190. '显示不下完整数据
  191. Left = 1
  192. Else
  193. '正常
  194. Left = 2
  195. End If
  196. If RamTextLeft <> Left Then
  197. RamTextLeft = Left
  198. Select Case Left
  199. Case 0
  200. AniStart({
  201. AaOpacity(LabRamUsed, -LabRamUsed.Opacity, 100),
  202. AaOpacity(LabRamTotal, -LabRamTotal.Opacity, 100),
  203. AaOpacity(LabRamUsedTitle, -LabRamUsedTitle.Opacity, 100)
  204. }, "SetupLaunch Ram TextLeft")
  205. Case 1
  206. AniStart({
  207. AaOpacity(LabRamUsed, 1 - LabRamUsed.Opacity, 100),
  208. AaOpacity(LabRamTotal, -LabRamTotal.Opacity, 100),
  209. AaOpacity(LabRamUsedTitle, 0.7 - LabRamUsedTitle.Opacity, 100)
  210. }, "SetupLaunch Ram TextLeft")
  211. Case 2
  212. AniStart({
  213. AaOpacity(LabRamUsed, 1 - LabRamUsed.Opacity, 100),
  214. AaOpacity(LabRamTotal, 1 - LabRamTotal.Opacity, 100),
  215. AaOpacity(LabRamUsedTitle, 0.7 - LabRamUsedTitle.Opacity, 100)
  216. }, "SetupLaunch Ram TextLeft")
  217. End Select
  218. End If
  219. '右侧
  220. Dim Right As Integer
  221. If TotalWidth < LabGameWidth + 2 + RectUsedWidth OrElse TotalWidth < LabGameTitleWidth + 2 + RectUsedWidth Then
  222. '挤到最右边
  223. Right = 0
  224. Else
  225. '正常情况
  226. Right = 1
  227. End If
  228. If Right = 0 Then
  229. If AniControlEnabled = 0 AndAlso (RamTextRight <> Right OrElse AniIsRun("SetupLaunch Ram TextRight")) Then
  230. '需要动画
  231. AniStart({
  232. AaX(LabRamGame, TotalWidth - LabGameWidth - LabRamGame.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)),
  233. AaX(LabRamGameTitle, TotalWidth - LabGameTitleWidth - LabRamGameTitle.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak))
  234. }, "SetupLaunch Ram TextRight")
  235. Else
  236. '不需要动画
  237. AniStop("SetupLaunch Ram TextRight")
  238. LabRamGame.Margin = New Thickness(TotalWidth - LabGameWidth, 3, 0, 0)
  239. LabRamGameTitle.Margin = New Thickness(TotalWidth - LabGameTitleWidth, 0, 0, 5)
  240. End If
  241. Else
  242. If AniControlEnabled = 0 AndAlso (RamTextRight <> Right OrElse AniIsRun("SetupLaunch Ram TextRight")) Then
  243. '需要动画
  244. AniStart({
  245. AaX(LabRamGame, 2 + RectUsedWidth - LabRamGame.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)),
  246. AaX(LabRamGameTitle, 2 + RectUsedWidth - LabRamGameTitle.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak))
  247. }, "SetupLaunch Ram TextRight")
  248. Else
  249. '不需要动画
  250. AniStop("SetupLaunch Ram TextRight")
  251. LabRamGame.Margin = New Thickness(2 + RectUsedWidth, 3, 0, 0)
  252. LabRamGameTitle.Margin = New Thickness(2 + RectUsedWidth, 0, 0, 5)
  253. End If
  254. End If
  255. RamTextRight = Right
  256. End Sub
  257. ''' <summary>
  258. ''' 获取当前设置的 RAM 值。单位为 GB。
  259. ''' </summary>
  260. Public Shared Function GetRam(Instance As McInstance, UseVersionJavaSetup As Boolean, Optional Is32BitJava As Boolean? = Nothing) As Double
  261. '------------------------------------------
  262. ' 修改下方代码时需要一并修改 PageInstanceSetup
  263. '------------------------------------------
  264. Dim RamGive As Double
  265. If Settings.Get(Of Integer)("LaunchRamType") = 0 Then
  266. '自动配置
  267. Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024 * 10) / 10
  268. '确定需求的内存值
  269. Dim RamMininum As Double '无论如何也需要保证的最低限度内存
  270. Dim RamTarget1 As Double '估计能勉强带动了的内存
  271. Dim RamTarget2 As Double '估计没啥问题了的内存
  272. Dim RamTarget3 As Double '放一百万个材质和 Mod 和光影需要的内存
  273. If Instance IsNot Nothing AndAlso Not Instance.IsLoaded Then Instance.Load()
  274. If Instance IsNot Nothing AndAlso Instance.Modable Then
  275. '可安装 Mod 的版本
  276. Dim ModDir = DirectoryUtils.GetInfo(Instance.PathIndie & "mods\")
  277. Dim ModCount As Integer = If(ModDir.Exists, ModDir.GetFiles.Count(Function(f) {".jar", ".zip", ".litemod"}.Contains(f.Extension.Lower)), 0)
  278. RamMininum = 0.5 + ModCount / 150
  279. RamTarget1 = 1.5 + ModCount / 90
  280. RamTarget2 = 2.7 + ModCount / 50
  281. RamTarget3 = 4.5 + ModCount / 25
  282. ElseIf Instance IsNot Nothing AndAlso Instance.Version.HasOptiFine Then
  283. 'OptiFine 版本
  284. RamMininum = 0.5
  285. RamTarget1 = 1.5
  286. RamTarget2 = 3
  287. RamTarget3 = 5
  288. Else
  289. '普通版本
  290. RamMininum = 0.5
  291. RamTarget1 = 1.5
  292. RamTarget2 = 2.5
  293. RamTarget3 = 4
  294. End If
  295. Dim RamDelta As Double
  296. '预分配内存,阶段一,0 ~ T1,100%
  297. RamDelta = RamTarget1
  298. RamGive += Math.Min(RamAvailable, RamDelta)
  299. RamAvailable -= RamDelta
  300. If RamAvailable < 0.1 Then GoTo PreFin
  301. '预分配内存,阶段二,T1 ~ T2,70%
  302. RamDelta = RamTarget2 - RamTarget1
  303. RamGive += Math.Min(RamAvailable * 0.7, RamDelta)
  304. RamAvailable -= RamDelta / 0.7
  305. If RamAvailable < 0.1 Then GoTo PreFin
  306. '预分配内存,阶段三,T2 ~ T3,40%
  307. RamDelta = RamTarget3 - RamTarget2
  308. RamGive += Math.Min(RamAvailable * 0.4, RamDelta)
  309. RamAvailable -= RamDelta / 0.4
  310. If RamAvailable < 0.1 Then GoTo PreFin
  311. '预分配内存,阶段四,T3 ~ T3 * 2,15%
  312. RamDelta = RamTarget3
  313. RamGive += Math.Min(RamAvailable * 0.15, RamDelta)
  314. RamAvailable -= RamDelta / 0.15
  315. If RamAvailable < 0.1 Then GoTo PreFin
  316. PreFin:
  317. '不低于最低值
  318. RamGive = Math.Round(Math.Max(RamGive, RamMininum), 1)
  319. Else
  320. '手动配置
  321. Dim Value = Settings.Get(Of Integer)("LaunchRamCustom")
  322. If Value <= 12 Then
  323. RamGive = Value * 0.1 + 0.3
  324. ElseIf Value <= 25 Then
  325. RamGive = (Value - 12) * 0.5 + 1.5
  326. ElseIf Value <= 33 Then
  327. RamGive = (Value - 25) * 1 + 8
  328. Else
  329. RamGive = (Value - 33) * 2 + 16
  330. End If
  331. End If
  332. '若使用 32 位 Java,则限制为 1G
  333. If If(Is32BitJava, Not JavaIs64Bit(If(UseVersionJavaSetup, Instance, Nothing))) Then RamGive = Math.Min(1, RamGive)
  334. Return RamGive
  335. End Function
  336. #End Region
  337. #Region "Java 选择"
  338. '刷新 Java 下拉框显示
  339. Public Sub UpdateJavaComboBox()
  340. If ComboArgumentJava Is Nothing Then Return
  341. '初始化列表
  342. ComboArgumentJava.Items.Clear()
  343. ComboArgumentJava.Items.Add(New MyComboBoxItem With {.Content = "自动选择(推荐)", .Tag = "自动选择"})
  344. '更新列表
  345. Dim SelectedItem As MyComboBoxItem = Nothing
  346. Dim SelectedBySetup As String = Settings.Get(Of String)("LaunchArgumentJavaSelect")
  347. Try
  348. For Each Java In JavaList.ToList().OrderByDescending(Function(v) v.MajorVersion)
  349. Dim ListItem = New MyComboBoxItem With {.Content = Java.ToString, .ToolTip = Java.PathFolder, .Tag = Java}
  350. ToolTipService.SetHorizontalOffset(ListItem, 400)
  351. ComboArgumentJava.Items.Add(ListItem)
  352. '判断人为选中
  353. If SelectedBySetup = "" Then Continue For
  354. If JavaEntry.FromJson(GetJson(SelectedBySetup)).PathFolder = Java.PathFolder Then SelectedItem = ListItem
  355. Next
  356. Catch ex As Exception
  357. Settings.Set("LaunchArgumentJavaSelect", "")
  358. Logger.Error(ex, "更新设置 Java 下拉框失败")
  359. End Try
  360. '更新选择项
  361. If SelectedItem Is Nothing AndAlso JavaList.Any Then SelectedItem = ComboArgumentJava.Items(0) '选中 “自动选择”
  362. ComboArgumentJava.SelectedItem = SelectedItem
  363. '结束处理
  364. If SelectedItem Is Nothing Then
  365. ComboArgumentJava.Items.Clear()
  366. ComboArgumentJava.Items.Add(New ComboBoxItem With {.Content = "未找到可用的 Java", .IsSelected = True})
  367. End If
  368. RefreshRam(True)
  369. End Sub
  370. '阻止在特定情况下展开下拉框
  371. Private Sub ComboArgumentJava_DropDownOpened(sender As Object, e As EventArgs) Handles ComboArgumentJava.DropDownOpened
  372. If ComboArgumentJava.SelectedItem Is Nothing OrElse ComboArgumentJava.Items(0).Content = "未找到可用的 Java" OrElse ComboArgumentJava.Items(0).Content = "加载中……" Then
  373. ComboArgumentJava.IsDropDownOpen = False
  374. End If
  375. End Sub
  376. '下拉框选择更改
  377. Private Sub JavaSelectionUpdate() Handles ComboArgumentJava.SelectionChanged
  378. If AniControlEnabled <> 0 Then Return
  379. 'Java 不可用时也不清空,会导致刷新时找不到对象
  380. If ComboArgumentJava.SelectedItem Is Nothing OrElse ComboArgumentJava.SelectedItem.Tag Is Nothing Then Return
  381. '设置新的 Java
  382. Dim SelectedJava = ComboArgumentJava.SelectedItem.Tag
  383. If "自动选择".Equals(SelectedJava) Then
  384. '选择 “自动”
  385. Settings.Set("LaunchArgumentJavaSelect", "")
  386. Logger.Info("修改 Java 选择设置:自动选择")
  387. Else
  388. '选择指定项
  389. Settings.Set("LaunchArgumentJavaSelect", CType(SelectedJava.ToJson(), JObject).ToString(Newtonsoft.Json.Formatting.None))
  390. Logger.Info($"修改 Java 选择设置:{SelectedJava}")
  391. End If
  392. RefreshRam(True)
  393. End Sub
  394. '手动选择
  395. Private Sub BtnArgumentJavaSelect_Click(sender As Object, e As EventArgs) Handles BtnArgumentJavaSelect.Click
  396. If JavaSearchLoader.State = LoadState.Loading Then
  397. Hint("正在搜索 Java,请稍候!", HintType.Red)
  398. Return
  399. End If
  400. '选择 Java
  401. Dim JavaSelected As String = Dialogs.SelectFile("选择 bin 文件夹中的 javaw.exe 文件", False, filter:={({"exe"}, "javaw.exe")}).FirstOrDefault()
  402. If String.IsNullOrEmpty(JavaSelected) Then Return
  403. JavaSelected = PathUtils.AddSlashSuffix(PathUtils.RemoveLastPart(JavaSelected))
  404. Try
  405. '验证 Java 可用
  406. Dim NewEntry As New JavaEntry(JavaSelected, True)
  407. NewEntry.Check()
  408. '加入列表
  409. Dim JavaNewList As New JArray From {NewEntry.ToJson}
  410. For Each JsonEntry In GetJson(Settings.Get(Of String)("LaunchArgumentJavaAll"))
  411. Dim Entry = JavaEntry.FromJson(JsonEntry)
  412. If Entry.PathFolder = NewEntry.PathFolder Then Continue For
  413. JavaNewList.Add(JsonEntry)
  414. Next
  415. Settings.Set("LaunchArgumentJavaAll", JavaNewList.ToString(Newtonsoft.Json.Formatting.None))
  416. '重新加载列表
  417. JavaSearchLoader.Start(IsForceRestart:=True)
  418. Hint("已将该 Java 加入 Java 列表!", HintType.Green)
  419. Catch ex As Exception
  420. Logger.Error(ex, "该 Java 存在异常,无法使用", LogBehavior.Alert)
  421. Return
  422. End Try
  423. End Sub
  424. '自动查找
  425. Private Sub BtnArgumentJavaSearch_Click(sender As Object, e As EventArgs) Handles BtnArgumentJavaSearch.Click
  426. If JavaSearchLoader.State = LoadState.Loading Then
  427. Hint("正在搜索 Java,请稍候!", HintType.Red)
  428. Return
  429. End If
  430. RunInThread(
  431. Sub()
  432. Hint("正在搜索 Java!")
  433. JavaSearchLoader.WaitForExit(IsForceRestart:=True)
  434. If Not JavaList.Any() Then
  435. Hint("未找到可用的 Java!", HintType.Red)
  436. Else
  437. Hint("已找到 " & JavaList.Count & " 个 Java,请检查下拉框查看列表!", HintType.Green)
  438. End If
  439. End Sub)
  440. End Sub
  441. #End Region
  442. #Region "其他选项"
  443. Private Sub WindowTypeUIRefresh() Handles ComboArgumentWindowType.SelectionChanged
  444. Dim IsVisibie = (ComboArgumentWindowType.SelectedIndex = 3).ToVisibility
  445. TextArgumentWindowHeight.Visibility = IsVisibie
  446. LabArgumentWindowMiddle.Visibility = IsVisibie
  447. TextArgumentWindowWidth.Visibility = IsVisibie
  448. End Sub
  449. '可见性选择直接关闭的警告
  450. Private Sub ComboArgumentVisibie_SizeChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboArgumentVisibie.SelectionChanged
  451. If AniControlEnabled <> 0 Then Return
  452. If ComboArgumentVisibie.SelectedIndex = 0 Then
  453. If MyMsgBox("若在游戏启动后立即关闭启动器,崩溃检测、更改游戏标题等功能将失效。" & vbCrLf &
  454. "如果想保留这些功能,可以选择让启动器在游戏启动后隐藏,游戏退出后自动关闭。", "提醒", "继续", "取消") = 2 Then
  455. ComboArgumentVisibie.SelectedItem = e.RemovedItems(0)
  456. End If
  457. End If
  458. End Sub
  459. '开启自动内存优化的警告
  460. Private Sub CheckArgumentRam_Change() Handles CheckArgumentRam.Change
  461. If AniControlEnabled <> 0 Then Return
  462. If Not CheckArgumentRam.Checked Then Return
  463. If MyMsgBox("内存优化会显著延长启动耗时,建议仅在内存不足时开启。" & vbCrLf &
  464. "如果你在使用机械硬盘,这还可能导致一小段时间的严重卡顿。" &
  465. If(SystemUtils.HasAdminRole(), "", $"{vbCrLf}{vbCrLf}每次启动游戏,PCL 都需要申请管理员权限以进行内存优化。{vbCrLf}若想自动授予权限,可以右键 PCL,打开 属性 → 兼容性 → 以管理员身份运行此程序。"),
  466. "提醒", "确定", "取消") = 2 Then
  467. CheckArgumentRam.Checked = False
  468. End If
  469. End Sub
  470. '版本隔离提示
  471. Private Sub ComboArgumentIndie_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboArgumentIndieV2.SelectionChanged
  472. If AniControlEnabled <> 0 Then Return
  473. MyMsgBox("本设置仅会对之后新安装的版本生效。" & vbCrLf & "如果要修改已安装的版本的隔离方式,请在它的版本独立设置中调整。")
  474. End Sub
  475. #End Region
  476. #Region "高级设置"
  477. Private Sub TextAdvanceRun_TextChanged(sender As Object, e As TextChangedEventArgs) Handles TextAdvanceRun.TextChanged
  478. CheckAdvanceRunWait.Visibility = If(TextAdvanceRun.Text = "", Visibility.Collapsed, Visibility.Visible)
  479. End Sub
  480. 'JVM 参数重设
  481. Private Sub TextAdvanceJvm_TextChanged() Handles TextAdvanceJvm.ValidatedTextChanged
  482. BtnAdvanceJvmReset.Visibility = If(TextAdvanceJvm.Text = Settings.GetDefault("LaunchAdvanceJvm"), Visibility.Hidden, Visibility.Visible)
  483. End Sub
  484. Private Sub BtnAdvanceJvmReset_Click(sender As Object, e As EventArgs) Handles BtnAdvanceJvmReset.Click
  485. Settings.Reset("LaunchAdvanceJvm")
  486. Refresh()
  487. End Sub
  488. '去除参数中的回车
  489. Private Sub ReplaceEnter(sender As MyTextBox, e As TextChangedEventArgs) Handles TextAdvanceJvm.TextChanged, TextAdvanceGame.TextChanged
  490. Dim NewText = sender.Text.ReplaceLineEndings(" ", mergeMultiple:=True)
  491. If NewText = sender.Text Then Return
  492. Dim CaretIndex = sender.CaretIndex
  493. sender.Text = NewText
  494. sender.CaretIndex = Math.Max(0, CaretIndex - 1)
  495. End Sub
  496. #End Region
  497. '切换到版本独立设置
  498. Private Sub BtnSwitch_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnSwitch.Click
  499. McInstanceSelected.Load()
  500. PageInstanceLeft.Instance = McInstanceSelected
  501. FrmMain.PageChange(FormMain.PageType.InstanceSetup, FormMain.PageSubType.InstanceSetup)
  502. End Sub
  503. End Class