diff --git a/Plain Craft Launcher 2/Application.xaml.vb b/Plain Craft Launcher 2/Application.xaml.vb
index 43d16987..9b2d9bd8 100644
--- a/Plain Craft Launcher 2/Application.xaml.vb
+++ b/Plain Craft Launcher 2/Application.xaml.vb
@@ -15,7 +15,6 @@ Public Class Application
Log(ex, "开发者模式测试出错", LogLevel.Feedback)
End Try
End Sub
-
#End If
'开始
diff --git a/Plain Craft Launcher 2/Controls/MyCard.vb b/Plain Craft Launcher 2/Controls/MyCard.vb
index 1cc059be..3192fcec 100644
--- a/Plain Craft Launcher 2/Controls/MyCard.vb
+++ b/Plain Craft Launcher 2/Controls/MyCard.vb
@@ -287,9 +287,9 @@
End Class
Partial Public Module ModAnimation
Public Sub AniDispose(Control As MyCard, RemoveFromChildren As Boolean, Optional CallBack As ParameterizedThreadStart = Nothing)
- If Not Control.IsHitTestVisible Then Exit Sub
- Control.IsHitTestVisible = False
- AniStart({
+ If Control.IsHitTestVisible Then
+ Control.IsHitTestVisible = False
+ AniStart({
AaScaleTransform(Control, -0.08, 200,, New AniEaseInFluent),
AaOpacity(Control, -1, 200,, New AniEaseOutFluent),
AaHeight(Control, -Control.ActualHeight, 150, 100, New AniEaseOutFluent),
@@ -302,5 +302,13 @@ Partial Public Module ModAnimation
If CallBack IsNot Nothing Then CallBack(Control)
End Sub,, True)
}, "MyCard Dispose " & Control.Uuid)
+ Else
+ If RemoveFromChildren Then
+ CType(Control.Parent, Object).Children.Remove(Control)
+ Else
+ Control.Visibility = Visibility.Collapsed
+ End If
+ If CallBack IsNot Nothing Then CallBack(Control)
+ End If
End Sub
End Module
\ No newline at end of file
diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb
index 22838424..fc235851 100644
--- a/Plain Craft Launcher 2/FormMain.xaml.vb
+++ b/Plain Craft Launcher 2/FormMain.xaml.vb
@@ -10,6 +10,12 @@ Public Class FormMain
Dim FeatureList As New List(Of KeyValuePair(Of Integer, String))
'统计更新日志条目
#If BETA Then
+ If LastVersion < 270 Then 'Release 2.4.3
+ FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化 Mod、整合包下载的版本检查与显示"))
+ If LastVersion <= 267 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复无法安装 LiteLoader 的 Bug"))
+ FeatureCount += 6
+ BugCount += 15
+ End If
If LastVersion < 268 Then 'Release 2.4.2
FeatureList.Add(New KeyValuePair(Of Integer, String)(5, "暂时关闭了联机功能"))
FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "游戏崩溃的弹窗添加了直接查看日志的选项"))
@@ -100,6 +106,12 @@ Public Class FormMain
'3:BUG+ IMP* FEAT-
'2:BUG* IMP-
'1:BUG-
+ If LastVersion < 271 Then 'Snapshot 2.4.3
+ FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化 Mod、整合包下载的版本检查与显示"))
+ If LastVersion <= 267 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复无法安装 LiteLoader 的 Bug"))
+ FeatureCount += 6
+ BugCount += 15
+ End If
If LastVersion < 269 Then 'Snapshot 2.4.2
If LastVersion = 267 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复无法下载 CurseForge 整合包的 Bug"))
FeatureCount += 2
@@ -1136,7 +1148,7 @@ Install:
If MyMsgBox("由于联机提供商要求新联机强制付费,且高度商业化,PCL 将暂时关闭联机功能,不再使用该联机模块。" & vbCrLf &
"PCL、HMCL、BakaXL 将合作开发新的跨启动器联机功能,在开发结束后将同步开放,请各位多多理解。",
"联机功能已暂时关闭", "查看详情", "确定") = 1 Then
- OpenWebsite("https://www.bilibili.com/read/cv19553725")
+ OpenWebsite("https://www.bilibili.com/read/cv19845645")
End If
e.Handled = True
End Sub
diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb
index f4bcd613..82cab7d0 100644
--- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb
+++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb
@@ -10,12 +10,12 @@ Public Module ModBase
#Region "声明"
'下列版本信息由更新器自动修改
- Public Const VersionBaseName As String = "2.4.2" '不含分支前缀的显示用版本名
- Public Const VersionStandardCode As String = "2.4.2." & VersionBranchCode '标准格式的四段式版本号
+ Public Const VersionBaseName As String = "2.4.3" '不含分支前缀的显示用版本名
+ Public Const VersionStandardCode As String = "2.4.3." & VersionBranchCode '标准格式的四段式版本号
#If BETA Then
- Public Const VersionCode As Integer = 268 'Release
+ Public Const VersionCode As Integer = 270 'Release
#Else
- Public Const VersionCode As Integer = 269 'Snapshot
+ Public Const VersionCode As Integer = 271 'Snapshot
#End If
'自动生成的版本信息
Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName
@@ -771,6 +771,8 @@ Public Module ModBase
'还原文件路径
If Not FromPath.Contains(":\") Then FromPath = Path & FromPath
If Not ToPath.Contains(":\") Then ToPath = Path & ToPath
+ '如果复制同一个文件则跳过
+ If FromPath = ToPath Then Exit Sub
'读取文件内容
Dim FileBytes As Byte()
Using ReadStream As New FileStream(FromPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) '支持读取使用中的文件
diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb
index 6e811587..9668a04f 100644
--- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb
+++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb
@@ -221,6 +221,7 @@
McDownloadClientUpdateHint(Version, Json)
IsNewClientVersionHinted = True
End If
+ McVersionHighest = Version.Split(".")(1)
Setup.Set("ToolUpdateReleaseLast", Version)
'解析更新提示(Snapshot)
Version = Json("latest")("snapshot")
@@ -772,7 +773,7 @@
'''
Public IsLegacy As Boolean
'''
- ''' 发布时间,格式为“yyyy/mm/dd HH:mm:ss”。
+ ''' 发布时间,格式为“yyyy/mm/dd HH:mm”。
'''
Public ReleaseTime As String
'''
@@ -1090,33 +1091,27 @@
DateUpdate = Data("dateModified")
DownloadCount = Data("downloadCount")
IsModPack = Not Website.Contains("/mc-mods/")
- '获取常见文件
+ '获取 Mod Loader 列表
+ ModLoaders = New List(Of String)
For Each File In If(Data("latestFiles"), {})
Dim NewFile As New DlCfFile(File, IsModPack)
If Not NewFile.IsAvailable Then Continue For
+ ModLoaders.AddRange(NewFile.ModLoaders)
Next
- '获取游戏版本、Mod Loader
+ ModLoaders = ModLoaders.Distinct.ToList
+ '用一个偷懒的方式让 Forge 排在 Fabric 的前面
+ ModLoaders = ModLoaders.Select(Function(s) s.Replace("Forge", "Aorge")).ToList()
+ ModLoaders.Sort()
+ ModLoaders = ModLoaders.Select(Function(s) s.Replace("Aorge", "Forge")).ToList()
+ '获取游戏版本
Dim GameVersions As New List(Of Integer)
- ModLoaders = New List(Of String)
For Each File In If(Data("latestFilesIndexes"), {})
Dim Version As String = File("gameVersion")
If Not Version.Contains("1.") Then Continue For
GameVersions.Add(Version.Split(".")(1).Split("-").First)
- Select Case If(File("modLoader"), "0").ToString
- Case 1
- ModLoaders.Add("Forge")
- Case 2
- ModLoaders.Add("Cauldron")
- Case 3
- ModLoaders.Add("LiteLoader")
- Case 4
- ModLoaders.Add("Fabric")
- End Select
FileIndexes.Add(File("fileId"))
Next
GameVersions = Sort(GameVersions.Distinct.ToList, AddressOf VersionSortBoolean)
- ModLoaders = ModLoaders.Distinct.ToList
- ModLoaders.Sort()
If GameVersions.Count = 0 Then
GameVersionDesc = ""
Else
@@ -1133,8 +1128,15 @@
Next
If StartVersion = EndVersion Then
SpaVersions.Add("1." & StartVersion)
+ ElseIf StartVersion >= McVersionHighest Then
+ SpaVersions.Add("1." & EndVersion & "+")
+ ElseIf EndVersion <= 7 Then
+ SpaVersions.Add("1." & StartVersion & "-")
+ Exit For
+ ElseIf StartVersion - EndVersion = 1 Then
+ SpaVersions.Add("1." & StartVersion & ", 1." & EndVersion)
Else
- SpaVersions.Add("1." & StartVersion & "-1." & EndVersion)
+ SpaVersions.Add("1." & StartVersion & "~1." & EndVersion)
End If
Next
GameVersionDesc = "[" & Join(SpaVersions, ", ") & "] "
@@ -1211,12 +1213,11 @@
Dim NewItem As New MyCfItem With {.Tag = Me}
NewItem.LabTitle.Text = ChineseName
NewItem.LabInfo.Text = Description.Replace(vbCr, "").Replace(vbLf, "")
- NewItem.LabLeft.Text = If(ModLoaders.Count > 0 AndAlso ShowLoaderDesc, "[" & Join(ModLoaders, " & ") & "] ", "") &
- If(ShowVersionDesc, GameVersionDesc, "") &
+ NewItem.LabLeft.Text = (If(ModLoaders.Count > 0 AndAlso ShowLoaderDesc, "[" & Join(ModLoaders, "/") & "] ", "") &
+ If(ShowVersionDesc, GameVersionDesc, "")).Replace("] [", " ") &
Join(CategoryDesc, ",") & " (" &
- GetTimeSpanString(DateUpdate - Date.Now) & "更新" &
- If(DownloadCount > 0,
- "," & If(DownloadCount > 100000, Math.Round(DownloadCount / 10000) & " 万次下载", DownloadCount & " 次下载"), "") & ")"
+ GetTimeSpanString(DateUpdate - Date.Now) & "更新," &
+ If(DownloadCount > 100000, Math.Round(DownloadCount / 10000) & " 万次下载", DownloadCount & " 次下载") & ")"
If Thumb Is Nothing Then
NewItem.Logo = "pack://application:,,,/images/Icons/NoIcon.png"
Else
@@ -1279,7 +1280,7 @@
Dim SearchResult As String = ""
For i = 0 To SearchResults.Count - 1
If Not SearchResults(i).AbsoluteRight AndAlso i >= Math.Min(2, SearchResults.Count - 1) Then Exit For '把 3 个结果拼合以提高准确度
- SearchResult += SearchResults(i).Item.Replace(" (", "|").Split("|").Last.TrimEnd(")") & " "
+ SearchResult += SearchResults(i).Item.Replace(" - ", "§").Split("§").First.Replace(" (", "|").Split("|").Last.TrimEnd(")") & " "
Next
Log("[Download] CurseForge 工程列表中文搜索原始关键词:" & SearchResult, LogLevel.Developer)
'去除常见连接词
@@ -1432,6 +1433,7 @@
Public DisplayName As String
Public [Date] As Date
Public GameVersion As String()
+ Public ModLoaders As New List(Of String)
Public ReleaseType As Integer
Public FileName As String
Public DownloadCount As Integer
@@ -1481,11 +1483,13 @@
End If
Next
End If
- '获取游戏版本
+ '获取游戏版本与 Mod 加载器列表
Dim Versions As New List(Of String)
- For Each Version In Data("gameVersions")
- If Version.ToString.StartsWith("1.") OrElse Version.ToString.Contains("w") Then
- Versions.Add(Version.ToString.Trim.ToLower)
+ For Each Version In Data("gameVersions").Select(Function(t) t.ToString.Trim.ToLower)
+ If Version.StartsWith("1.") OrElse Version.Contains("w") Then
+ Versions.Add(Version)
+ ElseIf Version = "forge" OrElse Version = "fabric" OrElse Version = "quilt" OrElse Version = "rift" Then
+ ModLoaders.Add(Version.First.ToString.ToUpper & Version.Substring(1))
End If
Next
If Versions.Count > 1 Then
@@ -1493,11 +1497,13 @@
If IsModPack Then GameVersion = {GameVersion(0)}
ElseIf Versions.Count = 1 Then
GameVersion = Versions.ToArray
- 'ElseIf Data("gameVersion").Count = 1 AndAlso Not Data("gameVersion")(0).ToString.Contains("1.") Then
- ' GameVersion = {"1.16.4"}
Else
GameVersion = {"未知版本"}
End If
+ '用一个偷懒的方式让 Forge 排在 Fabric 的前面
+ ModLoaders = ModLoaders.Select(Function(s) s.Replace("Forge", "Aorge")).ToList()
+ ModLoaders.Sort()
+ ModLoaders = ModLoaders.Select(Function(s) s.Replace("Aorge", "Forge")).ToList()
End Sub
'''
@@ -1513,10 +1519,14 @@
'获取描述信息
Dim Info As String = ""
If Not IsModPack Then
- Info += "适用于 " & Join(GameVersion, "、").Replace("-snapshot", " 快照") &
- If(ModeDebug AndAlso Dependencies.Count > 0, "," & Dependencies.Count & " 个前置,", ",")
+ Info += If(ModLoaders.Count > 0, Join(ModLoaders, "/"), "") &
+ If(GameVersion.Count > 1, If(ModLoaders.Count > 0, " ", "") & Join(GameVersion, "、").Replace("-snapshot", " 快照"), "")
+ If Info <> "" Then Info = "适用于 " & Info & ","
+ Info += If(ModeDebug AndAlso Dependencies.Count > 0, Dependencies.Count & " 个前置 Mod,", "")
End If
- Info += If(DownloadCount > 0, If(DownloadCount > 100000, Math.Round(DownloadCount / 10000) & " 万次下载,", DownloadCount & " 次下载,"), "")
+ 'If DownloadCount > 0 Then 'DownloadCount 目前的返回内容完全不正确,经常是 0,干脆不显示了
+ ' Info += If(DownloadCount > 100000, Math.Round(DownloadCount / 10000) & " 万次下载,", DownloadCount & " 次下载,")
+ 'End If
Info += GetTimeSpanString([Date] - Date.Now) & "更新"
Info += If(ReleaseType <> 1, "," & ReleaseTypeString, "")
diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb
index dffc6c87..b2fb5be3 100644
--- a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb
+++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb
@@ -1078,19 +1078,30 @@ SystemBrowser:
MaxVer = New Version(1, 12, 999, 999)
End If
+ 'OptiFine 检测
+ If McVersionCurrent.Version.HasOptiFine Then
+ If McVersionCurrent.Version.McCodeMain <= 7 AndAlso McVersionCurrent.Version.McCodeMain > 0 Then
+ '<1.7:至多 Java 8(Java 9 - 10 未测试)
+ MaxVer = New Version(1, 8, 999, 999)
+ ElseIf McVersionCurrent.Version.McCodeMain >= 8 AndAlso McVersionCurrent.Version.McCodeMain <= 11 Then
+ '1.8 - 1.11:必须恰好 Java 8(Java 9 - 10 未测试)
+ MinVer = New Version(1, 8, 0, 0) : MaxVer = New Version(1, 8, 999, 999)
+ End If
+ End If
+
'Forge 检测
If McVersionCurrent.Version.HasForge Then
If McVersionCurrent.Version.McName = "1.7.2" Then
'1.7.2:必须 Java 7
MinVer = New Version(1, 7, 0, 0) : MaxVer = New Version(1, 7, 999, 999)
ElseIf McVersionCurrent.Version.McCodeMain <= 12 AndAlso McVersionCurrent.Version.McCodeMain > 0 AndAlso VersionSortBoolean("14.23.5.2855", McVersionCurrent.Version.ForgeVersion) Then
- '1.12,Forge 14.23.5.2855 及更低:Java 8
+ '<1.12,Forge 14.23.5.2855 及更低:Java 8
MaxVer = New Version(1, 8, 999, 999)
ElseIf McVersionCurrent.Version.McCodeMain <= 14 AndAlso McVersionCurrent.Version.McCodeMain > 0 AndAlso VersionSortBoolean("28.2.23", McVersionCurrent.Version.ForgeVersion) Then
'1.13 - 1.14,Forge 28.2.23 及更低:Java 8 - 10
MinVer = New Version(1, 8, 0, 0) : MaxVer = New Version(1, 10, 999, 999)
- ElseIf McVersionCurrent.Version.McCodeMain <= 16 AndAlso McVersionCurrent.Version.McCodeMain > 0 Then
- '1.15 - 1.16:Java 8 - 15
+ ElseIf McVersionCurrent.Version.McCodeMain <= 15 AndAlso McVersionCurrent.Version.McCodeMain > 0 Then
+ '1.15:Java 8 - 15
MinVer = New Version(1, 8, 0, 0) : MaxVer = New Version(1, 15, 999, 999)
ElseIf McVersionCurrent.Version.McCodeMain >= 18 AndAlso McVersionCurrent.Version.McCodeMain < 99 AndAlso McVersionCurrent.Version.HasOptiFine Then '#305
'1.18+:若安装了 OptiFine,最高 Java 18
@@ -1101,8 +1112,8 @@ SystemBrowser:
'Fabric 检测
If McVersionCurrent.Version.HasFabric Then
If McVersionCurrent.Version.McCodeMain >= 15 AndAlso McVersionCurrent.Version.McCodeMain <= 16 AndAlso McVersionCurrent.Version.McCodeMain <> -1 Then
- '1.15 - 1.16:Java 8 - 15
- MinVer = New Version(1, 8, 0, 0) : MaxVer = New Version(1, 15, 999, 999)
+ '1.15 - 1.16:Java 8 - 18
+ MinVer = New Version(1, 8, 0, 0) : MaxVer = New Version(1, 18, 999, 999)
ElseIf McVersionCurrent.Version.McCodeMain >= 18 AndAlso McVersionCurrent.Version.McCodeMain < 99 Then
'1.18+:Java 17 - 18
MinVer = New Version(1, 17, 0, 0) : MaxVer = New Version(1, 18, 999, 999)
@@ -1150,22 +1161,29 @@ SystemBrowser:
Private McLaunchArgument As String
'''
- ''' 释放 Java Wrapper 并返回文件路径。
+ ''' 释放 Java Wrapper 并返回完整文件路径。
'''
Public Function ExtractJavaWrapper() As String
- Dim WrapperPath As String = PathAppdata & "JavaWrapper.jar"
+ Dim WrapperPath As String = GetJavaWrapperDir() & "\JavaWrapper.jar"
+ If Not File.Exists(WrapperPath) OrElse New FileInfo(WrapperPath).Length <> 16818 Then
+ WriteFile(WrapperPath, GetResources("JavaWrapper"))
+ Log("[Java] 已自动释放 Java Wrapper:" & WrapperPath)
+ End If
+ Return WrapperPath
+ End Function
+ '''
+ ''' 获取 Java Wrapper 所在的文件夹,不以 \ 结尾。
+ '''
+ Public Function GetJavaWrapperDir() As String
+ Dim WrapperPath As String = PathAppdata.TrimEnd("\")
If Encoding.UTF8.GetByteCount(WrapperPath) <> WrapperPath.Length Then
Log("[Java] AppData 路径中包含非 ASCII 字符,换用 Temp 目录")
- WrapperPath = PathTemp & "JavaWrapper.jar"
+ WrapperPath = PathTemp.TrimEnd("\")
If Encoding.UTF8.GetByteCount(PathTemp) <> PathTemp.Length Then
Log("[Java] Temp 路径中包含非 ASCII 字符,换用 C 盘根目录")
- WrapperPath = "C:\PCL\JavaWrapper.jar"
+ WrapperPath = "C:\PCL"
End If
End If
- If Not File.Exists(WrapperPath) OrElse New FileInfo(WrapperPath).Length > 20 * 1024 Then
- WriteFile(WrapperPath, GetResources("JavaWrapper"))
- Log("[Java] 已自动释放 Java Wrapper:" & WrapperPath)
- End If
Return WrapperPath
End Function
@@ -1185,7 +1203,7 @@ SystemBrowser:
McLaunchLog("旧版 JVM 参数获取成功:")
McLaunchLog(Arguments)
End If
- If McVersionCurrent.JsonObject("minecraftArguments") IsNot Nothing Then
+ If Not String.IsNullOrEmpty(McVersionCurrent.JsonObject("minecraftArguments")) Then '有的版本是空字符串
McLaunchLog("获取旧版 Game 参数")
Arguments += " " & McLaunchArgumentsGameOld(McVersionCurrent)
McLaunchLog("旧版 Game 参数获取成功")
@@ -1270,6 +1288,7 @@ SystemBrowser:
'添加 Java Wrapper 作为主 Jar
If McLaunchJavaSelected.VersionCode >= 9 Then DataList.Add("--add-exports cpw.mods.bootstraplauncher/cpw.mods.bootstraplauncher=ALL-UNNAMED")
+ DataList.Insert(0, "-Doolloo.jlw.tmpdir=""" & GetJavaWrapperDir() & """")
DataList.Add("-jar """ & ExtractJavaWrapper() & """")
'添加 MainClass
@@ -1336,6 +1355,7 @@ NextVersion:
'添加 Java Wrapper 作为主 Jar
If McLaunchJavaSelected.VersionCode >= 9 Then DataList.Add("--add-exports cpw.mods.bootstraplauncher/cpw.mods.bootstraplauncher=ALL-UNNAMED")
+ DataList.Insert(0, "-Doolloo.jlw.tmpdir=""" & GetJavaWrapperDir() & """")
DataList.Add("-jar """ & ExtractJavaWrapper() & """")
'将 "-XXX" 与后面 "XXX" 合并到一起
@@ -1502,9 +1522,7 @@ NextVersion:
GameArguments.Add("${assets_index_name}", McAssetsGetIndexName(Version))
'支持库参数
- 'Dim LibList As List(Of McLibToken) = McLibListGet(Version,
- ' Not (Version.Version.HasForge AndAlso Version.Version.McCodeMain >= 17)) '包含版本 Jar 的条件是不为 1.17+ 的 Forge
- Dim LibList As List(Of McLibToken) = McLibListGet(Version, True) '如果在 1.19.x Forge 不包含版本 Jar 会导致 #188
+ Dim LibList As List(Of McLibToken) = McLibListGet(Version, True)
Loader.Output = LibList
Dim CpStrings As New List(Of String)
Dim OptiFineCp As String = Nothing
diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb
index 9f5f63a7..85f1221f 100644
--- a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb
+++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb
@@ -2327,13 +2327,16 @@ NextVersion:
Dim RealVersion As McVersion
Dim RequiredJar As String = Version.JsonObject("jar")?.ToString
If Version.IsHmclFormatJson OrElse RequiredJar Is Nothing Then
+ 'HMCL 项直接使用自身的 Jar
'根据 Inherit 获取最深层版本
- '此外,HMCL 项直接使用自身的 Jar
Dim OriginalVersion As McVersion = Version
- Do Until OriginalVersion.InheritVersion = ""
- If OriginalVersion.InheritVersion = OriginalVersion.Name Then Exit Do
- OriginalVersion = New McVersion(PathMcFolder & "versions\" & OriginalVersion.InheritVersion & "\")
- Loop
+ '1.17+ 的 Forge 不寻找 Inherit
+ If Not (Version.Version.HasForge AndAlso Version.Version.McCodeMain >= 17) Then
+ Do Until OriginalVersion.InheritVersion = ""
+ If OriginalVersion.InheritVersion = OriginalVersion.Name Then Exit Do
+ OriginalVersion = New McVersion(PathMcFolder & "versions\" & OriginalVersion.InheritVersion & "\")
+ Loop
+ End If
'需要新建对象,否则后面的 Check 会导致 McVersionCurrent 的 State 变回 Original
'复现:启动一个 Snapshot 版本
RealVersion = New McVersion(OriginalVersion.Path)
@@ -2380,6 +2383,11 @@ NextVersion:
'转换为 LibToken
For Each Library As JObject In AllLibs.Children
+ '清理 null 项(BakaXL 会把没有的项序列化为 null,但会被 Newtonsoft 转换为 JValue,导致 Is Nothing = false;这导致了 #409)
+ For i = Library.Properties.Count - 1 To 0 Step -1
+ If Library.Properties(i).Value.Type = JTokenType.Null Then Library.Remove(Library.Properties(i).Name)
+ Next
+
'检查是否需要(Rules)
If Not McJsonRuleCheck(Library("rules")) Then Continue For
diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb
index a383530c..ad36237f 100644
--- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb
+++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb
@@ -241,8 +241,12 @@ Retry:
For Each ModJson In Task.Input
'跳过重复的 Mod(疑似 CurseForge Bug)
If FileList.ContainsKey(ModJson("id").ToObject(Of Integer)) Then Continue For
+ '根据 modules 判断是资源包还是 Mod
+ Dim ModuleNames = CType(ModJson("modules"), JArray).Select(Function(l) l("name").ToString).ToList
+ Dim IsResourcePack As Boolean = Not ModuleNames.Contains("META-INF") AndAlso ModuleNames.Contains("pack.mcmeta")
'实际的添加
- FileList.Add(ModJson("id"), New DlCfFile(ModJson, False).GetDownloadFile(PathMcFolder & "versions\" & VersionName & "\mods\", False))
+ FileList.Add(ModJson("id"), New DlCfFile(ModJson, False).GetDownloadFile(
+ PathMcFolder & "versions\" & VersionName & "\" & If(IsResourcePack, "resourcepacks", "mods") & "\", False))
Task.Progress += 1 / (1 + ModFileList.Count)
Next
Task.Output = FileList.Values.ToList
diff --git a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb
index af43c2ae..f63cd505 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/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb
index 2e059094..1373db68 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb
+++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb
@@ -1,8 +1,15 @@
Imports System.IO.Compression
Public Module ModDownloadLib
- '如果 OptiFine 与 Forge 同时开始安装,就会导致 Forge 安装失败
+
+ '''
+ ''' 如果 OptiFine 与 Forge 同时开始安装,就会导致 Forge 安装失败,所以在这里添加一个锁。
+ '''
Private InstallSyncLock As New Object
+ '''
+ ''' 最高的 Minecraft 大版本号,-1 代表尚未获取。
+ '''
+ Public McVersionHighest As Integer = -1
#Region "Minecraft 下载"
@@ -114,7 +121,7 @@ Public Module ModDownloadLib
Task.Output = New List(Of NetFile) From {New NetFile(DlSourceLauncherOrMetaGet(JsonAddress), VersionFolder & VersionName & ".json")}
End Sub) With {.ProgressWeight = 2, .Show = False})
End If
- Loaders.Add(New LoaderDownload("下载原版 Json 文件", New List(Of NetFile) From {
+ Loaders.Add(New LoaderDownload(McDownloadClientJsonName, New List(Of NetFile) From {
New NetFile(DlSourceLauncherOrMetaGet(If(JsonUrl, "")), VersionFolder & VersionName & ".json", New FileChecker(CanUseExistsFile:=False, IsJson:=True))
}) With {.ProgressWeight = 3})
@@ -159,6 +166,7 @@ Public Module ModDownloadLib
End Function
Private Const McDownloadClientLibName As String = "下载原版支持库文件"
+ Private Const McDownloadClientJsonName As String = "下载原版 Json 文件"
#End Region
@@ -378,7 +386,7 @@ Public Module ModDownloadLib
Throw New Exception("未找到用于安装 OptiFine 的 Java")
End If
'添加 Java Wrapper 作为主 Jar
- Dim Arguments = "-Duser.home=""" & BaseMcFolderHome & """ -cp """ & Target & """ -jar """ & ExtractJavaWrapper() & """ optifine.Installer"
+ Dim Arguments = "-Doolloo.jlw.tmpdir=""" & GetJavaWrapperDir() & """ -Duser.home=""" & BaseMcFolderHome & """ -cp """ & Target & """ -jar """ & ExtractJavaWrapper() & """ optifine.Installer"
If Java.VersionCode >= 9 Then Arguments = "--add-exports cpw.mods.bootstraplauncher/cpw.mods.bootstraplauncher=ALL-UNNAMED " & Arguments
'开始启动
SyncLock InstallSyncLock
@@ -518,27 +526,28 @@ Public Module ModDownloadLib
Loaders.Add(New LoaderDownload("下载 OptiFine 主文件", New List(Of NetFile)) With {.ProgressWeight = 8})
Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("等待原版下载",
Sub(Task As LoaderTask(Of List(Of NetFile), Boolean))
- '是否已经存在原版文件
- If ClientDownloadLoader Is Nothing Then Exit Sub
'等待原版文件下载完成
- For Each Loader In ClientDownloadLoader.GetLoaderList
- If Loader.Name <> McDownloadClientLibName Then Continue For
- If Loader.State = LoadState.Loading Then
- Log("[Download] OptiFine 安装正在等待原版文件下载完成")
- Loader.WaitForExit()
- End If
- Exit For
- Next
+ If ClientDownloadLoader Is Nothing Then Exit Sub
+ Dim TargetLoaders As List(Of LoaderBase) =
+ ClientDownloadLoader.GetLoaderList.Where(Function(l) l.Name = McDownloadClientLibName OrElse l.Name = McDownloadClientJsonName).
+ Where(Function(l) l.State <> LoadState.Finished).ToList
+ If TargetLoaders.Count > 0 Then Log("[Download] OptiFine 安装正在等待原版文件下载完成")
+ Do While TargetLoaders.Count > 0 AndAlso Not Task.IsAborted
+ TargetLoaders = TargetLoaders.Where(Function(l) l.State <> LoadState.Finished).ToList
+ Thread.Sleep(50)
+ Loop
+ If Task.IsAborted Then Exit Sub
'拷贝原版文件
- If IsCustomFolder Then
- Dim ClientName As String = New DirectoryInfo(ClientDownloadLoader.Input).Name
- Directory.CreateDirectory(McFolder & "versions\" & DownloadInfo.Inherit)
- If Not File.Exists(McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".json") Then
- CopyFile(ClientDownloadLoader.Input & ClientName & ".json", McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".json")
- End If
- If Not File.Exists(McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".jar") Then
- CopyFile(ClientDownloadLoader.Input & ClientName & ".jar", McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".jar")
- End If
+ If Not IsCustomFolder Then Exit Sub
+ Dim ClientName As String = New DirectoryInfo(ClientDownloadLoader.Input).Name
+ Directory.CreateDirectory(McFolder & "versions\" & DownloadInfo.Inherit)
+ If Not File.Exists(McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".json") Then
+ CopyFile(ClientDownloadLoader.Input & ClientName & ".json",
+ McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".json")
+ End If
+ If Not File.Exists(McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".jar") Then
+ CopyFile(ClientDownloadLoader.Input & ClientName & ".jar",
+ McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".jar")
End If
End Sub) With {.ProgressWeight = 0.1, .Show = False})
@@ -876,8 +885,8 @@ Public Module ModDownloadLib
'构造版本 Json
Dim VersionJson As New JObject
VersionJson.Add("id", VersionName)
- VersionJson.Add("time", DateTime.ParseExact(DownloadInfo.ReleaseTime, "yyyy/MM/dd HH:mm:ss", Globalization.CultureInfo.CurrentCulture))
- VersionJson.Add("releaseTime", DateTime.ParseExact(DownloadInfo.ReleaseTime, "yyyy/MM/dd HH:mm:ss", Globalization.CultureInfo.CurrentCulture))
+ VersionJson.Add("time", Date.ParseExact(DownloadInfo.ReleaseTime, "yyyy/MM/dd HH:mm", Globalization.CultureInfo.CurrentCulture))
+ VersionJson.Add("releaseTime", Date.ParseExact(DownloadInfo.ReleaseTime, "yyyy/MM/dd HH:mm", Globalization.CultureInfo.CurrentCulture))
VersionJson.Add("type", "release")
VersionJson.Add("arguments", GetJson("{""game"":[""--tweakClass"",""" & DownloadInfo.JsonToken("tweakClass").ToString & """]}"))
VersionJson.Add("libraries", DownloadInfo.JsonToken("libraries"))
@@ -1094,7 +1103,7 @@ Public Module ModDownloadLib
Throw New Exception("未找到用于安装 Forge 的 Java")
End If
'添加 Java Wrapper 作为主 Jar
- Dim Arguments = "-cp """ & PathTemp & "Cache\forge_installer.jar;" & Target & """ -jar """ & ExtractJavaWrapper() & """ com.bangbang93.ForgeInstaller """ & McFolder
+ Dim Arguments = "-Doolloo.jlw.tmpdir=""" & GetJavaWrapperDir() & """ -cp """ & PathTemp & "Cache\forge_installer.jar;" & Target & """ -jar """ & ExtractJavaWrapper() & """ com.bangbang93.ForgeInstaller """ & McFolder
If Java.VersionCode >= 9 Then Arguments = "--add-exports cpw.mods.bootstraplauncher/cpw.mods.bootstraplauncher=ALL-UNNAMED " & Arguments
'开始启动
SyncLock InstallSyncLock
@@ -1329,27 +1338,26 @@ Public Module ModDownloadLib
End If
#End Region
#Region "原版文件"
- '是否已经存在原版文件
- If ClientDownloadLoader Is Nothing Then Exit Sub
'等待原版文件下载完成
- For Each Loader In ClientDownloadLoader.GetLoaderList
- If Loader.Name <> McDownloadClientLibName Then Continue For
- If Loader.State = LoadState.Loading Then
- Log("[Download] Forge 安装正在等待原版文件下载完成")
- Loader.WaitForExit()
- End If
- Exit For
- Next
+ If ClientDownloadLoader Is Nothing Then Exit Sub
+ Dim TargetLoaders As List(Of LoaderBase) =
+ ClientDownloadLoader.GetLoaderList.Where(Function(l) l.Name = McDownloadClientLibName OrElse l.Name = McDownloadClientJsonName).
+ Where(Function(l) l.State <> LoadState.Finished).ToList
+ If TargetLoaders.Count > 0 Then Log("[Download] Forge 安装正在等待原版文件下载完成")
+ Do While TargetLoaders.Count > 0 AndAlso Not Task.IsAborted
+ TargetLoaders = TargetLoaders.Where(Function(l) l.State <> LoadState.Finished).ToList
+ Thread.Sleep(50)
+ Loop
+ If Task.IsAborted Then Exit Sub
'拷贝原版文件
- If IsCustomFolder Then
- Dim ClientName As String = New DirectoryInfo(ClientDownloadLoader.Input).Name
- Directory.CreateDirectory(McFolder & "versions\" & Inherit)
- If Not File.Exists(McFolder & "versions\" & Inherit & "\" & Inherit & ".json") Then
- CopyFile(ClientDownloadLoader.Input & ClientName & ".json", McFolder & "versions\" & Inherit & "\" & Inherit & ".json")
- End If
- If Not File.Exists(McFolder & "versions\" & Inherit & "\" & Inherit & ".jar") Then
- CopyFile(ClientDownloadLoader.Input & ClientName & ".jar", McFolder & "versions\" & Inherit & "\" & Inherit & ".jar")
- End If
+ If Not IsCustomFolder Then Exit Sub
+ Dim ClientName As String = New DirectoryInfo(ClientDownloadLoader.Input).Name
+ Directory.CreateDirectory(McFolder & "versions\" & Inherit)
+ If Not File.Exists(McFolder & "versions\" & Inherit & "\" & Inherit & ".json") Then
+ CopyFile(ClientDownloadLoader.Input & ClientName & ".json", McFolder & "versions\" & Inherit & "\" & Inherit & ".json")
+ End If
+ If Not File.Exists(McFolder & "versions\" & Inherit & "\" & Inherit & ".jar") Then
+ CopyFile(ClientDownloadLoader.Input & ClientName & ".jar", McFolder & "versions\" & Inherit & "\" & Inherit & ".jar")
End If
#End Region
End Sub) With {.ProgressWeight = 0.1, .Show = False})
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCfDetail.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCfDetail.xaml.vb
index ea650e28..8a13bb06 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCfDetail.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCfDetail.xaml.vb
@@ -192,63 +192,124 @@
End Try
End Sub
'Mod 下载;整合包另存为
- Public Shared DownloadFolder = Nothing '仅在本次缓存的下载文件夹
+ Public Shared CachedFolder As String = Nothing '仅在本次缓存的下载文件夹
Public Sub Save_Click(sender As Object, e As EventArgs)
- Try
- Dim Desc As String = If(Project.IsModPack, "整合包", "Mod ")
-
- '确认默认保存位置
- Dim DefaultFolder As String = Nothing
- If Not Project.IsModPack Then
- DefaultFolder = DownloadFolder
- If McVersionCurrent IsNot Nothing Then
- If Not McVersionCurrent.IsLoaded Then McVersionCurrent.Load()
- If McVersionCurrent.Modable Then
+ Dim File As DlCfFile = If(TypeOf sender Is MyListItem, sender, sender.Parent).Tag
+ RunInNewThread(
+ Sub()
+ Try
+ Dim Desc As String = If(Project.IsModPack, "整合包", "Mod ")
+ '确认默认保存位置
+ Dim DefaultFolder As String = Nothing
+ If Not Project.IsModPack Then
+ '获取 Mod 所需的加载器种类
+ Dim AllowForge As Boolean? = Nothing, AllowFabric As Boolean? = Nothing 'FUTURE: Quilt 支持
+ If File.ModLoaders.Count > 0 Then '从文件中获取
+ AllowForge = False : AllowFabric = False
+ For Each LoaderType In File.ModLoaders
+ If LoaderType = "Forge" Then AllowForge = True
+ If LoaderType = "Fabric" Then AllowFabric = True
+ Next
+ ElseIf Project.ModLoaders.Count > 0 Then '从工程中获取
+ AllowForge = False : AllowFabric = False
+ For Each LoaderType In Project.ModLoaders
+ If LoaderType = "Forge" Then AllowForge = True
+ If LoaderType = "Fabric" Then AllowFabric = True
+ Next
+ End If
+ If AllowForge IsNot Nothing AndAlso Not AllowForge AndAlso
+ AllowFabric IsNot Nothing AndAlso Not AllowFabric Then
+ AllowForge = Nothing : AllowFabric = Nothing
+ End If
+ Log("[Download] 允许 Forge:" & If(AllowForge, "未知") & ",允许 Fabric:" & If(AllowFabric, "未知"))
+ '判断某个版本是否符合要求
+ Dim IsVersionSuitable As Func(Of McVersion, Boolean) =
+ Function(Version)
+ If Not Version.IsLoaded Then Version.Load()
+ If Not Version.Modable Then Return False
+ If File.GameVersion.Any(Function(v) v.Contains(".")) AndAlso
+ Not File.GameVersion.Any(Function(v) v.Contains(".") AndAlso v.Split(".")(1) = Version.Version.McCodeMain) Then Return False
+ If AllowForge Is Nothing OrElse AllowFabric Is Nothing Then Return True
+ If AllowForge AndAlso Version.Version.HasForge Then Return True
+ If AllowFabric AndAlso Version.Version.HasFabric Then Return True
+ Return False
+ End Function
+ '获取 Mod 默认下载位置
+ If CachedFolder IsNot Nothing Then
+ DefaultFolder = CachedFolder
+ Log("[Download] 使用上次下载时的文件夹作为默认下载位置")
+ ElseIf McVersionCurrent IsNot Nothing AndAlso IsVersionSuitable(McVersionCurrent) Then
DefaultFolder = McVersionCurrent.PathIndie & "mods\"
Directory.CreateDirectory(DefaultFolder)
+ Log("[Download] 使用当前版本的 mods 文件夹作为默认下载位置(" & McVersionCurrent.Name & ")")
+ Else
+ Dim NeedLoad As Boolean = McVersionListLoader.State <> LoadState.Finished
+ If NeedLoad Then
+ Hint("正在查找适合的游戏版本……")
+ LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\", WaitForExit:=True)
+ End If
+ Dim SuitableVersions As New List(Of McVersion)
+ For Each Version As McVersion In McVersionList.Values.SelectMany(Function(l) l)
+ If IsVersionSuitable(Version) Then SuitableVersions.Add(Version)
+ Next
+ If SuitableVersions.Count = 0 Then
+ DefaultFolder = PathMcFolder
+ If NeedLoad Then
+ Hint("当前 MC 文件夹中未找到适合这个 Mod 的游戏版本")
+ Else
+ Log("[Download] 由于当前版本不兼容,使用当前的 MC 文件夹作为默认下载位置")
+ End If
+ Else '选择 Mod 数量最多的版本
+ Dim SelectedVersion = SuitableVersions.OrderBy(Function(v)
+ Dim Info As New DirectoryInfo(v.PathIndie & "mods\")
+ Return If(Info.Exists, Info.GetFiles().Length, -1)
+ End Function).LastOrDefault()
+ DefaultFolder = SelectedVersion.PathIndie & "mods\"
+ Directory.CreateDirectory(DefaultFolder)
+ Log("[Download] 使用适合的游戏版本作为默认下载位置(" & SelectedVersion.Name & ")")
+ End If
End If
End If
- If String.IsNullOrEmpty(DefaultFolder) Then DefaultFolder = Nothing
- End If
-
- '获取基本信息
- Dim File As DlCfFile = If(TypeOf sender Is MyListItem, sender, sender.Parent).Tag
- Dim ChineseName As String = If(Project.ChineseName = Project.Name, "",
- Project.ChineseName.Replace(" (", "Å").Split("Å").First.Replace("\", "\").Replace("/", "/").Replace("|", "|").Replace(":", ":").Replace("<", "<").Replace(">", ">").Replace("*", "*").Replace("?", "?").Replace("""", "").Replace(": ", ":"))
- Dim FileName As String
- Select Case Setup.Get("ToolDownloadTranslate")
- Case 0
- FileName = If(ChineseName = "", "", "[" & ChineseName & "] ") & File.FileName
- Case 1
- FileName = If(ChineseName = "", "", ChineseName & "-") & File.FileName
- Case 2
- FileName = File.FileName & If(ChineseName = "", "", "-" & ChineseName)
- Case Else
- FileName = File.FileName
- End Select
- Dim Target As String
- If File.FileName.EndsWith(".litemod") Then
- Target = SelectAs("选择保存位置", FileName, Desc & "文件|" & If(Project.IsModPack, "*.zip", "*.litemod"), DefaultFolder)
- Else
- Target = SelectAs("选择保存位置", FileName, Desc & "文件|" & If(Project.IsModPack, "*.zip", "*.jar"), DefaultFolder)
- End If
- If Not Target.Contains("\") Then Exit Sub
- Dim LoaderName As String = Desc & "下载:" & File.DisplayName & " "
- If Target <> DefaultFolder AndAlso Not Project.IsModPack Then DownloadFolder = GetPathFromFullPath(Target)
-
- '构造步骤加载器
- Dim Loaders As New List(Of LoaderBase)
- Loaders.Add(New LoaderDownload("下载文件", New List(Of NetFile) From {File.GetDownloadFile(Target, True)}) With {.ProgressWeight = 6, .Block = True})
-
- '启动
- Dim Loader As New LoaderCombo(Of Integer)(LoaderName, Loaders) With {.OnStateChanged = AddressOf DownloadStateSave}
- Loader.Start(1)
- LoaderTaskbarAdd(Loader)
- FrmMain.BtnExtraDownload.ShowRefresh()
- FrmMain.BtnExtraDownload.Ribble()
- Catch ex As Exception
- Log(ex, "保存 CurseForge 文件失败", LogLevel.Feedback)
- End Try
+ '获取基本信息
+ Dim ChineseName As String = If(Project.ChineseName = Project.Name, "",
+ Project.ChineseName.Replace(" (", "Å").Split("Å").First.Replace("\", "\").Replace("/", "/").Replace("|", "|").Replace(":", ":").Replace("<", "<").Replace(">", ">").Replace("*", "*").Replace("?", "?").Replace("""", "").Replace(": ", ":"))
+ Dim FileName As String
+ Select Case Setup.Get("ToolDownloadTranslate")
+ Case 0
+ FileName = If(ChineseName = "", "", "[" & ChineseName & "] ") & File.FileName
+ Case 1
+ FileName = If(ChineseName = "", "", ChineseName & "-") & File.FileName
+ Case 2
+ FileName = File.FileName & If(ChineseName = "", "", "-" & ChineseName)
+ Case Else
+ FileName = File.FileName
+ End Select
+ RunInUi(
+ Sub()
+ '弹窗要求选择保存位置
+ Dim Target As String
+ If File.FileName.EndsWith(".litemod") Then
+ Target = SelectAs("选择保存位置", FileName, Desc & "文件|" & If(Project.IsModPack, "*.zip", "*.litemod"), DefaultFolder)
+ Else
+ Target = SelectAs("选择保存位置", FileName, Desc & "文件|" & If(Project.IsModPack, "*.zip", "*.jar"), DefaultFolder)
+ End If
+ If Not Target.Contains("\") Then Exit Sub
+ '构造步骤加载器
+ Dim LoaderName As String = Desc & "下载:" & File.DisplayName & " "
+ If Target <> DefaultFolder AndAlso Not Project.IsModPack Then CachedFolder = GetPathFromFullPath(Target)
+ Dim Loaders As New List(Of LoaderBase)
+ Loaders.Add(New LoaderDownload("下载文件", New List(Of NetFile) From {File.GetDownloadFile(Target, True)}) With {.ProgressWeight = 6, .Block = True})
+ '启动
+ Dim Loader As New LoaderCombo(Of Integer)(LoaderName, Loaders) With {.OnStateChanged = AddressOf DownloadStateSave}
+ Loader.Start(1)
+ LoaderTaskbarAdd(Loader)
+ FrmMain.BtnExtraDownload.ShowRefresh()
+ FrmMain.BtnExtraDownload.Ribble()
+ End Sub)
+ Catch ex As Exception
+ Log(ex, "保存 CurseForge 文件失败", LogLevel.Feedback)
+ End Try
+ End Sub, "Download CFDetail Save")
End Sub
Private Sub BtnIntroCf_Click(sender As Object, e As EventArgs) Handles BtnIntroCf.Click
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml
index 438b94e5..bc31c158 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml
@@ -51,28 +51,17 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
@@ -83,9 +72,10 @@
-
+
+
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml.vb
index 194172b7..d163ffb7 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml.vb
@@ -3,6 +3,7 @@
'初始化加载器信息
Private Sub PageDownloadMod_Inited(sender As Object, e As EventArgs) Handles Me.Initialized
PageLoaderInit(Load, PanLoad, CardProjects, PanAlways, Loader, AddressOf Load_OnFinish, AddressOf LoaderInput)
+ McVersionHighest = Math.Max(McVersionHighest, Integer.Parse(CType(TextSearchVersion.Items(1), MyComboBoxItem).Content.ToString.Split(".")(1)))
End Sub
Public Shared Loader As New LoaderTask(Of DlCfProjectRequest, DlCfProjectResult)("DlCfProject Mod", AddressOf DlCfProjectSub, AddressOf LoaderInput) With {.ReloadTimeout = 60 * 1000}
Private Shared Function LoaderInput() As DlCfProjectRequest
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml
index 2e73cf5a..bf3ea09c 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml
@@ -47,42 +47,21 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml.vb
index fe50914b..4df28c42 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml.vb
@@ -3,6 +3,7 @@
'初始化加载器信息
Private Sub PageDownloadMod_Inited(sender As Object, e As EventArgs) Handles Me.Initialized
PageLoaderInit(Load, PanLoad, CardProjects, PanAlways, Loader, AddressOf Load_OnFinish, AddressOf LoaderInput)
+ McVersionHighest = Math.Max(McVersionHighest, Integer.Parse(CType(TextSearchVersion.Items(1), MyComboBoxItem).Content.ToString.Split(".")(1)))
End Sub
Public Shared Loader As New LoaderTask(Of DlCfProjectRequest, DlCfProjectResult)("DlCfProject ModPack", AddressOf DlCfProjectSub, AddressOf LoaderInput) With {.ReloadTimeout = 60 * 1000}
Private Shared Function LoaderInput() As DlCfProjectRequest
diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb
index efd17e6a..4b6b4c4b 100644
--- a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb
@@ -83,12 +83,21 @@
'加载
Dim Image As New MyBitmap(Address)
ImgBack.Tag = Address
+ '大小检查
+ Dim Scale As Integer = Image.Pic.Width / 64
+ If Image.Pic.Width < 32 OrElse Image.Pic.Height < 32 Then
+ ImgFore.Source = Nothing : ImgBack.Source = Nothing
+ Throw New Exception("图片大小不足,长为 " & Image.Pic.Height & ",宽为 " & Image.Pic.Width)
+ End If
'头发层(附加层)
If Image.Pic.Width >= 64 AndAlso Image.Pic.Height >= 32 Then
- '如果图片中有透明像素,或是头部颜色和透明区均不一样,则加载附加层
- If (Image.Pic.GetPixel(1, 1).A = 0 OrElse Image.Pic.GetPixel(Image.Pic.Width - 1, Image.Pic.Height - 1).A = 0 OrElse Image.Pic.GetPixel(Image.Pic.Width - 2, 2).A = 0) OrElse
- (Image.Pic.GetPixel(1, 1) <> Image.Pic.GetPixel(41, 9) AndAlso Image.Pic.GetPixel(Image.Pic.Width - 1, Image.Pic.Height - 1) <> Image.Pic.GetPixel(41, 9) AndAlso Image.Pic.GetPixel(Image.Pic.Width - 2, 2) <> Image.Pic.GetPixel(41, 9)) Then
- ImgFore.Source = New CroppedBitmap(Image, New Int32Rect(40, 8, 8, 8))
+ If (Image.Pic.GetPixel(1, 1).A = 0 OrElse '如果图片中有任何透明像素(避免纯色白底)
+ Image.Pic.GetPixel(Image.Pic.Width - 1, Image.Pic.Height - 1).A = 0 OrElse
+ Image.Pic.GetPixel(Image.Pic.Width - 2, Image.Pic.Height / 2 - 2).A = 0) OrElse
+ (Image.Pic.GetPixel(1, 1) <> Image.Pic.GetPixel(Scale * 41, Scale * 9) AndAlso '或是头部颜色和透明区均不一样
+ Image.Pic.GetPixel(Image.Pic.Width - 1, Image.Pic.Height - 1) <> Image.Pic.GetPixel(Scale * 41, Scale * 9) AndAlso
+ Image.Pic.GetPixel(Image.Pic.Width - 2, Image.Pic.Height / 2 - 2) <> Image.Pic.GetPixel(Scale * 41, Scale * 9)) Then
+ ImgFore.Source = New CroppedBitmap(Image, New Int32Rect(Scale * 40, Scale * 8, Scale * 8, Scale * 8))
Else
ImgFore.Source = Nothing
End If
@@ -96,13 +105,8 @@
ImgFore.Source = Nothing
End If
'脸层
- If Image.Pic.Width >= 32 AndAlso Image.Pic.Height >= 32 Then
- ImgBack.Source = New CroppedBitmap(Image, New Int32Rect(8, 8, 8, 8))
- Log("[Skin] 载入头像成功:" & Loader.Name)
- Else
- ImgBack.Source = Nothing
- Throw New Exception("图片大小不足,长为 " & Image.Pic.Height & ",宽为 " & Image.Pic.Width)
- End If
+ ImgBack.Source = New CroppedBitmap(Image, New Int32Rect(Scale * 8, Scale * 8, Scale * 8, Scale * 8))
+ Log("[Skin] 载入头像成功:" & Loader.Name)
Catch ex As Exception
Log(ex, "载入头像失败(" & If(Address, "null") & "," & Loader.Name & ")", LogLevel.Hint)
End Try
diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml b/Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml
index c6cf1afa..3656845e 100644
--- a/Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml
+++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml
@@ -18,7 +18,6 @@
diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml.vb
index 9ada0d9e..919298cc 100644
--- a/Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml.vb
@@ -122,9 +122,17 @@
FrmOtherHelp.SearchBox.Text = ""
End Sub
- '打开反馈
+ '打开网页
Public Shared Sub TryFeedback() Handles ItemFeedback.Click
- If CanFeedback(True) Then Feedback(True, False)
+ If Not CanFeedback(True) Then Exit Sub
+ If MyMsgBox("是否要打开反馈列表网页?" & vbCrLf & "如果无法打开该网页,请尝试使用加速器或 VPN。",
+ "提醒", "打开", "取消") = 2 Then Exit Sub
+ Feedback(True, False)
+ End Sub
+ Public Shared Sub TryVote() Handles ItemVote.Click
+ If MyMsgBox("是否要打开新功能投票网页?" & vbCrLf & "如果无法打开该网页,请尝试使用加速器或 VPN。",
+ "提醒", "打开", "取消") = 2 Then Exit Sub
+ OpenWebsite("https://github.com/Hex-Dragon/PCL2/discussions/categories/%E5%8A%9F%E8%83%BD%E6%8A%95%E7%A5%A8?discussions_q=category%3A%E5%8A%9F%E8%83%BD%E6%8A%95%E7%A5%A8+sort%3Adate_created")
End Sub
End Class
diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj
index 6560948a..78dca232 100644
--- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj
+++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj
@@ -899,5 +899,14 @@
+
+
+
+
+
+
+
+
+
\ 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 43e6c367..4b7dfacd 100644
Binary files a/Plain Craft Launcher 2/Resources/Help.zip and b/Plain Craft Launcher 2/Resources/Help.zip differ
diff --git a/Plain Craft Launcher 2/Resources/java-wrapper.jar b/Plain Craft Launcher 2/Resources/java-wrapper.jar
index 498ace79..166445a3 100644
Binary files a/Plain Craft Launcher 2/Resources/java-wrapper.jar and b/Plain Craft Launcher 2/Resources/java-wrapper.jar differ