PageInstanceSetup.xaml.vb 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. Public Class PageInstanceSetup
  2. Private LoadedFirst 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 LoadedFirst Then Return
  13. LoadedFirst = True
  14. 'Java 加载器同步
  15. AddHandler PageInstanceLeft.CurrentJavaWorker.Started, AddressOf UpdateJavaRelatedUi
  16. AddHandler PageInstanceLeft.CurrentJavaWorker.Stopped, AddressOf UpdateJavaRelatedUi
  17. '版本范围校验
  18. TextArgumentJavaRange.ValidateRules = New ObjectModel.Collection(Of Validate) From {New ValidateFunc(
  19. Function(Str As String)
  20. Try
  21. If String.IsNullOrWhiteSpace(Str) Then Return "不能为空"
  22. Dim Range = ValueRange(Of Version).FromString(Str, Function(s) StringUtils.ParseVersionWithDefaults(s))
  23. If Range.IsEmpty Then Return "范围下限的版本号比上限更高,导致该范围无法匹配到任何版本"
  24. If Range.HasLower AndAlso Range.Lower.Major <= 1 AndAlso (Range.Lower.Minor > 0 OrElse Range.Lower.Build > 0 OrElse Range.Lower.Revision > 0) Then Return "不应使用 1.x 格式进行匹配(例如,若想匹配 Java 17,应填写 17 而非 1.17)"
  25. If Range.HasUpper AndAlso Range.Upper.Major <= 1 AndAlso (Range.Upper.Minor > 0 OrElse Range.Upper.Build > 0 OrElse Range.Upper.Revision > 0) Then Return "不应使用 1.x 格式进行匹配(例如,若想匹配 Java 17,应填写 17 而非 1.17)"
  26. If Range.HasUpper AndAlso Range.Upper.Major <= 4 Then Return "该范围所要求的 Java 版本过低"
  27. If Range.HasUpper AndAlso Range.IsUpperInclusive AndAlso Range.Upper.Minor <= 0 AndAlso Range.Upper.Build <= 0 Then Return $"右侧闭区间的意图并不明确。如果不想允许 Java {Range.Upper.Major},请改为 {vbLQ}{Range.Upper.Major}){vbRQ}。如果想允许 Java {Range.Upper.Major},请改为 {vbLQ}{Range.Upper.Major + 1}){vbRQ}。"
  28. If Range.Intersect(ValueRange(Of Version).OpenClosed(New Version(5, 0), New Version(99, 0))).IsEmpty() Then Return "该范围无法匹配到任何常见的 Java"
  29. Return ""
  30. Catch ex As Exception
  31. Return ex.Message
  32. End Try
  33. End Function)}
  34. '内存自动刷新
  35. Dim timer As New Threading.DispatcherTimer With {.Interval = New TimeSpan(0, 0, 0, 1)}
  36. AddHandler timer.Tick, AddressOf RefreshRam
  37. timer.Start()
  38. End Sub
  39. Public Sub Reload()
  40. Try
  41. '启动参数
  42. Dim _unused = PageInstanceLeft.Instance.PathIndie '触发自动判定
  43. ComboArgumentIndieV2.SelectedIndex = If(Settings.Get(Of Boolean)("VersionArgumentIndieV2", Instance:=PageInstanceLeft.Instance), 0, 1)
  44. UpdateJavaList()
  45. '服务器
  46. ComboServerLogin.SelectedIndex = Settings.Get(Of Integer)("VersionServerLogin", Instance:=PageInstanceLeft.Instance)
  47. ComboServerLoginLast = ComboServerLogin.SelectedIndex
  48. UpdateServerLoginUI()
  49. '高级设置
  50. If Settings.Get(Of Integer)("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance) = 2 Then
  51. Logger.Info("已迁移老版本的关闭文件校验设置")
  52. Settings.Reset("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance)
  53. Settings.Set("VersionAdvanceAssetsV2", True, Instance:=PageInstanceLeft.Instance)
  54. End If
  55. SettingService.RefreshSettings(Me)
  56. '游戏内存
  57. OnVersionRamTypeChanged(Settings.Get(Of Integer)("VersionRamType", Instance:=PageInstanceLeft.Instance))
  58. Catch ex As Exception
  59. Logger.Error(ex, "重载版本独立设置时出错")
  60. End Try
  61. End Sub
  62. '初始化
  63. Public Sub Reset()
  64. Try
  65. SettingService.ResetSettings(Me)
  66. Settings.Reset("VersionServerLogin", Instance:=PageInstanceLeft.Instance)
  67. Settings.Reset("VersionArgumentIndieV2", Instance:=PageInstanceLeft.Instance)
  68. Settings.Reset("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance)
  69. Configs.JavaForced.Reset(PageInstanceLeft.Instance.Config)
  70. JavaListRefreshWorker.Start()
  71. Logger.Info("已初始化版本独立设置")
  72. Hint("已初始化版本独立设置!", HintType.Green, False)
  73. Catch ex As Exception
  74. Logger.Error(ex, "初始化版本独立设置失败", LogBehavior.Alert)
  75. End Try
  76. Reload()
  77. End Sub
  78. #Region "游戏内存"
  79. Public Shared Sub OnVersionRamTypeChanged(Type As Integer)
  80. If FrmInstanceSetup Is Nothing Then Return
  81. FrmInstanceSetup.RamType(Type)
  82. End Sub
  83. Public Sub RamType(Type As Integer)
  84. If SliderRamCustom Is Nothing Then Return
  85. SliderRamCustom.IsEnabled = (Type = 1)
  86. End Sub
  87. ''' <summary>
  88. ''' 刷新 UI 上的 RAM 显示。
  89. ''' </summary>
  90. Public Sub RefreshRam(ShowAnim As Boolean)
  91. If LabRamGame Is Nothing OrElse LabRamUsed Is Nothing OrElse FrmMain.PageCurrent <> FormMain.PageType.InstanceSetup OrElse FrmInstanceLeft.PageID <> FormMain.PageSubType.InstanceSetup Then Return
  92. '获取内存情况
  93. Dim RamGame As Double = Math.Round(GetRam(PageInstanceLeft.Instance), 5)
  94. Dim RamTotal As Double = Math.Round(My.Computer.Info.TotalPhysicalMemory / 1024 / 1024 / 1024, 1)
  95. Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024, 1)
  96. Dim RamGameActual As Double = Math.Round(Math.Min(RamGame, RamAvailable), 5)
  97. Dim RamUsed As Double = Math.Round(RamTotal - RamAvailable, 5)
  98. Dim RamEmpty As Double = Math.Round((RamTotal - RamUsed - RamGame).Clamp(0, 1000), 1)
  99. '设置最大可用内存
  100. If RamTotal <= 1.5 Then
  101. SliderRamCustom.MaxValue = Math.Max(Math.Floor((RamTotal - 0.3) / 0.1), 1)
  102. ElseIf RamTotal <= 8 Then
  103. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 1.5) / 0.5) + 12
  104. ElseIf RamTotal <= 16 Then
  105. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 8) / 1) + 25
  106. Else
  107. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 16) / 2) + 33
  108. End If
  109. '设置文本
  110. LabRamGame.Text = If(RamGame = Math.Floor(RamGame), RamGame & ".0", RamGame) & " GB" &
  111. If(RamGame <> RamGameActual, " (可用 " & If(RamGameActual = Math.Floor(RamGameActual), RamGameActual & ".0", RamGameActual) & " GB)", "")
  112. LabRamUsed.Text = If(RamUsed = Math.Floor(RamUsed), RamUsed & ".0", RamUsed) & " GB"
  113. LabRamTotal.Text = " / " & If(RamTotal = Math.Floor(RamTotal), RamTotal & ".0", RamTotal) & " GB"
  114. If ShowAnim Then
  115. '宽度动画
  116. AniStart({
  117. AaGridLengthWidth(ColumnRamUsed, RamUsed - ColumnRamUsed.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
  118. AaGridLengthWidth(ColumnRamGame, RamGameActual - ColumnRamGame.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
  119. AaGridLengthWidth(ColumnRamEmpty, RamEmpty - ColumnRamEmpty.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong))
  120. }, "VersionSetup Ram Grid")
  121. Else
  122. '宽度设置
  123. ColumnRamUsed.Width = New GridLength(RamUsed, GridUnitType.Star)
  124. ColumnRamGame.Width = New GridLength(RamGameActual, GridUnitType.Star)
  125. ColumnRamEmpty.Width = New GridLength(RamEmpty, GridUnitType.Star)
  126. End If
  127. End Sub
  128. Private Sub RefreshRam() Handles SliderRamCustom.Change, RadioRamType0.Check, RadioRamType1.Check, RadioRamType2.Check
  129. RefreshRam(True)
  130. End Sub
  131. Private RamTextLeft As Integer = 2, RamTextRight As Integer = 1
  132. ''' <summary>
  133. ''' 刷新 UI 上的文本位置。
  134. ''' </summary>
  135. Private Sub RefreshRamText() Handles RectRamGame.SizeChanged, RectRamEmpty.SizeChanged, LabRamGame.SizeChanged
  136. '获取宽度信息
  137. Dim RectUsedWidth = RectRamUsed.ActualWidth
  138. Dim TotalWidth = PanRamDisplay.ActualWidth
  139. Dim LabGameWidth = LabRamGame.ActualWidth, LabUsedWidth = LabRamUsed.ActualWidth, LabTotalWidth = LabRamTotal.ActualWidth
  140. Dim LabGameTitleWidth = LabRamGameTitle.ActualWidth, LabUsedTitleWidth = LabRamUsedTitle.ActualWidth
  141. '左侧
  142. Dim Left As Integer
  143. If RectUsedWidth - 30 < LabUsedWidth OrElse RectUsedWidth - 30 < LabUsedTitleWidth Then
  144. '全写不下了
  145. Left = 0
  146. ElseIf RectUsedWidth - 25 < (LabUsedWidth + LabTotalWidth) Then
  147. '显示不下完整数据
  148. Left = 1
  149. Else
  150. '正常
  151. Left = 2
  152. End If
  153. If RamTextLeft <> Left Then
  154. RamTextLeft = Left
  155. Select Case Left
  156. Case 0
  157. AniStart({
  158. AaOpacity(LabRamUsed, -LabRamUsed.Opacity, 100),
  159. AaOpacity(LabRamTotal, -LabRamTotal.Opacity, 100),
  160. AaOpacity(LabRamUsedTitle, -LabRamUsedTitle.Opacity, 100)
  161. }, "VersionSetup Ram TextLeft")
  162. Case 1
  163. AniStart({
  164. AaOpacity(LabRamUsed, 1 - LabRamUsed.Opacity, 100),
  165. AaOpacity(LabRamTotal, -LabRamTotal.Opacity, 100),
  166. AaOpacity(LabRamUsedTitle, 0.7 - LabRamUsedTitle.Opacity, 100)
  167. }, "VersionSetup Ram TextLeft")
  168. Case 2
  169. AniStart({
  170. AaOpacity(LabRamUsed, 1 - LabRamUsed.Opacity, 100),
  171. AaOpacity(LabRamTotal, 1 - LabRamTotal.Opacity, 100),
  172. AaOpacity(LabRamUsedTitle, 0.7 - LabRamUsedTitle.Opacity, 100)
  173. }, "VersionSetup Ram TextLeft")
  174. End Select
  175. End If
  176. '右侧
  177. Dim Right As Integer
  178. If TotalWidth < LabGameWidth + 2 + RectUsedWidth OrElse TotalWidth < LabGameTitleWidth + 2 + RectUsedWidth Then
  179. '挤到最右边
  180. Right = 0
  181. Else
  182. '正常情况
  183. Right = 1
  184. End If
  185. If Right = 0 Then
  186. If AniControlEnabled = 0 AndAlso (RamTextRight <> Right OrElse AniIsRun("VersionSetup Ram TextRight")) Then
  187. '需要动画
  188. AniStart({
  189. AaX(LabRamGame, TotalWidth - LabGameWidth - LabRamGame.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)),
  190. AaX(LabRamGameTitle, TotalWidth - LabGameTitleWidth - LabRamGameTitle.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak))
  191. }, "VersionSetup Ram TextRight")
  192. Else
  193. '不需要动画
  194. LabRamGame.Margin = New Thickness(TotalWidth - LabGameWidth, 3, 0, 0)
  195. LabRamGameTitle.Margin = New Thickness(TotalWidth - LabGameTitleWidth, 0, 0, 5)
  196. End If
  197. Else
  198. If AniControlEnabled = 0 AndAlso (RamTextRight <> Right OrElse AniIsRun("VersionSetup Ram TextRight")) Then
  199. '需要动画
  200. AniStart({
  201. AaX(LabRamGame, 2 + RectUsedWidth - LabRamGame.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)),
  202. AaX(LabRamGameTitle, 2 + RectUsedWidth - LabRamGameTitle.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak))
  203. }, "VersionSetup Ram TextRight")
  204. Else
  205. '不需要动画
  206. LabRamGame.Margin = New Thickness(2 + RectUsedWidth, 3, 0, 0)
  207. LabRamGameTitle.Margin = New Thickness(2 + RectUsedWidth, 0, 0, 5)
  208. End If
  209. End If
  210. RamTextRight = Right
  211. End Sub
  212. ''' <summary>
  213. ''' 获取当前设置的 RAM 值。单位为 GB。
  214. ''' </summary>
  215. Public Shared Function GetRam(Instance As McInstance) As Double
  216. '跟随全局设置
  217. If Settings.Get(Of Integer)("VersionRamType", Instance:=Instance) = 2 Then
  218. Return PageSetupLaunch.GetRam(Instance, True)
  219. End If
  220. '------------------------------------------
  221. ' 修改下方代码时需要一并修改 PageSetupLaunch
  222. '------------------------------------------
  223. '使用当前版本的设置
  224. Dim RamGive As Double
  225. If Settings.Get(Of Integer)("VersionRamType", Instance:=Instance) = 0 Then
  226. '自动配置
  227. Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024 * 10) / 10
  228. '确定需求的内存值
  229. Dim RamMininum As Double '无论如何也需要保证的最低限度内存
  230. Dim RamTarget1 As Double '估计能勉强带动了的内存
  231. Dim RamTarget2 As Double '估计没啥问题了的内存
  232. Dim RamTarget3 As Double '安装过多附加组件需要的内存
  233. If Instance IsNot Nothing AndAlso Not Instance.IsLoaded Then Instance.Load()
  234. If Instance IsNot Nothing AndAlso Instance.Modable Then
  235. '可安装 Mod 的版本
  236. Dim ModDir = DirectoryUtils.GetInfo(Instance.PathIndie & "mods\")
  237. Dim ModCount As Integer = If(ModDir.Exists, ModDir.GetFiles.Count(Function(f) {".jar", ".zip", ".litemod"}.Contains(f.Extension.Lower)), 0)
  238. RamMininum = 0.5 + ModCount / 150
  239. RamTarget1 = 1.5 + ModCount / 90
  240. RamTarget2 = 2.7 + ModCount / 50
  241. RamTarget3 = 4.5 + ModCount / 25
  242. ElseIf Instance IsNot Nothing AndAlso Instance.Version.HasOptiFine Then
  243. 'OptiFine 版本
  244. RamMininum = 0.5
  245. RamTarget1 = 1.5
  246. RamTarget2 = 3
  247. RamTarget3 = 5
  248. Else
  249. '普通版本
  250. RamMininum = 0.5
  251. RamTarget1 = 1.5
  252. RamTarget2 = 2.5
  253. RamTarget3 = 4
  254. End If
  255. Dim RamDelta As Double
  256. '预分配内存,阶段一,0 ~ T1,100%
  257. RamDelta = RamTarget1
  258. RamGive += Math.Min(RamAvailable, RamDelta)
  259. RamAvailable -= RamDelta
  260. If RamAvailable < 0.1 Then GoTo PreFin
  261. '预分配内存,阶段二,T1 ~ T2,70%
  262. RamDelta = RamTarget2 - RamTarget1
  263. RamGive += Math.Min(RamAvailable * 0.7, RamDelta)
  264. RamAvailable -= RamDelta / 0.7
  265. If RamAvailable < 0.1 Then GoTo PreFin
  266. '预分配内存,阶段三,T2 ~ T3,40%
  267. RamDelta = RamTarget3 - RamTarget2
  268. RamGive += Math.Min(RamAvailable * 0.4, RamDelta)
  269. RamAvailable -= RamDelta / 0.4
  270. If RamAvailable < 0.1 Then GoTo PreFin
  271. '预分配内存,阶段四,T3 ~ T3 * 2,15%
  272. RamDelta = RamTarget3
  273. RamGive += Math.Min(RamAvailable * 0.15, RamDelta)
  274. RamAvailable -= RamDelta / 0.15
  275. If RamAvailable < 0.1 Then GoTo PreFin
  276. PreFin:
  277. '不低于最低值
  278. RamGive = Math.Round(Math.Max(RamGive, RamMininum), 1)
  279. Else
  280. '手动配置
  281. Dim Value As Integer = Settings.Get(Of Integer)("VersionRamCustom", Instance:=Instance)
  282. If Value <= 12 Then
  283. RamGive = Value * 0.1 + 0.3
  284. ElseIf Value <= 25 Then
  285. RamGive = (Value - 12) * 0.5 + 1.5
  286. ElseIf Value <= 33 Then
  287. RamGive = (Value - 25) * 1 + 8
  288. Else
  289. RamGive = (Value - 33) * 2 + 16
  290. End If
  291. End If
  292. Return RamGive
  293. End Function
  294. #End Region
  295. #Region "服务器"
  296. '当第三方登录更改时,清空版本列表缓存以更新版本分类
  297. 'TODO: 这会不会导致拖拽改变第三方登录的时候版本列表缓存没有更新?
  298. Public Shared Sub OnVersionServerLoginChanged(Type As Integer)
  299. If FrmInstanceSetup Is Nothing Then Return
  300. WriteIni(McFolderSelected & "PCL.ini", "InstanceCache", "")
  301. If PageInstanceLeft.Instance Is Nothing Then Return
  302. PageInstanceLeft.Instance = New McInstance(PageInstanceLeft.Instance.Name).Load()
  303. LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  304. End Sub
  305. '自动替换标点
  306. Private Sub TextServerEnter_Change() Handles TextServerEnter.TextChanged
  307. Dim NewText = TextServerEnter.Text.Replace(":", ":").Replace("。", ".")
  308. If NewText = TextServerEnter.Text Then Return
  309. Dim CurrentPosition = TextServerEnter.SelectionStart '重设焦点
  310. TextServerEnter.Text = NewText
  311. TextServerEnter.SelectionStart = CurrentPosition
  312. End Sub
  313. '全局
  314. Private ComboServerLoginLast As Integer
  315. Private Sub ComboServerLogin_Changed() Handles ComboServerLogin.SelectionChanged, TextServerNide.ValidatedTextChanged, TextServerAuthServer.ValidatedTextChanged, TextServerAuthRegister.ValidatedTextChanged
  316. If AniControlEnabled <> 0 Then Return
  317. UpdateServerLoginUI()
  318. '检查是否输入正确,正确才触发设置改变
  319. If ComboServerLogin.SelectedIndex = 3 AndAlso Not TextServerNide.IsValidated Then Return
  320. If ComboServerLogin.SelectedIndex = 4 AndAlso Not TextServerAuthServer.IsValidated Then Return
  321. '检查结果是否发生改变,未改变则不触发设置改变
  322. If ComboServerLoginLast = ComboServerLogin.SelectedIndex Then Return
  323. '触发
  324. ComboServerLoginLast = ComboServerLogin.SelectedIndex
  325. Settings.Set("VersionServerLogin", ComboServerLogin.SelectedIndex, Instance:=PageInstanceLeft.Instance)
  326. End Sub
  327. Private Sub UpdateServerLoginUI()
  328. If LabServerNide Is Nothing Then Return
  329. Dim Type = ComboServerLogin.SelectedIndex
  330. LabServerNide.Visibility = If(Type = 3, Visibility.Visible, Visibility.Collapsed)
  331. TextServerNide.Visibility = If(Type = 3, Visibility.Visible, Visibility.Collapsed)
  332. PanServerNide.Visibility = If(Type = 3, Visibility.Visible, Visibility.Collapsed)
  333. LabServerAuthName.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  334. TextServerAuthName.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  335. LabServerAuthRegister.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  336. TextServerAuthRegister.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  337. LabServerAuthServer.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  338. TextServerAuthServer.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  339. BtnServerAuthLittle.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  340. CardServer.TriggerForceResize()
  341. End Sub
  342. 'LittleSkin
  343. Private Sub BtnServerAuthLittle_Click(sender As Object, e As EventArgs) Handles BtnServerAuthLittle.Click
  344. If TextServerAuthServer.Text <> "" AndAlso TextServerAuthServer.Text <> "https://littleskin.cn/api/yggdrasil" AndAlso
  345. MyMsgBox("即将把第三方登录设置覆盖为 LittleSkin 登录。" & vbCrLf & "除非你是服主,或者服主要求你这样做,否则请不要继续。" & vbCrLf & vbCrLf & "是否确实需要覆盖当前设置?",
  346. "设置覆盖确认", "继续", "取消") = 2 Then Return
  347. TextServerAuthServer.Text = "https://littleskin.cn/api/yggdrasil"
  348. TextServerAuthRegister.Text = "https://littleskin.cn/auth/register"
  349. TextServerAuthName.Text = "LittleSkin 登录"
  350. End Sub
  351. #End Region
  352. #Region "Java 主类别和预览"
  353. Private Sub ReloadCurrentJava() Handles ComboArgumentJava.SelectionChanged, TextArgumentJavaRange.ValidatedTextChanged
  354. PageInstanceLeft.ReloadCurrentJava()
  355. End Sub
  356. Private Sub UpdateJavaRelatedUi() Handles ComboArgumentJava.SelectionChanged, TextArgumentJavaRange.TextChanged
  357. RunInUi(AddressOf _UpdateJavaRelatedUi)
  358. End Sub
  359. Private Sub _UpdateJavaRelatedUi()
  360. Dim JavaWorker = PageInstanceLeft.CurrentJavaWorker
  361. Select Case ComboArgumentJava.SelectedIndex
  362. Case 0, 2
  363. HintArgumentJava.Visibility = Visibility.Visible
  364. TextArgumentJavaRange.Visibility = Visibility.Collapsed
  365. PanArgumentJavaSelect.Visibility = Visibility.Collapsed
  366. '显示当前会选择的 Java
  367. If Not JavaWorker.LastSucceeded OrElse JavaWorker.Running Then
  368. If Not JavaWorker.Running Then JavaWorker.Start()
  369. HintArgumentJava.Text = $"正在查找 Java……"
  370. HintArgumentJava.Theme = MyHint.Themes.Blue
  371. ElseIf JavaWorker.LastResult Is Nothing Then
  372. If ComboArgumentJava.SelectedIndex = 0 Then
  373. HintArgumentJava.Text = $"你的电脑上没有可供该版本使用的 Java,PCL 会在启动游戏时自动下载。"
  374. HintArgumentJava.Theme = MyHint.Themes.Yellow
  375. Else
  376. HintArgumentJava.Text = $"该版本的版本文件夹中没有发现任何 Java!{vbCrLf}请点击此处打开版本文件夹,然后将 Java 文件夹复制进去。"
  377. HintArgumentJava.Theme = MyHint.Themes.Red
  378. End If
  379. Else
  380. HintArgumentJava.Text = $"将会使用:{JavaWorker.LastResult}"
  381. HintArgumentJava.Theme = MyHint.Themes.Blue
  382. End If
  383. Case 1
  384. HintArgumentJava.Visibility = Visibility.Visible
  385. TextArgumentJavaRange.Visibility = Visibility.Visible
  386. PanArgumentJavaSelect.Visibility = Visibility.Collapsed
  387. '首次设置
  388. If Not Settings.HasSaved("VersionArgumentJavaRange", PageInstanceLeft.Instance) Then
  389. Dim DefaultRange As String = GetJavaRequirement(PageInstanceLeft.Instance).Range.ToString.Replace("-∞", "").Replace("+∞", "")
  390. Settings.Set("VersionArgumentJavaRange", DefaultRange, PageInstanceLeft.Instance)
  391. TextArgumentJavaRange.Text = DefaultRange
  392. End If
  393. '输入的范围有误
  394. If Not String.IsNullOrEmpty(TextArgumentJavaRange.ValidateResult) Then
  395. HintArgumentJava.Text = $"Java 版本范围错误:{TextArgumentJavaRange.ValidateResult}"
  396. HintArgumentJava.Theme = MyHint.Themes.Red
  397. Return
  398. End If
  399. '显示当前会选择的 Java
  400. If Not JavaWorker.LastSucceeded OrElse JavaWorker.Running Then
  401. If Not JavaWorker.Running Then JavaWorker.Start()
  402. HintArgumentJava.Text = $"正在查找 Java……"
  403. HintArgumentJava.Theme = MyHint.Themes.Blue
  404. ElseIf JavaWorker.LastResult Is Nothing Then
  405. HintArgumentJava.Text = $"你的电脑上没有任何 Java 符合该版本范围!{vbCrLf}如果 Mojang 提供了对应版本的 Java,PCL 会在启动游戏时自动下载。"
  406. HintArgumentJava.Theme = MyHint.Themes.Yellow
  407. Else
  408. HintArgumentJava.Text = $"将会使用:{JavaWorker.LastResult}"
  409. HintArgumentJava.Theme = MyHint.Themes.Blue
  410. End If
  411. Case 3
  412. HintArgumentJava.Visibility = Visibility.Collapsed
  413. TextArgumentJavaRange.Visibility = Visibility.Collapsed
  414. PanArgumentJavaSelect.Visibility = Visibility.Visible
  415. End Select
  416. End Sub
  417. Private Sub HintArgumentJava_Click(sender As Object, e As MouseButtonEventArgs) Handles HintArgumentJava.Click
  418. If ComboArgumentJava.SelectedIndex = 2 Then PageInstanceOverall.OpenInstanceFolder(PageInstanceLeft.Instance)
  419. End Sub
  420. #End Region
  421. #Region "选择特定 Java 的下拉框"
  422. '注意:修改此处代码时需要同时修改 PageSetupLaunch.xaml.vb
  423. '刷新 Java 下拉框显示
  424. Public Sub UpdateJavaList()
  425. If ComboArgumentJavaSelect Is Nothing OrElse LabArgumentJava Is Nothing OrElse Not ComboArgumentJavaSelect.IsLoaded Then Return
  426. ComboArgumentJavaSelect.Items.Clear()
  427. '还需要等待搜索结束
  428. If JavaListRefreshWorker.Running Then
  429. BtnArgumentJavaSearch.IsEnabled = False
  430. ComboArgumentJavaSelect.IsEnabled = False
  431. LabArgumentJava.Text = "搜索中 …"
  432. Return
  433. End If
  434. '========================================== 显示结果 ==========================================
  435. BtnArgumentJavaSearch.IsEnabled = True
  436. ComboArgumentJavaSelect.IsEnabled = True
  437. Dim SelectedJava As Java = Configs.JavaForced.Get(PageInstanceLeft.Instance.Config)
  438. '更新下拉框文本
  439. If Not Configs.JavaList.Get().Any() Then
  440. LabArgumentJava.Text = "未找到 Java,点击以导入已有的 Java"
  441. ElseIf SelectedJava Is Nothing Then
  442. LabArgumentJava.Text = "点击选择 Java …"
  443. Else
  444. LabArgumentJava.Text = SelectedJava.ToString
  445. End If
  446. '更新列表
  447. Try
  448. For Each JavaEntry In Configs.JavaList.Get()
  449. Dim JavaItem As New MyListItem With {
  450. .FontSize = 13, .Height = 24, .IsScaleAnimationEnabled = False, .Type = MyListItem.CheckType.Clickable,
  451. .Tag = JavaEntry, .Title = JavaEntry.ToString}
  452. AddHandler JavaItem.MouseLeftButtonUp, Sub(sender As Object, e As MouseButtonEventArgs) e.Handled = True
  453. AddHandler JavaItem.Click,
  454. Sub()
  455. Configs.JavaForced.Set(JavaEntry, PageInstanceLeft.Instance.Config)
  456. UpdateJavaList()
  457. ComboArgumentJavaSelect.IsDropDownOpen = False
  458. End Sub
  459. ComboArgumentJavaSelect.Items.Add(JavaItem)
  460. Dim Buttons As New List(Of MyIconButton)
  461. '从列表中移除按钮
  462. Dim IsOfficial As Boolean = PathUtils.IsParentOf($"{Paths.AppData}.minecraft\runtime\", JavaEntry.Folder)
  463. Dim DeleteButton As New MyIconButton With {.Logo = Logo.IconButtonStop, .Height = 24, .Width = 24}
  464. DeleteButton.IsEnabled = Not IsOfficial
  465. DeleteButton.ToolTip = If(DeleteButton.IsEnabled, "从列表中移除", "无法移除官方 Java")
  466. AddHandler DeleteButton.Click, Sub() ManuallyRemoveJava(JavaEntry)
  467. ToolTipService.SetShowOnDisabled(DeleteButton, True)
  468. Buttons.Add(DeleteButton)
  469. '打开文件夹按钮
  470. Dim OpenButton As New MyIconButton With {.Logo = Logo.IconButtonOpen, .LogoScale = 1.1, .Height = 24, .Width = 24}
  471. OpenButton.ToolTip = "打开文件夹"
  472. AddHandler OpenButton.Click, Sub() OpenExplorer(JavaEntry.JavaExePath)
  473. Buttons.Add(OpenButton)
  474. JavaItem.Buttons = Buttons
  475. Next
  476. Dim ImportItem As New MyListItem With {
  477. .FontSize = 13, .Height = 24, .IsScaleAnimationEnabled = False, .Title = " 导入电脑中已有的 Java…", .Type = MyListItem.CheckType.Clickable}
  478. AddHandler ImportItem.MouseLeftButtonUp,
  479. Sub(sender As Object, e As MouseButtonEventArgs)
  480. e.Handled = True
  481. ManuallyImportJava()
  482. End Sub
  483. ComboArgumentJavaSelect.Items.Add(ImportItem)
  484. Catch ex As Exception
  485. Logger.Error(ex, "更新 Java 下拉框失败")
  486. End Try
  487. End Sub
  488. Private Sub BtnAdvanceJavaSearch_Click() Handles BtnArgumentJavaSearch.Click
  489. ManuallySearchJava()
  490. End Sub
  491. #End Region
  492. '版本隔离
  493. Private Sub ComboArgumentIndieV2_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboArgumentIndieV2.SelectionChanged
  494. If AniControlEnabled <> 0 Then Return
  495. Static IsReverting As Boolean = False
  496. If IsReverting Then Return
  497. If MyMsgBox("调整版本隔离设置后,你需要游戏存档、Mod 等文件手动迁移到新的游戏文件夹中。" & vbCrLf &
  498. "如果发现存档消失,把这项设置改回来就能恢复。" & vbCrLf &
  499. "如果你不会迁移存档,不建议修改这项设置!",
  500. "警告", "我知道我在做什么", "取消", IsWarn:=True) = 2 Then
  501. IsReverting = True
  502. If e.RemovedItems.Count > 0 Then ComboArgumentIndieV2.SelectedItem = e.RemovedItems(0)
  503. IsReverting = False
  504. End If
  505. '实际应用设置
  506. Settings.Set("VersionArgumentIndieV2", sender.SelectedIndex = 0, Instance:=PageInstanceLeft.Instance)
  507. End Sub
  508. '启动前执行命令
  509. Private Sub TextAdvanceRun_TextChanged(sender As Object, e As TextChangedEventArgs) Handles TextAdvanceRun.TextChanged
  510. CheckAdvanceRunWait.Visibility = (TextAdvanceRun.Text <> "").ToVisibility
  511. End Sub
  512. '切换到全局设置
  513. Private Sub BtnSwitch_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnSwitch.Click
  514. FrmMain.PageChange(FormMain.PageType.Setup, FormMain.PageSubType.SetupLaunch)
  515. End Sub
  516. '去除参数中的回车
  517. Private Sub ReplaceEnter(sender As MyTextBox, e As TextChangedEventArgs) Handles TextAdvanceJvm.TextChanged, TextAdvanceGame.TextChanged
  518. Dim NewText = sender.Text.ReplaceLineEndings(" ", mergeMultiple:=True)
  519. If NewText = sender.Text Then Return
  520. Dim CaretIndex = sender.CaretIndex
  521. sender.Text = NewText
  522. sender.CaretIndex = Math.Max(0, CaretIndex - 1)
  523. End Sub
  524. End Class