2.9.2
This commit is contained in:
@@ -214,45 +214,45 @@ Public Module ModMinecraft
|
||||
''' 在不加载版本的情况下获取版本隔离目录。
|
||||
''' </summary>
|
||||
Public Function GetPathIndie(Modable As Boolean) As String
|
||||
Dim IndieType As Integer = Setup.Get("LaunchArgumentIndie")
|
||||
Select Case Setup.Get("VersionArgumentIndie", Version:=Me)
|
||||
Case -1
|
||||
'尚未判断
|
||||
'决定版本隔离类型
|
||||
If Setup.IsUnset("VersionArgumentIndieV2", Version:=Me) Then
|
||||
Dim ShouldBeIndie =
|
||||
Function() As Boolean
|
||||
'从老的版本独立设置中迁移:-1 未决定,0 使用全局设置,1 手动开启,2 手动关闭
|
||||
If Not Setup.IsUnset("VersionArgumentIndie", Version:=Me) AndAlso Setup.Get("VersionArgumentIndie", Version:=Me) > 0 Then
|
||||
Log($"[Minecraft] 版本隔离初始化({Name}):从老的版本独立设置中迁移")
|
||||
Return Setup.Get("VersionArgumentIndie", Version:=Me) = 1
|
||||
End If
|
||||
'若版本文件夹下包含 mods 或 saves 文件夹,则自动开启版本隔离
|
||||
Dim ModFolder As New DirectoryInfo(Path & "mods\")
|
||||
Dim SaveFolder As New DirectoryInfo(Path & "saves\")
|
||||
If (ModFolder.Exists AndAlso ModFolder.EnumerateFiles.Any) OrElse
|
||||
(SaveFolder.Exists AndAlso SaveFolder.EnumerateFiles.Any) Then
|
||||
'自动开启
|
||||
Setup.Set("VersionArgumentIndie", 1, Version:=Me)
|
||||
Log("[Setup] 已自动开启单版本隔离:" & Name)
|
||||
IndieType = 4
|
||||
Else
|
||||
'使用全局设置
|
||||
Setup.Set("VersionArgumentIndie", 0, Version:=Me)
|
||||
Log("[Setup] 版本隔离使用全局设置:" & Name)
|
||||
If (ModFolder.Exists AndAlso ModFolder.EnumerateFiles.Any) OrElse (SaveFolder.Exists AndAlso SaveFolder.EnumerateFiles.Any) Then
|
||||
Log($"[Minecraft] 版本隔离初始化({Name}):版本文件夹下存在 mods 或 saves 文件夹,自动开启")
|
||||
Return True
|
||||
End If
|
||||
Case 0
|
||||
'使用全局设置
|
||||
Case 1
|
||||
'开启
|
||||
IndieType = 4
|
||||
Case 2
|
||||
'关闭
|
||||
IndieType = 0
|
||||
End Select
|
||||
Select Case IndieType
|
||||
Case 0 '关闭
|
||||
Case 1 '仅隔离可安装 Mod 的版本
|
||||
If Modable Then Return Path
|
||||
Case 2 '仅隔离非正式版
|
||||
If State = McVersionState.Fool OrElse State = McVersionState.Old OrElse State = McVersionState.Snapshot Then Return Path
|
||||
Case 3 '隔离非正式版与可安装 Mod 的版本
|
||||
If Modable Then Return Path
|
||||
If State = McVersionState.Fool OrElse State = McVersionState.Old OrElse State = McVersionState.Snapshot Then Return Path
|
||||
Case 4 '隔离所有版本
|
||||
Return Path
|
||||
End Select
|
||||
Return PathMcFolder
|
||||
'根据全局的默认设置决定是否隔离
|
||||
Log($"[Minecraft] 版本隔离初始化({Name}):从全局默认设置中({Setup.Get("LaunchArgumentIndieV2")})判断")
|
||||
Select Case Setup.Get("LaunchArgumentIndieV2")
|
||||
Case 0 '关闭
|
||||
Return False
|
||||
Case 1 '仅隔离可安装 Mod 的版本
|
||||
Return Modable
|
||||
Case 2 '仅隔离非正式版
|
||||
Return State = McVersionState.Fool OrElse State = McVersionState.Old OrElse State = McVersionState.Snapshot
|
||||
Case 3 '隔离非正式版与可安装 Mod 的版本
|
||||
Return Modable OrElse State = McVersionState.Fool OrElse State = McVersionState.Old OrElse State = McVersionState.Snapshot
|
||||
Case Else '隔离所有版本
|
||||
Return True
|
||||
End Select
|
||||
End Function
|
||||
Setup.Set("VersionArgumentIndieV2", ShouldBeIndie(), Version:=Me)
|
||||
End If
|
||||
'根据隔离类型决定路径
|
||||
If Setup.Get("VersionArgumentIndieV2", Version:=Me) Then
|
||||
Return Path
|
||||
Else
|
||||
Return PathMcFolder
|
||||
End If
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
@@ -396,27 +396,13 @@ Public Module ModMinecraft
|
||||
GoTo VersionSearchFinish
|
||||
End If
|
||||
'从 jar 文件的 version.json 中获取版本号
|
||||
If File.Exists(Path & Name & ".jar") Then
|
||||
Try
|
||||
Using JarArchive As New ZipArchive(New FileStream(Path & Name & ".jar", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
||||
Dim VersionJson As ZipArchiveEntry = JarArchive.GetEntry("version.json")
|
||||
If VersionJson IsNot Nothing Then
|
||||
Using VersionJsonStream As New StreamReader(VersionJson.Open)
|
||||
Dim VersionJsonObj As JObject = GetJson(VersionJsonStream.ReadToEnd)
|
||||
If VersionJsonObj("id") IsNot Nothing Then
|
||||
Dim VersionId As String = VersionJsonObj("id").ToString
|
||||
If VersionId.Length < 32 Then '因为 wiki 说这玩意儿可能是个 hash,虽然我没发现
|
||||
_Version.McName = VersionId
|
||||
Log("[Minecraft] 从版本 jar 中的 version.json 获取到版本号:" & VersionId)
|
||||
GoTo VersionSearchFinish
|
||||
End If
|
||||
End If
|
||||
End Using
|
||||
End If
|
||||
End Using
|
||||
Catch ex As Exception
|
||||
Log(ex, "从版本 jar 中的 version.json 获取版本号失败")
|
||||
End Try
|
||||
If JsonVersion?("name") IsNot Nothing Then
|
||||
Dim JsonVerName As String = JsonVersion("name").ToString
|
||||
If JsonVerName.Length < 32 Then '因为 wiki 说这玩意儿可能是个 hash,虽然我没发现
|
||||
_Version.McName = JsonVerName
|
||||
Log("[Minecraft] 从版本 jar 中的 version.json 获取到版本号:" & JsonVerName)
|
||||
GoTo VersionSearchFinish
|
||||
End If
|
||||
End If
|
||||
'非准确的版本判断警告
|
||||
Log("[Minecraft] 无法完全确认 MC 版本号的版本:" & Name)
|
||||
@@ -536,9 +522,8 @@ VersionSearchFinish:
|
||||
For Each Subjson As JObject In _JsonObject("patches")
|
||||
SubjsonList.Add(Subjson)
|
||||
Next
|
||||
SubjsonList = Sort(SubjsonList, Function(Left As JObject, Right As JObject) As Boolean
|
||||
Return Val(If(Left("priority"), "0").ToString) < Val(If(Right("priority"), "0").ToString)
|
||||
End Function)
|
||||
SubjsonList = SubjsonList.Sort(
|
||||
Function(Left, Right) Val(If(Left("priority"), "0").ToString) < Val(If(Right("priority"), "0").ToString))
|
||||
For Each Subjson As JObject In SubjsonList
|
||||
Dim Id As String = Subjson("id")
|
||||
If Id IsNot Nothing Then
|
||||
@@ -628,6 +613,35 @@ Recheck:
|
||||
''' </summary>
|
||||
Public Property HasJumpLoader As Boolean = False
|
||||
|
||||
''' <summary>
|
||||
''' 版本 jar 中的 version.json 文件对象。
|
||||
''' 若没有则返回 Nothing。
|
||||
''' </summary>
|
||||
Public ReadOnly Property JsonVersion As JObject
|
||||
Get
|
||||
If Not JsonVersionInited Then
|
||||
JsonVersionInited = True
|
||||
If File.Exists(Path & Name & ".jar") Then
|
||||
Try
|
||||
Using JarArchive As New ZipArchive(New FileStream(Path & Name & ".jar", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
||||
Dim VersionJson As ZipArchiveEntry = JarArchive.GetEntry("version.json")
|
||||
If VersionJson IsNot Nothing Then
|
||||
Using VersionJsonStream As New StreamReader(VersionJson.Open)
|
||||
_JsonVersion = GetJson(VersionJsonStream.ReadToEnd)
|
||||
End Using
|
||||
End If
|
||||
End Using
|
||||
Catch ex As Exception
|
||||
Log(ex, "从版本 jar 中读取 version.json 失败")
|
||||
End Try
|
||||
End If
|
||||
End If
|
||||
Return _JsonVersion
|
||||
End Get
|
||||
End Property
|
||||
Private JsonVersionInited As Boolean = False
|
||||
Private _JsonVersion As JObject = Nothing
|
||||
|
||||
''' <summary>
|
||||
''' 该版本的依赖版本。若无依赖版本则为空字符串。
|
||||
''' </summary>
|
||||
@@ -1116,7 +1130,7 @@ ExitDataLoad:
|
||||
Throw New Exception("无法读取版本文件夹,可能是由于没有权限(" & Path & "versions)", ex)
|
||||
End Try
|
||||
End If
|
||||
'没有可用版本
|
||||
'不可用
|
||||
If Not FolderList.Any() Then
|
||||
WriteIni(Path & "PCL.ini", "VersionCache", "") '清空缓存
|
||||
GoTo OnLoaded
|
||||
@@ -1427,7 +1441,7 @@ OnLoaded:
|
||||
Next
|
||||
If Not IsNothing(Snapshot) Then OldList.Remove(Snapshot)
|
||||
'按版本号排序
|
||||
Dim NewList As List(Of McVersion) = Sort(OldList, Function(Left, Right) Left.Version.McCodeMain > Right.Version.McCodeMain)
|
||||
Dim NewList As List(Of McVersion) = OldList.OrderByDescending(Function(v) v.Version.McCodeMain).ToList
|
||||
'回设
|
||||
If Not IsNothing(Snapshot) Then NewList.Insert(0, Snapshot)
|
||||
ResultVersionList(McVersionCardType.OriginalLike) = NewList
|
||||
@@ -1435,7 +1449,7 @@ OnLoaded:
|
||||
|
||||
'不常用版本:按发布时间新旧排序,如果不可用则按名称排序
|
||||
If ResultVersionList.ContainsKey(McVersionCardType.Rubbish) Then
|
||||
ResultVersionList(McVersionCardType.Rubbish) = Sort(ResultVersionList(McVersionCardType.Rubbish),
|
||||
ResultVersionList(McVersionCardType.Rubbish) = ResultVersionList(McVersionCardType.Rubbish).Sort(
|
||||
Function(Left As McVersion, Right As McVersion)
|
||||
Dim LeftYear As Integer = Left.ReleaseTime.Year '+ If(Left.State = McVersionState.Original OrElse Left.Version.HasOptiFine, 100, 0)
|
||||
Dim RightYear As Integer = Right.ReleaseTime.Year '+ If(Right.State = McVersionState.Original OrElse Left.Version.HasOptiFine, 100, 0)
|
||||
@@ -1457,7 +1471,7 @@ OnLoaded:
|
||||
|
||||
'API 版本:优先按版本排序,此后【先放 Fabric,再放 Neo/Forge(按版本号从高到低排序),最后放 LiteLoader(按名称排序)】
|
||||
If ResultVersionList.ContainsKey(McVersionCardType.API) Then
|
||||
ResultVersionList(McVersionCardType.API) = Sort(ResultVersionList(McVersionCardType.API),
|
||||
ResultVersionList(McVersionCardType.API) = ResultVersionList(McVersionCardType.API).Sort(
|
||||
Function(Left As McVersion, Right As McVersion)
|
||||
Dim Basic = VersionSortInteger(Left.Version.McName, Right.Version.McName)
|
||||
If Basic <> 0 Then
|
||||
@@ -2116,7 +2130,7 @@ OnLoaded:
|
||||
''' 检查设置,是否应当忽略文件检查?
|
||||
''' </summary>
|
||||
Public Function ShouldIgnoreFileCheck(Version As McVersion)
|
||||
Return Setup.Get("LaunchAdvanceAssets") OrElse Setup.Get("VersionAdvanceAssetsV2", Version:=Version) OrElse (Setup.Get("VersionAdvanceAssets", Version:=Version) = 2)
|
||||
Return Setup.Get("VersionAdvanceAssetsV2", Version:=Version) OrElse (Setup.Get("VersionAdvanceAssets", Version:=Version) = 2)
|
||||
End Function
|
||||
|
||||
#End Region
|
||||
|
||||
Reference in New Issue
Block a user