PageInstanceSetup.xaml.vb 30 KB

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