PageSetupLaunch.xaml.vb 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. Public Class PageSetupLaunch
  2. Private IsLoad As Boolean = False
  3. Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
  4. '重复加载部分
  5. PanBack.ScrollToHome()
  6. RefreshRam(False)
  7. '非重复加载部分
  8. If IsLoad Then Exit Sub
  9. IsLoad = True
  10. AniControlEnabled += 1
  11. Reload()
  12. AniControlEnabled -= 1
  13. '内存自动刷新
  14. Dim timer As New Threading.DispatcherTimer With {.Interval = New TimeSpan(0, 0, 0, 1)}
  15. AddHandler timer.Tick, AddressOf RefreshRam
  16. timer.Start()
  17. End Sub
  18. Public Sub Reload()
  19. Try
  20. '离线皮肤
  21. CType(FindName("RadioSkinType" & Setup.Load("LaunchSkinType")), MyRadioBox).Checked = True
  22. TextSkinID.Text = Setup.Get("LaunchSkinID")
  23. '启动参数
  24. TextArgumentTitle.Text = Setup.Get("LaunchArgumentTitle")
  25. TextArgumentInfo.Text = Setup.Get("LaunchArgumentInfo")
  26. ComboArgumentIndie.SelectedIndex = Setup.Get("LaunchArgumentIndie")
  27. ComboArgumentVisibie.SelectedIndex = Setup.Get("LaunchArgumentVisible")
  28. ComboArgumentPriority.SelectedIndex = Setup.Get("LaunchArgumentPriority")
  29. ComboArgumentWindowType.SelectedIndex = Setup.Get("LaunchArgumentWindowType")
  30. TextArgumentWindowWidth.Text = Setup.Get("LaunchArgumentWindowWidth")
  31. TextArgumentWindowHeight.Text = Setup.Get("LaunchArgumentWindowHeight")
  32. RefreshJavaComboBox()
  33. '游戏内存
  34. CType(FindName("RadioRamType" & Setup.Load("LaunchRamType")), MyRadioBox).Checked = True
  35. SliderRamCustom.Value = Setup.Get("LaunchRamCustom")
  36. '高级设置
  37. TextAdvanceJvm.Text = Setup.Get("LaunchAdvanceJvm")
  38. TextAdvanceGame.Text = Setup.Get("LaunchAdvanceGame")
  39. CheckAdvanceAssets.Checked = Setup.Get("LaunchAdvanceAssets")
  40. CheckAdvanceJava.Checked = Setup.Get("LaunchAdvanceJava")
  41. Catch ex As NullReferenceException
  42. Log(ex, "启动设置项存在异常,已被自动重置", LogLevel.Msgbox)
  43. Reset()
  44. Catch ex As Exception
  45. Log(ex, "重载启动设置时出错", LogLevel.Feedback)
  46. End Try
  47. End Sub
  48. '初始化
  49. Public Sub Reset()
  50. Try
  51. Setup.Reset("LaunchArgumentTitle")
  52. Setup.Reset("LaunchArgumentInfo")
  53. Setup.Reset("LaunchArgumentIndie")
  54. Setup.Reset("LaunchArgumentVisible")
  55. Setup.Reset("LaunchArgumentWindowType")
  56. Setup.Reset("LaunchArgumentWindowWidth")
  57. Setup.Reset("LaunchArgumentWindowHeight")
  58. Setup.Reset("LaunchArgumentPriority")
  59. Setup.Reset("LaunchRamType")
  60. Setup.Reset("LaunchRamCustom")
  61. Setup.Reset("LaunchSkinType")
  62. Setup.Reset("LaunchSkinID")
  63. Setup.Reset("LaunchAdvanceJvm")
  64. Setup.Reset("LaunchAdvanceGame")
  65. Setup.Reset("LaunchAdvanceJava")
  66. Setup.Reset("LaunchAdvanceAssets")
  67. Setup.Reset("LaunchArgumentJavaAll")
  68. Setup.Reset("LaunchArgumentJavaSelect")
  69. JavaSearchLoader.Start(IsForceRestart:=True)
  70. Log("[Setup] 已初始化启动设置")
  71. Hint("已初始化启动设置!", HintType.Finish, False)
  72. Catch ex As Exception
  73. Log(ex, "初始化启动设置失败", LogLevel.Msgbox)
  74. End Try
  75. Reload()
  76. End Sub
  77. '将控件改变路由到设置改变
  78. 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
  79. If AniControlEnabled = 0 Then Setup.Set(sender.Tag.ToString.Split("/")(0), Val(sender.Tag.ToString.Split("/")(1)))
  80. End Sub
  81. 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
  82. If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Text)
  83. End Sub
  84. Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderRamCustom.Change
  85. If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value)
  86. End Sub
  87. Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboArgumentIndie.SelectionChanged, ComboArgumentVisibie.SelectionChanged, ComboArgumentWindowType.SelectionChanged, ComboArgumentPriority.SelectionChanged
  88. If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex)
  89. End Sub
  90. Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckAdvanceAssets.Change, CheckAdvanceJava.Change
  91. If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked)
  92. End Sub
  93. #Region "离线皮肤"
  94. Private Sub BtnSkinChange_Click(sender As Object, e As EventArgs) Handles BtnSkinChange.Click
  95. Dim SkinInfo As McSkinInfo = McSkinSelect(True)
  96. If Not SkinInfo.IsVaild Then Exit Sub
  97. '设置文件
  98. Try
  99. '拷贝文件
  100. File.Delete(PathAppdata & "CustomSkin.png")
  101. CopyFile(SkinInfo.LocalFile, PathAppdata & "CustomSkin.png")
  102. '更新设置
  103. Setup.Set("LaunchSkinSlim", SkinInfo.IsSlim)
  104. Catch ex As Exception
  105. Log(ex, "设置离线皮肤失败", LogLevel.Msgbox)
  106. Finally
  107. '设置当前显示
  108. PageLaunchLeft.SkinLegacy.Start(IsForceRestart:=True)
  109. End Try
  110. End Sub
  111. Private Sub RadioSkinType3_Check(sender As Object, e As RouteEventArgs) Handles RadioSkinType4.PreviewCheck
  112. If Not (AniControlEnabled = 0 AndAlso e.RaiseByMouse) Then Exit Sub
  113. Try
  114. '已有图片则不再选择
  115. If File.Exists(PathAppdata & "CustomSkin.png") Then Exit Sub
  116. '没有图片则要求选择
  117. Dim SkinInfo As McSkinInfo = McSkinSelect(True)
  118. If Not SkinInfo.IsVaild Then
  119. e.Handled = True
  120. Exit Sub
  121. End If
  122. '拷贝文件
  123. File.Delete(PathAppdata & "CustomSkin.png")
  124. CopyFile(SkinInfo.LocalFile, PathAppdata & "CustomSkin.png")
  125. '更新设置
  126. Setup.Set("LaunchSkinSlim", SkinInfo.IsSlim)
  127. Catch ex As Exception
  128. Log(ex, "设置离线皮肤失败", LogLevel.Msgbox)
  129. e.Handled = True
  130. Finally
  131. '设置当前显示
  132. PageLaunchLeft.SkinLegacy.Start(IsForceRestart:=True)
  133. End Try
  134. End Sub
  135. Private Sub BtnSkinDelete_Click(sender As Object, e As EventArgs) Handles BtnSkinDelete.Click
  136. Try
  137. File.Delete(PathAppdata & "CustomSkin.png")
  138. RadioSkinType0.SetChecked(True, True, True)
  139. Hint("离线皮肤已清空!", HintType.Finish)
  140. Catch ex As Exception
  141. Log(ex, "清空离线皮肤失败", LogLevel.Msgbox)
  142. End Try
  143. End Sub
  144. Private Sub BtnSkinSave_Click(sender As Object, e As EventArgs) Handles BtnSkinSave.Click
  145. MySkin.Save(PageLaunchLeft.SkinLegacy)
  146. End Sub
  147. Private Sub BtnSkinCache_Click(sender As Object, e As EventArgs) Handles BtnSkinCache.Click
  148. MySkin.RefreshCache(Nothing)
  149. End Sub
  150. #End Region
  151. #Region "游戏内存"
  152. Public Sub RamType(Type As Integer)
  153. If SliderRamCustom Is Nothing Then Exit Sub
  154. SliderRamCustom.IsEnabled = (Type = 1)
  155. End Sub
  156. ''' <summary>
  157. ''' 刷新 UI 上的 RAM 显示。
  158. ''' </summary>
  159. Public Sub RefreshRam(ShowAnim As Boolean)
  160. If LabRamGame Is Nothing OrElse LabRamUsed Is Nothing OrElse FrmMain.PageCurrent <> FormMain.PageType.Setup OrElse FrmSetupLeft.PageID <> FormMain.PageSubType.SetupLaunch Then Exit Sub
  161. '获取内存情况
  162. Dim RamGame As Double = GetRam(McVersionCurrent, False)
  163. Dim RamTotal As Double = Math.Round(My.Computer.Info.TotalPhysicalMemory / 1024 / 1024 / 1024 * 10) / 10
  164. Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024 * 10) / 10
  165. Dim RamGameActual As Double = Math.Min(RamGame, RamAvailable)
  166. Dim RamUsed As Double = RamTotal - RamAvailable
  167. Dim RamEmpty As Double = Math.Round(MathRange(RamTotal - RamUsed - RamGame, 0, 1000) * 10) / 10
  168. '设置最大可用内存
  169. If RamTotal <= 1.5 Then
  170. SliderRamCustom.MaxValue = Math.Max(Math.Floor((RamTotal - 0.3) / 0.1), 1)
  171. ElseIf RamTotal <= 8 Then
  172. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 1.5) / 0.5) + 12
  173. ElseIf RamTotal <= 16 Then
  174. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 8) / 1) + 25
  175. ElseIf RamTotal <= 32 Then
  176. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 16) / 2) + 33
  177. Else
  178. SliderRamCustom.MaxValue = Math.Min(Math.Floor((RamTotal - 32) / 4) + 41, 49)
  179. End If
  180. '设置文本
  181. LabRamGame.Text = If(RamGame = Math.Floor(RamGame), RamGame & ".0", RamGame) & " GB" &
  182. If(RamGame <> RamGameActual, " (可用 " & If(RamGameActual = Math.Floor(RamGameActual), RamGameActual & ".0", RamGameActual) & " GB)", "")
  183. LabRamUsed.Text = If(RamUsed = Math.Floor(RamUsed), RamUsed & ".0", RamUsed) & " GB"
  184. LabRamTotal.Text = " / " & If(RamTotal = Math.Floor(RamTotal), RamTotal & ".0", RamTotal) & " GB"
  185. LabRamWarn.Visibility = If(RamGame = 1 AndAlso Not JavaUse64Bit() AndAlso Not Is32BitSystem, Visibility.Visible, Visibility.Collapsed)
  186. If ShowAnim Then
  187. '宽度动画
  188. AniStart({
  189. AaGridLengthWidth(ColumnRamUsed, RamUsed - ColumnRamUsed.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
  190. AaGridLengthWidth(ColumnRamGame, RamGameActual - ColumnRamGame.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
  191. AaGridLengthWidth(ColumnRamEmpty, RamEmpty - ColumnRamEmpty.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong))
  192. }, "SetupLaunch Ram Grid")
  193. Else
  194. '宽度设置
  195. ColumnRamUsed.Width = New GridLength(RamUsed, GridUnitType.Star)
  196. ColumnRamGame.Width = New GridLength(RamGameActual, GridUnitType.Star)
  197. ColumnRamEmpty.Width = New GridLength(RamEmpty, GridUnitType.Star)
  198. End If
  199. End Sub
  200. Private Sub RefreshRam() Handles SliderRamCustom.Change, RadioRamType0.Check, RadioRamType1.Check
  201. RefreshRam(True)
  202. End Sub
  203. Private RamTextLeft As Integer = 2, RamTextRight As Integer = 1
  204. ''' <summary>
  205. ''' 刷新 UI 上的文本位置。
  206. ''' </summary>
  207. Private Sub RefreshRamText() Handles RectRamGame.SizeChanged, RectRamEmpty.SizeChanged, LabRamGame.SizeChanged
  208. '获取宽度信息
  209. Dim RectUsedWidth = RectRamUsed.ActualWidth
  210. Dim TotalWidth = PanRamDisplay.ActualWidth
  211. Dim LabGameWidth = LabRamGame.ActualWidth, LabUsedWidth = LabRamUsed.ActualWidth, LabTotalWidth = LabRamTotal.ActualWidth
  212. Dim LabGameTitleWidth = LabRamGameTitle.ActualWidth, LabUsedTitleWidth = LabRamUsedTitle.ActualWidth
  213. '左侧
  214. Dim Left As Integer
  215. If RectUsedWidth - 30 < LabUsedWidth OrElse RectUsedWidth - 30 < LabUsedTitleWidth Then
  216. '全写不下了
  217. Left = 0
  218. ElseIf RectUsedWidth - 25 < (LabUsedWidth + LabTotalWidth) Then
  219. '显示不下完整数据
  220. Left = 1
  221. Else
  222. '正常
  223. Left = 2
  224. End If
  225. If RamTextLeft <> Left Then
  226. RamTextLeft = Left
  227. 'If AniControlEnabled = 0 Then
  228. Select Case Left
  229. Case 0
  230. AniStart({
  231. AaOpacity(LabRamUsed, -LabRamUsed.Opacity, 100),
  232. AaOpacity(LabRamTotal, -LabRamTotal.Opacity, 100),
  233. AaOpacity(LabRamUsedTitle, -LabRamUsedTitle.Opacity, 100)
  234. }, "SetupLaunch Ram TextLeft")
  235. Case 1
  236. AniStart({
  237. AaOpacity(LabRamUsed, 1 - LabRamUsed.Opacity, 100),
  238. AaOpacity(LabRamTotal, -LabRamTotal.Opacity, 100),
  239. AaOpacity(LabRamUsedTitle, 0.7 - LabRamUsedTitle.Opacity, 100)
  240. }, "SetupLaunch Ram TextLeft")
  241. Case 2
  242. AniStart({
  243. AaOpacity(LabRamUsed, 1 - LabRamUsed.Opacity, 100),
  244. AaOpacity(LabRamTotal, 1 - LabRamTotal.Opacity, 100),
  245. AaOpacity(LabRamUsedTitle, 0.7 - LabRamUsedTitle.Opacity, 100)
  246. }, "SetupLaunch Ram TextLeft")
  247. End Select
  248. 'Else
  249. ' Select Case Left
  250. ' Case 0
  251. ' LabRamUsed.Opacity = 0
  252. ' LabRamTotal.Opacity = 0
  253. ' LabRamUsedTitle.Opacity = 0
  254. ' Case 1
  255. ' LabRamUsed.Opacity = 1
  256. ' LabRamTotal.Opacity = 0
  257. ' LabRamUsedTitle.Opacity = 0.7
  258. ' Case 2
  259. ' LabRamUsed.Opacity = 1
  260. ' LabRamTotal.Opacity = 1
  261. ' LabRamUsedTitle.Opacity = 0.7
  262. ' End Select
  263. 'End If
  264. End If
  265. '右侧
  266. Dim Right As Integer
  267. If TotalWidth < LabGameWidth + 2 + RectUsedWidth OrElse TotalWidth < LabGameTitleWidth + 2 + RectUsedWidth Then
  268. '挤到最右边
  269. Right = 0
  270. Else
  271. '正常情况
  272. Right = 1
  273. End If
  274. If Right = 0 Then
  275. If AniControlEnabled = 0 AndAlso (RamTextRight <> Right OrElse AniIsRun("SetupLaunch Ram TextRight")) Then
  276. '需要动画
  277. AniStart({
  278. AaX(LabRamGame, TotalWidth - LabGameWidth - LabRamGame.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)),
  279. AaX(LabRamGameTitle, TotalWidth - LabGameTitleWidth - LabRamGameTitle.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak))
  280. }, "SetupLaunch Ram TextRight")
  281. Else
  282. '不需要动画
  283. AniStop("SetupLaunch Ram TextRight")
  284. LabRamGame.Margin = New Thickness(TotalWidth - LabGameWidth, 3, 0, 0)
  285. LabRamGameTitle.Margin = New Thickness(TotalWidth - LabGameTitleWidth, 0, 0, 5)
  286. End If
  287. Else
  288. If AniControlEnabled = 0 AndAlso (RamTextRight <> Right OrElse AniIsRun("SetupLaunch Ram TextRight")) Then
  289. '需要动画
  290. AniStart({
  291. AaX(LabRamGame, 2 + RectUsedWidth - LabRamGame.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)),
  292. AaX(LabRamGameTitle, 2 + RectUsedWidth - LabRamGameTitle.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak))
  293. }, "SetupLaunch Ram TextRight")
  294. Else
  295. '不需要动画
  296. AniStop("SetupLaunch Ram TextRight")
  297. LabRamGame.Margin = New Thickness(2 + RectUsedWidth, 3, 0, 0)
  298. LabRamGameTitle.Margin = New Thickness(2 + RectUsedWidth, 0, 0, 5)
  299. End If
  300. End If
  301. RamTextRight = Right
  302. End Sub
  303. ''' <summary>
  304. ''' 获取当前设置的 RAM 值。单位为 GB。
  305. ''' </summary>
  306. Public Shared Function GetRam(Version As McVersion, UseVersionJavaSetup As Boolean) As Double
  307. Dim RamGive As Double
  308. If Setup.Get("LaunchRamType") = 0 Then
  309. '自动配置
  310. Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024 * 10) / 10
  311. '确定需求的内存值
  312. Dim RamMininum As Double '无论如何也需要保证的最低限度内存
  313. Dim RamTarget1 As Double '估计能勉强带动了的内存
  314. Dim RamTarget2 As Double '估计没啥问题了的内存
  315. Dim RamTarget3 As Double '放一百万个材质和 Mod 和光影需要的内存
  316. If Version IsNot Nothing AndAlso Not Version.IsLoaded Then Version.Load()
  317. If Version IsNot Nothing AndAlso Version.Modable Then
  318. '可安装 Mod 的版本
  319. Dim ModDir As New DirectoryInfo(Version.PathIndie & "mods\")
  320. Dim ModCount As Integer = If(ModDir.Exists, ModDir.GetFiles.Length, 0)
  321. RamMininum = 0.4 + ModCount / 150
  322. RamTarget1 = 1.5 + ModCount / 100
  323. RamTarget2 = 3 + ModCount / 60
  324. RamTarget3 = 6 + ModCount / 30
  325. ElseIf Version IsNot Nothing AndAlso Version.Version.HasOptiFine Then
  326. 'OptiFine 版本
  327. RamMininum = 0.3
  328. RamTarget1 = 1.5
  329. RamTarget2 = 3
  330. RamTarget3 = 6
  331. Else
  332. '普通版本
  333. RamMininum = 0.3
  334. RamTarget1 = 1.5
  335. RamTarget2 = 2.5
  336. RamTarget3 = 4
  337. End If
  338. Dim RamDelta As Double
  339. '预分配内存,阶段一,0 ~ T1,100%
  340. RamDelta = RamTarget1
  341. RamAvailable = Math.Max(0, RamAvailable - 0.1)
  342. RamGive += Math.Min(RamAvailable * 1, RamDelta)
  343. RamAvailable -= RamDelta / 1 + 0.1
  344. If RamAvailable < 0.1 Then GoTo PreFin
  345. '预分配内存,阶段二,T1 ~ T2,80%
  346. RamDelta = RamTarget2 - RamTarget1
  347. RamAvailable = Math.Max(0, RamAvailable - 0.1)
  348. RamGive += Math.Min(RamAvailable * 0.8, RamDelta)
  349. RamAvailable -= RamDelta / 0.8 + 0.1
  350. If RamAvailable < 0.1 Then GoTo PreFin
  351. '预分配内存,阶段三,T2 ~ T3,60%
  352. RamDelta = RamTarget3 - RamTarget2
  353. RamAvailable = Math.Max(0, RamAvailable - 0.2)
  354. RamGive += Math.Min(RamAvailable * 0.6, RamDelta)
  355. RamAvailable -= RamDelta / 0.6 + 0.2
  356. If RamAvailable < 0.1 Then GoTo PreFin
  357. '预分配内存,阶段四,T3 ~ T3 * 2,40%
  358. RamDelta = RamTarget3
  359. RamAvailable = Math.Max(0, RamAvailable - 0.3)
  360. RamGive += Math.Min(RamAvailable * 0.4, RamDelta)
  361. RamAvailable -= RamDelta / 0.4 + 0.3
  362. If RamAvailable < 0.1 Then GoTo PreFin
  363. PreFin:
  364. '不低于最低值
  365. RamGive = Math.Round(Math.Max(RamGive, RamMininum), 1)
  366. Else
  367. '手动配置
  368. Dim Value As Integer = Setup.Get("LaunchRamCustom")
  369. If Value <= 12 Then
  370. RamGive = Value * 0.1 + 0.3
  371. ElseIf Value <= 25 Then
  372. RamGive = (Value - 12) * 0.5 + 1.5
  373. ElseIf Value <= 33 Then
  374. RamGive = (Value - 25) * 1 + 8
  375. ElseIf Value <= 41 Then
  376. RamGive = (Value - 33) * 2 + 16
  377. Else
  378. RamGive = (Value - 41) * 4 + 32
  379. End If
  380. End If
  381. '若使用 32 位 Java,则限制为 1G
  382. If Not JavaUse64Bit(If(UseVersionJavaSetup, Version, Nothing)) Then RamGive = Math.Min(1, RamGive)
  383. Return RamGive
  384. End Function
  385. #End Region
  386. #Region "Java 选择"
  387. '刷新 Java 下拉框显示
  388. Public Sub RefreshJavaComboBox()
  389. If ComboArgumentJava Is Nothing Then Exit Sub
  390. '初始化列表
  391. ComboArgumentJava.Items.Clear()
  392. ComboArgumentJava.Items.Add(New MyComboBoxItem With {.Content = "自动选择适合所选游戏版本的 Java", .Tag = "自动选择"})
  393. '更新列表
  394. Dim SelectedItem As MyComboBoxItem = Nothing
  395. Dim SelectedBySetup As String = Setup.Get("LaunchArgumentJavaSelect")
  396. Try
  397. For Each Java In JavaList
  398. Dim ListItem = New MyComboBoxItem With {.Content = Java.ToString, .ToolTip = Java.PathFolder, .Tag = Java}
  399. ToolTipService.SetPlacement(ListItem, Primitives.PlacementMode.Right)
  400. ToolTipService.SetHorizontalOffset(ListItem, 5)
  401. ComboArgumentJava.Items.Add(ListItem)
  402. '判断人为选中
  403. If SelectedBySetup = "" Then Continue For
  404. If JavaEntry.FromJson(GetJson(SelectedBySetup)).PathFolder = Java.PathFolder Then SelectedItem = ListItem
  405. Next
  406. Catch ex As Exception
  407. Setup.Set("LaunchArgumentJavaSelect", "")
  408. Log(ex, "更新设置 Java 下拉框失败", LogLevel.Feedback)
  409. End Try
  410. '更新选择项
  411. If SelectedItem Is Nothing AndAlso JavaList.Count > 0 Then SelectedItem = ComboArgumentJava.Items(0) '选中 “自动选择”
  412. ComboArgumentJava.SelectedItem = SelectedItem
  413. '结束处理
  414. If SelectedItem Is Nothing Then
  415. ComboArgumentJava.Items.Clear()
  416. ComboArgumentJava.Items.Add(New ComboBoxItem With {.Content = "未找到可用的 Java", .IsSelected = True})
  417. End If
  418. RefreshRam(True)
  419. End Sub
  420. '阻止在特定情况下展开下拉框
  421. Private Sub ComboArgumentJava_DropDownOpened(sender As Object, e As EventArgs) Handles ComboArgumentJava.DropDownOpened
  422. If ComboArgumentJava.SelectedItem Is Nothing OrElse ComboArgumentJava.Items(0).Content = "未找到可用的 Java" OrElse ComboArgumentJava.Items(0).Content = "加载中……" Then
  423. ComboArgumentJava.IsDropDownOpen = False
  424. End If
  425. End Sub
  426. '下拉框选择更改
  427. Private Sub JavaSelectionUpdate() Handles ComboArgumentJava.SelectionChanged
  428. If AniControlEnabled <> 0 Then Exit Sub
  429. 'Java 不可用时也不清空,会导致刷新时找不到对象
  430. If ComboArgumentJava.SelectedItem Is Nothing OrElse ComboArgumentJava.SelectedItem.Tag Is Nothing Then Exit Sub
  431. '设置新的 Java
  432. Dim SelectedJava = ComboArgumentJava.SelectedItem.Tag
  433. If "自动选择".Equals(SelectedJava) Then
  434. '选择 “自动”
  435. Setup.Set("LaunchArgumentJavaSelect", "")
  436. Log("[Java] 修改 Java 选择设置:自动选择")
  437. Else
  438. '选择指定项
  439. Setup.Set("LaunchArgumentJavaSelect", CType(SelectedJava.ToJson(), JObject).ToString(Newtonsoft.Json.Formatting.None))
  440. Log("[Java] 修改 Java 选择设置:" & SelectedJava.ToString)
  441. End If
  442. RefreshRam(True)
  443. End Sub
  444. '手动选择
  445. Private Sub BtnArgumentJavaSelect_Click(sender As Object, e As EventArgs) Handles BtnArgumentJavaSelect.Click
  446. If JavaSearchLoader.State = LoadState.Loading Then
  447. Hint("正在搜索 Java,请稍候!", HintType.Critical)
  448. Exit Sub
  449. End If
  450. '选择 Java
  451. Dim JavaSelected As String = SelectFile("javaw.exe|javaw.exe", "选择 javaw.exe 文件")
  452. If JavaSelected = "" Then Exit Sub
  453. If Not JavaSelected.ToLower.EndsWith("javaw.exe") Then
  454. Hint("请选择 bin 文件夹中的 javaw.exe 文件!", HintType.Critical)
  455. Exit Sub
  456. End If
  457. JavaSelected = GetPathFromFullPath(JavaSelected)
  458. Try
  459. '验证 Java 可用
  460. Dim NewEntry As New JavaEntry(JavaSelected, True)
  461. NewEntry.Check()
  462. '加入列表并改变选择
  463. Dim JavaNewList As New JArray From {NewEntry.ToJson}
  464. For Each JsonEntry In GetJson(Setup.Get("LaunchArgumentJavaAll"))
  465. Dim Entry = JavaEntry.FromJson(JsonEntry)
  466. If Entry.PathFolder = NewEntry.PathFolder Then Continue For
  467. JavaNewList.Add(JsonEntry)
  468. Next
  469. Setup.Set("LaunchArgumentJavaAll", JavaNewList.ToString(Newtonsoft.Json.Formatting.None))
  470. Setup.Set("LaunchArgumentJavaSelect", NewEntry.ToJson.ToString(Newtonsoft.Json.Formatting.None)) '加载器会优先选择设置中的 Java
  471. '重新加载列表
  472. JavaSearchLoader.Start(IsForceRestart:=True)
  473. Catch ex As Exception
  474. Log(ex, "该 Java 存在异常,无法使用", LogLevel.Msgbox, "异常的 Java")
  475. Exit Sub
  476. End Try
  477. End Sub
  478. '自动查找
  479. Private Sub BtnArgumentJavaSearch_Click(sender As Object, e As EventArgs) Handles BtnArgumentJavaSearch.Click
  480. If JavaSearchLoader.State = LoadState.Loading Then
  481. Hint("正在搜索 Java,请稍候!", HintType.Critical)
  482. Exit Sub
  483. End If
  484. RunInThread(Sub()
  485. Hint("正在搜索 Java!")
  486. JavaSearchLoader.WaitForExit(GetUuid)
  487. If JavaList.Count = 0 Then
  488. Hint("未找到可用的 Java!", HintType.Critical)
  489. Else
  490. Hint("已找到 " & JavaList.Count & " 个 Java,请检查下拉框查看列表!", HintType.Finish)
  491. End If
  492. End Sub)
  493. End Sub
  494. #End Region
  495. #Region "启动参数"
  496. Private Sub WindowTypeUIRefresh() Handles ComboArgumentWindowType.SelectionChanged
  497. If ComboArgumentWindowType Is Nothing Then Exit Sub
  498. If ComboArgumentWindowType.SelectedIndex = 3 AndAlso LabArgumentWindowMiddle IsNot Nothing AndAlso LabArgumentWindowMiddle.Visibility = Visibility.Collapsed Then
  499. LabArgumentWindowMiddle.Visibility = Visibility.Visible
  500. TextArgumentWindowHeight.Visibility = Visibility.Visible
  501. TextArgumentWindowWidth.Visibility = Visibility.Visible
  502. ElseIf ComboArgumentWindowType.SelectedIndex <> 3 AndAlso LabArgumentWindowMiddle IsNot Nothing AndAlso LabArgumentWindowMiddle.Visibility = Visibility.Visible Then
  503. LabArgumentWindowMiddle.Visibility = Visibility.Collapsed
  504. TextArgumentWindowHeight.Visibility = Visibility.Collapsed
  505. TextArgumentWindowWidth.Visibility = Visibility.Collapsed
  506. End If
  507. End Sub
  508. '可见性选择直接关闭的警告
  509. Private Sub ComboArgumentVisibie_SizeChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboArgumentVisibie.SelectionChanged
  510. If AniControlEnabled <> 0 Then Exit Sub
  511. If ComboArgumentVisibie.SelectedIndex = 0 Then
  512. If MyMsgBox("若在游戏启动后立即关闭启动器,崩溃检测、更改游戏标题等功能将失效。" & vbCrLf &
  513. "如果想保留这些功能,可以选择让启动器在游戏启动后隐藏,游戏退出后自动关闭。", "提示", "继续", "取消") = 2 Then
  514. ComboArgumentVisibie.SelectedItem = e.RemovedItems(0)
  515. End If
  516. End If
  517. End Sub
  518. #End Region
  519. End Class