Public Function Split(FullStr As String, SplitStr As String) As String()
+ If SplitStr.Length = 1 Then
+ Return FullStr.Split(SplitStr(0))
+ Else
+ Return FullStr.Split({SplitStr}, StringSplitOptions.None)
+ End If
+ End Function
'''
''' 获取字符串哈希值。
@@ -1785,46 +1800,71 @@ NextElement:
'''
''' 将时间间隔转换为类似“5 分 10 秒前”的易于阅读的形式。
'''
- Public Function GetTimeSpanString(Span As TimeSpan) As String
+ Public Function GetTimeSpanString(Span As TimeSpan, IsShortForm As Boolean) As String
Dim EndFix = If(Span.TotalMilliseconds > 0, "后", "前")
If Span.TotalMilliseconds < 0 Then Span = -Span
Dim TotalMonthes = Math.Floor(Span.Days / 30)
- If TotalMonthes >= 61 Then
- '5+ 年,“5 年”
- GetTimeSpanString = Math.Floor(TotalMonthes / 12) & " 年"
- ElseIf TotalMonthes >= 12 Then
- '12~60 月,“1 年 2 个月”
- GetTimeSpanString = Math.Floor(TotalMonthes / 12) & " 年" & If((TotalMonthes Mod 12) > 0, " " & (TotalMonthes Mod 12) & " 个月", "")
- ElseIf TotalMonthes >= 4 Then
- '4~11 月,“5 月”
- GetTimeSpanString = TotalMonthes & " 月"
- ElseIf TotalMonthes >= 1 Then
- '1~4 月,“2 月 13 天”
- GetTimeSpanString = TotalMonthes & " 月" & If((Span.Days Mod 30) > 0, " " & (Span.Days Mod 30) & " 天", "")
- ElseIf Span.TotalDays >= 4 Then
- '4~30 天,“23 天”
- GetTimeSpanString = Span.Days & " 天"
- ElseIf Span.TotalDays >= 1 Then
- '1~3 天,“2 天 20 小时”
- GetTimeSpanString = Span.Days & " 天" & If(Span.Hours > 0, " " & Span.Hours & " 小时", "")
- ElseIf Span.TotalHours >= 10 Then
- '10 小时 ~ 1 天,“15 小时”
- GetTimeSpanString = Span.Hours & " 小时"
- ElseIf Span.TotalHours >= 1 Then
- '1~10 小时,“1 小时 20 分钟”
- GetTimeSpanString = Span.Hours & " 小时" & If(Span.Minutes > 0, " " & Span.Minutes & " 分钟", "")
- ElseIf Span.TotalMinutes >= 10 Then
- '10 分钟 ~ 1 小时,“49 分钟”
- GetTimeSpanString = Span.Minutes & " 分钟"
- ElseIf Span.TotalMinutes >= 1 Then
- '1~10 分钟,“9 分 23 秒”
- GetTimeSpanString = Span.Minutes & " 分" & If(Span.Seconds > 0, " " & Span.Seconds & " 秒", "")
- ElseIf Span.TotalSeconds >= 1 Then
- '1 秒 ~ 1 分钟,“23 秒”
- GetTimeSpanString = Span.Seconds & " 秒"
+ If IsShortForm Then
+ If TotalMonthes >= 12 Then
+ '1+ 年,“3 年”
+ GetTimeSpanString = Math.Floor(TotalMonthes / 12) & " 年"
+ ElseIf TotalMonthes >= 2 Then
+ '2~11 月,“5 个月”
+ GetTimeSpanString = TotalMonthes & " 个月"
+ ElseIf Span.TotalDays >= 2 Then
+ '2 天 ~ 2 月,“23 天”
+ GetTimeSpanString = Span.Days & " 天"
+ ElseIf Span.TotalHours >= 1 Then
+ '1 小时 ~ 2 天,“15 小时”
+ GetTimeSpanString = Span.Hours & " 小时"
+ ElseIf Span.TotalMinutes >= 1 Then
+ '1 分钟 ~ 1 小时,“49 分钟”
+ GetTimeSpanString = Span.Minutes & " 分钟"
+ ElseIf Span.TotalSeconds >= 1 Then
+ '1 秒 ~ 1 分钟,“23 秒”
+ GetTimeSpanString = Span.Seconds & " 秒"
+ Else
+ '不到 1 秒
+ GetTimeSpanString = "1 秒"
+ End If
Else
- '不到 1 秒
- GetTimeSpanString = "1 秒"
+ If TotalMonthes >= 61 Then
+ '5+ 年,“5 年”
+ GetTimeSpanString = Math.Floor(TotalMonthes / 12) & " 年"
+ ElseIf TotalMonthes >= 12 Then
+ '12~60 月,“1 年 2 个月”
+ GetTimeSpanString = Math.Floor(TotalMonthes / 12) & " 年" & If((TotalMonthes Mod 12) > 0, " " & (TotalMonthes Mod 12) & " 个月", "")
+ ElseIf TotalMonthes >= 4 Then
+ '4~11 月,“5 月”
+ GetTimeSpanString = TotalMonthes & " 月"
+ ElseIf TotalMonthes >= 1 Then
+ '1~4 月,“2 月 13 天”
+ GetTimeSpanString = TotalMonthes & " 月" & If((Span.Days Mod 30) > 0, " " & (Span.Days Mod 30) & " 天", "")
+ ElseIf Span.TotalDays >= 4 Then
+ '4~30 天,“23 天”
+ GetTimeSpanString = Span.Days & " 天"
+ ElseIf Span.TotalDays >= 1 Then
+ '1~3 天,“2 天 20 小时”
+ GetTimeSpanString = Span.Days & " 天" & If(Span.Hours > 0, " " & Span.Hours & " 小时", "")
+ ElseIf Span.TotalHours >= 10 Then
+ '10 小时 ~ 1 天,“15 小时”
+ GetTimeSpanString = Span.Hours & " 小时"
+ ElseIf Span.TotalHours >= 1 Then
+ '1~10 小时,“1 小时 20 分钟”
+ GetTimeSpanString = Span.Hours & " 小时" & If(Span.Minutes > 0, " " & Span.Minutes & " 分钟", "")
+ ElseIf Span.TotalMinutes >= 10 Then
+ '10 分钟 ~ 1 小时,“49 分钟”
+ GetTimeSpanString = Span.Minutes & " 分钟"
+ ElseIf Span.TotalMinutes >= 1 Then
+ '1~10 分钟,“9 分 23 秒”
+ GetTimeSpanString = Span.Minutes & " 分" & If(Span.Seconds > 0, " " & Span.Seconds & " 秒", "")
+ ElseIf Span.TotalSeconds >= 1 Then
+ '1 秒 ~ 1 分钟,“23 秒”
+ GetTimeSpanString = Span.Seconds & " 秒"
+ Else
+ '不到 1 秒
+ GetTimeSpanString = "1 秒"
+ End If
End If
GetTimeSpanString += EndFix
End Function
@@ -1998,6 +2038,13 @@ NextElement:
End Function
Public Delegate Function CompareThreadStart(Of T)(Left As T, Right As T) As Boolean
+ '''
+ ''' 返回列表的浅表副本。
+ '''
+ Public Function Clone(Of T)(list As IList(Of T)) As IList(Of T)
+ Return New List(Of T)(list)
+ End Function
+
'''
''' 获取程序启动参数。
'''
diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb
index e88b429..9edc80b 100644
--- a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb
+++ b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb
@@ -257,14 +257,14 @@
Case 406 : Tags.Add("世界元素")
Case 407 : Tags.Add("生物群系")
Case 410 : Tags.Add("维度")
- Case 408 : Tags.Add("矿物和资源")
+ Case 408 : Tags.Add("矿物/资源")
Case 409 : Tags.Add("天然结构")
Case 412 : Tags.Add("科技")
- Case 415 : Tags.Add("管道与物流")
+ Case 415 : Tags.Add("管道/物流")
Case 4843 : Tags.Add("自动化")
Case 417 : Tags.Add("能源")
Case 4558 : Tags.Add("红石")
- Case 436 : Tags.Add("食物与烹饪")
+ Case 436 : Tags.Add("食物/烹饪")
Case 416 : Tags.Add("农业")
Case 414 : Tags.Add("运输")
Case 420 : Tags.Add("仓储")
@@ -274,7 +274,7 @@
Case 411 : Tags.Add("生物")
Case 434 : Tags.Add("装备")
Case 423 : Tags.Add("信息显示")
- Case 435 : Tags.Add("多人")
+ Case 435 : Tags.Add("服务器")
Case 5191 : Tags.Add("改良")
Case 421 : Tags.Add("支持库")
'整合包
@@ -292,8 +292,8 @@
Case 5128 : Tags.Add("原版改良")
Case 4487 : Tags.Add("FTB")
Case 4480 : Tags.Add("基于地图")
- Case 4481 : Tags.Add("轻量整合")
- Case 4482 : Tags.Add("大型整合")
+ Case 4481 : Tags.Add("轻量")
+ Case 4482 : Tags.Add("大型")
'FUTURE: Res
End Select
Next
@@ -321,7 +321,7 @@
Website = $"https://modrinth.com/{Data("project_type")}/{Slug}"
'GameVersions
GameVersions = If(CType(Data("versions"), JArray), New JArray).
- Select(Function(v) v.ToString).Where(Function(v) v.Contains("1.")).
+ Select(Function(v) v.ToString).Where(Function(v) v.StartsWith("1.")).
Select(Of Integer)(Function(v) Val(v.Split(".")(1).Split("-").First)).Where(Function(v) v > 0).
Distinct.OrderByDescending(Function(v) v).ToList
'Type
@@ -342,7 +342,7 @@
'Mod
Case "worldgen" : Tags.Add("世界元素")
Case "technology" : Tags.Add("科技")
- Case "food" : Tags.Add("食物与烹饪")
+ Case "food" : Tags.Add("食物/烹饪")
Case "game-mechanics" : Tags.Add("游戏机制")
Case "transportation" : Tags.Add("运输")
Case "storage" : Tags.Add("仓储")
@@ -352,7 +352,7 @@
Case "mobs" : Tags.Add("生物")
Case "equipment" : Tags.Add("装备")
Case "optimization" : Tags.Add("性能优化")
- Case "social" : Tags.Add("多人")
+ Case "social" : Tags.Add("服务器")
Case "utility" : Tags.Add("改良")
Case "library" : Tags.Add("支持库")
'整合包
@@ -365,7 +365,7 @@
Case "magic" : Tags.Add("魔法")
Case "adventure" : Tags.Add("冒险")
Case "kitchen-sink" : Tags.Add("烹饪")
- Case "lightweight" : Tags.Add("轻量整合")
+ Case "lightweight" : Tags.Add("轻量")
'FUTURE: Res
End Select
Next
@@ -409,17 +409,93 @@
SpaVersions.Add("1." & StartVersion & "~1." & EndVersion)
End If
Next
- GameVersionDescription = "[" & Join(SpaVersions, ", ") & "] "
+ GameVersionDescription = SpaVersions.Join(", ")
End If
'实例化 UI
Dim NewItem As New MyCompItem With {.Tag = Me}
- NewItem.LabTitle.Text = TranslatedName
+ '标题
+ Dim FinalName As String = TranslatedName.Split(" | ").First.Split(" - ").First.Split(" (").First.Split(" [").First
+ NewItem.LabTitle.Text = FinalName
+ Dim ExNameList As New List(Of String)
+ If TranslatedName.Contains(" (") Then ExNameList.Add(TranslatedName.Split(" (").Last.Split(")").First)
+ If TranslatedName.Contains(" [") Then ExNameList.Add(TranslatedName.Split(" [").Last.Split("]").First)
+ If TranslatedName.Contains(" - ") Then ExNameList.Add(TranslatedName.Split(" - ").Last.Split(" | ").First.Split(" (").First.Split(" [").First)
+ If TranslatedName.Contains(" | ") Then ExNameList.Add(TranslatedName.Split(" | ").Last.Split(" - ").First.Split(" (").First.Split(" [").First)
+ If ExNameList.Count = 0 Then
+NoExName:
+ CType(NewItem.LabTitleRaw.Parent, StackPanel).Children.Remove(NewItem.LabTitleRaw)
+ Else
+ Dim ExName As String = ""
+ For Each Ex In ExNameList
+ '去除 “Forge/Fabric” 一类的无意义提示
+ If Ex.Length < 19 AndAlso Ex.ToLower.Contains("fabric") AndAlso Ex.ToLower.Contains("forge") Then Continue For
+ '将 “Forge” 等提示改为 “Forge 版”
+ If (Ex.ToLower.Contains("forge") OrElse Ex.ToLower.Contains("fabric") OrElse Ex.ToLower.Contains("quilt")) AndAlso
+ Not Ex.Contains("版") AndAlso Ex.Length < 19 Then Ex = Ex.Replace("Edition", "").Trim & " 版"
+ ExName &= " | " & Ex.Trim
+ Next
+ If ExName = "" Then GoTo NoExName
+ NewItem.LabTitleRaw.Text = ExName
+ End If
+ 'Tag
+ For Each TagText In Tags
+ Dim NewTag = GetObjectFromXML(
+ "
+
+ ")
+ NewItem.PanTags.Children.Add(NewTag)
+ Next
+ '下边栏
+ If Not ShowMcVersionDesc AndAlso Not ShowLoaderDesc Then
+ '全部隐藏
+ CType(NewItem.PathVersion.Parent, Grid).Children.Remove(NewItem.PathVersion)
+ CType(NewItem.LabVersion.Parent, Grid).Children.Remove(NewItem.LabVersion)
+ NewItem.ColumnVersionMargin.Width = New GridLength(0)
+ ElseIf ShowMcVersionDesc AndAlso ShowMcVersionDesc Then
+ '全部显示
+ Dim ModLoaderDesc As String = If(ModLoaders.Count > 0 AndAlso ModLoaders.Count < 3 AndAlso
+ Not (Type = CompType.Mod AndAlso Setup.Get("ToolDownloadIgnoreQuilt") AndAlso ModLoaders.Contains(CompModLoaderType.Forge) AndAlso ModLoaders.Contains(CompModLoaderType.Fabric)),
+ ModLoaders.Join(" / ") & " ", "")
+ Dim VersionDesc As String = If(GameVersionDescription = "1.7+", "全版本", GameVersionDescription)
+ NewItem.LabVersion.Text = ModLoaderDesc & VersionDesc
+ ElseIf ShowMcVersionDesc Then
+ '仅显示版本
+ NewItem.LabVersion.Text = If(GameVersionDescription = "1.7+", "全版本", GameVersionDescription)
+ Else
+ '仅显示 Mod 加载器
+ Select Case ModLoaders.Count
+ Case 0
+ NewItem.LabVersion.Text = "未知"
+ Case 1
+ NewItem.LabVersion.Text = If(Type = CompType.Mod, "仅 ", "") & ModLoaders(0).ToString
+ Case 2
+ If Type = CompType.Mod Then
+ NewItem.LabVersion.Text =
+ If(Not (Setup.Get("ToolDownloadIgnoreQuilt") AndAlso
+ ModLoaders.Contains(CompModLoaderType.Forge) AndAlso ModLoaders.Contains(CompModLoaderType.Fabric)),
+ ModLoaders.Join(" / "), "任意")
+ Else
+ NewItem.LabVersion.Text = ModLoaders.Join(" / ")
+ End If
+ Case 3
+ If Type = CompType.Mod Then
+ NewItem.LabVersion.Text = "任意"
+ Else
+ NewItem.LabVersion.Text = ModLoaders.Join(" / ")
+ End If
+ End Select
+ End If
NewItem.LabInfo.Text = Description.Replace(vbCr, "").Replace(vbLf, "")
- NewItem.LabLeft.Text = (If(ModLoaders.Count > 0 AndAlso ShowLoaderDesc, "[" & Join(ModLoaders.Select(Function(m) GetStringFromEnum(m)).ToList, "/") & "] ", "") &
- If(ShowMcVersionDesc, GameVersionDescription, "")).Replace("] [", " ") &
- If(FromCurseForge, "[CurseForge] ", "[Modrinth] ") &
- Join(Tags, ",") &
- If(LastUpdate IsNot Nothing, " (" & GetTimeSpanString(LastUpdate - Date.Now) & "更新)", "")
+ NewItem.LabSource.Text = If(FromCurseForge, "CurseForge", "Modrinth")
+ If LastUpdate IsNot Nothing Then
+ NewItem.LabTime.Text = GetTimeSpanString(LastUpdate - Date.Now, True)
+ End If
+ NewItem.LabDownload.Text =
+ If(DownloadCount > 100000000, Math.Round(DownloadCount / 100000000, 2) & " 亿",
+ If(DownloadCount > 100000, Math.Floor(DownloadCount / 10000) & " 万", DownloadCount))
+ '其他
If LogoUrl Is Nothing Then
NewItem.Logo = "pack://application:,,,/images/Icons/NoIcon.png"
Else
@@ -551,7 +627,7 @@
If Tag.StartsWith("/") Then Storage.CurseForgeTotal = 0
If Storage.CurseForgeTotal > -1 AndAlso Storage.CurseForgeTotal <= Storage.CurseForgeOffset Then Return Nothing
'应用筛选参数
- Dim Address As String = $"https://api.curseforge.com/v1/mods/search?gameId=432&sortField=Featured&sortOrder=desc&pageSize={CompPageSize}"
+ Dim Address As String = $"https://api.curseforge.com/v1/mods/search?gameId=432&sortField=2&sortOrder=desc&pageSize={CompPageSize}"
Select Case Type
Case CompType.Mod
Address += "&classId=6"
@@ -633,13 +709,18 @@
''' 根据搜索请求获取一系列的工程列表。需要基于加载器运行。
'''
Public Sub CompProjectsGet(Task As LoaderTask(Of CompProjectRequest, Integer))
+ Dim Storage = Task.Input.Storage '避免多线程问题
If Task.Input.Storage.Results.Count >= Task.Input.TargetResultCount Then
Log($"[Comp] 已有 {Task.Input.Storage.Results.Count} 个结果,多于所需的 {Task.Input.TargetResultCount} 个结果,结束处理")
Exit Sub
ElseIf Not Task.Input.CanContinue Then
- Log($"[Comp] 已有 {Task.Input.Storage.Results.Count} 个结果,少于所需的 {Task.Input.TargetResultCount} 个结果,但无法继续获取,结束处理")
- Exit Sub
+ If Task.Input.Storage.Results.Count = 0 Then
+ Throw New Exception("没有符合条件的结果")
+ Else
+ Log($"[Comp] 已有 {Task.Input.Storage.Results.Count} 个结果,少于所需的 {Task.Input.TargetResultCount} 个结果,但无法继续获取,结束处理")
+ Exit Sub
+ End If
End If
#Region "拒绝 1.13- Quilt(这个版本根本没有 Quilt)"
@@ -658,9 +739,8 @@
Log("[Comp] 工程列表搜索原始文本:" & RawFilter)
'中文请求关键字处理
- Dim IsChineseSearch As Boolean = RegexCheck(RawFilter, "[\u4e00-\u9fbb]")
- If IsChineseSearch AndAlso Not String.IsNullOrEmpty(RawFilter) Then
- If Task.Input.Type <> CompType.Mod Then Throw New Exception($"{If(Task.Input.Type = CompType.ModPack, "整合包", "资源包")}搜索仅支持英文")
+ Dim IsChineseSearch As Boolean = RegexCheck(RawFilter, "[\u4e00-\u9fbb]") AndAlso Not String.IsNullOrEmpty(RawFilter)
+ If IsChineseSearch AndAlso Task.Input.Type = CompType.Mod Then
'构造搜索请求
Dim SearchEntries As New List(Of SearchEntry(Of CompDatabaseEntry))
For Each Entry In CompDatabase
@@ -680,7 +760,7 @@
If Not SearchResults(i).AbsoluteRight AndAlso i >= Math.Min(2, SearchResults.Count - 1) Then Exit For '把 3 个结果拼合以提高准确度
If SearchResults(i).Item.CurseForgeSlug IsNot Nothing Then SearchResult += SearchResults(i).Item.CurseForgeSlug.Replace("-", " ") & " "
If SearchResults(i).Item.ModrinthSlug IsNot Nothing Then SearchResult += SearchResults(i).Item.ModrinthSlug.Replace("-", " ") & " "
- SearchResult += SearchResults(i).Item.ChineseName.Replace(" (", "|").Split("|").Last.TrimEnd(") ").Replace(" - ", "§").Split("§").First.
+ SearchResult += SearchResults(i).Item.ChineseName.Split(" (").Last.TrimEnd(") ").Split(" - ").First.
Replace(":", "").Replace("(", "").Replace(")", "").ToLower & " "
Next
Log("[Comp] 中文搜索原始关键词:" & SearchResult, LogLevel.Developer)
@@ -728,13 +808,13 @@
Dim RealResults As New List(Of CompProject)
Retry:
Dim RawResults As New List(Of CompProject)
+ Dim [Error] As Exception = Nothing
#Region "从 CurseForge 和 Modrinth 获取结果列表,存储于 RawResults"
Dim CurseForgeThread As Thread = Nothing
Dim ModrinthThread As Thread = Nothing
Dim ResultsLock As New Object
- Dim [Error] As Exception = Nothing
Try
@@ -756,11 +836,12 @@ Retry:
SyncLock ResultsLock
RawResults.AddRange(ProjectList)
End SyncLock
- Task.Input.Storage.CurseForgeOffset += ProjectList.Count
- Task.Input.Storage.CurseForgeTotal = RequestResult("pagination")("totalCount").ToObject(Of Integer)
- Log($"[Comp] 从 CurseForge 获取到了 {ProjectList.Count} 个工程(已获取 {Task.Input.Storage.CurseForgeOffset} 个,共 {Task.Input.Storage.CurseForgeTotal} 个)")
+ Storage.CurseForgeOffset += ProjectList.Count
+ Storage.CurseForgeTotal = RequestResult("pagination")("totalCount").ToObject(Of Integer)
+ Log($"[Comp] 从 CurseForge 获取到了 {ProjectList.Count} 个工程(已获取 {Storage.CurseForgeOffset} 个,共 {Storage.CurseForgeTotal} 个)")
Catch ex As Exception
Log(ex, "从 CurseForge 获取工程列表失败")
+ Storage.CurseForgeTotal = Storage.CurseForgeOffset
[Error] = ex
End Try
End Sub, "CurseForge Project Request")
@@ -783,11 +864,12 @@ Retry:
SyncLock ResultsLock
RawResults.AddRange(ProjectList)
End SyncLock
- Task.Input.Storage.ModrinthOffset += ProjectList.Count
- Task.Input.Storage.ModrinthTotal = RequestResult("total_hits").ToObject(Of Integer)
- Log($"[Comp] 从 Modrinth 获取到了 {ProjectList.Count} 个工程(已获取 {Task.Input.Storage.ModrinthOffset} 个,共 {Task.Input.Storage.ModrinthTotal} 个)")
+ Storage.ModrinthOffset += ProjectList.Count
+ Storage.ModrinthTotal = RequestResult("total_hits").ToObject(Of Integer)
+ Log($"[Comp] 从 Modrinth 获取到了 {ProjectList.Count} 个工程(已获取 {Storage.ModrinthOffset} 个,共 {Storage.ModrinthTotal} 个)")
Catch ex As Exception
Log(ex, "从 Modrinth 获取工程列表失败")
+ Storage.ModrinthTotal = Storage.ModrinthOffset
[Error] = ex
End Try
End Sub, "Modrinth Project Request")
@@ -797,13 +879,18 @@ Retry:
If CurseForgeThread IsNot Nothing Then CurseForgeThread.Join()
If Task.IsAborted Then Exit Sub '会自动触发 Finally
If ModrinthThread IsNot Nothing Then ModrinthThread.Join()
+ If Task.IsAborted Then Exit Sub
'确认存在结果
If RawResults.Count = 0 Then
If [Error] IsNot Nothing Then
Throw [Error]
Else
- Throw New Exception("没有符合条件的结果")
+ If IsChineseSearch AndAlso Task.Input.Type <> CompType.Mod Then
+ Throw New Exception($"{If(Task.Input.Type = CompType.ModPack, "整合包", "资源包")}搜索仅支持英文")
+ Else
+ Throw New Exception("没有符合条件的结果")
+ End If
End If
End If
@@ -823,7 +910,7 @@ Retry:
RawResults = Distinct(RawResults, Function(a, b) a.IsLike(b))
'已有内容去重
RawResults = RawResults.Where(Function(r) Not RealResults.Any(Function(b) r.IsLike(b)) AndAlso
- Not Task.Input.Storage.Results.Any(Function(b) r.IsLike(b))).ToList
+ Not Storage.Results.Any(Function(b) r.IsLike(b))).ToList
'加入列表
RealResults.AddRange(RawResults)
Log($"[Comp] 去重后累计新增结果 {RealResults.Count} 个")
@@ -832,8 +919,8 @@ Retry:
#Region "检查结果数量,如果不足且可继续,会继续加载下一页"
- If RealResults.Count + Task.Input.Storage.Results.Count < Task.Input.TargetResultCount Then
- Log($"[Comp] 总结果数需求最少 {Task.Input.TargetResultCount} 个,仅获得了 {RealResults.Count + Task.Input.Storage.Results.Count} 个")
+ If RealResults.Count + Storage.Results.Count < Task.Input.TargetResultCount Then
+ Log($"[Comp] 总结果数需求最少 {Task.Input.TargetResultCount} 个,仅获得了 {RealResults.Count + Storage.Results.Count} 个")
If Task.Input.CanContinue Then
Log("[Comp] 将继续尝试加载下一页")
GoTo Retry
@@ -869,7 +956,7 @@ Retry:
Next
End If
'根据排序分得出结果并添加
- Task.Input.Storage.Results.AddRange(
+ Storage.Results.AddRange(
Sort(Scores.ToList, Function(a, b) a.Value > b.Value).Select(Function(r) r.Key).ToList)
#End Region
@@ -1094,7 +1181,7 @@ Retry:
If DownloadCount > 0 Then 'CurseForge 的下载次数经常错误地返回 0
Info += If(DownloadCount > 100000, Math.Round(DownloadCount / 10000) & " 万次下载,", DownloadCount & " 次下载,")
End If
- Info += GetTimeSpanString(ReleaseDate - Date.Now) & "更新"
+ Info += GetTimeSpanString(ReleaseDate - Date.Now, False) & "更新"
Info += If(Status = CompFileStatus.Release, "", "," & StatusDescription)
'建立控件
@@ -1224,7 +1311,7 @@ Retry:
Stack.Children.Add(New TextBlock With {.Text = "前置 Mod", .FontSize = 14, .HorizontalAlignment = HorizontalAlignment.Left, .Margin = New Thickness(6, 2, 0, 5)})
'添加前置 Mod 列表
For Each Dep In Deps
- Dim Item = CompProjectCache(Dep).ToCompItem(False, True, AddressOf FrmDownloadMod.ProjectClick)
+ Dim Item = CompProjectCache(Dep).ToCompItem(True, True, AddressOf FrmDownloadMod.ProjectClick)
Stack.Children.Add(Item)
Next
'添加结尾间隔
diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb
index 75429ec..bdf6640 100644
--- a/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb
+++ b/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb
@@ -86,9 +86,9 @@
For Each FilePath In RightLogs
Try
If FilePath.Contains("crash-") Then
- AnalyzeRawFiles.Add(New KeyValuePair(Of String, String())(FilePath, ReadFile(FilePath).Replace(vbCrLf, vbCr).Replace(vbLf, vbCr).Split(vbCr)))
+ AnalyzeRawFiles.Add(New KeyValuePair(Of String, String())(FilePath, ReadFile(FilePath).Split(vbCrLf.ToCharArray)))
Else
- AnalyzeRawFiles.Add(New KeyValuePair(Of String, String())(FilePath, ReadFile(FilePath, Encoding.UTF8).Replace(vbCrLf, vbCr).Replace(vbLf, vbCr).Split(vbCr)))
+ AnalyzeRawFiles.Add(New KeyValuePair(Of String, String())(FilePath, ReadFile(FilePath, Encoding.UTF8).Split(vbCrLf.ToCharArray)))
End If
Catch ex As Exception
Log(ex, "读取可能的崩溃日志文件失败(" & FilePath & ")")
@@ -133,9 +133,9 @@
Dim Ext As String = TargetFile.Extension.ToLower
If Ext = ".log" OrElse Ext = ".txt" Then
If TargetFile.Name.StartsWith("crash-") Then
- AnalyzeRawFiles.Add(New KeyValuePair(Of String, String())(TargetFile.FullName, ReadFile(TargetFile.FullName).Replace(vbCrLf, vbCr).Replace(vbLf, vbCr).Split(vbCr)))
+ AnalyzeRawFiles.Add(New KeyValuePair(Of String, String())(TargetFile.FullName, ReadFile(TargetFile.FullName).Split(vbCrLf.ToCharArray)))
Else
- AnalyzeRawFiles.Add(New KeyValuePair(Of String, String())(TargetFile.FullName, ReadFile(TargetFile.FullName, Encoding.UTF8).Replace(vbCrLf, vbCr).Replace(vbLf, vbCr).Split(vbCr)))
+ AnalyzeRawFiles.Add(New KeyValuePair(Of String, String())(TargetFile.FullName, ReadFile(TargetFile.FullName, Encoding.UTF8).Split(vbCrLf.ToCharArray)))
End If
End If
Catch ex As Exception
@@ -377,7 +377,7 @@
'来源崩溃日志的分析
If LogCrash IsNot Nothing Then
Log("[Crash] 开始进行崩溃日志堆栈分析")
- Dim StackLogs As String = LogCrash.Replace("System Details", "¨").Split("¨").First
+ Dim StackLogs As String = LogCrash.Split("System Details").First
Dim Keywords = AnalyzeStackKeyword(StackLogs)
If Keywords.Count > 0 Then
Dim Names = AnalyzeModName(Keywords)
diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb
index 1367161..daf8d9e 100644
--- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb
+++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb
@@ -622,7 +622,7 @@
Dim Versions As New List(Of DlForgeVersionEntry)
Try
'分割版本信息
- Dim VersionCodes = Mid(Result, 1, Result.LastIndexOf("")).Replace("| ")).Split(" | [\s]*)[^<]+")
- Branch = RegexSeek(If(Branch, ""), "[^\s]+")
+ Dim Branch As String = RegexSeek(VersionCode, $"(?<=-{Name}-)[^-""]+(?=-[a-z]+.[a-z]{{3}})")
If String.IsNullOrWhiteSpace(Branch) Then Branch = Nothing
If Name = "11.15.1.2318" OrElse Name = "11.15.1.1902" OrElse Name = "11.15.1.1890" Then Branch = "1.8.9"
If Branch Is Nothing AndAlso Inherit = "1.7.10" AndAlso Name.Split(".")(3) >= 1300 Then Branch = "1.7.10"
diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb
index c056fc4..f90c349 100644
--- a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb
+++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb
@@ -1830,14 +1830,16 @@ NextVersion:
Else
PackFormat = 9
End If
- Case 19, 99 '99 是快照版
+ Case 19
If McVersionCurrent.Version.McCodeSub <= 3 Then
PackFormat = 10
Else
PackFormat = 12
End If
- Case Else
+ Case 20, 99 '99 是快照版
PackFormat = 13
+ Case Else
+ PackFormat = 14
'https://minecraft.fandom.com/zh/wiki/数据包#数据包版本
End Select
McLaunchLog("正在构建自定义皮肤资源包,格式为:" & PackFormat)
diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb
index 9e8e894..2738dde 100644
--- a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb
+++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb
@@ -441,10 +441,51 @@ Wait:
TargetJavaList.Add(New JavaEntry(Entry.Key, Entry.Value))
Next
+#Region "添加用户指定的 Java,储存到 UserJava 中"
+
+ Dim UserJava As JavaEntry = Nothing
+
+ '获取版本独立设置中指定的 Java
+ If RelatedVersion IsNot Nothing AndAlso Setup.Get("VersionArgumentJavaSelect", Version:=RelatedVersion).ToString.StartsWith("{") Then
+ Try
+ UserJava = JavaEntry.FromJson(GetJson(Setup.Get("VersionArgumentJavaSelect", Version:=RelatedVersion)))
+ '确保版本独立设置中指定的 Java 在 Java 列表中(#978)
+ If Not JavaList.Any(Function(j) j.PathFolder = UserJava.PathFolder) Then
+ UserJava = Nothing
+ Setup.Reset("VersionArgumentJavaSelect", Version:=RelatedVersion)
+ Log("版本独立设置中指定的 Java 不在主 Java 列表中,此设置已重置", LogLevel.Debug)
+ Exit Try
+ End If
+ Catch ex As Exception
+ UserJava = Nothing
+ Setup.Reset("VersionArgumentJavaSelect", Version:=RelatedVersion)
+ Log(ex, "版本独立设置中指定的 Java 已无法使用,此设置已重置", LogLevel.Hint)
+ End Try
+ End If
+
+ '获取全局设置中指定的 Java
+ If UserJava Is Nothing AndAlso Setup.Get("LaunchArgumentJavaSelect") <> "" Then
+ Try
+ UserJava = JavaEntry.FromJson(GetJson(Setup.Get("LaunchArgumentJavaSelect")))
+ Catch ex As Exception
+ UserJava = Nothing
+ Setup.Reset("LaunchArgumentJavaSelect")
+ Log(ex, "设置中指定的 Java 已无法使用,此设置已重置", LogLevel.Hint)
+ End Try
+ End If
+
+ '添加到特定 Java 列表
+ If UserJava IsNot Nothing Then
+ Log($"[Java] 用户指定的 Java:{UserJava}")
+ TargetJavaList.Add(UserJava)
+ End If
+
+#End Region
+
'检查特定的 Java
If TargetJavaList.Count > 0 Then
TargetJavaList = JavaCheckList(TargetJavaList)
- Log("[Java] 检查后找到 " & TargetJavaList.Count & " 个特定目录下的 Java")
+ Log("[Java] 检查后找到 " & TargetJavaList.Count & " 个特定的 Java")
End If
RetryGet:
@@ -477,38 +518,7 @@ RetryGet:
GoTo RetryGet
End If
-#Region "检查用户指定的 Java"
-
- Dim UserJava As JavaEntry = Nothing
-
- '获取版本独立设置中指定的 Java
- If RelatedVersion IsNot Nothing AndAlso Setup.Get("VersionArgumentJavaSelect", Version:=RelatedVersion).ToString.StartsWith("{") Then
- Try
- UserJava = JavaEntry.FromJson(GetJson(Setup.Get("VersionArgumentJavaSelect", Version:=RelatedVersion)))
- '确保版本独立设置中指定的 Java 在 Java 列表中(#978)
- If Not JavaList.Any(Function(j) j.PathFolder = UserJava.PathFolder) Then
- UserJava = Nothing
- Setup.Reset("VersionArgumentJavaSelect", Version:=RelatedVersion)
- Log("版本独立设置中指定的 Java 不在主 Java 列表中,此设置已重置", LogLevel.Debug)
- Exit Try
- End If
- Catch ex As Exception
- UserJava = Nothing
- Setup.Reset("VersionArgumentJavaSelect", Version:=RelatedVersion)
- Log(ex, "版本独立设置中指定的 Java 已无法使用,此设置已重置", LogLevel.Hint)
- End Try
- End If
-
- '获取全局设置中指定的 Java
- If UserJava Is Nothing AndAlso Setup.Get("LaunchArgumentJavaSelect") <> "" Then
- Try
- UserJava = JavaEntry.FromJson(GetJson(Setup.Get("LaunchArgumentJavaSelect")))
- Catch ex As Exception
- UserJava = Nothing
- Setup.Reset("LaunchArgumentJavaSelect")
- Log(ex, "设置中指定的 Java 已无法使用,此设置已重置", LogLevel.Hint)
- End Try
- End If
+#Region "检查用户指定的 Java 是否可用"
'确保指定的 Java 可用
If UserJava Is Nothing Then GoTo ExitUserJavaCheck
@@ -569,7 +579,7 @@ ExitUserJavaCheck:
If TargetJavaList.Contains(Java) Then
'直接使用指定的 Java
AllowedJavaList = New List(Of JavaEntry) From {Java}
- Log("[Java] 优先使用特定目录下的 Java:" & Java.ToString)
+ Log("[Java] 优先使用特定的 Java:" & Java.ToString)
GoTo UserPass
End If
Next
@@ -2569,9 +2579,26 @@ NextVersion:
'统一通行证文件
If Setup.Get("VersionServerLogin", Version:=Version) = 3 Then
Dim TargetFile = PathAppdata & "nide8auth.jar"
- Dim Checker As New FileChecker(MinSize:=173000)
- If (IsSetupSkip AndAlso File.Exists(TargetFile)) OrElse Checker.Check(TargetFile) IsNot Nothing Then
- Result.Add(New NetFile({"https://login.mc-user.com:233/index/jar"}, TargetFile, Checker))
+ If Not (IsSetupSkip AndAlso File.Exists(TargetFile)) Then
+ Dim DownloadInfo As JObject = Nothing
+ '获取下载信息
+ Try
+ Log("[Minecraft] 开始获取统一通行证下载信息")
+ '测试链接:https://auth.mc-user.com:233/00000000000000000000000000000000/
+ DownloadInfo = GetJson(NetGetCodeByDownload({
+ "https://auth.mc-user.com:233/" & Setup.Get("VersionServerNide", Version:=Version)}, IsJson:=True))
+ Catch ex As Exception
+ Log(ex, "获取统一通行证下载信息失败")
+ End Try
+ '校验文件
+ If DownloadInfo IsNot Nothing Then
+ Dim Checker As New FileChecker(Hash:=DownloadInfo("jarHash").ToString)
+ If (IsSetupSkip AndAlso File.Exists(TargetFile)) OrElse Checker.Check(TargetFile) IsNot Nothing Then
+ '开始下载
+ Log("[Minecraft] 统一通行证需要更新:Hash - " & Checker.Hash, LogLevel.Developer)
+ Result.Add(New NetFile({"https://login.mc-user.com:233/index/jar"}, TargetFile, Checker))
+ End If
+ End If
End If
End If
'Authlib-Injector 文件
@@ -2593,7 +2620,7 @@ NextVersion:
If (IsSetupSkip AndAlso File.Exists(TargetFile)) OrElse Checker.Check(TargetFile) IsNot Nothing Then
'开始下载
Dim DownloadAddress As String = DownloadInfo("download_url")
- Log("[Minecraft] Authlib-Injector 需要更新:" & DownloadAddress)
+ Log("[Minecraft] Authlib-Injector 需要更新:" & DownloadAddress, LogLevel.Developer)
Result.Add(New NetFile({
DownloadAddress.Replace("bmclapi2.bangbang93.com", "download.mcbbs.net"), DownloadAddress
}, TargetFile, New FileChecker(Hash:=DownloadInfo("checksums")("sha256").ToString)))
@@ -3756,7 +3783,7 @@ VersionFindFail:
If Version Is Nothing Then Exit Sub
Dim Time As Date = Version("releaseTime")
Dim MsgBoxText As String = $"新版本:{VersionName}{vbCrLf}" &
- If((Date.Now - Time).TotalDays > 1, "更新时间:" & Time.ToString, "更新于:" & GetTimeSpanString(Time - Date.Now))
+ If((Date.Now - Time).TotalDays > 1, "更新时间:" & Time.ToString, "更新于:" & GetTimeSpanString(Time - Date.Now, False))
Dim MsgResult = MyMsgBox(MsgBoxText, "Minecraft 更新提示", "确定", "下载", If((Date.Now - Time).TotalHours > 3, "更新日志", ""),
Button3Action:=Sub() McUpdateLogShow(Version))
'弹窗结果
diff --git a/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml b/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml
index 8254a36..d1b7266 100644
--- a/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml
+++ b/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml
@@ -1,45 +1,82 @@
+
+
-
-
-
-
+
-
-
-
+
+
+
-
-
+
+
-
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Plain Craft Launcher 2/Modules/ModEvent.vb b/Plain Craft Launcher 2/Modules/ModEvent.vb
index 9c19995..f42ab7e 100644
--- a/Plain Craft Launcher 2/Modules/ModEvent.vb
+++ b/Plain Craft Launcher 2/Modules/ModEvent.vb
@@ -58,6 +58,12 @@
Case "刷新帮助"
PageOtherLeft.RefreshHelp()
+ Case "今日人品"
+ PageOtherTest.Jrrp()
+
+ Case "清理垃圾"
+ PageOtherTest.RubbishClear()
+
Case "弹出窗口"
MyMsgBox(Data(1).Replace("\n", vbCrLf), Data(0).Replace("\n", vbCrLf))
diff --git a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb
index aa4a463..522082e 100644
--- a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb
+++ b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb
@@ -51,6 +51,6 @@ Imports System.Runtime.InteropServices
' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
' 方法是按如下所示使用“*”
-
-
+
+
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml
index cc34e4a..f554eec 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml
@@ -12,7 +12,7 @@
-
+
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb
index 0bd8602..de7fc70 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb
@@ -273,7 +273,7 @@
End If
'获取基本信息
Dim ChineseName As String = If(Project.TranslatedName = Project.RawName, "",
- Project.TranslatedName.Replace(" (", "Å").Split("Å").First.Replace("\", "\").Replace("/", "/").Replace("|", "|").Replace(":", ":").Replace("<", "<").Replace(">", ">").Replace("*", "*").Replace("?", "?").Replace("""", "").Replace(": ", ":"))
+ Project.TranslatedName.Split(" (").First.Replace("\", "\").Replace("/", "/").Replace("|", "|").Replace(":", ":").Replace("<", "<").Replace(">", ">").Replace("*", "*").Replace("?", "?").Replace("""", "").Replace(": ", ":"))
Dim FileName As String
Select Case Setup.Get("ToolDownloadTranslate")
Case 0
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml
index dacfd09..4b35f82 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml
@@ -7,11 +7,11 @@
-
-
+
+
-
-
+
+
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb
index 7e07325..4d0bfd9 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb
@@ -1079,7 +1079,7 @@
#Region "安装"
- Private Sub TextSelectName_KeyUp(sender As Object, e As KeyEventArgs) Handles TextSelectName.KeyUp
+ Private Sub TextSelectName_KeyDown(sender As Object, e As KeyEventArgs) Handles TextSelectName.KeyDown
If e.Key = Key.Enter AndAlso BtnSelectStart.IsEnabled Then BtnSelectStart_Click()
End Sub
Private Sub BtnSelectStart_Click() Handles BtnSelectStart.Click
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb
index b2113bf..f8ff085 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb
@@ -98,10 +98,12 @@
ItemInstall.Checked = True
Case FormMain.PageSubType.DownloadMod
PageDownloadMod.Storage = New CompProjectStorage
+ PageDownloadMod.Page = 0
If FrmDownloadMod IsNot Nothing Then FrmDownloadMod.PageLoaderRestart()
ItemMod.Checked = True
Case FormMain.PageSubType.DownloadPack
PageDownloadPack.Storage = New CompProjectStorage
+ PageDownloadPack.Page = 0
If FrmDownloadPack IsNot Nothing Then FrmDownloadPack.PageLoaderRestart()
ItemPack.Checked = True
Case FormMain.PageSubType.DownloadClient
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml
index 6c5fd60..95e2037 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml
@@ -49,7 +49,7 @@
-
+
@@ -73,9 +73,6 @@
-
-
-
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml.vb
index 8d44a73..f2bf830 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml.vb
@@ -104,7 +104,7 @@
If Loader.ShouldStart(LoaderInput()) Then Storage = New CompProjectStorage '避免连续搜索两次使得 CompProjectStorage 引用丢失(#1311)
Loader.Start()
End Sub
- Private Sub TextSearchName_KeyUp(sender As Object, e As KeyEventArgs) Handles TextSearchName.KeyUp, TextSearchVersion.KeyUp
+ Private Sub EnterTrigger(sender As Object, e As KeyEventArgs) Handles TextSearchName.KeyDown, TextSearchVersion.KeyDown
If e.Key = Key.Enter Then StartNewSearch()
End Sub
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml
index 391042b..bba6733 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml
@@ -65,9 +65,6 @@
-
-
-
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml.vb
index 669f046..2d8dc8d 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml.vb
@@ -106,7 +106,7 @@
If Loader.ShouldStart(LoaderInput()) Then Storage = New CompProjectStorage '避免连续搜索两次使得 CompProjectStorage 引用丢失(#1311)
Loader.Start()
End Sub
- Private Sub TextSearchName_KeyUp(sender As Object, e As KeyEventArgs) Handles TextSearchName.KeyUp, TextSearchVersion.KeyUp
+ Private Sub EnterTrigger(sender As Object, e As KeyEventArgs) Handles TextSearchName.KeyDown, TextSearchVersion.KeyDown
If e.Key = Key.Enter Then StartNewSearch()
End Sub
diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb
index 43a8eef..705c102 100644
--- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb
@@ -746,11 +746,7 @@ ExitRefresh:
'获取 “你知道吗” 提示
Dim Hint As String = PageOtherTest.GetRandomHint()
Try
- Dim RawHints = Array.FindAll(
- ReadFile(Path & "PCL\hints.txt").Replace(vbLf, "").Split(vbCr),
- Function(Input As String) As Boolean
- Return Not String.IsNullOrWhiteSpace(Input)
- End Function)
+ Dim RawHints = ReadFile(Path & "PCL\hints.txt").Split(vbCrLf.ToCharArray).Where(Function(s) Not String.IsNullOrWhiteSpace(s)).ToList
If RawHints.Count > 0 Then Hint = RandomOne(RawHints)
Catch ex As Exception
Log(ex, "获取自定义 你知道吗 提示失败", LogLevel.Hint)
diff --git a/Plain Craft Launcher 2/Pages/PageLink/PageLinkHiper.xaml.vb b/Plain Craft Launcher 2/Pages/PageLink/PageLinkHiper.xaml.vb
index e49a642..ed51f71 100644
--- a/Plain Craft Launcher 2/Pages/PageLink/PageLinkHiper.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageLink/PageLinkHiper.xaml.vb
@@ -688,7 +688,7 @@ FinishMcbFileCheck:
Private Sub TextCert_ValidateChanged(sender As Object, e As EventArgs) Handles TextCert.ValidateChanged
BtnCertDone.IsEnabled = TextCert.ValidateResult = ""
End Sub
- Private Sub TextCert_KeyUp(sender As Object, e As KeyEventArgs) Handles TextCert.KeyUp
+ Private Sub TextCert_KeyDown(sender As Object, e As KeyEventArgs) Handles TextCert.KeyDown
If e.Key = Key.Enter AndAlso BtnCertDone.IsEnabled Then BtnCertDone_Click() '允许回车确认
End Sub
diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml
index 930a112..4c7d840 100644
--- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml
+++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml
@@ -145,7 +145,8 @@
-
+
diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb
index de98da2..e47587e 100644
--- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb
@@ -431,7 +431,7 @@ PreFin:
Dim SelectedItem As MyComboBoxItem = Nothing
Dim SelectedBySetup As String = Setup.Get("LaunchArgumentJavaSelect")
Try
- For Each Java In JavaList
+ For Each Java In Sort(JavaList.Clone(), Function(l, r) l.VersionCode < r.VersionCode)
Dim ListItem = New MyComboBoxItem With {.Content = Java.ToString, .ToolTip = Java.PathFolder, .Tag = Java}
ToolTipService.SetPlacement(ListItem, Primitives.PlacementMode.Right)
ToolTipService.SetHorizontalOffset(ListItem, 5)
diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml
index 27b337a..239305c 100644
--- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml
+++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml
@@ -25,6 +25,7 @@
+
@@ -50,6 +51,9 @@
+
@@ -111,8 +115,12 @@
+
+
-
+
+
+
diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb
index 3ac1db5..e610c79 100644
--- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb
@@ -57,6 +57,7 @@
ComboDownloadVersion.SelectedIndex = Setup.Get("ToolDownloadVersion")
ComboDownloadTranslate.SelectedIndex = Setup.Get("ToolDownloadTranslate")
CheckDownloadKeepModpack.Checked = Setup.Get("ToolDownloadKeepModpack")
+ CheckDownloadIgnoreQuilt.Checked = Setup.Get("ToolDownloadIgnoreQuilt")
'Minecraft 更新提示
CheckUpdateRelease.Checked = Setup.Get("ToolUpdateRelease")
@@ -86,6 +87,7 @@
Setup.Reset("ToolDownloadVersion")
Setup.Reset("ToolDownloadTranslate")
Setup.Reset("ToolDownloadKeepModpack")
+ Setup.Reset("ToolDownloadIgnoreQuilt")
Setup.Reset("ToolUpdateRelease")
Setup.Reset("ToolUpdateSnapshot")
Setup.Reset("ToolHelpChinese")
@@ -107,7 +109,7 @@
End Sub
'将控件改变路由到设置改变
- Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckDebugMode.Change, CheckDebugDelay.Change, CheckDebugSkipCopy.Change, CheckUpdateRelease.Change, CheckUpdateSnapshot.Change, CheckHelpChinese.Change, CheckDownloadKeepModpack.Change
+ Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckDebugMode.Change, CheckDebugDelay.Change, CheckDebugSkipCopy.Change, CheckUpdateRelease.Change, CheckUpdateSnapshot.Change, CheckHelpChinese.Change, CheckDownloadKeepModpack.Change, CheckDownloadIgnoreQuilt.Change
If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked)
End Sub
Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderDebugAnim.Change, SliderDownloadThread.Change, SliderDownloadSpeed.Change
@@ -149,6 +151,14 @@
End If
End Sub
+ '识别码/解锁码替代入口
+ Private Sub BtnSystemIdentify_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnSystemIdentify.Click
+ PageOtherAbout.CopyUniqueAddress()
+ End Sub
+ Private Sub BtnSystemUnlock_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnSystemUnlock.Click
+ PageOtherAbout.DonateCodeInput()
+ End Sub
+
'调试模式
Private Sub CheckDebugMode_Change() Handles CheckDebugMode.Change
If AniControlEnabled = 0 Then Hint("部分调试信息将在刷新或启动器重启后切换显示!",, False)
diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml
index f802b44..a84102d 100644
--- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml
+++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml
@@ -47,7 +47,8 @@
-
+
diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb
index a2793fa..a3c8341 100644
--- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb
@@ -417,7 +417,7 @@ PreFin:
Dim SelectedItem As MyComboBoxItem = Nothing
Dim SelectedBySetup As String = Setup.Get("VersionArgumentJavaSelect", Version:=PageVersionLeft.Version)
Try
- For Each Java In JavaList
+ For Each Java In Sort(JavaList.Clone(), Function(l, r) l.VersionCode < r.VersionCode)
Dim ListItem = New MyComboBoxItem With {.Content = Java.ToString, .ToolTip = Java.PathFolder, .Tag = Java}
ToolTipService.SetPlacement(ListItem, Primitives.PlacementMode.Right)
ToolTipService.SetHorizontalOffset(ListItem, 5)
diff --git a/Plain Craft Launcher 2/Resources/Custom.xaml b/Plain Craft Launcher 2/Resources/Custom.xaml
index 368b824..81c13c8 100644
--- a/Plain Craft Launcher 2/Resources/Custom.xaml
+++ b/Plain Craft Launcher 2/Resources/Custom.xaml
@@ -1,199 +1,251 @@
-
-
-
-
+ 下列内容均基于 WPF 框架。你可以在继续之前先尝试自学 XAML 与 WPF 的基础,这能让你更轻松地理解下列内容。
+ 你也可以使用 Ctrl + F 快速查找。例如,若需要改变文本颜色,则搜索 “颜色” 即可。 -->
+
+
-
-
-
+
+
+
-
-
+
+
-
+ Text="将提示条的 IsWarn 属性改为 False 即可改为提示样式。
使用左边的那堆字符可以在任意地方手动换行,如果需要使用等号、引号等特殊字符,可以自行百度 XAML 转义字符。" />
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
+
+
+ Text="点击打开知乎" EventType="打开网页" EventData="https://www.zhihu.com/" />
-
-
+
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+ Text="打开 B 站" EventType="打开网页" EventData="https://www.bilibili.com/" />
+ Text="进入 Hypixel" EventType="启动游戏" EventData="1.16.3|mc.hypixel.net" ToolTip="使用 Minecraft 1.16.3 进入 Hypixel" />
+ Text="打开画图" EventType="打开文件" EventData="mspaint.exe" />
+ Text="复制召唤命令" EventType="复制文本" EventData="/execute as @a at @s run summon Creeper ~ ~2 ~" ToolTip="这条 Minecraft 命令会在每个玩家头顶召唤一只苦力怕!" />
+ Text="今日人品" EventType="今日人品" />
+ Text="下载作者的头像" EventType="下载文件" EventData="https://www.mcbbs.net/uc_server/data/avatar/000/14/51/06_avatar_small.jpg?ts=1471402592" />
-
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
+
-
+
-
-
+
+ Logo="pack://application:,,,/images/Blocks/CommandBlock.png"
+ Title="清理垃圾" Info="使用内置的命令方块图片作为 Logo" EventType="清理垃圾" Type="Clickable" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -202,36 +254,52 @@
全部通用的属性:
- Width、Height:设置宽度与高度
- ToolTip:设置鼠标指向时的提示文本
- - Foreground:调整前景颜色(十六进制字符串,例如 #FF010203 代表 ARGB 中的 255,1,2,3。前两位代表不透明度,FF 为全不透明,00 为全透明)
- - Background:调整背景颜色(使用类似 Background="{DynamicResource ColorBrush5}" 的格式以调用 PCL 当前的主题颜色,修改末尾的数字编号以改变颜色浓度)
+ - Background:调整背景颜色(十六进制字符串,例如 #FF010203 代表 ARGB 中的 255,1,2,3。前两位代表不透明度,FF 为全不透明,00 为全透明)
- Margin:调整外边距(格式为 左,上,右,下。例如 Margin="0,0,0,2" 即为 2 单位的下边距)
- - HorizontalAlignment:设置对齐方式(Left、Center、Right)
TextBlock(纯文本):
- Text:设置显示的文本(如果要使用引号等特殊字符,自行百度 XAML 转义)
- TextWrapping:开启自动换行
- FontSize:设置字号
-
+ - FontWeight:设置为 Bold 时,文字加粗
+ - Foreground:调整前景颜色(十六进制字符串,例如 #FF010203 代表 ARGB 中的 255,1,2,3。前两位代表不透明度,FF 为全不透明,00 为全透明)
+ - HorizontalAlignment:设置对齐方式(Left、Center、Right)
+
Image(图片):
- Source:要显示的图片的网址
+ - Foreground:调整前景颜色(十六进制字符串,例如 #FF010203 代表 ARGB 中的 255,1,2,3。前两位代表不透明度,FF 为全不透明,00 为全透明)
+ - HorizontalAlignment:设置对齐方式(Left、Center、Right)
+
+local:MyCard(卡片):
+ - Title:设置显示的标题文本
+ - CanSwap:这张卡片是否可以折叠,True 为是,False 为否
+ - IsSwaped:这张卡片是否默认折叠,要求 CanSwap 必须为 True
+ - Foreground:调整前景颜色(十六进制字符串,例如 #FF010203 代表 ARGB 中的 255,1,2,3。前两位代表不透明度,FF 为全不透明,00 为全透明)
+ - HorizontalAlignment:设置对齐方式(Left、Center、Right)(使用时,CanSwap 属性需为 False)
local:MyHint(提示条):
- - Text:设置显示的文本(
代表换行)
+ - Text:设置显示的文本(
代表换行)
- IsWarn:设置为 True 代表警告样式,False 代表提示样式
-
+ - Foreground:调整前景颜色(十六进制字符串,例如 #FF010203 代表 ARGB 中的 255,1,2,3。前两位代表不透明度,FF 为全不透明,00 为全透明)
+ - HorizontalAlignment:设置对齐方式(Left、Center、Right)
+
local:MyButton(按钮):
- Text:设置显示的文本
- Padding:设置内边距,格式与 Margin 一致
- ColorType:设置颜色主题(Highlight 为当前启动器的主题颜色,Red 为红色,默认为黑色)
- EventType、EventData:触发特定事件
-
+ - HorizontalAlignment:设置对齐方式(Left、Center、Right)
+
local:MyTextButton(文本按钮):
- Text:设置显示的文本
- EventType、EventData:触发特定事件
-
-local:MyCard(卡片):
- - Title:设置显示的标题文本
- - CanSwap:这张卡片是否可以折叠,True 为是,False 为否
- - IsSwaped:这张卡片是否默认折叠,要求 CanSwap 必须为 True
+ - Foreground:调整前景颜色(十六进制字符串,例如 #FF010203 代表 ARGB 中的 255,1,2,3。前两位代表不透明度,FF 为全不透明,00 为全透明)
+ - HorizontalAlignment:设置对齐方式(Left、Center、Right)
--->
+local:MyListItem(列表项):
+ - Logo:列表项的图标(所指定的可以是链接也可以是文件路径)
+ - Title:列表项的大标题
+ - Info:列表项的详细信息,它将会以灰色显示在大标题下方
+ - Type:若留空仅单纯展示信息,设置为 Clickable 触发相应活动
+
+-->
\ No newline at end of file
diff --git a/Plain Craft Launcher 2/Resources/Help.zip b/Plain Craft Launcher 2/Resources/Help.zip
index 9c757813c98ac0bc764ef30584a12de80624965e..8ed3d224ca0f19525f6dac190de5f198dc80b11d 100644
GIT binary patch
delta 49025
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 |