PageInstanceSetup.xaml.vb 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529
  1. Public Class PageInstanceSetup
  2. Private Shadows IsLoaded As Boolean = False
  3. Private Sub PageSetupSystem_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
  4. '重复加载部分
  5. PanBack.ScrollToHome()
  6. RefreshRam(False)
  7. '由于各个版本不同,每次都需要重新加载
  8. AniControlEnabled += 1
  9. Reload()
  10. AniControlEnabled -= 1
  11. '非重复加载部分
  12. If IsLoaded Then Return
  13. IsLoaded = True
  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 Reload()
  20. Try
  21. '启动参数
  22. TextArgumentTitle.Text = Setup.Get("VersionArgumentTitle", Instance:=PageInstanceLeft.Instance)
  23. TextArgumentInfo.Text = Setup.Get("VersionArgumentInfo", Instance:=PageInstanceLeft.Instance)
  24. Dim _unused = PageInstanceLeft.Instance.PathIndie '触发自动判定
  25. ComboArgumentIndieV2.SelectedIndex = If(Setup.Get("VersionArgumentIndieV2", Instance:=PageInstanceLeft.Instance), 0, 1)
  26. RefreshJavaComboBox()
  27. '游戏内存
  28. CType(FindName("RadioRamType" & Setup.Load("VersionRamType", Instance:=PageInstanceLeft.Instance)), MyRadioBox).Checked = True
  29. SliderRamCustom.Value = Setup.Get("VersionRamCustom", Instance:=PageInstanceLeft.Instance)
  30. ComboRamOptimize.SelectedIndex = Setup.Get("VersionRamOptimize", Instance:=PageInstanceLeft.Instance)
  31. '服务器
  32. TextServerEnter.Text = Setup.Get("VersionServerEnter", Instance:=PageInstanceLeft.Instance)
  33. ComboServerLogin.SelectedIndex = Setup.Get("VersionServerLogin", Instance:=PageInstanceLeft.Instance)
  34. ComboServerLoginLast = ComboServerLogin.SelectedIndex
  35. ServerLogin(ComboServerLogin.SelectedIndex)
  36. TextServerNide.Text = Setup.Get("VersionServerNide", Instance:=PageInstanceLeft.Instance)
  37. TextServerAuthServer.Text = Setup.Get("VersionServerAuthServer", Instance:=PageInstanceLeft.Instance)
  38. TextServerAuthName.Text = Setup.Get("VersionServerAuthName", Instance:=PageInstanceLeft.Instance)
  39. TextServerAuthRegister.Text = Setup.Get("VersionServerAuthRegister", Instance:=PageInstanceLeft.Instance)
  40. '高级设置
  41. TextAdvanceJvm.Text = Setup.Get("VersionAdvanceJvm", Instance:=PageInstanceLeft.Instance)
  42. TextAdvanceGame.Text = Setup.Get("VersionAdvanceGame", Instance:=PageInstanceLeft.Instance)
  43. ComboAdvanceGC.SelectedIndex = Setup.Get("VersionAdvanceGC", Instance:=PageInstanceLeft.Instance)
  44. TextAdvanceRun.Text = Setup.Get("VersionAdvanceRun", Instance:=PageInstanceLeft.Instance)
  45. CheckAdvanceRunWait.Checked = Setup.Get("VersionAdvanceRunWait", Instance:=PageInstanceLeft.Instance)
  46. If Setup.Get("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance) = 2 Then
  47. Log("[Setup] 已迁移老版本的关闭文件校验设置")
  48. Setup.Reset("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance)
  49. Setup.Set("VersionAdvanceAssetsV2", True, Instance:=PageInstanceLeft.Instance)
  50. End If
  51. CheckAdvanceAssetsV2.Checked = Setup.Get("VersionAdvanceAssetsV2", Instance:=PageInstanceLeft.Instance)
  52. CheckAdvanceJava.Checked = Setup.Get("VersionAdvanceJava", Instance:=PageInstanceLeft.Instance)
  53. CheckAdvanceDisableJLW.Checked = Setup.Get("VersionAdvanceDisableJLW", Instance:=PageInstanceLeft.Instance)
  54. CheckAdvanceDisableModUpdate.Checked = Setup.Get("VersionAdvanceDisableModUpdate", Instance:=PageInstanceLeft.Instance)
  55. Catch ex As Exception
  56. Log(ex, "重载版本独立设置时出错", LogLevel.Feedback)
  57. End Try
  58. End Sub
  59. '初始化
  60. Public Sub Reset()
  61. Try
  62. Setup.Reset("VersionServerEnter", Instance:=PageInstanceLeft.Instance)
  63. Setup.Reset("VersionServerLogin", Instance:=PageInstanceLeft.Instance)
  64. Setup.Reset("VersionServerNide", Instance:=PageInstanceLeft.Instance)
  65. Setup.Reset("VersionServerAuthServer", Instance:=PageInstanceLeft.Instance)
  66. Setup.Reset("VersionServerAuthRegister", Instance:=PageInstanceLeft.Instance)
  67. Setup.Reset("VersionServerAuthName", Instance:=PageInstanceLeft.Instance)
  68. Setup.Reset("VersionArgumentTitle", Instance:=PageInstanceLeft.Instance)
  69. Setup.Reset("VersionArgumentInfo", Instance:=PageInstanceLeft.Instance)
  70. Setup.Reset("VersionArgumentIndieV2", Instance:=PageInstanceLeft.Instance)
  71. Setup.Reset("VersionRamType", Instance:=PageInstanceLeft.Instance)
  72. Setup.Reset("VersionRamCustom", Instance:=PageInstanceLeft.Instance)
  73. Setup.Reset("VersionRamOptimize", Instance:=PageInstanceLeft.Instance)
  74. Setup.Reset("VersionAdvanceJvm", Instance:=PageInstanceLeft.Instance)
  75. Setup.Reset("VersionAdvanceGame", Instance:=PageInstanceLeft.Instance)
  76. Setup.Reset("VersionAdvanceGC", Instance:=PageInstanceLeft.Instance)
  77. Setup.Reset("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance)
  78. Setup.Reset("VersionAdvanceAssetsV2", Instance:=PageInstanceLeft.Instance)
  79. Setup.Reset("VersionAdvanceJava", Instance:=PageInstanceLeft.Instance)
  80. Setup.Reset("VersionAdvanceRun", Instance:=PageInstanceLeft.Instance)
  81. Setup.Reset("VersionAdvanceRunWait", Instance:=PageInstanceLeft.Instance)
  82. Setup.Reset("VersionAdvanceDisableJLW", Instance:=PageInstanceLeft.Instance)
  83. Setup.Reset("VersionAdvanceDisableModUpdate", Instance:=PageInstanceLeft.Instance)
  84. Setup.Reset("VersionArgumentJavaSelect", Instance:=PageInstanceLeft.Instance)
  85. JavaSearchLoader.Start(IsForceRestart:=True)
  86. Log("[Setup] 已初始化版本独立设置")
  87. Hint("已初始化版本独立设置!", HintType.Green, False)
  88. Catch ex As Exception
  89. Log(ex, "初始化版本独立设置失败", LogLevel.Msgbox)
  90. End Try
  91. Reload()
  92. End Sub
  93. '将控件改变路由到设置改变
  94. Private Shared Sub RadioBoxChange(sender As MyRadioBox, e As Object) Handles RadioRamType0.Check, RadioRamType1.Check, RadioRamType2.Check
  95. If AniControlEnabled = 0 Then Setup.Set(sender.Tag.ToString.Split("/")(0), Val(sender.Tag.ToString.Split("/")(1)), Instance:=PageInstanceLeft.Instance)
  96. End Sub
  97. Private Shared Sub TextBoxChange(sender As MyTextBox, e As Object) Handles TextServerEnter.ValidatedTextChanged, TextArgumentInfo.ValidatedTextChanged, TextAdvanceGame.ValidatedTextChanged, TextAdvanceJvm.ValidatedTextChanged, TextServerNide.ValidatedTextChanged, TextServerAuthName.ValidatedTextChanged, TextServerAuthRegister.ValidatedTextChanged, TextServerAuthServer.ValidatedTextChanged, TextArgumentTitle.ValidatedTextChanged, TextAdvanceRun.ValidatedTextChanged
  98. If AniControlEnabled = 0 Then
  99. '#3194,不能删减 /
  100. 'Dim HandledText As String = sender.Text
  101. 'If sender.Tag = "VersionServerAuthServer" OrElse sender.Tag = "VersionServerAuthRegister" Then HandledText = HandledText.TrimEnd("/")
  102. Setup.Set(sender.Tag, sender.Text, Instance:=PageInstanceLeft.Instance)
  103. End If
  104. End Sub
  105. Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderRamCustom.Change
  106. If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value, Instance:=PageInstanceLeft.Instance)
  107. End Sub
  108. Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboRamOptimize.SelectionChanged, ComboAdvanceGC.SelectionChanged
  109. If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex, Instance:=PageInstanceLeft.Instance)
  110. End Sub
  111. Private Shared Sub CheckBoxLikeComboChange(sender As MyComboBox, e As Object) Handles ComboArgumentIndieV2.SelectionChanged
  112. If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex = 0, Instance:=PageInstanceLeft.Instance)
  113. End Sub
  114. Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckAdvanceRunWait.Change, CheckAdvanceAssetsV2.Change, CheckAdvanceJava.Change, CheckAdvanceDisableJLW.Change, CheckAdvanceDisableModUpdate.Change
  115. If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked, Instance:=PageInstanceLeft.Instance)
  116. End Sub
  117. #Region "游戏内存"
  118. Public Sub RamType(Type As Integer)
  119. If SliderRamCustom Is Nothing Then Return
  120. SliderRamCustom.IsEnabled = (Type = 1)
  121. End Sub
  122. ''' <summary>
  123. ''' 刷新 UI 上的 RAM 显示。
  124. ''' </summary>
  125. Public Sub RefreshRam(ShowAnim As Boolean)
  126. If LabRamGame Is Nothing OrElse LabRamUsed Is Nothing OrElse FrmMain.PageCurrent <> FormMain.PageType.InstanceSetup OrElse FrmInstanceLeft.PageID <> FormMain.PageSubType.InstanceSetup Then Return
  127. '获取内存情况
  128. Dim RamGame As Double = Math.Round(GetRam(PageInstanceLeft.Instance), 5)
  129. Dim RamTotal As Double = Math.Round(My.Computer.Info.TotalPhysicalMemory / 1024 / 1024 / 1024, 1)
  130. Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024, 1)
  131. Dim RamGameActual As Double = Math.Round(Math.Min(RamGame, RamAvailable), 5)
  132. Dim RamUsed As Double = Math.Round(RamTotal - RamAvailable, 5)
  133. Dim RamEmpty As Double = Math.Round(MathClamp(RamTotal - RamUsed - RamGame, 0, 1000), 1)
  134. '设置最大可用内存
  135. If RamTotal <= 1.5 Then
  136. SliderRamCustom.MaxValue = Math.Max(Math.Floor((RamTotal - 0.3) / 0.1), 1)
  137. ElseIf RamTotal <= 8 Then
  138. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 1.5) / 0.5) + 12
  139. ElseIf RamTotal <= 16 Then
  140. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 8) / 1) + 25
  141. Else
  142. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 16) / 2) + 33
  143. End If
  144. '设置文本
  145. LabRamGame.Text = If(RamGame = Math.Floor(RamGame), RamGame & ".0", RamGame) & " GB" &
  146. If(RamGame <> RamGameActual, " (可用 " & If(RamGameActual = Math.Floor(RamGameActual), RamGameActual & ".0", RamGameActual) & " GB)", "")
  147. LabRamUsed.Text = If(RamUsed = Math.Floor(RamUsed), RamUsed & ".0", RamUsed) & " GB"
  148. LabRamTotal.Text = " / " & If(RamTotal = Math.Floor(RamTotal), RamTotal & ".0", RamTotal) & " GB"
  149. LabRamWarn.Visibility = If(RamGame = 1 AndAlso Not JavaIs64Bit(PageInstanceLeft.Instance) AndAlso Not Is32BitSystem AndAlso JavaList.Any, Visibility.Visible, Visibility.Collapsed)
  150. If ShowAnim Then
  151. '宽度动画
  152. AniStart({
  153. AaGridLengthWidth(ColumnRamUsed, RamUsed - ColumnRamUsed.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
  154. AaGridLengthWidth(ColumnRamGame, RamGameActual - ColumnRamGame.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
  155. AaGridLengthWidth(ColumnRamEmpty, RamEmpty - ColumnRamEmpty.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong))
  156. }, "VersionSetup Ram Grid")
  157. Else
  158. '宽度设置
  159. ColumnRamUsed.Width = New GridLength(RamUsed, GridUnitType.Star)
  160. ColumnRamGame.Width = New GridLength(RamGameActual, GridUnitType.Star)
  161. ColumnRamEmpty.Width = New GridLength(RamEmpty, GridUnitType.Star)
  162. End If
  163. End Sub
  164. Private Sub RefreshRam() Handles SliderRamCustom.Change, RadioRamType0.Check, RadioRamType1.Check, RadioRamType2.Check
  165. RefreshRam(True)
  166. End Sub
  167. Private RamTextLeft As Integer = 2, RamTextRight As Integer = 1
  168. ''' <summary>
  169. ''' 刷新 UI 上的文本位置。
  170. ''' </summary>
  171. Private Sub RefreshRamText() Handles RectRamGame.SizeChanged, RectRamEmpty.SizeChanged, LabRamGame.SizeChanged
  172. '获取宽度信息
  173. Dim RectUsedWidth = RectRamUsed.ActualWidth
  174. Dim TotalWidth = PanRamDisplay.ActualWidth
  175. Dim LabGameWidth = LabRamGame.ActualWidth, LabUsedWidth = LabRamUsed.ActualWidth, LabTotalWidth = LabRamTotal.ActualWidth
  176. Dim LabGameTitleWidth = LabRamGameTitle.ActualWidth, LabUsedTitleWidth = LabRamUsedTitle.ActualWidth
  177. '左侧
  178. Dim Left As Integer
  179. If RectUsedWidth - 30 < LabUsedWidth OrElse RectUsedWidth - 30 < LabUsedTitleWidth Then
  180. '全写不下了
  181. Left = 0
  182. ElseIf RectUsedWidth - 25 < (LabUsedWidth + LabTotalWidth) Then
  183. '显示不下完整数据
  184. Left = 1
  185. Else
  186. '正常
  187. Left = 2
  188. End If
  189. If RamTextLeft <> Left Then
  190. RamTextLeft = Left
  191. Select Case Left
  192. Case 0
  193. AniStart({
  194. AaOpacity(LabRamUsed, -LabRamUsed.Opacity, 100),
  195. AaOpacity(LabRamTotal, -LabRamTotal.Opacity, 100),
  196. AaOpacity(LabRamUsedTitle, -LabRamUsedTitle.Opacity, 100)
  197. }, "VersionSetup Ram TextLeft")
  198. Case 1
  199. AniStart({
  200. AaOpacity(LabRamUsed, 1 - LabRamUsed.Opacity, 100),
  201. AaOpacity(LabRamTotal, -LabRamTotal.Opacity, 100),
  202. AaOpacity(LabRamUsedTitle, 0.7 - LabRamUsedTitle.Opacity, 100)
  203. }, "VersionSetup Ram TextLeft")
  204. Case 2
  205. AniStart({
  206. AaOpacity(LabRamUsed, 1 - LabRamUsed.Opacity, 100),
  207. AaOpacity(LabRamTotal, 1 - LabRamTotal.Opacity, 100),
  208. AaOpacity(LabRamUsedTitle, 0.7 - LabRamUsedTitle.Opacity, 100)
  209. }, "VersionSetup Ram TextLeft")
  210. End Select
  211. End If
  212. '右侧
  213. Dim Right As Integer
  214. If TotalWidth < LabGameWidth + 2 + RectUsedWidth OrElse TotalWidth < LabGameTitleWidth + 2 + RectUsedWidth Then
  215. '挤到最右边
  216. Right = 0
  217. Else
  218. '正常情况
  219. Right = 1
  220. End If
  221. If Right = 0 Then
  222. If AniControlEnabled = 0 AndAlso (RamTextRight <> Right OrElse AniIsRun("VersionSetup Ram TextRight")) Then
  223. '需要动画
  224. AniStart({
  225. AaX(LabRamGame, TotalWidth - LabGameWidth - LabRamGame.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)),
  226. AaX(LabRamGameTitle, TotalWidth - LabGameTitleWidth - LabRamGameTitle.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak))
  227. }, "VersionSetup Ram TextRight")
  228. Else
  229. '不需要动画
  230. LabRamGame.Margin = New Thickness(TotalWidth - LabGameWidth, 3, 0, 0)
  231. LabRamGameTitle.Margin = New Thickness(TotalWidth - LabGameTitleWidth, 0, 0, 5)
  232. End If
  233. Else
  234. If AniControlEnabled = 0 AndAlso (RamTextRight <> Right OrElse AniIsRun("VersionSetup Ram TextRight")) Then
  235. '需要动画
  236. AniStart({
  237. AaX(LabRamGame, 2 + RectUsedWidth - LabRamGame.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)),
  238. AaX(LabRamGameTitle, 2 + RectUsedWidth - LabRamGameTitle.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak))
  239. }, "VersionSetup Ram TextRight")
  240. Else
  241. '不需要动画
  242. LabRamGame.Margin = New Thickness(2 + RectUsedWidth, 3, 0, 0)
  243. LabRamGameTitle.Margin = New Thickness(2 + RectUsedWidth, 0, 0, 5)
  244. End If
  245. End If
  246. RamTextRight = Right
  247. End Sub
  248. ''' <summary>
  249. ''' 获取当前设置的 RAM 值。单位为 GB。
  250. ''' </summary>
  251. Public Shared Function GetRam(Instance As McInstance, Optional Is32BitJava As Boolean? = Nothing) As Double
  252. '跟随全局设置
  253. If Setup.Get("VersionRamType", Instance:=Instance) = 2 Then
  254. Return PageSetupLaunch.GetRam(Instance, True, Is32BitJava)
  255. End If
  256. '------------------------------------------
  257. ' 修改下方代码时需要一并修改 PageSetupLaunch
  258. '------------------------------------------
  259. '使用当前版本的设置
  260. Dim RamGive As Double
  261. If Setup.Get("VersionRamType", Instance:=Instance) = 0 Then
  262. '自动配置
  263. Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024 * 10) / 10
  264. '确定需求的内存值
  265. Dim RamMininum As Double '无论如何也需要保证的最低限度内存
  266. Dim RamTarget1 As Double '估计能勉强带动了的内存
  267. Dim RamTarget2 As Double '估计没啥问题了的内存
  268. Dim RamTarget3 As Double '安装过多附加组件需要的内存
  269. If Instance IsNot Nothing AndAlso Not Instance.IsLoaded Then Instance.Load()
  270. If Instance IsNot Nothing AndAlso Instance.Modable Then
  271. '可安装 Mod 的版本
  272. Dim ModDir As New DirectoryInfo(Instance.PathIndie & "mods\")
  273. Dim ModCount As Integer = If(ModDir.Exists, ModDir.GetFiles.Length, 0)
  274. RamMininum = 0.5 + ModCount / 150
  275. RamTarget1 = 1.5 + ModCount / 90
  276. RamTarget2 = 2.7 + ModCount / 50
  277. RamTarget3 = 4.5 + ModCount / 25
  278. ElseIf Instance IsNot Nothing AndAlso Instance.Version.HasOptiFine Then
  279. 'OptiFine 版本
  280. RamMininum = 0.5
  281. RamTarget1 = 1.5
  282. RamTarget2 = 3
  283. RamTarget3 = 5
  284. Else
  285. '普通版本
  286. RamMininum = 0.5
  287. RamTarget1 = 1.5
  288. RamTarget2 = 2.5
  289. RamTarget3 = 4
  290. End If
  291. Dim RamDelta As Double
  292. '预分配内存,阶段一,0 ~ T1,100%
  293. RamDelta = RamTarget1
  294. RamGive += Math.Min(RamAvailable, RamDelta)
  295. RamAvailable -= RamDelta
  296. If RamAvailable < 0.1 Then GoTo PreFin
  297. '预分配内存,阶段二,T1 ~ T2,70%
  298. RamDelta = RamTarget2 - RamTarget1
  299. RamGive += Math.Min(RamAvailable * 0.7, RamDelta)
  300. RamAvailable -= RamDelta / 0.7
  301. If RamAvailable < 0.1 Then GoTo PreFin
  302. '预分配内存,阶段三,T2 ~ T3,40%
  303. RamDelta = RamTarget3 - RamTarget2
  304. RamGive += Math.Min(RamAvailable * 0.4, RamDelta)
  305. RamAvailable -= RamDelta / 0.4
  306. If RamAvailable < 0.1 Then GoTo PreFin
  307. '预分配内存,阶段四,T3 ~ T3 * 2,15%
  308. RamDelta = RamTarget3
  309. RamGive += Math.Min(RamAvailable * 0.15, RamDelta)
  310. RamAvailable -= RamDelta / 0.15
  311. If RamAvailable < 0.1 Then GoTo PreFin
  312. PreFin:
  313. '不低于最低值
  314. RamGive = Math.Round(Math.Max(RamGive, RamMininum), 1)
  315. Else
  316. '手动配置
  317. Dim Value As Integer = Setup.Get("VersionRamCustom", Instance:=Instance)
  318. If Value <= 12 Then
  319. RamGive = Value * 0.1 + 0.3
  320. ElseIf Value <= 25 Then
  321. RamGive = (Value - 12) * 0.5 + 1.5
  322. ElseIf Value <= 33 Then
  323. RamGive = (Value - 25) * 1 + 8
  324. Else
  325. RamGive = (Value - 33) * 2 + 16
  326. End If
  327. End If
  328. '若使用 32 位 Java,则限制为 1G
  329. If If(Is32BitJava, Not JavaIs64Bit(PageInstanceLeft.Instance)) Then RamGive = Math.Min(1, RamGive)
  330. Return RamGive
  331. End Function
  332. #End Region
  333. #Region "服务器"
  334. '自动替换标点
  335. Private Sub TextServerEnter_Change() Handles TextServerEnter.TextChanged
  336. Dim NewText = TextServerEnter.Text.Replace(":", ":").Replace("。", ".")
  337. If NewText = TextServerEnter.Text Then Return
  338. Dim CurrentPosition = TextServerEnter.SelectionStart '重设焦点
  339. TextServerEnter.Text = NewText
  340. TextServerEnter.SelectionStart = CurrentPosition
  341. End Sub
  342. '全局
  343. Private ComboServerLoginLast As Integer
  344. Private Sub ComboServerLogin_Changed() Handles ComboServerLogin.SelectionChanged, TextServerNide.ValidatedTextChanged, TextServerAuthServer.ValidatedTextChanged, TextServerAuthRegister.ValidatedTextChanged
  345. If AniControlEnabled <> 0 Then Return
  346. ServerLogin(ComboServerLogin.SelectedIndex)
  347. '检查是否输入正确,正确才触发设置改变
  348. If ComboServerLogin.SelectedIndex = 3 AndAlso Not TextServerNide.IsValidated Then Return
  349. If ComboServerLogin.SelectedIndex = 4 AndAlso Not TextServerAuthServer.IsValidated Then Return
  350. '检查结果是否发生改变,未改变则不触发设置改变
  351. If ComboServerLoginLast = ComboServerLogin.SelectedIndex Then Return
  352. '触发
  353. ComboServerLoginLast = ComboServerLogin.SelectedIndex
  354. ComboChange(ComboServerLogin, Nothing)
  355. End Sub
  356. Public Sub ServerLogin(Type As Integer)
  357. If LabServerNide Is Nothing Then Return
  358. LabServerNide.Visibility = If(Type = 3, Visibility.Visible, Visibility.Collapsed)
  359. TextServerNide.Visibility = If(Type = 3, Visibility.Visible, Visibility.Collapsed)
  360. PanServerNide.Visibility = If(Type = 3, Visibility.Visible, Visibility.Collapsed)
  361. LabServerAuthName.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  362. TextServerAuthName.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  363. LabServerAuthRegister.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  364. TextServerAuthRegister.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  365. LabServerAuthServer.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  366. TextServerAuthServer.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  367. BtnServerAuthLittle.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  368. CardServer.TriggerForceResize()
  369. End Sub
  370. '统一通行证
  371. Private Sub BtnServerNideWeb_Click(sender As Object, e As EventArgs) Handles BtnServerNideWeb.Click
  372. OpenWebsite("https://login.mc-user.com:233/server/intro")
  373. End Sub
  374. 'LittleSkin
  375. Private Sub BtnServerAuthLittle_Click(sender As Object, e As EventArgs) Handles BtnServerAuthLittle.Click
  376. If TextServerAuthServer.Text <> "" AndAlso TextServerAuthServer.Text <> "https://littleskin.cn/api/yggdrasil" AndAlso
  377. MyMsgBox("即将把第三方登录设置覆盖为 LittleSkin 登录。" & vbCrLf & "除非你是服主,或者服主要求你这样做,否则请不要继续。" & vbCrLf & vbCrLf & "是否确实需要覆盖当前设置?",
  378. "设置覆盖确认", "继续", "取消") = 2 Then Return
  379. TextServerAuthServer.Text = "https://littleskin.cn/api/yggdrasil"
  380. TextServerAuthRegister.Text = "https://littleskin.cn/auth/register"
  381. TextServerAuthName.Text = "LittleSkin 登录"
  382. End Sub
  383. #End Region
  384. #Region "Java 选择"
  385. '刷新 Java 下拉框显示
  386. Public Sub RefreshJavaComboBox()
  387. If ComboArgumentJava Is Nothing Then Return
  388. '初始化列表
  389. ComboArgumentJava.Items.Clear()
  390. ComboArgumentJava.Items.Add(New MyComboBoxItem With {.Content = "跟随全局设置", .Tag = "使用全局设置"})
  391. ComboArgumentJava.Items.Add(New MyComboBoxItem With {.Content = "自动选择合适的 Java", .Tag = "自动选择"})
  392. '更新列表
  393. Dim SelectedItem As MyComboBoxItem = Nothing
  394. Dim SelectedBySetup As String = Setup.Get("VersionArgumentJavaSelect", Instance:=PageInstanceLeft.Instance)
  395. Try
  396. For Each Java In JavaList.Clone().OrderByDescending(Function(v) v.MajorVersion)
  397. Dim ListItem = New MyComboBoxItem With {.Content = Java.ToString, .ToolTip = Java.PathFolder, .Tag = Java}
  398. ToolTipService.SetHorizontalOffset(ListItem, 400)
  399. ComboArgumentJava.Items.Add(ListItem)
  400. '判断人为选中
  401. If SelectedBySetup = "" OrElse SelectedBySetup = "使用全局设置" Then Continue For
  402. If JavaEntry.FromJson(GetJson(SelectedBySetup)).PathFolder = Java.PathFolder Then SelectedItem = ListItem
  403. Next
  404. Catch ex As Exception
  405. Setup.Set("VersionArgumentJavaSelect", "使用全局设置", Instance:=PageInstanceLeft.Instance)
  406. Log(ex, "更新版本设置 Java 下拉框失败", LogLevel.Feedback)
  407. End Try
  408. '更新选择项
  409. If SelectedItem Is Nothing AndAlso JavaList.Any Then
  410. If SelectedBySetup = "" Then
  411. SelectedItem = ComboArgumentJava.Items(1) '选中 “自动选择”
  412. Else
  413. SelectedItem = ComboArgumentJava.Items(0) '选中 “跟随全局设置”
  414. End If
  415. End If
  416. ComboArgumentJava.SelectedItem = SelectedItem
  417. '结束处理
  418. If SelectedItem Is Nothing Then
  419. ComboArgumentJava.Items.Clear()
  420. ComboArgumentJava.Items.Add(New ComboBoxItem With {.Content = "未找到可用的 Java", .IsSelected = True})
  421. End If
  422. RefreshRam(True)
  423. End Sub
  424. '阻止在特定情况下展开下拉框
  425. Private Sub ComboArgumentJava_DropDownOpened(sender As Object, e As EventArgs) Handles ComboArgumentJava.DropDownOpened
  426. If ComboArgumentJava.SelectedItem Is Nothing OrElse ComboArgumentJava.Items(0).Content = "未找到可用的 Java" OrElse ComboArgumentJava.Items(0).Content = "加载中……" Then
  427. ComboArgumentJava.IsDropDownOpen = False
  428. End If
  429. End Sub
  430. '下拉框选择更改
  431. Private Sub JavaSelectionUpdate() Handles ComboArgumentJava.SelectionChanged
  432. If AniControlEnabled <> 0 Then Return
  433. 'Java 不可用时也不清空,会导致刷新时找不到对象
  434. If ComboArgumentJava.SelectedItem Is Nothing OrElse ComboArgumentJava.SelectedItem.Tag Is Nothing Then Return
  435. '设置新的 Java
  436. Dim SelectedJava = ComboArgumentJava.SelectedItem.Tag
  437. If "使用全局设置".Equals(SelectedJava) Then
  438. '选择 “自动”
  439. Setup.Set("VersionArgumentJavaSelect", "使用全局设置", Instance:=PageInstanceLeft.Instance)
  440. Log("[Java] 修改版本 Java 选择设置:跟随全局设置")
  441. ElseIf "自动选择".Equals(SelectedJava) Then
  442. '选择 “自动”
  443. Setup.Set("VersionArgumentJavaSelect", "", Instance:=PageInstanceLeft.Instance)
  444. Log("[Java] 修改版本 Java 选择设置:自动选择")
  445. Else
  446. '选择指定项
  447. Setup.Set("VersionArgumentJavaSelect", CType(SelectedJava.ToJson(), JObject).ToString(Newtonsoft.Json.Formatting.None), Instance:=PageInstanceLeft.Instance)
  448. Log("[Java] 修改版本 Java 选择设置:" & SelectedJava.ToString)
  449. End If
  450. RefreshRam(True)
  451. End Sub
  452. #End Region
  453. #Region "其他设置"
  454. '版本隔离警告
  455. Private IsReverting As Boolean = False
  456. Private Sub ComboArgumentIndieV2_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboArgumentIndieV2.SelectionChanged
  457. If AniControlEnabled <> 0 Then Return
  458. If IsReverting Then Return
  459. If MyMsgBox("调整版本隔离后,你可能得把游戏存档、Mod 等文件手动迁移到新的游戏文件夹中。" & vbCrLf &
  460. "如果修改后发现存档消失,把这项设置改回来就能恢复。" & vbCrLf &
  461. "如果你不会迁移存档,不建议修改这项设置!",
  462. "警告", "我知道我在做什么", "取消", IsWarn:=True) = 2 Then
  463. IsReverting = True
  464. ComboArgumentIndieV2.SelectedItem = e.RemovedItems(0)
  465. IsReverting = False
  466. End If
  467. End Sub
  468. #End Region
  469. #Region "高级设置"
  470. Private Sub TextAdvanceRun_TextChanged(sender As Object, e As TextChangedEventArgs) Handles TextAdvanceRun.TextChanged
  471. CheckAdvanceRunWait.Visibility = If(TextAdvanceRun.Text = "", Visibility.Collapsed, Visibility.Visible)
  472. End Sub
  473. #End Region
  474. '切换到全局设置
  475. Private Sub BtnSwitch_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnSwitch.Click
  476. FrmMain.PageChange(FormMain.PageType.Setup, FormMain.PageSubType.SetupLaunch)
  477. End Sub
  478. '去除参数中的回车
  479. Private Sub ReplaceEnter(sender As MyTextBox, e As TextChangedEventArgs) Handles TextAdvanceJvm.TextChanged, TextAdvanceGame.TextChanged
  480. Dim NewText = sender.Text.Replace(vbCrLf, vbCr).Replace(vbLf, vbCr).Replace(vbCr, " ")
  481. If NewText = sender.Text Then Return
  482. Dim CaretIndex = sender.CaretIndex
  483. sender.Text = NewText
  484. sender.CaretIndex = Math.Max(0, CaretIndex - 1)
  485. End Sub
  486. End Class