diff --git a/Plain Craft Launcher 2/Controls/MyTextBox.vb b/Plain Craft Launcher 2/Controls/MyTextBox.vb index d0c6f44..4f78ee4 100644 --- a/Plain Craft Launcher 2/Controls/MyTextBox.vb +++ b/Plain Craft Launcher 2/Controls/MyTextBox.vb @@ -86,15 +86,15 @@ ValidateResult = ValidateRule.Validate(Text) If IsNothing(ValidateResult) OrElse Not ValidateResult = "" Then Exit For Next - Dim NewResult As Boolean = ValidateResult = "" + Dim IsSuccessful As Boolean = ValidateResult = "" '根据结果改变样式 - If ShownValidateResult <> If(NewResult, 0, 1) Then + If ShownValidateResult <> If(IsSuccessful, ValidateState.Success, ValidateState.FailedAndShowDetail) Then If IsLoaded AndAlso labWrong IsNot Nothing Then - ChangeValidateResult(NewResult, True) + ChangeValidateResult(IsSuccessful, True) Else RunInNewThread(Sub() Thread.Sleep(30) - RunInUi(Sub() ChangeValidateResult(NewResult, False)) + RunInUi(Sub() ChangeValidateResult(IsSuccessful, False)) End Sub, "DelayedValidate Change") End If End If @@ -126,12 +126,12 @@ IsTextChanged = False ChangeValidateResult(ValidateResult = "", True) End Sub - Private ShownValidateResult As Integer = -1 - Private Sub ChangeValidateResult(NewResult As Boolean, IsLoaded As Boolean) + Private ShownValidateResult As ValidateState = ValidateState.NotInited + Private Sub ChangeValidateResult(IsSuccessful As Boolean, IsLoaded As Boolean) If IsLoaded AndAlso AniControlEnabled = 0 AndAlso labWrong IsNot Nothing Then - If NewResult OrElse Not IsTextChanged Then + If IsSuccessful OrElse Not IsTextChanged Then '变为正确 - ShownValidateResult = 0 + ShownValidateResult = If(IsSuccessful, ValidateState.Success, ValidateState.FailedButTextNotChanged) AniStart({ AaOpacity(labWrong, -labWrong.Opacity, 150), AaHeight(labWrong, -labWrong.Height, 150,, New AniEaseOutFluent), @@ -139,7 +139,7 @@ }, "MyTextBox Validate " & Uuid) ElseIf ShowValidateResult Then '变为错误 - ShownValidateResult = 1 + ShownValidateResult = ValidateState.FailedAndShowDetail labWrong.Visibility = Visibility.Visible AniStart({ AaOpacity(labWrong, 1 - labWrong.Opacity, 170), @@ -147,14 +147,22 @@ }, "MyTextBox Validate " & Uuid) Else '变为错误,但不显示文本 - ShownValidateResult = 2 + ShownValidateResult = ValidateState.FailedAndHideDetail End If Else - ShownValidateResult = 3 + ShownValidateResult = ValidateState.NotLoaded End If RefreshColor() RaiseEvent ValidateChanged(Me, New EventArgs) End Sub + Private Enum ValidateState + NotInited + Success + FailedButTextNotChanged + FailedAndShowDetail + FailedAndHideDetail + NotLoaded + End Enum '提示文本 diff --git a/Plain Craft Launcher 2/FormMain.xaml b/Plain Craft Launcher 2/FormMain.xaml index 68a6a78..ea433ba 100644 --- a/Plain Craft Launcher 2/FormMain.xaml +++ b/Plain Craft Launcher 2/FormMain.xaml @@ -4,7 +4,7 @@ xmlns:local="clr-namespace:PCL" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Name="WindMain" x:Class="FormMain" Style="{StaticResource MyWindow}" - AllowDrop="True" Topmost="True" Title="Plain Craft Launcher 2 " AllowsTransparency="True" MinHeight="470" MinWidth="780" ScrollViewer.VerticalScrollBarVisibility="Disabled" Icon="/Plain Craft Launcher 2;component/Images/icon.ico" WindowStyle="None" ResizeMode="CanMinimize" Background="{x:Null}" d:DesignWidth="870" d:DesignHeight="520" Width="850" Height="500" RenderTransformOrigin="0.5,0.5"> + AllowDrop="True" Topmost="True" Title="Plain Craft Launcher 2 " AllowsTransparency="True" MinHeight="470" MinWidth="810" ScrollViewer.VerticalScrollBarVisibility="Disabled" Icon="/Plain Craft Launcher 2;component/Images/icon.ico" WindowStyle="None" ResizeMode="CanMinimize" Background="{x:Null}" d:DesignWidth="870" d:DesignHeight="520" Width="850" Height="500" RenderTransformOrigin="0.5,0.5"> @@ -119,13 +119,13 @@ + LogoScale="0.9" Logo="M955 610h-59c-15 0-29 13-29 29v196c0 15-13 29-29 29h-649c-15 0-29-13-29-29v-196c0-15-13-29-29-29h-59c-15 0-29 13-29 29V905c0 43 35 78 78 78h787c43 0 78-35 78-78V640c0-15-13-29-29-29zM492 740c11 11 29 11 41 0l265-265c11-11 11-29 0-41l-41-41c-11-11-29-11-41 0l-110 110c-11 11-33 3-33-13V68C571 53 555 39 541 39h-59c-15 0-29 13-29 29v417c0 17-21 25-33 13l-110-110c-11-11-29-11-41 0L226 433c-11 11-11 29 0 41L492 740z" /> + LogoScale="0.93" Logo="M364 0h-273C40 0 0 40 0 91v273C0 414 40 455 91 455h273C414 455 455 414 455 364V91C455 40 414 0 364 0zM341 341H113V113h227v227zM933 0h-273C609 0 568 40 568 91v273c0 50 40 91 91 91h273C983 455 1024 414 1024 364V91c0-50-40-91-90-91zM910 341h-227V113h227v227zM364 568h-273C40 568 0 609 0 659v273c0 50 40 91 91 91h273C414 1024 455 983 455 932v-273C455 609 414 568 364 568zM341 910H113v-227h227v227zM933 568h-273c-50 0-91 40-91 91v273c0 50 40 91 91 91h273c50 0 90-40 90-91v-273c0-50-40-90-90-90zM910 910h-227v-227h227v227z"/> @@ -168,7 +168,7 @@ + Logo="M955 610h-59c-15 0-29 13-29 29v196c0 15-13 29-29 29h-649c-15 0-29-13-29-29v-196c0-15-13-29-29-29h-59c-15 0-29 13-29 29V905c0 43 35 78 78 78h787c43 0 78-35 78-78V640c0-15-13-29-29-29zM492 740c11 11 29 11 41 0l265-265c11-11 11-29 0-41l-41-41c-11-11-29-11-41 0l-110 110c-11 11-33 3-33-13V68C571 53 555 39 541 39h-59c-15 0-29 13-29 29v417c0 17-21 25-33 13l-110-110c-11-11-29-11-41 0L226 433c-11 11-11 29 0 41L492 740z" /> = 275 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "在全局启动设置中添加了 启动前执行命令 选项")) FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "在选择下载 Fabric 时会自动选择 Fabric API")) diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index 213a276..353a2c1 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -1,5 +1,6 @@ Imports System.IO.Compression Imports System.Management +Imports System.Runtime.CompilerServices Imports System.Security.Cryptography Imports System.Security.Principal Imports System.Windows.Markup @@ -10,12 +11,12 @@ Public Module ModBase #Region "声明" '下列版本信息由更新器自动修改 - Public Const VersionBaseName As String = "2.5.1" '不含分支前缀的显示用版本名 - Public Const VersionStandardCode As String = "2.5.1." & VersionBranchCode '标准格式的四段式版本号 + Public Const VersionBaseName As String = "2.5.2" '不含分支前缀的显示用版本名 + Public Const VersionStandardCode As String = "2.5.2." & VersionBranchCode '标准格式的四段式版本号 #If BETA Then - Public Const VersionCode As Integer = 281 'Release + Public Const VersionCode As Integer = 286 'Release #Else - Public Const VersionCode As Integer = 284 'Snapshot + Public Const VersionCode As Integer = 285 'Snapshot #End If '自动生成的版本信息 Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName @@ -1487,15 +1488,29 @@ Re: ''' ''' 连接字符串。 ''' - Public Function Join(List As ICollection, Split As String) As String + Public Function Join(List As IEnumerable, Split As String) As String Dim Builder As New StringBuilder - Dim LastCount As Integer = List.Count - 1 - For i = 0 To LastCount - If List(i) IsNot Nothing Then Builder.Append(List(i)) - If i <> LastCount Then Builder.Append(Split) + Dim IsFirst As Boolean = True + For Each Element In List + If IsFirst Then + IsFirst = False + Else + Builder.Append(Split) + End If + If Element IsNot Nothing Then Builder.Append(Element) Next Return Builder.ToString End Function + ''' + ''' 分割字符串。 + ''' + 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 9c75781..8ed3d22 100644 Binary files a/Plain Craft Launcher 2/Resources/Help.zip and b/Plain Craft Launcher 2/Resources/Help.zip differ