PageSetupLaunch.xaml.vb 27 KB

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