PageInstanceOverall.xaml.vb 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. Public Class PageInstanceOverall
  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. '更新设置
  7. Reload()
  8. '非重复加载部分
  9. If IsLoad Then Return
  10. IsLoad = True
  11. PanDisplay.TriggerForceResize()
  12. End Sub
  13. Public InstanceHeaderItem As MyListItem
  14. ''' <summary>
  15. ''' 确保当前页面上的信息已正确显示。
  16. ''' </summary>
  17. Private Sub Reload()
  18. AniControlEnabled += 1
  19. '刷新设置项目
  20. ComboDisplayType.SelectedIndex = ReadIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "DisplayType", McInstanceCardType.Auto)
  21. BtnDisplayStar.Text = If(PageInstanceLeft.Instance.IsStar, "从收藏夹中移除", "加入收藏夹")
  22. BtnFolderMods.Visibility = If(PageInstanceLeft.Instance.Modable, Visibility.Visible, Visibility.Collapsed)
  23. '刷新版本显示
  24. PanDisplayItem.Children.Clear()
  25. InstanceHeaderItem = PageInstanceLeft.Instance.ToListItem().Init()
  26. InstanceHeaderItem.IsHitTestVisible = False
  27. PanDisplayItem.Children.Add(InstanceHeaderItem)
  28. FrmMain.PageNameRefresh()
  29. '刷新版本图标
  30. ComboDisplayLogo.SelectedIndex = 0
  31. Dim Logo As String = ReadIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "Logo", "")
  32. Dim LogoCustom As Boolean = ReadIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "LogoCustom", "False")
  33. If LogoCustom Then
  34. For Each Selection As MyComboBoxItem In ComboDisplayLogo.Items
  35. If Selection.Tag = Logo OrElse (Selection.Tag = "PCL\Logo.png" AndAlso Logo.EndsWith("PCL\Logo.png")) Then
  36. ComboDisplayLogo.SelectedItem = Selection
  37. Exit For
  38. End If
  39. Next
  40. End If
  41. AniControlEnabled -= 1
  42. End Sub
  43. #Region "卡片:个性化"
  44. '版本分类
  45. Private Sub ComboDisplayType_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboDisplayType.SelectionChanged
  46. If Not (IsLoad AndAlso AniControlEnabled = 0) Then Return
  47. If ComboDisplayType.SelectedIndex <> 1 Then
  48. '改为不隐藏
  49. Try
  50. '若设置分类为可安装 Mod,则显示正常的 Mod 管理页面
  51. WriteIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "DisplayType", ComboDisplayType.SelectedIndex)
  52. PageInstanceLeft.Instance.DisplayType = ReadIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "DisplayType", McInstanceCardType.Auto)
  53. FrmInstanceLeft.RefreshModDisabled()
  54. WriteIni(McFolderSelected & "PCL.ini", "InstanceCache", "") '要求刷新缓存
  55. LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  56. Catch ex As Exception
  57. Log(ex, "修改版本分类失败(" & PageInstanceLeft.Instance.Name & ")", LogLevel.Feedback)
  58. End Try
  59. Reload() '更新 “打开 Mod 文件夹” 按钮
  60. Else
  61. '改为隐藏
  62. Try
  63. If Not Setup.Get("HintHide") Then
  64. If MyMsgBox("确认要从版本列表中隐藏该版本吗?隐藏该版本后,它将不再出现于 PCL 显示的版本列表中。" & vbCrLf & "此后,在版本列表页面按下 F11 才可以查看被隐藏的版本。", "隐藏版本提示",, "取消") <> 1 Then
  65. ComboDisplayType.SelectedIndex = 0
  66. Return
  67. End If
  68. Setup.Set("HintHide", True)
  69. End If
  70. WriteIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "DisplayType", McInstanceCardType.Hidden)
  71. WriteIni(McFolderSelected & "PCL.ini", "InstanceCache", "") '要求刷新缓存
  72. LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  73. Catch ex As Exception
  74. Log(ex, "隐藏版本 " & PageInstanceLeft.Instance.Name & " 失败", LogLevel.Feedback)
  75. End Try
  76. End If
  77. End Sub
  78. '更改描述
  79. Private Sub BtnDisplayDesc_Click(sender As Object, e As EventArgs) Handles BtnDisplayDesc.Click
  80. Try
  81. Dim OldInfo As String = ReadIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "CustomInfo")
  82. Dim NewInfo As String = MyMsgBoxInput("更改描述", "修改版本的描述文本,留空则使用 PCL 的默认描述。", OldInfo, New ObjectModel.Collection(Of Validate), "默认描述")
  83. If NewInfo IsNot Nothing AndAlso OldInfo <> NewInfo Then WriteIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "CustomInfo", NewInfo)
  84. PageInstanceLeft.Instance = New McInstance(PageInstanceLeft.Instance.Name).Load()
  85. Reload()
  86. LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  87. Catch ex As Exception
  88. Log(ex, "版本 " & PageInstanceLeft.Instance.Name & " 描述更改失败", LogLevel.Msgbox)
  89. End Try
  90. End Sub
  91. '重命名版本
  92. Private Sub BtnDisplayRename_Click(sender As Object, e As EventArgs) Handles BtnDisplayRename.Click
  93. Try
  94. '确认输入的新名称
  95. Dim OldName As String = PageInstanceLeft.Instance.Name
  96. Dim OldPath As String = PageInstanceLeft.Instance.PathVersion
  97. '修改此部分的同时修改快速安装的版本名检测*
  98. Dim NewName As String = MyMsgBoxInput("重命名版本", "", OldName, New ObjectModel.Collection(Of Validate) From {
  99. New ValidateFolderName(McFolderSelected & "versions", IgnoreCase:=False), New ValidateExceptSame(OldName & "_temp", "不能使用该名称!")})
  100. If String.IsNullOrWhiteSpace(NewName) Then Return
  101. Dim NewPath As String = McFolderSelected & "versions\" & NewName & "\"
  102. '获取临时中间名,以防止仅修改大小写的重命名失败
  103. Dim TempName As String = NewName & "_temp"
  104. Dim TempPath As String = McFolderSelected & "versions\" & TempName & "\"
  105. Dim OnlyChangedCase As Boolean = NewName.ToLower = OldName.ToLower
  106. '重新读取版本 JSON 信息,避免 JsonObject 中已被合并的项被重新存储
  107. Dim JsonObject As JObject
  108. Dim OldJsonPath As String = PageInstanceLeft.Instance.GetJsonPath()
  109. Try
  110. JsonObject = GetJson(ReadFile(OldJsonPath))
  111. Catch ex As Exception
  112. Log(ex, "在重命名读取 json 时失败")
  113. JsonObject = PageInstanceLeft.Instance.JsonObject
  114. End Try
  115. '重命名主文件夹
  116. My.Computer.FileSystem.RenameDirectory(OldPath, TempName)
  117. My.Computer.FileSystem.RenameDirectory(TempPath, NewName)
  118. '清理 ini 缓存
  119. IniClearCache(PageInstanceLeft.Instance.PathIndie & "options.txt")
  120. IniClearCache(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini")
  121. '重命名 jar 文件与 natives 文件夹
  122. '不能进行遍历重命名,否则在版本名很短的时候容易误伤其他文件(#6443)
  123. If Directory.Exists($"{NewPath}{OldName}-natives") Then
  124. If OnlyChangedCase Then
  125. My.Computer.FileSystem.RenameDirectory($"{NewPath}{OldName}-natives", $"{OldName}natives_temp")
  126. My.Computer.FileSystem.RenameDirectory($"{NewPath}{OldName}-natives_temp", $"{NewName}-natives")
  127. Else
  128. DeleteDirectory($"{NewPath}{NewName}-natives")
  129. My.Computer.FileSystem.RenameDirectory($"{NewPath}{OldName}-natives", $"{NewName}-natives")
  130. End If
  131. End If
  132. If File.Exists($"{NewPath}{OldName}.jar") Then
  133. If OnlyChangedCase Then
  134. My.Computer.FileSystem.RenameFile($"{NewPath}{OldName}.jar", $"{OldName}_temp.jar")
  135. My.Computer.FileSystem.RenameFile($"{NewPath}{OldName}_temp.jar", $"{NewName}.jar")
  136. Else
  137. File.Delete($"{NewPath}{NewName}.jar")
  138. My.Computer.FileSystem.RenameFile($"{NewPath}{OldName}.jar", $"{NewName}.jar")
  139. End If
  140. End If
  141. '替换版本设置文件中的路径
  142. If File.Exists(NewPath & "PCL\Setup.ini") Then
  143. WriteFile(NewPath & "PCL\Setup.ini", ReadFile(NewPath & "PCL\Setup.ini").Replace(OldPath, NewPath))
  144. End If
  145. '更改已选中的版本
  146. If ReadIni(McFolderSelected & "PCL.ini", "Version") = OldName Then
  147. WriteIni(McFolderSelected & "PCL.ini", "Version", NewName)
  148. End If
  149. '更新版本 Json
  150. Try
  151. JsonObject("id") = NewName
  152. WriteFile(NewPath & NewName & ".json", JsonObject.ToString)
  153. File.Delete(NewPath & GetFileNameFromPath(OldJsonPath))
  154. Catch ex As Exception
  155. Log(ex, "重命名版本 json 失败")
  156. End Try
  157. '刷新与提示
  158. Hint("重命名成功!", HintType.Green)
  159. PageInstanceLeft.Instance = New McInstance(NewName).Load()
  160. If Not IsNothing(McInstanceSelected) AndAlso McInstanceSelected.Equals(PageInstanceLeft.Instance) Then WriteIni(McFolderSelected & "PCL.ini", "Version", NewName)
  161. Reload()
  162. LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  163. Catch ex As Exception
  164. Log(ex, "重命名版本失败", LogLevel.Msgbox)
  165. End Try
  166. End Sub
  167. '版本图标
  168. Private Sub ComboDisplayLogo_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboDisplayLogo.SelectionChanged
  169. If Not (IsLoad AndAlso AniControlEnabled = 0) Then Return
  170. '选择 自定义 时修改图片
  171. Try
  172. If ComboDisplayLogo.SelectedItem Is ItemDisplayLogoCustom Then
  173. Dim FileName As String = SelectFile("常用图片文件(*.png;*.jpeg;*.jpg;*.gif;*.webp)|*.png;*.jpeg;*.jpg;*.gif;*.webp", "选择图片")
  174. If FileName = "" Then
  175. Reload() '还原选项
  176. Return
  177. End If
  178. CopyFile(FileName, PageInstanceLeft.Instance.PathVersion & "PCL\Logo.png")
  179. Else
  180. File.Delete(PageInstanceLeft.Instance.PathVersion & "PCL\Logo.png")
  181. End If
  182. Catch ex As Exception
  183. Log(ex, "更改自定义版本图标失败(" & PageInstanceLeft.Instance.Name & ")", LogLevel.Feedback)
  184. End Try
  185. '进行更改
  186. Try
  187. Dim NewLogo As String = ComboDisplayLogo.SelectedItem.Tag
  188. WriteIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "Logo", NewLogo)
  189. WriteIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "LogoCustom", Not NewLogo = "")
  190. '刷新显示
  191. WriteIni(McFolderSelected & "PCL.ini", "InstanceCache", "") '要求刷新缓存
  192. PageInstanceLeft.Instance = New McInstance(PageInstanceLeft.Instance.Name).Load()
  193. Reload()
  194. LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  195. Catch ex As Exception
  196. Log(ex, "更改版本图标失败(" & PageInstanceLeft.Instance.Name & ")", LogLevel.Feedback)
  197. End Try
  198. End Sub
  199. '收藏夹
  200. Private Sub BtnDisplayStar_Click(sender As Object, e As EventArgs) Handles BtnDisplayStar.Click
  201. Try
  202. WriteIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "IsStar", Not PageInstanceLeft.Instance.IsStar)
  203. PageInstanceLeft.Instance = New McInstance(PageInstanceLeft.Instance.Name).Load()
  204. Reload()
  205. McInstanceListForceRefresh = True
  206. LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  207. Catch ex As Exception
  208. Log(ex, "版本 " & PageInstanceLeft.Instance.Name & " 收藏状态更改失败", LogLevel.Msgbox)
  209. End Try
  210. End Sub
  211. #End Region
  212. #Region "卡片:快捷方式"
  213. '版本文件夹
  214. Private Sub BtnFolderVersion_Click() Handles BtnFolderVersion.Click
  215. OpenInstanceFolder(PageInstanceLeft.Instance)
  216. End Sub
  217. Public Shared Sub OpenInstanceFolder(Instance As McInstance)
  218. OpenExplorer(Instance.PathVersion)
  219. End Sub
  220. '存档文件夹
  221. Private Sub BtnFolderSaves_Click() Handles BtnFolderSaves.Click
  222. Dim FolderPath As String = PageInstanceLeft.Instance.PathIndie & "saves\"
  223. Directory.CreateDirectory(FolderPath)
  224. OpenExplorer(FolderPath)
  225. End Sub
  226. 'Mod 文件夹
  227. Private Sub BtnFolderMods_Click() Handles BtnFolderMods.Click
  228. Dim FolderPath As String = PageInstanceLeft.Instance.PathIndie & "mods\"
  229. Directory.CreateDirectory(FolderPath)
  230. OpenExplorer(FolderPath)
  231. End Sub
  232. #End Region
  233. #Region "卡片:管理"
  234. '导出启动脚本
  235. Private Sub BtnManageScript_Click() Handles BtnManageScript.Click
  236. Try
  237. '弹窗要求指定脚本的保存位置
  238. Dim SavePath As String = SelectSaveFile("选择脚本保存位置", "启动 " & PageInstanceLeft.Instance.Name & ".bat", "批处理文件(*.bat)|*.bat")
  239. If SavePath = "" Then Return
  240. '检查中断(等玩家选完弹窗指不定任务就结束了呢……)
  241. If McLaunchLoader.State = LoadState.Loading Then
  242. Hint("请在当前启动任务结束后再试!", HintType.Red)
  243. Return
  244. End If
  245. '生成脚本
  246. If McLaunchStart(New McLaunchOptions With {.SaveBatch = SavePath, .Instance = PageInstanceLeft.Instance}) Then
  247. If Setup.Get("LoginType") = McLoginType.Legacy Then
  248. Hint("正在导出启动脚本……")
  249. Else
  250. Hint("正在导出启动脚本……(注意,使用脚本启动可能会导致登录失效!)")
  251. End If
  252. End If
  253. Catch ex As Exception
  254. Log(ex, "导出启动脚本失败(" & PageInstanceLeft.Instance.Name & ")", LogLevel.Msgbox)
  255. End Try
  256. End Sub
  257. '补全文件
  258. Private Sub BtnManageCheck_Click(sender As Object, e As EventArgs) Handles BtnManageCheck.Click
  259. Try
  260. '忽略文件检查提示
  261. If ShouldIgnoreFileCheck(PageInstanceLeft.Instance) Then
  262. Hint("请先关闭 [版本设置 → 设置 → 高级启动选项 → 关闭文件校验],然后再尝试补全文件!", HintType.Blue)
  263. Return
  264. End If
  265. '重复任务检查
  266. For Each OngoingLoader In LoaderTaskbar
  267. If OngoingLoader.Name <> PageInstanceLeft.Instance.Name & " 文件补全" Then Continue For
  268. Hint("正在处理中,请稍候!", HintType.Red)
  269. Return
  270. Next
  271. '启动
  272. Dim Loader As New LoaderCombo(Of String)(PageInstanceLeft.Instance.Name & " 文件补全", DlClientFix(PageInstanceLeft.Instance, True, AssetsIndexExistsBehaviour.AlwaysDownload))
  273. Loader.OnStateChanged =
  274. Sub()
  275. Select Case Loader.State
  276. Case LoadState.Finished
  277. Hint(Loader.Name & "成功!", HintType.Green)
  278. Case LoadState.Failed
  279. Hint(Loader.Name & "失败:" & Loader.Error.GetBrief(), HintType.Red)
  280. Case LoadState.Aborted
  281. Hint(Loader.Name & "已取消!", HintType.Blue)
  282. End Select
  283. End Sub
  284. Loader.Start(PageInstanceLeft.Instance.Name)
  285. LoaderTaskbarAdd(Loader)
  286. FrmMain.BtnExtraDownload.ShowRefresh()
  287. FrmMain.BtnExtraDownload.Ribble()
  288. Catch ex As Exception
  289. Log(ex, "尝试补全文件失败(" & PageInstanceLeft.Instance.Name & ")", LogLevel.Msgbox)
  290. End Try
  291. End Sub
  292. '删除版本
  293. '修改此代码时,同时修改 PageSelectRight 中的代码
  294. Private Sub BtnManageDelete_Click(sender As Object, e As EventArgs) Handles BtnManageDelete.Click
  295. Try
  296. Dim IsShiftPressed As Boolean = My.Computer.Keyboard.ShiftKeyDown
  297. Dim IsHintIndie As Boolean = PageInstanceLeft.Instance.State <> McInstanceState.Error AndAlso PageInstanceLeft.Instance.PathIndie <> McFolderSelected
  298. Select Case MyMsgBox($"你确定要{If(IsShiftPressed, "永久", "")}删除版本 {PageInstanceLeft.Instance.Name} 吗?" &
  299. If(IsHintIndie, vbCrLf & "由于该版本开启了版本隔离,删除版本时该版本对应的存档、资源包、Mod 等文件也将被一并删除!", ""),
  300. "版本删除确认", , "取消",, IsHintIndie OrElse IsShiftPressed)
  301. Case 1
  302. IniClearCache(PageInstanceLeft.Instance.PathIndie & "options.txt")
  303. IniClearCache(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini")
  304. If IsShiftPressed Then
  305. DeleteDirectory(PageInstanceLeft.Instance.PathVersion)
  306. Else
  307. FileIO.FileSystem.DeleteDirectory(PageInstanceLeft.Instance.PathVersion, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin)
  308. End If
  309. Hint("已删除版本 " & PageInstanceLeft.Instance.Name & "!", HintType.Green)
  310. Case 2
  311. Return
  312. End Select
  313. LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  314. FrmMain.PageBack()
  315. Catch ex As OperationCanceledException
  316. Log(ex, "删除版本 " & PageInstanceLeft.Instance.Name & " 被主动取消")
  317. Catch ex As Exception
  318. Log(ex, "删除版本 " & PageInstanceLeft.Instance.Name & " 失败", LogLevel.Msgbox)
  319. End Try
  320. End Sub
  321. #End Region
  322. End Class