PageDownloadCompDetail.xaml.vb 25 KB

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