PageDownloadCompDetail.xaml.vb 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. Public Class PageDownloadCompDetail
  2. Private CompItem As MyCompItem = Nothing
  3. #Region "加载器"
  4. Private CompFileLoader As New LoaderTask(Of Integer, List(Of CompFile))(
  5. "Comp File",
  6. Sub(Task)
  7. LoadTargetFromAdditional()
  8. Task.Output = CompFilesGet(Project.Id, Project.FromCurseForge)
  9. End Sub)
  10. '初始化加载器信息
  11. Private Sub PageDownloadCompDetail_Inited(sender As Object, e As EventArgs) Handles Me.Initialized
  12. LoadTargetFromAdditional()
  13. PageLoaderInit(Load, PanLoad, PanMain, CardIntro, CompFileLoader, AddressOf Load_OnFinish)
  14. End Sub
  15. Public Sub LoadTargetFromAdditional() Handles Me.Loaded
  16. Project = FrmMain.PageCurrent.Additional(0)
  17. TargetVersion = FrmMain.PageCurrent.Additional(2)
  18. TargetLoader = FrmMain.PageCurrent.Additional(3)
  19. PageType = FrmMain.PageCurrent.Additional(4)
  20. End Sub
  21. Private Project As CompProject
  22. Private TargetVersion As String, TargetLoader As CompModLoaderType
  23. ''' <summary>
  24. ''' 当前页面应展示的内容类别。可能为 Any。
  25. ''' </summary>
  26. Private PageType As CompType
  27. '自动重试
  28. Private Sub Load_State(sender As Object, state As MyLoading.MyLoadingState, oldState As MyLoading.MyLoadingState) Handles Load.StateChanged
  29. Select Case CompFileLoader.State
  30. Case LoadState.Failed
  31. Dim ErrorMessage As String = ""
  32. If CompFileLoader.Error IsNot Nothing Then ErrorMessage = CompFileLoader.Error.Message
  33. If ErrorMessage.Contains("不是有效的 json 文件") Then
  34. Log("[Comp] 下载的文件 json 列表损坏,已自动重试", LogLevel.Debug)
  35. PageLoaderRestart()
  36. End If
  37. End Select
  38. End Sub
  39. '结果 UI 化
  40. Private Class CardSorter
  41. Implements IComparer(Of String)
  42. Public Topmost As String = ""
  43. Public Function Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare
  44. '相同
  45. If x = y Then Return 0
  46. '置顶
  47. If x = Topmost Then Return -1
  48. If y = Topmost Then Return 1
  49. '特殊版本
  50. Dim IsXSpecial As Boolean = x.EndsWithF("版本")
  51. Dim IsYSpecial As Boolean = y.EndsWithF("版本")
  52. If IsXSpecial AndAlso IsYSpecial Then Return x.CompareTo(y)
  53. If IsXSpecial Then Return 1
  54. If IsYSpecial Then Return -1
  55. '比较版本号
  56. Dim VersionCodeSort = -VersionSortInteger(x.Replace(x.BeforeFirst(" ") & " ", ""), y.Replace(y.BeforeFirst(" ") & " ", ""))
  57. If VersionCodeSort <> 0 Then Return VersionCodeSort
  58. '比较全部
  59. Return -VersionSortInteger(x, y)
  60. End Function
  61. Public Sub New(Optional Topmost As String = "")
  62. Me.Topmost = If(Topmost, "")
  63. End Sub
  64. End Class
  65. Private VersionFilter As String
  66. Private IsMajorVersionFilter As Boolean '是否按大版本号筛选(1.21 / 1.20 / 1.19 / ...)而非小版本号(1.21.1 / 1.21 / 1.20.4 / ...)
  67. '筛选类型相同的结果(Modrinth 会返回 Mod、服务端插件、数据包混合的列表)
  68. Private Function GetResults() As List(Of CompFile)
  69. Dim Results As List(Of CompFile) = CompFileLoader.Output
  70. If PageType = CompType.Any Then
  71. Results = Results.Where(Function(r) r.Type <> CompType.Plugin).ToList
  72. Else
  73. Results = Results.Where(Function(r) r.Type = PageType).ToList
  74. End If
  75. Return Results
  76. End Function
  77. Private Sub Load_OnFinish()
  78. Dim Results = GetResults()
  79. '初始化筛选器
  80. Dim VersionFilters As List(Of String)
  81. '按小版本号筛选?
  82. IsMajorVersionFilter = False
  83. VersionFilters = Results.SelectMany(Function(v) v.GameVersions).Select(Function(v) GetGroupedVersionName(v, IsMajorVersionFilter, True)).
  84. Distinct.OrderByDescending(Function(s) s, New VersionComparer).ToList
  85. '按大版本号筛选?
  86. If VersionFilters.Count >= 9 Then
  87. IsMajorVersionFilter = True
  88. VersionFilters = Results.SelectMany(Function(v) v.GameVersions).Select(Function(v) GetGroupedVersionName(v, IsMajorVersionFilter, True)).
  89. Distinct.OrderByDescending(Function(s) s, New VersionComparer).ToList
  90. End If
  91. 'UI 化筛选器
  92. PanFilter.Children.Clear()
  93. If VersionFilters.Count < 2 Then
  94. CardFilter.Visibility = Visibility.Collapsed
  95. VersionFilter = Nothing
  96. Else
  97. CardFilter.Visibility = Visibility.Visible
  98. VersionFilters.Insert(0, "全部")
  99. '转化为按钮
  100. For Each Version As String In VersionFilters
  101. Dim NewButton As New MyRadioButton With {
  102. .Text = Version, .Margin = New Thickness(2, 0, 2, 0), .ColorType = MyRadioButton.ColorState.Highlight}
  103. NewButton.LabText.Margin = New Thickness(-2, 0, 8, 0)
  104. AddHandler NewButton.Check,
  105. Sub(sender As MyRadioButton, raiseByMouse As Boolean)
  106. VersionFilter = If(sender.Text = "全部", Nothing, sender.Text)
  107. UpdateFilterResult()
  108. End Sub
  109. PanFilter.Children.Add(NewButton)
  110. Next
  111. '自动选择
  112. Dim ToCheck As MyRadioButton = Nothing
  113. If TargetVersion <> "" Then
  114. Dim TargetFile = Results.FirstOrDefault(Function(v) v.GameVersions.Contains(TargetVersion))
  115. If TargetFile IsNot Nothing Then
  116. Dim TargetGroup = GetGroupedVersionName(TargetVersion, IsMajorVersionFilter, True)
  117. For Each Button As MyRadioButton In PanFilter.Children
  118. If Button.Text <> TargetGroup Then Continue For
  119. ToCheck = Button
  120. Exit For
  121. Next
  122. End If
  123. End If
  124. If ToCheck Is Nothing Then ToCheck = PanFilter.Children(0)
  125. ToCheck.Checked = True
  126. End If
  127. '更新筛选结果(文件列表 UI 化)
  128. UpdateFilterResult()
  129. End Sub
  130. Private Sub UpdateFilterResult()
  131. Dim Results = GetResults()
  132. Dim TargetCardName As String = If(TargetVersion <> "" OrElse TargetLoader <> CompModLoaderType.Any,
  133. $"所选版本:{If(TargetLoader <> CompModLoaderType.Any, TargetLoader.ToString & " ", "")}{TargetVersion}", "")
  134. '归类到卡片下
  135. Dim Dict As New SortedDictionary(Of String, List(Of CompFile))(New CardSorter(TargetCardName))
  136. Dict.Add("其他版本", New List(Of CompFile))
  137. Dim SupportedLoaders As New List(Of Integer)([Enum].GetValues(GetType(CompModLoaderType)))
  138. For Each Version As CompFile In Results
  139. For Each GameVersion In Version.GameVersions
  140. '检查是否符合版本筛选器
  141. If VersionFilter IsNot Nothing AndAlso
  142. GetGroupedVersionName(GameVersion, IsMajorVersionFilter, True) <> VersionFilter Then Continue For
  143. '决定添加到哪个卡片
  144. Dim VerName As String = GetGroupedVersionName(GameVersion, False, False)
  145. '遍历加入的加载器列表
  146. Dim Loaders As New List(Of String)
  147. If Project.ModLoaders.Count > 1 AndAlso '工程至少有两个加载器
  148. Version.Type = CompType.Mod AndAlso '是 Mod
  149. VerName.StartsWith("1.") Then '不是 “快照版本” 之类的
  150. For Each Loader In Version.ModLoaders
  151. If Loader = CompModLoaderType.Quilt AndAlso Setup.Get("ToolDownloadIgnoreQuilt") Then Continue For
  152. If SupportedLoaders.Contains(Loader) Then Loaders.Add(Loader.ToString & " ")
  153. Next
  154. End If
  155. If Not Loaders.Any() Then Loaders.Add("") '保底加一个空的,确保它在一张卡片里
  156. '实际添加
  157. For Each Loader In Loaders
  158. Dim TargetCard As String = Loader & VerName
  159. If Not Dict.ContainsKey(TargetCard) Then Dict.Add(TargetCard, New List(Of CompFile))
  160. If Not Dict(TargetCard).Contains(Version) Then Dict(TargetCard).Add(Version)
  161. Next
  162. Next
  163. Next
  164. '添加筛选的版本的卡片
  165. If TargetCardName <> "" AndAlso (VersionFilter Is Nothing OrElse GetGroupedVersionName(TargetVersion, IsMajorVersionFilter, True).StartsWithF(VersionFilter)) Then
  166. Dict.Add(TargetCardName, New List(Of CompFile))
  167. For Each Version As CompFile In Results
  168. If Version.GameVersions.Contains(TargetVersion) AndAlso
  169. (TargetLoader = CompModLoaderType.Any OrElse Version.ModLoaders.Contains(TargetLoader)) Then
  170. '检查是否符合版本筛选器
  171. If VersionFilter IsNot Nothing AndAlso
  172. Not Version.GameVersions.Any(Function(v) GetGroupedVersionName(v, IsMajorVersionFilter, True) = VersionFilter) Then Continue For
  173. If Not Dict(TargetCardName).Contains(Version) Then Dict(TargetCardName).Add(Version)
  174. End If
  175. Next
  176. End If
  177. '转化为 UI
  178. Try
  179. PanResults.Children.Clear()
  180. For Each Pair As KeyValuePair(Of String, List(Of CompFile)) In Dict
  181. If Not Pair.Value.Any() Then Continue For
  182. '增加卡片
  183. Dim NewCard As New MyCard With {.Title = Pair.Key, .Margin = New Thickness(0, 0, 0, 15), .SwapType = If(PageType = CompType.ModPack, 9, 8)} '9 是安装,8 是另存为
  184. Dim NewStack As New StackPanel With {.Margin = New Thickness(20, MyCard.SwapedHeight, 18, 0), .VerticalAlignment = VerticalAlignment.Top, .RenderTransform = New TranslateTransform(0, 0), .Tag = Pair.Value}
  185. NewCard.Children.Add(NewStack)
  186. NewCard.SwapControl = NewStack
  187. PanResults.Children.Add(NewCard)
  188. '确定卡片是否展开
  189. If Pair.Key = TargetCardName OrElse
  190. (FrmMain.PageCurrent.Additional IsNot Nothing AndAlso '#2761
  191. CType(FrmMain.PageCurrent.Additional(1), List(Of String)).Contains(NewCard.Title)) Then
  192. MyCard.StackInstall(NewStack, If(PageType = CompType.ModPack, 9, 8), Pair.Key) '9 是安装,8 是另存为
  193. Else
  194. NewCard.IsSwaped = True
  195. End If
  196. '增加提示
  197. If Pair.Key = "其他版本" Then
  198. NewStack.Children.Add(New MyHint With {.Text = "由于版本信息更新缓慢,可能无法识别刚更新的 MC 版本,只需等待几天即可自动恢复正常。", .IsWarn = False, .Margin = New Thickness(0, 0, 0, 7)})
  199. End If
  200. Next
  201. '如果只有一张卡片,展开第一张卡片
  202. If PanResults.Children.Count = 1 Then
  203. CType(PanResults.Children(0), MyCard).IsSwaped = False
  204. End If
  205. Catch ex As Exception
  206. Log(ex, "可视化工程下载列表出错", LogLevel.Feedback)
  207. End Try
  208. End Sub
  209. Private Function GetGroupedVersionName(Name As String, MajorOnly As Boolean, FoldOldRelease As Boolean) As String
  210. If Name Is Nothing Then
  211. Return "其他版本"
  212. ElseIf Name.Contains("w") Then
  213. Return "快照版本"
  214. ElseIf Name.StartsWith("1.0") OrElse Not Name.StartsWith("1.") OrElse (FoldOldRelease AndAlso Val(Name.Split(".")(1)) < 10) Then
  215. Return "远古版本"
  216. Else
  217. Return If(MajorOnly, "1." & Name.Split(".")(1).BeforeFirst(" "), Name)
  218. End If
  219. End Function
  220. #End Region
  221. Private IsFirstInit As Boolean = True
  222. Public Sub Init() Handles Me.PageEnter
  223. AniControlEnabled += 1
  224. Project = FrmMain.PageCurrent.Additional(0)
  225. PanBack.ScrollToHome()
  226. '重启加载器
  227. If IsFirstInit Then
  228. '在 Me.Initialized 已经初始化了加载器,不再重复初始化
  229. IsFirstInit = False
  230. Else
  231. PageLoaderRestart(IsForceRestart:=True)
  232. End If
  233. '放置当前工程
  234. If CompItem IsNot Nothing Then PanIntro.Children.Remove(CompItem)
  235. CompItem = Project.ToCompItem(True, True)
  236. CompItem.CanInteraction = False
  237. CompItem.Margin = New Thickness(-7, -7, 0, 8)
  238. PanIntro.Children.Insert(0, CompItem)
  239. '决定按钮显示
  240. BtnIntroWeb.Text = If(Project.FromCurseForge, "转到 CurseForge", "转到 Modrinth")
  241. BtnIntroWiki.Visibility = If(Project.WikiId = 0, Visibility.Collapsed, Visibility.Visible)
  242. AniControlEnabled -= 1
  243. End Sub
  244. '整合包安装
  245. Public Sub Install_Click(sender As MyListItem, e As EventArgs)
  246. Try
  247. '获取基本信息
  248. Dim File As CompFile = sender.Tag
  249. Dim LoaderName As String = $"{If(Project.FromCurseForge, "CurseForge", "Modrinth")} 整合包下载:{Project.TranslatedName} "
  250. '获取版本名
  251. Dim PackName As String = Project.TranslatedName.Replace(".zip", "").Replace(".rar", "").Replace(".mrpack", "").Replace("\", "\").Replace("/", "/").Replace("|", "|").Replace(":", ":").Replace("<", "<").Replace(">", ">").Replace("*", "*").Replace("?", "?").Replace("""", "").Replace(": ", ":")
  252. Dim Validate As New ValidateFolderName(PathMcFolder & "versions")
  253. If Validate.Validate(PackName) <> "" Then PackName = ""
  254. Dim VersionName As String = MyMsgBoxInput("输入版本名称", "", PackName, New ObjectModel.Collection(Of Validate) From {Validate})
  255. If String.IsNullOrEmpty(VersionName) Then Exit Sub
  256. '构造步骤加载器
  257. Dim Loaders As New List(Of LoaderBase)
  258. Dim Target As String = $"{PathMcFolder}versions\{VersionName}\原始整合包.{If(Project.FromCurseForge, "zip", "mrpack")}"
  259. Dim LogoFileAddress As String = MyImage.GetTempPath(CompItem.Logo)
  260. Loaders.Add(New LoaderDownload("下载整合包文件", New List(Of NetFile) From {File.ToNetFile(Target)}) With {.ProgressWeight = 10, .Block = True})
  261. Loaders.Add(New LoaderTask(Of Integer, Integer)("准备安装整合包",
  262. Sub() ModpackInstall(Target, VersionName, If(IO.File.Exists(LogoFileAddress), LogoFileAddress, Nothing))) With {.ProgressWeight = 0.1})
  263. '启动
  264. Dim Loader As New LoaderCombo(Of String)(LoaderName, Loaders) With {.OnStateChanged =
  265. Sub(MyLoader)
  266. Select Case MyLoader.State
  267. Case LoadState.Failed
  268. Hint(MyLoader.Name & "失败:" & GetExceptionSummary(MyLoader.Error), HintType.Critical)
  269. Case LoadState.Aborted
  270. Hint(MyLoader.Name & "已取消!", HintType.Info)
  271. Case LoadState.Loading
  272. Exit Sub '不重新加载版本列表
  273. End Select
  274. McInstallFailedClearFolder(MyLoader)
  275. End Sub}
  276. Loader.Start(PathMcFolder & "versions\" & VersionName & "\")
  277. LoaderTaskbarAdd(Loader)
  278. FrmMain.BtnExtraDownload.ShowRefresh()
  279. FrmMain.BtnExtraDownload.Ribble()
  280. Catch ex As Exception
  281. Log(ex, "下载资源整合包失败", LogLevel.Feedback)
  282. End Try
  283. End Sub
  284. '资源下载;整合包另存为
  285. Public Shared CachedFolder As String = Nothing '仅在本次缓存的下载文件夹
  286. Public Sub Save_Click(sender As Object, e As EventArgs)
  287. Dim File As CompFile = If(TypeOf sender Is MyListItem, sender, sender.Parent).Tag
  288. RunInNewThread(
  289. Sub()
  290. Try
  291. Dim Desc As String = Nothing
  292. Select Case File.Type
  293. Case CompType.ModPack : Desc = "整合包"
  294. Case CompType.Mod : Desc = "Mod "
  295. Case CompType.ResourcePack : Desc = "资源包"
  296. Case CompType.Shader : Desc = "光影包"
  297. Case CompType.DataPack : Desc = "数据包"
  298. End Select
  299. '确认默认保存位置
  300. Dim DefaultFolder As String = Nothing
  301. If File.Type = CompType.Mod Then
  302. '获取 Mod 所需的加载器种类
  303. Dim AllowForge As Boolean? = Nothing, AllowFabric As Boolean? = Nothing
  304. If File.ModLoaders.Any Then '从文件中获取
  305. AllowForge = File.ModLoaders.Contains(CompModLoaderType.Forge) OrElse File.ModLoaders.Contains(CompModLoaderType.NeoForge)
  306. AllowFabric = File.ModLoaders.Contains(CompModLoaderType.Fabric)
  307. ElseIf Project.ModLoaders.Any Then '从工程中获取
  308. AllowForge = Project.ModLoaders.Contains(CompModLoaderType.Forge) OrElse File.ModLoaders.Contains(CompModLoaderType.NeoForge)
  309. AllowFabric = Project.ModLoaders.Contains(CompModLoaderType.Fabric)
  310. End If
  311. If AllowForge IsNot Nothing AndAlso Not AllowForge AndAlso
  312. AllowFabric IsNot Nothing AndAlso Not AllowFabric Then
  313. AllowForge = Nothing : AllowFabric = Nothing
  314. End If
  315. Log("[Comp] 允许 Forge:" & If(AllowForge, "未知") & ",允许 Fabric:" & If(AllowFabric, "未知"))
  316. '判断某个版本是否符合要求
  317. Dim IsVersionSuitable As Func(Of McVersion, Boolean) =
  318. Function(Version)
  319. If Not Version.IsLoaded Then Version.Load()
  320. If Not Version.Modable Then Return False
  321. If File.GameVersions.Any(Function(v) v.Contains(".")) AndAlso
  322. Not File.GameVersions.Any(Function(v) v.Contains(".") AndAlso v = Version.Version.McName) Then Return False
  323. If AllowForge Is Nothing OrElse AllowFabric Is Nothing Then Return True
  324. If AllowForge AndAlso (Version.Version.HasForge OrElse Version.Version.HasNeoForge) Then Return True
  325. If AllowFabric AndAlso Version.Version.HasFabric Then Return True
  326. Return False
  327. End Function
  328. '获取 Mod 默认下载位置
  329. If CachedFolder IsNot Nothing Then
  330. DefaultFolder = CachedFolder
  331. Log("[Comp] 使用上次下载时的文件夹作为默认下载位置")
  332. ElseIf McVersionCurrent IsNot Nothing AndAlso IsVersionSuitable(McVersionCurrent) Then
  333. DefaultFolder = McVersionCurrent.PathIndie & "mods\"
  334. Directory.CreateDirectory(DefaultFolder)
  335. Log("[Comp] 使用当前版本的 mods 文件夹作为默认下载位置(" & McVersionCurrent.Name & ")")
  336. Else
  337. Dim NeedLoad As Boolean = McVersionListLoader.State <> LoadState.Finished
  338. If NeedLoad Then
  339. Hint("正在查找适合的游戏版本……")
  340. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\", WaitForExit:=True)
  341. End If
  342. Dim SuitableVersions As New List(Of McVersion)
  343. For Each Version As McVersion In McVersionList.Values.SelectMany(Function(l) l)
  344. If IsVersionSuitable(Version) Then SuitableVersions.Add(Version)
  345. Next
  346. If Not SuitableVersions.Any() Then
  347. DefaultFolder = PathMcFolder
  348. If NeedLoad Then
  349. Hint("当前 MC 文件夹中没有找到适合这个 Mod 的版本!")
  350. Else
  351. Log("[Comp] 由于当前版本不兼容,使用当前的 MC 文件夹作为默认下载位置")
  352. End If
  353. Else '选择 Mod 数量最多的版本
  354. Dim SelectedVersion = SuitableVersions.OrderBy(
  355. Function(v)
  356. Dim Info As New DirectoryInfo(v.PathIndie & "mods\")
  357. Return If(Info.Exists, Info.GetFiles().Length, -1)
  358. End Function).LastOrDefault()
  359. DefaultFolder = SelectedVersion.PathIndie & "mods\"
  360. Directory.CreateDirectory(DefaultFolder)
  361. Log("[Comp] 使用适合的游戏版本作为默认下载位置(" & SelectedVersion.Name & ")")
  362. End If
  363. End If
  364. ElseIf File.Type = CompType.ResourcePack OrElse File.Type = CompType.Shader Then
  365. Dim IsVersionSuitable As Func(Of McVersion, Boolean) =
  366. Function(Version)
  367. If Not Version.IsLoaded Then Version.Load()
  368. If File.GameVersions.Any(Function(v) v.Contains(".")) AndAlso
  369. Not File.GameVersions.Any(Function(v) v.Contains(".") AndAlso v = Version.Version.McName) Then Return False
  370. Return False
  371. End Function
  372. If McVersionCurrent IsNot Nothing Then
  373. DefaultFolder = McVersionCurrent.PathIndie & If(File.Type = CompType.ResourcePack, "resourcepacks\", "shaderpacks\")
  374. Directory.CreateDirectory(DefaultFolder)
  375. Log("[Comp] 使用当前版本的对应资源文件夹作为默认下载位置(" & McVersionCurrent.Name & ")")
  376. Else
  377. Dim NeedLoad As Boolean = McVersionListLoader.State <> LoadState.Finished
  378. If NeedLoad Then
  379. Hint("正在查找适合的游戏版本……")
  380. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\", WaitForExit:=True)
  381. End If
  382. Dim SuitableVersions As New List(Of McVersion)
  383. For Each Version As McVersion In McVersionList.Values.SelectMany(Function(l) l)
  384. If IsVersionSuitable(Version) Then SuitableVersions.Add(Version)
  385. Next
  386. If Not SuitableVersions.Any() Then
  387. DefaultFolder = PathMcFolder
  388. If NeedLoad Then
  389. Hint("当前 MC 文件夹中没有找到适合这个资源的版本!")
  390. Else
  391. Log("[Comp] 由于当前版本不兼容,使用当前的 MC 文件夹作为默认下载位置")
  392. End If
  393. Else
  394. Dim SelectedVersion = SuitableVersions.LastOrDefault()
  395. DefaultFolder = SelectedVersion.PathIndie & If(File.Type = CompType.ResourcePack, "resourcepacks\", "shaderpacks\")
  396. Directory.CreateDirectory(DefaultFolder)
  397. Log("[Comp] 使用适合的游戏版本作为默认下载位置(" & SelectedVersion.Name & ")")
  398. End If
  399. End If
  400. End If
  401. '获取基本信息
  402. Dim FileName As String
  403. If Project.TranslatedName = Project.RawName Then
  404. FileName = File.FileName
  405. Else
  406. Dim ChineseName As String = Project.TranslatedName.BeforeFirst(" (").BeforeFirst(" - ").
  407. Replace("\", "\").Replace("/", "/").Replace("|", "|").Replace(":", ":").Replace("<", "<").Replace(">", ">").Replace("*", "*").Replace("?", "?").Replace("""", "").Replace(": ", ":")
  408. Select Case Setup.Get("ToolDownloadTranslateV2")
  409. Case 0
  410. FileName = $"【{ChineseName}】{File.FileName}"
  411. Case 1
  412. FileName = $"[{ChineseName}] {File.FileName}"
  413. Case 2
  414. FileName = $"{ChineseName}-{File.FileName}"
  415. Case 3
  416. FileName = $"{File.FileName}-{ChineseName}"
  417. Case Else
  418. FileName = File.FileName
  419. End Select
  420. End If
  421. RunInUi(
  422. Sub()
  423. '弹窗要求选择保存位置
  424. Dim Target As String
  425. Target = SelectSaveFile("选择保存位置", FileName,
  426. Desc & "文件|" &
  427. If(File.Type = CompType.Mod,
  428. If(File.FileName.EndsWith(".litemod"), "*.litemod", "*.jar"),
  429. If(File.FileName.EndsWith(".mrpack"), "*.mrpack", "*.zip")), DefaultFolder)
  430. If Not Target.Contains("\") Then Exit Sub
  431. '构造步骤加载器
  432. Dim LoaderName As String = Desc & "下载:" & GetFileNameWithoutExtentionFromPath(Target) & " "
  433. If Target <> DefaultFolder AndAlso File.Type = CompType.Mod Then CachedFolder = GetPathFromFullPath(Target)
  434. Dim Loaders As New List(Of LoaderBase)
  435. Loaders.Add(New LoaderDownload("下载文件", New List(Of NetFile) From {File.ToNetFile(Target)}) With {.ProgressWeight = 6, .Block = True})
  436. '启动
  437. Dim Loader As New LoaderCombo(Of Integer)(LoaderName, Loaders) With {.OnStateChanged = AddressOf LoaderStateChangedHintOnly}
  438. Loader.Start(1)
  439. LoaderTaskbarAdd(Loader)
  440. FrmMain.BtnExtraDownload.ShowRefresh()
  441. FrmMain.BtnExtraDownload.Ribble()
  442. End Sub)
  443. Catch ex As Exception
  444. Log(ex, "保存资源文件失败", LogLevel.Feedback)
  445. End Try
  446. End Sub, "Download CompDetail Save")
  447. End Sub
  448. Private Sub BtnIntroWeb_Click(sender As Object, e As EventArgs) Handles BtnIntroWeb.Click
  449. OpenWebsite(Project.Website)
  450. End Sub
  451. Private Sub BtnIntroWiki_Click(sender As Object, e As EventArgs) Handles BtnIntroWiki.Click
  452. OpenWebsite("https://www.mcmod.cn/class/" & Project.WikiId & ".html")
  453. End Sub
  454. Private Sub BtnIntroCopy_Click(sender As Object, e As EventArgs) Handles BtnIntroCopy.Click
  455. ClipboardSet(CompItem.LabTitle.Text & CompItem.LabTitleRaw.Text)
  456. End Sub
  457. End Class