PageSetupLaunch.xaml.vb 29 KB

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