PageVersionOverall.xaml.vb 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. Public Class PageVersionOverall
  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. ItemDisplayLogoCustom.Tag = "PCL\Logo.png"
  8. Reload()
  9. '非重复加载部分
  10. If IsLoad Then Exit Sub
  11. IsLoad = True
  12. PanDisplay.TriggerForceResize()
  13. End Sub
  14. Public ItemVersion As MyListItem
  15. ''' <summary>
  16. ''' 确保当前页面上的信息已正确显示。
  17. ''' </summary>
  18. Private Sub Reload()
  19. AniControlEnabled += 1
  20. '刷新设置项目
  21. ComboDisplayType.SelectedIndex = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", McVersionCardType.Auto)
  22. BtnFolderMods.Visibility = If(PageVersionLeft.Version.Modable, Visibility.Visible, Visibility.Collapsed)
  23. '刷新版本显示
  24. PanDisplayItem.Children.Clear()
  25. ItemVersion = PageSelectRight.McVersionListItem(PageVersionLeft.Version)
  26. ItemVersion.IsHitTestVisible = False
  27. PanDisplayItem.Children.Add(ItemVersion)
  28. FrmMain.PageNameRefresh()
  29. '刷新版本图标
  30. ComboDisplayLogo.SelectedIndex = 0
  31. Dim Logo As String = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "Logo", "")
  32. Dim LogoCustom As Boolean = ReadIni(PageVersionLeft.Version.Path & "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 Exit Sub
  47. If ComboDisplayType.SelectedIndex <> 1 Then
  48. '改为不隐藏
  49. Try
  50. '若设置分类为可安装 Mod,则显示正常的 Mod 管理页面
  51. WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", ComboDisplayType.SelectedIndex)
  52. PageVersionLeft.Version.DisplayType = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", McVersionCardType.Auto)
  53. FrmVersionLeft.RefreshModDisabled()
  54. WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") '要求刷新缓存
  55. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  56. Catch ex As Exception
  57. Log(ex, "修改版本分类失败(" & PageVersionLeft.Version.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. Exit Sub
  67. End If
  68. Setup.Set("HintHide", True)
  69. End If
  70. WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", McVersionCardType.Hidden)
  71. WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") '要求刷新缓存
  72. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  73. Catch ex As Exception
  74. Log(ex, "隐藏版本 " & PageVersionLeft.Version.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(PageVersionLeft.Version.Path & "PCL\Setup.ini", "CustomInfo")
  82. Dim NewInfo As String = MyMsgBoxInput(OldInfo, New ObjectModel.Collection(Of Validate), "留空即为使用默认描述", "更改描述",, "取消")
  83. If NewInfo IsNot Nothing AndAlso OldInfo <> NewInfo Then WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "CustomInfo", NewInfo)
  84. PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
  85. Reload()
  86. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  87. Catch ex As Exception
  88. Log(ex, "版本 " & PageVersionLeft.Version.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 = PageVersionLeft.Version.Name
  96. Dim OldPath As String = PageVersionLeft.Version.Path
  97. '修改此部分的同时修改快速安装的版本名检测*
  98. Dim NewName As String = MyMsgBoxInput(OldName, New ObjectModel.Collection(Of Validate) From {New ValidateFolderName(PathMcFolder & "versions", IgnoreCase:=False)},, "重命名版本",, "取消")
  99. If String.IsNullOrWhiteSpace(NewName) Then Exit Sub
  100. Dim NewPath As String = PathMcFolder & "versions\" & NewName & "\"
  101. '获取临时中间名,以防止仅修改大小写的重命名失败
  102. Dim TempName As String = NewName & "_temp"
  103. Dim TempPath As String = PathMcFolder & "versions\" & TempName & "\"
  104. Dim IsCaseChangedOnly As Boolean = NewName.ToLower = OldName.ToLower
  105. '重新加载版本 Json 信息,避免 HMCL 项被合并
  106. Dim JsonObject As JObject
  107. Try
  108. JsonObject = GetJson(ReadFile(PageVersionLeft.Version.Path & PageVersionLeft.Version.Name & ".json"))
  109. Catch ex As Exception
  110. Log(ex, "重命名读取 Json 时失败")
  111. JsonObject = PageVersionLeft.Version.JsonObject
  112. End Try
  113. '重命名主文件夹
  114. My.Computer.FileSystem.RenameDirectory(OldPath, TempName)
  115. My.Computer.FileSystem.RenameDirectory(TempPath, NewName)
  116. '遍历重命名所有文件与文件夹
  117. For Each Entry As DirectoryInfo In New DirectoryInfo(NewPath).EnumerateDirectories
  118. If Not Entry.Name.Contains(OldName) Then Continue For
  119. If IsCaseChangedOnly Then
  120. My.Computer.FileSystem.RenameDirectory(Entry.FullName, Entry.Name & "_temp")
  121. My.Computer.FileSystem.RenameDirectory(Entry.FullName & "_temp", Entry.Name.Replace(OldName, NewName))
  122. Else
  123. DeleteDirectory(NewPath & Entry.Name.Replace(OldName, NewName))
  124. My.Computer.FileSystem.RenameDirectory(Entry.FullName, Entry.Name.Replace(OldName, NewName))
  125. End If
  126. Next
  127. For Each Entry As FileInfo In New DirectoryInfo(NewPath).EnumerateFiles
  128. If Not Entry.Name.Contains(OldName) Then Continue For
  129. If IsCaseChangedOnly Then
  130. My.Computer.FileSystem.RenameFile(Entry.FullName, Entry.Name & "_temp")
  131. My.Computer.FileSystem.RenameFile(Entry.FullName & "_temp", Entry.Name.Replace(OldName, NewName))
  132. Else
  133. If File.Exists(NewPath & Entry.Name.Replace(OldName, NewName)) Then File.Delete(NewPath & Entry.Name.Replace(OldName, NewName))
  134. My.Computer.FileSystem.RenameFile(Entry.FullName, Entry.Name.Replace(OldName, NewName))
  135. End If
  136. Next
  137. '替换版本设置文件中的路径
  138. If File.Exists(NewPath & "PCL\Setup.ini") Then
  139. WriteFile(NewPath & "PCL\Setup.ini", ReadFile(NewPath & "PCL\Setup.ini").Replace(OldPath, NewPath))
  140. End If
  141. '更改已选中的版本
  142. If ReadIni(PathMcFolder & "PCL.ini", "Version") = OldName Then
  143. WriteIni(PathMcFolder & "PCL.ini", "Version", NewName)
  144. End If
  145. '更改版本 Json
  146. If File.Exists(NewPath & NewName & ".json") Then
  147. Try
  148. JsonObject("id") = NewName
  149. WriteFile(NewPath & NewName & ".json", JsonObject.ToString)
  150. Catch ex As Exception
  151. Log(ex, "重命名 Json 时失败")
  152. End Try
  153. End If
  154. '刷新与提示
  155. Hint("重命名成功!", HintType.Finish)
  156. PageVersionLeft.Version = New McVersion(NewName).Load()
  157. If Not IsNothing(McVersionCurrent) AndAlso McVersionCurrent.Equals(PageVersionLeft.Version) Then WriteIni(PathMcFolder & "PCL.ini", "Version", NewName)
  158. Reload()
  159. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  160. Catch ex As Exception
  161. Log(ex, "重命名版本失败", LogLevel.Msgbox)
  162. End Try
  163. End Sub
  164. '版本图标
  165. Private Sub ComboDisplayLogo_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboDisplayLogo.SelectionChanged
  166. If Not (IsLoad AndAlso AniControlEnabled = 0) Then Exit Sub
  167. '选择 自定义 时修改图片
  168. Try
  169. If ComboDisplayLogo.SelectedItem Is ItemDisplayLogoCustom Then
  170. Dim FileName As String = SelectFile("常用图片文件(*.png;*.jpg;*.gif)|*.png;*.jpg;*.gif", "选择图片")
  171. If FileName = "" Then
  172. Reload() '还原选项
  173. Exit Sub
  174. End If
  175. File.Delete(PageVersionLeft.Version.Path & "PCL\Logo.png")
  176. Directory.CreateDirectory(PageVersionLeft.Version.Path & "PCL") '虽然不知道为啥,有时候真没这文件夹
  177. CopyFile(FileName, PageVersionLeft.Version.Path & "PCL\Logo.png")
  178. Else
  179. File.Delete(PageVersionLeft.Version.Path & "PCL\Logo.png")
  180. End If
  181. Catch ex As Exception
  182. Log(ex, "更改自定义版本图标失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Feedback)
  183. End Try
  184. '进行更改
  185. Try
  186. Dim NewLogo As String = ComboDisplayLogo.SelectedItem.Tag
  187. WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "Logo", NewLogo)
  188. WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "LogoCustom", Not NewLogo = "")
  189. '刷新显示
  190. WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") '要求刷新缓存
  191. PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
  192. Reload()
  193. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  194. Catch ex As Exception
  195. Log(ex, "更改版本图标失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Feedback)
  196. End Try
  197. End Sub
  198. '删除版本
  199. Private Sub BtnDisplayDelete_Click(sender As Object, e As EventArgs) Handles BtnDisplayDelete.Click
  200. '修改此代码时,同时修改 PageSelectRight 中的代码
  201. Try
  202. Dim IsHintIndie As Boolean = PageVersionLeft.Version.State <> McVersionState.Error AndAlso PageVersionLeft.Version.PathIndie <> PathMcFolder
  203. Select Case MyMsgBox("你确定要删除版本 " & PageVersionLeft.Version.Name & " 吗?" &
  204. If(IsHintIndie, vbCrLf & "由于该版本开启了版本隔离,删除版本时该版本对应的存档、资源包、Mod 等文件也将被一并删除!", ""),
  205. "版本删除确认", , "取消",, True)
  206. Case 1
  207. FileIO.FileSystem.DeleteDirectory(PageVersionLeft.Version.Path, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin)
  208. Hint("版本 " & PageVersionLeft.Version.Name & " 已删除到回收站!", HintType.Finish)
  209. Case 2
  210. ' DeleteDirectory(PageVersionLeft.Version.Path)
  211. ' Hint("版本 " & PageVersionLeft.Version.Name & " 已永久删除!", HintType.Finish)
  212. 'Case 3
  213. Exit Sub
  214. End Select
  215. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  216. FrmMain.PageBack()
  217. Catch ex As Exception
  218. Log(ex, "删除版本 " & PageVersionLeft.Version.Name & " 失败", LogLevel.Msgbox)
  219. End Try
  220. End Sub
  221. #End Region
  222. #Region "卡片:快捷方式"
  223. '版本文件夹
  224. Private Sub BtnFolderVersion_Click() Handles BtnFolderVersion.Click
  225. OpenVersionFolder(PageVersionLeft.Version)
  226. End Sub
  227. Public Shared Sub OpenVersionFolder(Version As McVersion)
  228. OpenExplorer("""" & Version.Path & """")
  229. End Sub
  230. '存档文件夹
  231. Private Sub BtnFolderSaves_Click() Handles BtnFolderSaves.Click
  232. Dim FolderPath As String = PageVersionLeft.Version.PathIndie & "saves\"
  233. Directory.CreateDirectory(FolderPath)
  234. OpenExplorer("""" & FolderPath & """")
  235. End Sub
  236. 'Mod 文件夹
  237. Private Sub BtnFolderMods_Click() Handles BtnFolderMods.Click
  238. Dim FolderPath As String = PageVersionLeft.Version.PathIndie & "mods\"
  239. Directory.CreateDirectory(FolderPath)
  240. OpenExplorer("""" & FolderPath & """")
  241. End Sub
  242. #End Region
  243. #Region "卡片:管理"
  244. '导出启动脚本
  245. Private Sub BtnManageScript_Click() Handles BtnManageScript.Click
  246. Try
  247. '弹窗要求指定脚本的保存位置
  248. Dim SavePath As String = SelectAs("选择脚本保存位置", "启动 " & PageVersionLeft.Version.Name & ".bat", "批处理文件(*.bat)|*.bat")
  249. If SavePath = "" Then Exit Sub
  250. '检查中断(等玩家选完弹窗指不定任务就结束了呢……)
  251. If McLaunchLoader.State = LoadState.Loading Then
  252. Hint("请在当前启动任务结束后再试!", HintType.Critical)
  253. Exit Sub
  254. End If
  255. '生成脚本
  256. If McLaunchStart(New McLaunchOptions With {.SaveBatch = SavePath, .Version = PageVersionLeft.Version}) Then
  257. If Setup.Get("LoginType") = McLoginType.Legacy Then
  258. Hint("正在导出启动脚本……")
  259. Else
  260. Hint("正在导出启动脚本……(注意,使用脚本启动可能会导致登录失效!)")
  261. End If
  262. End If
  263. Catch ex As Exception
  264. Log(ex, "导出启动脚本失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Msgbox)
  265. End Try
  266. End Sub
  267. '补全文件
  268. Private Sub BtnManageCheck_Click(sender As Object, e As EventArgs) Handles BtnManageCheck.Click
  269. Try
  270. '重复任务检查
  271. SyncLock LoaderTaskbarLock
  272. For i = 0 To LoaderTaskbar.Count - 1
  273. If LoaderTaskbar(i).Name = PageVersionLeft.Version.Name & " 文件补全" Then
  274. Hint("正在处理中,请稍候!", HintType.Critical)
  275. Exit Sub
  276. End If
  277. Next
  278. End SyncLock
  279. '启动
  280. Dim Loader As New LoaderCombo(Of String)(PageVersionLeft.Version.Name & " 文件补全", DlClientFix(PageVersionLeft.Version, True, AssetsIndexExistsBehaviour.AlwaysDownload, False))
  281. Loader.OnStateChanged = Sub()
  282. Select Case Loader.State
  283. Case LoadState.Finished
  284. Hint(Loader.Name & "成功!", HintType.Finish)
  285. Case LoadState.Failed
  286. Hint(Loader.Name & "失败:" & GetExceptionSummary(Loader.Error), HintType.Critical)
  287. Case LoadState.Aborted
  288. Hint(Loader.Name & "已取消!", HintType.Info)
  289. End Select
  290. End Sub
  291. Loader.Start(PageVersionLeft.Version.Name)
  292. LoaderTaskbarAdd(Loader)
  293. FrmMain.BtnExtraDownload.ShowRefresh()
  294. FrmMain.BtnExtraDownload.Ribble()
  295. Catch ex As Exception
  296. Log(ex, "尝试补全文件失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Msgbox)
  297. End Try
  298. End Sub
  299. #End Region
  300. End Class